From 830566ab5fc70c06944ec2f88d5e8d55004b67e8 Mon Sep 17 00:00:00 2001 From: mrq Date: Sat, 4 Jul 2020 00:00:00 -0500 Subject: [PATCH] Commit for 2020.07.04.7z --- Makefile | 289 +- bin/data/shaders/base.colored.vert.glsl | 44 - bin/data/shaders/base.dither16.frag.glsl | 294 + bin/data/shaders/base.dither4.frag.glsl | 189 + bin/data/shaders/base.dither8.frag.glsl | 194 + bin/data/shaders/base.frag.glsl | 81 +- bin/data/shaders/base.stereo.vert.glsl | 39 + bin/data/shaders/base.vert.glsl | 18 +- bin/data/shaders/display.blit.frag.glsl | 23 - bin/data/shaders/display.blit.vert.glsl | 16 - bin/data/shaders/display.frag.glsl | 12 + .../shaders/display.rendertarget.frag.glsl | 75 - bin/data/shaders/display.subpass.frag.glsl | 693 - .../shaders/display.subpass.old.frag.glsl | 559 - bin/data/shaders/display.subpass.vert.glsl | 24 - bin/data/shaders/display.vert.glsl | 4 + bin/data/shaders/gltf.frag.glsl | 139 - bin/data/shaders/gltf.instanced.vert.glsl | 62 - .../shaders/gltf.skinned.instanced.vert.glsl | 74 - bin/data/shaders/gltf.skinned.vert.glsl | 78 - bin/data/shaders/gltf.vert.glsl | 64 - bin/data/shaders/gui.dither16.frag.glsl | 178 + bin/data/shaders/gui.dither4.frag.glsl | 166 + bin/data/shaders/gui.dither8.frag.glsl | 170 + bin/data/shaders/gui.frag.glsl | 49 +- bin/data/shaders/gui.gradient.frag.glsl | 38 + ...rtarget.vert.glsl => gui.stereo.vert.glsl} | 43 +- bin/data/shaders/gui.text.dither16.frag.glsl | 196 + bin/data/shaders/gui.text.dither4.frag.glsl | 185 + bin/data/shaders/gui.text.dither8.frag.glsl | 187 + bin/data/shaders/gui.text.frag.glsl | 29 +- bin/data/shaders/gui.text.stereo.vert.glsl | 44 + bin/data/shaders/gui.text.vert.glsl | 11 +- bin/data/shaders/gui.vert.glsl | 11 +- bin/data/shaders/heightmap.frag.glsl | 19 - bin/data/shaders/line.frag.glsl | 10 - bin/data/shaders/line.vert.glsl | 35 - bin/data/shaders/noise.frag.glsl | 23 - bin/data/shaders/raytracing.comp.glsl | 581 +- bin/data/shaders/terrain.frag.glsl | 57 +- ...map.vert.glsl => terrain.stereo.vert.glsl} | 19 +- bin/data/shaders/terrain.vert.glsl | 18 +- bin/data/shaders/texture.frag.glsl | 2 +- client/client/ext.cpp | 169 +- client/dc.cpp | 8 - client/main.cpp | 37 +- debug.sh | 6 +- engine/inc/ActiveSocket.h | 92 - engine/inc/AppCore/App.h | 182 - engine/inc/AppCore/AppCore.h | 6 - engine/inc/AppCore/CAPI.h | 448 - engine/inc/AppCore/Defines.h | 42 - engine/inc/AppCore/JSHelpers.h | 554 - engine/inc/AppCore/Monitor.h | 41 - engine/inc/AppCore/Overlay.h | 141 - engine/inc/AppCore/Platform.h | 53 - engine/inc/AppCore/Window.h | 157 - engine/inc/GL/glext.h | 11028 - engine/inc/GL/wglext.h | 901 - engine/inc/Host.h | 254 - engine/inc/JavaScriptCore/JSBase.h | 155 - engine/inc/JavaScriptCore/JSContextRef.h | 163 - engine/inc/JavaScriptCore/JSObjectRef.h | 856 - .../inc/JavaScriptCore/JSObjectRefPrivate.h | 78 - engine/inc/JavaScriptCore/JSRetainPtr.h | 187 - engine/inc/JavaScriptCore/JSStringRef.h | 148 - engine/inc/JavaScriptCore/JSTypedArray.h | 180 - engine/inc/JavaScriptCore/JSValueRef.h | 380 - engine/inc/JavaScriptCore/JavaScript.h | 37 - .../inc/JavaScriptCore/WebKitAvailability.h | 80 - engine/inc/PassiveSocket.h | 120 - engine/inc/SimpleSocket.h | 617 - engine/inc/StatTimer.h | 110 - engine/inc/Ultralight/Bitmap.h | 279 - engine/inc/Ultralight/Buffer.h | 47 - engine/inc/Ultralight/CAPI.h | 1936 - engine/inc/Ultralight/Defines.h | 95 - engine/inc/Ultralight/Geometry.h | 677 - engine/inc/Ultralight/JavaScript.h | 39 - engine/inc/Ultralight/KeyCodes.h | 527 - engine/inc/Ultralight/KeyEvent.h | 180 - engine/inc/Ultralight/Listener.h | 287 - engine/inc/Ultralight/Matrix.h | 190 - engine/inc/Ultralight/MouseEvent.h | 77 - engine/inc/Ultralight/RefPtr.h | 538 - engine/inc/Ultralight/RenderTarget.h | 84 - engine/inc/Ultralight/Renderer.h | 137 - engine/inc/Ultralight/RequestHandler.h | 0 engine/inc/Ultralight/ScrollEvent.h | 53 - engine/inc/Ultralight/Session.h | 53 - engine/inc/Ultralight/String.h | 120 - engine/inc/Ultralight/String16.h | 130 - engine/inc/Ultralight/String32.h | 71 - engine/inc/Ultralight/String8.h | 74 - engine/inc/Ultralight/Ultralight.h | 29 - engine/inc/Ultralight/View.h | 307 - engine/inc/Ultralight/platform/Clipboard.h | 51 - engine/inc/Ultralight/platform/Config.h | 230 - engine/inc/Ultralight/platform/FileSystem.h | 93 - engine/inc/Ultralight/platform/FontLoader.h | 132 - engine/inc/Ultralight/platform/GPUDriver.h | 288 - engine/inc/Ultralight/platform/Logger.h | 47 - engine/inc/Ultralight/platform/Platform.h | 141 - engine/inc/Ultralight/platform/Surface.h | 191 - .../Ultralight/private/PlatformFileSystem.h | 17 - engine/inc/binpack2d/binpack2d.hpp | 595 - engine/inc/bullet/BasicDemo/BasicExample.h | 21 - engine/inc/bullet/Benchmarks/BenchmarkDemo.h | 20 - engine/inc/bullet/Benchmarks/HaltonData.h | 647 - engine/inc/bullet/Benchmarks/TaruData.h | 134 - engine/inc/bullet/Benchmarks/landscapeData.h | 235704 --------------- .../Bullet2FileLoader/autogenerated/bullet2.h | 987 - .../bullet/Bullet2FileLoader/b3BulletFile.h | 74 - engine/inc/bullet/Bullet2FileLoader/b3Chunk.h | 84 - .../inc/bullet/Bullet2FileLoader/b3Common.h | 40 - engine/inc/bullet/Bullet2FileLoader/b3DNA.h | 101 - .../inc/bullet/Bullet2FileLoader/b3Defines.h | 149 - engine/inc/bullet/Bullet2FileLoader/b3File.h | 158 - .../bullet/Bullet2FileLoader/b3Serializer.h | 601 - .../b3BroadphaseCallback.h | 38 - .../BroadPhaseCollision/b3DynamicBvh.h | 1332 - .../b3DynamicBvhBroadphase.h | 197 - .../BroadPhaseCollision/b3OverlappingPair.h | 70 - .../b3OverlappingPairCache.h | 427 - .../BroadPhaseCollision/shared/b3Aabb.h | 56 - .../NarrowPhaseCollision/b3Config.h | 39 - .../NarrowPhaseCollision/b3Contact4.h | 55 - .../NarrowPhaseCollision/b3ConvexUtility.h | 55 - .../NarrowPhaseCollision/b3CpuNarrowPhase.h | 92 - .../NarrowPhaseCollision/b3RaycastInfo.h | 25 - .../NarrowPhaseCollision/b3RigidBodyCL.h | 28 - .../shared/b3BvhSubtreeInfoData.h | 19 - .../shared/b3BvhTraversal.h | 123 - .../NarrowPhaseCollision/shared/b3ClipFaces.h | 171 - .../shared/b3Collidable.h | 69 - .../shared/b3Contact4Data.h | 36 - .../shared/b3ContactConvexConvexSAT.h | 486 - .../shared/b3ContactSphereSphere.h | 153 - .../shared/b3ConvexPolyhedronData.h | 38 - .../shared/b3FindConcaveSatAxis.h | 797 - .../shared/b3FindSeparatingAxis.h | 197 - .../shared/b3MprPenetration.h | 888 - .../shared/b3NewContactReduction.h | 175 - .../shared/b3QuantizedBvhNodeData.h | 88 - .../shared/b3ReduceContacts.h | 89 - .../shared/b3RigidBodyData.h | 31 - .../shared/b3UpdateAabbs.h | 35 - .../bullet/Bullet3Common/b3AlignedAllocator.h | 110 - .../Bullet3Common/b3AlignedObjectArray.h | 522 - .../bullet/Bullet3Common/b3CommandLineArgs.h | 106 - engine/inc/bullet/Bullet3Common/b3FileUtils.h | 133 - engine/inc/bullet/Bullet3Common/b3HashMap.h | 462 - engine/inc/bullet/Bullet3Common/b3Logging.h | 74 - engine/inc/bullet/Bullet3Common/b3Matrix3x3.h | 1354 - engine/inc/bullet/Bullet3Common/b3MinMax.h | 69 - .../bullet/Bullet3Common/b3PoolAllocator.h | 121 - engine/inc/bullet/Bullet3Common/b3QuadWord.h | 242 - .../inc/bullet/Bullet3Common/b3Quaternion.h | 908 - engine/inc/bullet/Bullet3Common/b3Random.h | 46 - .../bullet/Bullet3Common/b3ResizablePool.h | 171 - engine/inc/bullet/Bullet3Common/b3Scalar.h | 689 - .../inc/bullet/Bullet3Common/b3StackAlloc.h | 118 - engine/inc/bullet/Bullet3Common/b3Transform.h | 286 - .../bullet/Bullet3Common/b3TransformUtil.h | 210 - engine/inc/bullet/Bullet3Common/b3Vector3.h | 1303 - .../bullet/Bullet3Common/shared/b3Float4.h | 90 - .../inc/bullet/Bullet3Common/shared/b3Int2.h | 63 - .../inc/bullet/Bullet3Common/shared/b3Int4.h | 71 - .../bullet/Bullet3Common/shared/b3Mat3x3.h | 157 - .../shared/b3PlatformDefinitions.h | 41 - .../inc/bullet/Bullet3Common/shared/b3Quat.h | 100 - .../ConstraintSolver/b3ContactSolverInfo.h | 149 - .../ConstraintSolver/b3FixedConstraint.h | 34 - .../b3Generic6DofConstraint.h | 517 - .../ConstraintSolver/b3JacobianEntry.h | 150 - .../ConstraintSolver/b3PgsJacobiSolver.h | 133 - .../b3Point2PointConstraint.h | 153 - .../ConstraintSolver/b3SolverBody.h | 281 - .../ConstraintSolver/b3SolverConstraint.h | 73 - .../ConstraintSolver/b3TypedConstraint.h | 469 - .../Bullet3Dynamics/b3CpuRigidBodyPipeline.h | 62 - .../shared/b3ContactConstraint4.h | 31 - .../shared/b3ConvertConstraint4.h | 148 - .../bullet/Bullet3Dynamics/shared/b3Inertia.h | 14 - .../shared/b3IntegrateTransforms.h | 106 - .../inc/bullet/Bullet3Geometry/b3AabbUtil.h | 217 - .../Bullet3Geometry/b3ConvexHullComputer.h | 99 - .../bullet/Bullet3Geometry/b3GeometryUtil.h | 36 - .../b3GrahamScan2dConvexHull.h | 116 - .../b3GpuBroadphaseInterface.h | 42 - .../BroadphaseCollision/b3GpuGridBroadphase.h | 80 - .../b3GpuParallelLinearBvh.h | 125 - .../b3GpuParallelLinearBvhBroadphase.h | 66 - .../BroadphaseCollision/b3GpuSapBroadphase.h | 143 - .../BroadphaseCollision/b3SapAabb.h | 13 - .../kernels/gridBroadphaseKernels.h | 198 - .../kernels/parallelLinearBvhKernels.h | 728 - .../BroadphaseCollision/kernels/sapKernels.h | 341 - .../Initialize/b3OpenCLInclude.h | 51 - .../Bullet3OpenCL/Initialize/b3OpenCLUtils.h | 190 - .../NarrowphaseCollision/b3BvhInfo.h | 17 - .../NarrowphaseCollision/b3ContactCache.h | 62 - .../b3ConvexHullContact.h | 106 - .../b3ConvexPolyhedronCL.h | 7 - .../NarrowphaseCollision/b3GjkEpa.h | 79 - .../NarrowphaseCollision/b3OptimizedBvh.h | 56 - .../NarrowphaseCollision/b3QuantizedBvh.h | 511 - .../b3StridingMeshInterface.h | 158 - .../NarrowphaseCollision/b3SupportMappings.h | 34 - .../NarrowphaseCollision/b3TriangleCallback.h | 37 - .../b3TriangleIndexVertexArray.h | 128 - .../NarrowphaseCollision/b3VectorFloat4.h | 10 - .../b3VoronoiSimplexSolver.h | 164 - .../kernels/bvhTraversal.h | 257 - .../NarrowphaseCollision/kernels/mprKernels.h | 1445 - .../kernels/primitiveContacts.h | 1288 - .../kernels/satClipHullContacts.h | 2098 - .../kernels/satConcaveKernels.h | 1456 - .../NarrowphaseCollision/kernels/satKernels.h | 2103 - .../ParallelPrimitives/b3BoundSearchCL.h | 64 - .../ParallelPrimitives/b3BufferInfoCL.h | 18 - .../ParallelPrimitives/b3FillCL.h | 52 - .../ParallelPrimitives/b3LauncherCL.h | 128 - .../ParallelPrimitives/b3OpenCLArray.h | 300 - .../ParallelPrimitives/b3PrefixScanCL.h | 35 - .../ParallelPrimitives/b3PrefixScanFloat4CL.h | 36 - .../ParallelPrimitives/b3RadixSort32CL.h | 84 - .../kernels/BoundSearchKernelsCL.h | 86 - .../kernels/CopyKernelsCL.h | 131 - .../kernels/FillKernelsCL.h | 90 - .../kernels/PrefixScanKernelsCL.h | 128 - .../kernels/PrefixScanKernelsFloat4CL.h | 128 - .../kernels/RadixSort32KernelsCL.h | 909 - .../Bullet3OpenCL/Raycast/b3GpuRaycast.h | 28 - .../Raycast/kernels/rayCastKernels.h | 380 - .../RigidBody/b3GpuConstraint4.h | 17 - .../RigidBody/b3GpuGenericConstraint.h | 128 - .../RigidBody/b3GpuJacobiContactSolver.h | 56 - .../RigidBody/b3GpuNarrowPhase.h | 101 - .../RigidBody/b3GpuNarrowPhaseInternalData.h | 89 - .../RigidBody/b3GpuPgsConstraintSolver.h | 76 - .../RigidBody/b3GpuPgsContactSolver.h | 37 - .../RigidBody/b3GpuRigidBodyPipeline.h | 70 - .../b3GpuRigidBodyPipelineInternalData.h | 68 - .../Bullet3OpenCL/RigidBody/b3GpuSolverBody.h | 210 - .../RigidBody/b3GpuSolverConstraint.h | 73 - .../bullet/Bullet3OpenCL/RigidBody/b3Solver.h | 110 - .../RigidBody/kernels/batchingKernels.h | 387 - .../RigidBody/kernels/batchingKernelsNew.h | 290 - .../RigidBody/kernels/integrateKernel.h | 432 - .../RigidBody/kernels/jointSolver.h | 720 - .../RigidBody/kernels/solveContact.h | 392 - .../RigidBody/kernels/solveFriction.h | 420 - .../RigidBody/kernels/solverSetup.h | 702 - .../RigidBody/kernels/solverSetup2.h | 600 - .../RigidBody/kernels/solverUtils.h | 908 - .../RigidBody/kernels/updateAabbsKernel.h | 482 - .../BroadphaseCollision/btAxisSweep3.h | 48 - .../btAxisSweep3Internal.h | 954 - .../btBroadphaseInterface.h | 79 - .../BroadphaseCollision/btBroadphaseProxy.h | 248 - .../btCollisionAlgorithm.h | 75 - .../BroadphaseCollision/btDbvt.h | 1578 - .../BroadphaseCollision/btDbvtBroadphase.h | 146 - .../BroadphaseCollision/btDispatcher.h | 110 - .../btOverlappingPairCache.h | 434 - .../btOverlappingPairCallback.h | 41 - .../BroadphaseCollision/btQuantizedBvh.h | 543 - .../BroadphaseCollision/btSimpleBroadphase.h | 148 - .../SphereTriangleDetector.h | 43 - .../btActivatingCollisionAlgorithm.h | 35 - .../btBox2dBox2dCollisionAlgorithm.h | 63 - .../btBoxBoxCollisionAlgorithm.h | 63 - .../CollisionDispatch/btBoxBoxDetector.h | 40 - .../btCollisionConfiguration.h | 43 - .../CollisionDispatch/btCollisionCreateFunc.h | 43 - .../CollisionDispatch/btCollisionDispatcher.h | 169 - .../btCollisionDispatcherMt.h | 38 - .../CollisionDispatch/btCollisionObject.h | 689 - .../btCollisionObjectWrapper.h | 49 - .../CollisionDispatch/btCollisionWorld.h | 513 - .../btCollisionWorldImporter.h | 169 - .../btCompoundCollisionAlgorithm.h | 99 - .../btCompoundCompoundCollisionAlgorithm.h | 82 - .../btConvex2dConvex2dAlgorithm.h | 83 - .../btConvexConcaveCollisionAlgorithm.h | 117 - .../btConvexConvexAlgorithm.h | 101 - .../btConvexPlaneCollisionAlgorithm.h | 82 - .../btDefaultCollisionConfiguration.h | 111 - .../btEmptyCollisionAlgorithm.h | 52 - .../CollisionDispatch/btGhostObject.h | 162 - .../btHashedSimplePairCache.h | 149 - .../CollisionDispatch/btInternalEdgeUtility.h | 44 - .../CollisionDispatch/btManifoldResult.h | 163 - .../btSimulationIslandManager.h | 75 - .../btSphereBoxCollisionAlgorithm.h | 73 - .../btSphereSphereCollisionAlgorithm.h | 64 - .../btSphereTriangleCollisionAlgorithm.h | 65 - .../CollisionDispatch/btUnionFind.h | 123 - .../CollisionShapes/btBox2dShape.h | 339 - .../CollisionShapes/btBoxShape.h | 291 - .../CollisionShapes/btBvhTriangleMeshShape.h | 144 - .../CollisionShapes/btCapsuleShape.h | 182 - .../CollisionShapes/btCollisionMargin.h | 24 - .../CollisionShapes/btCollisionShape.h | 174 - .../CollisionShapes/btCompoundShape.h | 207 - .../CollisionShapes/btConcaveShape.h | 62 - .../CollisionShapes/btConeShape.h | 175 - .../CollisionShapes/btConvex2dShape.h | 77 - .../CollisionShapes/btConvexHullShape.h | 116 - .../CollisionShapes/btConvexInternalShape.h | 208 - .../CollisionShapes/btConvexPointCloudShape.h | 103 - .../CollisionShapes/btConvexPolyhedron.h | 59 - .../CollisionShapes/btConvexShape.h | 75 - .../btConvexTriangleMeshShape.h | 68 - .../CollisionShapes/btCylinderShape.h | 206 - .../CollisionShapes/btEmptyShape.h | 65 - .../btHeightfieldTerrainShape.h | 221 - .../CollisionShapes/btMaterial.h | 38 - .../CollisionShapes/btMiniSDF.h | 127 - .../CollisionShapes/btMinkowskiSumShape.h | 59 - .../CollisionShapes/btMultiSphereShape.h | 95 - .../btMultimaterialTriangleMeshShape.h | 115 - .../CollisionShapes/btOptimizedBvh.h | 56 - .../CollisionShapes/btPolyhedralConvexShape.h | 106 - .../btScaledBvhTriangleMeshShape.h | 86 - .../CollisionShapes/btSdfCollisionShape.h | 29 - .../CollisionShapes/btShapeHull.h | 60 - .../CollisionShapes/btSphereShape.h | 71 - .../CollisionShapes/btStaticPlaneShape.h | 103 - .../CollisionShapes/btStridingMeshInterface.h | 153 - .../CollisionShapes/btTetrahedronShape.h | 71 - .../CollisionShapes/btTriangleBuffer.h | 63 - .../CollisionShapes/btTriangleCallback.h | 37 - .../btTriangleIndexVertexArray.h | 128 - .../btTriangleIndexVertexMaterialArray.h | 83 - .../CollisionShapes/btTriangleInfoMap.h | 238 - .../CollisionShapes/btTriangleMesh.h | 69 - .../CollisionShapes/btTriangleMeshShape.h | 82 - .../CollisionShapes/btTriangleShape.h | 175 - .../CollisionShapes/btUniformScalingShape.h | 84 - .../BulletCollision/Gimpact/btBoxCollision.h | 620 - .../BulletCollision/Gimpact/btClipPolygon.h | 173 - .../Gimpact/btCompoundFromGimpact.h | 105 - .../Gimpact/btContactProcessing.h | 65 - .../Gimpact/btContactProcessingStructs.h | 105 - .../BulletCollision/Gimpact/btGImpactBvh.h | 309 - .../Gimpact/btGImpactBvhStructs.h | 85 - .../Gimpact/btGImpactCollisionAlgorithm.h | 288 - .../Gimpact/btGImpactMassUtil.h | 56 - .../Gimpact/btGImpactQuantizedBvh.h | 298 - .../Gimpact/btGImpactQuantizedBvhStructs.h | 91 - .../BulletCollision/Gimpact/btGImpactShape.h | 1115 - .../Gimpact/btGenericPoolAllocator.h | 153 - .../Gimpact/btGeometryOperations.h | 198 - .../BulletCollision/Gimpact/btQuantization.h | 79 - .../Gimpact/btTriangleShapeEx.h | 169 - .../BulletCollision/Gimpact/gim_array.h | 318 - .../Gimpact/gim_basic_geometry_operations.h | 536 - .../BulletCollision/Gimpact/gim_bitset.h | 117 - .../Gimpact/gim_box_collision.h | 578 - .../BulletCollision/Gimpact/gim_box_set.h | 640 - .../Gimpact/gim_clip_polygon.h | 199 - .../BulletCollision/Gimpact/gim_contact.h | 168 - .../BulletCollision/Gimpact/gim_geom_types.h | 92 - .../BulletCollision/Gimpact/gim_geometry.h | 42 - .../BulletCollision/Gimpact/gim_hash_table.h | 857 - .../BulletCollision/Gimpact/gim_linear_math.h | 1488 - .../bullet/BulletCollision/Gimpact/gim_math.h | 148 - .../BulletCollision/Gimpact/gim_memory.h | 177 - .../bullet/BulletCollision/Gimpact/gim_pair.h | 28 - .../BulletCollision/Gimpact/gim_radixsort.h | 386 - .../Gimpact/gim_tri_collision.h | 368 - .../btComputeGjkEpaPenetration.h | 354 - .../btContinuousConvexCollision.h | 53 - .../NarrowPhaseCollision/btConvexCast.h | 90 - .../btConvexPenetrationDepthSolver.h | 35 - .../btDiscreteCollisionDetectorInterface.h | 85 - .../btGjkCollisionDescription.h | 39 - .../NarrowPhaseCollision/btGjkConvexCast.h | 46 - .../NarrowPhaseCollision/btGjkEpa2.h | 73 - .../NarrowPhaseCollision/btGjkEpa3.h | 1063 - .../btGjkEpaPenetrationDepthSolver.h | 40 - .../NarrowPhaseCollision/btGjkPairDetector.h | 93 - .../NarrowPhaseCollision/btManifoldPoint.h | 174 - .../btMinkowskiPenetrationDepthSolver.h | 36 - .../NarrowPhaseCollision/btMprPenetration.h | 884 - .../btPersistentManifold.h | 374 - .../NarrowPhaseCollision/btPointCollector.h | 58 - .../btPolyhedralContactClipping.h | 42 - .../NarrowPhaseCollision/btRaycastCallback.h | 72 - .../btSimplexSolverInterface.h | 58 - .../btSubSimplexConvexCast.h | 47 - .../btVoronoiSimplexSolver.h | 173 - .../BulletCollision/btBulletCollisionCommon.h | 65 - .../btCharacterControllerInterface.h | 46 - .../btKinematicCharacterController.h | 200 - .../ConstraintSolver/btBatchedConstraints.h | 62 - .../ConstraintSolver/btConeTwistConstraint.h | 423 - .../ConstraintSolver/btConstraintSolver.h | 59 - .../ConstraintSolver/btContactConstraint.h | 65 - .../ConstraintSolver/btContactSolverInfo.h | 177 - .../ConstraintSolver/btFixedConstraint.h | 30 - .../ConstraintSolver/btGearConstraint.h | 146 - .../btGeneric6DofConstraint.h | 615 - .../btGeneric6DofSpring2Constraint.h | 667 - .../btGeneric6DofSpringConstraint.h | 135 - .../ConstraintSolver/btHinge2Constraint.h | 55 - .../ConstraintSolver/btHingeConstraint.h | 480 - .../ConstraintSolver/btJacobianEntry.h | 150 - .../ConstraintSolver/btNNCGConstraintSolver.h | 57 - .../btPoint2PointConstraint.h | 173 - .../btSequentialImpulseConstraintSolver.h | 215 - .../btSequentialImpulseConstraintSolverMt.h | 150 - .../ConstraintSolver/btSliderConstraint.h | 349 - .../btSolve2LinearConstraint.h | 101 - .../ConstraintSolver/btSolverBody.h | 285 - .../ConstraintSolver/btSolverConstraint.h | 74 - .../ConstraintSolver/btTypedConstraint.h | 532 - .../ConstraintSolver/btUniversalConstraint.h | 59 - .../Dynamics/btActionInterface.h | 41 - .../Dynamics/btDiscreteDynamicsWorld.h | 244 - .../Dynamics/btDiscreteDynamicsWorldMt.h | 131 - .../BulletDynamics/Dynamics/btDynamicsWorld.h | 174 - .../BulletDynamics/Dynamics/btRigidBody.h | 687 - .../Dynamics/btSimpleDynamicsWorld.h | 84 - .../Dynamics/btSimulationIslandManagerMt.h | 112 - .../BulletDynamics/Featherstone/btMultiBody.h | 934 - .../Featherstone/btMultiBodyConstraint.h | 215 - .../btMultiBodyConstraintSolver.h | 101 - .../Featherstone/btMultiBodyDynamicsWorld.h | 126 - .../Featherstone/btMultiBodyFixedConstraint.h | 91 - .../Featherstone/btMultiBodyGearConstraint.h | 115 - .../btMultiBodyInplaceSolverIslandCallback.h | 247 - .../Featherstone/btMultiBodyJointFeedback.h | 25 - .../btMultiBodyJointLimitConstraint.h | 63 - .../Featherstone/btMultiBodyJointMotor.h | 77 - .../Featherstone/btMultiBodyLink.h | 303 - .../Featherstone/btMultiBodyLinkCollider.h | 195 - .../btMultiBodyMLCPConstraintSolver.h | 187 - .../Featherstone/btMultiBodyPoint2Point.h | 64 - .../btMultiBodySliderConstraint.h | 102 - .../btMultiBodySolverConstraint.h | 90 - .../btMultiBodySphericalJointMotor.h | 77 - .../BulletDynamics/MLCPSolvers/btDantzigLCP.h | 73 - .../MLCPSolvers/btDantzigSolver.h | 106 - .../MLCPSolvers/btLemkeAlgorithm.h | 102 - .../MLCPSolvers/btLemkeSolver.h | 338 - .../BulletDynamics/MLCPSolvers/btMLCPSolver.h | 88 - .../MLCPSolvers/btMLCPSolverInterface.h | 33 - .../BulletDynamics/MLCPSolvers/btPATHSolver.h | 142 - .../MLCPSolvers/btSolveProjectedGaussSeidel.h | 107 - .../BulletDynamics/Vehicle/btRaycastVehicle.h | 218 - .../Vehicle/btVehicleRaycaster.h | 33 - .../BulletDynamics/Vehicle/btWheelInfo.h | 116 - .../BulletDynamics/btBulletDynamicsCommon.h | 43 - .../BulletFileLoader/autogenerated/bullet.h | 1580 - engine/inc/bullet/BulletFileLoader/bChunk.h | 84 - engine/inc/bullet/BulletFileLoader/bCommon.h | 40 - engine/inc/bullet/BulletFileLoader/bDNA.h | 101 - engine/inc/bullet/BulletFileLoader/bDefines.h | 152 - engine/inc/bullet/BulletFileLoader/bFile.h | 166 - .../bullet/BulletFileLoader/btBulletFile.h | 80 - .../btBulletCollisionCommon.h | 65 - engine/inc/bullet/BulletRobotics/BoxStack.h | 21 - .../inc/bullet/BulletRobotics/FixJointBoxes.h | 21 - engine/inc/bullet/BulletRobotics/JointLimit.h | 21 - ...eformableBodyInplaceSolverIslandCallback.h | 45 - .../bullet/BulletSoftBody/btCGProjection.h | 104 - .../BulletSoftBody/btConjugateGradient.h | 117 - .../BulletSoftBody/btConjugateResidual.h | 112 - .../BulletSoftBody/btDefaultSoftBodySolver.h | 60 - .../btDeformableBackwardEulerObjective.h | 198 - .../BulletSoftBody/btDeformableBodySolver.h | 160 - .../btDeformableContactConstraint.h | 284 - .../btDeformableContactProjection.h | 99 - .../btDeformableCorotatedForce.h | 124 - .../BulletSoftBody/btDeformableGravityForce.h | 105 - .../btDeformableLagrangianForce.h | 372 - .../btDeformableLinearElasticityForce.h | 462 - .../btDeformableMassSpringForce.h | 301 - .../btDeformableMousePickingForce.h | 162 - .../btDeformableMultiBodyConstraintSolver.h | 61 - .../btDeformableMultiBodyDynamicsWorld.h | 316 - .../btDeformableNeoHookeanForce.h | 420 - .../bullet/BulletSoftBody/btKrylovSolver.h | 107 - .../bullet/BulletSoftBody/btPreconditioner.h | 285 - engine/inc/bullet/BulletSoftBody/btSoftBody.h | 1394 - .../btSoftBodyConcaveCollisionAlgorithm.h | 147 - .../bullet/BulletSoftBody/btSoftBodyData.h | 212 - .../bullet/BulletSoftBody/btSoftBodyHelpers.h | 167 - .../BulletSoftBody/btSoftBodyInternals.h | 2108 - ...tSoftBodyRigidBodyCollisionConfiguration.h | 43 - .../btSoftBodySolverVertexBuffer.h | 160 - .../bullet/BulletSoftBody/btSoftBodySolvers.h | 147 - .../btSoftMultiBodyDynamicsWorld.h | 105 - .../btSoftRigidCollisionAlgorithm.h | 71 - .../BulletSoftBody/btSoftRigidDynamicsWorld.h | 102 - .../btSoftSoftCollisionAlgorithm.h | 65 - .../inc/bullet/BulletSoftBody/btSparseSDF.h | 372 - engine/inc/bullet/BulletSoftBody/poly34.h | 38 - .../btBulletWorldImporter.h | 52 - .../btMultiBodyWorldImporter.h | 19 - .../BulletWorldImporter/btWorldImporter.h | 227 - .../btBulletXmlWorldImporter.h | 89 - .../BulletXmlWorldImporter/string_split.h | 46 - .../inc/bullet/Collision/CollisionSdkC_Api.h | 104 - .../Collision/CollisionTutorialBullet2.h | 12 - .../Collision/Internal/Bullet2CollisionSdk.h | 55 - .../Internal/CollisionSdkInterface.h | 51 - .../Internal/RealTimeBullet3CollisionSdk.h | 53 - .../Common2dCanvasInterface.h | 15 - .../bullet/CommonInterfaces/CommonCallbacks.h | 48 - .../CommonInterfaces/CommonCameraInterface.h | 46 - .../CommonDeformableBodyBase.h | 221 - .../CommonInterfaces/CommonExampleInterface.h | 96 - .../CommonInterfaces/CommonFileIOInterface.h | 28 - .../CommonGUIHelperInterface.h | 227 - .../CommonGraphicsAppInterface.h | 287 - .../CommonInterfaces/CommonMultiBodyBase.h | 524 - .../CommonParameterInterface.h | 91 - .../CommonInterfaces/CommonRenderInterface.h | 167 - .../CommonInterfaces/CommonRigidBodyBase.h | 454 - .../CommonInterfaces/CommonWindowInterface.h | 88 - .../inc/bullet/Constraints/ConstraintDemo.h | 20 - .../Constraints/ConstraintPhysicsSetup.h | 6 - .../inc/bullet/Constraints/Dof6Spring2Setup.h | 6 - .../inc/bullet/Constraints/TestHingeTorque.h | 6 - .../ConvexDecomposition/ConvexBuilder.h | 103 - .../ConvexDecomposition/ConvexDecomposition.h | 202 - .../inc/bullet/ConvexDecomposition/bestfit.h | 63 - .../bullet/ConvexDecomposition/bestfitobb.h | 41 - .../inc/bullet/ConvexDecomposition/cd_hull.h | 148 - .../bullet/ConvexDecomposition/cd_vector.h | 1192 - .../bullet/ConvexDecomposition/cd_wavefront.h | 57 - .../bullet/ConvexDecomposition/concavity.h | 55 - .../bullet/ConvexDecomposition/fitsphere.h | 41 - .../bullet/ConvexDecomposition/float_math.h | 71 - .../bullet/ConvexDecomposition/meshvolume.h | 42 - .../inc/bullet/ConvexDecomposition/planetri.h | 55 - .../inc/bullet/ConvexDecomposition/raytri.h | 43 - .../bullet/ConvexDecomposition/splitplane.h | 55 - .../inc/bullet/ConvexDecomposition/vlookup.h | 115 - .../inc/bullet/DeformableDemo/ClothFriction.h | 19 - engine/inc/bullet/DeformableDemo/Collide.h | 19 - .../DeformableDemo/DeformableClothAnchor.h | 19 - .../bullet/DeformableDemo/DeformableContact.h | 19 - .../DeformableDemo/DeformableMultibody.h | 19 - .../bullet/DeformableDemo/DeformableRigid.h | 19 - .../DeformableDemo/DeformableSelfCollision.h | 19 - .../bullet/DeformableDemo/GraspDeformable.h | 19 - .../bullet/DeformableDemo/LargeDeformation.h | 19 - .../DeformableDemo/MultibodyClothAnchor.h | 19 - engine/inc/bullet/DeformableDemo/Pinch.h | 19 - .../inc/bullet/DeformableDemo/PinchFriction.h | 19 - .../inc/bullet/DeformableDemo/SplitImpulse.h | 19 - .../DeformableDemo/VolumetricDeformable.h | 19 - .../inc/bullet/DynamicControlDemo/MotorDemo.h | 21 - engine/inc/bullet/Evolution/NN3DWalkers.h | 21 - .../Evolution/NN3DWalkersTimeWarpBase.h | 950 - .../CollisionShape2TriangleMesh.h | 10 - .../inc/bullet/ExampleBrowser/EmptyBrowser.h | 45 - .../inc/bullet/ExampleBrowser/EmptyExample.h | 27 - .../ExampleBrowser/ExampleBrowserInterface.h | 24 - .../bullet/ExampleBrowser/ExampleEntries.h | 32 - .../bullet/ExampleBrowser/GL_ShapeDrawer.h | 81 - .../GwenGUISupport/GraphingTexture.h | 45 - .../GwenGUISupport/GwenParameterInterface.h | 23 - .../GwenGUISupport/GwenProfileWindow.h | 11 - .../GwenGUISupport/GwenTextureWindow.h | 31 - .../GwenGUISupport/gwenInternalData.h | 61 - .../GwenGUISupport/gwenUserInterface.h | 63 - .../ExampleBrowser/InProcessExampleBrowser.h | 30 - .../ExampleBrowser/OpenGLExampleBrowser.h | 29 - .../bullet/ExampleBrowser/OpenGLGuiHelper.h | 113 - .../ImplicitCloth/ImplicitClothExample.h | 6 - .../Experiments/ImplicitCloth/stan/Cloth.h | 18 - .../ImplicitCloth/stan/SpringNetwork.h | 61 - .../Experiments/ImplicitCloth/stan/array.h | 307 - .../Experiments/ImplicitCloth/stan/vec3n.h | 435 - .../Experiments/ImplicitCloth/stan/vecmath.h | 723 - engine/inc/bullet/ExtendedTutorials/Bridge.h | 21 - engine/inc/bullet/ExtendedTutorials/Chain.h | 21 - .../bullet/ExtendedTutorials/CompoundBoxes.h | 21 - .../bullet/ExtendedTutorials/InclinedPlane.h | 21 - .../bullet/ExtendedTutorials/MultiPendulum.h | 21 - .../bullet/ExtendedTutorials/MultipleBoxes.h | 21 - .../bullet/ExtendedTutorials/NewtonsCradle.h | 21 - .../ExtendedTutorials/NewtonsRopeCradle.h | 21 - .../ExtendedTutorials/RigidBodyFromObj.h | 27 - .../inc/bullet/ExtendedTutorials/SimpleBox.h | 21 - .../bullet/ExtendedTutorials/SimpleCloth.h | 21 - .../bullet/ExtendedTutorials/SimpleJoint.h | 21 - engine/inc/bullet/ForkLift/ForkLiftDemo.h | 20 - engine/inc/bullet/FractureDemo/FractureDemo.h | 20 - .../inc/bullet/FractureDemo/btFractureBody.h | 65 - .../FractureDemo/btFractureDynamicsWorld.h | 47 - .../btGImpactConvexDecompositionShape.h | 79 - .../bullet/GyroscopicDemo/GyroscopicSetup.h | 7 - engine/inc/bullet/HACD/hacdCircularList.h | 86 - engine/inc/bullet/HACD/hacdCircularList.inl | 163 - engine/inc/bullet/HACD/hacdGraph.h | 119 - engine/inc/bullet/HACD/hacdHACD.h | 285 - engine/inc/bullet/HACD/hacdICHull.h | 120 - engine/inc/bullet/HACD/hacdManifoldMesh.h | 251 - engine/inc/bullet/HACD/hacdVector.h | 68 - engine/inc/bullet/HACD/hacdVector.inl | 178 - engine/inc/bullet/HACD/hacdVersion.h | 20 - .../bullet/Heightfield/HeightfieldExample.h | 21 - .../bullet/Importers/ImportBsp/BspConverter.h | 36 - .../bullet/Importers/ImportBsp/BspLoader.h | 288 - .../Importers/ImportBsp/ImportBspExample.h | 20 - .../Importers/ImportBullet/SerializeSetup.h | 6 - .../ColladaGraphicsInstance.h | 35 - .../ImportColladaDemo/ImportColladaSetup.h | 23 - .../ImportColladaDemo/LoadMeshFromCollada.h | 43 - .../Importers/ImportColladaDemo/btMatrix4x4.h | 152 - .../ImportMJCFDemo/BulletMJCFImporter.h | 93 - .../ImportMJCFDemo/ImportMJCFSetup.h | 6 - .../ImportMeshUtility/b3ImportMeshUtility.h | 42 - .../ImportObjDemo/ImportObjExample.h | 6 - .../Importers/ImportObjDemo/LoadMeshFromObj.h | 20 - .../Wavefront2GLInstanceGraphicsShape.h | 9 - .../Importers/ImportSDFDemo/ImportSDFSetup.h | 6 - .../Importers/ImportSTLDemo/ImportSTLSetup.h | 6 - .../Importers/ImportSTLDemo/LoadMeshFromSTL.h | 107 - .../ImportURDFDemo/BulletUrdfImporter.h | 97 - .../ConvertRigidBodies2MultiBody.h | 13 - .../ImportURDFDemo/ImportURDFSetup.h | 6 - .../MultiBodyCreationInterface.h | 42 - .../ImportURDFDemo/MyMultiBodyCreator.h | 80 - .../Importers/ImportURDFDemo/SDFAudioTypes.h | 44 - .../Importers/ImportURDFDemo/URDF2Bullet.h | 33 - .../ImportURDFDemo/URDFImporterInterface.h | 103 - .../Importers/ImportURDFDemo/URDFJointTypes.h | 111 - .../ImportURDFDemo/UrdfFindMeshFile.h | 112 - .../Importers/ImportURDFDemo/UrdfParser.h | 426 - .../ImportURDFDemo/UrdfRenderingInterface.h | 115 - .../ImportURDFDemo/urdfLexicalCast.h | 13 - .../ImportURDFDemo/urdfStringSplit.h | 39 - .../Importers/ImportURDFDemo/urdf_samples.h | 823 - .../BulletInverseDynamicsUtilsCommon.h | 15 - .../InverseDynamics/InverseDynamicsExample.h | 27 - .../InverseKinematicsExample.h | 15 - .../TaskScheduler/btThreadSupportInterface.h | 64 - engine/inc/bullet/LinearMath/btAabbUtil2.h | 217 - .../bullet/LinearMath/btAlignedAllocator.h | 115 - .../bullet/LinearMath/btAlignedObjectArray.h | 504 - engine/inc/bullet/LinearMath/btConvexHull.h | 233 - .../bullet/LinearMath/btConvexHullComputer.h | 102 - .../bullet/LinearMath/btCpuFeatureUtility.h | 88 - .../bullet/LinearMath/btDefaultMotionState.h | 40 - engine/inc/bullet/LinearMath/btGeometryUtil.h | 36 - .../LinearMath/btGrahamScan2dConvexHull.h | 129 - engine/inc/bullet/LinearMath/btHashMap.h | 470 - engine/inc/bullet/LinearMath/btIDebugDraw.h | 473 - .../inc/bullet/LinearMath/btImplicitQRSVD.h | 916 - engine/inc/bullet/LinearMath/btList.h | 73 - engine/inc/bullet/LinearMath/btMatrix3x3.h | 1431 - engine/inc/bullet/LinearMath/btMatrixX.h | 532 - engine/inc/bullet/LinearMath/btMinMax.h | 69 - .../bullet/LinearMath/btModifiedGramSchmidt.h | 83 - engine/inc/bullet/LinearMath/btMotionState.h | 36 - .../bullet/LinearMath/btPolarDecomposition.h | 69 - .../inc/bullet/LinearMath/btPoolAllocator.h | 130 - engine/inc/bullet/LinearMath/btQuadWord.h | 238 - engine/inc/bullet/LinearMath/btQuaternion.h | 1021 - engine/inc/bullet/LinearMath/btQuickprof.h | 200 - engine/inc/bullet/LinearMath/btRandom.h | 39 - .../inc/bullet/LinearMath/btReducedVector.h | 320 - engine/inc/bullet/LinearMath/btScalar.h | 832 - engine/inc/bullet/LinearMath/btSerializer.h | 869 - .../inc/bullet/LinearMath/btSpatialAlgebra.h | 389 - engine/inc/bullet/LinearMath/btStackAlloc.h | 118 - engine/inc/bullet/LinearMath/btThreads.h | 177 - engine/inc/bullet/LinearMath/btTransform.h | 286 - .../inc/bullet/LinearMath/btTransformUtil.h | 223 - engine/inc/bullet/LinearMath/btVector3.h | 1336 - engine/inc/bullet/LuaDemo/LuaPhysicsSetup.h | 6 - .../MultiBody/InvertedPendulumPDControl.h | 6 - .../MultiBody/KinematicMultiBodyExample.h | 21 - .../MultiBody/MultiBodyConstraintFeedback.h | 6 - .../bullet/MultiBody/MultiBodySoftContact.h | 6 - engine/inc/bullet/MultiBody/MultiDofDemo.h | 7 - engine/inc/bullet/MultiBody/Pendulum.h | 6 - engine/inc/bullet/MultiBody/SerialChains.h | 7 - .../bullet/MultiBody/TestJointTorqueSetup.h | 6 - engine/inc/bullet/MultiBody/pendulum_gold.h | 2057 - .../MultiBodyBaseline/MultiBodyBaseline.h | 20 - .../MultiThreadedDemo/CommonRigidBodyMTBase.h | 444 - .../MultiThreadedDemo/MultiThreadedDemo.h | 20 - .../MultiThreading/MultiThreadingExample.h | 11 - .../MultiThreading/b3PosixThreadSupport.h | 142 - .../MultiThreading/b3ThreadSupportInterface.h | 84 - .../MultiThreading/b3Win32ThreadSupport.h | 135 - .../OpenCL/CommonOpenCL/CommonOpenCLBase.h | 145 - .../OpenCL/CommonOpenCL/GpuDemoInternalData.h | 26 - .../inc/bullet/OpenCL/broadphase/PairBench.h | 6 - .../bullet/OpenCL/broadphase/pairsKernel.h | 76 - .../bullet/OpenCL/rigidbody/ConcaveScene.h | 90 - .../OpenCL/rigidbody/GpuCompoundScene.h | 45 - .../bullet/OpenCL/rigidbody/GpuConvexScene.h | 6 - .../OpenCL/rigidbody/GpuRigidBodyDemo.h | 43 - .../rigidbody/GpuRigidBodyDemoInternalData.h | 56 - .../bullet/OpenCL/rigidbody/GpuSphereScene.h | 25 - .../inc/bullet/OpenGLWindow/EGLOpenGLWindow.h | 71 - .../bullet/OpenGLWindow/GLFWOpenGLWindow.h | 72 - .../OpenGLWindow/GLInstanceGraphicsShape.h | 33 - .../GLInstanceRendererInternalData.h | 21 - .../OpenGLWindow/GLInstancingRenderer.h | 156 - .../bullet/OpenGLWindow/GLPrimInternalData.h | 26 - .../bullet/OpenGLWindow/GLPrimitiveRenderer.h | 82 - .../bullet/OpenGLWindow/GLRenderToTexture.h | 30 - .../OpenGLWindow/GwenOpenGL3CoreRenderer.h | 372 - engine/inc/bullet/OpenGLWindow/LoadShader.h | 17 - .../inc/bullet/OpenGLWindow/MacOpenGLWindow.h | 72 - .../bullet/OpenGLWindow/MacOpenGLWindowObjC.h | 72 - .../inc/bullet/OpenGLWindow/OpenGL2Include.h | 48 - .../inc/bullet/OpenGLWindow/OpenGLInclude.h | 31 - .../Shaders/createShadowMapInstancingPS.h | 10 - .../Shaders/createShadowMapInstancingVS.h | 48 - .../OpenGLWindow/Shaders/instancingPS.h | 35 - .../OpenGLWindow/Shaders/instancingVS.h | 69 - .../inc/bullet/OpenGLWindow/Shaders/linesPS.h | 10 - .../inc/bullet/OpenGLWindow/Shaders/linesVS.h | 15 - .../OpenGLWindow/Shaders/pointSpritePS.h | 33 - .../OpenGLWindow/Shaders/pointSpriteVS.h | 37 - .../Shaders/projectiveTextureInstancingPS.h | 64 - .../Shaders/projectiveTextureInstancingVS.h | 84 - .../Shaders/segmentationMaskInstancingPS.h | 16 - .../Shaders/segmentationMaskInstancingVS.h | 54 - .../Shaders/useShadowMapInstancingPS.h | 70 - .../Shaders/useShadowMapInstancingVS.h | 92 - engine/inc/bullet/OpenGLWindow/ShapeData.h | 59331 ---- engine/inc/bullet/OpenGLWindow/SimpleCamera.h | 60 - .../bullet/OpenGLWindow/SimpleOpenGL2App.h | 32 - .../OpenGLWindow/SimpleOpenGL2Renderer.h | 93 - .../bullet/OpenGLWindow/SimpleOpenGL3App.h | 44 - engine/inc/bullet/OpenGLWindow/TwFonts.h | 62 - .../OpenGLWindow/Win32InternalWindowData.h | 65 - .../bullet/OpenGLWindow/Win32OpenGLWindow.h | 56 - engine/inc/bullet/OpenGLWindow/Win32Window.h | 78 - .../inc/bullet/OpenGLWindow/X11OpenGLWindow.h | 72 - engine/inc/bullet/OpenGLWindow/fontstash.h | 154 - .../OpenGLWindow/opengl_fontstashcallbacks.h | 51 - engine/inc/bullet/Planar2D/Planar2D.h | 20 - engine/inc/bullet/Raycast/RaytestDemo.h | 20 - .../RenderingExamples/CoordinateSystemDemo.h | 6 - .../DynamicTexturedCubeDemo.h | 6 - .../bullet/RenderingExamples/RaytracerSetup.h | 6 - .../RenderingExamples/RenderInstancingDemo.h | 6 - .../RenderingExamples/TimeSeriesCanvas.h | 23 - .../RenderingExamples/TimeSeriesExample.h | 6 - .../RenderingExamples/TimeSeriesFontData.h | 6 - .../RenderingExamples/TinyRendererSetup.h | 6 - .../inc/bullet/RenderingExamples/TinyVRGui.h | 22 - .../RigidBody/KinematicRigidBodyExample.h | 21 - .../bullet/RigidBody/RigidBodySoftContact.h | 21 - .../inc/bullet/RobotSimulator/MinitaurSetup.h | 19 - .../RobotSimulator/MinitaurSimulatorExample.h | 22 - .../b3RobotSimulatorClientAPI.h | 27 - .../RoboticsLearning/GripperGraspExample.h | 31 - .../RoboticsLearning/KukaGraspExample.h | 26 - .../RoboticsLearning/R2D2GraspExample.h | 28 - .../RollingFrictionDemo/RollingFrictionDemo.h | 20 - .../SharedMemory/BodyJointInfoUtility.h | 121 - .../SharedMemory/GraphicsClientExample.h | 7 - .../SharedMemory/GraphicsServerExample.h | 6 - .../SharedMemory/GraphicsSharedMemoryBlock.h | 41 - .../GraphicsSharedMemoryCommands.h | 192 - .../SharedMemory/GraphicsSharedMemoryPublic.h | 52 - .../bullet/SharedMemory/IKTrajectoryHelper.h | 44 - .../inc/bullet/SharedMemory/InProcessMemory.h | 18 - .../inc/bullet/SharedMemory/PhysicsClient.h | 94 - .../bullet/SharedMemory/PhysicsClientC_API.h | 740 - .../SharedMemory/PhysicsClientExample.h | 13 - .../bullet/SharedMemory/PhysicsClientGRPC.h | 37 - .../SharedMemory/PhysicsClientGRPC_C_API.h | 18 - .../SharedMemory/PhysicsClientSharedMemory.h | 107 - .../SharedMemory/PhysicsClientSharedMemory2.h | 17 - .../PhysicsClientSharedMemory2_C_API.h | 17 - .../PhysicsClientSharedMemory_C_API.h | 17 - .../bullet/SharedMemory/PhysicsClientTCP.h | 37 - .../SharedMemory/PhysicsClientTCP_C_API.h | 18 - .../bullet/SharedMemory/PhysicsClientUDP.h | 37 - .../SharedMemory/PhysicsClientUDP_C_API.h | 18 - .../PhysicsCommandProcessorInterface.h | 62 - .../inc/bullet/SharedMemory/PhysicsDirect.h | 136 - .../bullet/SharedMemory/PhysicsDirectC_API.h | 18 - .../inc/bullet/SharedMemory/PhysicsLoopBack.h | 105 - .../SharedMemory/PhysicsLoopBackC_API.h | 18 - .../inc/bullet/SharedMemory/PhysicsServer.h | 37 - .../PhysicsServerCommandProcessor.h | 190 - .../SharedMemory/PhysicsServerExample.h | 15 - .../PhysicsServerExampleBullet2.h | 7 - .../SharedMemory/PhysicsServerSharedMemory.h | 58 - .../bullet/SharedMemory/PosixSharedMemory.h | 18 - .../inc/bullet/SharedMemory/RemoteGUIHelper.h | 78 - .../bullet/SharedMemory/RemoteGUIHelperTCP.h | 75 - .../bullet/SharedMemory/RobotControlExample.h | 13 - .../bullet/SharedMemory/SharedMemoryBlock.h | 44 - .../SharedMemoryCommandProcessor.h | 36 - .../SharedMemory/SharedMemoryCommands.h | 1283 - .../bullet/SharedMemory/SharedMemoryCommon.h | 21 - .../SharedMemoryInProcessPhysicsC_API.h | 43 - .../SharedMemory/SharedMemoryInterface.h | 15 - .../bullet/SharedMemory/SharedMemoryPublic.h | 1115 - .../SharedMemory/SharedMemoryUserData.h | 96 - .../bullet/SharedMemory/Win32SharedMemory.h | 32 - .../inc/bullet/SharedMemory/b3PluginManager.h | 77 - .../b3RobotSimulatorClientAPI_InternalData.h | 18 - .../b3RobotSimulatorClientAPI_NoDirect.h | 914 - .../b3RobotSimulatorClientAPI_NoGUI.h | 18 - .../SharedMemory/dart/DARTPhysicsC_API.h | 21 - .../SharedMemory/dart/DARTPhysicsClient.h | 121 - .../dart/DARTPhysicsServerCommandProcessor.h | 29 - .../SharedMemory/grpc/ConvertGRPCBullet.h | 21 - .../SharedMemory/mujoco/MuJoCoPhysicsC_API.h | 21 - .../SharedMemory/mujoco/MuJoCoPhysicsClient.h | 121 - .../MuJoCoPhysicsServerCommandProcessor.h | 43 - .../bullet/SharedMemory/physx/PhysXC_API.h | 20 - .../physx/PhysXServerCommandProcessor.h | 57 - .../SharedMemory/physx/PhysXUrdfImporter.h | 116 - .../bullet/SharedMemory/physx/PhysXUserData.h | 10 - .../bullet/SharedMemory/physx/URDF2PhysX.h | 26 - .../bullet/SharedMemory/plugins/b3PluginAPI.h | 39 - .../plugins/b3PluginCollisionInterface.h | 32 - .../SharedMemory/plugins/b3PluginContext.h | 31 - .../plugins/b3PluginFileIOInterface.h | 1 - .../collisionFilterPlugin.h | 23 - .../plugins/eglPlugin/eglRendererPlugin.h | 23 - .../eglRendererVisualShapeConverter.h | 75 - .../plugins/fileIOPlugin/fileIOPlugin.h | 24 - .../plugins/fileIOPlugin/zipFileIO.h | 305 - .../plugins/grpcPlugin/grpcPlugin.h | 26 - .../plugins/pdControlPlugin/pdControlPlugin.h | 30 - .../plugins/stablePDPlugin/BulletConversion.h | 9 - .../plugins/stablePDPlugin/KinTree.h | 270 - .../plugins/stablePDPlugin/MathUtil.h | 131 - .../plugins/stablePDPlugin/RBDModel.h | 71 - .../plugins/stablePDPlugin/RBDUtil.h | 85 - .../plugins/stablePDPlugin/Shape.h | 20 - .../plugins/stablePDPlugin/SpAlg.h | 70 - .../plugins/testPlugin/testplugin.h | 24 - .../TinyRendererVisualShapeConverter.h | 63 - .../tinyRendererPlugin/tinyRendererPlugin.h | 23 - .../plugins/vrSyncPlugin/vrSyncPlugin.h | 23 - engine/inc/bullet/SoftDemo/BunnyMesh.h | 1372 - engine/inc/bullet/SoftDemo/SoftDemo.h | 24 - engine/inc/bullet/SoftDemo/TorusMesh.h | 916 - .../bullet/ThirdPartyLibs/BussIK/Jacobian.h | 146 - .../bullet/ThirdPartyLibs/BussIK/LinearR2.h | 1025 - .../bullet/ThirdPartyLibs/BussIK/LinearR3.h | 2127 - .../bullet/ThirdPartyLibs/BussIK/LinearR4.h | 1171 - .../bullet/ThirdPartyLibs/BussIK/MathMisc.h | 447 - .../bullet/ThirdPartyLibs/BussIK/MatrixRmn.h | 417 - .../inc/bullet/ThirdPartyLibs/BussIK/Node.h | 109 - .../bullet/ThirdPartyLibs/BussIK/Spherical.h | 293 - .../inc/bullet/ThirdPartyLibs/BussIK/Tree.h | 96 - .../bullet/ThirdPartyLibs/BussIK/VectorRn.h | 275 - .../ThirdPartyLibs/Eigen/src/Cholesky/LDLT.h | 668 - .../ThirdPartyLibs/Eigen/src/Cholesky/LLT.h | 541 - .../Eigen/src/Cholesky/LLT_LAPACKE.h | 99 - .../Eigen/src/CholmodSupport/CholmodSupport.h | 682 - .../Eigen/src/Core/ArithmeticSequence.h | 350 - .../ThirdPartyLibs/Eigen/src/Core/Array.h | 331 - .../ThirdPartyLibs/Eigen/src/Core/ArrayBase.h | 226 - .../Eigen/src/Core/ArrayWrapper.h | 209 - .../ThirdPartyLibs/Eigen/src/Core/Assign.h | 90 - .../Eigen/src/Core/AssignEvaluator.h | 935 - .../Eigen/src/Core/Assign_MKL.h | 176 - .../Eigen/src/Core/BandMatrix.h | 353 - .../ThirdPartyLibs/Eigen/src/Core/Block.h | 452 - .../Eigen/src/Core/BooleanRedux.h | 162 - .../Eigen/src/Core/CommaInitializer.h | 160 - .../Eigen/src/Core/ConditionEstimator.h | 175 - .../Eigen/src/Core/CoreEvaluators.h | 1728 - .../Eigen/src/Core/CoreIterators.h | 132 - .../Eigen/src/Core/CwiseBinaryOp.h | 183 - .../Eigen/src/Core/CwiseNullaryOp.h | 902 - .../Eigen/src/Core/CwiseTernaryOp.h | 197 - .../Eigen/src/Core/CwiseUnaryOp.h | 103 - .../Eigen/src/Core/CwiseUnaryView.h | 128 - .../ThirdPartyLibs/Eigen/src/Core/DenseBase.h | 615 - .../Eigen/src/Core/DenseCoeffsBase.h | 681 - .../Eigen/src/Core/DenseStorage.h | 570 - .../ThirdPartyLibs/Eigen/src/Core/Diagonal.h | 259 - .../Eigen/src/Core/DiagonalMatrix.h | 343 - .../Eigen/src/Core/DiagonalProduct.h | 28 - .../ThirdPartyLibs/Eigen/src/Core/Dot.h | 315 - .../ThirdPartyLibs/Eigen/src/Core/EigenBase.h | 159 - .../Eigen/src/Core/ForceAlignedAccess.h | 146 - .../ThirdPartyLibs/Eigen/src/Core/Fuzzy.h | 155 - .../Eigen/src/Core/GeneralProduct.h | 466 - .../Eigen/src/Core/GenericPacketMath.h | 598 - .../Eigen/src/Core/GlobalFunctions.h | 185 - .../bullet/ThirdPartyLibs/Eigen/src/Core/IO.h | 225 - .../Eigen/src/Core/IndexedView.h | 207 - .../ThirdPartyLibs/Eigen/src/Core/Inverse.h | 118 - .../ThirdPartyLibs/Eigen/src/Core/Map.h | 171 - .../ThirdPartyLibs/Eigen/src/Core/MapBase.h | 299 - .../Eigen/src/Core/MathFunctions.h | 1711 - .../Eigen/src/Core/MathFunctionsImpl.h | 73 - .../ThirdPartyLibs/Eigen/src/Core/Matrix.h | 461 - .../Eigen/src/Core/MatrixBase.h | 525 - .../Eigen/src/Core/NestByValue.h | 110 - .../ThirdPartyLibs/Eigen/src/Core/NoAlias.h | 109 - .../ThirdPartyLibs/Eigen/src/Core/NumTraits.h | 248 - .../Eigen/src/Core/PermutationMatrix.h | 633 - .../Eigen/src/Core/PlainObjectBase.h | 1035 - .../ThirdPartyLibs/Eigen/src/Core/Product.h | 186 - .../Eigen/src/Core/ProductEvaluators.h | 1105 - .../ThirdPartyLibs/Eigen/src/Core/Random.h | 182 - .../ThirdPartyLibs/Eigen/src/Core/Redux.h | 505 - .../ThirdPartyLibs/Eigen/src/Core/Ref.h | 283 - .../ThirdPartyLibs/Eigen/src/Core/Replicate.h | 142 - .../Eigen/src/Core/ReturnByValue.h | 117 - .../ThirdPartyLibs/Eigen/src/Core/Reverse.h | 211 - .../ThirdPartyLibs/Eigen/src/Core/Select.h | 162 - .../Eigen/src/Core/SelfAdjointView.h | 350 - .../Eigen/src/Core/SelfCwiseBinaryOp.h | 51 - .../ThirdPartyLibs/Eigen/src/Core/Solve.h | 188 - .../Eigen/src/Core/SolveTriangular.h | 232 - .../Eigen/src/Core/SolverBase.h | 130 - .../Eigen/src/Core/StableNorm.h | 221 - .../ThirdPartyLibs/Eigen/src/Core/Stride.h | 111 - .../ThirdPartyLibs/Eigen/src/Core/Swap.h | 67 - .../ThirdPartyLibs/Eigen/src/Core/Transpose.h | 403 - .../Eigen/src/Core/Transpositions.h | 407 - .../Eigen/src/Core/TriangularMatrix.h | 984 - .../Eigen/src/Core/VectorBlock.h | 96 - .../Eigen/src/Core/VectorwiseOp.h | 695 - .../ThirdPartyLibs/Eigen/src/Core/Visitor.h | 273 - .../Eigen/src/Core/arch/AVX/Complex.h | 451 - .../Eigen/src/Core/arch/AVX/MathFunctions.h | 439 - .../Eigen/src/Core/arch/AVX/PacketMath.h | 643 - .../Eigen/src/Core/arch/AVX/TypeCasting.h | 51 - .../src/Core/arch/AVX512/MathFunctions.h | 396 - .../Eigen/src/Core/arch/AVX512/PacketMath.h | 1286 - .../Eigen/src/Core/arch/AltiVec/Complex.h | 430 - .../src/Core/arch/AltiVec/MathFunctions.h | 322 - .../Eigen/src/Core/arch/AltiVec/PacketMath.h | 1033 - .../Eigen/src/Core/arch/CUDA/Complex.h | 103 - .../Eigen/src/Core/arch/CUDA/Half.h | 666 - .../Eigen/src/Core/arch/CUDA/MathFunctions.h | 103 - .../Eigen/src/Core/arch/CUDA/PacketMath.h | 333 - .../Eigen/src/Core/arch/CUDA/PacketMathHalf.h | 1133 - .../Eigen/src/Core/arch/CUDA/TypeCasting.h | 212 - .../Eigen/src/Core/arch/Default/ConjHelper.h | 29 - .../Eigen/src/Core/arch/Default/Settings.h | 49 - .../Eigen/src/Core/arch/NEON/Complex.h | 490 - .../Eigen/src/Core/arch/NEON/MathFunctions.h | 91 - .../Eigen/src/Core/arch/NEON/PacketMath.h | 729 - .../Eigen/src/Core/arch/SSE/Complex.h | 471 - .../Eigen/src/Core/arch/SSE/MathFunctions.h | 562 - .../Eigen/src/Core/arch/SSE/PacketMath.h | 931 - .../Eigen/src/Core/arch/SSE/TypeCasting.h | 77 - .../Eigen/src/Core/arch/ZVector/Complex.h | 397 - .../src/Core/arch/ZVector/MathFunctions.h | 137 - .../Eigen/src/Core/arch/ZVector/PacketMath.h | 945 - .../src/Core/functors/AssignmentFunctors.h | 168 - .../Eigen/src/Core/functors/BinaryFunctors.h | 482 - .../Eigen/src/Core/functors/NullaryFunctors.h | 188 - .../Eigen/src/Core/functors/StlFunctors.h | 132 - .../Eigen/src/Core/functors/TernaryFunctors.h | 25 - .../Eigen/src/Core/functors/UnaryFunctors.h | 830 - .../Core/products/GeneralBlockPanelKernel.h | 2149 - .../src/Core/products/GeneralMatrixMatrix.h | 498 - .../products/GeneralMatrixMatrixTriangular.h | 311 - .../GeneralMatrixMatrixTriangular_BLAS.h | 145 - .../Core/products/GeneralMatrixMatrix_BLAS.h | 122 - .../src/Core/products/GeneralMatrixVector.h | 405 - .../Core/products/GeneralMatrixVector_BLAS.h | 136 - .../Eigen/src/Core/products/Parallelizer.h | 163 - .../Core/products/SelfadjointMatrixMatrix.h | 521 - .../products/SelfadjointMatrixMatrix_BLAS.h | 287 - .../Core/products/SelfadjointMatrixVector.h | 260 - .../products/SelfadjointMatrixVector_BLAS.h | 118 - .../src/Core/products/SelfadjointProduct.h | 133 - .../Core/products/SelfadjointRank2Update.h | 93 - .../Core/products/TriangularMatrixMatrix.h | 448 - .../products/TriangularMatrixMatrix_BLAS.h | 315 - .../Core/products/TriangularMatrixVector.h | 336 - .../products/TriangularMatrixVector_BLAS.h | 255 - .../Core/products/TriangularSolverMatrix.h | 335 - .../products/TriangularSolverMatrix_BLAS.h | 163 - .../Core/products/TriangularSolverVector.h | 145 - .../Eigen/src/Core/util/BlasUtil.h | 403 - .../Eigen/src/Core/util/Constants.h | 551 - .../src/Core/util/DisableStupidWarnings.h | 79 - .../Eigen/src/Core/util/ForwardDeclarations.h | 303 - .../Eigen/src/Core/util/IndexedViewHelper.h | 187 - .../Eigen/src/Core/util/IntegralConstant.h | 270 - .../Eigen/src/Core/util/MKL_support.h | 130 - .../Eigen/src/Core/util/Macros.h | 1046 - .../Eigen/src/Core/util/Memory.h | 985 - .../ThirdPartyLibs/Eigen/src/Core/util/Meta.h | 550 - .../Eigen/src/Core/util/NonMPL2.h | 3 - .../src/Core/util/ReenableStupidWarnings.h | 27 - .../Eigen/src/Core/util/StaticAssert.h | 216 - .../Eigen/src/Core/util/SymbolicIndex.h | 300 - .../Eigen/src/Core/util/XprHelper.h | 835 - .../src/Eigenvalues/ComplexEigenSolver.h | 346 - .../Eigen/src/Eigenvalues/ComplexSchur.h | 459 - .../src/Eigenvalues/ComplexSchur_LAPACKE.h | 91 - .../Eigen/src/Eigenvalues/EigenSolver.h | 622 - .../src/Eigenvalues/GeneralizedEigenSolver.h | 419 - .../GeneralizedSelfAdjointEigenSolver.h | 226 - .../src/Eigenvalues/HessenbergDecomposition.h | 374 - .../src/Eigenvalues/MatrixBaseEigenvalues.h | 160 - .../Eigen/src/Eigenvalues/RealQZ.h | 654 - .../Eigen/src/Eigenvalues/RealSchur.h | 546 - .../Eigen/src/Eigenvalues/RealSchur_LAPACKE.h | 77 - .../src/Eigenvalues/SelfAdjointEigenSolver.h | 870 - .../SelfAdjointEigenSolver_LAPACKE.h | 90 - .../src/Eigenvalues/Tridiagonalization.h | 556 - .../Eigen/src/Geometry/AlignedBox.h | 392 - .../Eigen/src/Geometry/AngleAxis.h | 247 - .../Eigen/src/Geometry/EulerAngles.h | 114 - .../Eigen/src/Geometry/Homogeneous.h | 497 - .../Eigen/src/Geometry/Hyperplane.h | 282 - .../Eigen/src/Geometry/OrthoMethods.h | 234 - .../Eigen/src/Geometry/ParametrizedLine.h | 232 - .../Eigen/src/Geometry/Quaternion.h | 814 - .../Eigen/src/Geometry/Rotation2D.h | 199 - .../Eigen/src/Geometry/RotationBase.h | 206 - .../Eigen/src/Geometry/Scaling.h | 170 - .../Eigen/src/Geometry/Transform.h | 1542 - .../Eigen/src/Geometry/Translation.h | 208 - .../Eigen/src/Geometry/Umeyama.h | 166 - .../Eigen/src/Geometry/arch/Geometry_SSE.h | 161 - .../Eigen/src/Householder/BlockHouseholder.h | 103 - .../Eigen/src/Householder/Householder.h | 172 - .../src/Householder/HouseholderSequence.h | 470 - .../BasicPreconditioners.h | 226 - .../src/IterativeLinearSolvers/BiCGSTAB.h | 228 - .../ConjugateGradient.h | 245 - .../IncompleteCholesky.h | 400 - .../IterativeLinearSolvers/IncompleteLUT.h | 462 - .../IterativeSolverBase.h | 394 - .../LeastSquareConjugateGradient.h | 216 - .../IterativeLinearSolvers/SolveWithGuess.h | 115 - .../ThirdPartyLibs/Eigen/src/Jacobi/Jacobi.h | 474 - .../ThirdPartyLibs/Eigen/src/LU/Determinant.h | 101 - .../ThirdPartyLibs/Eigen/src/LU/FullPivLU.h | 889 - .../ThirdPartyLibs/Eigen/src/LU/InverseImpl.h | 415 - .../Eigen/src/LU/PartialPivLU.h | 611 - .../Eigen/src/LU/PartialPivLU_LAPACKE.h | 83 - .../Eigen/src/LU/arch/Inverse_SSE.h | 338 - .../Eigen/src/MetisSupport/MetisSupport.h | 137 - .../Eigen/src/OrderingMethods/Amd.h | 445 - .../Eigen/src/OrderingMethods/Eigen_Colamd.h | 1843 - .../Eigen/src/OrderingMethods/Ordering.h | 157 - .../Eigen/src/PaStiXSupport/PaStiXSupport.h | 678 - .../Eigen/src/PardisoSupport/PardisoSupport.h | 543 - .../Eigen/src/QR/ColPivHouseholderQR.h | 652 - .../src/QR/ColPivHouseholderQR_LAPACKE.h | 97 - .../src/QR/CompleteOrthogonalDecomposition.h | 562 - .../Eigen/src/QR/FullPivHouseholderQR.h | 675 - .../Eigen/src/QR/HouseholderQR.h | 408 - .../Eigen/src/QR/HouseholderQR_LAPACKE.h | 68 - .../src/SPQRSupport/SuiteSparseQRSupport.h | 313 - .../ThirdPartyLibs/Eigen/src/SVD/BDCSVD.h | 1231 - .../ThirdPartyLibs/Eigen/src/SVD/JacobiSVD.h | 804 - .../Eigen/src/SVD/JacobiSVD_LAPACKE.h | 90 - .../ThirdPartyLibs/Eigen/src/SVD/SVDBase.h | 312 - .../Eigen/src/SVD/UpperBidiagonalization.h | 414 - .../src/SparseCholesky/SimplicialCholesky.h | 689 - .../SparseCholesky/SimplicialCholesky_impl.h | 199 - .../Eigen/src/SparseCore/AmbiVector.h | 377 - .../Eigen/src/SparseCore/CompressedStorage.h | 258 - .../ConservativeSparseSparseProduct.h | 352 - .../Eigen/src/SparseCore/MappedSparseMatrix.h | 67 - .../Eigen/src/SparseCore/SparseAssign.h | 216 - .../Eigen/src/SparseCore/SparseBlock.h | 603 - .../Eigen/src/SparseCore/SparseColEtree.h | 206 - .../src/SparseCore/SparseCompressedBase.h | 357 - .../src/SparseCore/SparseCwiseBinaryOp.h | 722 - .../Eigen/src/SparseCore/SparseCwiseUnaryOp.h | 148 - .../Eigen/src/SparseCore/SparseDenseProduct.h | 320 - .../src/SparseCore/SparseDiagonalProduct.h | 138 - .../Eigen/src/SparseCore/SparseDot.h | 98 - .../Eigen/src/SparseCore/SparseFuzzy.h | 29 - .../Eigen/src/SparseCore/SparseMap.h | 305 - .../Eigen/src/SparseCore/SparseMatrix.h | 1403 - .../Eigen/src/SparseCore/SparseMatrixBase.h | 405 - .../Eigen/src/SparseCore/SparsePermutation.h | 178 - .../Eigen/src/SparseCore/SparseProduct.h | 169 - .../Eigen/src/SparseCore/SparseRedux.h | 49 - .../Eigen/src/SparseCore/SparseRef.h | 397 - .../src/SparseCore/SparseSelfAdjointView.h | 656 - .../Eigen/src/SparseCore/SparseSolverBase.h | 124 - .../SparseSparseProductWithPruning.h | 198 - .../Eigen/src/SparseCore/SparseTranspose.h | 92 - .../src/SparseCore/SparseTriangularView.h | 189 - .../Eigen/src/SparseCore/SparseUtil.h | 178 - .../Eigen/src/SparseCore/SparseVector.h | 478 - .../Eigen/src/SparseCore/SparseView.h | 253 - .../Eigen/src/SparseCore/TriangularSolver.h | 315 - .../Eigen/src/SparseLU/SparseLU.h | 775 - .../Eigen/src/SparseLU/SparseLUImpl.h | 66 - .../Eigen/src/SparseLU/SparseLU_Memory.h | 226 - .../Eigen/src/SparseLU/SparseLU_Structs.h | 110 - .../src/SparseLU/SparseLU_SupernodalMatrix.h | 301 - .../Eigen/src/SparseLU/SparseLU_Utils.h | 80 - .../Eigen/src/SparseLU/SparseLU_column_bmod.h | 181 - .../Eigen/src/SparseLU/SparseLU_column_dfs.h | 179 - .../src/SparseLU/SparseLU_copy_to_ucol.h | 107 - .../Eigen/src/SparseLU/SparseLU_gemm_kernel.h | 280 - .../src/SparseLU/SparseLU_heap_relax_snode.h | 126 - .../Eigen/src/SparseLU/SparseLU_kernel_bmod.h | 130 - .../Eigen/src/SparseLU/SparseLU_panel_bmod.h | 223 - .../Eigen/src/SparseLU/SparseLU_panel_dfs.h | 258 - .../Eigen/src/SparseLU/SparseLU_pivotL.h | 137 - .../Eigen/src/SparseLU/SparseLU_pruneL.h | 136 - .../Eigen/src/SparseLU/SparseLU_relax_snode.h | 83 - .../Eigen/src/SparseQR/SparseQR.h | 739 - .../Eigen/src/StlSupport/StdDeque.h | 126 - .../Eigen/src/StlSupport/StdList.h | 106 - .../Eigen/src/StlSupport/StdVector.h | 131 - .../Eigen/src/StlSupport/details.h | 84 - .../Eigen/src/SuperLUSupport/SuperLUSupport.h | 1027 - .../Eigen/src/UmfPackSupport/UmfPackSupport.h | 506 - .../ThirdPartyLibs/Eigen/src/misc/Image.h | 82 - .../ThirdPartyLibs/Eigen/src/misc/Kernel.h | 79 - .../Eigen/src/misc/RealSvd2x2.h | 55 - .../ThirdPartyLibs/Eigen/src/misc/blas.h | 440 - .../ThirdPartyLibs/Eigen/src/misc/lapack.h | 152 - .../ThirdPartyLibs/Eigen/src/misc/lapacke.h | 16292 - .../Eigen/src/misc/lapacke_mangling.h | 17 - .../Eigen/src/plugins/ArrayCwiseBinaryOps.h | 332 - .../Eigen/src/plugins/ArrayCwiseUnaryOps.h | 567 - .../Eigen/src/plugins/BlockMethods.h | 1356 - .../Eigen/src/plugins/CommonCwiseBinaryOps.h | 115 - .../Eigen/src/plugins/CommonCwiseUnaryOps.h | 163 - .../Eigen/src/plugins/IndexedViewMethods.h | 267 - .../Eigen/src/plugins/MatrixCwiseBinaryOps.h | 152 - .../Eigen/src/plugins/MatrixCwiseUnaryOps.h | 85 - engine/inc/bullet/ThirdPartyLibs/Gwen/Align.h | 77 - engine/inc/bullet/ThirdPartyLibs/Gwen/Anim.h | 129 - .../bullet/ThirdPartyLibs/Gwen/BaseRender.h | 117 - .../inc/bullet/ThirdPartyLibs/Gwen/Config.h | 16 - .../inc/bullet/ThirdPartyLibs/Gwen/Controls.h | 10 - .../ThirdPartyLibs/Gwen/Controls/Base.h | 510 - .../ThirdPartyLibs/Gwen/Controls/Button.h | 86 - .../ThirdPartyLibs/Gwen/Controls/Canvas.h | 103 - .../ThirdPartyLibs/Gwen/Controls/CheckBox.h | 81 - .../Gwen/Controls/ColorControls.h | 58 - .../Gwen/Controls/ColorPicker.h | 85 - .../ThirdPartyLibs/Gwen/Controls/ComboBox.h | 83 - .../Gwen/Controls/CrossSplitter.h | 71 - .../Gwen/Controls/Dialogs/FileOpen.h | 34 - .../Gwen/Controls/Dialogs/FileSave.h | 39 - .../Gwen/Controls/Dialogs/Query.h | 14 - .../ThirdPartyLibs/Gwen/Controls/DockBase.h | 74 - .../Gwen/Controls/DockedTabControl.h | 39 - .../ThirdPartyLibs/Gwen/Controls/Dragger.h | 40 - .../ThirdPartyLibs/Gwen/Controls/GroupBox.h | 30 - .../Gwen/Controls/HSVColorPicker.h | 46 - .../ThirdPartyLibs/Gwen/Controls/Highlight.h | 34 - .../Gwen/Controls/HorizontalScrollBar.h | 48 - .../Gwen/Controls/HorizontalSlider.h | 35 - .../ThirdPartyLibs/Gwen/Controls/ImagePanel.h | 75 - .../ThirdPartyLibs/Gwen/Controls/Label.h | 72 - .../Gwen/Controls/LabelClickable.h | 27 - .../Gwen/Controls/Layout/Splitter.h | 82 - .../Gwen/Controls/Layout/Table.h | 309 - .../ThirdPartyLibs/Gwen/Controls/ListBox.h | 63 - .../ThirdPartyLibs/Gwen/Controls/Menu.h | 83 - .../ThirdPartyLibs/Gwen/Controls/MenuItem.h | 65 - .../ThirdPartyLibs/Gwen/Controls/MenuStrip.h | 36 - .../ThirdPartyLibs/Gwen/Controls/Modal.h | 36 - .../Gwen/Controls/NumericUpDown.h | 78 - .../Gwen/Controls/PanelListPanel.h | 52 - .../Gwen/Controls/ProgressBar.h | 42 - .../ThirdPartyLibs/Gwen/Controls/Properties.h | 69 - .../Gwen/Controls/Property/BaseProperty.h | 58 - .../Gwen/Controls/Property/ColorSelector.h | 79 - .../Gwen/Controls/Property/Text.h | 51 - .../Gwen/Controls/PropertyTree.h | 57 - .../Gwen/Controls/RadioButton.h | 79 - .../Gwen/Controls/RadioButtonController.h | 44 - .../Gwen/Controls/ResizableControl.h | 51 - .../ThirdPartyLibs/Gwen/Controls/Resizer.h | 35 - .../ThirdPartyLibs/Gwen/Controls/RichLabel.h | 59 - .../ThirdPartyLibs/Gwen/Controls/ScrollBar.h | 83 - .../Gwen/Controls/ScrollBarBar.h | 43 - .../Gwen/Controls/ScrollBarButton.h | 34 - .../Gwen/Controls/ScrollControl.h | 67 - .../ThirdPartyLibs/Gwen/Controls/Slider.h | 100 - .../Gwen/Controls/SplitterBar.h | 23 - .../ThirdPartyLibs/Gwen/Controls/StatusBar.h | 35 - .../ThirdPartyLibs/Gwen/Controls/Symbol.h | 48 - .../ThirdPartyLibs/Gwen/Controls/TabButton.h | 50 - .../ThirdPartyLibs/Gwen/Controls/TabControl.h | 64 - .../ThirdPartyLibs/Gwen/Controls/TabStrip.h | 46 - .../Gwen/Controls/TabTitleBar.h | 54 - .../ThirdPartyLibs/Gwen/Controls/Text.h | 57 - .../ThirdPartyLibs/Gwen/Controls/TextBox.h | 104 - .../ThirdPartyLibs/Gwen/Controls/ToolBar.h | 48 - .../Gwen/Controls/TreeControl.h | 55 - .../ThirdPartyLibs/Gwen/Controls/TreeNode.h | 98 - .../Gwen/Controls/VerticalScrollBar.h | 44 - .../Gwen/Controls/VerticalSlider.h | 35 - .../Gwen/Controls/WindowControl.h | 60 - .../bullet/ThirdPartyLibs/Gwen/DragAndDrop.h | 35 - .../inc/bullet/ThirdPartyLibs/Gwen/Events.h | 83 - .../inc/bullet/ThirdPartyLibs/Gwen/Exports.h | 29 - engine/inc/bullet/ThirdPartyLibs/Gwen/Font.h | 49 - engine/inc/bullet/ThirdPartyLibs/Gwen/Gwen.h | 73 - engine/inc/bullet/ThirdPartyLibs/Gwen/Hook.h | 81 - .../bullet/ThirdPartyLibs/Gwen/Input/SDL13.h | 160 - .../bullet/ThirdPartyLibs/Gwen/Input/SFML.h | 179 - .../ThirdPartyLibs/Gwen/Input/Windows.h | 175 - .../bullet/ThirdPartyLibs/Gwen/InputHandler.h | 79 - .../inc/bullet/ThirdPartyLibs/Gwen/Macros.h | 90 - .../inc/bullet/ThirdPartyLibs/Gwen/Platform.h | 43 - .../ThirdPartyLibs/Gwen/Renderers/DirectX9.h | 70 - .../ThirdPartyLibs/Gwen/Renderers/FontData.h | 263 - .../ThirdPartyLibs/Gwen/Renderers/GDIPlus.h | 88 - .../ThirdPartyLibs/Gwen/Renderers/OpenGL.h | 56 - .../Gwen/Renderers/OpenGL_DebugFont.h | 67 - .../ThirdPartyLibs/Gwen/Renderers/SFML.h | 47 - engine/inc/bullet/ThirdPartyLibs/Gwen/Skin.h | 132 - .../bullet/ThirdPartyLibs/Gwen/Skins/Simple.h | 764 - .../ThirdPartyLibs/Gwen/Skins/TexturedBase.h | 614 - .../ThirdPartyLibs/Gwen/Skins/Texturing.h | 145 - .../bullet/ThirdPartyLibs/Gwen/Structures.h | 191 - .../bullet/ThirdPartyLibs/Gwen/TextObject.h | 64 - .../inc/bullet/ThirdPartyLibs/Gwen/Texture.h | 57 - .../inc/bullet/ThirdPartyLibs/Gwen/ToolTip.h | 28 - .../ThirdPartyLibs/Gwen/UnitTest/UnitTest.h | 59 - .../inc/bullet/ThirdPartyLibs/Gwen/Utility.h | 126 - .../Wavefront/tiny_obj_loader.h | 99 - .../clsocket/src/ActiveSocket.h | 92 - .../bullet/ThirdPartyLibs/clsocket/src/Host.h | 254 - .../clsocket/src/PassiveSocket.h | 120 - .../clsocket/src/SimpleSocket.h | 617 - .../ThirdPartyLibs/clsocket/src/StatTimer.h | 110 - .../cpp_base64/include/cpp_base64/base64.h | 18 - .../crossguid/crossguid/guid.hpp | 147 - .../enet/include/enet/callbacks.h | 26 - .../ThirdPartyLibs/enet/include/enet/enet.h | 570 - .../ThirdPartyLibs/enet/include/enet/list.h | 42 - .../enet/include/enet/protocol.h | 197 - .../ThirdPartyLibs/enet/include/enet/time.h | 17 - .../ThirdPartyLibs/enet/include/enet/types.h | 12 - .../ThirdPartyLibs/enet/include/enet/unix.h | 44 - .../enet/include/enet/utility.h | 11 - .../ThirdPartyLibs/enet/include/enet/win32.h | 56 - .../ThirdPartyLibs/glad/EGL/eglplatform.h | 158 - .../ThirdPartyLibs/glad/KHR/khrplatform.h | 283 - .../inc/bullet/ThirdPartyLibs/glad/glad/egl.h | 541 - .../inc/bullet/ThirdPartyLibs/glad/glad/gl.h | 5233 - .../inc/bullet/ThirdPartyLibs/glad/glad/glx.h | 1111 - .../inc/bullet/ThirdPartyLibs/glad/linmath.h | 583 - .../bullet/ThirdPartyLibs/imgui/imconfig.h | 63 - .../inc/bullet/ThirdPartyLibs/imgui/imgui.h | 2076 - .../ThirdPartyLibs/imgui/imgui_internal.h | 1346 - .../ThirdPartyLibs/imgui/stb_rect_pack.h | 657 - .../ThirdPartyLibs/imgui/stb_textedit.h | 1383 - .../ThirdPartyLibs/imgui/stb_truetype.h | 5259 - .../ThirdPartyLibs/lua-5.2.3/src/lapi.h | 28 - .../ThirdPartyLibs/lua-5.2.3/src/lauxlib.h | 198 - .../ThirdPartyLibs/lua-5.2.3/src/lcode.h | 95 - .../ThirdPartyLibs/lua-5.2.3/src/lctype.h | 86 - .../ThirdPartyLibs/lua-5.2.3/src/ldebug.h | 31 - .../bullet/ThirdPartyLibs/lua-5.2.3/src/ldo.h | 48 - .../ThirdPartyLibs/lua-5.2.3/src/lfunc.h | 29 - .../bullet/ThirdPartyLibs/lua-5.2.3/src/lgc.h | 164 - .../ThirdPartyLibs/lua-5.2.3/src/llex.h | 100 - .../ThirdPartyLibs/lua-5.2.3/src/llimits.h | 308 - .../ThirdPartyLibs/lua-5.2.3/src/lmem.h | 54 - .../ThirdPartyLibs/lua-5.2.3/src/lobject.h | 641 - .../ThirdPartyLibs/lua-5.2.3/src/lopcodes.h | 272 - .../ThirdPartyLibs/lua-5.2.3/src/lparser.h | 118 - .../ThirdPartyLibs/lua-5.2.3/src/lstate.h | 216 - .../ThirdPartyLibs/lua-5.2.3/src/lstring.h | 41 - .../ThirdPartyLibs/lua-5.2.3/src/ltable.h | 41 - .../bullet/ThirdPartyLibs/lua-5.2.3/src/ltm.h | 52 - .../bullet/ThirdPartyLibs/lua-5.2.3/src/lua.h | 405 - .../ThirdPartyLibs/lua-5.2.3/src/lua.hpp | 10 - .../ThirdPartyLibs/lua-5.2.3/src/luaconf.h | 509 - .../ThirdPartyLibs/lua-5.2.3/src/lualib.h | 48 - .../ThirdPartyLibs/lua-5.2.3/src/lundump.h | 28 - .../bullet/ThirdPartyLibs/lua-5.2.3/src/lvm.h | 40 - .../ThirdPartyLibs/lua-5.2.3/src/lzio.h | 59 - .../inc/bullet/ThirdPartyLibs/midi/RtError.h | 62 - .../inc/bullet/ThirdPartyLibs/midi/RtMidi.h | 677 - .../inc/bullet/ThirdPartyLibs/minizip/crypt.h | 133 - .../inc/bullet/ThirdPartyLibs/minizip/ioapi.h | 193 - .../inc/bullet/ThirdPartyLibs/minizip/unzip.h | 433 - .../inc/bullet/ThirdPartyLibs/minizip/zip.h | 357 - .../osx64/OpenVR.framework/Headers/openvr.h | 3698 - .../OpenVR.framework/Headers/openvr_capi.h | 1932 - .../OpenVR.framework/Headers/openvr_driver.h | 2595 - .../Versions/A/Headers/openvr.h | 3698 - .../Versions/A/Headers/openvr_capi.h | 1932 - .../Versions/A/Headers/openvr_driver.h | 2595 - .../Versions/Current/Headers/openvr.h | 3698 - .../Versions/Current/Headers/openvr_capi.h | 1932 - .../Versions/Current/Headers/openvr_driver.h | 2595 - .../ThirdPartyLibs/openvr/headers/openvr.h | 3698 - .../openvr/headers/openvr_capi.h | 1932 - .../openvr/headers/openvr_driver.h | 2595 - .../openvr/samples/shared/Matrices.h | 855 - .../openvr/samples/shared/Vectors.h | 640 - .../openvr/samples/shared/compat.h | 28 - .../openvr/samples/shared/lodepng.h | 1696 - .../openvr/samples/shared/pathtools.h | 128 - .../openvr/samples/shared/strtools.h | 138 - .../bullet/ThirdPartyLibs/optionalX11/X11/X.h | 711 - .../ThirdPartyLibs/optionalX11/X11/XKBlib.h | 1157 - .../ThirdPartyLibs/optionalX11/X11/Xatom.h | 79 - .../optionalX11/X11/Xfuncproto.h | 176 - .../ThirdPartyLibs/optionalX11/X11/Xfuncs.h | 69 - .../ThirdPartyLibs/optionalX11/X11/Xlib.h | 4093 - .../ThirdPartyLibs/optionalX11/X11/XlibConf.h | 38 - .../ThirdPartyLibs/optionalX11/X11/Xlibint.h | 1346 - .../ThirdPartyLibs/optionalX11/X11/Xmd.h | 185 - .../ThirdPartyLibs/optionalX11/X11/Xosdefs.h | 112 - .../ThirdPartyLibs/optionalX11/X11/Xproto.h | 2298 - .../optionalX11/X11/Xprotostr.h | 81 - .../ThirdPartyLibs/optionalX11/X11/Xutil.h | 823 - .../optionalX11/X11/cursorfont.h | 111 - .../optionalX11/X11/extensions/XKB.h | 784 - .../optionalX11/X11/extensions/XKBstr.h | 652 - .../optionalX11/X11/extensions/XShm.h | 137 - .../optionalX11/X11/extensions/Xext.h | 53 - .../optionalX11/X11/extensions/extutil.h | 203 - .../optionalX11/X11/extensions/shape.h | 153 - .../optionalX11/X11/extensions/shapeconst.h | 55 - .../optionalX11/X11/extensions/shm.h | 43 - .../ThirdPartyLibs/optionalX11/X11/keysym.h | 73 - .../optionalX11/X11/keysymdef.h | 2485 - .../serial/include/serial/impl/unix.h | 223 - .../serial/include/serial/impl/win.h | 208 - .../serial/include/serial/serial.h | 794 - .../serial/include/serial/v8stdint.h | 57 - .../ThirdPartyLibs/stb_image/stb_image.h | 326 - .../stb_image/stb_image_write.h | 608 - .../ThirdPartyLibs/stb_image/stb_truetype.h | 3360 - .../bullet/ThirdPartyLibs/tinyxml2/tinyxml2.h | 2531 - engine/inc/bullet/ThirdPartyLibs/zlib/crc32.h | 426 - .../inc/bullet/ThirdPartyLibs/zlib/deflate.h | 352 - .../inc/bullet/ThirdPartyLibs/zlib/gzguts.h | 213 - .../inc/bullet/ThirdPartyLibs/zlib/inffast.h | 11 - .../inc/bullet/ThirdPartyLibs/zlib/inffixed.h | 14 - .../inc/bullet/ThirdPartyLibs/zlib/inflate.h | 124 - .../inc/bullet/ThirdPartyLibs/zlib/inftrees.h | 64 - engine/inc/bullet/ThirdPartyLibs/zlib/trees.h | 59 - engine/inc/bullet/ThirdPartyLibs/zlib/zconf.h | 511 - engine/inc/bullet/ThirdPartyLibs/zlib/zlib.h | 1767 - engine/inc/bullet/ThirdPartyLibs/zlib/zutil.h | 274 - engine/inc/bullet/TinyAudio/RtAudio.h | 1171 - .../inc/bullet/TinyAudio/TinyAudioExample.h | 7 - engine/inc/bullet/TinyAudio/b3ADSR.h | 34 - engine/inc/bullet/TinyAudio/b3AudioListener.h | 27 - engine/inc/bullet/TinyAudio/b3ReadWavFile.h | 53 - engine/inc/bullet/TinyAudio/b3SoundEngine.h | 55 - engine/inc/bullet/TinyAudio/b3SoundSource.h | 31 - engine/inc/bullet/TinyAudio/b3Sound_C_Api.h | 29 - engine/inc/bullet/TinyAudio/b3SwapUtils.h | 58 - engine/inc/bullet/TinyAudio/b3WriteWavFile.h | 29 - engine/inc/bullet/TinyRenderer/TinyRenderer.h | 66 - engine/inc/bullet/TinyRenderer/geometry.h | 327 - engine/inc/bullet/TinyRenderer/model.h | 79 - engine/inc/bullet/TinyRenderer/our_gl.h | 27 - engine/inc/bullet/TinyRenderer/tgaimage.h | 112 - .../bullet/Tutorial/Dof6ConstraintTutorial.h | 6 - engine/inc/bullet/Tutorial/Tutorial.h | 14 - engine/inc/bullet/Utils/ChromeTraceUtil.h | 9 - engine/inc/bullet/Utils/RobotLoggingUtil.h | 53 - .../inc/bullet/Utils/b3BulletDefaultFileIO.h | 196 - engine/inc/bullet/Utils/b3Clock.h | 38 - engine/inc/bullet/Utils/b3ERPCFMHelper.hpp | 81 - engine/inc/bullet/Utils/b3Quickprof.h | 150 - .../bullet/Utils/b3ReferenceFrameHelper.hpp | 62 - engine/inc/bullet/Utils/b3ResourcePath.h | 15 - engine/inc/bullet/Vehicles/Hinge2Vehicle.h | 21 - .../VoronoiFracture/VoronoiFractureDemo.h | 20 - .../btConvexConvexMprAlgorithm.h | 79 - engine/inc/bullet/btBulletCollisionCommon.h | 65 - engine/inc/bullet/btBulletDynamicsCommon.h | 43 - engine/inc/discord/types.h | 1 - engine/inc/dreamcast.h | 37 - engine/inc/gltf/json.hpp | 20406 -- engine/inc/gltf/stb_image.h | 7530 - engine/inc/gltf/stb_image_write.h | 1621 - engine/inc/gltf/tiny_gltf.h | 7639 - engine/inc/json/allocator.h | 98 + engine/inc/json/assertions.h | 54 + engine/inc/json/autolink.h | 25 + engine/inc/json/config.h | 195 + engine/inc/json/features.h | 61 + engine/inc/json/forwards.h | 37 + engine/inc/json/json-forwards.h | 446 - engine/inc/json/json.h | 2342 +- engine/inc/json/reader.h | 413 + engine/inc/json/value.h | 903 + engine/inc/json/version.h | 20 + engine/inc/json/writer.h | 363 + engine/inc/meshoptimizer.h | 943 - engine/inc/nlohmann/fifo_map.hpp | 547 - engine/inc/nlohmann/json.hpp | 25542 -- engine/inc/openvr-x/openvr_capi.h | 2898 - engine/inc/openvr-x/openvr_driver.h | 4086 - engine/inc/{openvr-x => }/openvr.h | 19 +- engine/inc/{openvr-x => }/openvr_mingw.h | 10259 +- engine/inc/rapidjson/allocators.h | 271 - engine/inc/rapidjson/document.h | 2575 - engine/inc/rapidjson/encodedstream.h | 299 - engine/inc/rapidjson/encodings.h | 716 - engine/inc/rapidjson/error/en.h | 74 - engine/inc/rapidjson/error/error.h | 155 - engine/inc/rapidjson/filereadstream.h | 99 - engine/inc/rapidjson/filewritestream.h | 104 - engine/inc/rapidjson/fwd.h | 151 - engine/inc/rapidjson/internal/biginteger.h | 290 - engine/inc/rapidjson/internal/diyfp.h | 258 - engine/inc/rapidjson/internal/dtoa.h | 245 - engine/inc/rapidjson/internal/ieee754.h | 78 - engine/inc/rapidjson/internal/itoa.h | 304 - engine/inc/rapidjson/internal/meta.h | 181 - engine/inc/rapidjson/internal/pow10.h | 55 - engine/inc/rapidjson/internal/regex.h | 701 - engine/inc/rapidjson/internal/stack.h | 230 - engine/inc/rapidjson/internal/strfunc.h | 55 - engine/inc/rapidjson/internal/strtod.h | 269 - engine/inc/rapidjson/internal/swap.h | 46 - engine/inc/rapidjson/istreamwrapper.h | 115 - engine/inc/rapidjson/memorybuffer.h | 70 - engine/inc/rapidjson/memorystream.h | 71 - engine/inc/rapidjson/msinttypes/inttypes.h | 316 - engine/inc/rapidjson/msinttypes/stdint.h | 300 - engine/inc/rapidjson/ostreamwrapper.h | 81 - engine/inc/rapidjson/pointer.h | 1358 - engine/inc/rapidjson/prettywriter.h | 255 - engine/inc/rapidjson/rapidjson.h | 615 - engine/inc/rapidjson/reader.h | 1879 - engine/inc/rapidjson/schema.h | 2006 - engine/inc/rapidjson/stream.h | 179 - engine/inc/rapidjson/stringbuffer.h | 117 - engine/inc/rapidjson/writer.h | 610 - engine/inc/sol/config.hpp | 53 - engine/inc/sol/forward.hpp | 828 - engine/inc/sol/sol.hpp | 26699 -- engine/inc/spirv_cross/GLSL.std.450.h | 131 - engine/inc/spirv_cross/barrier.hpp | 79 - engine/inc/spirv_cross/external_interface.h | 126 - engine/inc/spirv_cross/image.hpp | 62 - engine/inc/spirv_cross/internal_interface.hpp | 603 - engine/inc/spirv_cross/sampler.hpp | 105 - engine/inc/spirv_cross/spirv.h | 2104 - engine/inc/spirv_cross/spirv.hpp | 2114 - engine/inc/spirv_cross/spirv_cfg.hpp | 156 - engine/inc/spirv_cross/spirv_common.hpp | 1831 - engine/inc/spirv_cross/spirv_cpp.hpp | 86 - engine/inc/spirv_cross/spirv_cross.hpp | 1070 - engine/inc/spirv_cross/spirv_cross_c.h | 966 - .../spirv_cross/spirv_cross_containers.hpp | 735 - .../spirv_cross_error_handling.hpp | 87 - .../inc/spirv_cross/spirv_cross_parsed_ir.hpp | 231 - engine/inc/spirv_cross/spirv_cross_util.hpp | 30 - engine/inc/spirv_cross/spirv_glsl.hpp | 806 - engine/inc/spirv_cross/spirv_hlsl.hpp | 361 - engine/inc/spirv_cross/spirv_msl.hpp | 1014 - engine/inc/spirv_cross/spirv_parser.hpp | 94 - engine/inc/spirv_cross/spirv_reflect.hpp | 84 - engine/inc/spirv_cross/thread_group.hpp | 113 - engine/inc/uf/config.h | 41 +- engine/inc/uf/engine/behavior/behavior.h | 78 - engine/inc/uf/engine/behavior/macros.inl | 84 - engine/inc/uf/engine/entity/behavior.h | 5 - engine/inc/uf/engine/entity/entity.h | 93 +- engine/inc/uf/engine/entity/entity.inl | 15 +- .../inc/uf/engine/instantiator/instantiator.h | 73 - .../uf/engine/instantiator/instantiator.inl | 186 - engine/inc/uf/engine/instantiator/macros.inl | 106 - engine/inc/uf/engine/object/behavior.h | 5 - engine/inc/uf/engine/object/behaviors/gltf.h | 16 - .../inc/uf/engine/object/behaviors/loading.h | 16 - engine/inc/uf/engine/object/behaviors/lua.h | 16 - .../inc/uf/engine/object/behaviors/render.h | 16 - engine/inc/uf/engine/object/object.h | 61 - engine/inc/uf/engine/object/object.inl | 32 - engine/inc/uf/engine/scene/behavior.h | 5 - engine/inc/uf/engine/scene/scene.h | 33 - engine/inc/uf/ext/assimp/assimp.h | 17 + engine/inc/uf/ext/bullet/bullet.h | 83 - engine/inc/uf/ext/bullet/bullet.inl | 98 - engine/inc/uf/ext/discord/discord.h | 1 + engine/inc/uf/ext/ext.h | 6 +- engine/inc/uf/ext/freetype/freetype.h | 2 +- engine/inc/uf/ext/gltf/gltf.h | 11 - engine/inc/uf/ext/gltf/graph.h | 211 - engine/inc/uf/ext/gltf/mesh.h | 97 - engine/inc/uf/ext/json/json.h | 47 - engine/inc/uf/ext/json/json.inl | 0 engine/inc/uf/ext/json/jsoncpp.h | 54 - engine/inc/uf/ext/json/lua.h | 56 - engine/inc/uf/ext/json/nlohmann.h | 114 - engine/inc/uf/ext/json/rapidjson.h | 147 - engine/inc/uf/ext/lua/lua.h | 46 - engine/inc/uf/ext/lua/lua.inl | 56 - engine/inc/uf/ext/oal/oal.h | 4 +- engine/inc/uf/ext/opengl/buffer.h | 67 - engine/inc/uf/ext/opengl/device.h | 16 - engine/inc/uf/ext/opengl/enums.h | 100 - engine/inc/uf/ext/opengl/graphic.h | 142 - engine/inc/uf/ext/opengl/graphic.inl | 53 - engine/inc/uf/ext/opengl/initializers.h | 1 - engine/inc/uf/ext/opengl/ogl.h | 32 - engine/inc/uf/ext/opengl/opengl.h | 78 - engine/inc/uf/ext/opengl/rendermode.h | 56 - engine/inc/uf/ext/opengl/rendermodes/base.h | 19 - .../inc/uf/ext/opengl/rendermodes/compute.h | 27 - .../inc/uf/ext/opengl/rendermodes/deferred.h | 23 - .../uf/ext/opengl/rendermodes/rendertarget.h | 30 - engine/inc/uf/ext/opengl/rendertarget.h | 55 - engine/inc/uf/ext/opengl/swapchain.h | 29 - engine/inc/uf/ext/opengl/texture.h | 140 - engine/inc/uf/ext/openvr/openvr.h | 57 +- engine/inc/uf/ext/ultralight/ultralight.h | 47 - engine/inc/uf/ext/vorbis/vorbis.h | 2 +- engine/inc/uf/ext/vulkan.h | 44 + engine/inc/uf/ext/vulkan/buffer.h | 32 +- engine/inc/uf/ext/vulkan/commands/base.h | 18 + engine/inc/uf/ext/vulkan/commands/multiview.h | 24 + engine/inc/uf/ext/vulkan/commands/stereo.h | 22 + engine/inc/uf/ext/vulkan/device.h | 65 +- engine/inc/uf/ext/vulkan/enums.h | 100 - engine/inc/uf/ext/vulkan/graphic.h | 173 +- engine/inc/uf/ext/vulkan/graphic.inl | 53 - engine/inc/uf/ext/vulkan/graphics/base.h | 60 + engine/inc/uf/ext/vulkan/graphics/compute.h | 78 + .../inc/uf/ext/vulkan/graphics/framebuffer.h | 35 + engine/inc/uf/ext/vulkan/graphics/gui.h | 45 + engine/inc/uf/ext/vulkan/graphics/mesh.h | 39 + engine/inc/uf/ext/vulkan/initializers.h | 4 +- engine/inc/uf/ext/vulkan/rendermode.h | 56 - engine/inc/uf/ext/vulkan/rendermodes/base.h | 19 - .../inc/uf/ext/vulkan/rendermodes/compute.h | 27 - .../inc/uf/ext/vulkan/rendermodes/deferred.h | 23 - .../uf/ext/vulkan/rendermodes/rendertarget.h | 30 - engine/inc/uf/ext/vulkan/rendertarget.h | 44 +- engine/inc/uf/ext/vulkan/swapchain.h | 42 +- engine/inc/uf/ext/vulkan/texture.h | 128 +- engine/inc/uf/ext/vulkan/tools.h | 10 + engine/inc/uf/ext/vulkan/vk.h | 28 - engine/inc/uf/ext/vulkan/vulkan.h | 86 +- engine/inc/uf/macros.h | 19 - engine/inc/uf/simd.h | 56 - engine/inc/uf/spec/context/context.h | 6 +- engine/inc/uf/spec/context/dreamcast.h | 8 - engine/inc/uf/spec/context/universal.h | 9 +- engine/inc/uf/spec/context/windows.h | 2 +- engine/inc/uf/spec/dreamcast.h | 11 - engine/inc/uf/spec/renderer/opengl.h | 12 - engine/inc/uf/spec/renderer/universal.h | 11 - engine/inc/uf/spec/renderer/vulkan.h | 12 - engine/inc/uf/spec/time/dreamcast.h | 19 - engine/inc/uf/spec/universal.h | 1 + engine/inc/uf/spec/window/dreamcast.h | 71 - engine/inc/uf/spec/window/universal.h | 45 +- engine/inc/uf/spec/window/windows.h | 14 +- engine/inc/uf/utils/audio/audio.h | 68 +- engine/inc/uf/utils/camera/camera.h | 23 +- engine/inc/uf/utils/component/component.h | 16 +- engine/inc/uf/utils/component/component.inl | 51 +- engine/inc/uf/utils/graphic/descriptor.h | 71 - engine/inc/uf/utils/graphic/graphic.h | 7 - engine/inc/uf/utils/graphic/mesh.h | 275 - engine/inc/uf/utils/graphic/mesh.inl | 129 - engine/inc/uf/utils/hook/function_traits.inl | 51 - engine/inc/uf/utils/hook/hook.h | 140 +- engine/inc/uf/utils/hook/hook.inl | 38 - engine/inc/uf/utils/image/atlas.h | 68 - engine/inc/uf/utils/image/image.h | 19 +- engine/inc/uf/utils/image/pixel.h | 6 +- engine/inc/uf/utils/io/iostream.h | 2 - engine/inc/uf/utils/math/collision.h | 156 +- .../inc/uf/utils/math/collision/boundingbox.h | 27 - engine/inc/uf/utils/math/collision/gjk.h | 88 - engine/inc/uf/utils/math/collision/mesh.h | 33 - engine/inc/uf/utils/math/collision/modular.h | 34 - engine/inc/uf/utils/math/collision/sphere.h | 24 - engine/inc/uf/utils/math/math.h | 8 - engine/inc/uf/utils/math/matrix.h | 39 +- engine/inc/uf/utils/math/matrix/matrix.inl | 21 +- engine/inc/uf/utils/math/matrix/pod.inl | 214 +- engine/inc/uf/utils/math/physics.h | 7 +- engine/inc/uf/utils/math/quaternion.h | 17 +- engine/inc/uf/utils/math/quaternion/pod.inl | 241 +- engine/inc/uf/utils/math/simd.h | 0 engine/inc/uf/utils/math/transform.h | 136 +- .../inc/uf/utils/math/transform/transform.inl | 198 - engine/inc/uf/utils/math/vector.h | 291 +- engine/inc/uf/utils/math/vector/pod.inl | 262 +- .../inc/uf/utils/math/vector/redundancy.inl | 334 +- engine/inc/uf/utils/math/vector/simd.h | 115 - engine/inc/uf/utils/math/vector/simd.inl | 295 - engine/inc/uf/utils/math/vector/vector.inl | 21 +- engine/inc/uf/utils/mempool/mempool.h | 74 - engine/inc/uf/utils/mempool/mempool.inl | 36 - engine/inc/uf/utils/mesh/mesh.h | 171 + engine/inc/uf/utils/mesh/mesh.inl | 63 + engine/inc/uf/utils/renderer/renderer.h | 6 - engine/inc/uf/utils/serialize/serializer.h | 68 +- engine/inc/uf/utils/singletons/pre_main.h | 11 - engine/inc/uf/utils/string/ext.h | 20 +- engine/inc/uf/utils/string/ext.inl | 16 - engine/inc/uf/utils/string/hash.h | 7 +- engine/inc/uf/utils/string/io.h | 21 - engine/inc/uf/utils/string/rle.inl | 4 +- engine/inc/uf/utils/text/glyph.h | 5 +- engine/inc/uf/utils/thread/perthread.h | 22 - engine/inc/uf/utils/thread/perthread.inl | 12 - engine/inc/uf/utils/thread/thread.h | 3 - engine/inc/uf/utils/time/time.h | 4 +- engine/inc/uf/utils/time/timer.inl | 3 +- engine/inc/uf/utils/type/type.h | 54 - engine/inc/uf/utils/type/type.inl | 12 - engine/inc/uf/utils/userdata/pointered.inl | 191 - engine/inc/uf/utils/userdata/userdata.h | 50 +- engine/inc/uf/utils/userdata/userdata.inl | 64 +- engine/inc/uf/utils/window/window.h | 13 +- engine/inc/vk_mem_alloc.h | 5835 +- engine/src/engine/asset/asset.cpp | 205 - engine/src/engine/asset/masterdata.cpp | 31 - engine/src/engine/behavior/behavior.cpp | 176 - engine/src/engine/entity/behavior.cpp | 48 - engine/src/engine/entity/entity.cpp | 105 +- .../src/engine/instantiator/instantiator.cpp | 148 - engine/src/engine/object/behavior.cpp | 190 - engine/src/engine/object/behaviors/gltf.cpp | 408 - .../src/engine/object/behaviors/loading.cpp | 94 - engine/src/engine/object/behaviors/lua.cpp | 46 - engine/src/engine/object/behaviors/render.cpp | 76 - engine/src/engine/object/object.cpp | 528 - engine/src/engine/scene/behavior.cpp | 34 - engine/src/engine/scene/scene.cpp | 103 - engine/src/ext/assimp/assimp.cpp | 296 + engine/src/ext/bullet/bullet.cpp | 415 - .../src/ext/discord/achievement_manager.cpp | 2 - engine/src/ext/discord/activity_manager.cpp | 2 - .../src/ext/discord/application_manager.cpp | 2 - engine/src/ext/discord/core.cpp | 2 - engine/src/ext/discord/discord.cpp | 40 +- engine/src/ext/discord/image_manager.cpp | 2 - engine/src/ext/discord/lobby_manager.cpp | 2 - engine/src/ext/discord/network_manager.cpp | 2 - engine/src/ext/discord/overlay_manager.cpp | 2 - .../src/ext/discord/relationship_manager.cpp | 2 - engine/src/ext/discord/storage_manager.cpp | 2 - engine/src/ext/discord/store_manager.cpp | 2 - engine/src/ext/discord/types.cpp | 2 - engine/src/ext/discord/user_manager.cpp | 2 - engine/src/ext/discord/voice_manager.cpp | 2 - engine/src/ext/freetype/freetype.cpp | 8 +- engine/src/ext/gltf/gltf.cpp | 503 - engine/src/ext/gltf/graph.cpp | 634 - engine/src/ext/gltf/mesh.cpp | 55 - engine/src/ext/json/json.cpp | 147 - engine/src/ext/json/jsoncpp.cpp1 | 5139 + .../ext/json/{jsoncpp.cpp => jsoncpp.cpp2} | 2696 +- engine/src/ext/lua/lua.cpp | 266 - engine/src/ext/lua/usertypes/asset.cpp | 30 - engine/src/ext/lua/usertypes/audio.cpp | 34 - engine/src/ext/lua/usertypes/camera.cpp | 43 - engine/src/ext/lua/usertypes/matrix.cpp | 36 - engine/src/ext/lua/usertypes/object.cpp | 165 - engine/src/ext/lua/usertypes/quaternion.cpp | 76 - engine/src/ext/lua/usertypes/timer.cpp | 15 - engine/src/ext/lua/usertypes/transform.cpp | 52 - engine/src/ext/lua/usertypes/vector.cpp | 119 - engine/src/ext/oal/oal.cpp | 40 +- engine/src/ext/opengl/buffer.cpp | 72 - engine/src/ext/opengl/device.cpp | 15 - engine/src/ext/opengl/graphic.cpp | 559 - engine/src/ext/opengl/opengl.cpp | 298 - engine/src/ext/opengl/rendermode.cpp | 147 - engine/src/ext/opengl/rendermodes/base.cpp | 33 - engine/src/ext/opengl/rendermodes/compute.cpp | 49 - .../src/ext/opengl/rendermodes/deferred.cpp | 43 - .../ext/opengl/rendermodes/rendertarget.cpp | 62 - engine/src/ext/opengl/rendertarget.cpp | 19 - engine/src/ext/opengl/swapchain.cpp | 22 - engine/src/ext/opengl/texture.cpp | 138 - engine/src/ext/openvr/openvr.cpp | 690 +- engine/src/ext/ultralight/ultralight.cpp | 270 - engine/src/ext/vorbis/vorbis.cpp | 9 +- engine/src/ext/vulkan/buffer.cpp | 120 +- engine/src/ext/vulkan/commands/base.cpp | 140 + engine/src/ext/vulkan/commands/multiview.cpp | 275 + engine/src/ext/vulkan/commands/stereo.cpp.x | 276 + engine/src/ext/vulkan/device.cpp | 641 +- engine/src/ext/vulkan/graphic.cpp | 1818 +- engine/src/ext/vulkan/graphics/base.cpp | 248 + engine/src/ext/vulkan/graphics/compute.cpp | 434 + .../src/ext/vulkan/graphics/framebuffer.cpp | 269 + engine/src/ext/vulkan/graphics/gui.cpp | 207 + engine/src/ext/vulkan/graphics/mesh.cpp | 213 + engine/src/ext/vulkan/rendermode.cpp | 282 - engine/src/ext/vulkan/rendermodes/base.cpp | 390 - engine/src/ext/vulkan/rendermodes/compute.cpp | 236 - .../src/ext/vulkan/rendermodes/deferred.cpp | 494 - .../ext/vulkan/rendermodes/rendertarget.cpp | 444 - engine/src/ext/vulkan/rendertarget.cpp | 572 +- engine/src/ext/vulkan/swapchain.cpp | 376 +- engine/src/ext/vulkan/texture.cpp | 561 +- engine/src/ext/vulkan/vulkan.cpp | 694 +- engine/src/spec/context/universal.cpp | 155 +- engine/src/spec/context/windows.cpp | 4 +- engine/src/spec/terminal/dreamcast.cpp | 17 - engine/src/spec/terminal/unknown.cpp | 2 +- engine/src/spec/time/dreamcast.cpp | 7 - engine/src/spec/window/dreamcast.cpp | 134 - engine/src/spec/window/universal.cpp | 78 +- engine/src/spec/window/windows.cpp | 186 +- engine/src/utils/audio/audio.cpp | 265 +- engine/src/utils/camera/camera.cpp | 286 +- engine/src/utils/component/component.cpp | 20 +- engine/src/utils/hook/hook.cpp | 158 +- engine/src/utils/http/http.cpp | 5 +- engine/src/utils/image/atlas.cpp | 301 - engine/src/utils/image/image.cpp | 266 +- engine/src/utils/io/iostream.cpp | 4 - engine/src/utils/math/collider.cpp | 440 +- .../src/utils/math/collision/boundingbox.cpp | 157 - engine/src/utils/math/collision/gjk.cpp | 247 - engine/src/utils/math/collision/mesh.cpp | 42 - engine/src/utils/math/collision/modular.cpp | 55 - engine/src/utils/math/collision/sphere.cpp | 49 - engine/src/utils/math/physics.cpp | 12 +- engine/src/utils/math/simd/simd.cpp | 22 - engine/src/utils/mempool/mempool.cpp | 321 - engine/src/utils/{graphic => mesh}/mesh.cpp | 107 +- engine/src/utils/noise/perlin.cpp | 12 +- engine/src/utils/serialize/serializable.cpp | 2 +- engine/src/utils/serialize/serializer.cpp | 130 +- engine/src/utils/singletons/pre_main.cpp | 5 - engine/src/utils/string/ext.cpp | 164 +- engine/src/utils/string/io.cpp | 118 - engine/src/utils/text/glyph.cpp | 31 +- engine/src/utils/thread/thread.cpp | 72 +- engine/src/utils/type/type.cpp | 50 - engine/src/utils/userdata/pointered.cpp | 192 - engine/src/utils/userdata/userdata.cpp | 138 +- engine/src/utils/window/window.cpp | 35 +- ext/asset/asset.cpp | 233 + {engine/inc/uf/engine => ext}/asset/asset.h | 42 +- ext/asset/masterdata.cpp | 32 + .../inc/uf/engine => ext}/asset/masterdata.h | 8 +- ext/behaviors/craeture/behavior.cpp | 176 - ext/behaviors/craeture/behavior.h | 17 - ext/behaviors/hands/behavior.cpp | 481 - ext/behaviors/hands/behavior.h | 17 - ext/behaviors/light/behavior.cpp | 245 - ext/behaviors/light/behavior.h | 17 - ext/behaviors/noise/behavior.cpp | 121 - ext/behaviors/noise/behavior.h | 17 - ext/behaviors/player/behavior.cpp | 856 - ext/behaviors/player/behavior.h | 17 - ext/behaviors/player/model/behavior.cpp | 61 - ext/behaviors/player/model/behavior.h | 17 - ext/behaviors/portal/behavior.cpp | 165 - ext/behaviors/portal/behavior.h | 25 - ext/behaviors/scene/behavior.cpp | 620 - ext/behaviors/scene/behavior.h | 17 - ext/behaviors/scene/collision/behavior.cpp | 322 - ext/behaviors/scene/collision/behavior.h | 17 - ext/behaviors/soundemitter/behavior.cpp | 116 - ext/behaviors/soundemitter/behavior.h | 17 - ext/behaviors/sprite/behavior.cpp | 110 - ext/behaviors/sprite/behavior.h | 17 - ext/{scenes/worldscape => }/gui/battle.cpp | 407 +- ext/{scenes/worldscape => }/gui/battle.h | 2 +- ext/gui/behavior.cpp | 1299 - ext/gui/behavior.h | 17 - ext/{scenes/worldscape => }/gui/dialogue.cpp | 126 +- ext/{scenes/worldscape => }/gui/dialogue.h | 2 +- ext/gui/gui.cpp | 1035 + ext/gui/gui.h | 34 +- ext/gui/html/behavior.cpp | 121 - ext/gui/html/behavior.h | 17 - ext/gui/manager/behavior.cpp | 208 - ext/gui/manager/behavior.h | 17 - ext/gui/menu.cpp | 600 + ext/gui/menu.h | 13 + ext/inits/persistence.inl | 26 +- ext/main.cpp | 814 +- ext/mainmenu/menu.cpp | 230 + ext/mainmenu/menu.h | 18 + ext/object/object.cpp | 245 + ext/object/object.h | 32 + ext/scene/scene.cpp | 49 + ext/scene/scene.h | 34 + ext/scenes/raytrace/behavior.cpp | 211 - ext/scenes/raytrace/behavior.h | 17 - ext/scenes/worldscape/behavior.cpp | 122 - ext/scenes/worldscape/behavior.h | 17 - ext/scenes/worldscape/housamo/housamo.cpp | 158 - ext/scenes/worldscape/terrain/behavior.cpp | 285 - ext/scenes/worldscape/terrain/behavior.h | 17 - ext/scenes/worldscape/terrain/maze.cpp | 436 - ext/scenes/worldscape/terrain/maze.h | 38 - ext/scenes/worldscape/terrain/region.cpp | 655 - ext/scenes/worldscape/terrain/region.h | 17 - ext/scenes/worldscape/terrain/terrain.cpp | 227 - ext/world/craeture/craeture.cpp | 427 + ext/world/craeture/craeture.h | 22 + .../worldscape => world}/housamo/battle.cpp | 981 +- .../worldscape => world}/housamo/battle.h | 4 +- .../worldscape => world}/housamo/dialogue.cpp | 131 +- .../worldscape => world}/housamo/dialogue.h | 4 +- ext/world/housamo/housamo.cpp | 162 + .../worldscape => world}/housamo/housamo.h | 4 +- ext/world/housamo/sprite.cpp | 186 + ext/world/housamo/sprite.h | 17 + ext/world/player/player.cpp | 462 + ext/world/player/player.h | 17 + .../terrain/generator.cpp | 1032 +- .../worldscape => world}/terrain/generator.h | 19 +- ext/world/terrain/region.cpp | 331 + ext/world/terrain/region.h | 22 + ext/world/terrain/terrain.cpp | 892 + .../worldscape => world}/terrain/terrain.h | 18 +- .../worldscape => world}/terrain/voxel.cpp | 4 +- .../worldscape => world}/terrain/voxel.h | 3 + ext/world/world.cpp | 318 + ext/world/world.h | 16 + makefiles/dreamcast.gcc.make | 5 - makefiles/win64.clang.make | 4 - makefiles/win64.gcc.make | 4 - makefiles/win64.gcc10.make | 5 - program.sh | 4 +- 1837 files changed, 31092 insertions(+), 852725 deletions(-) delete mode 100644 bin/data/shaders/base.colored.vert.glsl create mode 100644 bin/data/shaders/base.dither16.frag.glsl create mode 100644 bin/data/shaders/base.dither4.frag.glsl create mode 100644 bin/data/shaders/base.dither8.frag.glsl create mode 100644 bin/data/shaders/base.stereo.vert.glsl delete mode 100644 bin/data/shaders/display.blit.frag.glsl delete mode 100644 bin/data/shaders/display.blit.vert.glsl create mode 100644 bin/data/shaders/display.frag.glsl delete mode 100644 bin/data/shaders/display.rendertarget.frag.glsl delete mode 100644 bin/data/shaders/display.subpass.frag.glsl delete mode 100644 bin/data/shaders/display.subpass.old.frag.glsl delete mode 100644 bin/data/shaders/display.subpass.vert.glsl delete mode 100644 bin/data/shaders/gltf.frag.glsl delete mode 100644 bin/data/shaders/gltf.instanced.vert.glsl delete mode 100644 bin/data/shaders/gltf.skinned.instanced.vert.glsl delete mode 100644 bin/data/shaders/gltf.skinned.vert.glsl delete mode 100644 bin/data/shaders/gltf.vert.glsl create mode 100644 bin/data/shaders/gui.dither16.frag.glsl create mode 100644 bin/data/shaders/gui.dither4.frag.glsl create mode 100644 bin/data/shaders/gui.dither8.frag.glsl create mode 100644 bin/data/shaders/gui.gradient.frag.glsl rename bin/data/shaders/{display.rendertarget.vert.glsl => gui.stereo.vert.glsl} (60%) create mode 100644 bin/data/shaders/gui.text.dither16.frag.glsl create mode 100644 bin/data/shaders/gui.text.dither4.frag.glsl create mode 100644 bin/data/shaders/gui.text.dither8.frag.glsl create mode 100644 bin/data/shaders/gui.text.stereo.vert.glsl delete mode 100644 bin/data/shaders/heightmap.frag.glsl delete mode 100644 bin/data/shaders/line.frag.glsl delete mode 100644 bin/data/shaders/line.vert.glsl delete mode 100644 bin/data/shaders/noise.frag.glsl rename bin/data/shaders/{heightmap.vert.glsl => terrain.stereo.vert.glsl} (59%) delete mode 100644 client/dc.cpp delete mode 100644 engine/inc/ActiveSocket.h delete mode 100644 engine/inc/AppCore/App.h delete mode 100644 engine/inc/AppCore/AppCore.h delete mode 100644 engine/inc/AppCore/CAPI.h delete mode 100644 engine/inc/AppCore/Defines.h delete mode 100644 engine/inc/AppCore/JSHelpers.h delete mode 100644 engine/inc/AppCore/Monitor.h delete mode 100644 engine/inc/AppCore/Overlay.h delete mode 100644 engine/inc/AppCore/Platform.h delete mode 100644 engine/inc/AppCore/Window.h delete mode 100644 engine/inc/GL/glext.h delete mode 100644 engine/inc/GL/wglext.h delete mode 100644 engine/inc/Host.h delete mode 100644 engine/inc/JavaScriptCore/JSBase.h delete mode 100644 engine/inc/JavaScriptCore/JSContextRef.h delete mode 100644 engine/inc/JavaScriptCore/JSObjectRef.h delete mode 100644 engine/inc/JavaScriptCore/JSObjectRefPrivate.h delete mode 100644 engine/inc/JavaScriptCore/JSRetainPtr.h delete mode 100644 engine/inc/JavaScriptCore/JSStringRef.h delete mode 100644 engine/inc/JavaScriptCore/JSTypedArray.h delete mode 100644 engine/inc/JavaScriptCore/JSValueRef.h delete mode 100644 engine/inc/JavaScriptCore/JavaScript.h delete mode 100644 engine/inc/JavaScriptCore/WebKitAvailability.h delete mode 100644 engine/inc/PassiveSocket.h delete mode 100644 engine/inc/SimpleSocket.h delete mode 100644 engine/inc/StatTimer.h delete mode 100644 engine/inc/Ultralight/Bitmap.h delete mode 100644 engine/inc/Ultralight/Buffer.h delete mode 100644 engine/inc/Ultralight/CAPI.h delete mode 100644 engine/inc/Ultralight/Defines.h delete mode 100644 engine/inc/Ultralight/Geometry.h delete mode 100644 engine/inc/Ultralight/JavaScript.h delete mode 100644 engine/inc/Ultralight/KeyCodes.h delete mode 100644 engine/inc/Ultralight/KeyEvent.h delete mode 100644 engine/inc/Ultralight/Listener.h delete mode 100644 engine/inc/Ultralight/Matrix.h delete mode 100644 engine/inc/Ultralight/MouseEvent.h delete mode 100644 engine/inc/Ultralight/RefPtr.h delete mode 100644 engine/inc/Ultralight/RenderTarget.h delete mode 100644 engine/inc/Ultralight/Renderer.h delete mode 100644 engine/inc/Ultralight/RequestHandler.h delete mode 100644 engine/inc/Ultralight/ScrollEvent.h delete mode 100644 engine/inc/Ultralight/Session.h delete mode 100644 engine/inc/Ultralight/String.h delete mode 100644 engine/inc/Ultralight/String16.h delete mode 100644 engine/inc/Ultralight/String32.h delete mode 100644 engine/inc/Ultralight/String8.h delete mode 100644 engine/inc/Ultralight/Ultralight.h delete mode 100644 engine/inc/Ultralight/View.h delete mode 100644 engine/inc/Ultralight/platform/Clipboard.h delete mode 100644 engine/inc/Ultralight/platform/Config.h delete mode 100644 engine/inc/Ultralight/platform/FileSystem.h delete mode 100644 engine/inc/Ultralight/platform/FontLoader.h delete mode 100644 engine/inc/Ultralight/platform/GPUDriver.h delete mode 100644 engine/inc/Ultralight/platform/Logger.h delete mode 100644 engine/inc/Ultralight/platform/Platform.h delete mode 100644 engine/inc/Ultralight/platform/Surface.h delete mode 100644 engine/inc/Ultralight/private/PlatformFileSystem.h delete mode 100644 engine/inc/binpack2d/binpack2d.hpp delete mode 100644 engine/inc/bullet/BasicDemo/BasicExample.h delete mode 100644 engine/inc/bullet/Benchmarks/BenchmarkDemo.h delete mode 100644 engine/inc/bullet/Benchmarks/HaltonData.h delete mode 100644 engine/inc/bullet/Benchmarks/TaruData.h delete mode 100644 engine/inc/bullet/Benchmarks/landscapeData.h delete mode 100644 engine/inc/bullet/Bullet2FileLoader/autogenerated/bullet2.h delete mode 100644 engine/inc/bullet/Bullet2FileLoader/b3BulletFile.h delete mode 100644 engine/inc/bullet/Bullet2FileLoader/b3Chunk.h delete mode 100644 engine/inc/bullet/Bullet2FileLoader/b3Common.h delete mode 100644 engine/inc/bullet/Bullet2FileLoader/b3DNA.h delete mode 100644 engine/inc/bullet/Bullet2FileLoader/b3Defines.h delete mode 100644 engine/inc/bullet/Bullet2FileLoader/b3File.h delete mode 100644 engine/inc/bullet/Bullet2FileLoader/b3Serializer.h delete mode 100644 engine/inc/bullet/Bullet3Collision/BroadPhaseCollision/b3BroadphaseCallback.h delete mode 100644 engine/inc/bullet/Bullet3Collision/BroadPhaseCollision/b3DynamicBvh.h delete mode 100644 engine/inc/bullet/Bullet3Collision/BroadPhaseCollision/b3DynamicBvhBroadphase.h delete mode 100644 engine/inc/bullet/Bullet3Collision/BroadPhaseCollision/b3OverlappingPair.h delete mode 100644 engine/inc/bullet/Bullet3Collision/BroadPhaseCollision/b3OverlappingPairCache.h delete mode 100644 engine/inc/bullet/Bullet3Collision/BroadPhaseCollision/shared/b3Aabb.h delete mode 100644 engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/b3Config.h delete mode 100644 engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/b3Contact4.h delete mode 100644 engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/b3ConvexUtility.h delete mode 100644 engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/b3CpuNarrowPhase.h delete mode 100644 engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/b3RaycastInfo.h delete mode 100644 engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/b3RigidBodyCL.h delete mode 100644 engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3BvhSubtreeInfoData.h delete mode 100644 engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3BvhTraversal.h delete mode 100644 engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ClipFaces.h delete mode 100644 engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3Collidable.h delete mode 100644 engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3Contact4Data.h delete mode 100644 engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ContactConvexConvexSAT.h delete mode 100644 engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ContactSphereSphere.h delete mode 100644 engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ConvexPolyhedronData.h delete mode 100644 engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3FindConcaveSatAxis.h delete mode 100644 engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3FindSeparatingAxis.h delete mode 100644 engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3MprPenetration.h delete mode 100644 engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3NewContactReduction.h delete mode 100644 engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3QuantizedBvhNodeData.h delete mode 100644 engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ReduceContacts.h delete mode 100644 engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3RigidBodyData.h delete mode 100644 engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3UpdateAabbs.h delete mode 100644 engine/inc/bullet/Bullet3Common/b3AlignedAllocator.h delete mode 100644 engine/inc/bullet/Bullet3Common/b3AlignedObjectArray.h delete mode 100644 engine/inc/bullet/Bullet3Common/b3CommandLineArgs.h delete mode 100644 engine/inc/bullet/Bullet3Common/b3FileUtils.h delete mode 100644 engine/inc/bullet/Bullet3Common/b3HashMap.h delete mode 100644 engine/inc/bullet/Bullet3Common/b3Logging.h delete mode 100644 engine/inc/bullet/Bullet3Common/b3Matrix3x3.h delete mode 100644 engine/inc/bullet/Bullet3Common/b3MinMax.h delete mode 100644 engine/inc/bullet/Bullet3Common/b3PoolAllocator.h delete mode 100644 engine/inc/bullet/Bullet3Common/b3QuadWord.h delete mode 100644 engine/inc/bullet/Bullet3Common/b3Quaternion.h delete mode 100644 engine/inc/bullet/Bullet3Common/b3Random.h delete mode 100644 engine/inc/bullet/Bullet3Common/b3ResizablePool.h delete mode 100644 engine/inc/bullet/Bullet3Common/b3Scalar.h delete mode 100644 engine/inc/bullet/Bullet3Common/b3StackAlloc.h delete mode 100644 engine/inc/bullet/Bullet3Common/b3Transform.h delete mode 100644 engine/inc/bullet/Bullet3Common/b3TransformUtil.h delete mode 100644 engine/inc/bullet/Bullet3Common/b3Vector3.h delete mode 100644 engine/inc/bullet/Bullet3Common/shared/b3Float4.h delete mode 100644 engine/inc/bullet/Bullet3Common/shared/b3Int2.h delete mode 100644 engine/inc/bullet/Bullet3Common/shared/b3Int4.h delete mode 100644 engine/inc/bullet/Bullet3Common/shared/b3Mat3x3.h delete mode 100644 engine/inc/bullet/Bullet3Common/shared/b3PlatformDefinitions.h delete mode 100644 engine/inc/bullet/Bullet3Common/shared/b3Quat.h delete mode 100644 engine/inc/bullet/Bullet3Dynamics/ConstraintSolver/b3ContactSolverInfo.h delete mode 100644 engine/inc/bullet/Bullet3Dynamics/ConstraintSolver/b3FixedConstraint.h delete mode 100644 engine/inc/bullet/Bullet3Dynamics/ConstraintSolver/b3Generic6DofConstraint.h delete mode 100644 engine/inc/bullet/Bullet3Dynamics/ConstraintSolver/b3JacobianEntry.h delete mode 100644 engine/inc/bullet/Bullet3Dynamics/ConstraintSolver/b3PgsJacobiSolver.h delete mode 100644 engine/inc/bullet/Bullet3Dynamics/ConstraintSolver/b3Point2PointConstraint.h delete mode 100644 engine/inc/bullet/Bullet3Dynamics/ConstraintSolver/b3SolverBody.h delete mode 100644 engine/inc/bullet/Bullet3Dynamics/ConstraintSolver/b3SolverConstraint.h delete mode 100644 engine/inc/bullet/Bullet3Dynamics/ConstraintSolver/b3TypedConstraint.h delete mode 100644 engine/inc/bullet/Bullet3Dynamics/b3CpuRigidBodyPipeline.h delete mode 100644 engine/inc/bullet/Bullet3Dynamics/shared/b3ContactConstraint4.h delete mode 100644 engine/inc/bullet/Bullet3Dynamics/shared/b3ConvertConstraint4.h delete mode 100644 engine/inc/bullet/Bullet3Dynamics/shared/b3Inertia.h delete mode 100644 engine/inc/bullet/Bullet3Dynamics/shared/b3IntegrateTransforms.h delete mode 100644 engine/inc/bullet/Bullet3Geometry/b3AabbUtil.h delete mode 100644 engine/inc/bullet/Bullet3Geometry/b3ConvexHullComputer.h delete mode 100644 engine/inc/bullet/Bullet3Geometry/b3GeometryUtil.h delete mode 100644 engine/inc/bullet/Bullet3Geometry/b3GrahamScan2dConvexHull.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuBroadphaseInterface.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuGridBroadphase.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvh.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvhBroadphase.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/BroadphaseCollision/b3SapAabb.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/BroadphaseCollision/kernels/gridBroadphaseKernels.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/BroadphaseCollision/kernels/parallelLinearBvhKernels.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/BroadphaseCollision/kernels/sapKernels.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/Initialize/b3OpenCLInclude.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/Initialize/b3OpenCLUtils.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3BvhInfo.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3ContactCache.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3ConvexHullContact.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3ConvexPolyhedronCL.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3GjkEpa.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3OptimizedBvh.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3QuantizedBvh.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3StridingMeshInterface.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3SupportMappings.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3TriangleCallback.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3TriangleIndexVertexArray.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3VectorFloat4.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3VoronoiSimplexSolver.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/bvhTraversal.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/mprKernels.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/primitiveContacts.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/satClipHullContacts.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/satConcaveKernels.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/satKernels.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/b3BoundSearchCL.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/b3BufferInfoCL.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/b3FillCL.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/b3LauncherCL.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/b3OpenCLArray.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/b3PrefixScanCL.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/b3PrefixScanFloat4CL.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/b3RadixSort32CL.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/BoundSearchKernelsCL.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/CopyKernelsCL.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/FillKernelsCL.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/PrefixScanKernelsCL.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/PrefixScanKernelsFloat4CL.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/RadixSort32KernelsCL.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/Raycast/b3GpuRaycast.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/Raycast/kernels/rayCastKernels.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuConstraint4.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuGenericConstraint.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuJacobiContactSolver.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuNarrowPhase.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuNarrowPhaseInternalData.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuPgsConstraintSolver.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuPgsContactSolver.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipeline.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipelineInternalData.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuSolverBody.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuSolverConstraint.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/RigidBody/b3Solver.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/RigidBody/kernels/batchingKernels.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/RigidBody/kernels/batchingKernelsNew.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/RigidBody/kernels/integrateKernel.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/RigidBody/kernels/jointSolver.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/RigidBody/kernels/solveContact.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/RigidBody/kernels/solveFriction.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/RigidBody/kernels/solverSetup.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/RigidBody/kernels/solverSetup2.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/RigidBody/kernels/solverUtils.h delete mode 100644 engine/inc/bullet/Bullet3OpenCL/RigidBody/kernels/updateAabbsKernel.h delete mode 100644 engine/inc/bullet/BulletCollision/BroadphaseCollision/btAxisSweep3.h delete mode 100644 engine/inc/bullet/BulletCollision/BroadphaseCollision/btAxisSweep3Internal.h delete mode 100644 engine/inc/bullet/BulletCollision/BroadphaseCollision/btBroadphaseInterface.h delete mode 100644 engine/inc/bullet/BulletCollision/BroadphaseCollision/btBroadphaseProxy.h delete mode 100644 engine/inc/bullet/BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h delete mode 100644 engine/inc/bullet/BulletCollision/BroadphaseCollision/btDbvt.h delete mode 100644 engine/inc/bullet/BulletCollision/BroadphaseCollision/btDbvtBroadphase.h delete mode 100644 engine/inc/bullet/BulletCollision/BroadphaseCollision/btDispatcher.h delete mode 100644 engine/inc/bullet/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h delete mode 100644 engine/inc/bullet/BulletCollision/BroadphaseCollision/btOverlappingPairCallback.h delete mode 100644 engine/inc/bullet/BulletCollision/BroadphaseCollision/btQuantizedBvh.h delete mode 100644 engine/inc/bullet/BulletCollision/BroadphaseCollision/btSimpleBroadphase.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionDispatch/SphereTriangleDetector.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionDispatch/btBoxBoxCollisionAlgorithm.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionDispatch/btBoxBoxDetector.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionDispatch/btCollisionConfiguration.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionDispatch/btCollisionCreateFunc.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcher.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcherMt.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionDispatch/btCollisionObject.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionDispatch/btCollisionObjectWrapper.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionDispatch/btCollisionWorld.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionDispatch/btCollisionWorldImporter.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionDispatch/btCompoundCompoundCollisionAlgorithm.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionDispatch/btGhostObject.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionDispatch/btHashedSimplePairCache.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionDispatch/btInternalEdgeUtility.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionDispatch/btManifoldResult.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionDispatch/btSimulationIslandManager.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionDispatch/btUnionFind.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btBox2dShape.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btBoxShape.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btCapsuleShape.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btCollisionMargin.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btCollisionShape.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btCompoundShape.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btConcaveShape.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btConeShape.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btConvex2dShape.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btConvexHullShape.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btConvexInternalShape.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btConvexPointCloudShape.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btConvexPolyhedron.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btConvexShape.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btCylinderShape.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btEmptyShape.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btMaterial.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btMiniSDF.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btMinkowskiSumShape.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btMultiSphereShape.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btMultimaterialTriangleMeshShape.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btOptimizedBvh.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btPolyhedralConvexShape.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btSdfCollisionShape.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btShapeHull.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btSphereShape.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btStaticPlaneShape.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btStridingMeshInterface.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btTetrahedronShape.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btTriangleBuffer.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btTriangleCallback.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btTriangleIndexVertexMaterialArray.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btTriangleInfoMap.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btTriangleMesh.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btTriangleMeshShape.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btTriangleShape.h delete mode 100644 engine/inc/bullet/BulletCollision/CollisionShapes/btUniformScalingShape.h delete mode 100644 engine/inc/bullet/BulletCollision/Gimpact/btBoxCollision.h delete mode 100644 engine/inc/bullet/BulletCollision/Gimpact/btClipPolygon.h delete mode 100644 engine/inc/bullet/BulletCollision/Gimpact/btCompoundFromGimpact.h delete mode 100644 engine/inc/bullet/BulletCollision/Gimpact/btContactProcessing.h delete mode 100644 engine/inc/bullet/BulletCollision/Gimpact/btContactProcessingStructs.h delete mode 100644 engine/inc/bullet/BulletCollision/Gimpact/btGImpactBvh.h delete mode 100644 engine/inc/bullet/BulletCollision/Gimpact/btGImpactBvhStructs.h delete mode 100644 engine/inc/bullet/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.h delete mode 100644 engine/inc/bullet/BulletCollision/Gimpact/btGImpactMassUtil.h delete mode 100644 engine/inc/bullet/BulletCollision/Gimpact/btGImpactQuantizedBvh.h delete mode 100644 engine/inc/bullet/BulletCollision/Gimpact/btGImpactQuantizedBvhStructs.h delete mode 100644 engine/inc/bullet/BulletCollision/Gimpact/btGImpactShape.h delete mode 100644 engine/inc/bullet/BulletCollision/Gimpact/btGenericPoolAllocator.h delete mode 100644 engine/inc/bullet/BulletCollision/Gimpact/btGeometryOperations.h delete mode 100644 engine/inc/bullet/BulletCollision/Gimpact/btQuantization.h delete mode 100644 engine/inc/bullet/BulletCollision/Gimpact/btTriangleShapeEx.h delete mode 100644 engine/inc/bullet/BulletCollision/Gimpact/gim_array.h delete mode 100644 engine/inc/bullet/BulletCollision/Gimpact/gim_basic_geometry_operations.h delete mode 100644 engine/inc/bullet/BulletCollision/Gimpact/gim_bitset.h delete mode 100644 engine/inc/bullet/BulletCollision/Gimpact/gim_box_collision.h delete mode 100644 engine/inc/bullet/BulletCollision/Gimpact/gim_box_set.h delete mode 100644 engine/inc/bullet/BulletCollision/Gimpact/gim_clip_polygon.h delete mode 100644 engine/inc/bullet/BulletCollision/Gimpact/gim_contact.h delete mode 100644 engine/inc/bullet/BulletCollision/Gimpact/gim_geom_types.h delete mode 100644 engine/inc/bullet/BulletCollision/Gimpact/gim_geometry.h delete mode 100644 engine/inc/bullet/BulletCollision/Gimpact/gim_hash_table.h delete mode 100644 engine/inc/bullet/BulletCollision/Gimpact/gim_linear_math.h delete mode 100644 engine/inc/bullet/BulletCollision/Gimpact/gim_math.h delete mode 100644 engine/inc/bullet/BulletCollision/Gimpact/gim_memory.h delete mode 100644 engine/inc/bullet/BulletCollision/Gimpact/gim_pair.h delete mode 100644 engine/inc/bullet/BulletCollision/Gimpact/gim_radixsort.h delete mode 100644 engine/inc/bullet/BulletCollision/Gimpact/gim_tri_collision.h delete mode 100644 engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btComputeGjkEpaPenetration.h delete mode 100644 engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.h delete mode 100644 engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btConvexCast.h delete mode 100644 engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h delete mode 100644 engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h delete mode 100644 engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btGjkCollisionDescription.h delete mode 100644 engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btGjkConvexCast.h delete mode 100644 engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpa2.h delete mode 100644 engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpa3.h delete mode 100644 engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h delete mode 100644 engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h delete mode 100644 engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btManifoldPoint.h delete mode 100644 engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.h delete mode 100644 engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btMprPenetration.h delete mode 100644 engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btPersistentManifold.h delete mode 100644 engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btPointCollector.h delete mode 100644 engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btPolyhedralContactClipping.h delete mode 100644 engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btRaycastCallback.h delete mode 100644 engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btSimplexSolverInterface.h delete mode 100644 engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.h delete mode 100644 engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h delete mode 100644 engine/inc/bullet/BulletCollision/btBulletCollisionCommon.h delete mode 100644 engine/inc/bullet/BulletDynamics/Character/btCharacterControllerInterface.h delete mode 100644 engine/inc/bullet/BulletDynamics/Character/btKinematicCharacterController.h delete mode 100644 engine/inc/bullet/BulletDynamics/ConstraintSolver/btBatchedConstraints.h delete mode 100644 engine/inc/bullet/BulletDynamics/ConstraintSolver/btConeTwistConstraint.h delete mode 100644 engine/inc/bullet/BulletDynamics/ConstraintSolver/btConstraintSolver.h delete mode 100644 engine/inc/bullet/BulletDynamics/ConstraintSolver/btContactConstraint.h delete mode 100644 engine/inc/bullet/BulletDynamics/ConstraintSolver/btContactSolverInfo.h delete mode 100644 engine/inc/bullet/BulletDynamics/ConstraintSolver/btFixedConstraint.h delete mode 100644 engine/inc/bullet/BulletDynamics/ConstraintSolver/btGearConstraint.h delete mode 100644 engine/inc/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h delete mode 100644 engine/inc/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofSpring2Constraint.h delete mode 100644 engine/inc/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.h delete mode 100644 engine/inc/bullet/BulletDynamics/ConstraintSolver/btHinge2Constraint.h delete mode 100644 engine/inc/bullet/BulletDynamics/ConstraintSolver/btHingeConstraint.h delete mode 100644 engine/inc/bullet/BulletDynamics/ConstraintSolver/btJacobianEntry.h delete mode 100644 engine/inc/bullet/BulletDynamics/ConstraintSolver/btNNCGConstraintSolver.h delete mode 100644 engine/inc/bullet/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h delete mode 100644 engine/inc/bullet/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h delete mode 100644 engine/inc/bullet/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolverMt.h delete mode 100644 engine/inc/bullet/BulletDynamics/ConstraintSolver/btSliderConstraint.h delete mode 100644 engine/inc/bullet/BulletDynamics/ConstraintSolver/btSolve2LinearConstraint.h delete mode 100644 engine/inc/bullet/BulletDynamics/ConstraintSolver/btSolverBody.h delete mode 100644 engine/inc/bullet/BulletDynamics/ConstraintSolver/btSolverConstraint.h delete mode 100644 engine/inc/bullet/BulletDynamics/ConstraintSolver/btTypedConstraint.h delete mode 100644 engine/inc/bullet/BulletDynamics/ConstraintSolver/btUniversalConstraint.h delete mode 100644 engine/inc/bullet/BulletDynamics/Dynamics/btActionInterface.h delete mode 100644 engine/inc/bullet/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h delete mode 100644 engine/inc/bullet/BulletDynamics/Dynamics/btDiscreteDynamicsWorldMt.h delete mode 100644 engine/inc/bullet/BulletDynamics/Dynamics/btDynamicsWorld.h delete mode 100644 engine/inc/bullet/BulletDynamics/Dynamics/btRigidBody.h delete mode 100644 engine/inc/bullet/BulletDynamics/Dynamics/btSimpleDynamicsWorld.h delete mode 100644 engine/inc/bullet/BulletDynamics/Dynamics/btSimulationIslandManagerMt.h delete mode 100644 engine/inc/bullet/BulletDynamics/Featherstone/btMultiBody.h delete mode 100644 engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyConstraint.h delete mode 100644 engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyConstraintSolver.h delete mode 100644 engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyDynamicsWorld.h delete mode 100644 engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyFixedConstraint.h delete mode 100644 engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyGearConstraint.h delete mode 100644 engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyInplaceSolverIslandCallback.h delete mode 100644 engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyJointFeedback.h delete mode 100644 engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyJointLimitConstraint.h delete mode 100644 engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyJointMotor.h delete mode 100644 engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyLink.h delete mode 100644 engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyLinkCollider.h delete mode 100644 engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyMLCPConstraintSolver.h delete mode 100644 engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyPoint2Point.h delete mode 100644 engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodySliderConstraint.h delete mode 100644 engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodySolverConstraint.h delete mode 100644 engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodySphericalJointMotor.h delete mode 100644 engine/inc/bullet/BulletDynamics/MLCPSolvers/btDantzigLCP.h delete mode 100644 engine/inc/bullet/BulletDynamics/MLCPSolvers/btDantzigSolver.h delete mode 100644 engine/inc/bullet/BulletDynamics/MLCPSolvers/btLemkeAlgorithm.h delete mode 100644 engine/inc/bullet/BulletDynamics/MLCPSolvers/btLemkeSolver.h delete mode 100644 engine/inc/bullet/BulletDynamics/MLCPSolvers/btMLCPSolver.h delete mode 100644 engine/inc/bullet/BulletDynamics/MLCPSolvers/btMLCPSolverInterface.h delete mode 100644 engine/inc/bullet/BulletDynamics/MLCPSolvers/btPATHSolver.h delete mode 100644 engine/inc/bullet/BulletDynamics/MLCPSolvers/btSolveProjectedGaussSeidel.h delete mode 100644 engine/inc/bullet/BulletDynamics/Vehicle/btRaycastVehicle.h delete mode 100644 engine/inc/bullet/BulletDynamics/Vehicle/btVehicleRaycaster.h delete mode 100644 engine/inc/bullet/BulletDynamics/Vehicle/btWheelInfo.h delete mode 100644 engine/inc/bullet/BulletDynamics/btBulletDynamicsCommon.h delete mode 100644 engine/inc/bullet/BulletFileLoader/autogenerated/bullet.h delete mode 100644 engine/inc/bullet/BulletFileLoader/bChunk.h delete mode 100644 engine/inc/bullet/BulletFileLoader/bCommon.h delete mode 100644 engine/inc/bullet/BulletFileLoader/bDNA.h delete mode 100644 engine/inc/bullet/BulletFileLoader/bDefines.h delete mode 100644 engine/inc/bullet/BulletFileLoader/bFile.h delete mode 100644 engine/inc/bullet/BulletFileLoader/btBulletFile.h delete mode 100644 engine/inc/bullet/BulletInverseDynamics/btBulletCollisionCommon.h delete mode 100644 engine/inc/bullet/BulletRobotics/BoxStack.h delete mode 100644 engine/inc/bullet/BulletRobotics/FixJointBoxes.h delete mode 100644 engine/inc/bullet/BulletRobotics/JointLimit.h delete mode 100644 engine/inc/bullet/BulletSoftBody/DeformableBodyInplaceSolverIslandCallback.h delete mode 100644 engine/inc/bullet/BulletSoftBody/btCGProjection.h delete mode 100644 engine/inc/bullet/BulletSoftBody/btConjugateGradient.h delete mode 100644 engine/inc/bullet/BulletSoftBody/btConjugateResidual.h delete mode 100644 engine/inc/bullet/BulletSoftBody/btDefaultSoftBodySolver.h delete mode 100644 engine/inc/bullet/BulletSoftBody/btDeformableBackwardEulerObjective.h delete mode 100644 engine/inc/bullet/BulletSoftBody/btDeformableBodySolver.h delete mode 100644 engine/inc/bullet/BulletSoftBody/btDeformableContactConstraint.h delete mode 100644 engine/inc/bullet/BulletSoftBody/btDeformableContactProjection.h delete mode 100644 engine/inc/bullet/BulletSoftBody/btDeformableCorotatedForce.h delete mode 100644 engine/inc/bullet/BulletSoftBody/btDeformableGravityForce.h delete mode 100644 engine/inc/bullet/BulletSoftBody/btDeformableLagrangianForce.h delete mode 100644 engine/inc/bullet/BulletSoftBody/btDeformableLinearElasticityForce.h delete mode 100644 engine/inc/bullet/BulletSoftBody/btDeformableMassSpringForce.h delete mode 100644 engine/inc/bullet/BulletSoftBody/btDeformableMousePickingForce.h delete mode 100644 engine/inc/bullet/BulletSoftBody/btDeformableMultiBodyConstraintSolver.h delete mode 100644 engine/inc/bullet/BulletSoftBody/btDeformableMultiBodyDynamicsWorld.h delete mode 100644 engine/inc/bullet/BulletSoftBody/btDeformableNeoHookeanForce.h delete mode 100644 engine/inc/bullet/BulletSoftBody/btKrylovSolver.h delete mode 100644 engine/inc/bullet/BulletSoftBody/btPreconditioner.h delete mode 100644 engine/inc/bullet/BulletSoftBody/btSoftBody.h delete mode 100644 engine/inc/bullet/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.h delete mode 100644 engine/inc/bullet/BulletSoftBody/btSoftBodyData.h delete mode 100644 engine/inc/bullet/BulletSoftBody/btSoftBodyHelpers.h delete mode 100644 engine/inc/bullet/BulletSoftBody/btSoftBodyInternals.h delete mode 100644 engine/inc/bullet/BulletSoftBody/btSoftBodyRigidBodyCollisionConfiguration.h delete mode 100644 engine/inc/bullet/BulletSoftBody/btSoftBodySolverVertexBuffer.h delete mode 100644 engine/inc/bullet/BulletSoftBody/btSoftBodySolvers.h delete mode 100644 engine/inc/bullet/BulletSoftBody/btSoftMultiBodyDynamicsWorld.h delete mode 100644 engine/inc/bullet/BulletSoftBody/btSoftRigidCollisionAlgorithm.h delete mode 100644 engine/inc/bullet/BulletSoftBody/btSoftRigidDynamicsWorld.h delete mode 100644 engine/inc/bullet/BulletSoftBody/btSoftSoftCollisionAlgorithm.h delete mode 100644 engine/inc/bullet/BulletSoftBody/btSparseSDF.h delete mode 100644 engine/inc/bullet/BulletSoftBody/poly34.h delete mode 100644 engine/inc/bullet/BulletWorldImporter/btBulletWorldImporter.h delete mode 100644 engine/inc/bullet/BulletWorldImporter/btMultiBodyWorldImporter.h delete mode 100644 engine/inc/bullet/BulletWorldImporter/btWorldImporter.h delete mode 100644 engine/inc/bullet/BulletXmlWorldImporter/btBulletXmlWorldImporter.h delete mode 100644 engine/inc/bullet/BulletXmlWorldImporter/string_split.h delete mode 100644 engine/inc/bullet/Collision/CollisionSdkC_Api.h delete mode 100644 engine/inc/bullet/Collision/CollisionTutorialBullet2.h delete mode 100644 engine/inc/bullet/Collision/Internal/Bullet2CollisionSdk.h delete mode 100644 engine/inc/bullet/Collision/Internal/CollisionSdkInterface.h delete mode 100644 engine/inc/bullet/Collision/Internal/RealTimeBullet3CollisionSdk.h delete mode 100644 engine/inc/bullet/CommonInterfaces/Common2dCanvasInterface.h delete mode 100644 engine/inc/bullet/CommonInterfaces/CommonCallbacks.h delete mode 100644 engine/inc/bullet/CommonInterfaces/CommonCameraInterface.h delete mode 100644 engine/inc/bullet/CommonInterfaces/CommonDeformableBodyBase.h delete mode 100644 engine/inc/bullet/CommonInterfaces/CommonExampleInterface.h delete mode 100644 engine/inc/bullet/CommonInterfaces/CommonFileIOInterface.h delete mode 100644 engine/inc/bullet/CommonInterfaces/CommonGUIHelperInterface.h delete mode 100644 engine/inc/bullet/CommonInterfaces/CommonGraphicsAppInterface.h delete mode 100644 engine/inc/bullet/CommonInterfaces/CommonMultiBodyBase.h delete mode 100644 engine/inc/bullet/CommonInterfaces/CommonParameterInterface.h delete mode 100644 engine/inc/bullet/CommonInterfaces/CommonRenderInterface.h delete mode 100644 engine/inc/bullet/CommonInterfaces/CommonRigidBodyBase.h delete mode 100644 engine/inc/bullet/CommonInterfaces/CommonWindowInterface.h delete mode 100644 engine/inc/bullet/Constraints/ConstraintDemo.h delete mode 100644 engine/inc/bullet/Constraints/ConstraintPhysicsSetup.h delete mode 100644 engine/inc/bullet/Constraints/Dof6Spring2Setup.h delete mode 100644 engine/inc/bullet/Constraints/TestHingeTorque.h delete mode 100644 engine/inc/bullet/ConvexDecomposition/ConvexBuilder.h delete mode 100644 engine/inc/bullet/ConvexDecomposition/ConvexDecomposition.h delete mode 100644 engine/inc/bullet/ConvexDecomposition/bestfit.h delete mode 100644 engine/inc/bullet/ConvexDecomposition/bestfitobb.h delete mode 100644 engine/inc/bullet/ConvexDecomposition/cd_hull.h delete mode 100644 engine/inc/bullet/ConvexDecomposition/cd_vector.h delete mode 100644 engine/inc/bullet/ConvexDecomposition/cd_wavefront.h delete mode 100644 engine/inc/bullet/ConvexDecomposition/concavity.h delete mode 100644 engine/inc/bullet/ConvexDecomposition/fitsphere.h delete mode 100644 engine/inc/bullet/ConvexDecomposition/float_math.h delete mode 100644 engine/inc/bullet/ConvexDecomposition/meshvolume.h delete mode 100644 engine/inc/bullet/ConvexDecomposition/planetri.h delete mode 100644 engine/inc/bullet/ConvexDecomposition/raytri.h delete mode 100644 engine/inc/bullet/ConvexDecomposition/splitplane.h delete mode 100644 engine/inc/bullet/ConvexDecomposition/vlookup.h delete mode 100644 engine/inc/bullet/DeformableDemo/ClothFriction.h delete mode 100644 engine/inc/bullet/DeformableDemo/Collide.h delete mode 100644 engine/inc/bullet/DeformableDemo/DeformableClothAnchor.h delete mode 100644 engine/inc/bullet/DeformableDemo/DeformableContact.h delete mode 100644 engine/inc/bullet/DeformableDemo/DeformableMultibody.h delete mode 100644 engine/inc/bullet/DeformableDemo/DeformableRigid.h delete mode 100644 engine/inc/bullet/DeformableDemo/DeformableSelfCollision.h delete mode 100644 engine/inc/bullet/DeformableDemo/GraspDeformable.h delete mode 100644 engine/inc/bullet/DeformableDemo/LargeDeformation.h delete mode 100644 engine/inc/bullet/DeformableDemo/MultibodyClothAnchor.h delete mode 100644 engine/inc/bullet/DeformableDemo/Pinch.h delete mode 100644 engine/inc/bullet/DeformableDemo/PinchFriction.h delete mode 100644 engine/inc/bullet/DeformableDemo/SplitImpulse.h delete mode 100644 engine/inc/bullet/DeformableDemo/VolumetricDeformable.h delete mode 100644 engine/inc/bullet/DynamicControlDemo/MotorDemo.h delete mode 100644 engine/inc/bullet/Evolution/NN3DWalkers.h delete mode 100644 engine/inc/bullet/Evolution/NN3DWalkersTimeWarpBase.h delete mode 100644 engine/inc/bullet/ExampleBrowser/CollisionShape2TriangleMesh.h delete mode 100644 engine/inc/bullet/ExampleBrowser/EmptyBrowser.h delete mode 100644 engine/inc/bullet/ExampleBrowser/EmptyExample.h delete mode 100644 engine/inc/bullet/ExampleBrowser/ExampleBrowserInterface.h delete mode 100644 engine/inc/bullet/ExampleBrowser/ExampleEntries.h delete mode 100644 engine/inc/bullet/ExampleBrowser/GL_ShapeDrawer.h delete mode 100644 engine/inc/bullet/ExampleBrowser/GwenGUISupport/GraphingTexture.h delete mode 100644 engine/inc/bullet/ExampleBrowser/GwenGUISupport/GwenParameterInterface.h delete mode 100644 engine/inc/bullet/ExampleBrowser/GwenGUISupport/GwenProfileWindow.h delete mode 100644 engine/inc/bullet/ExampleBrowser/GwenGUISupport/GwenTextureWindow.h delete mode 100644 engine/inc/bullet/ExampleBrowser/GwenGUISupport/gwenInternalData.h delete mode 100644 engine/inc/bullet/ExampleBrowser/GwenGUISupport/gwenUserInterface.h delete mode 100644 engine/inc/bullet/ExampleBrowser/InProcessExampleBrowser.h delete mode 100644 engine/inc/bullet/ExampleBrowser/OpenGLExampleBrowser.h delete mode 100644 engine/inc/bullet/ExampleBrowser/OpenGLGuiHelper.h delete mode 100644 engine/inc/bullet/Experiments/ImplicitCloth/ImplicitClothExample.h delete mode 100644 engine/inc/bullet/Experiments/ImplicitCloth/stan/Cloth.h delete mode 100644 engine/inc/bullet/Experiments/ImplicitCloth/stan/SpringNetwork.h delete mode 100644 engine/inc/bullet/Experiments/ImplicitCloth/stan/array.h delete mode 100644 engine/inc/bullet/Experiments/ImplicitCloth/stan/vec3n.h delete mode 100644 engine/inc/bullet/Experiments/ImplicitCloth/stan/vecmath.h delete mode 100644 engine/inc/bullet/ExtendedTutorials/Bridge.h delete mode 100644 engine/inc/bullet/ExtendedTutorials/Chain.h delete mode 100644 engine/inc/bullet/ExtendedTutorials/CompoundBoxes.h delete mode 100644 engine/inc/bullet/ExtendedTutorials/InclinedPlane.h delete mode 100644 engine/inc/bullet/ExtendedTutorials/MultiPendulum.h delete mode 100644 engine/inc/bullet/ExtendedTutorials/MultipleBoxes.h delete mode 100644 engine/inc/bullet/ExtendedTutorials/NewtonsCradle.h delete mode 100644 engine/inc/bullet/ExtendedTutorials/NewtonsRopeCradle.h delete mode 100644 engine/inc/bullet/ExtendedTutorials/RigidBodyFromObj.h delete mode 100644 engine/inc/bullet/ExtendedTutorials/SimpleBox.h delete mode 100644 engine/inc/bullet/ExtendedTutorials/SimpleCloth.h delete mode 100644 engine/inc/bullet/ExtendedTutorials/SimpleJoint.h delete mode 100644 engine/inc/bullet/ForkLift/ForkLiftDemo.h delete mode 100644 engine/inc/bullet/FractureDemo/FractureDemo.h delete mode 100644 engine/inc/bullet/FractureDemo/btFractureBody.h delete mode 100644 engine/inc/bullet/FractureDemo/btFractureDynamicsWorld.h delete mode 100644 engine/inc/bullet/GIMPACTUtils/btGImpactConvexDecompositionShape.h delete mode 100644 engine/inc/bullet/GyroscopicDemo/GyroscopicSetup.h delete mode 100644 engine/inc/bullet/HACD/hacdCircularList.h delete mode 100644 engine/inc/bullet/HACD/hacdCircularList.inl delete mode 100644 engine/inc/bullet/HACD/hacdGraph.h delete mode 100644 engine/inc/bullet/HACD/hacdHACD.h delete mode 100644 engine/inc/bullet/HACD/hacdICHull.h delete mode 100644 engine/inc/bullet/HACD/hacdManifoldMesh.h delete mode 100644 engine/inc/bullet/HACD/hacdVector.h delete mode 100644 engine/inc/bullet/HACD/hacdVector.inl delete mode 100644 engine/inc/bullet/HACD/hacdVersion.h delete mode 100644 engine/inc/bullet/Heightfield/HeightfieldExample.h delete mode 100644 engine/inc/bullet/Importers/ImportBsp/BspConverter.h delete mode 100644 engine/inc/bullet/Importers/ImportBsp/BspLoader.h delete mode 100644 engine/inc/bullet/Importers/ImportBsp/ImportBspExample.h delete mode 100644 engine/inc/bullet/Importers/ImportBullet/SerializeSetup.h delete mode 100644 engine/inc/bullet/Importers/ImportColladaDemo/ColladaGraphicsInstance.h delete mode 100644 engine/inc/bullet/Importers/ImportColladaDemo/ImportColladaSetup.h delete mode 100644 engine/inc/bullet/Importers/ImportColladaDemo/LoadMeshFromCollada.h delete mode 100644 engine/inc/bullet/Importers/ImportColladaDemo/btMatrix4x4.h delete mode 100644 engine/inc/bullet/Importers/ImportMJCFDemo/BulletMJCFImporter.h delete mode 100644 engine/inc/bullet/Importers/ImportMJCFDemo/ImportMJCFSetup.h delete mode 100644 engine/inc/bullet/Importers/ImportMeshUtility/b3ImportMeshUtility.h delete mode 100644 engine/inc/bullet/Importers/ImportObjDemo/ImportObjExample.h delete mode 100644 engine/inc/bullet/Importers/ImportObjDemo/LoadMeshFromObj.h delete mode 100644 engine/inc/bullet/Importers/ImportObjDemo/Wavefront2GLInstanceGraphicsShape.h delete mode 100644 engine/inc/bullet/Importers/ImportSDFDemo/ImportSDFSetup.h delete mode 100644 engine/inc/bullet/Importers/ImportSTLDemo/ImportSTLSetup.h delete mode 100644 engine/inc/bullet/Importers/ImportSTLDemo/LoadMeshFromSTL.h delete mode 100644 engine/inc/bullet/Importers/ImportURDFDemo/BulletUrdfImporter.h delete mode 100644 engine/inc/bullet/Importers/ImportURDFDemo/ConvertRigidBodies2MultiBody.h delete mode 100644 engine/inc/bullet/Importers/ImportURDFDemo/ImportURDFSetup.h delete mode 100644 engine/inc/bullet/Importers/ImportURDFDemo/MultiBodyCreationInterface.h delete mode 100644 engine/inc/bullet/Importers/ImportURDFDemo/MyMultiBodyCreator.h delete mode 100644 engine/inc/bullet/Importers/ImportURDFDemo/SDFAudioTypes.h delete mode 100644 engine/inc/bullet/Importers/ImportURDFDemo/URDF2Bullet.h delete mode 100644 engine/inc/bullet/Importers/ImportURDFDemo/URDFImporterInterface.h delete mode 100644 engine/inc/bullet/Importers/ImportURDFDemo/URDFJointTypes.h delete mode 100644 engine/inc/bullet/Importers/ImportURDFDemo/UrdfFindMeshFile.h delete mode 100644 engine/inc/bullet/Importers/ImportURDFDemo/UrdfParser.h delete mode 100644 engine/inc/bullet/Importers/ImportURDFDemo/UrdfRenderingInterface.h delete mode 100644 engine/inc/bullet/Importers/ImportURDFDemo/urdfLexicalCast.h delete mode 100644 engine/inc/bullet/Importers/ImportURDFDemo/urdfStringSplit.h delete mode 100644 engine/inc/bullet/Importers/ImportURDFDemo/urdf_samples.h delete mode 100644 engine/inc/bullet/InverseDynamics/BulletInverseDynamicsUtilsCommon.h delete mode 100644 engine/inc/bullet/InverseDynamics/InverseDynamicsExample.h delete mode 100644 engine/inc/bullet/InverseKinematics/InverseKinematicsExample.h delete mode 100644 engine/inc/bullet/LinearMath/TaskScheduler/btThreadSupportInterface.h delete mode 100644 engine/inc/bullet/LinearMath/btAabbUtil2.h delete mode 100644 engine/inc/bullet/LinearMath/btAlignedAllocator.h delete mode 100644 engine/inc/bullet/LinearMath/btAlignedObjectArray.h delete mode 100644 engine/inc/bullet/LinearMath/btConvexHull.h delete mode 100644 engine/inc/bullet/LinearMath/btConvexHullComputer.h delete mode 100644 engine/inc/bullet/LinearMath/btCpuFeatureUtility.h delete mode 100644 engine/inc/bullet/LinearMath/btDefaultMotionState.h delete mode 100644 engine/inc/bullet/LinearMath/btGeometryUtil.h delete mode 100644 engine/inc/bullet/LinearMath/btGrahamScan2dConvexHull.h delete mode 100644 engine/inc/bullet/LinearMath/btHashMap.h delete mode 100644 engine/inc/bullet/LinearMath/btIDebugDraw.h delete mode 100644 engine/inc/bullet/LinearMath/btImplicitQRSVD.h delete mode 100644 engine/inc/bullet/LinearMath/btList.h delete mode 100644 engine/inc/bullet/LinearMath/btMatrix3x3.h delete mode 100644 engine/inc/bullet/LinearMath/btMatrixX.h delete mode 100644 engine/inc/bullet/LinearMath/btMinMax.h delete mode 100644 engine/inc/bullet/LinearMath/btModifiedGramSchmidt.h delete mode 100644 engine/inc/bullet/LinearMath/btMotionState.h delete mode 100644 engine/inc/bullet/LinearMath/btPolarDecomposition.h delete mode 100644 engine/inc/bullet/LinearMath/btPoolAllocator.h delete mode 100644 engine/inc/bullet/LinearMath/btQuadWord.h delete mode 100644 engine/inc/bullet/LinearMath/btQuaternion.h delete mode 100644 engine/inc/bullet/LinearMath/btQuickprof.h delete mode 100644 engine/inc/bullet/LinearMath/btRandom.h delete mode 100644 engine/inc/bullet/LinearMath/btReducedVector.h delete mode 100644 engine/inc/bullet/LinearMath/btScalar.h delete mode 100644 engine/inc/bullet/LinearMath/btSerializer.h delete mode 100644 engine/inc/bullet/LinearMath/btSpatialAlgebra.h delete mode 100644 engine/inc/bullet/LinearMath/btStackAlloc.h delete mode 100644 engine/inc/bullet/LinearMath/btThreads.h delete mode 100644 engine/inc/bullet/LinearMath/btTransform.h delete mode 100644 engine/inc/bullet/LinearMath/btTransformUtil.h delete mode 100644 engine/inc/bullet/LinearMath/btVector3.h delete mode 100644 engine/inc/bullet/LuaDemo/LuaPhysicsSetup.h delete mode 100644 engine/inc/bullet/MultiBody/InvertedPendulumPDControl.h delete mode 100644 engine/inc/bullet/MultiBody/KinematicMultiBodyExample.h delete mode 100644 engine/inc/bullet/MultiBody/MultiBodyConstraintFeedback.h delete mode 100644 engine/inc/bullet/MultiBody/MultiBodySoftContact.h delete mode 100644 engine/inc/bullet/MultiBody/MultiDofDemo.h delete mode 100644 engine/inc/bullet/MultiBody/Pendulum.h delete mode 100644 engine/inc/bullet/MultiBody/SerialChains.h delete mode 100644 engine/inc/bullet/MultiBody/TestJointTorqueSetup.h delete mode 100644 engine/inc/bullet/MultiBody/pendulum_gold.h delete mode 100644 engine/inc/bullet/MultiBodyBaseline/MultiBodyBaseline.h delete mode 100644 engine/inc/bullet/MultiThreadedDemo/CommonRigidBodyMTBase.h delete mode 100644 engine/inc/bullet/MultiThreadedDemo/MultiThreadedDemo.h delete mode 100644 engine/inc/bullet/MultiThreading/MultiThreadingExample.h delete mode 100644 engine/inc/bullet/MultiThreading/b3PosixThreadSupport.h delete mode 100644 engine/inc/bullet/MultiThreading/b3ThreadSupportInterface.h delete mode 100644 engine/inc/bullet/MultiThreading/b3Win32ThreadSupport.h delete mode 100644 engine/inc/bullet/OpenCL/CommonOpenCL/CommonOpenCLBase.h delete mode 100644 engine/inc/bullet/OpenCL/CommonOpenCL/GpuDemoInternalData.h delete mode 100644 engine/inc/bullet/OpenCL/broadphase/PairBench.h delete mode 100644 engine/inc/bullet/OpenCL/broadphase/pairsKernel.h delete mode 100644 engine/inc/bullet/OpenCL/rigidbody/ConcaveScene.h delete mode 100644 engine/inc/bullet/OpenCL/rigidbody/GpuCompoundScene.h delete mode 100644 engine/inc/bullet/OpenCL/rigidbody/GpuConvexScene.h delete mode 100644 engine/inc/bullet/OpenCL/rigidbody/GpuRigidBodyDemo.h delete mode 100644 engine/inc/bullet/OpenCL/rigidbody/GpuRigidBodyDemoInternalData.h delete mode 100644 engine/inc/bullet/OpenCL/rigidbody/GpuSphereScene.h delete mode 100644 engine/inc/bullet/OpenGLWindow/EGLOpenGLWindow.h delete mode 100644 engine/inc/bullet/OpenGLWindow/GLFWOpenGLWindow.h delete mode 100644 engine/inc/bullet/OpenGLWindow/GLInstanceGraphicsShape.h delete mode 100644 engine/inc/bullet/OpenGLWindow/GLInstanceRendererInternalData.h delete mode 100644 engine/inc/bullet/OpenGLWindow/GLInstancingRenderer.h delete mode 100644 engine/inc/bullet/OpenGLWindow/GLPrimInternalData.h delete mode 100644 engine/inc/bullet/OpenGLWindow/GLPrimitiveRenderer.h delete mode 100644 engine/inc/bullet/OpenGLWindow/GLRenderToTexture.h delete mode 100644 engine/inc/bullet/OpenGLWindow/GwenOpenGL3CoreRenderer.h delete mode 100644 engine/inc/bullet/OpenGLWindow/LoadShader.h delete mode 100644 engine/inc/bullet/OpenGLWindow/MacOpenGLWindow.h delete mode 100644 engine/inc/bullet/OpenGLWindow/MacOpenGLWindowObjC.h delete mode 100644 engine/inc/bullet/OpenGLWindow/OpenGL2Include.h delete mode 100644 engine/inc/bullet/OpenGLWindow/OpenGLInclude.h delete mode 100644 engine/inc/bullet/OpenGLWindow/Shaders/createShadowMapInstancingPS.h delete mode 100644 engine/inc/bullet/OpenGLWindow/Shaders/createShadowMapInstancingVS.h delete mode 100644 engine/inc/bullet/OpenGLWindow/Shaders/instancingPS.h delete mode 100644 engine/inc/bullet/OpenGLWindow/Shaders/instancingVS.h delete mode 100644 engine/inc/bullet/OpenGLWindow/Shaders/linesPS.h delete mode 100644 engine/inc/bullet/OpenGLWindow/Shaders/linesVS.h delete mode 100644 engine/inc/bullet/OpenGLWindow/Shaders/pointSpritePS.h delete mode 100644 engine/inc/bullet/OpenGLWindow/Shaders/pointSpriteVS.h delete mode 100644 engine/inc/bullet/OpenGLWindow/Shaders/projectiveTextureInstancingPS.h delete mode 100644 engine/inc/bullet/OpenGLWindow/Shaders/projectiveTextureInstancingVS.h delete mode 100644 engine/inc/bullet/OpenGLWindow/Shaders/segmentationMaskInstancingPS.h delete mode 100644 engine/inc/bullet/OpenGLWindow/Shaders/segmentationMaskInstancingVS.h delete mode 100644 engine/inc/bullet/OpenGLWindow/Shaders/useShadowMapInstancingPS.h delete mode 100644 engine/inc/bullet/OpenGLWindow/Shaders/useShadowMapInstancingVS.h delete mode 100644 engine/inc/bullet/OpenGLWindow/ShapeData.h delete mode 100644 engine/inc/bullet/OpenGLWindow/SimpleCamera.h delete mode 100644 engine/inc/bullet/OpenGLWindow/SimpleOpenGL2App.h delete mode 100644 engine/inc/bullet/OpenGLWindow/SimpleOpenGL2Renderer.h delete mode 100644 engine/inc/bullet/OpenGLWindow/SimpleOpenGL3App.h delete mode 100644 engine/inc/bullet/OpenGLWindow/TwFonts.h delete mode 100644 engine/inc/bullet/OpenGLWindow/Win32InternalWindowData.h delete mode 100644 engine/inc/bullet/OpenGLWindow/Win32OpenGLWindow.h delete mode 100644 engine/inc/bullet/OpenGLWindow/Win32Window.h delete mode 100644 engine/inc/bullet/OpenGLWindow/X11OpenGLWindow.h delete mode 100644 engine/inc/bullet/OpenGLWindow/fontstash.h delete mode 100644 engine/inc/bullet/OpenGLWindow/opengl_fontstashcallbacks.h delete mode 100644 engine/inc/bullet/Planar2D/Planar2D.h delete mode 100644 engine/inc/bullet/Raycast/RaytestDemo.h delete mode 100644 engine/inc/bullet/RenderingExamples/CoordinateSystemDemo.h delete mode 100644 engine/inc/bullet/RenderingExamples/DynamicTexturedCubeDemo.h delete mode 100644 engine/inc/bullet/RenderingExamples/RaytracerSetup.h delete mode 100644 engine/inc/bullet/RenderingExamples/RenderInstancingDemo.h delete mode 100644 engine/inc/bullet/RenderingExamples/TimeSeriesCanvas.h delete mode 100644 engine/inc/bullet/RenderingExamples/TimeSeriesExample.h delete mode 100644 engine/inc/bullet/RenderingExamples/TimeSeriesFontData.h delete mode 100644 engine/inc/bullet/RenderingExamples/TinyRendererSetup.h delete mode 100644 engine/inc/bullet/RenderingExamples/TinyVRGui.h delete mode 100644 engine/inc/bullet/RigidBody/KinematicRigidBodyExample.h delete mode 100644 engine/inc/bullet/RigidBody/RigidBodySoftContact.h delete mode 100644 engine/inc/bullet/RobotSimulator/MinitaurSetup.h delete mode 100644 engine/inc/bullet/RobotSimulator/MinitaurSimulatorExample.h delete mode 100644 engine/inc/bullet/RobotSimulator/b3RobotSimulatorClientAPI.h delete mode 100644 engine/inc/bullet/RoboticsLearning/GripperGraspExample.h delete mode 100644 engine/inc/bullet/RoboticsLearning/KukaGraspExample.h delete mode 100644 engine/inc/bullet/RoboticsLearning/R2D2GraspExample.h delete mode 100644 engine/inc/bullet/RollingFrictionDemo/RollingFrictionDemo.h delete mode 100644 engine/inc/bullet/SharedMemory/BodyJointInfoUtility.h delete mode 100644 engine/inc/bullet/SharedMemory/GraphicsClientExample.h delete mode 100644 engine/inc/bullet/SharedMemory/GraphicsServerExample.h delete mode 100644 engine/inc/bullet/SharedMemory/GraphicsSharedMemoryBlock.h delete mode 100644 engine/inc/bullet/SharedMemory/GraphicsSharedMemoryCommands.h delete mode 100644 engine/inc/bullet/SharedMemory/GraphicsSharedMemoryPublic.h delete mode 100644 engine/inc/bullet/SharedMemory/IKTrajectoryHelper.h delete mode 100644 engine/inc/bullet/SharedMemory/InProcessMemory.h delete mode 100644 engine/inc/bullet/SharedMemory/PhysicsClient.h delete mode 100644 engine/inc/bullet/SharedMemory/PhysicsClientC_API.h delete mode 100644 engine/inc/bullet/SharedMemory/PhysicsClientExample.h delete mode 100644 engine/inc/bullet/SharedMemory/PhysicsClientGRPC.h delete mode 100644 engine/inc/bullet/SharedMemory/PhysicsClientGRPC_C_API.h delete mode 100644 engine/inc/bullet/SharedMemory/PhysicsClientSharedMemory.h delete mode 100644 engine/inc/bullet/SharedMemory/PhysicsClientSharedMemory2.h delete mode 100644 engine/inc/bullet/SharedMemory/PhysicsClientSharedMemory2_C_API.h delete mode 100644 engine/inc/bullet/SharedMemory/PhysicsClientSharedMemory_C_API.h delete mode 100644 engine/inc/bullet/SharedMemory/PhysicsClientTCP.h delete mode 100644 engine/inc/bullet/SharedMemory/PhysicsClientTCP_C_API.h delete mode 100644 engine/inc/bullet/SharedMemory/PhysicsClientUDP.h delete mode 100644 engine/inc/bullet/SharedMemory/PhysicsClientUDP_C_API.h delete mode 100644 engine/inc/bullet/SharedMemory/PhysicsCommandProcessorInterface.h delete mode 100644 engine/inc/bullet/SharedMemory/PhysicsDirect.h delete mode 100644 engine/inc/bullet/SharedMemory/PhysicsDirectC_API.h delete mode 100644 engine/inc/bullet/SharedMemory/PhysicsLoopBack.h delete mode 100644 engine/inc/bullet/SharedMemory/PhysicsLoopBackC_API.h delete mode 100644 engine/inc/bullet/SharedMemory/PhysicsServer.h delete mode 100644 engine/inc/bullet/SharedMemory/PhysicsServerCommandProcessor.h delete mode 100644 engine/inc/bullet/SharedMemory/PhysicsServerExample.h delete mode 100644 engine/inc/bullet/SharedMemory/PhysicsServerExampleBullet2.h delete mode 100644 engine/inc/bullet/SharedMemory/PhysicsServerSharedMemory.h delete mode 100644 engine/inc/bullet/SharedMemory/PosixSharedMemory.h delete mode 100644 engine/inc/bullet/SharedMemory/RemoteGUIHelper.h delete mode 100644 engine/inc/bullet/SharedMemory/RemoteGUIHelperTCP.h delete mode 100644 engine/inc/bullet/SharedMemory/RobotControlExample.h delete mode 100644 engine/inc/bullet/SharedMemory/SharedMemoryBlock.h delete mode 100644 engine/inc/bullet/SharedMemory/SharedMemoryCommandProcessor.h delete mode 100644 engine/inc/bullet/SharedMemory/SharedMemoryCommands.h delete mode 100644 engine/inc/bullet/SharedMemory/SharedMemoryCommon.h delete mode 100644 engine/inc/bullet/SharedMemory/SharedMemoryInProcessPhysicsC_API.h delete mode 100644 engine/inc/bullet/SharedMemory/SharedMemoryInterface.h delete mode 100644 engine/inc/bullet/SharedMemory/SharedMemoryPublic.h delete mode 100644 engine/inc/bullet/SharedMemory/SharedMemoryUserData.h delete mode 100644 engine/inc/bullet/SharedMemory/Win32SharedMemory.h delete mode 100644 engine/inc/bullet/SharedMemory/b3PluginManager.h delete mode 100644 engine/inc/bullet/SharedMemory/b3RobotSimulatorClientAPI_InternalData.h delete mode 100644 engine/inc/bullet/SharedMemory/b3RobotSimulatorClientAPI_NoDirect.h delete mode 100644 engine/inc/bullet/SharedMemory/b3RobotSimulatorClientAPI_NoGUI.h delete mode 100644 engine/inc/bullet/SharedMemory/dart/DARTPhysicsC_API.h delete mode 100644 engine/inc/bullet/SharedMemory/dart/DARTPhysicsClient.h delete mode 100644 engine/inc/bullet/SharedMemory/dart/DARTPhysicsServerCommandProcessor.h delete mode 100644 engine/inc/bullet/SharedMemory/grpc/ConvertGRPCBullet.h delete mode 100644 engine/inc/bullet/SharedMemory/mujoco/MuJoCoPhysicsC_API.h delete mode 100644 engine/inc/bullet/SharedMemory/mujoco/MuJoCoPhysicsClient.h delete mode 100644 engine/inc/bullet/SharedMemory/mujoco/MuJoCoPhysicsServerCommandProcessor.h delete mode 100644 engine/inc/bullet/SharedMemory/physx/PhysXC_API.h delete mode 100644 engine/inc/bullet/SharedMemory/physx/PhysXServerCommandProcessor.h delete mode 100644 engine/inc/bullet/SharedMemory/physx/PhysXUrdfImporter.h delete mode 100644 engine/inc/bullet/SharedMemory/physx/PhysXUserData.h delete mode 100644 engine/inc/bullet/SharedMemory/physx/URDF2PhysX.h delete mode 100644 engine/inc/bullet/SharedMemory/plugins/b3PluginAPI.h delete mode 100644 engine/inc/bullet/SharedMemory/plugins/b3PluginCollisionInterface.h delete mode 100644 engine/inc/bullet/SharedMemory/plugins/b3PluginContext.h delete mode 100644 engine/inc/bullet/SharedMemory/plugins/b3PluginFileIOInterface.h delete mode 100644 engine/inc/bullet/SharedMemory/plugins/collisionFilterPlugin/collisionFilterPlugin.h delete mode 100644 engine/inc/bullet/SharedMemory/plugins/eglPlugin/eglRendererPlugin.h delete mode 100644 engine/inc/bullet/SharedMemory/plugins/eglPlugin/eglRendererVisualShapeConverter.h delete mode 100644 engine/inc/bullet/SharedMemory/plugins/fileIOPlugin/fileIOPlugin.h delete mode 100644 engine/inc/bullet/SharedMemory/plugins/fileIOPlugin/zipFileIO.h delete mode 100644 engine/inc/bullet/SharedMemory/plugins/grpcPlugin/grpcPlugin.h delete mode 100644 engine/inc/bullet/SharedMemory/plugins/pdControlPlugin/pdControlPlugin.h delete mode 100644 engine/inc/bullet/SharedMemory/plugins/stablePDPlugin/BulletConversion.h delete mode 100644 engine/inc/bullet/SharedMemory/plugins/stablePDPlugin/KinTree.h delete mode 100644 engine/inc/bullet/SharedMemory/plugins/stablePDPlugin/MathUtil.h delete mode 100644 engine/inc/bullet/SharedMemory/plugins/stablePDPlugin/RBDModel.h delete mode 100644 engine/inc/bullet/SharedMemory/plugins/stablePDPlugin/RBDUtil.h delete mode 100644 engine/inc/bullet/SharedMemory/plugins/stablePDPlugin/Shape.h delete mode 100644 engine/inc/bullet/SharedMemory/plugins/stablePDPlugin/SpAlg.h delete mode 100644 engine/inc/bullet/SharedMemory/plugins/testPlugin/testplugin.h delete mode 100644 engine/inc/bullet/SharedMemory/plugins/tinyRendererPlugin/TinyRendererVisualShapeConverter.h delete mode 100644 engine/inc/bullet/SharedMemory/plugins/tinyRendererPlugin/tinyRendererPlugin.h delete mode 100644 engine/inc/bullet/SharedMemory/plugins/vrSyncPlugin/vrSyncPlugin.h delete mode 100644 engine/inc/bullet/SoftDemo/BunnyMesh.h delete mode 100644 engine/inc/bullet/SoftDemo/SoftDemo.h delete mode 100644 engine/inc/bullet/SoftDemo/TorusMesh.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/BussIK/Jacobian.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/BussIK/LinearR2.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/BussIK/LinearR3.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/BussIK/LinearR4.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/BussIK/MathMisc.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/BussIK/MatrixRmn.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/BussIK/Node.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/BussIK/Spherical.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/BussIK/Tree.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/BussIK/VectorRn.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Cholesky/LDLT.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Cholesky/LLT.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Cholesky/LLT_LAPACKE.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/CholmodSupport/CholmodSupport.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/ArithmeticSequence.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Array.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/ArrayBase.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/ArrayWrapper.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Assign.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/AssignEvaluator.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Assign_MKL.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/BandMatrix.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Block.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/BooleanRedux.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/CommaInitializer.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/ConditionEstimator.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/CoreEvaluators.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/CoreIterators.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/CwiseBinaryOp.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/CwiseNullaryOp.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/CwiseTernaryOp.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/CwiseUnaryOp.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/CwiseUnaryView.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/DenseBase.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/DenseCoeffsBase.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/DenseStorage.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Diagonal.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/DiagonalMatrix.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/DiagonalProduct.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Dot.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/EigenBase.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/ForceAlignedAccess.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Fuzzy.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/GeneralProduct.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/GenericPacketMath.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/GlobalFunctions.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/IO.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/IndexedView.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Inverse.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Map.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/MapBase.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/MathFunctions.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/MathFunctionsImpl.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Matrix.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/MatrixBase.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/NestByValue.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/NoAlias.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/NumTraits.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/PermutationMatrix.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/PlainObjectBase.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Product.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/ProductEvaluators.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Random.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Redux.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Ref.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Replicate.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/ReturnByValue.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Reverse.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Select.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/SelfAdjointView.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/SelfCwiseBinaryOp.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Solve.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/SolveTriangular.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/SolverBase.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/StableNorm.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Stride.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Swap.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Transpose.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Transpositions.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/TriangularMatrix.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/VectorBlock.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/VectorwiseOp.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Visitor.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/arch/AVX/Complex.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/arch/AVX/MathFunctions.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/arch/AVX/PacketMath.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/arch/AVX/TypeCasting.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/arch/AVX512/MathFunctions.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/arch/AVX512/PacketMath.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/arch/AltiVec/Complex.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/arch/AltiVec/MathFunctions.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/arch/AltiVec/PacketMath.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/arch/CUDA/Complex.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/arch/CUDA/Half.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/arch/CUDA/MathFunctions.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/arch/CUDA/PacketMath.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/arch/CUDA/PacketMathHalf.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/arch/CUDA/TypeCasting.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/arch/Default/ConjHelper.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/arch/Default/Settings.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/arch/NEON/Complex.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/arch/NEON/MathFunctions.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/arch/NEON/PacketMath.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/arch/SSE/Complex.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/arch/SSE/MathFunctions.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/arch/SSE/PacketMath.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/arch/SSE/TypeCasting.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/arch/ZVector/Complex.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/arch/ZVector/MathFunctions.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/arch/ZVector/PacketMath.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/functors/AssignmentFunctors.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/functors/BinaryFunctors.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/functors/NullaryFunctors.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/functors/StlFunctors.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/functors/TernaryFunctors.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/functors/UnaryFunctors.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/products/GeneralBlockPanelKernel.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/products/GeneralMatrixMatrix.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/products/GeneralMatrixMatrix_BLAS.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/products/GeneralMatrixVector.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/products/GeneralMatrixVector_BLAS.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/products/Parallelizer.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/products/SelfadjointMatrixMatrix.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/products/SelfadjointMatrixMatrix_BLAS.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/products/SelfadjointMatrixVector.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/products/SelfadjointMatrixVector_BLAS.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/products/SelfadjointProduct.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/products/SelfadjointRank2Update.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/products/TriangularMatrixMatrix.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/products/TriangularMatrixMatrix_BLAS.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/products/TriangularMatrixVector.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/products/TriangularMatrixVector_BLAS.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/products/TriangularSolverMatrix.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/products/TriangularSolverMatrix_BLAS.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/products/TriangularSolverVector.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/util/BlasUtil.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/util/Constants.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/util/DisableStupidWarnings.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/util/ForwardDeclarations.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/util/IndexedViewHelper.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/util/IntegralConstant.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/util/MKL_support.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/util/Macros.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/util/Memory.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/util/Meta.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/util/NonMPL2.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/util/ReenableStupidWarnings.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/util/StaticAssert.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/util/SymbolicIndex.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/util/XprHelper.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Eigenvalues/ComplexEigenSolver.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Eigenvalues/ComplexSchur.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Eigenvalues/ComplexSchur_LAPACKE.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Eigenvalues/EigenSolver.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Eigenvalues/HessenbergDecomposition.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Eigenvalues/RealQZ.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Eigenvalues/RealSchur.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Eigenvalues/RealSchur_LAPACKE.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Eigenvalues/Tridiagonalization.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Geometry/AlignedBox.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Geometry/AngleAxis.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Geometry/EulerAngles.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Geometry/Homogeneous.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Geometry/Hyperplane.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Geometry/OrthoMethods.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Geometry/ParametrizedLine.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Geometry/Quaternion.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Geometry/Rotation2D.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Geometry/RotationBase.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Geometry/Scaling.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Geometry/Transform.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Geometry/Translation.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Geometry/Umeyama.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Geometry/arch/Geometry_SSE.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Householder/BlockHouseholder.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Householder/Householder.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Householder/HouseholderSequence.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/Jacobi/Jacobi.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/LU/Determinant.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/LU/FullPivLU.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/LU/InverseImpl.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/LU/PartialPivLU.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/LU/PartialPivLU_LAPACKE.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/LU/arch/Inverse_SSE.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/MetisSupport/MetisSupport.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/OrderingMethods/Amd.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/OrderingMethods/Eigen_Colamd.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/OrderingMethods/Ordering.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/PaStiXSupport/PaStiXSupport.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/PardisoSupport/PardisoSupport.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/QR/ColPivHouseholderQR.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/QR/ColPivHouseholderQR_LAPACKE.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/QR/CompleteOrthogonalDecomposition.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/QR/FullPivHouseholderQR.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/QR/HouseholderQR.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/QR/HouseholderQR_LAPACKE.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SVD/BDCSVD.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SVD/JacobiSVD.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SVD/JacobiSVD_LAPACKE.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SVD/SVDBase.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SVD/UpperBidiagonalization.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseCholesky/SimplicialCholesky.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseCore/AmbiVector.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseCore/CompressedStorage.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseCore/MappedSparseMatrix.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseCore/SparseAssign.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseCore/SparseBlock.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseCore/SparseColEtree.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseCore/SparseCompressedBase.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseCore/SparseCwiseBinaryOp.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseCore/SparseCwiseUnaryOp.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseCore/SparseDenseProduct.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseCore/SparseDiagonalProduct.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseCore/SparseDot.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseCore/SparseFuzzy.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseCore/SparseMap.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseCore/SparseMatrix.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseCore/SparseMatrixBase.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseCore/SparsePermutation.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseCore/SparseProduct.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseCore/SparseRedux.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseCore/SparseRef.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseCore/SparseSelfAdjointView.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseCore/SparseSolverBase.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseCore/SparseSparseProductWithPruning.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseCore/SparseTranspose.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseCore/SparseTriangularView.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseCore/SparseUtil.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseCore/SparseVector.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseCore/SparseView.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseCore/TriangularSolver.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseLU/SparseLU.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseLU/SparseLUImpl.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseLU/SparseLU_Memory.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseLU/SparseLU_Structs.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseLU/SparseLU_Utils.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseLU/SparseLU_column_bmod.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseLU/SparseLU_column_dfs.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseLU/SparseLU_gemm_kernel.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseLU/SparseLU_kernel_bmod.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseLU/SparseLU_panel_bmod.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseLU/SparseLU_panel_dfs.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseLU/SparseLU_pivotL.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseLU/SparseLU_pruneL.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseLU/SparseLU_relax_snode.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SparseQR/SparseQR.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/StlSupport/StdDeque.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/StlSupport/StdList.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/StlSupport/StdVector.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/StlSupport/details.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/SuperLUSupport/SuperLUSupport.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/UmfPackSupport/UmfPackSupport.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/misc/Image.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/misc/Kernel.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/misc/RealSvd2x2.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/misc/blas.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/misc/lapack.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/misc/lapacke.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/misc/lapacke_mangling.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/plugins/ArrayCwiseBinaryOps.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/plugins/ArrayCwiseUnaryOps.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/plugins/BlockMethods.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/plugins/CommonCwiseBinaryOps.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/plugins/CommonCwiseUnaryOps.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/plugins/IndexedViewMethods.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/plugins/MatrixCwiseBinaryOps.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Eigen/src/plugins/MatrixCwiseUnaryOps.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Align.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Anim.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/BaseRender.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Config.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/Base.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/Button.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/Canvas.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/CheckBox.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/ColorControls.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/ColorPicker.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/ComboBox.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/CrossSplitter.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/Dialogs/FileOpen.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/Dialogs/FileSave.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/Dialogs/Query.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/DockBase.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/DockedTabControl.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/Dragger.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/GroupBox.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/HSVColorPicker.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/Highlight.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/HorizontalScrollBar.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/HorizontalSlider.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/ImagePanel.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/Label.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/LabelClickable.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/Layout/Splitter.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/Layout/Table.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/ListBox.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/Menu.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/MenuItem.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/MenuStrip.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/Modal.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/NumericUpDown.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/PanelListPanel.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/ProgressBar.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/Properties.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/Property/BaseProperty.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/Property/ColorSelector.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/Property/Text.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/PropertyTree.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/RadioButton.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/RadioButtonController.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/ResizableControl.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/Resizer.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/RichLabel.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/ScrollBar.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/ScrollBarBar.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/ScrollBarButton.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/ScrollControl.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/Slider.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/SplitterBar.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/StatusBar.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/Symbol.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/TabButton.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/TabControl.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/TabStrip.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/TabTitleBar.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/Text.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/TextBox.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/ToolBar.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/TreeControl.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/TreeNode.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/VerticalScrollBar.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/VerticalSlider.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Controls/WindowControl.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/DragAndDrop.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Events.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Exports.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Font.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Gwen.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Hook.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Input/SDL13.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Input/SFML.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Input/Windows.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/InputHandler.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Macros.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Platform.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Renderers/DirectX9.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Renderers/FontData.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Renderers/GDIPlus.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Renderers/OpenGL.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Renderers/OpenGL_DebugFont.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Renderers/SFML.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Skin.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Skins/Simple.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Skins/TexturedBase.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Skins/Texturing.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Structures.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/TextObject.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Texture.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/ToolTip.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/UnitTest/UnitTest.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Gwen/Utility.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/Wavefront/tiny_obj_loader.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/clsocket/src/ActiveSocket.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/clsocket/src/Host.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/clsocket/src/PassiveSocket.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/clsocket/src/SimpleSocket.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/clsocket/src/StatTimer.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/cpp_base64/include/cpp_base64/base64.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/crossguid/crossguid/guid.hpp delete mode 100644 engine/inc/bullet/ThirdPartyLibs/enet/include/enet/callbacks.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/enet/include/enet/enet.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/enet/include/enet/list.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/enet/include/enet/protocol.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/enet/include/enet/time.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/enet/include/enet/types.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/enet/include/enet/unix.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/enet/include/enet/utility.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/enet/include/enet/win32.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/glad/EGL/eglplatform.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/glad/KHR/khrplatform.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/glad/glad/egl.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/glad/glad/gl.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/glad/glad/glx.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/glad/linmath.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/imgui/imconfig.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/imgui/imgui.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/imgui/imgui_internal.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/imgui/stb_rect_pack.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/imgui/stb_textedit.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/imgui/stb_truetype.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/lua-5.2.3/src/lapi.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/lua-5.2.3/src/lauxlib.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/lua-5.2.3/src/lcode.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/lua-5.2.3/src/lctype.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/lua-5.2.3/src/ldebug.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/lua-5.2.3/src/ldo.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/lua-5.2.3/src/lfunc.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/lua-5.2.3/src/lgc.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/lua-5.2.3/src/llex.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/lua-5.2.3/src/llimits.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/lua-5.2.3/src/lmem.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/lua-5.2.3/src/lobject.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/lua-5.2.3/src/lopcodes.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/lua-5.2.3/src/lparser.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/lua-5.2.3/src/lstate.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/lua-5.2.3/src/lstring.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/lua-5.2.3/src/ltable.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/lua-5.2.3/src/ltm.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/lua-5.2.3/src/lua.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/lua-5.2.3/src/lua.hpp delete mode 100644 engine/inc/bullet/ThirdPartyLibs/lua-5.2.3/src/luaconf.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/lua-5.2.3/src/lualib.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/lua-5.2.3/src/lundump.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/lua-5.2.3/src/lvm.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/lua-5.2.3/src/lzio.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/midi/RtError.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/midi/RtMidi.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/minizip/crypt.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/minizip/ioapi.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/minizip/unzip.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/minizip/zip.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Headers/openvr.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Headers/openvr_capi.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Headers/openvr_driver.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr_capi.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/A/Headers/openvr_driver.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/Current/Headers/openvr.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/Current/Headers/openvr_capi.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/openvr/bin/osx64/OpenVR.framework/Versions/Current/Headers/openvr_driver.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/openvr/headers/openvr.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/openvr/headers/openvr_capi.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/openvr/headers/openvr_driver.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/openvr/samples/shared/Matrices.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/openvr/samples/shared/Vectors.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/openvr/samples/shared/compat.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/openvr/samples/shared/lodepng.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/openvr/samples/shared/pathtools.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/openvr/samples/shared/strtools.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/optionalX11/X11/X.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/optionalX11/X11/XKBlib.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/optionalX11/X11/Xatom.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/optionalX11/X11/Xfuncproto.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/optionalX11/X11/Xfuncs.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/optionalX11/X11/Xlib.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/optionalX11/X11/XlibConf.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/optionalX11/X11/Xlibint.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/optionalX11/X11/Xmd.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/optionalX11/X11/Xosdefs.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/optionalX11/X11/Xproto.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/optionalX11/X11/Xprotostr.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/optionalX11/X11/Xutil.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/optionalX11/X11/cursorfont.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/optionalX11/X11/extensions/XKB.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/optionalX11/X11/extensions/XKBstr.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/optionalX11/X11/extensions/XShm.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/optionalX11/X11/extensions/Xext.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/optionalX11/X11/extensions/extutil.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/optionalX11/X11/extensions/shape.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/optionalX11/X11/extensions/shapeconst.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/optionalX11/X11/extensions/shm.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/optionalX11/X11/keysym.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/optionalX11/X11/keysymdef.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/serial/include/serial/impl/unix.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/serial/include/serial/impl/win.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/serial/include/serial/serial.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/serial/include/serial/v8stdint.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/stb_image/stb_image.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/stb_image/stb_image_write.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/stb_image/stb_truetype.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/tinyxml2/tinyxml2.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/zlib/crc32.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/zlib/deflate.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/zlib/gzguts.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/zlib/inffast.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/zlib/inffixed.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/zlib/inflate.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/zlib/inftrees.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/zlib/trees.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/zlib/zconf.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/zlib/zlib.h delete mode 100644 engine/inc/bullet/ThirdPartyLibs/zlib/zutil.h delete mode 100644 engine/inc/bullet/TinyAudio/RtAudio.h delete mode 100644 engine/inc/bullet/TinyAudio/TinyAudioExample.h delete mode 100644 engine/inc/bullet/TinyAudio/b3ADSR.h delete mode 100644 engine/inc/bullet/TinyAudio/b3AudioListener.h delete mode 100644 engine/inc/bullet/TinyAudio/b3ReadWavFile.h delete mode 100644 engine/inc/bullet/TinyAudio/b3SoundEngine.h delete mode 100644 engine/inc/bullet/TinyAudio/b3SoundSource.h delete mode 100644 engine/inc/bullet/TinyAudio/b3Sound_C_Api.h delete mode 100644 engine/inc/bullet/TinyAudio/b3SwapUtils.h delete mode 100644 engine/inc/bullet/TinyAudio/b3WriteWavFile.h delete mode 100644 engine/inc/bullet/TinyRenderer/TinyRenderer.h delete mode 100644 engine/inc/bullet/TinyRenderer/geometry.h delete mode 100644 engine/inc/bullet/TinyRenderer/model.h delete mode 100644 engine/inc/bullet/TinyRenderer/our_gl.h delete mode 100644 engine/inc/bullet/TinyRenderer/tgaimage.h delete mode 100644 engine/inc/bullet/Tutorial/Dof6ConstraintTutorial.h delete mode 100644 engine/inc/bullet/Tutorial/Tutorial.h delete mode 100644 engine/inc/bullet/Utils/ChromeTraceUtil.h delete mode 100644 engine/inc/bullet/Utils/RobotLoggingUtil.h delete mode 100644 engine/inc/bullet/Utils/b3BulletDefaultFileIO.h delete mode 100644 engine/inc/bullet/Utils/b3Clock.h delete mode 100644 engine/inc/bullet/Utils/b3ERPCFMHelper.hpp delete mode 100644 engine/inc/bullet/Utils/b3Quickprof.h delete mode 100644 engine/inc/bullet/Utils/b3ReferenceFrameHelper.hpp delete mode 100644 engine/inc/bullet/Utils/b3ResourcePath.h delete mode 100644 engine/inc/bullet/Vehicles/Hinge2Vehicle.h delete mode 100644 engine/inc/bullet/VoronoiFracture/VoronoiFractureDemo.h delete mode 100644 engine/inc/bullet/VoronoiFracture/btConvexConvexMprAlgorithm.h delete mode 100644 engine/inc/bullet/btBulletCollisionCommon.h delete mode 100644 engine/inc/bullet/btBulletDynamicsCommon.h delete mode 100644 engine/inc/dreamcast.h delete mode 100644 engine/inc/gltf/json.hpp delete mode 100644 engine/inc/gltf/stb_image.h delete mode 100644 engine/inc/gltf/stb_image_write.h delete mode 100644 engine/inc/gltf/tiny_gltf.h create mode 100644 engine/inc/json/allocator.h create mode 100644 engine/inc/json/assertions.h create mode 100644 engine/inc/json/autolink.h create mode 100644 engine/inc/json/config.h create mode 100644 engine/inc/json/features.h create mode 100644 engine/inc/json/forwards.h delete mode 100644 engine/inc/json/json-forwards.h create mode 100644 engine/inc/json/reader.h create mode 100644 engine/inc/json/value.h create mode 100644 engine/inc/json/version.h create mode 100644 engine/inc/json/writer.h delete mode 100644 engine/inc/meshoptimizer.h delete mode 100644 engine/inc/nlohmann/fifo_map.hpp delete mode 100644 engine/inc/nlohmann/json.hpp delete mode 100644 engine/inc/openvr-x/openvr_capi.h delete mode 100644 engine/inc/openvr-x/openvr_driver.h rename engine/inc/{openvr-x => }/openvr.h (99%) rename engine/inc/{openvr-x => }/openvr_mingw.h (67%) delete mode 100644 engine/inc/rapidjson/allocators.h delete mode 100644 engine/inc/rapidjson/document.h delete mode 100644 engine/inc/rapidjson/encodedstream.h delete mode 100644 engine/inc/rapidjson/encodings.h delete mode 100644 engine/inc/rapidjson/error/en.h delete mode 100644 engine/inc/rapidjson/error/error.h delete mode 100644 engine/inc/rapidjson/filereadstream.h delete mode 100644 engine/inc/rapidjson/filewritestream.h delete mode 100644 engine/inc/rapidjson/fwd.h delete mode 100644 engine/inc/rapidjson/internal/biginteger.h delete mode 100644 engine/inc/rapidjson/internal/diyfp.h delete mode 100644 engine/inc/rapidjson/internal/dtoa.h delete mode 100644 engine/inc/rapidjson/internal/ieee754.h delete mode 100644 engine/inc/rapidjson/internal/itoa.h delete mode 100644 engine/inc/rapidjson/internal/meta.h delete mode 100644 engine/inc/rapidjson/internal/pow10.h delete mode 100644 engine/inc/rapidjson/internal/regex.h delete mode 100644 engine/inc/rapidjson/internal/stack.h delete mode 100644 engine/inc/rapidjson/internal/strfunc.h delete mode 100644 engine/inc/rapidjson/internal/strtod.h delete mode 100644 engine/inc/rapidjson/internal/swap.h delete mode 100644 engine/inc/rapidjson/istreamwrapper.h delete mode 100644 engine/inc/rapidjson/memorybuffer.h delete mode 100644 engine/inc/rapidjson/memorystream.h delete mode 100644 engine/inc/rapidjson/msinttypes/inttypes.h delete mode 100644 engine/inc/rapidjson/msinttypes/stdint.h delete mode 100644 engine/inc/rapidjson/ostreamwrapper.h delete mode 100644 engine/inc/rapidjson/pointer.h delete mode 100644 engine/inc/rapidjson/prettywriter.h delete mode 100644 engine/inc/rapidjson/rapidjson.h delete mode 100644 engine/inc/rapidjson/reader.h delete mode 100644 engine/inc/rapidjson/schema.h delete mode 100644 engine/inc/rapidjson/stream.h delete mode 100644 engine/inc/rapidjson/stringbuffer.h delete mode 100644 engine/inc/rapidjson/writer.h delete mode 100644 engine/inc/sol/config.hpp delete mode 100644 engine/inc/sol/forward.hpp delete mode 100644 engine/inc/sol/sol.hpp delete mode 100644 engine/inc/spirv_cross/GLSL.std.450.h delete mode 100644 engine/inc/spirv_cross/barrier.hpp delete mode 100644 engine/inc/spirv_cross/external_interface.h delete mode 100644 engine/inc/spirv_cross/image.hpp delete mode 100644 engine/inc/spirv_cross/internal_interface.hpp delete mode 100644 engine/inc/spirv_cross/sampler.hpp delete mode 100644 engine/inc/spirv_cross/spirv.h delete mode 100644 engine/inc/spirv_cross/spirv.hpp delete mode 100644 engine/inc/spirv_cross/spirv_cfg.hpp delete mode 100644 engine/inc/spirv_cross/spirv_common.hpp delete mode 100644 engine/inc/spirv_cross/spirv_cpp.hpp delete mode 100644 engine/inc/spirv_cross/spirv_cross.hpp delete mode 100644 engine/inc/spirv_cross/spirv_cross_c.h delete mode 100644 engine/inc/spirv_cross/spirv_cross_containers.hpp delete mode 100644 engine/inc/spirv_cross/spirv_cross_error_handling.hpp delete mode 100644 engine/inc/spirv_cross/spirv_cross_parsed_ir.hpp delete mode 100644 engine/inc/spirv_cross/spirv_cross_util.hpp delete mode 100644 engine/inc/spirv_cross/spirv_glsl.hpp delete mode 100644 engine/inc/spirv_cross/spirv_hlsl.hpp delete mode 100644 engine/inc/spirv_cross/spirv_msl.hpp delete mode 100644 engine/inc/spirv_cross/spirv_parser.hpp delete mode 100644 engine/inc/spirv_cross/spirv_reflect.hpp delete mode 100644 engine/inc/spirv_cross/thread_group.hpp delete mode 100644 engine/inc/uf/engine/behavior/behavior.h delete mode 100644 engine/inc/uf/engine/behavior/macros.inl delete mode 100644 engine/inc/uf/engine/entity/behavior.h delete mode 100644 engine/inc/uf/engine/instantiator/instantiator.h delete mode 100644 engine/inc/uf/engine/instantiator/instantiator.inl delete mode 100644 engine/inc/uf/engine/instantiator/macros.inl delete mode 100644 engine/inc/uf/engine/object/behavior.h delete mode 100644 engine/inc/uf/engine/object/behaviors/gltf.h delete mode 100644 engine/inc/uf/engine/object/behaviors/loading.h delete mode 100644 engine/inc/uf/engine/object/behaviors/lua.h delete mode 100644 engine/inc/uf/engine/object/behaviors/render.h delete mode 100644 engine/inc/uf/engine/object/object.h delete mode 100644 engine/inc/uf/engine/object/object.inl delete mode 100644 engine/inc/uf/engine/scene/behavior.h delete mode 100644 engine/inc/uf/engine/scene/scene.h create mode 100644 engine/inc/uf/ext/assimp/assimp.h delete mode 100644 engine/inc/uf/ext/bullet/bullet.h delete mode 100644 engine/inc/uf/ext/bullet/bullet.inl delete mode 100644 engine/inc/uf/ext/gltf/gltf.h delete mode 100644 engine/inc/uf/ext/gltf/graph.h delete mode 100644 engine/inc/uf/ext/gltf/mesh.h delete mode 100644 engine/inc/uf/ext/json/json.h delete mode 100644 engine/inc/uf/ext/json/json.inl delete mode 100644 engine/inc/uf/ext/json/jsoncpp.h delete mode 100644 engine/inc/uf/ext/json/lua.h delete mode 100644 engine/inc/uf/ext/json/nlohmann.h delete mode 100644 engine/inc/uf/ext/json/rapidjson.h delete mode 100644 engine/inc/uf/ext/lua/lua.h delete mode 100644 engine/inc/uf/ext/lua/lua.inl delete mode 100644 engine/inc/uf/ext/opengl/buffer.h delete mode 100644 engine/inc/uf/ext/opengl/device.h delete mode 100644 engine/inc/uf/ext/opengl/enums.h delete mode 100644 engine/inc/uf/ext/opengl/graphic.h delete mode 100644 engine/inc/uf/ext/opengl/graphic.inl delete mode 100644 engine/inc/uf/ext/opengl/initializers.h delete mode 100644 engine/inc/uf/ext/opengl/ogl.h delete mode 100644 engine/inc/uf/ext/opengl/opengl.h delete mode 100644 engine/inc/uf/ext/opengl/rendermode.h delete mode 100644 engine/inc/uf/ext/opengl/rendermodes/base.h delete mode 100644 engine/inc/uf/ext/opengl/rendermodes/compute.h delete mode 100644 engine/inc/uf/ext/opengl/rendermodes/deferred.h delete mode 100644 engine/inc/uf/ext/opengl/rendermodes/rendertarget.h delete mode 100644 engine/inc/uf/ext/opengl/rendertarget.h delete mode 100644 engine/inc/uf/ext/opengl/swapchain.h delete mode 100644 engine/inc/uf/ext/opengl/texture.h delete mode 100644 engine/inc/uf/ext/ultralight/ultralight.h create mode 100644 engine/inc/uf/ext/vulkan.h create mode 100644 engine/inc/uf/ext/vulkan/commands/base.h create mode 100644 engine/inc/uf/ext/vulkan/commands/multiview.h create mode 100644 engine/inc/uf/ext/vulkan/commands/stereo.h delete mode 100644 engine/inc/uf/ext/vulkan/enums.h delete mode 100644 engine/inc/uf/ext/vulkan/graphic.inl create mode 100644 engine/inc/uf/ext/vulkan/graphics/base.h create mode 100644 engine/inc/uf/ext/vulkan/graphics/compute.h create mode 100644 engine/inc/uf/ext/vulkan/graphics/framebuffer.h create mode 100644 engine/inc/uf/ext/vulkan/graphics/gui.h create mode 100644 engine/inc/uf/ext/vulkan/graphics/mesh.h delete mode 100644 engine/inc/uf/ext/vulkan/rendermode.h delete mode 100644 engine/inc/uf/ext/vulkan/rendermodes/base.h delete mode 100644 engine/inc/uf/ext/vulkan/rendermodes/compute.h delete mode 100644 engine/inc/uf/ext/vulkan/rendermodes/deferred.h delete mode 100644 engine/inc/uf/ext/vulkan/rendermodes/rendertarget.h create mode 100644 engine/inc/uf/ext/vulkan/tools.h delete mode 100644 engine/inc/uf/ext/vulkan/vk.h delete mode 100644 engine/inc/uf/macros.h delete mode 100644 engine/inc/uf/simd.h delete mode 100644 engine/inc/uf/spec/context/dreamcast.h delete mode 100644 engine/inc/uf/spec/dreamcast.h delete mode 100644 engine/inc/uf/spec/renderer/opengl.h delete mode 100644 engine/inc/uf/spec/renderer/universal.h delete mode 100644 engine/inc/uf/spec/renderer/vulkan.h delete mode 100644 engine/inc/uf/spec/time/dreamcast.h delete mode 100644 engine/inc/uf/spec/window/dreamcast.h delete mode 100644 engine/inc/uf/utils/graphic/descriptor.h delete mode 100644 engine/inc/uf/utils/graphic/graphic.h delete mode 100644 engine/inc/uf/utils/graphic/mesh.h delete mode 100644 engine/inc/uf/utils/graphic/mesh.inl delete mode 100644 engine/inc/uf/utils/hook/function_traits.inl delete mode 100644 engine/inc/uf/utils/hook/hook.inl delete mode 100644 engine/inc/uf/utils/image/atlas.h delete mode 100644 engine/inc/uf/utils/math/collision/boundingbox.h delete mode 100644 engine/inc/uf/utils/math/collision/gjk.h delete mode 100644 engine/inc/uf/utils/math/collision/mesh.h delete mode 100644 engine/inc/uf/utils/math/collision/modular.h delete mode 100644 engine/inc/uf/utils/math/collision/sphere.h delete mode 100644 engine/inc/uf/utils/math/simd.h delete mode 100644 engine/inc/uf/utils/math/transform/transform.inl delete mode 100644 engine/inc/uf/utils/math/vector/simd.h delete mode 100644 engine/inc/uf/utils/math/vector/simd.inl delete mode 100644 engine/inc/uf/utils/mempool/mempool.h delete mode 100644 engine/inc/uf/utils/mempool/mempool.inl create mode 100644 engine/inc/uf/utils/mesh/mesh.h create mode 100644 engine/inc/uf/utils/mesh/mesh.inl delete mode 100644 engine/inc/uf/utils/renderer/renderer.h delete mode 100644 engine/inc/uf/utils/singletons/pre_main.h delete mode 100644 engine/inc/uf/utils/string/ext.inl delete mode 100644 engine/inc/uf/utils/string/io.h delete mode 100644 engine/inc/uf/utils/thread/perthread.h delete mode 100644 engine/inc/uf/utils/thread/perthread.inl delete mode 100644 engine/inc/uf/utils/type/type.h delete mode 100644 engine/inc/uf/utils/type/type.inl delete mode 100644 engine/inc/uf/utils/userdata/pointered.inl delete mode 100644 engine/src/engine/asset/asset.cpp delete mode 100644 engine/src/engine/asset/masterdata.cpp delete mode 100644 engine/src/engine/behavior/behavior.cpp delete mode 100644 engine/src/engine/entity/behavior.cpp delete mode 100644 engine/src/engine/instantiator/instantiator.cpp delete mode 100644 engine/src/engine/object/behavior.cpp delete mode 100644 engine/src/engine/object/behaviors/gltf.cpp delete mode 100644 engine/src/engine/object/behaviors/loading.cpp delete mode 100644 engine/src/engine/object/behaviors/lua.cpp delete mode 100644 engine/src/engine/object/behaviors/render.cpp delete mode 100644 engine/src/engine/object/object.cpp delete mode 100644 engine/src/engine/scene/behavior.cpp delete mode 100644 engine/src/engine/scene/scene.cpp create mode 100644 engine/src/ext/assimp/assimp.cpp delete mode 100644 engine/src/ext/bullet/bullet.cpp delete mode 100644 engine/src/ext/gltf/gltf.cpp delete mode 100644 engine/src/ext/gltf/graph.cpp delete mode 100644 engine/src/ext/gltf/mesh.cpp delete mode 100644 engine/src/ext/json/json.cpp create mode 100644 engine/src/ext/json/jsoncpp.cpp1 rename engine/src/ext/json/{jsoncpp.cpp => jsoncpp.cpp2} (67%) delete mode 100644 engine/src/ext/lua/lua.cpp delete mode 100644 engine/src/ext/lua/usertypes/asset.cpp delete mode 100644 engine/src/ext/lua/usertypes/audio.cpp delete mode 100644 engine/src/ext/lua/usertypes/camera.cpp delete mode 100644 engine/src/ext/lua/usertypes/matrix.cpp delete mode 100644 engine/src/ext/lua/usertypes/object.cpp delete mode 100644 engine/src/ext/lua/usertypes/quaternion.cpp delete mode 100644 engine/src/ext/lua/usertypes/timer.cpp delete mode 100644 engine/src/ext/lua/usertypes/transform.cpp delete mode 100644 engine/src/ext/lua/usertypes/vector.cpp delete mode 100644 engine/src/ext/opengl/buffer.cpp delete mode 100644 engine/src/ext/opengl/device.cpp delete mode 100644 engine/src/ext/opengl/graphic.cpp delete mode 100644 engine/src/ext/opengl/opengl.cpp delete mode 100644 engine/src/ext/opengl/rendermode.cpp delete mode 100644 engine/src/ext/opengl/rendermodes/base.cpp delete mode 100644 engine/src/ext/opengl/rendermodes/compute.cpp delete mode 100644 engine/src/ext/opengl/rendermodes/deferred.cpp delete mode 100644 engine/src/ext/opengl/rendermodes/rendertarget.cpp delete mode 100644 engine/src/ext/opengl/rendertarget.cpp delete mode 100644 engine/src/ext/opengl/swapchain.cpp delete mode 100644 engine/src/ext/opengl/texture.cpp delete mode 100644 engine/src/ext/ultralight/ultralight.cpp create mode 100644 engine/src/ext/vulkan/commands/base.cpp create mode 100644 engine/src/ext/vulkan/commands/multiview.cpp create mode 100644 engine/src/ext/vulkan/commands/stereo.cpp.x create mode 100644 engine/src/ext/vulkan/graphics/base.cpp create mode 100644 engine/src/ext/vulkan/graphics/compute.cpp create mode 100644 engine/src/ext/vulkan/graphics/framebuffer.cpp create mode 100644 engine/src/ext/vulkan/graphics/gui.cpp create mode 100644 engine/src/ext/vulkan/graphics/mesh.cpp delete mode 100644 engine/src/ext/vulkan/rendermode.cpp delete mode 100644 engine/src/ext/vulkan/rendermodes/base.cpp delete mode 100644 engine/src/ext/vulkan/rendermodes/compute.cpp delete mode 100644 engine/src/ext/vulkan/rendermodes/deferred.cpp delete mode 100644 engine/src/ext/vulkan/rendermodes/rendertarget.cpp delete mode 100644 engine/src/spec/terminal/dreamcast.cpp delete mode 100644 engine/src/spec/time/dreamcast.cpp delete mode 100644 engine/src/spec/window/dreamcast.cpp delete mode 100644 engine/src/utils/image/atlas.cpp delete mode 100644 engine/src/utils/math/collision/boundingbox.cpp delete mode 100644 engine/src/utils/math/collision/gjk.cpp delete mode 100644 engine/src/utils/math/collision/mesh.cpp delete mode 100644 engine/src/utils/math/collision/modular.cpp delete mode 100644 engine/src/utils/math/collision/sphere.cpp delete mode 100644 engine/src/utils/math/simd/simd.cpp delete mode 100644 engine/src/utils/mempool/mempool.cpp rename engine/src/utils/{graphic => mesh}/mesh.cpp (57%) delete mode 100644 engine/src/utils/singletons/pre_main.cpp delete mode 100644 engine/src/utils/string/io.cpp delete mode 100644 engine/src/utils/type/type.cpp delete mode 100644 engine/src/utils/userdata/pointered.cpp create mode 100644 ext/asset/asset.cpp rename {engine/inc/uf/engine => ext}/asset/asset.h (50%) create mode 100644 ext/asset/masterdata.cpp rename {engine/inc/uf/engine => ext}/asset/masterdata.h (75%) delete mode 100644 ext/behaviors/craeture/behavior.cpp delete mode 100644 ext/behaviors/craeture/behavior.h delete mode 100644 ext/behaviors/hands/behavior.cpp delete mode 100644 ext/behaviors/hands/behavior.h delete mode 100644 ext/behaviors/light/behavior.cpp delete mode 100644 ext/behaviors/light/behavior.h delete mode 100644 ext/behaviors/noise/behavior.cpp delete mode 100644 ext/behaviors/noise/behavior.h delete mode 100644 ext/behaviors/player/behavior.cpp delete mode 100644 ext/behaviors/player/behavior.h delete mode 100644 ext/behaviors/player/model/behavior.cpp delete mode 100644 ext/behaviors/player/model/behavior.h delete mode 100644 ext/behaviors/portal/behavior.cpp delete mode 100644 ext/behaviors/portal/behavior.h delete mode 100644 ext/behaviors/scene/behavior.cpp delete mode 100644 ext/behaviors/scene/behavior.h delete mode 100644 ext/behaviors/scene/collision/behavior.cpp delete mode 100644 ext/behaviors/scene/collision/behavior.h delete mode 100644 ext/behaviors/soundemitter/behavior.cpp delete mode 100644 ext/behaviors/soundemitter/behavior.h delete mode 100644 ext/behaviors/sprite/behavior.cpp delete mode 100644 ext/behaviors/sprite/behavior.h rename ext/{scenes/worldscape => }/gui/battle.cpp (77%) rename ext/{scenes/worldscape => }/gui/battle.h (82%) delete mode 100644 ext/gui/behavior.cpp delete mode 100644 ext/gui/behavior.h rename ext/{scenes/worldscape => }/gui/dialogue.cpp (72%) rename ext/{scenes/worldscape => }/gui/dialogue.h (82%) create mode 100644 ext/gui/gui.cpp delete mode 100644 ext/gui/html/behavior.cpp delete mode 100644 ext/gui/html/behavior.h delete mode 100644 ext/gui/manager/behavior.cpp delete mode 100644 ext/gui/manager/behavior.h create mode 100644 ext/gui/menu.cpp create mode 100644 ext/gui/menu.h create mode 100644 ext/mainmenu/menu.cpp create mode 100644 ext/mainmenu/menu.h create mode 100644 ext/object/object.cpp create mode 100644 ext/object/object.h create mode 100644 ext/scene/scene.cpp create mode 100644 ext/scene/scene.h delete mode 100644 ext/scenes/raytrace/behavior.cpp delete mode 100644 ext/scenes/raytrace/behavior.h delete mode 100644 ext/scenes/worldscape/behavior.cpp delete mode 100644 ext/scenes/worldscape/behavior.h delete mode 100644 ext/scenes/worldscape/housamo/housamo.cpp delete mode 100644 ext/scenes/worldscape/terrain/behavior.cpp delete mode 100644 ext/scenes/worldscape/terrain/behavior.h delete mode 100644 ext/scenes/worldscape/terrain/maze.cpp delete mode 100644 ext/scenes/worldscape/terrain/maze.h delete mode 100644 ext/scenes/worldscape/terrain/region.cpp delete mode 100644 ext/scenes/worldscape/terrain/region.h delete mode 100644 ext/scenes/worldscape/terrain/terrain.cpp create mode 100644 ext/world/craeture/craeture.cpp create mode 100644 ext/world/craeture/craeture.h rename ext/{scenes/worldscape => world}/housamo/battle.cpp (50%) rename ext/{scenes/worldscape => world}/housamo/battle.h (70%) rename ext/{scenes/worldscape => world}/housamo/dialogue.cpp (61%) rename ext/{scenes/worldscape => world}/housamo/dialogue.h (69%) create mode 100644 ext/world/housamo/housamo.cpp rename ext/{scenes/worldscape => world}/housamo/housamo.h (71%) create mode 100644 ext/world/housamo/sprite.cpp create mode 100644 ext/world/housamo/sprite.h create mode 100644 ext/world/player/player.cpp create mode 100644 ext/world/player/player.h rename ext/{scenes/worldscape => world}/terrain/generator.cpp (60%) rename ext/{scenes/worldscape => world}/terrain/generator.h (77%) create mode 100644 ext/world/terrain/region.cpp create mode 100644 ext/world/terrain/region.h create mode 100644 ext/world/terrain/terrain.cpp rename ext/{scenes/worldscape => world}/terrain/terrain.h (68%) rename ext/{scenes/worldscape => world}/terrain/voxel.cpp (94%) rename ext/{scenes/worldscape => world}/terrain/voxel.h (95%) create mode 100644 ext/world/world.cpp create mode 100644 ext/world/world.h delete mode 100644 makefiles/dreamcast.gcc.make delete mode 100644 makefiles/win64.clang.make delete mode 100644 makefiles/win64.gcc.make delete mode 100644 makefiles/win64.gcc10.make diff --git a/Makefile b/Makefile index 9faf6d9a..a99c6fb1 100644 --- a/Makefile +++ b/Makefile @@ -1,232 +1,109 @@ -ARCH = win64 -PREFIX = gcc +.PHONY: win64 + TARGET_NAME = program -TARGET_EXTENSION = exe -TARGET_LIB_EXTENSION = dll +BIN_DIR = ./bin -include makefiles/$(ARCH).$(PREFIX).make +ENGINE_SRC_DIR = ./engine/src +ENGINE_INC_DIR = ./engine/inc +ENGINE_LIB_DIR = ./engine/lib - .PHONY: $(ARCH)-$(PREFIX) +EXT_SRC_DIR = ./ext +CLIENT_SRC_DIR = ./client -BIN_DIR += ./bin +UF_LIBS = +# EXT_LIBS = -lpng16 -lz -lsfml-main -lsfml-system -lsfml-window -lsfml-graphics +# EXT_LIBS = -lpng16 -lz -lassimp -lsfml-main -lsfml-system -lsfml-window -lsfml-graphics -llua52 +# EXT_LIBS = -lpng16 -lz -lassimp -ljsoncpp -lopenal32 -lalut -lvorbis -lvorbisfile -logg -lfreetype +EXT_LIBS = +#FLAGS = -std=c++0x -Wall -g -DUF_USE_JSON -DUF_USE_NCURSES -DUF_USE_OPENGL -DUF_USE_GLEW +FLAGS = -Og -std=c++17 -Wall -g -DVK_USE_PLATFORM_WIN32_KHR -DUF_USE_VULKAN -DGLM_ENABLE_EXPERIMENTAL -DUF_USE_JSON -DUF_USE_NCURSES -DUF_USE_OPENAL -DUF_USE_VORBIS -DUF_USE_FREETYPE -DUSE_OPENVR_MINGW +#-march=native +LIB_NAME = uf +EXT_LIB_NAME = ext -ENGINE_SRC_DIR += ./engine/src -ENGINE_INC_DIR += ./engine/inc -ENGINE_LIB_DIR += ./engine/lib -EXT_SRC_DIR += ./ext -CLIENT_SRC_DIR += ./client - -UF_LIBS += -EXT_LIBS += -FLAGS += -Wno-unknown-pragmas -std=c++17 -g -LIB_NAME += uf -EXT_LIB_NAME += ext - -#VULKAN_SDK_PATH += /c/VulkanSDK/1.2.154.0/ -VULKAN_SDK_PATH += /c/VulkanSDK/1.2.162.0/ -GLSL_VALIDATOR += $(VULKAN_SDK_PATH)/Bin32/glslangValidator +#VULKAN_WIN64_SDK_PATH = /cygdrive/c/VulkanSDK/1.1.101.0/ +#VULKAN_WIN64_SDK_PATH = /cygdrive/c/VulkanSDK/1.1.108.0/ +#VULKAN_WIN64_SDK_PATH = /cygdrive/c/VulkanSDK/1.1.114.0/ +VULKAN_WIN64_SDK_PATH = /cygdrive/c/VulkanSDK/1.2.141.0/ +#WIN64_CC = i686-w64-mingw32-g++ +WIN64_CC = x86_64-w64-mingw32-g++ +WIN64_GLSL_VALIDATOR = $(VULKAN_WIN64_SDK_PATH)/Bin32/glslangValidator # Base Engine's DLL -INC_DIR += $(ENGINE_INC_DIR)/$(ARCH)/$(PREFIX) -DEPS += - -ifneq (,$(findstring win64,$(ARCH))) - REQ_DEPS += vulkan json:nlohmann png openal ogg freetype ncurses curl openvr luajit ultralight-ux bullet meshoptimizer # discord - FLAGS += - DEPS += -lgdi32 -else ifneq (,$(findstring dreamcast,$(ARCH))) - REQ_DEPS += opengl json:nlohmann freetype ogg openal meshoptimizer # luajit ultralight-ux ncurses curl openvr discord - FLAGS += $(KOS_CPPFLAGS) -frtti -fexceptions - INCS += $(KOS_INC_PATHS) -I/opt/dreamcast/sh-elf/sh-elf/include - LIBS += $(KOS_LIB_PATHS) -L/opt/dreamcast/sh-elf/sh-elf/lib -endif -ifneq (,$(findstring vulkan,$(REQ_DEPS))) - FLAGS += -DVK_USE_PLATFORM_WIN32_KHR -DUF_USE_VULKAN - DEPS += -lvulkan -lspirv-cross -endif -ifneq (,$(findstring opengl,$(REQ_DEPS))) - FLAGS += -DUF_USE_OPENGL -DUF_USE_GLEW - ifneq (,$(findstring dreamcast,$(ARCH))) - DEPS += -lGLdc - else - DEPS += -lglew32 -lopengl32 -lglu32 - endif -endif -ifneq (,$(findstring json,$(REQ_DEPS))) - FLAGS += -DUF_USE_JSON - DEPS += - ifneq (,$(findstring nlohmann,$(REQ_DEPS))) - FLAGS += -DUF_JSON_USE_NLOHMANN - endif -endif -ifneq (,$(findstring png,$(REQ_DEPS))) - FLAGS += -DUF_USE_PNG - DEPS += -lpng -lz -endif -ifneq (,$(findstring openal,$(REQ_DEPS))) - FLAGS += -DUF_USE_OPENAL - ifneq (,$(findstring dreamcast,$(ARCH))) - DEPS += -lAL - else - FLAGS += -DUF_USE_ALUT - DEPS += -lopenal -lalut - endif -endif -ifneq (,$(findstring ogg,$(REQ_DEPS))) - FLAGS += -DUF_USE_VORBIS - DEPS += -lvorbis -lvorbisfile -logg -endif -ifneq (,$(findstring freetype,$(REQ_DEPS))) - FLAGS += -DUF_USE_FREETYPE - DEPS += -lfreetype -endif -ifneq (,$(findstring ncurses,$(REQ_DEPS))) - FLAGS += -DUF_USE_NCURSES - DEPS += -lncursesw -endif -ifneq (,$(findstring curl,$(REQ_DEPS))) - FLAGS += -DUF_USE_CURL - DEPS += -lcurl -endif -ifneq (,$(findstring discord,$(REQ_DEPS))) - FLAGS += -DUF_USE_DISCORD - DEPS += -ldiscord_game_sdk -endif -ifneq (,$(findstring openvr,$(REQ_DEPS))) - FLAGS += -DUF_USE_OPENVR -DUSE_OPENVR_MINGW - DEPS += -lopenvr_api -endif -ifneq (,$(findstring lua,$(REQ_DEPS))) - FLAGS += -DUF_USE_LUA - ifneq (,$(findstring luajit,$(REQ_DEPS))) - FLAGS += -DUF_USE_LUAJIT - DEPS += -lluajit-5.1 - INCS += -I/mingw64/include/luajit-2.1 - else - DEPS += -llua-5.1 - endif -endif -ifneq (,$(findstring ultralight-ux,$(REQ_DEPS))) - FLAGS += -DUF_USE_ULTRALIGHT_UX - DEPS += -lUltralight -lUltralightCore -lWebCore -lAppCore -endif -ifneq (,$(findstring bullet,$(REQ_DEPS))) - FLAGS += -DUF_USE_BULLET - ifneq (,$(findstring dreamcast,$(ARCH))) - DEPS += -lbulletdynamics -lbulletcollision -lbulletmath - else - DEPS += -lBulletDynamics -lBulletCollision -lLinearMath - INCS += -I$(ENGINE_INC_DIR)/bullet/ - endif -endif -ifneq (,$(findstring simd,$(REQ_DEPS))) - FLAGS += -DUF_USE_SIMD #-march=native - -endif -ifneq (,$(findstring meshoptimizer,$(REQ_DEPS))) - FLAGS += -DUF_USE_MESHOPTIMIZER - DEPS += -lmeshoptimizer -endif - -#DEPS += -lvulkan -lncursesw -LINKS += $(UF_LIBS) $(EXT_LIBS) $(DEPS) +WIN64_INC_DIR = $(ENGINE_INC_DIR)/win64 +WIN64_LB_FLAGS = $(ENGINE_LIB_DIR)/win64 +WIN64_DEPS = -lgdi32 -lvulkan-1 -lpng -lz -lassimp -ljsoncpp -lopenal32 -lalut -lvorbis -lvorbisfile -logg -lfreetype -lncursesw -lcurl -ldiscord_game_sdk -lopenvr_api +#WIN64_DEPS = -lvulkan -lncursesw +WIN64_LINKS = $(UF_LIBS) $(EXT_LIBS) $(WIN64_DEPS) +WIN64_FLAGS = $(FLAGS) -g #-Wl,-subsystem,windows -LIB_DIR += $(ENGINE_LIB_DIR)/$(ARCH) -INCS += -I$(ENGINE_INC_DIR) -I$(INC_DIR) -I$(VULKAN_SDK_PATH)/include -I/mingw64/include -LIBS += -L$(ENGINE_LIB_DIR) -L$(LIB_DIR) -L$(LIB_DIR)/$(PREFIX) -L$(VULKAN_SDK_PATH)/Lib +WIN64_LIB_DIR = $(ENGINE_LIB_DIR)/win64/ +WIN64_INCS = -I$(ENGINE_INC_DIR) -I$(WIN64_INC_DIR) -I$(VULKAN_WIN64_SDK_PATH)/include +WIN64_LIBS = -L$(ENGINE_LIB_DIR) -L$(WIN64_LIB_DIR) -L$(VULKAN_WIN64_SDK_PATH)/Lib -SRCS_DLL += $(wildcard $(ENGINE_SRC_DIR)/*.cpp) $(wildcard $(ENGINE_SRC_DIR)/*/*.cpp) $(wildcard $(ENGINE_SRC_DIR)/*/*/*.cpp) $(wildcard $(ENGINE_SRC_DIR)/*/*/*/*.cpp) $(wildcard $(ENGINE_SRC_DIR)/*/*/*/*/*.cpp) -OBJS_DLL += $(patsubst %.cpp,%.$(ARCH).$(PREFIX).o,$(SRCS_DLL)) -BASE_DLL += lib$(LIB_NAME) -IM_DLL += $(ENGINE_LIB_DIR)/$(ARCH)/$(PREFIX)/$(BASE_DLL).$(TARGET_LIB_EXTENSION).a -EX_DLL += $(BIN_DIR)/exe/lib/$(ARCH)/$(PREFIX)/$(BASE_DLL).$(TARGET_LIB_EXTENSION) +SRCS_WIN64_DLL = $(wildcard $(ENGINE_SRC_DIR)/*.cpp) $(wildcard $(ENGINE_SRC_DIR)/*/*.cpp) $(wildcard $(ENGINE_SRC_DIR)/*/*/*.cpp) $(wildcard $(ENGINE_SRC_DIR)/*/*/*/*.cpp) $(wildcard $(ENGINE_SRC_DIR)/*/*/*/*/*.cpp) +OBJS_WIN64_DLL = $(patsubst %.cpp,%.win64.o,$(SRCS_WIN64_DLL)) +BASE_WIN64_DLL = lib$(LIB_NAME) +IM_WIN64_DLL = $(ENGINE_LIB_DIR)/win64/$(BASE_WIN64_DLL).dll.a +EX_WIN64_DLL = $(BIN_DIR)/lib/win64/$(BASE_WIN64_DLL).dll # External Engine's DLL -EXT_INC_DIR += $(INC_DIR) -EXT_LB_FLAGS += $(LIB_DIR) -EXT_DEPS += -l$(LIB_NAME) $(DEPS) -EXT_LINKS += $(UF_LIBS) $(EXT_LIBS) $(EXT_DEPS) +EXT_WIN64_INC_DIR = $(WIN64_INC_DIR) +EXT_WIN64_LB_FLAGS = $(WIN64_LIB_DIR) +EXT_WIN64_DEPS = -l$(LIB_NAME) $(WIN64_DEPS) +EXT_WIN64_LINKS = $(UF_LIBS) $(EXT_LIBS) $(EXT_WIN64_DEPS) +EXT_WIN64_FLAGS = $(FLAGS) #-Wl,-subsystem,windows -EXT_LIB_DIR += $(ENGINE_LIB_DIR)/$(ARCH) -EXT_INCS += -I$(ENGINE_INC_DIR) -I$(EXT_INC_DIR) -I$(VULKAN_SDK_PATH)/include -I/mingw64/include -EXT_LIBS += -L$(ENGINE_LIB_DIR) -L$(EXT_LIB_DIR) -L$(EXT_LIB_DIR)/$(PREFIX) -L$(VULKAN_SDK_PATH)/Lib -L/mingw64/lib +EXT_WIN64_LIB_DIR = $(ENGINE_LIB_DIR)/win64/ +EXT_WIN64_INCS = -I$(ENGINE_INC_DIR) -I$(EXT_WIN64_INC_DIR) -I$(VULKAN_WIN64_SDK_PATH)/include +EXT_WIN64_LIBS = -L$(ENGINE_LIB_DIR) -L$(EXT_WIN64_LIB_DIR) -L$(VULKAN_WIN64_SDK_PATH)/Lib -SRCS_EXT_DLL += $(wildcard $(EXT_SRC_DIR)/*.cpp) $(wildcard $(EXT_SRC_DIR)/*/*.cpp) $(wildcard $(EXT_SRC_DIR)/*/*/*.cpp) $(wildcard $(EXT_SRC_DIR)/*/*/*/*.cpp) $(wildcard $(EXT_SRC_DIR)/*/*/*/*/*.cpp) -OBJS_EXT_DLL += $(patsubst %.cpp,%.$(ARCH).$(PREFIX).o,$(SRCS_EXT_DLL)) -BASE_EXT_DLL += lib$(EXT_LIB_NAME) -EXT_IM_DLL += $(ENGINE_LIB_DIR)/$(ARCH)/$(PREFIX)/$(BASE_EXT_DLL).$(TARGET_LIB_EXTENSION).a -EXT_EX_DLL += $(BIN_DIR)/exe/lib/$(ARCH)/$(PREFIX)/$(BASE_EXT_DLL).$(TARGET_LIB_EXTENSION) +SRCS_EXT_WIN64_DLL = $(wildcard $(EXT_SRC_DIR)/*.cpp) $(wildcard $(EXT_SRC_DIR)/*/*.cpp) $(wildcard $(EXT_SRC_DIR)/*/*/*.cpp) +OBJS_EXT_WIN64_DLL = $(patsubst %.cpp,%.win64.o,$(SRCS_EXT_WIN64_DLL)) +BASE_EXT_WIN64_DLL = lib$(EXT_LIB_NAME) +EXT_IM_WIN64_DLL = $(ENGINE_LIB_DIR)/win64/$(BASE_EXT_WIN64_DLL).dll.a +EXT_EX_WIN64_DLL = $(BIN_DIR)/lib/win64/$(BASE_EXT_WIN64_DLL).dll # Client EXE -SRCS += $(wildcard $(CLIENT_SRC_DIR)/*.cpp) $(wildcard $(CLIENT_SRC_DIR)/*/*.cpp) -OBJS += $(patsubst %.cpp,%.$(ARCH).$(PREFIX).o,$(SRCS)) -TARGET += $(BIN_DIR)/exe/$(TARGET_NAME).$(PREFIX).$(TARGET_EXTENSION) +SRCS_WIN64 = $(wildcard $(CLIENT_SRC_DIR)/*.cpp) $(wildcard $(CLIENT_SRC_DIR)/*/*.cpp) +OBJS_WIN64 = $(patsubst %.cpp,%.win64.o,$(SRCS_WIN64)) +TARGET_WIN64 = $(BIN_DIR)/$(TARGET_NAME).exe # Shaders -SRCS_SHADERS += $(wildcard bin/data/shaders/*.glsl) -TARGET_SHADERS += $(patsubst %.glsl,%.spv,$(SRCS_SHADERS)) +SRCS_SHADERS = $(wildcard bin/data/shaders/*.glsl) +TARGET_SHADERS = $(patsubst %.glsl,%.spv,$(SRCS_SHADERS)) -ifneq (,$(findstring dreamcast,$(ARCH))) -$(ARCH): $(EX_DLL) $(EXT_EX_DLL) $(TARGET) $(TARGET_SHADERS) +win64: $(EX_WIN64_DLL) $(EXT_EX_WIN64_DLL) $(TARGET_WIN64) $(TARGET_SHADERS) -%.$(ARCH).$(PREFIX).o: %.cpp - $(CC) $(FLAGS) $(INCS) -c $< -o $@ +rm-exe64: + -rm $(EX_WIN64_DLL) + -rm $(EXT_EX_WIN64_DLL) + -rm $(TARGET_WIN64) + -rm $(TARGET_SHADERS) -$(EX_DLL): FLAGS += -DUF_EXPORTS -DJSON_DLL_BUILD -$(EX_DLL): $(OBJS_DLL) - $(KOS_AR) cru $@ $^ - $(KOS_RANLIB) $@ - cp $@ $(ENGINE_LIB_DIR)/$(ARCH)/$(PREFIX)/$(BASE_DLL).a +%.win64.o: %.cpp + $(WIN64_CC) $(WIN64_FLAGS) $(WIN64_INCS) -c $< -o $@ -$(EXT_EX_DLL): FLAGS += -DEXT_EXPORTS -DJSON_DLL_BUILD -$(EXT_EX_DLL): $(OBJS_EXT_DLL) - $(KOS_AR) cru $@ $^ - $(KOS_RANLIB) $@ - cp $@ $(ENGINE_LIB_DIR)/$(ARCH)/$(PREFIX)/$(BASE_EXT_DLL).a +$(EX_WIN64_DLL): WIN64_FLAGS += -DUF_EXPORTS +$(EX_WIN64_DLL): $(OBJS_WIN64_DLL) + $(WIN64_CC) -shared -o $(EX_WIN64_DLL) -g -Wl,--out-implib=$(IM_WIN64_DLL) $(OBJS_WIN64_DLL) $(WIN64_LIBS) $(WIN64_INCS) $(WIN64_LINKS) + cp $(ENGINE_LIB_DIR)/win64/$(BASE_WIN64_DLL).dll.a $(ENGINE_LIB_DIR)/win64/$(BASE_WIN64_DLL).a -$(TARGET): $(OBJS) - $(CC) -O2 -fomit-frame-pointer -ml -m4-single-only -ffunction-sections -fdata-sections $(KOS_INC_PATHS) $(INCS) -D_arch_dreamcast -D_arch_sub_pristine -Wall -g -fno-builtin -ml -m4-single-only -Wl,-Ttext=0x8c010000 -Wl,--gc-sections -T/opt/dreamcast/kos/utils/ldscripts/shlelf.xc -nodefaultlibs $(KOS_LIB_PATHS) $(LIBS) -o $(TARGET) $(OBJS) -Wl,--start-group -lkallisti -lc -lm -lgcc -lstdc++ -l$(LIB_NAME) -l$(EXT_LIB_NAME) -Wl,--end-group -else -$(ARCH): $(EX_DLL) $(EXT_EX_DLL) $(TARGET) $(TARGET_SHADERS) +$(EXT_EX_WIN64_DLL): WIN64_FLAGS += -DEXT_EXPORTS +$(EXT_EX_WIN64_DLL): $(OBJS_EXT_WIN64_DLL) + $(WIN64_CC) -shared -o $(EXT_EX_WIN64_DLL) -g -Wl,--out-implib=$(EXT_IM_WIN64_DLL) $(OBJS_EXT_WIN64_DLL) $(EXT_WIN64_LIBS) $(EXT_WIN64_INCS) $(EXT_WIN64_LINKS) + cp $(ENGINE_LIB_DIR)/win64/$(BASE_EXT_WIN64_DLL).dll.a $(ENGINE_LIB_DIR)/win64/$(BASE_EXT_WIN64_DLL).a -%.$(ARCH).$(PREFIX).o: %.cpp - $(CC) $(FLAGS) $(INCS) -c $< -o $@ - -$(EX_DLL): FLAGS += -DUF_EXPORTS -DJSON_DLL_BUILD -$(EX_DLL): $(OBJS_DLL) - $(CC) -shared -o $(EX_DLL) -g -Wl,--out-implib=$(IM_DLL) $(OBJS_DLL) $(LIBS) $(INCS) $(LINKS) - cp $(ENGINE_LIB_DIR)/$(ARCH)/$(PREFIX)/$(BASE_DLL).$(TARGET_LIB_EXTENSION).a $(ENGINE_LIB_DIR)/$(ARCH)/$(PREFIX)/$(BASE_DLL).a - -$(EXT_EX_DLL): FLAGS += -DEXT_EXPORTS -DJSON_DLL_BUILD -$(EXT_EX_DLL): $(OBJS_EXT_DLL) - $(CC) -shared -o $(EXT_EX_DLL) -g -Wl,--out-implib=$(EXT_IM_DLL) $(OBJS_EXT_DLL) $(EXT_LIBS) $(EXT_INCS) $(EXT_LINKS) - cp $(ENGINE_LIB_DIR)/$(ARCH)/$(PREFIX)/$(BASE_EXT_DLL).$(TARGET_LIB_EXTENSION).a $(ENGINE_LIB_DIR)/$(ARCH)/$(PREFIX)/$(BASE_EXT_DLL).a - -$(TARGET): $(OBJS) - $(CC) $(FLAGS) $(OBJS) $(LIBS) $(INCS) $(LINKS) -l$(LIB_NAME) -l$(EXT_LIB_NAME) -o $(TARGET) -endif +$(TARGET_WIN64): $(OBJS_WIN64) + $(WIN64_CC) $(WIN64_FLAGS) $(OBJS_WIN64) $(WIN64_LIBS) $(WIN64_INCS) $(WIN64_LINKS) -l$(LIB_NAME) -l$(EXT_LIB_NAME) -o $(TARGET_WIN64) %.spv: %.glsl - $(GLSL_VALIDATOR) -V $< -o $@ + $(WIN64_GLSL_VALIDATOR) -V $< -o $@ -clean: - @-rm $(EX_DLL) - @-rm $(EXT_EX_DLL) - @-rm $(TARGET) +clean-win64: + @-rm $(EX_WIN64_DLL) + @-rm $(EXT_EX_WIN64_DLL) + @-rm $(TARGET_WIN64) - @-rm -f $(OBJS_DLL) - @-rm -f $(OBJS_EXT_DLL) - @-rm -f $(OBJS) - -clean-uf: - @-rm $(EX_DLL) - @-rm -f $(OBJS_DLL) - -clean-exf: - @-rm $(EXT_EX_DLL) - @-rm -f $(OBJS_EXT_DLL) - -clean-exe: - -rm $(EX_DLL) - -rm $(EXT_EX_DLL) - -rm $(TARGET) - -rm $(TARGET_SHADERS) \ No newline at end of file + @-rm -f $(OBJS_WIN64_DLL) + @-rm -f $(OBJS_EXT_WIN64_DLL) + @-rm -f $(OBJS_WIN64) diff --git a/bin/data/shaders/base.colored.vert.glsl b/bin/data/shaders/base.colored.vert.glsl deleted file mode 100644 index f2d96b4a..00000000 --- a/bin/data/shaders/base.colored.vert.glsl +++ /dev/null @@ -1,44 +0,0 @@ -#version 450 - -layout (constant_id = 0) const uint PASSES = 6; -layout (location = 0) in vec3 inPos; -layout (location = 1) in vec2 inUv; -layout (location = 2) in vec3 inNormal; -layout (location = 3) in vec4 inColor; - -layout( push_constant ) uniform PushBlock { - uint pass; - uint draw; -} PushConstant; - -struct Matrices { - mat4 model; - mat4 view[PASSES]; - mat4 projection[PASSES]; -}; - -layout (binding = 0) uniform UBO { - Matrices matrices; - vec4 color; -} ubo; - -layout (location = 0) out vec2 outUv; -layout (location = 1) out vec4 outColor; -layout (location = 2) out vec3 outNormal; -layout (location = 3) out vec3 outPosition; - -out gl_PerVertex { - vec4 gl_Position; -}; - - -void main() { - outUv = inUv; - outColor = inColor.rgba; - - outPosition = vec3(ubo.matrices.view[PushConstant.pass] * ubo.matrices.model * vec4(inPos.xyz, 1.0)); - outNormal = vec3(ubo.matrices.view[PushConstant.pass] * ubo.matrices.model * vec4(inNormal.xyz, 0.0)); - outNormal = normalize(outNormal); - - gl_Position = ubo.matrices.projection[PushConstant.pass] * ubo.matrices.view[PushConstant.pass] * ubo.matrices.model * vec4(inPos.xyz, 1.0); -} \ No newline at end of file diff --git a/bin/data/shaders/base.dither16.frag.glsl b/bin/data/shaders/base.dither16.frag.glsl new file mode 100644 index 00000000..ec3c7970 --- /dev/null +++ b/bin/data/shaders/base.dither16.frag.glsl @@ -0,0 +1,294 @@ +#version 450 + +layout (binding = 1) uniform sampler2D samplerColor; + +layout (location = 0) in vec2 inUv; +layout (location = 1) in vec3 inPositionEye; +layout (location = 2) in vec3 inNormalEye; +layout (location = 3) in vec4 inColor; +layout (location = 0) out vec4 outFragColor; + +void fog( inout vec3 i ) { + vec3 color = vec3( 0, 0, 0 ); + float inner = 8, outer = 64; + float distance = length(-inPositionEye); + float factor = (distance - inner) / (outer - inner); + factor = clamp( factor, 0.0, 1.0 ); + + i = mix(i.rgb, color, factor); +} + +void phong( inout vec3 i ) { + vec3 Ls = vec3(1.0, 1.0, 1.0); // light specular + vec3 Ld = vec3(0.4, 0.4, 1.0); // light color + vec3 La = vec3(0.1, 0.1, 0.1); + + vec3 Ks = vec3(0.6, 0.6, 0.9); // material specular + vec3 Kd = i; // material diffuse + vec3 Ka = vec3(0.7, 0.7, 0.7); + + float Kexp = 1000.0; + + vec3 dist_light_eye = vec3(0, 0, 0) - inPositionEye; + vec3 dir_light_eye = normalize(dist_light_eye); + float d_dot = max(dot( dir_light_eye, inNormalEye ), 0.0); + + vec3 reflection_eye = reflect( -dir_light_eye, inNormalEye ); + vec3 surface_eye = normalize(-inPositionEye); + float s_dot = max(dot( reflection_eye, surface_eye ), 0.0); + float s_factor = pow( s_dot, Kexp ); + + vec3 Ia = La * Ka; + vec3 Id = Ld * Kd * d_dot; + vec3 Is = Ls * Ks * s_factor; + i = Is + Id + Ia; +} + +const int indexMatrix16x16[256] = int[](0,192, 48,240, 12,204, 60,252, 3,195, 51,243, 15,207, 63,255, + 128, 64,176,112,140, 76,188,124,131, 67,179,115,143, 79,191,127, + 32,224, 16,208, 44,236, 28,220, 35,227, 19,211, 47,239, 31,223, + 160, 96,144, 80,172,108,156, 92,163, 99,147, 83,175,111,159, 95, + 8,200, 56,248, 4,196, 52,244, 11,203, 59,251, 7,199, 55,247, + 136, 72,184,120,132, 68,180,116,139, 75,187,123,135, 71,183,119, + 40,232, 24,216, 36,228, 20,212, 43,235, 27,219, 39,231, 23,215, + 168,104,152, 88,164,100,148, 84,171,107,155, 91,167,103,151, 87, + 2,194, 50,242, 14,206, 62,254, 1,193, 49,241, 13,205, 61,253, + 130, 66,178,114,142, 78,190,126,129, 65,177,113,141, 77,189,125, + 34,226, 18,210, 46,238, 30,222, 33,225, 17,209, 45,237, 29,221, + 162, 98,146, 82,174,110,158, 94,161, 97,145, 81,173,109,157, 93, + 10,202, 58,250, 6,198, 54,246, 9,201, 57,249, 5,197, 53,245, + 138, 74,186,122,134, 70,182,118,137, 73,185,121,133, 69,181,117, + 42,234, 26,218, 38,230, 22,214, 41,233, 25,217, 37,229, 21,213, + 170,106,154, 90,166,102,150, 86,169,105,153, 89,165,101,149, 85); + +float indexValue16x16() { + int x = int(mod(gl_FragCoord.x, 16)); + int y = int(mod(gl_FragCoord.y, 16)); + return indexMatrix16x16[(x + y * 16)] / 256.0; +} +/* +const int paletteSize = 16; +const vec3 palette[paletteSize] = vec3[]( + vec3( 0x00/255.0, 0x00/255.0, 0x18/255.0), + vec3( 0x60/255.0, 0x60/255.0, 0x78/255.0), + vec3( 0x00/255.0, 0x18/255.0, 0x30/255.0), + vec3( 0x18/255.0, 0x18/255.0, 0x30/255.0), + vec3( 0x30/255.0, 0x30/255.0, 0x48/255.0), + vec3( 0x30/255.0, 0x30/255.0, 0x30/255.0), + vec3( 0x18/255.0, 0x18/255.0, 0x48/255.0), + vec3( 0x00/255.0, 0x00/255.0, 0x00/255.0), + vec3( 0x18/255.0, 0x00/255.0, 0x00/255.0), + vec3( 0x48/255.0, 0x48/255.0, 0x60/255.0), + vec3( 0x30/255.0, 0x00/255.0, 0x18/255.0), + vec3( 0x00/255.0, 0x18/255.0, 0x48/255.0), + vec3( 0x90/255.0, 0x90/255.0, 0xa8/255.0), + vec3( 0x48/255.0, 0x18/255.0, 0x30/255.0), + vec3( 0x18/255.0, 0x30/255.0, 0x48/255.0), + vec3( 0x18/255.0, 0x00/255.0, 0x18/255.0) +); +*/ + +const int paletteSize = 40; +const vec3 palette[paletteSize] = vec3[]( + vec3( 0, 0, 0), + vec3( 0, 0, 0.502), + vec3( 0, 0, 0.753), + vec3( 0, 0, 1), + vec3( 0, 1, 0.251), + vec3( 0, 1, 0.50), + vec3( 24.0/360.0, 1, 0.251), + vec3( 24.0/360.0, 1, 0.5), + vec3( 24.0/360.0, 1, 0.625), + vec3( 24.0/360.0, 1, 0.751), + vec3( 30.0/360.0, 1, 0.251), + vec3( 60.0/360.0, 0.333, 0.376), + vec3( 60.0/360.0, 1, 0.251), + vec3( 60.0/360.0, 1, 0.5), + vec3( 60.0/360.0, 1, 0.751), + vec3(120.0/360.0, 1, 0.251), + vec3(120.0/360.0, 1, 0.5), + vec3(120.0/360.0, 1, 0.751), + vec3(150.0/360.0, 1, 0.251), + vec3(150.0/360.0, 1, 0.5), + vec3(150.0/360.0, 1, 0.751), + vec3(180.0/360.0, 1, 0.125), + vec3(180.0/360.0, 1, 0.251), + vec3(180.0/360.0, 1, 0.5), + vec3(180.0/360.0, 1, 0.751), + vec3(210.0/360.0, 1, 0.251), + vec3(210.0/360.0, 1, 0.5), + vec3(210.0/360.0, 1, 0.751), + vec3(240.0/360.0, 1, 0.251), + vec3(240.0/360.0, 1, 0.5), + vec3(240.0/360.0, 1, 0.751), + vec3(270.0/360.0, 1, 0.251), + vec3(270.0/360.0, 1, 0.5), + vec3(270.0/360.0, 1, 0.751), + vec3(300.0/360.0, 1, 0.251), + vec3(300.0/360.0, 1, 0.5), + vec3(300.0/360.0, 1, 0.751), + vec3(330.0/360.0, 1, 0.251), + vec3(330.0/360.0, 1, 0.5), + vec3(330.0/360.0, 1, 0.751) +); + +/* +vec3 hslToRgb(vec3 HSL) { + vec3 RGB; { + float H = HSL.x; + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + RGB = clamp(vec3(R,G,B), 0, 1); + } + float C = (1 - abs(2 * HSL.z - 1)) * HSL.y; + return (RGB - 0.5) * C + HSL.z; +} + +vec3 rgbToHsl(vec3 RGB) { + float Epsilon = 1e-10; + vec3 HCV; { + vec4 P = (RGB.g < RGB.b) ? vec4(RGB.bg, -1.0, 2.0/3.0) : vec4(RGB.gb, 0.0, -1.0/3.0); + vec4 Q = (RGB.r < P.x) ? vec4(P.xyw, RGB.r) : vec4(RGB.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + Epsilon) + Q.z); + HCV = vec3(H, C, Q.x); + } + float L = HCV.z - HCV.y * 0.5; + float S = HCV.y / (1 - abs(L * 2 - 1) + Epsilon); + return vec3(HCV.x, S, L); +} +*/ + +float hueToRgb(float f1, float f2, float hue) { + if (hue < 0.0) + hue += 1.0; + else if (hue > 1.0) + hue -= 1.0; + float res; + if ((6.0 * hue) < 1.0) + res = f1 + (f2 - f1) * 6.0 * hue; + else if ((2.0 * hue) < 1.0) + res = f2; + else if ((3.0 * hue) < 2.0) + res = f1 + (f2 - f1) * ((2.0 / 3.0) - hue) * 6.0; + else + res = f1; + return res; +} + +vec3 hslToRgb(vec3 hsl) { + vec3 rgb; + + if (hsl.y == 0.0) { + rgb = vec3(hsl.z); // Luminance + } else { + float f2; + + if (hsl.z < 0.5) + f2 = hsl.z * (1.0 + hsl.y); + else + f2 = hsl.z + hsl.y - hsl.y * hsl.z; + + float f1 = 2.0 * hsl.z - f2; + + rgb.r = hueToRgb(f1, f2, hsl.x + (1.0/3.0)); + rgb.g = hueToRgb(f1, f2, hsl.x); + rgb.b = hueToRgb(f1, f2, hsl.x - (1.0/3.0)); + } + return rgb; +} + +vec3 rgbToHcv(vec3 rgb) { + float epsilon = 1e-10; + // Based on work by Sam Hocevar and Emil Persson + vec4 p = (rgb.g < rgb.b) ? vec4(rgb.bg, -1.0, 2.0 / 3.0) : vec4(rgb.gb, 0.0, -1.0 / 3.0); + vec4 q = (rgb.r < p.x) ? vec4(p.xyw, rgb.r) : vec4(rgb.r, p.yzx); + float c = q.x - min(q.w, q.y); + float h = abs((q.w - q.y) / (6.0 * c + epsilon) + q.z); + return vec3(h, c, q.x); +} + +vec3 rgbToHsl(vec3 rgb) { + float epsilon = 1e-10; + vec3 hcv = rgbToHcv(rgb); + float l = hcv.z - hcv.y * 0.5; + float s = hcv.y / (1.0 - abs(l * 2.0 - 1.0) + epsilon); + return vec3(hcv.x, s, l); +} + + +float hueDistance(float h1, float h2) { + float diff = abs((h1 - h2)); + return min(abs((1.0 - diff)), diff); +} + +vec3[2] closestColors(float hue) { + vec3 ret[2]; + vec3 closest = vec3(-2, 0, 0); + vec3 secondClosest = vec3(-2, 0, 0); + vec3 temp; + for (int i = 0; i < paletteSize; ++i) { + temp = rgbToHsl(palette[i]); + float tempDistance = hueDistance(temp.x, hue); + if (tempDistance < hueDistance(closest.x, hue)) { + secondClosest = closest; + closest = temp; + } else { + if (tempDistance < hueDistance(secondClosest.x, hue)) { + secondClosest = temp; + } + } + } + ret[0] = closest; + ret[1] = secondClosest; + return ret; +} + +const float lightnessSteps = 8.0; +float lightnessStep(float l) { + /* Quantize the lightness to one of `lightnessSteps` values */ + return floor((0.5 + l * lightnessSteps)) / lightnessSteps; +} + +vec3 dither1(vec3 color) { + vec3 hsl = rgbToHsl(color); + + vec3 cs[2] = closestColors(hsl.x); + vec3 c1 = cs[0]; + vec3 c2 = cs[1]; + float d = indexValue16x16(); + float hueDiff = hueDistance(hsl.x, c1.x) / hueDistance(c2.x, c1.x); + + float l1 = lightnessStep(max((hsl.z - 0.125), 0.0)); + float l2 = lightnessStep(min((hsl.z + 0.124), 1.0)); + float lightnessDiff = (hsl.z - l1) / (l2 - l1); + + vec3 resultColor = (hueDiff < d) ? c1 : c2; + resultColor.z = (lightnessDiff < d) ? l1 : l2; + return hslToRgb(resultColor); +} + +float dither(float color) { + float closestColor = (color < 0.5) ? 0 : 1; + float secondClosestColor = 1 - closestColor; + float d = indexValue16x16(); + float distance = abs(closestColor - color); + return (distance < d) ? closestColor : secondClosestColor; +} + +vec3 dither(vec3 color) { + vec3 hsl = rgbToHsl(color); + + hsl.y = dither(hsl.y); + return hslToRgb(hsl); +} + +void main() { + outFragColor = texture(samplerColor, inUv); + phong(outFragColor.rgb); + fog(outFragColor.rgb); + outFragColor.rgb = mix( outFragColor.rgb, inColor.rgb, inColor.a ); + if ( outFragColor.a < 0.001 ) discard; + outFragColor.rgb = dither(outFragColor.rgb); +} \ No newline at end of file diff --git a/bin/data/shaders/base.dither4.frag.glsl b/bin/data/shaders/base.dither4.frag.glsl new file mode 100644 index 00000000..638f30a1 --- /dev/null +++ b/bin/data/shaders/base.dither4.frag.glsl @@ -0,0 +1,189 @@ +#version 450 + +layout (binding = 1) uniform sampler2D samplerColor; + +layout (location = 0) in vec2 inUv; +layout (location = 1) in vec3 inPositionEye; +layout (location = 2) in vec3 inNormalEye; +layout (location = 3) in vec4 inColor; +layout (location = 0) out vec4 outFragColor; + +void fog( inout vec3 i ) { + vec3 color = vec3( 0, 0, 0 ); + float inner = 8, outer = 64; + float distance = length(-inPositionEye); + float factor = (distance - inner) / (outer - inner); + factor = clamp( factor, 0.0, 1.0 ); + + i = mix(i.rgb, color, factor); +} + +void phong( inout vec3 i ) { + vec3 Ls = vec3(1.0, 1.0, 1.0); // light specular + vec3 Ld = vec3(0.4, 0.4, 1.0); // light color + vec3 La = vec3(0.1, 0.1, 0.1); + + vec3 Ks = vec3(0.6, 0.6, 0.9); // material specular + vec3 Kd = i; // material diffuse + vec3 Ka = vec3(0.7, 0.7, 0.7); + + float Kexp = 1000.0; + + vec3 dist_light_eye = vec3(0, 0, 0) - inPositionEye; + vec3 dir_light_eye = normalize(dist_light_eye); + float d_dot = max(dot( dir_light_eye, inNormalEye ), 0.0); + + vec3 reflection_eye = reflect( -dir_light_eye, inNormalEye ); + vec3 surface_eye = normalize(-inPositionEye); + float s_dot = max(dot( reflection_eye, surface_eye ), 0.0); + float s_factor = pow( s_dot, Kexp ); + + vec3 Ia = La * Ka; + vec3 Id = Ld * Kd * d_dot; + vec3 Is = Ls * Ks * s_factor; + i = Is + Id + Ia; +} + +const int indexMatrix4x4[16] = int[](0, 8, 2, 10, + 12, 4, 14, 6, + 3, 11, 1, 9, + 15, 7, 13, 5); + +float indexValue4x4() { + int x = int(mod(gl_FragCoord.x, 4)); + int y = int(mod(gl_FragCoord.y, 4)); + return indexMatrix4x4[(x + y * 4)] / 16.0; +} + +const int paletteSize = 28; +const vec3 palette[28] = vec3[]( + vec3(0, 0, 0), + vec3(0, 0, 1), + vec3(0, 0, 0.502), + vec3(0, 0, 0.753), + vec3(0, 1, 0.251), + vec3(0, 1, 0.50), + vec3(60.0/360.0, 1, 0.251), + vec3(60.0/360.0, 1, 0.5), + vec3(120.0/360.0, 1, 0.251), + vec3(120.0/360.0, 1, 0.5), + vec3(180.0/360.0, 1, 0.251), + vec3(180.0/360.0, 1, 0.5), + vec3(240.0/360.0, 1, 0.251), + vec3(240.0/360.0, 1, 0.5), + vec3(300.0/360.0, 1, 0.251), + vec3(300.0/360.0, 1, 0.5), + vec3(60.0/360.0, 0.333, 0.376), + vec3(60.0/360.0, 1, 0.751), + vec3(180.0/360.0, 1, 0.125), + vec3(150.0/360.0, 1, 0.5), + vec3(210.0/360.0, 1, 0.5), + vec3(180.0/360.0, 1, 0.751), + vec3(210.0/360.0, 1, 0.251), + vec3(240.0/360.0, 1, 0.751), + vec3(270.0/360.0, 1, 0.5), + vec3(330.0/360.0, 1, 0.5), + vec3(30.0/360.0, 1, 0.251), + vec3(24.0/360.0, 1, 0.625) +); + +vec3 hslToRgb(vec3 HSL) { + vec3 RGB; { + float H = HSL.x; + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + RGB = clamp(vec3(R,G,B), 0, 1); + } + float C = (1 - abs(2 * HSL.z - 1)) * HSL.y; + return (RGB - 0.5) * C + HSL.z; +} + +vec3 rgbToHsl(vec3 RGB) { + float Epsilon = 1e-10; + vec3 HCV; { + vec4 P = (RGB.g < RGB.b) ? vec4(RGB.bg, -1.0, 2.0/3.0) : vec4(RGB.gb, 0.0, -1.0/3.0); + vec4 Q = (RGB.r < P.x) ? vec4(P.xyw, RGB.r) : vec4(RGB.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + Epsilon) + Q.z); + HCV = vec3(H, C, Q.x); + } + float L = HCV.z - HCV.y * 0.5; + float S = HCV.y / (1 - abs(L * 2 - 1) + Epsilon); + return vec3(HCV.x, S, L); +} + +float hueDistance(float h1, float h2) { + float diff = abs((h1 - h2)); + return min(abs((1.0 - diff)), diff); +} + +vec3[2] closestColors(float hue) { + vec3 ret[2]; + vec3 closest = vec3(-2, 0, 0); + vec3 secondClosest = vec3(-2, 0, 0); + vec3 temp; + for (int i = 0; i < paletteSize; ++i) { + temp = palette[i]; + float tempDistance = hueDistance(temp.x, hue); + if (tempDistance < hueDistance(closest.x, hue)) { + secondClosest = closest; + closest = temp; + } else { + if (tempDistance < hueDistance(secondClosest.x, hue)) { + secondClosest = temp; + } + } + } + ret[0] = closest; + ret[1] = secondClosest; + return ret; +} + +const float lightnessSteps = 4.0; +float lightnessStep(float l) { + /* Quantize the lightness to one of `lightnessSteps` values */ + return floor((0.5 + l * lightnessSteps)) / lightnessSteps; +} + +vec3 dither1(vec3 color) { + vec3 hsl = rgbToHsl(color); + + vec3 cs[2] = closestColors(hsl.x); + vec3 c1 = cs[0]; + vec3 c2 = cs[1]; + float d = indexValue4x4(); + float hueDiff = hueDistance(hsl.x, c1.x) / hueDistance(c2.x, c1.x); + + float l1 = lightnessStep(max((hsl.z - 0.125), 0.0)); + float l2 = lightnessStep(min((hsl.z + 0.124), 1.0)); + float lightnessDiff = (hsl.z - l1) / (l2 - l1); + + vec3 resultColor = (hueDiff < d) ? c1 : c2; + //resultColor.z = (lightnessDiff < d) ? l1 : l2; + return hslToRgb(resultColor); +} + +float dither(float color) { + float closestColor = (color < 0.5) ? 0 : 1; + float secondClosestColor = 1 - closestColor; + float d = indexValue4x4(); + float distance = abs(closestColor - color); + return (distance < d) ? closestColor : secondClosestColor; +} + +vec3 dither(vec3 color) { + vec3 hsl = rgbToHsl(color); + + hsl.y = dither(hsl.y); + return hslToRgb(hsl); +} + +void main() { + outFragColor = texture(samplerColor, inUv); + phong(outFragColor.rgb); + fog(outFragColor.rgb); + outFragColor.rgb = mix( outFragColor.rgb, inColor.rgb, inColor.a ); + if ( outFragColor.a < 0.001 ) discard; + outFragColor.rgb = dither(outFragColor.rgb); +} \ No newline at end of file diff --git a/bin/data/shaders/base.dither8.frag.glsl b/bin/data/shaders/base.dither8.frag.glsl new file mode 100644 index 00000000..2fa1d0a3 --- /dev/null +++ b/bin/data/shaders/base.dither8.frag.glsl @@ -0,0 +1,194 @@ +#version 450 + +layout (binding = 1) uniform sampler2D samplerColor; + +layout (location = 0) in vec2 inUv; +layout (location = 1) in vec3 inPositionEye; +layout (location = 2) in vec3 inNormalEye; +layout (location = 3) in vec4 inColor; +layout (location = 0) out vec4 outFragColor; + +void fog( inout vec3 i ) { + vec3 color = vec3( 0, 0, 0 ); + float inner = 8, outer = 64; + float distance = length(-inPositionEye); + float factor = (distance - inner) / (outer - inner); + factor = clamp( factor, 0.0, 1.0 ); + + i = mix(i.rgb, color, factor); +} + +void phong( inout vec3 i ) { + vec3 Ls = vec3(1.0, 1.0, 1.0); // light specular + vec3 Ld = vec3(0.4, 0.4, 1.0); // light color + vec3 La = vec3(0.1, 0.1, 0.1); + + vec3 Ks = vec3(0.6, 0.6, 0.9); // material specular + vec3 Kd = i; // material diffuse + vec3 Ka = vec3(0.7, 0.7, 0.7); + + float Kexp = 1000.0; + + vec3 dist_light_eye = vec3(0, 0, 0) - inPositionEye; + vec3 dir_light_eye = normalize(dist_light_eye); + float d_dot = max(dot( dir_light_eye, inNormalEye ), 0.0); + + vec3 reflection_eye = reflect( -dir_light_eye, inNormalEye ); + vec3 surface_eye = normalize(-inPositionEye); + float s_dot = max(dot( reflection_eye, surface_eye ), 0.0); + float s_factor = pow( s_dot, Kexp ); + + vec3 Ia = La * Ka; + vec3 Id = Ld * Kd * d_dot; + vec3 Is = Ls * Ks * s_factor; + i = Is + Id + Ia; +} + +const int indexMatrix8x8[64] = int[](0, 32, 8, 40, 2, 34, 10, 42, + 48, 16, 56, 24, 50, 18, 58, 26, + 12, 44, 4, 36, 14, 46, 6, 38, + 60, 28, 52, 20, 62, 30, 54, 22, + 3, 35, 11, 43, 1, 33, 9, 41, + 51, 19, 59, 27, 49, 17, 57, 25, + 15, 47, 7, 39, 13, 45, 5, 37, + 63, 31, 55, 23, 61, 29, 53, 21); + +float indexValue8x8() { + int x = int(mod(gl_FragCoord.x, 8)); + int y = int(mod(gl_FragCoord.y, 8)); + return indexMatrix8x8[(x + y * 8)] / 64.0; +} + +const int paletteSize = 28; +const vec3 palette[28] = vec3[]( + vec3(0, 0, 0), + vec3(0, 0, 1), + vec3(0, 0, 0.502), + vec3(0, 0, 0.753), + vec3(0, 1, 0.251), + vec3(0, 1, 0.50), + vec3(60.0/360.0, 1, 0.251), + vec3(60.0/360.0, 1, 0.5), + vec3(120.0/360.0, 1, 0.251), + vec3(120.0/360.0, 1, 0.5), + vec3(180.0/360.0, 1, 0.251), + vec3(180.0/360.0, 1, 0.5), + vec3(240.0/360.0, 1, 0.251), + vec3(240.0/360.0, 1, 0.5), + vec3(300.0/360.0, 1, 0.251), + vec3(300.0/360.0, 1, 0.5), + vec3(60.0/360.0, 0.333, 0.376), + vec3(60.0/360.0, 1, 0.751), + vec3(180.0/360.0, 1, 0.125), + vec3(150.0/360.0, 1, 0.5), + vec3(210.0/360.0, 1, 0.5), + vec3(180.0/360.0, 1, 0.751), + vec3(210.0/360.0, 1, 0.251), + vec3(240.0/360.0, 1, 0.751), + vec3(270.0/360.0, 1, 0.5), + vec3(330.0/360.0, 1, 0.5), + vec3(30.0/360.0, 1, 0.251), + vec3(24.0/360.0, 1, 0.625) +); + +vec3 hslToRgb(vec3 HSL) { + vec3 RGB; { + float H = HSL.x; + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + RGB = clamp(vec3(R,G,B), 0, 1); + } + float C = (1 - abs(2 * HSL.z - 1)) * HSL.y; + return (RGB - 0.5) * C + HSL.z; +} + +vec3 rgbToHsl(vec3 RGB) { + float Epsilon = 1e-10; + vec3 HCV; { + vec4 P = (RGB.g < RGB.b) ? vec4(RGB.bg, -1.0, 2.0/3.0) : vec4(RGB.gb, 0.0, -1.0/3.0); + vec4 Q = (RGB.r < P.x) ? vec4(P.xyw, RGB.r) : vec4(RGB.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + Epsilon) + Q.z); + HCV = vec3(H, C, Q.x); + } + float L = HCV.z - HCV.y * 0.5; + float S = HCV.y / (1 - abs(L * 2 - 1) + Epsilon); + return vec3(HCV.x, S, L); +} + +float hueDistance(float h1, float h2) { + float diff = abs((h1 - h2)); + return min(abs((1.0 - diff)), diff); +} + +vec3[2] closestColors(float hue) { + vec3 ret[2]; + vec3 closest = vec3(-2, 0, 0); + vec3 secondClosest = vec3(-2, 0, 0); + vec3 temp; + for (int i = 0; i < paletteSize; ++i) { + temp = palette[i]; + float tempDistance = hueDistance(temp.x, hue); + if (tempDistance < hueDistance(closest.x, hue)) { + secondClosest = closest; + closest = temp; + } else { + if (tempDistance < hueDistance(secondClosest.x, hue)) { + secondClosest = temp; + } + } + } + ret[0] = closest; + ret[1] = secondClosest; + return ret; +} + +const float lightnessSteps = 4.0; +float lightnessStep(float l) { + /* Quantize the lightness to one of `lightnessSteps` values */ + return floor((0.5 + l * lightnessSteps)) / lightnessSteps; +} + +vec3 dither1(vec3 color) { + vec3 hsl = rgbToHsl(color); + + vec3 cs[2] = closestColors(hsl.x); + vec3 c1 = cs[0]; + vec3 c2 = cs[1]; + float d = indexValue8x8(); + float hueDiff = hueDistance(hsl.x, c1.x) / hueDistance(c2.x, c1.x); + + float l1 = lightnessStep(max((hsl.z - 0.125), 0.0)); + float l2 = lightnessStep(min((hsl.z + 0.124), 1.0)); + float lightnessDiff = (hsl.z - l1) / (l2 - l1); + + vec3 resultColor = (hueDiff < d) ? c1 : c2; + //resultColor.z = (lightnessDiff < d) ? l1 : l2; + return hslToRgb(resultColor); +} + +float dither(float color) { + float closestColor = (color < 0.5) ? 0 : 1; + float secondClosestColor = 1 - closestColor; + float d = indexValue8x8(); + float distance = abs(closestColor - color); + return (distance < d) ? closestColor : secondClosestColor; +} + +vec3 dither(vec3 color) { + vec3 hsl = rgbToHsl(color); + + hsl.y = dither(hsl.y); + return hslToRgb(hsl); +} + + +void main() { + outFragColor = texture(samplerColor, inUv); + phong(outFragColor.rgb); + fog(outFragColor.rgb); + outFragColor.rgb = mix( outFragColor.rgb, inColor.rgb, inColor.a ); + if ( outFragColor.a < 0.001 ) discard; + outFragColor.rgb = dither(outFragColor.rgb); +} \ No newline at end of file diff --git a/bin/data/shaders/base.frag.glsl b/bin/data/shaders/base.frag.glsl index 177d0217..8af2ca3a 100644 --- a/bin/data/shaders/base.frag.glsl +++ b/bin/data/shaders/base.frag.glsl @@ -1,49 +1,54 @@ #version 450 -#define UF_DEFERRED_SAMPLING 0 -#define UF_CAN_DISCARD 1 - -layout (binding = 1) uniform sampler2D samplerTexture; +layout (binding = 1) uniform sampler2D samplerColor; layout (location = 0) in vec2 inUv; -layout (location = 1) in vec4 inColor; -layout (location = 2) in vec3 inNormal; -layout (location = 3) in vec3 inPosition; +layout (location = 1) in vec3 inPositionEye; +layout (location = 2) in vec3 inNormalEye; +layout (location = 3) in vec4 inColor; +layout (location = 0) out vec4 outFragColor; -layout (location = 0) out uvec2 outId; -layout (location = 1) out vec2 outNormals; -#if UF_DEFERRED_SAMPLING - layout (location = 2) out vec2 outUvs; -#else - layout (location = 2) out vec4 outAlbedo; -#endif +void fog( inout vec3 i ) { + vec3 color = vec3( 0, 0, 0 ); + float inner = 8, outer = 64; + float distance = length(-inPositionEye); + float factor = (distance - inner) / (outer - inner); + factor = clamp( factor, 0.0, 1.0 ); -vec2 encodeNormals( vec3 n ) { - float p = sqrt(n.z*8+8); - return n.xy/p + 0.5; + i = mix(i.rgb, color, factor); } -float mipLevel( in vec2 uv ) { - vec2 dx_vtc = dFdx(uv); - vec2 dy_vtc = dFdy(uv); - return 0.5 * log2(max(dot(dx_vtc, dx_vtc), dot(dy_vtc, dy_vtc))); + +void phong( inout vec3 i ) { + vec3 Ls = vec3(1.0, 1.0, 1.0); // light specular + vec3 Ld = vec3(0.4, 0.4, 1.0); // light color + vec3 La = vec3(0.1, 0.1, 0.1); + + vec3 Ks = vec3(0.6, 0.6, 0.9); // material specular + vec3 Kd = i; // material diffuse + vec3 Ka = vec3(0.7, 0.7, 0.7); + + float Kexp = 1000.0; + + vec3 dist_light_eye = vec3(0, 0, 0) - inPositionEye; + vec3 dir_light_eye = normalize(dist_light_eye); + float d_dot = max(dot( dir_light_eye, inNormalEye ), 0.0); + + vec3 reflection_eye = reflect( -dir_light_eye, inNormalEye ); + vec3 surface_eye = normalize(-inPositionEye); + float s_dot = max(dot( reflection_eye, surface_eye ), 0.0); + float s_factor = pow( s_dot, Kexp ); + + vec3 Ia = La * Ka; + vec3 Id = Ld * Kd * d_dot; + vec3 Is = Ls * Ks * s_factor; + i = Is + Id + Ia; } void main() { - float mip = mipLevel(inUv.xy); - vec2 uv = inUv.xy; - vec4 C = vec4(1, 1, 1, 1); - vec3 P = inPosition; - vec3 N = inNormal; -#if UF_DEFERRED_SAMPLING - outUvs = wrap(inUv.xy); - vec4 outAlbedo = vec4(0,0,0,0); -#endif -#if !UF_DEFERRED_SAMPLING || UF_CAN_DISCARD - C = textureLod( samplerTexture, uv, mip ); -#endif -#if !UF_DEFERRED_SAMPLING - outAlbedo = C * inColor; -#endif - outNormals = encodeNormals( N ); - //outId = ivec2(0, 0); + outFragColor = texture(samplerColor, inUv); + phong(outFragColor.rgb); + fog(outFragColor.rgb); +// outFragColor.rgb = mix( outFragColor.rgb, inColor.rgb, inColor.a ); + outFragColor.rgb = outFragColor.rgb * inColor.rgb; + if ( outFragColor.a < 0.001 ) discard; } \ No newline at end of file diff --git a/bin/data/shaders/base.stereo.vert.glsl b/bin/data/shaders/base.stereo.vert.glsl new file mode 100644 index 00000000..1bb77302 --- /dev/null +++ b/bin/data/shaders/base.stereo.vert.glsl @@ -0,0 +1,39 @@ +#version 450 + +layout (location = 0) in vec3 inPos; +layout (location = 1) in vec2 inUv; +layout (location = 2) in vec3 inNormal; + +layout( push_constant ) uniform PushBlock { + uint pass; +} PushConstant; + +struct Matrices { + mat4 model; + mat4 view[2]; + mat4 projection[2]; +}; + +layout (binding = 0) uniform UBO { + Matrices matrices; + vec4 color; +} ubo; + +layout (location = 0) out vec2 outUv; +layout (location = 1) out vec3 outPositionEye; +layout (location = 2) out vec3 outNormalEye; +layout (location = 3) out vec4 outColor; + +out gl_PerVertex { + vec4 gl_Position; +}; + + +void main() { + outUv = inUv; + outPositionEye = vec3(ubo.matrices.view[PushConstant.pass] * ubo.matrices.model * vec4(inPos.xyz, 1.0)); + outNormalEye = vec3(ubo.matrices.view[PushConstant.pass] * ubo.matrices.model * vec4(inNormal.xyz, 0.0)); + outColor = ubo.color; + + gl_Position = ubo.matrices.projection[PushConstant.pass] * ubo.matrices.view[PushConstant.pass] * ubo.matrices.model * vec4(inPos.xyz, 1.0); +} \ No newline at end of file diff --git a/bin/data/shaders/base.vert.glsl b/bin/data/shaders/base.vert.glsl index 0c83f290..1bb77302 100644 --- a/bin/data/shaders/base.vert.glsl +++ b/bin/data/shaders/base.vert.glsl @@ -1,19 +1,17 @@ #version 450 -layout (constant_id = 0) const uint PASSES = 6; layout (location = 0) in vec3 inPos; layout (location = 1) in vec2 inUv; layout (location = 2) in vec3 inNormal; layout( push_constant ) uniform PushBlock { uint pass; - uint draw; } PushConstant; struct Matrices { mat4 model; - mat4 view[PASSES]; - mat4 projection[PASSES]; + mat4 view[2]; + mat4 projection[2]; }; layout (binding = 0) uniform UBO { @@ -22,9 +20,9 @@ layout (binding = 0) uniform UBO { } ubo; layout (location = 0) out vec2 outUv; -layout (location = 1) out vec4 outColor; -layout (location = 2) out vec3 outNormal; -layout (location = 3) out vec3 outPosition; +layout (location = 1) out vec3 outPositionEye; +layout (location = 2) out vec3 outNormalEye; +layout (location = 3) out vec4 outColor; out gl_PerVertex { vec4 gl_Position; @@ -33,11 +31,9 @@ out gl_PerVertex { void main() { outUv = inUv; + outPositionEye = vec3(ubo.matrices.view[PushConstant.pass] * ubo.matrices.model * vec4(inPos.xyz, 1.0)); + outNormalEye = vec3(ubo.matrices.view[PushConstant.pass] * ubo.matrices.model * vec4(inNormal.xyz, 0.0)); outColor = ubo.color; - outPosition = vec3(ubo.matrices.view[PushConstant.pass] * ubo.matrices.model * vec4(inPos.xyz, 1.0)); - outNormal = vec3(ubo.matrices.view[PushConstant.pass] * ubo.matrices.model * vec4(inNormal.xyz, 0.0)); - outNormal = normalize(outNormal); - gl_Position = ubo.matrices.projection[PushConstant.pass] * ubo.matrices.view[PushConstant.pass] * ubo.matrices.model * vec4(inPos.xyz, 1.0); } \ No newline at end of file diff --git a/bin/data/shaders/display.blit.frag.glsl b/bin/data/shaders/display.blit.frag.glsl deleted file mode 100644 index 64e61a6a..00000000 --- a/bin/data/shaders/display.blit.frag.glsl +++ /dev/null @@ -1,23 +0,0 @@ -#version 450 -#extension GL_EXT_samplerless_texture_functions : require - -layout (binding = 1) uniform sampler samp; -layout (binding = 2) uniform texture2D albedoLeftTexture; -layout (binding = 3) uniform texture2D albedoRightTexture; - -layout (location = 0) in vec2 inUv; - -layout (location = 0) out vec4 outAlbedoSpecular; - -layout( push_constant ) uniform PushBlock { - uint pass; -} PushConstant; - -void main() { - if ( PushConstant.pass == 0 ) { - outAlbedoSpecular.rgb = texture(sampler2D(albedoLeftTexture, samp), inUv).rgb; - } else { - outAlbedoSpecular.rgb = texture(sampler2D(albedoRightTexture, samp), inUv).rgb; - } - outAlbedoSpecular.a = 1; -} \ No newline at end of file diff --git a/bin/data/shaders/display.blit.vert.glsl b/bin/data/shaders/display.blit.vert.glsl deleted file mode 100644 index e9638741..00000000 --- a/bin/data/shaders/display.blit.vert.glsl +++ /dev/null @@ -1,16 +0,0 @@ -#version 450 - -layout (location = 0) in vec2 inPos; -layout (location = 1) in vec2 inUv; - -layout (location = 0) out vec2 outUv; - -out gl_PerVertex { - vec4 gl_Position; -}; - -void main() { - outUv = inUv; - - gl_Position = vec4(inPos.xy, 0.0, 1.0); -} \ No newline at end of file diff --git a/bin/data/shaders/display.frag.glsl b/bin/data/shaders/display.frag.glsl new file mode 100644 index 00000000..5edd635c --- /dev/null +++ b/bin/data/shaders/display.frag.glsl @@ -0,0 +1,12 @@ +#version 450 + +layout (set = 0, binding = 1) uniform texture2D tex; +layout (set = 0, binding = 2) uniform sampler samp; + +layout (location = 0) in vec2 inUv; +layout (location = 0) out vec4 outFragColor; + +void main() { + outFragColor = texture(sampler2D(tex, samp), inUv); +// outFragColor = vec4(inUv, 1.0f, 0.0f); +} \ No newline at end of file diff --git a/bin/data/shaders/display.rendertarget.frag.glsl b/bin/data/shaders/display.rendertarget.frag.glsl deleted file mode 100644 index c919980c..00000000 --- a/bin/data/shaders/display.rendertarget.frag.glsl +++ /dev/null @@ -1,75 +0,0 @@ -#version 450 -#extension GL_EXT_samplerless_texture_functions : require - -#define UF_DEFERRED_SAMPLING 0 -#define UF_CAN_DISCARD 1 - -layout (binding = 1) uniform sampler samp; -layout (binding = 2) uniform utexture2D textureId; -layout (binding = 3) uniform texture2D textureNormals; -#if UF_DEFERRED_SAMPLING - layout (binding = 4) uniform texture2D textureUvs; -#else - layout (binding = 4) uniform texture2D textureAlbedo; -#endif - -struct Cursor { - vec2 position; - vec2 radius; - vec4 color; -}; - -layout (location = 0) in vec2 inUv; -layout (location = 1) in float inAlpha; -layout (location = 2) in Cursor inCursor; - -layout (location = 0) out vec4 outAlbedo; -void main() { - if ( inCursor.radius.x <= 0 && inCursor.radius.y <= 0 ) { - vec2 uv = gl_FragCoord.xy / textureSize(textureId, 0); - - outAlbedo = texture(sampler2D(textureAlbedo, samp), uv).rgba; - return; - } - float dist = pow(inUv.x - inCursor.position.x, 2) / pow(inCursor.radius.x, 2) + pow(inUv.y - inCursor.position.y, 2) / pow(inCursor.radius.y, 2); - - outAlbedo = texture(sampler2D(textureAlbedo, samp), inUv); - if ( dist <= 1 ) { - float attenuation = dist; - outAlbedo.rgb = mix( inCursor.color.rgb * inCursor.color.a, outAlbedo.rgb, attenuation ); - } - if ( inAlpha < 1.0 ) outAlbedo.a = inAlpha; -} - -/* -layout (location = 0) out uvec2 outId; -layout (location = 1) out vec2 outNormals; -#if UF_DEFERRED_SAMPLING - layout (location = 2) out vec2 outUvs; -#else - layout (location = 2) out vec4 outAlbedo; -#endif -void main() { - if ( inCursor.radius.x <= 0 && inCursor.radius.y <= 0 ) { - vec2 uv = gl_FragCoord.xy / textureSize(textureId, 0); - - outId = texture(usampler2D(textureId, samp), uv).xy; - outNormals = texture(sampler2D(textureNormals, samp), uv).xy; - #if UF_DEFERRED_SAMPLING - outUvs = texture(sampler2D(textureUvs, samp), uv).xy; - #else - outAlbedo = texture(sampler2D(textureAlbedo, samp), uv).rgba; - #endif - return; - } - float dist = pow(inUv.x - inCursor.position.x, 2) / pow(inCursor.radius.x, 2) + pow(inUv.y - inCursor.position.y, 2) / pow(inCursor.radius.y, 2); -#if !UF_DEFERRED_SAMPLING - outAlbedo = texture(sampler2D(textureAlbedo, samp), inUv); - if ( dist <= 1 ) { - float attenuation = dist; - outAlbedo.rgb = mix( inCursor.color.rgb * inCursor.color.a, outAlbedo.rgb, attenuation ); - } - if ( inAlpha < 1.0 ) outAlbedo.a = inAlpha; -#endif -} -*/ \ No newline at end of file diff --git a/bin/data/shaders/display.subpass.frag.glsl b/bin/data/shaders/display.subpass.frag.glsl deleted file mode 100644 index dac26e48..00000000 --- a/bin/data/shaders/display.subpass.frag.glsl +++ /dev/null @@ -1,693 +0,0 @@ -#version 450 -#extension GL_EXT_samplerless_texture_functions : require - -#define SAMPLES 16 -#define POISSON_DISK 16 -#define RAY_MARCH_FOG 0 -#define UF_DEFERRED_SAMPLING 0 - -layout (constant_id = 0) const uint TEXTURES = 256; - -struct Matrices { - mat4 view[2]; - mat4 projection[2]; - mat4 iView[2]; - mat4 iProjection[2]; - mat4 iProjectionView[2]; -}; - -struct Space { - vec3 eye; - vec3 world; -} position, normal, view; - -struct Fog { - vec3 color; - float stepScale; - - vec3 offset; - float densityScale; - - float densityThreshold; - float densityMultiplier; - float absorbtion; - float padding1; - - vec2 range; - float padding2; - float padding3; -}; - -struct Mode { - uint type; - uint scalar; - vec2 padding; - vec4 parameters; -}; - -struct Light { - vec3 position; - float radius; - - vec3 color; - float power; - - int type; - int mapIndex; - float depthBias; - float padding; - - mat4 view; - mat4 projection; -}; - -struct Material { - vec4 colorBase; - vec4 colorEmissive; - - float factorMetallic; - float factorRoughness; - float factorOcclusion; - float factorAlphaCutoff; - - int indexAlbedo; - int indexNormal; - int indexEmissive; - int indexOcclusion; - - int indexMetallicRoughness; - int modeAlpha; - int padding1; - int padding2; -}; -struct Texture { - int index; - int samp; - int remap; - float blend; - - vec4 lerp; -}; -struct DrawCall { - int materialIndex; - uint materials; - int textureIndex; - uint textures; -}; - -layout (input_attachment_index = 0, binding = 0) uniform usubpassInputMS samplerId; -layout (input_attachment_index = 1, binding = 1) uniform subpassInputMS samplerNormal; -#if UF_DEFERRED_SAMPLING - layout (input_attachment_index = 2, binding = 2) uniform subpassInputMS samplerUv; -#else - layout (input_attachment_index = 2, binding = 2) uniform subpassInputMS samplerAlbedo; -#endif -layout (input_attachment_index = 3, binding = 4) uniform subpassInputMS samplerDepth; - -layout (binding = 5) uniform sampler3D samplerNoise; -layout (binding = 6) uniform samplerCube samplerSkybox; -layout (binding = 7) uniform sampler2D samplerTextures[TEXTURES]; - -layout (binding = 8) uniform UBO { - Matrices matrices; - - Mode mode; - Fog fog; - - uint lights; - uint materials; - uint textures; - uint drawCalls; - - vec3 ambient; - float kexp; -} ubo; - -layout (std140, binding = 9) readonly buffer Lights { - Light lights[]; -}; -layout (std140, binding = 10) readonly buffer Materials { - Material materials[]; -}; -layout (std140, binding = 11) readonly buffer Textures { - Texture textures[]; -}; -layout (std140, binding = 12) readonly buffer DrawCalls { - DrawCall drawCalls[]; -}; - - -layout (location = 0) in vec2 inUv; -layout (location = 1) in flat uint inPushConstantPass; - -layout (location = 0) out vec4 outFragColor; - -vec2 poissonDisk[16] = vec2[]( - vec2( -0.94201624, -0.39906216 ), - vec2( 0.94558609, -0.76890725 ), - vec2( -0.094184101, -0.92938870 ), - vec2( 0.34495938, 0.29387760 ), - vec2( -0.91588581, 0.45771432 ), - vec2( -0.81544232, -0.87912464 ), - vec2( -0.38277543, 0.27676845 ), - vec2( 0.97484398, 0.75648379 ), - vec2( 0.44323325, -0.97511554 ), - vec2( 0.53742981, -0.47373420 ), - vec2( -0.26496911, -0.41893023 ), - vec2( 0.79197514, 0.19090188 ), - vec2( -0.24188840, 0.99706507 ), - vec2( -0.81409955, 0.91437590 ), - vec2( 0.19984126, 0.78641367 ), - vec2( 0.14383161, -0.14100790 ) -); - -void phong( Light light, vec4 albedoSpecular, inout vec3 i ) { - vec3 Ls = vec3(1.0, 1.0, 1.0); // light specular - vec3 Ld = light.color; // light color - vec3 La = vec3(1.0, 1.0, 1.0); - - vec3 Ks = vec3(albedoSpecular.a); // material specular - vec3 Kd = albedoSpecular.rgb; // material diffuse - vec3 Ka = vec3(1.0, 1.0, 1.0); - - float Kexp = ubo.kexp; - - vec3 V = position.eye; - vec3 N = normal.eye; - vec3 L = light.position.xyz - V; - float dist = length(L); -// if ( light.radius > 0.001 && light.radius < dist ) return; - - vec3 D = normalize(L); - float d_dot = max(dot( D, N ), 0.0); - - vec3 R = reflect( -D, N ); - vec3 S = normalize(-V); - float s_factor = pow( max(dot( R, S ), 0.0), Kexp ); - if ( Kexp < 0.0001 ) s_factor = 0; - - float radiance = light.power / (dist * dist); - - vec3 Ia = La * Ka; - vec3 Id = Ld * Kd * d_dot * radiance; - vec3 Is = Ls * Ks * s_factor * radiance; - - i += Id + Is; -} - -const float PI = 3.14159265359; -float DistributionGGX(vec3 N, vec3 H, float roughness) { - float a = roughness*roughness; - float a2 = a*a; - float NdotH = max(dot(N, H), 0.0); - float NdotH2 = NdotH*NdotH; - - float num = a2; - float denom = (NdotH2 * (a2 - 1.0) + 1.0); - denom = PI * denom * denom; - - return num / denom; -} - -float GeometrySchlickGGX(float NdotV, float roughness) { - float r = (roughness + 1.0); - float k = (r*r) / 8.0; - - float num = NdotV; - float denom = NdotV * (1.0 - k) + k; - - return num / denom; -} -float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness) { - float NdotV = max(dot(N, V), 0.0); - float NdotL = max(dot(N, L), 0.0); - float ggx2 = GeometrySchlickGGX(NdotV, roughness); - float ggx1 = GeometrySchlickGGX(NdotL, roughness); - - return ggx1 * ggx2; -} -vec3 fresnelSchlick(float cosTheta, vec3 F0) { - return F0 + (1.0 - F0) * pow(1.0 - cosTheta, 5.0); -} - -float random(vec3 seed, int i){ - vec4 seed4 = vec4(seed,i); - float dot_product = dot(seed4, vec4(12.9898,78.233,45.164,94.673)); - return fract(sin(dot_product) * 43758.5453); -} - -float shadowFactor( Light light, uint shadowMap ) { - vec4 positionClip = light.projection * light.view * vec4(position.world, 1.0); - positionClip.xyz /= positionClip.w; - - if ( positionClip.x < -1 || positionClip.x >= 1 ) return 0.0; - if ( positionClip.y < -1 || positionClip.y >= 1 ) return 0.0; - if ( positionClip.z <= 0 || positionClip.z >= 1 ) return 0.0; - - float factor = 1.0; - - // spot light - if ( light.type == 2 || light.type == 3 ) { - float dist = length( positionClip.xy ); - if ( dist > 0.5 ) return 0.0; - - // spot light with attenuation - if ( light.type == 3 ) { - factor = 1.0 - (pow(dist * 2,2.0)); - } - } - - vec2 uv = positionClip.xy * 0.5 + 0.5; - float bias = light.depthBias; -/* - if ( true ) { - float cosTheta = clamp(dot(normal.eye, normalize(light.position.xyz - position.eye)), 0, 1); - bias = clamp(bias * tan(acos(cosTheta)), 0, 0.01); - } else if ( true ) { - bias = max(bias * 10 * (1.0 - dot(normal.eye, normalize(light.position.xyz - position.eye))), bias); - } -*/ - - float eyeDepth = positionClip.z; - - int samples = POISSON_DISK; - if ( samples <= 1 ) { - return eyeDepth < texture(samplerTextures[shadowMap], uv).r - bias ? 0.0 : factor; - } - for ( int i = 0; i < samples; ++i ) { - // int index = i; - // int index = int( float(samples) * random(gl_FragCoord.xyy, i) ) % samples; - int index = int( float(samples) * random(floor(position.world.xyz * 1000.0), i)) % samples; - float lightDepth = texture(samplerTextures[shadowMap], uv + poissonDisk[index] / 700.0 ).r; - if ( eyeDepth < lightDepth - bias ) factor -= 1.0 / samples; - } - return factor; -} -vec3 hslToRgb(vec3 HSL) { - vec3 RGB; { - float H = HSL.x; - float R = abs(H * 6 - 3) - 1; - float G = 2 - abs(H * 6 - 2); - float B = 2 - abs(H * 6 - 4); - RGB = clamp(vec3(R,G,B), 0, 1); - } - float C = (1 - abs(2 * HSL.z - 1)) * HSL.y; - return (RGB - 0.5) * C + HSL.z; -} -vec3 rgbToHsl(vec3 RGB) { - float Epsilon = 1e-10; - vec3 HCV; { - vec4 P = (RGB.g < RGB.b) ? vec4(RGB.bg, -1.0, 2.0/3.0) : vec4(RGB.gb, 0.0, -1.0/3.0); - vec4 Q = (RGB.r < P.x) ? vec4(P.xyw, RGB.r) : vec4(RGB.r, P.yzx); - float C = Q.x - min(Q.w, Q.y); - float H = abs((Q.w - Q.y) / (6 * C + Epsilon) + Q.z); - HCV = vec3(H, C, Q.x); - } - float L = HCV.z - HCV.y * 0.5; - float S = HCV.y / (1 - abs(L * 2 - 1) + Epsilon); - return vec3(HCV.x, S, L); -} - -float hueDistance(float h1, float h2) { - float diff = abs((h1 - h2)); - return min(abs((1.0 - diff)), diff); -} -const float lightnessSteps = 4.0; -float lightnessStep(float l) { - return floor((0.5 + l * lightnessSteps)) / lightnessSteps; -} -const int indexMatrix16x16[256] = int[](0,192, 48,240, 12,204, 60,252, 3,195, 51,243, 15,207, 63,255, - 128, 64,176,112,140, 76,188,124,131, 67,179,115,143, 79,191,127, - 32,224, 16,208, 44,236, 28,220, 35,227, 19,211, 47,239, 31,223, - 160, 96,144, 80,172,108,156, 92,163, 99,147, 83,175,111,159, 95, - 8,200, 56,248, 4,196, 52,244, 11,203, 59,251, 7,199, 55,247, - 136, 72,184,120,132, 68,180,116,139, 75,187,123,135, 71,183,119, - 40,232, 24,216, 36,228, 20,212, 43,235, 27,219, 39,231, 23,215, - 168,104,152, 88,164,100,148, 84,171,107,155, 91,167,103,151, 87, - 2,194, 50,242, 14,206, 62,254, 1,193, 49,241, 13,205, 61,253, - 130, 66,178,114,142, 78,190,126,129, 65,177,113,141, 77,189,125, - 34,226, 18,210, 46,238, 30,222, 33,225, 17,209, 45,237, 29,221, - 162, 98,146, 82,174,110,158, 94,161, 97,145, 81,173,109,157, 93, - 10,202, 58,250, 6,198, 54,246, 9,201, 57,249, 5,197, 53,245, - 138, 74,186,122,134, 70,182,118,137, 73,185,121,133, 69,181,117, - 42,234, 26,218, 38,230, 22,214, 41,233, 25,217, 37,229, 21,213, - 170,106,154, 90,166,102,150, 86,169,105,153, 89,165,101,149, 85); -float indexValue16x16( float scale ) { - int x = int(mod(gl_FragCoord.x * scale, 16)); - int y = int(mod(gl_FragCoord.y * scale, 16)); - return indexMatrix16x16[(x + y * 16)] / 256.0; -} -const int indexMatrix8x8[64] = int[](0, 32, 8, 40, 2, 34, 10, 42, - 48, 16, 56, 24, 50, 18, 58, 26, - 12, 44, 4, 36, 14, 46, 6, 38, - 60, 28, 52, 20, 62, 30, 54, 22, - 3, 35, 11, 43, 1, 33, 9, 41, - 51, 19, 59, 27, 49, 17, 57, 25, - 15, 47, 7, 39, 13, 45, 5, 37, - 63, 31, 55, 23, 61, 29, 53, 21); -float indexValue8x8( float scale ) { - int x = int(mod(gl_FragCoord.x * scale, 8)); - int y = int(mod(gl_FragCoord.y * scale, 8)); - return indexMatrix8x8[(x + y * 8)] / 64.0; -} -const int indexMatrix4x4[16] = int[](0, 8, 2, 10, - 12, 4, 14, 6, - 3, 11, 1, 9, - 15, 7, 13, 5); -float indexValue4x4( float scale ) { - int x = int(mod(gl_FragCoord.x * scale, 4)); - int y = int(mod(gl_FragCoord.y * scale, 4)); - return indexMatrix4x4[(x + y * 4)] / 16.0; -} -vec3[2] closestColors(float hue) { - vec3 ret[2]; - vec3 closest = vec3(-2, 0, 0); - vec3 secondClosest = vec3(-2, 0, 0); - vec3 temp; -/* - for (int i = 0; i < palette.length(); ++i) { - temp = rgbToHsl(palette[i].rgb); - float tempDistance = hueDistance(temp.x, hue); - if (tempDistance < hueDistance(closest.x, hue)) { - secondClosest = closest; - closest = temp; - } else { - if (tempDistance < hueDistance(secondClosest.x, hue)) { - secondClosest = temp; - } - } - } -*/ - ret[0] = closest; - ret[1] = secondClosest; - return ret; -} -float dither(float color) { - float closestColor = (color < 0.5) ? 0 : 1; - float secondClosestColor = 1 - closestColor; - float d = 1; // -0.5 - fract(ubo.mode.parameters.w / 8.0); - if ( ubo.mode.scalar == 16 ) { - d = indexValue16x16(1); - } else if ( ubo.mode.scalar == 8 ) { - d = indexValue8x8(1); - } else if ( ubo.mode.scalar == 4 ) { - d = indexValue4x4(1); - } - float distance = abs(closestColor - color); - return (distance < d) ? closestColor : secondClosestColor; -} -void dither(inout vec3 color) { - vec3 hsl = rgbToHsl(color); - hsl.x = dither(hsl.x); - color = hslToRgb(hsl); -} -void dither1(inout vec3 color) { - vec3 hsl = rgbToHsl(color); - - float d = 0; - vec3 cs[2] = { hsl, hsl }; // closestColors(hsl.x); - float scale = 1; - if ( ubo.mode.scalar == 16 ) { - d = indexValue16x16(scale); - } else if ( ubo.mode.scalar == 8 ) { - d = indexValue8x8(scale); - } else if ( ubo.mode.scalar == 4 ) { - d = indexValue4x4(scale); - } - float hueDiff = hueDistance(hsl.x, cs[0].x) / hueDistance(cs[1].x, cs[0].x); - float l1 = lightnessStep(max((hsl.z - 0.125), 0.0)); - float l2 = lightnessStep(min((hsl.z + 0.124), 1.0)); - float lightnessDiff = (hsl.z - l1) / (l2 - l1); - - vec3 resultColor = (hueDiff < d) ? cs[0] : cs[1]; - resultColor.z = (lightnessDiff < d) ? l1 : l2; - color = hslToRgb(resultColor); -} -vec3 dither2() { - vec3 vDither = dot( vec2( 171.0, 231.0 ), inUv.xy + ubo.mode.parameters.w ).xxx; - vDither.rgb = fract( vDither.rgb / vec3( 103.0, 71.0, 97.0 ) ) - vec3( 0.5, 0.5, 0.5 ); - return ( vDither.rgb / 255.0 ) * 0.375; -} - -float rand2(vec2 co){ - return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 143758.5453); -} -float rand3(vec3 co){ - return fract(sin(dot(co.xyz ,vec3(12.9898,78.233, 37.719))) * 143758.5453); -} -void whitenoise(inout vec3 color) { - float flicker = ubo.mode.parameters.x; - float pieces = ubo.mode.parameters.y; - float blend = ubo.mode.parameters.z; - float time = ubo.mode.parameters.w; - if ( blend < 0.0001 ) return; - float freq = sin(pow(mod(time, flicker) + flicker, 1.9)); -// float whiteNoise = rand3( floor(position.world / pieces) + floor(time * 2) ); - float whiteNoise = rand2( floor(gl_FragCoord.xy / pieces) + mod(time, freq) ); - color = mix( color, vec3(whiteNoise), blend ); -} - -void pbr( Light light, vec3 albedo, float metallic, float roughness, vec3 lightPositionWorld, inout vec3 i ) { - vec3 F0 = vec3(0.04); - F0 = mix(F0, albedo, metallic); - - vec3 N = normalize(normal.eye); - vec3 L = light.position.xyz - position.eye; - float dist = length(L); - - L = normalize(L); - vec3 V = normalize(-position.eye); - vec3 H = normalize(V + L); - - float NdotL = max(dot(N, L), 0.0); - float NdotV = max(dot(N, V), 0.0); - float attenuation = light.power / (dist * dist); - vec3 radiance = light.color.rgb * attenuation; - - // cook-torrance brdf - float NDF = DistributionGGX(N, H, roughness); - float G = GeometrySmith(N, V, L, roughness); - vec3 F = fresnelSchlick(max(dot(H, V), 0.0), F0); - - vec3 kD = vec3(1.0) - F; - kD *= 1.0 - metallic; - - vec3 numerator = NDF * G * F; - float denominator = 4.0 * NdotV * NdotL; - vec3 specular = numerator / max(denominator, 0.001); - - // add to outgoing radiance Lo - i += (kD * albedo / PI + specular) * radiance * NdotL; -} - -vec2 rayBoxDst( vec3 boundsMin, vec3 boundsMax, vec3 rayO, vec3 rayD ) { - vec3 t0 = (boundsMin - rayO) / rayD; - vec3 t1 = (boundsMax - rayO) / rayD; - vec3 tmin = min(t0, t1); - vec3 tmax = max(t0, t1); - float dstA = max( max(tmin.x, tmin.y), tmin.z ); - float dstB = min( tmax.x, min(tmax.y, tmax.z) ); - float dstToBox = max(0, dstA); - float dstInsideBox = max(0, dstB - dstToBox); - return vec2(dstToBox, dstInsideBox); -} - -float sampleDensity( vec3 position ) { - vec3 uvw = position * ubo.fog.densityScale * 0.001 + ubo.fog.offset * 0.01; - return max(0, texture(samplerNoise, uvw).r - ubo.fog.densityThreshold) * ubo.fog.densityMultiplier; -} - -void fog( vec3 rayO, vec3 rayD, inout vec3 i, float scale ) { - if ( ubo.fog.stepScale <= 0 ) return; - if ( ubo.fog.range.x == 0 || ubo.fog.range.y == 0 ) return; - -#if RAY_MARCH_FOG - float range = ubo.fog.range.y; - vec3 boundsMin = vec3(-range,-range,-range) + rayO; - vec3 boundsMax = vec3(range,range,range) + rayO; - int numSteps = int(length(boundsMax - boundsMin) * ubo.fog.stepScale ); - - vec2 rayBoxInfo = rayBoxDst( boundsMin, boundsMax, rayO, rayD ); - float dstToBox = rayBoxInfo.x; - float dstInsideBox = rayBoxInfo.y; - float depth = position.eye.z; - - float lightEnergy = 0; - // march - if ( 0 <= dstInsideBox && dstToBox <= depth ) { - float dstTravelled = 0; - float stepSize = dstInsideBox / numSteps; - float dstLimit = min( depth - dstToBox, dstInsideBox ); - float totalDensity = 0; - float transmittance = 1; - while ( dstTravelled < dstLimit ) { - vec3 rayPos = rayO + rayD * (dstToBox + dstTravelled); - float density = sampleDensity(rayPos); - if ( density > 0 ) { - transmittance *= exp(-density * stepSize * ubo.fog.absorbtion); - if ( transmittance < 0.01 ) break; - } - dstTravelled += stepSize; - } - i.rgb = mix(ubo.fog.color.rgb, i.rgb, transmittance); - } -#endif - - vec3 color = ubo.fog.color.rgb; - float inner = ubo.fog.range.x; - float outer = ubo.fog.range.y * scale; - float distance = length(-position.eye); - float factor = (distance - inner) / (outer - inner); - factor = clamp( factor, 0.0, 1.0 ); - - i.rgb = mix(i.rgb, color, factor); -} - -vec3 decodeNormals( vec2 enc ) { - vec2 fenc = enc*4-2; - float f = dot(fenc,fenc); - float g = sqrt(1-f/4); - vec3 n; - n.xy = fenc*g; - n.z = 1-f/2; - return normalize(n); -} -float wrap( float i ) { - return fract(i); -} -vec2 wrap( vec2 uv ) { - return vec2( wrap( uv.x ), wrap( uv.y ) ); -} -float mipLevel( in vec2 uv ) { - vec2 dx_vtc = dFdx(uv); - vec2 dy_vtc = dFdy(uv); - return 0.5 * log2(max(dot(dx_vtc, dx_vtc), dot(dy_vtc, dy_vtc))); -} -bool validTextureIndex( int textureIndex ) { - return 0 <= textureIndex && textureIndex < ubo.textures; -} -vec4 sampleTexture( uint drawId, int textureIndex, in vec2 uv, vec4 base ) { - if ( !validTextureIndex( textureIndex ) ) return base; - Texture t = textures[textureIndex+1]; - float mip = mipLevel( uv ); - return texture( samplerTextures[drawId], mix( t.lerp.xy, t.lerp.zw, wrap( uv ) ), mip ); -} - -void main() { - vec3 rayO = vec3(0); - vec3 rayD = vec3(0); - vec3 fragColor = vec3(0); - - { - float depth = subpassLoad(samplerDepth, SAMPLES).r; - - vec4 positionClip = vec4(inUv * 2.0 - 1.0, depth, 1.0); - vec4 positionEye = ubo.matrices.iProjection[inPushConstantPass] * positionClip; - positionEye /= positionEye.w; - position.eye = positionEye.xyz; - - vec4 positionWorld = ubo.matrices.iView[inPushConstantPass] * positionEye; - position.world = positionWorld.xyz; - } - { - vec4 near4 = ubo.matrices.iProjectionView[inPushConstantPass] * (vec4(2.0 * inUv - 1.0, -1.0, 1.0)); - vec4 far4 = ubo.matrices.iProjectionView[inPushConstantPass] * (vec4(2.0 * inUv - 1.0, 1.0, 1.0)); - vec3 near3 = near4.xyz / near4.w; - vec3 far3 = far4.xyz / far4.w; - - rayO = near3; - } - { - mat4 iProjectionView = inverse( ubo.matrices.projection[inPushConstantPass] * mat4(mat3(ubo.matrices.view[inPushConstantPass])) ); - vec4 near4 = iProjectionView * (vec4(2.0 * inUv - 1.0, -1.0, 1.0)); - vec4 far4 = iProjectionView * (vec4(2.0 * inUv - 1.0, 1.0, 1.0)); - vec3 near3 = near4.xyz / near4.w; - vec3 far3 = far4.xyz / far4.w; - - rayD = normalize( far3 - near3 ); - } - - normal.eye = decodeNormals( subpassLoad(samplerNormal, SAMPLES).xy ); - - uvec2 ID = subpassLoad(samplerId, SAMPLES).xy; - uint drawId = ID.x; - uint materialId = ID.y; - if ( drawId == 0 || materialId == 0 ) { - fragColor.rgb = texture( samplerSkybox, rayD ).rgb; - fog(rayO, rayD, fragColor, 0.0); - outFragColor = vec4(fragColor,1); - return; - } - --drawId; - --materialId; - - DrawCall drawCall = drawCalls[drawId]; - materialId += drawCall.materialIndex; - - Material material = materials[materialId]; - vec4 C = material.colorBase; - -#if UF_DEFERRED_SAMPLING - vec2 uv = subpassLoad(samplerUv, SAMPLES).xy; - C = sampleTexture( drawId, drawCall.textureIndex + material.indexAlbedo, uv, C ); - // OPAQUE - if ( material.modeAlpha == 0 ) { - C.a = 1; - // BLEND - } else if ( material.modeAlpha == 1 ) { - - // MASK - } else if ( material.modeAlpha == 2 ) { - - } -#else - C = subpassLoad(samplerAlbedo, SAMPLES); -#endif - - float M = material.factorMetallic; - float R = material.factorRoughness * 4.0; - float AO = material.factorOcclusion; - - bool usePbr = true; - bool gammaCorrect = false; - float litFactor = 1.0; - fragColor = C.rgb * ubo.ambient.rgb * AO; - for ( uint i = 0; i < ubo.lights; ++i ) { - Light light = lights[i]; - - if ( light.power <= 0.001 ) continue; - - vec3 lightPositionWorld = light.position.xyz; - light.position.xyz = vec3(ubo.matrices.view[inPushConstantPass] * vec4(light.position.xyz, 1)); - - if ( 0 <= light.mapIndex && light.mapIndex < TEXTURES ) { - float factor = shadowFactor( light, light.mapIndex ); - // if ( factor <= 0.0001 ) continue; - light.power *= factor; - litFactor += light.power; - } - if ( light.power <= 0.0001 ) continue; - - if ( usePbr ) { - pbr( light, C.rgb, M, R, lightPositionWorld, fragColor ); - } else - phong( light, C, fragColor ); - } - if ( gammaCorrect ) { - fragColor = fragColor / (fragColor + vec3(1.0)); - fragColor = pow(fragColor, vec3(1.0/2.2)); - } - - fog(rayO, rayD, fragColor, litFactor); - -/* - if ( (ubo.mode.type & (0x1 << 0)) == (0x1 << 0) ) { - //dither1(fragColor); - fragColor += dither2(); - } -*/ - if ( (ubo.mode.type & (0x1 << 1)) == (0x1 << 1) ) { - whitenoise(fragColor); - } - outFragColor = vec4(fragColor,1); -} \ No newline at end of file diff --git a/bin/data/shaders/display.subpass.old.frag.glsl b/bin/data/shaders/display.subpass.old.frag.glsl deleted file mode 100644 index 705a45d0..00000000 --- a/bin/data/shaders/display.subpass.old.frag.glsl +++ /dev/null @@ -1,559 +0,0 @@ -#version 450 -#extension GL_EXT_samplerless_texture_functions : require - -layout (constant_id = 0) const uint LIGHTS = 256; - -layout (input_attachment_index = 0, binding = 1) uniform subpassInput samplerAlbedoMetallic; -layout (input_attachment_index = 0, binding = 2) uniform subpassInput samplerNormalRoughness; -layout (input_attachment_index = 0, binding = 3) uniform subpassInput samplerDepth; - -layout (binding = 5) uniform sampler3D samplerNoise; -layout (binding = 6) uniform sampler2D samplerShadows[LIGHTS]; - -layout (location = 0) in vec2 inUv; -layout (location = 1) in flat uint inPushConstantPass; - -layout (location = 0) out vec4 outFragColor; - -/* -const vec2 poissonDisk[4] = vec2[]( - vec2( -0.94201624, -0.39906216 ), - vec2( 0.94558609, -0.76890725 ), - vec2( -0.094184101, -0.92938870 ), - vec2( 0.34495938, 0.29387760 ) -); -*/ -vec2 poissonDisk[16] = vec2[]( - vec2( -0.94201624, -0.39906216 ), - vec2( 0.94558609, -0.76890725 ), - vec2( -0.094184101, -0.92938870 ), - vec2( 0.34495938, 0.29387760 ), - vec2( -0.91588581, 0.45771432 ), - vec2( -0.81544232, -0.87912464 ), - vec2( -0.38277543, 0.27676845 ), - vec2( 0.97484398, 0.75648379 ), - vec2( 0.44323325, -0.97511554 ), - vec2( 0.53742981, -0.47373420 ), - vec2( -0.26496911, -0.41893023 ), - vec2( 0.79197514, 0.19090188 ), - vec2( -0.24188840, 0.99706507 ), - vec2( -0.81409955, 0.91437590 ), - vec2( 0.19984126, 0.78641367 ), - vec2( 0.14383161, -0.14100790 ) -); - -struct Light { - vec3 position; - float radius; - - vec3 color; - float power; - - int type; - float depthBias; - float padding1; - float padding2; - - mat4 view; - mat4 projection; -}; - -struct Matrices { - mat4 view[2]; - mat4 projection[2]; -}; - -struct Space { - vec3 eye; - vec3 world; -} position, normal, view; - -struct Fog { - vec3 color; - float stepScale; - - vec3 offset; - float densityScale; - - float densityThreshold; - float densityMultiplier; - float absorbtion; - float padding1; - - vec2 range; - float padding2; - float padding3; -}; - -struct Mode { - uint type; - uint scalar; - vec2 padding; - vec4 parameters; -}; - -layout (binding = 0) uniform UBO { - Matrices matrices; - vec3 ambient; - float kexp; - Mode mode; - Fog fog; - Light lights[LIGHTS]; -} ubo; - -void phong( Light light, vec4 albedoSpecular, inout vec3 i ) { - vec3 Ls = vec3(1.0, 1.0, 1.0); // light specular - vec3 Ld = light.color; // light color - vec3 La = vec3(1.0, 1.0, 1.0); - - vec3 Ks = vec3(albedoSpecular.a); // material specular - vec3 Kd = albedoSpecular.rgb; // material diffuse - vec3 Ka = vec3(1.0, 1.0, 1.0); - - float Kexp = ubo.kexp; - - vec3 V = position.eye; - vec3 N = normal.eye; - vec3 L = light.position.xyz - V; - float dist = length(L); -// if ( light.radius > 0.001 && light.radius < dist ) return; - - vec3 D = normalize(L); - float d_dot = max(dot( D, N ), 0.0); - - vec3 R = reflect( -D, N ); - vec3 S = normalize(-V); - float s_factor = pow( max(dot( R, S ), 0.0), Kexp ); - if ( Kexp < 0.0001 ) s_factor = 0; - - float radiance = light.power / (dist * dist); - - vec3 Ia = La * Ka; - vec3 Id = Ld * Kd * d_dot * radiance; - vec3 Is = Ls * Ks * s_factor * radiance; - - i += Id + Is; -} - -const float PI = 3.14159265359; -float DistributionGGX(vec3 N, vec3 H, float roughness) { - float a = roughness*roughness; - float a2 = a*a; - float NdotH = max(dot(N, H), 0.0); - float NdotH2 = NdotH*NdotH; - - float num = a2; - float denom = (NdotH2 * (a2 - 1.0) + 1.0); - denom = PI * denom * denom; - - return num / denom; -} - -float GeometrySchlickGGX(float NdotV, float roughness) { - float r = (roughness + 1.0); - float k = (r*r) / 8.0; - - float num = NdotV; - float denom = NdotV * (1.0 - k) + k; - - return num / denom; -} -float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness) { - float NdotV = max(dot(N, V), 0.0); - float NdotL = max(dot(N, L), 0.0); - float ggx2 = GeometrySchlickGGX(NdotV, roughness); - float ggx1 = GeometrySchlickGGX(NdotL, roughness); - - return ggx1 * ggx2; -} -vec3 fresnelSchlick(float cosTheta, vec3 F0) { - return F0 + (1.0 - F0) * pow(1.0 - cosTheta, 5.0); -} - -float random(vec3 seed, int i){ - vec4 seed4 = vec4(seed,i); - float dot_product = dot(seed4, vec4(12.9898,78.233,45.164,94.673)); - return fract(sin(dot_product) * 43758.5453); -} - -float shadowFactor( Light light, uint shadowMap ) { - vec4 positionClip = light.projection * light.view * vec4(position.world, 1.0); - positionClip.xyz /= positionClip.w; - - if ( positionClip.x < -1 || positionClip.x >= 1 ) return 0.0; - if ( positionClip.y < -1 || positionClip.y >= 1 ) return 0.0; - if ( positionClip.z <= 0 || positionClip.z >= 1 ) return 0.0; - - float factor = 1.0; - - // spot light - if ( light.type == -2 || light.type == -3 ) { - float dist = length( positionClip.xy ); - if ( dist > 0.5 ) return 0.0; - - // spot light with attenuation - if ( light.type == -3 ) { - factor = 1.0 - (pow(dist * 2,2.0)); - } - } - - vec2 uv = positionClip.xy * 0.5 + 0.5; - float bias = light.depthBias; - if ( !true ) { - float cosTheta = clamp(dot(normal.eye, normalize(light.position.xyz - position.eye)), 0, 1); - bias = clamp(bias * tan(acos(cosTheta)), 0, 0.01); - } else if ( true ) { - bias = max(bias * 10 * (1.0 - dot(normal.eye, normalize(light.position.xyz - position.eye))), bias); - } - - float eyeDepth = positionClip.z; - int samples = poissonDisk.length(); - if ( samples <= 1 ) { - return eyeDepth < texture(samplerShadows[shadowMap], uv).r - bias ? 0.0 : factor; - } - for ( int i = 0; i < samples; ++i ) { - // int index = i; - // int index = int( float(samples) * random(gl_FragCoord.xyy, i) ) % samples; - int index = int( float(samples) * random(floor(position.world.xyz * 1000.0), i)) % samples; - float lightDepth = texture(samplerShadows[shadowMap], uv + poissonDisk[index] / 700.0 ).r; - if ( eyeDepth < lightDepth - bias ) factor -= 1.0 / samples; - } - return factor; -} -vec3 hslToRgb(vec3 HSL) { - vec3 RGB; { - float H = HSL.x; - float R = abs(H * 6 - 3) - 1; - float G = 2 - abs(H * 6 - 2); - float B = 2 - abs(H * 6 - 4); - RGB = clamp(vec3(R,G,B), 0, 1); - } - float C = (1 - abs(2 * HSL.z - 1)) * HSL.y; - return (RGB - 0.5) * C + HSL.z; -} -vec3 rgbToHsl(vec3 RGB) { - float Epsilon = 1e-10; - vec3 HCV; { - vec4 P = (RGB.g < RGB.b) ? vec4(RGB.bg, -1.0, 2.0/3.0) : vec4(RGB.gb, 0.0, -1.0/3.0); - vec4 Q = (RGB.r < P.x) ? vec4(P.xyw, RGB.r) : vec4(RGB.r, P.yzx); - float C = Q.x - min(Q.w, Q.y); - float H = abs((Q.w - Q.y) / (6 * C + Epsilon) + Q.z); - HCV = vec3(H, C, Q.x); - } - float L = HCV.z - HCV.y * 0.5; - float S = HCV.y / (1 - abs(L * 2 - 1) + Epsilon); - return vec3(HCV.x, S, L); -} - -float hueDistance(float h1, float h2) { - float diff = abs((h1 - h2)); - return min(abs((1.0 - diff)), diff); -} -const float lightnessSteps = 4.0; -float lightnessStep(float l) { - return floor((0.5 + l * lightnessSteps)) / lightnessSteps; -} -const int indexMatrix16x16[256] = int[](0,192, 48,240, 12,204, 60,252, 3,195, 51,243, 15,207, 63,255, - 128, 64,176,112,140, 76,188,124,131, 67,179,115,143, 79,191,127, - 32,224, 16,208, 44,236, 28,220, 35,227, 19,211, 47,239, 31,223, - 160, 96,144, 80,172,108,156, 92,163, 99,147, 83,175,111,159, 95, - 8,200, 56,248, 4,196, 52,244, 11,203, 59,251, 7,199, 55,247, - 136, 72,184,120,132, 68,180,116,139, 75,187,123,135, 71,183,119, - 40,232, 24,216, 36,228, 20,212, 43,235, 27,219, 39,231, 23,215, - 168,104,152, 88,164,100,148, 84,171,107,155, 91,167,103,151, 87, - 2,194, 50,242, 14,206, 62,254, 1,193, 49,241, 13,205, 61,253, - 130, 66,178,114,142, 78,190,126,129, 65,177,113,141, 77,189,125, - 34,226, 18,210, 46,238, 30,222, 33,225, 17,209, 45,237, 29,221, - 162, 98,146, 82,174,110,158, 94,161, 97,145, 81,173,109,157, 93, - 10,202, 58,250, 6,198, 54,246, 9,201, 57,249, 5,197, 53,245, - 138, 74,186,122,134, 70,182,118,137, 73,185,121,133, 69,181,117, - 42,234, 26,218, 38,230, 22,214, 41,233, 25,217, 37,229, 21,213, - 170,106,154, 90,166,102,150, 86,169,105,153, 89,165,101,149, 85); -float indexValue16x16( float scale ) { - int x = int(mod(gl_FragCoord.x * scale, 16)); - int y = int(mod(gl_FragCoord.y * scale, 16)); - return indexMatrix16x16[(x + y * 16)] / 256.0; -} -const int indexMatrix8x8[64] = int[](0, 32, 8, 40, 2, 34, 10, 42, - 48, 16, 56, 24, 50, 18, 58, 26, - 12, 44, 4, 36, 14, 46, 6, 38, - 60, 28, 52, 20, 62, 30, 54, 22, - 3, 35, 11, 43, 1, 33, 9, 41, - 51, 19, 59, 27, 49, 17, 57, 25, - 15, 47, 7, 39, 13, 45, 5, 37, - 63, 31, 55, 23, 61, 29, 53, 21); -float indexValue8x8( float scale ) { - int x = int(mod(gl_FragCoord.x * scale, 8)); - int y = int(mod(gl_FragCoord.y * scale, 8)); - return indexMatrix8x8[(x + y * 8)] / 64.0; -} -const int indexMatrix4x4[16] = int[](0, 8, 2, 10, - 12, 4, 14, 6, - 3, 11, 1, 9, - 15, 7, 13, 5); -float indexValue4x4( float scale ) { - int x = int(mod(gl_FragCoord.x * scale, 4)); - int y = int(mod(gl_FragCoord.y * scale, 4)); - return indexMatrix4x4[(x + y * 4)] / 16.0; -} -vec3[2] closestColors(float hue) { - vec3 ret[2]; - vec3 closest = vec3(-2, 0, 0); - vec3 secondClosest = vec3(-2, 0, 0); - vec3 temp; -/* - for (int i = 0; i < palette.length(); ++i) { - temp = rgbToHsl(palette[i].rgb); - float tempDistance = hueDistance(temp.x, hue); - if (tempDistance < hueDistance(closest.x, hue)) { - secondClosest = closest; - closest = temp; - } else { - if (tempDistance < hueDistance(secondClosest.x, hue)) { - secondClosest = temp; - } - } - } -*/ - ret[0] = closest; - ret[1] = secondClosest; - return ret; -} -float dither(float color) { - float closestColor = (color < 0.5) ? 0 : 1; - float secondClosestColor = 1 - closestColor; - float d = 1; // -0.5 - fract(ubo.mode.parameters.w / 8.0); - if ( ubo.mode.scalar == 16 ) { - d = indexValue16x16(1); - } else if ( ubo.mode.scalar == 8 ) { - d = indexValue8x8(1); - } else if ( ubo.mode.scalar == 4 ) { - d = indexValue4x4(1); - } - float distance = abs(closestColor - color); - return (distance < d) ? closestColor : secondClosestColor; -} -void dither(inout vec3 color) { - vec3 hsl = rgbToHsl(color); - hsl.x = dither(hsl.x); - color = hslToRgb(hsl); -} -void dither1(inout vec3 color) { - vec3 hsl = rgbToHsl(color); - - float d = 0; - vec3 cs[2] = { hsl, hsl }; // closestColors(hsl.x); - float scale = 1; - if ( ubo.mode.scalar == 16 ) { - d = indexValue16x16(scale); - } else if ( ubo.mode.scalar == 8 ) { - d = indexValue8x8(scale); - } else if ( ubo.mode.scalar == 4 ) { - d = indexValue4x4(scale); - } - float hueDiff = hueDistance(hsl.x, cs[0].x) / hueDistance(cs[1].x, cs[0].x); - float l1 = lightnessStep(max((hsl.z - 0.125), 0.0)); - float l2 = lightnessStep(min((hsl.z + 0.124), 1.0)); - float lightnessDiff = (hsl.z - l1) / (l2 - l1); - - vec3 resultColor = (hueDiff < d) ? cs[0] : cs[1]; - resultColor.z = (lightnessDiff < d) ? l1 : l2; - color = hslToRgb(resultColor); -} -vec3 dither2() { - vec3 vDither = dot( vec2( 171.0, 231.0 ), inUv.xy + ubo.mode.parameters.w ).xxx; - vDither.rgb = fract( vDither.rgb / vec3( 103.0, 71.0, 97.0 ) ) - vec3( 0.5, 0.5, 0.5 ); - return ( vDither.rgb / 255.0 ) * 0.375; -} - -float rand2(vec2 co){ - return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 143758.5453); -} -float rand3(vec3 co){ - return fract(sin(dot(co.xyz ,vec3(12.9898,78.233, 37.719))) * 143758.5453); -} -void whitenoise(inout vec3 color) { - float flicker = ubo.mode.parameters.x; - float pieces = ubo.mode.parameters.y; - float blend = ubo.mode.parameters.z; - float time = ubo.mode.parameters.w; - if ( blend < 0.0001 ) return; - float freq = sin(pow(mod(time, flicker) + flicker, 1.9)); -// float whiteNoise = rand3( floor(position.world / pieces) + floor(time * 2) ); - float whiteNoise = rand2( floor(gl_FragCoord.xy / pieces) + mod(time, freq) ); - color = mix( color, vec3(whiteNoise), blend ); -} - -void pbr( Light light, vec3 albedo, float metallic, float roughness, vec3 lightPositionWorld, inout vec3 i ) { - vec3 F0 = vec3(0.04); - F0 = mix(F0, albedo, metallic); - - vec3 N = normalize(normal.eye); - vec3 L = light.position.xyz - position.eye; - float dist = length(L); -// if ( light.radius > 0.001 && light.radius < dist ) return; - - vec3 D = normalize(L); - vec3 V = normalize(-position.eye); - vec3 H = normalize(V + D); - - float NdotD = max(dot(N, D), 0.0); - float NdotV = max(dot(N, V), 0.0); - - vec3 radiance = light.color.rgb * light.power / (dist * dist); -/* - if ( light.radius > 0.0001 ) { - radiance *= clamp( light.radius / (pow(dist, 2.0) + 1.0), 0.0, 1.0 ); - } else if ( false ) { - radiance /= dist * dist; - } -*/ - - // cook-torrance brdf - float NDF = DistributionGGX(N, H, roughness); - float G = GeometrySmith(N, V, D, roughness); - vec3 F = fresnelSchlick(max(dot(H, V), 0.0), F0); - - vec3 kS = F; - vec3 kD = vec3(1.0) - kS; - kD *= 1.0 - metallic; - - vec3 numerator = NDF * G * F; - float denominator = 4.0 * NdotV * NdotD; - vec3 specular = numerator / max(denominator, 0.001); - - // add to outgoing radiance Lo - i += (kD * albedo / PI + specular) * radiance * NdotD; -} - -vec2 rayBoxDst( vec3 boundsMin, vec3 boundsMax, vec3 rayOrigin, vec3 rayDir ) { - vec3 t0 = (boundsMin - rayOrigin) / rayDir; - vec3 t1 = (boundsMax - rayOrigin) / rayDir; - vec3 tmin = min(t0, t1); - vec3 tmax = max(t0, t1); - float dstA = max( max(tmin.x, tmin.y), tmin.z ); - float dstB = min( tmax.x, min(tmax.y, tmax.z) ); - float dstToBox = max(0, dstA); - float dstInsideBox = max(0, dstB - dstToBox); - return vec2(dstToBox, dstInsideBox); -} - -float sampleDensity( vec3 position ) { - vec3 uvw = position * ubo.fog.densityScale * 0.001 + ubo.fog.offset * 0.01; - return max(0, texture(samplerNoise, uvw).r - ubo.fog.densityThreshold) * ubo.fog.densityMultiplier; -} - -void fog( inout vec3 i, float scale ) { - if ( ubo.fog.stepScale <= 0 ) return; - if ( ubo.fog.range.x == 0 || ubo.fog.range.y == 0 ) return; - - mat4 iProjView = inverse( ubo.matrices.projection[inPushConstantPass] * ubo.matrices.view[inPushConstantPass] ); - vec4 near4 = iProjView * (vec4(2.0 * inUv - 1.0, -1.0, 1.0)); - vec4 far4 = iProjView * (vec4(2.0 * inUv - 1.0, 1.0, 1.0)); - vec3 near3 = near4.xyz / near4.w; - vec3 far3 = far4.xyz / far4.w; - - vec3 rayOrigin = near3; - vec3 rayDir = normalize( far3 - near3 ); - - float range = ubo.fog.range.y; - vec3 boundsMin = vec3(-range,-range,-range) + rayOrigin; - vec3 boundsMax = vec3(range,range,range) + rayOrigin; - int numSteps = int(length(boundsMax - boundsMin) * ubo.fog.stepScale ); - - vec2 rayBoxInfo = rayBoxDst( boundsMin, boundsMax, rayOrigin, rayDir ); - float dstToBox = rayBoxInfo.x; - float dstInsideBox = rayBoxInfo.y; - float depth = position.eye.z; - - float lightEnergy = 0; - // march - if ( 0 <= dstInsideBox && dstToBox <= depth ) { - float dstTravelled = 0; - float stepSize = dstInsideBox / numSteps; - float dstLimit = min( depth - dstToBox, dstInsideBox ); - float totalDensity = 0; - float transmittance = 1; - while ( dstTravelled < dstLimit ) { - vec3 rayPos = rayOrigin + rayDir * (dstToBox + dstTravelled); - float density = sampleDensity(rayPos); - if ( density > 0 ) { - transmittance *= exp(-density * stepSize * ubo.fog.absorbtion); - if ( transmittance < 0.01 ) break; - } - dstTravelled += stepSize; - } - i.rgb = mix(ubo.fog.color.rgb, i.rgb, transmittance); - } - - vec3 color = ubo.fog.color.rgb; - float inner = ubo.fog.range.x; - float outer = ubo.fog.range.y * scale; - float distance = length(-position.eye); - float factor = (distance - inner) / (outer - inner); - factor = clamp( factor, 0.0, 1.0 ); - - i.rgb = mix(i.rgb, color, factor); -} - -void main() { - vec4 albedoMetallic = subpassLoad(samplerAlbedoMetallic); - vec4 normalRoughness = subpassLoad(samplerNormalRoughness); -// vec4 positionAO = subpassLoad(samplerPositionAO); - - normal.eye = normalRoughness.rgb; - { - mat4 iProj = inverse( ubo.matrices.projection[inPushConstantPass] ); - mat4 iView = inverse( ubo.matrices.view[inPushConstantPass] ); - float depth = subpassLoad(samplerDepth).r; - - vec4 positionClip = vec4(inUv * 2.0 - 1.0, depth, 1.0); - vec4 positionEye = iProj * positionClip; - positionEye /= positionEye.w; - position.eye = positionEye.xyz; - - vec4 positionWorld = iView * positionEye; - position.world = positionWorld.xyz; - } - - bool usePbr = true; - bool gammaCorrect = false; - float litFactor = 1.0; - float ao = 1; // positionAO.a; - vec3 fragColor = albedoMetallic.rgb * ubo.ambient.rgb * ao; - for ( uint i = 0; i < LIGHTS; ++i ) { - Light light = ubo.lights[i]; - - if ( light.power <= 0.001 ) continue; - vec3 lightPositionWorld = light.position.xyz; - light.position.xyz = vec3(ubo.matrices.view[inPushConstantPass] * vec4(light.position.xyz, 1)); - if ( light.type < 0 ) { - float factor = shadowFactor( light, i ); - if ( factor <= 0.0001 ) continue; - light.power *= factor; - litFactor += light.power; - } - if ( usePbr ) { - pbr( light, albedoMetallic.rgb, albedoMetallic.a, normalRoughness.a, lightPositionWorld, fragColor ); - } else - phong( light, albedoMetallic, fragColor ); - } - - if ( gammaCorrect ) { - fragColor = fragColor / (fragColor + vec3(1.0)); - fragColor = pow(fragColor, vec3(1.0/2.2)); - } - - fog(fragColor, litFactor); - -/* - if ( (ubo.mode.type & (0x1 << 0)) == (0x1 << 0) ) { - //dither1(fragColor); - fragColor += dither2(); - } - if ( (ubo.mode.type & (0x1 << 1)) == (0x1 << 1) ) { - whitenoise(fragColor); - } -*/ - outFragColor = vec4(fragColor,1); -} \ No newline at end of file diff --git a/bin/data/shaders/display.subpass.vert.glsl b/bin/data/shaders/display.subpass.vert.glsl deleted file mode 100644 index 72ebf0a1..00000000 --- a/bin/data/shaders/display.subpass.vert.glsl +++ /dev/null @@ -1,24 +0,0 @@ -#version 450 - -layout (location = 0) in vec2 inPos; -layout (location = 1) in vec2 inUv; - -layout (location = 0) out vec2 outUv; -layout (location = 1) out flat uint outPushConstantPass; - -layout( push_constant ) uniform PushBlock { - uint pass; - uint draw; -} PushConstant; - -out gl_PerVertex { - vec4 gl_Position; -}; - - -void main() { - outUv = inUv; - outPushConstantPass = PushConstant.pass; - - gl_Position = vec4(inPos.xy, 0.0, 1.0); -} \ No newline at end of file diff --git a/bin/data/shaders/display.vert.glsl b/bin/data/shaders/display.vert.glsl index 9d3a6de8..9255a247 100644 --- a/bin/data/shaders/display.vert.glsl +++ b/bin/data/shaders/display.vert.glsl @@ -3,6 +3,10 @@ layout (location = 0) in vec2 inPos; layout (location = 1) in vec2 inUv; +layout (binding = 0) uniform UBO { + vec2 screenSize; +} ubo; + layout (location = 0) out vec2 outUv; out gl_PerVertex { diff --git a/bin/data/shaders/gltf.frag.glsl b/bin/data/shaders/gltf.frag.glsl deleted file mode 100644 index 60975ea9..00000000 --- a/bin/data/shaders/gltf.frag.glsl +++ /dev/null @@ -1,139 +0,0 @@ -#version 450 - -#define UF_DEFERRED_SAMPLING 0 -#define UF_CAN_DISCARD 1 - -layout (constant_id = 0) const uint TEXTURES = 1; -layout (binding = 0) uniform sampler2D samplerTextures[TEXTURES]; - -struct Material { - vec4 colorBase; - vec4 colorEmissive; - - float factorMetallic; - float factorRoughness; - float factorOcclusion; - float factorAlphaCutoff; - - int indexAlbedo; - int indexNormal; - int indexEmissive; - int indexOcclusion; - - int indexMetallicRoughness; - int modeAlpha; - int padding1; - int padding2; -}; -struct Texture { - int index; - int samp; - int remap; - float blend; - - vec4 lerp; -}; -layout (std140, binding = 1) readonly buffer Materials { - Material materials[]; -}; -layout (std140, binding = 2) readonly buffer Textures { - Texture textures[]; -}; - -layout (location = 0) in vec2 inUv; -layout (location = 1) in vec4 inColor; -layout (location = 2) in vec3 inNormal; -layout (location = 3) in mat3 inTBN; -layout (location = 6) in vec3 inPosition; -layout (location = 7) flat in ivec4 inId; - -layout (location = 0) out uvec2 outId; -layout (location = 1) out vec2 outNormals; -#if UF_DEFERRED_SAMPLING - layout (location = 2) out vec2 outUvs; -#else - layout (location = 2) out vec4 outAlbedo; -#endif - -vec2 encodeNormals( vec3 n ) { - float p = sqrt(n.z*8+8); - return n.xy/p + 0.5; -} - -float wrap( float i ) { - return fract(i); -} -vec2 wrap( vec2 uv ) { - return vec2( wrap( uv.x ), wrap( uv.y ) ); -} -float mipLevel( in vec2 uv ) { - vec2 dx_vtc = dFdx(uv); - vec2 dy_vtc = dFdy(uv); - return 0.5 * log2(max(dot(dx_vtc, dx_vtc), dot(dy_vtc, dy_vtc))); -} -bool validTextureIndex( int textureIndex ) { - return 0 <= textureIndex && textureIndex < TEXTURES; -} -void main() { - float mip = mipLevel(inUv.xy); - vec2 uv = wrap(inUv.xy); - vec4 C = vec4(0, 0, 0, 0); - vec3 P = inPosition; - vec3 N = inNormal; -#if UF_DEFERRED_SAMPLING - outUvs = wrap(inUv.xy); - vec4 outAlbedo = vec4(0,0,0,0); -#endif -#if !UF_DEFERRED_SAMPLING || UF_CAN_DISCARD - int materialId = int(inId.y); - Material material = materials[materialId]; - - float M = material.factorMetallic; - float R = material.factorRoughness; - float AO = material.factorOcclusion; - - // sample albedo - if ( !validTextureIndex( material.indexAlbedo ) ) discard; { - Texture t = textures[material.indexAlbedo + 1]; - C = textureLod( samplerTextures[0], mix( t.lerp.xy, t.lerp.zw, uv ), mip ); - // alpha mode OPAQUE - if ( material.modeAlpha == 0 ) { - C.a = 1; - // alpha mode BLEND - } else if ( material.modeAlpha == 1 ) { - - // alpha mode MASK - } else if ( material.modeAlpha == 2 ) { - if ( C.a < abs(material.factorAlphaCutoff) ) discard; - C.a = 1; - } - } -#endif - -#if !UF_DEFERRED_SAMPLING - // sample normal - if ( validTextureIndex( material.indexNormal ) ) { - Texture t = textures[material.indexNormal + 1]; - N = inTBN * normalize( textureLod( samplerTextures[0], mix( t.lerp.xy, t.lerp.zw, uv ), mip ).xyz * 2.0 - vec3(1.0)); - } - -#if 0 - // sample metallic/roughness - if ( validTextureIndex( material.indexMetallicRoughness ) ) { - Texture t = textures[material.indexMetallicRoughness + 1]; - vec4 sampled = texture( samplerTextures[0], mix( t.lerp.xy, t.lerp.zw, uv ), mip ); - M = sampled.b; - R = sampled.g; - } - // sample ao - AO = material.factorOcclusion; - if ( validTextureIndex( material.indexOcclusion ) ) { - Texture t = textures[material.indexMetallicRoughness + 1]; - AO = texture( samplerTextures[0], mix( t.lerp.xy, t.lerp.zw, uv ) ).r; - } -#endif - outAlbedo = C * inColor; -#endif - outNormals = encodeNormals( N ); - outId = ivec2(inId.w+1, inId.y+1); -} \ No newline at end of file diff --git a/bin/data/shaders/gltf.instanced.vert.glsl b/bin/data/shaders/gltf.instanced.vert.glsl deleted file mode 100644 index 8af8a834..00000000 --- a/bin/data/shaders/gltf.instanced.vert.glsl +++ /dev/null @@ -1,62 +0,0 @@ -#version 450 - -layout (constant_id = 0) const uint PASSES = 6; -layout (location = 0) in vec3 inPos; -layout (location = 1) in vec2 inUv; -layout (location = 2) in vec3 inNormal; -layout (location = 3) in vec4 inTangent; -layout (location = 4) in ivec2 inId; - -layout( push_constant ) uniform PushBlock { - uint pass; - uint draw; -} PushConstant; - -layout (binding = 3) uniform UBO { - mat4 view[PASSES]; - mat4 projection[PASSES]; -} ubo; - -layout (std140, binding = 4) readonly buffer Models { - mat4 models[]; -}; - -layout (location = 0) out vec2 outUv; -layout (location = 1) out vec4 outColor; -layout (location = 2) out vec3 outNormal; -layout (location = 3) out mat3 outTBN; -layout (location = 6) out vec3 outPosition; -layout (location = 7) out ivec4 outId; - -out gl_PerVertex { - vec4 gl_Position; -}; - -vec4 snap(vec4 vertex, vec2 resolution) { - vec4 snappedPos = vertex; - snappedPos.xyz = vertex.xyz / vertex.w; - snappedPos.xy = floor(resolution * snappedPos.xy) / resolution; - snappedPos.xyz *= vertex.w; - return snappedPos; -} - -void main() { - outUv = inUv; - outColor = vec4(1.0); - outId = ivec4(inId, PushConstant.pass, PushConstant.draw); - - mat4 model = models.length() <= 0 ? mat4(1.0) : models[int(inId.x)]; - outPosition = vec3(ubo.view[PushConstant.pass] * model * vec4(inPos.xyz, 1.0)); - outNormal = vec3(ubo.view[PushConstant.pass] * model * vec4(inNormal.xyz, 0.0)); - outNormal = normalize(outNormal); - - { - vec3 T = vec3(ubo.view[PushConstant.pass] * model * vec4(inTangent.xyz, 0.0)); - vec3 N = outNormal; - vec3 B = cross(N, T) * inTangent.w; - outTBN = mat3( T, B, N ); - } - - gl_Position = ubo.projection[PushConstant.pass] * ubo.view[PushConstant.pass] * model * vec4(inPos.xyz, 1.0); -// gl_Position = snap( gl_Position, vec2(256.0, 224.0) ); -} \ No newline at end of file diff --git a/bin/data/shaders/gltf.skinned.instanced.vert.glsl b/bin/data/shaders/gltf.skinned.instanced.vert.glsl deleted file mode 100644 index 204bc6ad..00000000 --- a/bin/data/shaders/gltf.skinned.instanced.vert.glsl +++ /dev/null @@ -1,74 +0,0 @@ -#version 450 - -layout (constant_id = 0) const uint PASSES = 6; -layout (location = 0) in vec3 inPos; -layout (location = 1) in vec2 inUv; -layout (location = 2) in vec3 inNormal; -layout (location = 3) in vec4 inTangent; -layout (location = 4) in ivec2 inId; -layout (location = 5) in vec4 inJoints; -layout (location = 6) in vec4 inWeights; - -layout( push_constant ) uniform PushBlock { - uint pass; - uint draw; -} PushConstant; - -layout (binding = 3) uniform UBO { - mat4 view[PASSES]; - mat4 projection[PASSES]; -} ubo; - -layout (std140, binding = 4) readonly buffer Models { - mat4 models[]; -}; - -layout (std140, binding = 5) readonly buffer Joints { - mat4 joints[]; -}; - -layout (location = 0) out vec2 outUv; -layout (location = 1) out vec4 outColor; -layout (location = 2) out vec3 outNormal; -layout (location = 3) out mat3 outTBN; -layout (location = 6) out vec3 outPosition; -layout (location = 7) out ivec4 outId; - -out gl_PerVertex { - vec4 gl_Position; -}; - -vec4 snap(vec4 vertex, vec2 resolution) { - vec4 snappedPos = vertex; - snappedPos.xyz = vertex.xyz / vertex.w; - snappedPos.xy = floor(resolution * snappedPos.xy) / resolution; - snappedPos.xyz *= vertex.w; - return snappedPos; -} - -void main() { - outUv = inUv; - outColor = vec4(1.0); - outId = ivec4(inId, PushConstant.pass, PushConstant.draw); - - mat4 model = models.length() <= 0 ? mat4(1.0) : models[int(inId.x)]; - mat4 skinnedMatrix = joints.length() <= 0 ? mat4(1.0) : - inWeights.x * joints[int(inJoints.x)] + - inWeights.y * joints[int(inJoints.y)] + - inWeights.z * joints[int(inJoints.z)] + - inWeights.w * joints[int(inJoints.w)]; - - outPosition = vec3(ubo.view[PushConstant.pass] * model * skinnedMatrix * vec4(inPos.xyz, 1.0)); - outNormal = vec3(ubo.view[PushConstant.pass] * model * vec4(inNormal.xyz, 0.0)); - outNormal = normalize(outNormal); - - - { - vec3 T = vec3(ubo.view[PushConstant.pass] * model * vec4(inTangent.xyz, 0.0)); - vec3 N = outNormal; - vec3 B = cross(N, T) * inTangent.w; - outTBN = mat3( T, B, N ); - } - - gl_Position = ubo.projection[PushConstant.pass] * ubo.view[PushConstant.pass] * model * skinnedMatrix * vec4(inPos.xyz, 1.0); -} \ No newline at end of file diff --git a/bin/data/shaders/gltf.skinned.vert.glsl b/bin/data/shaders/gltf.skinned.vert.glsl deleted file mode 100644 index 6122e755..00000000 --- a/bin/data/shaders/gltf.skinned.vert.glsl +++ /dev/null @@ -1,78 +0,0 @@ -#version 450 - -layout (constant_id = 0) const uint PASSES = 6; -layout (location = 0) in vec3 inPos; -layout (location = 1) in vec2 inUv; -layout (location = 2) in vec3 inNormal; -layout (location = 3) in vec4 inTangent; -layout (location = 4) in ivec2 inId; -layout (location = 5) in vec4 inJoints; -layout (location = 6) in vec4 inWeights; - -layout( push_constant ) uniform PushBlock { - uint pass; - uint draw; -} PushConstant; - -struct Matrices { - mat4 model; - mat4 view[PASSES]; - mat4 projection[PASSES]; -}; -layout (binding = 3) uniform UBO { - Matrices matrices; - vec4 color; -} ubo; - -layout (std140, binding = 4) readonly buffer Joints { - mat4 joints[]; -}; - - -layout (location = 0) out vec2 outUv; -layout (location = 1) out vec4 outColor; -layout (location = 2) out vec3 outNormal; -layout (location = 3) out mat3 outTBN; -layout (location = 6) out vec3 outPosition; -layout (location = 7) out ivec4 outId; - -out gl_PerVertex { - vec4 gl_Position; -}; - -vec4 snap(vec4 vertex, vec2 resolution) { - vec4 snappedPos = vertex; - snappedPos.xyz = vertex.xyz / vertex.w; - snappedPos.xy = floor(resolution * snappedPos.xy) / resolution; - snappedPos.xyz *= vertex.w; - return snappedPos; -} - -void main() { - outUv = inUv; - outColor = ubo.color; - outId = ivec4(inId, PushConstant.pass, PushConstant.draw); - - mat4 skinnedMatrix = joints.length() <= 0 ? mat4(1.0) : - inWeights.x * joints[int(inJoints.x)] + - inWeights.y * joints[int(inJoints.y)] + - inWeights.z * joints[int(inJoints.z)] + - inWeights.w * joints[int(inJoints.w)]; - - outPosition = vec3(ubo.matrices.view[PushConstant.pass] * ubo.matrices.model * skinnedMatrix * vec4(inPos.xyz, 1.0)); - outNormal = vec3(ubo.matrices.view[PushConstant.pass] * ubo.matrices.model * vec4(inNormal.xyz, 0.0)); - outNormal = normalize(outNormal); - - - { - vec3 T = vec3(ubo.matrices.view[PushConstant.pass] * ubo.matrices.model * vec4(inTangent.xyz, 0.0)); - vec3 N = outNormal; - vec3 B = cross(N, T) * inTangent.w; - outTBN = mat3( T, B, N ); - } - - gl_Position = ubo.matrices.projection[PushConstant.pass] * ubo.matrices.view[PushConstant.pass] * ubo.matrices.model * skinnedMatrix * vec4(inPos.xyz, 1.0); -// gl_Position = snap( gl_Position, vec2(320.0, 240.0) ); -// gl_Position = snap( gl_Position, vec2(480.0, 270.0) ); -// gl_Position = snap( gl_Position, vec2(640.0, 480.0) ); -} \ No newline at end of file diff --git a/bin/data/shaders/gltf.vert.glsl b/bin/data/shaders/gltf.vert.glsl deleted file mode 100644 index f868b307..00000000 --- a/bin/data/shaders/gltf.vert.glsl +++ /dev/null @@ -1,64 +0,0 @@ -#version 450 - -layout (constant_id = 0) const uint PASSES = 6; -layout (location = 0) in vec3 inPos; -layout (location = 1) in vec2 inUv; -layout (location = 2) in vec3 inNormal; -layout (location = 3) in vec4 inTangent; -layout (location = 4) in ivec2 inId; - -layout( push_constant ) uniform PushBlock { - uint pass; - uint draw; -} PushConstant; - -struct Matrices { - mat4 model; - mat4 view[PASSES]; - mat4 projection[PASSES]; -}; - -layout (binding = 3) uniform UBO { - Matrices matrices; - vec4 color; -} ubo; - -layout (location = 0) out vec2 outUv; -layout (location = 1) out vec4 outColor; -layout (location = 2) out vec3 outNormal; -layout (location = 3) out mat3 outTBN; -layout (location = 6) out vec3 outPosition; -layout (location = 7) out ivec4 outId; - -out gl_PerVertex { - vec4 gl_Position; -}; - -vec4 snap(vec4 vertex, vec2 resolution) { - vec4 snappedPos = vertex; - snappedPos.xyz = vertex.xyz / vertex.w; - snappedPos.xy = floor(resolution * snappedPos.xy) / resolution; - snappedPos.xyz *= vertex.w; - return snappedPos; -} - -void main() { - outUv = inUv; - outColor = ubo.color; - outId = ivec4(inId, PushConstant.pass, PushConstant.draw); - - outPosition = vec3(ubo.matrices.view[PushConstant.pass] * ubo.matrices.model * vec4(inPos.xyz, 1.0)); - outNormal = vec3(ubo.matrices.view[PushConstant.pass] * ubo.matrices.model * vec4(inNormal.xyz, 0.0)); - outNormal = normalize(outNormal); - - - { - vec3 T = vec3(ubo.matrices.view[PushConstant.pass] * ubo.matrices.model * vec4(inTangent.xyz, 0.0)); - vec3 N = outNormal; - vec3 B = cross(N, T) * inTangent.w; - outTBN = mat3( T, B, N ); - } - - gl_Position = ubo.matrices.projection[PushConstant.pass] * ubo.matrices.view[PushConstant.pass] * ubo.matrices.model * vec4(inPos.xyz, 1.0); -// gl_Position = snap( gl_Position, vec2(320.0, 240.0) ); -} \ No newline at end of file diff --git a/bin/data/shaders/gui.dither16.frag.glsl b/bin/data/shaders/gui.dither16.frag.glsl new file mode 100644 index 00000000..fe3936df --- /dev/null +++ b/bin/data/shaders/gui.dither16.frag.glsl @@ -0,0 +1,178 @@ +#version 450 + +layout (binding = 1) uniform sampler2D samplerColor; + +struct Gui { + vec4 offset; + vec4 color; + int mode; + float depth; +}; + +layout (location = 0) in vec2 inUv; +layout (location = 1) in flat Gui inGui; +layout (location = 0) out vec4 outFragColor; + +const int indexMatrix16x16[256] = int[](0,192, 48,240, 12,204, 60,252, 3,195, 51,243, 15,207, 63,255, + 128, 64,176,112,140, 76,188,124,131, 67,179,115,143, 79,191,127, + 32,224, 16,208, 44,236, 28,220, 35,227, 19,211, 47,239, 31,223, + 160, 96,144, 80,172,108,156, 92,163, 99,147, 83,175,111,159, 95, + 8,200, 56,248, 4,196, 52,244, 11,203, 59,251, 7,199, 55,247, + 136, 72,184,120,132, 68,180,116,139, 75,187,123,135, 71,183,119, + 40,232, 24,216, 36,228, 20,212, 43,235, 27,219, 39,231, 23,215, + 168,104,152, 88,164,100,148, 84,171,107,155, 91,167,103,151, 87, + 2,194, 50,242, 14,206, 62,254, 1,193, 49,241, 13,205, 61,253, + 130, 66,178,114,142, 78,190,126,129, 65,177,113,141, 77,189,125, + 34,226, 18,210, 46,238, 30,222, 33,225, 17,209, 45,237, 29,221, + 162, 98,146, 82,174,110,158, 94,161, 97,145, 81,173,109,157, 93, + 10,202, 58,250, 6,198, 54,246, 9,201, 57,249, 5,197, 53,245, + 138, 74,186,122,134, 70,182,118,137, 73,185,121,133, 69,181,117, + 42,234, 26,218, 38,230, 22,214, 41,233, 25,217, 37,229, 21,213, + 170,106,154, 90,166,102,150, 86,169,105,153, 89,165,101,149, 85); + +float indexValue16x16() { + int x = int(mod(gl_FragCoord.x, 16)); + int y = int(mod(gl_FragCoord.y, 16)); + return indexMatrix16x16[(x + y * 16)] / 256.0; +} + +const int paletteSize = 28; +const vec3 palette[28] = vec3[]( + vec3(0, 0, 0), + vec3(0, 0, 1), + vec3(0, 0, 0.502), + vec3(0, 0, 0.753), + vec3(0, 1, 0.251), + vec3(0, 1, 0.50), + vec3(60.0/360.0, 1, 0.251), + vec3(60.0/360.0, 1, 0.5), + vec3(120.0/360.0, 1, 0.251), + vec3(120.0/360.0, 1, 0.5), + vec3(180.0/360.0, 1, 0.251), + vec3(180.0/360.0, 1, 0.5), + vec3(240.0/360.0, 1, 0.251), + vec3(240.0/360.0, 1, 0.5), + vec3(300.0/360.0, 1, 0.251), + vec3(300.0/360.0, 1, 0.5), + vec3(60.0/360.0, 0.333, 0.376), + vec3(60.0/360.0, 1, 0.751), + vec3(180.0/360.0, 1, 0.125), + vec3(150.0/360.0, 1, 0.5), + vec3(210.0/360.0, 1, 0.5), + vec3(180.0/360.0, 1, 0.751), + vec3(210.0/360.0, 1, 0.251), + vec3(240.0/360.0, 1, 0.751), + vec3(270.0/360.0, 1, 0.5), + vec3(330.0/360.0, 1, 0.5), + vec3(30.0/360.0, 1, 0.251), + vec3(24.0/360.0, 1, 0.625) +); + +vec3 hslToRgb(vec3 HSL) { + vec3 RGB; { + float H = HSL.x; + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + RGB = clamp(vec3(R,G,B), 0, 1); + } + float C = (1 - abs(2 * HSL.z - 1)) * HSL.y; + return (RGB - 0.5) * C + HSL.z; +} + +vec3 rgbToHsl(vec3 RGB) { + float Epsilon = 1e-10; + vec3 HCV; { + vec4 P = (RGB.g < RGB.b) ? vec4(RGB.bg, -1.0, 2.0/3.0) : vec4(RGB.gb, 0.0, -1.0/3.0); + vec4 Q = (RGB.r < P.x) ? vec4(P.xyw, RGB.r) : vec4(RGB.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + Epsilon) + Q.z); + HCV = vec3(H, C, Q.x); + } + float L = HCV.z - HCV.y * 0.5; + float S = HCV.y / (1 - abs(L * 2 - 1) + Epsilon); + return vec3(HCV.x, S, L); +} + +float hueDistance(float h1, float h2) { + float diff = abs((h1 - h2)); + return min(abs((1.0 - diff)), diff); +} + +vec3[2] closestColors(float hue) { + vec3 ret[2]; + vec3 closest = vec3(-2, 0, 0); + vec3 secondClosest = vec3(-2, 0, 0); + vec3 temp; + for (int i = 0; i < paletteSize; ++i) { + temp = palette[i]; + float tempDistance = hueDistance(temp.x, hue); + if (tempDistance < hueDistance(closest.x, hue)) { + secondClosest = closest; + closest = temp; + } else { + if (tempDistance < hueDistance(secondClosest.x, hue)) { + secondClosest = temp; + } + } + } + ret[0] = closest; + ret[1] = secondClosest; + return ret; +} + +const float lightnessSteps = 4.0; +float lightnessStep(float l) { + /* Quantize the lightness to one of `lightnessSteps` values */ + return floor((0.5 + l * lightnessSteps)) / lightnessSteps; +} + +vec3 dither1(vec3 color) { + vec3 hsl = rgbToHsl(color); + + vec3 cs[2] = closestColors(hsl.x); + vec3 c1 = cs[0]; + vec3 c2 = cs[1]; + float d = indexValue16x16(); + float hueDiff = hueDistance(hsl.x, c1.x) / hueDistance(c2.x, c1.x); + + float l1 = lightnessStep(max((hsl.z - 0.125), 0.0)); + float l2 = lightnessStep(min((hsl.z + 0.124), 1.0)); + float lightnessDiff = (hsl.z - l1) / (l2 - l1); + + vec3 resultColor = (hueDiff < d) ? c1 : c2; + //resultColor.z = (lightnessDiff < d) ? l1 : l2; + return hslToRgb(resultColor); +} + +float dither(float color) { + float closestColor = (color < 0.5) ? 0 : 1; + float secondClosestColor = 1 - closestColor; + float d = indexValue16x16(); + float distance = abs(closestColor - color); + return (distance < d) ? closestColor : secondClosestColor; +} + +vec3 dither(vec3 color) { + vec3 hsl = rgbToHsl(color); + + hsl.y = dither(hsl.y); + return hslToRgb(hsl); +} + +void main() { + if ( inUv.x < inGui.offset.x ) discard; + if ( inUv.y < inGui.offset.y ) discard; + if ( inUv.x > inGui.offset.z ) discard; + if ( inUv.y > inGui.offset.w ) discard; + + outFragColor = texture(samplerColor, inUv);// vec4(inUv.s, inUv.t, 1.0, 1.0); + if ( outFragColor.a < 0.001 ) discard; + if ( inGui.mode == 1 ) { + outFragColor = inGui.color; + } else { + outFragColor *= inGui.color; + } + + outFragColor.rgb = dither(outFragColor.rgb); +} \ No newline at end of file diff --git a/bin/data/shaders/gui.dither4.frag.glsl b/bin/data/shaders/gui.dither4.frag.glsl new file mode 100644 index 00000000..59283116 --- /dev/null +++ b/bin/data/shaders/gui.dither4.frag.glsl @@ -0,0 +1,166 @@ +#version 450 + +layout (binding = 1) uniform sampler2D samplerColor; + +struct Gui { + vec4 offset; + vec4 color; + int mode; + float depth; +}; + +layout (location = 0) in vec2 inUv; +layout (location = 1) in flat Gui inGui; +layout (location = 0) out vec4 outFragColor; + +const int indexMatrix4x4[16] = int[](0, 8, 2, 10, + 12, 4, 14, 6, + 3, 11, 1, 9, + 15, 7, 13, 5); + +float indexValue4x4() { + int x = int(mod(gl_FragCoord.x, 4)); + int y = int(mod(gl_FragCoord.y, 4)); + return indexMatrix4x4[(x + y * 4)] / 16.0; +} + +const int paletteSize = 28; +const vec3 palette[28] = vec3[]( + vec3(0, 0, 0), + vec3(0, 0, 1), + vec3(0, 0, 0.502), + vec3(0, 0, 0.753), + vec3(0, 1, 0.251), + vec3(0, 1, 0.50), + vec3(60.0/360.0, 1, 0.251), + vec3(60.0/360.0, 1, 0.5), + vec3(120.0/360.0, 1, 0.251), + vec3(120.0/360.0, 1, 0.5), + vec3(180.0/360.0, 1, 0.251), + vec3(180.0/360.0, 1, 0.5), + vec3(240.0/360.0, 1, 0.251), + vec3(240.0/360.0, 1, 0.5), + vec3(300.0/360.0, 1, 0.251), + vec3(300.0/360.0, 1, 0.5), + vec3(60.0/360.0, 0.333, 0.376), + vec3(60.0/360.0, 1, 0.751), + vec3(180.0/360.0, 1, 0.125), + vec3(150.0/360.0, 1, 0.5), + vec3(210.0/360.0, 1, 0.5), + vec3(180.0/360.0, 1, 0.751), + vec3(210.0/360.0, 1, 0.251), + vec3(240.0/360.0, 1, 0.751), + vec3(270.0/360.0, 1, 0.5), + vec3(330.0/360.0, 1, 0.5), + vec3(30.0/360.0, 1, 0.251), + vec3(24.0/360.0, 1, 0.625) +); + +vec3 hslToRgb(vec3 HSL) { + vec3 RGB; { + float H = HSL.x; + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + RGB = clamp(vec3(R,G,B), 0, 1); + } + float C = (1 - abs(2 * HSL.z - 1)) * HSL.y; + return (RGB - 0.5) * C + HSL.z; +} + +vec3 rgbToHsl(vec3 RGB) { + float Epsilon = 1e-10; + vec3 HCV; { + vec4 P = (RGB.g < RGB.b) ? vec4(RGB.bg, -1.0, 2.0/3.0) : vec4(RGB.gb, 0.0, -1.0/3.0); + vec4 Q = (RGB.r < P.x) ? vec4(P.xyw, RGB.r) : vec4(RGB.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + Epsilon) + Q.z); + HCV = vec3(H, C, Q.x); + } + float L = HCV.z - HCV.y * 0.5; + float S = HCV.y / (1 - abs(L * 2 - 1) + Epsilon); + return vec3(HCV.x, S, L); +} + +float hueDistance(float h1, float h2) { + float diff = abs((h1 - h2)); + return min(abs((1.0 - diff)), diff); +} + +vec3[2] closestColors(float hue) { + vec3 ret[2]; + vec3 closest = vec3(-2, 0, 0); + vec3 secondClosest = vec3(-2, 0, 0); + vec3 temp; + for (int i = 0; i < paletteSize; ++i) { + temp = palette[i]; + float tempDistance = hueDistance(temp.x, hue); + if (tempDistance < hueDistance(closest.x, hue)) { + secondClosest = closest; + closest = temp; + } else { + if (tempDistance < hueDistance(secondClosest.x, hue)) { + secondClosest = temp; + } + } + } + ret[0] = closest; + ret[1] = secondClosest; + return ret; +} + +const float lightnessSteps = 4.0; +float lightnessStep(float l) { + /* Quantize the lightness to one of `lightnessSteps` values */ + return floor((0.5 + l * lightnessSteps)) / lightnessSteps; +} + +vec3 dither1(vec3 color) { + vec3 hsl = rgbToHsl(color); + + vec3 cs[2] = closestColors(hsl.x); + vec3 c1 = cs[0]; + vec3 c2 = cs[1]; + float d = indexValue4x4(); + float hueDiff = hueDistance(hsl.x, c1.x) / hueDistance(c2.x, c1.x); + + float l1 = lightnessStep(max((hsl.z - 0.125), 0.0)); + float l2 = lightnessStep(min((hsl.z + 0.124), 1.0)); + float lightnessDiff = (hsl.z - l1) / (l2 - l1); + + vec3 resultColor = (hueDiff < d) ? c1 : c2; + //resultColor.z = (lightnessDiff < d) ? l1 : l2; + return hslToRgb(resultColor); +} + +float dither(float color) { + float closestColor = (color < 0.5) ? 0 : 1; + float secondClosestColor = 1 - closestColor; + float d = indexValue4x4(); + float distance = abs(closestColor - color); + return (distance < d) ? closestColor : secondClosestColor; +} + +vec3 dither(vec3 color) { + vec3 hsl = rgbToHsl(color); + + hsl.y = dither(hsl.y); + return hslToRgb(hsl); +} + +void main() { + if ( inUv.x < inGui.offset.x ) discard; + if ( inUv.y < inGui.offset.y ) discard; + if ( inUv.x > inGui.offset.z ) discard; + if ( inUv.y > inGui.offset.w ) discard; + + outFragColor = texture(samplerColor, inUv);// vec4(inUv.s, inUv.t, 1.0, 1.0); + if ( outFragColor.a < 0.001 ) discard; + if ( inGui.mode == 1 ) { + outFragColor = inGui.color; + } else { + outFragColor *= inGui.color; + } + + outFragColor.rgb = dither(outFragColor.rgb); +} \ No newline at end of file diff --git a/bin/data/shaders/gui.dither8.frag.glsl b/bin/data/shaders/gui.dither8.frag.glsl new file mode 100644 index 00000000..c91f823e --- /dev/null +++ b/bin/data/shaders/gui.dither8.frag.glsl @@ -0,0 +1,170 @@ +#version 450 + +layout (binding = 1) uniform sampler2D samplerColor; + +struct Gui { + vec4 offset; + vec4 color; + int mode; + float depth; +}; + +layout (location = 0) in vec2 inUv; +layout (location = 1) in flat Gui inGui; +layout (location = 0) out vec4 outFragColor; + +const int indexMatrix8x8[64] = int[](0, 32, 8, 40, 2, 34, 10, 42, + 48, 16, 56, 24, 50, 18, 58, 26, + 12, 44, 4, 36, 14, 46, 6, 38, + 60, 28, 52, 20, 62, 30, 54, 22, + 3, 35, 11, 43, 1, 33, 9, 41, + 51, 19, 59, 27, 49, 17, 57, 25, + 15, 47, 7, 39, 13, 45, 5, 37, + 63, 31, 55, 23, 61, 29, 53, 21); + +float indexValue8x8() { + int x = int(mod(gl_FragCoord.x, 8)); + int y = int(mod(gl_FragCoord.y, 8)); + return indexMatrix8x8[(x + y * 8)] / 64.0; +} + +const int paletteSize = 28; +const vec3 palette[28] = vec3[]( + vec3(0, 0, 0), + vec3(0, 0, 1), + vec3(0, 0, 0.502), + vec3(0, 0, 0.753), + vec3(0, 1, 0.251), + vec3(0, 1, 0.50), + vec3(60.0/360.0, 1, 0.251), + vec3(60.0/360.0, 1, 0.5), + vec3(120.0/360.0, 1, 0.251), + vec3(120.0/360.0, 1, 0.5), + vec3(180.0/360.0, 1, 0.251), + vec3(180.0/360.0, 1, 0.5), + vec3(240.0/360.0, 1, 0.251), + vec3(240.0/360.0, 1, 0.5), + vec3(300.0/360.0, 1, 0.251), + vec3(300.0/360.0, 1, 0.5), + vec3(60.0/360.0, 0.333, 0.376), + vec3(60.0/360.0, 1, 0.751), + vec3(180.0/360.0, 1, 0.125), + vec3(150.0/360.0, 1, 0.5), + vec3(210.0/360.0, 1, 0.5), + vec3(180.0/360.0, 1, 0.751), + vec3(210.0/360.0, 1, 0.251), + vec3(240.0/360.0, 1, 0.751), + vec3(270.0/360.0, 1, 0.5), + vec3(330.0/360.0, 1, 0.5), + vec3(30.0/360.0, 1, 0.251), + vec3(24.0/360.0, 1, 0.625) +); + +vec3 hslToRgb(vec3 HSL) { + vec3 RGB; { + float H = HSL.x; + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + RGB = clamp(vec3(R,G,B), 0, 1); + } + float C = (1 - abs(2 * HSL.z - 1)) * HSL.y; + return (RGB - 0.5) * C + HSL.z; +} + +vec3 rgbToHsl(vec3 RGB) { + float Epsilon = 1e-10; + vec3 HCV; { + vec4 P = (RGB.g < RGB.b) ? vec4(RGB.bg, -1.0, 2.0/3.0) : vec4(RGB.gb, 0.0, -1.0/3.0); + vec4 Q = (RGB.r < P.x) ? vec4(P.xyw, RGB.r) : vec4(RGB.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + Epsilon) + Q.z); + HCV = vec3(H, C, Q.x); + } + float L = HCV.z - HCV.y * 0.5; + float S = HCV.y / (1 - abs(L * 2 - 1) + Epsilon); + return vec3(HCV.x, S, L); +} + +float hueDistance(float h1, float h2) { + float diff = abs((h1 - h2)); + return min(abs((1.0 - diff)), diff); +} + +vec3[2] closestColors(float hue) { + vec3 ret[2]; + vec3 closest = vec3(-2, 0, 0); + vec3 secondClosest = vec3(-2, 0, 0); + vec3 temp; + for (int i = 0; i < paletteSize; ++i) { + temp = palette[i]; + float tempDistance = hueDistance(temp.x, hue); + if (tempDistance < hueDistance(closest.x, hue)) { + secondClosest = closest; + closest = temp; + } else { + if (tempDistance < hueDistance(secondClosest.x, hue)) { + secondClosest = temp; + } + } + } + ret[0] = closest; + ret[1] = secondClosest; + return ret; +} + +const float lightnessSteps = 4.0; +float lightnessStep(float l) { + /* Quantize the lightness to one of `lightnessSteps` values */ + return floor((0.5 + l * lightnessSteps)) / lightnessSteps; +} + +vec3 dither1(vec3 color) { + vec3 hsl = rgbToHsl(color); + + vec3 cs[2] = closestColors(hsl.x); + vec3 c1 = cs[0]; + vec3 c2 = cs[1]; + float d = indexValue8x8(); + float hueDiff = hueDistance(hsl.x, c1.x) / hueDistance(c2.x, c1.x); + + float l1 = lightnessStep(max((hsl.z - 0.125), 0.0)); + float l2 = lightnessStep(min((hsl.z + 0.124), 1.0)); + float lightnessDiff = (hsl.z - l1) / (l2 - l1); + + vec3 resultColor = (hueDiff < d) ? c1 : c2; + //resultColor.z = (lightnessDiff < d) ? l1 : l2; + return hslToRgb(resultColor); +} + +float dither(float color) { + float closestColor = (color < 0.5) ? 0 : 1; + float secondClosestColor = 1 - closestColor; + float d = indexValue8x8(); + float distance = abs(closestColor - color); + return (distance < d) ? closestColor : secondClosestColor; +} + +vec3 dither(vec3 color) { + vec3 hsl = rgbToHsl(color); + + hsl.y = dither(hsl.y); + return hslToRgb(hsl); +} + +void main() { + if ( inUv.x < inGui.offset.x ) discard; + if ( inUv.y < inGui.offset.y ) discard; + if ( inUv.x > inGui.offset.z ) discard; + if ( inUv.y > inGui.offset.w ) discard; + + outFragColor = texture(samplerColor, inUv);// vec4(inUv.s, inUv.t, 1.0, 1.0); + if ( outFragColor.a < 0.001 ) discard; + if ( inGui.mode == 1 ) { + outFragColor = inGui.color; + } else { + outFragColor *= inGui.color; + } + + outFragColor.rgb = dither(outFragColor.rgb); +} \ No newline at end of file diff --git a/bin/data/shaders/gui.frag.glsl b/bin/data/shaders/gui.frag.glsl index 1dc5485a..3e683c5c 100644 --- a/bin/data/shaders/gui.frag.glsl +++ b/bin/data/shaders/gui.frag.glsl @@ -1,38 +1,17 @@ #version 450 -#define UF_DEFERRED_SAMPLING 0 -#define UF_CAN_DISCARD 1 - -layout (binding = 1) uniform sampler2D samplerTexture; +layout (binding = 1) uniform sampler2D samplerColor; struct Gui { vec4 offset; vec4 color; int mode; float depth; - vec2 padding; }; layout (location = 0) in vec2 inUv; layout (location = 1) in flat Gui inGui; - -layout (location = 0) out uvec2 outId; -layout (location = 1) out vec2 outNormals; -#if UF_DEFERRED_SAMPLING - layout (location = 2) out vec2 outUvs; -#else - layout (location = 2) out vec4 outAlbedo; -#endif - -vec2 encodeNormals( vec3 n ) { - float p = sqrt(n.z*8+8); - return n.xy/p + 0.5; -} -float mipLevel( in vec2 uv ) { - vec2 dx_vtc = dFdx(uv); - vec2 dy_vtc = dFdy(uv); - return 0.5 * log2(max(dot(dx_vtc, dx_vtc), dot(dy_vtc, dy_vtc))); -} +layout (location = 0) out vec4 outFragColor; void main() { if ( inUv.x < inGui.offset.x ) discard; @@ -40,27 +19,11 @@ void main() { if ( inUv.x > inGui.offset.z ) discard; if ( inUv.y > inGui.offset.w ) discard; - float mip = mipLevel(inUv.xy); - vec2 uv = inUv.xy; - vec4 C = vec4(1, 1, 1, 1); - //vec3 N = inNormal; -#if UF_DEFERRED_SAMPLING - outUvs = wrap(inUv.xy); - vec4 outAlbedo = vec4(0,0,0,0); -#endif -#if !UF_DEFERRED_SAMPLING || UF_CAN_DISCARD - C = textureLod( samplerTexture, uv, mip ); -#endif -#if !UF_DEFERRED_SAMPLING + outFragColor = texture(samplerColor, inUv);// vec4(inUv.s, inUv.t, 1.0, 1.0); + if ( outFragColor.a < 0.001 ) discard; if ( inGui.mode == 1 ) { - C = inGui.color; + outFragColor = inGui.color; } else { - C *= inGui.color; + outFragColor *= inGui.color; } - outAlbedo = C; -#endif -/* - outNormals = encodeNormals( N ); - outId = ivec2(0, 0); -*/ } \ No newline at end of file diff --git a/bin/data/shaders/gui.gradient.frag.glsl b/bin/data/shaders/gui.gradient.frag.glsl new file mode 100644 index 00000000..15683736 --- /dev/null +++ b/bin/data/shaders/gui.gradient.frag.glsl @@ -0,0 +1,38 @@ +#version 450 + +layout (binding = 1) uniform sampler2D samplerColor; + +struct Gui { + vec4 offset; + vec4 color; + int mode; + float depth; +}; + +layout (location = 0) in vec2 inUv; +layout (location = 1) in flat Gui inGui; +layout (location = 0) out vec4 outFragColor; + +void main() { + if ( inUv.x < inGui.offset.x ) discard; + if ( inUv.y < inGui.offset.y ) discard; + if ( inUv.x > inGui.offset.z ) discard; + if ( inUv.y > inGui.offset.w ) discard; + + outFragColor = texture(samplerColor, inUv);// vec4(inUv.s, inUv.t, 1.0, 1.0); + if ( outFragColor.a < 0.001 ) discard; + + if ( inGui.mode == 1 ) { + outFragColor = inGui.color; + } else { + outFragColor *= inGui.color; + } + + float end = 0.25; + if ( inUv.x < end ) { + outFragColor.a = inUv.x / end; + } else if ( inUv.x + end >= 1 ) { + float offset = (1 - inUv.x); + outFragColor.a = offset / end; + } +} \ No newline at end of file diff --git a/bin/data/shaders/display.rendertarget.vert.glsl b/bin/data/shaders/gui.stereo.vert.glsl similarity index 60% rename from bin/data/shaders/display.rendertarget.vert.glsl rename to bin/data/shaders/gui.stereo.vert.glsl index c90a0fb3..25e6dbdb 100644 --- a/bin/data/shaders/display.rendertarget.vert.glsl +++ b/bin/data/shaders/gui.stereo.vert.glsl @@ -3,39 +3,36 @@ layout (location = 0) in vec2 inPos; layout (location = 1) in vec2 inUv; -struct Cursor { - vec2 position; - vec2 radius; - vec4 color; -}; - -layout (location = 0) out vec2 outUv; -layout (location = 1) out float outAlpha; -layout (location = 2) out flat Cursor outCursor; - layout( push_constant ) uniform PushBlock { uint pass; - uint draw; } PushConstant; +struct Matrices { + mat4 model[2]; +}; +struct Gui { + vec4 offset; + vec4 color; + int mode; + float depth; +}; + +layout (binding = 0) uniform UBO { + Matrices matrices; + Gui gui; +} ubo; + +layout (location = 0) out vec2 outUv; +layout (location = 1) out flat Gui outGui; + out gl_PerVertex { vec4 gl_Position; }; -struct Matrices { - mat4 model[2]; -}; -layout (binding = 0) uniform UBO { - Matrices matrices; - Cursor cursor; -// float alpha; -// float padding; -} ubo; void main() { outUv = inUv; - outCursor = ubo.cursor; - outAlpha = 1; + outGui = ubo.gui; - gl_Position = ubo.matrices.model[PushConstant.pass] * vec4(inPos.xy, 0.0, 1.0); + gl_Position = ubo.matrices.model[PushConstant.pass] * vec4(inPos.xy, ubo.gui.depth, 1.0); } \ No newline at end of file diff --git a/bin/data/shaders/gui.text.dither16.frag.glsl b/bin/data/shaders/gui.text.dither16.frag.glsl new file mode 100644 index 00000000..3a33ff91 --- /dev/null +++ b/bin/data/shaders/gui.text.dither16.frag.glsl @@ -0,0 +1,196 @@ +#version 450 + +layout (binding = 1) uniform sampler2D samplerColor; + +struct Gui { + vec4 offset; + vec4 color; + int mode; + float depth; + int sdf; + int shadowbox; + vec4 stroke; + float weight; + int spread; + float scale; +}; + +layout (location = 0) in vec2 inUv; +layout (location = 1) in flat Gui inGui; +layout (location = 0) out vec4 outFragColor; + +const int indexMatrix16x16[256] = int[](0,192, 48,240, 12,204, 60,252, 3,195, 51,243, 15,207, 63,255, + 128, 64,176,112,140, 76,188,124,131, 67,179,115,143, 79,191,127, + 32,224, 16,208, 44,236, 28,220, 35,227, 19,211, 47,239, 31,223, + 160, 96,144, 80,172,108,156, 92,163, 99,147, 83,175,111,159, 95, + 8,200, 56,248, 4,196, 52,244, 11,203, 59,251, 7,199, 55,247, + 136, 72,184,120,132, 68,180,116,139, 75,187,123,135, 71,183,119, + 40,232, 24,216, 36,228, 20,212, 43,235, 27,219, 39,231, 23,215, + 168,104,152, 88,164,100,148, 84,171,107,155, 91,167,103,151, 87, + 2,194, 50,242, 14,206, 62,254, 1,193, 49,241, 13,205, 61,253, + 130, 66,178,114,142, 78,190,126,129, 65,177,113,141, 77,189,125, + 34,226, 18,210, 46,238, 30,222, 33,225, 17,209, 45,237, 29,221, + 162, 98,146, 82,174,110,158, 94,161, 97,145, 81,173,109,157, 93, + 10,202, 58,250, 6,198, 54,246, 9,201, 57,249, 5,197, 53,245, + 138, 74,186,122,134, 70,182,118,137, 73,185,121,133, 69,181,117, + 42,234, 26,218, 38,230, 22,214, 41,233, 25,217, 37,229, 21,213, + 170,106,154, 90,166,102,150, 86,169,105,153, 89,165,101,149, 85); + +float indexValue16x16() { + int x = int(mod(gl_FragCoord.x, 16)); + int y = int(mod(gl_FragCoord.y, 16)); + return indexMatrix16x16[(x + y * 16)] / 256.0; +} + +const int paletteSize = 28; +const vec3 palette[28] = vec3[]( + vec3(0, 0, 0), + vec3(0, 0, 1), + vec3(0, 0, 0.502), + vec3(0, 0, 0.753), + vec3(0, 1, 0.251), + vec3(0, 1, 0.50), + vec3(60.0/360.0, 1, 0.251), + vec3(60.0/360.0, 1, 0.5), + vec3(120.0/360.0, 1, 0.251), + vec3(120.0/360.0, 1, 0.5), + vec3(180.0/360.0, 1, 0.251), + vec3(180.0/360.0, 1, 0.5), + vec3(240.0/360.0, 1, 0.251), + vec3(240.0/360.0, 1, 0.5), + vec3(300.0/360.0, 1, 0.251), + vec3(300.0/360.0, 1, 0.5), + vec3(60.0/360.0, 0.333, 0.376), + vec3(60.0/360.0, 1, 0.751), + vec3(180.0/360.0, 1, 0.125), + vec3(150.0/360.0, 1, 0.5), + vec3(210.0/360.0, 1, 0.5), + vec3(180.0/360.0, 1, 0.751), + vec3(210.0/360.0, 1, 0.251), + vec3(240.0/360.0, 1, 0.751), + vec3(270.0/360.0, 1, 0.5), + vec3(330.0/360.0, 1, 0.5), + vec3(30.0/360.0, 1, 0.251), + vec3(24.0/360.0, 1, 0.625) +); + +vec3 hslToRgb(vec3 HSL) { + vec3 RGB; { + float H = HSL.x; + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + RGB = clamp(vec3(R,G,B), 0, 1); + } + float C = (1 - abs(2 * HSL.z - 1)) * HSL.y; + return (RGB - 0.5) * C + HSL.z; +} + +vec3 rgbToHsl(vec3 RGB) { + float Epsilon = 1e-10; + vec3 HCV; { + vec4 P = (RGB.g < RGB.b) ? vec4(RGB.bg, -1.0, 2.0/3.0) : vec4(RGB.gb, 0.0, -1.0/3.0); + vec4 Q = (RGB.r < P.x) ? vec4(P.xyw, RGB.r) : vec4(RGB.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + Epsilon) + Q.z); + HCV = vec3(H, C, Q.x); + } + float L = HCV.z - HCV.y * 0.5; + float S = HCV.y / (1 - abs(L * 2 - 1) + Epsilon); + return vec3(HCV.x, S, L); +} + +float hueDistance(float h1, float h2) { + float diff = abs((h1 - h2)); + return min(abs((1.0 - diff)), diff); +} + +vec3[2] closestColors(float hue) { + vec3 ret[2]; + vec3 closest = vec3(-2, 0, 0); + vec3 secondClosest = vec3(-2, 0, 0); + vec3 temp; + for (int i = 0; i < paletteSize; ++i) { + temp = palette[i]; + float tempDistance = hueDistance(temp.x, hue); + if (tempDistance < hueDistance(closest.x, hue)) { + secondClosest = closest; + closest = temp; + } else { + if (tempDistance < hueDistance(secondClosest.x, hue)) { + secondClosest = temp; + } + } + } + ret[0] = closest; + ret[1] = secondClosest; + return ret; +} + +const float lightnessSteps = 4.0; +float lightnessStep(float l) { + /* Quantize the lightness to one of `lightnessSteps` values */ + return floor((0.5 + l * lightnessSteps)) / lightnessSteps; +} + +vec3 dither1(vec3 color) { + vec3 hsl = rgbToHsl(color); + + vec3 cs[2] = closestColors(hsl.x); + vec3 c1 = cs[0]; + vec3 c2 = cs[1]; + float d = indexValue16x16(); + float hueDiff = hueDistance(hsl.x, c1.x) / hueDistance(c2.x, c1.x); + + float l1 = lightnessStep(max((hsl.z - 0.125), 0.0)); + float l2 = lightnessStep(min((hsl.z + 0.124), 1.0)); + float lightnessDiff = (hsl.z - l1) / (l2 - l1); + + vec3 resultColor = (hueDiff < d) ? c1 : c2; + //resultColor.z = (lightnessDiff < d) ? l1 : l2; + return hslToRgb(resultColor); +} + +float dither(float color) { + float closestColor = (color < 0.5) ? 0 : 1; + float secondClosestColor = 1 - closestColor; + float d = indexValue16x16(); + float distance = abs(closestColor - color); + return (distance < d) ? closestColor : secondClosestColor; +} + +vec3 dither(vec3 color) { + vec3 hsl = rgbToHsl(color); + + hsl.y = dither(hsl.y); + return hslToRgb(hsl); +} + +void main() { + if ( inUv.x < inGui.offset.x ) discard; + if ( inUv.y < inGui.offset.y ) discard; + if ( inUv.x > inGui.offset.z ) discard; + if ( inUv.y > inGui.offset.w ) discard; + + if ( inGui.shadowbox == 1 ) { + outFragColor = inGui.color; + return; + } + float dist = texture(samplerColor, inUv).r; + if ( inGui.sdf == 1 ) { + float smoothing = ( inGui.spread > 0 && inGui.scale > 0 ) ? 0.25 / (inGui.spread * inGui.scale) : 0.25 / (4 * 1.5); + float outlining = smoothstep(0.5 - smoothing, 0.5 + smoothing, dist); + float alpha = smoothstep(inGui.weight - smoothing, inGui.weight + smoothing, dist); + vec4 c = inGui.color; + outFragColor = mix(inGui.stroke, c, outlining); + outFragColor.a = inGui.color.a * alpha; + if ( alpha < 0.001 ) discard; + if ( alpha > 1 ) discard; + } else { + outFragColor = vec4(inGui.color) * dist; + if ( dist < 0.001 ) discard; + if ( dist > 1 ) discard; + } + + outFragColor.rgb = dither(outFragColor.rgb); +} \ No newline at end of file diff --git a/bin/data/shaders/gui.text.dither4.frag.glsl b/bin/data/shaders/gui.text.dither4.frag.glsl new file mode 100644 index 00000000..10a8ad2f --- /dev/null +++ b/bin/data/shaders/gui.text.dither4.frag.glsl @@ -0,0 +1,185 @@ +#version 450 + +layout (binding = 1) uniform sampler2D samplerColor; + +struct Gui { + vec4 offset; + vec4 color; + int mode; + float depth; + int sdf; + int shadowbox; + vec4 stroke; + float weight; + int spread; + float scale; +}; + +layout (location = 0) in vec2 inUv; +layout (location = 1) in flat Gui inGui; +layout (location = 0) out vec4 outFragColor; + + +const int indexMatrix4x4[16] = int[](0, 8, 2, 10, + 12, 4, 14, 6, + 3, 11, 1, 9, + 15, 7, 13, 5); + +float indexValue4x4() { + int x = int(mod(gl_FragCoord.x, 4)); + int y = int(mod(gl_FragCoord.y, 4)); + return indexMatrix4x4[(x + y * 4)] / 16.0; +} + +const int paletteSize = 28; +const vec3 palette[28] = vec3[]( + vec3(0, 0, 0), + vec3(0, 0, 1), + vec3(0, 0, 0.502), + vec3(0, 0, 0.753), + vec3(0, 1, 0.251), + vec3(0, 1, 0.50), + vec3(60.0/360.0, 1, 0.251), + vec3(60.0/360.0, 1, 0.5), + vec3(120.0/360.0, 1, 0.251), + vec3(120.0/360.0, 1, 0.5), + vec3(180.0/360.0, 1, 0.251), + vec3(180.0/360.0, 1, 0.5), + vec3(240.0/360.0, 1, 0.251), + vec3(240.0/360.0, 1, 0.5), + vec3(300.0/360.0, 1, 0.251), + vec3(300.0/360.0, 1, 0.5), + vec3(60.0/360.0, 0.333, 0.376), + vec3(60.0/360.0, 1, 0.751), + vec3(180.0/360.0, 1, 0.125), + vec3(150.0/360.0, 1, 0.5), + vec3(210.0/360.0, 1, 0.5), + vec3(180.0/360.0, 1, 0.751), + vec3(210.0/360.0, 1, 0.251), + vec3(240.0/360.0, 1, 0.751), + vec3(270.0/360.0, 1, 0.5), + vec3(330.0/360.0, 1, 0.5), + vec3(30.0/360.0, 1, 0.251), + vec3(24.0/360.0, 1, 0.625) +); + +vec3 hslToRgb(vec3 HSL) { + vec3 RGB; { + float H = HSL.x; + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + RGB = clamp(vec3(R,G,B), 0, 1); + } + float C = (1 - abs(2 * HSL.z - 1)) * HSL.y; + return (RGB - 0.5) * C + HSL.z; +} + +vec3 rgbToHsl(vec3 RGB) { + float Epsilon = 1e-10; + vec3 HCV; { + vec4 P = (RGB.g < RGB.b) ? vec4(RGB.bg, -1.0, 2.0/3.0) : vec4(RGB.gb, 0.0, -1.0/3.0); + vec4 Q = (RGB.r < P.x) ? vec4(P.xyw, RGB.r) : vec4(RGB.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + Epsilon) + Q.z); + HCV = vec3(H, C, Q.x); + } + float L = HCV.z - HCV.y * 0.5; + float S = HCV.y / (1 - abs(L * 2 - 1) + Epsilon); + return vec3(HCV.x, S, L); +} + +float hueDistance(float h1, float h2) { + float diff = abs((h1 - h2)); + return min(abs((1.0 - diff)), diff); +} + +vec3[2] closestColors(float hue) { + vec3 ret[2]; + vec3 closest = vec3(-2, 0, 0); + vec3 secondClosest = vec3(-2, 0, 0); + vec3 temp; + for (int i = 0; i < paletteSize; ++i) { + temp = palette[i]; + float tempDistance = hueDistance(temp.x, hue); + if (tempDistance < hueDistance(closest.x, hue)) { + secondClosest = closest; + closest = temp; + } else { + if (tempDistance < hueDistance(secondClosest.x, hue)) { + secondClosest = temp; + } + } + } + ret[0] = closest; + ret[1] = secondClosest; + return ret; +} + +const float lightnessSteps = 4.0; +float lightnessStep(float l) { + /* Quantize the lightness to one of `lightnessSteps` values */ + return floor((0.5 + l * lightnessSteps)) / lightnessSteps; +} + +vec3 dither1(vec3 color) { + vec3 hsl = rgbToHsl(color); + + vec3 cs[2] = closestColors(hsl.x); + vec3 c1 = cs[0]; + vec3 c2 = cs[1]; + float d = indexValue4x4(); + float hueDiff = hueDistance(hsl.x, c1.x) / hueDistance(c2.x, c1.x); + + float l1 = lightnessStep(max((hsl.z - 0.125), 0.0)); + float l2 = lightnessStep(min((hsl.z + 0.124), 1.0)); + float lightnessDiff = (hsl.z - l1) / (l2 - l1); + + vec3 resultColor = (hueDiff < d) ? c1 : c2; + //resultColor.z = (lightnessDiff < d) ? l1 : l2; + return hslToRgb(resultColor); +} + +float dither(float color) { + float closestColor = (color < 0.5) ? 0 : 1; + float secondClosestColor = 1 - closestColor; + float d = indexValue4x4(); + float distance = abs(closestColor - color); + return (distance < d) ? closestColor : secondClosestColor; +} + +vec3 dither(vec3 color) { + vec3 hsl = rgbToHsl(color); + + hsl.y = dither(hsl.y); + return hslToRgb(hsl); +} + +void main() { + if ( inUv.x < inGui.offset.x ) discard; + if ( inUv.y < inGui.offset.y ) discard; + if ( inUv.x > inGui.offset.z ) discard; + if ( inUv.y > inGui.offset.w ) discard; + + if ( inGui.shadowbox == 1 ) { + outFragColor = inGui.color; + return; + } + float dist = texture(samplerColor, inUv).r; + if ( inGui.sdf == 1 ) { + float smoothing = ( inGui.spread > 0 && inGui.scale > 0 ) ? 0.25 / (inGui.spread * inGui.scale) : 0.25 / (4 * 1.5); + float outlining = smoothstep(0.5 - smoothing, 0.5 + smoothing, dist); + float alpha = smoothstep(inGui.weight - smoothing, inGui.weight + smoothing, dist); + vec4 c = inGui.color; + outFragColor = mix(inGui.stroke, c, outlining); + outFragColor.a = inGui.color.a * alpha; + if ( alpha < 0.001 ) discard; + if ( alpha > 1 ) discard; + } else { + outFragColor = vec4(inGui.color) * dist; + if ( dist < 0.001 ) discard; + if ( dist > 1 ) discard; + } + + outFragColor.rgb = dither(outFragColor.rgb); +} \ No newline at end of file diff --git a/bin/data/shaders/gui.text.dither8.frag.glsl b/bin/data/shaders/gui.text.dither8.frag.glsl new file mode 100644 index 00000000..205a4053 --- /dev/null +++ b/bin/data/shaders/gui.text.dither8.frag.glsl @@ -0,0 +1,187 @@ +#version 450 + +layout (binding = 1) uniform sampler2D samplerColor; + +struct Gui { + vec4 offset; + vec4 color; + int mode; + float depth; + int sdf; + int shadowbox; + vec4 stroke; + float weight; + int spread; + float scale; +}; + +layout (location = 0) in vec2 inUv; +layout (location = 1) in flat Gui inGui; +layout (location = 0) out vec4 outFragColor; + +const int indexMatrix8x8[64] = int[](0, 32, 8, 40, 2, 34, 10, 42, + 48, 16, 56, 24, 50, 18, 58, 26, + 12, 44, 4, 36, 14, 46, 6, 38, + 60, 28, 52, 20, 62, 30, 54, 22, + 3, 35, 11, 43, 1, 33, 9, 41, + 51, 19, 59, 27, 49, 17, 57, 25, + 15, 47, 7, 39, 13, 45, 5, 37, + 63, 31, 55, 23, 61, 29, 53, 21); + +float indexValue8x8() { + int x = int(mod(gl_FragCoord.x, 8)); + int y = int(mod(gl_FragCoord.y, 8)); + return indexMatrix8x8[(x + y * 8)] / 64.0; +} + +const int paletteSize = 28; +const vec3 palette[28] = vec3[]( + vec3(0, 0, 0), + vec3(0, 0, 1), + vec3(0, 0, 0.502), + vec3(0, 0, 0.753), + vec3(0, 1, 0.251), + vec3(0, 1, 0.50), + vec3(60.0/360.0, 1, 0.251), + vec3(60.0/360.0, 1, 0.5), + vec3(120.0/360.0, 1, 0.251), + vec3(120.0/360.0, 1, 0.5), + vec3(180.0/360.0, 1, 0.251), + vec3(180.0/360.0, 1, 0.5), + vec3(240.0/360.0, 1, 0.251), + vec3(240.0/360.0, 1, 0.5), + vec3(300.0/360.0, 1, 0.251), + vec3(300.0/360.0, 1, 0.5), + vec3(60.0/360.0, 0.333, 0.376), + vec3(60.0/360.0, 1, 0.751), + vec3(180.0/360.0, 1, 0.125), + vec3(150.0/360.0, 1, 0.5), + vec3(210.0/360.0, 1, 0.5), + vec3(180.0/360.0, 1, 0.751), + vec3(210.0/360.0, 1, 0.251), + vec3(240.0/360.0, 1, 0.751), + vec3(270.0/360.0, 1, 0.5), + vec3(330.0/360.0, 1, 0.5), + vec3(30.0/360.0, 1, 0.251), + vec3(24.0/360.0, 1, 0.625) +); + +vec3 hslToRgb(vec3 HSL) { + vec3 RGB; { + float H = HSL.x; + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + RGB = clamp(vec3(R,G,B), 0, 1); + } + float C = (1 - abs(2 * HSL.z - 1)) * HSL.y; + return (RGB - 0.5) * C + HSL.z; +} + +vec3 rgbToHsl(vec3 RGB) { + float Epsilon = 1e-10; + vec3 HCV; { + vec4 P = (RGB.g < RGB.b) ? vec4(RGB.bg, -1.0, 2.0/3.0) : vec4(RGB.gb, 0.0, -1.0/3.0); + vec4 Q = (RGB.r < P.x) ? vec4(P.xyw, RGB.r) : vec4(RGB.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + Epsilon) + Q.z); + HCV = vec3(H, C, Q.x); + } + float L = HCV.z - HCV.y * 0.5; + float S = HCV.y / (1 - abs(L * 2 - 1) + Epsilon); + return vec3(HCV.x, S, L); +} + +float hueDistance(float h1, float h2) { + float diff = abs((h1 - h2)); + return min(abs((1.0 - diff)), diff); +} + +vec3[2] closestColors(float hue) { + vec3 ret[2]; + vec3 closest = vec3(-2, 0, 0); + vec3 secondClosest = vec3(-2, 0, 0); + vec3 temp; + for (int i = 0; i < paletteSize; ++i) { + temp = palette[i]; + float tempDistance = hueDistance(temp.x, hue); + if (tempDistance < hueDistance(closest.x, hue)) { + secondClosest = closest; + closest = temp; + } else { + if (tempDistance < hueDistance(secondClosest.x, hue)) { + secondClosest = temp; + } + } + } + ret[0] = closest; + ret[1] = secondClosest; + return ret; +} + +const float lightnessSteps = 4.0; +float lightnessStep(float l) { + /* Quantize the lightness to one of `lightnessSteps` values */ + return floor((0.5 + l * lightnessSteps)) / lightnessSteps; +} + +vec3 dither1(vec3 color) { + vec3 hsl = rgbToHsl(color); + + vec3 cs[2] = closestColors(hsl.x); + vec3 c1 = cs[0]; + vec3 c2 = cs[1]; + float d = indexValue8x8(); + float hueDiff = hueDistance(hsl.x, c1.x) / hueDistance(c2.x, c1.x); + + float l1 = lightnessStep(max((hsl.z - 0.125), 0.0)); + float l2 = lightnessStep(min((hsl.z + 0.124), 1.0)); + float lightnessDiff = (hsl.z - l1) / (l2 - l1); + + vec3 resultColor = (hueDiff < d) ? c1 : c2; + //resultColor.z = (lightnessDiff < d) ? l1 : l2; + return hslToRgb(resultColor); +} + +float dither(float color) { + float closestColor = (color < 0.5) ? 0 : 1; + float secondClosestColor = 1 - closestColor; + float d = indexValue8x8(); + float distance = abs(closestColor - color); + return (distance < d) ? closestColor : secondClosestColor; +} + +vec3 dither(vec3 color) { + vec3 hsl = rgbToHsl(color); + hsl.y = dither(hsl.y); + return hslToRgb(hsl); +} + +void main() { + if ( inUv.x < inGui.offset.x ) discard; + if ( inUv.y < inGui.offset.y ) discard; + if ( inUv.x > inGui.offset.z ) discard; + if ( inUv.y > inGui.offset.w ) discard; + + if ( inGui.shadowbox == 1 ) { + outFragColor = inGui.color; + return; + } + float dist = texture(samplerColor, inUv).r; + if ( inGui.sdf == 1 ) { + float smoothing = ( inGui.spread > 0 && inGui.scale > 0 ) ? 0.25 / (inGui.spread * inGui.scale) : 0.25 / (4 * 1.5); + float outlining = smoothstep(0.5 - smoothing, 0.5 + smoothing, dist); + float alpha = smoothstep(inGui.weight - smoothing, inGui.weight + smoothing, dist); + vec4 c = inGui.color; + outFragColor = mix(inGui.stroke, c, outlining); + outFragColor.a = inGui.color.a * alpha; + if ( alpha < 0.001 ) discard; + if ( alpha > 1 ) discard; + } else { + outFragColor = vec4(inGui.color) * dist; + if ( dist < 0.001 ) discard; + if ( dist > 1 ) discard; + } + + outFragColor.rgb = dither(outFragColor.rgb); +} \ No newline at end of file diff --git a/bin/data/shaders/gui.text.frag.glsl b/bin/data/shaders/gui.text.frag.glsl index 520220cd..e805a1f8 100644 --- a/bin/data/shaders/gui.text.frag.glsl +++ b/bin/data/shaders/gui.text.frag.glsl @@ -1,9 +1,6 @@ #version 450 -#define UF_DEFERRED_SAMPLING 0 -#define UF_CAN_DISCARD 1 - -layout (binding = 1) uniform sampler2D samplerTexture; +layout (binding = 1) uniform sampler2D samplerColor; struct Gui { vec4 offset; @@ -16,19 +13,11 @@ struct Gui { float weight; int spread; float scale; - float padding; }; layout (location = 0) in vec2 inUv; layout (location = 1) in flat Gui inGui; - -layout (location = 0) out uvec2 outId; -layout (location = 1) out vec2 outNormals; -#if UF_DEFERRED_SAMPLING - layout (location = 2) out vec2 outUvs; -#else - layout (location = 2) out vec4 outAlbedo; -#endif +layout (location = 0) out vec4 outFragColor; void main() { if ( inUv.x < inGui.offset.x ) discard; @@ -36,26 +25,22 @@ void main() { if ( inUv.x > inGui.offset.z ) discard; if ( inUv.y > inGui.offset.w ) discard; -#if UF_DEFERRED_SAMPLING - vec4 outAlbedo = vec4(0,0,0,0); -#endif - if ( inGui.shadowbox == 1 ) { - outAlbedo = inGui.color; + outFragColor = inGui.color; return; } - float dist = texture(samplerTexture, inUv).r; + float dist = texture(samplerColor, inUv).r; if ( inGui.sdf == 1 ) { float smoothing = ( inGui.spread > 0 && inGui.scale > 0 ) ? 0.25 / (inGui.spread * inGui.scale) : 0.25 / (4 * 1.5); float outlining = smoothstep(0.5 - smoothing, 0.5 + smoothing, dist); float alpha = smoothstep(inGui.weight - smoothing, inGui.weight + smoothing, dist); vec4 c = inGui.color; - outAlbedo = mix(inGui.stroke, c, outlining); - outAlbedo.a = inGui.color.a * alpha; + outFragColor = mix(inGui.stroke, c, outlining); + outFragColor.a = inGui.color.a * alpha; if ( alpha < 0.001 ) discard; if ( alpha > 1 ) discard; } else { - outAlbedo = vec4(inGui.color) * dist; + outFragColor = vec4(inGui.color) * dist; if ( dist < 0.001 ) discard; if ( dist > 1 ) discard; } diff --git a/bin/data/shaders/gui.text.stereo.vert.glsl b/bin/data/shaders/gui.text.stereo.vert.glsl new file mode 100644 index 00000000..bbc1b558 --- /dev/null +++ b/bin/data/shaders/gui.text.stereo.vert.glsl @@ -0,0 +1,44 @@ +#version 450 + +layout (location = 0) in vec2 inPos; +layout (location = 1) in vec2 inUv; + +layout( push_constant ) uniform PushBlock { + uint pass; +} PushConstant; + +struct Matrices { + mat4 model[2]; +}; +struct Gui { + vec4 offset; + vec4 color; + int mode; + float depth; + int sdf; + int shadowbox; + vec4 stroke; + float weight; + int spread; + float scale; +}; + +layout (binding = 0) uniform UBO { + Matrices matrices; + Gui gui; +} ubo; + +layout (location = 0) out vec2 outUv; +layout (location = 1) out flat Gui outGui; + +out gl_PerVertex { + vec4 gl_Position; +}; + + +void main() { + outUv = inUv; + outGui = ubo.gui; + + gl_Position = ubo.matrices.model[PushConstant.pass] * vec4(inPos.xy, ubo.gui.depth, 1.0); +} \ No newline at end of file diff --git a/bin/data/shaders/gui.text.vert.glsl b/bin/data/shaders/gui.text.vert.glsl index 487894d2..9abade45 100644 --- a/bin/data/shaders/gui.text.vert.glsl +++ b/bin/data/shaders/gui.text.vert.glsl @@ -1,16 +1,10 @@ #version 450 -layout (constant_id = 0) const uint PASSES = 6; layout (location = 0) in vec2 inPos; layout (location = 1) in vec2 inUv; -layout( push_constant ) uniform PushBlock { - uint pass; - uint draw; -} PushConstant; - struct Matrices { - mat4 model[PASSES]; + mat4 model; }; struct Gui { vec4 offset; @@ -23,7 +17,6 @@ struct Gui { float weight; int spread; float scale; - float padding; }; layout (binding = 0) uniform UBO { @@ -43,5 +36,5 @@ void main() { outUv = inUv; outGui = ubo.gui; - gl_Position = ubo.matrices.model[PushConstant.pass] * vec4(inPos.xy, ubo.gui.depth, 1.0); + gl_Position = ubo.matrices.model * vec4(inPos.xy, ubo.gui.depth, 1.0); } \ No newline at end of file diff --git a/bin/data/shaders/gui.vert.glsl b/bin/data/shaders/gui.vert.glsl index 9828ff94..19e3daaf 100644 --- a/bin/data/shaders/gui.vert.glsl +++ b/bin/data/shaders/gui.vert.glsl @@ -1,23 +1,16 @@ #version 450 -layout (constant_id = 0) const uint PASSES = 6; layout (location = 0) in vec2 inPos; layout (location = 1) in vec2 inUv; -layout( push_constant ) uniform PushBlock { - uint pass; - uint draw; -} PushConstant; - struct Matrices { - mat4 model[PASSES]; + mat4 model; }; struct Gui { vec4 offset; vec4 color; int mode; float depth; - vec2 padding; }; layout (binding = 0) uniform UBO { @@ -37,5 +30,5 @@ void main() { outUv = inUv; outGui = ubo.gui; - gl_Position = ubo.matrices.model[PushConstant.pass] * vec4(inPos.xy, ubo.gui.depth, 1.0); + gl_Position = ubo.matrices.model * vec4(inPos.xy, ubo.gui.depth, 1.0); } \ No newline at end of file diff --git a/bin/data/shaders/heightmap.frag.glsl b/bin/data/shaders/heightmap.frag.glsl deleted file mode 100644 index 7aa5d840..00000000 --- a/bin/data/shaders/heightmap.frag.glsl +++ /dev/null @@ -1,19 +0,0 @@ -#version 450 - -layout (binding = 1) uniform sampler2D samplerColor; - -layout (location = 0) in vec2 inUv; -layout (location = 1) in vec3 inNormal; -layout (location = 2) in vec4 inColor; - -layout (location = 0) out vec4 outAlbedoSpecular; -layout (location = 1) out vec4 outNormal; - -void main() { - outAlbedoSpecular = texture(samplerColor, inUv); - outAlbedoSpecular = vec4(1,1,1,1); - outAlbedoSpecular.rgb *= inColor.rgb; - outAlbedoSpecular.a = 1; -// outPosition = vec4(inPosition, 1.0); - outNormal = vec4(normalize(inNormal), 1.0); -} \ No newline at end of file diff --git a/bin/data/shaders/line.frag.glsl b/bin/data/shaders/line.frag.glsl deleted file mode 100644 index b996dd27..00000000 --- a/bin/data/shaders/line.frag.glsl +++ /dev/null @@ -1,10 +0,0 @@ -#version 450 - -layout (location = 0) in vec3 inColor; - -layout (location = 0) out vec4 outAlbedoSpecular; - -void main() { - outAlbedoSpecular.rgb *= inColor.rgb; - outAlbedoSpecular.a = 1; -} \ No newline at end of file diff --git a/bin/data/shaders/line.vert.glsl b/bin/data/shaders/line.vert.glsl deleted file mode 100644 index 215c618f..00000000 --- a/bin/data/shaders/line.vert.glsl +++ /dev/null @@ -1,35 +0,0 @@ -#version 450 - -layout (constant_id = 0) const uint PASSES = 6; -layout (location = 0) in vec3 inPos; - -layout( push_constant ) uniform PushBlock { - uint pass; - uint draw; -} PushConstant; - -struct Matrices { - mat4 model; - mat4 view[PASSES]; - mat4 projection[PASSES]; -}; - -layout (binding = 0) uniform UBO { - Matrices matrices; - vec4 color; -} ubo; - -layout (location = 0) out vec4 outColor; - -out gl_PerVertex { - vec4 gl_Position; -}; - - -void main() { - outColor = ubo.color; - -// outPosition = vec3(ubo.matrices.view[PushConstant.pass] * ubo.matrices.model * vec4(inPos.xyz, 1.0)); - - gl_Position = ubo.matrices.projection[PushConstant.pass] * ubo.matrices.view[PushConstant.pass] * ubo.matrices.model * vec4(inPos.xyz, 1.0); -} \ No newline at end of file diff --git a/bin/data/shaders/noise.frag.glsl b/bin/data/shaders/noise.frag.glsl deleted file mode 100644 index 2b8bc5da..00000000 --- a/bin/data/shaders/noise.frag.glsl +++ /dev/null @@ -1,23 +0,0 @@ -#version 450 - -layout (binding = 1) uniform sampler3D samplerColor; - -layout (location = 0) in vec2 inUv; -layout (location = 1) in vec4 inColor; -layout (location = 2) in vec3 inNormal; -layout (location = 3) in vec3 inPosition; - -layout (location = 0) out vec4 outAlbedoSpecular; -layout (location = 1) out vec4 outNormal; -layout (location = 2) out vec4 outPosition; - -layout (binding = 2) uniform UBO { - float slice; -} ubo; - -void main() { - outAlbedoSpecular.rgb = vec3(texture(samplerColor, vec3(inUv,ubo.slice)).r); - outAlbedoSpecular.a = 1; - outNormal = vec4(inNormal,1); - outPosition = vec4(inPosition,1); -} \ No newline at end of file diff --git a/bin/data/shaders/raytracing.comp.glsl b/bin/data/shaders/raytracing.comp.glsl index dbc8fc79..44669233 100644 --- a/bin/data/shaders/raytracing.comp.glsl +++ b/bin/data/shaders/raytracing.comp.glsl @@ -1,295 +1,408 @@ #version 450 layout (local_size_x = 32, local_size_y = 32) in; +layout (binding = 0, rgba8) uniform writeonly image2D resultImage; -layout (constant_id = 0) const uint LIGHTS = 16; -layout (constant_id = 1) const uint EYES = 2; -layout (binding = 0, rgba8) uniform writeonly image2D resultImage[EYES]; - -#define EPSILON 0.0001 +#define EPSILON 0.00001 #define MAXLEN 1000.0 +#define SHADOW 0.5 +#define RAYBOUNCES 4 +#define REFLECTIONS true +#define REFLECTIONSTRENGTH 0.4 +#define REFLECTIONFALLOFF 0.5 -layout( push_constant ) uniform PushBlock { - uint marchingSteps; - uint rayBounces; - float shadowFactor; - float reflectionStrength; - float reflectionFalloff; -} PushConstant; +#define UINT32_MAX 0xFFFFFFFF -struct Ray { - vec3 origin; - vec3 direction; +#define TREE_SIZE 8 +#define TREE_STACK 32 +#define PRIMITIVE_TYPE_EMPTY UINT32_MAX +#define PRIMITIVE_TYPE_CUBE 1 +#define PRIMITIVE_TYPE_LEAF 2 +#define PRIMITIVE_TYPE_TREE 3 +#define PRIMITIVE_TYPE_ROOT 4 + +struct Camera { + vec3 position; + mat4 view; + float aspectRatio; }; -struct Result { - vec3 color; - float t; - int id; + +struct StartEnd { + uint start; + uint end; }; + +struct Cube { + vec4 position; + uint type; +// uint _padding[3]; +}; + +struct Tree { + vec4 position; + uint type; + uint children[TREE_SIZE]; +// uint _padding[3]; +}; + struct Light { vec3 position; - float radius; vec3 color; - float power; - vec2 type; - vec2 padding; - mat4 view; - mat4 projection; }; -struct State { - vec3 viewPosition; - Ray ray; - Result result; -} state; - -struct Fog { - vec2 range; - vec2 padding; - vec4 color; -}; - -layout (binding = 1) uniform UBO { - mat4 matrices[2]; - vec4 ambient; - Fog fog; - Light lights[LIGHTS]; +layout (binding = 1) uniform UBO { + Camera camera; + StartEnd cubes; + StartEnd lights; + uint root; } ubo; - -struct Shape { - vec4 values; - vec4 albedoSpecular; - int type; +layout (std140, binding = 2) buffer Cubes { + Cube cubes[ ]; }; -layout (std140, binding = 2) buffer Shapes { - Shape shapes[]; +layout (std430, binding = 3) buffer Trees { + Tree trees[ ]; }; +layout (std140, binding = 4) buffer Lights { + Light lights[ ]; +}; +layout (binding = 5) uniform sampler2D samplerTexture; -void reflectRay(inout vec3 rayD, in vec3 normal) { - rayD = rayD + 2.0 * -dot(normal, rayD) * normal; -} // Lighting ========================================================= +void reflectRay(inout vec3 rayD, in vec3 mormal) { + rayD = rayD + 2.0 * -dot(mormal, rayD) * mormal; +} float lightDiffuse(vec3 normal, vec3 lightDir) { return clamp(dot(normal, lightDir), 0.1, 1.0); } float lightSpecular(vec3 normal, vec3 lightDir, float specularFactor) { - vec3 viewVec = normalize(state.viewPosition); + vec3 viewVec = normalize(ubo.camera.position); vec3 halfVec = normalize(lightDir + viewVec); return pow(clamp(dot(normal, halfVec), 0.0, 1.0), specularFactor); } +// Cube =========================================================== +float cubeIntersect(vec3 rayO, vec3 rayD, vec3 rayDRecip, Cube cube) { + float t[10]; + t[1] = ( cube.position.x - cube.position.w - rayO.x) * rayDRecip.x; + t[2] = ( cube.position.x + cube.position.w - rayO.x) * rayDRecip.x; + t[3] = ( cube.position.y - cube.position.w - rayO.y) * rayDRecip.y; + t[4] = ( cube.position.y + cube.position.w - rayO.y) * rayDRecip.y; + t[5] = ( cube.position.z - cube.position.w - rayO.z) * rayDRecip.z; + t[6] = ( cube.position.z + cube.position.w - rayO.z) * rayDRecip.z; + t[7] = max(max(min(t[1], t[2]), min(t[3], t[4])), min(t[5], t[6])); + t[8] = min(min(max(t[1], t[2]), max(t[3], t[4])), max(t[5], t[6])); + t[9] = (t[8] < 0 || t[7] > t[8]) ? 0.0 : t[7]; + return t[9]; +} +uint intersect(in vec3 rayO, in vec3 rayD, inout float resT, uint start, uint end) { + uint id = UINT32_MAX; + vec3 rayDRecip = 1.0f / rayD; + for (uint i = start; i < end && i < ubo.cubes.end && i < cubes.length(); i++) { + Cube cube = cubes[i]; + if ( cube.type == PRIMITIVE_TYPE_EMPTY ) continue; + float tcube = cubeIntersect(rayO, rayD, rayDRecip, cube); + if ((tcube > EPSILON) && (tcube < resT)) { + id = i; + resT = tcube; + } + } -// Sphere =========================================================== -float sphereIntersect(in vec3 rayO, in vec3 rayD, in Shape shape ) { - vec3 oc = rayO - shape.values.xyz; - float b = 2.0 * dot(oc, rayD); - float c = dot(oc, oc) - shape.values.w * shape.values.w; - float h = b*b - 4.0*c; - if (h < 0.0) return -1.0; - float t = (-b - sqrt(h)) / 2.0; + return id; +} +// Tree =========================================================== +float treeIntersect( in vec3 rayO, in vec3 rayD, in vec3 rayDRecip, Tree tree ) { + Cube treecube; + treecube.type = tree.type; + treecube.position = tree.position; + float t = cubeIntersect( rayO, rayD, rayDRecip, treecube ); return t; } -vec3 sphereNormal(in vec3 position, in Shape shape) { - return (position - shape.values.xyz) / shape.values.w; +struct StackIterator { + uint tree; + uint child; +}; +struct Stack { + int pointer; + StackIterator container[TREE_STACK]; +}; +Stack stack; + +StackIterator popStack( ) { + StackIterator top = stack.container[stack.pointer]; + stack.container[stack.pointer--] = StackIterator( UINT32_MAX, UINT32_MAX ); + return top; } -float sphereSDF( vec3 position, in Shape shape ) { - return length(position - shape.values.xyz) - shape.values.w; +void pushStack( StackIterator item ) { + stack.container[++stack.pointer] = item; } -// Plane =========================================================== -float planeIntersect(in vec3 rayO, in vec3 rayD, in Shape shape) { - float d = dot(rayD, shape.values.xyz); - if (d == 0.0) return 0.0; - float t = -(shape.values.w + dot(rayO, shape.values.xyz)) / d; - return t < 0.0 ? 0.0 : t; -} -vec3 planeNormal(in vec3 position, in Shape shape) { - return shape.values.xyz; -} -float planeSDF( vec3 position, in Shape shape ) { - return dot( position, shape.values.xyz ) + shape.values.w; -} -// Generic ========================================================= -float shapeIntersect(in vec3 rayO, in vec3 rayD, in Shape shape) { - if ( shape.type == 1 ) return sphereIntersect( rayO, rayD, shape ); - if ( shape.type == 2 ) return planeIntersect( rayO, rayD, shape ); - return 0.0; -} -vec3 shapeNormal( vec3 position, in Shape shape ) { - if ( shape.type == 1 ) return sphereNormal(position, shape); - if ( shape.type == 2 ) return planeNormal(position, shape); - return vec3(0.0); -} -float shapeSDF( vec3 position, in Shape shape ) { - if ( shape.type == 1 ) return sphereSDF(position, shape); - if ( shape.type == 2 ) return planeSDF(position, shape); - return MAXLEN; -} -// Intersect ======================================================= -int intersect(in vec3 rayO, in vec3 rayD, inout float resT) { - int id = -1; - for (int i = 0; i < shapes.length(); i++) { - Shape shape = shapes[i]; - float tShape = shapeIntersect(rayO, rayD, shape); - if ((tShape > EPSILON) && (tShape < resT)) { - id = i; - resT = tShape; - } +uint intersectTreecursive( in vec3 rayO, in vec3 rayD, in vec3 rayDRecip, inout float resT, uint root ) { + uint id = UINT32_MAX; + if ( root == UINT32_MAX ) return id; + // set up stack + stack.pointer = -1; + for ( uint i = 0; i < TREE_STACK; ++i ) stack.container[i] = StackIterator( UINT32_MAX, UINT32_MAX ); + pushStack(StackIterator( root, UINT32_MAX )); + + while ( true ) { + StackIterator it = popStack(); + // end of stack + if ( it.tree == UINT32_MAX ) break; + Tree tree = trees[it.tree]; + // invalid tree + if ( tree.type == PRIMITIVE_TYPE_EMPTY ) break; + // new tree, parse collision + if ( it.child == UINT32_MAX ) { + float t = treeIntersect( rayO, rayD, rayDRecip, tree ); + // bad intersection with this tree, continue with next iteration + if ( t <= EPSILON || t >= resT ) continue; + // push back with new stack + it.child = 0; + pushStack( it ); + // continue with next iteration + continue; + } else if ( it.child >= TREE_SIZE ) { + // no new children, continue with next iteration + continue; + } else { + // is leaf + if ( tree.type == PRIMITIVE_TYPE_LEAF ) { + // check children for a match + for ( uint i = 0; i < TREE_SIZE; ++i ) { + uint branchId = tree.children[i]; + // unallocated, skip + if ( branchId == UINT32_MAX ) continue; + Cube primitive = cubes[branchId]; + if ( primitive.type == PRIMITIVE_TYPE_EMPTY ) continue; + float t = cubeIntersect( rayO, rayD, rayDRecip, primitive ); + // branch intersects with ray, set as new parent + if ( (t <= EPSILON) || (t >= resT) ) continue; + id = branchId; + resT = t; + } + // continue with next iteration + continue; + } + // parse children + uint branchId = tree.children[it.child++]; + // add new iterator to the stack + pushStack( it ); + // unused child, continue with next iteration + if ( branchId == UINT32_MAX ) continue; + // tree branch, push to stack + // the first if block will check its collision + it.tree = branchId; + it.child = UINT32_MAX; + pushStack( it ); + continue; + } } return id; } -float calcShadow(in vec3 rayO, in vec3 rayD, in int objectID, inout float resT) { - for (int i = 0; i < shapes.length(); i++) { - if ( i == objectID ) continue; - Shape shape = shapes[i]; - float tShape = shapeIntersect(rayO, rayD, shape); - if ((tShape > EPSILON) && (tShape < resT)) { - resT = tShape; - return PushConstant.shadowFactor; + +uint intersectTree( in vec3 rayO, in vec3 rayD, in vec3 rayDRecip, inout float resT ) { + uint id = UINT32_MAX; + // traverse the tree branches to the leaf + uint index = 0; + while ( true ) { + Tree tree = trees[index++]; + if ( tree.type == PRIMITIVE_TYPE_EMPTY ) break; + if ( tree.type != PRIMITIVE_TYPE_LEAF ) continue; + float tcube = treeIntersect( rayO, rayD, rayDRecip, tree ); + // ray fails collision with parent tree + if ( (tcube <= EPSILON) || (tcube >= resT) ) continue; + // ray intersects with parent tree, check children branches + for ( uint i = 0; i < TREE_SIZE; ++i ) { + uint branchId = tree.children[i]; + // unallocated, skip + if ( branchId == UINT32_MAX ) continue; + Cube primitive = cubes[branchId]; + if ( primitive.type == PRIMITIVE_TYPE_EMPTY ) continue; + tcube = cubeIntersect( rayO, rayD, rayDRecip, primitive ); + // branch intersects with ray, set as new parent + if ( (tcube <= EPSILON) || (tcube >= resT) ) continue; + id = branchId; + resT = tcube; + } + } + return id; +} + +float calcShadow(in vec3 rayO, in vec3 rayD, in uint objectId, inout float t, uint start, uint end) { + vec3 rayDRecip = 1.0f / rayD; + for (uint i = ubo.cubes.start; i < ubo.cubes.end && i < cubes.length(); i++) { + if (i == objectId) continue; + float tCube = cubeIntersect(rayO, rayD, rayDRecip, cubes[i]); + if ((tCube > EPSILON) && (tCube < t)) { + t = tCube; + return SHADOW; + } + } + return 1.0; +} +float calcShadowTree(in vec3 rayO, in vec3 rayD, in vec3 rayDRecip, in uint objectId, inout float t){ + // traverse the tree branches to the leaf + uint index = 0; + while ( true ) { + Tree tree = trees[index++]; + if ( tree.type == PRIMITIVE_TYPE_EMPTY ) break; + if ( tree.type != PRIMITIVE_TYPE_LEAF ) continue; + float tcube = treeIntersect( rayO, rayD, rayDRecip, tree ); + // ray fails collision with parent tree + if ( (tcube <= EPSILON) || (tcube >= t) ) continue; + // ray intersects with parent tree, check children branches + for ( uint i = 0; i < TREE_SIZE; ++i ) { + uint branchId = tree.children[i]; + // unallocated, skip + if ( branchId == UINT32_MAX ) continue; + Cube primitive = cubes[branchId]; + if ( primitive.type == PRIMITIVE_TYPE_EMPTY ) continue; + if ( branchId == objectId ) continue; + tcube = cubeIntersect( rayO, rayD, rayDRecip, primitive ); + // branch intersects with ray, set as new parent + if ( (tcube <= EPSILON) || (tcube >= t) ) continue; + t = tcube; + return SHADOW; } } return 1.0; } -// Marching ======================================== -int intersectMarch( in vec3 rayO, in vec3 rayD, inout float resT ) { - resT = 0; - for (int i = 0; i < PushConstant.marchingSteps; ++i) { - vec3 position = resT * rayD + rayO; - float tNearest = MAXLEN; - int objectID = -1; - for ( int j = 0; j < shapes.length(); ++j ) { - Shape shape = shapes[j]; - float tShape = shapeSDF(position, shape); - // if ((tShape > EPSILON) && (tShape < tNearest)) { - if ( tShape < tNearest ) { - objectID = j; - tNearest = tShape; - } - } - if (tNearest < EPSILON) { - return objectID; - } - if (resT > MAXLEN) break; - resT += tNearest; - } - resT = MAXLEN; - return -1; -} -float calcShadowMarch( in vec3 rayO, in vec3 rayD, in int objectID, inout float resT ) { - float distance = resT; - resT = 0; - for (int i = 0; i < PushConstant.marchingSteps; ++i) { - vec3 position = resT * rayD + rayO; - float tNearest = distance; - int objectID = -1; - for ( int j = 0; j < shapes.length(); ++j ) { - if ( j == objectID ) continue; - Shape shape = shapes[j]; - float tShape = shapeSDF(position, shape); - // if ((tShape > EPSILON) && (tShape < tNearest)) { - if ( tShape < tNearest ) { - objectID = j; - tNearest = tShape; - } - } - if (tNearest < EPSILON) { - return PushConstant.shadowFactor; - } - if (resT > distance) break; - resT += tNearest; - } - resT = distance; - return 1.0; + +vec3 fog(in float t, in vec3 color) { + return mix(color, vec3(0, 0, 0), clamp(sqrt(t*t)/20.0, 0.0, 1.0)); } -void fog(inout vec3 i, in float t ) { -/* - vec3 fogColor = ubo.ambient.rgb; - i = mix(i, fogColor.rgb, clamp(sqrt(t*t)/20.0, 0.0, 1.0)); -*/ - if ( ubo.fog.range.x == 0 || ubo.fog.range.y == 0 ) return; +vec3 renderScene(inout vec3 rayO, inout vec3 rayD, inout uint id) { + float t = MAXLEN; + vec3 rayDRecip = 1.0f / rayD; - vec3 color = ubo.fog.color.rgb; - float inner = ubo.fog.range.x, outer = ubo.fog.range.y; - float factor = (t - inner) / (outer - inner); - factor = clamp( factor, 0.0, 1.0 ); + // Get intersected object ID + uint objectID = intersect(rayO, rayD, t, ubo.cubes.start, ubo.cubes.end ); +// uint objectID = intersectTree( rayO, rayD, rayDRecip, t ); +// uint objectID = intersectTreecursive( rayO, rayD, rayDRecip, t, ubo.root ); - i = mix(i.rgb, color, factor); -} - -Result renderScene(inout vec3 rayO, inout vec3 rayD ) { - Result result; - result.color = vec3(0.0); - result.t = MAXLEN; - result.id = PushConstant.marchingSteps > 0 ? intersectMarch(rayO, rayD, result.t) : intersect(rayO, rayD, result.t); - if (result.id == -1) return result; + vec3 color = vec3(0.0); + if ( objectID == UINT32_MAX ) return color; - Shape shape = shapes[result.id]; - vec3 position = rayO + result.t * rayD; - vec3 normal = shapeNormal( position, shape ); + vec3 pos = rayO + t * rayD; + vec3 normal; - for ( uint i = 0; i < LIGHTS; ++i ) { - Light light = ubo.lights[i]; - if ( light.radius <= EPSILON ) continue; - if ( light.power <= EPSILON ) continue; + // Cubes + if ( id == UINT32_MAX ) return color; + id = objectID; + // Hit Data + { + Cube cube = cubes[objectID]; + vec2 mappedUv = vec2(0, 0); { + float min_distance = MAXLEN; + vec3 point = cube.position.xyz - pos; + float distance = abs(cube.position.w - abs(point.x)); + if (distance < min_distance) { + min_distance = distance; + normal = vec3(-1, 0, 0); + if ( cube.position.w + point.x <= EPSILON ) normal *= -1; - vec3 L = light.position - position; - float dist = length(L); - vec3 D = normalize(L); - float attenuation = light.radius / (pow(dist, 2.0) + 1.0);; - attenuation = 1; - // if ( dist > light.radius ) continue; - - vec4 albedoSpecular = shape.albedoSpecular; + mappedUv.x = point.y - cube.position.y; + mappedUv.y = point.z - cube.position.z; + } + distance = abs(cube.position.w - abs(point.y)); + if (distance < min_distance) { + min_distance = distance; + normal = vec3(0, -1, 0); + if ( cube.position.w + point.y <= EPSILON ) normal *= -1; - float d_dot = lightDiffuse(normal, D); - float s_factor = lightSpecular(normal, D, albedoSpecular.a); - vec3 color = (light.color * albedoSpecular.rgb) * d_dot + s_factor; + mappedUv.x = point.x - cube.position.x; + mappedUv.y = point.z - cube.position.z; + } + distance = abs(cube.position.w - abs(point.z)); + if (distance < min_distance) { + min_distance = distance; + normal = vec3(0, 0, -1); + if ( cube.position.w + point.z <= EPSILON ) normal *= -1; - // Shadows - float tShadow = dist; - float shadowed = 1; - if ( PushConstant.shadowFactor < 1.0 ) - shadowed = PushConstant.marchingSteps > 0 ? calcShadowMarch(position, D, result.id, tShadow) : calcShadow(position, D, result.id, tShadow); - result.color += color * light.power * attenuation * shadowed; + mappedUv.x = point.x - cube.position.x; + mappedUv.y = point.y - cube.position.y; + } + mappedUv -= 2.0f / 4.0f; + mappedUv *= 1.0f / 4.0f; + mappedUv.x = mod(mappedUv.x, 1.0f / 4.0f); + mappedUv.y = mod(mappedUv.y, 1.0f / 4.0f); + } + vec3 textureMapped = texture(samplerTexture, mappedUv).rgb; + color = textureMapped; + } + // Lighting + { + int di = 0; + vec4 diffuses[256]; + for ( int j = 0; j < lights.length(); ++j ) { + Light light = lights[j]; + if ( light.color.r <= EPSILON && light.color.g <= EPSILON && light.color.b <= EPSILON ) continue; + vec3 lightVec = normalize(light.position - pos); + float diffuse = lightDiffuse(normal, lightVec); + float specular = lightSpecular(normal, lightVec, 2000.0f); + diffuses[di].x = length(light.position - pos); + diffuses[di].gba = diffuse * light.color + specular; + ++di; + } + vec4 a = vec4(MAXLEN, vec3(1.0)); + vec4 b = vec4(MAXLEN, vec3(1.0)); + vec4 c = vec4(MAXLEN, vec3(1.0)); + for ( int j = 0; j < lights.length(); ++j ) { + vec4 current = diffuses[j]; + if ( current.y <= EPSILON ) continue; + // use slot a + if ( current.x < a.x ) { + c = b; + b = a; + a = current; + } else if ( current.x < b.x ) { + c = b; + b = current; + } else if ( current.x < c.x ) { + c = current; + } + } + vec3 avg = (a.gba * 0.5 + b.gba * 0.3 + c.gba * 0.2); + color *= avg; + } + // Shadows + { + vec3 lightVec = vec3(0, 4, 0) - pos; + t = length(lightVec); + color *= calcShadow(pos, lightVec, id, t, ubo.cubes.start, ubo.cubes.end); + // color *= calcShadowTree(pos, lightVec, rayDRecip, id, t); } // Fog - // fog(t, result.color); - + // color = fog(t, color); + // Reflect ray for next render pass reflectRay(rayD, normal); - rayO = position; + rayO = pos; - return result; + return color; } void main() { - for ( int pass = 0; pass < EYES; ++pass ) { - { - vec2 uv = vec2(gl_GlobalInvocationID.xy) / imageSize(resultImage[pass]); - vec4 near4 = ubo.matrices[pass] * (vec4(2.0 * uv - 1.0, -1.0, 1.0)); - vec4 far4 = ubo.matrices[pass] * (vec4(2.0 * uv - 1.0, 1.0, 1.0)); - vec3 near3 = near4.xyz / near4.w; - vec3 far3 = far4.xyz / far4.w; + ivec2 dim = imageSize(resultImage); + vec2 uv = vec2(gl_GlobalInvocationID.xy) / dim; - state.viewPosition = near3; - state.ray.origin = near3; - state.ray.direction = normalize( far3 - near3 ); - } - - // Basic color path - state.result = renderScene(state.ray.origin, state.ray.direction); - vec3 finalColor = state.result.color; + vec3 rayO = ubo.camera.position; // * vec3(1,1,-1); + vec3 rayD = normalize(vec3((-1.0 + 2.0 * uv) * vec2(ubo.camera.aspectRatio, 1.0), -1.0)); + rayD = (ubo.camera.view * vec4( rayD, 0.0 )).xyz; - // Reflection - float reflectionStrength = PushConstant.reflectionStrength; - for (int i = 0; i < PushConstant.rayBounces; i++) { - Result result = renderScene(state.ray.origin, state.ray.direction); - vec3 reflectionColor = result.color; - - finalColor = (1.0 - reflectionStrength) * finalColor + reflectionStrength * mix(reflectionColor, finalColor, 1.0 - reflectionStrength); - reflectionStrength *= PushConstant.reflectionFalloff; + // Basic color path + uint id = 0; + vec3 finalColor = renderScene(rayO, rayD, id); + + // Reflection + if ( REFLECTIONS ) { + float reflectionStrength = REFLECTIONSTRENGTH; + for (int i = 0; i < RAYBOUNCES; i++) { + vec3 reflectionColor = renderScene(rayO, rayD, id); + finalColor = (1.0 - reflectionStrength) * finalColor + reflectionStrength * mix(reflectionColor, finalColor, 1.0 - reflectionStrength); + reflectionStrength *= REFLECTIONFALLOFF; } - - imageStore(resultImage[pass], ivec2(gl_GlobalInvocationID.xy), vec4(finalColor, 1.0)); } + + imageStore(resultImage, ivec2(gl_GlobalInvocationID.xy), vec4(finalColor, 0.0)); } \ No newline at end of file diff --git a/bin/data/shaders/terrain.frag.glsl b/bin/data/shaders/terrain.frag.glsl index cfe7cd4b..dce42753 100644 --- a/bin/data/shaders/terrain.frag.glsl +++ b/bin/data/shaders/terrain.frag.glsl @@ -3,18 +3,53 @@ layout (binding = 1) uniform sampler2D samplerColor; layout (location = 0) in vec2 inUv; -layout (location = 1) in vec4 inColor; -layout (location = 2) in vec3 inNormal; -layout (location = 3) in vec3 inPosition; +layout (location = 1) in vec3 inPositionEye; +layout (location = 2) in vec3 inNormalEye; +layout (location = 3) in vec4 inColor; +layout (location = 0) out vec4 outFragColor; -layout (location = 0) out vec4 outAlbedoSpecular; -layout (location = 1) out vec4 outNormal; -layout (location = 2) out vec4 outPosition; +void fog( inout vec3 i ) { + vec3 color = vec3( 0, 0, 0 ); + float inner = 8, outer = 64; + float distance = length(-inPositionEye); + float factor = (distance - inner) / (outer - inner); + factor = clamp( factor, 0.0, 1.0 ); + + i = mix(i.rgb, color, factor); +} + +void phong( inout vec3 i ) { + vec3 Ls = vec3(1.0, 1.0, 1.0); // light specular + vec3 Ld = vec3(0.4, 0.4, 1.0); // light color + vec3 La = vec3(0.1, 0.1, 0.1); + + vec3 Ks = vec3(0.6, 0.6, 0.9); // material specular + vec3 Kd = i; // material diffuse + vec3 Ka = vec3(0.7, 0.7, 0.7); + + float Kexp = 1000.0; + + vec3 dist_light_eye = vec3(0, 0, 0) - inPositionEye; + vec3 dir_light_eye = normalize(dist_light_eye); + float d_dot = max(dot( dir_light_eye, inNormalEye ), 0.0); + + vec3 reflection_eye = reflect( -dir_light_eye, inNormalEye ); + vec3 surface_eye = normalize(-inPositionEye); + float s_dot = max(dot( reflection_eye, surface_eye ), 0.0); + float s_factor = pow( s_dot, Kexp ); + + vec3 Ia = La * Ka; + vec3 Id = Ld * Kd * d_dot; + vec3 Is = Ls * Ks * s_factor; + i = Is + Id + Ia; +} void main() { - outAlbedoSpecular = texture(samplerColor, inUv); - // outAlbedoSpecular.rgb *= inColor.rgb; - outAlbedoSpecular.a = 1; - outNormal = vec4(inNormal,1); - outPosition = vec4(inPosition,1); + outFragColor = texture(samplerColor, inUv); +// phong(outFragColor.rgb); + fog(outFragColor.rgb); +// outFragColor.rgb = mix( outFragColor.rgb, inColor.rgb, inColor.a ); + outFragColor.rgb = outFragColor.rgb * inColor.rgb; +// outFragColor.rgb = inColor.rgb; + if ( outFragColor.a < 0.001 ) discard; } \ No newline at end of file diff --git a/bin/data/shaders/heightmap.vert.glsl b/bin/data/shaders/terrain.stereo.vert.glsl similarity index 59% rename from bin/data/shaders/heightmap.vert.glsl rename to bin/data/shaders/terrain.stereo.vert.glsl index f802c523..8b88188a 100644 --- a/bin/data/shaders/heightmap.vert.glsl +++ b/bin/data/shaders/terrain.stereo.vert.glsl @@ -1,6 +1,5 @@ #version 450 -layout (constant_id = 0) const uint PASSES = 6; layout (location = 0) in vec3 inPos; layout (location = 1) in vec2 inUv; layout (location = 2) in vec3 inNormal; @@ -8,13 +7,12 @@ layout (location = 3) in uint inColor; layout( push_constant ) uniform PushBlock { uint pass; - uint draw; } PushConstant; struct Matrices { mat4 model; - mat4 view[PASSES]; - mat4 projection[PASSES]; + mat4 view[2]; + mat4 projection[2]; }; layout (binding = 0) uniform UBO { @@ -23,8 +21,9 @@ layout (binding = 0) uniform UBO { } ubo; layout (location = 0) out vec2 outUv; -layout (location = 1) out vec3 outNormal; -layout (location = 2) out vec4 outColor; +layout (location = 1) out vec3 outPositionEye; +layout (location = 2) out vec3 outNormalEye; +layout (location = 3) out vec4 outColor; out gl_PerVertex { vec4 gl_Position; @@ -33,14 +32,10 @@ out gl_PerVertex { void main() { outUv = inUv; + outPositionEye = vec3(ubo.matrices.view[PushConstant.pass] * ubo.matrices.model * vec4(inPos.xyz, 1.0)); + outNormalEye = vec3(ubo.matrices.view[PushConstant.pass] * ubo.matrices.model * vec4(inNormal.xyz, 0.0)); // outColor = ubo.color; -// outPosition = vec3(ubo.matrices.view[PushConstant.pass] * ubo.matrices.model * vec4(inPos.xyz, 1.0)); - outNormal = vec3(ubo.matrices.view[PushConstant.pass] * ubo.matrices.model * vec4(inNormal.xyz, 0.0)); - -// outPosition = vec3(ubo.matrices.model * vec4(inPos.xyz, 1.0)); -// outNormal = vec3(ubo.matrices.model * vec4(inNormal.xyz, 0.0)); - outColor.a = (inColor >> 24u) & 0xFF; outColor.b = (inColor >> 16u) & 0xFF; outColor.g = (inColor >> 8u) & 0xFF; diff --git a/bin/data/shaders/terrain.vert.glsl b/bin/data/shaders/terrain.vert.glsl index 7c6d8752..8b88188a 100644 --- a/bin/data/shaders/terrain.vert.glsl +++ b/bin/data/shaders/terrain.vert.glsl @@ -1,6 +1,5 @@ #version 450 -layout (constant_id = 0) const uint PASSES = 6; layout (location = 0) in vec3 inPos; layout (location = 1) in vec2 inUv; layout (location = 2) in vec3 inNormal; @@ -8,13 +7,12 @@ layout (location = 3) in uint inColor; layout( push_constant ) uniform PushBlock { uint pass; - uint draw; } PushConstant; struct Matrices { mat4 model; - mat4 view[PASSES]; - mat4 projection[PASSES]; + mat4 view[2]; + mat4 projection[2]; }; layout (binding = 0) uniform UBO { @@ -23,9 +21,9 @@ layout (binding = 0) uniform UBO { } ubo; layout (location = 0) out vec2 outUv; -layout (location = 1) out vec4 outColor; -layout (location = 2) out vec3 outNormal; -layout (location = 3) out vec3 outPosition; +layout (location = 1) out vec3 outPositionEye; +layout (location = 2) out vec3 outNormalEye; +layout (location = 3) out vec4 outColor; out gl_PerVertex { vec4 gl_Position; @@ -34,12 +32,10 @@ out gl_PerVertex { void main() { outUv = inUv; + outPositionEye = vec3(ubo.matrices.view[PushConstant.pass] * ubo.matrices.model * vec4(inPos.xyz, 1.0)); + outNormalEye = vec3(ubo.matrices.view[PushConstant.pass] * ubo.matrices.model * vec4(inNormal.xyz, 0.0)); // outColor = ubo.color; - outPosition = vec3(ubo.matrices.view[PushConstant.pass] * ubo.matrices.model * vec4(inPos.xyz, 1.0)); - outNormal = vec3(ubo.matrices.view[PushConstant.pass] * ubo.matrices.model * vec4(inNormal.xyz, 0.0)); - outNormal = normalize(outNormal); - outColor.a = (inColor >> 24u) & 0xFF; outColor.b = (inColor >> 16u) & 0xFF; outColor.g = (inColor >> 8u) & 0xFF; diff --git a/bin/data/shaders/texture.frag.glsl b/bin/data/shaders/texture.frag.glsl index 6ebfac38..94c293b3 100644 --- a/bin/data/shaders/texture.frag.glsl +++ b/bin/data/shaders/texture.frag.glsl @@ -5,7 +5,7 @@ layout (location = 0) in vec2 inUV; layout (location = 0) out vec4 outFragColor; void main() { - vec4 sampledColor = texture(samplerColor, inUV); + vec4 sampledColor = texture(samplerColor, vec2(inUV.s, 1.0 - inUV.t)); if ( sampledColor.r <= 0.000001 && sampledColor.g <= 0.000001 && sampledColor.b <= 0.000001 ) discard; outFragColor = sampledColor; } \ No newline at end of file diff --git a/client/client/ext.cpp b/client/client/ext.cpp index 61cd5ab0..ddc32b0e 100644 --- a/client/client/ext.cpp +++ b/client/client/ext.cpp @@ -6,8 +6,8 @@ #include #include #include -#include -#include + +#include bool client::ready = false; bool client::terminated = false; @@ -15,18 +15,39 @@ uf::Window client::window; uf::Serializer client::config; void client::initialize() { +// spec::Context::globalInit(); uf::IoStream::ncurses = true; - uf::renderer::device.window = &client::window; - - ext::load(); - + ext::vulkan::device.window = &client::window; /* Initialize config */ { struct { uf::Serializer ext; uf::Serializer fallback; } config; /* Get configuration */ { - config.ext = ext::config.serialize(); + config.ext = ext::getConfig(); + } + /* Initialize default configuration */ { + config.fallback["terminal"]["visible"] = true; + config.fallback["terminal"]["ncurses"] = true; + config.fallback["window"]["title"] = "[uf] Grimgram"; + config.fallback["window"]["icon"] = "./cfg/icon.png"; + config.fallback["window"]["size"]["x"] = 640; + config.fallback["window"]["size"]["y"] = 480; + config.fallback["window"]["visible"] = true; + config.fallback["window"]["fullscreen"] = false; + config.fallback["cursor"]["visible"] = true; + config.fallback["keyboard"]["repeat"] = true; + config.fallback["hook"]["mode"] = "Readable"; + config.fallback["light"]["ambient"]["g"] = 0.0f; + config.fallback["light"]["ambient"]["b"] = 0.0f; + config.fallback["light"]["ambient"]["a"] = 1.0f; + + config.fallback["context"]["depthBits"] = 24; + config.fallback["context"]["stencilBits"] = 4; + config.fallback["context"]["bitsPerPixel"] = 8; + config.fallback["context"]["antialiasingLevel"] = 0; + config.fallback["context"]["majorVersion"] = 3; + config.fallback["context"]["minorVersion"] = 0; } /* Merge */ { client::config = config.ext; @@ -36,43 +57,42 @@ void client::initialize() { /* Initialize window */ { // Window size pod::Vector2i size; { - size.x = client::config["window"]["size"]["x"].as(); - size.y = client::config["window"]["size"]["y"].as(); - // request system size - if ( size.x <= 0 && size.y <= 0 ) { - auto resolution = client::window.getResolution(); - client::config["window"]["size"]["x"] = (size.x = resolution.x); - client::config["window"]["size"]["y"] = (size.y = resolution.y); - } + size.x = client::config["window"]["size"]["x"].asUInt(); + size.y = client::config["window"]["size"]["y"].asUInt(); } // Window title uf::String title; { - title = client::config["window"]["title"].as(); + title = client::config["window"]["title"].asString(); } // Terminal window; - spec::terminal.setVisible( client::config["window"]["terminal"]["visible"].as() ); + spec::terminal.setVisible( client::config["terminal"]["visible"].asBool() ); // Ncurses - uf::IoStream::ncurses = client::config["window"]["terminal"]["ncurses"].as(); + uf::IoStream::ncurses = client::config["terminal"]["ncurses"].asBool(); // Window's context settings - uf::renderer::settings::width = size.x; - uf::renderer::settings::height = size.y; - client::window.create( size, title ); - - // Set refresh rate - ext::config["window"]["refresh rate"] = client::window.getRefreshRate(); + spec::Context::Settings settings; { + settings.depthBits = client::config["context"]["depthBits"].asUInt(); + settings.stencilBits = client::config["context"]["stencilBits"].asUInt(); + settings.bitsPerPixel = client::config["context"]["bitsPerPixel"].asUInt(); + settings.antialiasingLevel = client::config["context"]["antialiasingLevel"].asUInt(); + settings.majorVersion = client::config["context"]["majorVersion"].asUInt(); + settings.minorVersion = client::config["context"]["minorVersion"].asUInt(); + } + ext::vulkan::width = size.x; + ext::vulkan::height = size.y; + client::window.create( size, title, settings ); // Miscellaneous - client::window.setVisible(client::config["window"]["visible"].as()); - client::window.setCursorVisible(client::config["window"]["cursor"]["visible"].as()); - client::window.setKeyRepeatEnabled(client::config["window"]["keyboard"]["repeat"].as()); + client::window.setVisible(client::config["window"]["visible"].asBool()); + client::window.setCursorVisible(client::config["cursor"]["visible"].asBool()); + client::window.setKeyRepeatEnabled(client::config["keyboard"]["repeat"].asBool()); // client::window.centerWindow(); // client::window.setPosition({0, 0}); // client::window.setMouseGrabbed(true); - /* Set Icon */ if ( client::config["window"]["icon"].is() ) { + /* Set Icon */ { uf::Image icon; - icon.open(client::config["window"]["icon"].as()); + icon.open(client::config["window"]["icon"].asString()); client::window.setIcon({(int) icon.getDimensions().x, (int) icon.getDimensions().y}, ((uint8_t*)icon.getPixelsPtr())); } client::window.setTitle(title); { @@ -83,15 +103,26 @@ void client::initialize() { json["window"]["title"] = std::string(title); uf::hooks.call( hook, json ); } - /* uf::hooks.shouldPreferReadable(); - if ( client::config["engine"]["hook"]["mode"] == "Readable" ) { - + if ( client::config["hook"]["mode"] == "Readable" ) {} + } + /* Initialize OpenGL */ { + /* + if ( !ext::gl.initialize() ) { + std::cerr << "[ERROR] GL failed to initialize!" << std::endl; + std::exit(EXIT_SUCCESS); + return; } + + pod::Vector4f ambient; + ambient.x = client::config["light"]["ambient"]["r"].asDouble(); + ambient.y = client::config["light"]["ambient"]["g"].asDouble(); + ambient.z = client::config["light"]["ambient"]["b"].asDouble(); + ambient.w = client::config["light"]["ambient"]["a"].asDouble(); + glClearColor(ambient.x, ambient.y, ambient.z, ambient.w); */ } - #if UF_USE_OPENAL /* Initialize OpenAL */ { if ( !ext::oal.initialize() ) { std::cerr << "[ERROR] AL failed to initialize!" << std::endl; @@ -99,52 +130,57 @@ void client::initialize() { return; } } - #endif /* Initialize hooks */ { - // if ( client::config["engine"]["hook"]["mode"] == "Both" || client::config["engine"]["hook"]["mode"] == "Readable" ) { - uf::hooks.addHook( "window:Mouse.CursorVisibility", [&](const ext::json::Value& json){ - client::window.setCursorVisible(json["state"].as()); - client::window.setMouseGrabbed(!json["state"].as()); - client::config["mouse"]["visible"] = json["state"].as(); - client::config["window"]["mouse"]["center"] = !json["state"].as(); + if ( client::config["hook"]["mode"] == "Both" || client::config["hook"]["mode"] == "Readable" ) { + uf::hooks.addHook( "window:Mouse.CursorVisibility", [&](const std::string& event)->std::string{ + uf::Serializer json = event; + client::window.setCursorVisible(json["state"].asBool()); + client::window.setMouseGrabbed(!json["state"].asBool()); + client::config["mouse"]["visible"] = json["state"].asBool(); + return "true"; }); - uf::hooks.addHook( "window:Mouse.Lock", [&](const ext::json::Value& json){ + uf::hooks.addHook( "window:Mouse.Lock", [&](const std::string& event)->std::string{ if ( client::window.hasFocus() ) { client::window.setMousePosition(client::window.getSize()/2); } + return "true"; }); - uf::hooks.addHook( "window:Closed", [&](const ext::json::Value& json){ + uf::hooks.addHook( "window:Closed", [&](const std::string& event)->std::string{ client::ready = false; // std::exit(EXIT_SUCCESS); + return "true"; } ); - uf::hooks.addHook( "window:Title.Changed", [&](const ext::json::Value& json){ + uf::hooks.addHook( "window:Title.Changed", [&](const std::string& event)->std::string{ + uf::Serializer json = event; if ( json["invoker"] != "os" ) { - if ( !ext::json::isObject( json["window"] ) ) return; - uf::String title = json["window"]["title"].as(); + if ( !json["window"].isObject() ) return "false"; + uf::String title = json["window"]["title"].asString(); client::window.setTitle(title); } + return "true"; } ); - uf::hooks.addHook( "window:Resized", [&](const ext::json::Value& json){ + uf::hooks.addHook( "window:Resized", [&](const std::string& event)->std::string{ + uf::Serializer json = event; pod::Vector2i size; { - size.x = json["window"]["size"]["x"].as(); - size.y = json["window"]["size"]["y"].as(); + size.x = json["window"]["size"]["x"].asUInt64(); + size.y = json["window"]["size"]["y"].asUInt64(); } if ( json["invoker"] != "os" ) { client::window.setSize(size); } // Update viewport - if ( !ext::json::isArray( client::config["engine"]["ext"]["vulkan"]["framebuffer"]["size"] ) ) { - float scale = client::config["engine"]["ext"]["vulkan"]["framebuffer"]["size"].is() ? client::config["engine"]["ext"]["vulkan"]["framebuffer"]["size"].as() : 1; - uf::renderer::settings::width = size.x * scale; - uf::renderer::settings::height = size.y * scale; - } + // glViewport( 0, 0, size.x, size.y ); + // client::window.centerWindow(); - uf::renderer::states::resized = true; + ext::vulkan::width = size.x; + ext::vulkan::height = size.y; + + ext::vulkan::swapchain.rebuild = true; + + return "true"; } ); - /* - } - else if ( client::config["engine"]["hook"]["mode"] == "Both" || client::config["engine"]["hook"]["mode"] == "Optimal" ) { + } else if ( client::config["hook"]["mode"] == "Both" || client::config["hook"]["mode"] == "Optimal" ) { uf::hooks.addHook( "window:Closed", [&](const uf::OptimalHook::argument_t& userdata)->uf::OptimalHook::return_t{ client::ready = false; std::exit(EXIT_SUCCESS); @@ -182,13 +218,12 @@ void client::initialize() { client::window.setSize(hook.window.size); } // Update viewport + // glViewport( 0, 0, hook.window.size.x, hook.window.size.y ); return NULL; } ); } - */ } - if ( client::config["window"]["mode"].as() == "fullscreen" ) client::window.switchToFullscreen(); - if ( client::config["window"]["mode"].as() == "borderless" ) client::window.switchToFullscreen( true ); + if ( client::config["window"]["fullscreen"].asBool() ) client::window.switchToFullscreen(); client::ready = true; } void client::tick() { @@ -196,11 +231,11 @@ void client::tick() { client::window.pollEvents(); // call mouse move // query lock - if ( client::window.hasFocus() && client::config["window"]["mouse"]["center"].as() ) { + if ( client::window.hasFocus() && !client::config["mouse"]["visible"].asBool() ) { auto previous = client::window.getMousePosition(); client::window.setMousePosition(client::window.getSize()/2); auto current = client::window.getMousePosition(); - + // std::cout << "Delta: (" << current.x - previous.x << ", " << current.y - previous.y << ")" << std::endl; auto size = client::window.getSize(); uf::Serializer payload; payload["invoker"] = "client"; @@ -245,18 +280,22 @@ void client::render() { client::window.display(); } +#include void client::terminate() { /* Close Threads */ { uf::thread::terminate(); } - client::window.terminate(); + /* Close vulkan */ { + ext::vulkan::destroy(); + } + + client::window.terminate(); +// spec::Context::globalCleanup(); - #if UF_USE_BULLET if ( !ext::oal.terminate() ) { std::cerr << "[ERROR] AL failed to terminate!" << std::endl; std::exit(EXIT_SUCCESS); return; } - #endif } \ No newline at end of file diff --git a/client/dc.cpp b/client/dc.cpp deleted file mode 100644 index 6122b069..00000000 --- a/client/dc.cpp +++ /dev/null @@ -1,8 +0,0 @@ -/* -#include - -int main(int argc, char** argv){ - std::cout << "nggge" << std::endl; - return 0; -} -*/ \ No newline at end of file diff --git a/client/main.cpp b/client/main.cpp index f5988c52..7bfc0c69 100644 --- a/client/main.cpp +++ b/client/main.cpp @@ -3,17 +3,12 @@ #include #include -#include +#include +// #include -#define HANDLE_EXCEPTIONS 0 +#include int main(int argc, char** argv){ - for ( size_t i = 0; i < argc; ++i ) { - char* c_str = argv[i]; - std::string string(argv[i]); - ext::arguments.emplace_back(string); - } - std::atexit([]{ uf::iostream << "Termination via std::atexit()!" << "\n"; client::terminated = !(client::ready = ext::ready = false); @@ -34,42 +29,34 @@ int main(int argc, char** argv){ } } while ( client::ready && ext::ready ) { - #if HANDLE_EXCEPTIONS try { - #endif + client::tick(); + ext::tick(); static bool first = false; if ( !first ) { first = true; uf::Serializer json; std::string hook = "window:Resized"; json["type"] = hook; json["invoker"] = "ext"; - json["window"]["size"]["x"] = client::config["window"]["size"]["x"]; json["window"]["size"]["y"] = client::config["window"]["size"]["y"]; uf::hooks.call(hook, json); } - client::tick(); - ext::tick(); - client::render(); - ext::render(); - #if HANDLE_EXCEPTIONS - } catch ( std::runtime_error& e ) { - uf::iostream << "RUNTIME ERROR: " << e.what() << "\n"; - break; } catch ( std::exception& e ) { - uf::iostream << "EXCEPTION ERROR: " << e.what() << "\n"; + uf::iostream << "ERROR: " << e.what() << "\n"; throw e; } catch ( bool handled ) { - if (!handled) uf::iostream << "UNHANDLED ERROR: " << "???" << "\n"; + if (!handled) uf::iostream << "ERROR: " << "???" << "\n"; } catch ( ... ) { - uf::iostream << "UNKNOWN ERROR: " << "???" << "\n"; + uf::iostream << "ERROR: " << "???" << "\n"; } - #endif + client::render(); + ext::render(); } if ( !client::terminated ) { uf::iostream << "Natural termination!" << "\n"; + ext::terminate(); + client::terminate(); } - ext::terminate(); - client::terminate(); return 0; } \ No newline at end of file diff --git a/debug.sh b/debug.sh index d74a4108..110fc7ab 100644 --- a/debug.sh +++ b/debug.sh @@ -1,8 +1,6 @@ #!/bin/bash cd bin -PREFIX=$(cat ./exe/default.config) -cp ./exe/lib/win64/*.dll . -cp ./exe/lib/win64/$PREFIX/*.dll . -gdb ./exe/program.$PREFIX.exe +cp lib/win64/*.dll . +gdb program.exe rm *.dll diff --git a/engine/inc/ActiveSocket.h b/engine/inc/ActiveSocket.h deleted file mode 100644 index 5c2d0df4..00000000 --- a/engine/inc/ActiveSocket.h +++ /dev/null @@ -1,92 +0,0 @@ -/*---------------------------------------------------------------------------*/ -/* */ -/* ActiveSocket.h - Active Socket Decleration */ -/* */ -/* Author : Mark Carrier (mark@carrierlabs.com) */ -/* */ -/*---------------------------------------------------------------------------*/ -/* Copyright (c) 2007-2009 CarrierLabs, LLC. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * 4. The name "CarrierLabs" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * mark@carrierlabs.com. - * - * THIS SOFTWARE IS PROVIDED BY MARK CARRIER ``AS IS'' AND ANY - * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MARK CARRIER OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - *----------------------------------------------------------------------------*/ -#ifndef __ACTIVESOCKET_H__ -#define __ACTIVESOCKET_H__ - -#include "SimpleSocket.h" - -class CPassiveSocket; - -/// Provides a platform independent class to create an active socket. -/// An active socket is used to create a socket which connects to a server. -/// This type of object would be used when an application needs to send/receive -/// data from a server. -class CActiveSocket : public CSimpleSocket -{ -public: - friend class CPassiveSocket; - - CActiveSocket(CSocketType type = SocketTypeTcp); - virtual ~CActiveSocket() - { - Close(); - }; - - /// Established a connection to the address specified by pAddr. - /// Connection-based protocol sockets (CSocket::SocketTypeTcp) may - /// successfully call Open() only once, however; connectionless protocol - /// sockets (CSocket::SocketTypeUdp) may use Open() multiple times to - /// change their association. - /// @param pAddr specifies the destination address to connect. - /// @param nPort specifies the destination port. - /// @return true if successful connection made, otherwise false. - virtual bool Open(const char *pAddr, uint16 nPort); - -private: - /// Utility function used to create a TCP connection, called from Open(). - /// @return true if successful connection made, otherwise false. - bool ConnectTCP(const char *pAddr, uint16 nPort); - - /// Utility function used to create a UDP connection, called from Open(). - /// @return true if successful connection made, otherwise false. - bool ConnectUDP(const char *pAddr, uint16 nPort); - - /// Utility function used to create a RAW connection, called from Open(). - /// @return true if successful connection made, otherwise false. - bool ConnectRAW(const char *pAddr, uint16 nPort); - -private: - struct hostent *m_pHE; -}; - -#endif /* __ACTIVESOCKET_H__ */ diff --git a/engine/inc/AppCore/App.h b/engine/inc/AppCore/App.h deleted file mode 100644 index 0236c2de..00000000 --- a/engine/inc/AppCore/App.h +++ /dev/null @@ -1,182 +0,0 @@ -/// -/// @file App.h -/// -/// @brief The header for the App class. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2019 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include "Defines.h" -#include -#include -#include - -namespace ultralight { - -class Monitor; -class Window; - -/// -/// Interface for all App-related events. @see App::set_listener -/// -class AExport AppListener { -public: - virtual ~AppListener() {} - - /// - /// Called whenever the App updates. You should update all app logic here. - /// - /// @note This event is fired right before the run loop calls - /// Renderer::Update and Renderer::Render. - /// - virtual void OnUpdate() {} -}; - -/// -/// App-specific settings. -/// -struct AExport Settings { - /// - /// The name of the developer of this app. - /// - /// This is used to generate a unique path to store local application data - /// on the user's machine. - /// - String developer_name = "MyCompany"; - - /// - /// The name of this app. - /// - /// This is used to generate a unique path to store local application data - /// on the user's machine. - /// - String app_name = "MyApp"; - - /// - /// The root file path for our file system. You should set this to the - /// relative path where all of your app data is. - /// - /// This will be used to resolve all file URLs, eg file:///page.html - /// - /// @note This relative path is resolved using the following logic: - /// - Windows: relative to the executable path - /// - Linux: relative to the executable path - /// - macOS: relative to YourApp.app/Contents/Resources/ - /// - String file_system_path = "./assets/"; - - /// - /// Whether or not we should load and compile shaders from the file system - /// (eg, from the /shaders/ path, relative to file_system_path). - /// - /// If this is false (the default), we will instead load pre-compiled shaders - /// from memory which speeds up application startup time. - /// - bool load_shaders_from_file_system = false; - - /// - /// We try to use the GPU renderer when a compatible GPU is detected. - /// - /// Set this to true to force the engine to always use the CPU renderer. - /// - bool force_cpu_renderer = false; -}; - -/// -/// Main application class. -/// -class AExport App : public RefCounted { -public: - /// - /// Create the App singleton. - /// - /// @param settings Settings to customize App runtime behavior. - /// - /// @param config Config options for the Ultralight renderer. - /// - /// @return Returns a ref-pointer to the created App instance. - /// - /// @note You should only create one of these per application lifetime. - /// - /// @note Certain Config options may be overridden during App creation, - /// most commonly Config::face_winding and Config::device_scale_hint. - /// - static Ref Create(Settings settings = Settings(), Config config = Config()); - - /// - /// Get the App singleton. - /// - static App* instance(); - - /// - /// Get the settings this App was created with. - /// - virtual const Settings& settings() const = 0; - - /// - /// Set the main window. You must set this before calling Run. - /// - /// @param window The window to use for all rendering. - /// - /// @note We currently only support one Window per App, this will change - /// later once we add support for multiple driver instances. - /// - virtual void set_window(Ref window) = 0; - - /// - /// Get the main window. - /// - virtual RefPtr window() = 0; - - /// - /// Set an AppListener to receive callbacks for app-related events. - /// - /// @note Ownership remains with the caller. - /// - virtual void set_listener(AppListener* listener) = 0; - - /// - /// Get the AppListener, if any. - /// - virtual AppListener* listener() = 0; - - /// - /// Whether or not the App is running. - /// - virtual bool is_running() const = 0; - - /// - /// Get the main monitor (this is never NULL). - /// - /// @note We'll add monitor enumeration later. - /// - virtual Monitor* main_monitor() = 0; - - /// - /// Get the underlying Renderer instance. - /// - virtual Ref renderer() = 0; - - /// - /// Run the main loop. - /// - /// @note Make sure to call set_window before calling this. - /// - virtual void Run() = 0; - - /// - /// Quit the application. - /// - virtual void Quit() = 0; - -protected: - virtual ~App(); -}; - -} // namespace ultralight diff --git a/engine/inc/AppCore/AppCore.h b/engine/inc/AppCore/AppCore.h deleted file mode 100644 index 00fad093..00000000 --- a/engine/inc/AppCore/AppCore.h +++ /dev/null @@ -1,6 +0,0 @@ -#include -#include -#include -#include -#include -#include \ No newline at end of file diff --git a/engine/inc/AppCore/CAPI.h b/engine/inc/AppCore/CAPI.h deleted file mode 100644 index e28a43b3..00000000 --- a/engine/inc/AppCore/CAPI.h +++ /dev/null @@ -1,448 +0,0 @@ -/// -/// @file CAPI.h -/// -/// @brief The C-language API for AppCore -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2020 Ultralight, Inc. All rights reserved. -/// -#ifndef APPCORE_CAPI_H -#define APPCORE_CAPI_H - -#include - -#if defined(__WIN32__) || defined(_WIN32) -# if defined(APPCORE_IMPLEMENTATION) -# define ACExport __declspec(dllexport) -# else -# define ACExport __declspec(dllimport) -# endif -#else -# define ACExport __attribute__((visibility("default"))) -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct C_Settings* ULSettings; -typedef struct C_App* ULApp; -typedef struct C_Window* ULWindow; -typedef struct C_Monitor* ULMonitor; -typedef struct C_Overlay* ULOverlay; - -/// -/// Window creation flags. @see Window::Create -/// -typedef enum { - kWindowFlags_Borderless = 1 << 0, - kWindowFlags_Titled = 1 << 1, - kWindowFlags_Resizable = 1 << 2, - kWindowFlags_Maximizable = 1 << 3, -} ULWindowFlags; - -/// -/// Create settings with default values (see ). -/// -ACExport ULSettings ulCreateSettings(); - -/// -/// Destroy settings. -/// -ACExport void ulDestroySettings(ULSettings settings); - -/// -/// Set the name of the developer of this app. -/// -/// This is used to generate a unique path to store local application data -/// on the user's machine. -/// -/// Default is "MyCompany" -/// -ACExport void ulSettingsSetDeveloperName(ULSettings settings, ULString name); - -/// -/// Set the name of this app. -/// -/// This is used to generate a unique path to store local application data -/// on the user's machine. -/// -/// Default is "MyApp" -/// -ACExport void ulSettingsSetAppName(ULSettings settings, ULString name); - -/// -/// Set the root file path for our file system, you should set this to the -/// relative path where all of your app data is. -/// -/// This will be used to resolve all file URLs, eg file:///page.html -/// -/// @note The default path is "./assets/" -/// -/// This relative path is resolved using the following logic: -/// - Windows: relative to the executable path -/// - Linux: relative to the executable path -/// - macOS: relative to YourApp.app/Contents/Resources/ -/// -ACExport void ulSettingsSetFileSystemPath(ULSettings settings, ULString path); - -/// -/// Set whether or not we should load and compile shaders from the file system -/// (eg, from the /shaders/ path, relative to file_system_path). -/// -/// If this is false (the default), we will instead load pre-compiled shaders -/// from memory which speeds up application startup time. -/// -ACExport void ulSettingsSetLoadShadersFromFileSystem(ULSettings settings, - bool enabled); - -/// -/// We try to use the GPU renderer when a compatible GPU is detected. -/// -/// Set this to true to force the engine to always use the CPU renderer. -/// -ACExport void ulSettingsSetForceCPURenderer(ULSettings settings, - bool force_cpu); -/// -/// Create the App singleton. -/// -/// @param settings Settings to customize App runtime behavior. You can pass -/// NULL for this parameter to use default settings. -/// -/// @param config Config options for the Ultralight renderer. You can pass -/// NULL for this parameter to use default config. -/// -/// @note You should only create one of these per application lifetime. -/// -/// @note Certain Config options may be overridden during App creation, -/// most commonly Config::face_winding and Config::device_scale_hint. -/// -ACExport ULApp ulCreateApp(ULSettings settings, ULConfig config); - -/// -/// Destroy the App instance. -/// -ACExport void ulDestroyApp(ULApp app); - -/// -/// Set the main window, you must set this before calling ulAppRun. -/// -/// @param window The window to use for all rendering. -/// -/// @note We currently only support one Window per App, this will change -/// later once we add support for multiple driver instances. -/// -ACExport void ulAppSetWindow(ULApp app, ULWindow window); - -/// -/// Get the main window. -/// -ACExport ULWindow ulAppGetWindow(ULApp app); - -typedef void -(*ULUpdateCallback) (void* user_data); - -/// -/// Set a callback for whenever the App updates. You should update all app -/// logic here. -/// -/// @note This event is fired right before the run loop calls -/// Renderer::Update and Renderer::Render. -/// -ACExport void ulAppSetUpdateCallback(ULApp app, ULUpdateCallback callback, - void* user_data); - -/// -/// Whether or not the App is running. -/// -ACExport bool ulAppIsRunning(ULApp app); - -/// -/// Get the main monitor (this is never NULL). -/// -/// @note We'll add monitor enumeration later. -/// -ACExport ULMonitor ulAppGetMainMonitor(ULApp app); - -/// -/// Get the underlying Renderer instance. -/// -ACExport ULRenderer ulAppGetRenderer(ULApp app); - -/// -/// Run the main loop, make sure to call ulAppSetWindow before calling this. -/// -ACExport void ulAppRun(ULApp app); - -/// -/// Quit the application. -/// -ACExport void ulAppQuit(ULApp app); - -/// -/// Get the monitor's DPI scale (1.0 = 100%). -/// -ACExport double ulMonitorGetScale(ULMonitor monitor); - -/// -/// Get the width of the monitor (in pixels). -/// -ACExport unsigned int ulMonitorGetWidth(ULMonitor monitor); - -/// -/// Get the height of the monitor (in pixels). -/// -ACExport unsigned int ulMonitorGetHeight(ULMonitor monitor); - -/// -/// Create a new Window. -/// -/// @param monitor The monitor to create the Window on. -/// -/// @param width The width (in device coordinates). -/// -/// @param height The height (in device coordinates). -/// -/// @param fullscreen Whether or not the window is fullscreen. -/// -/// @param window_flags Various window flags. -/// -ACExport ULWindow ulCreateWindow(ULMonitor monitor, unsigned int width, - unsigned int height, bool fullscreen, - unsigned int window_flags); - -/// -/// Destroy a Window. -/// -ACExport void ulDestroyWindow(ULWindow window); - -typedef void -(*ULCloseCallback) (void* user_data); - -/// -/// Set a callback to be notified when a window closes. -/// -ACExport void ulWindowSetCloseCallback(ULWindow window, - ULCloseCallback callback, - void* user_data); - -typedef void -(*ULResizeCallback) (void* user_data, unsigned int width, unsigned int height); - -/// -/// Set a callback to be notified when a window resizes -/// (parameters are passed back in pixels). -/// -ACExport void ulWindowSetResizeCallback(ULWindow window, - ULResizeCallback callback, - void* user_data); - -/// -/// Get window width (in pixels). -/// -ACExport unsigned int ulWindowGetWidth(ULWindow window); - -/// -/// Get window height (in pixels). -/// -ACExport unsigned int ulWindowGetHeight(ULWindow window); - -/// -/// Get whether or not a window is fullscreen. -/// -ACExport bool ulWindowIsFullscreen(ULWindow window); - -/// -/// Get the DPI scale of a window. -/// -ACExport double ulWindowGetScale(ULWindow window); - -/// -/// Set the window title. -/// -ACExport void ulWindowSetTitle(ULWindow window, const char* title); - -/// -/// Set the cursor for a window. -/// -ACExport void ulWindowSetCursor(ULWindow window, ULCursor cursor); - -/// -/// Close a window. -/// -ACExport void ulWindowClose(ULWindow window); - -/// -/// Convert device coordinates to pixels using the current DPI scale. -/// -ACExport int ulWindowDeviceToPixel(ULWindow window, int val); - -/// -/// Convert pixels to device coordinates using the current DPI scale. -/// -ACExport int ulWindowPixelsToDevice(ULWindow window, int val); - -/// -/// Get the underlying native window handle. -/// -/// @note This is: - HWND on Windows -/// - NSWindow* on macOS -/// - GLFWwindow* on Linux -/// -ACExport void* ulWindowGetNativeHandle(ULWindow window); - -/// -/// Create a new Overlay. -/// -/// @param window The window to create the Overlay in. (we currently only -/// support one window per application) -/// -/// @param width The width in device coordinates. -/// -/// @param height The height in device coordinates. -/// -/// @param x The x-position (offset from the left of the Window), in -/// pixels. -/// -/// @param y The y-position (offset from the top of the Window), in -/// pixels. -/// -/// @note Each Overlay is essentially a View and an on-screen quad. You should -/// create the Overlay then load content into the underlying View. -/// -ACExport ULOverlay ulCreateOverlay(ULWindow window, unsigned int width, - unsigned int height, int x, int y); - -/// -/// Create a new Overlay, wrapping an existing View. -/// -/// @param window The window to create the Overlay in. (we currently only -/// support one window per application) -/// -/// @param view The View to wrap (will use its width and height). -/// -/// @param x The x-position (offset from the left of the Window), in -/// pixels. -/// -/// @param y The y-position (offset from the top of the Window), in -/// pixels. -/// -/// @note Each Overlay is essentially a View and an on-screen quad. You should -/// create the Overlay then load content into the underlying View. -/// -ACExport ULOverlay ulCreateOverlayWithView(ULWindow window, ULView view, - int x, int y); - -/// -/// Destroy an overlay. -/// -ACExport void ulDestroyOverlay(ULOverlay overlay); - -/// -/// Get the underlying View. -/// -ACExport ULView ulOverlayGetView(ULOverlay overlay); - -/// -/// Get the width (in pixels). -/// -ACExport unsigned int ulOverlayGetWidth(ULOverlay overlay); - -/// -/// Get the height (in pixels). -/// -ACExport unsigned int ulOverlayGetHeight(ULOverlay overlay); - -/// -/// Get the x-position (offset from the left of the Window), in pixels. -/// -ACExport int ulOverlayGetX(ULOverlay overlay); - -/// -/// Get the y-position (offset from the top of the Window), in pixels. -/// -ACExport int ulOverlayGetY(ULOverlay overlay); - -/// -/// Move the overlay to a new position (in pixels). -/// -ACExport void ulOverlayMoveTo(ULOverlay overlay, int x, int y); - -/// -/// Resize the overlay (and underlying View), dimensions should be -/// specified in pixels. -/// -ACExport void ulOverlayResize(ULOverlay overlay, unsigned int width, - unsigned int height); - -/// -/// Whether or not the overlay is hidden (not drawn). -/// -ACExport bool ulOverlayIsHidden(ULOverlay overlay); - -/// -/// Hide the overlay (will no longer be drawn). -/// -ACExport void ulOverlayHide(ULOverlay overlay); - -/// -/// Show the overlay. -/// -ACExport void ulOverlayShow(ULOverlay overlay); - -/// -/// Whether or not an overlay has keyboard focus. -/// -ACExport bool ulOverlayHasFocus(ULOverlay overlay); - -/// -/// Grant this overlay exclusive keyboard focus. -/// -ACExport void ulOverlayFocus(ULOverlay overlay); - -/// -/// Remove keyboard focus. -/// -ACExport void ulOverlayUnfocus(ULOverlay overlay); - -/****************************************************************************** - * Platform - *****************************************************************************/ - -/// -/// This is only needed if you are not calling ulCreateApp(). -/// -/// Initializes the platform font loader and sets it as the current FontLoader. -/// -ACExport void ulEnablePlatformFontLoader(); - -/// -/// This is only needed if you are not calling ulCreateApp(). -/// -/// Initializes the platform file system (needed for loading file:/// URLs) and -/// sets it as the current FileSystem. -/// -/// You can specify a base directory path to resolve relative paths against. -/// -ACExport void ulEnablePlatformFileSystem(ULString base_dir); - -/// -/// This is only needed if you are not calling ulCreateApp(). -/// -/// Initializes the default logger (writes the log to a file). -/// -/// You should specify a writable log path to write the log to -/// for example "./ultralight.log". -/// -ACExport void ulEnableDefaultLogger(ULString log_path); - -#ifdef __cplusplus -} -#endif - -#endif // APPCORE_CAPI_H diff --git a/engine/inc/AppCore/Defines.h b/engine/inc/AppCore/Defines.h deleted file mode 100644 index 8c2e85eb..00000000 --- a/engine/inc/AppCore/Defines.h +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2018 Ultralight, Inc. All rights reserved. -#pragma once - -// Needed for limit defines, like INTMAX_MAX, which is used by the std C++ library -#ifndef __STDC_LIMIT_MACROS -#define __STDC_LIMIT_MACROS -#endif - -#include -#include -#include - -#ifdef SWIG -#define AExport -#else - -// Require C++11 Support -#if defined(_MSC_VER) -# if _MSC_VER < 1800 -# error This project needs at least Visual Studio 2013 to build -# endif -#elif __cplusplus <= 199711L -# error This project can only be compiled with a compiler that supports C++11 -#endif - - -#if defined(__WIN32__) || defined(_WIN32) -# if defined(APPCORE_IMPLEMENTATION) -# define AExport __declspec(dllexport) -# else -# define AExport __declspec(dllimport) -# endif -#define _thread_local __declspec(thread) -#ifndef _NATIVE_WCHAR_T_DEFINED -#define DISABLE_NATIVE_WCHAR_T -#endif -#else -# define AExport __attribute__((visibility("default"))) -#define _thread_local __thread -#endif - -#endif diff --git a/engine/inc/AppCore/JSHelpers.h b/engine/inc/AppCore/JSHelpers.h deleted file mode 100644 index 29493531..00000000 --- a/engine/inc/AppCore/JSHelpers.h +++ /dev/null @@ -1,554 +0,0 @@ -#pragma once -#include -#include -#include -#include -#include -#include - -namespace ultralight { - -/// -/// Set the current JSContext. -/// -/// Most JavaScriptCore C API calls require an active JavaScript execution -/// context (JSContextRef). You can get the JSContextRef for a page via -/// `View::LockJSContext()`. This context changes with each page navigation. -/// -/// **Note**: -/// You MUST set a JSContext before using most of the C++ API below. -/// -void AExport SetJSContext(JSContextRef ctx); - -/// -/// Get the current JSContext. -/// -JSContextRef AExport GetJSContext(); - -/// -/// JavaScript String wrapper that automatically manages JSStringRef lifetime -/// and provides helpful conversions. -/// -class AExport JSString { -public: - /// Create empty string - JSString(); - - /// Create from C-string - JSString(const char* str); - - /// Create from Ultralight String - JSString(const String& str); - - /// Take ownership of existing JSStringRef (will not increase ref-count) - JSString(JSStringRef str); - - /// Copy constructor (will increase ref-count) - JSString(const JSString& other); - - /// Destructor - ~JSString(); - - /// Assignment operator (will increase ref-count) - JSString& operator=(const JSString& other); - - /// Cast to String - operator String(); - - /// Cast to underlying JSStringRef - operator JSStringRef() const { return instance_; } - -protected: - JSStringRef instance_; -}; - -class JSArray; -class JSObject; -class JSFunction; - -/// Tag type used with the JSValue constructor to create "Null" types -struct AExport JSValueNullTag {}; - -/// Tag type used with the JSValue constructor to create "Undefined" types -struct AExport JSValueUndefinedTag {}; - -/// -/// JavaScript variant value wrapper that automatically manages JSValueRef -/// lifetime and provides helpful conversions. -/// -class AExport JSValue { -public: - /// Create null (empty) JSValue - JSValue(); - - /// Create null JSValue explicitly - JSValue(JSValueNullTag); - - /// Create undefined JSValue - JSValue(JSValueUndefinedTag); - - /// Create boolean JSValue - JSValue(bool val); - - /// Create unsigned integer JSValue (aka, Number) [will be cast to double] - JSValue(uint32_t val); - - /// Create integer JSValue (aka, Number) [will be cast to double] - JSValue(int32_t val); - - /// Create unsigned integer JSValue (aka, Number) [will be cast to double] - JSValue(uint64_t val); - - /// Create integer JSValue (aka, Number) [will be cast to double] - JSValue(int64_t val); - - /// Create double JSValue (aka, Number) - JSValue(double val); - - /// Create string JSValue - JSValue(const char* val); - - /// Create string JSValue - JSValue(const String& val); - - /// Create string JSValue - JSValue(JSString val); - - /// Create from existing JSValueRef - JSValue(JSValueRef val); - - /// Create object JSValue - JSValue(JSObjectRef obj); - - /// Copy constructor, a shallow copy is made, the constructed JSValue will - /// point to the same JSValueRef. - JSValue(const JSValue& other); - - /// Destructor - virtual ~JSValue(); - - /// A shallow copy is made, this JSValue will point to the same JSValueRef - virtual JSValue& operator=(const JSValue& other); - - /// Whether or not the value is a JavaScript Null type. - bool IsNull() const; - - /// Whether or not the value is a JavaScript Undefined type. - bool IsUndefined() const; - - /// Whether or not the value is a JavaScript Boolean type. - bool IsBoolean() const; - - /// Whether or not the value is a JavaScript Number type. - bool IsNumber() const; - - /// Whether or not the value is a JavaScript String type. - bool IsString() const; - - /// Whether or not the value is a JavaScript Object type. - bool IsObject() const; - - /// Whether or not the value is a JavaScript Array type. - bool IsArray() const; - - /// Whether or not the value is a JavaScript Function type. - bool IsFunction() const; - - /// Get the value as a Boolean - bool ToBoolean() const; - - /// Get the value as a Number (Double) - double ToNumber() const; - - /// Get the value as a Number (Integer) - int64_t ToInteger() const { return static_cast(ToNumber()); } - - /// Get the value as a String - JSString ToString() const; - - /// Get the value as an Object (will debug assert if not an Object) - JSObject ToObject() const; - - /// Get the value as an Array (will debug asset if not an Array) - JSArray ToArray() const; - - /// Get the value as a Function (will debug asset if not a Function) - JSFunction ToFunction() const; - - operator bool() const { return ToBoolean(); } - - operator double() const { return ToNumber(); } - - operator uint32_t() const { return static_cast(ToNumber()); } - - operator int32_t() const { return static_cast(ToNumber()); } - - operator uint64_t() const { return static_cast(ToNumber()); } - - operator int64_t() const { return ToInteger(); } - - operator String() const { return ToString(); } - - operator JSString() const { return ToString(); } - - operator JSObject() const; - - operator JSObjectRef() const; - - operator JSArray() const; - - operator JSFunction() const; - - /// Get the underlying JSValueRef - operator JSValueRef() const { return instance(); } - - /// - /// Get the bound context for this JSValue (it is cached at creation). - /// - JSContextRef context() const { return ctx_; } - - /// - /// Set the JSContext for this JSValue. - /// - /// **Note**: - /// JSValues created from within a JSCallback have a temporary JSContext - /// that is destroyed when the callback returns. You will need to "move" - /// any JSValues created within these callbacks to the View's main context - /// (call set_context() with the main context) before using them outside - /// the callback. - /// - void set_context(JSContextRef context) { ctx_ = context; } - -protected: - JSValue(JSContextRef ctx); - JSValue(JSContextRef ctx, JSValueRef val); - virtual JSValueRef instance() const; - - JSContextRef ctx_; - JSValueRef instance_ = nullptr; - friend class JSFunction; -}; - -/// -/// A vector of JSValues, used for passing around arguments in JSCallback. -/// -class AExport JSArgs { -public: - /// Create an empty list of JavaScript arguments - JSArgs(); - - /// Create a list of JavaScript arguments using a C++ initializer list - JSArgs(const std::initializer_list& values); - - /// Copy-constructor - JSArgs(const JSArgs& other); - - /// Destructor - ~JSArgs(); - - /// Assignment operator - JSArgs& operator=(const JSArgs& other); - - /// - /// Access an element of the argument list by index. - /// - /// **Note**: - /// All JSValues are actually wrappers of JSValueRef instances so even - /// though this function doesn't return a JSValue& you are still operating - /// directly on the underlying JavaScript value instance. - /// - JSValue operator[](size_t pos); - - /// - /// Access an element of the argument list by index. (const overload) - /// - /// **Note**: - /// All JSValues are actually wrappers of JSValueRef instances so even - /// though this function doesn't return a JSValue& you are still operating - /// directly on the underlying JavaScript value instance. - /// - const JSValue operator[](size_t pos) const; - - /// Whether or not the argument list is empty. - bool empty() const; - - /// The number of elements in the argument list. - size_t size() const; - - /// Clear the argument list. - void clear(); - - /// Add a new argument to the end of the list. - void push_back(const JSValue& val); - - /// Remove the last item from the end of the list. - void pop_back(); - - /// Get the argument list as a C-array of JSValues - JSValue* data(); - - /// Get the argument list as a C-array of JSValues (const overload) - const JSValue* data() const; -protected: - void* instance_; -}; - -/// -/// JSCallback typedef used for binding C++ callbacks to JavaScript functions. -/// -/// Takes two arguments (const JSObject& thisObj, const JSArgs& args) and -/// returns nothing (void). -/// -typedef std::function JSCallback; - -/// -/// JSCallbackWithRetval typedef used for binding C++ callbacks to JavaScript -/// functions with an optional return value. -/// -/// Takes two arguments (const JSObject& thisObj, const JSArgs& args) and -/// returns a JSValue back to JavaScript. -/// -typedef std::function JSCallbackWithRetval; - -/// -/// Macro to help bind C++ member functions to a JSCallback -/// -/// Usage: JSCallback callback = BindJSCallback(&MyClass::MyMemberFunction); -/// -/// **Note**: Expected to run from within an instance of 'MyClass', note the -/// 'this' keyword in the macro. -/// -#define BindJSCallback(fn) (JSCallback)std::bind(fn, this, std::placeholders::_1, std::placeholders::_2) - -/// -/// Macro to help bind C++ member functions to a JSCallbackWithRetval -/// -/// Usage: JSCallback callback = BindJSCallback(&MyClass::MyMemberFunction); -/// -/// **Note**: Expected to run from within an instance of 'MyClass', note the -/// 'this' keyword in the macro. -/// -#define BindJSCallbackWithRetval(fn) (JSCallbackWithRetval)std::bind(fn, this, std::placeholders::_1, std::placeholders::_2) - -/// -/// Wrapper for JSObject property value (JSValue subclass). Allows new value assignment -/// to object property, binding C++ callbacks to object properties via function objects, -/// as well as value query via the JSValue interface. -/// -class AExport JSPropertyValue : public JSValue { -public: - virtual ~JSPropertyValue(); - - /// Assign a new value to the property (internally calls JSObjectSetProperty) - virtual JSPropertyValue& operator=(const JSValue& value); - - /// Bind to native C++ callback (creates a Function object that can be called from JS) - JSPropertyValue& operator=(const JSCallback& callback); - - /// Bind to native C++ callback with return value (creates a Function object that can be called from JS) - JSPropertyValue& operator=(const JSCallbackWithRetval& callback); - -protected: - virtual JSValueRef instance() const; - JSPropertyValue(JSContextRef ctx, JSObjectRef proxy_obj, unsigned idx); - JSPropertyValue(JSContextRef ctx, JSObjectRef proxy_obj, JSString idx); - JSPropertyValue(const JSPropertyValue&) = default; - JSPropertyValue& operator=(const JSPropertyValue&) = delete; - - JSObject* proxyObj_; - bool using_numeric_idx_; - unsigned numeric_idx_; - JSString string_idx_; - friend class JSArray; - friend class JSObject; -}; - -/// -/// JSArray wrapper that automatically manages lifetime and provides -/// convenient access to indices and Array functions. -/// -class AExport JSArray { -public: - /// Create empty Array - JSArray(); - - /// Create Array from list of JSValues - JSArray(const std::initializer_list& values); - - /// Create Array from existing JSObjectRef (JavaScriptCore C API) - JSArray(JSObjectRef array_obj); - - /// Copy constructor (shallow copy, will point to same instance) - JSArray(const JSArray& other); - - ~JSArray(); - - /// Assignment (shallow assignment, will point to same instance) - JSArray& operator=(const JSArray& other); - - /// Get number of elements in the Array - unsigned length(); - - /// Push an element to back of Array - void push(const JSValue& val); - - /// Find the index (location) of a certain value, will return -1 if not found - int indexOf(const JSValue& val, int start = 0) const; - - /// Get a property by array index (numbering starts at 0) - JSPropertyValue operator[](unsigned idx) const; - - /// Get the underlying JSObjectRef (JavaScriptCore C API) - operator JSObjectRef() const { return instance_; } - - /// - /// Get the bound context for this JSArray (it is cached at creation). - /// - JSContextRef context() const { return ctx_; } - - /// - /// Set the JSContext for this JSArray. - /// - /// **Note**: - /// JSArrays created from within a JSCallback have a temporary JSContext - /// that is destroyed when the callback returns. You will need to "move" - /// any JSArrays created within these callbacks to the View's main context - /// (call set_context() with the main context) before using them outside - /// the callback. - /// - void set_context(JSContextRef context) { ctx_ = context; } - -protected: - JSArray(JSContextRef ctx, JSValueRef val); - - JSContextRef ctx_; - JSObjectRef instance_; - friend class JSValue; -}; - -/// -/// JSObject wrapper that automatically manages lifetime and provides -/// convenient access to properties. -/// -class AExport JSObject { -public: - /// Create empty Object - JSObject(); - - /// Create from existing JSObjectRef from JavaScriptCore C API - JSObject(JSObjectRef obj); - - /// Copy constructor (shallow copy, will point to same instance) - JSObject(const JSObject& other); - - ~JSObject(); - - /// Assignment (shallow assignment, will point to same instance) - JSObject& operator=(const JSObject& other); - - /// Get a property by name - JSPropertyValue operator[](JSString propertyName) const; - - /// Check if a property exists - bool HasProperty(JSString propertyName) const; - - /// Remove a property - bool DeleteProperty(JSString propertyName); - - /// Get the underlying JSObjectRef (JavaScriptCore C API) - operator JSObjectRef() const { return instance_; } - - /// - /// Get the bound context for this JSObject (it is cached at creation). - /// - JSContextRef context() const { return ctx_; } - - /// - /// Set the JSContext for this JSObject. - /// - /// **Note**: - /// JSObjects created from within a JSCallback have a temporary JSContext - /// that is destroyed when the callback returns. You will need to "move" - /// any JSObjects created within these callbacks to the View's main context - /// (call set_context() with the main context) before using them outside - /// the callback. - /// - void set_context(JSContextRef context) { ctx_ = context; } - -protected: - JSObject(JSContextRef ctx, JSValueRef val); - JSObject(JSContextRef ctx, JSObjectRef obj); - - JSContextRef ctx_; - JSObjectRef instance_; - friend class JSValue; - friend class JSPropertyValue; -}; - -/// -/// JSFunction wrapper that automatically manages lifetime and provides -/// convenient function invocation operators. -/// -class AExport JSFunction { -public: - /// Create an empty Function. - /// NOTE: It is OKAY to create this without calling SetJSContext() first. - JSFunction(); - - /// Copy constructor (shallow copy, will point to same instance) - JSFunction(const JSFunction& other); - - ~JSFunction(); - - /// Assignment (shallow assignment, will point to same instance) - JSFunction& operator=(const JSFunction& other); - - /// Whether or not this is a valid, callable Function object. - bool IsValid() const; - - /// Call function (using Global Object for 'this') and return the result. - JSValue operator()(const JSArgs& args); - - /// Call function (with explicit object for 'this') and return the result - JSValue operator()(const JSObject& thisObject, const JSArgs& args); - - /// Get the underlying JSObjectRef (JavaScriptCore C API) - operator JSObjectRef() const { return instance_; } - - /// - /// Get the bound context for this JSFunction (it is cached at creation). - /// - JSContextRef context() const { return ctx_; } - - /// - /// Set the JSContext for this JSFunction. - /// - /// **Note**: - /// JSFunctions created from within a JSCallback have a temporary JSContext - /// that is destroyed when the callback returns. You will need to "move" - /// any JSFunctions created within these callbacks to the View's main context - /// (call set_context() with the main context) before using them outside - /// the callback. - /// - void set_context(JSContextRef context) { ctx_ = context; } - -protected: - JSFunction(JSContextRef ctx, JSValueRef val); - - JSContextRef ctx_; - JSObjectRef instance_; - friend class JSValue; -}; - -/// -/// Get the Global Object for the current JSContext. -/// In JavaScript, this would be equivalent to the "window" object. -/// -JSObject AExport JSGlobalObject(); - -/// -/// Evaluate a string of JavaScript and return a result. -/// -JSValue AExport JSEval(const JSString& str); - -} // namespace ultralight diff --git a/engine/inc/AppCore/Monitor.h b/engine/inc/AppCore/Monitor.h deleted file mode 100644 index 54951175..00000000 --- a/engine/inc/AppCore/Monitor.h +++ /dev/null @@ -1,41 +0,0 @@ -/// -/// @file Monitor.h -/// -/// @brief The header for the Monitor class. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2019 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include "Defines.h" - -namespace ultralight { - -/// -/// Monitor class, represents a platform monitor. -/// -class AExport Monitor { -public: - virtual ~Monitor() {} - - /// - /// Get the DPI scale (1.0 = 100%) - /// - virtual double scale() const = 0; - - /// - /// Get the width of the monitor. - /// - virtual uint32_t width() const = 0; - - /// Get the height of the monitor. - /// - virtual uint32_t height() const = 0; -}; - -} // namespace ultralight diff --git a/engine/inc/AppCore/Overlay.h b/engine/inc/AppCore/Overlay.h deleted file mode 100644 index 2881dc14..00000000 --- a/engine/inc/AppCore/Overlay.h +++ /dev/null @@ -1,141 +0,0 @@ -/// -/// @file Overlay.h -/// -/// @brief The header for the Overlay class. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2019 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include "Window.h" -#include - -namespace ultralight { - -/// -/// Web-content overlay. Displays a web-page within an area of the main window. -/// -/// @note Each Overlay is essentially a View and an on-screen quad. You should -/// create the Overlay then load content into the underlying View. -/// -class AExport Overlay : public RefCounted { -public: - /// - /// Create a new Overlay. - /// - /// @param window The window to create the Overlay in. (we currently only - /// support one window per application) - /// - /// @param width The width in pixels. - /// - /// @param height The height in pixels. - /// - /// @param x The x-position (offset from the left of the Window), in - /// pixels. - /// - /// @param y The y-position (offset from the top of the Window), in - /// pixels. - /// - static Ref Create(Ref window, uint32_t width, - uint32_t height, int x, int y); - - /// - /// Create a new Overlay, wrapping an existing View. - /// - /// @param window The window to create the Overlay in. (we currently only - /// support one window per application) - /// - /// @param view The View to wrap (will use its width and height). - /// - /// @param x The x-position (offset from the left of the Window), in - /// pixels. - /// - /// @param y The y-position (offset from the top of the Window), in - /// pixels. - /// - static Ref Create(Ref window, Ref view, int x, int y); - - /// - /// Get the underlying View. - /// - virtual ultralight::Ref view() = 0; - - /// - /// Get the width (in pixels). - /// - virtual uint32_t width() const = 0; - - /// - /// Get the height (in pixels). - /// - virtual uint32_t height() const = 0; - - /// - /// Get the x-position (offset from the left of the Window), in pixels. - /// - virtual int x() const = 0; - - /// - /// Get the y-position (offset from the top of the Window), in pixels. - /// - virtual int y() const = 0; - - /// - /// Whether or not the overlay is hidden (not drawn). - /// - virtual bool is_hidden() const = 0; - - /// - /// Hide the overlay (will no longer be drawn) - /// - virtual void Hide() = 0; - - /// - /// Show the overlay. - /// - virtual void Show() = 0; - - /// - /// Whether or not this overlay has keyboard focus. - /// - virtual bool has_focus() const = 0; - - /// - /// Grant this overlay exclusive keyboard focus. - /// - virtual void Focus() = 0; - - /// - /// Remove keyboard focus. - /// - virtual void Unfocus() = 0; - - /// - /// Move the overlay to a new position (in pixels). - /// - virtual void MoveTo(int x, int y) = 0; - - /// - /// Resize the overlay (and underlying View), dimensions should be - /// specified in pixels. - /// - virtual void Resize(uint32_t width, uint32_t height) = 0; - - /// - /// Whether or not this Overlay needs repaint (either it has moved, resized, - /// or the internal View needs repaint). - /// - virtual bool NeedsRepaint() = 0; - -protected: - virtual ~Overlay(); - virtual void Draw() = 0; - friend class OverlayManager; -}; - -} // namespace framework diff --git a/engine/inc/AppCore/Platform.h b/engine/inc/AppCore/Platform.h deleted file mode 100644 index 653f7186..00000000 --- a/engine/inc/AppCore/Platform.h +++ /dev/null @@ -1,53 +0,0 @@ -/// -/// @file Platform.h -/// -/// @brief The header for the Platform helpers. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2020 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include "Defines.h" -#include -#include -#include -#include - -namespace ultralight { - -/// -/// Get the native font loader for the current platform. -/// -/// @note This singleton is owned by the library, do not destroy it. -/// -AExport FontLoader* GetPlatformFontLoader(); - -/// -/// Get the native file system for the current platform, creating it if it -/// doesn't exist using the base directory provided. -/// -/// This is used to load data for file:/// URLs. -/// -/// @param baseDir An base file path that will be used to resolve relative -/// file paths. You can optionally specify "@resource_path" -/// on macOS to use the app bundle's resource path. -/// -/// @note This singleton is owned by the library, do not destroy it. -/// -AExport FileSystem* GetPlatformFileSystem(const String& baseDir); - -/// -/// Get the default logger (writes the log to a file on disk). -/// -/// @param logPath A file path to write the log to. -/// -/// @note This singleton is owned by the library, do not destroy it. -/// -AExport Logger* GetDefaultLogger(const String& logPath); - -} // namespace ultralight diff --git a/engine/inc/AppCore/Window.h b/engine/inc/AppCore/Window.h deleted file mode 100644 index 13b2a8ae..00000000 --- a/engine/inc/AppCore/Window.h +++ /dev/null @@ -1,157 +0,0 @@ -/// -/// @file Window.h -/// -/// @brief The header for the Window class. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2019 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include "Defines.h" -#include -#include -#include - -namespace ultralight { - -class Monitor; -class OverlayManager; -class Surface; - -/// -/// Interface for all Window-related events. @see Window::set_listener -/// -class WindowListener { -public: - virtual ~WindowListener() {} - - /// - /// Called when the Window is closed. - /// - virtual void OnClose() = 0; - - /// - /// Called when the Window is resized. - /// - /// @param width The new width (in pixels). - /// - /// @param height The new height (in pixels). - /// - virtual void OnResize(uint32_t width, uint32_t height) = 0; -}; - -/// -/// Window creation flags. @see Window::Create -/// -enum WindowFlags : uint8_t { - kWindowFlags_Borderless = 1 << 0, - kWindowFlags_Titled = 1 << 1, - kWindowFlags_Resizable = 1 << 2, - kWindowFlags_Maximizable = 1 << 3, -}; - -/// -/// Window class, represents a platform window. -/// -class AExport Window : public RefCounted { -public: - /// - /// Create a new Window. - /// - /// @param monitor The monitor to create the Window on. - /// - /// @param width The width (in device coordinates). - /// - /// @param height The height (in device coordinates). - /// - /// @param fullscreen Whether or not the window is fullscreen. - /// - /// @param window_flags Various window flags. - /// - static Ref Create(Monitor* monitor, uint32_t width, uint32_t height, - bool fullscreen, unsigned int window_flags); - - /// - /// Set a WindowListener to receive callbacks for window-related events. - /// - /// @note Ownership remains with the caller. - /// - virtual void set_listener(WindowListener* listener) = 0; - - /// - /// Get the WindowListener, if any. - /// - virtual WindowListener* listener() = 0; - - /// - /// Get the window width (in pixels). - /// - virtual uint32_t width() const = 0; - - /// - /// Get the window height (in pixels). - /// - virtual uint32_t height() const = 0; - - /// - /// Whether or not the window is fullscreen. - /// - virtual bool is_fullscreen() const = 0; - - /// - /// The DPI scale of the window. - /// - virtual double scale() const = 0; - - /// - /// Set the window title. - /// - virtual void SetTitle(const char* title) = 0; - - /// - /// Set the cursor. - /// - virtual void SetCursor(ultralight::Cursor cursor) = 0; - - /// - /// Close the window. - /// - virtual void Close() = 0; - - /// - /// Convert device coordinates to pixels using the current DPI scale. - /// - virtual int DeviceToPixels(int val) const = 0; - - /// - /// Convert pixels to device coordinates using the current DPI scale. - /// - virtual int PixelsToDevice(int val) const = 0; - - /// - /// Draw a surface directly to window, used only by CPU renderer - /// - virtual void DrawSurface(int x, int y, Surface* surface) {} - - /// - /// Get the underlying native window handle. - /// - /// @note This is: - HWND on Windows - /// - NSWindow* on macOS - /// - GLFWwindow* on Linux - /// - virtual void* native_handle() const = 0; - -protected: - virtual ~Window(); - virtual OverlayManager* overlay_manager() const = 0; - - friend class OverlayImpl; -}; - -} // namespace ultralight diff --git a/engine/inc/GL/glext.h b/engine/inc/GL/glext.h deleted file mode 100644 index b5b7678b..00000000 --- a/engine/inc/GL/glext.h +++ /dev/null @@ -1,11028 +0,0 @@ -#ifndef __glext_h_ -#define __glext_h_ - -#ifdef __cplusplus -extern "C" { -#endif - -/* -** Copyright (c) 2007-2010 The Khronos Group Inc. -** -** Permission is hereby granted, free of charge, to any person obtaining a -** copy of this software and/or associated documentation files (the -** "Materials"), to deal in the Materials without restriction, including -** without limitation the rights to use, copy, modify, merge, publish, -** distribute, sublicense, and/or sell copies of the Materials, and to -** permit persons to whom the Materials are furnished to do so, subject to -** the following conditions: -** -** The above copyright notice and this permission notice shall be included -** in all copies or substantial portions of the Materials. -** -** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. -*/ - -/* Header file version number, required by OpenGL ABI for Linux */ -/* glext.h last updated $Date: 2010-08-03 01:30:25 -0700 (Tue, 03 Aug 2010) $ */ -/* Current version at http://www.opengl.org/registry/ */ -#define GL_GLEXT_VERSION 64 -/* Function declaration macros - to move into glplatform.h */ - -#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) -#define WIN32_LEAN_AND_MEAN 1 -#include -#endif - -#ifndef APIENTRY -#define APIENTRY -#endif -#ifndef APIENTRYP -#define APIENTRYP APIENTRY * -#endif -#ifndef GLAPI -#define GLAPI extern -#endif - -/*************************************************************/ - -#ifndef GL_VERSION_1_2 -#define GL_UNSIGNED_BYTE_3_3_2 0x8032 -#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 -#define GL_UNSIGNED_INT_8_8_8_8 0x8035 -#define GL_UNSIGNED_INT_10_10_10_2 0x8036 -#define GL_TEXTURE_BINDING_3D 0x806A -#define GL_PACK_SKIP_IMAGES 0x806B -#define GL_PACK_IMAGE_HEIGHT 0x806C -#define GL_UNPACK_SKIP_IMAGES 0x806D -#define GL_UNPACK_IMAGE_HEIGHT 0x806E -#define GL_TEXTURE_3D 0x806F -#define GL_PROXY_TEXTURE_3D 0x8070 -#define GL_TEXTURE_DEPTH 0x8071 -#define GL_TEXTURE_WRAP_R 0x8072 -#define GL_MAX_3D_TEXTURE_SIZE 0x8073 -#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 -#define GL_UNSIGNED_SHORT_5_6_5 0x8363 -#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 -#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 -#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 -#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 -#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 -#define GL_BGR 0x80E0 -#define GL_BGRA 0x80E1 -#define GL_MAX_ELEMENTS_VERTICES 0x80E8 -#define GL_MAX_ELEMENTS_INDICES 0x80E9 -#define GL_CLAMP_TO_EDGE 0x812F -#define GL_TEXTURE_MIN_LOD 0x813A -#define GL_TEXTURE_MAX_LOD 0x813B -#define GL_TEXTURE_BASE_LEVEL 0x813C -#define GL_TEXTURE_MAX_LEVEL 0x813D -#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 -#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 -#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 -#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 -#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E -#endif - -#ifndef GL_VERSION_1_2_DEPRECATED -#define GL_RESCALE_NORMAL 0x803A -#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 -#define GL_SINGLE_COLOR 0x81F9 -#define GL_SEPARATE_SPECULAR_COLOR 0x81FA -#define GL_ALIASED_POINT_SIZE_RANGE 0x846D -#endif - -#ifndef GL_ARB_imaging -#define GL_CONSTANT_COLOR 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 -#define GL_CONSTANT_ALPHA 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 -#define GL_BLEND_COLOR 0x8005 -#define GL_FUNC_ADD 0x8006 -#define GL_MIN 0x8007 -#define GL_MAX 0x8008 -#define GL_BLEND_EQUATION 0x8009 -#define GL_FUNC_SUBTRACT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT 0x800B -#endif - -#ifndef GL_ARB_imaging_DEPRECATED -#define GL_CONVOLUTION_1D 0x8010 -#define GL_CONVOLUTION_2D 0x8011 -#define GL_SEPARABLE_2D 0x8012 -#define GL_CONVOLUTION_BORDER_MODE 0x8013 -#define GL_CONVOLUTION_FILTER_SCALE 0x8014 -#define GL_CONVOLUTION_FILTER_BIAS 0x8015 -#define GL_REDUCE 0x8016 -#define GL_CONVOLUTION_FORMAT 0x8017 -#define GL_CONVOLUTION_WIDTH 0x8018 -#define GL_CONVOLUTION_HEIGHT 0x8019 -#define GL_MAX_CONVOLUTION_WIDTH 0x801A -#define GL_MAX_CONVOLUTION_HEIGHT 0x801B -#define GL_POST_CONVOLUTION_RED_SCALE 0x801C -#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D -#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E -#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F -#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 -#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 -#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 -#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 -#define GL_HISTOGRAM 0x8024 -#define GL_PROXY_HISTOGRAM 0x8025 -#define GL_HISTOGRAM_WIDTH 0x8026 -#define GL_HISTOGRAM_FORMAT 0x8027 -#define GL_HISTOGRAM_RED_SIZE 0x8028 -#define GL_HISTOGRAM_GREEN_SIZE 0x8029 -#define GL_HISTOGRAM_BLUE_SIZE 0x802A -#define GL_HISTOGRAM_ALPHA_SIZE 0x802B -#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C -#define GL_HISTOGRAM_SINK 0x802D -#define GL_MINMAX 0x802E -#define GL_MINMAX_FORMAT 0x802F -#define GL_MINMAX_SINK 0x8030 -#define GL_TABLE_TOO_LARGE 0x8031 -#define GL_COLOR_MATRIX 0x80B1 -#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 -#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 -#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 -#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 -#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 -#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 -#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 -#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 -#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA -#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB -#define GL_COLOR_TABLE 0x80D0 -#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 -#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 -#define GL_PROXY_COLOR_TABLE 0x80D3 -#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 -#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 -#define GL_COLOR_TABLE_SCALE 0x80D6 -#define GL_COLOR_TABLE_BIAS 0x80D7 -#define GL_COLOR_TABLE_FORMAT 0x80D8 -#define GL_COLOR_TABLE_WIDTH 0x80D9 -#define GL_COLOR_TABLE_RED_SIZE 0x80DA -#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB -#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC -#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD -#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE -#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF -#define GL_CONSTANT_BORDER 0x8151 -#define GL_REPLICATE_BORDER 0x8153 -#define GL_CONVOLUTION_BORDER_COLOR 0x8154 -#endif - -#ifndef GL_VERSION_1_3 -#define GL_TEXTURE0 0x84C0 -#define GL_TEXTURE1 0x84C1 -#define GL_TEXTURE2 0x84C2 -#define GL_TEXTURE3 0x84C3 -#define GL_TEXTURE4 0x84C4 -#define GL_TEXTURE5 0x84C5 -#define GL_TEXTURE6 0x84C6 -#define GL_TEXTURE7 0x84C7 -#define GL_TEXTURE8 0x84C8 -#define GL_TEXTURE9 0x84C9 -#define GL_TEXTURE10 0x84CA -#define GL_TEXTURE11 0x84CB -#define GL_TEXTURE12 0x84CC -#define GL_TEXTURE13 0x84CD -#define GL_TEXTURE14 0x84CE -#define GL_TEXTURE15 0x84CF -#define GL_TEXTURE16 0x84D0 -#define GL_TEXTURE17 0x84D1 -#define GL_TEXTURE18 0x84D2 -#define GL_TEXTURE19 0x84D3 -#define GL_TEXTURE20 0x84D4 -#define GL_TEXTURE21 0x84D5 -#define GL_TEXTURE22 0x84D6 -#define GL_TEXTURE23 0x84D7 -#define GL_TEXTURE24 0x84D8 -#define GL_TEXTURE25 0x84D9 -#define GL_TEXTURE26 0x84DA -#define GL_TEXTURE27 0x84DB -#define GL_TEXTURE28 0x84DC -#define GL_TEXTURE29 0x84DD -#define GL_TEXTURE30 0x84DE -#define GL_TEXTURE31 0x84DF -#define GL_ACTIVE_TEXTURE 0x84E0 -#define GL_MULTISAMPLE 0x809D -#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE 0x809F -#define GL_SAMPLE_COVERAGE 0x80A0 -#define GL_SAMPLE_BUFFERS 0x80A8 -#define GL_SAMPLES 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT 0x80AB -#define GL_TEXTURE_CUBE_MAP 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C -#define GL_COMPRESSED_RGB 0x84ED -#define GL_COMPRESSED_RGBA 0x84EE -#define GL_TEXTURE_COMPRESSION_HINT 0x84EF -#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 -#define GL_TEXTURE_COMPRESSED 0x86A1 -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 -#define GL_CLAMP_TO_BORDER 0x812D -#endif - -#ifndef GL_VERSION_1_3_DEPRECATED -#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 -#define GL_MAX_TEXTURE_UNITS 0x84E2 -#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 -#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 -#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 -#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 -#define GL_MULTISAMPLE_BIT 0x20000000 -#define GL_NORMAL_MAP 0x8511 -#define GL_REFLECTION_MAP 0x8512 -#define GL_COMPRESSED_ALPHA 0x84E9 -#define GL_COMPRESSED_LUMINANCE 0x84EA -#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB -#define GL_COMPRESSED_INTENSITY 0x84EC -#define GL_COMBINE 0x8570 -#define GL_COMBINE_RGB 0x8571 -#define GL_COMBINE_ALPHA 0x8572 -#define GL_SOURCE0_RGB 0x8580 -#define GL_SOURCE1_RGB 0x8581 -#define GL_SOURCE2_RGB 0x8582 -#define GL_SOURCE0_ALPHA 0x8588 -#define GL_SOURCE1_ALPHA 0x8589 -#define GL_SOURCE2_ALPHA 0x858A -#define GL_OPERAND0_RGB 0x8590 -#define GL_OPERAND1_RGB 0x8591 -#define GL_OPERAND2_RGB 0x8592 -#define GL_OPERAND0_ALPHA 0x8598 -#define GL_OPERAND1_ALPHA 0x8599 -#define GL_OPERAND2_ALPHA 0x859A -#define GL_RGB_SCALE 0x8573 -#define GL_ADD_SIGNED 0x8574 -#define GL_INTERPOLATE 0x8575 -#define GL_SUBTRACT 0x84E7 -#define GL_CONSTANT 0x8576 -#define GL_PRIMARY_COLOR 0x8577 -#define GL_PREVIOUS 0x8578 -#define GL_DOT3_RGB 0x86AE -#define GL_DOT3_RGBA 0x86AF -#endif - -#ifndef GL_VERSION_1_4 -#define GL_BLEND_DST_RGB 0x80C8 -#define GL_BLEND_SRC_RGB 0x80C9 -#define GL_BLEND_DST_ALPHA 0x80CA -#define GL_BLEND_SRC_ALPHA 0x80CB -#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 -#define GL_DEPTH_COMPONENT16 0x81A5 -#define GL_DEPTH_COMPONENT24 0x81A6 -#define GL_DEPTH_COMPONENT32 0x81A7 -#define GL_MIRRORED_REPEAT 0x8370 -#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD -#define GL_TEXTURE_LOD_BIAS 0x8501 -#define GL_INCR_WRAP 0x8507 -#define GL_DECR_WRAP 0x8508 -#define GL_TEXTURE_DEPTH_SIZE 0x884A -#define GL_TEXTURE_COMPARE_MODE 0x884C -#define GL_TEXTURE_COMPARE_FUNC 0x884D -#endif - -#ifndef GL_VERSION_1_4_DEPRECATED -#define GL_POINT_SIZE_MIN 0x8126 -#define GL_POINT_SIZE_MAX 0x8127 -#define GL_POINT_DISTANCE_ATTENUATION 0x8129 -#define GL_GENERATE_MIPMAP 0x8191 -#define GL_GENERATE_MIPMAP_HINT 0x8192 -#define GL_FOG_COORDINATE_SOURCE 0x8450 -#define GL_FOG_COORDINATE 0x8451 -#define GL_FRAGMENT_DEPTH 0x8452 -#define GL_CURRENT_FOG_COORDINATE 0x8453 -#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 -#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 -#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 -#define GL_FOG_COORDINATE_ARRAY 0x8457 -#define GL_COLOR_SUM 0x8458 -#define GL_CURRENT_SECONDARY_COLOR 0x8459 -#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A -#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B -#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C -#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D -#define GL_SECONDARY_COLOR_ARRAY 0x845E -#define GL_TEXTURE_FILTER_CONTROL 0x8500 -#define GL_DEPTH_TEXTURE_MODE 0x884B -#define GL_COMPARE_R_TO_TEXTURE 0x884E -#endif - -#ifndef GL_VERSION_1_5 -#define GL_BUFFER_SIZE 0x8764 -#define GL_BUFFER_USAGE 0x8765 -#define GL_QUERY_COUNTER_BITS 0x8864 -#define GL_CURRENT_QUERY 0x8865 -#define GL_QUERY_RESULT 0x8866 -#define GL_QUERY_RESULT_AVAILABLE 0x8867 -#define GL_ARRAY_BUFFER 0x8892 -#define GL_ELEMENT_ARRAY_BUFFER 0x8893 -#define GL_ARRAY_BUFFER_BINDING 0x8894 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 -#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F -#define GL_READ_ONLY 0x88B8 -#define GL_WRITE_ONLY 0x88B9 -#define GL_READ_WRITE 0x88BA -#define GL_BUFFER_ACCESS 0x88BB -#define GL_BUFFER_MAPPED 0x88BC -#define GL_BUFFER_MAP_POINTER 0x88BD -#define GL_STREAM_DRAW 0x88E0 -#define GL_STREAM_READ 0x88E1 -#define GL_STREAM_COPY 0x88E2 -#define GL_STATIC_DRAW 0x88E4 -#define GL_STATIC_READ 0x88E5 -#define GL_STATIC_COPY 0x88E6 -#define GL_DYNAMIC_DRAW 0x88E8 -#define GL_DYNAMIC_READ 0x88E9 -#define GL_DYNAMIC_COPY 0x88EA -#define GL_SAMPLES_PASSED 0x8914 -#endif - -#ifndef GL_VERSION_1_5_DEPRECATED -#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 -#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 -#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 -#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 -#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A -#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B -#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C -#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D -#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E -#define GL_FOG_COORD_SRC 0x8450 -#define GL_FOG_COORD 0x8451 -#define GL_CURRENT_FOG_COORD 0x8453 -#define GL_FOG_COORD_ARRAY_TYPE 0x8454 -#define GL_FOG_COORD_ARRAY_STRIDE 0x8455 -#define GL_FOG_COORD_ARRAY_POINTER 0x8456 -#define GL_FOG_COORD_ARRAY 0x8457 -#define GL_FOG_COORD_ARRAY_BUFFER_BINDING 0x889D -#define GL_SRC0_RGB 0x8580 -#define GL_SRC1_RGB 0x8581 -#define GL_SRC2_RGB 0x8582 -#define GL_SRC0_ALPHA 0x8588 -#define GL_SRC1_ALPHA 0x8589 -#define GL_SRC2_ALPHA 0x858A -#endif - -#ifndef GL_VERSION_2_0 -#define GL_BLEND_EQUATION_RGB 0x8009 -#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 -#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 -#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 -#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 -#define GL_CURRENT_VERTEX_ATTRIB 0x8626 -#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 -#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 -#define GL_STENCIL_BACK_FUNC 0x8800 -#define GL_STENCIL_BACK_FAIL 0x8801 -#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 -#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 -#define GL_MAX_DRAW_BUFFERS 0x8824 -#define GL_DRAW_BUFFER0 0x8825 -#define GL_DRAW_BUFFER1 0x8826 -#define GL_DRAW_BUFFER2 0x8827 -#define GL_DRAW_BUFFER3 0x8828 -#define GL_DRAW_BUFFER4 0x8829 -#define GL_DRAW_BUFFER5 0x882A -#define GL_DRAW_BUFFER6 0x882B -#define GL_DRAW_BUFFER7 0x882C -#define GL_DRAW_BUFFER8 0x882D -#define GL_DRAW_BUFFER9 0x882E -#define GL_DRAW_BUFFER10 0x882F -#define GL_DRAW_BUFFER11 0x8830 -#define GL_DRAW_BUFFER12 0x8831 -#define GL_DRAW_BUFFER13 0x8832 -#define GL_DRAW_BUFFER14 0x8833 -#define GL_DRAW_BUFFER15 0x8834 -#define GL_BLEND_EQUATION_ALPHA 0x883D -#define GL_MAX_VERTEX_ATTRIBS 0x8869 -#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A -#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 -#define GL_FRAGMENT_SHADER 0x8B30 -#define GL_VERTEX_SHADER 0x8B31 -#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 -#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A -#define GL_MAX_VARYING_FLOATS 0x8B4B -#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C -#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D -#define GL_SHADER_TYPE 0x8B4F -#define GL_FLOAT_VEC2 0x8B50 -#define GL_FLOAT_VEC3 0x8B51 -#define GL_FLOAT_VEC4 0x8B52 -#define GL_INT_VEC2 0x8B53 -#define GL_INT_VEC3 0x8B54 -#define GL_INT_VEC4 0x8B55 -#define GL_BOOL 0x8B56 -#define GL_BOOL_VEC2 0x8B57 -#define GL_BOOL_VEC3 0x8B58 -#define GL_BOOL_VEC4 0x8B59 -#define GL_FLOAT_MAT2 0x8B5A -#define GL_FLOAT_MAT3 0x8B5B -#define GL_FLOAT_MAT4 0x8B5C -#define GL_SAMPLER_1D 0x8B5D -#define GL_SAMPLER_2D 0x8B5E -#define GL_SAMPLER_3D 0x8B5F -#define GL_SAMPLER_CUBE 0x8B60 -#define GL_SAMPLER_1D_SHADOW 0x8B61 -#define GL_SAMPLER_2D_SHADOW 0x8B62 -#define GL_DELETE_STATUS 0x8B80 -#define GL_COMPILE_STATUS 0x8B81 -#define GL_LINK_STATUS 0x8B82 -#define GL_VALIDATE_STATUS 0x8B83 -#define GL_INFO_LOG_LENGTH 0x8B84 -#define GL_ATTACHED_SHADERS 0x8B85 -#define GL_ACTIVE_UNIFORMS 0x8B86 -#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 -#define GL_SHADER_SOURCE_LENGTH 0x8B88 -#define GL_ACTIVE_ATTRIBUTES 0x8B89 -#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B -#define GL_SHADING_LANGUAGE_VERSION 0x8B8C -#define GL_CURRENT_PROGRAM 0x8B8D -#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 -#define GL_LOWER_LEFT 0x8CA1 -#define GL_UPPER_LEFT 0x8CA2 -#define GL_STENCIL_BACK_REF 0x8CA3 -#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 -#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 -#endif - -#ifndef GL_VERSION_2_0_DEPRECATED -#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 -#define GL_POINT_SPRITE 0x8861 -#define GL_COORD_REPLACE 0x8862 -#define GL_MAX_TEXTURE_COORDS 0x8871 -#endif - -#ifndef GL_VERSION_2_1 -#define GL_PIXEL_PACK_BUFFER 0x88EB -#define GL_PIXEL_UNPACK_BUFFER 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF -#define GL_FLOAT_MAT2x3 0x8B65 -#define GL_FLOAT_MAT2x4 0x8B66 -#define GL_FLOAT_MAT3x2 0x8B67 -#define GL_FLOAT_MAT3x4 0x8B68 -#define GL_FLOAT_MAT4x2 0x8B69 -#define GL_FLOAT_MAT4x3 0x8B6A -#define GL_SRGB 0x8C40 -#define GL_SRGB8 0x8C41 -#define GL_SRGB_ALPHA 0x8C42 -#define GL_SRGB8_ALPHA8 0x8C43 -#define GL_COMPRESSED_SRGB 0x8C48 -#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 -#endif - -#ifndef GL_VERSION_2_1_DEPRECATED -#define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F -#define GL_SLUMINANCE_ALPHA 0x8C44 -#define GL_SLUMINANCE8_ALPHA8 0x8C45 -#define GL_SLUMINANCE 0x8C46 -#define GL_SLUMINANCE8 0x8C47 -#define GL_COMPRESSED_SLUMINANCE 0x8C4A -#define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B -#endif - -#ifndef GL_VERSION_3_0 -#define GL_COMPARE_REF_TO_TEXTURE 0x884E -#define GL_CLIP_DISTANCE0 0x3000 -#define GL_CLIP_DISTANCE1 0x3001 -#define GL_CLIP_DISTANCE2 0x3002 -#define GL_CLIP_DISTANCE3 0x3003 -#define GL_CLIP_DISTANCE4 0x3004 -#define GL_CLIP_DISTANCE5 0x3005 -#define GL_CLIP_DISTANCE6 0x3006 -#define GL_CLIP_DISTANCE7 0x3007 -#define GL_MAX_CLIP_DISTANCES 0x0D32 -#define GL_MAJOR_VERSION 0x821B -#define GL_MINOR_VERSION 0x821C -#define GL_NUM_EXTENSIONS 0x821D -#define GL_CONTEXT_FLAGS 0x821E -#define GL_DEPTH_BUFFER 0x8223 -#define GL_STENCIL_BUFFER 0x8224 -#define GL_COMPRESSED_RED 0x8225 -#define GL_COMPRESSED_RG 0x8226 -#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x0001 -#define GL_RGBA32F 0x8814 -#define GL_RGB32F 0x8815 -#define GL_RGBA16F 0x881A -#define GL_RGB16F 0x881B -#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD -#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF -#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 -#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 -#define GL_CLAMP_READ_COLOR 0x891C -#define GL_FIXED_ONLY 0x891D -#define GL_MAX_VARYING_COMPONENTS 0x8B4B -#define GL_TEXTURE_1D_ARRAY 0x8C18 -#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 -#define GL_TEXTURE_2D_ARRAY 0x8C1A -#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B -#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C -#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D -#define GL_R11F_G11F_B10F 0x8C3A -#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B -#define GL_RGB9_E5 0x8C3D -#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E -#define GL_TEXTURE_SHARED_SIZE 0x8C3F -#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 -#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 -#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 -#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 -#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 -#define GL_PRIMITIVES_GENERATED 0x8C87 -#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 -#define GL_RASTERIZER_DISCARD 0x8C89 -#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B -#define GL_INTERLEAVED_ATTRIBS 0x8C8C -#define GL_SEPARATE_ATTRIBS 0x8C8D -#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E -#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F -#define GL_RGBA32UI 0x8D70 -#define GL_RGB32UI 0x8D71 -#define GL_RGBA16UI 0x8D76 -#define GL_RGB16UI 0x8D77 -#define GL_RGBA8UI 0x8D7C -#define GL_RGB8UI 0x8D7D -#define GL_RGBA32I 0x8D82 -#define GL_RGB32I 0x8D83 -#define GL_RGBA16I 0x8D88 -#define GL_RGB16I 0x8D89 -#define GL_RGBA8I 0x8D8E -#define GL_RGB8I 0x8D8F -#define GL_RED_INTEGER 0x8D94 -#define GL_GREEN_INTEGER 0x8D95 -#define GL_BLUE_INTEGER 0x8D96 -#define GL_RGB_INTEGER 0x8D98 -#define GL_RGBA_INTEGER 0x8D99 -#define GL_BGR_INTEGER 0x8D9A -#define GL_BGRA_INTEGER 0x8D9B -#define GL_SAMPLER_1D_ARRAY 0x8DC0 -#define GL_SAMPLER_2D_ARRAY 0x8DC1 -#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 -#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 -#define GL_SAMPLER_CUBE_SHADOW 0x8DC5 -#define GL_UNSIGNED_INT_VEC2 0x8DC6 -#define GL_UNSIGNED_INT_VEC3 0x8DC7 -#define GL_UNSIGNED_INT_VEC4 0x8DC8 -#define GL_INT_SAMPLER_1D 0x8DC9 -#define GL_INT_SAMPLER_2D 0x8DCA -#define GL_INT_SAMPLER_3D 0x8DCB -#define GL_INT_SAMPLER_CUBE 0x8DCC -#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE -#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF -#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 -#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 -#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 -#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 -#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 -#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 -#define GL_QUERY_WAIT 0x8E13 -#define GL_QUERY_NO_WAIT 0x8E14 -#define GL_QUERY_BY_REGION_WAIT 0x8E15 -#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 -#define GL_BUFFER_ACCESS_FLAGS 0x911F -#define GL_BUFFER_MAP_LENGTH 0x9120 -#define GL_BUFFER_MAP_OFFSET 0x9121 -/* Reuse tokens from ARB_depth_buffer_float */ -/* reuse GL_DEPTH_COMPONENT32F */ -/* reuse GL_DEPTH32F_STENCIL8 */ -/* reuse GL_FLOAT_32_UNSIGNED_INT_24_8_REV */ -/* Reuse tokens from ARB_framebuffer_object */ -/* reuse GL_INVALID_FRAMEBUFFER_OPERATION */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE */ -/* reuse GL_FRAMEBUFFER_DEFAULT */ -/* reuse GL_FRAMEBUFFER_UNDEFINED */ -/* reuse GL_DEPTH_STENCIL_ATTACHMENT */ -/* reuse GL_INDEX */ -/* reuse GL_MAX_RENDERBUFFER_SIZE */ -/* reuse GL_DEPTH_STENCIL */ -/* reuse GL_UNSIGNED_INT_24_8 */ -/* reuse GL_DEPTH24_STENCIL8 */ -/* reuse GL_TEXTURE_STENCIL_SIZE */ -/* reuse GL_TEXTURE_RED_TYPE */ -/* reuse GL_TEXTURE_GREEN_TYPE */ -/* reuse GL_TEXTURE_BLUE_TYPE */ -/* reuse GL_TEXTURE_ALPHA_TYPE */ -/* reuse GL_TEXTURE_DEPTH_TYPE */ -/* reuse GL_UNSIGNED_NORMALIZED */ -/* reuse GL_FRAMEBUFFER_BINDING */ -/* reuse GL_DRAW_FRAMEBUFFER_BINDING */ -/* reuse GL_RENDERBUFFER_BINDING */ -/* reuse GL_READ_FRAMEBUFFER */ -/* reuse GL_DRAW_FRAMEBUFFER */ -/* reuse GL_READ_FRAMEBUFFER_BINDING */ -/* reuse GL_RENDERBUFFER_SAMPLES */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER */ -/* reuse GL_FRAMEBUFFER_COMPLETE */ -/* reuse GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT */ -/* reuse GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT */ -/* reuse GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER */ -/* reuse GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER */ -/* reuse GL_FRAMEBUFFER_UNSUPPORTED */ -/* reuse GL_MAX_COLOR_ATTACHMENTS */ -/* reuse GL_COLOR_ATTACHMENT0 */ -/* reuse GL_COLOR_ATTACHMENT1 */ -/* reuse GL_COLOR_ATTACHMENT2 */ -/* reuse GL_COLOR_ATTACHMENT3 */ -/* reuse GL_COLOR_ATTACHMENT4 */ -/* reuse GL_COLOR_ATTACHMENT5 */ -/* reuse GL_COLOR_ATTACHMENT6 */ -/* reuse GL_COLOR_ATTACHMENT7 */ -/* reuse GL_COLOR_ATTACHMENT8 */ -/* reuse GL_COLOR_ATTACHMENT9 */ -/* reuse GL_COLOR_ATTACHMENT10 */ -/* reuse GL_COLOR_ATTACHMENT11 */ -/* reuse GL_COLOR_ATTACHMENT12 */ -/* reuse GL_COLOR_ATTACHMENT13 */ -/* reuse GL_COLOR_ATTACHMENT14 */ -/* reuse GL_COLOR_ATTACHMENT15 */ -/* reuse GL_DEPTH_ATTACHMENT */ -/* reuse GL_STENCIL_ATTACHMENT */ -/* reuse GL_FRAMEBUFFER */ -/* reuse GL_RENDERBUFFER */ -/* reuse GL_RENDERBUFFER_WIDTH */ -/* reuse GL_RENDERBUFFER_HEIGHT */ -/* reuse GL_RENDERBUFFER_INTERNAL_FORMAT */ -/* reuse GL_STENCIL_INDEX1 */ -/* reuse GL_STENCIL_INDEX4 */ -/* reuse GL_STENCIL_INDEX8 */ -/* reuse GL_STENCIL_INDEX16 */ -/* reuse GL_RENDERBUFFER_RED_SIZE */ -/* reuse GL_RENDERBUFFER_GREEN_SIZE */ -/* reuse GL_RENDERBUFFER_BLUE_SIZE */ -/* reuse GL_RENDERBUFFER_ALPHA_SIZE */ -/* reuse GL_RENDERBUFFER_DEPTH_SIZE */ -/* reuse GL_RENDERBUFFER_STENCIL_SIZE */ -/* reuse GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE */ -/* reuse GL_MAX_SAMPLES */ -/* Reuse tokens from ARB_framebuffer_sRGB */ -/* reuse GL_FRAMEBUFFER_SRGB */ -/* Reuse tokens from ARB_half_float_vertex */ -/* reuse GL_HALF_FLOAT */ -/* Reuse tokens from ARB_map_buffer_range */ -/* reuse GL_MAP_READ_BIT */ -/* reuse GL_MAP_WRITE_BIT */ -/* reuse GL_MAP_INVALIDATE_RANGE_BIT */ -/* reuse GL_MAP_INVALIDATE_BUFFER_BIT */ -/* reuse GL_MAP_FLUSH_EXPLICIT_BIT */ -/* reuse GL_MAP_UNSYNCHRONIZED_BIT */ -/* Reuse tokens from ARB_texture_compression_rgtc */ -/* reuse GL_COMPRESSED_RED_RGTC1 */ -/* reuse GL_COMPRESSED_SIGNED_RED_RGTC1 */ -/* reuse GL_COMPRESSED_RG_RGTC2 */ -/* reuse GL_COMPRESSED_SIGNED_RG_RGTC2 */ -/* Reuse tokens from ARB_texture_rg */ -/* reuse GL_RG */ -/* reuse GL_RG_INTEGER */ -/* reuse GL_R8 */ -/* reuse GL_R16 */ -/* reuse GL_RG8 */ -/* reuse GL_RG16 */ -/* reuse GL_R16F */ -/* reuse GL_R32F */ -/* reuse GL_RG16F */ -/* reuse GL_RG32F */ -/* reuse GL_R8I */ -/* reuse GL_R8UI */ -/* reuse GL_R16I */ -/* reuse GL_R16UI */ -/* reuse GL_R32I */ -/* reuse GL_R32UI */ -/* reuse GL_RG8I */ -/* reuse GL_RG8UI */ -/* reuse GL_RG16I */ -/* reuse GL_RG16UI */ -/* reuse GL_RG32I */ -/* reuse GL_RG32UI */ -/* Reuse tokens from ARB_vertex_array_object */ -/* reuse GL_VERTEX_ARRAY_BINDING */ -#endif - -#ifndef GL_VERSION_3_0_DEPRECATED -#define GL_CLAMP_VERTEX_COLOR 0x891A -#define GL_CLAMP_FRAGMENT_COLOR 0x891B -#define GL_ALPHA_INTEGER 0x8D97 -/* Reuse tokens from ARB_framebuffer_object */ -/* reuse GL_TEXTURE_LUMINANCE_TYPE */ -/* reuse GL_TEXTURE_INTENSITY_TYPE */ -#endif - -#ifndef GL_VERSION_3_1 -#define GL_SAMPLER_2D_RECT 0x8B63 -#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 -#define GL_SAMPLER_BUFFER 0x8DC2 -#define GL_INT_SAMPLER_2D_RECT 0x8DCD -#define GL_INT_SAMPLER_BUFFER 0x8DD0 -#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 -#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 -#define GL_TEXTURE_BUFFER 0x8C2A -#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B -#define GL_TEXTURE_BINDING_BUFFER 0x8C2C -#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D -#define GL_TEXTURE_BUFFER_FORMAT 0x8C2E -#define GL_TEXTURE_RECTANGLE 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 -#define GL_RED_SNORM 0x8F90 -#define GL_RG_SNORM 0x8F91 -#define GL_RGB_SNORM 0x8F92 -#define GL_RGBA_SNORM 0x8F93 -#define GL_R8_SNORM 0x8F94 -#define GL_RG8_SNORM 0x8F95 -#define GL_RGB8_SNORM 0x8F96 -#define GL_RGBA8_SNORM 0x8F97 -#define GL_R16_SNORM 0x8F98 -#define GL_RG16_SNORM 0x8F99 -#define GL_RGB16_SNORM 0x8F9A -#define GL_RGBA16_SNORM 0x8F9B -#define GL_SIGNED_NORMALIZED 0x8F9C -#define GL_PRIMITIVE_RESTART 0x8F9D -#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E -/* Reuse tokens from ARB_copy_buffer */ -/* reuse GL_COPY_READ_BUFFER */ -/* reuse GL_COPY_WRITE_BUFFER */ -/* Reuse tokens from ARB_draw_instanced (none) */ -/* Reuse tokens from ARB_uniform_buffer_object */ -/* reuse GL_UNIFORM_BUFFER */ -/* reuse GL_UNIFORM_BUFFER_BINDING */ -/* reuse GL_UNIFORM_BUFFER_START */ -/* reuse GL_UNIFORM_BUFFER_SIZE */ -/* reuse GL_MAX_VERTEX_UNIFORM_BLOCKS */ -/* reuse GL_MAX_FRAGMENT_UNIFORM_BLOCKS */ -/* reuse GL_MAX_COMBINED_UNIFORM_BLOCKS */ -/* reuse GL_MAX_UNIFORM_BUFFER_BINDINGS */ -/* reuse GL_MAX_UNIFORM_BLOCK_SIZE */ -/* reuse GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS */ -/* reuse GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS */ -/* reuse GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT */ -/* reuse GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH */ -/* reuse GL_ACTIVE_UNIFORM_BLOCKS */ -/* reuse GL_UNIFORM_TYPE */ -/* reuse GL_UNIFORM_SIZE */ -/* reuse GL_UNIFORM_NAME_LENGTH */ -/* reuse GL_UNIFORM_BLOCK_INDEX */ -/* reuse GL_UNIFORM_OFFSET */ -/* reuse GL_UNIFORM_ARRAY_STRIDE */ -/* reuse GL_UNIFORM_MATRIX_STRIDE */ -/* reuse GL_UNIFORM_IS_ROW_MAJOR */ -/* reuse GL_UNIFORM_BLOCK_BINDING */ -/* reuse GL_UNIFORM_BLOCK_DATA_SIZE */ -/* reuse GL_UNIFORM_BLOCK_NAME_LENGTH */ -/* reuse GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS */ -/* reuse GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES */ -/* reuse GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER */ -/* reuse GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER */ -/* reuse GL_INVALID_INDEX */ -#endif - -#ifndef GL_VERSION_3_2 -#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 -#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 -#define GL_LINES_ADJACENCY 0x000A -#define GL_LINE_STRIP_ADJACENCY 0x000B -#define GL_TRIANGLES_ADJACENCY 0x000C -#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D -#define GL_PROGRAM_POINT_SIZE 0x8642 -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 -#define GL_GEOMETRY_SHADER 0x8DD9 -#define GL_GEOMETRY_VERTICES_OUT 0x8916 -#define GL_GEOMETRY_INPUT_TYPE 0x8917 -#define GL_GEOMETRY_OUTPUT_TYPE 0x8918 -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 -#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 -#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 -#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 -#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 -#define GL_CONTEXT_PROFILE_MASK 0x9126 -/* reuse GL_MAX_VARYING_COMPONENTS */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER */ -/* Reuse tokens from ARB_depth_clamp */ -/* reuse GL_DEPTH_CLAMP */ -/* Reuse tokens from ARB_draw_elements_base_vertex (none) */ -/* Reuse tokens from ARB_fragment_coord_conventions (none) */ -/* Reuse tokens from ARB_provoking_vertex */ -/* reuse GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION */ -/* reuse GL_FIRST_VERTEX_CONVENTION */ -/* reuse GL_LAST_VERTEX_CONVENTION */ -/* reuse GL_PROVOKING_VERTEX */ -/* Reuse tokens from ARB_seamless_cube_map */ -/* reuse GL_TEXTURE_CUBE_MAP_SEAMLESS */ -/* Reuse tokens from ARB_sync */ -/* reuse GL_MAX_SERVER_WAIT_TIMEOUT */ -/* reuse GL_OBJECT_TYPE */ -/* reuse GL_SYNC_CONDITION */ -/* reuse GL_SYNC_STATUS */ -/* reuse GL_SYNC_FLAGS */ -/* reuse GL_SYNC_FENCE */ -/* reuse GL_SYNC_GPU_COMMANDS_COMPLETE */ -/* reuse GL_UNSIGNALED */ -/* reuse GL_SIGNALED */ -/* reuse GL_ALREADY_SIGNALED */ -/* reuse GL_TIMEOUT_EXPIRED */ -/* reuse GL_CONDITION_SATISFIED */ -/* reuse GL_WAIT_FAILED */ -/* reuse GL_TIMEOUT_IGNORED */ -/* reuse GL_SYNC_FLUSH_COMMANDS_BIT */ -/* reuse GL_TIMEOUT_IGNORED */ -/* Reuse tokens from ARB_texture_multisample */ -/* reuse GL_SAMPLE_POSITION */ -/* reuse GL_SAMPLE_MASK */ -/* reuse GL_SAMPLE_MASK_VALUE */ -/* reuse GL_MAX_SAMPLE_MASK_WORDS */ -/* reuse GL_TEXTURE_2D_MULTISAMPLE */ -/* reuse GL_PROXY_TEXTURE_2D_MULTISAMPLE */ -/* reuse GL_TEXTURE_2D_MULTISAMPLE_ARRAY */ -/* reuse GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY */ -/* reuse GL_TEXTURE_BINDING_2D_MULTISAMPLE */ -/* reuse GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY */ -/* reuse GL_TEXTURE_SAMPLES */ -/* reuse GL_TEXTURE_FIXED_SAMPLE_LOCATIONS */ -/* reuse GL_SAMPLER_2D_MULTISAMPLE */ -/* reuse GL_INT_SAMPLER_2D_MULTISAMPLE */ -/* reuse GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE */ -/* reuse GL_SAMPLER_2D_MULTISAMPLE_ARRAY */ -/* reuse GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY */ -/* reuse GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY */ -/* reuse GL_MAX_COLOR_TEXTURE_SAMPLES */ -/* reuse GL_MAX_DEPTH_TEXTURE_SAMPLES */ -/* reuse GL_MAX_INTEGER_SAMPLES */ -/* Don't need to reuse tokens from ARB_vertex_array_bgra since they're already in 1.2 core */ -#endif - -#ifndef GL_VERSION_3_3 -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE -/* Reuse tokens from ARB_blend_func_extended */ -/* reuse GL_SRC1_COLOR */ -/* reuse GL_ONE_MINUS_SRC1_COLOR */ -/* reuse GL_ONE_MINUS_SRC1_ALPHA */ -/* reuse GL_MAX_DUAL_SOURCE_DRAW_BUFFERS */ -/* Reuse tokens from ARB_explicit_attrib_location (none) */ -/* Reuse tokens from ARB_occlusion_query2 */ -/* reuse GL_ANY_SAMPLES_PASSED */ -/* Reuse tokens from ARB_sampler_objects */ -/* reuse GL_SAMPLER_BINDING */ -/* Reuse tokens from ARB_shader_bit_encoding (none) */ -/* Reuse tokens from ARB_texture_rgb10_a2ui */ -/* reuse GL_RGB10_A2UI */ -/* Reuse tokens from ARB_texture_swizzle */ -/* reuse GL_TEXTURE_SWIZZLE_R */ -/* reuse GL_TEXTURE_SWIZZLE_G */ -/* reuse GL_TEXTURE_SWIZZLE_B */ -/* reuse GL_TEXTURE_SWIZZLE_A */ -/* reuse GL_TEXTURE_SWIZZLE_RGBA */ -/* Reuse tokens from ARB_timer_query */ -/* reuse GL_TIME_ELAPSED */ -/* reuse GL_TIMESTAMP */ -/* Reuse tokens from ARB_vertex_type_2_10_10_10_rev */ -/* reuse GL_INT_2_10_10_10_REV */ -#endif - -#ifndef GL_VERSION_4_0 -#define GL_SAMPLE_SHADING 0x8C36 -#define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37 -#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E -#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F -#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A -#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B -#define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C -#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D -#define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E -#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F -/* Reuse tokens from ARB_texture_query_lod (none) */ -/* Reuse tokens from ARB_draw_buffers_blend (none) */ -/* Reuse tokens from ARB_draw_indirect */ -/* reuse GL_DRAW_INDIRECT_BUFFER */ -/* reuse GL_DRAW_INDIRECT_BUFFER_BINDING */ -/* Reuse tokens from ARB_gpu_shader5 */ -/* reuse GL_GEOMETRY_SHADER_INVOCATIONS */ -/* reuse GL_MAX_GEOMETRY_SHADER_INVOCATIONS */ -/* reuse GL_MIN_FRAGMENT_INTERPOLATION_OFFSET */ -/* reuse GL_MAX_FRAGMENT_INTERPOLATION_OFFSET */ -/* reuse GL_FRAGMENT_INTERPOLATION_OFFSET_BITS */ -/* reuse GL_MAX_VERTEX_STREAMS */ -/* Reuse tokens from ARB_gpu_shader_fp64 */ -/* reuse GL_DOUBLE_VEC2 */ -/* reuse GL_DOUBLE_VEC3 */ -/* reuse GL_DOUBLE_VEC4 */ -/* reuse GL_DOUBLE_MAT2 */ -/* reuse GL_DOUBLE_MAT3 */ -/* reuse GL_DOUBLE_MAT4 */ -/* reuse GL_DOUBLE_MAT2x3 */ -/* reuse GL_DOUBLE_MAT2x4 */ -/* reuse GL_DOUBLE_MAT3x2 */ -/* reuse GL_DOUBLE_MAT3x4 */ -/* reuse GL_DOUBLE_MAT4x2 */ -/* reuse GL_DOUBLE_MAT4x3 */ -/* Reuse tokens from ARB_shader_subroutine */ -/* reuse GL_ACTIVE_SUBROUTINES */ -/* reuse GL_ACTIVE_SUBROUTINE_UNIFORMS */ -/* reuse GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS */ -/* reuse GL_ACTIVE_SUBROUTINE_MAX_LENGTH */ -/* reuse GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH */ -/* reuse GL_MAX_SUBROUTINES */ -/* reuse GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS */ -/* reuse GL_NUM_COMPATIBLE_SUBROUTINES */ -/* reuse GL_COMPATIBLE_SUBROUTINES */ -/* Reuse tokens from ARB_tessellation_shader */ -/* reuse GL_PATCHES */ -/* reuse GL_PATCH_VERTICES */ -/* reuse GL_PATCH_DEFAULT_INNER_LEVEL */ -/* reuse GL_PATCH_DEFAULT_OUTER_LEVEL */ -/* reuse GL_TESS_CONTROL_OUTPUT_VERTICES */ -/* reuse GL_TESS_GEN_MODE */ -/* reuse GL_TESS_GEN_SPACING */ -/* reuse GL_TESS_GEN_VERTEX_ORDER */ -/* reuse GL_TESS_GEN_POINT_MODE */ -/* reuse GL_ISOLINES */ -/* reuse GL_FRACTIONAL_ODD */ -/* reuse GL_FRACTIONAL_EVEN */ -/* reuse GL_MAX_PATCH_VERTICES */ -/* reuse GL_MAX_TESS_GEN_LEVEL */ -/* reuse GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS */ -/* reuse GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS */ -/* reuse GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS */ -/* reuse GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS */ -/* reuse GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS */ -/* reuse GL_MAX_TESS_PATCH_COMPONENTS */ -/* reuse GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS */ -/* reuse GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS */ -/* reuse GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS */ -/* reuse GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS */ -/* reuse GL_MAX_TESS_CONTROL_INPUT_COMPONENTS */ -/* reuse GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS */ -/* reuse GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS */ -/* reuse GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS */ -/* reuse GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER */ -/* reuse GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER */ -/* reuse GL_TESS_EVALUATION_SHADER */ -/* reuse GL_TESS_CONTROL_SHADER */ -/* Reuse tokens from ARB_texture_buffer_object_rgb32 (none) */ -/* Reuse tokens from ARB_transform_feedback2 */ -/* reuse GL_TRANSFORM_FEEDBACK */ -/* reuse GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED */ -/* reuse GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE */ -/* reuse GL_TRANSFORM_FEEDBACK_BINDING */ -/* Reuse tokens from ARB_transform_feedback3 */ -/* reuse GL_MAX_TRANSFORM_FEEDBACK_BUFFERS */ -/* reuse GL_MAX_VERTEX_STREAMS */ -#endif - -#ifndef GL_VERSION_4_1 -/* Reuse tokens from ARB_ES2_compatibility */ -/* reuse GL_FIXED */ -/* reuse GL_IMPLEMENTATION_COLOR_READ_TYPE */ -/* reuse GL_IMPLEMENTATION_COLOR_READ_FORMAT */ -/* reuse GL_LOW_FLOAT */ -/* reuse GL_MEDIUM_FLOAT */ -/* reuse GL_HIGH_FLOAT */ -/* reuse GL_LOW_INT */ -/* reuse GL_MEDIUM_INT */ -/* reuse GL_HIGH_INT */ -/* reuse GL_SHADER_COMPILER */ -/* reuse GL_NUM_SHADER_BINARY_FORMATS */ -/* reuse GL_MAX_VERTEX_UNIFORM_VECTORS */ -/* reuse GL_MAX_VARYING_VECTORS */ -/* reuse GL_MAX_FRAGMENT_UNIFORM_VECTORS */ -/* Reuse tokens from ARB_get_program_binary */ -/* reuse GL_PROGRAM_BINARY_RETRIEVABLE_HINT */ -/* reuse GL_PROGRAM_BINARY_LENGTH */ -/* reuse GL_NUM_PROGRAM_BINARY_FORMATS */ -/* reuse GL_PROGRAM_BINARY_FORMATS */ -/* Reuse tokens from ARB_separate_shader_objects */ -/* reuse GL_VERTEX_SHADER_BIT */ -/* reuse GL_FRAGMENT_SHADER_BIT */ -/* reuse GL_GEOMETRY_SHADER_BIT */ -/* reuse GL_TESS_CONTROL_SHADER_BIT */ -/* reuse GL_TESS_EVALUATION_SHADER_BIT */ -/* reuse GL_ALL_SHADER_BITS */ -/* reuse GL_PROGRAM_SEPARABLE */ -/* reuse GL_ACTIVE_PROGRAM */ -/* reuse GL_PROGRAM_PIPELINE_BINDING */ -/* Reuse tokens from ARB_shader_precision (none) */ -/* Reuse tokens from ARB_vertex_attrib_64bit - all are in GL 3.0 and 4.0 already */ -/* Reuse tokens from ARB_viewport_array - some are in GL 1.1 and ARB_provoking_vertex already */ -/* reuse GL_MAX_VIEWPORTS */ -/* reuse GL_VIEWPORT_SUBPIXEL_BITS */ -/* reuse GL_VIEWPORT_BOUNDS_RANGE */ -/* reuse GL_LAYER_PROVOKING_VERTEX */ -/* reuse GL_VIEWPORT_INDEX_PROVOKING_VERTEX */ -/* reuse GL_UNDEFINED_VERTEX */ -#endif - -#ifndef GL_ARB_multitexture -#define GL_TEXTURE0_ARB 0x84C0 -#define GL_TEXTURE1_ARB 0x84C1 -#define GL_TEXTURE2_ARB 0x84C2 -#define GL_TEXTURE3_ARB 0x84C3 -#define GL_TEXTURE4_ARB 0x84C4 -#define GL_TEXTURE5_ARB 0x84C5 -#define GL_TEXTURE6_ARB 0x84C6 -#define GL_TEXTURE7_ARB 0x84C7 -#define GL_TEXTURE8_ARB 0x84C8 -#define GL_TEXTURE9_ARB 0x84C9 -#define GL_TEXTURE10_ARB 0x84CA -#define GL_TEXTURE11_ARB 0x84CB -#define GL_TEXTURE12_ARB 0x84CC -#define GL_TEXTURE13_ARB 0x84CD -#define GL_TEXTURE14_ARB 0x84CE -#define GL_TEXTURE15_ARB 0x84CF -#define GL_TEXTURE16_ARB 0x84D0 -#define GL_TEXTURE17_ARB 0x84D1 -#define GL_TEXTURE18_ARB 0x84D2 -#define GL_TEXTURE19_ARB 0x84D3 -#define GL_TEXTURE20_ARB 0x84D4 -#define GL_TEXTURE21_ARB 0x84D5 -#define GL_TEXTURE22_ARB 0x84D6 -#define GL_TEXTURE23_ARB 0x84D7 -#define GL_TEXTURE24_ARB 0x84D8 -#define GL_TEXTURE25_ARB 0x84D9 -#define GL_TEXTURE26_ARB 0x84DA -#define GL_TEXTURE27_ARB 0x84DB -#define GL_TEXTURE28_ARB 0x84DC -#define GL_TEXTURE29_ARB 0x84DD -#define GL_TEXTURE30_ARB 0x84DE -#define GL_TEXTURE31_ARB 0x84DF -#define GL_ACTIVE_TEXTURE_ARB 0x84E0 -#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 -#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 -#endif - -#ifndef GL_ARB_transpose_matrix -#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 -#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 -#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 -#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 -#endif - -#ifndef GL_ARB_multisample -#define GL_MULTISAMPLE_ARB 0x809D -#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F -#define GL_SAMPLE_COVERAGE_ARB 0x80A0 -#define GL_SAMPLE_BUFFERS_ARB 0x80A8 -#define GL_SAMPLES_ARB 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB -#define GL_MULTISAMPLE_BIT_ARB 0x20000000 -#endif - -#ifndef GL_ARB_texture_env_add -#endif - -#ifndef GL_ARB_texture_cube_map -#define GL_NORMAL_MAP_ARB 0x8511 -#define GL_REFLECTION_MAP_ARB 0x8512 -#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C -#endif - -#ifndef GL_ARB_texture_compression -#define GL_COMPRESSED_ALPHA_ARB 0x84E9 -#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA -#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB -#define GL_COMPRESSED_INTENSITY_ARB 0x84EC -#define GL_COMPRESSED_RGB_ARB 0x84ED -#define GL_COMPRESSED_RGBA_ARB 0x84EE -#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF -#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 -#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 -#endif - -#ifndef GL_ARB_texture_border_clamp -#define GL_CLAMP_TO_BORDER_ARB 0x812D -#endif - -#ifndef GL_ARB_point_parameters -#define GL_POINT_SIZE_MIN_ARB 0x8126 -#define GL_POINT_SIZE_MAX_ARB 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 -#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 -#endif - -#ifndef GL_ARB_vertex_blend -#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 -#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 -#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 -#define GL_VERTEX_BLEND_ARB 0x86A7 -#define GL_CURRENT_WEIGHT_ARB 0x86A8 -#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 -#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA -#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB -#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC -#define GL_WEIGHT_ARRAY_ARB 0x86AD -#define GL_MODELVIEW0_ARB 0x1700 -#define GL_MODELVIEW1_ARB 0x850A -#define GL_MODELVIEW2_ARB 0x8722 -#define GL_MODELVIEW3_ARB 0x8723 -#define GL_MODELVIEW4_ARB 0x8724 -#define GL_MODELVIEW5_ARB 0x8725 -#define GL_MODELVIEW6_ARB 0x8726 -#define GL_MODELVIEW7_ARB 0x8727 -#define GL_MODELVIEW8_ARB 0x8728 -#define GL_MODELVIEW9_ARB 0x8729 -#define GL_MODELVIEW10_ARB 0x872A -#define GL_MODELVIEW11_ARB 0x872B -#define GL_MODELVIEW12_ARB 0x872C -#define GL_MODELVIEW13_ARB 0x872D -#define GL_MODELVIEW14_ARB 0x872E -#define GL_MODELVIEW15_ARB 0x872F -#define GL_MODELVIEW16_ARB 0x8730 -#define GL_MODELVIEW17_ARB 0x8731 -#define GL_MODELVIEW18_ARB 0x8732 -#define GL_MODELVIEW19_ARB 0x8733 -#define GL_MODELVIEW20_ARB 0x8734 -#define GL_MODELVIEW21_ARB 0x8735 -#define GL_MODELVIEW22_ARB 0x8736 -#define GL_MODELVIEW23_ARB 0x8737 -#define GL_MODELVIEW24_ARB 0x8738 -#define GL_MODELVIEW25_ARB 0x8739 -#define GL_MODELVIEW26_ARB 0x873A -#define GL_MODELVIEW27_ARB 0x873B -#define GL_MODELVIEW28_ARB 0x873C -#define GL_MODELVIEW29_ARB 0x873D -#define GL_MODELVIEW30_ARB 0x873E -#define GL_MODELVIEW31_ARB 0x873F -#endif - -#ifndef GL_ARB_matrix_palette -#define GL_MATRIX_PALETTE_ARB 0x8840 -#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 -#define GL_MAX_PALETTE_MATRICES_ARB 0x8842 -#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 -#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 -#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 -#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 -#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 -#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 -#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 -#endif - -#ifndef GL_ARB_texture_env_combine -#define GL_COMBINE_ARB 0x8570 -#define GL_COMBINE_RGB_ARB 0x8571 -#define GL_COMBINE_ALPHA_ARB 0x8572 -#define GL_SOURCE0_RGB_ARB 0x8580 -#define GL_SOURCE1_RGB_ARB 0x8581 -#define GL_SOURCE2_RGB_ARB 0x8582 -#define GL_SOURCE0_ALPHA_ARB 0x8588 -#define GL_SOURCE1_ALPHA_ARB 0x8589 -#define GL_SOURCE2_ALPHA_ARB 0x858A -#define GL_OPERAND0_RGB_ARB 0x8590 -#define GL_OPERAND1_RGB_ARB 0x8591 -#define GL_OPERAND2_RGB_ARB 0x8592 -#define GL_OPERAND0_ALPHA_ARB 0x8598 -#define GL_OPERAND1_ALPHA_ARB 0x8599 -#define GL_OPERAND2_ALPHA_ARB 0x859A -#define GL_RGB_SCALE_ARB 0x8573 -#define GL_ADD_SIGNED_ARB 0x8574 -#define GL_INTERPOLATE_ARB 0x8575 -#define GL_SUBTRACT_ARB 0x84E7 -#define GL_CONSTANT_ARB 0x8576 -#define GL_PRIMARY_COLOR_ARB 0x8577 -#define GL_PREVIOUS_ARB 0x8578 -#endif - -#ifndef GL_ARB_texture_env_crossbar -#endif - -#ifndef GL_ARB_texture_env_dot3 -#define GL_DOT3_RGB_ARB 0x86AE -#define GL_DOT3_RGBA_ARB 0x86AF -#endif - -#ifndef GL_ARB_texture_mirrored_repeat -#define GL_MIRRORED_REPEAT_ARB 0x8370 -#endif - -#ifndef GL_ARB_depth_texture -#define GL_DEPTH_COMPONENT16_ARB 0x81A5 -#define GL_DEPTH_COMPONENT24_ARB 0x81A6 -#define GL_DEPTH_COMPONENT32_ARB 0x81A7 -#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A -#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B -#endif - -#ifndef GL_ARB_shadow -#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C -#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D -#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E -#endif - -#ifndef GL_ARB_shadow_ambient -#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF -#endif - -#ifndef GL_ARB_window_pos -#endif - -#ifndef GL_ARB_vertex_program -#define GL_COLOR_SUM_ARB 0x8458 -#define GL_VERTEX_PROGRAM_ARB 0x8620 -#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 -#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 -#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 -#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 -#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 -#define GL_PROGRAM_LENGTH_ARB 0x8627 -#define GL_PROGRAM_STRING_ARB 0x8628 -#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E -#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F -#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 -#define GL_CURRENT_MATRIX_ARB 0x8641 -#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 -#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 -#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 -#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B -#define GL_PROGRAM_BINDING_ARB 0x8677 -#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 -#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A -#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 -#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 -#define GL_PROGRAM_FORMAT_ARB 0x8876 -#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 -#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 -#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 -#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 -#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 -#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 -#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 -#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 -#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 -#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 -#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA -#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB -#define GL_PROGRAM_ATTRIBS_ARB 0x88AC -#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD -#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE -#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF -#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 -#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 -#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 -#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 -#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 -#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 -#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 -#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 -#define GL_MATRIX0_ARB 0x88C0 -#define GL_MATRIX1_ARB 0x88C1 -#define GL_MATRIX2_ARB 0x88C2 -#define GL_MATRIX3_ARB 0x88C3 -#define GL_MATRIX4_ARB 0x88C4 -#define GL_MATRIX5_ARB 0x88C5 -#define GL_MATRIX6_ARB 0x88C6 -#define GL_MATRIX7_ARB 0x88C7 -#define GL_MATRIX8_ARB 0x88C8 -#define GL_MATRIX9_ARB 0x88C9 -#define GL_MATRIX10_ARB 0x88CA -#define GL_MATRIX11_ARB 0x88CB -#define GL_MATRIX12_ARB 0x88CC -#define GL_MATRIX13_ARB 0x88CD -#define GL_MATRIX14_ARB 0x88CE -#define GL_MATRIX15_ARB 0x88CF -#define GL_MATRIX16_ARB 0x88D0 -#define GL_MATRIX17_ARB 0x88D1 -#define GL_MATRIX18_ARB 0x88D2 -#define GL_MATRIX19_ARB 0x88D3 -#define GL_MATRIX20_ARB 0x88D4 -#define GL_MATRIX21_ARB 0x88D5 -#define GL_MATRIX22_ARB 0x88D6 -#define GL_MATRIX23_ARB 0x88D7 -#define GL_MATRIX24_ARB 0x88D8 -#define GL_MATRIX25_ARB 0x88D9 -#define GL_MATRIX26_ARB 0x88DA -#define GL_MATRIX27_ARB 0x88DB -#define GL_MATRIX28_ARB 0x88DC -#define GL_MATRIX29_ARB 0x88DD -#define GL_MATRIX30_ARB 0x88DE -#define GL_MATRIX31_ARB 0x88DF -#endif - -#ifndef GL_ARB_fragment_program -#define GL_FRAGMENT_PROGRAM_ARB 0x8804 -#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 -#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 -#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 -#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 -#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 -#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A -#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B -#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C -#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D -#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E -#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F -#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 -#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 -#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 -#endif - -#ifndef GL_ARB_vertex_buffer_object -#define GL_BUFFER_SIZE_ARB 0x8764 -#define GL_BUFFER_USAGE_ARB 0x8765 -#define GL_ARRAY_BUFFER_ARB 0x8892 -#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 -#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 -#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 -#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 -#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 -#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 -#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A -#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B -#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C -#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D -#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E -#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F -#define GL_READ_ONLY_ARB 0x88B8 -#define GL_WRITE_ONLY_ARB 0x88B9 -#define GL_READ_WRITE_ARB 0x88BA -#define GL_BUFFER_ACCESS_ARB 0x88BB -#define GL_BUFFER_MAPPED_ARB 0x88BC -#define GL_BUFFER_MAP_POINTER_ARB 0x88BD -#define GL_STREAM_DRAW_ARB 0x88E0 -#define GL_STREAM_READ_ARB 0x88E1 -#define GL_STREAM_COPY_ARB 0x88E2 -#define GL_STATIC_DRAW_ARB 0x88E4 -#define GL_STATIC_READ_ARB 0x88E5 -#define GL_STATIC_COPY_ARB 0x88E6 -#define GL_DYNAMIC_DRAW_ARB 0x88E8 -#define GL_DYNAMIC_READ_ARB 0x88E9 -#define GL_DYNAMIC_COPY_ARB 0x88EA -#endif - -#ifndef GL_ARB_occlusion_query -#define GL_QUERY_COUNTER_BITS_ARB 0x8864 -#define GL_CURRENT_QUERY_ARB 0x8865 -#define GL_QUERY_RESULT_ARB 0x8866 -#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 -#define GL_SAMPLES_PASSED_ARB 0x8914 -#endif - -#ifndef GL_ARB_shader_objects -#define GL_PROGRAM_OBJECT_ARB 0x8B40 -#define GL_SHADER_OBJECT_ARB 0x8B48 -#define GL_OBJECT_TYPE_ARB 0x8B4E -#define GL_OBJECT_SUBTYPE_ARB 0x8B4F -#define GL_FLOAT_VEC2_ARB 0x8B50 -#define GL_FLOAT_VEC3_ARB 0x8B51 -#define GL_FLOAT_VEC4_ARB 0x8B52 -#define GL_INT_VEC2_ARB 0x8B53 -#define GL_INT_VEC3_ARB 0x8B54 -#define GL_INT_VEC4_ARB 0x8B55 -#define GL_BOOL_ARB 0x8B56 -#define GL_BOOL_VEC2_ARB 0x8B57 -#define GL_BOOL_VEC3_ARB 0x8B58 -#define GL_BOOL_VEC4_ARB 0x8B59 -#define GL_FLOAT_MAT2_ARB 0x8B5A -#define GL_FLOAT_MAT3_ARB 0x8B5B -#define GL_FLOAT_MAT4_ARB 0x8B5C -#define GL_SAMPLER_1D_ARB 0x8B5D -#define GL_SAMPLER_2D_ARB 0x8B5E -#define GL_SAMPLER_3D_ARB 0x8B5F -#define GL_SAMPLER_CUBE_ARB 0x8B60 -#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 -#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 -#define GL_SAMPLER_2D_RECT_ARB 0x8B63 -#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 -#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 -#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 -#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 -#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 -#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 -#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 -#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 -#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 -#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 -#endif - -#ifndef GL_ARB_vertex_shader -#define GL_VERTEX_SHADER_ARB 0x8B31 -#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A -#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B -#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C -#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D -#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 -#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A -#endif - -#ifndef GL_ARB_fragment_shader -#define GL_FRAGMENT_SHADER_ARB 0x8B30 -#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B -#endif - -#ifndef GL_ARB_shading_language_100 -#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C -#endif - -#ifndef GL_ARB_texture_non_power_of_two -#endif - -#ifndef GL_ARB_point_sprite -#define GL_POINT_SPRITE_ARB 0x8861 -#define GL_COORD_REPLACE_ARB 0x8862 -#endif - -#ifndef GL_ARB_fragment_program_shadow -#endif - -#ifndef GL_ARB_draw_buffers -#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 -#define GL_DRAW_BUFFER0_ARB 0x8825 -#define GL_DRAW_BUFFER1_ARB 0x8826 -#define GL_DRAW_BUFFER2_ARB 0x8827 -#define GL_DRAW_BUFFER3_ARB 0x8828 -#define GL_DRAW_BUFFER4_ARB 0x8829 -#define GL_DRAW_BUFFER5_ARB 0x882A -#define GL_DRAW_BUFFER6_ARB 0x882B -#define GL_DRAW_BUFFER7_ARB 0x882C -#define GL_DRAW_BUFFER8_ARB 0x882D -#define GL_DRAW_BUFFER9_ARB 0x882E -#define GL_DRAW_BUFFER10_ARB 0x882F -#define GL_DRAW_BUFFER11_ARB 0x8830 -#define GL_DRAW_BUFFER12_ARB 0x8831 -#define GL_DRAW_BUFFER13_ARB 0x8832 -#define GL_DRAW_BUFFER14_ARB 0x8833 -#define GL_DRAW_BUFFER15_ARB 0x8834 -#endif - -#ifndef GL_ARB_texture_rectangle -#define GL_TEXTURE_RECTANGLE_ARB 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 -#endif - -#ifndef GL_ARB_color_buffer_float -#define GL_RGBA_FLOAT_MODE_ARB 0x8820 -#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A -#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B -#define GL_CLAMP_READ_COLOR_ARB 0x891C -#define GL_FIXED_ONLY_ARB 0x891D -#endif - -#ifndef GL_ARB_half_float_pixel -#define GL_HALF_FLOAT_ARB 0x140B -#endif - -#ifndef GL_ARB_texture_float -#define GL_TEXTURE_RED_TYPE_ARB 0x8C10 -#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 -#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 -#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 -#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 -#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 -#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 -#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 -#define GL_RGBA32F_ARB 0x8814 -#define GL_RGB32F_ARB 0x8815 -#define GL_ALPHA32F_ARB 0x8816 -#define GL_INTENSITY32F_ARB 0x8817 -#define GL_LUMINANCE32F_ARB 0x8818 -#define GL_LUMINANCE_ALPHA32F_ARB 0x8819 -#define GL_RGBA16F_ARB 0x881A -#define GL_RGB16F_ARB 0x881B -#define GL_ALPHA16F_ARB 0x881C -#define GL_INTENSITY16F_ARB 0x881D -#define GL_LUMINANCE16F_ARB 0x881E -#define GL_LUMINANCE_ALPHA16F_ARB 0x881F -#endif - -#ifndef GL_ARB_pixel_buffer_object -#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB -#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF -#endif - -#ifndef GL_ARB_depth_buffer_float -#define GL_DEPTH_COMPONENT32F 0x8CAC -#define GL_DEPTH32F_STENCIL8 0x8CAD -#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD -#endif - -#ifndef GL_ARB_draw_instanced -#endif - -#ifndef GL_ARB_framebuffer_object -#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 -#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 -#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 -#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 -#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 -#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 -#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 -#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 -#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 -#define GL_FRAMEBUFFER_DEFAULT 0x8218 -#define GL_FRAMEBUFFER_UNDEFINED 0x8219 -#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A -#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 -#define GL_DEPTH_STENCIL 0x84F9 -#define GL_UNSIGNED_INT_24_8 0x84FA -#define GL_DEPTH24_STENCIL8 0x88F0 -#define GL_TEXTURE_STENCIL_SIZE 0x88F1 -#define GL_TEXTURE_RED_TYPE 0x8C10 -#define GL_TEXTURE_GREEN_TYPE 0x8C11 -#define GL_TEXTURE_BLUE_TYPE 0x8C12 -#define GL_TEXTURE_ALPHA_TYPE 0x8C13 -#define GL_TEXTURE_DEPTH_TYPE 0x8C16 -#define GL_UNSIGNED_NORMALIZED 0x8C17 -#define GL_FRAMEBUFFER_BINDING 0x8CA6 -#define GL_DRAW_FRAMEBUFFER_BINDING GL_FRAMEBUFFER_BINDING -#define GL_RENDERBUFFER_BINDING 0x8CA7 -#define GL_READ_FRAMEBUFFER 0x8CA8 -#define GL_DRAW_FRAMEBUFFER 0x8CA9 -#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA -#define GL_RENDERBUFFER_SAMPLES 0x8CAB -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 -#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 -#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 -#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 -#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB -#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC -#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD -#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF -#define GL_COLOR_ATTACHMENT0 0x8CE0 -#define GL_COLOR_ATTACHMENT1 0x8CE1 -#define GL_COLOR_ATTACHMENT2 0x8CE2 -#define GL_COLOR_ATTACHMENT3 0x8CE3 -#define GL_COLOR_ATTACHMENT4 0x8CE4 -#define GL_COLOR_ATTACHMENT5 0x8CE5 -#define GL_COLOR_ATTACHMENT6 0x8CE6 -#define GL_COLOR_ATTACHMENT7 0x8CE7 -#define GL_COLOR_ATTACHMENT8 0x8CE8 -#define GL_COLOR_ATTACHMENT9 0x8CE9 -#define GL_COLOR_ATTACHMENT10 0x8CEA -#define GL_COLOR_ATTACHMENT11 0x8CEB -#define GL_COLOR_ATTACHMENT12 0x8CEC -#define GL_COLOR_ATTACHMENT13 0x8CED -#define GL_COLOR_ATTACHMENT14 0x8CEE -#define GL_COLOR_ATTACHMENT15 0x8CEF -#define GL_DEPTH_ATTACHMENT 0x8D00 -#define GL_STENCIL_ATTACHMENT 0x8D20 -#define GL_FRAMEBUFFER 0x8D40 -#define GL_RENDERBUFFER 0x8D41 -#define GL_RENDERBUFFER_WIDTH 0x8D42 -#define GL_RENDERBUFFER_HEIGHT 0x8D43 -#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 -#define GL_STENCIL_INDEX1 0x8D46 -#define GL_STENCIL_INDEX4 0x8D47 -#define GL_STENCIL_INDEX8 0x8D48 -#define GL_STENCIL_INDEX16 0x8D49 -#define GL_RENDERBUFFER_RED_SIZE 0x8D50 -#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 -#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 -#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 -#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 -#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 -#define GL_MAX_SAMPLES 0x8D57 -#endif - -#ifndef GL_ARB_framebuffer_object_DEPRECATED -#define GL_INDEX 0x8222 -#define GL_TEXTURE_LUMINANCE_TYPE 0x8C14 -#define GL_TEXTURE_INTENSITY_TYPE 0x8C15 -#endif - -#ifndef GL_ARB_framebuffer_sRGB -#define GL_FRAMEBUFFER_SRGB 0x8DB9 -#endif - -#ifndef GL_ARB_geometry_shader4 -#define GL_LINES_ADJACENCY_ARB 0x000A -#define GL_LINE_STRIP_ADJACENCY_ARB 0x000B -#define GL_TRIANGLES_ADJACENCY_ARB 0x000C -#define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0x000D -#define GL_PROGRAM_POINT_SIZE_ARB 0x8642 -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9 -#define GL_GEOMETRY_SHADER_ARB 0x8DD9 -#define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA -#define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB -#define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC -#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD -#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1 -/* reuse GL_MAX_VARYING_COMPONENTS */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER */ -#endif - -#ifndef GL_ARB_half_float_vertex -#define GL_HALF_FLOAT 0x140B -#endif - -#ifndef GL_ARB_instanced_arrays -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB 0x88FE -#endif - -#ifndef GL_ARB_map_buffer_range -#define GL_MAP_READ_BIT 0x0001 -#define GL_MAP_WRITE_BIT 0x0002 -#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 -#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 -#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 -#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 -#endif - -#ifndef GL_ARB_texture_buffer_object -#define GL_TEXTURE_BUFFER_ARB 0x8C2A -#define GL_MAX_TEXTURE_BUFFER_SIZE_ARB 0x8C2B -#define GL_TEXTURE_BINDING_BUFFER_ARB 0x8C2C -#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB 0x8C2D -#define GL_TEXTURE_BUFFER_FORMAT_ARB 0x8C2E -#endif - -#ifndef GL_ARB_texture_compression_rgtc -#define GL_COMPRESSED_RED_RGTC1 0x8DBB -#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC -#define GL_COMPRESSED_RG_RGTC2 0x8DBD -#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE -#endif - -#ifndef GL_ARB_texture_rg -#define GL_RG 0x8227 -#define GL_RG_INTEGER 0x8228 -#define GL_R8 0x8229 -#define GL_R16 0x822A -#define GL_RG8 0x822B -#define GL_RG16 0x822C -#define GL_R16F 0x822D -#define GL_R32F 0x822E -#define GL_RG16F 0x822F -#define GL_RG32F 0x8230 -#define GL_R8I 0x8231 -#define GL_R8UI 0x8232 -#define GL_R16I 0x8233 -#define GL_R16UI 0x8234 -#define GL_R32I 0x8235 -#define GL_R32UI 0x8236 -#define GL_RG8I 0x8237 -#define GL_RG8UI 0x8238 -#define GL_RG16I 0x8239 -#define GL_RG16UI 0x823A -#define GL_RG32I 0x823B -#define GL_RG32UI 0x823C -#endif - -#ifndef GL_ARB_vertex_array_object -#define GL_VERTEX_ARRAY_BINDING 0x85B5 -#endif - -#ifndef GL_ARB_uniform_buffer_object -#define GL_UNIFORM_BUFFER 0x8A11 -#define GL_UNIFORM_BUFFER_BINDING 0x8A28 -#define GL_UNIFORM_BUFFER_START 0x8A29 -#define GL_UNIFORM_BUFFER_SIZE 0x8A2A -#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B -#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C -#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D -#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E -#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F -#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 -#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 -#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 -#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 -#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 -#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 -#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 -#define GL_UNIFORM_TYPE 0x8A37 -#define GL_UNIFORM_SIZE 0x8A38 -#define GL_UNIFORM_NAME_LENGTH 0x8A39 -#define GL_UNIFORM_BLOCK_INDEX 0x8A3A -#define GL_UNIFORM_OFFSET 0x8A3B -#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C -#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D -#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E -#define GL_UNIFORM_BLOCK_BINDING 0x8A3F -#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 -#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 -#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 -#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 -#define GL_INVALID_INDEX 0xFFFFFFFFu -#endif - -#ifndef GL_ARB_compatibility -/* ARB_compatibility just defines tokens from core 3.0 */ -#endif - -#ifndef GL_ARB_copy_buffer -#define GL_COPY_READ_BUFFER 0x8F36 -#define GL_COPY_WRITE_BUFFER 0x8F37 -#endif - -#ifndef GL_ARB_shader_texture_lod -#endif - -#ifndef GL_ARB_depth_clamp -#define GL_DEPTH_CLAMP 0x864F -#endif - -#ifndef GL_ARB_draw_elements_base_vertex -#endif - -#ifndef GL_ARB_fragment_coord_conventions -#endif - -#ifndef GL_ARB_provoking_vertex -#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C -#define GL_FIRST_VERTEX_CONVENTION 0x8E4D -#define GL_LAST_VERTEX_CONVENTION 0x8E4E -#define GL_PROVOKING_VERTEX 0x8E4F -#endif - -#ifndef GL_ARB_seamless_cube_map -#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F -#endif - -#ifndef GL_ARB_sync -#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 -#define GL_OBJECT_TYPE 0x9112 -#define GL_SYNC_CONDITION 0x9113 -#define GL_SYNC_STATUS 0x9114 -#define GL_SYNC_FLAGS 0x9115 -#define GL_SYNC_FENCE 0x9116 -#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 -#define GL_UNSIGNALED 0x9118 -#define GL_SIGNALED 0x9119 -#define GL_ALREADY_SIGNALED 0x911A -#define GL_TIMEOUT_EXPIRED 0x911B -#define GL_CONDITION_SATISFIED 0x911C -#define GL_WAIT_FAILED 0x911D -#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 -#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull -#endif - -#ifndef GL_ARB_texture_multisample -#define GL_SAMPLE_POSITION 0x8E50 -#define GL_SAMPLE_MASK 0x8E51 -#define GL_SAMPLE_MASK_VALUE 0x8E52 -#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 -#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 -#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 -#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 -#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 -#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 -#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 -#define GL_TEXTURE_SAMPLES 0x9106 -#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 -#define GL_SAMPLER_2D_MULTISAMPLE 0x9108 -#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 -#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A -#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B -#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C -#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D -#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E -#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F -#define GL_MAX_INTEGER_SAMPLES 0x9110 -#endif - -#ifndef GL_ARB_vertex_array_bgra -/* reuse GL_BGRA */ -#endif - -#ifndef GL_ARB_draw_buffers_blend -#endif - -#ifndef GL_ARB_sample_shading -#define GL_SAMPLE_SHADING_ARB 0x8C36 -#define GL_MIN_SAMPLE_SHADING_VALUE_ARB 0x8C37 -#endif - -#ifndef GL_ARB_texture_cube_map_array -#define GL_TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A -#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B -#define GL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C -#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D -#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E -#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F -#endif - -#ifndef GL_ARB_texture_gather -#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E -#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F -#endif - -#ifndef GL_ARB_texture_query_lod -#endif - -#ifndef GL_ARB_shading_language_include -#define GL_SHADER_INCLUDE_ARB 0x8DAE -#define GL_NAMED_STRING_LENGTH_ARB 0x8DE9 -#define GL_NAMED_STRING_TYPE_ARB 0x8DEA -#endif - -#ifndef GL_ARB_texture_compression_bptc -#define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C -#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D -#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E -#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F -#endif - -#ifndef GL_ARB_blend_func_extended -#define GL_SRC1_COLOR 0x88F9 -/* reuse GL_SRC1_ALPHA */ -#define GL_ONE_MINUS_SRC1_COLOR 0x88FA -#define GL_ONE_MINUS_SRC1_ALPHA 0x88FB -#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC -#endif - -#ifndef GL_ARB_explicit_attrib_location -#endif - -#ifndef GL_ARB_occlusion_query2 -#define GL_ANY_SAMPLES_PASSED 0x8C2F -#endif - -#ifndef GL_ARB_sampler_objects -#define GL_SAMPLER_BINDING 0x8919 -#endif - -#ifndef GL_ARB_shader_bit_encoding -#endif - -#ifndef GL_ARB_texture_rgb10_a2ui -#define GL_RGB10_A2UI 0x906F -#endif - -#ifndef GL_ARB_texture_swizzle -#define GL_TEXTURE_SWIZZLE_R 0x8E42 -#define GL_TEXTURE_SWIZZLE_G 0x8E43 -#define GL_TEXTURE_SWIZZLE_B 0x8E44 -#define GL_TEXTURE_SWIZZLE_A 0x8E45 -#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 -#endif - -#ifndef GL_ARB_timer_query -#define GL_TIME_ELAPSED 0x88BF -#define GL_TIMESTAMP 0x8E28 -#endif - -#ifndef GL_ARB_vertex_type_2_10_10_10_rev -/* reuse GL_UNSIGNED_INT_2_10_10_10_REV */ -#define GL_INT_2_10_10_10_REV 0x8D9F -#endif - -#ifndef GL_ARB_draw_indirect -#define GL_DRAW_INDIRECT_BUFFER 0x8F3F -#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43 -#endif - -#ifndef GL_ARB_gpu_shader5 -#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F -#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A -#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B -#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C -#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D -/* reuse GL_MAX_VERTEX_STREAMS */ -#endif - -#ifndef GL_ARB_gpu_shader_fp64 -/* reuse GL_DOUBLE */ -#define GL_DOUBLE_VEC2 0x8FFC -#define GL_DOUBLE_VEC3 0x8FFD -#define GL_DOUBLE_VEC4 0x8FFE -#define GL_DOUBLE_MAT2 0x8F46 -#define GL_DOUBLE_MAT3 0x8F47 -#define GL_DOUBLE_MAT4 0x8F48 -#define GL_DOUBLE_MAT2x3 0x8F49 -#define GL_DOUBLE_MAT2x4 0x8F4A -#define GL_DOUBLE_MAT3x2 0x8F4B -#define GL_DOUBLE_MAT3x4 0x8F4C -#define GL_DOUBLE_MAT4x2 0x8F4D -#define GL_DOUBLE_MAT4x3 0x8F4E -#endif - -#ifndef GL_ARB_shader_subroutine -#define GL_ACTIVE_SUBROUTINES 0x8DE5 -#define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6 -#define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47 -#define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48 -#define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49 -#define GL_MAX_SUBROUTINES 0x8DE7 -#define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8 -#define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A -#define GL_COMPATIBLE_SUBROUTINES 0x8E4B -/* reuse GL_UNIFORM_SIZE */ -/* reuse GL_UNIFORM_NAME_LENGTH */ -#endif - -#ifndef GL_ARB_tessellation_shader -#define GL_PATCHES 0x000E -#define GL_PATCH_VERTICES 0x8E72 -#define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73 -#define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74 -#define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75 -#define GL_TESS_GEN_MODE 0x8E76 -#define GL_TESS_GEN_SPACING 0x8E77 -#define GL_TESS_GEN_VERTEX_ORDER 0x8E78 -#define GL_TESS_GEN_POINT_MODE 0x8E79 -/* reuse GL_TRIANGLES */ -/* reuse GL_QUADS */ -#define GL_ISOLINES 0x8E7A -/* reuse GL_EQUAL */ -#define GL_FRACTIONAL_ODD 0x8E7B -#define GL_FRACTIONAL_EVEN 0x8E7C -/* reuse GL_CCW */ -/* reuse GL_CW */ -#define GL_MAX_PATCH_VERTICES 0x8E7D -#define GL_MAX_TESS_GEN_LEVEL 0x8E7E -#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F -#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80 -#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81 -#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82 -#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83 -#define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84 -#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85 -#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86 -#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89 -#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A -#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C -#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D -#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E -#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F -#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1 -#define GL_TESS_EVALUATION_SHADER 0x8E87 -#define GL_TESS_CONTROL_SHADER 0x8E88 -#endif - -#ifndef GL_ARB_texture_buffer_object_rgb32 -/* reuse GL_RGB32F */ -/* reuse GL_RGB32UI */ -/* reuse GL_RGB32I */ -#endif - -#ifndef GL_ARB_transform_feedback2 -#define GL_TRANSFORM_FEEDBACK 0x8E22 -#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23 -#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24 -#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25 -#endif - -#ifndef GL_ARB_transform_feedback3 -#define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70 -#define GL_MAX_VERTEX_STREAMS 0x8E71 -#endif - -#ifndef GL_ARB_ES2_compatibility -#define GL_FIXED 0x140C -#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A -#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B -#define GL_LOW_FLOAT 0x8DF0 -#define GL_MEDIUM_FLOAT 0x8DF1 -#define GL_HIGH_FLOAT 0x8DF2 -#define GL_LOW_INT 0x8DF3 -#define GL_MEDIUM_INT 0x8DF4 -#define GL_HIGH_INT 0x8DF5 -#define GL_SHADER_COMPILER 0x8DFA -#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 -#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB -#define GL_MAX_VARYING_VECTORS 0x8DFC -#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD -#endif - -#ifndef GL_ARB_get_program_binary -#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 -#define GL_PROGRAM_BINARY_LENGTH 0x8741 -#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE -#define GL_PROGRAM_BINARY_FORMATS 0x87FF -#endif - -#ifndef GL_ARB_separate_shader_objects -#define GL_VERTEX_SHADER_BIT 0x00000001 -#define GL_FRAGMENT_SHADER_BIT 0x00000002 -#define GL_GEOMETRY_SHADER_BIT 0x00000004 -#define GL_TESS_CONTROL_SHADER_BIT 0x00000008 -#define GL_TESS_EVALUATION_SHADER_BIT 0x00000010 -#define GL_ALL_SHADER_BITS 0xFFFFFFFF -#define GL_PROGRAM_SEPARABLE 0x8258 -#define GL_ACTIVE_PROGRAM 0x8259 -#define GL_PROGRAM_PIPELINE_BINDING 0x825A -#endif - -#ifndef GL_ARB_shader_precision -#endif - -#ifndef GL_ARB_vertex_attrib_64bit -/* reuse GL_RGB32I */ -/* reuse GL_DOUBLE_VEC2 */ -/* reuse GL_DOUBLE_VEC3 */ -/* reuse GL_DOUBLE_VEC4 */ -/* reuse GL_DOUBLE_MAT2 */ -/* reuse GL_DOUBLE_MAT3 */ -/* reuse GL_DOUBLE_MAT4 */ -/* reuse GL_DOUBLE_MAT2x3 */ -/* reuse GL_DOUBLE_MAT2x4 */ -/* reuse GL_DOUBLE_MAT3x2 */ -/* reuse GL_DOUBLE_MAT3x4 */ -/* reuse GL_DOUBLE_MAT4x2 */ -/* reuse GL_DOUBLE_MAT4x3 */ -#endif - -#ifndef GL_ARB_viewport_array -/* reuse GL_SCISSOR_BOX */ -/* reuse GL_VIEWPORT */ -/* reuse GL_DEPTH_RANGE */ -/* reuse GL_SCISSOR_TEST */ -#define GL_MAX_VIEWPORTS 0x825B -#define GL_VIEWPORT_SUBPIXEL_BITS 0x825C -#define GL_VIEWPORT_BOUNDS_RANGE 0x825D -#define GL_LAYER_PROVOKING_VERTEX 0x825E -#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F -#define GL_UNDEFINED_VERTEX 0x8260 -/* reuse GL_FIRST_VERTEX_CONVENTION */ -/* reuse GL_LAST_VERTEX_CONVENTION */ -/* reuse GL_PROVOKING_VERTEX */ -#endif - -#ifndef GL_ARB_cl_event -#define GL_SYNC_CL_EVENT_ARB 0x8240 -#define GL_SYNC_CL_EVENT_COMPLETE_ARB 0x8241 -#endif - -#ifndef GL_ARB_debug_output -#define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242 -#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243 -#define GL_DEBUG_CALLBACK_FUNCTION_ARB 0x8244 -#define GL_DEBUG_CALLBACK_USER_PARAM_ARB 0x8245 -#define GL_DEBUG_SOURCE_API_ARB 0x8246 -#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247 -#define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248 -#define GL_DEBUG_SOURCE_THIRD_PARTY_ARB 0x8249 -#define GL_DEBUG_SOURCE_APPLICATION_ARB 0x824A -#define GL_DEBUG_SOURCE_OTHER_ARB 0x824B -#define GL_DEBUG_TYPE_ERROR_ARB 0x824C -#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D -#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E -#define GL_DEBUG_TYPE_PORTABILITY_ARB 0x824F -#define GL_DEBUG_TYPE_PERFORMANCE_ARB 0x8250 -#define GL_DEBUG_TYPE_OTHER_ARB 0x8251 -#define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB 0x9143 -#define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB 0x9144 -#define GL_DEBUG_LOGGED_MESSAGES_ARB 0x9145 -#define GL_DEBUG_SEVERITY_HIGH_ARB 0x9146 -#define GL_DEBUG_SEVERITY_MEDIUM_ARB 0x9147 -#define GL_DEBUG_SEVERITY_LOW_ARB 0x9148 -#endif - -#ifndef GL_ARB_robustness -/* reuse GL_NO_ERROR */ -#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004 -#define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 -#define GL_GUILTY_CONTEXT_RESET_ARB 0x8253 -#define GL_INNOCENT_CONTEXT_RESET_ARB 0x8254 -#define GL_UNKNOWN_CONTEXT_RESET_ARB 0x8255 -#define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 -#define GL_NO_RESET_NOTIFICATION_ARB 0x8261 -#endif - -#ifndef GL_ARB_shader_stencil_export -#endif - -#ifndef GL_EXT_abgr -#define GL_ABGR_EXT 0x8000 -#endif - -#ifndef GL_EXT_blend_color -#define GL_CONSTANT_COLOR_EXT 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 -#define GL_CONSTANT_ALPHA_EXT 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 -#define GL_BLEND_COLOR_EXT 0x8005 -#endif - -#ifndef GL_EXT_polygon_offset -#define GL_POLYGON_OFFSET_EXT 0x8037 -#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 -#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 -#endif - -#ifndef GL_EXT_texture -#define GL_ALPHA4_EXT 0x803B -#define GL_ALPHA8_EXT 0x803C -#define GL_ALPHA12_EXT 0x803D -#define GL_ALPHA16_EXT 0x803E -#define GL_LUMINANCE4_EXT 0x803F -#define GL_LUMINANCE8_EXT 0x8040 -#define GL_LUMINANCE12_EXT 0x8041 -#define GL_LUMINANCE16_EXT 0x8042 -#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 -#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 -#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 -#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 -#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 -#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 -#define GL_INTENSITY_EXT 0x8049 -#define GL_INTENSITY4_EXT 0x804A -#define GL_INTENSITY8_EXT 0x804B -#define GL_INTENSITY12_EXT 0x804C -#define GL_INTENSITY16_EXT 0x804D -#define GL_RGB2_EXT 0x804E -#define GL_RGB4_EXT 0x804F -#define GL_RGB5_EXT 0x8050 -#define GL_RGB8_EXT 0x8051 -#define GL_RGB10_EXT 0x8052 -#define GL_RGB12_EXT 0x8053 -#define GL_RGB16_EXT 0x8054 -#define GL_RGBA2_EXT 0x8055 -#define GL_RGBA4_EXT 0x8056 -#define GL_RGB5_A1_EXT 0x8057 -#define GL_RGBA8_EXT 0x8058 -#define GL_RGB10_A2_EXT 0x8059 -#define GL_RGBA12_EXT 0x805A -#define GL_RGBA16_EXT 0x805B -#define GL_TEXTURE_RED_SIZE_EXT 0x805C -#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D -#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E -#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F -#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 -#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 -#define GL_REPLACE_EXT 0x8062 -#define GL_PROXY_TEXTURE_1D_EXT 0x8063 -#define GL_PROXY_TEXTURE_2D_EXT 0x8064 -#define GL_TEXTURE_TOO_LARGE_EXT 0x8065 -#endif - -#ifndef GL_EXT_texture3D -#define GL_PACK_SKIP_IMAGES_EXT 0x806B -#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C -#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D -#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E -#define GL_TEXTURE_3D_EXT 0x806F -#define GL_PROXY_TEXTURE_3D_EXT 0x8070 -#define GL_TEXTURE_DEPTH_EXT 0x8071 -#define GL_TEXTURE_WRAP_R_EXT 0x8072 -#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 -#endif - -#ifndef GL_SGIS_texture_filter4 -#define GL_FILTER4_SGIS 0x8146 -#define GL_TEXTURE_FILTER4_SIZE_SGIS 0x8147 -#endif - -#ifndef GL_EXT_subtexture -#endif - -#ifndef GL_EXT_copy_texture -#endif - -#ifndef GL_EXT_histogram -#define GL_HISTOGRAM_EXT 0x8024 -#define GL_PROXY_HISTOGRAM_EXT 0x8025 -#define GL_HISTOGRAM_WIDTH_EXT 0x8026 -#define GL_HISTOGRAM_FORMAT_EXT 0x8027 -#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 -#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 -#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A -#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B -#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C -#define GL_HISTOGRAM_SINK_EXT 0x802D -#define GL_MINMAX_EXT 0x802E -#define GL_MINMAX_FORMAT_EXT 0x802F -#define GL_MINMAX_SINK_EXT 0x8030 -#define GL_TABLE_TOO_LARGE_EXT 0x8031 -#endif - -#ifndef GL_EXT_convolution -#define GL_CONVOLUTION_1D_EXT 0x8010 -#define GL_CONVOLUTION_2D_EXT 0x8011 -#define GL_SEPARABLE_2D_EXT 0x8012 -#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 -#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 -#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 -#define GL_REDUCE_EXT 0x8016 -#define GL_CONVOLUTION_FORMAT_EXT 0x8017 -#define GL_CONVOLUTION_WIDTH_EXT 0x8018 -#define GL_CONVOLUTION_HEIGHT_EXT 0x8019 -#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A -#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B -#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C -#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D -#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E -#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F -#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 -#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 -#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 -#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 -#endif - -#ifndef GL_SGI_color_matrix -#define GL_COLOR_MATRIX_SGI 0x80B1 -#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 -#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 -#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 -#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 -#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 -#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 -#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 -#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 -#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA -#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB -#endif - -#ifndef GL_SGI_color_table -#define GL_COLOR_TABLE_SGI 0x80D0 -#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 -#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 -#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 -#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 -#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 -#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 -#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 -#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 -#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 -#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA -#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB -#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC -#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD -#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE -#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF -#endif - -#ifndef GL_SGIS_pixel_texture -#define GL_PIXEL_TEXTURE_SGIS 0x8353 -#define GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS 0x8354 -#define GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS 0x8355 -#define GL_PIXEL_GROUP_COLOR_SGIS 0x8356 -#endif - -#ifndef GL_SGIX_pixel_texture -#define GL_PIXEL_TEX_GEN_SGIX 0x8139 -#define GL_PIXEL_TEX_GEN_MODE_SGIX 0x832B -#endif - -#ifndef GL_SGIS_texture4D -#define GL_PACK_SKIP_VOLUMES_SGIS 0x8130 -#define GL_PACK_IMAGE_DEPTH_SGIS 0x8131 -#define GL_UNPACK_SKIP_VOLUMES_SGIS 0x8132 -#define GL_UNPACK_IMAGE_DEPTH_SGIS 0x8133 -#define GL_TEXTURE_4D_SGIS 0x8134 -#define GL_PROXY_TEXTURE_4D_SGIS 0x8135 -#define GL_TEXTURE_4DSIZE_SGIS 0x8136 -#define GL_TEXTURE_WRAP_Q_SGIS 0x8137 -#define GL_MAX_4D_TEXTURE_SIZE_SGIS 0x8138 -#define GL_TEXTURE_4D_BINDING_SGIS 0x814F -#endif - -#ifndef GL_SGI_texture_color_table -#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC -#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD -#endif - -#ifndef GL_EXT_cmyka -#define GL_CMYK_EXT 0x800C -#define GL_CMYKA_EXT 0x800D -#define GL_PACK_CMYK_HINT_EXT 0x800E -#define GL_UNPACK_CMYK_HINT_EXT 0x800F -#endif - -#ifndef GL_EXT_texture_object -#define GL_TEXTURE_PRIORITY_EXT 0x8066 -#define GL_TEXTURE_RESIDENT_EXT 0x8067 -#define GL_TEXTURE_1D_BINDING_EXT 0x8068 -#define GL_TEXTURE_2D_BINDING_EXT 0x8069 -#define GL_TEXTURE_3D_BINDING_EXT 0x806A -#endif - -#ifndef GL_SGIS_detail_texture -#define GL_DETAIL_TEXTURE_2D_SGIS 0x8095 -#define GL_DETAIL_TEXTURE_2D_BINDING_SGIS 0x8096 -#define GL_LINEAR_DETAIL_SGIS 0x8097 -#define GL_LINEAR_DETAIL_ALPHA_SGIS 0x8098 -#define GL_LINEAR_DETAIL_COLOR_SGIS 0x8099 -#define GL_DETAIL_TEXTURE_LEVEL_SGIS 0x809A -#define GL_DETAIL_TEXTURE_MODE_SGIS 0x809B -#define GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS 0x809C -#endif - -#ifndef GL_SGIS_sharpen_texture -#define GL_LINEAR_SHARPEN_SGIS 0x80AD -#define GL_LINEAR_SHARPEN_ALPHA_SGIS 0x80AE -#define GL_LINEAR_SHARPEN_COLOR_SGIS 0x80AF -#define GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS 0x80B0 -#endif - -#ifndef GL_EXT_packed_pixels -#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 -#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 -#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 -#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 -#endif - -#ifndef GL_SGIS_texture_lod -#define GL_TEXTURE_MIN_LOD_SGIS 0x813A -#define GL_TEXTURE_MAX_LOD_SGIS 0x813B -#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C -#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D -#endif - -#ifndef GL_SGIS_multisample -#define GL_MULTISAMPLE_SGIS 0x809D -#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F -#define GL_SAMPLE_MASK_SGIS 0x80A0 -#define GL_1PASS_SGIS 0x80A1 -#define GL_2PASS_0_SGIS 0x80A2 -#define GL_2PASS_1_SGIS 0x80A3 -#define GL_4PASS_0_SGIS 0x80A4 -#define GL_4PASS_1_SGIS 0x80A5 -#define GL_4PASS_2_SGIS 0x80A6 -#define GL_4PASS_3_SGIS 0x80A7 -#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 -#define GL_SAMPLES_SGIS 0x80A9 -#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA -#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB -#define GL_SAMPLE_PATTERN_SGIS 0x80AC -#endif - -#ifndef GL_EXT_rescale_normal -#define GL_RESCALE_NORMAL_EXT 0x803A -#endif - -#ifndef GL_EXT_vertex_array -#define GL_VERTEX_ARRAY_EXT 0x8074 -#define GL_NORMAL_ARRAY_EXT 0x8075 -#define GL_COLOR_ARRAY_EXT 0x8076 -#define GL_INDEX_ARRAY_EXT 0x8077 -#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 -#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 -#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A -#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B -#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C -#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D -#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E -#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F -#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 -#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 -#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 -#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 -#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 -#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 -#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 -#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 -#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 -#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 -#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A -#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B -#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C -#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D -#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E -#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F -#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 -#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 -#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 -#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 -#endif - -#ifndef GL_EXT_misc_attribute -#endif - -#ifndef GL_SGIS_generate_mipmap -#define GL_GENERATE_MIPMAP_SGIS 0x8191 -#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 -#endif - -#ifndef GL_SGIX_clipmap -#define GL_LINEAR_CLIPMAP_LINEAR_SGIX 0x8170 -#define GL_TEXTURE_CLIPMAP_CENTER_SGIX 0x8171 -#define GL_TEXTURE_CLIPMAP_FRAME_SGIX 0x8172 -#define GL_TEXTURE_CLIPMAP_OFFSET_SGIX 0x8173 -#define GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8174 -#define GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX 0x8175 -#define GL_TEXTURE_CLIPMAP_DEPTH_SGIX 0x8176 -#define GL_MAX_CLIPMAP_DEPTH_SGIX 0x8177 -#define GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8178 -#define GL_NEAREST_CLIPMAP_NEAREST_SGIX 0x844D -#define GL_NEAREST_CLIPMAP_LINEAR_SGIX 0x844E -#define GL_LINEAR_CLIPMAP_NEAREST_SGIX 0x844F -#endif - -#ifndef GL_SGIX_shadow -#define GL_TEXTURE_COMPARE_SGIX 0x819A -#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B -#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C -#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D -#endif - -#ifndef GL_SGIS_texture_edge_clamp -#define GL_CLAMP_TO_EDGE_SGIS 0x812F -#endif - -#ifndef GL_SGIS_texture_border_clamp -#define GL_CLAMP_TO_BORDER_SGIS 0x812D -#endif - -#ifndef GL_EXT_blend_minmax -#define GL_FUNC_ADD_EXT 0x8006 -#define GL_MIN_EXT 0x8007 -#define GL_MAX_EXT 0x8008 -#define GL_BLEND_EQUATION_EXT 0x8009 -#endif - -#ifndef GL_EXT_blend_subtract -#define GL_FUNC_SUBTRACT_EXT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B -#endif - -#ifndef GL_EXT_blend_logic_op -#endif - -#ifndef GL_SGIX_interlace -#define GL_INTERLACE_SGIX 0x8094 -#endif - -#ifndef GL_SGIX_pixel_tiles -#define GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX 0x813E -#define GL_PIXEL_TILE_CACHE_INCREMENT_SGIX 0x813F -#define GL_PIXEL_TILE_WIDTH_SGIX 0x8140 -#define GL_PIXEL_TILE_HEIGHT_SGIX 0x8141 -#define GL_PIXEL_TILE_GRID_WIDTH_SGIX 0x8142 -#define GL_PIXEL_TILE_GRID_HEIGHT_SGIX 0x8143 -#define GL_PIXEL_TILE_GRID_DEPTH_SGIX 0x8144 -#define GL_PIXEL_TILE_CACHE_SIZE_SGIX 0x8145 -#endif - -#ifndef GL_SGIS_texture_select -#define GL_DUAL_ALPHA4_SGIS 0x8110 -#define GL_DUAL_ALPHA8_SGIS 0x8111 -#define GL_DUAL_ALPHA12_SGIS 0x8112 -#define GL_DUAL_ALPHA16_SGIS 0x8113 -#define GL_DUAL_LUMINANCE4_SGIS 0x8114 -#define GL_DUAL_LUMINANCE8_SGIS 0x8115 -#define GL_DUAL_LUMINANCE12_SGIS 0x8116 -#define GL_DUAL_LUMINANCE16_SGIS 0x8117 -#define GL_DUAL_INTENSITY4_SGIS 0x8118 -#define GL_DUAL_INTENSITY8_SGIS 0x8119 -#define GL_DUAL_INTENSITY12_SGIS 0x811A -#define GL_DUAL_INTENSITY16_SGIS 0x811B -#define GL_DUAL_LUMINANCE_ALPHA4_SGIS 0x811C -#define GL_DUAL_LUMINANCE_ALPHA8_SGIS 0x811D -#define GL_QUAD_ALPHA4_SGIS 0x811E -#define GL_QUAD_ALPHA8_SGIS 0x811F -#define GL_QUAD_LUMINANCE4_SGIS 0x8120 -#define GL_QUAD_LUMINANCE8_SGIS 0x8121 -#define GL_QUAD_INTENSITY4_SGIS 0x8122 -#define GL_QUAD_INTENSITY8_SGIS 0x8123 -#define GL_DUAL_TEXTURE_SELECT_SGIS 0x8124 -#define GL_QUAD_TEXTURE_SELECT_SGIS 0x8125 -#endif - -#ifndef GL_SGIX_sprite -#define GL_SPRITE_SGIX 0x8148 -#define GL_SPRITE_MODE_SGIX 0x8149 -#define GL_SPRITE_AXIS_SGIX 0x814A -#define GL_SPRITE_TRANSLATION_SGIX 0x814B -#define GL_SPRITE_AXIAL_SGIX 0x814C -#define GL_SPRITE_OBJECT_ALIGNED_SGIX 0x814D -#define GL_SPRITE_EYE_ALIGNED_SGIX 0x814E -#endif - -#ifndef GL_SGIX_texture_multi_buffer -#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E -#endif - -#ifndef GL_EXT_point_parameters -#define GL_POINT_SIZE_MIN_EXT 0x8126 -#define GL_POINT_SIZE_MAX_EXT 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 -#define GL_DISTANCE_ATTENUATION_EXT 0x8129 -#endif - -#ifndef GL_SGIS_point_parameters -#define GL_POINT_SIZE_MIN_SGIS 0x8126 -#define GL_POINT_SIZE_MAX_SGIS 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_SGIS 0x8128 -#define GL_DISTANCE_ATTENUATION_SGIS 0x8129 -#endif - -#ifndef GL_SGIX_instruments -#define GL_INSTRUMENT_BUFFER_POINTER_SGIX 0x8180 -#define GL_INSTRUMENT_MEASUREMENTS_SGIX 0x8181 -#endif - -#ifndef GL_SGIX_texture_scale_bias -#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 -#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A -#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B -#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C -#endif - -#ifndef GL_SGIX_framezoom -#define GL_FRAMEZOOM_SGIX 0x818B -#define GL_FRAMEZOOM_FACTOR_SGIX 0x818C -#define GL_MAX_FRAMEZOOM_FACTOR_SGIX 0x818D -#endif - -#ifndef GL_SGIX_tag_sample_buffer -#endif - -#ifndef GL_FfdMaskSGIX -#define GL_TEXTURE_DEFORMATION_BIT_SGIX 0x00000001 -#define GL_GEOMETRY_DEFORMATION_BIT_SGIX 0x00000002 -#endif - -#ifndef GL_SGIX_polynomial_ffd -#define GL_GEOMETRY_DEFORMATION_SGIX 0x8194 -#define GL_TEXTURE_DEFORMATION_SGIX 0x8195 -#define GL_DEFORMATIONS_MASK_SGIX 0x8196 -#define GL_MAX_DEFORMATION_ORDER_SGIX 0x8197 -#endif - -#ifndef GL_SGIX_reference_plane -#define GL_REFERENCE_PLANE_SGIX 0x817D -#define GL_REFERENCE_PLANE_EQUATION_SGIX 0x817E -#endif - -#ifndef GL_SGIX_flush_raster -#endif - -#ifndef GL_SGIX_depth_texture -#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 -#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 -#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 -#endif - -#ifndef GL_SGIS_fog_function -#define GL_FOG_FUNC_SGIS 0x812A -#define GL_FOG_FUNC_POINTS_SGIS 0x812B -#define GL_MAX_FOG_FUNC_POINTS_SGIS 0x812C -#endif - -#ifndef GL_SGIX_fog_offset -#define GL_FOG_OFFSET_SGIX 0x8198 -#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 -#endif - -#ifndef GL_HP_image_transform -#define GL_IMAGE_SCALE_X_HP 0x8155 -#define GL_IMAGE_SCALE_Y_HP 0x8156 -#define GL_IMAGE_TRANSLATE_X_HP 0x8157 -#define GL_IMAGE_TRANSLATE_Y_HP 0x8158 -#define GL_IMAGE_ROTATE_ANGLE_HP 0x8159 -#define GL_IMAGE_ROTATE_ORIGIN_X_HP 0x815A -#define GL_IMAGE_ROTATE_ORIGIN_Y_HP 0x815B -#define GL_IMAGE_MAG_FILTER_HP 0x815C -#define GL_IMAGE_MIN_FILTER_HP 0x815D -#define GL_IMAGE_CUBIC_WEIGHT_HP 0x815E -#define GL_CUBIC_HP 0x815F -#define GL_AVERAGE_HP 0x8160 -#define GL_IMAGE_TRANSFORM_2D_HP 0x8161 -#define GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8162 -#define GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8163 -#endif - -#ifndef GL_HP_convolution_border_modes -#define GL_IGNORE_BORDER_HP 0x8150 -#define GL_CONSTANT_BORDER_HP 0x8151 -#define GL_REPLICATE_BORDER_HP 0x8153 -#define GL_CONVOLUTION_BORDER_COLOR_HP 0x8154 -#endif - -#ifndef GL_INGR_palette_buffer -#endif - -#ifndef GL_SGIX_texture_add_env -#define GL_TEXTURE_ENV_BIAS_SGIX 0x80BE -#endif - -#ifndef GL_EXT_color_subtable -#endif - -#ifndef GL_PGI_vertex_hints -#define GL_VERTEX_DATA_HINT_PGI 0x1A22A -#define GL_VERTEX_CONSISTENT_HINT_PGI 0x1A22B -#define GL_MATERIAL_SIDE_HINT_PGI 0x1A22C -#define GL_MAX_VERTEX_HINT_PGI 0x1A22D -#define GL_COLOR3_BIT_PGI 0x00010000 -#define GL_COLOR4_BIT_PGI 0x00020000 -#define GL_EDGEFLAG_BIT_PGI 0x00040000 -#define GL_INDEX_BIT_PGI 0x00080000 -#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 -#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 -#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 -#define GL_MAT_EMISSION_BIT_PGI 0x00800000 -#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 -#define GL_MAT_SHININESS_BIT_PGI 0x02000000 -#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 -#define GL_NORMAL_BIT_PGI 0x08000000 -#define GL_TEXCOORD1_BIT_PGI 0x10000000 -#define GL_TEXCOORD2_BIT_PGI 0x20000000 -#define GL_TEXCOORD3_BIT_PGI 0x40000000 -#define GL_TEXCOORD4_BIT_PGI 0x80000000 -#define GL_VERTEX23_BIT_PGI 0x00000004 -#define GL_VERTEX4_BIT_PGI 0x00000008 -#endif - -#ifndef GL_PGI_misc_hints -#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 0x1A1F8 -#define GL_CONSERVE_MEMORY_HINT_PGI 0x1A1FD -#define GL_RECLAIM_MEMORY_HINT_PGI 0x1A1FE -#define GL_NATIVE_GRAPHICS_HANDLE_PGI 0x1A202 -#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 0x1A203 -#define GL_NATIVE_GRAPHICS_END_HINT_PGI 0x1A204 -#define GL_ALWAYS_FAST_HINT_PGI 0x1A20C -#define GL_ALWAYS_SOFT_HINT_PGI 0x1A20D -#define GL_ALLOW_DRAW_OBJ_HINT_PGI 0x1A20E -#define GL_ALLOW_DRAW_WIN_HINT_PGI 0x1A20F -#define GL_ALLOW_DRAW_FRG_HINT_PGI 0x1A210 -#define GL_ALLOW_DRAW_MEM_HINT_PGI 0x1A211 -#define GL_STRICT_DEPTHFUNC_HINT_PGI 0x1A216 -#define GL_STRICT_LIGHTING_HINT_PGI 0x1A217 -#define GL_STRICT_SCISSOR_HINT_PGI 0x1A218 -#define GL_FULL_STIPPLE_HINT_PGI 0x1A219 -#define GL_CLIP_NEAR_HINT_PGI 0x1A220 -#define GL_CLIP_FAR_HINT_PGI 0x1A221 -#define GL_WIDE_LINE_HINT_PGI 0x1A222 -#define GL_BACK_NORMALS_HINT_PGI 0x1A223 -#endif - -#ifndef GL_EXT_paletted_texture -#define GL_COLOR_INDEX1_EXT 0x80E2 -#define GL_COLOR_INDEX2_EXT 0x80E3 -#define GL_COLOR_INDEX4_EXT 0x80E4 -#define GL_COLOR_INDEX8_EXT 0x80E5 -#define GL_COLOR_INDEX12_EXT 0x80E6 -#define GL_COLOR_INDEX16_EXT 0x80E7 -#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED -#endif - -#ifndef GL_EXT_clip_volume_hint -#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 -#endif - -#ifndef GL_SGIX_list_priority -#define GL_LIST_PRIORITY_SGIX 0x8182 -#endif - -#ifndef GL_SGIX_ir_instrument1 -#define GL_IR_INSTRUMENT1_SGIX 0x817F -#endif - -#ifndef GL_SGIX_calligraphic_fragment -#define GL_CALLIGRAPHIC_FRAGMENT_SGIX 0x8183 -#endif - -#ifndef GL_SGIX_texture_lod_bias -#define GL_TEXTURE_LOD_BIAS_S_SGIX 0x818E -#define GL_TEXTURE_LOD_BIAS_T_SGIX 0x818F -#define GL_TEXTURE_LOD_BIAS_R_SGIX 0x8190 -#endif - -#ifndef GL_SGIX_shadow_ambient -#define GL_SHADOW_AMBIENT_SGIX 0x80BF -#endif - -#ifndef GL_EXT_index_texture -#endif - -#ifndef GL_EXT_index_material -#define GL_INDEX_MATERIAL_EXT 0x81B8 -#define GL_INDEX_MATERIAL_PARAMETER_EXT 0x81B9 -#define GL_INDEX_MATERIAL_FACE_EXT 0x81BA -#endif - -#ifndef GL_EXT_index_func -#define GL_INDEX_TEST_EXT 0x81B5 -#define GL_INDEX_TEST_FUNC_EXT 0x81B6 -#define GL_INDEX_TEST_REF_EXT 0x81B7 -#endif - -#ifndef GL_EXT_index_array_formats -#define GL_IUI_V2F_EXT 0x81AD -#define GL_IUI_V3F_EXT 0x81AE -#define GL_IUI_N3F_V2F_EXT 0x81AF -#define GL_IUI_N3F_V3F_EXT 0x81B0 -#define GL_T2F_IUI_V2F_EXT 0x81B1 -#define GL_T2F_IUI_V3F_EXT 0x81B2 -#define GL_T2F_IUI_N3F_V2F_EXT 0x81B3 -#define GL_T2F_IUI_N3F_V3F_EXT 0x81B4 -#endif - -#ifndef GL_EXT_compiled_vertex_array -#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 -#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 -#endif - -#ifndef GL_EXT_cull_vertex -#define GL_CULL_VERTEX_EXT 0x81AA -#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB -#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC -#endif - -#ifndef GL_SGIX_ycrcb -#define GL_YCRCB_422_SGIX 0x81BB -#define GL_YCRCB_444_SGIX 0x81BC -#endif - -#ifndef GL_SGIX_fragment_lighting -#define GL_FRAGMENT_LIGHTING_SGIX 0x8400 -#define GL_FRAGMENT_COLOR_MATERIAL_SGIX 0x8401 -#define GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX 0x8402 -#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX 0x8403 -#define GL_MAX_FRAGMENT_LIGHTS_SGIX 0x8404 -#define GL_MAX_ACTIVE_LIGHTS_SGIX 0x8405 -#define GL_CURRENT_RASTER_NORMAL_SGIX 0x8406 -#define GL_LIGHT_ENV_MODE_SGIX 0x8407 -#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX 0x8408 -#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX 0x8409 -#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX 0x840A -#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX 0x840B -#define GL_FRAGMENT_LIGHT0_SGIX 0x840C -#define GL_FRAGMENT_LIGHT1_SGIX 0x840D -#define GL_FRAGMENT_LIGHT2_SGIX 0x840E -#define GL_FRAGMENT_LIGHT3_SGIX 0x840F -#define GL_FRAGMENT_LIGHT4_SGIX 0x8410 -#define GL_FRAGMENT_LIGHT5_SGIX 0x8411 -#define GL_FRAGMENT_LIGHT6_SGIX 0x8412 -#define GL_FRAGMENT_LIGHT7_SGIX 0x8413 -#endif - -#ifndef GL_IBM_rasterpos_clip -#define GL_RASTER_POSITION_UNCLIPPED_IBM 0x19262 -#endif - -#ifndef GL_HP_texture_lighting -#define GL_TEXTURE_LIGHTING_MODE_HP 0x8167 -#define GL_TEXTURE_POST_SPECULAR_HP 0x8168 -#define GL_TEXTURE_PRE_SPECULAR_HP 0x8169 -#endif - -#ifndef GL_EXT_draw_range_elements -#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 -#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 -#endif - -#ifndef GL_WIN_phong_shading -#define GL_PHONG_WIN 0x80EA -#define GL_PHONG_HINT_WIN 0x80EB -#endif - -#ifndef GL_WIN_specular_fog -#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC -#endif - -#ifndef GL_EXT_light_texture -#define GL_FRAGMENT_MATERIAL_EXT 0x8349 -#define GL_FRAGMENT_NORMAL_EXT 0x834A -#define GL_FRAGMENT_COLOR_EXT 0x834C -#define GL_ATTENUATION_EXT 0x834D -#define GL_SHADOW_ATTENUATION_EXT 0x834E -#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F -#define GL_TEXTURE_LIGHT_EXT 0x8350 -#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 -#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 -/* reuse GL_FRAGMENT_DEPTH_EXT */ -#endif - -#ifndef GL_SGIX_blend_alpha_minmax -#define GL_ALPHA_MIN_SGIX 0x8320 -#define GL_ALPHA_MAX_SGIX 0x8321 -#endif - -#ifndef GL_SGIX_impact_pixel_texture -#define GL_PIXEL_TEX_GEN_Q_CEILING_SGIX 0x8184 -#define GL_PIXEL_TEX_GEN_Q_ROUND_SGIX 0x8185 -#define GL_PIXEL_TEX_GEN_Q_FLOOR_SGIX 0x8186 -#define GL_PIXEL_TEX_GEN_ALPHA_REPLACE_SGIX 0x8187 -#define GL_PIXEL_TEX_GEN_ALPHA_NO_REPLACE_SGIX 0x8188 -#define GL_PIXEL_TEX_GEN_ALPHA_LS_SGIX 0x8189 -#define GL_PIXEL_TEX_GEN_ALPHA_MS_SGIX 0x818A -#endif - -#ifndef GL_EXT_bgra -#define GL_BGR_EXT 0x80E0 -#define GL_BGRA_EXT 0x80E1 -#endif - -#ifndef GL_SGIX_async -#define GL_ASYNC_MARKER_SGIX 0x8329 -#endif - -#ifndef GL_SGIX_async_pixel -#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C -#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D -#define GL_ASYNC_READ_PIXELS_SGIX 0x835E -#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F -#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 -#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 -#endif - -#ifndef GL_SGIX_async_histogram -#define GL_ASYNC_HISTOGRAM_SGIX 0x832C -#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D -#endif - -#ifndef GL_INTEL_texture_scissor -#endif - -#ifndef GL_INTEL_parallel_arrays -#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 -#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 -#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 -#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 -#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 -#endif - -#ifndef GL_HP_occlusion_test -#define GL_OCCLUSION_TEST_HP 0x8165 -#define GL_OCCLUSION_TEST_RESULT_HP 0x8166 -#endif - -#ifndef GL_EXT_pixel_transform -#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 -#define GL_PIXEL_MAG_FILTER_EXT 0x8331 -#define GL_PIXEL_MIN_FILTER_EXT 0x8332 -#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 -#define GL_CUBIC_EXT 0x8334 -#define GL_AVERAGE_EXT 0x8335 -#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 -#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 -#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 -#endif - -#ifndef GL_EXT_pixel_transform_color_table -#endif - -#ifndef GL_EXT_shared_texture_palette -#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB -#endif - -#ifndef GL_EXT_separate_specular_color -#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 -#define GL_SINGLE_COLOR_EXT 0x81F9 -#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA -#endif - -#ifndef GL_EXT_secondary_color -#define GL_COLOR_SUM_EXT 0x8458 -#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 -#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A -#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B -#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C -#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D -#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E -#endif - -#ifndef GL_EXT_texture_perturb_normal -#define GL_PERTURB_EXT 0x85AE -#define GL_TEXTURE_NORMAL_EXT 0x85AF -#endif - -#ifndef GL_EXT_multi_draw_arrays -#endif - -#ifndef GL_EXT_fog_coord -#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 -#define GL_FOG_COORDINATE_EXT 0x8451 -#define GL_FRAGMENT_DEPTH_EXT 0x8452 -#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 -#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 -#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 -#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 -#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 -#endif - -#ifndef GL_REND_screen_coordinates -#define GL_SCREEN_COORDINATES_REND 0x8490 -#define GL_INVERTED_SCREEN_W_REND 0x8491 -#endif - -#ifndef GL_EXT_coordinate_frame -#define GL_TANGENT_ARRAY_EXT 0x8439 -#define GL_BINORMAL_ARRAY_EXT 0x843A -#define GL_CURRENT_TANGENT_EXT 0x843B -#define GL_CURRENT_BINORMAL_EXT 0x843C -#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E -#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F -#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 -#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 -#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 -#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 -#define GL_MAP1_TANGENT_EXT 0x8444 -#define GL_MAP2_TANGENT_EXT 0x8445 -#define GL_MAP1_BINORMAL_EXT 0x8446 -#define GL_MAP2_BINORMAL_EXT 0x8447 -#endif - -#ifndef GL_EXT_texture_env_combine -#define GL_COMBINE_EXT 0x8570 -#define GL_COMBINE_RGB_EXT 0x8571 -#define GL_COMBINE_ALPHA_EXT 0x8572 -#define GL_RGB_SCALE_EXT 0x8573 -#define GL_ADD_SIGNED_EXT 0x8574 -#define GL_INTERPOLATE_EXT 0x8575 -#define GL_CONSTANT_EXT 0x8576 -#define GL_PRIMARY_COLOR_EXT 0x8577 -#define GL_PREVIOUS_EXT 0x8578 -#define GL_SOURCE0_RGB_EXT 0x8580 -#define GL_SOURCE1_RGB_EXT 0x8581 -#define GL_SOURCE2_RGB_EXT 0x8582 -#define GL_SOURCE0_ALPHA_EXT 0x8588 -#define GL_SOURCE1_ALPHA_EXT 0x8589 -#define GL_SOURCE2_ALPHA_EXT 0x858A -#define GL_OPERAND0_RGB_EXT 0x8590 -#define GL_OPERAND1_RGB_EXT 0x8591 -#define GL_OPERAND2_RGB_EXT 0x8592 -#define GL_OPERAND0_ALPHA_EXT 0x8598 -#define GL_OPERAND1_ALPHA_EXT 0x8599 -#define GL_OPERAND2_ALPHA_EXT 0x859A -#endif - -#ifndef GL_APPLE_specular_vector -#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 -#endif - -#ifndef GL_APPLE_transform_hint -#define GL_TRANSFORM_HINT_APPLE 0x85B1 -#endif - -#ifndef GL_SGIX_fog_scale -#define GL_FOG_SCALE_SGIX 0x81FC -#define GL_FOG_SCALE_VALUE_SGIX 0x81FD -#endif - -#ifndef GL_SUNX_constant_data -#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 -#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 -#endif - -#ifndef GL_SUN_global_alpha -#define GL_GLOBAL_ALPHA_SUN 0x81D9 -#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA -#endif - -#ifndef GL_SUN_triangle_list -#define GL_RESTART_SUN 0x0001 -#define GL_REPLACE_MIDDLE_SUN 0x0002 -#define GL_REPLACE_OLDEST_SUN 0x0003 -#define GL_TRIANGLE_LIST_SUN 0x81D7 -#define GL_REPLACEMENT_CODE_SUN 0x81D8 -#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 -#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 -#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 -#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 -#define GL_R1UI_V3F_SUN 0x85C4 -#define GL_R1UI_C4UB_V3F_SUN 0x85C5 -#define GL_R1UI_C3F_V3F_SUN 0x85C6 -#define GL_R1UI_N3F_V3F_SUN 0x85C7 -#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 -#define GL_R1UI_T2F_V3F_SUN 0x85C9 -#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA -#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB -#endif - -#ifndef GL_SUN_vertex -#endif - -#ifndef GL_EXT_blend_func_separate -#define GL_BLEND_DST_RGB_EXT 0x80C8 -#define GL_BLEND_SRC_RGB_EXT 0x80C9 -#define GL_BLEND_DST_ALPHA_EXT 0x80CA -#define GL_BLEND_SRC_ALPHA_EXT 0x80CB -#endif - -#ifndef GL_INGR_color_clamp -#define GL_RED_MIN_CLAMP_INGR 0x8560 -#define GL_GREEN_MIN_CLAMP_INGR 0x8561 -#define GL_BLUE_MIN_CLAMP_INGR 0x8562 -#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 -#define GL_RED_MAX_CLAMP_INGR 0x8564 -#define GL_GREEN_MAX_CLAMP_INGR 0x8565 -#define GL_BLUE_MAX_CLAMP_INGR 0x8566 -#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 -#endif - -#ifndef GL_INGR_interlace_read -#define GL_INTERLACE_READ_INGR 0x8568 -#endif - -#ifndef GL_EXT_stencil_wrap -#define GL_INCR_WRAP_EXT 0x8507 -#define GL_DECR_WRAP_EXT 0x8508 -#endif - -#ifndef GL_EXT_422_pixels -#define GL_422_EXT 0x80CC -#define GL_422_REV_EXT 0x80CD -#define GL_422_AVERAGE_EXT 0x80CE -#define GL_422_REV_AVERAGE_EXT 0x80CF -#endif - -#ifndef GL_NV_texgen_reflection -#define GL_NORMAL_MAP_NV 0x8511 -#define GL_REFLECTION_MAP_NV 0x8512 -#endif - -#ifndef GL_EXT_texture_cube_map -#define GL_NORMAL_MAP_EXT 0x8511 -#define GL_REFLECTION_MAP_EXT 0x8512 -#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C -#endif - -#ifndef GL_SUN_convolution_border_modes -#define GL_WRAP_BORDER_SUN 0x81D4 -#endif - -#ifndef GL_EXT_texture_env_add -#endif - -#ifndef GL_EXT_texture_lod_bias -#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD -#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 -#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 -#endif - -#ifndef GL_EXT_texture_filter_anisotropic -#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE -#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF -#endif - -#ifndef GL_EXT_vertex_weighting -#define GL_MODELVIEW0_STACK_DEPTH_EXT GL_MODELVIEW_STACK_DEPTH -#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 -#define GL_MODELVIEW0_MATRIX_EXT GL_MODELVIEW_MATRIX -#define GL_MODELVIEW1_MATRIX_EXT 0x8506 -#define GL_VERTEX_WEIGHTING_EXT 0x8509 -#define GL_MODELVIEW0_EXT GL_MODELVIEW -#define GL_MODELVIEW1_EXT 0x850A -#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B -#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C -#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D -#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E -#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F -#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 -#endif - -#ifndef GL_NV_light_max_exponent -#define GL_MAX_SHININESS_NV 0x8504 -#define GL_MAX_SPOT_EXPONENT_NV 0x8505 -#endif - -#ifndef GL_NV_vertex_array_range -#define GL_VERTEX_ARRAY_RANGE_NV 0x851D -#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E -#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F -#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 -#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 -#endif - -#ifndef GL_NV_register_combiners -#define GL_REGISTER_COMBINERS_NV 0x8522 -#define GL_VARIABLE_A_NV 0x8523 -#define GL_VARIABLE_B_NV 0x8524 -#define GL_VARIABLE_C_NV 0x8525 -#define GL_VARIABLE_D_NV 0x8526 -#define GL_VARIABLE_E_NV 0x8527 -#define GL_VARIABLE_F_NV 0x8528 -#define GL_VARIABLE_G_NV 0x8529 -#define GL_CONSTANT_COLOR0_NV 0x852A -#define GL_CONSTANT_COLOR1_NV 0x852B -#define GL_PRIMARY_COLOR_NV 0x852C -#define GL_SECONDARY_COLOR_NV 0x852D -#define GL_SPARE0_NV 0x852E -#define GL_SPARE1_NV 0x852F -#define GL_DISCARD_NV 0x8530 -#define GL_E_TIMES_F_NV 0x8531 -#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 -#define GL_UNSIGNED_IDENTITY_NV 0x8536 -#define GL_UNSIGNED_INVERT_NV 0x8537 -#define GL_EXPAND_NORMAL_NV 0x8538 -#define GL_EXPAND_NEGATE_NV 0x8539 -#define GL_HALF_BIAS_NORMAL_NV 0x853A -#define GL_HALF_BIAS_NEGATE_NV 0x853B -#define GL_SIGNED_IDENTITY_NV 0x853C -#define GL_SIGNED_NEGATE_NV 0x853D -#define GL_SCALE_BY_TWO_NV 0x853E -#define GL_SCALE_BY_FOUR_NV 0x853F -#define GL_SCALE_BY_ONE_HALF_NV 0x8540 -#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 -#define GL_COMBINER_INPUT_NV 0x8542 -#define GL_COMBINER_MAPPING_NV 0x8543 -#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 -#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 -#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 -#define GL_COMBINER_MUX_SUM_NV 0x8547 -#define GL_COMBINER_SCALE_NV 0x8548 -#define GL_COMBINER_BIAS_NV 0x8549 -#define GL_COMBINER_AB_OUTPUT_NV 0x854A -#define GL_COMBINER_CD_OUTPUT_NV 0x854B -#define GL_COMBINER_SUM_OUTPUT_NV 0x854C -#define GL_MAX_GENERAL_COMBINERS_NV 0x854D -#define GL_NUM_GENERAL_COMBINERS_NV 0x854E -#define GL_COLOR_SUM_CLAMP_NV 0x854F -#define GL_COMBINER0_NV 0x8550 -#define GL_COMBINER1_NV 0x8551 -#define GL_COMBINER2_NV 0x8552 -#define GL_COMBINER3_NV 0x8553 -#define GL_COMBINER4_NV 0x8554 -#define GL_COMBINER5_NV 0x8555 -#define GL_COMBINER6_NV 0x8556 -#define GL_COMBINER7_NV 0x8557 -/* reuse GL_TEXTURE0_ARB */ -/* reuse GL_TEXTURE1_ARB */ -/* reuse GL_ZERO */ -/* reuse GL_NONE */ -/* reuse GL_FOG */ -#endif - -#ifndef GL_NV_fog_distance -#define GL_FOG_DISTANCE_MODE_NV 0x855A -#define GL_EYE_RADIAL_NV 0x855B -#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C -/* reuse GL_EYE_PLANE */ -#endif - -#ifndef GL_NV_texgen_emboss -#define GL_EMBOSS_LIGHT_NV 0x855D -#define GL_EMBOSS_CONSTANT_NV 0x855E -#define GL_EMBOSS_MAP_NV 0x855F -#endif - -#ifndef GL_NV_blend_square -#endif - -#ifndef GL_NV_texture_env_combine4 -#define GL_COMBINE4_NV 0x8503 -#define GL_SOURCE3_RGB_NV 0x8583 -#define GL_SOURCE3_ALPHA_NV 0x858B -#define GL_OPERAND3_RGB_NV 0x8593 -#define GL_OPERAND3_ALPHA_NV 0x859B -#endif - -#ifndef GL_MESA_resize_buffers -#endif - -#ifndef GL_MESA_window_pos -#endif - -#ifndef GL_EXT_texture_compression_s3tc -#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 -#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 -#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 -#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 -#endif - -#ifndef GL_IBM_cull_vertex -#define GL_CULL_VERTEX_IBM 103050 -#endif - -#ifndef GL_IBM_multimode_draw_arrays -#endif - -#ifndef GL_IBM_vertex_array_lists -#define GL_VERTEX_ARRAY_LIST_IBM 103070 -#define GL_NORMAL_ARRAY_LIST_IBM 103071 -#define GL_COLOR_ARRAY_LIST_IBM 103072 -#define GL_INDEX_ARRAY_LIST_IBM 103073 -#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 -#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 -#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 -#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 -#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 -#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 -#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 -#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 -#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 -#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 -#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 -#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 -#endif - -#ifndef GL_SGIX_subsample -#define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0 -#define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1 -#define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2 -#define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3 -#define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4 -#endif - -#ifndef GL_SGIX_ycrcb_subsample -#endif - -#ifndef GL_SGIX_ycrcba -#define GL_YCRCB_SGIX 0x8318 -#define GL_YCRCBA_SGIX 0x8319 -#endif - -#ifndef GL_SGI_depth_pass_instrument -#define GL_DEPTH_PASS_INSTRUMENT_SGIX 0x8310 -#define GL_DEPTH_PASS_INSTRUMENT_COUNTERS_SGIX 0x8311 -#define GL_DEPTH_PASS_INSTRUMENT_MAX_SGIX 0x8312 -#endif - -#ifndef GL_3DFX_texture_compression_FXT1 -#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 -#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 -#endif - -#ifndef GL_3DFX_multisample -#define GL_MULTISAMPLE_3DFX 0x86B2 -#define GL_SAMPLE_BUFFERS_3DFX 0x86B3 -#define GL_SAMPLES_3DFX 0x86B4 -#define GL_MULTISAMPLE_BIT_3DFX 0x20000000 -#endif - -#ifndef GL_3DFX_tbuffer -#endif - -#ifndef GL_EXT_multisample -#define GL_MULTISAMPLE_EXT 0x809D -#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F -#define GL_SAMPLE_MASK_EXT 0x80A0 -#define GL_1PASS_EXT 0x80A1 -#define GL_2PASS_0_EXT 0x80A2 -#define GL_2PASS_1_EXT 0x80A3 -#define GL_4PASS_0_EXT 0x80A4 -#define GL_4PASS_1_EXT 0x80A5 -#define GL_4PASS_2_EXT 0x80A6 -#define GL_4PASS_3_EXT 0x80A7 -#define GL_SAMPLE_BUFFERS_EXT 0x80A8 -#define GL_SAMPLES_EXT 0x80A9 -#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA -#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB -#define GL_SAMPLE_PATTERN_EXT 0x80AC -#define GL_MULTISAMPLE_BIT_EXT 0x20000000 -#endif - -#ifndef GL_SGIX_vertex_preclip -#define GL_VERTEX_PRECLIP_SGIX 0x83EE -#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF -#endif - -#ifndef GL_SGIX_convolution_accuracy -#define GL_CONVOLUTION_HINT_SGIX 0x8316 -#endif - -#ifndef GL_SGIX_resample -#define GL_PACK_RESAMPLE_SGIX 0x842C -#define GL_UNPACK_RESAMPLE_SGIX 0x842D -#define GL_RESAMPLE_REPLICATE_SGIX 0x842E -#define GL_RESAMPLE_ZERO_FILL_SGIX 0x842F -#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 -#endif - -#ifndef GL_SGIS_point_line_texgen -#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 -#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 -#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 -#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 -#define GL_EYE_POINT_SGIS 0x81F4 -#define GL_OBJECT_POINT_SGIS 0x81F5 -#define GL_EYE_LINE_SGIS 0x81F6 -#define GL_OBJECT_LINE_SGIS 0x81F7 -#endif - -#ifndef GL_SGIS_texture_color_mask -#define GL_TEXTURE_COLOR_WRITEMASK_SGIS 0x81EF -#endif - -#ifndef GL_EXT_texture_env_dot3 -#define GL_DOT3_RGB_EXT 0x8740 -#define GL_DOT3_RGBA_EXT 0x8741 -#endif - -#ifndef GL_ATI_texture_mirror_once -#define GL_MIRROR_CLAMP_ATI 0x8742 -#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 -#endif - -#ifndef GL_NV_fence -#define GL_ALL_COMPLETED_NV 0x84F2 -#define GL_FENCE_STATUS_NV 0x84F3 -#define GL_FENCE_CONDITION_NV 0x84F4 -#endif - -#ifndef GL_IBM_texture_mirrored_repeat -#define GL_MIRRORED_REPEAT_IBM 0x8370 -#endif - -#ifndef GL_NV_evaluators -#define GL_EVAL_2D_NV 0x86C0 -#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 -#define GL_MAP_TESSELLATION_NV 0x86C2 -#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 -#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 -#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 -#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 -#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 -#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 -#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 -#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA -#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB -#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC -#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD -#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE -#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF -#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 -#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 -#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 -#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 -#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 -#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 -#define GL_MAX_MAP_TESSELLATION_NV 0x86D6 -#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 -#endif - -#ifndef GL_NV_packed_depth_stencil -#define GL_DEPTH_STENCIL_NV 0x84F9 -#define GL_UNSIGNED_INT_24_8_NV 0x84FA -#endif - -#ifndef GL_NV_register_combiners2 -#define GL_PER_STAGE_CONSTANTS_NV 0x8535 -#endif - -#ifndef GL_NV_texture_compression_vtc -#endif - -#ifndef GL_NV_texture_rectangle -#define GL_TEXTURE_RECTANGLE_NV 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 -#endif - -#ifndef GL_NV_texture_shader -#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C -#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D -#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E -#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 -#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA -#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB -#define GL_DSDT_MAG_INTENSITY_NV 0x86DC -#define GL_SHADER_CONSISTENT_NV 0x86DD -#define GL_TEXTURE_SHADER_NV 0x86DE -#define GL_SHADER_OPERATION_NV 0x86DF -#define GL_CULL_MODES_NV 0x86E0 -#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 -#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 -#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 -#define GL_OFFSET_TEXTURE_2D_MATRIX_NV GL_OFFSET_TEXTURE_MATRIX_NV -#define GL_OFFSET_TEXTURE_2D_SCALE_NV GL_OFFSET_TEXTURE_SCALE_NV -#define GL_OFFSET_TEXTURE_2D_BIAS_NV GL_OFFSET_TEXTURE_BIAS_NV -#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 -#define GL_CONST_EYE_NV 0x86E5 -#define GL_PASS_THROUGH_NV 0x86E6 -#define GL_CULL_FRAGMENT_NV 0x86E7 -#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 -#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 -#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA -#define GL_DOT_PRODUCT_NV 0x86EC -#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED -#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE -#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 -#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 -#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 -#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 -#define GL_HILO_NV 0x86F4 -#define GL_DSDT_NV 0x86F5 -#define GL_DSDT_MAG_NV 0x86F6 -#define GL_DSDT_MAG_VIB_NV 0x86F7 -#define GL_HILO16_NV 0x86F8 -#define GL_SIGNED_HILO_NV 0x86F9 -#define GL_SIGNED_HILO16_NV 0x86FA -#define GL_SIGNED_RGBA_NV 0x86FB -#define GL_SIGNED_RGBA8_NV 0x86FC -#define GL_SIGNED_RGB_NV 0x86FE -#define GL_SIGNED_RGB8_NV 0x86FF -#define GL_SIGNED_LUMINANCE_NV 0x8701 -#define GL_SIGNED_LUMINANCE8_NV 0x8702 -#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 -#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 -#define GL_SIGNED_ALPHA_NV 0x8705 -#define GL_SIGNED_ALPHA8_NV 0x8706 -#define GL_SIGNED_INTENSITY_NV 0x8707 -#define GL_SIGNED_INTENSITY8_NV 0x8708 -#define GL_DSDT8_NV 0x8709 -#define GL_DSDT8_MAG8_NV 0x870A -#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B -#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C -#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D -#define GL_HI_SCALE_NV 0x870E -#define GL_LO_SCALE_NV 0x870F -#define GL_DS_SCALE_NV 0x8710 -#define GL_DT_SCALE_NV 0x8711 -#define GL_MAGNITUDE_SCALE_NV 0x8712 -#define GL_VIBRANCE_SCALE_NV 0x8713 -#define GL_HI_BIAS_NV 0x8714 -#define GL_LO_BIAS_NV 0x8715 -#define GL_DS_BIAS_NV 0x8716 -#define GL_DT_BIAS_NV 0x8717 -#define GL_MAGNITUDE_BIAS_NV 0x8718 -#define GL_VIBRANCE_BIAS_NV 0x8719 -#define GL_TEXTURE_BORDER_VALUES_NV 0x871A -#define GL_TEXTURE_HI_SIZE_NV 0x871B -#define GL_TEXTURE_LO_SIZE_NV 0x871C -#define GL_TEXTURE_DS_SIZE_NV 0x871D -#define GL_TEXTURE_DT_SIZE_NV 0x871E -#define GL_TEXTURE_MAG_SIZE_NV 0x871F -#endif - -#ifndef GL_NV_texture_shader2 -#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF -#endif - -#ifndef GL_NV_vertex_array_range2 -#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 -#endif - -#ifndef GL_NV_vertex_program -#define GL_VERTEX_PROGRAM_NV 0x8620 -#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 -#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 -#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 -#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 -#define GL_CURRENT_ATTRIB_NV 0x8626 -#define GL_PROGRAM_LENGTH_NV 0x8627 -#define GL_PROGRAM_STRING_NV 0x8628 -#define GL_MODELVIEW_PROJECTION_NV 0x8629 -#define GL_IDENTITY_NV 0x862A -#define GL_INVERSE_NV 0x862B -#define GL_TRANSPOSE_NV 0x862C -#define GL_INVERSE_TRANSPOSE_NV 0x862D -#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E -#define GL_MAX_TRACK_MATRICES_NV 0x862F -#define GL_MATRIX0_NV 0x8630 -#define GL_MATRIX1_NV 0x8631 -#define GL_MATRIX2_NV 0x8632 -#define GL_MATRIX3_NV 0x8633 -#define GL_MATRIX4_NV 0x8634 -#define GL_MATRIX5_NV 0x8635 -#define GL_MATRIX6_NV 0x8636 -#define GL_MATRIX7_NV 0x8637 -#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 -#define GL_CURRENT_MATRIX_NV 0x8641 -#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 -#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 -#define GL_PROGRAM_PARAMETER_NV 0x8644 -#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 -#define GL_PROGRAM_TARGET_NV 0x8646 -#define GL_PROGRAM_RESIDENT_NV 0x8647 -#define GL_TRACK_MATRIX_NV 0x8648 -#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 -#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A -#define GL_PROGRAM_ERROR_POSITION_NV 0x864B -#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 -#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 -#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 -#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 -#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 -#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 -#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 -#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 -#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 -#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 -#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A -#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B -#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C -#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D -#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E -#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F -#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 -#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 -#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 -#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 -#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 -#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 -#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 -#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 -#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 -#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 -#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A -#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B -#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C -#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D -#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E -#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F -#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 -#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 -#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 -#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 -#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 -#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 -#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 -#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 -#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 -#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 -#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A -#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B -#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C -#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D -#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E -#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F -#endif - -#ifndef GL_SGIX_texture_coordinate_clamp -#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 -#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A -#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B -#endif - -#ifndef GL_SGIX_scalebias_hint -#define GL_SCALEBIAS_HINT_SGIX 0x8322 -#endif - -#ifndef GL_OML_interlace -#define GL_INTERLACE_OML 0x8980 -#define GL_INTERLACE_READ_OML 0x8981 -#endif - -#ifndef GL_OML_subsample -#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 -#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 -#endif - -#ifndef GL_OML_resample -#define GL_PACK_RESAMPLE_OML 0x8984 -#define GL_UNPACK_RESAMPLE_OML 0x8985 -#define GL_RESAMPLE_REPLICATE_OML 0x8986 -#define GL_RESAMPLE_ZERO_FILL_OML 0x8987 -#define GL_RESAMPLE_AVERAGE_OML 0x8988 -#define GL_RESAMPLE_DECIMATE_OML 0x8989 -#endif - -#ifndef GL_NV_copy_depth_to_color -#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E -#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F -#endif - -#ifndef GL_ATI_envmap_bumpmap -#define GL_BUMP_ROT_MATRIX_ATI 0x8775 -#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 -#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 -#define GL_BUMP_TEX_UNITS_ATI 0x8778 -#define GL_DUDV_ATI 0x8779 -#define GL_DU8DV8_ATI 0x877A -#define GL_BUMP_ENVMAP_ATI 0x877B -#define GL_BUMP_TARGET_ATI 0x877C -#endif - -#ifndef GL_ATI_fragment_shader -#define GL_FRAGMENT_SHADER_ATI 0x8920 -#define GL_REG_0_ATI 0x8921 -#define GL_REG_1_ATI 0x8922 -#define GL_REG_2_ATI 0x8923 -#define GL_REG_3_ATI 0x8924 -#define GL_REG_4_ATI 0x8925 -#define GL_REG_5_ATI 0x8926 -#define GL_REG_6_ATI 0x8927 -#define GL_REG_7_ATI 0x8928 -#define GL_REG_8_ATI 0x8929 -#define GL_REG_9_ATI 0x892A -#define GL_REG_10_ATI 0x892B -#define GL_REG_11_ATI 0x892C -#define GL_REG_12_ATI 0x892D -#define GL_REG_13_ATI 0x892E -#define GL_REG_14_ATI 0x892F -#define GL_REG_15_ATI 0x8930 -#define GL_REG_16_ATI 0x8931 -#define GL_REG_17_ATI 0x8932 -#define GL_REG_18_ATI 0x8933 -#define GL_REG_19_ATI 0x8934 -#define GL_REG_20_ATI 0x8935 -#define GL_REG_21_ATI 0x8936 -#define GL_REG_22_ATI 0x8937 -#define GL_REG_23_ATI 0x8938 -#define GL_REG_24_ATI 0x8939 -#define GL_REG_25_ATI 0x893A -#define GL_REG_26_ATI 0x893B -#define GL_REG_27_ATI 0x893C -#define GL_REG_28_ATI 0x893D -#define GL_REG_29_ATI 0x893E -#define GL_REG_30_ATI 0x893F -#define GL_REG_31_ATI 0x8940 -#define GL_CON_0_ATI 0x8941 -#define GL_CON_1_ATI 0x8942 -#define GL_CON_2_ATI 0x8943 -#define GL_CON_3_ATI 0x8944 -#define GL_CON_4_ATI 0x8945 -#define GL_CON_5_ATI 0x8946 -#define GL_CON_6_ATI 0x8947 -#define GL_CON_7_ATI 0x8948 -#define GL_CON_8_ATI 0x8949 -#define GL_CON_9_ATI 0x894A -#define GL_CON_10_ATI 0x894B -#define GL_CON_11_ATI 0x894C -#define GL_CON_12_ATI 0x894D -#define GL_CON_13_ATI 0x894E -#define GL_CON_14_ATI 0x894F -#define GL_CON_15_ATI 0x8950 -#define GL_CON_16_ATI 0x8951 -#define GL_CON_17_ATI 0x8952 -#define GL_CON_18_ATI 0x8953 -#define GL_CON_19_ATI 0x8954 -#define GL_CON_20_ATI 0x8955 -#define GL_CON_21_ATI 0x8956 -#define GL_CON_22_ATI 0x8957 -#define GL_CON_23_ATI 0x8958 -#define GL_CON_24_ATI 0x8959 -#define GL_CON_25_ATI 0x895A -#define GL_CON_26_ATI 0x895B -#define GL_CON_27_ATI 0x895C -#define GL_CON_28_ATI 0x895D -#define GL_CON_29_ATI 0x895E -#define GL_CON_30_ATI 0x895F -#define GL_CON_31_ATI 0x8960 -#define GL_MOV_ATI 0x8961 -#define GL_ADD_ATI 0x8963 -#define GL_MUL_ATI 0x8964 -#define GL_SUB_ATI 0x8965 -#define GL_DOT3_ATI 0x8966 -#define GL_DOT4_ATI 0x8967 -#define GL_MAD_ATI 0x8968 -#define GL_LERP_ATI 0x8969 -#define GL_CND_ATI 0x896A -#define GL_CND0_ATI 0x896B -#define GL_DOT2_ADD_ATI 0x896C -#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D -#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E -#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F -#define GL_NUM_PASSES_ATI 0x8970 -#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 -#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 -#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 -#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 -#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 -#define GL_SWIZZLE_STR_ATI 0x8976 -#define GL_SWIZZLE_STQ_ATI 0x8977 -#define GL_SWIZZLE_STR_DR_ATI 0x8978 -#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 -#define GL_SWIZZLE_STRQ_ATI 0x897A -#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B -#define GL_RED_BIT_ATI 0x00000001 -#define GL_GREEN_BIT_ATI 0x00000002 -#define GL_BLUE_BIT_ATI 0x00000004 -#define GL_2X_BIT_ATI 0x00000001 -#define GL_4X_BIT_ATI 0x00000002 -#define GL_8X_BIT_ATI 0x00000004 -#define GL_HALF_BIT_ATI 0x00000008 -#define GL_QUARTER_BIT_ATI 0x00000010 -#define GL_EIGHTH_BIT_ATI 0x00000020 -#define GL_SATURATE_BIT_ATI 0x00000040 -#define GL_COMP_BIT_ATI 0x00000002 -#define GL_NEGATE_BIT_ATI 0x00000004 -#define GL_BIAS_BIT_ATI 0x00000008 -#endif - -#ifndef GL_ATI_pn_triangles -#define GL_PN_TRIANGLES_ATI 0x87F0 -#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 -#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 -#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 -#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 -#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 -#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 -#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 -#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 -#endif - -#ifndef GL_ATI_vertex_array_object -#define GL_STATIC_ATI 0x8760 -#define GL_DYNAMIC_ATI 0x8761 -#define GL_PRESERVE_ATI 0x8762 -#define GL_DISCARD_ATI 0x8763 -#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 -#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 -#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 -#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 -#endif - -#ifndef GL_EXT_vertex_shader -#define GL_VERTEX_SHADER_EXT 0x8780 -#define GL_VERTEX_SHADER_BINDING_EXT 0x8781 -#define GL_OP_INDEX_EXT 0x8782 -#define GL_OP_NEGATE_EXT 0x8783 -#define GL_OP_DOT3_EXT 0x8784 -#define GL_OP_DOT4_EXT 0x8785 -#define GL_OP_MUL_EXT 0x8786 -#define GL_OP_ADD_EXT 0x8787 -#define GL_OP_MADD_EXT 0x8788 -#define GL_OP_FRAC_EXT 0x8789 -#define GL_OP_MAX_EXT 0x878A -#define GL_OP_MIN_EXT 0x878B -#define GL_OP_SET_GE_EXT 0x878C -#define GL_OP_SET_LT_EXT 0x878D -#define GL_OP_CLAMP_EXT 0x878E -#define GL_OP_FLOOR_EXT 0x878F -#define GL_OP_ROUND_EXT 0x8790 -#define GL_OP_EXP_BASE_2_EXT 0x8791 -#define GL_OP_LOG_BASE_2_EXT 0x8792 -#define GL_OP_POWER_EXT 0x8793 -#define GL_OP_RECIP_EXT 0x8794 -#define GL_OP_RECIP_SQRT_EXT 0x8795 -#define GL_OP_SUB_EXT 0x8796 -#define GL_OP_CROSS_PRODUCT_EXT 0x8797 -#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 -#define GL_OP_MOV_EXT 0x8799 -#define GL_OUTPUT_VERTEX_EXT 0x879A -#define GL_OUTPUT_COLOR0_EXT 0x879B -#define GL_OUTPUT_COLOR1_EXT 0x879C -#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D -#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E -#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F -#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 -#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 -#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 -#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 -#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 -#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 -#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 -#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 -#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 -#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 -#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA -#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB -#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC -#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD -#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE -#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF -#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 -#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 -#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 -#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 -#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 -#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 -#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 -#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 -#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 -#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 -#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA -#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB -#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC -#define GL_OUTPUT_FOG_EXT 0x87BD -#define GL_SCALAR_EXT 0x87BE -#define GL_VECTOR_EXT 0x87BF -#define GL_MATRIX_EXT 0x87C0 -#define GL_VARIANT_EXT 0x87C1 -#define GL_INVARIANT_EXT 0x87C2 -#define GL_LOCAL_CONSTANT_EXT 0x87C3 -#define GL_LOCAL_EXT 0x87C4 -#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 -#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 -#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 -#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 -#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CC -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CD -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE -#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF -#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 -#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 -#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 -#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 -#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 -#define GL_X_EXT 0x87D5 -#define GL_Y_EXT 0x87D6 -#define GL_Z_EXT 0x87D7 -#define GL_W_EXT 0x87D8 -#define GL_NEGATIVE_X_EXT 0x87D9 -#define GL_NEGATIVE_Y_EXT 0x87DA -#define GL_NEGATIVE_Z_EXT 0x87DB -#define GL_NEGATIVE_W_EXT 0x87DC -#define GL_ZERO_EXT 0x87DD -#define GL_ONE_EXT 0x87DE -#define GL_NEGATIVE_ONE_EXT 0x87DF -#define GL_NORMALIZED_RANGE_EXT 0x87E0 -#define GL_FULL_RANGE_EXT 0x87E1 -#define GL_CURRENT_VERTEX_EXT 0x87E2 -#define GL_MVP_MATRIX_EXT 0x87E3 -#define GL_VARIANT_VALUE_EXT 0x87E4 -#define GL_VARIANT_DATATYPE_EXT 0x87E5 -#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 -#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 -#define GL_VARIANT_ARRAY_EXT 0x87E8 -#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 -#define GL_INVARIANT_VALUE_EXT 0x87EA -#define GL_INVARIANT_DATATYPE_EXT 0x87EB -#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC -#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED -#endif - -#ifndef GL_ATI_vertex_streams -#define GL_MAX_VERTEX_STREAMS_ATI 0x876B -#define GL_VERTEX_STREAM0_ATI 0x876C -#define GL_VERTEX_STREAM1_ATI 0x876D -#define GL_VERTEX_STREAM2_ATI 0x876E -#define GL_VERTEX_STREAM3_ATI 0x876F -#define GL_VERTEX_STREAM4_ATI 0x8770 -#define GL_VERTEX_STREAM5_ATI 0x8771 -#define GL_VERTEX_STREAM6_ATI 0x8772 -#define GL_VERTEX_STREAM7_ATI 0x8773 -#define GL_VERTEX_SOURCE_ATI 0x8774 -#endif - -#ifndef GL_ATI_element_array -#define GL_ELEMENT_ARRAY_ATI 0x8768 -#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 -#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A -#endif - -#ifndef GL_SUN_mesh_array -#define GL_QUAD_MESH_SUN 0x8614 -#define GL_TRIANGLE_MESH_SUN 0x8615 -#endif - -#ifndef GL_SUN_slice_accum -#define GL_SLICE_ACCUM_SUN 0x85CC -#endif - -#ifndef GL_NV_multisample_filter_hint -#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 -#endif - -#ifndef GL_NV_depth_clamp -#define GL_DEPTH_CLAMP_NV 0x864F -#endif - -#ifndef GL_NV_occlusion_query -#define GL_PIXEL_COUNTER_BITS_NV 0x8864 -#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 -#define GL_PIXEL_COUNT_NV 0x8866 -#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 -#endif - -#ifndef GL_NV_point_sprite -#define GL_POINT_SPRITE_NV 0x8861 -#define GL_COORD_REPLACE_NV 0x8862 -#define GL_POINT_SPRITE_R_MODE_NV 0x8863 -#endif - -#ifndef GL_NV_texture_shader3 -#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 -#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 -#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 -#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 -#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 -#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 -#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 -#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 -#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 -#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 -#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A -#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B -#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C -#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D -#define GL_HILO8_NV 0x885E -#define GL_SIGNED_HILO8_NV 0x885F -#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 -#endif - -#ifndef GL_NV_vertex_program1_1 -#endif - -#ifndef GL_EXT_shadow_funcs -#endif - -#ifndef GL_EXT_stencil_two_side -#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 -#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 -#endif - -#ifndef GL_ATI_text_fragment_shader -#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 -#endif - -#ifndef GL_APPLE_client_storage -#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 -#endif - -#ifndef GL_APPLE_element_array -#define GL_ELEMENT_ARRAY_APPLE 0x8A0C -#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8A0D -#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x8A0E -#endif - -#ifndef GL_APPLE_fence -#define GL_DRAW_PIXELS_APPLE 0x8A0A -#define GL_FENCE_APPLE 0x8A0B -#endif - -#ifndef GL_APPLE_vertex_array_object -#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 -#endif - -#ifndef GL_APPLE_vertex_array_range -#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D -#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E -#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F -#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 -#define GL_STORAGE_CLIENT_APPLE 0x85B4 -#define GL_STORAGE_CACHED_APPLE 0x85BE -#define GL_STORAGE_SHARED_APPLE 0x85BF -#endif - -#ifndef GL_APPLE_ycbcr_422 -#define GL_YCBCR_422_APPLE 0x85B9 -#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA -#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB -#endif - -#ifndef GL_S3_s3tc -#define GL_RGB_S3TC 0x83A0 -#define GL_RGB4_S3TC 0x83A1 -#define GL_RGBA_S3TC 0x83A2 -#define GL_RGBA4_S3TC 0x83A3 -#endif - -#ifndef GL_ATI_draw_buffers -#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 -#define GL_DRAW_BUFFER0_ATI 0x8825 -#define GL_DRAW_BUFFER1_ATI 0x8826 -#define GL_DRAW_BUFFER2_ATI 0x8827 -#define GL_DRAW_BUFFER3_ATI 0x8828 -#define GL_DRAW_BUFFER4_ATI 0x8829 -#define GL_DRAW_BUFFER5_ATI 0x882A -#define GL_DRAW_BUFFER6_ATI 0x882B -#define GL_DRAW_BUFFER7_ATI 0x882C -#define GL_DRAW_BUFFER8_ATI 0x882D -#define GL_DRAW_BUFFER9_ATI 0x882E -#define GL_DRAW_BUFFER10_ATI 0x882F -#define GL_DRAW_BUFFER11_ATI 0x8830 -#define GL_DRAW_BUFFER12_ATI 0x8831 -#define GL_DRAW_BUFFER13_ATI 0x8832 -#define GL_DRAW_BUFFER14_ATI 0x8833 -#define GL_DRAW_BUFFER15_ATI 0x8834 -#endif - -#ifndef GL_ATI_pixel_format_float -#define GL_TYPE_RGBA_FLOAT_ATI 0x8820 -#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 -#endif - -#ifndef GL_ATI_texture_env_combine3 -#define GL_MODULATE_ADD_ATI 0x8744 -#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 -#define GL_MODULATE_SUBTRACT_ATI 0x8746 -#endif - -#ifndef GL_ATI_texture_float -#define GL_RGBA_FLOAT32_ATI 0x8814 -#define GL_RGB_FLOAT32_ATI 0x8815 -#define GL_ALPHA_FLOAT32_ATI 0x8816 -#define GL_INTENSITY_FLOAT32_ATI 0x8817 -#define GL_LUMINANCE_FLOAT32_ATI 0x8818 -#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 -#define GL_RGBA_FLOAT16_ATI 0x881A -#define GL_RGB_FLOAT16_ATI 0x881B -#define GL_ALPHA_FLOAT16_ATI 0x881C -#define GL_INTENSITY_FLOAT16_ATI 0x881D -#define GL_LUMINANCE_FLOAT16_ATI 0x881E -#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F -#endif - -#ifndef GL_NV_float_buffer -#define GL_FLOAT_R_NV 0x8880 -#define GL_FLOAT_RG_NV 0x8881 -#define GL_FLOAT_RGB_NV 0x8882 -#define GL_FLOAT_RGBA_NV 0x8883 -#define GL_FLOAT_R16_NV 0x8884 -#define GL_FLOAT_R32_NV 0x8885 -#define GL_FLOAT_RG16_NV 0x8886 -#define GL_FLOAT_RG32_NV 0x8887 -#define GL_FLOAT_RGB16_NV 0x8888 -#define GL_FLOAT_RGB32_NV 0x8889 -#define GL_FLOAT_RGBA16_NV 0x888A -#define GL_FLOAT_RGBA32_NV 0x888B -#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C -#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D -#define GL_FLOAT_RGBA_MODE_NV 0x888E -#endif - -#ifndef GL_NV_fragment_program -#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 -#define GL_FRAGMENT_PROGRAM_NV 0x8870 -#define GL_MAX_TEXTURE_COORDS_NV 0x8871 -#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 -#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 -#define GL_PROGRAM_ERROR_STRING_NV 0x8874 -#endif - -#ifndef GL_NV_half_float -#define GL_HALF_FLOAT_NV 0x140B -#endif - -#ifndef GL_NV_pixel_data_range -#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 -#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 -#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A -#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B -#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C -#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D -#endif - -#ifndef GL_NV_primitive_restart -#define GL_PRIMITIVE_RESTART_NV 0x8558 -#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 -#endif - -#ifndef GL_NV_texture_expand_normal -#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F -#endif - -#ifndef GL_NV_vertex_program2 -#endif - -#ifndef GL_ATI_map_object_buffer -#endif - -#ifndef GL_ATI_separate_stencil -#define GL_STENCIL_BACK_FUNC_ATI 0x8800 -#define GL_STENCIL_BACK_FAIL_ATI 0x8801 -#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 -#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 -#endif - -#ifndef GL_ATI_vertex_attrib_array_object -#endif - -#ifndef GL_OES_read_format -#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A -#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B -#endif - -#ifndef GL_EXT_depth_bounds_test -#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 -#define GL_DEPTH_BOUNDS_EXT 0x8891 -#endif - -#ifndef GL_EXT_texture_mirror_clamp -#define GL_MIRROR_CLAMP_EXT 0x8742 -#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 -#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 -#endif - -#ifndef GL_EXT_blend_equation_separate -#define GL_BLEND_EQUATION_RGB_EXT 0x8009 -#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D -#endif - -#ifndef GL_MESA_pack_invert -#define GL_PACK_INVERT_MESA 0x8758 -#endif - -#ifndef GL_MESA_ycbcr_texture -#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA -#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB -#define GL_YCBCR_MESA 0x8757 -#endif - -#ifndef GL_EXT_pixel_buffer_object -#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB -#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF -#endif - -#ifndef GL_NV_fragment_program_option -#endif - -#ifndef GL_NV_fragment_program2 -#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 -#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 -#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 -#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 -#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 -#endif - -#ifndef GL_NV_vertex_program2_option -/* reuse GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV */ -/* reuse GL_MAX_PROGRAM_CALL_DEPTH_NV */ -#endif - -#ifndef GL_NV_vertex_program3 -/* reuse GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB */ -#endif - -#ifndef GL_EXT_framebuffer_object -#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 -#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 -#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 -#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 -#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 -#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 -#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 -#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 -#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA -#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB -#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC -#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD -#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF -#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 -#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 -#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 -#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 -#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 -#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 -#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 -#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 -#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 -#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 -#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA -#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB -#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC -#define GL_COLOR_ATTACHMENT13_EXT 0x8CED -#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE -#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF -#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 -#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 -#define GL_FRAMEBUFFER_EXT 0x8D40 -#define GL_RENDERBUFFER_EXT 0x8D41 -#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 -#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 -#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 -#define GL_STENCIL_INDEX1_EXT 0x8D46 -#define GL_STENCIL_INDEX4_EXT 0x8D47 -#define GL_STENCIL_INDEX8_EXT 0x8D48 -#define GL_STENCIL_INDEX16_EXT 0x8D49 -#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 -#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 -#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 -#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 -#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 -#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 -#endif - -#ifndef GL_GREMEDY_string_marker -#endif - -#ifndef GL_EXT_packed_depth_stencil -#define GL_DEPTH_STENCIL_EXT 0x84F9 -#define GL_UNSIGNED_INT_24_8_EXT 0x84FA -#define GL_DEPTH24_STENCIL8_EXT 0x88F0 -#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1 -#endif - -#ifndef GL_EXT_stencil_clear_tag -#define GL_STENCIL_TAG_BITS_EXT 0x88F2 -#define GL_STENCIL_CLEAR_TAG_VALUE_EXT 0x88F3 -#endif - -#ifndef GL_EXT_texture_sRGB -#define GL_SRGB_EXT 0x8C40 -#define GL_SRGB8_EXT 0x8C41 -#define GL_SRGB_ALPHA_EXT 0x8C42 -#define GL_SRGB8_ALPHA8_EXT 0x8C43 -#define GL_SLUMINANCE_ALPHA_EXT 0x8C44 -#define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45 -#define GL_SLUMINANCE_EXT 0x8C46 -#define GL_SLUMINANCE8_EXT 0x8C47 -#define GL_COMPRESSED_SRGB_EXT 0x8C48 -#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49 -#define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A -#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B -#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F -#endif - -#ifndef GL_EXT_framebuffer_blit -#define GL_READ_FRAMEBUFFER_EXT 0x8CA8 -#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 -#define GL_DRAW_FRAMEBUFFER_BINDING_EXT GL_FRAMEBUFFER_BINDING_EXT -#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA -#endif - -#ifndef GL_EXT_framebuffer_multisample -#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 -#define GL_MAX_SAMPLES_EXT 0x8D57 -#endif - -#ifndef GL_MESAX_texture_stack -#define GL_TEXTURE_1D_STACK_MESAX 0x8759 -#define GL_TEXTURE_2D_STACK_MESAX 0x875A -#define GL_PROXY_TEXTURE_1D_STACK_MESAX 0x875B -#define GL_PROXY_TEXTURE_2D_STACK_MESAX 0x875C -#define GL_TEXTURE_1D_STACK_BINDING_MESAX 0x875D -#define GL_TEXTURE_2D_STACK_BINDING_MESAX 0x875E -#endif - -#ifndef GL_EXT_timer_query -#define GL_TIME_ELAPSED_EXT 0x88BF -#endif - -#ifndef GL_EXT_gpu_program_parameters -#endif - -#ifndef GL_APPLE_flush_buffer_range -#define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8A12 -#define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8A13 -#endif - -#ifndef GL_NV_gpu_program4 -#define GL_MIN_PROGRAM_TEXEL_OFFSET_NV 0x8904 -#define GL_MAX_PROGRAM_TEXEL_OFFSET_NV 0x8905 -#define GL_PROGRAM_ATTRIB_COMPONENTS_NV 0x8906 -#define GL_PROGRAM_RESULT_COMPONENTS_NV 0x8907 -#define GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV 0x8908 -#define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909 -#define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5 -#define GL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6 -#endif - -#ifndef GL_NV_geometry_program4 -#define GL_LINES_ADJACENCY_EXT 0x000A -#define GL_LINE_STRIP_ADJACENCY_EXT 0x000B -#define GL_TRIANGLES_ADJACENCY_EXT 0x000C -#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0x000D -#define GL_GEOMETRY_PROGRAM_NV 0x8C26 -#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27 -#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28 -#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA -#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB -#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4 -#define GL_PROGRAM_POINT_SIZE_EXT 0x8642 -#endif - -#ifndef GL_EXT_geometry_shader4 -#define GL_GEOMETRY_SHADER_EXT 0x8DD9 -/* reuse GL_GEOMETRY_VERTICES_OUT_EXT */ -/* reuse GL_GEOMETRY_INPUT_TYPE_EXT */ -/* reuse GL_GEOMETRY_OUTPUT_TYPE_EXT */ -/* reuse GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT */ -#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD -#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE -#define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 -/* reuse GL_LINES_ADJACENCY_EXT */ -/* reuse GL_LINE_STRIP_ADJACENCY_EXT */ -/* reuse GL_TRIANGLES_ADJACENCY_EXT */ -/* reuse GL_TRIANGLE_STRIP_ADJACENCY_EXT */ -/* reuse GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT */ -/* reuse GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT */ -/* reuse GL_PROGRAM_POINT_SIZE_EXT */ -#endif - -#ifndef GL_NV_vertex_program4 -#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_NV 0x88FD -#endif - -#ifndef GL_EXT_gpu_shader4 -#define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0 -#define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1 -#define GL_SAMPLER_BUFFER_EXT 0x8DC2 -#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3 -#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4 -#define GL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5 -#define GL_UNSIGNED_INT_VEC2_EXT 0x8DC6 -#define GL_UNSIGNED_INT_VEC3_EXT 0x8DC7 -#define GL_UNSIGNED_INT_VEC4_EXT 0x8DC8 -#define GL_INT_SAMPLER_1D_EXT 0x8DC9 -#define GL_INT_SAMPLER_2D_EXT 0x8DCA -#define GL_INT_SAMPLER_3D_EXT 0x8DCB -#define GL_INT_SAMPLER_CUBE_EXT 0x8DCC -#define GL_INT_SAMPLER_2D_RECT_EXT 0x8DCD -#define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE -#define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF -#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 -#define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1 -#define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2 -#define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3 -#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4 -#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5 -#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6 -#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7 -#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 -#endif - -#ifndef GL_EXT_draw_instanced -#endif - -#ifndef GL_EXT_packed_float -#define GL_R11F_G11F_B10F_EXT 0x8C3A -#define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B -#define GL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C -#endif - -#ifndef GL_EXT_texture_array -#define GL_TEXTURE_1D_ARRAY_EXT 0x8C18 -#define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19 -#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A -#define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B -#define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C -#define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D -#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF -#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E -/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT */ -#endif - -#ifndef GL_EXT_texture_buffer_object -#define GL_TEXTURE_BUFFER_EXT 0x8C2A -#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B -#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C -#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D -#define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E -#endif - -#ifndef GL_EXT_texture_compression_latc -#define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70 -#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71 -#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72 -#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73 -#endif - -#ifndef GL_EXT_texture_compression_rgtc -#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB -#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC -#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD -#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE -#endif - -#ifndef GL_EXT_texture_shared_exponent -#define GL_RGB9_E5_EXT 0x8C3D -#define GL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E -#define GL_TEXTURE_SHARED_SIZE_EXT 0x8C3F -#endif - -#ifndef GL_NV_depth_buffer_float -#define GL_DEPTH_COMPONENT32F_NV 0x8DAB -#define GL_DEPTH32F_STENCIL8_NV 0x8DAC -#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD -#define GL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF -#endif - -#ifndef GL_NV_fragment_program4 -#endif - -#ifndef GL_NV_framebuffer_multisample_coverage -#define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB -#define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10 -#define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11 -#define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12 -#endif - -#ifndef GL_EXT_framebuffer_sRGB -#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 -#define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA -#endif - -#ifndef GL_NV_geometry_shader4 -#endif - -#ifndef GL_NV_parameter_buffer_object -#define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0 -#define GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV 0x8DA1 -#define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8DA2 -#define GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV 0x8DA3 -#define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8DA4 -#endif - -#ifndef GL_EXT_draw_buffers2 -#endif - -#ifndef GL_NV_transform_feedback -#define GL_BACK_PRIMARY_COLOR_NV 0x8C77 -#define GL_BACK_SECONDARY_COLOR_NV 0x8C78 -#define GL_TEXTURE_COORD_NV 0x8C79 -#define GL_CLIP_DISTANCE_NV 0x8C7A -#define GL_VERTEX_ID_NV 0x8C7B -#define GL_PRIMITIVE_ID_NV 0x8C7C -#define GL_GENERIC_ATTRIB_NV 0x8C7D -#define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E -#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80 -#define GL_ACTIVE_VARYINGS_NV 0x8C81 -#define GL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82 -#define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83 -#define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84 -#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85 -#define GL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86 -#define GL_PRIMITIVES_GENERATED_NV 0x8C87 -#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88 -#define GL_RASTERIZER_DISCARD_NV 0x8C89 -#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_ATTRIBS_NV 0x8C8A -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B -#define GL_INTERLEAVED_ATTRIBS_NV 0x8C8C -#define GL_SEPARATE_ATTRIBS_NV 0x8C8D -#define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E -#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F -#define GL_LAYER_NV 0x8DAA -#define GL_NEXT_BUFFER_NV -2 -#define GL_SKIP_COMPONENTS4_NV -3 -#define GL_SKIP_COMPONENTS3_NV -4 -#define GL_SKIP_COMPONENTS2_NV -5 -#define GL_SKIP_COMPONENTS1_NV -6 -#endif - -#ifndef GL_EXT_bindable_uniform -#define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2 -#define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3 -#define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4 -#define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED -#define GL_UNIFORM_BUFFER_EXT 0x8DEE -#define GL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF -#endif - -#ifndef GL_EXT_texture_integer -#define GL_RGBA32UI_EXT 0x8D70 -#define GL_RGB32UI_EXT 0x8D71 -#define GL_ALPHA32UI_EXT 0x8D72 -#define GL_INTENSITY32UI_EXT 0x8D73 -#define GL_LUMINANCE32UI_EXT 0x8D74 -#define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75 -#define GL_RGBA16UI_EXT 0x8D76 -#define GL_RGB16UI_EXT 0x8D77 -#define GL_ALPHA16UI_EXT 0x8D78 -#define GL_INTENSITY16UI_EXT 0x8D79 -#define GL_LUMINANCE16UI_EXT 0x8D7A -#define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B -#define GL_RGBA8UI_EXT 0x8D7C -#define GL_RGB8UI_EXT 0x8D7D -#define GL_ALPHA8UI_EXT 0x8D7E -#define GL_INTENSITY8UI_EXT 0x8D7F -#define GL_LUMINANCE8UI_EXT 0x8D80 -#define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81 -#define GL_RGBA32I_EXT 0x8D82 -#define GL_RGB32I_EXT 0x8D83 -#define GL_ALPHA32I_EXT 0x8D84 -#define GL_INTENSITY32I_EXT 0x8D85 -#define GL_LUMINANCE32I_EXT 0x8D86 -#define GL_LUMINANCE_ALPHA32I_EXT 0x8D87 -#define GL_RGBA16I_EXT 0x8D88 -#define GL_RGB16I_EXT 0x8D89 -#define GL_ALPHA16I_EXT 0x8D8A -#define GL_INTENSITY16I_EXT 0x8D8B -#define GL_LUMINANCE16I_EXT 0x8D8C -#define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D -#define GL_RGBA8I_EXT 0x8D8E -#define GL_RGB8I_EXT 0x8D8F -#define GL_ALPHA8I_EXT 0x8D90 -#define GL_INTENSITY8I_EXT 0x8D91 -#define GL_LUMINANCE8I_EXT 0x8D92 -#define GL_LUMINANCE_ALPHA8I_EXT 0x8D93 -#define GL_RED_INTEGER_EXT 0x8D94 -#define GL_GREEN_INTEGER_EXT 0x8D95 -#define GL_BLUE_INTEGER_EXT 0x8D96 -#define GL_ALPHA_INTEGER_EXT 0x8D97 -#define GL_RGB_INTEGER_EXT 0x8D98 -#define GL_RGBA_INTEGER_EXT 0x8D99 -#define GL_BGR_INTEGER_EXT 0x8D9A -#define GL_BGRA_INTEGER_EXT 0x8D9B -#define GL_LUMINANCE_INTEGER_EXT 0x8D9C -#define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D -#define GL_RGBA_INTEGER_MODE_EXT 0x8D9E -#endif - -#ifndef GL_GREMEDY_frame_terminator -#endif - -#ifndef GL_NV_conditional_render -#define GL_QUERY_WAIT_NV 0x8E13 -#define GL_QUERY_NO_WAIT_NV 0x8E14 -#define GL_QUERY_BY_REGION_WAIT_NV 0x8E15 -#define GL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16 -#endif - -#ifndef GL_NV_present_video -#define GL_FRAME_NV 0x8E26 -#define GL_FIELDS_NV 0x8E27 -#define GL_CURRENT_TIME_NV 0x8E28 -#define GL_NUM_FILL_STREAMS_NV 0x8E29 -#define GL_PRESENT_TIME_NV 0x8E2A -#define GL_PRESENT_DURATION_NV 0x8E2B -#endif - -#ifndef GL_EXT_transform_feedback -#define GL_TRANSFORM_FEEDBACK_BUFFER_EXT 0x8C8E -#define GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT 0x8C84 -#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT 0x8C85 -#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT 0x8C8F -#define GL_INTERLEAVED_ATTRIBS_EXT 0x8C8C -#define GL_SEPARATE_ATTRIBS_EXT 0x8C8D -#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 -#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT 0x8C88 -#define GL_RASTERIZER_DISCARD_EXT 0x8C89 -#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT 0x8C8A -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT 0x8C8B -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT 0x8C80 -#define GL_TRANSFORM_FEEDBACK_VARYINGS_EXT 0x8C83 -#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT 0x8C7F -#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT 0x8C76 -#endif - -#ifndef GL_EXT_direct_state_access -#define GL_PROGRAM_MATRIX_EXT 0x8E2D -#define GL_TRANSPOSE_PROGRAM_MATRIX_EXT 0x8E2E -#define GL_PROGRAM_MATRIX_STACK_DEPTH_EXT 0x8E2F -#endif - -#ifndef GL_EXT_vertex_array_bgra -/* reuse GL_BGRA */ -#endif - -#ifndef GL_EXT_texture_swizzle -#define GL_TEXTURE_SWIZZLE_R_EXT 0x8E42 -#define GL_TEXTURE_SWIZZLE_G_EXT 0x8E43 -#define GL_TEXTURE_SWIZZLE_B_EXT 0x8E44 -#define GL_TEXTURE_SWIZZLE_A_EXT 0x8E45 -#define GL_TEXTURE_SWIZZLE_RGBA_EXT 0x8E46 -#endif - -#ifndef GL_NV_explicit_multisample -#define GL_SAMPLE_POSITION_NV 0x8E50 -#define GL_SAMPLE_MASK_NV 0x8E51 -#define GL_SAMPLE_MASK_VALUE_NV 0x8E52 -#define GL_TEXTURE_BINDING_RENDERBUFFER_NV 0x8E53 -#define GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV 0x8E54 -#define GL_TEXTURE_RENDERBUFFER_NV 0x8E55 -#define GL_SAMPLER_RENDERBUFFER_NV 0x8E56 -#define GL_INT_SAMPLER_RENDERBUFFER_NV 0x8E57 -#define GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV 0x8E58 -#define GL_MAX_SAMPLE_MASK_WORDS_NV 0x8E59 -#endif - -#ifndef GL_NV_transform_feedback2 -#define GL_TRANSFORM_FEEDBACK_NV 0x8E22 -#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV 0x8E23 -#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV 0x8E24 -#define GL_TRANSFORM_FEEDBACK_BINDING_NV 0x8E25 -#endif - -#ifndef GL_ATI_meminfo -#define GL_VBO_FREE_MEMORY_ATI 0x87FB -#define GL_TEXTURE_FREE_MEMORY_ATI 0x87FC -#define GL_RENDERBUFFER_FREE_MEMORY_ATI 0x87FD -#endif - -#ifndef GL_AMD_performance_monitor -#define GL_COUNTER_TYPE_AMD 0x8BC0 -#define GL_COUNTER_RANGE_AMD 0x8BC1 -#define GL_UNSIGNED_INT64_AMD 0x8BC2 -#define GL_PERCENTAGE_AMD 0x8BC3 -#define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4 -#define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5 -#define GL_PERFMON_RESULT_AMD 0x8BC6 -#endif - -#ifndef GL_AMD_texture_texture4 -#endif - -#ifndef GL_AMD_vertex_shader_tesselator -#define GL_SAMPLER_BUFFER_AMD 0x9001 -#define GL_INT_SAMPLER_BUFFER_AMD 0x9002 -#define GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD 0x9003 -#define GL_TESSELLATION_MODE_AMD 0x9004 -#define GL_TESSELLATION_FACTOR_AMD 0x9005 -#define GL_DISCRETE_AMD 0x9006 -#define GL_CONTINUOUS_AMD 0x9007 -#endif - -#ifndef GL_EXT_provoking_vertex -#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8E4C -#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D -#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E -#define GL_PROVOKING_VERTEX_EXT 0x8E4F -#endif - -#ifndef GL_EXT_texture_snorm -#define GL_ALPHA_SNORM 0x9010 -#define GL_LUMINANCE_SNORM 0x9011 -#define GL_LUMINANCE_ALPHA_SNORM 0x9012 -#define GL_INTENSITY_SNORM 0x9013 -#define GL_ALPHA8_SNORM 0x9014 -#define GL_LUMINANCE8_SNORM 0x9015 -#define GL_LUMINANCE8_ALPHA8_SNORM 0x9016 -#define GL_INTENSITY8_SNORM 0x9017 -#define GL_ALPHA16_SNORM 0x9018 -#define GL_LUMINANCE16_SNORM 0x9019 -#define GL_LUMINANCE16_ALPHA16_SNORM 0x901A -#define GL_INTENSITY16_SNORM 0x901B -/* reuse GL_RED_SNORM */ -/* reuse GL_RG_SNORM */ -/* reuse GL_RGB_SNORM */ -/* reuse GL_RGBA_SNORM */ -/* reuse GL_R8_SNORM */ -/* reuse GL_RG8_SNORM */ -/* reuse GL_RGB8_SNORM */ -/* reuse GL_RGBA8_SNORM */ -/* reuse GL_R16_SNORM */ -/* reuse GL_RG16_SNORM */ -/* reuse GL_RGB16_SNORM */ -/* reuse GL_RGBA16_SNORM */ -/* reuse GL_SIGNED_NORMALIZED */ -#endif - -#ifndef GL_AMD_draw_buffers_blend -#endif - -#ifndef GL_APPLE_texture_range -#define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7 -#define GL_TEXTURE_RANGE_POINTER_APPLE 0x85B8 -#define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC -#define GL_STORAGE_PRIVATE_APPLE 0x85BD -/* reuse GL_STORAGE_CACHED_APPLE */ -/* reuse GL_STORAGE_SHARED_APPLE */ -#endif - -#ifndef GL_APPLE_float_pixels -#define GL_HALF_APPLE 0x140B -#define GL_RGBA_FLOAT32_APPLE 0x8814 -#define GL_RGB_FLOAT32_APPLE 0x8815 -#define GL_ALPHA_FLOAT32_APPLE 0x8816 -#define GL_INTENSITY_FLOAT32_APPLE 0x8817 -#define GL_LUMINANCE_FLOAT32_APPLE 0x8818 -#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819 -#define GL_RGBA_FLOAT16_APPLE 0x881A -#define GL_RGB_FLOAT16_APPLE 0x881B -#define GL_ALPHA_FLOAT16_APPLE 0x881C -#define GL_INTENSITY_FLOAT16_APPLE 0x881D -#define GL_LUMINANCE_FLOAT16_APPLE 0x881E -#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F -#define GL_COLOR_FLOAT_APPLE 0x8A0F -#endif - -#ifndef GL_APPLE_vertex_program_evaluators -#define GL_VERTEX_ATTRIB_MAP1_APPLE 0x8A00 -#define GL_VERTEX_ATTRIB_MAP2_APPLE 0x8A01 -#define GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE 0x8A02 -#define GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE 0x8A03 -#define GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE 0x8A04 -#define GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE 0x8A05 -#define GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE 0x8A06 -#define GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE 0x8A07 -#define GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE 0x8A08 -#define GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE 0x8A09 -#endif - -#ifndef GL_APPLE_aux_depth_stencil -#define GL_AUX_DEPTH_STENCIL_APPLE 0x8A14 -#endif - -#ifndef GL_APPLE_object_purgeable -#define GL_BUFFER_OBJECT_APPLE 0x85B3 -#define GL_RELEASED_APPLE 0x8A19 -#define GL_VOLATILE_APPLE 0x8A1A -#define GL_RETAINED_APPLE 0x8A1B -#define GL_UNDEFINED_APPLE 0x8A1C -#define GL_PURGEABLE_APPLE 0x8A1D -#endif - -#ifndef GL_APPLE_row_bytes -#define GL_PACK_ROW_BYTES_APPLE 0x8A15 -#define GL_UNPACK_ROW_BYTES_APPLE 0x8A16 -#endif - -#ifndef GL_APPLE_rgb_422 -#define GL_RGB_422_APPLE 0x8A1F -/* reuse GL_UNSIGNED_SHORT_8_8_APPLE */ -/* reuse GL_UNSIGNED_SHORT_8_8_REV_APPLE */ -#endif - -#ifndef GL_NV_video_capture -#define GL_VIDEO_BUFFER_NV 0x9020 -#define GL_VIDEO_BUFFER_BINDING_NV 0x9021 -#define GL_FIELD_UPPER_NV 0x9022 -#define GL_FIELD_LOWER_NV 0x9023 -#define GL_NUM_VIDEO_CAPTURE_STREAMS_NV 0x9024 -#define GL_NEXT_VIDEO_CAPTURE_BUFFER_STATUS_NV 0x9025 -#define GL_VIDEO_CAPTURE_TO_422_SUPPORTED_NV 0x9026 -#define GL_LAST_VIDEO_CAPTURE_STATUS_NV 0x9027 -#define GL_VIDEO_BUFFER_PITCH_NV 0x9028 -#define GL_VIDEO_COLOR_CONVERSION_MATRIX_NV 0x9029 -#define GL_VIDEO_COLOR_CONVERSION_MAX_NV 0x902A -#define GL_VIDEO_COLOR_CONVERSION_MIN_NV 0x902B -#define GL_VIDEO_COLOR_CONVERSION_OFFSET_NV 0x902C -#define GL_VIDEO_BUFFER_INTERNAL_FORMAT_NV 0x902D -#define GL_PARTIAL_SUCCESS_NV 0x902E -#define GL_SUCCESS_NV 0x902F -#define GL_FAILURE_NV 0x9030 -#define GL_YCBYCR8_422_NV 0x9031 -#define GL_YCBAYCR8A_4224_NV 0x9032 -#define GL_Z6Y10Z6CB10Z6Y10Z6CR10_422_NV 0x9033 -#define GL_Z6Y10Z6CB10Z6A10Z6Y10Z6CR10Z6A10_4224_NV 0x9034 -#define GL_Z4Y12Z4CB12Z4Y12Z4CR12_422_NV 0x9035 -#define GL_Z4Y12Z4CB12Z4A12Z4Y12Z4CR12Z4A12_4224_NV 0x9036 -#define GL_Z4Y12Z4CB12Z4CR12_444_NV 0x9037 -#define GL_VIDEO_CAPTURE_FRAME_WIDTH_NV 0x9038 -#define GL_VIDEO_CAPTURE_FRAME_HEIGHT_NV 0x9039 -#define GL_VIDEO_CAPTURE_FIELD_UPPER_HEIGHT_NV 0x903A -#define GL_VIDEO_CAPTURE_FIELD_LOWER_HEIGHT_NV 0x903B -#define GL_VIDEO_CAPTURE_SURFACE_ORIGIN_NV 0x903C -#endif - -#ifndef GL_NV_copy_image -#endif - -#ifndef GL_EXT_separate_shader_objects -#define GL_ACTIVE_PROGRAM_EXT 0x8B8D -#endif - -#ifndef GL_NV_parameter_buffer_object2 -#endif - -#ifndef GL_NV_shader_buffer_load -#define GL_BUFFER_GPU_ADDRESS_NV 0x8F1D -#define GL_GPU_ADDRESS_NV 0x8F34 -#define GL_MAX_SHADER_BUFFER_ADDRESS_NV 0x8F35 -#endif - -#ifndef GL_NV_vertex_buffer_unified_memory -#define GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV 0x8F1E -#define GL_ELEMENT_ARRAY_UNIFIED_NV 0x8F1F -#define GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV 0x8F20 -#define GL_VERTEX_ARRAY_ADDRESS_NV 0x8F21 -#define GL_NORMAL_ARRAY_ADDRESS_NV 0x8F22 -#define GL_COLOR_ARRAY_ADDRESS_NV 0x8F23 -#define GL_INDEX_ARRAY_ADDRESS_NV 0x8F24 -#define GL_TEXTURE_COORD_ARRAY_ADDRESS_NV 0x8F25 -#define GL_EDGE_FLAG_ARRAY_ADDRESS_NV 0x8F26 -#define GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV 0x8F27 -#define GL_FOG_COORD_ARRAY_ADDRESS_NV 0x8F28 -#define GL_ELEMENT_ARRAY_ADDRESS_NV 0x8F29 -#define GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV 0x8F2A -#define GL_VERTEX_ARRAY_LENGTH_NV 0x8F2B -#define GL_NORMAL_ARRAY_LENGTH_NV 0x8F2C -#define GL_COLOR_ARRAY_LENGTH_NV 0x8F2D -#define GL_INDEX_ARRAY_LENGTH_NV 0x8F2E -#define GL_TEXTURE_COORD_ARRAY_LENGTH_NV 0x8F2F -#define GL_EDGE_FLAG_ARRAY_LENGTH_NV 0x8F30 -#define GL_SECONDARY_COLOR_ARRAY_LENGTH_NV 0x8F31 -#define GL_FOG_COORD_ARRAY_LENGTH_NV 0x8F32 -#define GL_ELEMENT_ARRAY_LENGTH_NV 0x8F33 -#define GL_DRAW_INDIRECT_UNIFIED_NV 0x8F40 -#define GL_DRAW_INDIRECT_ADDRESS_NV 0x8F41 -#define GL_DRAW_INDIRECT_LENGTH_NV 0x8F42 -#endif - -#ifndef GL_NV_texture_barrier -#endif - -#ifndef GL_AMD_shader_stencil_export -#endif - -#ifndef GL_AMD_seamless_cubemap_per_texture -/* reuse GL_TEXTURE_CUBE_MAP_SEAMLESS_ARB */ -#endif - -#ifndef GL_AMD_conservative_depth -#endif - -#ifndef GL_EXT_shader_image_load_store -#define GL_MAX_IMAGE_UNITS_EXT 0x8F38 -#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS_EXT 0x8F39 -#define GL_IMAGE_BINDING_NAME_EXT 0x8F3A -#define GL_IMAGE_BINDING_LEVEL_EXT 0x8F3B -#define GL_IMAGE_BINDING_LAYERED_EXT 0x8F3C -#define GL_IMAGE_BINDING_LAYER_EXT 0x8F3D -#define GL_IMAGE_BINDING_ACCESS_EXT 0x8F3E -#define GL_IMAGE_1D_EXT 0x904C -#define GL_IMAGE_2D_EXT 0x904D -#define GL_IMAGE_3D_EXT 0x904E -#define GL_IMAGE_2D_RECT_EXT 0x904F -#define GL_IMAGE_CUBE_EXT 0x9050 -#define GL_IMAGE_BUFFER_EXT 0x9051 -#define GL_IMAGE_1D_ARRAY_EXT 0x9052 -#define GL_IMAGE_2D_ARRAY_EXT 0x9053 -#define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054 -#define GL_IMAGE_2D_MULTISAMPLE_EXT 0x9055 -#define GL_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9056 -#define GL_INT_IMAGE_1D_EXT 0x9057 -#define GL_INT_IMAGE_2D_EXT 0x9058 -#define GL_INT_IMAGE_3D_EXT 0x9059 -#define GL_INT_IMAGE_2D_RECT_EXT 0x905A -#define GL_INT_IMAGE_CUBE_EXT 0x905B -#define GL_INT_IMAGE_BUFFER_EXT 0x905C -#define GL_INT_IMAGE_1D_ARRAY_EXT 0x905D -#define GL_INT_IMAGE_2D_ARRAY_EXT 0x905E -#define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F -#define GL_INT_IMAGE_2D_MULTISAMPLE_EXT 0x9060 -#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9061 -#define GL_UNSIGNED_INT_IMAGE_1D_EXT 0x9062 -#define GL_UNSIGNED_INT_IMAGE_2D_EXT 0x9063 -#define GL_UNSIGNED_INT_IMAGE_3D_EXT 0x9064 -#define GL_UNSIGNED_INT_IMAGE_2D_RECT_EXT 0x9065 -#define GL_UNSIGNED_INT_IMAGE_CUBE_EXT 0x9066 -#define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT 0x9067 -#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY_EXT 0x9068 -#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY_EXT 0x9069 -#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A -#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_EXT 0x906B -#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x906C -#define GL_MAX_IMAGE_SAMPLES_EXT 0x906D -#define GL_IMAGE_BINDING_FORMAT_EXT 0x906E -#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT 0x00000001 -#define GL_ELEMENT_ARRAY_BARRIER_BIT_EXT 0x00000002 -#define GL_UNIFORM_BARRIER_BIT_EXT 0x00000004 -#define GL_TEXTURE_FETCH_BARRIER_BIT_EXT 0x00000008 -#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT 0x00000020 -#define GL_COMMAND_BARRIER_BIT_EXT 0x00000040 -#define GL_PIXEL_BUFFER_BARRIER_BIT_EXT 0x00000080 -#define GL_TEXTURE_UPDATE_BARRIER_BIT_EXT 0x00000100 -#define GL_BUFFER_UPDATE_BARRIER_BIT_EXT 0x00000200 -#define GL_FRAMEBUFFER_BARRIER_BIT_EXT 0x00000400 -#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT 0x00000800 -#define GL_ATOMIC_COUNTER_BARRIER_BIT_EXT 0x00001000 -#define GL_ALL_BARRIER_BITS_EXT 0xFFFFFFFF -#endif - -#ifndef GL_EXT_vertex_attrib_64bit -/* reuse GL_DOUBLE */ -#define GL_DOUBLE_VEC2_EXT 0x8FFC -#define GL_DOUBLE_VEC3_EXT 0x8FFD -#define GL_DOUBLE_VEC4_EXT 0x8FFE -#define GL_DOUBLE_MAT2_EXT 0x8F46 -#define GL_DOUBLE_MAT3_EXT 0x8F47 -#define GL_DOUBLE_MAT4_EXT 0x8F48 -#define GL_DOUBLE_MAT2x3_EXT 0x8F49 -#define GL_DOUBLE_MAT2x4_EXT 0x8F4A -#define GL_DOUBLE_MAT3x2_EXT 0x8F4B -#define GL_DOUBLE_MAT3x4_EXT 0x8F4C -#define GL_DOUBLE_MAT4x2_EXT 0x8F4D -#define GL_DOUBLE_MAT4x3_EXT 0x8F4E -#endif - -#ifndef GL_NV_gpu_program5 -#define GL_MAX_GEOMETRY_PROGRAM_INVOCATIONS_NV 0x8E5A -#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5B -#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5C -#define GL_FRAGMENT_PROGRAM_INTERPOLATION_OFFSET_BITS_NV 0x8E5D -#define GL_MAX_PROGRAM_SUBROUTINE_PARAMETERS_NV 0x8F44 -#define GL_MAX_PROGRAM_SUBROUTINE_NUM_NV 0x8F45 -#endif - -#ifndef GL_NV_gpu_shader5 -#define GL_INT64_NV 0x140E -#define GL_UNSIGNED_INT64_NV 0x140F -#define GL_INT8_NV 0x8FE0 -#define GL_INT8_VEC2_NV 0x8FE1 -#define GL_INT8_VEC3_NV 0x8FE2 -#define GL_INT8_VEC4_NV 0x8FE3 -#define GL_INT16_NV 0x8FE4 -#define GL_INT16_VEC2_NV 0x8FE5 -#define GL_INT16_VEC3_NV 0x8FE6 -#define GL_INT16_VEC4_NV 0x8FE7 -#define GL_INT64_VEC2_NV 0x8FE9 -#define GL_INT64_VEC3_NV 0x8FEA -#define GL_INT64_VEC4_NV 0x8FEB -#define GL_UNSIGNED_INT8_NV 0x8FEC -#define GL_UNSIGNED_INT8_VEC2_NV 0x8FED -#define GL_UNSIGNED_INT8_VEC3_NV 0x8FEE -#define GL_UNSIGNED_INT8_VEC4_NV 0x8FEF -#define GL_UNSIGNED_INT16_NV 0x8FF0 -#define GL_UNSIGNED_INT16_VEC2_NV 0x8FF1 -#define GL_UNSIGNED_INT16_VEC3_NV 0x8FF2 -#define GL_UNSIGNED_INT16_VEC4_NV 0x8FF3 -#define GL_UNSIGNED_INT64_VEC2_NV 0x8FF5 -#define GL_UNSIGNED_INT64_VEC3_NV 0x8FF6 -#define GL_UNSIGNED_INT64_VEC4_NV 0x8FF7 -#define GL_FLOAT16_NV 0x8FF8 -#define GL_FLOAT16_VEC2_NV 0x8FF9 -#define GL_FLOAT16_VEC3_NV 0x8FFA -#define GL_FLOAT16_VEC4_NV 0x8FFB -/* reuse GL_PATCHES */ -#endif - -#ifndef GL_NV_shader_buffer_store -#define GL_SHADER_GLOBAL_ACCESS_BARRIER_BIT_NV 0x00000010 -/* reuse GL_READ_WRITE */ -/* reuse GL_WRITE_ONLY */ -#endif - -#ifndef GL_NV_tessellation_program5 -#define GL_MAX_PROGRAM_PATCH_ATTRIBS_NV 0x86D8 -#define GL_TESS_CONTROL_PROGRAM_NV 0x891E -#define GL_TESS_EVALUATION_PROGRAM_NV 0x891F -#define GL_TESS_CONTROL_PROGRAM_PARAMETER_BUFFER_NV 0x8C74 -#define GL_TESS_EVALUATION_PROGRAM_PARAMETER_BUFFER_NV 0x8C75 -#endif - -#ifndef GL_NV_vertex_attrib_integer_64bit -/* reuse GL_INT64_NV */ -/* reuse GL_UNSIGNED_INT64_NV */ -#endif - -#ifndef GL_NV_multisample_coverage -#define GL_COVERAGE_SAMPLES_NV 0x80A9 -#define GL_COLOR_SAMPLES_NV 0x8E20 -#endif - -#ifndef GL_AMD_name_gen_delete -#define GL_DATA_BUFFER_AMD 0x9151 -#define GL_PERFORMANCE_MONITOR_AMD 0x9152 -#define GL_QUERY_OBJECT_AMD 0x9153 -#define GL_VERTEX_ARRAY_OBJECT_AMD 0x9154 -#define GL_SAMPLER_OBJECT_AMD 0x9155 -#endif - -#ifndef GL_AMD_debug_output -#define GL_MAX_DEBUG_LOGGED_MESSAGES_AMD 0x9144 -#define GL_DEBUG_LOGGED_MESSAGES_AMD 0x9145 -#define GL_DEBUG_SEVERITY_HIGH_AMD 0x9146 -#define GL_DEBUG_SEVERITY_MEDIUM_AMD 0x9147 -#define GL_DEBUG_SEVERITY_LOW_AMD 0x9148 -#define GL_DEBUG_CATEGORY_API_ERROR_AMD 0x9149 -#define GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD 0x914A -#define GL_DEBUG_CATEGORY_DEPRECATION_AMD 0x914B -#define GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD 0x914C -#define GL_DEBUG_CATEGORY_PERFORMANCE_AMD 0x914D -#define GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD 0x914E -#define GL_DEBUG_CATEGORY_APPLICATION_AMD 0x914F -#define GL_DEBUG_CATEGORY_OTHER_AMD 0x9150 -#endif - -#ifndef GL_NV_vdpau_interop -#define GL_SURFACE_STATE_NV 0x86EB -#define GL_SURFACE_REGISTERED_NV 0x86FD -#define GL_SURFACE_MAPPED_NV 0x8700 -#define GL_WRITE_DISCARD_NV 0x88BE -#endif - -#ifndef GL_AMD_transform_feedback3_lines_triangles -#endif - - -/*************************************************************/ - -#include -#ifndef GL_VERSION_2_0 -/* GL type for program/shader text */ -typedef char GLchar; -#endif - -#ifndef GL_VERSION_1_5 -/* GL types for handling large vertex buffer objects */ -typedef ptrdiff_t GLintptr; -typedef ptrdiff_t GLsizeiptr; -#endif - -#ifndef GL_ARB_vertex_buffer_object -/* GL types for handling large vertex buffer objects */ -typedef ptrdiff_t GLintptrARB; -typedef ptrdiff_t GLsizeiptrARB; -#endif - -#ifndef GL_ARB_shader_objects -/* GL types for program/shader text and shader object handles */ -typedef char GLcharARB; -typedef unsigned int GLhandleARB; -#endif - -/* GL type for "half" precision (s10e5) float data in host memory */ -#ifndef GL_ARB_half_float_pixel -typedef unsigned short GLhalfARB; -#endif - -#ifndef GL_NV_half_float -typedef unsigned short GLhalfNV; -#endif - -#ifndef GLEXT_64_TYPES_DEFINED -/* This code block is duplicated in glxext.h, so must be protected */ -#define GLEXT_64_TYPES_DEFINED -/* Define int32_t, int64_t, and uint64_t types for UST/MSC */ -/* (as used in the GL_EXT_timer_query extension). */ -#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L -#include -#elif defined(__sun__) || defined(__digital__) -#include -#if defined(__STDC__) -#if defined(__arch64__) || defined(_LP64) -typedef long int int64_t; -typedef unsigned long int uint64_t; -#else -typedef long long int int64_t; -typedef unsigned long long int uint64_t; -#endif /* __arch64__ */ -#endif /* __STDC__ */ -#elif defined( __VMS ) || defined(__sgi) -#include -#elif defined(__SCO__) || defined(__USLC__) -#include -#elif defined(__UNIXOS2__) || defined(__SOL64__) -typedef long int int32_t; -typedef long long int int64_t; -typedef unsigned long long int uint64_t; -#elif defined(_WIN32) && defined(__GNUC__) -#include -#elif defined(_WIN32) -typedef __int32 int32_t; -typedef __int64 int64_t; -typedef unsigned __int64 uint64_t; -#else -/* Fallback if nothing above works */ -#include -#endif -#endif - -#ifndef GL_EXT_timer_query -typedef int64_t GLint64EXT; -typedef uint64_t GLuint64EXT; -#endif - -#ifndef GL_ARB_sync -typedef int64_t GLint64; -typedef uint64_t GLuint64; -typedef struct __GLsync *GLsync; -#endif - -#ifndef GL_ARB_cl_event -/* These incomplete types let us declare types compatible with OpenCL's cl_context and cl_event */ -struct _cl_context; -struct _cl_event; -#endif - -#ifndef GL_ARB_debug_output -typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,GLvoid *userParam); -#endif - -#ifndef GL_AMD_debug_output -typedef void (APIENTRY *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,GLvoid *userParam); -#endif - -#ifndef GL_NV_vdpau_interop -typedef GLintptr GLvdpauSurfaceNV; -#endif - -#ifndef GL_VERSION_1_2 -#define GL_VERSION_1_2 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -GLAPI void APIENTRY glBlendEquation (GLenum mode); -GLAPI void APIENTRY glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); -GLAPI void APIENTRY glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glCopyTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode); -typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); -typedef void (APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -#endif - -#ifndef GL_VERSION_1_2_DEPRECATED -#define GL_VERSION_1_2_DEPRECATED 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorTable (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -GLAPI void APIENTRY glColorTableParameterfv (GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glColorTableParameteriv (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glCopyColorTable (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glGetColorTable (GLenum target, GLenum format, GLenum type, GLvoid *table); -GLAPI void APIENTRY glGetColorTableParameterfv (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetColorTableParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glColorSubTable (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); -GLAPI void APIENTRY glCopyColorSubTable (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glConvolutionFilter1D (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); -GLAPI void APIENTRY glConvolutionFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); -GLAPI void APIENTRY glConvolutionParameterf (GLenum target, GLenum pname, GLfloat params); -GLAPI void APIENTRY glConvolutionParameterfv (GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glConvolutionParameteri (GLenum target, GLenum pname, GLint params); -GLAPI void APIENTRY glConvolutionParameteriv (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glCopyConvolutionFilter1D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glCopyConvolutionFilter2D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glGetConvolutionFilter (GLenum target, GLenum format, GLenum type, GLvoid *image); -GLAPI void APIENTRY glGetConvolutionParameterfv (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetConvolutionParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetSeparableFilter (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); -GLAPI void APIENTRY glSeparableFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); -GLAPI void APIENTRY glGetHistogram (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -GLAPI void APIENTRY glGetHistogramParameterfv (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetHistogramParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetMinmax (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -GLAPI void APIENTRY glGetMinmaxParameterfv (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetMinmaxParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glHistogram (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -GLAPI void APIENTRY glMinmax (GLenum target, GLenum internalformat, GLboolean sink); -GLAPI void APIENTRY glResetHistogram (GLenum target); -GLAPI void APIENTRY glResetMinmax (GLenum target); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); -typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); -typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); -typedef void (APIENTRYP PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -typedef void (APIENTRYP PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); -typedef void (APIENTRYP PFNGLRESETHISTOGRAMPROC) (GLenum target); -typedef void (APIENTRYP PFNGLRESETMINMAXPROC) (GLenum target); -#endif - -#ifndef GL_VERSION_1_3 -#define GL_VERSION_1_3 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glActiveTexture (GLenum texture); -GLAPI void APIENTRY glSampleCoverage (GLclampf value, GLboolean invert); -GLAPI void APIENTRY glCompressedTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glCompressedTexImage1D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glCompressedTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glCompressedTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glGetCompressedTexImage (GLenum target, GLint level, GLvoid *img); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); -typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, GLvoid *img); -#endif - -#ifndef GL_VERSION_1_3_DEPRECATED -#define GL_VERSION_1_3_DEPRECATED 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glClientActiveTexture (GLenum texture); -GLAPI void APIENTRY glMultiTexCoord1d (GLenum target, GLdouble s); -GLAPI void APIENTRY glMultiTexCoord1dv (GLenum target, const GLdouble *v); -GLAPI void APIENTRY glMultiTexCoord1f (GLenum target, GLfloat s); -GLAPI void APIENTRY glMultiTexCoord1fv (GLenum target, const GLfloat *v); -GLAPI void APIENTRY glMultiTexCoord1i (GLenum target, GLint s); -GLAPI void APIENTRY glMultiTexCoord1iv (GLenum target, const GLint *v); -GLAPI void APIENTRY glMultiTexCoord1s (GLenum target, GLshort s); -GLAPI void APIENTRY glMultiTexCoord1sv (GLenum target, const GLshort *v); -GLAPI void APIENTRY glMultiTexCoord2d (GLenum target, GLdouble s, GLdouble t); -GLAPI void APIENTRY glMultiTexCoord2dv (GLenum target, const GLdouble *v); -GLAPI void APIENTRY glMultiTexCoord2f (GLenum target, GLfloat s, GLfloat t); -GLAPI void APIENTRY glMultiTexCoord2fv (GLenum target, const GLfloat *v); -GLAPI void APIENTRY glMultiTexCoord2i (GLenum target, GLint s, GLint t); -GLAPI void APIENTRY glMultiTexCoord2iv (GLenum target, const GLint *v); -GLAPI void APIENTRY glMultiTexCoord2s (GLenum target, GLshort s, GLshort t); -GLAPI void APIENTRY glMultiTexCoord2sv (GLenum target, const GLshort *v); -GLAPI void APIENTRY glMultiTexCoord3d (GLenum target, GLdouble s, GLdouble t, GLdouble r); -GLAPI void APIENTRY glMultiTexCoord3dv (GLenum target, const GLdouble *v); -GLAPI void APIENTRY glMultiTexCoord3f (GLenum target, GLfloat s, GLfloat t, GLfloat r); -GLAPI void APIENTRY glMultiTexCoord3fv (GLenum target, const GLfloat *v); -GLAPI void APIENTRY glMultiTexCoord3i (GLenum target, GLint s, GLint t, GLint r); -GLAPI void APIENTRY glMultiTexCoord3iv (GLenum target, const GLint *v); -GLAPI void APIENTRY glMultiTexCoord3s (GLenum target, GLshort s, GLshort t, GLshort r); -GLAPI void APIENTRY glMultiTexCoord3sv (GLenum target, const GLshort *v); -GLAPI void APIENTRY glMultiTexCoord4d (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -GLAPI void APIENTRY glMultiTexCoord4dv (GLenum target, const GLdouble *v); -GLAPI void APIENTRY glMultiTexCoord4f (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -GLAPI void APIENTRY glMultiTexCoord4fv (GLenum target, const GLfloat *v); -GLAPI void APIENTRY glMultiTexCoord4i (GLenum target, GLint s, GLint t, GLint r, GLint q); -GLAPI void APIENTRY glMultiTexCoord4iv (GLenum target, const GLint *v); -GLAPI void APIENTRY glMultiTexCoord4s (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -GLAPI void APIENTRY glMultiTexCoord4sv (GLenum target, const GLshort *v); -GLAPI void APIENTRY glLoadTransposeMatrixf (const GLfloat *m); -GLAPI void APIENTRY glLoadTransposeMatrixd (const GLdouble *m); -GLAPI void APIENTRY glMultTransposeMatrixf (const GLfloat *m); -GLAPI void APIENTRY glMultTransposeMatrixd (const GLdouble *m); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat *m); -typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble *m); -typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat *m); -typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble *m); -#endif - -#ifndef GL_VERSION_1_4 -#define GL_VERSION_1_4 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -GLAPI void APIENTRY glMultiDrawArrays (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); -GLAPI void APIENTRY glMultiDrawElements (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); -GLAPI void APIENTRY glPointParameterf (GLenum pname, GLfloat param); -GLAPI void APIENTRY glPointParameterfv (GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glPointParameteri (GLenum pname, GLint param); -GLAPI void APIENTRY glPointParameteriv (GLenum pname, const GLint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); -typedef void (APIENTRYP PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); -#endif - -#ifndef GL_VERSION_1_4_DEPRECATED -#define GL_VERSION_1_4_DEPRECATED 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFogCoordf (GLfloat coord); -GLAPI void APIENTRY glFogCoordfv (const GLfloat *coord); -GLAPI void APIENTRY glFogCoordd (GLdouble coord); -GLAPI void APIENTRY glFogCoorddv (const GLdouble *coord); -GLAPI void APIENTRY glFogCoordPointer (GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void APIENTRY glSecondaryColor3b (GLbyte red, GLbyte green, GLbyte blue); -GLAPI void APIENTRY glSecondaryColor3bv (const GLbyte *v); -GLAPI void APIENTRY glSecondaryColor3d (GLdouble red, GLdouble green, GLdouble blue); -GLAPI void APIENTRY glSecondaryColor3dv (const GLdouble *v); -GLAPI void APIENTRY glSecondaryColor3f (GLfloat red, GLfloat green, GLfloat blue); -GLAPI void APIENTRY glSecondaryColor3fv (const GLfloat *v); -GLAPI void APIENTRY glSecondaryColor3i (GLint red, GLint green, GLint blue); -GLAPI void APIENTRY glSecondaryColor3iv (const GLint *v); -GLAPI void APIENTRY glSecondaryColor3s (GLshort red, GLshort green, GLshort blue); -GLAPI void APIENTRY glSecondaryColor3sv (const GLshort *v); -GLAPI void APIENTRY glSecondaryColor3ub (GLubyte red, GLubyte green, GLubyte blue); -GLAPI void APIENTRY glSecondaryColor3ubv (const GLubyte *v); -GLAPI void APIENTRY glSecondaryColor3ui (GLuint red, GLuint green, GLuint blue); -GLAPI void APIENTRY glSecondaryColor3uiv (const GLuint *v); -GLAPI void APIENTRY glSecondaryColor3us (GLushort red, GLushort green, GLushort blue); -GLAPI void APIENTRY glSecondaryColor3usv (const GLushort *v); -GLAPI void APIENTRY glSecondaryColorPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void APIENTRY glWindowPos2d (GLdouble x, GLdouble y); -GLAPI void APIENTRY glWindowPos2dv (const GLdouble *v); -GLAPI void APIENTRY glWindowPos2f (GLfloat x, GLfloat y); -GLAPI void APIENTRY glWindowPos2fv (const GLfloat *v); -GLAPI void APIENTRY glWindowPos2i (GLint x, GLint y); -GLAPI void APIENTRY glWindowPos2iv (const GLint *v); -GLAPI void APIENTRY glWindowPos2s (GLshort x, GLshort y); -GLAPI void APIENTRY glWindowPos2sv (const GLshort *v); -GLAPI void APIENTRY glWindowPos3d (GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glWindowPos3dv (const GLdouble *v); -GLAPI void APIENTRY glWindowPos3f (GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glWindowPos3fv (const GLfloat *v); -GLAPI void APIENTRY glWindowPos3i (GLint x, GLint y, GLint z); -GLAPI void APIENTRY glWindowPos3iv (const GLint *v); -GLAPI void APIENTRY glWindowPos3s (GLshort x, GLshort y, GLshort z); -GLAPI void APIENTRY glWindowPos3sv (const GLshort *v); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFOGCOORDFPROC) (GLfloat coord); -typedef void (APIENTRYP PFNGLFOGCOORDFVPROC) (const GLfloat *coord); -typedef void (APIENTRYP PFNGLFOGCOORDDPROC) (GLdouble coord); -typedef void (APIENTRYP PFNGLFOGCOORDDVPROC) (const GLdouble *coord); -typedef void (APIENTRYP PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLWINDOWPOS2DVPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLWINDOWPOS2FVPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2IPROC) (GLint x, GLint y); -typedef void (APIENTRYP PFNGLWINDOWPOS2IVPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLWINDOWPOS2SVPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLWINDOWPOS3DVPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLWINDOWPOS3FVPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); -typedef void (APIENTRYP PFNGLWINDOWPOS3IVPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLWINDOWPOS3SVPROC) (const GLshort *v); -#endif - -#ifndef GL_VERSION_1_5 -#define GL_VERSION_1_5 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenQueries (GLsizei n, GLuint *ids); -GLAPI void APIENTRY glDeleteQueries (GLsizei n, const GLuint *ids); -GLAPI GLboolean APIENTRY glIsQuery (GLuint id); -GLAPI void APIENTRY glBeginQuery (GLenum target, GLuint id); -GLAPI void APIENTRY glEndQuery (GLenum target); -GLAPI void APIENTRY glGetQueryiv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetQueryObjectiv (GLuint id, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint *params); -GLAPI void APIENTRY glBindBuffer (GLenum target, GLuint buffer); -GLAPI void APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers); -GLAPI void APIENTRY glGenBuffers (GLsizei n, GLuint *buffers); -GLAPI GLboolean APIENTRY glIsBuffer (GLuint buffer); -GLAPI void APIENTRY glBufferData (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage); -GLAPI void APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data); -GLAPI void APIENTRY glGetBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data); -GLAPI GLvoid* APIENTRY glMapBuffer (GLenum target, GLenum access); -GLAPI GLboolean APIENTRY glUnmapBuffer (GLenum target); -GLAPI void APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetBufferPointerv (GLenum target, GLenum pname, GLvoid* *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids); -typedef void (APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids); -typedef GLboolean (APIENTRYP PFNGLISQUERYPROC) (GLuint id); -typedef void (APIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); -typedef void (APIENTRYP PFNGLENDQUERYPROC) (GLenum target); -typedef void (APIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); -typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); -typedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); -typedef GLboolean (APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage); -typedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data); -typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data); -typedef GLvoid* (APIENTRYP PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); -typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target); -typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, GLvoid* *params); -#endif - -#ifndef GL_VERSION_2_0 -#define GL_VERSION_2_0 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha); -GLAPI void APIENTRY glDrawBuffers (GLsizei n, const GLenum *bufs); -GLAPI void APIENTRY glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -GLAPI void APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask); -GLAPI void APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask); -GLAPI void APIENTRY glAttachShader (GLuint program, GLuint shader); -GLAPI void APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name); -GLAPI void APIENTRY glCompileShader (GLuint shader); -GLAPI GLuint APIENTRY glCreateProgram (void); -GLAPI GLuint APIENTRY glCreateShader (GLenum type); -GLAPI void APIENTRY glDeleteProgram (GLuint program); -GLAPI void APIENTRY glDeleteShader (GLuint shader); -GLAPI void APIENTRY glDetachShader (GLuint program, GLuint shader); -GLAPI void APIENTRY glDisableVertexAttribArray (GLuint index); -GLAPI void APIENTRY glEnableVertexAttribArray (GLuint index); -GLAPI void APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -GLAPI void APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -GLAPI void APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj); -GLAPI GLint APIENTRY glGetAttribLocation (GLuint program, const GLchar *name); -GLAPI void APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -GLAPI void APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -GLAPI void APIENTRY glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); -GLAPI GLint APIENTRY glGetUniformLocation (GLuint program, const GLchar *name); -GLAPI void APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat *params); -GLAPI void APIENTRY glGetUniformiv (GLuint program, GLint location, GLint *params); -GLAPI void APIENTRY glGetVertexAttribdv (GLuint index, GLenum pname, GLdouble *params); -GLAPI void APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, GLvoid* *pointer); -GLAPI GLboolean APIENTRY glIsProgram (GLuint program); -GLAPI GLboolean APIENTRY glIsShader (GLuint shader); -GLAPI void APIENTRY glLinkProgram (GLuint program); -GLAPI void APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar* *string, const GLint *length); -GLAPI void APIENTRY glUseProgram (GLuint program); -GLAPI void APIENTRY glUniform1f (GLint location, GLfloat v0); -GLAPI void APIENTRY glUniform2f (GLint location, GLfloat v0, GLfloat v1); -GLAPI void APIENTRY glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -GLAPI void APIENTRY glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -GLAPI void APIENTRY glUniform1i (GLint location, GLint v0); -GLAPI void APIENTRY glUniform2i (GLint location, GLint v0, GLint v1); -GLAPI void APIENTRY glUniform3i (GLint location, GLint v0, GLint v1, GLint v2); -GLAPI void APIENTRY glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -GLAPI void APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glValidateProgram (GLuint program); -GLAPI void APIENTRY glVertexAttrib1d (GLuint index, GLdouble x); -GLAPI void APIENTRY glVertexAttrib1dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib1f (GLuint index, GLfloat x); -GLAPI void APIENTRY glVertexAttrib1fv (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib1s (GLuint index, GLshort x); -GLAPI void APIENTRY glVertexAttrib1sv (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib2d (GLuint index, GLdouble x, GLdouble y); -GLAPI void APIENTRY glVertexAttrib2dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y); -GLAPI void APIENTRY glVertexAttrib2fv (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib2s (GLuint index, GLshort x, GLshort y); -GLAPI void APIENTRY glVertexAttrib2sv (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib3d (GLuint index, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glVertexAttrib3dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glVertexAttrib3fv (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib3s (GLuint index, GLshort x, GLshort y, GLshort z); -GLAPI void APIENTRY glVertexAttrib3sv (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4Nbv (GLuint index, const GLbyte *v); -GLAPI void APIENTRY glVertexAttrib4Niv (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttrib4Nsv (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4Nub (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -GLAPI void APIENTRY glVertexAttrib4Nubv (GLuint index, const GLubyte *v); -GLAPI void APIENTRY glVertexAttrib4Nuiv (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttrib4Nusv (GLuint index, const GLushort *v); -GLAPI void APIENTRY glVertexAttrib4bv (GLuint index, const GLbyte *v); -GLAPI void APIENTRY glVertexAttrib4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glVertexAttrib4dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glVertexAttrib4fv (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib4iv (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttrib4s (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -GLAPI void APIENTRY glVertexAttrib4sv (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4ubv (GLuint index, const GLubyte *v); -GLAPI void APIENTRY glVertexAttrib4uiv (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttrib4usv (GLuint index, const GLushort *v); -GLAPI void APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); -typedef void (APIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs); -typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum face, GLenum func, GLint ref, GLuint mask); -typedef void (APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); -typedef void (APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); -typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name); -typedef void (APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader); -typedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC) (void); -typedef GLuint (APIENTRYP PFNGLCREATESHADERPROC) (GLenum type); -typedef void (APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program); -typedef void (APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader); -typedef void (APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); -typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); -typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); -typedef void (APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -typedef void (APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj); -typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name); -typedef void (APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -typedef void (APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -typedef void (APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); -typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); -typedef void (APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params); -typedef void (APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, GLvoid* *pointer); -typedef GLboolean (APIENTRYP PFNGLISPROGRAMPROC) (GLuint program); -typedef GLboolean (APIENTRYP PFNGLISSHADERPROC) (GLuint shader); -typedef void (APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program); -typedef void (APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar* *string, const GLint *length); -typedef void (APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program); -typedef void (APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); -typedef void (APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); -typedef void (APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0); -typedef void (APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); -typedef void (APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); -typedef void (APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_VERSION_2_1 -#define GL_VERSION_2_1 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glUniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -#endif - -#ifndef GL_VERSION_3_0 -#define GL_VERSION_3_0 1 -/* OpenGL 3.0 also reuses entry points from these extensions: */ -/* ARB_framebuffer_object */ -/* ARB_map_buffer_range */ -/* ARB_vertex_array_object */ -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorMaski (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -GLAPI void APIENTRY glGetBooleani_v (GLenum target, GLuint index, GLboolean *data); -GLAPI void APIENTRY glGetIntegeri_v (GLenum target, GLuint index, GLint *data); -GLAPI void APIENTRY glEnablei (GLenum target, GLuint index); -GLAPI void APIENTRY glDisablei (GLenum target, GLuint index); -GLAPI GLboolean APIENTRY glIsEnabledi (GLenum target, GLuint index); -GLAPI void APIENTRY glBeginTransformFeedback (GLenum primitiveMode); -GLAPI void APIENTRY glEndTransformFeedback (void); -GLAPI void APIENTRY glBindBufferRange (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -GLAPI void APIENTRY glBindBufferBase (GLenum target, GLuint index, GLuint buffer); -GLAPI void APIENTRY glTransformFeedbackVaryings (GLuint program, GLsizei count, const GLchar* *varyings, GLenum bufferMode); -GLAPI void APIENTRY glGetTransformFeedbackVarying (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -GLAPI void APIENTRY glClampColor (GLenum target, GLenum clamp); -GLAPI void APIENTRY glBeginConditionalRender (GLuint id, GLenum mode); -GLAPI void APIENTRY glEndConditionalRender (void); -GLAPI void APIENTRY glVertexAttribIPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void APIENTRY glGetVertexAttribIiv (GLuint index, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVertexAttribIuiv (GLuint index, GLenum pname, GLuint *params); -GLAPI void APIENTRY glVertexAttribI1i (GLuint index, GLint x); -GLAPI void APIENTRY glVertexAttribI2i (GLuint index, GLint x, GLint y); -GLAPI void APIENTRY glVertexAttribI3i (GLuint index, GLint x, GLint y, GLint z); -GLAPI void APIENTRY glVertexAttribI4i (GLuint index, GLint x, GLint y, GLint z, GLint w); -GLAPI void APIENTRY glVertexAttribI1ui (GLuint index, GLuint x); -GLAPI void APIENTRY glVertexAttribI2ui (GLuint index, GLuint x, GLuint y); -GLAPI void APIENTRY glVertexAttribI3ui (GLuint index, GLuint x, GLuint y, GLuint z); -GLAPI void APIENTRY glVertexAttribI4ui (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -GLAPI void APIENTRY glVertexAttribI1iv (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI2iv (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI3iv (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI4iv (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI1uiv (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI2uiv (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI3uiv (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI4uiv (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI4bv (GLuint index, const GLbyte *v); -GLAPI void APIENTRY glVertexAttribI4sv (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttribI4ubv (GLuint index, const GLubyte *v); -GLAPI void APIENTRY glVertexAttribI4usv (GLuint index, const GLushort *v); -GLAPI void APIENTRY glGetUniformuiv (GLuint program, GLint location, GLuint *params); -GLAPI void APIENTRY glBindFragDataLocation (GLuint program, GLuint color, const GLchar *name); -GLAPI GLint APIENTRY glGetFragDataLocation (GLuint program, const GLchar *name); -GLAPI void APIENTRY glUniform1ui (GLint location, GLuint v0); -GLAPI void APIENTRY glUniform2ui (GLint location, GLuint v0, GLuint v1); -GLAPI void APIENTRY glUniform3ui (GLint location, GLuint v0, GLuint v1, GLuint v2); -GLAPI void APIENTRY glUniform4ui (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -GLAPI void APIENTRY glUniform1uiv (GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glUniform2uiv (GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glUniform3uiv (GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glUniform4uiv (GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glTexParameterIiv (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glTexParameterIuiv (GLenum target, GLenum pname, const GLuint *params); -GLAPI void APIENTRY glGetTexParameterIiv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetTexParameterIuiv (GLenum target, GLenum pname, GLuint *params); -GLAPI void APIENTRY glClearBufferiv (GLenum buffer, GLint drawbuffer, const GLint *value); -GLAPI void APIENTRY glClearBufferuiv (GLenum buffer, GLint drawbuffer, const GLuint *value); -GLAPI void APIENTRY glClearBufferfv (GLenum buffer, GLint drawbuffer, const GLfloat *value); -GLAPI void APIENTRY glClearBufferfi (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); -GLAPI const GLubyte * APIENTRY glGetStringi (GLenum name, GLuint index); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOLORMASKIPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -typedef void (APIENTRYP PFNGLGETBOOLEANI_VPROC) (GLenum target, GLuint index, GLboolean *data); -typedef void (APIENTRYP PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint *data); -typedef void (APIENTRYP PFNGLENABLEIPROC) (GLenum target, GLuint index); -typedef void (APIENTRYP PFNGLDISABLEIPROC) (GLenum target, GLuint index); -typedef GLboolean (APIENTRYP PFNGLISENABLEDIPROC) (GLenum target, GLuint index); -typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode); -typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC) (void); -typedef void (APIENTRYP PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (APIENTRYP PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer); -typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar* *varyings, GLenum bufferMode); -typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -typedef void (APIENTRYP PFNGLCLAMPCOLORPROC) (GLenum target, GLenum clamp); -typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERPROC) (GLuint id, GLenum mode); -typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERPROC) (void); -typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IPROC) (GLuint index, GLint x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IPROC) (GLuint index, GLint x, GLint y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IPROC) (GLuint index, GLint x, GLint y, GLint z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIPROC) (GLuint index, GLuint x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIPROC) (GLuint index, GLuint x, GLuint y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint *params); -typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint color, const GLchar *name); -typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar *name); -typedef void (APIENTRYP PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0); -typedef void (APIENTRYP PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1); -typedef void (APIENTRYP PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (APIENTRYP PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (APIENTRYP PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint *params); -typedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawbuffer, const GLint *value); -typedef void (APIENTRYP PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawbuffer, const GLuint *value); -typedef void (APIENTRYP PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat *value); -typedef void (APIENTRYP PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); -typedef const GLubyte * (APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLuint index); -#endif - -#ifndef GL_VERSION_3_1 -#define GL_VERSION_3_1 1 -/* OpenGL 3.1 also reuses entry points from these extensions: */ -/* ARB_copy_buffer */ -/* ARB_uniform_buffer_object */ -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawArraysInstanced (GLenum mode, GLint first, GLsizei count, GLsizei primcount); -GLAPI void APIENTRY glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); -GLAPI void APIENTRY glTexBuffer (GLenum target, GLenum internalformat, GLuint buffer); -GLAPI void APIENTRY glPrimitiveRestartIndex (GLuint index); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); -typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); -typedef void (APIENTRYP PFNGLTEXBUFFERPROC) (GLenum target, GLenum internalformat, GLuint buffer); -typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXPROC) (GLuint index); -#endif - -#ifndef GL_VERSION_3_2 -#define GL_VERSION_3_2 1 -/* OpenGL 3.2 also reuses entry points from these extensions: */ -/* ARB_draw_elements_base_vertex */ -/* ARB_provoking_vertex */ -/* ARB_sync */ -/* ARB_texture_multisample */ -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetInteger64i_v (GLenum target, GLuint index, GLint64 *data); -GLAPI void APIENTRY glGetBufferParameteri64v (GLenum target, GLenum pname, GLint64 *params); -GLAPI void APIENTRY glFramebufferTexture (GLenum target, GLenum attachment, GLuint texture, GLint level); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETINTEGER64I_VPROC) (GLenum target, GLuint index, GLint64 *data); -typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum pname, GLint64 *params); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); -#endif - -#ifndef GL_VERSION_3_3 -#define GL_VERSION_3_3 1 -/* OpenGL 3.3 also reuses entry points from these extensions: */ -/* ARB_blend_func_extended */ -/* ARB_sampler_objects */ -/* ARB_explicit_attrib_location, but it has none */ -/* ARB_occlusion_query2 (no entry points) */ -/* ARB_shader_bit_encoding (no entry points) */ -/* ARB_texture_rgb10_a2ui (no entry points) */ -/* ARB_texture_swizzle (no entry points) */ -/* ARB_timer_query */ -/* ARB_vertex_type_2_10_10_10_rev */ -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttribDivisor (GLuint index, GLuint divisor); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor); -#endif - -#ifndef GL_VERSION_4_0 -#define GL_VERSION_4_0 1 -/* OpenGL 4.0 also reuses entry points from these extensions: */ -/* ARB_texture_query_lod (no entry points) */ -/* ARB_draw_indirect */ -/* ARB_gpu_shader5 (no entry points) */ -/* ARB_gpu_shader_fp64 */ -/* ARB_shader_subroutine */ -/* ARB_tessellation_shader */ -/* ARB_texture_buffer_object_rgb32 (no entry points) */ -/* ARB_texture_cube_map_array (no entry points) */ -/* ARB_texture_gather (no entry points) */ -/* ARB_transform_feedback2 */ -/* ARB_transform_feedback3 */ -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMinSampleShading (GLclampf value); -GLAPI void APIENTRY glBlendEquationi (GLuint buf, GLenum mode); -GLAPI void APIENTRY glBlendEquationSeparatei (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -GLAPI void APIENTRY glBlendFunci (GLuint buf, GLenum src, GLenum dst); -GLAPI void APIENTRY glBlendFuncSeparatei (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLMINSAMPLESHADINGPROC) (GLclampf value); -typedef void (APIENTRYP PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode); -typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -typedef void (APIENTRYP PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst); -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -#endif - -#ifndef GL_VERSION_4_1 -#define GL_VERSION_4_1 1 -/* OpenGL 4.1 also reuses entry points from these extensions: */ -/* ARB_ES2_compatibility */ -/* ARB_get_program_binary */ -/* ARB_separate_shader_objects */ -/* ARB_shader_precision (no entry points) */ -/* ARB_vertex_attrib_64bit */ -/* ARB_viewport_array */ -#endif - -#ifndef GL_ARB_multitexture -#define GL_ARB_multitexture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glActiveTextureARB (GLenum texture); -GLAPI void APIENTRY glClientActiveTextureARB (GLenum texture); -GLAPI void APIENTRY glMultiTexCoord1dARB (GLenum target, GLdouble s); -GLAPI void APIENTRY glMultiTexCoord1dvARB (GLenum target, const GLdouble *v); -GLAPI void APIENTRY glMultiTexCoord1fARB (GLenum target, GLfloat s); -GLAPI void APIENTRY glMultiTexCoord1fvARB (GLenum target, const GLfloat *v); -GLAPI void APIENTRY glMultiTexCoord1iARB (GLenum target, GLint s); -GLAPI void APIENTRY glMultiTexCoord1ivARB (GLenum target, const GLint *v); -GLAPI void APIENTRY glMultiTexCoord1sARB (GLenum target, GLshort s); -GLAPI void APIENTRY glMultiTexCoord1svARB (GLenum target, const GLshort *v); -GLAPI void APIENTRY glMultiTexCoord2dARB (GLenum target, GLdouble s, GLdouble t); -GLAPI void APIENTRY glMultiTexCoord2dvARB (GLenum target, const GLdouble *v); -GLAPI void APIENTRY glMultiTexCoord2fARB (GLenum target, GLfloat s, GLfloat t); -GLAPI void APIENTRY glMultiTexCoord2fvARB (GLenum target, const GLfloat *v); -GLAPI void APIENTRY glMultiTexCoord2iARB (GLenum target, GLint s, GLint t); -GLAPI void APIENTRY glMultiTexCoord2ivARB (GLenum target, const GLint *v); -GLAPI void APIENTRY glMultiTexCoord2sARB (GLenum target, GLshort s, GLshort t); -GLAPI void APIENTRY glMultiTexCoord2svARB (GLenum target, const GLshort *v); -GLAPI void APIENTRY glMultiTexCoord3dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r); -GLAPI void APIENTRY glMultiTexCoord3dvARB (GLenum target, const GLdouble *v); -GLAPI void APIENTRY glMultiTexCoord3fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r); -GLAPI void APIENTRY glMultiTexCoord3fvARB (GLenum target, const GLfloat *v); -GLAPI void APIENTRY glMultiTexCoord3iARB (GLenum target, GLint s, GLint t, GLint r); -GLAPI void APIENTRY glMultiTexCoord3ivARB (GLenum target, const GLint *v); -GLAPI void APIENTRY glMultiTexCoord3sARB (GLenum target, GLshort s, GLshort t, GLshort r); -GLAPI void APIENTRY glMultiTexCoord3svARB (GLenum target, const GLshort *v); -GLAPI void APIENTRY glMultiTexCoord4dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -GLAPI void APIENTRY glMultiTexCoord4dvARB (GLenum target, const GLdouble *v); -GLAPI void APIENTRY glMultiTexCoord4fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -GLAPI void APIENTRY glMultiTexCoord4fvARB (GLenum target, const GLfloat *v); -GLAPI void APIENTRY glMultiTexCoord4iARB (GLenum target, GLint s, GLint t, GLint r, GLint q); -GLAPI void APIENTRY glMultiTexCoord4ivARB (GLenum target, const GLint *v); -GLAPI void APIENTRY glMultiTexCoord4sARB (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -GLAPI void APIENTRY glMultiTexCoord4svARB (GLenum target, const GLshort *v); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLACTIVETEXTUREARBPROC) (GLenum texture); -typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); -#endif - -#ifndef GL_ARB_transpose_matrix -#define GL_ARB_transpose_matrix 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glLoadTransposeMatrixfARB (const GLfloat *m); -GLAPI void APIENTRY glLoadTransposeMatrixdARB (const GLdouble *m); -GLAPI void APIENTRY glMultTransposeMatrixfARB (const GLfloat *m); -GLAPI void APIENTRY glMultTransposeMatrixdARB (const GLdouble *m); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); -typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); -typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); -typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); -#endif - -#ifndef GL_ARB_multisample -#define GL_ARB_multisample 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSampleCoverageARB (GLclampf value, GLboolean invert); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert); -#endif - -#ifndef GL_ARB_texture_env_add -#define GL_ARB_texture_env_add 1 -#endif - -#ifndef GL_ARB_texture_cube_map -#define GL_ARB_texture_cube_map 1 -#endif - -#ifndef GL_ARB_texture_compression -#define GL_ARB_texture_compression 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCompressedTexImage3DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glCompressedTexImage2DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glCompressedTexImage1DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glCompressedTexSubImage3DARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glCompressedTexSubImage2DARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glCompressedTexSubImage1DARB (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glGetCompressedTexImageARB (GLenum target, GLint level, GLvoid *img); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint level, GLvoid *img); -#endif - -#ifndef GL_ARB_texture_border_clamp -#define GL_ARB_texture_border_clamp 1 -#endif - -#ifndef GL_ARB_point_parameters -#define GL_ARB_point_parameters 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPointParameterfARB (GLenum pname, GLfloat param); -GLAPI void APIENTRY glPointParameterfvARB (GLenum pname, const GLfloat *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat *params); -#endif - -#ifndef GL_ARB_vertex_blend -#define GL_ARB_vertex_blend 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glWeightbvARB (GLint size, const GLbyte *weights); -GLAPI void APIENTRY glWeightsvARB (GLint size, const GLshort *weights); -GLAPI void APIENTRY glWeightivARB (GLint size, const GLint *weights); -GLAPI void APIENTRY glWeightfvARB (GLint size, const GLfloat *weights); -GLAPI void APIENTRY glWeightdvARB (GLint size, const GLdouble *weights); -GLAPI void APIENTRY glWeightubvARB (GLint size, const GLubyte *weights); -GLAPI void APIENTRY glWeightusvARB (GLint size, const GLushort *weights); -GLAPI void APIENTRY glWeightuivARB (GLint size, const GLuint *weights); -GLAPI void APIENTRY glWeightPointerARB (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void APIENTRY glVertexBlendARB (GLint count); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLWEIGHTBVARBPROC) (GLint size, const GLbyte *weights); -typedef void (APIENTRYP PFNGLWEIGHTSVARBPROC) (GLint size, const GLshort *weights); -typedef void (APIENTRYP PFNGLWEIGHTIVARBPROC) (GLint size, const GLint *weights); -typedef void (APIENTRYP PFNGLWEIGHTFVARBPROC) (GLint size, const GLfloat *weights); -typedef void (APIENTRYP PFNGLWEIGHTDVARBPROC) (GLint size, const GLdouble *weights); -typedef void (APIENTRYP PFNGLWEIGHTUBVARBPROC) (GLint size, const GLubyte *weights); -typedef void (APIENTRYP PFNGLWEIGHTUSVARBPROC) (GLint size, const GLushort *weights); -typedef void (APIENTRYP PFNGLWEIGHTUIVARBPROC) (GLint size, const GLuint *weights); -typedef void (APIENTRYP PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLVERTEXBLENDARBPROC) (GLint count); -#endif - -#ifndef GL_ARB_matrix_palette -#define GL_ARB_matrix_palette 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCurrentPaletteMatrixARB (GLint index); -GLAPI void APIENTRY glMatrixIndexubvARB (GLint size, const GLubyte *indices); -GLAPI void APIENTRY glMatrixIndexusvARB (GLint size, const GLushort *indices); -GLAPI void APIENTRY glMatrixIndexuivARB (GLint size, const GLuint *indices); -GLAPI void APIENTRY glMatrixIndexPointerARB (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); -typedef void (APIENTRYP PFNGLMATRIXINDEXUBVARBPROC) (GLint size, const GLubyte *indices); -typedef void (APIENTRYP PFNGLMATRIXINDEXUSVARBPROC) (GLint size, const GLushort *indices); -typedef void (APIENTRYP PFNGLMATRIXINDEXUIVARBPROC) (GLint size, const GLuint *indices); -typedef void (APIENTRYP PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_ARB_texture_env_combine -#define GL_ARB_texture_env_combine 1 -#endif - -#ifndef GL_ARB_texture_env_crossbar -#define GL_ARB_texture_env_crossbar 1 -#endif - -#ifndef GL_ARB_texture_env_dot3 -#define GL_ARB_texture_env_dot3 1 -#endif - -#ifndef GL_ARB_texture_mirrored_repeat -#define GL_ARB_texture_mirrored_repeat 1 -#endif - -#ifndef GL_ARB_depth_texture -#define GL_ARB_depth_texture 1 -#endif - -#ifndef GL_ARB_shadow -#define GL_ARB_shadow 1 -#endif - -#ifndef GL_ARB_shadow_ambient -#define GL_ARB_shadow_ambient 1 -#endif - -#ifndef GL_ARB_window_pos -#define GL_ARB_window_pos 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glWindowPos2dARB (GLdouble x, GLdouble y); -GLAPI void APIENTRY glWindowPos2dvARB (const GLdouble *v); -GLAPI void APIENTRY glWindowPos2fARB (GLfloat x, GLfloat y); -GLAPI void APIENTRY glWindowPos2fvARB (const GLfloat *v); -GLAPI void APIENTRY glWindowPos2iARB (GLint x, GLint y); -GLAPI void APIENTRY glWindowPos2ivARB (const GLint *v); -GLAPI void APIENTRY glWindowPos2sARB (GLshort x, GLshort y); -GLAPI void APIENTRY glWindowPos2svARB (const GLshort *v); -GLAPI void APIENTRY glWindowPos3dARB (GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glWindowPos3dvARB (const GLdouble *v); -GLAPI void APIENTRY glWindowPos3fARB (GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glWindowPos3fvARB (const GLfloat *v); -GLAPI void APIENTRY glWindowPos3iARB (GLint x, GLint y, GLint z); -GLAPI void APIENTRY glWindowPos3ivARB (const GLint *v); -GLAPI void APIENTRY glWindowPos3sARB (GLshort x, GLshort y, GLshort z); -GLAPI void APIENTRY glWindowPos3svARB (const GLshort *v); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLWINDOWPOS2DVARBPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLWINDOWPOS2FVARBPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); -typedef void (APIENTRYP PFNGLWINDOWPOS2IVARBPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLWINDOWPOS2SVARBPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLWINDOWPOS3DVARBPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLWINDOWPOS3FVARBPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); -typedef void (APIENTRYP PFNGLWINDOWPOS3IVARBPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLWINDOWPOS3SVARBPROC) (const GLshort *v); -#endif - -#ifndef GL_ARB_vertex_program -#define GL_ARB_vertex_program 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttrib1dARB (GLuint index, GLdouble x); -GLAPI void APIENTRY glVertexAttrib1dvARB (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib1fARB (GLuint index, GLfloat x); -GLAPI void APIENTRY glVertexAttrib1fvARB (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib1sARB (GLuint index, GLshort x); -GLAPI void APIENTRY glVertexAttrib1svARB (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib2dARB (GLuint index, GLdouble x, GLdouble y); -GLAPI void APIENTRY glVertexAttrib2dvARB (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib2fARB (GLuint index, GLfloat x, GLfloat y); -GLAPI void APIENTRY glVertexAttrib2fvARB (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib2sARB (GLuint index, GLshort x, GLshort y); -GLAPI void APIENTRY glVertexAttrib2svARB (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib3dARB (GLuint index, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glVertexAttrib3dvARB (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib3fARB (GLuint index, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glVertexAttrib3fvARB (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib3sARB (GLuint index, GLshort x, GLshort y, GLshort z); -GLAPI void APIENTRY glVertexAttrib3svARB (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4NbvARB (GLuint index, const GLbyte *v); -GLAPI void APIENTRY glVertexAttrib4NivARB (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttrib4NsvARB (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4NubARB (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -GLAPI void APIENTRY glVertexAttrib4NubvARB (GLuint index, const GLubyte *v); -GLAPI void APIENTRY glVertexAttrib4NuivARB (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttrib4NusvARB (GLuint index, const GLushort *v); -GLAPI void APIENTRY glVertexAttrib4bvARB (GLuint index, const GLbyte *v); -GLAPI void APIENTRY glVertexAttrib4dARB (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glVertexAttrib4dvARB (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib4fARB (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glVertexAttrib4fvARB (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib4ivARB (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttrib4sARB (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -GLAPI void APIENTRY glVertexAttrib4svARB (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4ubvARB (GLuint index, const GLubyte *v); -GLAPI void APIENTRY glVertexAttrib4uivARB (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttrib4usvARB (GLuint index, const GLushort *v); -GLAPI void APIENTRY glVertexAttribPointerARB (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); -GLAPI void APIENTRY glEnableVertexAttribArrayARB (GLuint index); -GLAPI void APIENTRY glDisableVertexAttribArrayARB (GLuint index); -GLAPI void APIENTRY glProgramStringARB (GLenum target, GLenum format, GLsizei len, const GLvoid *string); -GLAPI void APIENTRY glBindProgramARB (GLenum target, GLuint program); -GLAPI void APIENTRY glDeleteProgramsARB (GLsizei n, const GLuint *programs); -GLAPI void APIENTRY glGenProgramsARB (GLsizei n, GLuint *programs); -GLAPI void APIENTRY glProgramEnvParameter4dARB (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glProgramEnvParameter4dvARB (GLenum target, GLuint index, const GLdouble *params); -GLAPI void APIENTRY glProgramEnvParameter4fARB (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glProgramEnvParameter4fvARB (GLenum target, GLuint index, const GLfloat *params); -GLAPI void APIENTRY glProgramLocalParameter4dARB (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glProgramLocalParameter4dvARB (GLenum target, GLuint index, const GLdouble *params); -GLAPI void APIENTRY glProgramLocalParameter4fARB (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glProgramLocalParameter4fvARB (GLenum target, GLuint index, const GLfloat *params); -GLAPI void APIENTRY glGetProgramEnvParameterdvARB (GLenum target, GLuint index, GLdouble *params); -GLAPI void APIENTRY glGetProgramEnvParameterfvARB (GLenum target, GLuint index, GLfloat *params); -GLAPI void APIENTRY glGetProgramLocalParameterdvARB (GLenum target, GLuint index, GLdouble *params); -GLAPI void APIENTRY glGetProgramLocalParameterfvARB (GLenum target, GLuint index, GLfloat *params); -GLAPI void APIENTRY glGetProgramivARB (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetProgramStringARB (GLenum target, GLenum pname, GLvoid *string); -GLAPI void APIENTRY glGetVertexAttribdvARB (GLuint index, GLenum pname, GLdouble *params); -GLAPI void APIENTRY glGetVertexAttribfvARB (GLuint index, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetVertexAttribivARB (GLuint index, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVertexAttribPointervARB (GLuint index, GLenum pname, GLvoid* *pointer); -GLAPI GLboolean APIENTRY glIsProgramARB (GLuint program); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); -typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); -typedef void (APIENTRYP PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const GLvoid *string); -typedef void (APIENTRYP PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); -typedef void (APIENTRYP PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint *programs); -typedef void (APIENTRYP PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint *programs); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); -typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); -typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); -typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); -typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); -typedef void (APIENTRYP PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, GLvoid *string); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, GLvoid* *pointer); -typedef GLboolean (APIENTRYP PFNGLISPROGRAMARBPROC) (GLuint program); -#endif - -#ifndef GL_ARB_fragment_program -#define GL_ARB_fragment_program 1 -/* All ARB_fragment_program entry points are shared with ARB_vertex_program. */ -#endif - -#ifndef GL_ARB_vertex_buffer_object -#define GL_ARB_vertex_buffer_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindBufferARB (GLenum target, GLuint buffer); -GLAPI void APIENTRY glDeleteBuffersARB (GLsizei n, const GLuint *buffers); -GLAPI void APIENTRY glGenBuffersARB (GLsizei n, GLuint *buffers); -GLAPI GLboolean APIENTRY glIsBufferARB (GLuint buffer); -GLAPI void APIENTRY glBufferDataARB (GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage); -GLAPI void APIENTRY glBufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data); -GLAPI void APIENTRY glGetBufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid *data); -GLAPI GLvoid* APIENTRY glMapBufferARB (GLenum target, GLenum access); -GLAPI GLboolean APIENTRY glUnmapBufferARB (GLenum target); -GLAPI void APIENTRY glGetBufferParameterivARB (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetBufferPointervARB (GLenum target, GLenum pname, GLvoid* *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); -typedef void (APIENTRYP PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers); -typedef void (APIENTRYP PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers); -typedef GLboolean (APIENTRYP PFNGLISBUFFERARBPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage); -typedef void (APIENTRYP PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data); -typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid *data); -typedef GLvoid* (APIENTRYP PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); -typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERARBPROC) (GLenum target); -typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, GLvoid* *params); -#endif - -#ifndef GL_ARB_occlusion_query -#define GL_ARB_occlusion_query 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenQueriesARB (GLsizei n, GLuint *ids); -GLAPI void APIENTRY glDeleteQueriesARB (GLsizei n, const GLuint *ids); -GLAPI GLboolean APIENTRY glIsQueryARB (GLuint id); -GLAPI void APIENTRY glBeginQueryARB (GLenum target, GLuint id); -GLAPI void APIENTRY glEndQueryARB (GLenum target); -GLAPI void APIENTRY glGetQueryivARB (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetQueryObjectivARB (GLuint id, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetQueryObjectuivARB (GLuint id, GLenum pname, GLuint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint *ids); -typedef void (APIENTRYP PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint *ids); -typedef GLboolean (APIENTRYP PFNGLISQUERYARBPROC) (GLuint id); -typedef void (APIENTRYP PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); -typedef void (APIENTRYP PFNGLENDQUERYARBPROC) (GLenum target); -typedef void (APIENTRYP PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint *params); -#endif - -#ifndef GL_ARB_shader_objects -#define GL_ARB_shader_objects 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDeleteObjectARB (GLhandleARB obj); -GLAPI GLhandleARB APIENTRY glGetHandleARB (GLenum pname); -GLAPI void APIENTRY glDetachObjectARB (GLhandleARB containerObj, GLhandleARB attachedObj); -GLAPI GLhandleARB APIENTRY glCreateShaderObjectARB (GLenum shaderType); -GLAPI void APIENTRY glShaderSourceARB (GLhandleARB shaderObj, GLsizei count, const GLcharARB* *string, const GLint *length); -GLAPI void APIENTRY glCompileShaderARB (GLhandleARB shaderObj); -GLAPI GLhandleARB APIENTRY glCreateProgramObjectARB (void); -GLAPI void APIENTRY glAttachObjectARB (GLhandleARB containerObj, GLhandleARB obj); -GLAPI void APIENTRY glLinkProgramARB (GLhandleARB programObj); -GLAPI void APIENTRY glUseProgramObjectARB (GLhandleARB programObj); -GLAPI void APIENTRY glValidateProgramARB (GLhandleARB programObj); -GLAPI void APIENTRY glUniform1fARB (GLint location, GLfloat v0); -GLAPI void APIENTRY glUniform2fARB (GLint location, GLfloat v0, GLfloat v1); -GLAPI void APIENTRY glUniform3fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -GLAPI void APIENTRY glUniform4fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -GLAPI void APIENTRY glUniform1iARB (GLint location, GLint v0); -GLAPI void APIENTRY glUniform2iARB (GLint location, GLint v0, GLint v1); -GLAPI void APIENTRY glUniform3iARB (GLint location, GLint v0, GLint v1, GLint v2); -GLAPI void APIENTRY glUniform4iARB (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -GLAPI void APIENTRY glUniform1fvARB (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform2fvARB (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform3fvARB (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform4fvARB (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform1ivARB (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniform2ivARB (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniform3ivARB (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniform4ivARB (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniformMatrix2fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix3fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix4fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glGetObjectParameterfvARB (GLhandleARB obj, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetObjectParameterivARB (GLhandleARB obj, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetInfoLogARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); -GLAPI void APIENTRY glGetAttachedObjectsARB (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); -GLAPI GLint APIENTRY glGetUniformLocationARB (GLhandleARB programObj, const GLcharARB *name); -GLAPI void APIENTRY glGetActiveUniformARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); -GLAPI void APIENTRY glGetUniformfvARB (GLhandleARB programObj, GLint location, GLfloat *params); -GLAPI void APIENTRY glGetUniformivARB (GLhandleARB programObj, GLint location, GLint *params); -GLAPI void APIENTRY glGetShaderSourceARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); -typedef GLhandleARB (APIENTRYP PFNGLGETHANDLEARBPROC) (GLenum pname); -typedef void (APIENTRYP PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); -typedef GLhandleARB (APIENTRYP PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); -typedef void (APIENTRYP PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB* *string, const GLint *length); -typedef void (APIENTRYP PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); -typedef GLhandleARB (APIENTRYP PFNGLCREATEPROGRAMOBJECTARBPROC) (void); -typedef void (APIENTRYP PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); -typedef void (APIENTRYP PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); -typedef void (APIENTRYP PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); -typedef void (APIENTRYP PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); -typedef void (APIENTRYP PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); -typedef void (APIENTRYP PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); -typedef void (APIENTRYP PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (APIENTRYP PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (APIENTRYP PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); -typedef void (APIENTRYP PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); -typedef void (APIENTRYP PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); -typedef void (APIENTRYP PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (APIENTRYP PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); -typedef void (APIENTRYP PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); -typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); -typedef void (APIENTRYP PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat *params); -typedef void (APIENTRYP PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint *params); -typedef void (APIENTRYP PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); -#endif - -#ifndef GL_ARB_vertex_shader -#define GL_ARB_vertex_shader 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindAttribLocationARB (GLhandleARB programObj, GLuint index, const GLcharARB *name); -GLAPI void APIENTRY glGetActiveAttribARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); -GLAPI GLint APIENTRY glGetAttribLocationARB (GLhandleARB programObj, const GLcharARB *name); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB *name); -typedef void (APIENTRYP PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); -typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); -#endif - -#ifndef GL_ARB_fragment_shader -#define GL_ARB_fragment_shader 1 -#endif - -#ifndef GL_ARB_shading_language_100 -#define GL_ARB_shading_language_100 1 -#endif - -#ifndef GL_ARB_texture_non_power_of_two -#define GL_ARB_texture_non_power_of_two 1 -#endif - -#ifndef GL_ARB_point_sprite -#define GL_ARB_point_sprite 1 -#endif - -#ifndef GL_ARB_fragment_program_shadow -#define GL_ARB_fragment_program_shadow 1 -#endif - -#ifndef GL_ARB_draw_buffers -#define GL_ARB_draw_buffers 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawBuffersARB (GLsizei n, const GLenum *bufs); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum *bufs); -#endif - -#ifndef GL_ARB_texture_rectangle -#define GL_ARB_texture_rectangle 1 -#endif - -#ifndef GL_ARB_color_buffer_float -#define GL_ARB_color_buffer_float 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glClampColorARB (GLenum target, GLenum clamp); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); -#endif - -#ifndef GL_ARB_half_float_pixel -#define GL_ARB_half_float_pixel 1 -#endif - -#ifndef GL_ARB_texture_float -#define GL_ARB_texture_float 1 -#endif - -#ifndef GL_ARB_pixel_buffer_object -#define GL_ARB_pixel_buffer_object 1 -#endif - -#ifndef GL_ARB_depth_buffer_float -#define GL_ARB_depth_buffer_float 1 -#endif - -#ifndef GL_ARB_draw_instanced -#define GL_ARB_draw_instanced 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawArraysInstancedARB (GLenum mode, GLint first, GLsizei count, GLsizei primcount); -GLAPI void APIENTRY glDrawElementsInstancedARB (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDARBPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); -typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDARBPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); -#endif - -#ifndef GL_ARB_framebuffer_object -#define GL_ARB_framebuffer_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLboolean APIENTRY glIsRenderbuffer (GLuint renderbuffer); -GLAPI void APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer); -GLAPI void APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers); -GLAPI void APIENTRY glGenRenderbuffers (GLsizei n, GLuint *renderbuffers); -GLAPI void APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI GLboolean APIENTRY glIsFramebuffer (GLuint framebuffer); -GLAPI void APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer); -GLAPI void APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers); -GLAPI void APIENTRY glGenFramebuffers (GLsizei n, GLuint *framebuffers); -GLAPI GLenum APIENTRY glCheckFramebufferStatus (GLenum target); -GLAPI void APIENTRY glFramebufferTexture1D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -GLAPI void APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -GLAPI void APIENTRY glFramebufferTexture3D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -GLAPI void APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -GLAPI void APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params); -GLAPI void APIENTRY glGenerateMipmap (GLenum target); -GLAPI void APIENTRY glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -GLAPI void APIENTRY glRenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glFramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer); -typedef void (APIENTRYP PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint *renderbuffers); -typedef void (APIENTRYP PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers); -typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer); -typedef void (APIENTRYP PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer); -typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint *framebuffers); -typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers); -typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGENERATEMIPMAPPROC) (GLenum target); -typedef void (APIENTRYP PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -#endif - -#ifndef GL_ARB_framebuffer_sRGB -#define GL_ARB_framebuffer_sRGB 1 -#endif - -#ifndef GL_ARB_geometry_shader4 -#define GL_ARB_geometry_shader4 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramParameteriARB (GLuint program, GLenum pname, GLint value); -GLAPI void APIENTRY glFramebufferTextureARB (GLenum target, GLenum attachment, GLuint texture, GLint level); -GLAPI void APIENTRY glFramebufferTextureLayerARB (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -GLAPI void APIENTRY glFramebufferTextureFaceARB (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIARBPROC) (GLuint program, GLenum pname, GLint value); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); -#endif - -#ifndef GL_ARB_half_float_vertex -#define GL_ARB_half_float_vertex 1 -#endif - -#ifndef GL_ARB_instanced_arrays -#define GL_ARB_instanced_arrays 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttribDivisorARB (GLuint index, GLuint divisor); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORARBPROC) (GLuint index, GLuint divisor); -#endif - -#ifndef GL_ARB_map_buffer_range -#define GL_ARB_map_buffer_range 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLvoid* APIENTRY glMapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); -GLAPI void APIENTRY glFlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLvoid* (APIENTRYP PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); -typedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length); -#endif - -#ifndef GL_ARB_texture_buffer_object -#define GL_ARB_texture_buffer_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexBufferARB (GLenum target, GLenum internalformat, GLuint buffer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXBUFFERARBPROC) (GLenum target, GLenum internalformat, GLuint buffer); -#endif - -#ifndef GL_ARB_texture_compression_rgtc -#define GL_ARB_texture_compression_rgtc 1 -#endif - -#ifndef GL_ARB_texture_rg -#define GL_ARB_texture_rg 1 -#endif - -#ifndef GL_ARB_vertex_array_object -#define GL_ARB_vertex_array_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindVertexArray (GLuint array); -GLAPI void APIENTRY glDeleteVertexArrays (GLsizei n, const GLuint *arrays); -GLAPI void APIENTRY glGenVertexArrays (GLsizei n, GLuint *arrays); -GLAPI GLboolean APIENTRY glIsVertexArray (GLuint array); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBINDVERTEXARRAYPROC) (GLuint array); -typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays); -typedef void (APIENTRYP PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays); -typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYPROC) (GLuint array); -#endif - -#ifndef GL_ARB_uniform_buffer_object -#define GL_ARB_uniform_buffer_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetUniformIndices (GLuint program, GLsizei uniformCount, const GLchar* *uniformNames, GLuint *uniformIndices); -GLAPI void APIENTRY glGetActiveUniformsiv (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetActiveUniformName (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); -GLAPI GLuint APIENTRY glGetUniformBlockIndex (GLuint program, const GLchar *uniformBlockName); -GLAPI void APIENTRY glGetActiveUniformBlockiv (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetActiveUniformBlockName (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); -GLAPI void APIENTRY glUniformBlockBinding (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar* *uniformNames, GLuint *uniformIndices); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMNAMEPROC) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); -typedef GLuint (APIENTRYP PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar *uniformBlockName); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); -typedef void (APIENTRYP PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); -#endif - -#ifndef GL_ARB_compatibility -#define GL_ARB_compatibility 1 -#endif - -#ifndef GL_ARB_copy_buffer -#define GL_ARB_copy_buffer 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCopyBufferSubData (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -#endif - -#ifndef GL_ARB_shader_texture_lod -#define GL_ARB_shader_texture_lod 1 -#endif - -#ifndef GL_ARB_depth_clamp -#define GL_ARB_depth_clamp 1 -#endif - -#ifndef GL_ARB_draw_elements_base_vertex -#define GL_ARB_draw_elements_base_vertex 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawElementsBaseVertex (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex); -GLAPI void APIENTRY glDrawRangeElementsBaseVertex (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex); -GLAPI void APIENTRY glDrawElementsInstancedBaseVertex (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount, GLint basevertex); -GLAPI void APIENTRY glMultiDrawElementsBaseVertex (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount, const GLint *basevertex); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex); -typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex); -typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount, GLint basevertex); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount, const GLint *basevertex); -#endif - -#ifndef GL_ARB_fragment_coord_conventions -#define GL_ARB_fragment_coord_conventions 1 -#endif - -#ifndef GL_ARB_provoking_vertex -#define GL_ARB_provoking_vertex 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProvokingVertex (GLenum mode); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPROVOKINGVERTEXPROC) (GLenum mode); -#endif - -#ifndef GL_ARB_seamless_cube_map -#define GL_ARB_seamless_cube_map 1 -#endif - -#ifndef GL_ARB_sync -#define GL_ARB_sync 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLsync APIENTRY glFenceSync (GLenum condition, GLbitfield flags); -GLAPI GLboolean APIENTRY glIsSync (GLsync sync); -GLAPI void APIENTRY glDeleteSync (GLsync sync); -GLAPI GLenum APIENTRY glClientWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout); -GLAPI void APIENTRY glWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout); -GLAPI void APIENTRY glGetInteger64v (GLenum pname, GLint64 *params); -GLAPI void APIENTRY glGetSynciv (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLsync (APIENTRYP PFNGLFENCESYNCPROC) (GLenum condition, GLbitfield flags); -typedef GLboolean (APIENTRYP PFNGLISSYNCPROC) (GLsync sync); -typedef void (APIENTRYP PFNGLDELETESYNCPROC) (GLsync sync); -typedef GLenum (APIENTRYP PFNGLCLIENTWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); -typedef void (APIENTRYP PFNGLWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); -typedef void (APIENTRYP PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64 *params); -typedef void (APIENTRYP PFNGLGETSYNCIVPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); -#endif - -#ifndef GL_ARB_texture_multisample -#define GL_ARB_texture_multisample 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexImage2DMultisample (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -GLAPI void APIENTRY glTexImage3DMultisample (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -GLAPI void APIENTRY glGetMultisamplefv (GLenum pname, GLuint index, GLfloat *val); -GLAPI void APIENTRY glSampleMaski (GLuint index, GLbitfield mask); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -typedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat *val); -typedef void (APIENTRYP PFNGLSAMPLEMASKIPROC) (GLuint index, GLbitfield mask); -#endif - -#ifndef GL_ARB_vertex_array_bgra -#define GL_ARB_vertex_array_bgra 1 -#endif - -#ifndef GL_ARB_draw_buffers_blend -#define GL_ARB_draw_buffers_blend 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendEquationiARB (GLuint buf, GLenum mode); -GLAPI void APIENTRY glBlendEquationSeparateiARB (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -GLAPI void APIENTRY glBlendFunciARB (GLuint buf, GLenum src, GLenum dst); -GLAPI void APIENTRY glBlendFuncSeparateiARB (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDEQUATIONIARBPROC) (GLuint buf, GLenum mode); -typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIARBPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -typedef void (APIENTRYP PFNGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLenum dst); -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIARBPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -#endif - -#ifndef GL_ARB_sample_shading -#define GL_ARB_sample_shading 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMinSampleShadingARB (GLclampf value); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLMINSAMPLESHADINGARBPROC) (GLclampf value); -#endif - -#ifndef GL_ARB_texture_cube_map_array -#define GL_ARB_texture_cube_map_array 1 -#endif - -#ifndef GL_ARB_texture_gather -#define GL_ARB_texture_gather 1 -#endif - -#ifndef GL_ARB_texture_query_lod -#define GL_ARB_texture_query_lod 1 -#endif - -#ifndef GL_ARB_shading_language_include -#define GL_ARB_shading_language_include 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glNamedStringARB (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string); -GLAPI void APIENTRY glDeleteNamedStringARB (GLint namelen, const GLchar *name); -GLAPI void APIENTRY glCompileShaderIncludeARB (GLuint shader, GLsizei count, const GLchar* *path, const GLint *length); -GLAPI GLboolean APIENTRY glIsNamedStringARB (GLint namelen, const GLchar *name); -GLAPI void APIENTRY glGetNamedStringARB (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string); -GLAPI void APIENTRY glGetNamedStringivARB (GLint namelen, const GLchar *name, GLenum pname, GLint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string); -typedef void (APIENTRYP PFNGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name); -typedef void (APIENTRYP PFNGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const GLchar* *path, const GLint *length); -typedef GLboolean (APIENTRYP PFNGLISNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name); -typedef void (APIENTRYP PFNGLGETNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string); -typedef void (APIENTRYP PFNGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const GLchar *name, GLenum pname, GLint *params); -#endif - -#ifndef GL_ARB_texture_compression_bptc -#define GL_ARB_texture_compression_bptc 1 -#endif - -#ifndef GL_ARB_blend_func_extended -#define GL_ARB_blend_func_extended 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindFragDataLocationIndexed (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); -GLAPI GLint APIENTRY glGetFragDataIndex (GLuint program, const GLchar *name); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); -typedef GLint (APIENTRYP PFNGLGETFRAGDATAINDEXPROC) (GLuint program, const GLchar *name); -#endif - -#ifndef GL_ARB_explicit_attrib_location -#define GL_ARB_explicit_attrib_location 1 -#endif - -#ifndef GL_ARB_occlusion_query2 -#define GL_ARB_occlusion_query2 1 -#endif - -#ifndef GL_ARB_sampler_objects -#define GL_ARB_sampler_objects 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenSamplers (GLsizei count, GLuint *samplers); -GLAPI void APIENTRY glDeleteSamplers (GLsizei count, const GLuint *samplers); -GLAPI GLboolean APIENTRY glIsSampler (GLuint sampler); -GLAPI void APIENTRY glBindSampler (GLuint unit, GLuint sampler); -GLAPI void APIENTRY glSamplerParameteri (GLuint sampler, GLenum pname, GLint param); -GLAPI void APIENTRY glSamplerParameteriv (GLuint sampler, GLenum pname, const GLint *param); -GLAPI void APIENTRY glSamplerParameterf (GLuint sampler, GLenum pname, GLfloat param); -GLAPI void APIENTRY glSamplerParameterfv (GLuint sampler, GLenum pname, const GLfloat *param); -GLAPI void APIENTRY glSamplerParameterIiv (GLuint sampler, GLenum pname, const GLint *param); -GLAPI void APIENTRY glSamplerParameterIuiv (GLuint sampler, GLenum pname, const GLuint *param); -GLAPI void APIENTRY glGetSamplerParameteriv (GLuint sampler, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetSamplerParameterIiv (GLuint sampler, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetSamplerParameterfv (GLuint sampler, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetSamplerParameterIuiv (GLuint sampler, GLenum pname, GLuint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint *samplers); -typedef void (APIENTRYP PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint *samplers); -typedef GLboolean (APIENTRYP PFNGLISSAMPLERPROC) (GLuint sampler); -typedef void (APIENTRYP PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler); -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint *param); -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat *param); -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint *param); -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint *param); -typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint *params); -#endif - -#ifndef GL_ARB_texture_rgb10_a2ui -#define GL_ARB_texture_rgb10_a2ui 1 -#endif - -#ifndef GL_ARB_texture_swizzle -#define GL_ARB_texture_swizzle 1 -#endif - -#ifndef GL_ARB_timer_query -#define GL_ARB_timer_query 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glQueryCounter (GLuint id, GLenum target); -GLAPI void APIENTRY glGetQueryObjecti64v (GLuint id, GLenum pname, GLint64 *params); -GLAPI void APIENTRY glGetQueryObjectui64v (GLuint id, GLenum pname, GLuint64 *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLQUERYCOUNTERPROC) (GLuint id, GLenum target); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VPROC) (GLuint id, GLenum pname, GLint64 *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64 *params); -#endif - -#ifndef GL_ARB_vertex_type_2_10_10_10_rev -#define GL_ARB_vertex_type_2_10_10_10_rev 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexP2ui (GLenum type, GLuint value); -GLAPI void APIENTRY glVertexP2uiv (GLenum type, const GLuint *value); -GLAPI void APIENTRY glVertexP3ui (GLenum type, GLuint value); -GLAPI void APIENTRY glVertexP3uiv (GLenum type, const GLuint *value); -GLAPI void APIENTRY glVertexP4ui (GLenum type, GLuint value); -GLAPI void APIENTRY glVertexP4uiv (GLenum type, const GLuint *value); -GLAPI void APIENTRY glTexCoordP1ui (GLenum type, GLuint coords); -GLAPI void APIENTRY glTexCoordP1uiv (GLenum type, const GLuint *coords); -GLAPI void APIENTRY glTexCoordP2ui (GLenum type, GLuint coords); -GLAPI void APIENTRY glTexCoordP2uiv (GLenum type, const GLuint *coords); -GLAPI void APIENTRY glTexCoordP3ui (GLenum type, GLuint coords); -GLAPI void APIENTRY glTexCoordP3uiv (GLenum type, const GLuint *coords); -GLAPI void APIENTRY glTexCoordP4ui (GLenum type, GLuint coords); -GLAPI void APIENTRY glTexCoordP4uiv (GLenum type, const GLuint *coords); -GLAPI void APIENTRY glMultiTexCoordP1ui (GLenum texture, GLenum type, GLuint coords); -GLAPI void APIENTRY glMultiTexCoordP1uiv (GLenum texture, GLenum type, const GLuint *coords); -GLAPI void APIENTRY glMultiTexCoordP2ui (GLenum texture, GLenum type, GLuint coords); -GLAPI void APIENTRY glMultiTexCoordP2uiv (GLenum texture, GLenum type, const GLuint *coords); -GLAPI void APIENTRY glMultiTexCoordP3ui (GLenum texture, GLenum type, GLuint coords); -GLAPI void APIENTRY glMultiTexCoordP3uiv (GLenum texture, GLenum type, const GLuint *coords); -GLAPI void APIENTRY glMultiTexCoordP4ui (GLenum texture, GLenum type, GLuint coords); -GLAPI void APIENTRY glMultiTexCoordP4uiv (GLenum texture, GLenum type, const GLuint *coords); -GLAPI void APIENTRY glNormalP3ui (GLenum type, GLuint coords); -GLAPI void APIENTRY glNormalP3uiv (GLenum type, const GLuint *coords); -GLAPI void APIENTRY glColorP3ui (GLenum type, GLuint color); -GLAPI void APIENTRY glColorP3uiv (GLenum type, const GLuint *color); -GLAPI void APIENTRY glColorP4ui (GLenum type, GLuint color); -GLAPI void APIENTRY glColorP4uiv (GLenum type, const GLuint *color); -GLAPI void APIENTRY glSecondaryColorP3ui (GLenum type, GLuint color); -GLAPI void APIENTRY glSecondaryColorP3uiv (GLenum type, const GLuint *color); -GLAPI void APIENTRY glVertexAttribP1ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); -GLAPI void APIENTRY glVertexAttribP1uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -GLAPI void APIENTRY glVertexAttribP2ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); -GLAPI void APIENTRY glVertexAttribP2uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -GLAPI void APIENTRY glVertexAttribP3ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); -GLAPI void APIENTRY glVertexAttribP3uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -GLAPI void APIENTRY glVertexAttribP4ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); -GLAPI void APIENTRY glVertexAttribP4uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXP2UIPROC) (GLenum type, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXP2UIVPROC) (GLenum type, const GLuint *value); -typedef void (APIENTRYP PFNGLVERTEXP3UIPROC) (GLenum type, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXP3UIVPROC) (GLenum type, const GLuint *value); -typedef void (APIENTRYP PFNGLVERTEXP4UIPROC) (GLenum type, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXP4UIVPROC) (GLenum type, const GLuint *value); -typedef void (APIENTRYP PFNGLTEXCOORDP1UIPROC) (GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLTEXCOORDP1UIVPROC) (GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLTEXCOORDP2UIPROC) (GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLTEXCOORDP2UIVPROC) (GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLTEXCOORDP3UIPROC) (GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLTEXCOORDP3UIVPROC) (GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLTEXCOORDP4UIPROC) (GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLTEXCOORDP4UIVPROC) (GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIPROC) (GLenum texture, GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIPROC) (GLenum texture, GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIPROC) (GLenum texture, GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIPROC) (GLenum texture, GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLNORMALP3UIPROC) (GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLNORMALP3UIVPROC) (GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLCOLORP3UIPROC) (GLenum type, GLuint color); -typedef void (APIENTRYP PFNGLCOLORP3UIVPROC) (GLenum type, const GLuint *color); -typedef void (APIENTRYP PFNGLCOLORP4UIPROC) (GLenum type, GLuint color); -typedef void (APIENTRYP PFNGLCOLORP4UIVPROC) (GLenum type, const GLuint *color); -typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIPROC) (GLenum type, GLuint color); -typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIVPROC) (GLenum type, const GLuint *color); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -#endif - -#ifndef GL_ARB_draw_indirect -#define GL_ARB_draw_indirect 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawArraysIndirect (GLenum mode, const GLvoid *indirect); -GLAPI void APIENTRY glDrawElementsIndirect (GLenum mode, GLenum type, const GLvoid *indirect); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const GLvoid *indirect); -typedef void (APIENTRYP PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const GLvoid *indirect); -#endif - -#ifndef GL_ARB_gpu_shader5 -#define GL_ARB_gpu_shader5 1 -#endif - -#ifndef GL_ARB_gpu_shader_fp64 -#define GL_ARB_gpu_shader_fp64 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glUniform1d (GLint location, GLdouble x); -GLAPI void APIENTRY glUniform2d (GLint location, GLdouble x, GLdouble y); -GLAPI void APIENTRY glUniform3d (GLint location, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glUniform4d (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glUniform1dv (GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glUniform2dv (GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glUniform3dv (GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glUniform4dv (GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix2x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix2x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix3x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix3x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix4x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix4x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glGetUniformdv (GLuint program, GLint location, GLdouble *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLUNIFORM1DPROC) (GLint location, GLdouble x); -typedef void (APIENTRYP PFNGLUNIFORM2DPROC) (GLint location, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLUNIFORM3DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLUNIFORM4DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLUNIFORM1DVPROC) (GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORM2DVPROC) (GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORM3DVPROC) (GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORM4DVPROC) (GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLGETUNIFORMDVPROC) (GLuint program, GLint location, GLdouble *params); -#endif - -#ifndef GL_ARB_shader_subroutine -#define GL_ARB_shader_subroutine 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLint APIENTRY glGetSubroutineUniformLocation (GLuint program, GLenum shadertype, const GLchar *name); -GLAPI GLuint APIENTRY glGetSubroutineIndex (GLuint program, GLenum shadertype, const GLchar *name); -GLAPI void APIENTRY glGetActiveSubroutineUniformiv (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values); -GLAPI void APIENTRY glGetActiveSubroutineUniformName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); -GLAPI void APIENTRY glGetActiveSubroutineName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); -GLAPI void APIENTRY glUniformSubroutinesuiv (GLenum shadertype, GLsizei count, const GLuint *indices); -GLAPI void APIENTRY glGetUniformSubroutineuiv (GLenum shadertype, GLint location, GLuint *params); -GLAPI void APIENTRY glGetProgramStageiv (GLuint program, GLenum shadertype, GLenum pname, GLint *values); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLint (APIENTRYP PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) (GLuint program, GLenum shadertype, const GLchar *name); -typedef GLuint (APIENTRYP PFNGLGETSUBROUTINEINDEXPROC) (GLuint program, GLenum shadertype, const GLchar *name); -typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values); -typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); -typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINENAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); -typedef void (APIENTRYP PFNGLUNIFORMSUBROUTINESUIVPROC) (GLenum shadertype, GLsizei count, const GLuint *indices); -typedef void (APIENTRYP PFNGLGETUNIFORMSUBROUTINEUIVPROC) (GLenum shadertype, GLint location, GLuint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMSTAGEIVPROC) (GLuint program, GLenum shadertype, GLenum pname, GLint *values); -#endif - -#ifndef GL_ARB_tessellation_shader -#define GL_ARB_tessellation_shader 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPatchParameteri (GLenum pname, GLint value); -GLAPI void APIENTRY glPatchParameterfv (GLenum pname, const GLfloat *values); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPATCHPARAMETERIPROC) (GLenum pname, GLint value); -typedef void (APIENTRYP PFNGLPATCHPARAMETERFVPROC) (GLenum pname, const GLfloat *values); -#endif - -#ifndef GL_ARB_texture_buffer_object_rgb32 -#define GL_ARB_texture_buffer_object_rgb32 1 -#endif - -#ifndef GL_ARB_transform_feedback2 -#define GL_ARB_transform_feedback2 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindTransformFeedback (GLenum target, GLuint id); -GLAPI void APIENTRY glDeleteTransformFeedbacks (GLsizei n, const GLuint *ids); -GLAPI void APIENTRY glGenTransformFeedbacks (GLsizei n, GLuint *ids); -GLAPI GLboolean APIENTRY glIsTransformFeedback (GLuint id); -GLAPI void APIENTRY glPauseTransformFeedback (void); -GLAPI void APIENTRY glResumeTransformFeedback (void); -GLAPI void APIENTRY glDrawTransformFeedback (GLenum mode, GLuint id); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id); -typedef void (APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint *ids); -typedef void (APIENTRYP PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids); -typedef GLboolean (APIENTRYP PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id); -typedef void (APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKPROC) (void); -typedef void (APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKPROC) (void); -typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKPROC) (GLenum mode, GLuint id); -#endif - -#ifndef GL_ARB_transform_feedback3 -#define GL_ARB_transform_feedback3 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawTransformFeedbackStream (GLenum mode, GLuint id, GLuint stream); -GLAPI void APIENTRY glBeginQueryIndexed (GLenum target, GLuint index, GLuint id); -GLAPI void APIENTRY glEndQueryIndexed (GLenum target, GLuint index); -GLAPI void APIENTRY glGetQueryIndexediv (GLenum target, GLuint index, GLenum pname, GLint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) (GLenum mode, GLuint id, GLuint stream); -typedef void (APIENTRYP PFNGLBEGINQUERYINDEXEDPROC) (GLenum target, GLuint index, GLuint id); -typedef void (APIENTRYP PFNGLENDQUERYINDEXEDPROC) (GLenum target, GLuint index); -typedef void (APIENTRYP PFNGLGETQUERYINDEXEDIVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); -#endif - -#ifndef GL_ARB_ES2_compatibility -#define GL_ARB_ES2_compatibility 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glReleaseShaderCompiler (void); -GLAPI void APIENTRY glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length); -GLAPI void APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); -GLAPI void APIENTRY glDepthRangef (GLclampf n, GLclampf f); -GLAPI void APIENTRY glClearDepthf (GLclampf d); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLRELEASESHADERCOMPILERPROC) (void); -typedef void (APIENTRYP PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length); -typedef void (APIENTRYP PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); -typedef void (APIENTRYP PFNGLDEPTHRANGEFPROC) (GLclampf n, GLclampf f); -typedef void (APIENTRYP PFNGLCLEARDEPTHFPROC) (GLclampf d); -#endif - -#ifndef GL_ARB_get_program_binary -#define GL_ARB_get_program_binary 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetProgramBinary (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary); -GLAPI void APIENTRY glProgramBinary (GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length); -GLAPI void APIENTRY glProgramParameteri (GLuint program, GLenum pname, GLint value); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary); -typedef void (APIENTRYP PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value); -#endif - -#ifndef GL_ARB_separate_shader_objects -#define GL_ARB_separate_shader_objects 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glUseProgramStages (GLuint pipeline, GLbitfield stages, GLuint program); -GLAPI void APIENTRY glActiveShaderProgram (GLuint pipeline, GLuint program); -GLAPI GLuint APIENTRY glCreateShaderProgramv (GLenum type, GLsizei count, const GLchar* *strings); -GLAPI void APIENTRY glBindProgramPipeline (GLuint pipeline); -GLAPI void APIENTRY glDeleteProgramPipelines (GLsizei n, const GLuint *pipelines); -GLAPI void APIENTRY glGenProgramPipelines (GLsizei n, GLuint *pipelines); -GLAPI GLboolean APIENTRY glIsProgramPipeline (GLuint pipeline); -GLAPI void APIENTRY glGetProgramPipelineiv (GLuint pipeline, GLenum pname, GLint *params); -GLAPI void APIENTRY glProgramUniform1i (GLuint program, GLint location, GLint v0); -GLAPI void APIENTRY glProgramUniform1iv (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform1f (GLuint program, GLint location, GLfloat v0); -GLAPI void APIENTRY glProgramUniform1fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform1d (GLuint program, GLint location, GLdouble v0); -GLAPI void APIENTRY glProgramUniform1dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform1ui (GLuint program, GLint location, GLuint v0); -GLAPI void APIENTRY glProgramUniform1uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniform2i (GLuint program, GLint location, GLint v0, GLint v1); -GLAPI void APIENTRY glProgramUniform2iv (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform2f (GLuint program, GLint location, GLfloat v0, GLfloat v1); -GLAPI void APIENTRY glProgramUniform2fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform2d (GLuint program, GLint location, GLdouble v0, GLdouble v1); -GLAPI void APIENTRY glProgramUniform2dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform2ui (GLuint program, GLint location, GLuint v0, GLuint v1); -GLAPI void APIENTRY glProgramUniform2uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniform3i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); -GLAPI void APIENTRY glProgramUniform3iv (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform3f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -GLAPI void APIENTRY glProgramUniform3fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform3d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); -GLAPI void APIENTRY glProgramUniform3dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform3ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); -GLAPI void APIENTRY glProgramUniform3uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniform4i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -GLAPI void APIENTRY glProgramUniform4iv (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform4f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -GLAPI void APIENTRY glProgramUniform4fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform4d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); -GLAPI void APIENTRY glProgramUniform4dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform4ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -GLAPI void APIENTRY glProgramUniform4uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniformMatrix2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix2x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix3x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix2x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix4x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix3x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix4x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix2x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix3x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix2x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix4x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix3x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix4x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glValidateProgramPipeline (GLuint pipeline); -GLAPI void APIENTRY glGetProgramPipelineInfoLog (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program); -typedef void (APIENTRYP PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program); -typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar* *strings); -typedef void (APIENTRYP PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline); -typedef void (APIENTRYP PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint *pipelines); -typedef void (APIENTRYP PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines); -typedef GLboolean (APIENTRYP PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline); -typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DPROC) (GLuint program, GLint location, GLdouble v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint v0, GLint v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline); -typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -#endif - -#ifndef GL_ARB_vertex_attrib_64bit -#define GL_ARB_vertex_attrib_64bit 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttribL1d (GLuint index, GLdouble x); -GLAPI void APIENTRY glVertexAttribL2d (GLuint index, GLdouble x, GLdouble y); -GLAPI void APIENTRY glVertexAttribL3d (GLuint index, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glVertexAttribL4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glVertexAttribL1dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribL2dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribL3dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribL4dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribLPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void APIENTRY glGetVertexAttribLdv (GLuint index, GLenum pname, GLdouble *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DPROC) (GLuint index, GLdouble x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLDVPROC) (GLuint index, GLenum pname, GLdouble *params); -#endif - -#ifndef GL_ARB_viewport_array -#define GL_ARB_viewport_array 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glViewportArrayv (GLuint first, GLsizei count, const GLfloat *v); -GLAPI void APIENTRY glViewportIndexedf (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); -GLAPI void APIENTRY glViewportIndexedfv (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glScissorArrayv (GLuint first, GLsizei count, const GLint *v); -GLAPI void APIENTRY glScissorIndexed (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); -GLAPI void APIENTRY glScissorIndexedv (GLuint index, const GLint *v); -GLAPI void APIENTRY glDepthRangeArrayv (GLuint first, GLsizei count, const GLclampd *v); -GLAPI void APIENTRY glDepthRangeIndexed (GLuint index, GLclampd n, GLclampd f); -GLAPI void APIENTRY glGetFloati_v (GLenum target, GLuint index, GLfloat *data); -GLAPI void APIENTRY glGetDoublei_v (GLenum target, GLuint index, GLdouble *data); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVIEWPORTARRAYVPROC) (GLuint first, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); -typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLSCISSORARRAYVPROC) (GLuint first, GLsizei count, const GLint *v); -typedef void (APIENTRYP PFNGLSCISSORINDEXEDPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLSCISSORINDEXEDVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLDEPTHRANGEARRAYVPROC) (GLuint first, GLsizei count, const GLclampd *v); -typedef void (APIENTRYP PFNGLDEPTHRANGEINDEXEDPROC) (GLuint index, GLclampd n, GLclampd f); -typedef void (APIENTRYP PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat *data); -typedef void (APIENTRYP PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble *data); -#endif - -#ifndef GL_ARB_cl_event -#define GL_ARB_cl_event 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLsync APIENTRY glCreateSyncFromCLeventARB (struct _cl_context * context, struct _cl_event * event, GLbitfield flags); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLsync (APIENTRYP PFNGLCREATESYNCFROMCLEVENTARBPROC) (struct _cl_context * context, struct _cl_event * event, GLbitfield flags); -#endif - -#ifndef GL_ARB_debug_output -#define GL_ARB_debug_output 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDebugMessageControlARB (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -GLAPI void APIENTRY glDebugMessageInsertARB (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); -GLAPI void APIENTRY glDebugMessageCallbackARB (GLDEBUGPROCARB callback, const GLvoid *userParam); -GLAPI GLuint APIENTRY glGetDebugMessageLogARB (GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); -typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, const GLvoid *userParam); -typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); -#endif - -#ifndef GL_ARB_robustness -#define GL_ARB_robustness 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLenum APIENTRY glGetGraphicsResetStatusARB (void); -GLAPI void APIENTRY glGetnMapdvARB (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); -GLAPI void APIENTRY glGetnMapfvARB (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); -GLAPI void APIENTRY glGetnMapivARB (GLenum target, GLenum query, GLsizei bufSize, GLint *v); -GLAPI void APIENTRY glGetnPixelMapfvARB (GLenum map, GLsizei bufSize, GLfloat *values); -GLAPI void APIENTRY glGetnPixelMapuivARB (GLenum map, GLsizei bufSize, GLuint *values); -GLAPI void APIENTRY glGetnPixelMapusvARB (GLenum map, GLsizei bufSize, GLushort *values); -GLAPI void APIENTRY glGetnPolygonStippleARB (GLsizei bufSize, GLubyte *pattern); -GLAPI void APIENTRY glGetnColorTableARB (GLenum target, GLenum format, GLenum type, GLsizei bufSize, GLvoid *table); -GLAPI void APIENTRY glGetnConvolutionFilterARB (GLenum target, GLenum format, GLenum type, GLsizei bufSize, GLvoid *image); -GLAPI void APIENTRY glGetnSeparableFilterARB (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, GLvoid *row, GLsizei columnBufSize, GLvoid *column, GLvoid *span); -GLAPI void APIENTRY glGetnHistogramARB (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, GLvoid *values); -GLAPI void APIENTRY glGetnMinmaxARB (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, GLvoid *values); -GLAPI void APIENTRY glGetnTexImageARB (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, GLvoid *img); -GLAPI void APIENTRY glReadnPixelsARB (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLvoid *data); -GLAPI void APIENTRY glGetnCompressedTexImageARB (GLenum target, GLint lod, GLsizei bufSize, GLvoid *img); -GLAPI void APIENTRY glGetnUniformfvARB (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); -GLAPI void APIENTRY glGetnUniformivARB (GLuint program, GLint location, GLsizei bufSize, GLint *params); -GLAPI void APIENTRY glGetnUniformuivARB (GLuint program, GLint location, GLsizei bufSize, GLuint *params); -GLAPI void APIENTRY glGetnUniformdvARB (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLenum (APIENTRYP PFNGLGETGRAPHICSRESETSTATUSARBPROC) (void); -typedef void (APIENTRYP PFNGLGETNMAPDVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); -typedef void (APIENTRYP PFNGLGETNMAPFVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); -typedef void (APIENTRYP PFNGLGETNMAPIVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint *v); -typedef void (APIENTRYP PFNGLGETNPIXELMAPFVARBPROC) (GLenum map, GLsizei bufSize, GLfloat *values); -typedef void (APIENTRYP PFNGLGETNPIXELMAPUIVARBPROC) (GLenum map, GLsizei bufSize, GLuint *values); -typedef void (APIENTRYP PFNGLGETNPIXELMAPUSVARBPROC) (GLenum map, GLsizei bufSize, GLushort *values); -typedef void (APIENTRYP PFNGLGETNPOLYGONSTIPPLEARBPROC) (GLsizei bufSize, GLubyte *pattern); -typedef void (APIENTRYP PFNGLGETNCOLORTABLEARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, GLvoid *table); -typedef void (APIENTRYP PFNGLGETNCONVOLUTIONFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, GLvoid *image); -typedef void (APIENTRYP PFNGLGETNSEPARABLEFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, GLvoid *row, GLsizei columnBufSize, GLvoid *column, GLvoid *span); -typedef void (APIENTRYP PFNGLGETNHISTOGRAMARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, GLvoid *values); -typedef void (APIENTRYP PFNGLGETNMINMAXARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, GLvoid *values); -typedef void (APIENTRYP PFNGLGETNTEXIMAGEARBPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, GLvoid *img); -typedef void (APIENTRYP PFNGLREADNPIXELSARBPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLvoid *data); -typedef void (APIENTRYP PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, GLsizei bufSize, GLvoid *img); -typedef void (APIENTRYP PFNGLGETNUNIFORMFVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); -typedef void (APIENTRYP PFNGLGETNUNIFORMIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); -typedef void (APIENTRYP PFNGLGETNUNIFORMUIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); -typedef void (APIENTRYP PFNGLGETNUNIFORMDVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); -#endif - -#ifndef GL_ARB_shader_stencil_export -#define GL_ARB_shader_stencil_export 1 -#endif - -#ifndef GL_EXT_abgr -#define GL_EXT_abgr 1 -#endif - -#ifndef GL_EXT_blend_color -#define GL_EXT_blend_color 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendColorEXT (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -#endif - -#ifndef GL_EXT_polygon_offset -#define GL_EXT_polygon_offset 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPolygonOffsetEXT (GLfloat factor, GLfloat bias); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); -#endif - -#ifndef GL_EXT_texture -#define GL_EXT_texture 1 -#endif - -#ifndef GL_EXT_texture3D -#define GL_EXT_texture3D 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexImage3DEXT (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glTexSubImage3DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -#endif - -#ifndef GL_SGIS_texture_filter4 -#define GL_SGIS_texture_filter4 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetTexFilterFuncSGIS (GLenum target, GLenum filter, GLfloat *weights); -GLAPI void APIENTRY glTexFilterFuncSGIS (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat *weights); -typedef void (APIENTRYP PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); -#endif - -#ifndef GL_EXT_subtexture -#define GL_EXT_subtexture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexSubImage1DEXT (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glTexSubImage2DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -#endif - -#ifndef GL_EXT_copy_texture -#define GL_EXT_copy_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCopyTexImage1DEXT (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -GLAPI void APIENTRY glCopyTexImage2DEXT (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -GLAPI void APIENTRY glCopyTexSubImage1DEXT (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glCopyTexSubImage2DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glCopyTexSubImage3DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -typedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -#endif - -#ifndef GL_EXT_histogram -#define GL_EXT_histogram 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetHistogramEXT (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -GLAPI void APIENTRY glGetHistogramParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetHistogramParameterivEXT (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetMinmaxEXT (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -GLAPI void APIENTRY glGetMinmaxParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetMinmaxParameterivEXT (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glHistogramEXT (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -GLAPI void APIENTRY glMinmaxEXT (GLenum target, GLenum internalformat, GLboolean sink); -GLAPI void APIENTRY glResetHistogramEXT (GLenum target); -GLAPI void APIENTRY glResetMinmaxEXT (GLenum target); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -typedef void (APIENTRYP PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); -typedef void (APIENTRYP PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); -typedef void (APIENTRYP PFNGLRESETMINMAXEXTPROC) (GLenum target); -#endif - -#ifndef GL_EXT_convolution -#define GL_EXT_convolution 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glConvolutionFilter1DEXT (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); -GLAPI void APIENTRY glConvolutionFilter2DEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); -GLAPI void APIENTRY glConvolutionParameterfEXT (GLenum target, GLenum pname, GLfloat params); -GLAPI void APIENTRY glConvolutionParameterfvEXT (GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glConvolutionParameteriEXT (GLenum target, GLenum pname, GLint params); -GLAPI void APIENTRY glConvolutionParameterivEXT (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glCopyConvolutionFilter1DEXT (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glCopyConvolutionFilter2DEXT (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glGetConvolutionFilterEXT (GLenum target, GLenum format, GLenum type, GLvoid *image); -GLAPI void APIENTRY glGetConvolutionParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetConvolutionParameterivEXT (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetSeparableFilterEXT (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); -GLAPI void APIENTRY glSeparableFilter2DEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); -typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat params); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint params); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); -typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); -#endif - -#ifndef GL_SGI_color_matrix -#define GL_SGI_color_matrix 1 -#endif - -#ifndef GL_SGI_color_table -#define GL_SGI_color_table 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorTableSGI (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -GLAPI void APIENTRY glColorTableParameterfvSGI (GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glColorTableParameterivSGI (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glCopyColorTableSGI (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glGetColorTableSGI (GLenum target, GLenum format, GLenum type, GLvoid *table); -GLAPI void APIENTRY glGetColorTableParameterfvSGI (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetColorTableParameterivSGI (GLenum target, GLenum pname, GLint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint *params); -#endif - -#ifndef GL_SGIX_pixel_texture -#define GL_SGIX_pixel_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPixelTexGenSGIX (GLenum mode); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); -#endif - -#ifndef GL_SGIS_pixel_texture -#define GL_SGIS_pixel_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPixelTexGenParameteriSGIS (GLenum pname, GLint param); -GLAPI void APIENTRY glPixelTexGenParameterivSGIS (GLenum pname, const GLint *params); -GLAPI void APIENTRY glPixelTexGenParameterfSGIS (GLenum pname, GLfloat param); -GLAPI void APIENTRY glPixelTexGenParameterfvSGIS (GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glGetPixelTexGenParameterivSGIS (GLenum pname, GLint *params); -GLAPI void APIENTRY glGetPixelTexGenParameterfvSGIS (GLenum pname, GLfloat *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERISGISPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFSGISPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, GLfloat *params); -#endif - -#ifndef GL_SGIS_texture4D -#define GL_SGIS_texture4D 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexImage4DSGIS (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glTexSubImage4DSGIS (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid *pixels); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid *pixels); -#endif - -#ifndef GL_SGI_texture_color_table -#define GL_SGI_texture_color_table 1 -#endif - -#ifndef GL_EXT_cmyka -#define GL_EXT_cmyka 1 -#endif - -#ifndef GL_EXT_texture_object -#define GL_EXT_texture_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLboolean APIENTRY glAreTexturesResidentEXT (GLsizei n, const GLuint *textures, GLboolean *residences); -GLAPI void APIENTRY glBindTextureEXT (GLenum target, GLuint texture); -GLAPI void APIENTRY glDeleteTexturesEXT (GLsizei n, const GLuint *textures); -GLAPI void APIENTRY glGenTexturesEXT (GLsizei n, GLuint *textures); -GLAPI GLboolean APIENTRY glIsTextureEXT (GLuint texture); -GLAPI void APIENTRY glPrioritizeTexturesEXT (GLsizei n, const GLuint *textures, const GLclampf *priorities); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLboolean (APIENTRYP PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint *textures, GLboolean *residences); -typedef void (APIENTRYP PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); -typedef void (APIENTRYP PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint *textures); -typedef void (APIENTRYP PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint *textures); -typedef GLboolean (APIENTRYP PFNGLISTEXTUREEXTPROC) (GLuint texture); -typedef void (APIENTRYP PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint *textures, const GLclampf *priorities); -#endif - -#ifndef GL_SGIS_detail_texture -#define GL_SGIS_detail_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDetailTexFuncSGIS (GLenum target, GLsizei n, const GLfloat *points); -GLAPI void APIENTRY glGetDetailTexFuncSGIS (GLenum target, GLfloat *points); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); -typedef void (APIENTRYP PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat *points); -#endif - -#ifndef GL_SGIS_sharpen_texture -#define GL_SGIS_sharpen_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSharpenTexFuncSGIS (GLenum target, GLsizei n, const GLfloat *points); -GLAPI void APIENTRY glGetSharpenTexFuncSGIS (GLenum target, GLfloat *points); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); -typedef void (APIENTRYP PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat *points); -#endif - -#ifndef GL_EXT_packed_pixels -#define GL_EXT_packed_pixels 1 -#endif - -#ifndef GL_SGIS_texture_lod -#define GL_SGIS_texture_lod 1 -#endif - -#ifndef GL_SGIS_multisample -#define GL_SGIS_multisample 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSampleMaskSGIS (GLclampf value, GLboolean invert); -GLAPI void APIENTRY glSamplePatternSGIS (GLenum pattern); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); -typedef void (APIENTRYP PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); -#endif - -#ifndef GL_EXT_rescale_normal -#define GL_EXT_rescale_normal 1 -#endif - -#ifndef GL_EXT_vertex_array -#define GL_EXT_vertex_array 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glArrayElementEXT (GLint i); -GLAPI void APIENTRY glColorPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -GLAPI void APIENTRY glDrawArraysEXT (GLenum mode, GLint first, GLsizei count); -GLAPI void APIENTRY glEdgeFlagPointerEXT (GLsizei stride, GLsizei count, const GLboolean *pointer); -GLAPI void APIENTRY glGetPointervEXT (GLenum pname, GLvoid* *params); -GLAPI void APIENTRY glIndexPointerEXT (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -GLAPI void APIENTRY glNormalPointerEXT (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -GLAPI void APIENTRY glTexCoordPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -GLAPI void APIENTRY glVertexPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLARRAYELEMENTEXTPROC) (GLint i); -typedef void (APIENTRYP PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); -typedef void (APIENTRYP PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean *pointer); -typedef void (APIENTRYP PFNGLGETPOINTERVEXTPROC) (GLenum pname, GLvoid* *params); -typedef void (APIENTRYP PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -#endif - -#ifndef GL_EXT_misc_attribute -#define GL_EXT_misc_attribute 1 -#endif - -#ifndef GL_SGIS_generate_mipmap -#define GL_SGIS_generate_mipmap 1 -#endif - -#ifndef GL_SGIX_clipmap -#define GL_SGIX_clipmap 1 -#endif - -#ifndef GL_SGIX_shadow -#define GL_SGIX_shadow 1 -#endif - -#ifndef GL_SGIS_texture_edge_clamp -#define GL_SGIS_texture_edge_clamp 1 -#endif - -#ifndef GL_SGIS_texture_border_clamp -#define GL_SGIS_texture_border_clamp 1 -#endif - -#ifndef GL_EXT_blend_minmax -#define GL_EXT_blend_minmax 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendEquationEXT (GLenum mode); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); -#endif - -#ifndef GL_EXT_blend_subtract -#define GL_EXT_blend_subtract 1 -#endif - -#ifndef GL_EXT_blend_logic_op -#define GL_EXT_blend_logic_op 1 -#endif - -#ifndef GL_SGIX_interlace -#define GL_SGIX_interlace 1 -#endif - -#ifndef GL_SGIX_pixel_tiles -#define GL_SGIX_pixel_tiles 1 -#endif - -#ifndef GL_SGIX_texture_select -#define GL_SGIX_texture_select 1 -#endif - -#ifndef GL_SGIX_sprite -#define GL_SGIX_sprite 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSpriteParameterfSGIX (GLenum pname, GLfloat param); -GLAPI void APIENTRY glSpriteParameterfvSGIX (GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glSpriteParameteriSGIX (GLenum pname, GLint param); -GLAPI void APIENTRY glSpriteParameterivSGIX (GLenum pname, const GLint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, const GLint *params); -#endif - -#ifndef GL_SGIX_texture_multi_buffer -#define GL_SGIX_texture_multi_buffer 1 -#endif - -#ifndef GL_EXT_point_parameters -#define GL_EXT_point_parameters 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPointParameterfEXT (GLenum pname, GLfloat param); -GLAPI void APIENTRY glPointParameterfvEXT (GLenum pname, const GLfloat *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params); -#endif - -#ifndef GL_SGIS_point_parameters -#define GL_SGIS_point_parameters 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPointParameterfSGIS (GLenum pname, GLfloat param); -GLAPI void APIENTRY glPointParameterfvSGIS (GLenum pname, const GLfloat *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPOINTPARAMETERFSGISPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); -#endif - -#ifndef GL_SGIX_instruments -#define GL_SGIX_instruments 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLint APIENTRY glGetInstrumentsSGIX (void); -GLAPI void APIENTRY glInstrumentsBufferSGIX (GLsizei size, GLint *buffer); -GLAPI GLint APIENTRY glPollInstrumentsSGIX (GLint *marker_p); -GLAPI void APIENTRY glReadInstrumentsSGIX (GLint marker); -GLAPI void APIENTRY glStartInstrumentsSGIX (void); -GLAPI void APIENTRY glStopInstrumentsSGIX (GLint marker); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLint (APIENTRYP PFNGLGETINSTRUMENTSSGIXPROC) (void); -typedef void (APIENTRYP PFNGLINSTRUMENTSBUFFERSGIXPROC) (GLsizei size, GLint *buffer); -typedef GLint (APIENTRYP PFNGLPOLLINSTRUMENTSSGIXPROC) (GLint *marker_p); -typedef void (APIENTRYP PFNGLREADINSTRUMENTSSGIXPROC) (GLint marker); -typedef void (APIENTRYP PFNGLSTARTINSTRUMENTSSGIXPROC) (void); -typedef void (APIENTRYP PFNGLSTOPINSTRUMENTSSGIXPROC) (GLint marker); -#endif - -#ifndef GL_SGIX_texture_scale_bias -#define GL_SGIX_texture_scale_bias 1 -#endif - -#ifndef GL_SGIX_framezoom -#define GL_SGIX_framezoom 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFrameZoomSGIX (GLint factor); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFRAMEZOOMSGIXPROC) (GLint factor); -#endif - -#ifndef GL_SGIX_tag_sample_buffer -#define GL_SGIX_tag_sample_buffer 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTagSampleBufferSGIX (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); -#endif - -#ifndef GL_SGIX_polynomial_ffd -#define GL_SGIX_polynomial_ffd 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDeformationMap3dSGIX (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); -GLAPI void APIENTRY glDeformationMap3fSGIX (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); -GLAPI void APIENTRY glDeformSGIX (GLbitfield mask); -GLAPI void APIENTRY glLoadIdentityDeformationMapSGIX (GLbitfield mask); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDEFORMATIONMAP3DSGIXPROC) (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); -typedef void (APIENTRYP PFNGLDEFORMATIONMAP3FSGIXPROC) (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); -typedef void (APIENTRYP PFNGLDEFORMSGIXPROC) (GLbitfield mask); -typedef void (APIENTRYP PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mask); -#endif - -#ifndef GL_SGIX_reference_plane -#define GL_SGIX_reference_plane 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glReferencePlaneSGIX (const GLdouble *equation); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLREFERENCEPLANESGIXPROC) (const GLdouble *equation); -#endif - -#ifndef GL_SGIX_flush_raster -#define GL_SGIX_flush_raster 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFlushRasterSGIX (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFLUSHRASTERSGIXPROC) (void); -#endif - -#ifndef GL_SGIX_depth_texture -#define GL_SGIX_depth_texture 1 -#endif - -#ifndef GL_SGIS_fog_function -#define GL_SGIS_fog_function 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFogFuncSGIS (GLsizei n, const GLfloat *points); -GLAPI void APIENTRY glGetFogFuncSGIS (GLfloat *points); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat *points); -typedef void (APIENTRYP PFNGLGETFOGFUNCSGISPROC) (GLfloat *points); -#endif - -#ifndef GL_SGIX_fog_offset -#define GL_SGIX_fog_offset 1 -#endif - -#ifndef GL_HP_image_transform -#define GL_HP_image_transform 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glImageTransformParameteriHP (GLenum target, GLenum pname, GLint param); -GLAPI void APIENTRY glImageTransformParameterfHP (GLenum target, GLenum pname, GLfloat param); -GLAPI void APIENTRY glImageTransformParameterivHP (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glImageTransformParameterfvHP (GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glGetImageTransformParameterivHP (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetImageTransformParameterfvHP (GLenum target, GLenum pname, GLfloat *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, GLfloat *params); -#endif - -#ifndef GL_HP_convolution_border_modes -#define GL_HP_convolution_border_modes 1 -#endif - -#ifndef GL_SGIX_texture_add_env -#define GL_SGIX_texture_add_env 1 -#endif - -#ifndef GL_EXT_color_subtable -#define GL_EXT_color_subtable 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorSubTableEXT (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); -GLAPI void APIENTRY glCopyColorSubTableEXT (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); -#endif - -#ifndef GL_PGI_vertex_hints -#define GL_PGI_vertex_hints 1 -#endif - -#ifndef GL_PGI_misc_hints -#define GL_PGI_misc_hints 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glHintPGI (GLenum target, GLint mode); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLHINTPGIPROC) (GLenum target, GLint mode); -#endif - -#ifndef GL_EXT_paletted_texture -#define GL_EXT_paletted_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorTableEXT (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -GLAPI void APIENTRY glGetColorTableEXT (GLenum target, GLenum format, GLenum type, GLvoid *data); -GLAPI void APIENTRY glGetColorTableParameterivEXT (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetColorTableParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -typedef void (APIENTRYP PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *data); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -#endif - -#ifndef GL_EXT_clip_volume_hint -#define GL_EXT_clip_volume_hint 1 -#endif - -#ifndef GL_SGIX_list_priority -#define GL_SGIX_list_priority 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetListParameterfvSGIX (GLuint list, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetListParameterivSGIX (GLuint list, GLenum pname, GLint *params); -GLAPI void APIENTRY glListParameterfSGIX (GLuint list, GLenum pname, GLfloat param); -GLAPI void APIENTRY glListParameterfvSGIX (GLuint list, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glListParameteriSGIX (GLuint list, GLenum pname, GLint param); -GLAPI void APIENTRY glListParameterivSGIX (GLuint list, GLenum pname, const GLint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLLISTPARAMETERFSGIXPROC) (GLuint list, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLLISTPARAMETERISGIXPROC) (GLuint list, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, const GLint *params); -#endif - -#ifndef GL_SGIX_ir_instrument1 -#define GL_SGIX_ir_instrument1 1 -#endif - -#ifndef GL_SGIX_calligraphic_fragment -#define GL_SGIX_calligraphic_fragment 1 -#endif - -#ifndef GL_SGIX_texture_lod_bias -#define GL_SGIX_texture_lod_bias 1 -#endif - -#ifndef GL_SGIX_shadow_ambient -#define GL_SGIX_shadow_ambient 1 -#endif - -#ifndef GL_EXT_index_texture -#define GL_EXT_index_texture 1 -#endif - -#ifndef GL_EXT_index_material -#define GL_EXT_index_material 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glIndexMaterialEXT (GLenum face, GLenum mode); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); -#endif - -#ifndef GL_EXT_index_func -#define GL_EXT_index_func 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glIndexFuncEXT (GLenum func, GLclampf ref); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLINDEXFUNCEXTPROC) (GLenum func, GLclampf ref); -#endif - -#ifndef GL_EXT_index_array_formats -#define GL_EXT_index_array_formats 1 -#endif - -#ifndef GL_EXT_compiled_vertex_array -#define GL_EXT_compiled_vertex_array 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glLockArraysEXT (GLint first, GLsizei count); -GLAPI void APIENTRY glUnlockArraysEXT (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); -typedef void (APIENTRYP PFNGLUNLOCKARRAYSEXTPROC) (void); -#endif - -#ifndef GL_EXT_cull_vertex -#define GL_EXT_cull_vertex 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCullParameterdvEXT (GLenum pname, GLdouble *params); -GLAPI void APIENTRY glCullParameterfvEXT (GLenum pname, GLfloat *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat *params); -#endif - -#ifndef GL_SGIX_ycrcb -#define GL_SGIX_ycrcb 1 -#endif - -#ifndef GL_SGIX_fragment_lighting -#define GL_SGIX_fragment_lighting 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFragmentColorMaterialSGIX (GLenum face, GLenum mode); -GLAPI void APIENTRY glFragmentLightfSGIX (GLenum light, GLenum pname, GLfloat param); -GLAPI void APIENTRY glFragmentLightfvSGIX (GLenum light, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glFragmentLightiSGIX (GLenum light, GLenum pname, GLint param); -GLAPI void APIENTRY glFragmentLightivSGIX (GLenum light, GLenum pname, const GLint *params); -GLAPI void APIENTRY glFragmentLightModelfSGIX (GLenum pname, GLfloat param); -GLAPI void APIENTRY glFragmentLightModelfvSGIX (GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glFragmentLightModeliSGIX (GLenum pname, GLint param); -GLAPI void APIENTRY glFragmentLightModelivSGIX (GLenum pname, const GLint *params); -GLAPI void APIENTRY glFragmentMaterialfSGIX (GLenum face, GLenum pname, GLfloat param); -GLAPI void APIENTRY glFragmentMaterialfvSGIX (GLenum face, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glFragmentMaterialiSGIX (GLenum face, GLenum pname, GLint param); -GLAPI void APIENTRY glFragmentMaterialivSGIX (GLenum face, GLenum pname, const GLint *params); -GLAPI void APIENTRY glGetFragmentLightfvSGIX (GLenum light, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetFragmentLightivSGIX (GLenum light, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetFragmentMaterialfvSGIX (GLenum face, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetFragmentMaterialivSGIX (GLenum face, GLenum pname, GLint *params); -GLAPI void APIENTRY glLightEnviSGIX (GLenum pname, GLint param); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLLIGHTENVISGIXPROC) (GLenum pname, GLint param); -#endif - -#ifndef GL_IBM_rasterpos_clip -#define GL_IBM_rasterpos_clip 1 -#endif - -#ifndef GL_HP_texture_lighting -#define GL_HP_texture_lighting 1 -#endif - -#ifndef GL_EXT_draw_range_elements -#define GL_EXT_draw_range_elements 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawRangeElementsEXT (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); -#endif - -#ifndef GL_WIN_phong_shading -#define GL_WIN_phong_shading 1 -#endif - -#ifndef GL_WIN_specular_fog -#define GL_WIN_specular_fog 1 -#endif - -#ifndef GL_EXT_light_texture -#define GL_EXT_light_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glApplyTextureEXT (GLenum mode); -GLAPI void APIENTRY glTextureLightEXT (GLenum pname); -GLAPI void APIENTRY glTextureMaterialEXT (GLenum face, GLenum mode); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); -typedef void (APIENTRYP PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); -typedef void (APIENTRYP PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); -#endif - -#ifndef GL_SGIX_blend_alpha_minmax -#define GL_SGIX_blend_alpha_minmax 1 -#endif - -#ifndef GL_EXT_bgra -#define GL_EXT_bgra 1 -#endif - -#ifndef GL_SGIX_async -#define GL_SGIX_async 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glAsyncMarkerSGIX (GLuint marker); -GLAPI GLint APIENTRY glFinishAsyncSGIX (GLuint *markerp); -GLAPI GLint APIENTRY glPollAsyncSGIX (GLuint *markerp); -GLAPI GLuint APIENTRY glGenAsyncMarkersSGIX (GLsizei range); -GLAPI void APIENTRY glDeleteAsyncMarkersSGIX (GLuint marker, GLsizei range); -GLAPI GLboolean APIENTRY glIsAsyncMarkerSGIX (GLuint marker); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLASYNCMARKERSGIXPROC) (GLuint marker); -typedef GLint (APIENTRYP PFNGLFINISHASYNCSGIXPROC) (GLuint *markerp); -typedef GLint (APIENTRYP PFNGLPOLLASYNCSGIXPROC) (GLuint *markerp); -typedef GLuint (APIENTRYP PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); -typedef void (APIENTRYP PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); -typedef GLboolean (APIENTRYP PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); -#endif - -#ifndef GL_SGIX_async_pixel -#define GL_SGIX_async_pixel 1 -#endif - -#ifndef GL_SGIX_async_histogram -#define GL_SGIX_async_histogram 1 -#endif - -#ifndef GL_INTEL_parallel_arrays -#define GL_INTEL_parallel_arrays 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexPointervINTEL (GLint size, GLenum type, const GLvoid* *pointer); -GLAPI void APIENTRY glNormalPointervINTEL (GLenum type, const GLvoid* *pointer); -GLAPI void APIENTRY glColorPointervINTEL (GLint size, GLenum type, const GLvoid* *pointer); -GLAPI void APIENTRY glTexCoordPointervINTEL (GLint size, GLenum type, const GLvoid* *pointer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); -typedef void (APIENTRYP PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const GLvoid* *pointer); -typedef void (APIENTRYP PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); -typedef void (APIENTRYP PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); -#endif - -#ifndef GL_HP_occlusion_test -#define GL_HP_occlusion_test 1 -#endif - -#ifndef GL_EXT_pixel_transform -#define GL_EXT_pixel_transform 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPixelTransformParameteriEXT (GLenum target, GLenum pname, GLint param); -GLAPI void APIENTRY glPixelTransformParameterfEXT (GLenum target, GLenum pname, GLfloat param); -GLAPI void APIENTRY glPixelTransformParameterivEXT (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glPixelTransformParameterfvEXT (GLenum target, GLenum pname, const GLfloat *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); -#endif - -#ifndef GL_EXT_pixel_transform_color_table -#define GL_EXT_pixel_transform_color_table 1 -#endif - -#ifndef GL_EXT_shared_texture_palette -#define GL_EXT_shared_texture_palette 1 -#endif - -#ifndef GL_EXT_separate_specular_color -#define GL_EXT_separate_specular_color 1 -#endif - -#ifndef GL_EXT_secondary_color -#define GL_EXT_secondary_color 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSecondaryColor3bEXT (GLbyte red, GLbyte green, GLbyte blue); -GLAPI void APIENTRY glSecondaryColor3bvEXT (const GLbyte *v); -GLAPI void APIENTRY glSecondaryColor3dEXT (GLdouble red, GLdouble green, GLdouble blue); -GLAPI void APIENTRY glSecondaryColor3dvEXT (const GLdouble *v); -GLAPI void APIENTRY glSecondaryColor3fEXT (GLfloat red, GLfloat green, GLfloat blue); -GLAPI void APIENTRY glSecondaryColor3fvEXT (const GLfloat *v); -GLAPI void APIENTRY glSecondaryColor3iEXT (GLint red, GLint green, GLint blue); -GLAPI void APIENTRY glSecondaryColor3ivEXT (const GLint *v); -GLAPI void APIENTRY glSecondaryColor3sEXT (GLshort red, GLshort green, GLshort blue); -GLAPI void APIENTRY glSecondaryColor3svEXT (const GLshort *v); -GLAPI void APIENTRY glSecondaryColor3ubEXT (GLubyte red, GLubyte green, GLubyte blue); -GLAPI void APIENTRY glSecondaryColor3ubvEXT (const GLubyte *v); -GLAPI void APIENTRY glSecondaryColor3uiEXT (GLuint red, GLuint green, GLuint blue); -GLAPI void APIENTRY glSecondaryColor3uivEXT (const GLuint *v); -GLAPI void APIENTRY glSecondaryColor3usEXT (GLushort red, GLushort green, GLushort blue); -GLAPI void APIENTRY glSecondaryColor3usvEXT (const GLushort *v); -GLAPI void APIENTRY glSecondaryColorPointerEXT (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_EXT_texture_perturb_normal -#define GL_EXT_texture_perturb_normal 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTextureNormalEXT (GLenum mode); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXTURENORMALEXTPROC) (GLenum mode); -#endif - -#ifndef GL_EXT_multi_draw_arrays -#define GL_EXT_multi_draw_arrays 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMultiDrawArraysEXT (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); -GLAPI void APIENTRY glMultiDrawElementsEXT (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); -#endif - -#ifndef GL_EXT_fog_coord -#define GL_EXT_fog_coord 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFogCoordfEXT (GLfloat coord); -GLAPI void APIENTRY glFogCoordfvEXT (const GLfloat *coord); -GLAPI void APIENTRY glFogCoorddEXT (GLdouble coord); -GLAPI void APIENTRY glFogCoorddvEXT (const GLdouble *coord); -GLAPI void APIENTRY glFogCoordPointerEXT (GLenum type, GLsizei stride, const GLvoid *pointer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFOGCOORDFEXTPROC) (GLfloat coord); -typedef void (APIENTRYP PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); -typedef void (APIENTRYP PFNGLFOGCOORDDEXTPROC) (GLdouble coord); -typedef void (APIENTRYP PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); -typedef void (APIENTRYP PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_REND_screen_coordinates -#define GL_REND_screen_coordinates 1 -#endif - -#ifndef GL_EXT_coordinate_frame -#define GL_EXT_coordinate_frame 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTangent3bEXT (GLbyte tx, GLbyte ty, GLbyte tz); -GLAPI void APIENTRY glTangent3bvEXT (const GLbyte *v); -GLAPI void APIENTRY glTangent3dEXT (GLdouble tx, GLdouble ty, GLdouble tz); -GLAPI void APIENTRY glTangent3dvEXT (const GLdouble *v); -GLAPI void APIENTRY glTangent3fEXT (GLfloat tx, GLfloat ty, GLfloat tz); -GLAPI void APIENTRY glTangent3fvEXT (const GLfloat *v); -GLAPI void APIENTRY glTangent3iEXT (GLint tx, GLint ty, GLint tz); -GLAPI void APIENTRY glTangent3ivEXT (const GLint *v); -GLAPI void APIENTRY glTangent3sEXT (GLshort tx, GLshort ty, GLshort tz); -GLAPI void APIENTRY glTangent3svEXT (const GLshort *v); -GLAPI void APIENTRY glBinormal3bEXT (GLbyte bx, GLbyte by, GLbyte bz); -GLAPI void APIENTRY glBinormal3bvEXT (const GLbyte *v); -GLAPI void APIENTRY glBinormal3dEXT (GLdouble bx, GLdouble by, GLdouble bz); -GLAPI void APIENTRY glBinormal3dvEXT (const GLdouble *v); -GLAPI void APIENTRY glBinormal3fEXT (GLfloat bx, GLfloat by, GLfloat bz); -GLAPI void APIENTRY glBinormal3fvEXT (const GLfloat *v); -GLAPI void APIENTRY glBinormal3iEXT (GLint bx, GLint by, GLint bz); -GLAPI void APIENTRY glBinormal3ivEXT (const GLint *v); -GLAPI void APIENTRY glBinormal3sEXT (GLshort bx, GLshort by, GLshort bz); -GLAPI void APIENTRY glBinormal3svEXT (const GLshort *v); -GLAPI void APIENTRY glTangentPointerEXT (GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void APIENTRY glBinormalPointerEXT (GLenum type, GLsizei stride, const GLvoid *pointer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTANGENT3BEXTPROC) (GLbyte tx, GLbyte ty, GLbyte tz); -typedef void (APIENTRYP PFNGLTANGENT3BVEXTPROC) (const GLbyte *v); -typedef void (APIENTRYP PFNGLTANGENT3DEXTPROC) (GLdouble tx, GLdouble ty, GLdouble tz); -typedef void (APIENTRYP PFNGLTANGENT3DVEXTPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLTANGENT3FEXTPROC) (GLfloat tx, GLfloat ty, GLfloat tz); -typedef void (APIENTRYP PFNGLTANGENT3FVEXTPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLTANGENT3IEXTPROC) (GLint tx, GLint ty, GLint tz); -typedef void (APIENTRYP PFNGLTANGENT3IVEXTPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLTANGENT3SEXTPROC) (GLshort tx, GLshort ty, GLshort tz); -typedef void (APIENTRYP PFNGLTANGENT3SVEXTPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLBINORMAL3BEXTPROC) (GLbyte bx, GLbyte by, GLbyte bz); -typedef void (APIENTRYP PFNGLBINORMAL3BVEXTPROC) (const GLbyte *v); -typedef void (APIENTRYP PFNGLBINORMAL3DEXTPROC) (GLdouble bx, GLdouble by, GLdouble bz); -typedef void (APIENTRYP PFNGLBINORMAL3DVEXTPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLBINORMAL3FEXTPROC) (GLfloat bx, GLfloat by, GLfloat bz); -typedef void (APIENTRYP PFNGLBINORMAL3FVEXTPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLBINORMAL3IEXTPROC) (GLint bx, GLint by, GLint bz); -typedef void (APIENTRYP PFNGLBINORMAL3IVEXTPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLBINORMAL3SEXTPROC) (GLshort bx, GLshort by, GLshort bz); -typedef void (APIENTRYP PFNGLBINORMAL3SVEXTPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_EXT_texture_env_combine -#define GL_EXT_texture_env_combine 1 -#endif - -#ifndef GL_APPLE_specular_vector -#define GL_APPLE_specular_vector 1 -#endif - -#ifndef GL_APPLE_transform_hint -#define GL_APPLE_transform_hint 1 -#endif - -#ifndef GL_SGIX_fog_scale -#define GL_SGIX_fog_scale 1 -#endif - -#ifndef GL_SUNX_constant_data -#define GL_SUNX_constant_data 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFinishTextureSUNX (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFINISHTEXTURESUNXPROC) (void); -#endif - -#ifndef GL_SUN_global_alpha -#define GL_SUN_global_alpha 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGlobalAlphaFactorbSUN (GLbyte factor); -GLAPI void APIENTRY glGlobalAlphaFactorsSUN (GLshort factor); -GLAPI void APIENTRY glGlobalAlphaFactoriSUN (GLint factor); -GLAPI void APIENTRY glGlobalAlphaFactorfSUN (GLfloat factor); -GLAPI void APIENTRY glGlobalAlphaFactordSUN (GLdouble factor); -GLAPI void APIENTRY glGlobalAlphaFactorubSUN (GLubyte factor); -GLAPI void APIENTRY glGlobalAlphaFactorusSUN (GLushort factor); -GLAPI void APIENTRY glGlobalAlphaFactoruiSUN (GLuint factor); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); -#endif - -#ifndef GL_SUN_triangle_list -#define GL_SUN_triangle_list 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glReplacementCodeuiSUN (GLuint code); -GLAPI void APIENTRY glReplacementCodeusSUN (GLushort code); -GLAPI void APIENTRY glReplacementCodeubSUN (GLubyte code); -GLAPI void APIENTRY glReplacementCodeuivSUN (const GLuint *code); -GLAPI void APIENTRY glReplacementCodeusvSUN (const GLushort *code); -GLAPI void APIENTRY glReplacementCodeubvSUN (const GLubyte *code); -GLAPI void APIENTRY glReplacementCodePointerSUN (GLenum type, GLsizei stride, const GLvoid* *pointer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint *code); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort *code); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte *code); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const GLvoid* *pointer); -#endif - -#ifndef GL_SUN_vertex -#define GL_SUN_vertex 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColor4ubVertex2fSUN (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); -GLAPI void APIENTRY glColor4ubVertex2fvSUN (const GLubyte *c, const GLfloat *v); -GLAPI void APIENTRY glColor4ubVertex3fSUN (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glColor4ubVertex3fvSUN (const GLubyte *c, const GLfloat *v); -GLAPI void APIENTRY glColor3fVertex3fSUN (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glColor3fVertex3fvSUN (const GLfloat *c, const GLfloat *v); -GLAPI void APIENTRY glNormal3fVertex3fSUN (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glNormal3fVertex3fvSUN (const GLfloat *n, const GLfloat *v); -GLAPI void APIENTRY glColor4fNormal3fVertex3fSUN (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glColor4fNormal3fVertex3fvSUN (const GLfloat *c, const GLfloat *n, const GLfloat *v); -GLAPI void APIENTRY glTexCoord2fVertex3fSUN (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glTexCoord2fVertex3fvSUN (const GLfloat *tc, const GLfloat *v); -GLAPI void APIENTRY glTexCoord4fVertex4fSUN (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glTexCoord4fVertex4fvSUN (const GLfloat *tc, const GLfloat *v); -GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fSUN (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fvSUN (const GLfloat *tc, const GLubyte *c, const GLfloat *v); -GLAPI void APIENTRY glTexCoord2fColor3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glTexCoord2fColor3fVertex3fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *v); -GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fvSUN (const GLfloat *tc, const GLfloat *n, const GLfloat *v); -GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fSUN (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -GLAPI void APIENTRY glReplacementCodeuiVertex3fSUN (GLuint rc, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glReplacementCodeuiVertex3fvSUN (const GLuint *rc, const GLfloat *v); -GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fSUN (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fvSUN (const GLuint *rc, const GLubyte *c, const GLfloat *v); -GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fSUN (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fvSUN (const GLuint *rc, const GLfloat *c, const GLfloat *v); -GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fSUN (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *n, const GLfloat *v); -GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fSUN (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *v); -GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); -GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat *tc, const GLubyte *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint *rc, const GLubyte *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -#endif - -#ifndef GL_EXT_blend_func_separate -#define GL_EXT_blend_func_separate 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendFuncSeparateEXT (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -#endif - -#ifndef GL_INGR_blend_func_separate -#define GL_INGR_blend_func_separate 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendFuncSeparateINGR (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINGRPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -#endif - -#ifndef GL_INGR_color_clamp -#define GL_INGR_color_clamp 1 -#endif - -#ifndef GL_INGR_interlace_read -#define GL_INGR_interlace_read 1 -#endif - -#ifndef GL_EXT_stencil_wrap -#define GL_EXT_stencil_wrap 1 -#endif - -#ifndef GL_EXT_422_pixels -#define GL_EXT_422_pixels 1 -#endif - -#ifndef GL_NV_texgen_reflection -#define GL_NV_texgen_reflection 1 -#endif - -#ifndef GL_SUN_convolution_border_modes -#define GL_SUN_convolution_border_modes 1 -#endif - -#ifndef GL_EXT_texture_env_add -#define GL_EXT_texture_env_add 1 -#endif - -#ifndef GL_EXT_texture_lod_bias -#define GL_EXT_texture_lod_bias 1 -#endif - -#ifndef GL_EXT_texture_filter_anisotropic -#define GL_EXT_texture_filter_anisotropic 1 -#endif - -#ifndef GL_EXT_vertex_weighting -#define GL_EXT_vertex_weighting 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexWeightfEXT (GLfloat weight); -GLAPI void APIENTRY glVertexWeightfvEXT (const GLfloat *weight); -GLAPI void APIENTRY glVertexWeightPointerEXT (GLsizei size, GLenum type, GLsizei stride, const GLvoid *pointer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); -typedef void (APIENTRYP PFNGLVERTEXWEIGHTFVEXTPROC) (const GLfloat *weight); -typedef void (APIENTRYP PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLsizei size, GLenum type, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_NV_light_max_exponent -#define GL_NV_light_max_exponent 1 -#endif - -#ifndef GL_NV_vertex_array_range -#define GL_NV_vertex_array_range 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFlushVertexArrayRangeNV (void); -GLAPI void APIENTRY glVertexArrayRangeNV (GLsizei length, const GLvoid *pointer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); -typedef void (APIENTRYP PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, const GLvoid *pointer); -#endif - -#ifndef GL_NV_register_combiners -#define GL_NV_register_combiners 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCombinerParameterfvNV (GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glCombinerParameterfNV (GLenum pname, GLfloat param); -GLAPI void APIENTRY glCombinerParameterivNV (GLenum pname, const GLint *params); -GLAPI void APIENTRY glCombinerParameteriNV (GLenum pname, GLint param); -GLAPI void APIENTRY glCombinerInputNV (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -GLAPI void APIENTRY glCombinerOutputNV (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); -GLAPI void APIENTRY glFinalCombinerInputNV (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -GLAPI void APIENTRY glGetCombinerInputParameterfvNV (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetCombinerInputParameterivNV (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetCombinerOutputParameterfvNV (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetCombinerOutputParameterivNV (GLenum stage, GLenum portion, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetFinalCombinerInputParameterfvNV (GLenum variable, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetFinalCombinerInputParameterivNV (GLenum variable, GLenum pname, GLint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -typedef void (APIENTRYP PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); -typedef void (APIENTRYP PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint *params); -#endif - -#ifndef GL_NV_fog_distance -#define GL_NV_fog_distance 1 -#endif - -#ifndef GL_NV_texgen_emboss -#define GL_NV_texgen_emboss 1 -#endif - -#ifndef GL_NV_blend_square -#define GL_NV_blend_square 1 -#endif - -#ifndef GL_NV_texture_env_combine4 -#define GL_NV_texture_env_combine4 1 -#endif - -#ifndef GL_MESA_resize_buffers -#define GL_MESA_resize_buffers 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glResizeBuffersMESA (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLRESIZEBUFFERSMESAPROC) (void); -#endif - -#ifndef GL_MESA_window_pos -#define GL_MESA_window_pos 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glWindowPos2dMESA (GLdouble x, GLdouble y); -GLAPI void APIENTRY glWindowPos2dvMESA (const GLdouble *v); -GLAPI void APIENTRY glWindowPos2fMESA (GLfloat x, GLfloat y); -GLAPI void APIENTRY glWindowPos2fvMESA (const GLfloat *v); -GLAPI void APIENTRY glWindowPos2iMESA (GLint x, GLint y); -GLAPI void APIENTRY glWindowPos2ivMESA (const GLint *v); -GLAPI void APIENTRY glWindowPos2sMESA (GLshort x, GLshort y); -GLAPI void APIENTRY glWindowPos2svMESA (const GLshort *v); -GLAPI void APIENTRY glWindowPos3dMESA (GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glWindowPos3dvMESA (const GLdouble *v); -GLAPI void APIENTRY glWindowPos3fMESA (GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glWindowPos3fvMESA (const GLfloat *v); -GLAPI void APIENTRY glWindowPos3iMESA (GLint x, GLint y, GLint z); -GLAPI void APIENTRY glWindowPos3ivMESA (const GLint *v); -GLAPI void APIENTRY glWindowPos3sMESA (GLshort x, GLshort y, GLshort z); -GLAPI void APIENTRY glWindowPos3svMESA (const GLshort *v); -GLAPI void APIENTRY glWindowPos4dMESA (GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glWindowPos4dvMESA (const GLdouble *v); -GLAPI void APIENTRY glWindowPos4fMESA (GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glWindowPos4fvMESA (const GLfloat *v); -GLAPI void APIENTRY glWindowPos4iMESA (GLint x, GLint y, GLint z, GLint w); -GLAPI void APIENTRY glWindowPos4ivMESA (const GLint *v); -GLAPI void APIENTRY glWindowPos4sMESA (GLshort x, GLshort y, GLshort z, GLshort w); -GLAPI void APIENTRY glWindowPos4svMESA (const GLshort *v); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); -typedef void (APIENTRYP PFNGLWINDOWPOS2IVMESAPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLWINDOWPOS2SVMESAPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); -typedef void (APIENTRYP PFNGLWINDOWPOS3IVMESAPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLWINDOWPOS3SVMESAPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRYP PFNGLWINDOWPOS4IVMESAPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (APIENTRYP PFNGLWINDOWPOS4SVMESAPROC) (const GLshort *v); -#endif - -#ifndef GL_IBM_cull_vertex -#define GL_IBM_cull_vertex 1 -#endif - -#ifndef GL_IBM_multimode_draw_arrays -#define GL_IBM_multimode_draw_arrays 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMultiModeDrawArraysIBM (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); -GLAPI void APIENTRY glMultiModeDrawElementsIBM (const GLenum *mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei primcount, GLint modestride); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); -typedef void (APIENTRYP PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum *mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei primcount, GLint modestride); -#endif - -#ifndef GL_IBM_vertex_array_lists -#define GL_IBM_vertex_array_lists 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorPointerListIBM (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -GLAPI void APIENTRY glSecondaryColorPointerListIBM (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -GLAPI void APIENTRY glEdgeFlagPointerListIBM (GLint stride, const GLboolean* *pointer, GLint ptrstride); -GLAPI void APIENTRY glFogCoordPointerListIBM (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -GLAPI void APIENTRY glIndexPointerListIBM (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -GLAPI void APIENTRY glNormalPointerListIBM (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -GLAPI void APIENTRY glTexCoordPointerListIBM (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -GLAPI void APIENTRY glVertexPointerListIBM (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean* *pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -#endif - -#ifndef GL_SGIX_subsample -#define GL_SGIX_subsample 1 -#endif - -#ifndef GL_SGIX_ycrcba -#define GL_SGIX_ycrcba 1 -#endif - -#ifndef GL_SGIX_ycrcb_subsample -#define GL_SGIX_ycrcb_subsample 1 -#endif - -#ifndef GL_SGIX_depth_pass_instrument -#define GL_SGIX_depth_pass_instrument 1 -#endif - -#ifndef GL_3DFX_texture_compression_FXT1 -#define GL_3DFX_texture_compression_FXT1 1 -#endif - -#ifndef GL_3DFX_multisample -#define GL_3DFX_multisample 1 -#endif - -#ifndef GL_3DFX_tbuffer -#define GL_3DFX_tbuffer 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTbufferMask3DFX (GLuint mask); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); -#endif - -#ifndef GL_EXT_multisample -#define GL_EXT_multisample 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSampleMaskEXT (GLclampf value, GLboolean invert); -GLAPI void APIENTRY glSamplePatternEXT (GLenum pattern); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); -typedef void (APIENTRYP PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); -#endif - -#ifndef GL_SGIX_vertex_preclip -#define GL_SGIX_vertex_preclip 1 -#endif - -#ifndef GL_SGIX_convolution_accuracy -#define GL_SGIX_convolution_accuracy 1 -#endif - -#ifndef GL_SGIX_resample -#define GL_SGIX_resample 1 -#endif - -#ifndef GL_SGIS_point_line_texgen -#define GL_SGIS_point_line_texgen 1 -#endif - -#ifndef GL_SGIS_texture_color_mask -#define GL_SGIS_texture_color_mask 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTextureColorMaskSGIS (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXTURECOLORMASKSGISPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -#endif - -#ifndef GL_SGIX_igloo_interface -#define GL_SGIX_igloo_interface 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glIglooInterfaceSGIX (GLenum pname, const GLvoid *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, const GLvoid *params); -#endif - -#ifndef GL_EXT_texture_env_dot3 -#define GL_EXT_texture_env_dot3 1 -#endif - -#ifndef GL_ATI_texture_mirror_once -#define GL_ATI_texture_mirror_once 1 -#endif - -#ifndef GL_NV_fence -#define GL_NV_fence 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDeleteFencesNV (GLsizei n, const GLuint *fences); -GLAPI void APIENTRY glGenFencesNV (GLsizei n, GLuint *fences); -GLAPI GLboolean APIENTRY glIsFenceNV (GLuint fence); -GLAPI GLboolean APIENTRY glTestFenceNV (GLuint fence); -GLAPI void APIENTRY glGetFenceivNV (GLuint fence, GLenum pname, GLint *params); -GLAPI void APIENTRY glFinishFenceNV (GLuint fence); -GLAPI void APIENTRY glSetFenceNV (GLuint fence, GLenum condition); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences); -typedef void (APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences); -typedef GLboolean (APIENTRYP PFNGLISFENCENVPROC) (GLuint fence); -typedef GLboolean (APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence); -typedef void (APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence); -typedef void (APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); -#endif - -#ifndef GL_NV_evaluators -#define GL_NV_evaluators 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMapControlPointsNV (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const GLvoid *points); -GLAPI void APIENTRY glMapParameterivNV (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glMapParameterfvNV (GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glGetMapControlPointsNV (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, GLvoid *points); -GLAPI void APIENTRY glGetMapParameterivNV (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetMapParameterfvNV (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetMapAttribParameterivNV (GLenum target, GLuint index, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetMapAttribParameterfvNV (GLenum target, GLuint index, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glEvalMapsNV (GLenum target, GLenum mode); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const GLvoid *points); -typedef void (APIENTRYP PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, GLvoid *points); -typedef void (APIENTRYP PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); -#endif - -#ifndef GL_NV_packed_depth_stencil -#define GL_NV_packed_depth_stencil 1 -#endif - -#ifndef GL_NV_register_combiners2 -#define GL_NV_register_combiners2 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCombinerStageParameterfvNV (GLenum stage, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glGetCombinerStageParameterfvNV (GLenum stage, GLenum pname, GLfloat *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat *params); -#endif - -#ifndef GL_NV_texture_compression_vtc -#define GL_NV_texture_compression_vtc 1 -#endif - -#ifndef GL_NV_texture_rectangle -#define GL_NV_texture_rectangle 1 -#endif - -#ifndef GL_NV_texture_shader -#define GL_NV_texture_shader 1 -#endif - -#ifndef GL_NV_texture_shader2 -#define GL_NV_texture_shader2 1 -#endif - -#ifndef GL_NV_vertex_array_range2 -#define GL_NV_vertex_array_range2 1 -#endif - -#ifndef GL_NV_vertex_program -#define GL_NV_vertex_program 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLboolean APIENTRY glAreProgramsResidentNV (GLsizei n, const GLuint *programs, GLboolean *residences); -GLAPI void APIENTRY glBindProgramNV (GLenum target, GLuint id); -GLAPI void APIENTRY glDeleteProgramsNV (GLsizei n, const GLuint *programs); -GLAPI void APIENTRY glExecuteProgramNV (GLenum target, GLuint id, const GLfloat *params); -GLAPI void APIENTRY glGenProgramsNV (GLsizei n, GLuint *programs); -GLAPI void APIENTRY glGetProgramParameterdvNV (GLenum target, GLuint index, GLenum pname, GLdouble *params); -GLAPI void APIENTRY glGetProgramParameterfvNV (GLenum target, GLuint index, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetProgramivNV (GLuint id, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetProgramStringNV (GLuint id, GLenum pname, GLubyte *program); -GLAPI void APIENTRY glGetTrackMatrixivNV (GLenum target, GLuint address, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVertexAttribdvNV (GLuint index, GLenum pname, GLdouble *params); -GLAPI void APIENTRY glGetVertexAttribfvNV (GLuint index, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetVertexAttribivNV (GLuint index, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVertexAttribPointervNV (GLuint index, GLenum pname, GLvoid* *pointer); -GLAPI GLboolean APIENTRY glIsProgramNV (GLuint id); -GLAPI void APIENTRY glLoadProgramNV (GLenum target, GLuint id, GLsizei len, const GLubyte *program); -GLAPI void APIENTRY glProgramParameter4dNV (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glProgramParameter4dvNV (GLenum target, GLuint index, const GLdouble *v); -GLAPI void APIENTRY glProgramParameter4fNV (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glProgramParameter4fvNV (GLenum target, GLuint index, const GLfloat *v); -GLAPI void APIENTRY glProgramParameters4dvNV (GLenum target, GLuint index, GLuint count, const GLdouble *v); -GLAPI void APIENTRY glProgramParameters4fvNV (GLenum target, GLuint index, GLuint count, const GLfloat *v); -GLAPI void APIENTRY glRequestResidentProgramsNV (GLsizei n, const GLuint *programs); -GLAPI void APIENTRY glTrackMatrixNV (GLenum target, GLuint address, GLenum matrix, GLenum transform); -GLAPI void APIENTRY glVertexAttribPointerNV (GLuint index, GLint fsize, GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void APIENTRY glVertexAttrib1dNV (GLuint index, GLdouble x); -GLAPI void APIENTRY glVertexAttrib1dvNV (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib1fNV (GLuint index, GLfloat x); -GLAPI void APIENTRY glVertexAttrib1fvNV (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib1sNV (GLuint index, GLshort x); -GLAPI void APIENTRY glVertexAttrib1svNV (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib2dNV (GLuint index, GLdouble x, GLdouble y); -GLAPI void APIENTRY glVertexAttrib2dvNV (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib2fNV (GLuint index, GLfloat x, GLfloat y); -GLAPI void APIENTRY glVertexAttrib2fvNV (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib2sNV (GLuint index, GLshort x, GLshort y); -GLAPI void APIENTRY glVertexAttrib2svNV (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib3dNV (GLuint index, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glVertexAttrib3dvNV (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib3fNV (GLuint index, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glVertexAttrib3fvNV (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib3sNV (GLuint index, GLshort x, GLshort y, GLshort z); -GLAPI void APIENTRY glVertexAttrib3svNV (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4dNV (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glVertexAttrib4dvNV (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib4fNV (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glVertexAttrib4fvNV (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib4sNV (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -GLAPI void APIENTRY glVertexAttrib4svNV (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4ubNV (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -GLAPI void APIENTRY glVertexAttrib4ubvNV (GLuint index, const GLubyte *v); -GLAPI void APIENTRY glVertexAttribs1dvNV (GLuint index, GLsizei count, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribs1fvNV (GLuint index, GLsizei count, const GLfloat *v); -GLAPI void APIENTRY glVertexAttribs1svNV (GLuint index, GLsizei count, const GLshort *v); -GLAPI void APIENTRY glVertexAttribs2dvNV (GLuint index, GLsizei count, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribs2fvNV (GLuint index, GLsizei count, const GLfloat *v); -GLAPI void APIENTRY glVertexAttribs2svNV (GLuint index, GLsizei count, const GLshort *v); -GLAPI void APIENTRY glVertexAttribs3dvNV (GLuint index, GLsizei count, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribs3fvNV (GLuint index, GLsizei count, const GLfloat *v); -GLAPI void APIENTRY glVertexAttribs3svNV (GLuint index, GLsizei count, const GLshort *v); -GLAPI void APIENTRY glVertexAttribs4dvNV (GLuint index, GLsizei count, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribs4fvNV (GLuint index, GLsizei count, const GLfloat *v); -GLAPI void APIENTRY glVertexAttribs4svNV (GLuint index, GLsizei count, const GLshort *v); -GLAPI void APIENTRY glVertexAttribs4ubvNV (GLuint index, GLsizei count, const GLubyte *v); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLboolean (APIENTRYP PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint *programs, GLboolean *residences); -typedef void (APIENTRYP PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); -typedef void (APIENTRYP PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); -typedef void (APIENTRYP PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat *params); -typedef void (APIENTRYP PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint *programs); -typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte *program); -typedef void (APIENTRYP PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, GLvoid* *pointer); -typedef GLboolean (APIENTRYP PFNGLISPROGRAMNVPROC) (GLuint id); -typedef void (APIENTRYP PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte *program); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLuint count, const GLdouble *v); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLuint count, const GLfloat *v); -typedef void (APIENTRYP PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); -typedef void (APIENTRYP PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); -typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint fsize, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei count, const GLubyte *v); -#endif - -#ifndef GL_SGIX_texture_coordinate_clamp -#define GL_SGIX_texture_coordinate_clamp 1 -#endif - -#ifndef GL_SGIX_scalebias_hint -#define GL_SGIX_scalebias_hint 1 -#endif - -#ifndef GL_OML_interlace -#define GL_OML_interlace 1 -#endif - -#ifndef GL_OML_subsample -#define GL_OML_subsample 1 -#endif - -#ifndef GL_OML_resample -#define GL_OML_resample 1 -#endif - -#ifndef GL_NV_copy_depth_to_color -#define GL_NV_copy_depth_to_color 1 -#endif - -#ifndef GL_ATI_envmap_bumpmap -#define GL_ATI_envmap_bumpmap 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexBumpParameterivATI (GLenum pname, const GLint *param); -GLAPI void APIENTRY glTexBumpParameterfvATI (GLenum pname, const GLfloat *param); -GLAPI void APIENTRY glGetTexBumpParameterivATI (GLenum pname, GLint *param); -GLAPI void APIENTRY glGetTexBumpParameterfvATI (GLenum pname, GLfloat *param); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, const GLint *param); -typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, const GLfloat *param); -typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); -typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); -#endif - -#ifndef GL_ATI_fragment_shader -#define GL_ATI_fragment_shader 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLuint APIENTRY glGenFragmentShadersATI (GLuint range); -GLAPI void APIENTRY glBindFragmentShaderATI (GLuint id); -GLAPI void APIENTRY glDeleteFragmentShaderATI (GLuint id); -GLAPI void APIENTRY glBeginFragmentShaderATI (void); -GLAPI void APIENTRY glEndFragmentShaderATI (void); -GLAPI void APIENTRY glPassTexCoordATI (GLuint dst, GLuint coord, GLenum swizzle); -GLAPI void APIENTRY glSampleMapATI (GLuint dst, GLuint interp, GLenum swizzle); -GLAPI void APIENTRY glColorFragmentOp1ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); -GLAPI void APIENTRY glColorFragmentOp2ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); -GLAPI void APIENTRY glColorFragmentOp3ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); -GLAPI void APIENTRY glAlphaFragmentOp1ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); -GLAPI void APIENTRY glAlphaFragmentOp2ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); -GLAPI void APIENTRY glAlphaFragmentOp3ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); -GLAPI void APIENTRY glSetFragmentShaderConstantATI (GLuint dst, const GLfloat *value); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLuint (APIENTRYP PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); -typedef void (APIENTRYP PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); -typedef void (APIENTRYP PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); -typedef void (APIENTRYP PFNGLBEGINFRAGMENTSHADERATIPROC) (void); -typedef void (APIENTRYP PFNGLENDFRAGMENTSHADERATIPROC) (void); -typedef void (APIENTRYP PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); -typedef void (APIENTRYP PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); -typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); -typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); -typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); -typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); -typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); -typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); -typedef void (APIENTRYP PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat *value); -#endif - -#ifndef GL_ATI_pn_triangles -#define GL_ATI_pn_triangles 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPNTrianglesiATI (GLenum pname, GLint param); -GLAPI void APIENTRY glPNTrianglesfATI (GLenum pname, GLfloat param); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); -#endif - -#ifndef GL_ATI_vertex_array_object -#define GL_ATI_vertex_array_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLuint APIENTRY glNewObjectBufferATI (GLsizei size, const GLvoid *pointer, GLenum usage); -GLAPI GLboolean APIENTRY glIsObjectBufferATI (GLuint buffer); -GLAPI void APIENTRY glUpdateObjectBufferATI (GLuint buffer, GLuint offset, GLsizei size, const GLvoid *pointer, GLenum preserve); -GLAPI void APIENTRY glGetObjectBufferfvATI (GLuint buffer, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetObjectBufferivATI (GLuint buffer, GLenum pname, GLint *params); -GLAPI void APIENTRY glFreeObjectBufferATI (GLuint buffer); -GLAPI void APIENTRY glArrayObjectATI (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); -GLAPI void APIENTRY glGetArrayObjectfvATI (GLenum array, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetArrayObjectivATI (GLenum array, GLenum pname, GLint *params); -GLAPI void APIENTRY glVariantArrayObjectATI (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); -GLAPI void APIENTRY glGetVariantArrayObjectfvATI (GLuint id, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetVariantArrayObjectivATI (GLuint id, GLenum pname, GLint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLuint (APIENTRYP PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const GLvoid *pointer, GLenum usage); -typedef GLboolean (APIENTRYP PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const GLvoid *pointer, GLenum preserve); -typedef void (APIENTRYP PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); -typedef void (APIENTRYP PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); -typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint *params); -#endif - -#ifndef GL_EXT_vertex_shader -#define GL_EXT_vertex_shader 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBeginVertexShaderEXT (void); -GLAPI void APIENTRY glEndVertexShaderEXT (void); -GLAPI void APIENTRY glBindVertexShaderEXT (GLuint id); -GLAPI GLuint APIENTRY glGenVertexShadersEXT (GLuint range); -GLAPI void APIENTRY glDeleteVertexShaderEXT (GLuint id); -GLAPI void APIENTRY glShaderOp1EXT (GLenum op, GLuint res, GLuint arg1); -GLAPI void APIENTRY glShaderOp2EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2); -GLAPI void APIENTRY glShaderOp3EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); -GLAPI void APIENTRY glSwizzleEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); -GLAPI void APIENTRY glWriteMaskEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); -GLAPI void APIENTRY glInsertComponentEXT (GLuint res, GLuint src, GLuint num); -GLAPI void APIENTRY glExtractComponentEXT (GLuint res, GLuint src, GLuint num); -GLAPI GLuint APIENTRY glGenSymbolsEXT (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); -GLAPI void APIENTRY glSetInvariantEXT (GLuint id, GLenum type, const GLvoid *addr); -GLAPI void APIENTRY glSetLocalConstantEXT (GLuint id, GLenum type, const GLvoid *addr); -GLAPI void APIENTRY glVariantbvEXT (GLuint id, const GLbyte *addr); -GLAPI void APIENTRY glVariantsvEXT (GLuint id, const GLshort *addr); -GLAPI void APIENTRY glVariantivEXT (GLuint id, const GLint *addr); -GLAPI void APIENTRY glVariantfvEXT (GLuint id, const GLfloat *addr); -GLAPI void APIENTRY glVariantdvEXT (GLuint id, const GLdouble *addr); -GLAPI void APIENTRY glVariantubvEXT (GLuint id, const GLubyte *addr); -GLAPI void APIENTRY glVariantusvEXT (GLuint id, const GLushort *addr); -GLAPI void APIENTRY glVariantuivEXT (GLuint id, const GLuint *addr); -GLAPI void APIENTRY glVariantPointerEXT (GLuint id, GLenum type, GLuint stride, const GLvoid *addr); -GLAPI void APIENTRY glEnableVariantClientStateEXT (GLuint id); -GLAPI void APIENTRY glDisableVariantClientStateEXT (GLuint id); -GLAPI GLuint APIENTRY glBindLightParameterEXT (GLenum light, GLenum value); -GLAPI GLuint APIENTRY glBindMaterialParameterEXT (GLenum face, GLenum value); -GLAPI GLuint APIENTRY glBindTexGenParameterEXT (GLenum unit, GLenum coord, GLenum value); -GLAPI GLuint APIENTRY glBindTextureUnitParameterEXT (GLenum unit, GLenum value); -GLAPI GLuint APIENTRY glBindParameterEXT (GLenum value); -GLAPI GLboolean APIENTRY glIsVariantEnabledEXT (GLuint id, GLenum cap); -GLAPI void APIENTRY glGetVariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); -GLAPI void APIENTRY glGetVariantIntegervEXT (GLuint id, GLenum value, GLint *data); -GLAPI void APIENTRY glGetVariantFloatvEXT (GLuint id, GLenum value, GLfloat *data); -GLAPI void APIENTRY glGetVariantPointervEXT (GLuint id, GLenum value, GLvoid* *data); -GLAPI void APIENTRY glGetInvariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); -GLAPI void APIENTRY glGetInvariantIntegervEXT (GLuint id, GLenum value, GLint *data); -GLAPI void APIENTRY glGetInvariantFloatvEXT (GLuint id, GLenum value, GLfloat *data); -GLAPI void APIENTRY glGetLocalConstantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); -GLAPI void APIENTRY glGetLocalConstantIntegervEXT (GLuint id, GLenum value, GLint *data); -GLAPI void APIENTRY glGetLocalConstantFloatvEXT (GLuint id, GLenum value, GLfloat *data); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBEGINVERTEXSHADEREXTPROC) (void); -typedef void (APIENTRYP PFNGLENDVERTEXSHADEREXTPROC) (void); -typedef void (APIENTRYP PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); -typedef GLuint (APIENTRYP PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); -typedef void (APIENTRYP PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); -typedef void (APIENTRYP PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); -typedef void (APIENTRYP PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); -typedef void (APIENTRYP PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); -typedef void (APIENTRYP PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); -typedef void (APIENTRYP PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); -typedef void (APIENTRYP PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); -typedef void (APIENTRYP PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); -typedef GLuint (APIENTRYP PFNGLGENSYMBOLSEXTPROC) (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); -typedef void (APIENTRYP PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, const GLvoid *addr); -typedef void (APIENTRYP PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, const GLvoid *addr); -typedef void (APIENTRYP PFNGLVARIANTBVEXTPROC) (GLuint id, const GLbyte *addr); -typedef void (APIENTRYP PFNGLVARIANTSVEXTPROC) (GLuint id, const GLshort *addr); -typedef void (APIENTRYP PFNGLVARIANTIVEXTPROC) (GLuint id, const GLint *addr); -typedef void (APIENTRYP PFNGLVARIANTFVEXTPROC) (GLuint id, const GLfloat *addr); -typedef void (APIENTRYP PFNGLVARIANTDVEXTPROC) (GLuint id, const GLdouble *addr); -typedef void (APIENTRYP PFNGLVARIANTUBVEXTPROC) (GLuint id, const GLubyte *addr); -typedef void (APIENTRYP PFNGLVARIANTUSVEXTPROC) (GLuint id, const GLushort *addr); -typedef void (APIENTRYP PFNGLVARIANTUIVEXTPROC) (GLuint id, const GLuint *addr); -typedef void (APIENTRYP PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, const GLvoid *addr); -typedef void (APIENTRYP PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); -typedef void (APIENTRYP PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); -typedef GLuint (APIENTRYP PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); -typedef GLuint (APIENTRYP PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); -typedef GLuint (APIENTRYP PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); -typedef GLuint (APIENTRYP PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); -typedef GLuint (APIENTRYP PFNGLBINDPARAMETEREXTPROC) (GLenum value); -typedef GLboolean (APIENTRYP PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); -typedef void (APIENTRYP PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); -typedef void (APIENTRYP PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); -typedef void (APIENTRYP PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); -typedef void (APIENTRYP PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, GLvoid* *data); -typedef void (APIENTRYP PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); -typedef void (APIENTRYP PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); -typedef void (APIENTRYP PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); -typedef void (APIENTRYP PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); -typedef void (APIENTRYP PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); -typedef void (APIENTRYP PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); -#endif - -#ifndef GL_ATI_vertex_streams -#define GL_ATI_vertex_streams 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexStream1sATI (GLenum stream, GLshort x); -GLAPI void APIENTRY glVertexStream1svATI (GLenum stream, const GLshort *coords); -GLAPI void APIENTRY glVertexStream1iATI (GLenum stream, GLint x); -GLAPI void APIENTRY glVertexStream1ivATI (GLenum stream, const GLint *coords); -GLAPI void APIENTRY glVertexStream1fATI (GLenum stream, GLfloat x); -GLAPI void APIENTRY glVertexStream1fvATI (GLenum stream, const GLfloat *coords); -GLAPI void APIENTRY glVertexStream1dATI (GLenum stream, GLdouble x); -GLAPI void APIENTRY glVertexStream1dvATI (GLenum stream, const GLdouble *coords); -GLAPI void APIENTRY glVertexStream2sATI (GLenum stream, GLshort x, GLshort y); -GLAPI void APIENTRY glVertexStream2svATI (GLenum stream, const GLshort *coords); -GLAPI void APIENTRY glVertexStream2iATI (GLenum stream, GLint x, GLint y); -GLAPI void APIENTRY glVertexStream2ivATI (GLenum stream, const GLint *coords); -GLAPI void APIENTRY glVertexStream2fATI (GLenum stream, GLfloat x, GLfloat y); -GLAPI void APIENTRY glVertexStream2fvATI (GLenum stream, const GLfloat *coords); -GLAPI void APIENTRY glVertexStream2dATI (GLenum stream, GLdouble x, GLdouble y); -GLAPI void APIENTRY glVertexStream2dvATI (GLenum stream, const GLdouble *coords); -GLAPI void APIENTRY glVertexStream3sATI (GLenum stream, GLshort x, GLshort y, GLshort z); -GLAPI void APIENTRY glVertexStream3svATI (GLenum stream, const GLshort *coords); -GLAPI void APIENTRY glVertexStream3iATI (GLenum stream, GLint x, GLint y, GLint z); -GLAPI void APIENTRY glVertexStream3ivATI (GLenum stream, const GLint *coords); -GLAPI void APIENTRY glVertexStream3fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glVertexStream3fvATI (GLenum stream, const GLfloat *coords); -GLAPI void APIENTRY glVertexStream3dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glVertexStream3dvATI (GLenum stream, const GLdouble *coords); -GLAPI void APIENTRY glVertexStream4sATI (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); -GLAPI void APIENTRY glVertexStream4svATI (GLenum stream, const GLshort *coords); -GLAPI void APIENTRY glVertexStream4iATI (GLenum stream, GLint x, GLint y, GLint z, GLint w); -GLAPI void APIENTRY glVertexStream4ivATI (GLenum stream, const GLint *coords); -GLAPI void APIENTRY glVertexStream4fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glVertexStream4fvATI (GLenum stream, const GLfloat *coords); -GLAPI void APIENTRY glVertexStream4dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glVertexStream4dvATI (GLenum stream, const GLdouble *coords); -GLAPI void APIENTRY glNormalStream3bATI (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); -GLAPI void APIENTRY glNormalStream3bvATI (GLenum stream, const GLbyte *coords); -GLAPI void APIENTRY glNormalStream3sATI (GLenum stream, GLshort nx, GLshort ny, GLshort nz); -GLAPI void APIENTRY glNormalStream3svATI (GLenum stream, const GLshort *coords); -GLAPI void APIENTRY glNormalStream3iATI (GLenum stream, GLint nx, GLint ny, GLint nz); -GLAPI void APIENTRY glNormalStream3ivATI (GLenum stream, const GLint *coords); -GLAPI void APIENTRY glNormalStream3fATI (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); -GLAPI void APIENTRY glNormalStream3fvATI (GLenum stream, const GLfloat *coords); -GLAPI void APIENTRY glNormalStream3dATI (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); -GLAPI void APIENTRY glNormalStream3dvATI (GLenum stream, const GLdouble *coords); -GLAPI void APIENTRY glClientActiveVertexStreamATI (GLenum stream); -GLAPI void APIENTRY glVertexBlendEnviATI (GLenum pname, GLint param); -GLAPI void APIENTRY glVertexBlendEnvfATI (GLenum pname, GLfloat param); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (APIENTRYP PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); -typedef void (APIENTRYP PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *coords); -typedef void (APIENTRYP PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort nx, GLshort ny, GLshort nz); -typedef void (APIENTRYP PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (APIENTRYP PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint nx, GLint ny, GLint nz); -typedef void (APIENTRYP PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (APIENTRYP PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); -typedef void (APIENTRYP PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (APIENTRYP PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); -typedef void (APIENTRYP PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (APIENTRYP PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); -typedef void (APIENTRYP PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); -#endif - -#ifndef GL_ATI_element_array -#define GL_ATI_element_array 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glElementPointerATI (GLenum type, const GLvoid *pointer); -GLAPI void APIENTRY glDrawElementArrayATI (GLenum mode, GLsizei count); -GLAPI void APIENTRY glDrawRangeElementArrayATI (GLenum mode, GLuint start, GLuint end, GLsizei count); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLELEMENTPOINTERATIPROC) (GLenum type, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); -typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); -#endif - -#ifndef GL_SUN_mesh_array -#define GL_SUN_mesh_array 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawMeshArraysSUN (GLenum mode, GLint first, GLsizei count, GLsizei width); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWMESHARRAYSSUNPROC) (GLenum mode, GLint first, GLsizei count, GLsizei width); -#endif - -#ifndef GL_SUN_slice_accum -#define GL_SUN_slice_accum 1 -#endif - -#ifndef GL_NV_multisample_filter_hint -#define GL_NV_multisample_filter_hint 1 -#endif - -#ifndef GL_NV_depth_clamp -#define GL_NV_depth_clamp 1 -#endif - -#ifndef GL_NV_occlusion_query -#define GL_NV_occlusion_query 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenOcclusionQueriesNV (GLsizei n, GLuint *ids); -GLAPI void APIENTRY glDeleteOcclusionQueriesNV (GLsizei n, const GLuint *ids); -GLAPI GLboolean APIENTRY glIsOcclusionQueryNV (GLuint id); -GLAPI void APIENTRY glBeginOcclusionQueryNV (GLuint id); -GLAPI void APIENTRY glEndOcclusionQueryNV (void); -GLAPI void APIENTRY glGetOcclusionQueryivNV (GLuint id, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetOcclusionQueryuivNV (GLuint id, GLenum pname, GLuint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint *ids); -typedef void (APIENTRYP PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint *ids); -typedef GLboolean (APIENTRYP PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); -typedef void (APIENTRYP PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); -typedef void (APIENTRYP PFNGLENDOCCLUSIONQUERYNVPROC) (void); -typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint *params); -#endif - -#ifndef GL_NV_point_sprite -#define GL_NV_point_sprite 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPointParameteriNV (GLenum pname, GLint param); -GLAPI void APIENTRY glPointParameterivNV (GLenum pname, const GLint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint *params); -#endif - -#ifndef GL_NV_texture_shader3 -#define GL_NV_texture_shader3 1 -#endif - -#ifndef GL_NV_vertex_program1_1 -#define GL_NV_vertex_program1_1 1 -#endif - -#ifndef GL_EXT_shadow_funcs -#define GL_EXT_shadow_funcs 1 -#endif - -#ifndef GL_EXT_stencil_two_side -#define GL_EXT_stencil_two_side 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glActiveStencilFaceEXT (GLenum face); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); -#endif - -#ifndef GL_ATI_text_fragment_shader -#define GL_ATI_text_fragment_shader 1 -#endif - -#ifndef GL_APPLE_client_storage -#define GL_APPLE_client_storage 1 -#endif - -#ifndef GL_APPLE_element_array -#define GL_APPLE_element_array 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glElementPointerAPPLE (GLenum type, const GLvoid *pointer); -GLAPI void APIENTRY glDrawElementArrayAPPLE (GLenum mode, GLint first, GLsizei count); -GLAPI void APIENTRY glDrawRangeElementArrayAPPLE (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); -GLAPI void APIENTRY glMultiDrawElementArrayAPPLE (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); -GLAPI void APIENTRY glMultiDrawRangeElementArrayAPPLE (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); -typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); -typedef void (APIENTRYP PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); -#endif - -#ifndef GL_APPLE_fence -#define GL_APPLE_fence 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenFencesAPPLE (GLsizei n, GLuint *fences); -GLAPI void APIENTRY glDeleteFencesAPPLE (GLsizei n, const GLuint *fences); -GLAPI void APIENTRY glSetFenceAPPLE (GLuint fence); -GLAPI GLboolean APIENTRY glIsFenceAPPLE (GLuint fence); -GLAPI GLboolean APIENTRY glTestFenceAPPLE (GLuint fence); -GLAPI void APIENTRY glFinishFenceAPPLE (GLuint fence); -GLAPI GLboolean APIENTRY glTestObjectAPPLE (GLenum object, GLuint name); -GLAPI void APIENTRY glFinishObjectAPPLE (GLenum object, GLint name); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint *fences); -typedef void (APIENTRYP PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint *fences); -typedef void (APIENTRYP PFNGLSETFENCEAPPLEPROC) (GLuint fence); -typedef GLboolean (APIENTRYP PFNGLISFENCEAPPLEPROC) (GLuint fence); -typedef GLboolean (APIENTRYP PFNGLTESTFENCEAPPLEPROC) (GLuint fence); -typedef void (APIENTRYP PFNGLFINISHFENCEAPPLEPROC) (GLuint fence); -typedef GLboolean (APIENTRYP PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); -typedef void (APIENTRYP PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); -#endif - -#ifndef GL_APPLE_vertex_array_object -#define GL_APPLE_vertex_array_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindVertexArrayAPPLE (GLuint array); -GLAPI void APIENTRY glDeleteVertexArraysAPPLE (GLsizei n, const GLuint *arrays); -GLAPI void APIENTRY glGenVertexArraysAPPLE (GLsizei n, GLuint *arrays); -GLAPI GLboolean APIENTRY glIsVertexArrayAPPLE (GLuint array); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); -typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays); -typedef void (APIENTRYP PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, GLuint *arrays); -typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); -#endif - -#ifndef GL_APPLE_vertex_array_range -#define GL_APPLE_vertex_array_range 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexArrayRangeAPPLE (GLsizei length, GLvoid *pointer); -GLAPI void APIENTRY glFlushVertexArrayRangeAPPLE (GLsizei length, GLvoid *pointer); -GLAPI void APIENTRY glVertexArrayParameteriAPPLE (GLenum pname, GLint param); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid *pointer); -typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid *pointer); -typedef void (APIENTRYP PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); -#endif - -#ifndef GL_APPLE_ycbcr_422 -#define GL_APPLE_ycbcr_422 1 -#endif - -#ifndef GL_S3_s3tc -#define GL_S3_s3tc 1 -#endif - -#ifndef GL_ATI_draw_buffers -#define GL_ATI_draw_buffers 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawBuffersATI (GLsizei n, const GLenum *bufs); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum *bufs); -#endif - -#ifndef GL_ATI_pixel_format_float -#define GL_ATI_pixel_format_float 1 -/* This is really a WGL extension, but defines some associated GL enums. - * ATI does not export "GL_ATI_pixel_format_float" in the GL_EXTENSIONS string. - */ -#endif - -#ifndef GL_ATI_texture_env_combine3 -#define GL_ATI_texture_env_combine3 1 -#endif - -#ifndef GL_ATI_texture_float -#define GL_ATI_texture_float 1 -#endif - -#ifndef GL_NV_float_buffer -#define GL_NV_float_buffer 1 -#endif - -#ifndef GL_NV_fragment_program -#define GL_NV_fragment_program 1 -/* Some NV_fragment_program entry points are shared with ARB_vertex_program. */ -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramNamedParameter4fNV (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glProgramNamedParameter4dNV (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glProgramNamedParameter4fvNV (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); -GLAPI void APIENTRY glProgramNamedParameter4dvNV (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); -GLAPI void APIENTRY glGetProgramNamedParameterfvNV (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); -GLAPI void APIENTRY glGetProgramNamedParameterdvNV (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); -typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); -typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); -typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); -#endif - -#ifndef GL_NV_half_float -#define GL_NV_half_float 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertex2hNV (GLhalfNV x, GLhalfNV y); -GLAPI void APIENTRY glVertex2hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glVertex3hNV (GLhalfNV x, GLhalfNV y, GLhalfNV z); -GLAPI void APIENTRY glVertex3hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glVertex4hNV (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); -GLAPI void APIENTRY glVertex4hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glNormal3hNV (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); -GLAPI void APIENTRY glNormal3hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glColor3hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue); -GLAPI void APIENTRY glColor3hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glColor4hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); -GLAPI void APIENTRY glColor4hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glTexCoord1hNV (GLhalfNV s); -GLAPI void APIENTRY glTexCoord1hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glTexCoord2hNV (GLhalfNV s, GLhalfNV t); -GLAPI void APIENTRY glTexCoord2hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glTexCoord3hNV (GLhalfNV s, GLhalfNV t, GLhalfNV r); -GLAPI void APIENTRY glTexCoord3hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glTexCoord4hNV (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); -GLAPI void APIENTRY glTexCoord4hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glMultiTexCoord1hNV (GLenum target, GLhalfNV s); -GLAPI void APIENTRY glMultiTexCoord1hvNV (GLenum target, const GLhalfNV *v); -GLAPI void APIENTRY glMultiTexCoord2hNV (GLenum target, GLhalfNV s, GLhalfNV t); -GLAPI void APIENTRY glMultiTexCoord2hvNV (GLenum target, const GLhalfNV *v); -GLAPI void APIENTRY glMultiTexCoord3hNV (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); -GLAPI void APIENTRY glMultiTexCoord3hvNV (GLenum target, const GLhalfNV *v); -GLAPI void APIENTRY glMultiTexCoord4hNV (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); -GLAPI void APIENTRY glMultiTexCoord4hvNV (GLenum target, const GLhalfNV *v); -GLAPI void APIENTRY glFogCoordhNV (GLhalfNV fog); -GLAPI void APIENTRY glFogCoordhvNV (const GLhalfNV *fog); -GLAPI void APIENTRY glSecondaryColor3hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue); -GLAPI void APIENTRY glSecondaryColor3hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glVertexWeighthNV (GLhalfNV weight); -GLAPI void APIENTRY glVertexWeighthvNV (const GLhalfNV *weight); -GLAPI void APIENTRY glVertexAttrib1hNV (GLuint index, GLhalfNV x); -GLAPI void APIENTRY glVertexAttrib1hvNV (GLuint index, const GLhalfNV *v); -GLAPI void APIENTRY glVertexAttrib2hNV (GLuint index, GLhalfNV x, GLhalfNV y); -GLAPI void APIENTRY glVertexAttrib2hvNV (GLuint index, const GLhalfNV *v); -GLAPI void APIENTRY glVertexAttrib3hNV (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); -GLAPI void APIENTRY glVertexAttrib3hvNV (GLuint index, const GLhalfNV *v); -GLAPI void APIENTRY glVertexAttrib4hNV (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); -GLAPI void APIENTRY glVertexAttrib4hvNV (GLuint index, const GLhalfNV *v); -GLAPI void APIENTRY glVertexAttribs1hvNV (GLuint index, GLsizei n, const GLhalfNV *v); -GLAPI void APIENTRY glVertexAttribs2hvNV (GLuint index, GLsizei n, const GLhalfNV *v); -GLAPI void APIENTRY glVertexAttribs3hvNV (GLuint index, GLsizei n, const GLhalfNV *v); -GLAPI void APIENTRY glVertexAttribs4hvNV (GLuint index, GLsizei n, const GLhalfNV *v); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEX2HNVPROC) (GLhalfNV x, GLhalfNV y); -typedef void (APIENTRYP PFNGLVERTEX2HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEX3HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z); -typedef void (APIENTRYP PFNGLVERTEX3HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEX4HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); -typedef void (APIENTRYP PFNGLVERTEX4HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLNORMAL3HNVPROC) (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); -typedef void (APIENTRYP PFNGLNORMAL3HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); -typedef void (APIENTRYP PFNGLCOLOR3HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLCOLOR4HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); -typedef void (APIENTRYP PFNGLCOLOR4HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLTEXCOORD1HNVPROC) (GLhalfNV s); -typedef void (APIENTRYP PFNGLTEXCOORD1HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLTEXCOORD2HNVPROC) (GLhalfNV s, GLhalfNV t); -typedef void (APIENTRYP PFNGLTEXCOORD2HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLTEXCOORD3HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r); -typedef void (APIENTRYP PFNGLTEXCOORD3HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLTEXCOORD4HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); -typedef void (APIENTRYP PFNGLTEXCOORD4HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalfNV s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLFOGCOORDHNVPROC) (GLhalfNV fog); -typedef void (APIENTRYP PFNGLFOGCOORDHVNVPROC) (const GLhalfNV *fog); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXWEIGHTHNVPROC) (GLhalfNV weight); -typedef void (APIENTRYP PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalfNV *weight); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalfNV x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); -#endif - -#ifndef GL_NV_pixel_data_range -#define GL_NV_pixel_data_range 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPixelDataRangeNV (GLenum target, GLsizei length, GLvoid *pointer); -GLAPI void APIENTRY glFlushPixelDataRangeNV (GLenum target); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, GLvoid *pointer); -typedef void (APIENTRYP PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); -#endif - -#ifndef GL_NV_primitive_restart -#define GL_NV_primitive_restart 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPrimitiveRestartNV (void); -GLAPI void APIENTRY glPrimitiveRestartIndexNV (GLuint index); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPRIMITIVERESTARTNVPROC) (void); -typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); -#endif - -#ifndef GL_NV_texture_expand_normal -#define GL_NV_texture_expand_normal 1 -#endif - -#ifndef GL_NV_vertex_program2 -#define GL_NV_vertex_program2 1 -#endif - -#ifndef GL_ATI_map_object_buffer -#define GL_ATI_map_object_buffer 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLvoid* APIENTRY glMapObjectBufferATI (GLuint buffer); -GLAPI void APIENTRY glUnmapObjectBufferATI (GLuint buffer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLvoid* (APIENTRYP PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); -#endif - -#ifndef GL_ATI_separate_stencil -#define GL_ATI_separate_stencil 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glStencilOpSeparateATI (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -GLAPI void APIENTRY glStencilFuncSeparateATI (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); -#endif - -#ifndef GL_ATI_vertex_attrib_array_object -#define GL_ATI_vertex_attrib_array_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttribArrayObjectATI (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); -GLAPI void APIENTRY glGetVertexAttribArrayObjectfvATI (GLuint index, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetVertexAttribArrayObjectivATI (GLuint index, GLenum pname, GLint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint *params); -#endif - -#ifndef GL_OES_read_format -#define GL_OES_read_format 1 -#endif - -#ifndef GL_EXT_depth_bounds_test -#define GL_EXT_depth_bounds_test 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDepthBoundsEXT (GLclampd zmin, GLclampd zmax); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); -#endif - -#ifndef GL_EXT_texture_mirror_clamp -#define GL_EXT_texture_mirror_clamp 1 -#endif - -#ifndef GL_EXT_blend_equation_separate -#define GL_EXT_blend_equation_separate 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendEquationSeparateEXT (GLenum modeRGB, GLenum modeAlpha); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); -#endif - -#ifndef GL_MESA_pack_invert -#define GL_MESA_pack_invert 1 -#endif - -#ifndef GL_MESA_ycbcr_texture -#define GL_MESA_ycbcr_texture 1 -#endif - -#ifndef GL_EXT_pixel_buffer_object -#define GL_EXT_pixel_buffer_object 1 -#endif - -#ifndef GL_NV_fragment_program_option -#define GL_NV_fragment_program_option 1 -#endif - -#ifndef GL_NV_fragment_program2 -#define GL_NV_fragment_program2 1 -#endif - -#ifndef GL_NV_vertex_program2_option -#define GL_NV_vertex_program2_option 1 -#endif - -#ifndef GL_NV_vertex_program3 -#define GL_NV_vertex_program3 1 -#endif - -#ifndef GL_EXT_framebuffer_object -#define GL_EXT_framebuffer_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLboolean APIENTRY glIsRenderbufferEXT (GLuint renderbuffer); -GLAPI void APIENTRY glBindRenderbufferEXT (GLenum target, GLuint renderbuffer); -GLAPI void APIENTRY glDeleteRenderbuffersEXT (GLsizei n, const GLuint *renderbuffers); -GLAPI void APIENTRY glGenRenderbuffersEXT (GLsizei n, GLuint *renderbuffers); -GLAPI void APIENTRY glRenderbufferStorageEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glGetRenderbufferParameterivEXT (GLenum target, GLenum pname, GLint *params); -GLAPI GLboolean APIENTRY glIsFramebufferEXT (GLuint framebuffer); -GLAPI void APIENTRY glBindFramebufferEXT (GLenum target, GLuint framebuffer); -GLAPI void APIENTRY glDeleteFramebuffersEXT (GLsizei n, const GLuint *framebuffers); -GLAPI void APIENTRY glGenFramebuffersEXT (GLsizei n, GLuint *framebuffers); -GLAPI GLenum APIENTRY glCheckFramebufferStatusEXT (GLenum target); -GLAPI void APIENTRY glFramebufferTexture1DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -GLAPI void APIENTRY glFramebufferTexture2DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -GLAPI void APIENTRY glFramebufferTexture3DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -GLAPI void APIENTRY glFramebufferRenderbufferEXT (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -GLAPI void APIENTRY glGetFramebufferAttachmentParameterivEXT (GLenum target, GLenum attachment, GLenum pname, GLint *params); -GLAPI void APIENTRY glGenerateMipmapEXT (GLenum target); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); -typedef void (APIENTRYP PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint *renderbuffers); -typedef void (APIENTRYP PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint *renderbuffers); -typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); -typedef void (APIENTRYP PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); -typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint *framebuffers); -typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers); -typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGENERATEMIPMAPEXTPROC) (GLenum target); -#endif - -#ifndef GL_GREMEDY_string_marker -#define GL_GREMEDY_string_marker 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glStringMarkerGREMEDY (GLsizei len, const GLvoid *string); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const GLvoid *string); -#endif - -#ifndef GL_EXT_packed_depth_stencil -#define GL_EXT_packed_depth_stencil 1 -#endif - -#ifndef GL_EXT_stencil_clear_tag -#define GL_EXT_stencil_clear_tag 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glStencilClearTagEXT (GLsizei stencilTagBits, GLuint stencilClearTag); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSTENCILCLEARTAGEXTPROC) (GLsizei stencilTagBits, GLuint stencilClearTag); -#endif - -#ifndef GL_EXT_texture_sRGB -#define GL_EXT_texture_sRGB 1 -#endif - -#ifndef GL_EXT_framebuffer_blit -#define GL_EXT_framebuffer_blit 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlitFramebufferEXT (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -#endif - -#ifndef GL_EXT_framebuffer_multisample -#define GL_EXT_framebuffer_multisample 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glRenderbufferStorageMultisampleEXT (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -#endif - -#ifndef GL_MESAX_texture_stack -#define GL_MESAX_texture_stack 1 -#endif - -#ifndef GL_EXT_timer_query -#define GL_EXT_timer_query 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetQueryObjecti64vEXT (GLuint id, GLenum pname, GLint64EXT *params); -GLAPI void APIENTRY glGetQueryObjectui64vEXT (GLuint id, GLenum pname, GLuint64EXT *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64EXT *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64EXT *params); -#endif - -#ifndef GL_EXT_gpu_program_parameters -#define GL_EXT_gpu_program_parameters 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramEnvParameters4fvEXT (GLenum target, GLuint index, GLsizei count, const GLfloat *params); -GLAPI void APIENTRY glProgramLocalParameters4fvEXT (GLenum target, GLuint index, GLsizei count, const GLfloat *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *params); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *params); -#endif - -#ifndef GL_APPLE_flush_buffer_range -#define GL_APPLE_flush_buffer_range 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBufferParameteriAPPLE (GLenum target, GLenum pname, GLint param); -GLAPI void APIENTRY glFlushMappedBufferRangeAPPLE (GLenum target, GLintptr offset, GLsizeiptr size); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBUFFERPARAMETERIAPPLEPROC) (GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) (GLenum target, GLintptr offset, GLsizeiptr size); -#endif - -#ifndef GL_NV_gpu_program4 -#define GL_NV_gpu_program4 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramLocalParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -GLAPI void APIENTRY glProgramLocalParameterI4ivNV (GLenum target, GLuint index, const GLint *params); -GLAPI void APIENTRY glProgramLocalParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params); -GLAPI void APIENTRY glProgramLocalParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -GLAPI void APIENTRY glProgramLocalParameterI4uivNV (GLenum target, GLuint index, const GLuint *params); -GLAPI void APIENTRY glProgramLocalParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params); -GLAPI void APIENTRY glProgramEnvParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -GLAPI void APIENTRY glProgramEnvParameterI4ivNV (GLenum target, GLuint index, const GLint *params); -GLAPI void APIENTRY glProgramEnvParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params); -GLAPI void APIENTRY glProgramEnvParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -GLAPI void APIENTRY glProgramEnvParameterI4uivNV (GLenum target, GLuint index, const GLuint *params); -GLAPI void APIENTRY glProgramEnvParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params); -GLAPI void APIENTRY glGetProgramLocalParameterIivNV (GLenum target, GLuint index, GLint *params); -GLAPI void APIENTRY glGetProgramLocalParameterIuivNV (GLenum target, GLuint index, GLuint *params); -GLAPI void APIENTRY glGetProgramEnvParameterIivNV (GLenum target, GLuint index, GLint *params); -GLAPI void APIENTRY glGetProgramEnvParameterIuivNV (GLenum target, GLuint index, GLuint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint *params); -#endif - -#ifndef GL_NV_geometry_program4 -#define GL_NV_geometry_program4 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramVertexLimitNV (GLenum target, GLint limit); -GLAPI void APIENTRY glFramebufferTextureEXT (GLenum target, GLenum attachment, GLuint texture, GLint level); -GLAPI void APIENTRY glFramebufferTextureLayerEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -GLAPI void APIENTRY glFramebufferTextureFaceEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPROGRAMVERTEXLIMITNVPROC) (GLenum target, GLint limit); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); -#endif - -#ifndef GL_EXT_geometry_shader4 -#define GL_EXT_geometry_shader4 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramParameteriEXT (GLuint program, GLenum pname, GLint value); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); -#endif - -#ifndef GL_NV_vertex_program4 -#define GL_NV_vertex_program4 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttribI1iEXT (GLuint index, GLint x); -GLAPI void APIENTRY glVertexAttribI2iEXT (GLuint index, GLint x, GLint y); -GLAPI void APIENTRY glVertexAttribI3iEXT (GLuint index, GLint x, GLint y, GLint z); -GLAPI void APIENTRY glVertexAttribI4iEXT (GLuint index, GLint x, GLint y, GLint z, GLint w); -GLAPI void APIENTRY glVertexAttribI1uiEXT (GLuint index, GLuint x); -GLAPI void APIENTRY glVertexAttribI2uiEXT (GLuint index, GLuint x, GLuint y); -GLAPI void APIENTRY glVertexAttribI3uiEXT (GLuint index, GLuint x, GLuint y, GLuint z); -GLAPI void APIENTRY glVertexAttribI4uiEXT (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -GLAPI void APIENTRY glVertexAttribI1ivEXT (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI2ivEXT (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI3ivEXT (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI4ivEXT (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI1uivEXT (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI2uivEXT (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI3uivEXT (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI4uivEXT (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI4bvEXT (GLuint index, const GLbyte *v); -GLAPI void APIENTRY glVertexAttribI4svEXT (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttribI4ubvEXT (GLuint index, const GLubyte *v); -GLAPI void APIENTRY glVertexAttribI4usvEXT (GLuint index, const GLushort *v); -GLAPI void APIENTRY glVertexAttribIPointerEXT (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void APIENTRY glGetVertexAttribIivEXT (GLuint index, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVertexAttribIuivEXT (GLuint index, GLenum pname, GLuint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IEXTPROC) (GLuint index, GLint x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IEXTPROC) (GLuint index, GLint x, GLint y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IEXTPROC) (GLuint index, GLint x, GLint y, GLint z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IEXTPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIEXTPROC) (GLuint index, GLuint x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIEXTPROC) (GLuint index, GLuint x, GLuint y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVEXTPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVEXTPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVEXTPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVEXTPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVEXTPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVEXTPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVEXTPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVEXTPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVEXTPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVEXTPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVEXTPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVEXTPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVEXTPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVEXTPROC) (GLuint index, GLenum pname, GLuint *params); -#endif - -#ifndef GL_EXT_gpu_shader4 -#define GL_EXT_gpu_shader4 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetUniformuivEXT (GLuint program, GLint location, GLuint *params); -GLAPI void APIENTRY glBindFragDataLocationEXT (GLuint program, GLuint color, const GLchar *name); -GLAPI GLint APIENTRY glGetFragDataLocationEXT (GLuint program, const GLchar *name); -GLAPI void APIENTRY glUniform1uiEXT (GLint location, GLuint v0); -GLAPI void APIENTRY glUniform2uiEXT (GLint location, GLuint v0, GLuint v1); -GLAPI void APIENTRY glUniform3uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2); -GLAPI void APIENTRY glUniform4uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -GLAPI void APIENTRY glUniform1uivEXT (GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glUniform2uivEXT (GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glUniform3uivEXT (GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glUniform4uivEXT (GLint location, GLsizei count, const GLuint *value); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETUNIFORMUIVEXTPROC) (GLuint program, GLint location, GLuint *params); -typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name); -typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONEXTPROC) (GLuint program, const GLchar *name); -typedef void (APIENTRYP PFNGLUNIFORM1UIEXTPROC) (GLint location, GLuint v0); -typedef void (APIENTRYP PFNGLUNIFORM2UIEXTPROC) (GLint location, GLuint v0, GLuint v1); -typedef void (APIENTRYP PFNGLUNIFORM3UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (APIENTRYP PFNGLUNIFORM4UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (APIENTRYP PFNGLUNIFORM1UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLUNIFORM2UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLUNIFORM3UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLUNIFORM4UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); -#endif - -#ifndef GL_EXT_draw_instanced -#define GL_EXT_draw_instanced 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawArraysInstancedEXT (GLenum mode, GLint start, GLsizei count, GLsizei primcount); -GLAPI void APIENTRY glDrawElementsInstancedEXT (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); -typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); -#endif - -#ifndef GL_EXT_packed_float -#define GL_EXT_packed_float 1 -#endif - -#ifndef GL_EXT_texture_array -#define GL_EXT_texture_array 1 -#endif - -#ifndef GL_EXT_texture_buffer_object -#define GL_EXT_texture_buffer_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexBufferEXT (GLenum target, GLenum internalformat, GLuint buffer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); -#endif - -#ifndef GL_EXT_texture_compression_latc -#define GL_EXT_texture_compression_latc 1 -#endif - -#ifndef GL_EXT_texture_compression_rgtc -#define GL_EXT_texture_compression_rgtc 1 -#endif - -#ifndef GL_EXT_texture_shared_exponent -#define GL_EXT_texture_shared_exponent 1 -#endif - -#ifndef GL_NV_depth_buffer_float -#define GL_NV_depth_buffer_float 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDepthRangedNV (GLdouble zNear, GLdouble zFar); -GLAPI void APIENTRY glClearDepthdNV (GLdouble depth); -GLAPI void APIENTRY glDepthBoundsdNV (GLdouble zmin, GLdouble zmax); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFar); -typedef void (APIENTRYP PFNGLCLEARDEPTHDNVPROC) (GLdouble depth); -typedef void (APIENTRYP PFNGLDEPTHBOUNDSDNVPROC) (GLdouble zmin, GLdouble zmax); -#endif - -#ifndef GL_NV_fragment_program4 -#define GL_NV_fragment_program4 1 -#endif - -#ifndef GL_NV_framebuffer_multisample_coverage -#define GL_NV_framebuffer_multisample_coverage 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glRenderbufferStorageMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); -#endif - -#ifndef GL_EXT_framebuffer_sRGB -#define GL_EXT_framebuffer_sRGB 1 -#endif - -#ifndef GL_NV_geometry_shader4 -#define GL_NV_geometry_shader4 1 -#endif - -#ifndef GL_NV_parameter_buffer_object -#define GL_NV_parameter_buffer_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramBufferParametersfvNV (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat *params); -GLAPI void APIENTRY glProgramBufferParametersIivNV (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint *params); -GLAPI void APIENTRY glProgramBufferParametersIuivNV (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLuint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat *params); -typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint *params); -typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLuint *params); -#endif - -#ifndef GL_EXT_draw_buffers2 -#define GL_EXT_draw_buffers2 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorMaskIndexedEXT (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -GLAPI void APIENTRY glGetBooleanIndexedvEXT (GLenum target, GLuint index, GLboolean *data); -GLAPI void APIENTRY glGetIntegerIndexedvEXT (GLenum target, GLuint index, GLint *data); -GLAPI void APIENTRY glEnableIndexedEXT (GLenum target, GLuint index); -GLAPI void APIENTRY glDisableIndexedEXT (GLenum target, GLuint index); -GLAPI GLboolean APIENTRY glIsEnabledIndexedEXT (GLenum target, GLuint index); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOLORMASKINDEXEDEXTPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -typedef void (APIENTRYP PFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum target, GLuint index, GLboolean *data); -typedef void (APIENTRYP PFNGLGETINTEGERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLint *data); -typedef void (APIENTRYP PFNGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index); -typedef void (APIENTRYP PFNGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index); -typedef GLboolean (APIENTRYP PFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index); -#endif - -#ifndef GL_NV_transform_feedback -#define GL_NV_transform_feedback 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBeginTransformFeedbackNV (GLenum primitiveMode); -GLAPI void APIENTRY glEndTransformFeedbackNV (void); -GLAPI void APIENTRY glTransformFeedbackAttribsNV (GLuint count, const GLint *attribs, GLenum bufferMode); -GLAPI void APIENTRY glBindBufferRangeNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -GLAPI void APIENTRY glBindBufferOffsetNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset); -GLAPI void APIENTRY glBindBufferBaseNV (GLenum target, GLuint index, GLuint buffer); -GLAPI void APIENTRY glTransformFeedbackVaryingsNV (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); -GLAPI void APIENTRY glActiveVaryingNV (GLuint program, const GLchar *name); -GLAPI GLint APIENTRY glGetVaryingLocationNV (GLuint program, const GLchar *name); -GLAPI void APIENTRY glGetActiveVaryingNV (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -GLAPI void APIENTRY glGetTransformFeedbackVaryingNV (GLuint program, GLuint index, GLint *location); -GLAPI void APIENTRY glTransformFeedbackStreamAttribsNV (GLsizei count, const GLint *attribs, GLsizei nbuffers, const GLint *bufstreams, GLenum bufferMode); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKNVPROC) (GLenum primitiveMode); -typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKNVPROC) (void); -typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) (GLuint count, const GLint *attribs, GLenum bufferMode); -typedef void (APIENTRYP PFNGLBINDBUFFERRANGENVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (APIENTRYP PFNGLBINDBUFFEROFFSETNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); -typedef void (APIENTRYP PFNGLBINDBUFFERBASENVPROC) (GLenum target, GLuint index, GLuint buffer); -typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); -typedef void (APIENTRYP PFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar *name); -typedef GLint (APIENTRYP PFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar *name); -typedef void (APIENTRYP PFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) (GLuint program, GLuint index, GLint *location); -typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKSTREAMATTRIBSNVPROC) (GLsizei count, const GLint *attribs, GLsizei nbuffers, const GLint *bufstreams, GLenum bufferMode); -#endif - -#ifndef GL_EXT_bindable_uniform -#define GL_EXT_bindable_uniform 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glUniformBufferEXT (GLuint program, GLint location, GLuint buffer); -GLAPI GLint APIENTRY glGetUniformBufferSizeEXT (GLuint program, GLint location); -GLAPI GLintptr APIENTRY glGetUniformOffsetEXT (GLuint program, GLint location); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLUNIFORMBUFFEREXTPROC) (GLuint program, GLint location, GLuint buffer); -typedef GLint (APIENTRYP PFNGLGETUNIFORMBUFFERSIZEEXTPROC) (GLuint program, GLint location); -typedef GLintptr (APIENTRYP PFNGLGETUNIFORMOFFSETEXTPROC) (GLuint program, GLint location); -#endif - -#ifndef GL_EXT_texture_integer -#define GL_EXT_texture_integer 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexParameterIivEXT (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glTexParameterIuivEXT (GLenum target, GLenum pname, const GLuint *params); -GLAPI void APIENTRY glGetTexParameterIivEXT (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetTexParameterIuivEXT (GLenum target, GLenum pname, GLuint *params); -GLAPI void APIENTRY glClearColorIiEXT (GLint red, GLint green, GLint blue, GLint alpha); -GLAPI void APIENTRY glClearColorIuiEXT (GLuint red, GLuint green, GLuint blue, GLuint alpha); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params); -typedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLCLEARCOLORIIEXTPROC) (GLint red, GLint green, GLint blue, GLint alpha); -typedef void (APIENTRYP PFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha); -#endif - -#ifndef GL_GREMEDY_frame_terminator -#define GL_GREMEDY_frame_terminator 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFrameTerminatorGREMEDY (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFRAMETERMINATORGREMEDYPROC) (void); -#endif - -#ifndef GL_NV_conditional_render -#define GL_NV_conditional_render 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBeginConditionalRenderNV (GLuint id, GLenum mode); -GLAPI void APIENTRY glEndConditionalRenderNV (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode); -typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERNVPROC) (void); -#endif - -#ifndef GL_NV_present_video -#define GL_NV_present_video 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPresentFrameKeyedNV (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); -GLAPI void APIENTRY glPresentFrameDualFillNV (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); -GLAPI void APIENTRY glGetVideoivNV (GLuint video_slot, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVideouivNV (GLuint video_slot, GLenum pname, GLuint *params); -GLAPI void APIENTRY glGetVideoi64vNV (GLuint video_slot, GLenum pname, GLint64EXT *params); -GLAPI void APIENTRY glGetVideoui64vNV (GLuint video_slot, GLenum pname, GLuint64EXT *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPRESENTFRAMEKEYEDNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); -typedef void (APIENTRYP PFNGLPRESENTFRAMEDUALFILLNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); -typedef void (APIENTRYP PFNGLGETVIDEOIVNVPROC) (GLuint video_slot, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVIDEOUIVNVPROC) (GLuint video_slot, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLGETVIDEOI64VNVPROC) (GLuint video_slot, GLenum pname, GLint64EXT *params); -typedef void (APIENTRYP PFNGLGETVIDEOUI64VNVPROC) (GLuint video_slot, GLenum pname, GLuint64EXT *params); -#endif - -#ifndef GL_EXT_transform_feedback -#define GL_EXT_transform_feedback 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBeginTransformFeedbackEXT (GLenum primitiveMode); -GLAPI void APIENTRY glEndTransformFeedbackEXT (void); -GLAPI void APIENTRY glBindBufferRangeEXT (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -GLAPI void APIENTRY glBindBufferOffsetEXT (GLenum target, GLuint index, GLuint buffer, GLintptr offset); -GLAPI void APIENTRY glBindBufferBaseEXT (GLenum target, GLuint index, GLuint buffer); -GLAPI void APIENTRY glTransformFeedbackVaryingsEXT (GLuint program, GLsizei count, const GLchar* *varyings, GLenum bufferMode); -GLAPI void APIENTRY glGetTransformFeedbackVaryingEXT (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKEXTPROC) (GLenum primitiveMode); -typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKEXTPROC) (void); -typedef void (APIENTRYP PFNGLBINDBUFFERRANGEEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (APIENTRYP PFNGLBINDBUFFEROFFSETEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); -typedef void (APIENTRYP PFNGLBINDBUFFERBASEEXTPROC) (GLenum target, GLuint index, GLuint buffer); -typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint program, GLsizei count, const GLchar* *varyings, GLenum bufferMode); -typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -#endif - -#ifndef GL_EXT_direct_state_access -#define GL_EXT_direct_state_access 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glClientAttribDefaultEXT (GLbitfield mask); -GLAPI void APIENTRY glPushClientAttribDefaultEXT (GLbitfield mask); -GLAPI void APIENTRY glMatrixLoadfEXT (GLenum mode, const GLfloat *m); -GLAPI void APIENTRY glMatrixLoaddEXT (GLenum mode, const GLdouble *m); -GLAPI void APIENTRY glMatrixMultfEXT (GLenum mode, const GLfloat *m); -GLAPI void APIENTRY glMatrixMultdEXT (GLenum mode, const GLdouble *m); -GLAPI void APIENTRY glMatrixLoadIdentityEXT (GLenum mode); -GLAPI void APIENTRY glMatrixRotatefEXT (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glMatrixRotatedEXT (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glMatrixScalefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glMatrixScaledEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glMatrixTranslatefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glMatrixTranslatedEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glMatrixFrustumEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -GLAPI void APIENTRY glMatrixOrthoEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -GLAPI void APIENTRY glMatrixPopEXT (GLenum mode); -GLAPI void APIENTRY glMatrixPushEXT (GLenum mode); -GLAPI void APIENTRY glMatrixLoadTransposefEXT (GLenum mode, const GLfloat *m); -GLAPI void APIENTRY glMatrixLoadTransposedEXT (GLenum mode, const GLdouble *m); -GLAPI void APIENTRY glMatrixMultTransposefEXT (GLenum mode, const GLfloat *m); -GLAPI void APIENTRY glMatrixMultTransposedEXT (GLenum mode, const GLdouble *m); -GLAPI void APIENTRY glTextureParameterfEXT (GLuint texture, GLenum target, GLenum pname, GLfloat param); -GLAPI void APIENTRY glTextureParameterfvEXT (GLuint texture, GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glTextureParameteriEXT (GLuint texture, GLenum target, GLenum pname, GLint param); -GLAPI void APIENTRY glTextureParameterivEXT (GLuint texture, GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glCopyTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -GLAPI void APIENTRY glCopyTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -GLAPI void APIENTRY glCopyTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glCopyTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glGetTextureImageEXT (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); -GLAPI void APIENTRY glGetTextureParameterfvEXT (GLuint texture, GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetTextureParameterivEXT (GLuint texture, GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetTextureLevelParameterfvEXT (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetTextureLevelParameterivEXT (GLuint texture, GLenum target, GLint level, GLenum pname, GLint *params); -GLAPI void APIENTRY glTextureImage3DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glCopyTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glMultiTexParameterfEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat param); -GLAPI void APIENTRY glMultiTexParameterfvEXT (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glMultiTexParameteriEXT (GLenum texunit, GLenum target, GLenum pname, GLint param); -GLAPI void APIENTRY glMultiTexParameterivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glCopyMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -GLAPI void APIENTRY glCopyMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -GLAPI void APIENTRY glCopyMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glCopyMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glGetMultiTexImageEXT (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); -GLAPI void APIENTRY glGetMultiTexParameterfvEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetMultiTexParameterivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetMultiTexLevelParameterfvEXT (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetMultiTexLevelParameterivEXT (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint *params); -GLAPI void APIENTRY glMultiTexImage3DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glCopyMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glBindMultiTextureEXT (GLenum texunit, GLenum target, GLuint texture); -GLAPI void APIENTRY glEnableClientStateIndexedEXT (GLenum array, GLuint index); -GLAPI void APIENTRY glDisableClientStateIndexedEXT (GLenum array, GLuint index); -GLAPI void APIENTRY glMultiTexCoordPointerEXT (GLenum texunit, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void APIENTRY glMultiTexEnvfEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat param); -GLAPI void APIENTRY glMultiTexEnvfvEXT (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glMultiTexEnviEXT (GLenum texunit, GLenum target, GLenum pname, GLint param); -GLAPI void APIENTRY glMultiTexEnvivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glMultiTexGendEXT (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); -GLAPI void APIENTRY glMultiTexGendvEXT (GLenum texunit, GLenum coord, GLenum pname, const GLdouble *params); -GLAPI void APIENTRY glMultiTexGenfEXT (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); -GLAPI void APIENTRY glMultiTexGenfvEXT (GLenum texunit, GLenum coord, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glMultiTexGeniEXT (GLenum texunit, GLenum coord, GLenum pname, GLint param); -GLAPI void APIENTRY glMultiTexGenivEXT (GLenum texunit, GLenum coord, GLenum pname, const GLint *params); -GLAPI void APIENTRY glGetMultiTexEnvfvEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetMultiTexEnvivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetMultiTexGendvEXT (GLenum texunit, GLenum coord, GLenum pname, GLdouble *params); -GLAPI void APIENTRY glGetMultiTexGenfvEXT (GLenum texunit, GLenum coord, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetMultiTexGenivEXT (GLenum texunit, GLenum coord, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetFloatIndexedvEXT (GLenum target, GLuint index, GLfloat *data); -GLAPI void APIENTRY glGetDoubleIndexedvEXT (GLenum target, GLuint index, GLdouble *data); -GLAPI void APIENTRY glGetPointerIndexedvEXT (GLenum target, GLuint index, GLvoid* *data); -GLAPI void APIENTRY glCompressedTextureImage3DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *bits); -GLAPI void APIENTRY glCompressedTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *bits); -GLAPI void APIENTRY glCompressedTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *bits); -GLAPI void APIENTRY glCompressedTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *bits); -GLAPI void APIENTRY glCompressedTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *bits); -GLAPI void APIENTRY glCompressedTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *bits); -GLAPI void APIENTRY glGetCompressedTextureImageEXT (GLuint texture, GLenum target, GLint lod, GLvoid *img); -GLAPI void APIENTRY glCompressedMultiTexImage3DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *bits); -GLAPI void APIENTRY glCompressedMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *bits); -GLAPI void APIENTRY glCompressedMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *bits); -GLAPI void APIENTRY glCompressedMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *bits); -GLAPI void APIENTRY glCompressedMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *bits); -GLAPI void APIENTRY glCompressedMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *bits); -GLAPI void APIENTRY glGetCompressedMultiTexImageEXT (GLenum texunit, GLenum target, GLint lod, GLvoid *img); -GLAPI void APIENTRY glNamedProgramStringEXT (GLuint program, GLenum target, GLenum format, GLsizei len, const GLvoid *string); -GLAPI void APIENTRY glNamedProgramLocalParameter4dEXT (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glNamedProgramLocalParameter4dvEXT (GLuint program, GLenum target, GLuint index, const GLdouble *params); -GLAPI void APIENTRY glNamedProgramLocalParameter4fEXT (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glNamedProgramLocalParameter4fvEXT (GLuint program, GLenum target, GLuint index, const GLfloat *params); -GLAPI void APIENTRY glGetNamedProgramLocalParameterdvEXT (GLuint program, GLenum target, GLuint index, GLdouble *params); -GLAPI void APIENTRY glGetNamedProgramLocalParameterfvEXT (GLuint program, GLenum target, GLuint index, GLfloat *params); -GLAPI void APIENTRY glGetNamedProgramivEXT (GLuint program, GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetNamedProgramStringEXT (GLuint program, GLenum target, GLenum pname, GLvoid *string); -GLAPI void APIENTRY glNamedProgramLocalParameters4fvEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat *params); -GLAPI void APIENTRY glNamedProgramLocalParameterI4iEXT (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -GLAPI void APIENTRY glNamedProgramLocalParameterI4ivEXT (GLuint program, GLenum target, GLuint index, const GLint *params); -GLAPI void APIENTRY glNamedProgramLocalParametersI4ivEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint *params); -GLAPI void APIENTRY glNamedProgramLocalParameterI4uiEXT (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -GLAPI void APIENTRY glNamedProgramLocalParameterI4uivEXT (GLuint program, GLenum target, GLuint index, const GLuint *params); -GLAPI void APIENTRY glNamedProgramLocalParametersI4uivEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint *params); -GLAPI void APIENTRY glGetNamedProgramLocalParameterIivEXT (GLuint program, GLenum target, GLuint index, GLint *params); -GLAPI void APIENTRY glGetNamedProgramLocalParameterIuivEXT (GLuint program, GLenum target, GLuint index, GLuint *params); -GLAPI void APIENTRY glTextureParameterIivEXT (GLuint texture, GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glTextureParameterIuivEXT (GLuint texture, GLenum target, GLenum pname, const GLuint *params); -GLAPI void APIENTRY glGetTextureParameterIivEXT (GLuint texture, GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetTextureParameterIuivEXT (GLuint texture, GLenum target, GLenum pname, GLuint *params); -GLAPI void APIENTRY glMultiTexParameterIivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glMultiTexParameterIuivEXT (GLenum texunit, GLenum target, GLenum pname, const GLuint *params); -GLAPI void APIENTRY glGetMultiTexParameterIivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetMultiTexParameterIuivEXT (GLenum texunit, GLenum target, GLenum pname, GLuint *params); -GLAPI void APIENTRY glProgramUniform1fEXT (GLuint program, GLint location, GLfloat v0); -GLAPI void APIENTRY glProgramUniform2fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1); -GLAPI void APIENTRY glProgramUniform3fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -GLAPI void APIENTRY glProgramUniform4fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -GLAPI void APIENTRY glProgramUniform1iEXT (GLuint program, GLint location, GLint v0); -GLAPI void APIENTRY glProgramUniform2iEXT (GLuint program, GLint location, GLint v0, GLint v1); -GLAPI void APIENTRY glProgramUniform3iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); -GLAPI void APIENTRY glProgramUniform4iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -GLAPI void APIENTRY glProgramUniform1fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform2fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform3fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform4fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform1ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform2ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform3ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform4ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniformMatrix2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix2x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix3x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix2x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix4x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix3x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix4x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform1uiEXT (GLuint program, GLint location, GLuint v0); -GLAPI void APIENTRY glProgramUniform2uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1); -GLAPI void APIENTRY glProgramUniform3uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); -GLAPI void APIENTRY glProgramUniform4uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -GLAPI void APIENTRY glProgramUniform1uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniform2uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniform3uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniform4uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glNamedBufferDataEXT (GLuint buffer, GLsizeiptr size, const GLvoid *data, GLenum usage); -GLAPI void APIENTRY glNamedBufferSubDataEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, const GLvoid *data); -GLAPI GLvoid* APIENTRY glMapNamedBufferEXT (GLuint buffer, GLenum access); -GLAPI GLboolean APIENTRY glUnmapNamedBufferEXT (GLuint buffer); -GLAPI GLvoid* APIENTRY glMapNamedBufferRangeEXT (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); -GLAPI void APIENTRY glFlushMappedNamedBufferRangeEXT (GLuint buffer, GLintptr offset, GLsizeiptr length); -GLAPI void APIENTRY glNamedCopyBufferSubDataEXT (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -GLAPI void APIENTRY glGetNamedBufferParameterivEXT (GLuint buffer, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetNamedBufferPointervEXT (GLuint buffer, GLenum pname, GLvoid* *params); -GLAPI void APIENTRY glGetNamedBufferSubDataEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, GLvoid *data); -GLAPI void APIENTRY glTextureBufferEXT (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); -GLAPI void APIENTRY glMultiTexBufferEXT (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); -GLAPI void APIENTRY glNamedRenderbufferStorageEXT (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glGetNamedRenderbufferParameterivEXT (GLuint renderbuffer, GLenum pname, GLint *params); -GLAPI GLenum APIENTRY glCheckNamedFramebufferStatusEXT (GLuint framebuffer, GLenum target); -GLAPI void APIENTRY glNamedFramebufferTexture1DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -GLAPI void APIENTRY glNamedFramebufferTexture2DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -GLAPI void APIENTRY glNamedFramebufferTexture3DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -GLAPI void APIENTRY glNamedFramebufferRenderbufferEXT (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -GLAPI void APIENTRY glGetNamedFramebufferAttachmentParameterivEXT (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); -GLAPI void APIENTRY glGenerateTextureMipmapEXT (GLuint texture, GLenum target); -GLAPI void APIENTRY glGenerateMultiTexMipmapEXT (GLenum texunit, GLenum target); -GLAPI void APIENTRY glFramebufferDrawBufferEXT (GLuint framebuffer, GLenum mode); -GLAPI void APIENTRY glFramebufferDrawBuffersEXT (GLuint framebuffer, GLsizei n, const GLenum *bufs); -GLAPI void APIENTRY glFramebufferReadBufferEXT (GLuint framebuffer, GLenum mode); -GLAPI void APIENTRY glGetFramebufferParameterivEXT (GLuint framebuffer, GLenum pname, GLint *params); -GLAPI void APIENTRY glNamedRenderbufferStorageMultisampleEXT (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glNamedRenderbufferStorageMultisampleCoverageEXT (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glNamedFramebufferTextureEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); -GLAPI void APIENTRY glNamedFramebufferTextureLayerEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); -GLAPI void APIENTRY glNamedFramebufferTextureFaceEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); -GLAPI void APIENTRY glTextureRenderbufferEXT (GLuint texture, GLenum target, GLuint renderbuffer); -GLAPI void APIENTRY glMultiTexRenderbufferEXT (GLenum texunit, GLenum target, GLuint renderbuffer); -GLAPI void APIENTRY glProgramUniform1dEXT (GLuint program, GLint location, GLdouble x); -GLAPI void APIENTRY glProgramUniform2dEXT (GLuint program, GLint location, GLdouble x, GLdouble y); -GLAPI void APIENTRY glProgramUniform3dEXT (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glProgramUniform4dEXT (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glProgramUniform1dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform2dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform3dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform4dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix2x3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix2x4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix3x2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix3x4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix4x2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix4x3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); -typedef void (APIENTRYP PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); -typedef void (APIENTRYP PFNGLMATRIXLOADFEXTPROC) (GLenum mode, const GLfloat *m); -typedef void (APIENTRYP PFNGLMATRIXLOADDEXTPROC) (GLenum mode, const GLdouble *m); -typedef void (APIENTRYP PFNGLMATRIXMULTFEXTPROC) (GLenum mode, const GLfloat *m); -typedef void (APIENTRYP PFNGLMATRIXMULTDEXTPROC) (GLenum mode, const GLdouble *m); -typedef void (APIENTRYP PFNGLMATRIXLOADIDENTITYEXTPROC) (GLenum mode); -typedef void (APIENTRYP PFNGLMATRIXROTATEFEXTPROC) (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLMATRIXROTATEDEXTPROC) (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLMATRIXSCALEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLMATRIXSCALEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLMATRIXTRANSLATEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLMATRIXTRANSLATEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLMATRIXFRUSTUMEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -typedef void (APIENTRYP PFNGLMATRIXORTHOEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -typedef void (APIENTRYP PFNGLMATRIXPOPEXTPROC) (GLenum mode); -typedef void (APIENTRYP PFNGLMATRIXPUSHEXTPROC) (GLenum mode); -typedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m); -typedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m); -typedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m); -typedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLCOPYTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -typedef void (APIENTRYP PFNGLCOPYTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); -typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLMULTITEXPARAMETERFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLCOPYMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -typedef void (APIENTRYP PFNGLCOPYMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); -typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLBINDMULTITEXTUREEXTPROC) (GLenum texunit, GLenum target, GLuint texture); -typedef void (APIENTRYP PFNGLENABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); -typedef void (APIENTRYP PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); -typedef void (APIENTRYP PFNGLMULTITEXCOORDPOINTEREXTPROC) (GLenum texunit, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLMULTITEXENVFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLMULTITEXENVIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLMULTITEXGENDEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); -typedef void (APIENTRYP PFNGLMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLdouble *params); -typedef void (APIENTRYP PFNGLMULTITEXGENFEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLMULTITEXGENIEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLGETMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLGETMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETFLOATINDEXEDVEXTPROC) (GLenum target, GLuint index, GLfloat *data); -typedef void (APIENTRYP PFNGLGETDOUBLEINDEXEDVEXTPROC) (GLenum target, GLuint index, GLdouble *data); -typedef void (APIENTRYP PFNGLGETPOINTERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLvoid* *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *bits); -typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint lod, GLvoid *img); -typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *bits); -typedef void (APIENTRYP PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint lod, GLvoid *img); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum format, GLsizei len, const GLvoid *string); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLdouble *params); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLfloat *params); -typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble *params); -typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat *params); -typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMIVEXTPROC) (GLuint program, GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum pname, GLvoid *string); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat *params); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC) (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLint *params); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint *params); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLuint *params); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint *params); -typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLint *params); -typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint *params); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLuint *params); -typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLuint *params); -typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLsizeiptr size, const GLvoid *data, GLenum usage); -typedef void (APIENTRYP PFNGLNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const GLvoid *data); -typedef GLvoid* (APIENTRYP PFNGLMAPNAMEDBUFFEREXTPROC) (GLuint buffer, GLenum access); -typedef GLboolean (APIENTRYP PFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer); -typedef GLvoid* (APIENTRYP PFNGLMAPNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); -typedef void (APIENTRYP PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); -typedef void (APIENTRYP PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) (GLuint buffer, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPOINTERVEXTPROC) (GLuint buffer, GLenum pname, GLvoid* *params); -typedef void (APIENTRYP PFNGLGETNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLvoid *data); -typedef void (APIENTRYP PFNGLTEXTUREBUFFEREXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); -typedef void (APIENTRYP PFNGLMULTITEXBUFFEREXTPROC) (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); -typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) (GLuint renderbuffer, GLenum pname, GLint *params); -typedef GLenum (APIENTRYP PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) (GLuint framebuffer, GLenum target); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGENERATETEXTUREMIPMAPEXTPROC) (GLuint texture, GLenum target); -typedef void (APIENTRYP PFNGLGENERATEMULTITEXMIPMAPEXTPROC) (GLenum texunit, GLenum target); -typedef void (APIENTRYP PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); -typedef void (APIENTRYP PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) (GLuint framebuffer, GLsizei n, const GLenum *bufs); -typedef void (APIENTRYP PFNGLFRAMEBUFFERREADBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); -typedef void (APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); -typedef void (APIENTRYP PFNGLTEXTURERENDERBUFFEREXTPROC) (GLuint texture, GLenum target, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLMULTITEXRENDERBUFFEREXTPROC) (GLenum texunit, GLenum target, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DEXTPROC) (GLuint program, GLint location, GLdouble x); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -#endif - -#ifndef GL_EXT_vertex_array_bgra -#define GL_EXT_vertex_array_bgra 1 -#endif - -#ifndef GL_EXT_texture_swizzle -#define GL_EXT_texture_swizzle 1 -#endif - -#ifndef GL_NV_explicit_multisample -#define GL_NV_explicit_multisample 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetMultisamplefvNV (GLenum pname, GLuint index, GLfloat *val); -GLAPI void APIENTRY glSampleMaskIndexedNV (GLuint index, GLbitfield mask); -GLAPI void APIENTRY glTexRenderbufferNV (GLenum target, GLuint renderbuffer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVNVPROC) (GLenum pname, GLuint index, GLfloat *val); -typedef void (APIENTRYP PFNGLSAMPLEMASKINDEXEDNVPROC) (GLuint index, GLbitfield mask); -typedef void (APIENTRYP PFNGLTEXRENDERBUFFERNVPROC) (GLenum target, GLuint renderbuffer); -#endif - -#ifndef GL_NV_transform_feedback2 -#define GL_NV_transform_feedback2 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindTransformFeedbackNV (GLenum target, GLuint id); -GLAPI void APIENTRY glDeleteTransformFeedbacksNV (GLsizei n, const GLuint *ids); -GLAPI void APIENTRY glGenTransformFeedbacksNV (GLsizei n, GLuint *ids); -GLAPI GLboolean APIENTRY glIsTransformFeedbackNV (GLuint id); -GLAPI void APIENTRY glPauseTransformFeedbackNV (void); -GLAPI void APIENTRY glResumeTransformFeedbackNV (void); -GLAPI void APIENTRY glDrawTransformFeedbackNV (GLenum mode, GLuint id); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBINDTRANSFORMFEEDBACKNVPROC) (GLenum target, GLuint id); -typedef void (APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSNVPROC) (GLsizei n, const GLuint *ids); -typedef void (APIENTRYP PFNGLGENTRANSFORMFEEDBACKSNVPROC) (GLsizei n, GLuint *ids); -typedef GLboolean (APIENTRYP PFNGLISTRANSFORMFEEDBACKNVPROC) (GLuint id); -typedef void (APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKNVPROC) (void); -typedef void (APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKNVPROC) (void); -typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKNVPROC) (GLenum mode, GLuint id); -#endif - -#ifndef GL_ATI_meminfo -#define GL_ATI_meminfo 1 -#endif - -#ifndef GL_AMD_performance_monitor -#define GL_AMD_performance_monitor 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetPerfMonitorGroupsAMD (GLint *numGroups, GLsizei groupsSize, GLuint *groups); -GLAPI void APIENTRY glGetPerfMonitorCountersAMD (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); -GLAPI void APIENTRY glGetPerfMonitorGroupStringAMD (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); -GLAPI void APIENTRY glGetPerfMonitorCounterStringAMD (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); -GLAPI void APIENTRY glGetPerfMonitorCounterInfoAMD (GLuint group, GLuint counter, GLenum pname, GLvoid *data); -GLAPI void APIENTRY glGenPerfMonitorsAMD (GLsizei n, GLuint *monitors); -GLAPI void APIENTRY glDeletePerfMonitorsAMD (GLsizei n, GLuint *monitors); -GLAPI void APIENTRY glSelectPerfMonitorCountersAMD (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); -GLAPI void APIENTRY glBeginPerfMonitorAMD (GLuint monitor); -GLAPI void APIENTRY glEndPerfMonitorAMD (GLuint monitor); -GLAPI void APIENTRY glGetPerfMonitorCounterDataAMD (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint *numGroups, GLsizei groupsSize, GLuint *groups); -typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); -typedef void (APIENTRYP PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); -typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); -typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, GLvoid *data); -typedef void (APIENTRYP PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); -typedef void (APIENTRYP PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); -typedef void (APIENTRYP PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); -typedef void (APIENTRYP PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor); -typedef void (APIENTRYP PFNGLENDPERFMONITORAMDPROC) (GLuint monitor); -typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); -#endif - -#ifndef GL_AMD_texture_texture4 -#define GL_AMD_texture_texture4 1 -#endif - -#ifndef GL_AMD_vertex_shader_tesselator -#define GL_AMD_vertex_shader_tesselator 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTessellationFactorAMD (GLfloat factor); -GLAPI void APIENTRY glTessellationModeAMD (GLenum mode); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTESSELLATIONFACTORAMDPROC) (GLfloat factor); -typedef void (APIENTRYP PFNGLTESSELLATIONMODEAMDPROC) (GLenum mode); -#endif - -#ifndef GL_EXT_provoking_vertex -#define GL_EXT_provoking_vertex 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProvokingVertexEXT (GLenum mode); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPROVOKINGVERTEXEXTPROC) (GLenum mode); -#endif - -#ifndef GL_EXT_texture_snorm -#define GL_EXT_texture_snorm 1 -#endif - -#ifndef GL_AMD_draw_buffers_blend -#define GL_AMD_draw_buffers_blend 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendFuncIndexedAMD (GLuint buf, GLenum src, GLenum dst); -GLAPI void APIENTRY glBlendFuncSeparateIndexedAMD (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -GLAPI void APIENTRY glBlendEquationIndexedAMD (GLuint buf, GLenum mode); -GLAPI void APIENTRY glBlendEquationSeparateIndexedAMD (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDFUNCINDEXEDAMDPROC) (GLuint buf, GLenum src, GLenum dst); -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -typedef void (APIENTRYP PFNGLBLENDEQUATIONINDEXEDAMDPROC) (GLuint buf, GLenum mode); -typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -#endif - -#ifndef GL_APPLE_texture_range -#define GL_APPLE_texture_range 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTextureRangeAPPLE (GLenum target, GLsizei length, const GLvoid *pointer); -GLAPI void APIENTRY glGetTexParameterPointervAPPLE (GLenum target, GLenum pname, GLvoid* *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXTURERANGEAPPLEPROC) (GLenum target, GLsizei length, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC) (GLenum target, GLenum pname, GLvoid* *params); -#endif - -#ifndef GL_APPLE_float_pixels -#define GL_APPLE_float_pixels 1 -#endif - -#ifndef GL_APPLE_vertex_program_evaluators -#define GL_APPLE_vertex_program_evaluators 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glEnableVertexAttribAPPLE (GLuint index, GLenum pname); -GLAPI void APIENTRY glDisableVertexAttribAPPLE (GLuint index, GLenum pname); -GLAPI GLboolean APIENTRY glIsVertexAttribEnabledAPPLE (GLuint index, GLenum pname); -GLAPI void APIENTRY glMapVertexAttrib1dAPPLE (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); -GLAPI void APIENTRY glMapVertexAttrib1fAPPLE (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); -GLAPI void APIENTRY glMapVertexAttrib2dAPPLE (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); -GLAPI void APIENTRY glMapVertexAttrib2fAPPLE (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); -typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); -typedef GLboolean (APIENTRYP PFNGLISVERTEXATTRIBENABLEDAPPLEPROC) (GLuint index, GLenum pname); -typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB1DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); -typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB1FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); -typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB2DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); -typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB2FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); -#endif - -#ifndef GL_APPLE_aux_depth_stencil -#define GL_APPLE_aux_depth_stencil 1 -#endif - -#ifndef GL_APPLE_object_purgeable -#define GL_APPLE_object_purgeable 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLenum APIENTRY glObjectPurgeableAPPLE (GLenum objectType, GLuint name, GLenum option); -GLAPI GLenum APIENTRY glObjectUnpurgeableAPPLE (GLenum objectType, GLuint name, GLenum option); -GLAPI void APIENTRY glGetObjectParameterivAPPLE (GLenum objectType, GLuint name, GLenum pname, GLint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLenum (APIENTRYP PFNGLOBJECTPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); -typedef GLenum (APIENTRYP PFNGLOBJECTUNPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); -typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVAPPLEPROC) (GLenum objectType, GLuint name, GLenum pname, GLint *params); -#endif - -#ifndef GL_APPLE_row_bytes -#define GL_APPLE_row_bytes 1 -#endif - -#ifndef GL_APPLE_rgb_422 -#define GL_APPLE_rgb_422 1 -#endif - -#ifndef GL_NV_video_capture -#define GL_NV_video_capture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBeginVideoCaptureNV (GLuint video_capture_slot); -GLAPI void APIENTRY glBindVideoCaptureStreamBufferNV (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); -GLAPI void APIENTRY glBindVideoCaptureStreamTextureNV (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); -GLAPI void APIENTRY glEndVideoCaptureNV (GLuint video_capture_slot); -GLAPI void APIENTRY glGetVideoCaptureivNV (GLuint video_capture_slot, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVideoCaptureStreamivNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVideoCaptureStreamfvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetVideoCaptureStreamdvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble *params); -GLAPI GLenum APIENTRY glVideoCaptureNV (GLuint video_capture_slot, GLuint *sequence_num, GLuint64EXT *capture_time); -GLAPI void APIENTRY glVideoCaptureStreamParameterivNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint *params); -GLAPI void APIENTRY glVideoCaptureStreamParameterfvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glVideoCaptureStreamParameterdvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBEGINVIDEOCAPTURENVPROC) (GLuint video_capture_slot); -typedef void (APIENTRYP PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); -typedef void (APIENTRYP PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); -typedef void (APIENTRYP PFNGLENDVIDEOCAPTURENVPROC) (GLuint video_capture_slot); -typedef void (APIENTRYP PFNGLGETVIDEOCAPTUREIVNVPROC) (GLuint video_capture_slot, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble *params); -typedef GLenum (APIENTRYP PFNGLVIDEOCAPTURENVPROC) (GLuint video_capture_slot, GLuint *sequence_num, GLuint64EXT *capture_time); -typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble *params); -#endif - -#ifndef GL_NV_copy_image -#define GL_NV_copy_image 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCopyImageSubDataNV (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOPYIMAGESUBDATANVPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); -#endif - -#ifndef GL_EXT_separate_shader_objects -#define GL_EXT_separate_shader_objects 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glUseShaderProgramEXT (GLenum type, GLuint program); -GLAPI void APIENTRY glActiveProgramEXT (GLuint program); -GLAPI GLuint APIENTRY glCreateShaderProgramEXT (GLenum type, const GLchar *string); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLUSESHADERPROGRAMEXTPROC) (GLenum type, GLuint program); -typedef void (APIENTRYP PFNGLACTIVEPROGRAMEXTPROC) (GLuint program); -typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMEXTPROC) (GLenum type, const GLchar *string); -#endif - -#ifndef GL_NV_parameter_buffer_object2 -#define GL_NV_parameter_buffer_object2 1 -#endif - -#ifndef GL_NV_shader_buffer_load -#define GL_NV_shader_buffer_load 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMakeBufferResidentNV (GLenum target, GLenum access); -GLAPI void APIENTRY glMakeBufferNonResidentNV (GLenum target); -GLAPI GLboolean APIENTRY glIsBufferResidentNV (GLenum target); -GLAPI void APIENTRY glMakeNamedBufferResidentNV (GLuint buffer, GLenum access); -GLAPI void APIENTRY glMakeNamedBufferNonResidentNV (GLuint buffer); -GLAPI GLboolean APIENTRY glIsNamedBufferResidentNV (GLuint buffer); -GLAPI void APIENTRY glGetBufferParameterui64vNV (GLenum target, GLenum pname, GLuint64EXT *params); -GLAPI void APIENTRY glGetNamedBufferParameterui64vNV (GLuint buffer, GLenum pname, GLuint64EXT *params); -GLAPI void APIENTRY glGetIntegerui64vNV (GLenum value, GLuint64EXT *result); -GLAPI void APIENTRY glUniformui64NV (GLint location, GLuint64EXT value); -GLAPI void APIENTRY glUniformui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glGetUniformui64vNV (GLuint program, GLint location, GLuint64EXT *params); -GLAPI void APIENTRY glProgramUniformui64NV (GLuint program, GLint location, GLuint64EXT value); -GLAPI void APIENTRY glProgramUniformui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLMAKEBUFFERRESIDENTNVPROC) (GLenum target, GLenum access); -typedef void (APIENTRYP PFNGLMAKEBUFFERNONRESIDENTNVPROC) (GLenum target); -typedef GLboolean (APIENTRYP PFNGLISBUFFERRESIDENTNVPROC) (GLenum target); -typedef void (APIENTRYP PFNGLMAKENAMEDBUFFERRESIDENTNVPROC) (GLuint buffer, GLenum access); -typedef void (APIENTRYP PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC) (GLuint buffer); -typedef GLboolean (APIENTRYP PFNGLISNAMEDBUFFERRESIDENTNVPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERUI64VNVPROC) (GLenum target, GLenum pname, GLuint64EXT *params); -typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC) (GLuint buffer, GLenum pname, GLuint64EXT *params); -typedef void (APIENTRYP PFNGLGETINTEGERUI64VNVPROC) (GLenum value, GLuint64EXT *result); -typedef void (APIENTRYP PFNGLUNIFORMUI64NVPROC) (GLint location, GLuint64EXT value); -typedef void (APIENTRYP PFNGLUNIFORMUI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLGETUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLuint64EXT *params); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMUI64NVPROC) (GLuint program, GLint location, GLuint64EXT value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -#endif - -#ifndef GL_NV_vertex_buffer_unified_memory -#define GL_NV_vertex_buffer_unified_memory 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBufferAddressRangeNV (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); -GLAPI void APIENTRY glVertexFormatNV (GLint size, GLenum type, GLsizei stride); -GLAPI void APIENTRY glNormalFormatNV (GLenum type, GLsizei stride); -GLAPI void APIENTRY glColorFormatNV (GLint size, GLenum type, GLsizei stride); -GLAPI void APIENTRY glIndexFormatNV (GLenum type, GLsizei stride); -GLAPI void APIENTRY glTexCoordFormatNV (GLint size, GLenum type, GLsizei stride); -GLAPI void APIENTRY glEdgeFlagFormatNV (GLsizei stride); -GLAPI void APIENTRY glSecondaryColorFormatNV (GLint size, GLenum type, GLsizei stride); -GLAPI void APIENTRY glFogCoordFormatNV (GLenum type, GLsizei stride); -GLAPI void APIENTRY glVertexAttribFormatNV (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); -GLAPI void APIENTRY glVertexAttribIFormatNV (GLuint index, GLint size, GLenum type, GLsizei stride); -GLAPI void APIENTRY glGetIntegerui64i_vNV (GLenum value, GLuint index, GLuint64EXT *result); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBUFFERADDRESSRANGENVPROC) (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); -typedef void (APIENTRYP PFNGLVERTEXFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLNORMALFORMATNVPROC) (GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLINDEXFORMATNVPROC) (GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLTEXCOORDFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLEDGEFLAGFORMATNVPROC) (GLsizei stride); -typedef void (APIENTRYP PFNGLSECONDARYCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLFOGCOORDFORMATNVPROC) (GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLVERTEXATTRIBFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); -typedef void (APIENTRYP PFNGLVERTEXATTRIBIFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLGETINTEGERUI64I_VNVPROC) (GLenum value, GLuint index, GLuint64EXT *result); -#endif - -#ifndef GL_NV_texture_barrier -#define GL_NV_texture_barrier 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTextureBarrierNV (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXTUREBARRIERNVPROC) (void); -#endif - -#ifndef GL_AMD_shader_stencil_export -#define GL_AMD_shader_stencil_export 1 -#endif - -#ifndef GL_AMD_seamless_cubemap_per_texture -#define GL_AMD_seamless_cubemap_per_texture 1 -#endif - -#ifndef GL_AMD_conservative_depth -#define GL_AMD_conservative_depth 1 -#endif - -#ifndef GL_EXT_shader_image_load_store -#define GL_EXT_shader_image_load_store 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindImageTextureEXT (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); -GLAPI void APIENTRY glMemoryBarrierEXT (GLbitfield barriers); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBINDIMAGETEXTUREEXTPROC) (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); -typedef void (APIENTRYP PFNGLMEMORYBARRIEREXTPROC) (GLbitfield barriers); -#endif - -#ifndef GL_EXT_vertex_attrib_64bit -#define GL_EXT_vertex_attrib_64bit 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttribL1dEXT (GLuint index, GLdouble x); -GLAPI void APIENTRY glVertexAttribL2dEXT (GLuint index, GLdouble x, GLdouble y); -GLAPI void APIENTRY glVertexAttribL3dEXT (GLuint index, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glVertexAttribL4dEXT (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glVertexAttribL1dvEXT (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribL2dvEXT (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribL3dvEXT (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribL4dvEXT (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribLPointerEXT (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void APIENTRY glGetVertexAttribLdvEXT (GLuint index, GLenum pname, GLdouble *params); -GLAPI void APIENTRY glVertexArrayVertexAttribLOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DEXTPROC) (GLuint index, GLdouble x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DEXTPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DVEXTPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DVEXTPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DVEXTPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DVEXTPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLDVEXTPROC) (GLuint index, GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); -#endif - -#ifndef GL_NV_gpu_program5 -#define GL_NV_gpu_program5 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramSubroutineParametersuivNV (GLenum target, GLsizei count, const GLuint *params); -GLAPI void APIENTRY glGetProgramSubroutineParameteruivNV (GLenum target, GLuint index, GLuint *param); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPROGRAMSUBROUTINEPARAMETERSUIVNVPROC) (GLenum target, GLsizei count, const GLuint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMSUBROUTINEPARAMETERUIVNVPROC) (GLenum target, GLuint index, GLuint *param); -#endif - -#ifndef GL_NV_gpu_shader5 -#define GL_NV_gpu_shader5 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glUniform1i64NV (GLint location, GLint64EXT x); -GLAPI void APIENTRY glUniform2i64NV (GLint location, GLint64EXT x, GLint64EXT y); -GLAPI void APIENTRY glUniform3i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); -GLAPI void APIENTRY glUniform4i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -GLAPI void APIENTRY glUniform1i64vNV (GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glUniform2i64vNV (GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glUniform3i64vNV (GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glUniform4i64vNV (GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glUniform1ui64NV (GLint location, GLuint64EXT x); -GLAPI void APIENTRY glUniform2ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y); -GLAPI void APIENTRY glUniform3ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -GLAPI void APIENTRY glUniform4ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -GLAPI void APIENTRY glUniform1ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glUniform2ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glUniform3ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glUniform4ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glGetUniformi64vNV (GLuint program, GLint location, GLint64EXT *params); -GLAPI void APIENTRY glProgramUniform1i64NV (GLuint program, GLint location, GLint64EXT x); -GLAPI void APIENTRY glProgramUniform2i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); -GLAPI void APIENTRY glProgramUniform3i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); -GLAPI void APIENTRY glProgramUniform4i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -GLAPI void APIENTRY glProgramUniform1i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glProgramUniform2i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glProgramUniform3i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glProgramUniform4i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glProgramUniform1ui64NV (GLuint program, GLint location, GLuint64EXT x); -GLAPI void APIENTRY glProgramUniform2ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); -GLAPI void APIENTRY glProgramUniform3ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -GLAPI void APIENTRY glProgramUniform4ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -GLAPI void APIENTRY glProgramUniform1ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glProgramUniform2ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glProgramUniform3ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glProgramUniform4ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLUNIFORM1I64NVPROC) (GLint location, GLint64EXT x); -typedef void (APIENTRYP PFNGLUNIFORM2I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y); -typedef void (APIENTRYP PFNGLUNIFORM3I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); -typedef void (APIENTRYP PFNGLUNIFORM4I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -typedef void (APIENTRYP PFNGLUNIFORM1I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLUNIFORM2I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLUNIFORM3I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLUNIFORM4I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLUNIFORM1UI64NVPROC) (GLint location, GLuint64EXT x); -typedef void (APIENTRYP PFNGLUNIFORM2UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y); -typedef void (APIENTRYP PFNGLUNIFORM3UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -typedef void (APIENTRYP PFNGLUNIFORM4UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -typedef void (APIENTRYP PFNGLUNIFORM1UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLUNIFORM2UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLUNIFORM3UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLUNIFORM4UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLGETUNIFORMI64VNVPROC) (GLuint program, GLint location, GLint64EXT *params); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64NVPROC) (GLuint program, GLint location, GLint64EXT x); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -#endif - -#ifndef GL_NV_shader_buffer_store -#define GL_NV_shader_buffer_store 1 -#endif - -#ifndef GL_NV_tessellation_program5 -#define GL_NV_tessellation_program5 1 -#endif - -#ifndef GL_NV_vertex_attrib_integer_64bit -#define GL_NV_vertex_attrib_integer_64bit 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttribL1i64NV (GLuint index, GLint64EXT x); -GLAPI void APIENTRY glVertexAttribL2i64NV (GLuint index, GLint64EXT x, GLint64EXT y); -GLAPI void APIENTRY glVertexAttribL3i64NV (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); -GLAPI void APIENTRY glVertexAttribL4i64NV (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -GLAPI void APIENTRY glVertexAttribL1i64vNV (GLuint index, const GLint64EXT *v); -GLAPI void APIENTRY glVertexAttribL2i64vNV (GLuint index, const GLint64EXT *v); -GLAPI void APIENTRY glVertexAttribL3i64vNV (GLuint index, const GLint64EXT *v); -GLAPI void APIENTRY glVertexAttribL4i64vNV (GLuint index, const GLint64EXT *v); -GLAPI void APIENTRY glVertexAttribL1ui64NV (GLuint index, GLuint64EXT x); -GLAPI void APIENTRY glVertexAttribL2ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y); -GLAPI void APIENTRY glVertexAttribL3ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -GLAPI void APIENTRY glVertexAttribL4ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -GLAPI void APIENTRY glVertexAttribL1ui64vNV (GLuint index, const GLuint64EXT *v); -GLAPI void APIENTRY glVertexAttribL2ui64vNV (GLuint index, const GLuint64EXT *v); -GLAPI void APIENTRY glVertexAttribL3ui64vNV (GLuint index, const GLuint64EXT *v); -GLAPI void APIENTRY glVertexAttribL4ui64vNV (GLuint index, const GLuint64EXT *v); -GLAPI void APIENTRY glGetVertexAttribLi64vNV (GLuint index, GLenum pname, GLint64EXT *params); -GLAPI void APIENTRY glGetVertexAttribLui64vNV (GLuint index, GLenum pname, GLuint64EXT *params); -GLAPI void APIENTRY glVertexAttribLFormatNV (GLuint index, GLint size, GLenum type, GLsizei stride); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1I64NVPROC) (GLuint index, GLint64EXT x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1I64VNVPROC) (GLuint index, const GLint64EXT *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2I64VNVPROC) (GLuint index, const GLint64EXT *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3I64VNVPROC) (GLuint index, const GLint64EXT *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4I64VNVPROC) (GLuint index, const GLint64EXT *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64NVPROC) (GLuint index, GLuint64EXT x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64VNVPROC) (GLuint index, const GLuint64EXT *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2UI64VNVPROC) (GLuint index, const GLuint64EXT *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3UI64VNVPROC) (GLuint index, const GLuint64EXT *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4UI64VNVPROC) (GLuint index, const GLuint64EXT *v); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLI64VNVPROC) (GLuint index, GLenum pname, GLint64EXT *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLUI64VNVPROC) (GLuint index, GLenum pname, GLuint64EXT *params); -typedef void (APIENTRYP PFNGLVERTEXATTRIBLFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); -#endif - -#ifndef GL_NV_multisample_coverage -#define GL_NV_multisample_coverage 1 -#endif - -#ifndef GL_AMD_name_gen_delete -#define GL_AMD_name_gen_delete 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenNamesAMD (GLenum identifier, GLuint num, GLuint *names); -GLAPI void APIENTRY glDeleteNamesAMD (GLenum identifier, GLuint num, const GLuint *names); -GLAPI GLboolean APIENTRY glIsNameAMD (GLenum identifier, GLuint name); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGENNAMESAMDPROC) (GLenum identifier, GLuint num, GLuint *names); -typedef void (APIENTRYP PFNGLDELETENAMESAMDPROC) (GLenum identifier, GLuint num, const GLuint *names); -typedef GLboolean (APIENTRYP PFNGLISNAMEAMDPROC) (GLenum identifier, GLuint name); -#endif - -#ifndef GL_AMD_debug_output -#define GL_AMD_debug_output 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDebugMessageEnableAMD (GLenum category, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -GLAPI void APIENTRY glDebugMessageInsertAMD (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar *buf); -GLAPI void APIENTRY glDebugMessageCallbackAMD (GLDEBUGPROCAMD callback, GLvoid *userParam); -GLAPI GLuint APIENTRY glGetDebugMessageLogAMD (GLuint count, GLsizei bufsize, GLenum *categories, GLuint *severities, GLuint *ids, GLsizei *lengths, GLchar *message); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDEBUGMESSAGEENABLEAMDPROC) (GLenum category, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTAMDPROC) (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar *buf); -typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKAMDPROC) (GLDEBUGPROCAMD callback, GLvoid *userParam); -typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGAMDPROC) (GLuint count, GLsizei bufsize, GLenum *categories, GLuint *severities, GLuint *ids, GLsizei *lengths, GLchar *message); -#endif - -#ifndef GL_NV_vdpau_interop -#define GL_NV_vdpau_interop 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVDPAUInitNV (const GLvoid *vdpDevice, const GLvoid *getProcAddress); -GLAPI void APIENTRY glVDPAUFiniNV (void); -GLAPI GLvdpauSurfaceNV APIENTRY glVDPAURegisterVideoSurfaceNV (GLvoid *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); -GLAPI GLvdpauSurfaceNV APIENTRY glVDPAURegisterOutputSurfaceNV (GLvoid *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); -GLAPI void APIENTRY glVDPAUIsSurfaceNV (GLvdpauSurfaceNV surface); -GLAPI void APIENTRY glVDPAUUnregisterSurfaceNV (GLvdpauSurfaceNV surface); -GLAPI void APIENTRY glVDPAUGetSurfaceivNV (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); -GLAPI void APIENTRY glVDPAUSurfaceAccessNV (GLvdpauSurfaceNV surface, GLenum access); -GLAPI void APIENTRY glVDPAUMapSurfacesNV (GLsizei numSurfaces, const GLvdpauSurfaceNV *surfaces); -GLAPI void APIENTRY glVDPAUUnmapSurfacesNV (GLsizei numSurface, const GLvdpauSurfaceNV *surfaces); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVDPAUINITNVPROC) (const GLvoid *vdpDevice, const GLvoid *getProcAddress); -typedef void (APIENTRYP PFNGLVDPAUFININVPROC) (void); -typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTERVIDEOSURFACENVPROC) (GLvoid *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); -typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC) (GLvoid *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); -typedef void (APIENTRYP PFNGLVDPAUISSURFACENVPROC) (GLvdpauSurfaceNV surface); -typedef void (APIENTRYP PFNGLVDPAUUNREGISTERSURFACENVPROC) (GLvdpauSurfaceNV surface); -typedef void (APIENTRYP PFNGLVDPAUGETSURFACEIVNVPROC) (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); -typedef void (APIENTRYP PFNGLVDPAUSURFACEACCESSNVPROC) (GLvdpauSurfaceNV surface, GLenum access); -typedef void (APIENTRYP PFNGLVDPAUMAPSURFACESNVPROC) (GLsizei numSurfaces, const GLvdpauSurfaceNV *surfaces); -typedef void (APIENTRYP PFNGLVDPAUUNMAPSURFACESNVPROC) (GLsizei numSurface, const GLvdpauSurfaceNV *surfaces); -#endif - -#ifndef GL_AMD_transform_feedback3_lines_triangles -#define GL_AMD_transform_feedback3_lines_triangles 1 -#endif - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/engine/inc/GL/wglext.h b/engine/inc/GL/wglext.h deleted file mode 100644 index 22fd372b..00000000 --- a/engine/inc/GL/wglext.h +++ /dev/null @@ -1,901 +0,0 @@ -#ifndef __wglext_h_ -#define __wglext_h_ - -#ifdef __cplusplus -extern "C" { -#endif - -/* -** Copyright (c) 2007-2010 The Khronos Group Inc. -** -** Permission is hereby granted, free of charge, to any person obtaining a -** copy of this software and/or associated documentation files (the -** "Materials"), to deal in the Materials without restriction, including -** without limitation the rights to use, copy, modify, merge, publish, -** distribute, sublicense, and/or sell copies of the Materials, and to -** permit persons to whom the Materials are furnished to do so, subject to -** the following conditions: -** -** The above copyright notice and this permission notice shall be included -** in all copies or substantial portions of the Materials. -** -** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. -*/ - -/* Function declaration macros - to move into glplatform.h */ - -#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) -#define WIN32_LEAN_AND_MEAN 1 -#include -#endif - -#ifndef APIENTRY -#define APIENTRY -#endif -#ifndef APIENTRYP -#define APIENTRYP APIENTRY * -#endif -#ifndef GLAPI -#define GLAPI extern -#endif - -/*************************************************************/ - -/* Header file version number */ -/* wglext.h last updated 2010/08/06 */ -/* Current version at http://www.opengl.org/registry/ */ -#define WGL_WGLEXT_VERSION 22 - -#ifndef WGL_ARB_buffer_region -#define WGL_FRONT_COLOR_BUFFER_BIT_ARB 0x00000001 -#define WGL_BACK_COLOR_BUFFER_BIT_ARB 0x00000002 -#define WGL_DEPTH_BUFFER_BIT_ARB 0x00000004 -#define WGL_STENCIL_BUFFER_BIT_ARB 0x00000008 -#endif - -#ifndef WGL_ARB_multisample -#define WGL_SAMPLE_BUFFERS_ARB 0x2041 -#define WGL_SAMPLES_ARB 0x2042 -#endif - -#ifndef WGL_ARB_extensions_string -#endif - -#ifndef WGL_ARB_pixel_format -#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000 -#define WGL_DRAW_TO_WINDOW_ARB 0x2001 -#define WGL_DRAW_TO_BITMAP_ARB 0x2002 -#define WGL_ACCELERATION_ARB 0x2003 -#define WGL_NEED_PALETTE_ARB 0x2004 -#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005 -#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006 -#define WGL_SWAP_METHOD_ARB 0x2007 -#define WGL_NUMBER_OVERLAYS_ARB 0x2008 -#define WGL_NUMBER_UNDERLAYS_ARB 0x2009 -#define WGL_TRANSPARENT_ARB 0x200A -#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037 -#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038 -#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039 -#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A -#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B -#define WGL_SHARE_DEPTH_ARB 0x200C -#define WGL_SHARE_STENCIL_ARB 0x200D -#define WGL_SHARE_ACCUM_ARB 0x200E -#define WGL_SUPPORT_GDI_ARB 0x200F -#define WGL_SUPPORT_OPENGL_ARB 0x2010 -#define WGL_DOUBLE_BUFFER_ARB 0x2011 -#define WGL_STEREO_ARB 0x2012 -#define WGL_PIXEL_TYPE_ARB 0x2013 -#define WGL_COLOR_BITS_ARB 0x2014 -#define WGL_RED_BITS_ARB 0x2015 -#define WGL_RED_SHIFT_ARB 0x2016 -#define WGL_GREEN_BITS_ARB 0x2017 -#define WGL_GREEN_SHIFT_ARB 0x2018 -#define WGL_BLUE_BITS_ARB 0x2019 -#define WGL_BLUE_SHIFT_ARB 0x201A -#define WGL_ALPHA_BITS_ARB 0x201B -#define WGL_ALPHA_SHIFT_ARB 0x201C -#define WGL_ACCUM_BITS_ARB 0x201D -#define WGL_ACCUM_RED_BITS_ARB 0x201E -#define WGL_ACCUM_GREEN_BITS_ARB 0x201F -#define WGL_ACCUM_BLUE_BITS_ARB 0x2020 -#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021 -#define WGL_DEPTH_BITS_ARB 0x2022 -#define WGL_STENCIL_BITS_ARB 0x2023 -#define WGL_AUX_BUFFERS_ARB 0x2024 -#define WGL_NO_ACCELERATION_ARB 0x2025 -#define WGL_GENERIC_ACCELERATION_ARB 0x2026 -#define WGL_FULL_ACCELERATION_ARB 0x2027 -#define WGL_SWAP_EXCHANGE_ARB 0x2028 -#define WGL_SWAP_COPY_ARB 0x2029 -#define WGL_SWAP_UNDEFINED_ARB 0x202A -#define WGL_TYPE_RGBA_ARB 0x202B -#define WGL_TYPE_COLORINDEX_ARB 0x202C -#endif - -#ifndef WGL_ARB_make_current_read -#define ERROR_INVALID_PIXEL_TYPE_ARB 0x2043 -#define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054 -#endif - -#ifndef WGL_ARB_pbuffer -#define WGL_DRAW_TO_PBUFFER_ARB 0x202D -#define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E -#define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F -#define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030 -#define WGL_PBUFFER_LARGEST_ARB 0x2033 -#define WGL_PBUFFER_WIDTH_ARB 0x2034 -#define WGL_PBUFFER_HEIGHT_ARB 0x2035 -#define WGL_PBUFFER_LOST_ARB 0x2036 -#endif - -#ifndef WGL_ARB_render_texture -#define WGL_BIND_TO_TEXTURE_RGB_ARB 0x2070 -#define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071 -#define WGL_TEXTURE_FORMAT_ARB 0x2072 -#define WGL_TEXTURE_TARGET_ARB 0x2073 -#define WGL_MIPMAP_TEXTURE_ARB 0x2074 -#define WGL_TEXTURE_RGB_ARB 0x2075 -#define WGL_TEXTURE_RGBA_ARB 0x2076 -#define WGL_NO_TEXTURE_ARB 0x2077 -#define WGL_TEXTURE_CUBE_MAP_ARB 0x2078 -#define WGL_TEXTURE_1D_ARB 0x2079 -#define WGL_TEXTURE_2D_ARB 0x207A -#define WGL_MIPMAP_LEVEL_ARB 0x207B -#define WGL_CUBE_MAP_FACE_ARB 0x207C -#define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D -#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E -#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F -#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080 -#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081 -#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082 -#define WGL_FRONT_LEFT_ARB 0x2083 -#define WGL_FRONT_RIGHT_ARB 0x2084 -#define WGL_BACK_LEFT_ARB 0x2085 -#define WGL_BACK_RIGHT_ARB 0x2086 -#define WGL_AUX0_ARB 0x2087 -#define WGL_AUX1_ARB 0x2088 -#define WGL_AUX2_ARB 0x2089 -#define WGL_AUX3_ARB 0x208A -#define WGL_AUX4_ARB 0x208B -#define WGL_AUX5_ARB 0x208C -#define WGL_AUX6_ARB 0x208D -#define WGL_AUX7_ARB 0x208E -#define WGL_AUX8_ARB 0x208F -#define WGL_AUX9_ARB 0x2090 -#endif - -#ifndef WGL_ARB_pixel_format_float -#define WGL_TYPE_RGBA_FLOAT_ARB 0x21A0 -#endif - -#ifndef WGL_ARB_framebuffer_sRGB -#define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20A9 -#endif - -#ifndef WGL_ARB_create_context -#define WGL_CONTEXT_DEBUG_BIT_ARB 0x00000001 -#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002 -#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091 -#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092 -#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093 -#define WGL_CONTEXT_FLAGS_ARB 0x2094 -#define ERROR_INVALID_VERSION_ARB 0x2095 -#endif - -#ifndef WGL_ARB_create_context_profile -#define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126 -#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 -#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 -#define ERROR_INVALID_PROFILE_ARB 0x2096 -#endif - -#ifndef WGL_ARB_create_context_robustness -#define WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004 -#define WGL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 -#define WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 -#define WGL_NO_RESET_NOTIFICATION_ARB 0x8261 -#endif - -#ifndef WGL_EXT_make_current_read -#define ERROR_INVALID_PIXEL_TYPE_EXT 0x2043 -#endif - -#ifndef WGL_EXT_pixel_format -#define WGL_NUMBER_PIXEL_FORMATS_EXT 0x2000 -#define WGL_DRAW_TO_WINDOW_EXT 0x2001 -#define WGL_DRAW_TO_BITMAP_EXT 0x2002 -#define WGL_ACCELERATION_EXT 0x2003 -#define WGL_NEED_PALETTE_EXT 0x2004 -#define WGL_NEED_SYSTEM_PALETTE_EXT 0x2005 -#define WGL_SWAP_LAYER_BUFFERS_EXT 0x2006 -#define WGL_SWAP_METHOD_EXT 0x2007 -#define WGL_NUMBER_OVERLAYS_EXT 0x2008 -#define WGL_NUMBER_UNDERLAYS_EXT 0x2009 -#define WGL_TRANSPARENT_EXT 0x200A -#define WGL_TRANSPARENT_VALUE_EXT 0x200B -#define WGL_SHARE_DEPTH_EXT 0x200C -#define WGL_SHARE_STENCIL_EXT 0x200D -#define WGL_SHARE_ACCUM_EXT 0x200E -#define WGL_SUPPORT_GDI_EXT 0x200F -#define WGL_SUPPORT_OPENGL_EXT 0x2010 -#define WGL_DOUBLE_BUFFER_EXT 0x2011 -#define WGL_STEREO_EXT 0x2012 -#define WGL_PIXEL_TYPE_EXT 0x2013 -#define WGL_COLOR_BITS_EXT 0x2014 -#define WGL_RED_BITS_EXT 0x2015 -#define WGL_RED_SHIFT_EXT 0x2016 -#define WGL_GREEN_BITS_EXT 0x2017 -#define WGL_GREEN_SHIFT_EXT 0x2018 -#define WGL_BLUE_BITS_EXT 0x2019 -#define WGL_BLUE_SHIFT_EXT 0x201A -#define WGL_ALPHA_BITS_EXT 0x201B -#define WGL_ALPHA_SHIFT_EXT 0x201C -#define WGL_ACCUM_BITS_EXT 0x201D -#define WGL_ACCUM_RED_BITS_EXT 0x201E -#define WGL_ACCUM_GREEN_BITS_EXT 0x201F -#define WGL_ACCUM_BLUE_BITS_EXT 0x2020 -#define WGL_ACCUM_ALPHA_BITS_EXT 0x2021 -#define WGL_DEPTH_BITS_EXT 0x2022 -#define WGL_STENCIL_BITS_EXT 0x2023 -#define WGL_AUX_BUFFERS_EXT 0x2024 -#define WGL_NO_ACCELERATION_EXT 0x2025 -#define WGL_GENERIC_ACCELERATION_EXT 0x2026 -#define WGL_FULL_ACCELERATION_EXT 0x2027 -#define WGL_SWAP_EXCHANGE_EXT 0x2028 -#define WGL_SWAP_COPY_EXT 0x2029 -#define WGL_SWAP_UNDEFINED_EXT 0x202A -#define WGL_TYPE_RGBA_EXT 0x202B -#define WGL_TYPE_COLORINDEX_EXT 0x202C -#endif - -#ifndef WGL_EXT_pbuffer -#define WGL_DRAW_TO_PBUFFER_EXT 0x202D -#define WGL_MAX_PBUFFER_PIXELS_EXT 0x202E -#define WGL_MAX_PBUFFER_WIDTH_EXT 0x202F -#define WGL_MAX_PBUFFER_HEIGHT_EXT 0x2030 -#define WGL_OPTIMAL_PBUFFER_WIDTH_EXT 0x2031 -#define WGL_OPTIMAL_PBUFFER_HEIGHT_EXT 0x2032 -#define WGL_PBUFFER_LARGEST_EXT 0x2033 -#define WGL_PBUFFER_WIDTH_EXT 0x2034 -#define WGL_PBUFFER_HEIGHT_EXT 0x2035 -#endif - -#ifndef WGL_EXT_depth_float -#define WGL_DEPTH_FLOAT_EXT 0x2040 -#endif - -#ifndef WGL_3DFX_multisample -#define WGL_SAMPLE_BUFFERS_3DFX 0x2060 -#define WGL_SAMPLES_3DFX 0x2061 -#endif - -#ifndef WGL_EXT_multisample -#define WGL_SAMPLE_BUFFERS_EXT 0x2041 -#define WGL_SAMPLES_EXT 0x2042 -#endif - -#ifndef WGL_I3D_digital_video_control -#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D 0x2050 -#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D 0x2051 -#define WGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D 0x2052 -#define WGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D 0x2053 -#endif - -#ifndef WGL_I3D_gamma -#define WGL_GAMMA_TABLE_SIZE_I3D 0x204E -#define WGL_GAMMA_EXCLUDE_DESKTOP_I3D 0x204F -#endif - -#ifndef WGL_I3D_genlock -#define WGL_GENLOCK_SOURCE_MULTIVIEW_I3D 0x2044 -#define WGL_GENLOCK_SOURCE_EXTENAL_SYNC_I3D 0x2045 -#define WGL_GENLOCK_SOURCE_EXTENAL_FIELD_I3D 0x2046 -#define WGL_GENLOCK_SOURCE_EXTENAL_TTL_I3D 0x2047 -#define WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D 0x2048 -#define WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D 0x2049 -#define WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D 0x204A -#define WGL_GENLOCK_SOURCE_EDGE_RISING_I3D 0x204B -#define WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D 0x204C -#endif - -#ifndef WGL_I3D_image_buffer -#define WGL_IMAGE_BUFFER_MIN_ACCESS_I3D 0x00000001 -#define WGL_IMAGE_BUFFER_LOCK_I3D 0x00000002 -#endif - -#ifndef WGL_I3D_swap_frame_lock -#endif - -#ifndef WGL_NV_render_depth_texture -#define WGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3 -#define WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4 -#define WGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5 -#define WGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6 -#define WGL_DEPTH_COMPONENT_NV 0x20A7 -#endif - -#ifndef WGL_NV_render_texture_rectangle -#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV 0x20A0 -#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV 0x20A1 -#define WGL_TEXTURE_RECTANGLE_NV 0x20A2 -#endif - -#ifndef WGL_ATI_pixel_format_float -#define WGL_TYPE_RGBA_FLOAT_ATI 0x21A0 -#endif - -#ifndef WGL_NV_float_buffer -#define WGL_FLOAT_COMPONENTS_NV 0x20B0 -#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV 0x20B1 -#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV 0x20B2 -#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV 0x20B3 -#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV 0x20B4 -#define WGL_TEXTURE_FLOAT_R_NV 0x20B5 -#define WGL_TEXTURE_FLOAT_RG_NV 0x20B6 -#define WGL_TEXTURE_FLOAT_RGB_NV 0x20B7 -#define WGL_TEXTURE_FLOAT_RGBA_NV 0x20B8 -#endif - -#ifndef WGL_3DL_stereo_control -#define WGL_STEREO_EMITTER_ENABLE_3DL 0x2055 -#define WGL_STEREO_EMITTER_DISABLE_3DL 0x2056 -#define WGL_STEREO_POLARITY_NORMAL_3DL 0x2057 -#define WGL_STEREO_POLARITY_INVERT_3DL 0x2058 -#endif - -#ifndef WGL_EXT_pixel_format_packed_float -#define WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT 0x20A8 -#endif - -#ifndef WGL_EXT_framebuffer_sRGB -#define WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20A9 -#endif - -#ifndef WGL_NV_present_video -#define WGL_NUM_VIDEO_SLOTS_NV 0x20F0 -#endif - -#ifndef WGL_NV_video_out -#define WGL_BIND_TO_VIDEO_RGB_NV 0x20C0 -#define WGL_BIND_TO_VIDEO_RGBA_NV 0x20C1 -#define WGL_BIND_TO_VIDEO_RGB_AND_DEPTH_NV 0x20C2 -#define WGL_VIDEO_OUT_COLOR_NV 0x20C3 -#define WGL_VIDEO_OUT_ALPHA_NV 0x20C4 -#define WGL_VIDEO_OUT_DEPTH_NV 0x20C5 -#define WGL_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6 -#define WGL_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7 -#define WGL_VIDEO_OUT_FRAME 0x20C8 -#define WGL_VIDEO_OUT_FIELD_1 0x20C9 -#define WGL_VIDEO_OUT_FIELD_2 0x20CA -#define WGL_VIDEO_OUT_STACKED_FIELDS_1_2 0x20CB -#define WGL_VIDEO_OUT_STACKED_FIELDS_2_1 0x20CC -#endif - -#ifndef WGL_NV_swap_group -#endif - -#ifndef WGL_NV_gpu_affinity -#define WGL_ERROR_INCOMPATIBLE_AFFINITY_MASKS_NV 0x20D0 -#define WGL_ERROR_MISSING_AFFINITY_MASK_NV 0x20D1 -#endif - -#ifndef WGL_AMD_gpu_association -#define WGL_GPU_VENDOR_AMD 0x1F00 -#define WGL_GPU_RENDERER_STRING_AMD 0x1F01 -#define WGL_GPU_OPENGL_VERSION_STRING_AMD 0x1F02 -#define WGL_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2 -#define WGL_GPU_RAM_AMD 0x21A3 -#define WGL_GPU_CLOCK_AMD 0x21A4 -#define WGL_GPU_NUM_PIPES_AMD 0x21A5 -#define WGL_GPU_NUM_SIMD_AMD 0x21A6 -#define WGL_GPU_NUM_RB_AMD 0x21A7 -#define WGL_GPU_NUM_SPI_AMD 0x21A8 -#endif - -#ifndef WGL_NV_video_capture -#define WGL_UNIQUE_ID_NV 0x20CE -#define WGL_NUM_VIDEO_CAPTURE_SLOTS_NV 0x20CF -#endif - -#ifndef WGL_NV_copy_image -#endif - -#ifndef WGL_NV_multisample_coverage -#define WGL_COVERAGE_SAMPLES_NV 0x2042 -#define WGL_COLOR_SAMPLES_NV 0x20B9 -#endif - -#ifndef WGL_EXT_create_context_es2_profile -#define WGL_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004 -#endif - - -/*************************************************************/ - -#ifndef WGL_ARB_pbuffer -DECLARE_HANDLE(HPBUFFERARB); -#endif -#ifndef WGL_EXT_pbuffer -DECLARE_HANDLE(HPBUFFEREXT); -#endif -#ifndef WGL_NV_present_video -DECLARE_HANDLE(HVIDEOOUTPUTDEVICENV); -#endif -#ifndef WGL_NV_video_output -DECLARE_HANDLE(HPVIDEODEV); -#endif -#ifndef WGL_NV_gpu_affinity -DECLARE_HANDLE(HPGPUNV); -DECLARE_HANDLE(HGPUNV); - -typedef struct _GPU_DEVICE { - DWORD cb; - CHAR DeviceName[32]; - CHAR DeviceString[128]; - DWORD Flags; - RECT rcVirtualScreen; -} GPU_DEVICE, *PGPU_DEVICE; -#endif -#ifndef WGL_NV_video_capture -DECLARE_HANDLE(HVIDEOINPUTDEVICENV); -#endif - -#ifndef WGL_ARB_buffer_region -#define WGL_ARB_buffer_region 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern HANDLE WINAPI wglCreateBufferRegionARB (HDC hDC, int iLayerPlane, UINT uType); -extern VOID WINAPI wglDeleteBufferRegionARB (HANDLE hRegion); -extern BOOL WINAPI wglSaveBufferRegionARB (HANDLE hRegion, int x, int y, int width, int height); -extern BOOL WINAPI wglRestoreBufferRegionARB (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef HANDLE (WINAPI * PFNWGLCREATEBUFFERREGIONARBPROC) (HDC hDC, int iLayerPlane, UINT uType); -typedef VOID (WINAPI * PFNWGLDELETEBUFFERREGIONARBPROC) (HANDLE hRegion); -typedef BOOL (WINAPI * PFNWGLSAVEBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height); -typedef BOOL (WINAPI * PFNWGLRESTOREBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc); -#endif - -#ifndef WGL_ARB_multisample -#define WGL_ARB_multisample 1 -#endif - -#ifndef WGL_ARB_extensions_string -#define WGL_ARB_extensions_string 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern const char * WINAPI wglGetExtensionsStringARB (HDC hdc); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef const char * (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc); -#endif - -#ifndef WGL_ARB_pixel_format -#define WGL_ARB_pixel_format 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern BOOL WINAPI wglGetPixelFormatAttribivARB (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues); -extern BOOL WINAPI wglGetPixelFormatAttribfvARB (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues); -extern BOOL WINAPI wglChoosePixelFormatARB (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues); -typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues); -typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); -#endif - -#ifndef WGL_ARB_make_current_read -#define WGL_ARB_make_current_read 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern BOOL WINAPI wglMakeContextCurrentARB (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); -extern HDC WINAPI wglGetCurrentReadDCARB (void); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); -typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCARBPROC) (void); -#endif - -#ifndef WGL_ARB_pbuffer -#define WGL_ARB_pbuffer 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern HPBUFFERARB WINAPI wglCreatePbufferARB (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList); -extern HDC WINAPI wglGetPbufferDCARB (HPBUFFERARB hPbuffer); -extern int WINAPI wglReleasePbufferDCARB (HPBUFFERARB hPbuffer, HDC hDC); -extern BOOL WINAPI wglDestroyPbufferARB (HPBUFFERARB hPbuffer); -extern BOOL WINAPI wglQueryPbufferARB (HPBUFFERARB hPbuffer, int iAttribute, int *piValue); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef HPBUFFERARB (WINAPI * PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList); -typedef HDC (WINAPI * PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer); -typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC); -typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer); -typedef BOOL (WINAPI * PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int *piValue); -#endif - -#ifndef WGL_ARB_render_texture -#define WGL_ARB_render_texture 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern BOOL WINAPI wglBindTexImageARB (HPBUFFERARB hPbuffer, int iBuffer); -extern BOOL WINAPI wglReleaseTexImageARB (HPBUFFERARB hPbuffer, int iBuffer); -extern BOOL WINAPI wglSetPbufferAttribARB (HPBUFFERARB hPbuffer, const int *piAttribList); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef BOOL (WINAPI * PFNWGLBINDTEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); -typedef BOOL (WINAPI * PFNWGLRELEASETEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); -typedef BOOL (WINAPI * PFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, const int *piAttribList); -#endif - -#ifndef WGL_ARB_pixel_format_float -#define WGL_ARB_pixel_format_float 1 -#endif - -#ifndef WGL_ARB_framebuffer_sRGB -#define WGL_ARB_framebuffer_sRGB 1 -#endif - -#ifndef WGL_ARB_create_context -#define WGL_ARB_create_context 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern HGLRC WINAPI wglCreateContextAttribsARB (HDC hDC, HGLRC hShareContext, const int *attribList); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int *attribList); -#endif - -#ifndef WGL_ARB_create_context_profile -#define WGL_ARB_create_context_profile 1 -#endif - -#ifndef WGL_ARB_create_context_robustness -#define WGL_ARB_create_context_robustness 1 -#endif - -#ifndef WGL_EXT_display_color_table -#define WGL_EXT_display_color_table 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern GLboolean WINAPI wglCreateDisplayColorTableEXT (GLushort id); -extern GLboolean WINAPI wglLoadDisplayColorTableEXT (const GLushort *table, GLuint length); -extern GLboolean WINAPI wglBindDisplayColorTableEXT (GLushort id); -extern VOID WINAPI wglDestroyDisplayColorTableEXT (GLushort id); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef GLboolean (WINAPI * PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC) (GLushort id); -typedef GLboolean (WINAPI * PFNWGLLOADDISPLAYCOLORTABLEEXTPROC) (const GLushort *table, GLuint length); -typedef GLboolean (WINAPI * PFNWGLBINDDISPLAYCOLORTABLEEXTPROC) (GLushort id); -typedef VOID (WINAPI * PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC) (GLushort id); -#endif - -#ifndef WGL_EXT_extensions_string -#define WGL_EXT_extensions_string 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern const char * WINAPI wglGetExtensionsStringEXT (void); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef const char * (WINAPI * PFNWGLGETEXTENSIONSSTRINGEXTPROC) (void); -#endif - -#ifndef WGL_EXT_make_current_read -#define WGL_EXT_make_current_read 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern BOOL WINAPI wglMakeContextCurrentEXT (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); -extern HDC WINAPI wglGetCurrentReadDCEXT (void); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTEXTPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); -typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCEXTPROC) (void); -#endif - -#ifndef WGL_EXT_pbuffer -#define WGL_EXT_pbuffer 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern HPBUFFEREXT WINAPI wglCreatePbufferEXT (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList); -extern HDC WINAPI wglGetPbufferDCEXT (HPBUFFEREXT hPbuffer); -extern int WINAPI wglReleasePbufferDCEXT (HPBUFFEREXT hPbuffer, HDC hDC); -extern BOOL WINAPI wglDestroyPbufferEXT (HPBUFFEREXT hPbuffer); -extern BOOL WINAPI wglQueryPbufferEXT (HPBUFFEREXT hPbuffer, int iAttribute, int *piValue); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef HPBUFFEREXT (WINAPI * PFNWGLCREATEPBUFFEREXTPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList); -typedef HDC (WINAPI * PFNWGLGETPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer); -typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer, HDC hDC); -typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer); -typedef BOOL (WINAPI * PFNWGLQUERYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer, int iAttribute, int *piValue); -#endif - -#ifndef WGL_EXT_pixel_format -#define WGL_EXT_pixel_format 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern BOOL WINAPI wglGetPixelFormatAttribivEXT (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int *piAttributes, int *piValues); -extern BOOL WINAPI wglGetPixelFormatAttribfvEXT (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int *piAttributes, FLOAT *pfValues); -extern BOOL WINAPI wglChoosePixelFormatEXT (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int *piAttributes, int *piValues); -typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int *piAttributes, FLOAT *pfValues); -typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATEXTPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); -#endif - -#ifndef WGL_EXT_swap_control -#define WGL_EXT_swap_control 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern BOOL WINAPI wglSwapIntervalEXT (int interval); -extern int WINAPI wglGetSwapIntervalEXT (void); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval); -typedef int (WINAPI * PFNWGLGETSWAPINTERVALEXTPROC) (void); -#endif - -#ifndef WGL_EXT_depth_float -#define WGL_EXT_depth_float 1 -#endif - -#ifndef WGL_NV_vertex_array_range -#define WGL_NV_vertex_array_range 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern void* WINAPI wglAllocateMemoryNV (GLsizei size, GLfloat readfreq, GLfloat writefreq, GLfloat priority); -extern void WINAPI wglFreeMemoryNV (void *pointer); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef void* (WINAPI * PFNWGLALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readfreq, GLfloat writefreq, GLfloat priority); -typedef void (WINAPI * PFNWGLFREEMEMORYNVPROC) (void *pointer); -#endif - -#ifndef WGL_3DFX_multisample -#define WGL_3DFX_multisample 1 -#endif - -#ifndef WGL_EXT_multisample -#define WGL_EXT_multisample 1 -#endif - -#ifndef WGL_OML_sync_control -#define WGL_OML_sync_control 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern BOOL WINAPI wglGetSyncValuesOML (HDC hdc, INT64 *ust, INT64 *msc, INT64 *sbc); -extern BOOL WINAPI wglGetMscRateOML (HDC hdc, INT32 *numerator, INT32 *denominator); -extern INT64 WINAPI wglSwapBuffersMscOML (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder); -extern INT64 WINAPI wglSwapLayerBuffersMscOML (HDC hdc, int fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder); -extern BOOL WINAPI wglWaitForMscOML (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64 *ust, INT64 *msc, INT64 *sbc); -extern BOOL WINAPI wglWaitForSbcOML (HDC hdc, INT64 target_sbc, INT64 *ust, INT64 *msc, INT64 *sbc); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef BOOL (WINAPI * PFNWGLGETSYNCVALUESOMLPROC) (HDC hdc, INT64 *ust, INT64 *msc, INT64 *sbc); -typedef BOOL (WINAPI * PFNWGLGETMSCRATEOMLPROC) (HDC hdc, INT32 *numerator, INT32 *denominator); -typedef INT64 (WINAPI * PFNWGLSWAPBUFFERSMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder); -typedef INT64 (WINAPI * PFNWGLSWAPLAYERBUFFERSMSCOMLPROC) (HDC hdc, int fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder); -typedef BOOL (WINAPI * PFNWGLWAITFORMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64 *ust, INT64 *msc, INT64 *sbc); -typedef BOOL (WINAPI * PFNWGLWAITFORSBCOMLPROC) (HDC hdc, INT64 target_sbc, INT64 *ust, INT64 *msc, INT64 *sbc); -#endif - -#ifndef WGL_I3D_digital_video_control -#define WGL_I3D_digital_video_control 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern BOOL WINAPI wglGetDigitalVideoParametersI3D (HDC hDC, int iAttribute, int *piValue); -extern BOOL WINAPI wglSetDigitalVideoParametersI3D (HDC hDC, int iAttribute, const int *piValue); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef BOOL (WINAPI * PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int *piValue); -typedef BOOL (WINAPI * PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int *piValue); -#endif - -#ifndef WGL_I3D_gamma -#define WGL_I3D_gamma 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern BOOL WINAPI wglGetGammaTableParametersI3D (HDC hDC, int iAttribute, int *piValue); -extern BOOL WINAPI wglSetGammaTableParametersI3D (HDC hDC, int iAttribute, const int *piValue); -extern BOOL WINAPI wglGetGammaTableI3D (HDC hDC, int iEntries, USHORT *puRed, USHORT *puGreen, USHORT *puBlue); -extern BOOL WINAPI wglSetGammaTableI3D (HDC hDC, int iEntries, const USHORT *puRed, const USHORT *puGreen, const USHORT *puBlue); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int *piValue); -typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int *piValue); -typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, USHORT *puRed, USHORT *puGreen, USHORT *puBlue); -typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, const USHORT *puRed, const USHORT *puGreen, const USHORT *puBlue); -#endif - -#ifndef WGL_I3D_genlock -#define WGL_I3D_genlock 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern BOOL WINAPI wglEnableGenlockI3D (HDC hDC); -extern BOOL WINAPI wglDisableGenlockI3D (HDC hDC); -extern BOOL WINAPI wglIsEnabledGenlockI3D (HDC hDC, BOOL *pFlag); -extern BOOL WINAPI wglGenlockSourceI3D (HDC hDC, UINT uSource); -extern BOOL WINAPI wglGetGenlockSourceI3D (HDC hDC, UINT *uSource); -extern BOOL WINAPI wglGenlockSourceEdgeI3D (HDC hDC, UINT uEdge); -extern BOOL WINAPI wglGetGenlockSourceEdgeI3D (HDC hDC, UINT *uEdge); -extern BOOL WINAPI wglGenlockSampleRateI3D (HDC hDC, UINT uRate); -extern BOOL WINAPI wglGetGenlockSampleRateI3D (HDC hDC, UINT *uRate); -extern BOOL WINAPI wglGenlockSourceDelayI3D (HDC hDC, UINT uDelay); -extern BOOL WINAPI wglGetGenlockSourceDelayI3D (HDC hDC, UINT *uDelay); -extern BOOL WINAPI wglQueryGenlockMaxSourceDelayI3D (HDC hDC, UINT *uMaxLineDelay, UINT *uMaxPixelDelay); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef BOOL (WINAPI * PFNWGLENABLEGENLOCKI3DPROC) (HDC hDC); -typedef BOOL (WINAPI * PFNWGLDISABLEGENLOCKI3DPROC) (HDC hDC); -typedef BOOL (WINAPI * PFNWGLISENABLEDGENLOCKI3DPROC) (HDC hDC, BOOL *pFlag); -typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEI3DPROC) (HDC hDC, UINT uSource); -typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEI3DPROC) (HDC hDC, UINT *uSource); -typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT uEdge); -typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT *uEdge); -typedef BOOL (WINAPI * PFNWGLGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT uRate); -typedef BOOL (WINAPI * PFNWGLGETGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT *uRate); -typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT uDelay); -typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT *uDelay); -typedef BOOL (WINAPI * PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC) (HDC hDC, UINT *uMaxLineDelay, UINT *uMaxPixelDelay); -#endif - -#ifndef WGL_I3D_image_buffer -#define WGL_I3D_image_buffer 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern LPVOID WINAPI wglCreateImageBufferI3D (HDC hDC, DWORD dwSize, UINT uFlags); -extern BOOL WINAPI wglDestroyImageBufferI3D (HDC hDC, LPVOID pAddress); -extern BOOL WINAPI wglAssociateImageBufferEventsI3D (HDC hDC, const HANDLE *pEvent, const LPVOID *pAddress, const DWORD *pSize, UINT count); -extern BOOL WINAPI wglReleaseImageBufferEventsI3D (HDC hDC, const LPVOID *pAddress, UINT count); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef LPVOID (WINAPI * PFNWGLCREATEIMAGEBUFFERI3DPROC) (HDC hDC, DWORD dwSize, UINT uFlags); -typedef BOOL (WINAPI * PFNWGLDESTROYIMAGEBUFFERI3DPROC) (HDC hDC, LPVOID pAddress); -typedef BOOL (WINAPI * PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC) (HDC hDC, const HANDLE *pEvent, const LPVOID *pAddress, const DWORD *pSize, UINT count); -typedef BOOL (WINAPI * PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC) (HDC hDC, const LPVOID *pAddress, UINT count); -#endif - -#ifndef WGL_I3D_swap_frame_lock -#define WGL_I3D_swap_frame_lock 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern BOOL WINAPI wglEnableFrameLockI3D (void); -extern BOOL WINAPI wglDisableFrameLockI3D (void); -extern BOOL WINAPI wglIsEnabledFrameLockI3D (BOOL *pFlag); -extern BOOL WINAPI wglQueryFrameLockMasterI3D (BOOL *pFlag); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef BOOL (WINAPI * PFNWGLENABLEFRAMELOCKI3DPROC) (void); -typedef BOOL (WINAPI * PFNWGLDISABLEFRAMELOCKI3DPROC) (void); -typedef BOOL (WINAPI * PFNWGLISENABLEDFRAMELOCKI3DPROC) (BOOL *pFlag); -typedef BOOL (WINAPI * PFNWGLQUERYFRAMELOCKMASTERI3DPROC) (BOOL *pFlag); -#endif - -#ifndef WGL_I3D_swap_frame_usage -#define WGL_I3D_swap_frame_usage 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern BOOL WINAPI wglGetFrameUsageI3D (float *pUsage); -extern BOOL WINAPI wglBeginFrameTrackingI3D (void); -extern BOOL WINAPI wglEndFrameTrackingI3D (void); -extern BOOL WINAPI wglQueryFrameTrackingI3D (DWORD *pFrameCount, DWORD *pMissedFrames, float *pLastMissedUsage); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef BOOL (WINAPI * PFNWGLGETFRAMEUSAGEI3DPROC) (float *pUsage); -typedef BOOL (WINAPI * PFNWGLBEGINFRAMETRACKINGI3DPROC) (void); -typedef BOOL (WINAPI * PFNWGLENDFRAMETRACKINGI3DPROC) (void); -typedef BOOL (WINAPI * PFNWGLQUERYFRAMETRACKINGI3DPROC) (DWORD *pFrameCount, DWORD *pMissedFrames, float *pLastMissedUsage); -#endif - -#ifndef WGL_ATI_pixel_format_float -#define WGL_ATI_pixel_format_float 1 -#endif - -#ifndef WGL_NV_float_buffer -#define WGL_NV_float_buffer 1 -#endif - -#ifndef WGL_3DL_stereo_control -#define WGL_3DL_stereo_control 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern BOOL WINAPI wglSetStereoEmitterState3DL (HDC hDC, UINT uState); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef BOOL (WINAPI * PFNWGLSETSTEREOEMITTERSTATE3DLPROC) (HDC hDC, UINT uState); -#endif - -#ifndef WGL_EXT_pixel_format_packed_float -#define WGL_EXT_pixel_format_packed_float 1 -#endif - -#ifndef WGL_EXT_framebuffer_sRGB -#define WGL_EXT_framebuffer_sRGB 1 -#endif - -#ifndef WGL_NV_present_video -#define WGL_NV_present_video 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern int WINAPI wglEnumerateVideoDevicesNV (HDC hDC, HVIDEOOUTPUTDEVICENV *phDeviceList); -extern BOOL WINAPI wglBindVideoDeviceNV (HDC hDC, unsigned int uVideoSlot, HVIDEOOUTPUTDEVICENV hVideoDevice, const int *piAttribList); -extern BOOL WINAPI wglQueryCurrentContextNV (int iAttribute, int *piValue); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef int (WINAPI * PFNWGLENUMERATEVIDEODEVICESNVPROC) (HDC hDC, HVIDEOOUTPUTDEVICENV *phDeviceList); -typedef BOOL (WINAPI * PFNWGLBINDVIDEODEVICENVPROC) (HDC hDC, unsigned int uVideoSlot, HVIDEOOUTPUTDEVICENV hVideoDevice, const int *piAttribList); -typedef BOOL (WINAPI * PFNWGLQUERYCURRENTCONTEXTNVPROC) (int iAttribute, int *piValue); -#endif - -#ifndef WGL_NV_video_output -#define WGL_NV_video_output 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern BOOL WINAPI wglGetVideoDeviceNV (HDC hDC, int numDevices, HPVIDEODEV *hVideoDevice); -extern BOOL WINAPI wglReleaseVideoDeviceNV (HPVIDEODEV hVideoDevice); -extern BOOL WINAPI wglBindVideoImageNV (HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer); -extern BOOL WINAPI wglReleaseVideoImageNV (HPBUFFERARB hPbuffer, int iVideoBuffer); -extern BOOL WINAPI wglSendPbufferToVideoNV (HPBUFFERARB hPbuffer, int iBufferType, unsigned long *pulCounterPbuffer, BOOL bBlock); -extern BOOL WINAPI wglGetVideoInfoNV (HPVIDEODEV hpVideoDevice, unsigned long *pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef BOOL (WINAPI * PFNWGLGETVIDEODEVICENVPROC) (HDC hDC, int numDevices, HPVIDEODEV *hVideoDevice); -typedef BOOL (WINAPI * PFNWGLRELEASEVIDEODEVICENVPROC) (HPVIDEODEV hVideoDevice); -typedef BOOL (WINAPI * PFNWGLBINDVIDEOIMAGENVPROC) (HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer); -typedef BOOL (WINAPI * PFNWGLRELEASEVIDEOIMAGENVPROC) (HPBUFFERARB hPbuffer, int iVideoBuffer); -typedef BOOL (WINAPI * PFNWGLSENDPBUFFERTOVIDEONVPROC) (HPBUFFERARB hPbuffer, int iBufferType, unsigned long *pulCounterPbuffer, BOOL bBlock); -typedef BOOL (WINAPI * PFNWGLGETVIDEOINFONVPROC) (HPVIDEODEV hpVideoDevice, unsigned long *pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo); -#endif - -#ifndef WGL_NV_swap_group -#define WGL_NV_swap_group 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern BOOL WINAPI wglJoinSwapGroupNV (HDC hDC, GLuint group); -extern BOOL WINAPI wglBindSwapBarrierNV (GLuint group, GLuint barrier); -extern BOOL WINAPI wglQuerySwapGroupNV (HDC hDC, GLuint *group, GLuint *barrier); -extern BOOL WINAPI wglQueryMaxSwapGroupsNV (HDC hDC, GLuint *maxGroups, GLuint *maxBarriers); -extern BOOL WINAPI wglQueryFrameCountNV (HDC hDC, GLuint *count); -extern BOOL WINAPI wglResetFrameCountNV (HDC hDC); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef BOOL (WINAPI * PFNWGLJOINSWAPGROUPNVPROC) (HDC hDC, GLuint group); -typedef BOOL (WINAPI * PFNWGLBINDSWAPBARRIERNVPROC) (GLuint group, GLuint barrier); -typedef BOOL (WINAPI * PFNWGLQUERYSWAPGROUPNVPROC) (HDC hDC, GLuint *group, GLuint *barrier); -typedef BOOL (WINAPI * PFNWGLQUERYMAXSWAPGROUPSNVPROC) (HDC hDC, GLuint *maxGroups, GLuint *maxBarriers); -typedef BOOL (WINAPI * PFNWGLQUERYFRAMECOUNTNVPROC) (HDC hDC, GLuint *count); -typedef BOOL (WINAPI * PFNWGLRESETFRAMECOUNTNVPROC) (HDC hDC); -#endif - -#ifndef WGL_NV_gpu_affinity -#define WGL_NV_gpu_affinity 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern BOOL WINAPI wglEnumGpusNV (UINT iGpuIndex, HGPUNV *phGpu); -extern BOOL WINAPI wglEnumGpuDevicesNV (HGPUNV hGpu, UINT iDeviceIndex, PGPU_DEVICE lpGpuDevice); -extern HDC WINAPI wglCreateAffinityDCNV (const HGPUNV *phGpuList); -extern BOOL WINAPI wglEnumGpusFromAffinityDCNV (HDC hAffinityDC, UINT iGpuIndex, HGPUNV *hGpu); -extern BOOL WINAPI wglDeleteDCNV (HDC hdc); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef BOOL (WINAPI * PFNWGLENUMGPUSNVPROC) (UINT iGpuIndex, HGPUNV *phGpu); -typedef BOOL (WINAPI * PFNWGLENUMGPUDEVICESNVPROC) (HGPUNV hGpu, UINT iDeviceIndex, PGPU_DEVICE lpGpuDevice); -typedef HDC (WINAPI * PFNWGLCREATEAFFINITYDCNVPROC) (const HGPUNV *phGpuList); -typedef BOOL (WINAPI * PFNWGLENUMGPUSFROMAFFINITYDCNVPROC) (HDC hAffinityDC, UINT iGpuIndex, HGPUNV *hGpu); -typedef BOOL (WINAPI * PFNWGLDELETEDCNVPROC) (HDC hdc); -#endif - -#ifndef WGL_AMD_gpu_association -#define WGL_AMD_gpu_association 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern UINT WINAPI wglGetGPUIDsAMD (UINT maxCount, UINT *ids); -extern INT WINAPI wglGetGPUInfoAMD (UINT id, int property, GLenum dataType, UINT size, void *data); -extern UINT WINAPI wglGetContextGPUIDAMD (HGLRC hglrc); -extern HGLRC WINAPI wglCreateAssociatedContextAMD (UINT id); -extern HGLRC WINAPI wglCreateAssociatedContextAttribsAMD (UINT id, HGLRC hShareContext, const int *attribList); -extern BOOL WINAPI wglDeleteAssociatedContextAMD (HGLRC hglrc); -extern BOOL WINAPI wglMakeAssociatedContextCurrentAMD (HGLRC hglrc); -extern HGLRC WINAPI wglGetCurrentAssociatedContextAMD (void); -extern VOID WINAPI wglBlitContextFramebufferAMD (HGLRC dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef UINT (WINAPI * PFNWGLGETGPUIDSAMDPROC) (UINT maxCount, UINT *ids); -typedef INT (WINAPI * PFNWGLGETGPUINFOAMDPROC) (UINT id, int property, GLenum dataType, UINT size, void *data); -typedef UINT (WINAPI * PFNWGLGETCONTEXTGPUIDAMDPROC) (HGLRC hglrc); -typedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC) (UINT id); -typedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC) (UINT id, HGLRC hShareContext, const int *attribList); -typedef BOOL (WINAPI * PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC) (HGLRC hglrc); -typedef BOOL (WINAPI * PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC) (HGLRC hglrc); -typedef HGLRC (WINAPI * PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC) (void); -typedef VOID (WINAPI * PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC) (HGLRC dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -#endif - -#ifndef WGL_NV_video_capture -#define WGL_NV_video_capture 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern BOOL WINAPI wglBindVideoCaptureDeviceNV (UINT uVideoSlot, HVIDEOINPUTDEVICENV hDevice); -extern UINT WINAPI wglEnumerateVideoCaptureDevicesNV (HDC hDc, HVIDEOINPUTDEVICENV *phDeviceList); -extern BOOL WINAPI wglLockVideoCaptureDeviceNV (HDC hDc, HVIDEOINPUTDEVICENV hDevice); -extern BOOL WINAPI wglQueryVideoCaptureDeviceNV (HDC hDc, HVIDEOINPUTDEVICENV hDevice, int iAttribute, int *piValue); -extern BOOL WINAPI wglReleaseVideoCaptureDeviceNV (HDC hDc, HVIDEOINPUTDEVICENV hDevice); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef BOOL (WINAPI * PFNWGLBINDVIDEOCAPTUREDEVICENVPROC) (UINT uVideoSlot, HVIDEOINPUTDEVICENV hDevice); -typedef UINT (WINAPI * PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC) (HDC hDc, HVIDEOINPUTDEVICENV *phDeviceList); -typedef BOOL (WINAPI * PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice); -typedef BOOL (WINAPI * PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice, int iAttribute, int *piValue); -typedef BOOL (WINAPI * PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice); -#endif - -#ifndef WGL_NV_copy_image -#define WGL_NV_copy_image 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern BOOL WINAPI wglCopyImageSubDataNV (HGLRC hSrcRC, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, HGLRC hDstRC, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef BOOL (WINAPI * PFNWGLCOPYIMAGESUBDATANVPROC) (HGLRC hSrcRC, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, HGLRC hDstRC, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); -#endif - -#ifndef WGL_NV_multisample_coverage -#define WGL_NV_multisample_coverage 1 -#endif - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/engine/inc/Host.h b/engine/inc/Host.h deleted file mode 100644 index 47de25c4..00000000 --- a/engine/inc/Host.h +++ /dev/null @@ -1,254 +0,0 @@ -/*---------------------------------------------------------------------------*/ -/* */ -/* Host.h - Basic header file to provide cross-platform solutions via */ -/* macros, conditional compilation, etc. */ -/* */ -/* Author : Mark Carrier (mark@carrierlabs.com) */ -/* */ -/*---------------------------------------------------------------------------*/ -/* Copyright (c) 2007 CarrierLabs, LLC. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * 4. The name "CarrierLabs" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * mark@carrierlabs.com. - * - * THIS SOFTWARE IS PROVIDED BY MARK CARRIER ``AS IS'' AND ANY - * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MARK CARRIER OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - *----------------------------------------------------------------------------*/ -#ifndef __HOST_H__ -#define __HOST_H__ - -#include - -#ifdef __cplusplus -extern "C" -{ -#endif - -/*---------------------------------------------------------------------------*/ -/* */ -/* Type Definition Macros */ -/* */ -/*---------------------------------------------------------------------------*/ -#ifndef __WORDSIZE -/* Assume 32 */ -#define __WORDSIZE 32 -#endif - -#if defined(_LINUX) || defined(_DARWIN) || defined(_BSD) - typedef unsigned char uint8; - typedef char int8; - typedef unsigned short uint16; - typedef short int16; - typedef unsigned int uint32; - typedef int int32; - typedef int SOCKET; -#endif - -#ifdef WIN32 - struct iovec - { - void *iov_base; - size_t iov_len; - }; - - typedef unsigned char uint8; - typedef char int8; - typedef unsigned short uint16; - typedef short int16; - typedef unsigned int uint32; - typedef int int32; -#endif - -#ifdef WIN32 - typedef int socklen_t; -#endif - -#if defined(WIN32) - typedef unsigned long long int uint64; - typedef long long int int64; -#elif (__WORDSIZE == 32) -__extension__ typedef long long int int64; -__extension__ typedef unsigned long long int uint64; -#elif (__WORDSIZE == 64) -typedef unsigned long int uint64; -typedef long int int64; -#endif - -#ifdef WIN32 - -#ifndef UINT8_MAX -#define UINT8_MAX (UCHAR_MAX) -#endif -#ifndef UINT16_MAX -#define UINT16_MAX (USHRT_MAX) -#endif -#ifndef UINT32_MAX -#define UINT32_MAX (ULONG_MAX) -#endif - -#if __WORDSIZE == 64 -#define SIZE_MAX (18446744073709551615UL) -#else -#ifndef SIZE_MAX -#define SIZE_MAX (4294967295U) -#endif -#endif -#endif - -#if defined(WIN32) -#define ssize_t size_t -#endif - -#ifndef TRUE -#define TRUE 1 -#endif - -#ifndef FALSE -#define FALSE 0 -#endif - -#ifndef htonll -#ifdef _BIG_ENDIAN -#define htonll(x) (x) -#define ntohll(x) (x) -#else -#define htonll(x) ((((uint64)htonl(x)) << 32) + htonl(x >> 32)) -#define ntohll(x) ((((uint64)ntohl(x)) << 32) + ntohl(x >> 32)) -#endif -#endif - -/*---------------------------------------------------------------------------*/ -/* */ -/* Socket Macros */ -/* */ -/*---------------------------------------------------------------------------*/ -#ifdef WIN32 -#define SHUT_RD 0 -#define SHUT_WR 1 -#define SHUT_RDWR 2 -#define ACCEPT(a, b, c) accept(a, b, c) -#define CONNECT(a, b, c) connect(a, b, c) -#define CLOSE(a) closesocket(a) -#define READ(a, b, c) read(a, b, c) -#define RECV(a, b, c, d) recv(a, (char *)b, c, d) -#define RECVFROM(a, b, c, d, e, f) recvfrom(a, (char *)b, c, d, (sockaddr *)e, (int *)f) -#define RECV_FLAGS MSG_WAITALL -#define SELECT(a, b, c, d, e) select((int32)a, b, c, d, e) -#define SEND(a, b, c, d) send(a, (const char *)b, (int)c, d) -#define SENDTO(a, b, c, d, e, f) sendto(a, (const char *)b, (int)c, d, e, f) -#define SEND_FLAGS 0 -#define SENDFILE(a, b, c, d) sendfile(a, b, c, d) -#define SET_SOCKET_ERROR(x, y) errno = y -#define SOCKET_ERROR_INTERUPT EINTR -#define SOCKET_ERROR_TIMEDOUT EAGAIN -#define WRITE(a, b, c) write(a, b, c) -#define WRITEV(a, b, c) Writev(b, c) -#define GETSOCKOPT(a, b, c, d, e) getsockopt(a, b, c, (char *)d, (int *)e) -#define SETSOCKOPT(a, b, c, d, e) setsockopt(a, b, c, (char *)d, (int)e) -#define GETHOSTBYNAME(a) gethostbyname(a) -#endif - -#if defined(_LINUX) || defined(_DARWIN) || defined(_BSD) -#define ACCEPT(a, b, c) accept(a, b, c) -#define CONNECT(a, b, c) connect(a, b, c) -#define CLOSE(a) close(a) -#define READ(a, b, c) read(a, b, c) -#define RECV(a, b, c, d) recv(a, (void *)b, c, d) -#define RECVFROM(a, b, c, d, e, f) recvfrom(a, (char *)b, c, d, (sockaddr *)e, f) -#define RECV_FLAGS MSG_WAITALL -#define SELECT(a, b, c, d, e) select(a, b, c, d, e) -#define SEND(a, b, c, d) send(a, (const int8 *)b, c, d) -#define SENDTO(a, b, c, d, e, f) sendto(a, (const int8 *)b, c, d, e, f) -#define SEND_FLAGS 0 -#define SENDFILE(a, b, c, d) sendfile(a, b, c, d) -#define SET_SOCKET_ERROR(x, y) errno = y -#define SOCKET_ERROR_INTERUPT EINTR -#define SOCKET_ERROR_TIMEDOUT EAGAIN -#define WRITE(a, b, c) write(a, b, c) -#define WRITEV(a, b, c) writev(a, b, c) -#define GETSOCKOPT(a, b, c, d, e) getsockopt((int)a, (int)b, (int)c, (void *)d, (socklen_t *)e) -#define SETSOCKOPT(a, b, c, d, e) setsockopt((int)a, (int)b, (int)c, (const void *)d, (int)e) -#define GETHOSTBYNAME(a) gethostbyname(a) -#endif - -/*---------------------------------------------------------------------------*/ -/* */ -/* File Macros */ -/* */ -/*---------------------------------------------------------------------------*/ -#define STRUCT_STAT struct stat -#define LSTAT(x, y) lstat(x, y) -#define FILE_HANDLE FILE * -#define CLEARERR(x) clearerr(x) -#define FCLOSE(x) fclose(x) -#define FEOF(x) feof(x) -#define FERROR(x) ferror(x) -#define FFLUSH(x) fflush(x) -#define FILENO(s) fileno(s) -#define FOPEN(x, y) fopen(x, y) - //#define FREAD(a,b,c,d) fread(a, b, c, d) -#define FSTAT(s, st) fstat(FILENO(s), st) - //#define FWRITE(a,b,c,d) fwrite(a, b, c, d) -#define STAT_BLK_SIZE(x) ((x).st_blksize) - -/*---------------------------------------------------------------------------*/ -/* */ -/* Misc Macros */ -/* */ -/*---------------------------------------------------------------------------*/ -#if defined(WIN32) -#define GET_CLOCK_COUNT(x) QueryPerformanceCounter((LARGE_INTEGER *)x) -#else -#define GET_CLOCK_COUNT(x) gettimeofday(x, NULL) -#endif - -#if defined(WIN32) -#define STRTOULL(x) _atoi64(x) -#else -#define STRTOULL(x) strtoull(x, NULL, 10) -#endif - -#if defined(WIN32) -#define SNPRINTF _snprintf -#define PRINTF printf -#define VPRINTF vprintf -#define FPRINTF fprintf -#else -#define SNPRINTF snprintf -#define PRINTF printf -#define VPRINTF vprintf -#define FPRINTF fprintf -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* __HOST_H__ */ diff --git a/engine/inc/JavaScriptCore/JSBase.h b/engine/inc/JavaScriptCore/JSBase.h deleted file mode 100644 index 7a354dec..00000000 --- a/engine/inc/JavaScriptCore/JSBase.h +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright (C) 2006 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef JSBase_h -#define JSBase_h - -#ifndef __cplusplus -#include -#endif - -#ifdef __OBJC__ -#import -#endif - -/* JavaScript engine interface */ - -/*! @typedef JSContextGroupRef A group that associates JavaScript contexts with one another. Contexts in the same group may share and exchange JavaScript objects. */ -typedef const struct OpaqueJSContextGroup* JSContextGroupRef; - -/*! @typedef JSContextRef A JavaScript execution context. Holds the global object and other execution state. */ -typedef const struct OpaqueJSContext* JSContextRef; - -/*! @typedef JSGlobalContextRef A global JavaScript execution context. A JSGlobalContext is a JSContext. */ -typedef struct OpaqueJSContext* JSGlobalContextRef; - -/*! @typedef JSStringRef A UTF16 character buffer. The fundamental string representation in JavaScript. */ -typedef struct OpaqueJSString* JSStringRef; - -/*! @typedef JSClassRef A JavaScript class. Used with JSObjectMake to construct objects with custom behavior. */ -typedef struct OpaqueJSClass* JSClassRef; - -/*! @typedef JSPropertyNameArrayRef An array of JavaScript property names. */ -typedef struct OpaqueJSPropertyNameArray* JSPropertyNameArrayRef; - -/*! @typedef JSPropertyNameAccumulatorRef An ordered set used to collect the names of a JavaScript object's properties. */ -typedef struct OpaqueJSPropertyNameAccumulator* JSPropertyNameAccumulatorRef; - -/*! @typedef JSTypedArrayBytesDeallocator A function used to deallocate bytes passed to a Typed Array constructor. The function should take two arguments. The first is a pointer to the bytes that were originally passed to the Typed Array constructor. The second is a pointer to additional information desired at the time the bytes are to be freed. */ -typedef void (*JSTypedArrayBytesDeallocator)(void* bytes, void* deallocatorContext); - -/* JavaScript data types */ - -/*! @typedef JSValueRef A JavaScript value. The base type for all JavaScript values, and polymorphic functions on them. */ -typedef const struct OpaqueJSValue* JSValueRef; - -/*! @typedef JSObjectRef A JavaScript object. A JSObject is a JSValue. */ -typedef struct OpaqueJSValue* JSObjectRef; - -/* Clang's __has_declspec_attribute emulation */ -/* https://clang.llvm.org/docs/LanguageExtensions.html#has-declspec-attribute */ - -#ifndef __has_declspec_attribute -#define __has_declspec_attribute(x) 0 -#endif - -/* JavaScript symbol exports */ -/* These rules should stay the same as in WebKit/Shared/API/c/WKDeclarationSpecifiers.h */ - -#undef JS_EXPORT -#if defined(JS_NO_EXPORT) -#define JS_EXPORT -#elif defined(WIN32) || defined(_WIN32) || defined(__CC_ARM) || defined(__ARMCC__) || (__has_declspec_attribute(dllimport) && __has_declspec_attribute(dllexport)) -#if defined(BUILDING_JavaScriptCore) || defined(STATICALLY_LINKED_WITH_JavaScriptCore) -#define JS_EXPORT __declspec(dllexport) -#else -#define JS_EXPORT __declspec(dllimport) -#endif -#elif defined(__GNUC__) -#define JS_EXPORT __attribute__((visibility("default"))) -#else /* !defined(JS_NO_EXPORT) */ -#define JS_EXPORT -#endif /* defined(JS_NO_EXPORT) */ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Script Evaluation */ - -/*! -@function JSEvaluateScript -@abstract Evaluates a string of JavaScript. -@param ctx The execution context to use. -@param script A JSString containing the script to evaluate. -@param thisObject The object to use as "this," or NULL to use the global object as "this." -@param sourceURL A JSString containing a URL for the script's source file. This is used by debuggers and when reporting exceptions. Pass NULL if you do not care to include source file information. -@param startingLineNumber An integer value specifying the script's starting line number in the file located at sourceURL. This is only used when reporting exceptions. The value is one-based, so the first line is line 1 and invalid values are clamped to 1. -@param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. -@result The JSValue that results from evaluating script, or NULL if an exception is thrown. -*/ -JS_EXPORT JSValueRef JSEvaluateScript(JSContextRef ctx, JSStringRef script, JSObjectRef thisObject, JSStringRef sourceURL, int startingLineNumber, JSValueRef* exception); - -/*! -@function JSCheckScriptSyntax -@abstract Checks for syntax errors in a string of JavaScript. -@param ctx The execution context to use. -@param script A JSString containing the script to check for syntax errors. -@param sourceURL A JSString containing a URL for the script's source file. This is only used when reporting exceptions. Pass NULL if you do not care to include source file information in exceptions. -@param startingLineNumber An integer value specifying the script's starting line number in the file located at sourceURL. This is only used when reporting exceptions. The value is one-based, so the first line is line 1 and invalid values are clamped to 1. -@param exception A pointer to a JSValueRef in which to store a syntax error exception, if any. Pass NULL if you do not care to store a syntax error exception. -@result true if the script is syntactically correct, otherwise false. -*/ -JS_EXPORT bool JSCheckScriptSyntax(JSContextRef ctx, JSStringRef script, JSStringRef sourceURL, int startingLineNumber, JSValueRef* exception); - -/*! -@function JSGarbageCollect -@abstract Performs a JavaScript garbage collection. -@param ctx The execution context to use. -@discussion JavaScript values that are on the machine stack, in a register, - protected by JSValueProtect, set as the global object of an execution context, - or reachable from any such value will not be collected. - - During JavaScript execution, you are not required to call this function; the - JavaScript engine will garbage collect as needed. JavaScript values created - within a context group are automatically destroyed when the last reference - to the context group is released. -*/ -JS_EXPORT void JSGarbageCollect(JSContextRef ctx); - -#ifdef __cplusplus -} -#endif - -/* Enable the Objective-C API for platforms with a modern runtime. NOTE: This is duplicated in VM.h. */ -#if !defined(JSC_OBJC_API_ENABLED) -#if (defined(__clang__) && defined(__APPLE__) && ((defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && !defined(__i386__)) || (defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE))) -#define JSC_OBJC_API_ENABLED 1 -#else -#define JSC_OBJC_API_ENABLED 0 -#endif -#endif - -#endif /* JSBase_h */ diff --git a/engine/inc/JavaScriptCore/JSContextRef.h b/engine/inc/JavaScriptCore/JSContextRef.h deleted file mode 100644 index 36a41314..00000000 --- a/engine/inc/JavaScriptCore/JSContextRef.h +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright (C) 2006 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef JSContextRef_h -#define JSContextRef_h - -#include -#include -#include - -#ifndef __cplusplus -#include -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/*! -@function -@abstract Creates a JavaScript context group. -@discussion A JSContextGroup associates JavaScript contexts with one another. - Contexts in the same group may share and exchange JavaScript objects. Sharing and/or exchanging - JavaScript objects between contexts in different groups will produce undefined behavior. - When objects from the same context group are used in multiple threads, explicit - synchronization is required. - - A JSContextGroup may need to run deferred tasks on a run loop, such as garbage collection - or resolving WebAssembly compilations. By default, calling JSContextGroupCreate will use - the run loop of the thread it was called on. Currently, there is no API to change a - JSContextGroup's run loop once it has been created. -@result The created JSContextGroup. -*/ -JS_EXPORT JSContextGroupRef JSContextGroupCreate(void) JSC_API_AVAILABLE(macos(10.6), ios(7.0)); - -/*! -@function -@abstract Retains a JavaScript context group. -@param group The JSContextGroup to retain. -@result A JSContextGroup that is the same as group. -*/ -JS_EXPORT JSContextGroupRef JSContextGroupRetain(JSContextGroupRef group) JSC_API_AVAILABLE(macos(10.6), ios(7.0)); - -/*! -@function -@abstract Releases a JavaScript context group. -@param group The JSContextGroup to release. -*/ -JS_EXPORT void JSContextGroupRelease(JSContextGroupRef group) JSC_API_AVAILABLE(macos(10.6), ios(7.0)); - -/*! -@function -@abstract Creates a global JavaScript execution context. -@discussion JSGlobalContextCreate allocates a global object and populates it with all the - built-in JavaScript objects, such as Object, Function, String, and Array. - - In WebKit version 4.0 and later, the context is created in a unique context group. - Therefore, scripts may execute in it concurrently with scripts executing in other contexts. - However, you may not use values created in the context in other contexts. -@param globalObjectClass The class to use when creating the global object. Pass - NULL to use the default object class. -@result A JSGlobalContext with a global object of class globalObjectClass. -*/ -JS_EXPORT JSGlobalContextRef JSGlobalContextCreate(JSClassRef globalObjectClass) JSC_API_AVAILABLE(macos(10.5), ios(7.0)); - -/*! -@function -@abstract Creates a global JavaScript execution context in the context group provided. -@discussion JSGlobalContextCreateInGroup allocates a global object and populates it with - all the built-in JavaScript objects, such as Object, Function, String, and Array. -@param globalObjectClass The class to use when creating the global object. Pass - NULL to use the default object class. -@param group The context group to use. The created global context retains the group. - Pass NULL to create a unique group for the context. -@result A JSGlobalContext with a global object of class globalObjectClass and a context - group equal to group. -*/ -JS_EXPORT JSGlobalContextRef JSGlobalContextCreateInGroup(JSContextGroupRef group, JSClassRef globalObjectClass) JSC_API_AVAILABLE(macos(10.6), ios(7.0)); - -/*! -@function -@abstract Retains a global JavaScript execution context. -@param ctx The JSGlobalContext to retain. -@result A JSGlobalContext that is the same as ctx. -*/ -JS_EXPORT JSGlobalContextRef JSGlobalContextRetain(JSGlobalContextRef ctx); - -/*! -@function -@abstract Releases a global JavaScript execution context. -@param ctx The JSGlobalContext to release. -*/ -JS_EXPORT void JSGlobalContextRelease(JSGlobalContextRef ctx); - -/*! -@function -@abstract Gets the global object of a JavaScript execution context. -@param ctx The JSContext whose global object you want to get. -@result ctx's global object. -*/ -JS_EXPORT JSObjectRef JSContextGetGlobalObject(JSContextRef ctx); - -/*! -@function -@abstract Gets the context group to which a JavaScript execution context belongs. -@param ctx The JSContext whose group you want to get. -@result ctx's group. -*/ -JS_EXPORT JSContextGroupRef JSContextGetGroup(JSContextRef ctx) JSC_API_AVAILABLE(macos(10.6), ios(7.0)); - -/*! -@function -@abstract Gets the global context of a JavaScript execution context. -@param ctx The JSContext whose global context you want to get. -@result ctx's global context. -*/ -JS_EXPORT JSGlobalContextRef JSContextGetGlobalContext(JSContextRef ctx) JSC_API_AVAILABLE(macos(10.7), ios(7.0)); - -/*! -@function -@abstract Gets a copy of the name of a context. -@param ctx The JSGlobalContext whose name you want to get. -@result The name for ctx. -@discussion A JSGlobalContext's name is exposed for remote debugging to make it -easier to identify the context you would like to attach to. -*/ -JS_EXPORT JSStringRef JSGlobalContextCopyName(JSGlobalContextRef ctx) JSC_API_AVAILABLE(macos(10.10), ios(8.0)); - -/*! -@function -@abstract Sets the remote debugging name for a context. -@param ctx The JSGlobalContext that you want to name. -@param name The remote debugging name to set on ctx. -*/ -JS_EXPORT void JSGlobalContextSetName(JSGlobalContextRef ctx, JSStringRef name) JSC_API_AVAILABLE(macos(10.10), ios(8.0)); - -#ifdef __cplusplus -} -#endif - -#endif /* JSContextRef_h */ diff --git a/engine/inc/JavaScriptCore/JSObjectRef.h b/engine/inc/JavaScriptCore/JSObjectRef.h deleted file mode 100644 index a3e3ffa3..00000000 --- a/engine/inc/JavaScriptCore/JSObjectRef.h +++ /dev/null @@ -1,856 +0,0 @@ -/* - * Copyright (C) 2006-2019 Apple Inc. All rights reserved. - * Copyright (C) 2008 Kelvin W Sherlock (ksherlock@gmail.com) - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef JSObjectRef_h -#define JSObjectRef_h - -#include -#include -#include - -#ifndef __cplusplus -#include -#endif -#include /* for size_t */ - -#ifdef __cplusplus -extern "C" { -#endif - -/*! -@enum JSPropertyAttribute -@constant kJSPropertyAttributeNone Specifies that a property has no special attributes. -@constant kJSPropertyAttributeReadOnly Specifies that a property is read-only. -@constant kJSPropertyAttributeDontEnum Specifies that a property should not be enumerated by JSPropertyEnumerators and JavaScript for...in loops. -@constant kJSPropertyAttributeDontDelete Specifies that the delete operation should fail on a property. -*/ -enum { - kJSPropertyAttributeNone = 0, - kJSPropertyAttributeReadOnly = 1 << 1, - kJSPropertyAttributeDontEnum = 1 << 2, - kJSPropertyAttributeDontDelete = 1 << 3 -}; - -/*! -@typedef JSPropertyAttributes -@abstract A set of JSPropertyAttributes. Combine multiple attributes by logically ORing them together. -*/ -typedef unsigned JSPropertyAttributes; - -/*! -@enum JSClassAttribute -@constant kJSClassAttributeNone Specifies that a class has no special attributes. -@constant kJSClassAttributeNoAutomaticPrototype Specifies that a class should not automatically generate a shared prototype for its instance objects. Use kJSClassAttributeNoAutomaticPrototype in combination with JSObjectSetPrototype to manage prototypes manually. -*/ -enum { - kJSClassAttributeNone = 0, - kJSClassAttributeNoAutomaticPrototype = 1 << 1 -}; - -/*! -@typedef JSClassAttributes -@abstract A set of JSClassAttributes. Combine multiple attributes by logically ORing them together. -*/ -typedef unsigned JSClassAttributes; - -/*! -@typedef JSObjectInitializeCallback -@abstract The callback invoked when an object is first created. -@param ctx The execution context to use. -@param object The JSObject being created. -@discussion If you named your function Initialize, you would declare it like this: - -void Initialize(JSContextRef ctx, JSObjectRef object); - -Unlike the other object callbacks, the initialize callback is called on the least -derived class (the parent class) first, and the most derived class last. -*/ -typedef void -(*JSObjectInitializeCallback) (JSContextRef ctx, JSObjectRef object); - -/* Extension of the above callback with the class that the method is being invoked for. */ -typedef void -(*JSObjectInitializeCallbackEx) (JSContextRef ctx, JSClassRef jsClass, JSObjectRef object); - -/*! -@typedef JSObjectFinalizeCallback -@abstract The callback invoked when an object is finalized (prepared for garbage collection). An object may be finalized on any thread. -@param object The JSObject being finalized. -@discussion If you named your function Finalize, you would declare it like this: - -void Finalize(JSObjectRef object); - -The finalize callback is called on the most derived class first, and the least -derived class (the parent class) last. - -You must not call any function that may cause a garbage collection or an allocation -of a garbage collected object from within a JSObjectFinalizeCallback. This includes -all functions that have a JSContextRef parameter. -*/ -typedef void -(*JSObjectFinalizeCallback) (JSObjectRef object); - -/* Extension of the above callback with the class that the method is being invoked for. */ -typedef void -(*JSObjectFinalizeCallbackEx) (JSClassRef jsClass, JSObjectRef object); - -/*! -@typedef JSObjectHasPropertyCallback -@abstract The callback invoked when determining whether an object has a property. -@param ctx The execution context to use. -@param object The JSObject to search for the property. -@param propertyName A JSString containing the name of the property look up. -@result true if object has the property, otherwise false. -@discussion If you named your function HasProperty, you would declare it like this: - -bool HasProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName); - -If this function returns false, the hasProperty request forwards to object's statically declared properties, then its parent class chain (which includes the default object class), then its prototype chain. - -This callback enables optimization in cases where only a property's existence needs to be known, not its value, and computing its value would be expensive. - -If this callback is NULL, the getProperty callback will be used to service hasProperty requests. -*/ -typedef bool -(*JSObjectHasPropertyCallback) (JSContextRef ctx, JSObjectRef object, JSStringRef propertyName); - -/* Extension of the above callback with the class that the method is being invoked for. */ -typedef bool -(*JSObjectHasPropertyCallbackEx) (JSContextRef ctx, JSClassRef jsClass, JSObjectRef object, JSStringRef propertyName); - -/*! -@typedef JSObjectGetPropertyCallback -@abstract The callback invoked when getting a property's value. -@param ctx The execution context to use. -@param object The JSObject to search for the property. -@param propertyName A JSString containing the name of the property to get. -@param exception A pointer to a JSValueRef in which to return an exception, if any. -@result The property's value if object has the property, otherwise NULL. -@discussion If you named your function GetProperty, you would declare it like this: - -JSValueRef GetProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef* exception); - -If this function returns NULL, the get request forwards to object's statically declared properties, then its parent class chain (which includes the default object class), then its prototype chain. -*/ -typedef JSValueRef -(*JSObjectGetPropertyCallback) (JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef* exception); - -/* Extension of the above callback with the class that the method is being invoked for. */ -typedef JSValueRef -(*JSObjectGetPropertyCallbackEx) (JSContextRef ctx, JSClassRef jsClass, JSObjectRef object, JSStringRef propertyName, JSValueRef* exception); - -/*! -@typedef JSObjectSetPropertyCallback -@abstract The callback invoked when setting a property's value. -@param ctx The execution context to use. -@param object The JSObject on which to set the property's value. -@param propertyName A JSString containing the name of the property to set. -@param value A JSValue to use as the property's value. -@param exception A pointer to a JSValueRef in which to return an exception, if any. -@result true if the property was set, otherwise false. -@discussion If you named your function SetProperty, you would declare it like this: - -bool SetProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef value, JSValueRef* exception); - -If this function returns false, the set request forwards to object's statically declared properties, then its parent class chain (which includes the default object class). -*/ -typedef bool -(*JSObjectSetPropertyCallback) (JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef value, JSValueRef* exception); - -/* Extension of the above callback with the class that the method is being invoked for. */ -typedef bool -(*JSObjectSetPropertyCallbackEx) (JSContextRef ctx, JSClassRef jsClass, JSObjectRef object, JSStringRef propertyName, JSValueRef value, JSValueRef* exception); - -/*! -@typedef JSObjectDeletePropertyCallback -@abstract The callback invoked when deleting a property. -@param ctx The execution context to use. -@param object The JSObject in which to delete the property. -@param propertyName A JSString containing the name of the property to delete. -@param exception A pointer to a JSValueRef in which to return an exception, if any. -@result true if propertyName was successfully deleted, otherwise false. -@discussion If you named your function DeleteProperty, you would declare it like this: - -bool DeleteProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef* exception); - -If this function returns false, the delete request forwards to object's statically declared properties, then its parent class chain (which includes the default object class). -*/ -typedef bool -(*JSObjectDeletePropertyCallback) (JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef* exception); - -/* Extension of the above callback with the class that the method is being invoked for. */ -typedef bool -(*JSObjectDeletePropertyCallbackEx) (JSContextRef ctx, JSClassRef jsClass, JSObjectRef object, JSStringRef propertyName, JSValueRef* exception); - -/*! -@typedef JSObjectGetPropertyNamesCallback -@abstract The callback invoked when collecting the names of an object's properties. -@param ctx The execution context to use. -@param object The JSObject whose property names are being collected. -@param propertyNames A JavaScript property name accumulator in which to accumulate the names of object's properties. -@discussion If you named your function GetPropertyNames, you would declare it like this: - -void GetPropertyNames(JSContextRef ctx, JSObjectRef object, JSPropertyNameAccumulatorRef propertyNames); - -Property name accumulators are used by JSObjectCopyPropertyNames and JavaScript for...in loops. - -Use JSPropertyNameAccumulatorAddName to add property names to accumulator. A class's getPropertyNames callback only needs to provide the names of properties that the class vends through a custom getProperty or setProperty callback. Other properties, including statically declared properties, properties vended by other classes, and properties belonging to object's prototype, are added independently. -*/ -typedef void -(*JSObjectGetPropertyNamesCallback) (JSContextRef ctx, JSObjectRef object, JSPropertyNameAccumulatorRef propertyNames); - -/* Extension of the above callback with the class that the method is being invoked for. */ -typedef void -(*JSObjectGetPropertyNamesCallbackEx) (JSContextRef ctx, JSClassRef jsClass, JSObjectRef object, JSPropertyNameAccumulatorRef propertyNames); - -/*! -@typedef JSObjectCallAsFunctionCallback -@abstract The callback invoked when an object is called as a function. -@param ctx The execution context to use. -@param function A JSObject that is the function being called. -@param thisObject A JSObject that is the 'this' variable in the function's scope. -@param argumentCount An integer count of the number of arguments in arguments. -@param arguments A JSValue array of the arguments passed to the function. -@param exception A pointer to a JSValueRef in which to return an exception, if any. -@result A JSValue that is the function's return value. -@discussion If you named your function CallAsFunction, you would declare it like this: - -JSValueRef CallAsFunction(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception); - -If your callback were invoked by the JavaScript expression 'myObject.myFunction()', function would be set to myFunction, and thisObject would be set to myObject. - -If this callback is NULL, calling your object as a function will throw an exception. -*/ -typedef JSValueRef -(*JSObjectCallAsFunctionCallback) (JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception); - -/* Extension of the above callback with the class and class name of the object being called as a function. -@discussion If this is a JSStaticFunctionEx, className will actually be the name of the function. -*/ -typedef JSValueRef -(*JSObjectCallAsFunctionCallbackEx) (JSContextRef ctx, JSClassRef jsClass, JSStringRef className, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception); - -/*! -@typedef JSObjectCallAsConstructorCallback -@abstract The callback invoked when an object is used as a constructor in a 'new' expression. -@param ctx The execution context to use. -@param constructor A JSObject that is the constructor being called. -@param argumentCount An integer count of the number of arguments in arguments. -@param arguments A JSValue array of the arguments passed to the function. -@param exception A pointer to a JSValueRef in which to return an exception, if any. -@result A JSObject that is the constructor's return value. -@discussion If you named your function CallAsConstructor, you would declare it like this: - -JSObjectRef CallAsConstructor(JSContextRef ctx, JSObjectRef constructor, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception); - -If your callback were invoked by the JavaScript expression 'new myConstructor()', constructor would be set to myConstructor. - -If this callback is NULL, using your object as a constructor in a 'new' expression will throw an exception. -*/ -typedef JSObjectRef -(*JSObjectCallAsConstructorCallback) (JSContextRef ctx, JSObjectRef constructor, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception); - -/* Extension of the above callback with the class that the method is being invoked for. */ -typedef JSObjectRef -(*JSObjectCallAsConstructorCallbackEx) (JSContextRef ctx, JSClassRef jsClass, JSObjectRef constructor, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception); - -/*! -@typedef JSObjectHasInstanceCallback -@abstract hasInstance The callback invoked when an object is used as the target of an 'instanceof' expression. -@param ctx The execution context to use. -@param constructor The JSObject that is the target of the 'instanceof' expression. -@param possibleInstance The JSValue being tested to determine if it is an instance of constructor. -@param exception A pointer to a JSValueRef in which to return an exception, if any. -@result true if possibleInstance is an instance of constructor, otherwise false. -@discussion If you named your function HasInstance, you would declare it like this: - -bool HasInstance(JSContextRef ctx, JSObjectRef constructor, JSValueRef possibleInstance, JSValueRef* exception); - -If your callback were invoked by the JavaScript expression 'someValue instanceof myObject', constructor would be set to myObject and possibleInstance would be set to someValue. - -If this callback is NULL, 'instanceof' expressions that target your object will return false. - -Standard JavaScript practice calls for objects that implement the callAsConstructor callback to implement the hasInstance callback as well. -*/ -typedef bool -(*JSObjectHasInstanceCallback) (JSContextRef ctx, JSObjectRef constructor, JSValueRef possibleInstance, JSValueRef* exception); - -/* Extension of the above callback with the class that the method is being invoked for. */ -typedef bool -(*JSObjectHasInstanceCallbackEx) (JSContextRef ctx, JSClassRef jsClass, JSObjectRef constructor, JSValueRef possibleInstance, JSValueRef* exception); - -/*! -@typedef JSObjectConvertToTypeCallback -@abstract The callback invoked when converting an object to a particular JavaScript type. -@param ctx The execution context to use. -@param object The JSObject to convert. -@param type A JSType specifying the JavaScript type to convert to. -@param exception A pointer to a JSValueRef in which to return an exception, if any. -@result The objects's converted value, or NULL if the object was not converted. -@discussion If you named your function ConvertToType, you would declare it like this: - -JSValueRef ConvertToType(JSContextRef ctx, JSObjectRef object, JSType type, JSValueRef* exception); - -If this function returns false, the conversion request forwards to object's parent class chain (which includes the default object class). - -This function is only invoked when converting an object to number or string. An object converted to boolean is 'true.' An object converted to object is itself. -*/ -typedef JSValueRef -(*JSObjectConvertToTypeCallback) (JSContextRef ctx, JSObjectRef object, JSType type, JSValueRef* exception); - -/* Extension of the above callback with the class that the method is being invoked for. */ -typedef JSValueRef -(*JSObjectConvertToTypeCallbackEx) (JSContextRef ctx, JSClassRef jsClass, JSObjectRef object, JSType type, JSValueRef* exception); - -/*! -@struct JSStaticValue -@abstract This structure describes a statically declared value property. -@field name A null-terminated UTF8 string containing the property's name. -@field getProperty A JSObjectGetPropertyCallback to invoke when getting the property's value. -@field setProperty A JSObjectSetPropertyCallback to invoke when setting the property's value. May be NULL if the ReadOnly attribute is set. -@field attributes A logically ORed set of JSPropertyAttributes to give to the property. -*/ -typedef struct { - const char* name; - JSObjectGetPropertyCallback getProperty; - JSObjectSetPropertyCallback setProperty; - JSPropertyAttributes attributes; -} JSStaticValue; - -/* Extension of the above structure for use with class version 1000 */ -typedef struct { - const char* name; - JSObjectGetPropertyCallbackEx getPropertyEx; - JSObjectSetPropertyCallbackEx setPropertyEx; - JSPropertyAttributes attributes; -} JSStaticValueEx; - -/*! -@struct JSStaticFunction -@abstract This structure describes a statically declared function property. -@field name A null-terminated UTF8 string containing the property's name. -@field callAsFunction A JSObjectCallAsFunctionCallback to invoke when the property is called as a function. -@field attributes A logically ORed set of JSPropertyAttributes to give to the property. -*/ -typedef struct { - const char* name; - JSObjectCallAsFunctionCallback callAsFunction; - JSPropertyAttributes attributes; -} JSStaticFunction; - -/* Extension of the above structure for use with class version 1000 */ -typedef struct { - const char* name; - JSObjectCallAsFunctionCallbackEx callAsFunctionEx; - JSPropertyAttributes attributes; -} JSStaticFunctionEx; - -/*! -@struct JSClassDefinition -@abstract This structure contains properties and callbacks that define a type of object. All fields other than the version field are optional. Any pointer may be NULL. -@field version The version number of this structure. The current version is 0. -@field attributes A logically ORed set of JSClassAttributes to give to the class. -@field className A null-terminated UTF8 string containing the class's name. -@field parentClass A JSClass to set as the class's parent class. Pass NULL use the default object class. -@field staticValues A JSStaticValue array containing the class's statically declared value properties. Pass NULL to specify no statically declared value properties. The array must be terminated by a JSStaticValue whose name field is NULL. -@field staticFunctions A JSStaticFunction array containing the class's statically declared function properties. Pass NULL to specify no statically declared function properties. The array must be terminated by a JSStaticFunction whose name field is NULL. -@field initialize The callback invoked when an object is first created. Use this callback to initialize the object. -@field finalize The callback invoked when an object is finalized (prepared for garbage collection). Use this callback to release resources allocated for the object, and perform other cleanup. -@field hasProperty The callback invoked when determining whether an object has a property. If this field is NULL, getProperty is called instead. The hasProperty callback enables optimization in cases where only a property's existence needs to be known, not its value, and computing its value is expensive. -@field getProperty The callback invoked when getting a property's value. -@field setProperty The callback invoked when setting a property's value. -@field deleteProperty The callback invoked when deleting a property. -@field getPropertyNames The callback invoked when collecting the names of an object's properties. -@field callAsFunction The callback invoked when an object is called as a function. -@field hasInstance The callback invoked when an object is used as the target of an 'instanceof' expression. -@field callAsConstructor The callback invoked when an object is used as a constructor in a 'new' expression. -@field convertToType The callback invoked when converting an object to a particular JavaScript type. -@discussion The staticValues and staticFunctions arrays are the simplest and most efficient means for vending custom properties. Statically declared properties autmatically service requests like getProperty, setProperty, and getPropertyNames. Property access callbacks are required only to implement unusual properties, like array indexes, whose names are not known at compile-time. - -If you named your getter function "GetX" and your setter function "SetX", you would declare a JSStaticValue array containing "X" like this: - -JSStaticValue StaticValueArray[] = { - { "X", GetX, SetX, kJSPropertyAttributeNone }, - { 0, 0, 0, 0 } -}; - -Standard JavaScript practice calls for storing function objects in prototypes, so they can be shared. The default JSClass created by JSClassCreate follows this idiom, instantiating objects with a shared, automatically generating prototype containing the class's function objects. The kJSClassAttributeNoAutomaticPrototype attribute specifies that a JSClass should not automatically generate such a prototype. The resulting JSClass instantiates objects with the default object prototype, and gives each instance object its own copy of the class's function objects. - -A NULL callback specifies that the default object callback should substitute, except in the case of hasProperty, where it specifies that getProperty should substitute. -*/ -typedef struct { - int version; /* default version is 0, use version 1000 for callbacks with extended class information */ - JSClassAttributes attributes; - - const char* className; - JSClassRef parentClass; - - union { - /* version 0 */ - struct { - const JSStaticValue* staticValues; - const JSStaticFunction* staticFunctions; - JSObjectInitializeCallback initialize; - JSObjectFinalizeCallback finalize; - JSObjectHasPropertyCallback hasProperty; - JSObjectGetPropertyCallback getProperty; - JSObjectSetPropertyCallback setProperty; - JSObjectDeletePropertyCallback deleteProperty; - JSObjectGetPropertyNamesCallback getPropertyNames; - JSObjectCallAsFunctionCallback callAsFunction; - JSObjectCallAsConstructorCallback callAsConstructor; - JSObjectHasInstanceCallback hasInstance; - JSObjectConvertToTypeCallback convertToType; - }; - - /* version 1000 */ - struct { - const JSStaticValueEx* staticValuesEx; - const JSStaticFunctionEx* staticFunctionsEx; - JSObjectInitializeCallbackEx initializeEx; - JSObjectFinalizeCallbackEx finalizeEx; - JSObjectHasPropertyCallbackEx hasPropertyEx; - JSObjectGetPropertyCallbackEx getPropertyEx; - JSObjectSetPropertyCallbackEx setPropertyEx; - JSObjectDeletePropertyCallbackEx deletePropertyEx; - JSObjectGetPropertyNamesCallbackEx getPropertyNamesEx; - JSObjectCallAsFunctionCallbackEx callAsFunctionEx; - JSObjectCallAsConstructorCallbackEx callAsConstructorEx; - JSObjectHasInstanceCallbackEx hasInstanceEx; - JSObjectConvertToTypeCallbackEx convertToTypeEx; - }; - }; - - void* privateData; /* version 1000 only */ -} JSClassDefinition; - -/*! -@const kJSClassDefinitionEmpty -@abstract A JSClassDefinition structure of the current version, filled with NULL pointers and having no attributes. -@discussion Use this constant as a convenience when creating class definitions. For example, to create a class definition with only a finalize method: - -JSClassDefinition definition = kJSClassDefinitionEmpty; -definition.finalize = Finalize; -*/ -JS_EXPORT extern const JSClassDefinition kJSClassDefinitionEmpty; - -/*! -@function -@abstract Creates a JavaScript class suitable for use with JSObjectMake. -@param definition A JSClassDefinition that defines the class. -@result A JSClass with the given definition. Ownership follows the Create Rule. -*/ -JS_EXPORT JSClassRef JSClassCreate(const JSClassDefinition* definition); - -/*! -@function -@abstract Retains a JavaScript class. -@param jsClass The JSClass to retain. -@result A JSClass that is the same as jsClass. -*/ -JS_EXPORT JSClassRef JSClassRetain(JSClassRef jsClass); - -/*! -@function -@abstract Releases a JavaScript class. -@param jsClass The JSClass to release. -*/ -JS_EXPORT void JSClassRelease(JSClassRef jsClass); - -/*! -@function -@abstract Retrieves the private data from a class reference, only possible with classes created with version 1000 (extended callbacks). -@param jsClass The class to get the data from -@result The private data on the class, or NULL, if not set -@discussion Only classes with version 1000 (extended callbacks) can store private data, for other classes always NULL will always be returned. -*/ -JS_EXPORT void* JSClassGetPrivate(JSClassRef jsClass); - -/*! -@function -@abstract Sets the private data on a class, only possible with classes created with version 1000 (extended callbacks). -@param jsClass The class to set the data on -@param data A void* to set as the private data for the class -@result true if the data has been set on the class, false if the class has not been created with version 1000 (extended callbacks) -@discussion Only classes with version 1000 (extended callbacks) can store private data, for other classes the function always fails. The set pointer is not touched by the engine. -*/ -JS_EXPORT bool JSClassSetPrivate(JSClassRef jsClass, void* data); - -/*! -@function -@abstract Creates a JavaScript object. -@param ctx The execution context to use. -@param jsClass The JSClass to assign to the object. Pass NULL to use the default object class. -@param data A void* to set as the object's private data. Pass NULL to specify no private data. -@result A JSObject with the given class and private data. -@discussion The default object class does not allocate storage for private data, so you must provide a non-NULL jsClass to JSObjectMake if you want your object to be able to store private data. - -data is set on the created object before the intialize methods in its class chain are called. This enables the initialize methods to retrieve and manipulate data through JSObjectGetPrivate. -*/ -JS_EXPORT JSObjectRef JSObjectMake(JSContextRef ctx, JSClassRef jsClass, void* data); - -/*! -@function -@abstract Convenience method for creating a JavaScript function with a given callback as its implementation. -@param ctx The execution context to use. -@param name A JSString containing the function's name. This will be used when converting the function to string. Pass NULL to create an anonymous function. -@param callAsFunction The JSObjectCallAsFunctionCallback to invoke when the function is called. -@result A JSObject that is a function. The object's prototype will be the default function prototype. -*/ -JS_EXPORT JSObjectRef JSObjectMakeFunctionWithCallback(JSContextRef ctx, JSStringRef name, JSObjectCallAsFunctionCallback callAsFunction); - -/*! -@function -@abstract Convenience method for creating a JavaScript constructor. -@param ctx The execution context to use. -@param jsClass A JSClass that is the class your constructor will assign to the objects its constructs. jsClass will be used to set the constructor's .prototype property, and to evaluate 'instanceof' expressions. Pass NULL to use the default object class. -@param callAsConstructor A JSObjectCallAsConstructorCallback to invoke when your constructor is used in a 'new' expression. Pass NULL to use the default object constructor. -@result A JSObject that is a constructor. The object's prototype will be the default object prototype. -@discussion The default object constructor takes no arguments and constructs an object of class jsClass with no private data. -*/ -JS_EXPORT JSObjectRef JSObjectMakeConstructor(JSContextRef ctx, JSClassRef jsClass, JSObjectCallAsConstructorCallback callAsConstructor); - -/*! - @function - @abstract Creates a JavaScript Array object. - @param ctx The execution context to use. - @param argumentCount An integer count of the number of arguments in arguments. - @param arguments A JSValue array of data to populate the Array with. Pass NULL if argumentCount is 0. - @param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. - @result A JSObject that is an Array. - @discussion The behavior of this function does not exactly match the behavior of the built-in Array constructor. Specifically, if one argument - is supplied, this function returns an array with one element. - */ -JS_EXPORT JSObjectRef JSObjectMakeArray(JSContextRef ctx, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) JSC_API_AVAILABLE(macos(10.6), ios(7.0)); - -/*! - @function - @abstract Creates a JavaScript Date object, as if by invoking the built-in Date constructor. - @param ctx The execution context to use. - @param argumentCount An integer count of the number of arguments in arguments. - @param arguments A JSValue array of arguments to pass to the Date Constructor. Pass NULL if argumentCount is 0. - @param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. - @result A JSObject that is a Date. - */ -JS_EXPORT JSObjectRef JSObjectMakeDate(JSContextRef ctx, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) JSC_API_AVAILABLE(macos(10.6), ios(7.0)); - -/*! - @function - @abstract Creates a JavaScript Error object, as if by invoking the built-in Error constructor. - @param ctx The execution context to use. - @param argumentCount An integer count of the number of arguments in arguments. - @param arguments A JSValue array of arguments to pass to the Error Constructor. Pass NULL if argumentCount is 0. - @param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. - @result A JSObject that is a Error. - */ -JS_EXPORT JSObjectRef JSObjectMakeError(JSContextRef ctx, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) JSC_API_AVAILABLE(macos(10.6), ios(7.0)); - -/*! - @function - @abstract Creates a JavaScript RegExp object, as if by invoking the built-in RegExp constructor. - @param ctx The execution context to use. - @param argumentCount An integer count of the number of arguments in arguments. - @param arguments A JSValue array of arguments to pass to the RegExp Constructor. Pass NULL if argumentCount is 0. - @param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. - @result A JSObject that is a RegExp. - */ -JS_EXPORT JSObjectRef JSObjectMakeRegExp(JSContextRef ctx, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) JSC_API_AVAILABLE(macos(10.6), ios(7.0)); - -/*! - @function - @abstract Creates a JavaScript promise object by invoking the provided executor. - @param ctx The execution context to use. - @param resolve A pointer to a JSObjectRef in which to store the resolve function for the new promise. Pass NULL if you do not care to store the resolve callback. - @param reject A pointer to a JSObjectRef in which to store the reject function for the new promise. Pass NULL if you do not care to store the reject callback. - @param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. - @result A JSObject that is a promise or NULL if an exception occurred. - */ -JS_EXPORT JSObjectRef JSObjectMakeDeferredPromise(JSContextRef ctx, JSObjectRef* resolve, JSObjectRef* reject, JSValueRef* exception) JSC_API_AVAILABLE(macos(10.15), ios(13.0)); - -/*! -@function -@abstract Creates a function with a given script as its body. -@param ctx The execution context to use. -@param name A JSString containing the function's name. This will be used when converting the function to string. Pass NULL to create an anonymous function. -@param parameterCount An integer count of the number of parameter names in parameterNames. -@param parameterNames A JSString array containing the names of the function's parameters. Pass NULL if parameterCount is 0. -@param body A JSString containing the script to use as the function's body. -@param sourceURL A JSString containing a URL for the script's source file. This is only used when reporting exceptions. Pass NULL if you do not care to include source file information in exceptions. -@param startingLineNumber An integer value specifying the script's starting line number in the file located at sourceURL. This is only used when reporting exceptions. The value is one-based, so the first line is line 1 and invalid values are clamped to 1. -@param exception A pointer to a JSValueRef in which to store a syntax error exception, if any. Pass NULL if you do not care to store a syntax error exception. -@result A JSObject that is a function, or NULL if either body or parameterNames contains a syntax error. The object's prototype will be the default function prototype. -@discussion Use this method when you want to execute a script repeatedly, to avoid the cost of re-parsing the script before each execution. -*/ -JS_EXPORT JSObjectRef JSObjectMakeFunction(JSContextRef ctx, JSStringRef name, unsigned parameterCount, const JSStringRef parameterNames[], JSStringRef body, JSStringRef sourceURL, int startingLineNumber, JSValueRef* exception); - -/*! -@function -@abstract Gets an object's prototype. -@param ctx The execution context to use. -@param object A JSObject whose prototype you want to get. -@result A JSValue that is the object's prototype. -*/ -JS_EXPORT JSValueRef JSObjectGetPrototype(JSContextRef ctx, JSObjectRef object); - -/*! -@function -@abstract Sets an object's prototype. -@param ctx The execution context to use. -@param object The JSObject whose prototype you want to set. -@param value A JSValue to set as the object's prototype. -*/ -JS_EXPORT void JSObjectSetPrototype(JSContextRef ctx, JSObjectRef object, JSValueRef value); - -/*! -@function -@abstract Tests whether an object has a given property. -@param object The JSObject to test. -@param propertyName A JSString containing the property's name. -@result true if the object has a property whose name matches propertyName, otherwise false. -*/ -JS_EXPORT bool JSObjectHasProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName); - -/*! -@function -@abstract Gets a property from an object. -@param ctx The execution context to use. -@param object The JSObject whose property you want to get. -@param propertyName A JSString containing the property's name. -@param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. -@result The property's value if object has the property, otherwise the undefined value. -*/ -JS_EXPORT JSValueRef JSObjectGetProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef* exception); - -/*! -@function -@abstract Sets a property on an object. -@param ctx The execution context to use. -@param object The JSObject whose property you want to set. -@param propertyName A JSString containing the property's name. -@param value A JSValueRef to use as the property's value. -@param attributes A logically ORed set of JSPropertyAttributes to give to the property. -@param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. -*/ -JS_EXPORT void JSObjectSetProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef value, JSPropertyAttributes attributes, JSValueRef* exception); - -/*! -@function -@abstract Deletes a property from an object. -@param ctx The execution context to use. -@param object The JSObject whose property you want to delete. -@param propertyName A JSString containing the property's name. -@param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. -@result true if the delete operation succeeds, otherwise false (for example, if the property has the kJSPropertyAttributeDontDelete attribute set). -*/ -JS_EXPORT bool JSObjectDeleteProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef* exception); - -/*! - @function - @abstract Tests whether an object has a given property using a JSValueRef as the property key. - @param object The JSObject to test. - @param propertyKey A JSValueRef containing the property key to use when looking up the property. - @param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. - @result true if the object has a property whose name matches propertyKey, otherwise false. - @discussion This function is the same as performing "propertyKey in object" from JavaScript. - */ -JS_EXPORT bool JSObjectHasPropertyForKey(JSContextRef ctx, JSObjectRef object, JSValueRef propertyKey, JSValueRef* exception) JSC_API_AVAILABLE(macos(10.15), ios(13.0)); - -/*! - @function - @abstract Gets a property from an object using a JSValueRef as the property key. - @param ctx The execution context to use. - @param object The JSObject whose property you want to get. - @param propertyKey A JSValueRef containing the property key to use when looking up the property. - @param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. - @result The property's value if object has the property key, otherwise the undefined value. - @discussion This function is the same as performing "object[propertyKey]" from JavaScript. - */ -JS_EXPORT JSValueRef JSObjectGetPropertyForKey(JSContextRef ctx, JSObjectRef object, JSValueRef propertyKey, JSValueRef* exception) JSC_API_AVAILABLE(macos(10.15), ios(13.0)); - -/*! - @function - @abstract Sets a property on an object using a JSValueRef as the property key. - @param ctx The execution context to use. - @param object The JSObject whose property you want to set. - @param propertyKey A JSValueRef containing the property key to use when looking up the property. - @param value A JSValueRef to use as the property's value. - @param attributes A logically ORed set of JSPropertyAttributes to give to the property. - @param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. - @discussion This function is the same as performing "object[propertyKey] = value" from JavaScript. - */ -JS_EXPORT void JSObjectSetPropertyForKey(JSContextRef ctx, JSObjectRef object, JSValueRef propertyKey, JSValueRef value, JSPropertyAttributes attributes, JSValueRef* exception) JSC_API_AVAILABLE(macos(10.15), ios(13.0)); - -/*! - @function - @abstract Deletes a property from an object using a JSValueRef as the property key. - @param ctx The execution context to use. - @param object The JSObject whose property you want to delete. - @param propertyKey A JSValueRef containing the property key to use when looking up the property. - @param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. - @result true if the delete operation succeeds, otherwise false (for example, if the property has the kJSPropertyAttributeDontDelete attribute set). - @discussion This function is the same as performing "delete object[propertyKey]" from JavaScript. - */ -JS_EXPORT bool JSObjectDeletePropertyForKey(JSContextRef ctx, JSObjectRef object, JSValueRef propertyKey, JSValueRef* exception) JSC_API_AVAILABLE(macos(10.15), ios(13.0)); - -/*! -@function -@abstract Gets a property from an object by numeric index. -@param ctx The execution context to use. -@param object The JSObject whose property you want to get. -@param propertyIndex An integer value that is the property's name. -@param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. -@result The property's value if object has the property, otherwise the undefined value. -@discussion Calling JSObjectGetPropertyAtIndex is equivalent to calling JSObjectGetProperty with a string containing propertyIndex, but JSObjectGetPropertyAtIndex provides optimized access to numeric properties. -*/ -JS_EXPORT JSValueRef JSObjectGetPropertyAtIndex(JSContextRef ctx, JSObjectRef object, unsigned propertyIndex, JSValueRef* exception); - -/*! -@function -@abstract Sets a property on an object by numeric index. -@param ctx The execution context to use. -@param object The JSObject whose property you want to set. -@param propertyIndex The property's name as a number. -@param value A JSValue to use as the property's value. -@param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. -@discussion Calling JSObjectSetPropertyAtIndex is equivalent to calling JSObjectSetProperty with a string containing propertyIndex, but JSObjectSetPropertyAtIndex provides optimized access to numeric properties. -*/ -JS_EXPORT void JSObjectSetPropertyAtIndex(JSContextRef ctx, JSObjectRef object, unsigned propertyIndex, JSValueRef value, JSValueRef* exception); - -/*! -@function -@abstract Gets an object's private data. -@param object A JSObject whose private data you want to get. -@result A void* that is the object's private data, if the object has private data, otherwise NULL. -*/ -JS_EXPORT void* JSObjectGetPrivate(JSObjectRef object); - -/*! -@function -@abstract Sets a pointer to private data on an object. -@param object The JSObject whose private data you want to set. -@param data A void* to set as the object's private data. -@result true if object can store private data, otherwise false. -@discussion The default object class does not allocate storage for private data. Only objects created with a non-NULL JSClass can store private data. -*/ -JS_EXPORT bool JSObjectSetPrivate(JSObjectRef object, void* data); - -/*! -@function -@abstract Tests whether an object can be called as a function. -@param ctx The execution context to use. -@param object The JSObject to test. -@result true if the object can be called as a function, otherwise false. -*/ -JS_EXPORT bool JSObjectIsFunction(JSContextRef ctx, JSObjectRef object); - -/*! -@function -@abstract Calls an object as a function. -@param ctx The execution context to use. -@param object The JSObject to call as a function. -@param thisObject The object to use as "this," or NULL to use the global object as "this." -@param argumentCount An integer count of the number of arguments in arguments. -@param arguments A JSValue array of arguments to pass to the function. Pass NULL if argumentCount is 0. -@param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. -@result The JSValue that results from calling object as a function, or NULL if an exception is thrown or object is not a function. -*/ -JS_EXPORT JSValueRef JSObjectCallAsFunction(JSContextRef ctx, JSObjectRef object, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception); - -/*! -@function -@abstract Tests whether an object can be called as a constructor. -@param ctx The execution context to use. -@param object The JSObject to test. -@result true if the object can be called as a constructor, otherwise false. -*/ -JS_EXPORT bool JSObjectIsConstructor(JSContextRef ctx, JSObjectRef object); - -/*! -@function -@abstract Calls an object as a constructor. -@param ctx The execution context to use. -@param object The JSObject to call as a constructor. -@param argumentCount An integer count of the number of arguments in arguments. -@param arguments A JSValue array of arguments to pass to the constructor. Pass NULL if argumentCount is 0. -@param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. -@result The JSObject that results from calling object as a constructor, or NULL if an exception is thrown or object is not a constructor. -*/ -JS_EXPORT JSObjectRef JSObjectCallAsConstructor(JSContextRef ctx, JSObjectRef object, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception); - -/*! -@function -@abstract Gets the names of an object's enumerable properties. -@param ctx The execution context to use. -@param object The object whose property names you want to get. -@result A JSPropertyNameArray containing the names object's enumerable properties. Ownership follows the Create Rule. -*/ -JS_EXPORT JSPropertyNameArrayRef JSObjectCopyPropertyNames(JSContextRef ctx, JSObjectRef object); - -/*! -@function -@abstract Retains a JavaScript property name array. -@param array The JSPropertyNameArray to retain. -@result A JSPropertyNameArray that is the same as array. -*/ -JS_EXPORT JSPropertyNameArrayRef JSPropertyNameArrayRetain(JSPropertyNameArrayRef array); - -/*! -@function -@abstract Releases a JavaScript property name array. -@param array The JSPropetyNameArray to release. -*/ -JS_EXPORT void JSPropertyNameArrayRelease(JSPropertyNameArrayRef array); - -/*! -@function -@abstract Gets a count of the number of items in a JavaScript property name array. -@param array The array from which to retrieve the count. -@result An integer count of the number of names in array. -*/ -JS_EXPORT size_t JSPropertyNameArrayGetCount(JSPropertyNameArrayRef array); - -/*! -@function -@abstract Gets a property name at a given index in a JavaScript property name array. -@param array The array from which to retrieve the property name. -@param index The index of the property name to retrieve. -@result A JSStringRef containing the property name. -*/ -JS_EXPORT JSStringRef JSPropertyNameArrayGetNameAtIndex(JSPropertyNameArrayRef array, size_t index); - -/*! -@function -@abstract Adds a property name to a JavaScript property name accumulator. -@param accumulator The accumulator object to which to add the property name. -@param propertyName The property name to add. -*/ -JS_EXPORT void JSPropertyNameAccumulatorAddName(JSPropertyNameAccumulatorRef accumulator, JSStringRef propertyName); - -#ifdef __cplusplus -} -#endif - -#endif /* JSObjectRef_h */ diff --git a/engine/inc/JavaScriptCore/JSObjectRefPrivate.h b/engine/inc/JavaScriptCore/JSObjectRefPrivate.h deleted file mode 100644 index 080af870..00000000 --- a/engine/inc/JavaScriptCore/JSObjectRefPrivate.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (C) 2010-2019 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - * THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef JSObjectRefPrivate_h -#define JSObjectRefPrivate_h - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/*! - @function - @abstract Sets a private property on an object. This private property cannot be accessed from within JavaScript. - @param ctx The execution context to use. - @param object The JSObject whose private property you want to set. - @param propertyName A JSString containing the property's name. - @param value A JSValue to use as the property's value. This may be NULL. - @result true if object can store private data, otherwise false. - @discussion This API allows you to store JS values directly an object in a way that will be ensure that they are kept alive without exposing them to JavaScript code and without introducing the reference cycles that may occur when using JSValueProtect. - - The default object class does not allocate storage for private data. Only objects created with a non-NULL JSClass can store private properties. - */ -JS_EXPORT bool JSObjectSetPrivateProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef value); - -/*! - @function - @abstract Gets a private property from an object. - @param ctx The execution context to use. - @param object The JSObject whose private property you want to get. - @param propertyName A JSString containing the property's name. - @result The property's value if object has the property, otherwise NULL. - */ -JS_EXPORT JSValueRef JSObjectGetPrivateProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName); - -/*! - @function - @abstract Deletes a private property from an object. - @param ctx The execution context to use. - @param object The JSObject whose private property you want to delete. - @param propertyName A JSString containing the property's name. - @result true if object can store private data, otherwise false. - @discussion The default object class does not allocate storage for private data. Only objects created with a non-NULL JSClass can store private data. - */ -JS_EXPORT bool JSObjectDeletePrivateProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName); - -JS_EXPORT JSObjectRef JSObjectGetProxyTarget(JSObjectRef); - -JS_EXPORT JSGlobalContextRef JSObjectGetGlobalContext(JSObjectRef object); - -#ifdef __cplusplus -} -#endif - -#endif // JSObjectRefPrivate_h diff --git a/engine/inc/JavaScriptCore/JSRetainPtr.h b/engine/inc/JavaScriptCore/JSRetainPtr.h deleted file mode 100644 index fdab802d..00000000 --- a/engine/inc/JavaScriptCore/JSRetainPtr.h +++ /dev/null @@ -1,187 +0,0 @@ -/* - * Copyright (C) 2005-2018 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of Apple Inc. ("Apple") nor the names of - * its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#pragma once - -#include -#include -#include - -#if !defined(WARN_UNUSED_RETURN) -#define WARN_UNUSED_RETURN -#endif - -inline void JSRetain(JSStringRef string) { JSStringRetain(string); } -inline void JSRelease(JSStringRef string) { JSStringRelease(string); } -inline void JSRetain(JSGlobalContextRef context) { JSGlobalContextRetain(context); } -inline void JSRelease(JSGlobalContextRef context) { JSGlobalContextRelease(context); } - -enum AdoptTag { Adopt }; - -template class JSRetainPtr { -public: - JSRetainPtr() = default; - JSRetainPtr(T ptr) : m_ptr(ptr) { if (ptr) JSRetain(ptr); } - JSRetainPtr(const JSRetainPtr&); - JSRetainPtr(JSRetainPtr&&); - ~JSRetainPtr(); - - T get() const { return m_ptr; } - - void clear(); - T leakRef() WARN_UNUSED_RETURN; - - T operator->() const { return m_ptr; } - - bool operator!() const { return !m_ptr; } - explicit operator bool() const { return m_ptr; } - - JSRetainPtr& operator=(const JSRetainPtr&); - JSRetainPtr& operator=(JSRetainPtr&&); - JSRetainPtr& operator=(T); - - void swap(JSRetainPtr&); - - friend JSRetainPtr adopt(JSStringRef); - friend JSRetainPtr adopt(JSGlobalContextRef); - - // FIXME: Make this private once Apple's internal code is updated to not rely on it. - // https://bugs.webkit.org/show_bug.cgi?id=189644 - JSRetainPtr(AdoptTag, T); - -private: - T m_ptr { nullptr }; -}; - -JSRetainPtr adopt(JSStringRef); -JSRetainPtr adopt(JSGlobalContextRef); - -template inline JSRetainPtr::JSRetainPtr(AdoptTag, T ptr) - : m_ptr(ptr) -{ -} - -inline JSRetainPtr adopt(JSStringRef o) -{ - return JSRetainPtr(Adopt, o); -} - -inline JSRetainPtr adopt(JSGlobalContextRef o) -{ - return JSRetainPtr(Adopt, o); -} - -template inline JSRetainPtr::JSRetainPtr(const JSRetainPtr& o) - : m_ptr(o.m_ptr) -{ - if (m_ptr) - JSRetain(m_ptr); -} - -template inline JSRetainPtr::JSRetainPtr(JSRetainPtr&& o) - : m_ptr(o.leakRef()) -{ -} - -template inline JSRetainPtr::~JSRetainPtr() -{ - if (m_ptr) - JSRelease(m_ptr); -} - -template inline void JSRetainPtr::clear() -{ - if (T ptr = leakRef()) - JSRelease(ptr); -} - -template inline T JSRetainPtr::leakRef() -{ - return std::exchange(m_ptr, nullptr); -} - -template inline JSRetainPtr& JSRetainPtr::operator=(const JSRetainPtr& o) -{ - return operator=(o.get()); -} - -template inline JSRetainPtr& JSRetainPtr::operator=(JSRetainPtr&& o) -{ - if (T ptr = std::exchange(m_ptr, o.leakRef())) - JSRelease(ptr); - return *this; -} - -template inline JSRetainPtr& JSRetainPtr::operator=(T optr) -{ - if (optr) - JSRetain(optr); - if (T ptr = std::exchange(m_ptr, optr)) - JSRelease(ptr); - return *this; -} - -template inline void JSRetainPtr::swap(JSRetainPtr& o) -{ - std::swap(m_ptr, o.m_ptr); -} - -template inline void swap(JSRetainPtr& a, JSRetainPtr& b) -{ - a.swap(b); -} - -template inline bool operator==(const JSRetainPtr& a, const JSRetainPtr& b) -{ - return a.get() == b.get(); -} - -template inline bool operator==(const JSRetainPtr& a, U* b) -{ - return a.get() == b; -} - -template inline bool operator==(T* a, const JSRetainPtr& b) -{ - return a == b.get(); -} - -template inline bool operator!=(const JSRetainPtr& a, const JSRetainPtr& b) -{ - return a.get() != b.get(); -} - -template inline bool operator!=(const JSRetainPtr& a, U* b) -{ - return a.get() != b; -} - -template inline bool operator!=(T* a, const JSRetainPtr& b) -{ - return a != b.get(); -} diff --git a/engine/inc/JavaScriptCore/JSStringRef.h b/engine/inc/JavaScriptCore/JSStringRef.h deleted file mode 100644 index 9236f05d..00000000 --- a/engine/inc/JavaScriptCore/JSStringRef.h +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright (C) 2006 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef JSStringRef_h -#define JSStringRef_h - -#include - -#ifndef __cplusplus -#include -#endif -#include /* for size_t */ - -#ifdef __cplusplus -extern "C" { -#endif - -#if !defined(_NATIVE_WCHAR_T_DEFINED) /* MSVC */ \ - && (!defined(__WCHAR_MAX__) || (__WCHAR_MAX__ > 0xffffU)) /* ISO C/C++ */ \ - && (!defined(WCHAR_MAX) || (WCHAR_MAX > 0xffffU)) /* RVCT */ -/*! -@typedef JSChar -@abstract A UTF-16 code unit. One, or a sequence of two, can encode any Unicode - character. As with all scalar types, endianness depends on the underlying - architecture. -*/ - typedef unsigned short JSChar; -#else - typedef wchar_t JSChar; -#endif - -/*! -@function -@abstract Creates a JavaScript string from a buffer of Unicode characters. -@param chars The buffer of Unicode characters to copy into the new JSString. -@param numChars The number of characters to copy from the buffer pointed to by chars. -@result A JSString containing chars. Ownership follows the Create Rule. -*/ -JS_EXPORT JSStringRef JSStringCreateWithCharacters(const JSChar* chars, size_t numChars); -/*! -@function -@abstract Creates a JavaScript string from a null-terminated UTF8 string. -@param string The null-terminated UTF8 string to copy into the new JSString. -@result A JSString containing string. Ownership follows the Create Rule. -*/ -JS_EXPORT JSStringRef JSStringCreateWithUTF8CString(const char* string); - -/*! -@function -@abstract Retains a JavaScript string. -@param string The JSString to retain. -@result A JSString that is the same as string. -*/ -JS_EXPORT JSStringRef JSStringRetain(JSStringRef string); -/*! -@function -@abstract Releases a JavaScript string. -@param string The JSString to release. -*/ -JS_EXPORT void JSStringRelease(JSStringRef string); - -/*! -@function -@abstract Returns the number of Unicode characters in a JavaScript string. -@param string The JSString whose length (in Unicode characters) you want to know. -@result The number of Unicode characters stored in string. -*/ -JS_EXPORT size_t JSStringGetLength(JSStringRef string); -/*! -@function -@abstract Returns a pointer to the Unicode character buffer that - serves as the backing store for a JavaScript string. -@param string The JSString whose backing store you want to access. -@result A pointer to the Unicode character buffer that serves as string's - backing store, which will be deallocated when string is deallocated. -*/ -JS_EXPORT const JSChar* JSStringGetCharactersPtr(JSStringRef string); - -/*! -@function -@abstract Returns the maximum number of bytes a JavaScript string will - take up if converted into a null-terminated UTF8 string. -@param string The JSString whose maximum converted size (in bytes) you - want to know. -@result The maximum number of bytes that could be required to convert string into a - null-terminated UTF8 string. The number of bytes that the conversion actually ends - up requiring could be less than this, but never more. -*/ -JS_EXPORT size_t JSStringGetMaximumUTF8CStringSize(JSStringRef string); -/*! -@function -@abstract Converts a JavaScript string into a null-terminated UTF8 string, - and copies the result into an external byte buffer. -@param string The source JSString. -@param buffer The destination byte buffer into which to copy a null-terminated - UTF8 representation of string. On return, buffer contains a UTF8 string - representation of string. If bufferSize is too small, buffer will contain only - partial results. If buffer is not at least bufferSize bytes in size, - behavior is undefined. -@param bufferSize The size of the external buffer in bytes. -@result The number of bytes written into buffer (including the null-terminator byte). -*/ -JS_EXPORT size_t JSStringGetUTF8CString(JSStringRef string, char* buffer, size_t bufferSize); - -/*! -@function -@abstract Tests whether two JavaScript strings match. -@param a The first JSString to test. -@param b The second JSString to test. -@result true if the two strings match, otherwise false. -*/ -JS_EXPORT bool JSStringIsEqual(JSStringRef a, JSStringRef b); -/*! -@function -@abstract Tests whether a JavaScript string matches a null-terminated UTF8 string. -@param a The JSString to test. -@param b The null-terminated UTF8 string to test. -@result true if the two strings match, otherwise false. -*/ -JS_EXPORT bool JSStringIsEqualToUTF8CString(JSStringRef a, const char* b); - -#ifdef __cplusplus -} -#endif - -#endif /* JSStringRef_h */ diff --git a/engine/inc/JavaScriptCore/JSTypedArray.h b/engine/inc/JavaScriptCore/JSTypedArray.h deleted file mode 100644 index aa643ba1..00000000 --- a/engine/inc/JavaScriptCore/JSTypedArray.h +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright (C) 2015 Dominic Szablewski (dominic@phoboslab.org) - * Copyright (C) 2015-2016 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef JSTypedArray_h -#define JSTypedArray_h - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -// ------------- Typed Array functions -------------- - -/*! - @function - @abstract Creates a JavaScript Typed Array object with the given number of elements. - @param ctx The execution context to use. - @param arrayType A value identifying the type of array to create. If arrayType is kJSTypedArrayTypeNone or kJSTypedArrayTypeArrayBuffer then NULL will be returned. - @param length The number of elements to be in the new Typed Array. - @param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. - @result A JSObjectRef that is a Typed Array with all elements set to zero or NULL if there was an error. - */ -JS_EXPORT JSObjectRef JSObjectMakeTypedArray(JSContextRef ctx, JSTypedArrayType arrayType, size_t length, JSValueRef* exception) JSC_API_AVAILABLE(macos(10.12), ios(10.0)); - -/*! - @function - @abstract Creates a JavaScript Typed Array object from an existing pointer. - @param ctx The execution context to use. - @param arrayType A value identifying the type of array to create. If arrayType is kJSTypedArrayTypeNone or kJSTypedArrayTypeArrayBuffer then NULL will be returned. - @param bytes A pointer to the byte buffer to be used as the backing store of the Typed Array object. - @param byteLength The number of bytes pointed to by the parameter bytes. - @param bytesDeallocator The allocator to use to deallocate the external buffer when the JSTypedArrayData object is deallocated. - @param deallocatorContext A pointer to pass back to the deallocator. - @param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. - @result A JSObjectRef Typed Array whose backing store is the same as the one pointed to by bytes or NULL if there was an error. - @discussion If an exception is thrown during this function the bytesDeallocator will always be called. - */ -JS_EXPORT JSObjectRef JSObjectMakeTypedArrayWithBytesNoCopy(JSContextRef ctx, JSTypedArrayType arrayType, void* bytes, size_t byteLength, JSTypedArrayBytesDeallocator bytesDeallocator, void* deallocatorContext, JSValueRef* exception) JSC_API_AVAILABLE(macos(10.12), ios(10.0)); - -/*! - @function - @abstract Creates a JavaScript Typed Array object from an existing JavaScript Array Buffer object. - @param ctx The execution context to use. - @param arrayType A value identifying the type of array to create. If arrayType is kJSTypedArrayTypeNone or kJSTypedArrayTypeArrayBuffer then NULL will be returned. - @param buffer An Array Buffer object that should be used as the backing store for the created JavaScript Typed Array object. - @param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. - @result A JSObjectRef that is a Typed Array or NULL if there was an error. The backing store of the Typed Array will be buffer. - */ -JS_EXPORT JSObjectRef JSObjectMakeTypedArrayWithArrayBuffer(JSContextRef ctx, JSTypedArrayType arrayType, JSObjectRef buffer, JSValueRef* exception) JSC_API_AVAILABLE(macos(10.12), ios(10.0)); - -/*! - @function - @abstract Creates a JavaScript Typed Array object from an existing JavaScript Array Buffer object with the given offset and length. - @param ctx The execution context to use. - @param arrayType A value identifying the type of array to create. If arrayType is kJSTypedArrayTypeNone or kJSTypedArrayTypeArrayBuffer then NULL will be returned. - @param buffer An Array Buffer object that should be used as the backing store for the created JavaScript Typed Array object. - @param byteOffset The byte offset for the created Typed Array. byteOffset should aligned with the element size of arrayType. - @param length The number of elements to include in the Typed Array. - @param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. - @result A JSObjectRef that is a Typed Array or NULL if there was an error. The backing store of the Typed Array will be buffer. - */ -JS_EXPORT JSObjectRef JSObjectMakeTypedArrayWithArrayBufferAndOffset(JSContextRef ctx, JSTypedArrayType arrayType, JSObjectRef buffer, size_t byteOffset, size_t length, JSValueRef* exception) JSC_API_AVAILABLE(macos(10.12), ios(10.0)); - -/*! - @function - @abstract Returns a temporary pointer to the backing store of a JavaScript Typed Array object. - @param ctx The execution context to use. - @param object The Typed Array object whose backing store pointer to return. - @param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. - @result A pointer to the raw data buffer that serves as object's backing store or NULL if object is not a Typed Array object. - @discussion The pointer returned by this function is temporary and is not guaranteed to remain valid across JavaScriptCore API calls. - */ -JS_EXPORT void* JSObjectGetTypedArrayBytesPtr(JSContextRef ctx, JSObjectRef object, JSValueRef* exception) JSC_API_AVAILABLE(macos(10.12), ios(10.0)); - -/*! - @function - @abstract Returns the length of a JavaScript Typed Array object. - @param ctx The execution context to use. - @param object The Typed Array object whose length to return. - @param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. - @result The length of the Typed Array object or 0 if the object is not a Typed Array object. - */ -JS_EXPORT size_t JSObjectGetTypedArrayLength(JSContextRef ctx, JSObjectRef object, JSValueRef* exception) JSC_API_AVAILABLE(macos(10.12), ios(10.0)); - -/*! - @function - @abstract Returns the byte length of a JavaScript Typed Array object. - @param ctx The execution context to use. - @param object The Typed Array object whose byte length to return. - @param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. - @result The byte length of the Typed Array object or 0 if the object is not a Typed Array object. - */ -JS_EXPORT size_t JSObjectGetTypedArrayByteLength(JSContextRef ctx, JSObjectRef object, JSValueRef* exception) JSC_API_AVAILABLE(macos(10.12), ios(10.0)); - -/*! - @function - @abstract Returns the byte offset of a JavaScript Typed Array object. - @param ctx The execution context to use. - @param object The Typed Array object whose byte offset to return. - @param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. - @result The byte offset of the Typed Array object or 0 if the object is not a Typed Array object. - */ -JS_EXPORT size_t JSObjectGetTypedArrayByteOffset(JSContextRef ctx, JSObjectRef object, JSValueRef* exception) JSC_API_AVAILABLE(macos(10.12), ios(10.0)); - -/*! - @function - @abstract Returns the JavaScript Array Buffer object that is used as the backing of a JavaScript Typed Array object. - @param ctx The execution context to use. - @param object The JSObjectRef whose Typed Array type data pointer to obtain. - @param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. - @result A JSObjectRef with a JSTypedArrayType of kJSTypedArrayTypeArrayBuffer or NULL if object is not a Typed Array. - */ -JS_EXPORT JSObjectRef JSObjectGetTypedArrayBuffer(JSContextRef ctx, JSObjectRef object, JSValueRef* exception) JSC_API_AVAILABLE(macos(10.12), ios(10.0)); - -// ------------- Array Buffer functions ------------- - -/*! - @function - @abstract Creates a JavaScript Array Buffer object from an existing pointer. - @param ctx The execution context to use. - @param bytes A pointer to the byte buffer to be used as the backing store of the Typed Array object. - @param byteLength The number of bytes pointed to by the parameter bytes. - @param bytesDeallocator The allocator to use to deallocate the external buffer when the Typed Array data object is deallocated. - @param deallocatorContext A pointer to pass back to the deallocator. - @param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. - @result A JSObjectRef Array Buffer whose backing store is the same as the one pointed to by bytes or NULL if there was an error. - @discussion If an exception is thrown during this function the bytesDeallocator will always be called. - */ -JS_EXPORT JSObjectRef JSObjectMakeArrayBufferWithBytesNoCopy(JSContextRef ctx, void* bytes, size_t byteLength, JSTypedArrayBytesDeallocator bytesDeallocator, void* deallocatorContext, JSValueRef* exception) JSC_API_AVAILABLE(macos(10.12), ios(10.0)); - -/*! - @function - @abstract Returns a pointer to the data buffer that serves as the backing store for a JavaScript Typed Array object. - @param object The Array Buffer object whose internal backing store pointer to return. - @param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. - @result A pointer to the raw data buffer that serves as object's backing store or NULL if object is not an Array Buffer object. - @discussion The pointer returned by this function is temporary and is not guaranteed to remain valid across JavaScriptCore API calls. - */ -JS_EXPORT void* JSObjectGetArrayBufferBytesPtr(JSContextRef ctx, JSObjectRef object, JSValueRef* exception) JSC_API_AVAILABLE(macos(10.12), ios(10.0)); - -/*! - @function - @abstract Returns the number of bytes in a JavaScript data object. - @param ctx The execution context to use. - @param object The JS Arary Buffer object whose length in bytes to return. - @param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. - @result The number of bytes stored in the data object. - */ -JS_EXPORT size_t JSObjectGetArrayBufferByteLength(JSContextRef ctx, JSObjectRef object, JSValueRef* exception) JSC_API_AVAILABLE(macos(10.12), ios(10.0)); - -#ifdef __cplusplus -} -#endif - -#endif /* JSTypedArray_h */ diff --git a/engine/inc/JavaScriptCore/JSValueRef.h b/engine/inc/JavaScriptCore/JSValueRef.h deleted file mode 100644 index 852a6fa2..00000000 --- a/engine/inc/JavaScriptCore/JSValueRef.h +++ /dev/null @@ -1,380 +0,0 @@ -/* - * Copyright (C) 2006-2019 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef JSValueRef_h -#define JSValueRef_h - -#include -#include - -#ifndef __cplusplus -#include -#endif - -/*! -@enum JSType -@abstract A constant identifying the type of a JSValue. -@constant kJSTypeUndefined The unique undefined value. -@constant kJSTypeNull The unique null value. -@constant kJSTypeBoolean A primitive boolean value, one of true or false. -@constant kJSTypeNumber A primitive number value. -@constant kJSTypeString A primitive string value. -@constant kJSTypeObject An object value (meaning that this JSValueRef is a JSObjectRef). -@constant kJSTypeSymbol A primitive symbol value. -*/ -typedef enum { - kJSTypeUndefined, - kJSTypeNull, - kJSTypeBoolean, - kJSTypeNumber, - kJSTypeString, - kJSTypeObject, - kJSTypeSymbol JSC_API_AVAILABLE(macos(10.15), ios(13.0)) -} JSType; - -/*! - @enum JSTypedArrayType - @abstract A constant identifying the Typed Array type of a JSObjectRef. - @constant kJSTypedArrayTypeInt8Array Int8Array - @constant kJSTypedArrayTypeInt16Array Int16Array - @constant kJSTypedArrayTypeInt32Array Int32Array - @constant kJSTypedArrayTypeUint8Array Uint8Array - @constant kJSTypedArrayTypeUint8ClampedArray Uint8ClampedArray - @constant kJSTypedArrayTypeUint16Array Uint16Array - @constant kJSTypedArrayTypeUint32Array Uint32Array - @constant kJSTypedArrayTypeFloat32Array Float32Array - @constant kJSTypedArrayTypeFloat64Array Float64Array - @constant kJSTypedArrayTypeArrayBuffer ArrayBuffer - @constant kJSTypedArrayTypeNone Not a Typed Array - - */ -typedef enum { - kJSTypedArrayTypeInt8Array, - kJSTypedArrayTypeInt16Array, - kJSTypedArrayTypeInt32Array, - kJSTypedArrayTypeUint8Array, - kJSTypedArrayTypeUint8ClampedArray, - kJSTypedArrayTypeUint16Array, - kJSTypedArrayTypeUint32Array, - kJSTypedArrayTypeFloat32Array, - kJSTypedArrayTypeFloat64Array, - kJSTypedArrayTypeArrayBuffer, - kJSTypedArrayTypeNone, -} JSTypedArrayType JSC_API_AVAILABLE(macos(10.12), ios(10.0)); - -#ifdef __cplusplus -extern "C" { -#endif - -/*! -@function -@abstract Returns a JavaScript value's type. -@param ctx The execution context to use. -@param value The JSValue whose type you want to obtain. -@result A value of type JSType that identifies value's type. -*/ -JS_EXPORT JSType JSValueGetType(JSContextRef ctx, JSValueRef value); - -/*! -@function -@abstract Tests whether a JavaScript value's type is the undefined type. -@param ctx The execution context to use. -@param value The JSValue to test. -@result true if value's type is the undefined type, otherwise false. -*/ -JS_EXPORT bool JSValueIsUndefined(JSContextRef ctx, JSValueRef value); - -/*! -@function -@abstract Tests whether a JavaScript value's type is the null type. -@param ctx The execution context to use. -@param value The JSValue to test. -@result true if value's type is the null type, otherwise false. -*/ -JS_EXPORT bool JSValueIsNull(JSContextRef ctx, JSValueRef value); - -/*! -@function -@abstract Tests whether a JavaScript value's type is the boolean type. -@param ctx The execution context to use. -@param value The JSValue to test. -@result true if value's type is the boolean type, otherwise false. -*/ -JS_EXPORT bool JSValueIsBoolean(JSContextRef ctx, JSValueRef value); - -/*! -@function -@abstract Tests whether a JavaScript value's type is the number type. -@param ctx The execution context to use. -@param value The JSValue to test. -@result true if value's type is the number type, otherwise false. -*/ -JS_EXPORT bool JSValueIsNumber(JSContextRef ctx, JSValueRef value); - -/*! -@function -@abstract Tests whether a JavaScript value's type is the string type. -@param ctx The execution context to use. -@param value The JSValue to test. -@result true if value's type is the string type, otherwise false. -*/ -JS_EXPORT bool JSValueIsString(JSContextRef ctx, JSValueRef value); - -/*! -@function -@abstract Tests whether a JavaScript value's type is the symbol type. -@param ctx The execution context to use. -@param value The JSValue to test. -@result true if value's type is the symbol type, otherwise false. -*/ -JS_EXPORT bool JSValueIsSymbol(JSContextRef ctx, JSValueRef value) JSC_API_AVAILABLE(macos(10.15), ios(13.0)); - -/*! -@function -@abstract Tests whether a JavaScript value's type is the object type. -@param ctx The execution context to use. -@param value The JSValue to test. -@result true if value's type is the object type, otherwise false. -*/ -JS_EXPORT bool JSValueIsObject(JSContextRef ctx, JSValueRef value); - - -/*! -@function -@abstract Tests whether a JavaScript value is an object with a given class in its class chain. -@param ctx The execution context to use. -@param value The JSValue to test. -@param jsClass The JSClass to test against. -@result true if value is an object and has jsClass in its class chain, otherwise false. -*/ -JS_EXPORT bool JSValueIsObjectOfClass(JSContextRef ctx, JSValueRef value, JSClassRef jsClass); - -/*! -@function -@abstract Tests whether a JavaScript value is an array. -@param ctx The execution context to use. -@param value The JSValue to test. -@result true if value is an array, otherwise false. -*/ -JS_EXPORT bool JSValueIsArray(JSContextRef ctx, JSValueRef value) JSC_API_AVAILABLE(macos(10.11), ios(9.0)); - -/*! -@function -@abstract Tests whether a JavaScript value is a date. -@param ctx The execution context to use. -@param value The JSValue to test. -@result true if value is a date, otherwise false. -*/ -JS_EXPORT bool JSValueIsDate(JSContextRef ctx, JSValueRef value) JSC_API_AVAILABLE(macos(10.11), ios(9.0)); - -/*! -@function -@abstract Returns a JavaScript value's Typed Array type. -@param ctx The execution context to use. -@param value The JSValue whose Typed Array type to return. -@param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. -@result A value of type JSTypedArrayType that identifies value's Typed Array type, or kJSTypedArrayTypeNone if the value is not a Typed Array object. - */ -JS_EXPORT JSTypedArrayType JSValueGetTypedArrayType(JSContextRef ctx, JSValueRef value, JSValueRef* exception) JSC_API_AVAILABLE(macos(10.12), ios(10.0)); - -/* Comparing values */ - -/*! -@function -@abstract Tests whether two JavaScript values are equal, as compared by the JS == operator. -@param ctx The execution context to use. -@param a The first value to test. -@param b The second value to test. -@param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. -@result true if the two values are equal, false if they are not equal or an exception is thrown. -*/ -JS_EXPORT bool JSValueIsEqual(JSContextRef ctx, JSValueRef a, JSValueRef b, JSValueRef* exception); - -/*! -@function -@abstract Tests whether two JavaScript values are strict equal, as compared by the JS === operator. -@param ctx The execution context to use. -@param a The first value to test. -@param b The second value to test. -@result true if the two values are strict equal, otherwise false. -*/ -JS_EXPORT bool JSValueIsStrictEqual(JSContextRef ctx, JSValueRef a, JSValueRef b); - -/*! -@function -@abstract Tests whether a JavaScript value is an object constructed by a given constructor, as compared by the JS instanceof operator. -@param ctx The execution context to use. -@param value The JSValue to test. -@param constructor The constructor to test against. -@param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. -@result true if value is an object constructed by constructor, as compared by the JS instanceof operator, otherwise false. -*/ -JS_EXPORT bool JSValueIsInstanceOfConstructor(JSContextRef ctx, JSValueRef value, JSObjectRef constructor, JSValueRef* exception); - -/* Creating values */ - -/*! -@function -@abstract Creates a JavaScript value of the undefined type. -@param ctx The execution context to use. -@result The unique undefined value. -*/ -JS_EXPORT JSValueRef JSValueMakeUndefined(JSContextRef ctx); - -/*! -@function -@abstract Creates a JavaScript value of the null type. -@param ctx The execution context to use. -@result The unique null value. -*/ -JS_EXPORT JSValueRef JSValueMakeNull(JSContextRef ctx); - -/*! -@function -@abstract Creates a JavaScript value of the boolean type. -@param ctx The execution context to use. -@param boolean The bool to assign to the newly created JSValue. -@result A JSValue of the boolean type, representing the value of boolean. -*/ -JS_EXPORT JSValueRef JSValueMakeBoolean(JSContextRef ctx, bool boolean); - -/*! -@function -@abstract Creates a JavaScript value of the number type. -@param ctx The execution context to use. -@param number The double to assign to the newly created JSValue. -@result A JSValue of the number type, representing the value of number. -*/ -JS_EXPORT JSValueRef JSValueMakeNumber(JSContextRef ctx, double number); - -/*! -@function -@abstract Creates a JavaScript value of the string type. -@param ctx The execution context to use. -@param string The JSString to assign to the newly created JSValue. The - newly created JSValue retains string, and releases it upon garbage collection. -@result A JSValue of the string type, representing the value of string. -*/ -JS_EXPORT JSValueRef JSValueMakeString(JSContextRef ctx, JSStringRef string); - -/*! - @function - @abstract Creates a JavaScript value of the symbol type. - @param ctx The execution context to use. - @param description A description of the newly created symbol value. - @result A unique JSValue of the symbol type, whose description matches the one provided. - */ -JS_EXPORT JSValueRef JSValueMakeSymbol(JSContextRef ctx, JSStringRef description) JSC_API_AVAILABLE(macos(10.15), ios(13.0)); - -/* Converting to and from JSON formatted strings */ - -/*! - @function - @abstract Creates a JavaScript value from a JSON formatted string. - @param ctx The execution context to use. - @param string The JSString containing the JSON string to be parsed. - @result A JSValue containing the parsed value, or NULL if the input is invalid. - */ -JS_EXPORT JSValueRef JSValueMakeFromJSONString(JSContextRef ctx, JSStringRef string) JSC_API_AVAILABLE(macos(10.7), ios(7.0)); - -/*! - @function - @abstract Creates a JavaScript string containing the JSON serialized representation of a JS value. - @param ctx The execution context to use. - @param value The value to serialize. - @param indent The number of spaces to indent when nesting. If 0, the resulting JSON will not contains newlines. The size of the indent is clamped to 10 spaces. - @param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. - @result A JSString with the result of serialization, or NULL if an exception is thrown. - */ -JS_EXPORT JSStringRef JSValueCreateJSONString(JSContextRef ctx, JSValueRef value, unsigned indent, JSValueRef* exception) JSC_API_AVAILABLE(macos(10.7), ios(7.0)); - -/* Converting to primitive values */ - -/*! -@function -@abstract Converts a JavaScript value to boolean and returns the resulting boolean. -@param ctx The execution context to use. -@param value The JSValue to convert. -@result The boolean result of conversion. -*/ -JS_EXPORT bool JSValueToBoolean(JSContextRef ctx, JSValueRef value); - -/*! -@function -@abstract Converts a JavaScript value to number and returns the resulting number. -@param ctx The execution context to use. -@param value The JSValue to convert. -@param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. -@result The numeric result of conversion, or NaN if an exception is thrown. -*/ -JS_EXPORT double JSValueToNumber(JSContextRef ctx, JSValueRef value, JSValueRef* exception); - -/*! -@function -@abstract Converts a JavaScript value to string and copies the result into a JavaScript string. -@param ctx The execution context to use. -@param value The JSValue to convert. -@param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. -@result A JSString with the result of conversion, or NULL if an exception is thrown. Ownership follows the Create Rule. -*/ -JS_EXPORT JSStringRef JSValueToStringCopy(JSContextRef ctx, JSValueRef value, JSValueRef* exception); - -/*! -@function -@abstract Converts a JavaScript value to object and returns the resulting object. -@param ctx The execution context to use. -@param value The JSValue to convert. -@param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. -@result The JSObject result of conversion, or NULL if an exception is thrown. -*/ -JS_EXPORT JSObjectRef JSValueToObject(JSContextRef ctx, JSValueRef value, JSValueRef* exception); - -/* Garbage collection */ -/*! -@function -@abstract Protects a JavaScript value from garbage collection. -@param ctx The execution context to use. -@param value The JSValue to protect. -@discussion Use this method when you want to store a JSValue in a global or on the heap, where the garbage collector will not be able to discover your reference to it. - -A value may be protected multiple times and must be unprotected an equal number of times before becoming eligible for garbage collection. -*/ -JS_EXPORT void JSValueProtect(JSContextRef ctx, JSValueRef value); - -/*! -@function -@abstract Unprotects a JavaScript value from garbage collection. -@param ctx The execution context to use. -@param value The JSValue to unprotect. -@discussion A value may be protected multiple times and must be unprotected an - equal number of times before becoming eligible for garbage collection. -*/ -JS_EXPORT void JSValueUnprotect(JSContextRef ctx, JSValueRef value); - -#ifdef __cplusplus -} -#endif - -#endif /* JSValueRef_h */ diff --git a/engine/inc/JavaScriptCore/JavaScript.h b/engine/inc/JavaScriptCore/JavaScript.h deleted file mode 100644 index 76c52d6e..00000000 --- a/engine/inc/JavaScriptCore/JavaScript.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2006 Apple Inc. All rights reserved. - * Copyright (C) 2008 Alp Toker - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef JavaScript_h -#define JavaScript_h - -#include -#include -#include -#include -#include -#include - -#endif /* JavaScript_h */ diff --git a/engine/inc/JavaScriptCore/WebKitAvailability.h b/engine/inc/JavaScriptCore/WebKitAvailability.h deleted file mode 100644 index 9d39648e..00000000 --- a/engine/inc/JavaScriptCore/WebKitAvailability.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (C) 2008, 2009, 2010, 2014 Apple Inc. All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __WebKitAvailability__ -#define __WebKitAvailability__ - -#if defined(__APPLE__) && defined(DEFINE_AVAILABILITY_MACROS) - -#include -#include - -#if !TARGET_OS_IPHONE && __MAC_OS_X_VERSION_MIN_REQUIRED < 101100 -/* To support availability macros that mention newer OS X versions when building on older OS X versions, - we provide our own definitions of the underlying macros that the availability macros expand to. We're - free to expand the macros as no-ops since frameworks built on older OS X versions only ship bundled with - an application rather than as part of the system. -*/ - -#ifndef __NSi_10_10 // Building from trunk rather than SDK. -#define __NSi_10_10 introduced=10.0 // Use 10.0 to indicate that everything is available. -#endif - -#ifndef __NSi_10_11 // Building from trunk rather than SDK. -#define __NSi_10_11 introduced=10.0 // Use 10.0 to indicate that everything is available. -#endif - -#ifndef __NSi_10_12 // Building from trunk rather than SDK. -#define __NSi_10_12 introduced=10.0 // Use 10.0 to indicate that everything is available. -#endif - -#ifndef __AVAILABILITY_INTERNAL__MAC_10_9 -#define __AVAILABILITY_INTERNAL__MAC_10_9 -#endif - -#ifndef __AVAILABILITY_INTERNAL__MAC_10_10 -#define __AVAILABILITY_INTERNAL__MAC_10_10 -#endif - -#ifndef AVAILABLE_MAC_OS_X_VERSION_10_9_AND_LATER -#define AVAILABLE_MAC_OS_X_VERSION_10_9_AND_LATER -#endif - -#ifndef AVAILABLE_MAC_OS_X_VERSION_10_10_AND_LATER -#define AVAILABLE_MAC_OS_X_VERSION_10_10_AND_LATER -#endif - -#endif /* !TARGET_OS_IPHONE && __MAC_OS_X_VERSION_MIN_REQUIRED < 101100 */ - -#if defined(BUILDING_GTK__) -#undef JSC_API_AVAILABLE -#define JSC_API_AVAILABLE(...) -#endif - -#else -#define JSC_API_AVAILABLE(...) -#endif - -#endif /* __WebKitAvailability__ */ diff --git a/engine/inc/PassiveSocket.h b/engine/inc/PassiveSocket.h deleted file mode 100644 index 0dbf069b..00000000 --- a/engine/inc/PassiveSocket.h +++ /dev/null @@ -1,120 +0,0 @@ -/*---------------------------------------------------------------------------*/ -/* */ -/* Socket.h - Passive Socket Decleration. */ -/* */ -/* Author : Mark Carrier (mark@carrierlabs.com) */ -/* */ -/*---------------------------------------------------------------------------*/ -/* Copyright (c) 2007-2009 CarrierLabs, LLC. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * 4. The name "CarrierLabs" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * mark@carrierlabs.com. - * - * THIS SOFTWARE IS PROVIDED BY MARK CARRIER ``AS IS'' AND ANY - * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MARK CARRIER OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - *----------------------------------------------------------------------------*/ -#ifndef __PASSIVESOCKET_H__ -#define __PASSIVESOCKET_H__ -#include "ActiveSocket.h" - -/// Provides a platform independent class to create a passive socket. -/// A passive socket is used to create a "listening" socket. This type -/// of object would be used when an application needs to wait for -/// inbound connections. Support for CSimpleSocket::SocketTypeTcp, -/// CSimpleSocket::SocketTypeUdp, and CSimpleSocket::SocketTypeRaw is handled -/// in a similar fashion. The big difference is that the method -/// CPassiveSocket::Accept should not be called on the latter two socket -/// types. -class CPassiveSocket : public CSimpleSocket -{ -public: - CPassiveSocket(CSocketType type = SocketTypeTcp); - virtual ~CPassiveSocket() - { - Close(); - }; - - /// Extracts the first connection request on the queue of pending - /// connections and creates a newly connected socket. Used with - /// CSocketType CSimpleSocket::SocketTypeTcp. It is the responsibility of - /// the caller to delete the returned object when finished. - /// @return if successful a pointer to a newly created CActiveSocket object - /// will be returned and the internal error condition of the CPassiveSocket - /// object will be CPassiveSocket::SocketSuccess. If an error condition was encountered - /// the NULL will be returned and one of the following error conditions will be set: - /// CPassiveSocket::SocketEwouldblock, CPassiveSocket::SocketInvalidSocket, - /// CPassiveSocket::SocketConnectionAborted, CPassiveSocket::SocketInterrupted - /// CPassiveSocket::SocketProtocolError, CPassiveSocket::SocketFirewallError - virtual CActiveSocket *Accept(void); - - /// Bind to a multicast group on a specified interface, multicast group, and port - /// - /// @param pInterface - interface on which to bind. - /// @param pGroup - multicast group address to bind. - /// @param nPort - port on which multicast - /// @return true if able to bind to interface and multicast group. - /// If not successful, the false is returned and one of the following error - /// condiitions will be set: CPassiveSocket::SocketAddressInUse, CPassiveSocket::SocketProtocolError, - /// CPassiveSocket::SocketInvalidSocket. The following socket errors are for Linux/Unix - /// derived systems only: CPassiveSocket::SocketInvalidSocketBuffer - bool BindMulticast(const char *pInterface, const char *pGroup, uint16 nPort); - - /// Create a listening socket at local ip address 'x.x.x.x' or 'localhost' - /// if pAddr is NULL on port nPort. - /// - /// @param pAddr specifies the IP address on which to listen. - /// @param nPort specifies the port on which to listen. - /// @param nConnectionBacklog specifies connection queue backlog (default 30,000) - /// @return true if a listening socket was created. - /// If not successful, the false is returned and one of the following error - /// conditions will be set: CPassiveSocket::SocketAddressInUse, CPassiveSocket::SocketProtocolError, - /// CPassiveSocket::SocketInvalidSocket. The following socket errors are for Linux/Unix - /// derived systems only: CPassiveSocket::SocketInvalidSocketBuffer - virtual bool Listen(const char *pAddr, uint16 nPort, int32 nConnectionBacklog = 30000); - - /// Attempts to send a block of data on an established connection. - /// @param pBuf block of data to be sent. - /// @param bytesToSend size of data block to be sent. - /// @return number of bytes actually sent, return of zero means the - /// connection has been shutdown on the other side, and a return of -1 - /// means that an error has occurred. If an error was signaled then one - /// of the following error codes will be set: CPassiveSocket::SocketInvalidSocket, - /// CPassiveSocket::SocketEwouldblock, SimpleSocket::SocketConnectionReset, - /// CPassiveSocket::SocketInvalidSocketBuffer, CPassiveSocket::SocketInterrupted, - /// CPassiveSocket::SocketProtocolError, CPassiveSocket::SocketNotconnected - ///
\b Note: This function is used only for a socket of type - /// CSimpleSocket::SocketTypeUdp - virtual int32 Send(const uint8 *pBuf, size_t bytesToSend); - -private: - struct ip_mreq m_stMulticastRequest; /// group address for multicast -}; - -#endif // __PASSIVESOCKET_H__ diff --git a/engine/inc/SimpleSocket.h b/engine/inc/SimpleSocket.h deleted file mode 100644 index 99cd2e1b..00000000 --- a/engine/inc/SimpleSocket.h +++ /dev/null @@ -1,617 +0,0 @@ -/*---------------------------------------------------------------------------*/ -/* */ -/* SimpleSocket.h - Simple Socket base class decleration. */ -/* */ -/* Author : Mark Carrier (mark@carrierlabs.com) */ -/* */ -/*---------------------------------------------------------------------------*/ -/* Copyright (c) 2007-2009 CarrierLabs, LLC. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * 4. The name "CarrierLabs" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * mark@carrierlabs.com. - * - * THIS SOFTWARE IS PROVIDED BY MARK CARRIER ``AS IS'' AND ANY - * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MARK CARRIER OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - *----------------------------------------------------------------------------*/ -#ifndef __SOCKET_H__ -#define __SOCKET_H__ - -#include -#include -#include -#include -#include - -#if defined(_LINUX) || defined(_DARWIN) || defined(_BSD) -#include -#include -#include -#include -#include -#include -#endif -#ifdef _LINUX -#include -#include -#include -#include -#endif -#ifdef _DARWIN -#include -#endif -#if defined(_LINUX) || defined(_DARWIN) || defined(_BSD) -#include -#include -#include -#include -#endif - -#ifdef _WIN32 -#include -#include -#include - -#define IPTOS_LOWDELAY 0x10 - -#endif -#include "Host.h" -#include "StatTimer.h" - -//----------------------------------------------------------------------------- -// General class macro definitions and typedefs -//----------------------------------------------------------------------------- -#ifndef INVALID_SOCKET -#define INVALID_SOCKET ~(0) -#endif - -#define SOCKET_SENDFILE_BLOCKSIZE 8192 - -/// Provides a platform independent class to for socket development. -/// This class is designed to abstract socket communication development in a -/// platform independent manner. -/// - Socket types -/// -# CActiveSocket Class -/// -# CPassiveSocket Class -class CSimpleSocket -{ -public: - /// Defines the three possible states for shuting down a socket. - typedef enum - { - Receives = SHUT_RD, ///< Shutdown passive socket. - Sends = SHUT_WR, ///< Shutdown active socket. - Both = SHUT_RDWR ///< Shutdown both active and passive sockets. - } CShutdownMode; - - /// Defines the socket types defined by CSimpleSocket class. - typedef enum - { - SocketTypeInvalid, ///< Invalid socket type. - SocketTypeTcp, ///< Defines socket as TCP socket. - SocketTypeUdp, ///< Defines socket as UDP socket. - SocketTypeTcp6, ///< Defines socket as IPv6 TCP socket. - SocketTypeUdp6, ///< Defines socket as IPv6 UDP socket. - SocketTypeRaw ///< Provides raw network protocol access. - } CSocketType; - - /// Defines all error codes handled by the CSimpleSocket class. - typedef enum - { - SocketError = -1, ///< Generic socket error translates to error below. - SocketSuccess = 0, ///< No socket error. - SocketInvalidSocket, ///< Invalid socket handle. - SocketInvalidAddress, ///< Invalid destination address specified. - SocketInvalidPort, ///< Invalid destination port specified. - SocketConnectionRefused, ///< No server is listening at remote address. - SocketTimedout, ///< Timed out while attempting operation. - SocketEwouldblock, ///< Operation would block if socket were blocking. - SocketNotconnected, ///< Currently not connected. - SocketEinprogress, ///< Socket is non-blocking and the connection cannot be completed immediately - SocketInterrupted, ///< Call was interrupted by a signal that was caught before a valid connection arrived. - SocketConnectionAborted, ///< The connection has been aborted. - SocketProtocolError, ///< Invalid protocol for operation. - SocketFirewallError, ///< Firewall rules forbid connection. - SocketInvalidSocketBuffer, ///< The receive buffer point outside the process's address space. - SocketConnectionReset, ///< Connection was forcibly closed by the remote host. - SocketAddressInUse, ///< Address already in use. - SocketInvalidPointer, ///< Pointer type supplied as argument is invalid. - SocketEunknown ///< Unknown error please report to mark@carrierlabs.com - } CSocketError; - -public: - CSimpleSocket(CSocketType type = SocketTypeTcp); - CSimpleSocket(CSimpleSocket &socket); - - virtual ~CSimpleSocket() - { - if (m_pBuffer != NULL) - { - delete[] m_pBuffer; - m_pBuffer = NULL; - } - }; - - /// Initialize instance of CSocket. This method MUST be called before an - /// object can be used. Errors : CSocket::SocketProtocolError, - /// CSocket::SocketInvalidSocket, - /// @return true if properly initialized. - virtual bool Initialize(void); - - /// Close socket - /// @return true if successfully closed otherwise returns false. - virtual bool Close(void); - - /// Shutdown shut down socket send and receive operations - /// CShutdownMode::Receives - Disables further receive operations. - /// CShutdownMode::Sends - Disables further send operations. - /// CShutdownBoth:: - Disables further send and receive operations. - /// @param nShutdown specifies the type of shutdown. - /// @return true if successfully shutdown otherwise returns false. - virtual bool Shutdown(CShutdownMode nShutdown); - - /// Examine the socket descriptor sets currently owned by the instance of - /// the socket class (the readfds, writefds, and errorfds parameters) to - /// see whether some of their descriptors are ready for reading, are ready - /// for writing, or have an exceptional condition pending, respectively. - /// Block until an event happens on the specified file descriptors. - /// @return true if socket has data ready, or false if not ready or timed out. - virtual bool Select(void) - { - return Select(0, 0); - }; - - /// Examine the socket descriptor sets currently owned by the instance of - /// the socket class (the readfds, writefds, and errorfds parameters) to - /// see whether some of their descriptors are ready for reading, are ready - /// for writing, or have an exceptional condition pending, respectively. - /// @param nTimeoutSec timeout in seconds for select. - /// @param nTimeoutUSec timeout in micro seconds for select. - /// @return true if socket has data ready, or false if not ready or timed out. - virtual bool Select(int32 nTimeoutSec, int32 nTimeoutUSec); - - /// Does the current instance of the socket object contain a valid socket - /// descriptor. - /// @return true if the socket object contains a valid socket descriptor. - virtual bool IsSocketValid(void) - { - return (m_socket != SocketError); - }; - - /// Provides a standard error code for cross platform development by - /// mapping the operating system error to an error defined by the CSocket - /// class. - void TranslateSocketError(void); - - /// Returns a human-readable description of the given error code - /// or the last error code of a socket - static const char *DescribeError(CSocketError err); - inline const char *DescribeError() - { - return DescribeError(m_socketErrno); - }; - - /// Attempts to receive a block of data on an established connection. - /// @param nMaxBytes maximum number of bytes to receive. - /// @param pBuffer, memory where to receive the data, - /// NULL receives to internal buffer returned with GetData() - /// Non-NULL receives directly there, but GetData() will return WRONG ptr! - /// @return number of bytes actually received. - /// @return of zero means the connection has been shutdown on the other side. - /// @return of -1 means that an error has occurred. - virtual int32 Receive(int32 nMaxBytes = 1, uint8 *pBuffer = 0); - - /// Attempts to send a block of data on an established connection. - /// @param pBuf block of data to be sent. - /// @param bytesToSend size of data block to be sent. - /// @return number of bytes actually sent. - /// @return of zero means the connection has been shutdown on the other side. - /// @return of -1 means that an error has occurred. - virtual int32 Send(const uint8 *pBuf, size_t bytesToSend); - - /// Attempts to send at most nNumItem blocks described by sendVector - /// to the socket descriptor associated with the socket object. - /// @param sendVector pointer to an array of iovec structures - /// @param nNumItems number of items in the vector to process - ///
\b NOTE: Buffers are processed in the order specified. - /// @return number of bytes actually sent, return of zero means the - /// connection has been shutdown on the other side, and a return of -1 - /// means that an error has occurred. - virtual int32 Send(const struct iovec *sendVector, int32 nNumItems); - - /// Copies data between one file descriptor and another. - /// On some systems this copying is done within the kernel, and thus is - /// more efficient than the combination of CSimpleSocket::Send and - /// CSimpleSocket::Receive, which would require transferring data to and - /// from user space. - ///
\b Note: This is available on all implementations, but the kernel - /// implementation is only available on Unix type systems. - /// @param nOutFd descriptor opened for writing. - /// @param nInFd descriptor opened for reading. - /// @param pOffset from which to start reading data from input file. - /// @param nCount number of bytes to copy between file descriptors. - /// @return number of bytes written to the out socket descriptor. - virtual int32 SendFile(int32 nOutFd, int32 nInFd, off_t *pOffset, int32 nCount); - - /// Returns blocking/non-blocking state of socket. - /// @return true if the socket is non-blocking, else return false. - bool IsNonblocking(void) - { - return (m_bIsBlocking == false); - }; - - /// Set the socket to blocking. - /// @return true if successful set to blocking, else return false; - bool SetBlocking(void); - - /// Set the socket as non-blocking. - /// @return true if successful set to non-blocking, else return false; - bool SetNonblocking(void); - - /// Get a pointer to internal receive buffer. The user MUST not free this - /// pointer when finished. This memory is managed internally by the CSocket - /// class. - /// @return pointer to data if valid, else returns NULL. - uint8 *GetData(void) - { - return m_pBuffer; - }; - - /// Returns the number of bytes received on the last call to - /// CSocket::Receive(). - /// @return number of bytes received. - int32 GetBytesReceived(void) - { - return m_nBytesReceived; - }; - - /// Returns the number of bytes sent on the last call to - /// CSocket::Send(). - /// @return number of bytes sent. - int32 GetBytesSent(void) - { - return m_nBytesSent; - }; - - /// Controls the actions taken when CSimpleSocket::Close is executed on a - /// socket object that has unsent data. The default value for this option - /// is \b off. - /// - Following are the three possible scenarios. - /// -# \b bEnable is false, CSimpleSocket::Close returns immediately, but - /// any unset data is transmitted (after CSimpleSocket::Close returns) - /// -# \b bEnable is true and \b nTime is zero, CSimpleSocket::Close return - /// immediately and any unsent data is discarded. - /// -# \b bEnable is true and \b nTime is nonzero, CSimpleSocket::Close does - /// not return until all unsent data is transmitted (or the connection is - /// Closed by the remote system). - ///

- /// @param bEnable true to enable option false to disable option. - /// @param nTime time in seconds to linger. - /// @return true if option successfully set - bool SetOptionLinger(bool bEnable, uint16 nTime); - - /// Tells the kernel that even if this port is busy (in the TIME_WAIT state), - /// go ahead and reuse it anyway. If it is busy, but with another state, - /// you will still get an address already in use error. - /// @return true if option successfully set - bool SetOptionReuseAddr(); - - /// Gets the timeout value that specifies the maximum number of seconds a - /// call to CSimpleSocket::Open waits until it completes. - /// @return the length of time in seconds - int32 GetConnectTimeoutSec(void) - { - return m_stConnectTimeout.tv_sec; - }; - - /// Gets the timeout value that specifies the maximum number of microseconds - /// a call to CSimpleSocket::Open waits until it completes. - /// @return the length of time in microseconds - int32 GetConnectTimeoutUSec(void) - { - return m_stConnectTimeout.tv_usec; - }; - - /// Sets the timeout value that specifies the maximum amount of time a call - /// to CSimpleSocket::Receive waits until it completes. Use the method - /// CSimpleSocket::SetReceiveTimeout to specify the number of seconds to wait. - /// If a call to CSimpleSocket::Receive has blocked for the specified length of - /// time without receiving additional data, it returns with a partial count - /// or CSimpleSocket::GetSocketError set to CSimpleSocket::SocketEwouldblock if no data - /// were received. - /// @param nConnectTimeoutSec of timeout in seconds. - /// @param nConnectTimeoutUsec of timeout in microseconds. - /// @return true if socket connection timeout was successfully set. - void SetConnectTimeout(int32 nConnectTimeoutSec, int32 nConnectTimeoutUsec = 0) - { - m_stConnectTimeout.tv_sec = nConnectTimeoutSec; - m_stConnectTimeout.tv_usec = nConnectTimeoutUsec; - }; - - /// Gets the timeout value that specifies the maximum number of seconds a - /// a call to CSimpleSocket::Receive waits until it completes. - /// @return the length of time in seconds - int32 GetReceiveTimeoutSec(void) - { - return m_stRecvTimeout.tv_sec; - }; - - /// Gets the timeout value that specifies the maximum number of microseconds - /// a call to CSimpleSocket::Receive waits until it completes. - /// @return the length of time in microseconds - int32 GetReceiveTimeoutUSec(void) - { - return m_stRecvTimeout.tv_usec; - }; - - /// Sets the timeout value that specifies the maximum amount of time a call - /// to CSimpleSocket::Receive waits until it completes. Use the method - /// CSimpleSocket::SetReceiveTimeout to specify the number of seconds to wait. - /// If a call to CSimpleSocket::Receive has blocked for the specified length of - /// time without receiving additional data, it returns with a partial count - /// or CSimpleSocket::GetSocketError set to CSimpleSocket::SocketEwouldblock if no data - /// were received. - /// @param nRecvTimeoutSec of timeout in seconds. - /// @param nRecvTimeoutUsec of timeout in microseconds. - /// @return true if socket timeout was successfully set. - bool SetReceiveTimeout(int32 nRecvTimeoutSec, int32 nRecvTimeoutUsec = 0); - - /// Enable/disable multicast for a socket. This options is only valid for - /// socket descriptors of type CSimpleSocket::SocketTypeUdp. - /// @return true if multicast was enabled or false if socket type is not - /// CSimpleSocket::SocketTypeUdp and the error will be set to - /// CSimpleSocket::SocketProtocolError - bool SetMulticast(bool bEnable, uint8 multicastTTL = 1); - - /// Return true if socket is multicast or false is socket is unicast - /// @return true if multicast is enabled - bool GetMulticast() - { - return m_bIsMulticast; - }; - - /// Bind socket to a specific interface when using multicast. - /// @return true if successfully bound to interface - bool BindInterface(const char *pInterface); - - /// Gets the timeout value that specifies the maximum number of seconds a - /// a call to CSimpleSocket::Send waits until it completes. - /// @return the length of time in seconds - int32 GetSendTimeoutSec(void) - { - return m_stSendTimeout.tv_sec; - }; - - /// Gets the timeout value that specifies the maximum number of microseconds - /// a call to CSimpleSocket::Send waits until it completes. - /// @return the length of time in microseconds - int32 GetSendTimeoutUSec(void) - { - return m_stSendTimeout.tv_usec; - }; - - /// Gets the timeout value that specifies the maximum amount of time a call - /// to CSimpleSocket::Send waits until it completes. - /// @return the length of time in seconds - bool SetSendTimeout(int32 nSendTimeoutSec, int32 nSendTimeoutUsec = 0); - - /// Returns the last error that occured for the instace of the CSimpleSocket - /// instance. This method should be called immediately to retrieve the - /// error code for the failing mehtod call. - /// @return last error that occured. - CSocketError GetSocketError(void) - { - return m_socketErrno; - }; - /* - CSocketError GetSocketError(void) { - CSocketError err = m_socketErrno; - m_socketErrno = SocketSuccess; - return err; - - }; - */ - - /// Get the total time the of the last operation in milliseconds. - /// @return number of milliseconds of last operation. - uint32 GetTotalTimeMs() - { - return m_timer.GetMilliSeconds(); - }; - - /// Get the total time the of the last operation in microseconds. - /// @return number of microseconds or last operation. - uint32 GetTotalTimeUsec() - { - return m_timer.GetMicroSeconds(); - }; - - /// Return Differentiated Services Code Point (DSCP) value currently set on the socket object. - /// @return DSCP for current socket object. - ///

\b NOTE: Windows special notes http://support.microsoft.com/kb/248611. - int GetSocketDscp(void); - - /// Set Differentiated Services Code Point (DSCP) for socket object. - /// @param nDscp value of TOS setting which will be converted to DSCP - /// @return true if DSCP value was properly set - ///

\b NOTE: Windows special notes http://support.microsoft.com/kb/248611. - bool SetSocketDscp(int nDscp); - - /// Return socket descriptor - /// @return socket descriptor which is a signed 32 bit integer. - SOCKET GetSocketDescriptor() - { - return m_socket; - }; - - /// Return socket descriptor - /// @return socket descriptor which is a signed 32 bit integer. - CSocketType GetSocketType() - { - return m_nSocketType; - }; - - /// Returns clients Internet host address as a string in standard numbers-and-dots notation. - /// @return NULL if invalid - const char *GetClientAddr() - { - return inet_ntoa(m_stClientSockaddr.sin_addr); - }; - - /// Returns the port number on which the client is connected. - /// @return client port number. - uint16 GetClientPort() - { - return m_stClientSockaddr.sin_port; - }; - - /// Returns server Internet host address as a string in standard numbers-and-dots notation. - /// @return NULL if invalid - const char *GetServerAddr() - { - return inet_ntoa(m_stServerSockaddr.sin_addr); - }; - - /// Returns the port number on which the server is connected. - /// @return server port number. - uint16 GetServerPort() - { - return ntohs(m_stServerSockaddr.sin_port); - }; - - /// Get the TCP receive buffer window size for the current socket object. - ///

\b NOTE: Linux will set the receive buffer to twice the value passed. - /// @return zero on failure else the number of bytes of the TCP receive buffer window size if successful. - uint32 GetReceiveWindowSize() - { - return GetWindowSize(SO_RCVBUF); - }; - - /// Get the TCP send buffer window size for the current socket object. - ///

\b NOTE: Linux will set the send buffer to twice the value passed. - /// @return zero on failure else the number of bytes of the TCP receive buffer window size if successful. - uint32 GetSendWindowSize() - { - return GetWindowSize(SO_SNDBUF); - }; - - /// Set the TCP receive buffer window size for the current socket object. - ///

\b NOTE: Linux will set the receive buffer to twice the value passed. - /// @return zero on failure else the number of bytes of the TCP send buffer window size if successful. - uint32 SetReceiveWindowSize(uint32 nWindowSize) - { - return SetWindowSize(SO_RCVBUF, nWindowSize); - }; - - /// Set the TCP send buffer window size for the current socket object. - ///

\b NOTE: Linux will set the send buffer to twice the value passed. - /// @return zero on failure else the number of bytes of the TCP send buffer window size if successful. - uint32 SetSendWindowSize(uint32 nWindowSize) - { - return SetWindowSize(SO_SNDBUF, nWindowSize); - }; - - /// Disable the Nagle algorithm (Set TCP_NODELAY to true) - /// @return false if failed to set socket option otherwise return true; - bool DisableNagleAlgoritm(); - - /// Enable the Nagle algorithm (Set TCP_NODELAY to false) - /// @return false if failed to set socket option otherwise return true; - bool EnableNagleAlgoritm(); - -protected: - /// Set internal socket error to that specified error - /// @param error type of error - void SetSocketError(CSimpleSocket::CSocketError error) - { - m_socketErrno = error; - }; - - /// Set object socket handle to that specified as parameter - /// @param socket value of socket descriptor - void SetSocketHandle(SOCKET socket) - { - m_socket = socket; - }; - -private: - /// Generic function used to get the send/receive window size - /// @return zero on failure else the number of bytes of the TCP window size if successful. - uint32 GetWindowSize(uint32 nOptionName); - - /// Generic function used to set the send/receive window size - /// @return zero on failure else the number of bytes of the TCP window size if successful. - uint32 SetWindowSize(uint32 nOptionName, uint32 nWindowSize); - - /// Attempts to send at most nNumItem blocks described by sendVector - /// to the socket descriptor associated with the socket object. - /// @param sendVector pointer to an array of iovec structures - /// @param nNumItems number of items in the vector to process - ///
\b Note: This implementation is for systems that don't natively - /// support this functionality. - /// @return number of bytes actually sent, return of zero means the - /// connection has been shutdown on the other side, and a return of -1 - /// means that an error has occurred. - int32 Writev(const struct iovec *pVector, size_t nCount); - - /// Flush the socket descriptor owned by the object. - /// @return true data was successfully sent, else return false; - bool Flush(); - - CSimpleSocket *operator=(CSimpleSocket &socket); - -protected: - SOCKET m_socket; /// socket handle - CSocketError m_socketErrno; /// number of last error - uint8 *m_pBuffer; /// internal send/receive buffer - int32 m_nBufferSize; /// size of internal send/receive buffer - int32 m_nSocketDomain; /// socket type PF_INET, PF_INET6 - CSocketType m_nSocketType; /// socket type - UDP, TCP or RAW - int32 m_nBytesReceived; /// number of bytes received - int32 m_nBytesSent; /// number of bytes sent - uint32 m_nFlags; /// socket flags - bool m_bIsBlocking; /// is socket blocking - bool m_bIsMulticast; /// is the UDP socket multicast; - struct timeval m_stConnectTimeout; /// connection timeout - struct timeval m_stRecvTimeout; /// receive timeout - struct timeval m_stSendTimeout; /// send timeout - struct sockaddr_in m_stServerSockaddr; /// server address - struct sockaddr_in m_stClientSockaddr; /// client address - struct sockaddr_in m_stMulticastGroup; /// multicast group to bind to - struct linger m_stLinger; /// linger flag - CStatTimer m_timer; /// internal statistics. -#ifdef WIN32 - WSADATA m_hWSAData; /// Windows -#endif - fd_set m_writeFds; /// write file descriptor set - fd_set m_readFds; /// read file descriptor set - fd_set m_errorFds; /// error file descriptor set -}; - -#endif /* __SOCKET_H__ */ diff --git a/engine/inc/StatTimer.h b/engine/inc/StatTimer.h deleted file mode 100644 index 89d4cfa8..00000000 --- a/engine/inc/StatTimer.h +++ /dev/null @@ -1,110 +0,0 @@ -/*----------------------------------------------------------------------------*/ -/* */ -/* StatTimer.h: interface for the CStatTimer class. */ -/* */ -/* Author: Mark Carrier (mark@carrierlabs.com) */ -/* */ -/*----------------------------------------------------------------------------*/ -/* Copyright (c) 2006 CarrierLabs, LLC. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * 4. The name "CarrierLabs" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * mark@carrierlabs.com. - * - * THIS SOFTWARE IS PROVIDED BY MARK CARRIER ``AS IS'' AND ANY - * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MARK CARRIER OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - *----------------------------------------------------------------------------*/ -#ifndef __CSTATTIMER_H__ -#define __CSTATTIMER_H__ - -#include - -#ifdef WIN32 -#include -#include -#endif - -#ifdef _LINUX -#include -#include -#endif - -#include "Host.h" - -#if defined(WIN32) -#define GET_CLOCK_COUNT(x) QueryPerformanceCounter((LARGE_INTEGER *)x) -#else -#define GET_CLOCK_COUNT(x) gettimeofday(x, NULL) -#endif - -#define MILLISECONDS_CONVERSION 1000 -#define MICROSECONDS_CONVERSION 1000000 - -/// Class to abstract socket communications in a cross platform manner. -/// This class is designed -class CStatTimer -{ -public: - CStatTimer(){}; - - ~CStatTimer(){}; - - void Initialize() - { - memset(&m_startTime, 0, sizeof(struct timeval)); - memset(&m_endTime, 0, sizeof(struct timeval)); - }; - - struct timeval GetStartTime() { return m_startTime; }; - void SetStartTime() { GET_CLOCK_COUNT(&m_startTime); }; - - struct timeval GetEndTime() { return m_endTime; }; - void SetEndTime() { GET_CLOCK_COUNT(&m_endTime); }; - - uint32 GetMilliSeconds() { return (CalcTotalUSec() / MILLISECONDS_CONVERSION); }; - uint32 GetMicroSeconds() { return (CalcTotalUSec()); }; - uint32 GetSeconds() { return (CalcTotalUSec() / MICROSECONDS_CONVERSION); }; - - uint32 GetCurrentTime() - { - struct timeval tmpTime; - GET_CLOCK_COUNT(&tmpTime); - return ((tmpTime.tv_sec * MICROSECONDS_CONVERSION) + tmpTime.tv_usec); - }; - -private: - uint32 CalcTotalUSec() { return (((m_endTime.tv_sec - m_startTime.tv_sec) * MICROSECONDS_CONVERSION) + - (m_endTime.tv_usec - m_startTime.tv_usec)); }; - -private: - struct timeval m_startTime; - struct timeval m_endTime; -}; - -#endif // __CSTATTIMER_H__ diff --git a/engine/inc/Ultralight/Bitmap.h b/engine/inc/Ultralight/Bitmap.h deleted file mode 100644 index 8be71119..00000000 --- a/engine/inc/Ultralight/Bitmap.h +++ /dev/null @@ -1,279 +0,0 @@ -/// -/// @file Bitmap.h -/// -/// @brief The header for the Bitmap class. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2020 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include -#include -#include - -namespace ultralight { - -#pragma pack(push, 1) - -/// -/// The various Bitmap formats. -/// -enum UExport BitmapFormat { - /** - * Alpha channel only, 8-bits per pixel. - * - * Encoding: 8-bits per channel, unsigned normalized. - * - * Color-space: Linear (no gamma), alpha-coverage only. - */ - kBitmapFormat_A8_UNORM, - - /** - * Blue Green Red Alpha channels, 32-bits per pixel. - * - * Encoding: 8-bits per channel, unsigned normalized. - * - * Color-space: sRGB gamma with premultiplied linear alpha channel. - * - * NOTE: Alpha is premultiplied with BGR channels _before_ sRGB gamma is - * applied so we can use sRGB conversion hardware and perform all - * blending in linear space on GPU. - */ - kBitmapFormat_BGRA8_UNORM_SRGB, -}; - -/// -/// Macro to get the bytes per pixel from a BitmapFormat -/// -#define GetBytesPerPixel(x) (x == kBitmapFormat_A8_UNORM? 1 : 4) - -/// -/// @brief Bitmap container with basic blitting and conversion routines. -/// -class UExport Bitmap : public RefCounted { - public: - /// - /// Create an empty Bitmap. No pixels will be allocated. - /// - static Ref Create(); - - /// - /// Create a Bitmap with a certain configuration. Pixels will be allocated - /// but not initialized. - /// - /// @param width The width in pixels. - /// - /// @param height The height in pixels. - /// - /// @param format The pixel format to use. - /// - /// @return A ref-pointer to a new Bitmap instance. - /// - static Ref Create(uint32_t width, uint32_t height, - BitmapFormat format); - - /// - /// Create a Bitmap with existing pixels and configuration. - /// - /// @param width The width in pixels. - /// - /// @param height The height in pixels. - /// - /// @param format The pixel format to use. - /// - /// @param row_bytes The number of bytes between each row (note that this - /// value should be >= width * bytes_per_pixel). - /// - /// @param pixels Pointer to raw pixel buffer. - /// - /// @param size Size of the raw pixel buffer. - /// - /// @param should_copy Whether or not a copy should be made of the pixels. - /// If this is false, the returned Bitmap will use the - /// raw pixels passed in as its own, but you are still - /// responsible for destroying your buffer afterwards. - /// - /// @param fixup_gamma Whether or not we should reinterpret the source - /// as an sRGB bitmap with premultiplied alpha applied - /// after the gamma function (typical of PNGs). We - /// expect all premultiplication to be applied before - /// the gamma function so we can blend properly in - /// linear space. Only valid for - /// kBitmapFormat_BGRA8_UNORM_SRGB. - /// - /// @return A ref-pointer to a new Bitmap instance. - /// - static Ref Create(uint32_t width, uint32_t height, - BitmapFormat format, uint32_t row_bytes, - const void* pixels, size_t size, - bool should_copy = true, bool fixup_gamma = false); - - /// - /// Create a bitmap from a deep copy of another Bitmap. - /// - static Ref Create(const Bitmap& bitmap); - - /// - /// Get the width in pixels. - /// - virtual uint32_t width() const = 0; - - /// - /// Get the height in pixels. - /// - virtual uint32_t height() const = 0; - - /// - /// Get the bounds as an IntRect - /// - virtual IntRect bounds() const = 0; - - /// - /// Get the pixel format. - /// - virtual BitmapFormat format() const = 0; - - /// - /// Get the number of bytes per pixel. - /// - virtual uint32_t bpp() const = 0; - - /// - /// Get the number of bytes between each row of pixels. - /// - /// @note This value is usually calculated as width * bytes_per_pixel (bpp) - /// but it may be larger due to alignment rules in the allocator. - /// - virtual uint32_t row_bytes() const = 0; - - /// - /// Get the size in bytes of the pixel buffer. - /// - /// @note Size is calculated as row_bytes() * height(). - /// - virtual size_t size() const = 0; - - /// - /// Whether or not this Bitmap owns the pixel buffer and will destroy it - /// at the end of its lifetime. - /// - virtual bool owns_pixels() const = 0; - - /// - /// Lock the pixel buffer for reading/writing. - /// - /// @return A pointer to the pixel buffer. - /// - virtual void* LockPixels() = 0; - - /// - /// Unlock the pixel buffer. - /// - virtual void UnlockPixels() = 0; - - /// - /// Lock the pixel buffer for reading/writing. (const) - /// - /// @return A const pointer to the pixel buffer. - /// - virtual const void* LockPixels() const = 0; - - /// - /// Unlock the pixel buffer. (const) - /// - virtual void UnlockPixels() const = 0; - - /// - /// Get the raw pixel buffer. - /// - /// @note You should only call this if pixels are already locked. - /// - virtual void* raw_pixels() = 0; - - /// - /// Whether or not this Bitmap is empty (no pixels allocated). - /// - virtual bool IsEmpty() const = 0; - - /// - /// Erase the Bitmap (set all pixels to 0). - /// - virtual void Erase() = 0; - - /// - /// Assign another bitmap to this one. - /// - /// @param bitmap The bitmap to copy from. - /// - virtual void Set(Ref bitmap) = 0; - - /// - /// Draw another bitmap to this bitmap. - /// - /// @note Formats do not need to match. Bitmap formats will be converted - /// to one another automatically. Note that when converting from - /// BGRA8 to A8, only the Blue channel will be used. - /// - /// @param src_rect The source rectangle, relative to src bitmap. - /// - /// @param dest_rect The destination rectangle, relative to this bitmap. - /// - /// @param src The source bitmap. - /// - /// @param pad_repeat Whether or not we should pad the drawn bitmap by one - /// pixel of repeated edge pixels from the source bitmap. - /// - /// @return Whether or not the operation succeeded (this can fail if the - /// src_rect and/or dest_rect are invalid, or if their total - /// dimensions do not match). - /// - virtual bool DrawBitmap(IntRect src_rect, IntRect dest_rect, - Ref src, bool pad_repeat) = 0; - - /// - /// Write this Bitmap out to a PNG image. (mainly used for Debug) - /// - /// @param path The filepath to write to (opened with fopen()) - /// - /// @return Whether or not the operation succeeded. - /// - virtual bool WritePNG(const char* path) = 0; - - /// - /// Make a resized copy of this bitmap by writing to a pre-allocated - /// destination bitmap. - /// - /// @param destination The bitmap to store the result in, the width and - /// height of the destination will be used. - /// - /// @param high_quality Whether or not a high quality resampling will be - /// used during the resize. (Otherwise, just uses fast - /// nearest-neighbor sampling) - /// - /// @return Whether or not the operation succeeded. This operation is only - /// valid if both formats are kBitmapFormat_BGRA8_UNORM_SRGB and - /// both the source and destination are non-empty. - /// - virtual bool Resample(Ref destination, bool high_quality) = 0; - - /// - /// This converts a BGRA bitmap to RGBA bitmap and vice-versa by swapping - /// the red and blue channels. - /// - virtual void SwapRedBlueChannels() = 0; - -protected: - Bitmap(); - virtual ~Bitmap(); - Bitmap(const Bitmap&); - void operator=(const Bitmap&); -}; - -#pragma pack(pop) - -} // namespace ultralight diff --git a/engine/inc/Ultralight/Buffer.h b/engine/inc/Ultralight/Buffer.h deleted file mode 100644 index 68d2de6e..00000000 --- a/engine/inc/Ultralight/Buffer.h +++ /dev/null @@ -1,47 +0,0 @@ -/// -/// @file Buffer.h -/// -/// @brief The header for the Buffer class. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2020 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include -#include - -namespace ultralight { - -/// -/// A fixed-size byte container for passing data around. -/// -class UExport Buffer : public RefCounted { -public: - /// - /// Create a Buffer, a copy of data is made. - /// - static Ref Create(const void* data, size_t size); - - /// - /// Get a pointer to raw byte data. - /// - virtual void* data() = 0; - - /// - /// Get the size in bytes. - /// - virtual size_t size() const = 0; - -protected: - Buffer(); - virtual ~Buffer(); - Buffer(const Buffer&); - void operator=(const Buffer&); -}; - -} // namespace ultralight diff --git a/engine/inc/Ultralight/CAPI.h b/engine/inc/Ultralight/CAPI.h deleted file mode 100644 index ff13bbd9..00000000 --- a/engine/inc/Ultralight/CAPI.h +++ /dev/null @@ -1,1936 +0,0 @@ -/// -/// @file CAPI.h -/// -/// @brief The C-language API for Ultralight -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2020 Ultralight, Inc. All rights reserved. -/// -#ifndef ULTRALIGHT_CAPI_H -#define ULTRALIGHT_CAPI_H - -#ifndef __cplusplus -//#include -#endif - -#include -#include -#ifdef __OBJC__ -#import -#endif - -#if defined(__WIN32__) || defined(_WIN32) -# if defined(ULTRALIGHT_IMPLEMENTATION) -# define ULExport __declspec(dllexport) -# else -# define ULExport __declspec(dllimport) -# endif -#define _thread_local __declspec(thread) -#ifndef _NATIVE_WCHAR_T_DEFINED -#define DISABLE_NATIVE_WCHAR_T -typedef unsigned short ULChar16; -#else -typedef wchar_t ULChar16; -#endif -#else -# define ULExport __attribute__((visibility("default"))) -#define _thread_local __thread -typedef unsigned short ULChar16; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct C_Config* ULConfig; -typedef struct C_Renderer* ULRenderer; -typedef struct C_Session* ULSession; -typedef struct C_View* ULView; -typedef struct C_Bitmap* ULBitmap; -typedef struct C_String* ULString; -typedef struct C_Buffer* ULBuffer; -typedef struct C_KeyEvent* ULKeyEvent; -typedef struct C_MouseEvent* ULMouseEvent; -typedef struct C_ScrollEvent* ULScrollEvent; -typedef struct C_Surface* ULSurface; -typedef struct C_Surface* ULBitmapSurface; - -typedef enum { - kMessageSource_XML = 0, - kMessageSource_JS, - kMessageSource_Network, - kMessageSource_ConsoleAPI, - kMessageSource_Storage, - kMessageSource_AppCache, - kMessageSource_Rendering, - kMessageSource_CSS, - kMessageSource_Security, - kMessageSource_ContentBlocker, - kMessageSource_Other, -} ULMessageSource; - -typedef enum { - kMessageLevel_Log = 1, - kMessageLevel_Warning = 2, - kMessageLevel_Error = 3, - kMessageLevel_Debug = 4, - kMessageLevel_Info = 5, -} ULMessageLevel; - -typedef enum { - kCursor_Pointer = 0, - kCursor_Cross, - kCursor_Hand, - kCursor_IBeam, - kCursor_Wait, - kCursor_Help, - kCursor_EastResize, - kCursor_NorthResize, - kCursor_NorthEastResize, - kCursor_NorthWestResize, - kCursor_SouthResize, - kCursor_SouthEastResize, - kCursor_SouthWestResize, - kCursor_WestResize, - kCursor_NorthSouthResize, - kCursor_EastWestResize, - kCursor_NorthEastSouthWestResize, - kCursor_NorthWestSouthEastResize, - kCursor_ColumnResize, - kCursor_RowResize, - kCursor_MiddlePanning, - kCursor_EastPanning, - kCursor_NorthPanning, - kCursor_NorthEastPanning, - kCursor_NorthWestPanning, - kCursor_SouthPanning, - kCursor_SouthEastPanning, - kCursor_SouthWestPanning, - kCursor_WestPanning, - kCursor_Move, - kCursor_VerticalText, - kCursor_Cell, - kCursor_ContextMenu, - kCursor_Alias, - kCursor_Progress, - kCursor_NoDrop, - kCursor_Copy, - kCursor_None, - kCursor_NotAllowed, - kCursor_ZoomIn, - kCursor_ZoomOut, - kCursor_Grab, - kCursor_Grabbing, - kCursor_Custom -} ULCursor; - -typedef enum { - /// - /// Alpha channel only, 8-bits per pixel. - /// - /// Encoding: 8-bits per channel, unsigned normalized. - /// - /// Color-space: Linear (no gamma), alpha-coverage only. - /// - kBitmapFormat_A8_UNORM, - - /// - /// Blue Green Red Alpha channels, 32-bits per pixel. - /// - /// Encoding: 8-bits per channel, unsigned normalized. - /// - /// Color-space: sRGB gamma with premultiplied linear alpha channel. - /// - kBitmapFormat_BGRA8_UNORM_SRGB -} ULBitmapFormat; - -typedef enum { - /// - /// Key-Down event type. (Does not trigger accelerator commands in WebCore) - /// - /// @NOTE: You should probably use RawKeyDown instead when a physical key - /// is pressed. This member is only here for historic compatibility - /// with WebCore's key event types. - /// - kKeyEventType_KeyDown, - - /// - /// Key-Up event type. Use this when a physical key is released. - /// - kKeyEventType_KeyUp, - - /// - /// Raw Key-Down type. Use this when a physical key is pressed. - /// - /// @NOTE: You should use RawKeyDown for physical key presses since it - /// allows WebCore to do additional command translation. - /// - kKeyEventType_RawKeyDown, - - /// - /// Character input event type. Use this when the OS generates text from - /// a physical key being pressed (eg, WM_CHAR on Windows). - /// - kKeyEventType_Char, -} ULKeyEventType; - -typedef enum { - kMouseEventType_MouseMoved, - kMouseEventType_MouseDown, - kMouseEventType_MouseUp, -} ULMouseEventType; - -typedef enum { - kMouseButton_None = 0, - kMouseButton_Left, - kMouseButton_Middle, - kMouseButton_Right, -} ULMouseButton; - -typedef enum { - kScrollEventType_ScrollByPixel, - kScrollEventType_ScrollByPage, -} ULScrollEventType; - -typedef enum { - kFaceWinding_Clockwise, - kFaceWindow_CounterClockwise, -} ULFaceWinding; - -typedef enum { - /// - /// Lighter hinting algorithm-- glyphs are slightly fuzzier but better - /// resemble their original shape. This is achieved by snapping glyphs to the - /// pixel grid only vertically which better preserves inter-glyph spacing. - /// - kFontHinting_Smooth, - - /// - /// Default hinting algorithm-- offers a good balance between sharpness and - /// shape at smaller font sizes. - /// - kFontHinting_Normal, - - /// - /// Strongest hinting algorithm-- outputs only black/white glyphs. The result - /// is usually unpleasant if the underlying TTF does not contain hints for - /// this type of rendering. - /// - kFontHinting_Monochrome, -} ULFontHinting; - -typedef struct { - float left; - float top; - float right; - float bottom; -} ULRect; - -typedef struct { - int left; - int top; - int right; - int bottom; -} ULIntRect; - -typedef struct { - bool is_empty; - unsigned int width; - unsigned int height; - unsigned int texture_id; - unsigned int texture_width; - unsigned int texture_height; - ULBitmapFormat texture_format; - ULRect uv_coords; - unsigned int render_buffer_id; -} ULRenderTarget; - - -/****************************************************************************** - * API Note: - * - * You should only destroy objects that you explicitly create. Do not destroy - * any objects returned from the API or callbacks unless otherwise noted. - *****************************************************************************/ - -/****************************************************************************** - * Version - *****************************************************************************/ - -/// -/// Get the version string of the library in MAJOR.MINOR.PATCH format. -/// -ULExport const char* ulVersionString(); - -/// -/// Get the numeric major version of the library. -/// -ULExport unsigned int ulVersionMajor(); - -/// -/// Get the numeric minor version of the library. -/// -ULExport unsigned int ulVersionMinor(); - -/// -/// Get the numeric patch version of the library. -/// -ULExport unsigned int ulVersionPatch(); - -/****************************************************************************** - * Config - *****************************************************************************/ - -/// -/// Create config with default values (see ). -/// -ULExport ULConfig ulCreateConfig(); - -/// -/// Destroy config. -/// -ULExport void ulDestroyConfig(ULConfig config); - -/// -/// Set the file path to the directory that contains Ultralight's bundled -/// resources (eg, cacert.pem and other localized resources). -/// -ULExport void ulConfigSetResourcePath(ULConfig config, ULString resource_path); - -/// -/// Set the file path to a writable directory that will be used to store -/// cookies, cached resources, and other persistent data. -/// -ULExport void ulConfigSetCachePath(ULConfig config, ULString cache_path); - -/// -/// When enabled, each View will be rendered to an offscreen GPU texture -/// using the GPU driver set in ulPlatformSetGPUDriver. You can fetch -/// details for the texture via ulViewGetRenderTarget. -/// -/// When disabled (the default), each View will be rendered to an offscreen -/// pixel buffer. This pixel buffer can optionally be provided by the user-- -/// for more info see ulViewGetSurface. -/// -ULExport void ulConfigSetUseGPURenderer(ULConfig config, bool use_gpu); - -/// -/// Set the amount that the application DPI has been scaled, used for -/// scaling device coordinates to pixels and oversampling raster shapes -/// (Default = 1.0). -/// -ULExport void ulConfigSetDeviceScale(ULConfig config, double value); - -/// -/// The winding order for front-facing triangles. @see FaceWinding -/// -/// Note: This is only used with custom GPUDrivers -/// -ULExport void ulConfigSetFaceWinding(ULConfig config, ULFaceWinding winding); - -/// -/// Set whether images should be enabled (Default = True). -/// -ULExport void ulConfigSetEnableImages(ULConfig config, bool enabled); - -/// -/// Set whether JavaScript should be eanbled (Default = True). -/// -ULExport void ulConfigSetEnableJavaScript(ULConfig config, bool enabled); - -/// -/// The hinting algorithm to use when rendering fonts. (Default = kFontHinting_Normal) -/// @see ULFontHinting -/// -ULExport void ulConfigSetFontHinting(ULConfig config, ULFontHinting font_hinting); - -/// -/// The gamma to use when compositing font glyphs, change this value to -/// adjust contrast (Adobe and Apple prefer 1.8, others may prefer 2.2). -/// (Default = 1.8) -/// -ULExport void ulConfigSetFontGamma(ULConfig config, double font_gamma); - -/// -/// Set default font-family to use (Default = Times New Roman). -/// -ULExport void ulConfigSetFontFamilyStandard(ULConfig config, - ULString font_name); - -/// -/// Set default font-family to use for fixed fonts, eg

 and 
-/// (Default = Courier New).
-///
-ULExport void ulConfigSetFontFamilyFixed(ULConfig config, ULString font_name);
-
-///
-/// Set default font-family to use for serif fonts (Default = Times New Roman).
-///
-ULExport void ulConfigSetFontFamilySerif(ULConfig config, ULString font_name);
-
-///
-/// Set default font-family to use for sans-serif fonts (Default = Arial).
-///
-ULExport void ulConfigSetFontFamilySansSerif(ULConfig config,
-                                             ULString font_name);
-
-///
-/// Set user agent string (See  for the default).
-///
-ULExport void ulConfigSetUserAgent(ULConfig config, ULString agent_string);
-
-///
-/// Set user stylesheet (CSS) (Default = Empty).
-///
-ULExport void ulConfigSetUserStylesheet(ULConfig config, ULString css_string);
-
-///
-/// Set whether or not we should continuously repaint any Views or compositor
-/// layers, regardless if they are dirty or not. This is mainly used to
-/// diagnose painting/shader issues. (Default = False)
-///
-ULExport void ulConfigSetForceRepaint(ULConfig config, bool enabled);
-
-///
-/// Set the amount of time to wait before triggering another repaint when a
-/// CSS animation is active. (Default = 1.0 / 60.0)
-///
-ULExport void ulConfigSetAnimationTimerDelay(ULConfig config, double delay);
-
-///
-/// When a smooth scroll animation is active, the amount of time (in seconds)
-/// to wait before triggering another repaint. Default is 60 Hz.
-///
-ULExport void ulConfigSetScrollTimerDelay(ULConfig config, double delay);
-
-///
-/// The amount of time (in seconds) to wait before running the recycler (will
-/// attempt to return excess memory back to the system). (Default = 4.0)
-///
-ULExport void ulConfigSetRecycleDelay(ULConfig config, double delay);
-
-///
-/// Set the size of WebCore's memory cache for decoded images, scripts, and
-/// other assets in bytes. (Default = 64 * 1024 * 1024)
-///
-ULExport void ulConfigSetMemoryCacheSize(ULConfig config, unsigned int size);
-
-///
-/// Set the number of pages to keep in the cache. (Default = 0)
-///
-ULExport void ulConfigSetPageCacheSize(ULConfig config, unsigned int size);
-
-///
-/// JavaScriptCore tries to detect the system's physical RAM size to set
-/// reasonable allocation limits. Set this to anything other than 0 to
-/// override the detected value. Size is in bytes.
-///
-/// This can be used to force JavaScriptCore to be more conservative with
-/// its allocation strategy (at the cost of some performance).
-///
-ULExport void ulConfigSetOverrideRAMSize(ULConfig config, unsigned int size);
-
-///
-/// The minimum size of large VM heaps in JavaScriptCore. Set this to a
-/// lower value to make these heaps start with a smaller initial value.
-///
-ULExport void ulConfigSetMinLargeHeapSize(ULConfig config, unsigned int size);
-
-///
-/// The minimum size of small VM heaps in JavaScriptCore. Set this to a
-/// lower value to make these heaps start with a smaller initial value.
-///
-ULExport void ulConfigSetMinSmallHeapSize(ULConfig config, unsigned int size);
-
-/******************************************************************************
- * Renderer
- *****************************************************************************/
-
-///
-/// Create the Ultralight Renderer directly.
-///
-/// Unlike ulCreateApp(), this does not use any native windows for drawing
-/// and allows you to manage your own runloop and painting. This method is
-/// recommended for those wishing to integrate the library into a game.
-///
-/// This singleton manages the lifetime of all Views and coordinates all
-/// painting, rendering, network requests, and event dispatch.
-///
-/// You should only call this once per process lifetime.
-///
-/// You shoud set up your platform handlers (eg, ulPlatformSetLogger,
-/// ulPlatformSetFileSystem, etc.) before calling this.
-///
-/// You will also need to define a font loader before calling this-- 
-/// as of this writing (v1.2) the only way to do this in C API is by calling
-/// ulEnablePlatformFontLoader() (available in ).
-///
-/// @NOTE:  You should not call this if you are using ulCreateApp(), it
-///         creates its own renderer and provides default implementations for
-///         various platform handlers automatically.
-///
-ULExport ULRenderer ulCreateRenderer(ULConfig config);
-
-///
-/// Destroy the renderer.
-///
-ULExport void ulDestroyRenderer(ULRenderer renderer);
-
-///
-/// Update timers and dispatch internal callbacks (JavaScript and network).
-///
-ULExport void ulUpdate(ULRenderer renderer);
-
-///
-/// Render all active Views.
-///
-ULExport void ulRender(ULRenderer renderer);
-
-///
-/// Attempt to release as much memory as possible. Don't call this from any
-/// callbacks or driver code.
-///
-ULExport void ulPurgeMemory(ULRenderer renderer);
-
-///
-/// Print detailed memory usage statistics to the log.
-/// (@see ulPlatformSetLogger)
-///
-ULExport void ulLogMemoryUsage(ULRenderer renderer);
-
-/******************************************************************************
- * Session
- *****************************************************************************/
-
-///
-/// Create a Session to store local data in (such as cookies, local storage,
-/// application cache, indexed db, etc).
-///
-ULExport ULSession ulCreateSession(ULRenderer renderer, bool is_persistent,
-                                   ULString name);
-
-///
-/// Destroy a Session.
-///
-ULExport void ulDestroySession(ULSession session);
-
-///
-/// Get the default session (persistent session named "default").
-///
-/// @note  This session is owned by the Renderer, you shouldn't destroy it.
-///
-ULExport ULSession ulDefaultSession(ULRenderer renderer);
-
-///
-/// Whether or not is persistent (backed to disk).
-///
-ULExport bool ulSessionIsPersistent(ULSession session);
-
-///
-/// Unique name identifying the session (used for unique disk path).
-///
-ULExport ULString ulSessionGetName(ULSession session);
-
-///
-/// Unique numeric Id for the session.
-///
-ULExport unsigned long long ulSessionGetId(ULSession session);
-
-///
-/// The disk path to write to (used by persistent sessions only).
-///
-ULExport ULString ulSessionGetDiskPath(ULSession session);
-
-/******************************************************************************
- * View
- *****************************************************************************/
-
-///
-/// Create a View with certain size (in pixels).
-///
-/// @note  You can pass null to 'session' to use the default session.
-///
-ULExport ULView ulCreateView(ULRenderer renderer, unsigned int width,
-                             unsigned int height, bool transparent,
-                             ULSession session, bool force_cpu_renderer);
-
-///
-/// Destroy a View.
-///
-ULExport void ulDestroyView(ULView view);
-
-///
-/// Get current URL.
-///
-/// @note Don't destroy the returned string, it is owned by the View.
-///
-ULExport ULString ulViewGetURL(ULView view);
-
-///
-/// Get current title.
-///
-/// @note Don't destroy the returned string, it is owned by the View.
-///
-ULExport ULString ulViewGetTitle(ULView view);
-
-///
-/// Get the width, in pixels.
-///
-ULExport unsigned int ulViewGetWidth(ULView view);
-
-///
-/// Get the height, in pixels.
-///
-ULExport unsigned int ulViewGetHeight(ULView view);
-
-///
-/// Check if main frame is loading.
-///
-ULExport bool ulViewIsLoading(ULView view);
-
-///
-/// Get the RenderTarget for the View.
-///
-/// @note  Only valid when the GPU renderer is enabled in Config.
-///
-ULExport ULRenderTarget ulViewGetRenderTarget(ULView view);
-
-///
-/// Get the Surface for the View (native pixel buffer container).
-///
-/// @note  Only valid when the GPU renderer is disabled in Config.
-///
-///        (Will return a nullptr when the GPU renderer is enabled.)
-///
-///        The default Surface is BitmapSurface but you can provide your
-///        own Surface implementation via ulPlatformSetSurfaceDefinition.
-///
-///        When using the default Surface, you can retrieve the underlying
-///        bitmap by casting ULSurface to ULBitmapSurface and calling
-///        ulBitmapSurfaceGetBitmap().
-///
-ULExport ULSurface ulViewGetSurface(ULView view);
-
-///
-/// Load a raw string of HTML.
-///
-ULExport void ulViewLoadHTML(ULView view, ULString html_string);
-
-///
-/// Load a URL into main frame.
-///
-ULExport void ulViewLoadURL(ULView view, ULString url_string);
-
-///
-/// Resize view to a certain width and height (in pixels).
-///
-ULExport void ulViewResize(ULView view, unsigned int width,
-                           unsigned int height);
-
-///
-/// Acquire the page's JSContext for use with JavaScriptCore API.
-/// 
-/// @note  This call locks the context for the current thread. You should
-///        call ulViewUnlockJSContext() after using the context so other
-///        worker threads can modify JavaScript state.
-///
-/// @note  The lock is recusive, it's okay to call this multiple times as long
-///        as you call ulViewUnlockJSContext() the same number of times.
-///
-ULExport JSContextRef ulViewLockJSContext(ULView view);
-
-///
-/// Unlock the page's JSContext after a previous call to ulViewLockJSContext().
-///
-ULExport void ulViewUnlockJSContext(ULView view);
-
-///
-/// Evaluate a string of JavaScript and return result.
-///
-/// @param  js_string  The string of JavaScript to evaluate.
-///
-/// @param  exception  The address of a ULString to store a description of the
-///                    last exception. Pass NULL to ignore this. Don't destroy
-///                    the exception string returned, it's owned by the View.
-///
-/// @note Don't destroy the returned string, it's owned by the View. This value
-///       is reset with every call-- if you want to retain it you should copy
-///       the result to a new string via ulCreateStringFromCopy().
-///
-/// @note An example of using this API:
-///       
-///         ULString script = ulCreateString("1 + 1");
-///         ULString exception;
-///         ULString result = ulViewEvaluateScript(view, script, &exception);
-///         /* Use the result ("2") and exception description (if any) here. */
-///         ulDestroyString(script);
-///       
-/// -ULExport ULString ulViewEvaluateScript(ULView view, ULString js_string, ULString* exception); - -/// -/// Check if can navigate backwards in history. -/// -ULExport bool ulViewCanGoBack(ULView view); - -/// -/// Check if can navigate forwards in history. -/// -ULExport bool ulViewCanGoForward(ULView view); - -/// -/// Navigate backwards in history. -/// -ULExport void ulViewGoBack(ULView view); - -/// -/// Navigate forwards in history. -/// -ULExport void ulViewGoForward(ULView view); - -/// -/// Navigate to arbitrary offset in history. -/// -ULExport void ulViewGoToHistoryOffset(ULView view, int offset); - -/// -/// Reload current page. -/// -ULExport void ulViewReload(ULView view); - -/// -/// Stop all page loads. -/// -ULExport void ulViewStop(ULView view); - -/// -/// Give focus to the View. -/// -/// You should call this to give visual indication that the View has input -/// focus (changes active text selection colors, for example). -/// -ULExport void ulViewFocus(ULView view); - -/// -/// Remove focus from the View and unfocus any focused input elements. -/// -/// You should call this to give visual indication that the View has lost -/// input focus. -/// -ULExport void ulViewUnfocus(ULView view); - -/// -/// Whether or not the View has focus. -/// -ULExport bool ulViewHasFocus(ULView view); - -/// -/// Whether or not the View has an input element with visible keyboard focus -/// (indicated by a blinking caret). -/// -/// You can use this to decide whether or not the View should consume -/// keyboard input events (useful in games with mixed UI and key handling). -/// -ULExport bool ulViewHasInputFocus(ULView view); - -/// -/// Fire a keyboard event. -/// -ULExport void ulViewFireKeyEvent(ULView view, ULKeyEvent key_event); - -/// -/// Fire a mouse event. -/// -ULExport void ulViewFireMouseEvent(ULView view, ULMouseEvent mouse_event); - -/// -/// Fire a scroll event. -/// -ULExport void ulViewFireScrollEvent(ULView view, ULScrollEvent scroll_event); - -typedef void -(*ULChangeTitleCallback) (void* user_data, ULView caller, ULString title); - -/// -/// Set callback for when the page title changes. -/// -ULExport void ulViewSetChangeTitleCallback(ULView view, - ULChangeTitleCallback callback, - void* user_data); - -typedef void -(*ULChangeURLCallback) (void* user_data, ULView caller, ULString url); - -/// -/// Set callback for when the page URL changes. -/// -ULExport void ulViewSetChangeURLCallback(ULView view, - ULChangeURLCallback callback, - void* user_data); - -typedef void -(*ULChangeTooltipCallback) (void* user_data, ULView caller, ULString tooltip); - -/// -/// Set callback for when the tooltip changes (usually result of a mouse hover). -/// -ULExport void ulViewSetChangeTooltipCallback(ULView view, - ULChangeTooltipCallback callback, - void* user_data); - -typedef void -(*ULChangeCursorCallback) (void* user_data, ULView caller, ULCursor cursor); - -/// -/// Set callback for when the mouse cursor changes. -/// -ULExport void ulViewSetChangeCursorCallback(ULView view, - ULChangeCursorCallback callback, - void* user_data); - -typedef void -(*ULAddConsoleMessageCallback) (void* user_data, ULView caller, - ULMessageSource source, ULMessageLevel level, - ULString message, unsigned int line_number, - unsigned int column_number, - ULString source_id); - -/// -/// Set callback for when a message is added to the console (useful for -/// JavaScript / network errors and debugging). -/// -ULExport void ulViewSetAddConsoleMessageCallback(ULView view, - ULAddConsoleMessageCallback callback, - void* user_data); - -typedef ULView -(*ULCreateChildViewCallback) (void* user_data, ULView caller, - ULString opener_url, ULString target_url, bool is_popup, - ULIntRect popup_rect); - -/// -/// Set callback for when the page wants to create a new View. -/// -/// This is usually the result of a user clicking a link with target="_blank" -/// or by JavaScript calling window.open(url). -/// -/// To allow creation of these new Views, you should create a new View in -/// this callback, resize it to your container, -/// and return it. You are responsible for displaying the returned View. -/// -/// You should return NULL if you want to block the action. -/// -ULExport void ulViewSetCreateChildViewCallback(ULView view, - ULCreateChildViewCallback callback, - void* user_data); - -typedef void -(*ULBeginLoadingCallback) (void* user_data, ULView caller, - unsigned long long frame_id, bool is_main_frame, ULString url); - -/// -/// Set callback for when the page begins loading a new URL into a frame. -/// -ULExport void ulViewSetBeginLoadingCallback(ULView view, - ULBeginLoadingCallback callback, - void* user_data); - -typedef void -(*ULFinishLoadingCallback) (void* user_data, ULView caller, - unsigned long long frame_id, bool is_main_frame, ULString url); - -/// -/// Set callback for when the page finishes loading a URL into a frame. -/// -ULExport void ulViewSetFinishLoadingCallback(ULView view, - ULFinishLoadingCallback callback, - void* user_data); - -typedef void -(*ULFailLoadingCallback) (void* user_data, ULView caller, - unsigned long long frame_id, bool is_main_frame, ULString url, - ULString description, ULString error_domain, int error_code); - -/// -/// Set callback for when an error occurs while loading a URL into a frame. -/// -ULExport void ulViewSetFailLoadingCallback(ULView view, - ULFailLoadingCallback callback, - void* user_data); - -typedef void -(*ULWindowObjectReadyCallback) (void* user_data, ULView caller, - unsigned long long frame_id, bool is_main_frame, ULString url); - -/// -/// Set callback for when the JavaScript window object is reset for a new -/// page load. -/// -/// This is called before any scripts are executed on the page and is the -/// earliest time to setup any initial JavaScript state or bindings. -/// -/// The document is not guaranteed to be loaded/parsed at this point. If -/// you need to make any JavaScript calls that are dependent on DOM elements -/// or scripts on the page, use DOMReady instead. -/// -/// The window object is lazily initialized (this will not be called on pages -/// with no scripts). -/// -ULExport void ulViewSetWindowObjectReadyCallback(ULView view, - ULWindowObjectReadyCallback callback, - void* user_data); - -typedef void -(*ULDOMReadyCallback) (void* user_data, ULView caller, - unsigned long long frame_id, bool is_main_frame, ULString url); - -/// -/// Set callback for when all JavaScript has been parsed and the document is -/// ready. -/// -/// This is the best time to make any JavaScript calls that are dependent on -/// DOM elements or scripts on the page. -/// -ULExport void ulViewSetDOMReadyCallback(ULView view, - ULDOMReadyCallback callback, - void* user_data); - -typedef void -(*ULUpdateHistoryCallback) (void* user_data, ULView caller); - -/// -/// Set callback for when the history (back/forward state) is modified. -/// -ULExport void ulViewSetUpdateHistoryCallback(ULView view, - ULUpdateHistoryCallback callback, - void* user_data); - -/// -/// Set whether or not a view should be repainted during the next call to -/// ulRender. -/// -/// @note This flag is automatically set whenever the page content changes -/// but you can set it directly in case you need to force a repaint. -/// -ULExport void ulViewSetNeedsPaint(ULView view, bool needs_paint); - -/// -/// Whether or not a view should be painted during the next call to ulRender. -/// -ULExport bool ulViewGetNeedsPaint(ULView view); - -/// -/// Create an inspector for this View, this is useful for debugging and -/// inspecting pages locally. This will only succeed if you have the -/// inspector assets in your filesystem-- the inspector will look for -/// file:///inspector/Main.html when it loads. -/// -/// @note The initial dimensions of the returned View are 10x10, you should -/// call ulViewResize on the returned View to resize it to your desired -/// dimensions. -/// -/// @note You will need to call ulDestroyView on the returned instance -/// when you're done using it. -/// -ULExport ULView ulViewCreateInspectorView(ULView view); - -/****************************************************************************** - * String - *****************************************************************************/ - -/// -/// Create string from null-terminated ASCII C-string. -/// -ULExport ULString ulCreateString(const char* str); - -/// -/// Create string from UTF-8 buffer. -/// -ULExport ULString ulCreateStringUTF8(const char* str, size_t len); - -/// -/// Create string from UTF-16 buffer. -/// -ULExport ULString ulCreateStringUTF16(ULChar16* str, size_t len); - -/// -/// Create string from copy of existing string. -/// -ULExport ULString ulCreateStringFromCopy(ULString str); - -/// -/// Destroy string (you should destroy any strings you explicitly Create). -/// -ULExport void ulDestroyString(ULString str); - -/// -/// Get internal UTF-16 buffer data. -/// -ULExport ULChar16* ulStringGetData(ULString str); - -/// -/// Get length in UTF-16 characters. -/// -ULExport size_t ulStringGetLength(ULString str); - -/// -/// Whether this string is empty or not. -/// -ULExport bool ulStringIsEmpty(ULString str); - -/// -/// Replaces the contents of 'str' with the contents of 'new_str' -/// -ULExport void ulStringAssignString(ULString str, ULString new_str); - -/// -/// Replaces the contents of 'str' with the contents of a C-string. -/// -ULExport void ulStringAssignCString(ULString str, const char* c_str); - -/****************************************************************************** - * Bitmap - *****************************************************************************/ - -/// -/// Create empty bitmap. -/// -ULExport ULBitmap ulCreateEmptyBitmap(); - -/// -/// Create bitmap with certain dimensions and pixel format. -/// -ULExport ULBitmap ulCreateBitmap(unsigned int width, unsigned int height, - ULBitmapFormat format); - -/// -/// Create bitmap from existing pixel buffer. @see Bitmap for help using -/// this function. -/// -ULExport ULBitmap ulCreateBitmapFromPixels(unsigned int width, - unsigned int height, - ULBitmapFormat format, - unsigned int row_bytes, - const void* pixels, size_t size, - bool should_copy); - -/// -/// Create bitmap from copy. -/// -ULExport ULBitmap ulCreateBitmapFromCopy(ULBitmap existing_bitmap); - -/// -/// Destroy a bitmap (you should only destroy Bitmaps you have explicitly -/// created via one of the creation functions above. -/// -ULExport void ulDestroyBitmap(ULBitmap bitmap); - -/// -/// Get the width in pixels. -/// -ULExport unsigned int ulBitmapGetWidth(ULBitmap bitmap); - -/// -/// Get the height in pixels. -/// -ULExport unsigned int ulBitmapGetHeight(ULBitmap bitmap); - -/// -/// Get the pixel format. -/// -ULExport ULBitmapFormat ulBitmapGetFormat(ULBitmap bitmap); - -/// -/// Get the bytes per pixel. -/// -ULExport unsigned int ulBitmapGetBpp(ULBitmap bitmap); - -/// -/// Get the number of bytes per row. -/// -ULExport unsigned int ulBitmapGetRowBytes(ULBitmap bitmap); - -/// -/// Get the size in bytes of the underlying pixel buffer. -/// -ULExport size_t ulBitmapGetSize(ULBitmap bitmap); - -/// -/// Whether or not this bitmap owns its own pixel buffer. -/// -ULExport bool ulBitmapOwnsPixels(ULBitmap bitmap); - -/// -/// Lock pixels for reading/writing, returns pointer to pixel buffer. -/// -ULExport void* ulBitmapLockPixels(ULBitmap bitmap); - -/// -/// Unlock pixels after locking. -/// -ULExport void ulBitmapUnlockPixels(ULBitmap bitmap); - -/// -/// Get raw pixel buffer-- you should only call this if Bitmap is already -/// locked. -/// -ULExport void* ulBitmapRawPixels(ULBitmap bitmap); - -/// -/// Whether or not this bitmap is empty. -/// -ULExport bool ulBitmapIsEmpty(ULBitmap bitmap); - -/// -/// Reset bitmap pixels to 0. -/// -ULExport void ulBitmapErase(ULBitmap bitmap); - -/// -/// Write bitmap to a PNG on disk. -/// -ULExport bool ulBitmapWritePNG(ULBitmap bitmap, const char* path); - -/// -/// This converts a BGRA bitmap to RGBA bitmap and vice-versa by swapping -/// the red and blue channels. -/// -ULExport void ulBitmapSwapRedBlueChannels(ULBitmap bitmap); - -/****************************************************************************** -* Key Event -******************************************************************************/ - -/// -/// Create a key event, @see KeyEvent for help with the following parameters. -/// -ULExport ULKeyEvent ulCreateKeyEvent(ULKeyEventType type, - unsigned int modifiers, - int virtual_key_code, int native_key_code, - ULString text, ULString unmodified_text, - bool is_keypad, bool is_auto_repeat, - bool is_system_key); - -#ifdef _WIN32 -/// -/// Create a key event from native Windows event. -/// -ULExport ULKeyEvent ulCreateKeyEventWindows(ULKeyEventType type, - uintptr_t wparam, intptr_t lparam, - bool is_system_key); -#endif - -#ifdef __OBJC__ -/// -/// Create a key event from native macOS event. -/// -ULExport ULKeyEvent ulCreateKeyEventMacOS(NSEvent* evt); -#endif - -/// -/// Destroy a key event. -/// -ULExport void ulDestroyKeyEvent(ULKeyEvent evt); - -/****************************************************************************** - * Mouse Event - *****************************************************************************/ - -/// -/// Create a mouse event, @see MouseEvent for help using this function. -/// -ULExport ULMouseEvent ulCreateMouseEvent(ULMouseEventType type, int x, int y, - ULMouseButton button); - -/// -/// Destroy a mouse event. -/// -ULExport void ulDestroyMouseEvent(ULMouseEvent evt); - -/****************************************************************************** - * Scroll Event - *****************************************************************************/ - -/// -/// Create a scroll event, @see ScrollEvent for help using this function. -/// -ULExport ULScrollEvent ulCreateScrollEvent(ULScrollEventType type, int delta_x, - int delta_y); - -/// -/// Destroy a scroll event. -/// -ULExport void ulDestroyScrollEvent(ULScrollEvent evt); - -/****************************************************************************** - * Rect - *****************************************************************************/ - -/// -/// Whether or not a ULRect is empty (all members equal to 0) -/// -ULExport bool ulRectIsEmpty(ULRect rect); - -/// -/// Create an empty ULRect (all members equal to 0) -/// -ULExport ULRect ulRectMakeEmpty(); - -/****************************************************************************** - * IntRect - *****************************************************************************/ - - /// - /// Whether or not a ULIntRect is empty (all members equal to 0) - /// -ULExport bool ulIntRectIsEmpty(ULIntRect rect); - -/// -/// Create an empty ULIntRect (all members equal to 0) -/// -ULExport ULIntRect ulIntRectMakeEmpty(); - -/****************************************************************************** - * Surface - *****************************************************************************/ - -/// -/// Width (in pixels). -/// -ULExport unsigned int ulSurfaceGetWidth(ULSurface surface); - -/// -/// Height (in pixels). -/// -ULExport unsigned int ulSurfaceGetHeight(ULSurface surface); - -/// -/// Number of bytes between rows (usually width * 4) -/// -ULExport unsigned int ulSurfaceGetRowBytes(ULSurface surface); - -/// -/// Size in bytes. -/// -ULExport size_t ulSurfaceGetSize(ULSurface surface); - -/// -/// Lock the pixel buffer and get a pointer to the beginning of the data -/// for reading/writing. -/// -/// Native pixel format is premultiplied BGRA 32-bit (8 bits per channel). -/// -ULExport void* ulSurfaceLockPixels(ULSurface surface); - -/// -/// Unlock the pixel buffer. -/// -ULExport void ulSurfaceUnlockPixels(ULSurface surface); - -/// -/// Resize the pixel buffer to a certain width and height (both in pixels). -/// -/// This should never be called while pixels are locked. -/// -ULExport void ulSurfaceResize(ULSurface surface, unsigned int width, unsigned int height); - -/// -/// Set the dirty bounds to a certain value. -/// -/// This is called after the Renderer paints to an area of the pixel buffer. -/// (The new value will be joined with the existing dirty_bounds()) -/// -ULExport void ulSurfaceSetDirtyBounds(ULSurface surface, ULIntRect bounds); - -/// -/// Get the dirty bounds. -/// -/// This value can be used to determine which portion of the pixel buffer has -/// been updated since the last call to ulSurfaceClearDirtyBounds(). -/// -/// The general algorithm to determine if a Surface needs display is: -///
-///   if (!ulIntRectIsEmpty(ulSurfaceGetDirtyBounds(surface))) {
-///       // Surface pixels are dirty and needs display.
-///       // Cast Surface to native Surface and use it here (pseudo code)
-///       DisplaySurface(surface);
-///
-///       // Once you're done, clear the dirty bounds:
-///       ulSurfaceClearDirtyBounds(surface);
-///  }
-///  
-/// -ULExport ULIntRect ulSurfaceGetDirtyBounds(ULSurface surface); - -/// -/// Clear the dirty bounds. -/// -/// You should call this after you're done displaying the Surface. -/// -ULExport void ulSurfaceClearDirtyBounds(ULSurface surface); - -/// -/// Get the underlying user data pointer (this is only valid if you have -/// set a custom surface implementation via ulPlatformSetSurfaceDefinition). -/// -/// This will return nullptr if this surface is the default ULBitmapSurface. -/// -ULExport void* ulSurfaceGetUserData(ULSurface surface); - -/****************************************************************************** - * BitmapSurface - *****************************************************************************/ - -/// -/// Get the underlying Bitmap from the default Surface. -/// -/// @note Do not call ulDestroyBitmap() on the returned value, it is owned -/// by the surface. -/// -ULExport ULBitmap ulBitmapSurfaceGetBitmap(ULBitmapSurface surface); - -/****************************************************************************** - * Surface Definition - *****************************************************************************/ - -/// -/// The callback invoked when a Surface is created. -/// -/// @param width The width in pixels. -/// @param height The height in pixels. -/// -/// @return This callback should return a pointer to user-defined data for the -/// instance. This user data pointer will be passed to all other -/// callbacks when operating on the instance. -/// -typedef void* -(*ULSurfaceDefinitionCreateCallback) (unsigned int width, unsigned int height); - -/// -/// The callback invoked when a Surface is destroyed. -/// -/// @param user_data User data pointer uniquely identifying the surface. -/// -typedef void -(*ULSurfaceDefinitionDestroyCallback) (void* user_data); - -/// -/// The callback invoked when a Surface's width (in pixels) is requested. -/// -/// @param user_data User data pointer uniquely identifying the surface. -/// -typedef unsigned int -(*ULSurfaceDefinitionGetWidthCallback) (void* user_data); - -/// -/// The callback invoked when a Surface's height (in pixels) is requested. -/// -/// @param user_data User data pointer uniquely identifying the surface. -/// -typedef unsigned int -(*ULSurfaceDefinitionGetHeightCallback) (void* user_data); - -/// -/// The callback invoked when a Surface's row bytes is requested. -/// -/// @note This value is also known as "stride". Usually width * 4. -/// -/// @param user_data User data pointer uniquely identifying the surface. -/// -typedef unsigned int -(*ULSurfaceDefinitionGetRowBytesCallback) (void* user_data); - -/// -/// The callback invoked when a Surface's size (in bytes) is requested. -/// -/// @param user_data User data pointer uniquely identifying the surface. -/// -typedef size_t -(*ULSurfaceDefinitionGetSizeCallback) (void* user_data); - -/// -/// The callback invoked when a Surface's pixel buffer is requested to be -/// locked for reading/writing (should return a pointer to locked bytes). -/// -/// @param user_data User data pointer uniquely identifying the surface. -/// -typedef void* -(*ULSurfaceDefinitionLockPixelsCallback) (void* user_data); - -/// -/// The callback invoked when a Surface's pixel buffer is requested to be -/// unlocked after previously being locked. -/// -/// @param user_data User data pointer uniquely identifying the surface. -/// -typedef void -(*ULSurfaceDefinitionUnlockPixelsCallback) (void* user_data); - -/// -/// The callback invoked when a Surface is requested to be resized to a -/// certain width/height. -/// -/// @param user_data User data pointer uniquely identifying the surface. -/// @param width Width in pixels. -/// @param height Height in pixels. -/// -typedef void -(*ULSurfaceDefinitionResizeCallback) (void* user_data, unsigned int width, unsigned int height); - -typedef struct { - ULSurfaceDefinitionCreateCallback create; - ULSurfaceDefinitionDestroyCallback destroy; - ULSurfaceDefinitionGetWidthCallback get_width; - ULSurfaceDefinitionGetHeightCallback get_height; - ULSurfaceDefinitionGetRowBytesCallback get_row_bytes; - ULSurfaceDefinitionGetSizeCallback get_size; - ULSurfaceDefinitionLockPixelsCallback lock_pixels; - ULSurfaceDefinitionUnlockPixelsCallback unlock_pixels; - ULSurfaceDefinitionResizeCallback resize; -} ULSurfaceDefinition; - -/****************************************************************************** - * File System - *****************************************************************************/ - -/// -/// File Handle type used as unique ID for opened files. -/// -#if defined(__WIN32__) || defined(_WIN32) -typedef size_t ULFileHandle; -#else -typedef int ULFileHandle; -#endif - -/// -/// Handle used to denote an invalid file. -/// -const ULFileHandle ULInvalidFileHandle = (ULFileHandle)-1; - -/// -/// The callback invoked when the FileSystem wants to check if a file path -/// exists, return true if it exists. -/// -typedef bool -(*ULFileSystemFileExistsCallback) (ULString path); - -/// -/// The callback invoked when the FileSystem wants to get the file size of a -/// previously opened file, store result in 'result'. Return true on success. -/// -typedef bool -(*ULFileSystemGetFileSizeCallback) (ULFileHandle handle, long long* result); - -/// -/// The callback invoked when the FileSystem wants to get the mime type of a -/// file (eg "text/html"), store result in 'result'. Return true on success. -/// -typedef bool -(*ULFileSystemGetFileMimeTypeCallback) (ULString path, ULString result); - -/// -/// The callback invoked when the FileSystem wants to open a file path for -/// reading or writing. Return file handle on success, or ULInvalidFileHandle -/// on failure. -/// -/// @NOTE: As of this writing (v1.2), this function is only used for reading. -/// -typedef ULFileHandle -(*ULFileSystemOpenFileCallback) (ULString path, bool open_for_writing); - -/// -/// The callback invoked when the FileSystem wants to close a previously-opened -/// file. -/// -typedef void -(*ULFileSystemCloseFileCallback) (ULFileHandle handle); - -/// -/// The callback invoked when the FileSystem wants to read from a -/// currently-opened file, return number of bytes read or -1 on failure. -/// -typedef long long -(*ULFileSystemReadFromFileCallback) (ULFileHandle handle, char* data, long long length); - -typedef struct { - ULFileSystemFileExistsCallback file_exists; - ULFileSystemGetFileSizeCallback get_file_size; - ULFileSystemGetFileMimeTypeCallback get_file_mime_type; - ULFileSystemOpenFileCallback open_file; - ULFileSystemCloseFileCallback close_file; - ULFileSystemReadFromFileCallback read_from_file; -} ULFileSystem; - -/****************************************************************************** - * Logger - *****************************************************************************/ - -typedef enum { - kLogLevel_Error = 0, - kLogLevel_Warning, - kLogLevel_Info -} ULLogLevel; - -/// -/// The callback invoked when the library wants to print a message to the log. -/// -typedef void -(*ULLoggerLogMessageCallback) (ULLogLevel log_level, ULString message); - -typedef struct { - ULLoggerLogMessageCallback log_message; -} ULLogger; - - -/****************************************************************************** - * GPUDriver - *****************************************************************************/ - -/// -/// Render buffer description. -/// -typedef struct { - unsigned int texture_id; // The backing texture for this RenderBuffer - unsigned int width; // The width of the RenderBuffer texture - unsigned int height; // The height of the RenderBuffer texture - bool has_stencil_buffer; // Currently unused, always false. - bool has_depth_buffer; // Currently unsued, always false. -} ULRenderBuffer; - -/// -/// @note This pragma pack(push, 1) command is important! Vertex layouts -/// should not be padded with any bytes. -/// -#pragma pack(push, 1) - -/// -/// Vertex layout for path vertices. -/// -/// (this struct's members aligned on single-byte boundaries) -/// -typedef struct { - float pos[2]; - unsigned char color[4]; - float obj[2]; -} ULVertex_2f_4ub_2f; - -/// -/// Vertex layout for quad vertices. -/// -/// (this struct's members aligned on single-byte boundaries) -/// -typedef struct { - float pos[2]; - unsigned char color[4]; - float tex[2]; - float obj[2]; - float data0[4]; - float data1[4]; - float data2[4]; - float data3[4]; - float data4[4]; - float data5[4]; - float data6[4]; -} ULVertex_2f_4ub_2f_2f_28f; - -/// -/// End single-byte alignment. -/// -#pragma pack(pop) - -/// -/// Vertex formats. -/// -typedef enum { - kVertexBufferFormat_2f_4ub_2f, - kVertexBufferFormat_2f_4ub_2f_2f_28f, -} ULVertexBufferFormat; - -/// -/// Vertex buffer data. -/// -typedef struct { - ULVertexBufferFormat format; - unsigned int size; - unsigned char* data; -} ULVertexBuffer; - -/// -/// Vertex index type. -/// -typedef unsigned int ULIndexType; - -/// -/// Vertex index buffer data. -/// -typedef struct { - unsigned int size; - unsigned char* data; -} ULIndexBuffer; - -/// -/// Shader types, used with ULGPUState::shader_type -/// -/// Each of these correspond to a vertex/pixel shader pair. You can find -/// stock shader code for these in the `shaders` folder of the AppCore repo. -/// -typedef enum { - kShaderType_Fill, // Shader program for quad geometry - kShaderType_FillPath, // Shader program for path geometry -} ULShaderType; - -/// -/// Raw 4x4 matrix as an array of floats -/// -typedef struct { - float data[16]; -} ULMatrix4x4; - -/// -/// 4-component float vector -/// -typedef struct { - float value[4]; -} ULvec4; - -/// -/// GPU State description. -/// -typedef struct { - /// Viewport width in pixels - unsigned int viewport_width; - - /// Viewport height in pixels - unsigned int viewport_height; - - /// Transform matrix-- you should multiply this with the screen-space - /// orthographic projection matrix then pass to the vertex shader. - ULMatrix4x4 transform; - - /// Whether or not we should enable texturing for the current draw command. - bool enable_texturing; - - /// Whether or not we should enable blending for the current draw command. - /// If blending is disabled, any drawn pixels should overwrite existing. - /// Mainly used so we can modify alpha values of the RenderBuffer during - /// scissored clears. - bool enable_blend; - - /// The vertex/pixel shader program pair to use for the current draw command. - /// You should cast this to ShaderType to get the corresponding enum. - unsigned char shader_type; - - /// The render buffer to use for the current draw command. - unsigned int render_buffer_id; - - /// The texture id to bind to slot #1. (Will be 0 if none) - unsigned int texture_1_id; - - /// The texture id to bind to slot #2. (Will be 0 if none) - unsigned int texture_2_id; - - /// The texture id to bind to slot #3. (Will be 0 if none) - unsigned int texture_3_id; - - /// The following four members are passed to the pixel shader via uniforms. - float uniform_scalar[8]; - ULvec4 uniform_vector[8]; - unsigned char clip_size; - ULMatrix4x4 clip[8]; - - /// Whether or not scissor testing should be used for the current draw - /// command. - bool enable_scissor; - - /// The scissor rect to use for scissor testing (units in pixels) - ULIntRect scissor_rect; -} ULGPUState; - -/// -/// Command types, used with ULCommand::command_type -/// -typedef enum { - kCommandType_ClearRenderBuffer, - kCommandType_DrawGeometry, -} ULCommandType; - -/// -/// Command description. -/// -typedef struct { - unsigned char command_type; // The type of command to dispatch. - ULGPUState gpu_state; // GPU state parameters for current command. - - /// The following members are only used with kCommandType_DrawGeometry - unsigned int geometry_id; // The geometry ID to bind - unsigned int indices_count; // The number of indices - unsigned int indices_offset; // The index to start from -} ULCommand; - -/// -/// Command list, @see ULGPUDriverUpdateCommandList -typedef struct { - unsigned int size; - ULCommand* commands; -} ULCommandList; - -/// -/// The callback invoked when the GPUDriver will begin dispatching commands -/// (such as CreateTexture and UpdateCommandList) during the current call to -/// ulRender(). -/// -typedef void -(*ULGPUDriverBeginSynchronizeCallback) (); - -/// -/// The callback invoked when the GPUDriver has finished dispatching commands. -/// during the current call to ulRender(). -/// -typedef void -(*ULGPUDriverEndSynchronizeCallback) (); - -/// -/// The callback invoked when the GPUDriver wants to get the next available -/// texture ID. -/// -typedef unsigned int -(*ULGPUDriverNextTextureIdCallback) (); - -/// -/// The callback invoked when the GPUDriver wants to create a texture with a -/// certain ID and optional bitmap. -/// -/// **NOTE**: If the Bitmap is empty (ulBitmapIsEmpty), then a RTT Texture -/// should be created instead. This will be used as a backing -/// texture for a new RenderBuffer. -/// -typedef void -(*ULGPUDriverCreateTextureCallback) (unsigned int texture_id, - ULBitmap bitmap); - -/// -/// The callback invoked when the GPUDriver wants to update an existing non-RTT -/// texture with new bitmap data. -/// -typedef void -(*ULGPUDriverUpdateTextureCallback) (unsigned int texture_id, - ULBitmap bitmap); - -/// -/// The callback invoked when the GPUDriver wants to destroy a texture. -/// -typedef void -(*ULGPUDriverDestroyTextureCallback) (unsigned int texture_id); - -/// -/// The callback invoked when the GPUDriver wants to generate the next -/// available render buffer ID. -/// -typedef unsigned int -(*ULGPUDriverNextRenderBufferIdCallback) (); - -/// -/// The callback invoked when the GPUDriver wants to create a render buffer -/// with certain ID and buffer description. -/// -typedef void -(*ULGPUDriverCreateRenderBufferCallback) (unsigned int render_buffer_id, - ULRenderBuffer buffer); - -/// -/// The callback invoked when the GPUDriver wants to destroy a render buffer -/// -typedef void -(*ULGPUDriverDestroyRenderBufferCallback) (unsigned int render_buffer_id); - -/// -/// The callback invoked when the GPUDriver wants to generate the next -/// available geometry ID. -/// -typedef unsigned int -(*ULGPUDriverNextGeometryIdCallback) (); - -/// -/// The callback invoked when the GPUDriver wants to create geometry with -/// certain ID and vertex/index data. -/// -typedef void -(*ULGPUDriverCreateGeometryCallback) (unsigned int geometry_id, - ULVertexBuffer vertices, - ULIndexBuffer indices); - -/// -/// The callback invoked when the GPUDriver wants to update existing geometry -/// with new vertex/index data. -/// -typedef void -(*ULGPUDriverUpdateGeometryCallback) (unsigned int geometry_id, - ULVertexBuffer vertices, - ULIndexBuffer indices); - -/// -/// The callback invoked when the GPUDriver wants to destroy geometry. -/// -typedef void -(*ULGPUDriverDestroyGeometryCallback) (unsigned int geometry_id); - -/// -/// The callback invoked when the GPUDriver wants to update the command list -/// (you should copy the commands to your own structure). -/// -typedef void -(*ULGPUDriverUpdateCommandListCallback) (ULCommandList list); - -typedef struct { - ULGPUDriverBeginSynchronizeCallback begin_synchronize; - ULGPUDriverEndSynchronizeCallback end_synchronize; - ULGPUDriverNextTextureIdCallback next_texture_id; - ULGPUDriverCreateTextureCallback create_texture; - ULGPUDriverUpdateTextureCallback update_texture; - ULGPUDriverDestroyTextureCallback destroy_texture; - ULGPUDriverNextRenderBufferIdCallback next_render_buffer_id; - ULGPUDriverCreateRenderBufferCallback create_render_buffer; - ULGPUDriverDestroyRenderBufferCallback destroy_render_buffer; - ULGPUDriverNextGeometryIdCallback next_geometry_id; - ULGPUDriverCreateGeometryCallback create_geometry; - ULGPUDriverUpdateGeometryCallback update_geometry; - ULGPUDriverDestroyGeometryCallback destroy_geometry; - ULGPUDriverUpdateCommandListCallback update_command_list; -} ULGPUDriver; - -/// -/// Sets up an orthographic projection matrix with a certain viewport width -/// and height, multiplies it by 'transform', and returns the result. -/// -/// This should be used to calculate the model-view projection matrix for the -/// vertex shaders using the current ULGPUState. -/// -/// The 'flip_y' can be optionally used to flip the Y coordinate-space. -/// (Usually flip_y == true for OpenGL) -/// -ULExport ULMatrix4x4 ulApplyProjection(ULMatrix4x4 transform, - float viewport_width, - float viewport_height, - bool flip_y); - -/****************************************************************************** - * Clipboard - *****************************************************************************/ - -/// -/// The callback invoked when the library wants to clear the system's -/// clipboard. -/// -typedef void -(*ULClipboardClearCallback) (); - -/// -/// The callback invoked when the library wants to read from the system's -/// clipboard. -/// -/// You should store the result (if any) in 'result'. -/// -typedef void -(*ULClipboardReadPlainTextCallback) (ULString result); - -/// -/// The callback invoked when the library wants to write to the system's -/// clipboard. -/// -typedef void -(*ULClipboardWritePlainTextCallback) (ULString text); - -typedef struct { - ULClipboardClearCallback clear; - ULClipboardReadPlainTextCallback read_plain_text; - ULClipboardWritePlainTextCallback write_plain_text; -} ULClipboard; - -/****************************************************************************** - * Platform - *****************************************************************************/ - -/// -/// Set a custom Logger implementation. -/// -/// This is used to log debug messages to the console or to a log file. -/// -/// You should call this before ulCreateRenderer() or ulCreateApp(). -/// -/// @note ulCreateApp() will use the default logger if you never call this. -/// -/// @note If you're not using ulCreateApp(), (eg, using ulCreateRenderer()) -/// you can still use the default logger by calling -/// ulEnableDefaultLogger() (@see ) -/// -ULExport void ulPlatformSetLogger(ULLogger logger); - -/// -/// Set a custom FileSystem implementation. -/// -/// This is used for loading File URLs (eg, ). If you don't -/// call this, and are not using ulCreateApp() or ulEnablePlatformFileSystem(), -/// you will not be able to load any File URLs. -/// -/// You should call this before ulCreateRenderer() or ulCreateApp(). -/// -/// @note ulCreateApp() will use the default platform file system if you never -/// call this. -/// -/// @note If you're not using ulCreateApp(), (eg, using ulCreateRenderer()) -/// you can still use the default platform file system by calling -/// ulEnablePlatformFileSystem() (@see ) -/// -ULExport void ulPlatformSetFileSystem(ULFileSystem file_system); - -/// -/// Set a custom Surface implementation. -/// -/// This can be used to wrap a platform-specific GPU texture, Windows DIB, -/// macOS CGImage, or any other pixel buffer target for display on screen. -/// -/// By default, the library uses a bitmap surface for all surfaces but you can -/// override this by providing your own surface definition here. -/// -/// You should call this before ulCreateRenderer() or ulCreateApp(). -/// -ULExport void ulPlatformSetSurfaceDefinition(ULSurfaceDefinition surface_definition); - -/// -/// Set a custom GPUDriver implementation. -/// -/// This should be used if you have enabled the GPU renderer in the Config and -/// are using ulCreateRenderer() (which does not provide its own GPUDriver -/// implementation). -/// -/// The GPUDriver interface is used by the library to dispatch GPU calls to -/// your native GPU context (eg, D3D11, Metal, OpenGL, Vulkan, etc.) There -/// are reference implementations for this interface in the AppCore repo. -/// -/// You should call this before ulCreateRenderer(). -/// -ULExport void ulPlatformSetGPUDriver(ULGPUDriver gpu_driver); - -/// -/// Set a custom Clipboard implementation. -/// -/// This should be used if you are using ulCreateRenderer() (which does not -/// provide its own clipboard implementation). -/// -/// The Clipboard interface is used by the library to make calls to the -/// system's native clipboard (eg, cut, copy, paste). -/// -/// You should call this before ulCreateRenderer(). -/// -ULExport void ulPlatformSetClipboard(ULClipboard clipboard); - -#ifdef __cplusplus -} -#endif - -#endif // ULTRALIGHT_CAPI_H diff --git a/engine/inc/Ultralight/Defines.h b/engine/inc/Ultralight/Defines.h deleted file mode 100644 index 055b4ac0..00000000 --- a/engine/inc/Ultralight/Defines.h +++ /dev/null @@ -1,95 +0,0 @@ -/// -/// @file Defines.h -/// -/// @brief Common platform definitions -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2020 Ultralight, Inc. All rights reserved. -/// -#pragma once - -// Needed for limit defines, like INTMAX_MAX, which is used by the std C++ library -#ifndef __STDC_LIMIT_MACROS -#define __STDC_LIMIT_MACROS -#endif - -#include -#include -#include - -#ifdef SWIG -#define UExport -#else - -// Require C++11 Support -#if defined(_MSC_VER) -# if _MSC_VER < 1800 -# error This project needs at least Visual Studio 2013 to build -# endif -#elif __cplusplus <= 199711L -# error This project can only be compiled with a compiler that supports C++11 -#endif - - -#if defined(__WIN32__) || defined(_WIN32) -# if defined(ULTRALIGHT_IMPLEMENTATION) -# define UExport __declspec(dllexport) -# else -# define UExport __declspec(dllimport) -# endif -#define _thread_local __declspec(thread) -#ifndef _NATIVE_WCHAR_T_DEFINED -#define DISABLE_NATIVE_WCHAR_T -#endif -#else -# define UExport __attribute__((visibility("default"))) -#define _thread_local __thread -#endif - -#endif - -#define ULTRALIGHT_VERSION "1.2.0" -#define ULTRALIGHT_VERSION_MAJOR 1 -#define ULTRALIGHT_VERSION_MINOR 2 -#define ULTRALIGHT_VERSION_PATCH 0 - -#ifdef __cplusplus -extern "C" { -#endif - -UExport const char* UltralightVersionString(); -UExport uint32_t UltralightVersionMajor(); -UExport uint32_t UltralightVersionMinor(); -UExport uint32_t UltralightVersionPatch(); - -#ifdef __cplusplus -} -#endif - -/// -/// @mainpage Ultralight C++ API Reference -/// -/// @section intro_sec Introduction -/// -/// Hi there, welcome to the C++ API Reference for Ultralight! -/// -/// Ultralight is a fast, lightweight HTML UI engine for desktop apps and games. -/// -/// If this is your first time exploring the API, we recommend -/// starting with ultralight::Renderer and ultralight::View. -/// -/// -/// @section usefullinks_sec Useful Links -/// - Home: -- Get the latest binaries -/// - Docs: -- API overview, code snippets, tutorials and more! -/// - Discord: -- Stuck? Have questions? Come chat with us! -/// - GitHub: -- Report issues and browse code -/// -/// @section copyright_sec Copyright -/// Documentation is Copyright (C) 2020 Ultralight, Inc. All rights reserved. -/// diff --git a/engine/inc/Ultralight/Geometry.h b/engine/inc/Ultralight/Geometry.h deleted file mode 100644 index 6616bd3e..00000000 --- a/engine/inc/Ultralight/Geometry.h +++ /dev/null @@ -1,677 +0,0 @@ -/// -/// @file Geometry.h -/// -/// @brief The header for various geometry definitions and helpers -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2020 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include -#include -#include -#include -#include - -namespace ultralight { - -/// -/// 2D Vector Helper -/// -struct UExport vec2 { - union { - float value[2]; - struct { float x, y; }; - }; - - inline vec2() {} - - inline vec2(float x, float y) : x(x), y(y) {} - - inline vec2(float x) : x(x), y(x) {} - - inline vec2 yx() const { return { y, x }; } - - inline vec2 xx() const { return { x, x }; } - - inline vec2 yy() const { return { y, y }; } - - inline friend vec2 operator+(vec2 lhs, const vec2& rhs) { lhs += rhs; return lhs; } - - inline friend vec2 operator-(vec2 lhs, const vec2& rhs) { lhs -= rhs; return lhs; } - - inline friend vec2 operator*(vec2 lhs, const vec2& rhs) { lhs *= rhs; return lhs; } - - inline friend vec2 operator/(vec2 lhs, const vec2& rhs) { lhs /= rhs; return lhs; } - - inline friend vec2 operator+(vec2 lhs, float rhs) { lhs += rhs; return lhs; } - - inline friend vec2 operator-(vec2 lhs, float rhs) { lhs -= rhs; return lhs; } - - inline friend vec2 operator*(vec2 lhs, float rhs) { lhs *= rhs; return lhs; } - - inline friend vec2 operator/(vec2 lhs, float rhs) { lhs /= rhs; return lhs; } - - inline vec2& operator+=(const vec2& rhs) { - value[0] += rhs.value[0]; - value[1] += rhs.value[1]; - return *this; - } - - inline vec2& operator-=(const vec2& rhs) { - value[0] -= rhs.value[0]; - value[1] -= rhs.value[1]; - return *this; - } - - inline vec2& operator*=(const vec2& rhs) { - value[0] *= rhs.value[0]; - value[1] *= rhs.value[1]; - return *this; - } - - inline vec2& operator/=(const vec2& rhs) { - value[0] /= rhs.value[0]; - value[1] /= rhs.value[1]; - return *this; - } - - inline vec2& operator+=(float rhs) { - value[0] += rhs; - value[1] += rhs; - return *this; - } - - inline vec2& operator-=(float rhs) { - value[0] -= rhs; - value[1] -= rhs; - return *this; - } - - inline vec2& operator*=(float rhs) { - value[0] *= rhs; - value[1] *= rhs; - return *this; - } - - inline vec2& operator/=(float rhs) { - value[0] /= rhs; - value[1] /= rhs; - return *this; - } - - inline friend bool operator==(const vec2& a, const vec2& b) { - return !memcmp(&a, &b, sizeof(a)); - } - - inline friend bool operator!=(const vec2& a, const vec2& b) { - return !(a == b); - } - - inline friend vec2 min_(const vec2& a, const vec2& b) { - return{ (b.x < a.x) ? b.x : a.x, - (b.y < a.y) ? b.y : a.y }; - } - - inline friend vec2 max_(const vec2& a, const vec2& b) { - return{ (a.x < b.x) ? b.x : a.x, - (a.y < b.y) ? b.y : a.y }; - } - - inline friend vec2 clamp(const vec2& x, const vec2& minVal, const vec2& maxVal) { - return min_(max_(x, minVal), maxVal); - } - - inline friend vec2 mix(const vec2& a, const vec2& b, float t) { - return a * (1.0f - t) + b * t; - } - - inline friend float length(const vec2& a) { - return sqrtf(a.x * a.x + a.y * a.y); - } - - // squared length - inline friend float length2(const vec2& a) { - return dot(a, a); - } - - inline friend float distance(const vec2& a, const vec2& b) { - return length(a - b); - } - - // squared distance - inline friend float distance2(const vec2& a, const vec2& b) { - return length2(a - b); - } - - inline friend vec2 normalize(const vec2& a) { - return a / length(a); - } - - inline friend float dot(const vec2& a, const vec2& b) { - return a.x * b.x + a.y * b.y; - } -}; - -/// -/// 3D Vector Helper -/// -struct UExport vec3 { - union { - float value[3]; - struct { float x, y, z; }; - }; - - inline vec3() {} - - inline vec3(float x, float y, float z) : x(x), y(y), z(z) {} - - inline vec3(float x) : x(x), y(x), z(x) {} - - inline friend vec3 operator+(vec3 lhs, const vec3& rhs) { lhs += rhs; return lhs; } - - inline friend vec3 operator-(vec3 lhs, const vec3& rhs) { lhs -= rhs; return lhs; } - - inline friend vec3 operator*(vec3 lhs, const vec3& rhs) { lhs *= rhs; return lhs; } - - inline friend vec3 operator/(vec3 lhs, const vec3& rhs) { lhs /= rhs; return lhs; } - - inline friend vec3 operator+(vec3 lhs, float rhs) { lhs += rhs; return lhs; } - - inline friend vec3 operator-(vec3 lhs, float rhs) { lhs -= rhs; return lhs; } - - inline friend vec3 operator*(vec3 lhs, float rhs) { lhs *= rhs; return lhs; } - - inline friend vec3 operator/(vec3 lhs, float rhs) { lhs /= rhs; return lhs; } - - inline vec3& operator+=(const vec3& rhs) { - value[0] += rhs.value[0]; - value[1] += rhs.value[1]; - value[2] += rhs.value[2]; - return *this; - } - - inline vec3& operator-=(const vec3& rhs) { - value[0] -= rhs.value[0]; - value[1] -= rhs.value[1]; - value[2] -= rhs.value[2]; - return *this; - } - - inline vec3& operator*=(const vec3& rhs) { - value[0] *= rhs.value[0]; - value[1] *= rhs.value[1]; - value[2] *= rhs.value[2]; - return *this; - } - - inline vec3& operator/=(const vec3& rhs) { - value[0] /= rhs.value[0]; - value[1] /= rhs.value[1]; - value[2] /= rhs.value[2]; - return *this; - } - - inline vec3& operator+=(float rhs) { - value[0] += rhs; - value[1] += rhs; - value[2] += rhs; - return *this; - } - - inline vec3& operator-=(float rhs) { - value[0] -= rhs; - value[1] -= rhs; - value[2] -= rhs; - return *this; - } - - inline vec3& operator*=(float rhs) { - value[0] *= rhs; - value[1] *= rhs; - value[2] *= rhs; - return *this; - } - - inline vec3& operator/=(float rhs) { - value[0] /= rhs; - value[1] /= rhs; - value[2] /= rhs; - return *this; - } - - inline friend bool operator==(const vec3& a, const vec3& b) { - return !memcmp(&a, &b, sizeof(a)); - } - - inline friend bool operator!=(const vec3& a, const vec3& b) { - return !(a == b); - } - - inline friend vec3 min_(const vec3& a, const vec3& b) { - return{ (b.x < a.x) ? b.x : a.x, - (b.y < a.y) ? b.y : a.y, - (b.z < a.z) ? b.z : a.z }; - } - - inline friend vec3 max_(const vec3& a, const vec3& b) { - return{ (a.x < b.x) ? b.x : a.x, - (a.y < b.y) ? b.y : a.y, - (a.z < b.z) ? b.z : a.z }; - } - inline friend vec3 clamp(const vec3& x, const vec3& minVal, const vec3& maxVal) { - return min_(max_(x, minVal), maxVal); - } - - inline friend vec3 mix(const vec3& a, const vec3& b, float t) { - return a * (1.0f - t) + b * t; - } - - inline friend float length(const vec3& a) { - return sqrtf(a.x * a.x + a.y * a.y + a.z * a.z); - } - - inline friend float distance(const vec3& a, const vec3& b) { - return length(a - b); - } - - inline friend vec3 normalize(const vec3& a) { - return a / length(a); - } - - inline friend float dot(const vec3& a, const vec3& b) { - return a.x * b.x + a.y * b.y + a.z * b.z; - } -}; - -/// -/// 4D Vector Helper -/// -struct UExport vec4 { - union { - float value[4]; - struct { float x, y, z, w; }; - }; - - inline vec4() {} - - inline vec4(float x, float y, float z, float w) : x(x), y(y), z(z), w(w) {} - - inline vec4(float x) : x(x), y(x), z(x), w(x) {} - - inline vec4(const float x[4]) { memcpy(value, x, sizeof(value)); } - - inline friend bool operator==(const vec4& a, const vec4& b) { - return !memcmp(&a, &b, sizeof(a)); - } - - inline friend bool operator!=(const vec4& a, const vec4& b) { - return !(a == b); - } - - inline friend vec4 operator+(vec4 lhs, const vec4& rhs) { lhs += rhs; return lhs; } - - inline friend vec4 operator-(vec4 lhs, const vec4& rhs) { lhs -= rhs; return lhs; } - - inline friend vec4 operator*(vec4 lhs, const vec4& rhs) { lhs *= rhs; return lhs; } - - inline friend vec4 operator/(vec4 lhs, const vec4& rhs) { lhs /= rhs; return lhs; } - - inline friend vec4 operator+(vec4 lhs, float rhs) { lhs += rhs; return lhs; } - - inline friend vec4 operator-(vec4 lhs, float rhs) { lhs -= rhs; return lhs; } - - inline friend vec4 operator*(vec4 lhs, float rhs) { lhs *= rhs; return lhs; } - - inline friend vec4 operator/(vec4 lhs, float rhs) { lhs /= rhs; return lhs; } - - inline vec4& operator+=(const vec4& rhs) { - value[0] += rhs.value[0]; - value[1] += rhs.value[1]; - value[2] += rhs.value[2]; - value[3] += rhs.value[3]; - return *this; - } - - inline vec4& operator-=(const vec4& rhs) { - value[0] -= rhs.value[0]; - value[1] -= rhs.value[1]; - value[2] -= rhs.value[2]; - value[3] -= rhs.value[3]; - return *this; - } - - inline vec4& operator*=(const vec4& rhs) { - value[0] *= rhs.value[0]; - value[1] *= rhs.value[1]; - value[2] *= rhs.value[2]; - value[3] *= rhs.value[3]; - return *this; - } - - inline vec4& operator/=(const vec4& rhs) { - value[0] /= rhs.value[0]; - value[1] /= rhs.value[1]; - value[2] /= rhs.value[2]; - value[3] /= rhs.value[3]; - return *this; - } - - inline vec4& operator+=(float rhs) { - value[0] += rhs; - value[1] += rhs; - value[2] += rhs; - value[3] += rhs; - return *this; - } - - inline vec4& operator-=(float rhs) { - value[0] -= rhs; - value[1] -= rhs; - value[2] -= rhs; - value[3] -= rhs; - return *this; - } - - inline vec4& operator*=(float rhs) { - value[0] *= rhs; - value[1] *= rhs; - value[2] *= rhs; - value[3] *= rhs; - return *this; - } - - inline vec4& operator/=(float rhs) { - value[0] /= rhs; - value[1] /= rhs; - value[2] /= rhs; - value[3] /= rhs; - return *this; - } - - inline friend vec4 min_(const vec4& a, const vec4& b) { - return{ (b.x < a.x) ? b.x : a.x, - (b.y < a.y) ? b.y : a.y, - (b.z < a.z) ? b.z : a.z, - (b.w < a.w) ? b.w : a.w }; - } - - inline friend vec4 max_(const vec4& a, const vec4& b) { - return{ (a.x < b.x) ? b.x : a.x, - (a.y < b.y) ? b.y : a.y, - (a.z < b.z) ? b.z : a.z, - (a.w < b.w) ? b.w : a.w }; - } -}; - -/// -/// Point is typedef'd to a 2D vector -/// -typedef vec2 Point; - -/// -/// Float Rectangle Helper -/// -struct UExport Rect { - union { - float value[4]; - struct { float left, top, right, bottom; }; - }; - - static inline Rect MakeEmpty() { - Rect result; - result.SetEmpty(); - return result; - } - - inline float width() const { return right - left; } - inline float height() const { return bottom - top; } - inline float x() const { return left; } - inline float y() const { return top; } - inline float center_x() const { return (left + right) * 0.5f; } - inline float center_y() const { return (top + bottom) * 0.5f; } - - inline Point origin() const { return { left, top }; } - - inline void SetEmpty() { - memset(this, 0, sizeof(*this)); - } - - inline bool IsEmpty() const { - return *this == MakeEmpty(); - } - - inline bool IsValid() const { - return width() > 0 && height() > 0; - } - - inline void Inset(float dx, float dy) { - value[0] += dx; - value[1] += dy; - value[2] -= dx; - value[3] -= dy; - } - - inline void Outset(float dx, float dy) { - Inset(-dx, -dy); - } - - inline void Move(float dx, float dy) { - value[0] += dx; - value[1] += dy; - value[2] += dx; - value[3] += dy; - } - - inline float area() const { - return width() * height(); - } - - inline void Join(const Rect& rhs) { - // if we are empty, just assign - if (IsEmpty()) { - *this = rhs; - } - else { - if (rhs.value[0] < value[0]) value[0] = rhs.value[0]; - if (rhs.value[1] < value[1]) value[1] = rhs.value[1]; - if (rhs.value[2] > value[2]) value[2] = rhs.value[2]; - if (rhs.value[3] > value[3]) value[3] = rhs.value[3]; - } - } - - inline void Join(const Point& p) { - // if we are empty, just assign - if (IsEmpty()) { - *this = { p.x, p.y, p.x, p.y }; - } - else { - if (p.x < value[0]) value[0] = p.x; - if (p.y < value[1]) value[1] = p.y; - if (p.x > value[2]) value[2] = p.x; - if (p.y > value[3]) value[3] = p.y; - } - } - - inline bool Contains(const Point& p) const { - return p.x >= left && p.x <= right && - p.y >= top && p.y <= bottom; - } - - inline bool Contains(const Rect& r) const { - return left <= r.left && top <= r.top && - right >= r.right && bottom >= r.bottom; - } - - inline bool Intersects(const Rect& rhs) const { - return !(rhs.left > right || - rhs.right < left || - rhs.top > bottom || - rhs.bottom < top); - } - - inline Rect Intersect(const Rect& other) const { - return{ (left < other.left) ? other.left : left, - (top < other.top) ? other.top : top, - (other.right < right) ? other.right : right, - (other.bottom < bottom) ? other.bottom : bottom }; - } - - friend inline bool operator==(const Rect& a, const Rect& b) { - return !memcmp(&a, &b, sizeof(a)); - } - - friend inline bool operator!=(const Rect& a, const Rect& b) { - return !(a == b); - } -}; - -/// -/// Integer Rectangle Helper -/// -struct UExport IntRect { - union { - int value[4]; - struct { int left, top, right, bottom; }; - }; - - static inline IntRect MakeEmpty() { - IntRect result; - result.SetEmpty(); - return result; - } - - inline int width() const { return right - left; } - inline int height() const { return bottom - top; } - inline int x() const { return left; } - inline int y() const { return top; } - inline int center_x() const { return (int)std::round((left + right) * 0.5f); } - inline int center_y() const { return (int)std::round((top + bottom) * 0.5f); } - - inline Point origin() const { return{ (float)left, (float)top }; } - - inline void SetEmpty() { - memset(this, 0, sizeof(*this)); - } - - inline bool IsEmpty() const { - return *this == MakeEmpty(); - } - - inline bool IsValid() const { - return width() > 0 && height() > 0; - } - - inline void Inset(int dx, int dy) { - value[0] += dx; - value[1] += dy; - value[2] -= dx; - value[3] -= dy; - } - - inline void Outset(int dx, int dy) { - Inset(-dx, -dy); - } - - inline void Move(int dx, int dy) { - value[0] += dx; - value[1] += dy; - value[2] += dx; - value[3] += dy; - } - - inline int area() const { - return width() * height(); - } - - inline void Join(const IntRect& rhs) { - // if we are empty, just assign - if (IsEmpty()) { - *this = rhs; - } - else { - if (rhs.value[0] < value[0]) value[0] = rhs.value[0]; - if (rhs.value[1] < value[1]) value[1] = rhs.value[1]; - if (rhs.value[2] > value[2]) value[2] = rhs.value[2]; - if (rhs.value[3] > value[3]) value[3] = rhs.value[3]; - } - } - - inline void Join(const Point& p) { - // if we are empty, just assign - if (IsEmpty()) { - *this = { (int)std::floor(p.x), (int)std::floor(p.y), (int)std::ceil(p.x), (int)std::ceil(p.y) }; - } - else { - if ((int)std::floor(p.x) < value[0]) value[0] = (int)std::floor(p.x); - if ((int)std::floor(p.y) < value[1]) value[1] = (int)std::floor(p.y); - if ((int)std::ceil(p.x) > value[2]) value[2] = (int)std::ceil(p.x); - if ((int)std::ceil(p.y) > value[3]) value[3] = (int)std::ceil(p.y); - } - } - - inline bool Contains(const Point& p) const { - return p.x >= left && p.x <= right && - p.y >= top && p.y <= bottom; - } - - inline bool Contains(const IntRect& r) const { - return left <= r.left && top <= r.top && - right >= r.right && bottom >= r.bottom; - } - - inline bool Intersects(const IntRect& rhs) const { - // Since this is mostly used for pixel operations, we only count - // intersections that have width and height >= 1. - return !(rhs.left > right - 1 || - rhs.right < left || - rhs.top > bottom - 1 || - rhs.bottom < top); - } - - inline IntRect Intersect(const IntRect& other) const { - return{ (left < other.left) ? other.left : left, - (top < other.top) ? other.top : top, - (other.right < right) ? other.right : right, - (other.bottom < bottom) ? other.bottom : bottom }; - } - - friend inline bool operator==(const IntRect& a, const IntRect& b) { - return !memcmp(&a, &b, sizeof(a)); - } - - friend inline bool operator!=(const IntRect& a, const IntRect& b) { - return !(a == b); - } -}; - -/// -/// Rounded Rectangle Helper -/// -struct UExport RoundedRect { - Rect rect; - float radii_x[4]; - float radii_y[4]; - - void SetEmpty(); - - bool IsRounded() const; - - // Negative is inside, positive is outside. - float GetSignedDistance(const Point& p) const; - - // Returns whether or not intersection is found. Can fail if the resulting - // geometry is not a rounded rectangle. - bool Intersect(const RoundedRect& other, RoundedRect& result) const; - - void SnapToPixels(); - - Rect CalculateInterior() const; -}; - -} // namespace ultralight diff --git a/engine/inc/Ultralight/JavaScript.h b/engine/inc/Ultralight/JavaScript.h deleted file mode 100644 index bf6faedd..00000000 --- a/engine/inc/Ultralight/JavaScript.h +++ /dev/null @@ -1,39 +0,0 @@ -/// -/// @file View.h -/// -/// @brief The header for the View class. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2020 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include -#include -#include -#include - -namespace ultralight { - -/// -/// This class wraps a JSContextRef (a JavaScript execution context for use -/// with JavaScriptCore) and locks the context on the current thread for the -/// duration of its lifetime. -/// -class UExport JSContext : public RefCounted { -public: - /// Get the underlying JSContextRef for use with JavaScriptCore C API - virtual JSContextRef ctx() = 0; - - /// Typecast to a JSContextRef for use with JavaScriptCore C API - operator JSContextRef(); - -protected: - virtual ~JSContext(); -}; - -} // namespace ultralight diff --git a/engine/inc/Ultralight/KeyCodes.h b/engine/inc/Ultralight/KeyCodes.h deleted file mode 100644 index 3a4a7451..00000000 --- a/engine/inc/Ultralight/KeyCodes.h +++ /dev/null @@ -1,527 +0,0 @@ -/// -/// @file KeyCodes.h -/// -/// @brief The header for the KeyCodes definitions. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2020 Ultralight, Inc. All rights reserved. -/// -#pragma once - -namespace ultralight { - -/// -/// Namespace containing all the key-code definitions for KeyboardEvent. -/// Most of these correspond directly to the key-code values on Windows. - /// -namespace KeyCodes { - - // GK_BACK (08) BACKSPACE key - const int GK_BACK = 0x08; - - // GK_TAB (09) TAB key - const int GK_TAB = 0x09; - - // GK_CLEAR (0C) CLEAR key - const int GK_CLEAR = 0x0C; - - // GK_RETURN (0D) - const int GK_RETURN = 0x0D; - - // GK_SHIFT (10) SHIFT key - const int GK_SHIFT = 0x10; - - // GK_CONTROL (11) CTRL key - const int GK_CONTROL = 0x11; - - // GK_MENU (12) ALT key - const int GK_MENU = 0x12; - - // GK_PAUSE (13) PAUSE key - const int GK_PAUSE = 0x13; - - // GK_CAPITAL (14) CAPS LOCK key - const int GK_CAPITAL = 0x14; - - // GK_KANA (15) Input Method Editor (IME) Kana mode - const int GK_KANA = 0x15; - - // GK_HANGUEL (15) IME Hanguel mode (maintained for compatibility; use GK_HANGUL) - // GK_HANGUL (15) IME Hangul mode - const int GK_HANGUL = 0x15; - - // GK_JUNJA (17) IME Junja mode - const int GK_JUNJA = 0x17; - - // GK_FINAL (18) IME final mode - const int GK_FINAL = 0x18; - - // GK_HANJA (19) IME Hanja mode - const int GK_HANJA = 0x19; - - // GK_KANJI (19) IME Kanji mode - const int GK_KANJI = 0x19; - - // GK_ESCAPE (1B) ESC key - const int GK_ESCAPE = 0x1B; - - // GK_CONVERT (1C) IME convert - const int GK_CONVERT = 0x1C; - - // GK_NONCONVERT (1D) IME nonconvert - const int GK_NONCONVERT = 0x1D; - - // GK_ACCEPT (1E) IME accept - const int GK_ACCEPT = 0x1E; - - // GK_MODECHANGE (1F) IME mode change request - const int GK_MODECHANGE = 0x1F; - - // GK_SPACE (20) SPACEBAR - const int GK_SPACE = 0x20; - - // GK_PRIOR (21) PAGE UP key - const int GK_PRIOR = 0x21; - - // GK_NEXT (22) PAGE DOWN key - const int GK_NEXT = 0x22; - - // GK_END (23) END key - const int GK_END = 0x23; - - // GK_HOME (24) HOME key - const int GK_HOME = 0x24; - - // GK_LEFT (25) LEFT ARROW key - const int GK_LEFT = 0x25; - - // GK_UP (26) UP ARROW key - const int GK_UP = 0x26; - - // GK_RIGHT (27) RIGHT ARROW key - const int GK_RIGHT = 0x27; - - // GK_DOWN (28) DOWN ARROW key - const int GK_DOWN = 0x28; - - // GK_SELECT (29) SELECT key - const int GK_SELECT = 0x29; - - // GK_PRINT (2A) PRINT key - const int GK_PRINT = 0x2A; - - // GK_EXECUTE (2B) EXECUTE key - const int GK_EXECUTE = 0x2B; - - // GK_SNAPSHOT (2C) PRINT SCREEN key - const int GK_SNAPSHOT = 0x2C; - - // GK_INSERT (2D) INS key - const int GK_INSERT = 0x2D; - - // GK_DELETE (2E) DEL key - const int GK_DELETE = 0x2E; - - // GK_HELP (2F) HELP key - const int GK_HELP = 0x2F; - - // (30) 0 key - const int GK_0 = 0x30; - - // (31) 1 key - const int GK_1 = 0x31; - - // (32) 2 key - const int GK_2 = 0x32; - - // (33) 3 key - const int GK_3 = 0x33; - - // (34) 4 key - const int GK_4 = 0x34; - - // (35) 5 key; - const int GK_5 = 0x35; - - // (36) 6 key - const int GK_6 = 0x36; - - // (37) 7 key - const int GK_7 = 0x37; - - // (38) 8 key - const int GK_8 = 0x38; - - // (39) 9 key - const int GK_9 = 0x39; - - // (41) A key - const int GK_A = 0x41; - - // (42) B key - const int GK_B = 0x42; - - // (43) C key - const int GK_C = 0x43; - - // (44) D key - const int GK_D = 0x44; - - // (45) E key - const int GK_E = 0x45; - - // (46) F key - const int GK_F = 0x46; - - // (47) G key - const int GK_G = 0x47; - - // (48) H key - const int GK_H = 0x48; - - // (49) I key - const int GK_I = 0x49; - - // (4A) J key - const int GK_J = 0x4A; - - // (4B) K key - const int GK_K = 0x4B; - - // (4C) L key - const int GK_L = 0x4C; - - // (4D) M key - const int GK_M = 0x4D; - - // (4E) N key - const int GK_N = 0x4E; - - // (4F) O key - const int GK_O = 0x4F; - - // (50) P key - const int GK_P = 0x50; - - // (51) Q key - const int GK_Q = 0x51; - - // (52) R key - const int GK_R = 0x52; - - // (53) S key - const int GK_S = 0x53; - - // (54) T key - const int GK_T = 0x54; - - // (55) U key - const int GK_U = 0x55; - - // (56) V key - const int GK_V = 0x56; - - // (57) W key - const int GK_W = 0x57; - - // (58) X key - const int GK_X = 0x58; - - // (59) Y key - const int GK_Y = 0x59; - - // (5A) Z key - const int GK_Z = 0x5A; - - // GK_LWIN (5B) Left Windows key (Microsoft Natural keyboard) - const int GK_LWIN = 0x5B; - - // GK_RWIN (5C) Right Windows key (Natural keyboard) - const int GK_RWIN = 0x5C; - - // GK_APPS (5D) Applications key (Natural keyboard) - const int GK_APPS = 0x5D; - - // GK_SLEEP (5F) Computer Sleep key - const int GK_SLEEP = 0x5F; - - // GK_NUMPAD0 (60) Numeric keypad 0 key - const int GK_NUMPAD0 = 0x60; - - // GK_NUMPAD1 (61) Numeric keypad 1 key - const int GK_NUMPAD1 = 0x61; - - // GK_NUMPAD2 (62) Numeric keypad 2 key - const int GK_NUMPAD2 = 0x62; - - // GK_NUMPAD3 (63) Numeric keypad 3 key - const int GK_NUMPAD3 = 0x63; - - // GK_NUMPAD4 (64) Numeric keypad 4 key - const int GK_NUMPAD4 = 0x64; - - // GK_NUMPAD5 (65) Numeric keypad 5 key - const int GK_NUMPAD5 = 0x65; - - // GK_NUMPAD6 (66) Numeric keypad 6 key - const int GK_NUMPAD6 = 0x66; - - // GK_NUMPAD7 (67) Numeric keypad 7 key - const int GK_NUMPAD7 = 0x67; - - // GK_NUMPAD8 (68) Numeric keypad 8 key - const int GK_NUMPAD8 = 0x68; - - // GK_NUMPAD9 (69) Numeric keypad 9 key - const int GK_NUMPAD9 = 0x69; - - // GK_MULTIPLY (6A) Multiply key - const int GK_MULTIPLY = 0x6A; - - // GK_ADD (6B) Add key - const int GK_ADD = 0x6B; - - // GK_SEPARATOR (6C) Separator key - const int GK_SEPARATOR = 0x6C; - - // GK_SUBTRACT (6D) Subtract key - const int GK_SUBTRACT = 0x6D; - - // GK_DECIMAL (6E) Decimal key - const int GK_DECIMAL = 0x6E; - - // GK_DIVIDE (6F) Divide key - const int GK_DIVIDE = 0x6F; - - // GK_F1 (70) F1 key - const int GK_F1 = 0x70; - - // GK_F2 (71) F2 key - const int GK_F2 = 0x71; - - // GK_F3 (72) F3 key - const int GK_F3 = 0x72; - - // GK_F4 (73) F4 key - const int GK_F4 = 0x73; - - // GK_F5 (74) F5 key - const int GK_F5 = 0x74; - - // GK_F6 (75) F6 key - const int GK_F6 = 0x75; - - // GK_F7 (76) F7 key - const int GK_F7 = 0x76; - - // GK_F8 (77) F8 key - const int GK_F8 = 0x77; - - // GK_F9 (78) F9 key - const int GK_F9 = 0x78; - - // GK_F10 (79) F10 key - const int GK_F10 = 0x79; - - // GK_F11 (7A) F11 key - const int GK_F11 = 0x7A; - - // GK_F12 (7B) F12 key - const int GK_F12 = 0x7B; - - // GK_F13 (7C) F13 key - const int GK_F13 = 0x7C; - - // GK_F14 (7D) F14 key - const int GK_F14 = 0x7D; - - // GK_F15 (7E) F15 key - const int GK_F15 = 0x7E; - - // GK_F16 (7F) F16 key - const int GK_F16 = 0x7F; - - // GK_F17 (80H) F17 key - const int GK_F17 = 0x80; - - // GK_F18 (81H) F18 key - const int GK_F18 = 0x81; - - // GK_F19 (82H) F19 key - const int GK_F19 = 0x82; - - // GK_F20 (83H) F20 key - const int GK_F20 = 0x83; - - // GK_F21 (84H) F21 key - const int GK_F21 = 0x84; - - // GK_F22 (85H) F22 key - const int GK_F22 = 0x85; - - // GK_F23 (86H) F23 key - const int GK_F23 = 0x86; - - // GK_F24 (87H) F24 key - const int GK_F24 = 0x87; - - // GK_NUMLOCK (90) NUM LOCK key - const int GK_NUMLOCK = 0x90; - - // GK_SCROLL (91) SCROLL LOCK key - const int GK_SCROLL = 0x91; - - // GK_LSHIFT (A0) Left SHIFT key - const int GK_LSHIFT = 0xA0; - - // GK_RSHIFT (A1) Right SHIFT key - const int GK_RSHIFT = 0xA1; - - // GK_LCONTROL (A2) Left CONTROL key - const int GK_LCONTROL = 0xA2; - - // GK_RCONTROL (A3) Right CONTROL key - const int GK_RCONTROL = 0xA3; - - // GK_LMENU (A4) Left MENU key - const int GK_LMENU = 0xA4; - - // GK_RMENU (A5) Right MENU key - const int GK_RMENU = 0xA5; - - // GK_BROWSER_BACK (A6) Windows 2000/XP: Browser Back key - const int GK_BROWSER_BACK = 0xA6; - - // GK_BROWSER_FORWARD (A7) Windows 2000/XP: Browser Forward key - const int GK_BROWSER_FORWARD = 0xA7; - - // GK_BROWSER_REFRESH (A8) Windows 2000/XP: Browser Refresh key - const int GK_BROWSER_REFRESH = 0xA8; - - // GK_BROWSER_STOP (A9) Windows 2000/XP: Browser Stop key - const int GK_BROWSER_STOP = 0xA9; - - // GK_BROWSER_SEARCH (AA) Windows 2000/XP: Browser Search key - const int GK_BROWSER_SEARCH = 0xAA; - - // GK_BROWSER_FAVORITES (AB) Windows 2000/XP: Browser Favorites key - const int GK_BROWSER_FAVORITES = 0xAB; - - // GK_BROWSER_HOME (AC) Windows 2000/XP: Browser Start and Home key - const int GK_BROWSER_HOME = 0xAC; - - // GK_VOLUME_MUTE (AD) Windows 2000/XP: Volume Mute key - const int GK_VOLUME_MUTE = 0xAD; - - // GK_VOLUME_DOWN (AE) Windows 2000/XP: Volume Down key - const int GK_VOLUME_DOWN = 0xAE; - - // GK_VOLUME_UP (AF) Windows 2000/XP: Volume Up key - const int GK_VOLUME_UP = 0xAF; - - // GK_MEDIA_NEXT_TRACK (B0) Windows 2000/XP: Next Track key - const int GK_MEDIA_NEXT_TRACK = 0xB0; - - // GK_MEDIA_PREV_TRACK (B1) Windows 2000/XP: Previous Track key - const int GK_MEDIA_PREV_TRACK = 0xB1; - - // GK_MEDIA_STOP (B2) Windows 2000/XP: Stop Media key - const int GK_MEDIA_STOP = 0xB2; - - // GK_MEDIA_PLAY_PAUSE (B3) Windows 2000/XP: Play/Pause Media key - const int GK_MEDIA_PLAY_PAUSE = 0xB3; - - // GK_LAUNCH_MAIL (B4) Windows 2000/XP: Start Mail key - const int GK_MEDIA_LAUNCH_MAIL = 0xB4; - - // GK_LAUNCH_MEDIA_SELECT (B5) Windows 2000/XP: Select Media key - const int GK_MEDIA_LAUNCH_MEDIA_SELECT = 0xB5; - - // GK_LAUNCH_APP1 (B6) Windows 2000/XP: Start Application 1 key - const int GK_MEDIA_LAUNCH_APP1 = 0xB6; - - // GK_LAUNCH_APP2 (B7) Windows 2000/XP: Start Application 2 key - const int GK_MEDIA_LAUNCH_APP2 = 0xB7; - - // GK_OEM_1 (BA) Used for miscellaneous characters; it can vary by keyboard. Windows 2000/XP: For the US standard keyboard, the ';:' key - const int GK_OEM_1 = 0xBA; - - // GK_OEM_PLUS (BB) Windows 2000/XP: For any country/region, the '+' key - const int GK_OEM_PLUS = 0xBB; - - // GK_OEM_COMMA (BC) Windows 2000/XP: For any country/region, the ',' key - const int GK_OEM_COMMA = 0xBC; - - // GK_OEM_MINUS (BD) Windows 2000/XP: For any country/region, the '-' key - const int GK_OEM_MINUS = 0xBD; - - // GK_OEM_PERIOD (BE) Windows 2000/XP: For any country/region, the '.' key - const int GK_OEM_PERIOD = 0xBE; - - // GK_OEM_2 (BF) Used for miscellaneous characters; it can vary by keyboard. Windows 2000/XP: For the US standard keyboard, the '/?' key - const int GK_OEM_2 = 0xBF; - - // GK_OEM_3 (C0) Used for miscellaneous characters; it can vary by keyboard. Windows 2000/XP: For the US standard keyboard, the '`~' key - const int GK_OEM_3 = 0xC0; - - // GK_OEM_4 (DB) Used for miscellaneous characters; it can vary by keyboard. Windows 2000/XP: For the US standard keyboard, the '[{' key - const int GK_OEM_4 = 0xDB; - - // GK_OEM_5 (DC) Used for miscellaneous characters; it can vary by keyboard. Windows 2000/XP: For the US standard keyboard, the '\|' key - const int GK_OEM_5 = 0xDC; - - // GK_OEM_6 (DD) Used for miscellaneous characters; it can vary by keyboard. Windows 2000/XP: For the US standard keyboard, the ']}' key - const int GK_OEM_6 = 0xDD; - - // GK_OEM_7 (DE) Used for miscellaneous characters; it can vary by keyboard. Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key - const int GK_OEM_7 = 0xDE; - - // GK_OEM_8 (DF) Used for miscellaneous characters; it can vary by keyboard. - const int GK_OEM_8 = 0xDF; - - // GK_OEM_102 (E2) Windows 2000/XP: Either the angle bracket key or the backslash key on the RT 102-key keyboard - const int GK_OEM_102 = 0xE2; - - // GK_PROCESSKEY (E5) Windows 95/98/Me, Windows NT 4.0, Windows 2000/XP: IME PROCESS key - const int GK_PROCESSKEY = 0xE5; - - // GK_PACKET (E7) Windows 2000/XP: Used to pass Unicode characters as if they were keystrokes. The GK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods. For more information, see Remark in KEYBDINPUT,SendInput, WM_KEYDOWN, and WM_KEYUP - const int GK_PACKET = 0xE7; - - // GK_ATTN (F6) Attn key - const int GK_ATTN = 0xF6; - - // GK_CRSEL (F7) CrSel key - const int GK_CRSEL = 0xF7; - - // GK_EXSEL (F8) ExSel key - const int GK_EXSEL = 0xF8; - - // GK_EREOF (F9) Erase EOF key - const int GK_EREOF = 0xF9; - - // GK_PLAY (FA) Play key - const int GK_PLAY = 0xFA; - - // GK_ZOOM (FB) Zoom key - const int GK_ZOOM = 0xFB; - - // GK_NONAME (FC) Reserved for future use - const int GK_NONAME = 0xFC; - - // GK_PA1 (FD) PA1 key - const int GK_PA1 = 0xFD; - - // GK_OEM_CLEAR (FE) Clear key - const int GK_OEM_CLEAR = 0xFE; - - const int GK_UNKNOWN = 0; - -} // namespace KeyCodes - -} // namespace ultralight diff --git a/engine/inc/Ultralight/KeyEvent.h b/engine/inc/Ultralight/KeyEvent.h deleted file mode 100644 index ce8e8073..00000000 --- a/engine/inc/Ultralight/KeyEvent.h +++ /dev/null @@ -1,180 +0,0 @@ -/// -/// @file KeyEvent.h -/// -/// @brief The header for the KeyEvent class. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2020 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include -#include -#include -#ifdef __OBJC__ -#import -#endif - -namespace ultralight { - -/// -/// @brief A generic keyboard event that can be created from a platform event -/// or synthesized from scratch. -/// -/// @see View::FireKeyEvent -/// -class UExport KeyEvent { -public: - /// - /// The various KeyEvent types. - /// - enum Type { - /// - /// Key-Down event type. (Does not trigger accelerator commands in WebCore) - /// - /// @NOTE: You should probably use RawKeyDown instead when a physical key - /// is pressed. This member is only here for historic compatibility - /// with WebCore's key event types. - /// - kType_KeyDown, - - /// - /// Key-Up event type. Use this when a physical key is released. - /// - kType_KeyUp, - - /// - /// Raw Key-Down type. Use this when a physical key is pressed. - /// - /// @NOTE: You should use RawKeyDown for physical key presses since it - /// allows WebCore to do additional command translation. - /// - kType_RawKeyDown, - - /// - /// Character input event type. Use this when the OS generates text from - /// a physical key being pressed (eg, WM_CHAR on Windows). - /// - kType_Char, - }; - - /// - /// Creates an empty KeyEvent, you will need to initialize its members - /// yourself. This is useful for synthesizing your own keyboard events. - /// - KeyEvent(); - -#ifdef _WIN32 - /// - /// Create a KeyEvent directly from a Windows keyboard event. - /// - KeyEvent(Type type, uintptr_t wparam, intptr_t lparam, bool is_system_key); -#endif - -#ifdef __OBJC__ - /// - /// Create a KeyEvent directly from a macOS NSEvent. - /// - KeyEvent(NSEvent* evt); -#endif - - /// - /// An enumeration of the different keyboard modifiers. - /// - enum Modifiers : uint8_t { - /// Whether or not an ALT key is down - kMod_AltKey = 1 << 0, - - /// Whether or not a Control key is down - kMod_CtrlKey = 1 << 1, - - /// Whether or not a meta key (Command-key on Mac, Windows-key on Win) is down - kMod_MetaKey = 1 << 2, - - /// Whether or not a Shift key is down - kMod_ShiftKey = 1 << 3, - }; - - /// - // The type of this KeyEvent - /// - Type type; - - /// - /// The current state of the keyboard. Modifiers may be OR'd together to - /// represent multiple values. - /// - unsigned modifiers; - - /// - // The virtual key-code associated with this keyboard event. This is either - // directly from the event (ie, WPARAM on Windows) or via a mapping function. - // You can see a full list of the possible virtual key-codes in - // KeyboardCodes.h - /// - int virtual_key_code; - - /// - /// The actual key-code generated by the platform. The DOM spec primarily - /// uses Windows-equivalent codes (hence virtualKeyCode above) but it helps to - /// also specify the platform-specific key-code as well. - /// - int native_key_code; - - /// - /// This is a string identifying the key that was pressed. This can be - /// generated from the virtual_key_code via the GetKeyIdentifierFromVirtualKeyCode() - /// utility function. You can find the full list of key identifiers at: - /// - /// - String key_identifier; - - /// - /// The actual text generated by this keyboard event. This is usually only a - /// single character. - /// - String text; - - /// - /// The text generated by this keyboard event before all modifiers except - /// shift are applied. This is used internally for working out shortcut keys. - /// This is usually only a single character. - /// - String unmodified_text; - - /// - /// Whether or not this is a keypad event. - /// - bool is_keypad; - - /// - /// Whether or not this was generated as the result of an auto-repeat - /// (eg, holding down a key). - /// - bool is_auto_repeat; - - /// - /// Whether or not the pressed key is a "system key". This is a Windows-only - /// concept and should be "false" for all non-Windows platforms. For more - /// information, see the following link: - /// - bool is_system_key; -}; - -/// -/// Utility function for generating a key identifier string from a virtual -/// key-code. -/// -/// @param virtual_key_code The virtual key-code to generate the key -/// identifier from. -/// -/// @param key_identifier_result The string to store the result in. -/// -void UExport GetKeyIdentifierFromVirtualKeyCode(int virtual_key_code, - String& key_identifier_result); - -} // namespace ultralight diff --git a/engine/inc/Ultralight/Listener.h b/engine/inc/Ultralight/Listener.h deleted file mode 100644 index a6464633..00000000 --- a/engine/inc/Ultralight/Listener.h +++ /dev/null @@ -1,287 +0,0 @@ -/// -/// @file Listener.h -/// -/// @brief The header for View listener interfaces. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2020 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include -#include -#include -#include - -namespace ultralight { - -class View; - -/// -/// MessageSource types, @see ViewListener::OnAddConsoleMessage -/// -enum MessageSource { - kMessageSource_XML = 0, - kMessageSource_JS, - kMessageSource_Network, - kMessageSource_ConsoleAPI, - kMessageSource_Storage, - kMessageSource_AppCache, - kMessageSource_Rendering, - kMessageSource_CSS, - kMessageSource_Security, - kMessageSource_ContentBlocker, - kMessageSource_Other, -}; - -/// -/// MessageLevel types, @see ViewListener::OnAddConsoleMessage -/// -enum MessageLevel { - kMessageLevel_Log = 1, - kMessageLevel_Warning = 2, - kMessageLevel_Error = 3, - kMessageLevel_Debug = 4, - kMessageLevel_Info = 5, -}; - -/// -/// Cursor types, @see ViewListener::OnChangeCursor -/// -enum Cursor { - kCursor_Pointer = 0, - kCursor_Cross, - kCursor_Hand, - kCursor_IBeam, - kCursor_Wait, - kCursor_Help, - kCursor_EastResize, - kCursor_NorthResize, - kCursor_NorthEastResize, - kCursor_NorthWestResize, - kCursor_SouthResize, - kCursor_SouthEastResize, - kCursor_SouthWestResize, - kCursor_WestResize, - kCursor_NorthSouthResize, - kCursor_EastWestResize, - kCursor_NorthEastSouthWestResize, - kCursor_NorthWestSouthEastResize, - kCursor_ColumnResize, - kCursor_RowResize, - kCursor_MiddlePanning, - kCursor_EastPanning, - kCursor_NorthPanning, - kCursor_NorthEastPanning, - kCursor_NorthWestPanning, - kCursor_SouthPanning, - kCursor_SouthEastPanning, - kCursor_SouthWestPanning, - kCursor_WestPanning, - kCursor_Move, - kCursor_VerticalText, - kCursor_Cell, - kCursor_ContextMenu, - kCursor_Alias, - kCursor_Progress, - kCursor_NoDrop, - kCursor_Copy, - kCursor_None, - kCursor_NotAllowed, - kCursor_ZoomIn, - kCursor_ZoomOut, - kCursor_Grab, - kCursor_Grabbing, - kCursor_Custom -}; - -/// -/// @brief Interface for View-related events -/// -/// @note For more info @see View::set_view_listener -/// -class UExport ViewListener { -public: - virtual ~ViewListener() {} - - /// - /// Called when the page title changes - /// - virtual void OnChangeTitle(ultralight::View* caller, - const String& title) {} - - /// - /// Called when the page URL changes - /// - virtual void OnChangeURL(ultralight::View* caller, - const String& url) {} - - /// - /// Called when the tooltip changes (usually as result of a mouse hover) - /// - virtual void OnChangeTooltip(ultralight::View* caller, - const String& tooltip) {} - - /// - /// Called when the mouse cursor changes - /// - virtual void OnChangeCursor(ultralight::View* caller, - Cursor cursor) {} - - /// - /// Called when a message is added to the console (useful for errors / debug) - /// - virtual void OnAddConsoleMessage(ultralight::View* caller, - MessageSource source, - MessageLevel level, - const String& message, - uint32_t line_number, - uint32_t column_number, - const String& source_id) {} - - /// - /// Called when the page wants to create a new View. - /// - /// This is usually the result of a user clicking a link with target="_blank" - /// or by JavaScript calling window.open(url). - /// - /// To allow creation of these new Views, you should create a new View in - /// this callback (eg, Renderer::CreateView()), resize it to your container, - /// and return it. You are responsible for displaying the returned View. - /// - /// @param caller The View that called this event. - /// - /// @param opener_url The URL of the page that initiated this request. - /// - /// @param target_url The URL that the new View will navigate to. - /// - /// @param is_popup Whether or not this was triggered by window.open(). - /// - /// @param popup_rect Popups can optionally request certain dimensions and - /// coordinates via window.open(). You can choose to - /// respect these or not by resizing/moving the View to - /// this rect. - /// - /// @return Returns a RefPtr<> to a created View to use to satisfy the - /// the request (or return nullptr if you want to block the action). - /// - virtual RefPtr OnCreateChildView(ultralight::View* caller, - const String& opener_url, - const String& target_url, - bool is_popup, - const IntRect& popup_rect); -}; - -/// -/// @brief Interface for Load-related events -/// -/// @note For more info @see View::set_load_listener -/// -class UExport LoadListener { -public: - virtual ~LoadListener() {} - - /// - /// Called when the page begins loading a new URL into a frame. - /// - /// @param frame_id A unique ID for the frame. - /// - /// @param is_main_frame Whether or not this is the main frame. - /// - /// @param url The URL for the load. - /// - virtual void OnBeginLoading(ultralight::View* caller, - uint64_t frame_id, - bool is_main_frame, - const String& url) {} - - /// - /// Called when the page finishes loading a URL into a frame. - /// - /// @param frame_id A unique ID for the frame. - /// - /// @param is_main_frame Whether or not this is the main frame. - /// - /// @param url The URL for the load. - /// - virtual void OnFinishLoading(ultralight::View* caller, - uint64_t frame_id, - bool is_main_frame, - const String& url) {} - - /// - /// Called when an error occurs while loading a URL into a frame. - /// - /// @param frame_id A unique ID for the frame. - /// - /// @param is_main_frame Whether or not this is the main frame. - /// - /// @param url The URL for the load. - /// - /// @param description A human-readable description of the error. - /// - /// @param error_domain The name of the module that triggered the error. - /// - /// @param error_code Internal error code generated by the module. - /// - virtual void OnFailLoading(ultralight::View* caller, - uint64_t frame_id, - bool is_main_frame, - const String& url, - const String& description, - const String& error_domain, - int error_code) {} - - /// - /// Called when the JavaScript window object is reset for a new page load. - /// - /// This is called before any scripts are executed on the page and is the - /// earliest time to setup any initial JavaScript state or bindings. - /// - /// The document is not guaranteed to be loaded/parsed at this point. If - /// you need to make any JavaScript calls that are dependent on DOM elements - /// or scripts on the page, use OnDOMReady instead. - /// - /// The window object is lazily initialized (this will not be called on pages - /// with no scripts). - /// - /// @param frame_id A unique ID for the frame. - /// - /// @param is_main_frame Whether or not this is the main frame. - /// - /// @param url The URL for the load. - /// - virtual void OnWindowObjectReady(ultralight::View* caller, - uint64_t frame_id, - bool is_main_frame, - const String& url) {} - - /// - /// Called when all JavaScript has been parsed and the document is ready. - /// - /// This is the best time to make any JavaScript calls that are dependent on - /// DOM elements or scripts on the page. - /// - /// @param frame_id A unique ID for the frame. - /// - /// @param is_main_frame Whether or not this is the main frame. - /// - /// @param url The URL for the load. - /// - virtual void OnDOMReady(ultralight::View* caller, - uint64_t frame_id, - bool is_main_frame, - const String& url) {} - - /// - /// Called when the session history (back/forward state) is modified. - /// - virtual void OnUpdateHistory(ultralight::View* caller) {} - -}; - -} // namespace ultralight diff --git a/engine/inc/Ultralight/Matrix.h b/engine/inc/Ultralight/Matrix.h deleted file mode 100644 index f3292ada..00000000 --- a/engine/inc/Ultralight/Matrix.h +++ /dev/null @@ -1,190 +0,0 @@ -/// -/// @file Matrix.h -/// -/// @brief The header for Matrix helpers -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2020 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include -#include -#include - -namespace ultralight { - -/// -/// 4x4 Matrix Helper -/// -struct UExport Matrix4x4 { - /// - /// Raw 4x4 matrix as an array - /// - float data[16]; - - /// - /// Set to identity matrix. - /// - void SetIdentity(); -}; - -/// -/// Transformation Matrix helper -/// -struct UExport Matrix { -#if defined(__x86_64__) || defined(_M_X64) -#if defined(_MSC_VER) - __declspec(align(16)) typedef double Aligned4x4[4][4]; -#else - typedef double Aligned4x4[4][4] __attribute__((aligned(16))); -#endif -#else - typedef double Aligned4x4[4][4]; -#endif - - Aligned4x4 data; - - /// - /// Set to identity matrix. - /// - void SetIdentity(); - - /// - /// Set to an orthographic projection matrix suitable for use with our - /// vertex shaders. Optionally flip the y-coordinate space (eg, for OpenGL). - /// - void SetOrthographicProjection(double screen_width, double screen_height, - bool flip_y); - - /// - /// Set to another matrix. - /// - void Set(const Matrix& other); - - /// - /// Set to another matrix. - /// - void Set(const Matrix4x4& other); - - /// - /// Set from raw affine members. - /// - void Set(double a, double b, double c, double d, double e, double f); - - /// - /// Set from raw 4x4 components. - /// - void Set(double m11, double m12, double m13, double m14, - double m21, double m22, double m23, double m24, - double m31, double m32, double m33, double m34, - double m41, double m42, double m43, double m44); - - inline double m11() const { return data[0][0]; } - inline double m12() const { return data[0][1]; } - inline double m13() const { return data[0][2]; } - inline double m14() const { return data[0][3]; } - inline double m21() const { return data[1][0]; } - inline double m22() const { return data[1][1]; } - inline double m23() const { return data[1][2]; } - inline double m24() const { return data[1][3]; } - inline double m31() const { return data[2][0]; } - inline double m32() const { return data[2][1]; } - inline double m33() const { return data[2][2]; } - inline double m34() const { return data[2][3]; } - inline double m41() const { return data[3][0]; } - inline double m42() const { return data[3][1]; } - inline double m43() const { return data[3][2]; } - inline double m44() const { return data[3][3]; } - - inline double a() const { return data[0][0]; } - inline double b() const { return data[0][1]; } - inline double c() const { return data[1][0]; } - inline double d() const { return data[1][1]; } - inline double e() const { return data[3][0]; } - inline double f() const { return data[3][1]; } - - /// - /// Whether or not this is an identity matrix. - /// - bool IsIdentity() const; - - /// - /// Whether or not this is an identity matrix or translation. - /// - bool IsIdentityOrTranslation() const; - - /// - /// Whether or not this matrix uses only affine transformations. - /// - bool IsAffine() const; - - /// - /// Whether or not this is an identity, translation, or non-negative - /// uniform scale. - /// - bool IsSimple() const; - - /// - /// Translate by x and y. - /// - void Translate(double x, double y); - - /// - /// Scale by x and y. - /// - void Scale(double x, double y); - - /// - /// Rotate matrix by theta (in degrees) - /// - void Rotate(double theta); - - /// - /// Rotate matrix by x and y - /// - void Rotate(double x, double y); - - /// - /// Transform (multiply) by another Matrix - /// - void Transform(const Matrix& other); - - /// - /// Get the inverse of this matrix. May return false if not invertible. - /// - bool GetInverse(Matrix& result) const; - - /// - /// Transform point by this matrix and get the result. - /// - Point Apply(const Point& p) const; - - /// - /// Transform rect by this matrix and get the result as an axis-aligned rect. - /// - Rect Apply(const Rect& r) const; - - /// - /// Get an integer hash of this matrix's members. - /// - uint32_t Hash() const; - - /// - /// Get this matrix as unaligned 4x4 float components (for use passing to - /// GPU driver APIs). - /// - Matrix4x4 GetMatrix4x4() const; -}; - -bool UExport operator==(const Matrix& a, const Matrix& b); -bool UExport operator!=(const Matrix& a, const Matrix& b); - -bool UExport operator==(const Matrix4x4& a, const Matrix4x4& b); -bool UExport operator!=(const Matrix4x4& a, const Matrix4x4& b); - -} // namespace ultralight diff --git a/engine/inc/Ultralight/MouseEvent.h b/engine/inc/Ultralight/MouseEvent.h deleted file mode 100644 index 9b92f3d0..00000000 --- a/engine/inc/Ultralight/MouseEvent.h +++ /dev/null @@ -1,77 +0,0 @@ -/// -/// @file MouseEvent.h -/// -/// @brief The header for the MouseEvent class. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2020 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include - -namespace ultralight { - -/// -/// @brief A generic mouse event. -/// -/// @note @see View::FireMouseEvent -/// -class MouseEvent { -public: - /// - /// The various MouseEvent types. - /// - enum Type { - /// - /// Mouse moved type - /// - kType_MouseMoved, - - /// - /// Mouse button pressed type - /// - kType_MouseDown, - - /// - /// Mouse button released type - /// - kType_MouseUp, - }; - - /// - /// The various mouse button types. - /// - enum Button { - kButton_None = 0, - kButton_Left, - kButton_Middle, - kButton_Right, - }; - - /// - /// The type of this MouseEvent - /// - Type type; - - /// - /// The current x-position of the mouse, relative to the View - /// - int x; - - /// - /// The current y-position of the mouse, relative to the View - /// - int y; - - /// - /// The mouse button that was pressed/released, if any. - /// - Button button; -}; - -} // namespace ultralight diff --git a/engine/inc/Ultralight/RefPtr.h b/engine/inc/Ultralight/RefPtr.h deleted file mode 100644 index 1859b2aa..00000000 --- a/engine/inc/Ultralight/RefPtr.h +++ /dev/null @@ -1,538 +0,0 @@ -/// -/// @file RefPtr.h -/// -/// @brief The header for all ref-counting utilities. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2020 Ultralight, Inc. All rights reserved. -/// -/* -* Portions of the below code are derived from 'RefPtr.h' from Apple's WTF, -* with the following license header: -* -* Copyright (C) 2013-2014 Apple Inc. All rights reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* 1. Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* 2. Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* -* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' -* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS -* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF -* THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#pragma once -#include -#include -#include - -namespace ultralight { - -/// -/// @brief Interface for all ref-counted objects that will be managed using -/// the Ref<> and RefPtr<> smart pointers. -/// -class UExport RefCounted { - public: - virtual void AddRef() const = 0; - virtual void Release() const = 0; - virtual int ref_count() const = 0; - protected: - virtual ~RefCounted(); -}; - -inline void adopted(const void*) { } - -template class Ref; -template class RefPtr; - -/// -/// @brief Helper for wrapping new objects with the Ref smart pointer. -/// -/// All ref-counted object are created with an initial ref-count of '1'. -/// The AdoptRef() helper returns a Ref without calling AddRef(). -/// This is used for creating new objects, like so: -/// -/// Ref ref = AdoptRef(*new ObjectImpl()); -/// -template Ref AdoptRef(T&); - -/// -/// @brief A non-nullable smart pointer. -/// -/// This smart pointer automatically manages the lifetime of a RefCounted -/// object. Also guarantees that the managed instance is not NULL. -/// -template class Ref { -public: - /// - /// Destroy Ref (wll decrement ref-count by one) - /// - ~Ref() - { - if (instance_) - instance_->Release(); - } - - /// - /// Construct Ref from a reference. (Will increment ref-count by one) - /// - Ref(T& object) - : instance_(&object) - { - instance_->AddRef(); - } - - /// - /// Copy constructor. - /// - Ref(const Ref& other) - : instance_(other.instance_) - { - instance_->AddRef(); - } - - /// - /// Copy constructor with internal type conversion. - /// - template - Ref(Ref& other) - : instance_(other.ptr()) - { - instance_->AddRef(); - } - - /// - /// Copy constructor with internal type conversion. - /// - template - Ref(const Ref& other) - : instance_(other.ptr()) - { - instance_->AddRef(); - } - - /// - /// Move constructor. - /// - Ref(Ref&& other) - : instance_(&other.LeakRef()) - { - assert(instance_); - } - - /// - /// Move constructor. - /// - template - Ref(Ref&& other) - : instance_(&other.LeakRef()) - { - assert(instance_); - } - - Ref& operator=(T& object) - { - assert(instance_); - object.AddRef(); - instance_->Release(); - instance_ = &object; - assert(instance_); - return *this; - } - - Ref& operator=(const Ref& other) - { - assert(instance_); - other.instance_->AddRef(); - instance_->Release(); - instance_ = other.instance_; - assert(instance_); - return *this; - } - - template - Ref& operator=(const Ref& other) - { - assert(instance_); - other.instance_->AddRef(); - instance_->Release(); - instance_ = other.instance_; - assert(instance_); - return *this; - } - - Ref& operator=(Ref&& reference) - { - assert(instance_); - instance_->Release(); - instance_ = &reference.LeakRef(); - assert(instance_); - return *this; - } - - template Ref& operator=(Ref&& reference) - { - assert(instance_); - instance_->Release(); - instance_ = &reference.LeakRef(); - assert(instance_); - return *this; - } - - const T* operator->() const { assert(instance_); return instance_; } - T* operator->() { assert(instance_); return instance_; } - - /// - /// Get a pointer to wrapped object. - /// - const T* ptr() const { assert(instance_); return instance_; } - - /// - /// Get a pointer to wrapped object. - /// - T* ptr() { assert(instance_); return instance_; } - - /// - /// Get a reference to wrapped object. - /// - const T& get() const { assert(instance_); return *instance_; } - - /// - /// Get a reference to wrapped object. - /// - T& get() { assert(instance_); return *instance_; } - - operator T&() { assert(instance_); return *instance_; } - operator const T&() const { assert(instance_); return *instance_; } - - template Ref Replace(Ref&&); - - T& LeakRef() { - assert(instance_); - - T* result = std::move(instance_); - instance_ = std::forward(nullptr); - return *result; - } - - friend inline bool operator==(const Ref& a, const Ref& b) { - return a.instance_ == b.instance_; - } - - friend inline bool operator!=(const Ref& a, const Ref& b) { - return a.instance_ != b.instance_; - } - - friend inline bool operator<(const Ref& a, const Ref& b) { - return a.instance_ < b.instance_; - } - -protected: - friend Ref AdoptRef(T&); - template friend class RefPtr; - - enum AdoptTag { Adopt }; - Ref(T& object, AdoptTag) - : instance_(&object) - { - } - - T* instance_; -}; - -template template Ref Ref::Replace(Ref&& reference) -{ - auto oldReference = AdoptRef(*instance_); - instance_ = &reference.LeakRef(); - return oldReference; -} - -template -Ref AdoptRef(T& reference) -{ - adopted(&reference); - return Ref(reference, Ref::Adopt); -} - -/// -/// @brief A nullable smart pointer. -/// -/// This smart pointer automatically manages the lifetime of a RefCounted -/// object. The managed instance may be NULL. -/// -template class RefPtr { - public: - /// - /// Construct a NULL ref-pointer. - /// - RefPtr() - : instance_(nullptr) - { - } - - /// - /// Construct a NULL ref-pointer. - /// - RefPtr(std::nullptr_t) - : instance_(nullptr) - { - } - - /// - /// Construct from a pointer. (Will increment ref-count by one) - /// - RefPtr(T* other) - : instance_(other) - { - if (instance_) - instance_->AddRef(); - } - - /// - /// Copy constructor. - /// - RefPtr(const RefPtr& other) - : instance_(other.instance_) - { - if (instance_) - instance_->AddRef(); - } - - /// - /// Copy constructor with internal type conversion. - /// - template - RefPtr(const RefPtr& other) - : instance_(other.instance_) - { - if (instance_) - instance_->AddRef(); - } - - /// - /// Move constructor. - /// - RefPtr(RefPtr&& other) - : instance_(other.LeakRef()) - { - } - - /// - /// Move constructor. - /// - template - RefPtr(RefPtr&& other) - : instance_(other.LeakRef()) - { - } - - /// - /// Construct from a Ref - /// - template - RefPtr(const Ref& other) - : instance_(other.instance_) - { - if (instance_) - instance_->AddRef(); - } - - /// - /// Construct by moving from a Ref - /// - template - RefPtr(Ref&& other); - - /// - /// Destroy RefPtr (wll decrement ref-count by one) - /// - ~RefPtr() - { - T* old_value = std::move(instance_); - instance_ = std::forward(nullptr); - if (old_value) - old_value->Release(); - } - - /// - /// Get a pointer to wrapped object. - /// - T* get() const { return instance_; } - - T* LeakRef() { - T* result = std::move(instance_); - instance_ = std::forward(nullptr); - return result; - } - - T& operator*() const { assert(instance_); return *instance_; } - T* operator->() const { return instance_; } - - bool operator!() const { return !instance_; } - - // This conversion operator allows implicit conversion to bool but not to other integer types. - typedef T* (RefPtr::*UnspecifiedBoolType); - operator UnspecifiedBoolType() const { return instance_ ? &RefPtr::instance_ : nullptr; } - - RefPtr& operator=(const RefPtr&); - RefPtr& operator=(T*); - RefPtr& operator=(std::nullptr_t); - template RefPtr& operator=(const RefPtr&); - RefPtr& operator=(RefPtr&&); - template RefPtr& operator=(RefPtr&&); - template RefPtr& operator=(Ref&&); - - friend inline bool operator==(const RefPtr& a, const RefPtr& b) { - return a.instance_ == b.instance_; - } - - friend inline bool operator!=(const RefPtr& a, const RefPtr& b) { - return a.instance_ != b.instance_; - } - - friend inline bool operator<(const RefPtr& a, const RefPtr& b) { - return a.instance_ < b.instance_; - } - - void Swap(RefPtr&); - -private: - T* instance_; -}; - -template -template -RefPtr::RefPtr(Ref&& reference) - : instance_(&reference.LeakRef()) -{ -} - -template -RefPtr& RefPtr::operator=(const RefPtr& other) -{ - RefPtr ptr = other; - Swap(ptr); - return *this; -} - -template -template -RefPtr& RefPtr::operator=(const RefPtr& other) -{ - RefPtr ptr = other; - Swap(ptr); - return *this; -} - -template -RefPtr& RefPtr::operator=(T* object) -{ - RefPtr ptr = object; - Swap(ptr); - return *this; -} - -template -RefPtr& RefPtr::operator=(std::nullptr_t) -{ - T* old_instance = std::move(instance_); - instance_ = std::forward(nullptr); - if (old_instance) - old_instance->Release(); - return *this; -} - -template -RefPtr& RefPtr::operator=(RefPtr&& other) -{ - RefPtr ptr = std::move(other); - Swap(ptr); - return *this; -} - -template -template -RefPtr& RefPtr::operator=(RefPtr&& other) -{ - RefPtr ptr = std::move(other); - Swap(ptr); - return *this; -} - -template -template -RefPtr& RefPtr::operator=(Ref&& other) -{ - RefPtr ptr = std::move(other); - Swap(ptr); - return *this; -} - -template -void RefPtr::Swap(RefPtr& other) -{ - std::swap(instance_, other.instance_); -} - -template -void Swap(RefPtr& a, RefPtr& b) -{ - a.Swap(b); -} - -template -bool operator==(const RefPtr& a, const RefPtr& b) -{ - return a.get() == b.get(); -} - -template -bool operator==(const RefPtr& a, U* b) -{ - return a.get() == b; -} - -template -bool operator==(T* a, const RefPtr& b) -{ - return a == b.get(); -} - -template -bool operator!=(const RefPtr& a, const RefPtr& b) -{ - return a.get() != b.get(); -} - -template -bool operator!=(const RefPtr& a, U* b) -{ - return a.get() != b; -} - -template -bool operator!=(T* a, const RefPtr& b) -{ - return a != b.get(); -} - -} // namespace ultralight diff --git a/engine/inc/Ultralight/RenderTarget.h b/engine/inc/Ultralight/RenderTarget.h deleted file mode 100644 index 842f0592..00000000 --- a/engine/inc/Ultralight/RenderTarget.h +++ /dev/null @@ -1,84 +0,0 @@ -/// -/// @file RenderTarget.h -/// -/// @brief The header for the RenderTarget struct. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2020 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include -#include -#include - -namespace ultralight { - -#pragma pack(push, 1) - -/// -/// @brief Rendering details for a View, to be used with your own GPUDriver -/// -/// When using your own GPUDriver, each View is rendered to an offscreen -/// texture that you can display on a 3D quad in your application. This struct -/// provides all the details you need to display the corresponding texture in -/// your application. -/// -struct UExport RenderTarget { - /// - /// Whether this target is empty (null texture) - /// - bool is_empty; - - /// - /// The viewport width (in device coordinates). - /// - uint32_t width; - - /// - /// The viewport height (in device coordinates). - /// - uint32_t height; - - /// - /// The GPUDriver-specific texture ID (you should bind the texture using - /// your implementation of GPUDriver::BindTexture before drawing a quad). - /// - uint32_t texture_id; - - /// - /// The texture width (in pixels). This may be padded. - /// - uint32_t texture_width; - - /// - /// The texture height (in pixels). This may be padded. - /// - uint32_t texture_height; - - /// - /// The pixel format of the texture. - /// - BitmapFormat texture_format; - - /// - /// UV coordinates of the texture (this is needed because the texture may - /// be padded). - /// - Rect uv_coords; - - /// - /// The GPUDriver-specific render buffer ID. - /// - uint32_t render_buffer_id; - - RenderTarget(); -}; - -#pragma pack(pop) - -} // namespace ultralight diff --git a/engine/inc/Ultralight/Renderer.h b/engine/inc/Ultralight/Renderer.h deleted file mode 100644 index 9e6de5a7..00000000 --- a/engine/inc/Ultralight/Renderer.h +++ /dev/null @@ -1,137 +0,0 @@ -/// -/// @file Renderer.h -/// -/// @brief The header for the Renderer class. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2020 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include -#include -#include -#include - -namespace ultralight { - -/// -/// @brief This singleton manages the lifetime of all Views (@see View) and -/// coordinates painting, network requests, and event dispatch. -/// -/// @note You don't have to create this instance directly if you use the -/// AppCore API. The App class will automatically create a Renderer and -/// perform all rendering within its run loop. @see App::Create -/// -class UExport Renderer : public RefCounted { -public: - /// - /// Create the Ultralight Renderer directly. - /// - /// Unlike App::Create(), this does not use any native windows for drawing - /// and allows you to manage your own runloop and painting. This method is - /// recommended for those wishing to integrate the library into a game. - /// - /// You should set up your Platform config, file-system, font loader, - /// and surface-factories/gpu-drivers before calling this function. - /// (@see ) - /// - /// At a minimum, you will need to define a FontLoader ahead of time or this - /// call will fail. You can use the platform's native FontLoader by calling: - ///
-  ///   /// This function is defined in 
-  ///   Platform::instance().set_font_loader(GetPlatformFontLoader());
-  /// 
- /// - /// @note You should only create one Renderer per application lifetime. - /// - /// @note: You should not call this if you are using App::Create(), it - /// creates its own renderer and provides default implementations for - /// various platform handlers automatically. - /// - /// @return Renderer is ref-counted. This method returns a ref-pointer - /// to a new instance, you should store it in a RefPtr<> to keep - /// the instance alive. - /// - static Ref Create(); - - /// - /// Create a Session to store local data in (such as cookies, local storage, - /// application cache, indexed db, etc). - /// - /// @note A default, persistent Session is already created for you. You - /// only need to call this if you want to create private, in-memory - /// session or use a separate session for each View. - /// - /// @param is_persistent Whether or not to store the session on disk. - /// Persistent sessions will be written to the path - /// set in Config::cache_path - /// - /// @param name A unique name for this session, this will be used to - /// generate a unique disk path for persistent sessions. - /// - virtual Ref CreateSession(bool is_persistent, const String& name) = 0; - - /// - /// Get the default Session. This session is persistent (backed to disk) and - /// has the name "default". - /// - virtual Ref default_session() = 0; - - /// - /// Create a new View. - /// - /// @param width The initial width, in pixels. - /// - /// @param height The initial height, in pixels. - /// - /// @param transparent Whether or not the view background is transparent. - /// - /// @param session The session to store local data in. Pass a nullptr to - /// use the default session. - /// - /// @return Returns a ref-pointer to a new View instance. You should assign - /// it to either a Ref (non-nullable) or RefPtr - /// (nullable). - /// - virtual Ref CreateView(uint32_t width, uint32_t height, - bool transparent, RefPtr session, - bool force_cpu_renderer = false) = 0; - - /// - /// Update timers and dispatch internal callbacks. You should call this often - /// from your main application loop. - /// - virtual void Update() = 0; - - /// - /// Render all active views to their respective render-targets/surfaces. - /// - /// You should call this once per frame (usually in synchrony with the - /// monitor's refresh rate). - /// - /// @note Views are only repainted if they actually need painting. - /// - virtual void Render() = 0; - - /// - /// Attempt to release as much memory as possible. Don't call this from any - /// callbacks or driver code. - /// - virtual void PurgeMemory() = 0; - - /// - /// Print detailed memory usage statistics to the log. - /// (@see Platform::set_logger()) - /// - virtual void LogMemoryUsage() = 0; - -protected: - virtual ~Renderer(); -}; - -} // namespace ultralight diff --git a/engine/inc/Ultralight/RequestHandler.h b/engine/inc/Ultralight/RequestHandler.h deleted file mode 100644 index e69de29b..00000000 diff --git a/engine/inc/Ultralight/ScrollEvent.h b/engine/inc/Ultralight/ScrollEvent.h deleted file mode 100644 index a48bea5d..00000000 --- a/engine/inc/Ultralight/ScrollEvent.h +++ /dev/null @@ -1,53 +0,0 @@ -/// -/// @file ScrollEvent.h -/// -/// @brief The header for the ScrollEvent class. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2020 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include - -namespace ultralight { - -/// -/// @brief A generic scroll event. -/// -/// @note @see View::FireScrollEvent -/// -class ScrollEvent { -public: - /// - /// The scroll event granularity type - /// - enum Type { - /// The delta value is interpreted as number of pixels - kType_ScrollByPixel, - - /// The delta value is interpreted as number of pages - kType_ScrollByPage, - }; - - /// - /// Scroll granularity type - /// - Type type; - - /// - /// Horizontal scroll amount - /// - int delta_x; - - /// - /// Vertical scroll amount - /// - int delta_y; -}; - -} // namespace ultralight diff --git a/engine/inc/Ultralight/Session.h b/engine/inc/Ultralight/Session.h deleted file mode 100644 index 68819f2d..00000000 --- a/engine/inc/Ultralight/Session.h +++ /dev/null @@ -1,53 +0,0 @@ -/// -/// @file Session.h -/// -/// @brief The header for the Session class. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2020 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include -#include -#include - -namespace ultralight { - -/// -/// @brief A Session stores local data such as cookies, local storage, -/// and application cache for one or more Views. -/// -/// @see Renderer::CreateSession -/// -class UExport Session : public RefCounted { -public: - /// - /// Whether or not this session is written to disk. - /// - virtual bool is_persistent() const = 0; - - /// - /// A unique name identifying this session. - /// - virtual String name() const = 0; - - /// - /// A unique numeric ID identifying this session. - /// - virtual uint64_t id() const = 0; - - /// - /// The disk path of this session (only valid for persistent sessions). - /// - virtual String disk_path() const = 0; - -protected: - virtual ~Session(); -}; - -} // namespace ultralight diff --git a/engine/inc/Ultralight/String.h b/engine/inc/Ultralight/String.h deleted file mode 100644 index 0362a91c..00000000 --- a/engine/inc/Ultralight/String.h +++ /dev/null @@ -1,120 +0,0 @@ -/// -/// @file String.h -/// -/// @brief The header for the String class. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2020 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include -#include -#include -#include - -namespace ultralight { - -/// -/// @brief UTF-16 String container with conversions for UTF-8 and UTF-32. -/// -/// @note Internally, all strings are represented as UTF-16. -/// -class UExport String { -public: - /// - /// Create empty string - /// - String(); - - /// - /// Create from null-terminated, ASCII C-string - /// - String(const char* str); - - /// - /// Create from raw, UTF-8 string with certain length - /// - String(const char* str, size_t len); - - /// - /// Create from existing String8 (UTF-8). - /// - String(const String8& str); - - /// - /// Create from raw UTF-16 string with certain length - /// - String(const Char16* str, size_t len); - - /// - /// Create from existing String16 (UTF-16) - /// - String(const String16& str); - - /// - /// Create from existing String32 (UTF-32) - /// - String(const String32& str); - - /// - /// Copy constructor - /// - String(const String& other); - - /// - /// Destructor - /// - ~String(); - - /// - /// Assign string from another, copy is made - /// - String& operator=(const String& other); - - /// - /// Append string with another - /// - String& operator+=(const String& other); - - /// - /// Concatenation operator - /// - inline friend String operator+(String lhs, const String& rhs) { lhs += rhs; return lhs; } - - /// - /// Get native UTF-16 string - /// - String16& utf16() { return str_; } - - /// - /// Get native UTF-16 string - /// - const String16& utf16() const { return str_; } - - /// - /// Convert to UTF-8 string - /// - String8 utf8() const; - - /// - /// Convert to UTF-32 string - /// - String32 utf32() const; - - /// - /// Check if string is empty or not - /// - bool empty() const { return utf16().empty(); } - -private: - String16 str_; -}; - - -} // namespace ultralight - diff --git a/engine/inc/Ultralight/String16.h b/engine/inc/Ultralight/String16.h deleted file mode 100644 index 9de8405c..00000000 --- a/engine/inc/Ultralight/String16.h +++ /dev/null @@ -1,130 +0,0 @@ -/// -/// @file String16.h -/// -/// @brief The header for the String16 class. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2020 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include -#include -#include - -namespace ultralight { - -namespace detail { - template struct selector; - template<> struct selector<4> { typedef char16_t Char16; }; - template<> struct selector<2> { typedef wchar_t Char16; }; -} - -#ifdef DISABLE_NATIVE_WCHAR_T -// Force Char16 type to use char16_t, used on Windows when native wchar_t support is disabled. -typedef char16_t Char16; -#else -// We use wchar_t if size == 2, otherwise use char16_t -typedef detail::selector::Char16 Char16; -#endif - -/// -/// @brief A UTF-16 string container. -/// -class UExport String16 { -public: - // Make an empty String16 - String16(); - - // Make a String16 from null-terminated ASCII C-string - String16(const char* c_str); - - // Make a String16 from ASCII C-string with certain length - String16(const char* c_str, size_t len); - - // Make a String16 from raw UTF-16 buffer with certain length - String16(const Char16* str, size_t len); - - // Make a String16 from raw unsigned short UTF-16 buffer with certain length. Useful on Windows - // when native support for wchar_t is disabled (eg, /Zc:wchar_t-). - String16(const unsigned short* str, size_t len); - - // Make a deep copy of String16 - String16(const String16& other); - - ~String16(); - - // Assign a String16 to this one, deep copy is made - String16& operator=(const String16& other); - - // Append a String16 to this one. - String16& operator+=(const String16& other); - - // Concatenation operator - inline friend String16 operator+(String16 lhs, const String16& rhs) { lhs += rhs; return lhs; } - - // Get raw UTF-16 data - Char16* data() { return data_; } - - // Get raw UTF-16 data (const) - const Char16* data() const { return data_; } - - // Get raw UTF-16 data as unsigned short. This is useful on Windows if you compile without native - // support for wchar_t (eg, /Zc:wchar_t-) - unsigned short* udata() { return reinterpret_cast(data_); } - - // Get raw UTF-16 data as unsigned short (const). - const unsigned short* udata() const { return reinterpret_cast(data_); } - - // Get length in characters. - size_t length() const { return length_; } - - // Get size in characters (synonym for length) - size_t size() const { return length_; } - - // Check if string is empty. - bool empty() const { return !data_ || length_ == 0; } - - // Get character at specific position - Char16& operator[](size_t pos) { return data_[pos]; } - - // Get character at specific position (const) - const Char16& operator[](size_t pos) const { return data_[pos]; } - -private: - Char16* data_; - size_t length_; -}; - -/// -/// @brief A UTF-16 string vector. -/// -class UExport String16Vector : public RefCounted { -public: - // Create an empty string vector - static Ref Create(); - - // Create a string vector from an existing array (a deep copy is made) - static Ref Create(const String16* stringArray, size_t len); - - // Add an element to the back of the string vector - virtual void push_back(const String16& val) = 0; - - // Get raw String16 vector array - virtual String16* data() = 0; - - // Get the number of elements in vector - virtual size_t size() const = 0; - -protected: - String16Vector(); - virtual ~String16Vector(); - String16Vector(const String16Vector&); - void operator=(const String16Vector&); -}; - -} // namespace ultralight diff --git a/engine/inc/Ultralight/String32.h b/engine/inc/Ultralight/String32.h deleted file mode 100644 index 21738264..00000000 --- a/engine/inc/Ultralight/String32.h +++ /dev/null @@ -1,71 +0,0 @@ -/// -/// @file String32.h -/// -/// @brief The header for the String32 class. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2020 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include -#include - -namespace ultralight { - -/// -/// @brief A UTF-32 string container. -/// -class UExport String32 { -public: - // Make an empty String32 - String32(); - - // Make a String32 from raw UTF-32 string with certain length - String32(const char32_t* c_str, size_t len); - - // Make a deep copy of String32 - String32(const String32& other); - - ~String32(); - - // Assign a String32 to this one, deep copy is made - String32& operator=(const String32& other); - - // Append a String32 to this one. - String32& operator+=(const String32& other); - - // Concatenation operator - inline friend String32 operator+(String32 lhs, const String32& rhs) { lhs += rhs; return lhs; } - - // Get raw UTF-32 data - char32_t* data() { return data_; } - - // Get raw UTF-32 data (const) - const char32_t* data() const { return data_; } - - // Get length in characters. - size_t length() const { return length_; } - - // Get size in characters (synonym for length) - size_t size() const { return length_; } - - // Check if string is empty. - bool empty() const { return !data_ || length_ == 0; } - - // Get character at specific position - char32_t& operator[](size_t pos) { return data_[pos]; } - - // Get character at specific position (const) - const char32_t& operator[](size_t pos) const { return data_[pos]; } - -private: - char32_t* data_; - size_t length_; -}; - -} // namespace ultralight diff --git a/engine/inc/Ultralight/String8.h b/engine/inc/Ultralight/String8.h deleted file mode 100644 index f83d75b2..00000000 --- a/engine/inc/Ultralight/String8.h +++ /dev/null @@ -1,74 +0,0 @@ -/// -/// @file String8.h -/// -/// @brief The header for the String8 class. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2020 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include -#include - -namespace ultralight { - -/// -/// @brief A UTF-8 string container. -// -class UExport String8 { -public: - // Make an empty String8 - String8(); - - // Make a String8 from raw, null-terminated UTF-8 string - String8(const char* c_str); - - // Make a String8 from raw UTF-8 string with certain length - String8(const char* c_str, size_t len); - - // Make a deep copy of String8 - String8(const String8& other); - - ~String8(); - - // Assign a String8 to this one, deep copy is made - String8& operator=(const String8& other); - - // Append a String8 to this one. - String8& operator+=(const String8& other); - - // Concatenation operator - inline friend String8 operator+(String8 lhs, const String8& rhs) { lhs += rhs; return lhs; } - - // Get raw UTF-8 data - char* data() { return data_; } - - // Get raw UTF-8 data (const) - const char* data() const { return data_; } - - // Get length in characters. - size_t length() const { return length_; } - - // Get size in characters (synonym for length) - size_t size() const { return length_; } - - // Check if string is empty. - bool empty() const { return !data_ || length_ == 0; } - - // Get character at specific position - char& operator[](size_t pos) { return data_[pos]; } - - // Get character at specific position (const) - const char& operator[](size_t pos) const { return data_[pos]; } - -private: - char* data_; - size_t length_; -}; - -} // namespace ultralight diff --git a/engine/inc/Ultralight/Ultralight.h b/engine/inc/Ultralight/Ultralight.h deleted file mode 100644 index 6db2c6e1..00000000 --- a/engine/inc/Ultralight/Ultralight.h +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2020 Ultralight, Inc. All rights reserved. -#pragma once -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include diff --git a/engine/inc/Ultralight/View.h b/engine/inc/Ultralight/View.h deleted file mode 100644 index c56c5b8e..00000000 --- a/engine/inc/Ultralight/View.h +++ /dev/null @@ -1,307 +0,0 @@ -/// -/// @file View.h -/// -/// @brief The header for the View class. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2020 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace ultralight { - -/// -/// @brief The View class is used to load and display web content. -/// -/// View is an offscreen web-page container that can be used to display -/// web-content in your application. -/// -/// You can load content into a View via View::LoadURL() or View::LoadHTML() -/// and interact with it via View::FireMouseEvent() and similar API. -/// -/// When displaying a View, the API is different depending on whether you -/// are using the CPU renderer or the GPU renderer: -/// -/// When using the CPU renderer, you would get the underlying pixel-buffer -/// surface for a View via View::surface(). -/// -/// When using the GPU renderer, you would get the underlying render target -/// and texture information via View::render_target(). -/// -/// @note The API is not currently thread-safe, all calls must be made on the -/// same thread that the Renderer/App was created on. -/// -class UExport View : public RefCounted { -public: - /// - /// Get the URL of the current page loaded into this View, if any. - /// - virtual String url() = 0; - - /// - /// Get the title of the current page loaded into this View, if any. - /// - virtual String title() = 0; - - /// - /// Get the width of the View, in pixels. - /// - virtual uint32_t width() const = 0; - - /// - /// Get the height of the View, in pixels. - /// - virtual uint32_t height() const = 0; - - /// - /// Check if the main frame of the page is currently loading. - /// - virtual bool is_loading() = 0; - - /// - /// Get the offscreen RenderTarget for the View. - /// - /// @note Only valid when the GPU renderer is enabled in Config. - /// - /// You can use this with your GPUDriver implementation to bind - /// and display the corresponding texture in your application. - /// - virtual RenderTarget render_target() = 0; - - /// - /// Get the offscreen Surface for the View (pixel-buffer container). - /// - /// @note Only valid when the CPU is enabled (will return a nullptr - /// otherwise) - /// - /// The default Surface is BitmapSurface but you can provide your - /// own Surface implementation via Platform::set_surface_factory. - /// - virtual Surface* surface() = 0; - - /// - /// Load a raw string of HTML, the View will navigate to it as a new page. - /// - /// @param html The raw HTML string to load. - /// - /// @param url An optional URL for this load (to make it appear as if we - /// we loaded this HTML from a certain URL). Can be used for - /// resolving relative URLs and cross-origin rules. - /// - /// @param add_to_history Whether or not this load should be added to the - /// session's history (back/forward list). - /// - virtual void LoadHTML(const String& html, - const String& url = "", - bool add_to_history = false) = 0; - - /// - /// Load a URL, the View will navigate to it as a new page. - /// - /// @note You can use File URLs (eg, file:///page.html) but you must define - /// your own FileSystem implementation if you are not using AppCore. - /// @see Platform::set_file_system - /// - virtual void LoadURL(const String& url) = 0; - - /// - /// Resize View to a certain size. - /// - /// @param width The initial width, in pixels. - /// - /// @param height The initial height, in pixels. - /// - /// - virtual void Resize(uint32_t width, uint32_t height) = 0; - - /// - /// Acquire the page's JSContext for use with the JavaScriptCore API - /// - /// @note You can use the underlying JSContextRef with the JavaScriptCore - /// C API. This allows you to marshall C/C++ objects to/from - /// JavaScript, bind callbacks, and call JS functions directly. - /// - /// @note The JSContextRef gets reset after each page navigation. You - /// should initialize your JavaScript state within the - /// OnWindowObjectReady and OnDOMReady events, @see ViewListener. - /// - /// @note This call locks the internal context for the current thread. - /// It will be unlocked when the returned JSContext's ref-count goes - /// to zero. The lock is recursive, you can call this multiple times. - /// - virtual Ref LockJSContext() = 0; - - /// - /// Helper function to evaluate a raw string of JavaScript and return the - /// result as a String. - /// - /// @param script A string of JavaScript to evaluate in the main frame. - /// - /// @param exception A string to store the exception in, if any. Pass a - /// nullptr if you don't care about exceptions. - /// - /// @return Returns the JavaScript result typecast to a String. - /// - /// - /// @note You do not need to lock the JS context, it is done automatically. - /// - /// @note If you need lower-level access to native JavaScript values, you - /// should instead lock the JS context and call JSEvaluateScript() in - /// the JavaScriptCore C API. @see - /// - virtual String EvaluateScript(const String& script, String* exception = nullptr) = 0; - - /// - /// Whether or not we can navigate backwards in history - /// - virtual bool CanGoBack() = 0; - - /// - /// Whether or not we can navigate forwards in history - /// - virtual bool CanGoForward() = 0; - - /// - /// Navigate backwards in history - /// - virtual void GoBack() = 0; - - /// - /// Navigate forwards in history - /// - virtual void GoForward() = 0; - - /// - /// Navigate to an arbitrary offset in history - /// - virtual void GoToHistoryOffset(int offset) = 0; - - /// - /// Reload current page - /// - virtual void Reload() = 0; - - /// - /// Stop all page loads - /// - virtual void Stop() = 0; - - /// - /// Give focus to the View. - /// - /// You should call this to give visual indication that the View has input - /// focus (changes active text selection colors, for example). - /// - virtual void Focus() = 0; - - /// - /// Remove focus from the View and unfocus any focused input elements. - /// - /// You should call this to give visual indication that the View has lost - /// input focus. - /// - virtual void Unfocus() = 0; - - /// - /// Whether or not the View has focus. - /// - virtual bool HasFocus() = 0; - - /// - /// Whether or not the View has an input element with visible keyboard focus - /// (indicated by a blinking caret). - /// - /// You can use this to decide whether or not the View should consume - /// keyboard input events (useful in games with mixed UI and key handling). - /// - virtual bool HasInputFocus() = 0; - - /// - /// Fire a keyboard event - /// - /// @note Only 'Char' events actually generate text in input fields. - /// - virtual void FireKeyEvent(const KeyEvent& evt) = 0; - - /// - /// Fire a mouse event - /// - virtual void FireMouseEvent(const MouseEvent& evt) = 0; - - /// - /// Fire a scroll event - /// - virtual void FireScrollEvent(const ScrollEvent& evt) = 0; - - /// - /// Set a ViewListener to receive callbacks for View-related events. - /// - /// @note Ownership remains with the caller. - /// - virtual void set_view_listener(ViewListener* listener) = 0; - - /// - /// Get the active ViewListener, if any - /// - virtual ViewListener* view_listener() const = 0; - - /// - /// Set a LoadListener to receive callbacks for Load-related events. - /// - /// @note Ownership remains with the caller. - /// - virtual void set_load_listener(LoadListener* listener) = 0; - - /// - /// Get the active LoadListener, if any - /// - virtual LoadListener* load_listener() const = 0; - - /// - /// Set whether or not this View should be repainted during the next - /// call to Renderer::Render - /// - /// @note This flag is automatically set whenever the page content changes - /// but you can set it directly in case you need to force a repaint. - /// - virtual void set_needs_paint(bool needs_paint) = 0; - - /// - /// Whether or not this View should be repainted during the next call to - /// Renderer::Render. - /// - virtual bool needs_paint() const = 0; - - /// - /// Get the inspector for this View, this is useful for debugging and - /// inspecting pages locally. This will only succeed if you have the - /// inspector assets in your filesystem-- the inspector will look for - /// file:///inspector/Main.html when it first loads. - /// - /// @note The inspector View is owned by the View and lazily-created on - /// first call. The initial dimensions are 10x10, you should call - /// View::Resize() on the returned View to resize it to your desired - /// dimensions. - /// - virtual RefPtr inspector() = 0; - -protected: - virtual ~View(); -}; - -} // namespace ultralight diff --git a/engine/inc/Ultralight/platform/Clipboard.h b/engine/inc/Ultralight/platform/Clipboard.h deleted file mode 100644 index a5a35cc0..00000000 --- a/engine/inc/Ultralight/platform/Clipboard.h +++ /dev/null @@ -1,51 +0,0 @@ -/// -/// @file Clipboard.h -/// -/// @brief The header for the Clipboard interface. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2020 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include -#include - -namespace ultralight { - -/// -/// @brief Clipboard interface. -/// -/// This is used for reading and writing data to the platform Clipboard. -/// -/// AppCore automatically provides a platform-specific implementation of this -/// that cuts/copies/pastes to the OS clipboard when you call App::Create(). -/// -/// If you are using Renderer::Create() instead, you will need to provide your -/// own implementation of this. @see Platform::set_clipboard(). -/// -class UExport Clipboard { -public: - virtual ~Clipboard(); - - /// - /// Clear the clipboard. - /// - virtual void Clear() = 0; - - /// - /// Read plain text from the clipboard - /// - virtual String16 ReadPlainText() = 0; - - /// - /// Write plain text to the clipboard. - /// - virtual void WritePlainText(const String16& text) = 0; -}; - -} // namespace ultralight diff --git a/engine/inc/Ultralight/platform/Config.h b/engine/inc/Ultralight/platform/Config.h deleted file mode 100644 index b5c2f9a3..00000000 --- a/engine/inc/Ultralight/platform/Config.h +++ /dev/null @@ -1,230 +0,0 @@ -/// -/// @file Config.h -/// -/// @brief The header for the Config struct. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2020 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include -#include - -namespace ultralight { - -/// -/// The winding order for front-facing triangles. (This is only used when the -/// GPU renderer is enabled) -/// -/// @note In most 3D engines, there is the concept that triangles have a -/// a "front" and a "back". All the front-facing triangles (eg, those -/// that are facing the camera) are rendered, and all back-facing -/// triangles are culled (ignored). The winding-order of the triangle's -/// vertices is used to determine which side is front and back. You -/// should tell Ultralight which winding-order your 3D engine uses. -/// -enum FaceWinding { - /// - /// Clockwise Winding (Direct3D, etc.) - /// - kFaceWinding_Clockwise, - - /// - /// Counter-Clockwise Winding (OpenGL, etc.) - /// - kFaceWinding_CounterClockwise, -}; - -enum FontHinting { - /// - /// Lighter hinting algorithm-- glyphs are slightly fuzzier but better - /// resemble their original shape. This is achieved by snapping glyphs to the - /// pixel grid only vertically which better preserves inter-glyph spacing. - /// - kFontHinting_Smooth, - - /// - /// Default hinting algorithm-- offers a good balance between sharpness and - /// shape at smaller font sizes. - /// - kFontHinting_Normal, - - /// - /// Strongest hinting algorithm-- outputs only black/white glyphs. The result - /// is usually unpleasant if the underlying TTF does not contain hints for - /// this type of rendering. - /// - kFontHinting_Monochrome, -}; - -/// -/// @brief Configuration settings for Ultralight. -/// -/// This is intended to be implemented by users and defined before creating the -/// Renderer. @see Platform::set_config. -/// -struct UExport Config { - /// - /// The file path to the directory that contains Ultralight's bundled - /// resources (eg, cacert.pem and other localized resources). - /// - String16 resource_path; - - /// - /// The file path to a writable directory that will be used to store cookies, - /// cached resources, and other persistent data. - /// - String16 cache_path; - - /// - /// When enabled, each View will be rendered to an offscreen GPU texture - /// using the GPU driver set in Platform::set_gpu_driver. You can fetch - /// details for the texture via View::render_target. - /// - /// When disabled (the default), each View will be rendered to an offscreen - /// pixel buffer. This pixel buffer can optionally be provided by the user-- - /// for more info see and View::surface. - /// - bool use_gpu_renderer = false; - - /// - /// The amount that the application DPI has been scaled (200% = 2.0). - /// This should match the device scale set for the current monitor. - /// - /// Note: Device scales are rounded to nearest 1/8th (eg, 0.125). - /// - double device_scale = 1.0; - - /// - /// The winding order for front-facing triangles. @see FaceWinding - /// - /// Note: This is only used when the GPU renderer is enabled. - /// - FaceWinding face_winding = kFaceWinding_CounterClockwise; - - /// - /// Whether or not images should be enabled. - /// - bool enable_images = true; - - /// - /// Whether or not JavaScript should be enabled. - /// - bool enable_javascript = true; - - /// - /// The hinting algorithm to use when rendering fonts. @see FontHinting - /// - FontHinting font_hinting = kFontHinting_Normal; - - /// - /// The gamma to use when compositing font glyphs, change this value to - /// adjust contrast (Adobe and Apple prefer 1.8, others may prefer 2.2). - /// - double font_gamma = 1.8; - - /// - /// Default font-family to use. - /// - String16 font_family_standard = "Times New Roman"; - - /// - /// Default font-family to use for fixed fonts. (pre/code) - /// - String16 font_family_fixed = "Courier New"; - - /// - /// Default font-family to use for serif fonts. - /// - String16 font_family_serif = "Times New Roman"; - - /// - /// Default font-family to use for sans-serif fonts. - /// - String16 font_family_sans_serif = "Arial"; - - /// - /// Default user-agent string. - /// - String16 user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " - "AppleWebKit/608.3.10 (KHTML, like Gecko) " - "Ultralight/1.2.0 Safari/608.3.10"; - - /// - /// Default user stylesheet. You should set this to your own custom CSS - /// string to define default styles for various DOM elements, scrollbars, - /// and platform input widgets. - /// - String16 user_stylesheet; - - /// - /// Whether or not we should continuously repaint any Views or compositor - /// layers, regardless if they are dirty or not. This is mainly used to - /// diagnose painting/shader issues. - /// - bool force_repaint = false; - - /// - /// When a CSS animation is active, the amount of time (in seconds) to wait - /// before triggering another repaint. Default is 60 Hz. - /// - double animation_timer_delay = 1.0 / 60.0; - - /// - /// When a smooth scroll animation is active, the amount of time (in seconds) - /// to wait before triggering another repaint. Default is 60 Hz. - /// - double scroll_timer_delay = 1.0 / 60.0; - - /// - /// The amount of time (in seconds) to wait before running the recycler (will - /// attempt to return excess memory back to the system). - /// - double recycle_delay = 4.0; - - /// - /// Size of WebCore's memory cache in bytes. - /// - /// @note You should increase this if you anticipate handling pages with - /// large resources, Safari typically uses 128+ MiB for its cache. - /// - uint32_t memory_cache_size = 64 * 1024 * 1024; - - /// - /// Number of pages to keep in the cache. Defaults to 0 (none). - /// - /// @note Safari typically caches about 5 pages and maintains an on-disk - /// cache to support typical web-browsing activities. If you increase - /// this, you should probably increase the memory cache size as well. - /// - uint32_t page_cache_size = 0; - - /// - /// JavaScriptCore tries to detect the system's physical RAM size to set - /// reasonable allocation limits. Set this to anything other than 0 to - /// override the detected value. Size is in bytes. - /// - /// This can be used to force JavaScriptCore to be more conservative with - /// its allocation strategy (at the cost of some performance). - /// - uint32_t override_ram_size = 0; - - /// - /// The minimum size of large VM heaps in JavaScriptCore. Set this to a - /// lower value to make these heaps start with a smaller initial value. - /// - uint32_t min_large_heap_size = 32 * 1024 * 1024; - - /// - /// The minimum size of small VM heaps in JavaScriptCore. Set this to a - /// lower value to make these heaps start with a smaller initial value. - /// - uint32_t min_small_heap_size = 1 * 1024 * 1024; -}; - -} // namespace ultralight diff --git a/engine/inc/Ultralight/platform/FileSystem.h b/engine/inc/Ultralight/platform/FileSystem.h deleted file mode 100644 index 19b6d9a2..00000000 --- a/engine/inc/Ultralight/platform/FileSystem.h +++ /dev/null @@ -1,93 +0,0 @@ -/// -/// @file FileSystem.h -/// -/// @brief The header for the FileSystem interface. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2020 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include -#include - -namespace ultralight { - -/// -/// File Handle type used as unique ID for opened files. -/// -#if defined(__WIN32__) || defined(_WIN32) -typedef size_t FileHandle; -#else -typedef int FileHandle; -#endif - -/// -/// Handle used to denote an invalid file. -/// -const FileHandle invalidFileHandle = (FileHandle)-1; - -/// -/// @brief FileSystem interface. -/// -/// This is used for loading File URLs (eg, ). -/// -/// You can provide the library with your own FileSystem implementation so that -/// file assets are loaded from your own pipeline (useful if you would like -/// to encrypt/compress your file assets or ship it in a custom format). -/// -/// AppCore automatically provides a platform-specific implementation of this -/// that loads files from a local directory when you call App::Create(). -/// -/// If you are using Renderer::Create() instead, you will need to provide your -/// own implementation via `Platform::instance().set_file_system(). For -/// convenience, you can still use AppCore's file system implementation-- -/// see the helper functions defined in . -/// -/// To provide your own custom FileSystem implementation, you should inherit -/// from this class, handle the virtual member functions, and then pass an -/// instance of your class to `Platform::instance().set_file_system()` before -/// calling Renderer::Create() or App::Create(). -/// -class UExport FileSystem { -public: - virtual ~FileSystem(); - - /// - /// Check if file path exists, return true if exists. - /// - virtual bool FileExists(const String16& path) = 0; - - /// - /// Get file size of previously opened file, store result in 'result'. Return true on success. - /// - virtual bool GetFileSize(FileHandle handle, int64_t& result) = 0; - - /// - /// Get file mime type (eg "text/html"), store result in 'result'. Return true on success. - /// - virtual bool GetFileMimeType(const String16& path, String16& result) = 0; - - /// - /// Open file path for reading or writing. Return file handle on success, or invalidFileHandle on failure. - /// - /// @NOTE: As of this writing (v1.2), this function is only used for reading. - /// - virtual FileHandle OpenFile(const String16& path, bool open_for_writing) = 0; - - /// - /// Close previously-opened file. - /// - virtual void CloseFile(FileHandle& handle) = 0; - - /// - /// Read from currently-opened file, return number of bytes read or -1 on failure. - /// - virtual int64_t ReadFromFile(FileHandle handle, char* data, int64_t length) = 0; -}; - -} // namespace ultralight diff --git a/engine/inc/Ultralight/platform/FontLoader.h b/engine/inc/Ultralight/platform/FontLoader.h deleted file mode 100644 index ccda81d9..00000000 --- a/engine/inc/Ultralight/platform/FontLoader.h +++ /dev/null @@ -1,132 +0,0 @@ -/// -/// @file FontLoader.h -/// -/// @brief The header for the FontLoader interface. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2020 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include -#include -#include - -namespace ultralight { - -/// -/// Represents a font file, either on-disk path or in-memory file contents. -/// -class UExport FontFile : public RefCounted { -public: - /// - /// Create a font file from an on-disk file path. - /// - /// @note The file path should already exist. - /// - static Ref Create(const String16& filepath); - - /// - /// Create a font file from an in-memory buffer. - /// - static Ref Create(Ref buffer); - - /// - /// Whether or not this font file was created from an in-memory buffer. - /// - virtual bool is_in_memory() const = 0; - - /// - /// The file path (if any). - /// - virtual String16 filepath() const = 0; - - /// - /// The in-memory buffer (if any). - /// - virtual RefPtr buffer() const = 0; - - /// - /// Unique hash (if this is a filepath, only the path string is hashed). - /// - virtual uint32_t hash() const = 0; - -protected: - FontFile(); - virtual ~FontFile(); - FontFile(const FontFile&); - void operator=(const FontFile&); -}; - -/// -/// @brief Font Loader interface, used for all font lookup operations. -/// -/// Every operating system has its own library of installed system fonts. The -/// FontLoader interface is used to lookup these fonts and fetch the actual -/// font data (raw TTF/OTF file data) for a given a certain font description. -/// -/// AppCore automatically provides a platform-specific implementation of this -/// that loads installed fonts from the OS when you call App::Create(). -/// -/// If you are using Renderer::Create() instead, you will need to provide your -/// own implementation via `Platform::instance().set_font_loader(). For -/// convenience, you can still use AppCore's font loader implementation-- -/// see the helper functions defined in . -/// -/// To provide your own custom FontLoader implementation, you should inherit -/// from this class, handle the virtual member functions, and then pass an -/// instance of your class to `Platform::instance().set_font_loader()` before -/// calling Renderer::Create() or App::Create(). -/// -class UExport FontLoader { -public: - virtual ~FontLoader(); - - /// - /// Fallback font family name. Will be used if all other fonts fail to load. - /// - /// @note This font should be guaranteed to exist (eg, FontLoader::Load - /// won't fail when passed this font family name). - /// - virtual String16 fallback_font() const = 0; - - /// - /// Fallback font family name that can render the specified characters. This - /// is mainly used to support CJK (Chinese, Japanese, Korean) text display. - /// - /// @param characters One or more UTF-16 characters. This is almost always - /// a single character. - /// - /// @param weight Font weight. - /// - /// @param italic Whether or not italic is requested. - /// - /// @return Should return a font family name that can render the text. - /// - virtual String16 fallback_font_for_characters(const String16& characters, - int weight, - bool italic) const = 0; - - /// - /// Get the actual font file data (TTF/OTF) for a given font description. - /// - /// @param family Font family name. - /// - /// @param weight Font weight. - /// - /// @param italic Whether or not italic is requested. - /// - /// @return A font file matching the given description (either an on-disk - /// font filepath or an in-memory file contents). You can return - /// NULL here and the loader will fallback to another font. - /// - virtual RefPtr Load(const String16& family, - int weight, - bool italic) = 0; -}; - -} // namespace ultralight diff --git a/engine/inc/Ultralight/platform/GPUDriver.h b/engine/inc/Ultralight/platform/GPUDriver.h deleted file mode 100644 index 902f8925..00000000 --- a/engine/inc/Ultralight/platform/GPUDriver.h +++ /dev/null @@ -1,288 +0,0 @@ -/// -/// @file GPUDriver.h -/// -/// @brief The header for the GPUDriver interface. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2020 Ultralight, Inc. All rights reserved. -/// -#pragma once -#pragma warning(disable: 4251) -#include -#include -#include -#include - -namespace ultralight { - -/// -/// @note This pragma pack(push, 1) command is important! Vertex layouts -/// should not be padded with any bytes. -/// -#pragma pack(push, 1) - -/// -/// RenderBuffer description, @see GPUDriver::CreateRenderBuffer. -/// -struct UExport RenderBuffer { - uint32_t texture_id; // The backing texture for this RenderBuffer - uint32_t width; // The width of the RenderBuffer texture - uint32_t height; // The height of the RenderBuffer texture - bool has_stencil_buffer; // Currently unused, always false. - bool has_depth_buffer; // Currently unsued, always false. -}; - -/// -/// Vertex layout for path vertices, useful for synthesizing or modifying -/// vertex data. -/// -struct Vertex_2f_4ub_2f { - float pos[2]; - unsigned char color[4]; - float obj[2]; -}; - -/// -/// Vertex layout for quad vertices, useful for synthesizing or modifying -/// vertex data. -/// -struct Vertex_2f_4ub_2f_2f_28f { - float pos[2]; - unsigned char color[4]; - float tex[2]; - float obj[2]; - float data0[4]; - float data1[4]; - float data2[4]; - float data3[4]; - float data4[4]; - float data5[4]; - float data6[4]; -}; - -/// -/// Vertex formats -/// -enum UExport VertexBufferFormat { - kVertexBufferFormat_2f_4ub_2f, - kVertexBufferFormat_2f_4ub_2f_2f_28f, -}; - -/// -/// Vertex buffer, @see GPUDriver::CreateGeometry -/// -struct UExport VertexBuffer { - VertexBufferFormat format; - uint32_t size; - uint8_t* data; -}; - -/// -/// Vertex index type -/// -typedef uint32_t IndexType; - -/// -/// Vertex index buffer, @see GPUDriver::CreateGeometry -/// -struct UExport IndexBuffer { - uint32_t size; - uint8_t* data; -}; - -/// -/// Shader types, used by GPUState::shader_type -/// -/// Each of these correspond to a vertex/pixel shader pair. You can find -/// stock shader code for these in the `shaders` folder of the AppCore repo. -/// -enum UExport ShaderType { - kShaderType_Fill, // Shader program for quad geometry - kShaderType_FillPath, // Shader program for path geometry -}; - -/// -/// GPU state description. -/// -struct UExport GPUState { - /// Viewport width in pixels - uint32_t viewport_width; - - /// Viewport height in pixels - uint32_t viewport_height; - - /// Transform matrix-- you should multiply this with the screen-space - /// orthographic projection matrix then pass to the vertex shader. - Matrix4x4 transform; - - /// Whether or not we should enable texturing for the current draw command. - bool enable_texturing; - - /// Whether or not we should enable blending for the current draw command. - /// If blending is disabled, any drawn pixels should overwrite existing. - /// Mainly used so we can modify alpha values of the RenderBuffer during - /// scissored clears. - bool enable_blend; - - /// The vertex/pixel shader program pair to use for the current draw command. - /// You should cast this to ShaderType to get the corresponding enum. - uint8_t shader_type; - - /// The render buffer to use for the current draw command. - uint32_t render_buffer_id; - - /// The texture id to bind to slot #1. (Will be 0 if none) - uint32_t texture_1_id; - - /// The texture id to bind to slot #2. (Will be 0 if none) - uint32_t texture_2_id; - - /// The texture id to bind to slot #3. (Will be 0 if none) - uint32_t texture_3_id; - - /// The following four members are passed to the pixel shader via uniforms. - float uniform_scalar[8]; - vec4 uniform_vector[8]; - uint8_t clip_size; - Matrix4x4 clip[8]; - - /// Whether or not scissor testing should be used for the current draw command. - bool enable_scissor; - - /// The scissor rect to use for scissor testing (units in pixels) - IntRect scissor_rect; -}; - -/// -/// Command types, used by Command::command_type -/// -enum UExport CommandType { - kCommandType_ClearRenderBuffer, - kCommandType_DrawGeometry, -}; - -/// -/// Command description. -/// -struct UExport Command { - uint8_t command_type; // The type of command to dispatch. - GPUState gpu_state; // GPU state parameters for current command. - - /// The following members are only used with kCommandType_DrawGeometry - uint32_t geometry_id; // The geometry ID to bind - uint32_t indices_count; // The number of indices - uint32_t indices_offset; // The index to start from -}; - -/// -/// Command list, @see GPUDriver::UpdateCommandList -/// -struct UExport CommandList { - uint32_t size; - Command* commands; -}; - -#pragma pack(pop) - -/// -/// @brief GPUDriver interface, dispatches GPU calls to the native driver. -/// -/// This is automatically provided for you when you use App::Create(), AppCore -/// provides platform-specific implementations of GPUDriver for each OS. -/// -/// If you are using Renderer::Create(), you will need to provide your own -/// implementation of this class if you have enabled the GPU renderer in the -/// Config. @see Platform::set_gpu_driver -/// -class UExport GPUDriver { -public: - virtual ~GPUDriver(); - - /// - /// Called before any commands are dispatched during a frame. - /// - virtual void BeginSynchronize() = 0; - - /// - /// Called after any commands are dispatched during a frame. - /// - virtual void EndSynchronize() = 0; - - /// - /// Get the next available texture ID. - /// - virtual uint32_t NextTextureId() = 0; - - /// - /// Create a texture with a certain ID and optional bitmap. - /// - /// **NOTE**: If the Bitmap is empty (Bitmap::IsEmpty), then a RTT Texture - /// should be created instead. This will be used as a backing - /// texture for a new RenderBuffer. - /// - virtual void CreateTexture(uint32_t texture_id, - Ref bitmap) = 0; - - /// - /// Update an existing non-RTT texture with new bitmap data. - /// - virtual void UpdateTexture(uint32_t texture_id, - Ref bitmap) = 0; - - /// - /// Destroy a texture. - /// - virtual void DestroyTexture(uint32_t texture_id) = 0; - - /// - /// Generate the next available render buffer ID. - /// - virtual uint32_t NextRenderBufferId() = 0; - - /// - /// Create a render buffer with certain ID and buffer description. - /// - virtual void CreateRenderBuffer(uint32_t render_buffer_id, - const RenderBuffer& buffer) = 0; - - /// - /// Destroy a render buffer - /// - virtual void DestroyRenderBuffer(uint32_t render_buffer_id) = 0; - - /// - /// Generate the next available geometry ID. - /// - virtual uint32_t NextGeometryId() = 0; - - /// - /// Create geometry with certain ID and vertex/index data. - /// - virtual void CreateGeometry(uint32_t geometry_id, - const VertexBuffer& vertices, - const IndexBuffer& indices) = 0; - - /// - /// Update existing geometry with new vertex/index data. - /// - virtual void UpdateGeometry(uint32_t geometry_id, - const VertexBuffer& vertices, - const IndexBuffer& indices) = 0; - - /// - /// Destroy geometry. - /// - virtual void DestroyGeometry(uint32_t geometry_id) = 0; - - /// - /// Update command list (you should copy the commands to your own structure). - /// - virtual void UpdateCommandList(const CommandList& list) = 0; -}; - -} // namespace ultralight diff --git a/engine/inc/Ultralight/platform/Logger.h b/engine/inc/Ultralight/platform/Logger.h deleted file mode 100644 index 4aa0603e..00000000 --- a/engine/inc/Ultralight/platform/Logger.h +++ /dev/null @@ -1,47 +0,0 @@ -/// -/// @file Logger.h -/// -/// @brief The header for the Logger interface. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2020 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include -#include - -namespace ultralight { - -/// -/// Log levels, used with Logger::LogMessage -/// -enum LogLevel { - kLogLevel_Error = 0, - kLogLevel_Warning, - kLogLevel_Info -}; - -/// -/// @brief Logger interface. -/// -/// This can be used to log debug messages to the console or to a log file. -/// -/// This is intended to be implemented by users and defined before creating the -/// Renderer. @see Platform::set_file_system. -/// -class UExport Logger { -public: - virtual ~Logger(); - - /// - /// Called when the library wants to print a message to the log. - /// - virtual void LogMessage(LogLevel log_level, const String16& message) = 0; -}; - -} // namespace ultralight diff --git a/engine/inc/Ultralight/platform/Platform.h b/engine/inc/Ultralight/platform/Platform.h deleted file mode 100644 index ad92ba9e..00000000 --- a/engine/inc/Ultralight/platform/Platform.h +++ /dev/null @@ -1,141 +0,0 @@ -/// -/// @file Platform.h -/// -/// @brief The header for the Platform singleton. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2020 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include - -namespace ultralight { - -struct Config; -class Logger; -class GPUDriver; -class FontLoader; -class FileSystem; -class Clipboard; -class SurfaceFactory; - -/// -/// @brief Platform singleton to configure Ultralight and provide user-defined -/// implementations for various platform operations. -/// -/// @note All of these settings and user-defined interfaces should be set -/// BEFORE creating the Renderer. -/// -class UExport Platform { - public: - /// - /// Get the Platform singleton - /// - static Platform& instance(); - - virtual ~Platform(); - - /// - /// Set the Config - /// - virtual void set_config(const Config& config) = 0; - - /// - /// Get the Config - /// - virtual const Config& config() const = 0; - - /// - /// Set the Logger (to handle error messages and debug output). - /// - /// @param logger A user-defined Logger implementation, ownership remains - /// with the caller. - /// - virtual void set_logger(Logger* logger) = 0; - - /// - /// Get the Logger - /// - virtual Logger* logger() const = 0; - - /// - /// Set the GPU Driver (will handle all rendering) - /// - /// @param gpu_driver A user-defined GPUDriver implementation, ownership - /// remains with the caller. - /// - virtual void set_gpu_driver(GPUDriver* gpu_driver) = 0; - - /// - /// Get the GPU Driver - /// - virtual GPUDriver* gpu_driver() const = 0; - - /// - /// Set the Font Loader (will be used to map font families to actual fonts) - /// - /// @param font_loader A user-defined FontLoader implementation, ownership - /// remains with the caller. - /// - virtual void set_font_loader(FontLoader* font_loader) = 0; - - /// - /// Get the Font Loader - /// - virtual FontLoader* font_loader() const = 0; - - /// - /// Set the File System (will be used for all file system operations) - /// - /// @param file_system A user-defined FileSystem implementation, ownership - /// remains with the caller. - /// - virtual void set_file_system(FileSystem* file_system) = 0; - - /// - /// Get the File System - /// - virtual FileSystem* file_system() const = 0; - - /// - /// Set the Clipboard (will be used for all clipboard operations) - /// - /// @param clipboard A user-defined Clipboard implementation, ownership - /// remains with the caller. - /// - virtual void set_clipboard(Clipboard* clipboard) = 0; - - /// - /// Get the Clipboard - /// - virtual Clipboard* clipboard() const = 0; - - /// - /// Set the SurfaceFactory - /// - /// This can be used to provide a platform-specific bitmap surface for View - /// to paint into when the CPU renderer is enabled. See View::surface(). - /// - /// @param surface_factory A user-defined SurfaceFactory implementation, - /// ownership remains with the caller. - /// - /// @note A default BitmapSurfaceFactory is defined if you never call this, - /// View::surface() can be safely cast to BitmapSurface. - /// - virtual void set_surface_factory(SurfaceFactory* surface_factory) = 0; - - /// - /// Get the SurfaceFactory - /// - /// @note A default BitmapSurfaceFactory is set by default, View::surface() - /// can be safely cast to BitmapSurface if you don't define your own. - /// - virtual SurfaceFactory* surface_factory() const = 0; -}; - -} // namespace ultralight diff --git a/engine/inc/Ultralight/platform/Surface.h b/engine/inc/Ultralight/platform/Surface.h deleted file mode 100644 index 6d2af244..00000000 --- a/engine/inc/Ultralight/platform/Surface.h +++ /dev/null @@ -1,191 +0,0 @@ -/// -/// @file Surface.h -/// -/// @brief The header for the Surface and SurfaceFactory interfaces. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2020 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include -#include -#include -#include - -namespace ultralight { - -/// -/// Offscreen pixel buffer surface. (Premultiplied BGRA 32-bit format) -/// -/// When using the CPU renderer, each View is painted to its own Surface. -/// -/// You can provide your own Surface implementation to make the renderer -/// paint directly to a block of memory controlled by you (this is useful for -/// lower-latency uploads to GPU memory or other platform-specific bitmaps). -/// -/// A default Surface implementation, BitmapSurface, is automatically -/// provided by the library when you call Renderer::Create() without defining -/// a custom SurfaceFactory. -/// -/// To provide your own custom Surface implementation, you should inherit -/// from this class, handle the virtual member functions, and then define a -/// custom SurfaceFactory that creates/destroys an instance of your class. -/// After that, you should pass an instance of your custom SurfaceFactory class -/// to `Platform::instance().set_font_loader()` before calling App::Create() -/// or Renderer::Create(). -/// -class UExport Surface { -public: - virtual ~Surface(); - - /// - /// Width (in pixels). - /// - virtual uint32_t width() const = 0; - - /// - /// Height (in pixels). - /// - virtual uint32_t height() const = 0; - - /// - /// Number of bytes between rows (usually width * 4) - /// - virtual uint32_t row_bytes() const = 0; - - /// - /// Size in bytes. - /// - virtual size_t size() const = 0; - - /// - /// Lock the pixel buffer and get a pointer to the beginning of the data - /// for reading/writing. - /// - /// Native pixel format is premultiplied BGRA 32-bit (8 bits per channel). - /// - virtual void* LockPixels() = 0; - - /// - /// Unlock the pixel buffer. - /// - virtual void UnlockPixels() = 0; - - /// - /// Resize the pixel buffer to a certain width and height (both in pixels). - /// - /// This should never be called while pixels are locked. - /// - virtual void Resize(uint32_t width, uint32_t height) = 0; - - /// - /// Set the dirty bounds to a certain value. - /// - /// This is called after the Renderer paints to an area of the pixel buffer. - /// (The new value will be joined with the existing dirty_bounds()) - /// - virtual void set_dirty_bounds(const IntRect& bounds); - - /// - /// Get the dirty bounds. - /// - /// This value can be used to determine which portion of the pixel buffer has - /// been updated since the last call to ClearDirtyBounds(). - /// - /// The general algorithm to determine if a Surface needs display is: - ///
-  ///   if (!surface.dirty_bounds().IsEmpty()) {
-  ///       // Surface pixels are dirty and needs display.
-  ///       // Cast Surface to native Surface and use it here (pseudo code)
-  ///       DisplaySurface(surface);
-  ///
-  ///       // Once you're done, clear the dirty bounds:
-  ///       surface.ClearDirtyBounds();
-  ///  }
-  ///  
- /// - virtual IntRect dirty_bounds() const; - - /// - /// Clear the dirty bounds. - /// - /// You should call this after you're done displaying the Surface. - /// - virtual void ClearDirtyBounds(); - -protected: - Surface(); - - IntRect dirty_bounds_; -}; - -/// -/// SurfaceFactory can be used to provide your own native Surface implementation. -/// -/// This can be used to wrap a platform-specific GPU texture, Windows DIB, -/// macOS CGImage, or any other pixel buffer target for display on screen. -/// -/// The default factory creates/destroys a BitmapSurface but you can override -/// this by providing your own factory to Platform::set_surface_factory. -/// -class UExport SurfaceFactory { -public: - virtual ~SurfaceFactory(); - - /// - /// Create a native Surface with a certain width and height (in pixels). - /// - virtual Surface* CreateSurface(uint32_t width, uint32_t height) = 0; - - /// - /// Destroy a native Surface previously created by CreateSurface(). - /// - virtual void DestroySurface(Surface* surface) = 0; -}; - -/// -/// The default Surface implementation, backed by a Bitmap. -/// -class UExport BitmapSurface : public Surface { -public: - virtual uint32_t width() const override; - - virtual uint32_t height() const override; - - virtual uint32_t row_bytes() const override; - - virtual size_t size() const override; - - virtual void* LockPixels() override; - - virtual void UnlockPixels() override; - - virtual void Resize(uint32_t width, uint32_t height) override; - - /// - /// Get the underlying Bitmap. - /// - RefPtr bitmap(); - -protected: - BitmapSurface(uint32_t width, uint32_t height); - virtual ~BitmapSurface(); - BitmapSurface(const BitmapSurface&) = delete; - void operator=(const BitmapSurface&) = delete; - friend class BitmapSurfaceFactory; - - void* impl_; -}; - -/// -/// Get the default Bitmap Surface Factory singleton. (Do not destroy this, -/// this singleton is owned by the library). -/// -UExport SurfaceFactory* GetBitmapSurfaceFactory(); - -} // namespace ultralight diff --git a/engine/inc/Ultralight/private/PlatformFileSystem.h b/engine/inc/Ultralight/private/PlatformFileSystem.h deleted file mode 100644 index 9b5a98a3..00000000 --- a/engine/inc/Ultralight/private/PlatformFileSystem.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once -#include -#include - -namespace ultralight { -namespace PlatformFileSystem { - -bool UExport FileExists(const String& path); -bool UExport IsDirectory(const String& path, bool follow_symbolic_links); -String UExport AppendPath(const String& path, const String& component); -bool UExport MakeAllDirectories(const String& path); -String UExport GetFileName(const String& path); -String UExport GetDirectoryName(const String& path); -String UExport RealFilePath(const String& path); - -} // PlatformFileSystem -} // ultralight diff --git a/engine/inc/binpack2d/binpack2d.hpp b/engine/inc/binpack2d/binpack2d.hpp deleted file mode 100644 index c79c05a3..00000000 --- a/engine/inc/binpack2d/binpack2d.hpp +++ /dev/null @@ -1,595 +0,0 @@ -/** - * BinPack2D is a 2 dimensional, multi-bin, bin-packer. ( Texture Atlas Array! ) - * It supports an arbitrary number of bins, at arbitrary sizes. - * rectangles can be added one at a time, chunks at a time, or all at once. - * rectangles that dont fit are reported back. - * Data can be associated to rectangles before processing via a template, and recalled after processing. - * - * There is no documentation, See ExampleProgram() below for a taste. - * - * Instead of tracking 'free rectangles' like other solutions I've found online, - * this algorithm tracks free 'top lefts', keeps them sorted by closest to origin, and puts new rectangles into - * the first free top left that doesnt collide. Consuming a top left creates 2 new top lefts (x+w,y) and (x,y+h). - * If a rectangle doesnt fit into a bin, before condisering the next bin, the current bin is re-tried with the rectangle rotated. - * This SOMTIMES helps... but not always.. i might disable this in future !? - * - * This Header was origonally part of my rh_texture_packer program. - * A program I wrote to take advantage of my nexus-7's GL_EXT_texture_array extension. - * I wanted to be able to render out whole scenes with a single glDraw* - * blah blah blah... - */ - - -/** ***** EXAMPLE CODE ************************************** - - // Your data - whatever you want to associate with 'rectangle' - class MyContent { - public: - std::string str; - MyContent() : str("default string") {} - MyContent(const std::string &str) : str(str) {} - }; - - int ExampleProgram() { - - srandom(0x69); - - // Create some 'content' to work on. - BinPack2D::ContentAccumulator inputContent; - - for(int i=0;i<20;i++) { - - // random size for this content - int width = ((random() % 32)+1) * ((random() % 10)+1); - int height = ((random() % 32)+1) * ((random() % 10)+1); - - // whatever data you want to associate with this content - std::stringstream ss; - ss << "box " << i; - MyContent mycontent( ss.str().c_str() ); - - // Add it - inputContent += BinPack2D::Content(mycontent, BinPack2D::Coord(), BinPack2D::Size(width, height), false ); - } - - // Sort the input content by size... usually packs better. - inputContent.Sort(); - - // Create some bins! ( 2 bins, 128x128 in this example ) - BinPack2D::CanvasArray canvasArray = - BinPack2D::UniformCanvasArrayBuilder(128,128,2).Build(); - - // A place to store content that didnt fit into the canvas array. - BinPack2D::ContentAccumulator remainder; - - // try to pack content into the bins. - bool success = canvasArray.Place( inputContent, remainder ); - - // A place to store packed content. - BinPack2D::ContentAccumulator outputContent; - - // Read all placed content. - canvasArray.CollectContent( outputContent ); - - // parse output. - typedef BinPack2D::Content::Vector::iterator binpack2d_iterator; - printf("PLACED:\n"); - for( binpack2d_iterator itor = outputContent.Get().begin(); itor != outputContent.Get().end(); itor++ ) { - - const BinPack2D::Content &content = *itor; - - // retreive your data. - const MyContent &myContent = content.content; - - printf("\t%9s of size %3dx%3d at position %3d,%3d,%2d rotated=%s\n", - myContent.str.c_str(), - content.size.w, - content.size.h, - content.coord.x, - content.coord.y, - content.coord.z, - (content.rotated ? "yes":" no")); - } - - printf("NOT PLACED:\n"); - for( binpack2d_iterator itor = remainder.Get().begin(); itor != remainder.Get().end(); itor++ ) { - - const BinPack2D::Content &content = *itor; - - const MyContent &myContent = content.content; - - printf("\t%9s of size %3dx%3d\n", - myContent.str.c_str(), - content.size.w, - content.size.h); - } - - exit(0); -} -*/ - - - -#pragma once - -#include -#include -#include -#include -#include -#include - -namespace BinPack2D { - -class Size { - -public: - - /*const*/ int w; - /*const*/ int h; - - Size(int w, int h) - : w(w), - h(h) - {} - - bool operator < ( const Size &that ) const { - - if(this->w != that.w) return this->w < that.w; - if(this->h != that.h) return this->h < that.h; - return false; - } -}; - -class Coord { - -public: - - typedef std::vector Vector; - typedef std::list List; - - /*const*/ int x; - /*const*/ int y; - /*const*/ int z; - - Coord() - : x(0), - y(0), - z(0) - {} - - Coord(int x, int y) - : x(x), - y(y), - z(0) - {} - - Coord(int x, int y, int z) - : x(x), - y(y), - z(z) - {} - - bool operator < ( const Coord &that ) const { - - if(this->x != that.x) return this->x < that.x; - if(this->y != that.y) return this->y < that.y; - if(this->z != that.z) return this->z < that.z; - return false; - } -}; - -template class Content { - -public: - - typedef std::vector > Vector; - - /*const*/ bool rotated; - /*const*/ Coord coord; - /*const*/ Size size; - /*const*/ _T content; - - Content( const Content<_T> &src ) - : rotated(src.rotated), - coord(src.coord), - size(src.size), - content(src.content) - {} - - Content( const _T &content, const Coord &coord, const Size &size, bool rotated ) - : - content(content), - coord(coord), - size(size), - rotated(rotated) - {} - - void Rotate() { - - rotated = !rotated; - size = Size( size.h, size.w ); - } - - bool intersects(const Content<_T> &that) const { - - if(this->coord.x >= (that.coord.x + that.size.w)) - return false; - - if(this->coord.y >= (that.coord.y + that.size.h)) - return false; - - if(that.coord.x >= (this->coord.x + this->size.w)) - return false; - - if(that.coord.y >= (this->coord.y + this->size.h)) - return false; - - return true; - } -}; - -template class Canvas { - - Coord::List topLefts; - typename Content<_T>::Vector contentVector; - - bool needToSort; - -public: - - typedef Canvas<_T> CanvasT; - typedef typename std::vector Vector; - - static bool Place( Vector &canvasVector, const typename Content<_T>::Vector &contentVector, typename Content<_T>::Vector &remainder ) { - - typename Content<_T>::Vector todo = contentVector; - - for( typename Vector::iterator itor = canvasVector.begin(); itor != canvasVector.end(); itor++ ) { - - Canvas <_T> &canvas = *itor; - - remainder.clear(); - canvas.Place(todo, remainder); - todo = remainder; - } - - if(remainder.size()==0) - return true; - - return false; - } - - static bool Place( Vector &canvasVector, const typename Content<_T>::Vector &contentVector ) { - - typename Content<_T>::Vector remainder; - - return Place( canvasVector, contentVector, remainder ); - } - - static bool Place( Vector &canvasVector, const Content<_T> &content ) { - - typename Content<_T>::Vector contentVector(1, content); - - return Place( canvasVector, contentVector ); - } - - const int w; - const int h; - - Canvas(int w, int h) - : needToSort(false), - w(w), - h(h) - { - topLefts.push_back( Coord(0,0) ); - } - - bool HasContent() const { - - return ( contentVector.size() > 0) ; - } - - const typename Content<_T>::Vector &GetContents( ) const { - - return contentVector; - } - - bool operator < ( const Canvas &that ) const { - - if(this->w != that.w) return this->w < that.w; - if(this->h != that.h) return this->h < that.h; - return false; - } - - bool Place(const typename Content<_T>::Vector &contentVector, typename Content<_T>::Vector &remainder) { - - bool placedAll = true; - - for( typename Content<_T>::Vector::const_iterator itor = contentVector.begin(); itor != contentVector.end(); itor++ ) { - - const Content<_T> & content = *itor; - - if( Place( content ) == false ) { - - placedAll = false; - remainder.push_back( content ); - } - } - - return placedAll; - } - - bool Place(Content<_T> content) { - - Sort(); - - for( Coord::List::iterator itor = topLefts.begin(); itor != topLefts.end(); itor++ ) { - - content.coord = *itor; - - if( Fits( content ) ) { - - Use( content ); - topLefts.erase( itor ); - return true; - } - } - - // EXPERIMENTAL - TRY ROTATED? - content.Rotate(); - for( Coord::List::iterator itor = topLefts.begin(); itor != topLefts.end(); itor++ ) { - - content.coord = *itor; - - if( Fits( content ) ) { - - Use( content ); - topLefts.erase( itor ); - return true; - } - } - //////////////////////////////// - - - return false; - } - -private: - - bool Fits( const Content<_T> &content ) const { - - if( (content.coord.x + content.size.w) > w ) - return false; - - if( (content.coord.y + content.size.h) > h ) - return false; - - for( typename Content<_T>::Vector::const_iterator itor = contentVector.begin(); itor != contentVector.end(); itor++ ) - if( content.intersects( *itor ) ) - return false; - - return true; - } - - bool Use(const Content<_T> &content) { - - const Size &size = content.size; - const Coord &coord = content.coord; - - topLefts.push_front ( Coord( coord.x + size.w, coord.y ) ); - topLefts.push_back ( Coord( coord.x , coord.y + size.h ) ); - - contentVector.push_back( content ); - - needToSort = true; - - return true; - } - -private: - - struct TopToBottomLeftToRightSort { - - bool operator()(const Coord &a, const Coord &b) const { - - return ( a.x * a.x + a.y * a.y ) < ( b.x * b.x + b.y * b.y ); - } - }; - -public: - - void Sort() { - - if(!needToSort) - return; - - topLefts.sort(TopToBottomLeftToRightSort()); - - needToSort = false; - } -}; - -template class ContentAccumulator { - - typename Content<_T>::Vector contentVector; - - -public: - - ContentAccumulator() - {} - - const typename Content<_T>::Vector &Get() const { - - return contentVector; - } - - typename Content<_T>::Vector &Get() { - - return contentVector; - } - - ContentAccumulator<_T>& operator += ( const Content<_T> & content ) { - - contentVector.push_back( content ); - - - return *this; - } - - ContentAccumulator<_T>& operator += ( const typename Content<_T>::Vector & content ) { - - contentVector.insert( contentVector.end(), content.begin(), content.end() ); - - - return *this; - } - - ContentAccumulator<_T> operator + ( const Content<_T> & content ) { - - ContentAccumulator<_T> temp = *this; - - temp += content; - - return temp; - } - - ContentAccumulator<_T> operator + ( const typename Content<_T>::Vector & content ) { - - ContentAccumulator<_T> temp = *this; - - temp += content; - - return temp; - } - - - -private: - - struct GreatestWidthThenGreatestHeightSort { - - bool operator()(const Content<_T> &a, const Content<_T> &b) const { - - const Size &sa = a.size; - const Size &sb = b.size; - -// return( sa.w * sa.h > sb.w * sb.h ); - - if(sa.w != sb.w) - return sa.w > sb.w; - return sa.h > sb.h; - } - }; - - struct MakeHorizontal { - - Content<_T> operator()( const Content<_T> &elem) { - - if(elem.size.h > elem.size.w) - { - Content<_T> r = elem; - - r.size.w = elem.size.h; - r.size.h = elem.size.w; - r.rotated = !elem.rotated; - - return r; - } - - return elem; - } - }; - -public: - - void Sort() { - -// if(allow_rotation) -// std::transform(contentVector.begin(), contentVector.end(), contentVector.begin(), MakeHorizontal()); - - std::sort( contentVector.begin(), contentVector.end(), GreatestWidthThenGreatestHeightSort() ); - } -}; - -template class UniformCanvasArrayBuilder { - - int w; - int h; - int d; - -public: - - UniformCanvasArrayBuilder( int w, int h, int d ) - : w(w), - h(h), - d(d) - {} - - typename Canvas<_T>::Vector Build() { - - return typename Canvas<_T>::Vector(d, Canvas<_T>(w, h) ); - } -}; - -template class CanvasArray { - - typename Canvas<_T>::Vector canvasArray; - -public: - CanvasArray() { - - } - CanvasArray( const typename Canvas<_T>::Vector &canvasArray ) - : canvasArray( canvasArray ) - {} - - bool Place(const typename Content<_T>::Vector &contentVector, typename Content<_T>::Vector &remainder) { - - return Canvas<_T>::Place( canvasArray, contentVector, remainder ); - } - - bool Place(const ContentAccumulator<_T> &content, ContentAccumulator<_T> &remainder) { - - return Place( content.Get(), remainder.Get() ); - } - - bool Place(const typename Content<_T>::Vector &contentVector) { - - return Canvas<_T>::Place( canvasArray, contentVector ); - } - - bool Place(const ContentAccumulator<_T> &content) { - - return Place( content.Get() ); - } - - bool CollectContent( typename Content<_T>::Vector &contentVector ) const { - - int z = 0; - - for( typename Canvas<_T>::Vector::const_iterator itor = canvasArray.begin(); itor != canvasArray.end(); itor++ ) { - - const typename Content<_T>::Vector &contents = itor->GetContents(); - - for( typename Content<_T>::Vector::const_iterator itor = contents.begin(); itor != contents.end(); itor++ ) { - - Content<_T> content = *itor; - - content.coord.z = z; - - contentVector.push_back( content ); - } - z++; - } - return true; - } - - bool CollectContent( ContentAccumulator<_T> &content) const { - - return CollectContent( content.Get() ); - } -}; - -} /*** BinPack2D ***/ \ No newline at end of file diff --git a/engine/inc/bullet/BasicDemo/BasicExample.h b/engine/inc/bullet/BasicDemo/BasicExample.h deleted file mode 100644 index 8fb1aa06..00000000 --- a/engine/inc/bullet/BasicDemo/BasicExample.h +++ /dev/null @@ -1,21 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2015 Google Inc. http://bulletphysics.org - -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 BASIC_EXAMPLE_H -#define BASIC_EXAMPLE_H - -class CommonExampleInterface* BasicExampleCreateFunc(struct CommonExampleOptions& options); - -#endif //BASIC_DEMO_PHYSICS_SETUP_H diff --git a/engine/inc/bullet/Benchmarks/BenchmarkDemo.h b/engine/inc/bullet/Benchmarks/BenchmarkDemo.h deleted file mode 100644 index 3bac4964..00000000 --- a/engine/inc/bullet/Benchmarks/BenchmarkDemo.h +++ /dev/null @@ -1,20 +0,0 @@ -/* -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 BENCHMARK_EXAMPLE_H -#define BENCHMARK_EXAMPLE_H - -class CommonExampleInterface* BenchmarkCreateFunc(struct CommonExampleOptions& options); - -#endif //BENCHMARK_EXAMPLE_H diff --git a/engine/inc/bullet/Benchmarks/HaltonData.h b/engine/inc/bullet/Benchmarks/HaltonData.h deleted file mode 100644 index 1f6c6a44..00000000 --- a/engine/inc/bullet/Benchmarks/HaltonData.h +++ /dev/null @@ -1,647 +0,0 @@ -// Generated by ./Tools/mksrc.py - -// h00 -const int h00_numv = 14; -const float h00_volu = 0.105869; -const float h00_pos[3] = { -0.801161,-0.825905,-0.503586 }; -const float h00_verts[ h00_numv * 3 ] = { - -0.198839,-0.174095,-0.496414, -0.198839,-0.073069,-0.496414, 0.355754,-0.174095,0.317906, 0.266263,0.078525,-0.113353, -0.198839,0.418138,0.148658, -0.198839,0.151957,0.285583, -0.004749,-0.165186,-0.496414, -0.198839,0.342511,-0.068863, -0.198839,-0.174095,0.341490, 0.030157,-0.174095,0.397398, -0.005096,-0.174095,-0.496414, 0.428901,-0.174095,0.139324, -0.198839,0.419530,0.145078, -0.111897,0.386202,0.018538, -}; -// h01 -const int h01_numv = 16; -const float h01_volu = 0.123003; -const float h01_pos[3] = { -0.669502,-0.555335,-0.800913 }; -const float h01_verts[ h01_numv * 3 ] = { - 0.137874,0.266251,0.316069, -0.136407,-0.435756,-0.199087, -0.330498,0.127352,-0.199087, 0.378917,-0.091301,0.019367, 0.437409,0.033623,-0.016334, 0.038469,0.311615,0.180723, -0.330498,-0.343638,-0.199087, 0.193689,-0.157234,0.188948, 0.276656,-0.200503,-0.199087, 0.399981,0.033623,-0.199087, -0.039317,0.311615,-0.199087, -0.330498,0.071941,0.228464, 0.134604,-0.192045,0.183974, -0.243556,0.115632,0.315865, 0.128360,0.261346,0.324519, -0.053858,0.233367,0.333678, -}; -// h02 -const int h02_numv = 22; -const float h02_volu = 0.069699; -const float h02_pos[3] = { -0.226726,-0.554920,-0.490680 }; -const float h02_verts[ h02_numv * 3 ] = { - 0.092179,-0.226103,0.260087, -0.296734,0.272195,0.041665, -0.063859,-0.091716,-0.290866, 0.291800,-0.116083,-0.104671, -0.005367,0.033207,-0.326567, 0.057499,0.071569,-0.315604, -0.314416,0.260931,0.014286, 0.001987,-0.310858,0.106391, 0.200664,0.041526,0.249449, -0.249087,-0.157649,-0.121285, 0.164143,-0.213455,-0.116915, 0.086533,-0.112211,0.311781, 0.301609,-0.100599,-0.031006, -0.013037,0.041374,0.269240, 0.214238,-0.145305,0.159971, -0.177599,0.337949,0.022880, -0.304902,0.265836,0.005836, 0.151444,0.029502,0.298046, 0.226514,0.065723,0.196331, -0.078156,0.329100,-0.024159, 0.053890,0.084483,0.272741, -0.198047,0.327898,0.050872, -}; -// h03 -const int h03_numv = 18; -const float h03_volu = 0.069585; -const float h03_pos[3] = { -0.013871,-0.718833,-0.869565 }; -const float h03_verts[ h03_numv * 3 ] = { - -0.207492,-0.281167,-0.130435, 0.113468,0.049972,0.264160, -0.007999,0.353837,-0.130435, 0.078945,0.047830,0.274214, -0.003048,-0.281167,0.119131, -0.048711,-0.049541,0.261970, -0.155356,0.235482,0.063281, 0.163083,-0.281167,0.065052, -0.378975,-0.037005,-0.130435, -0.276714,0.072197,0.088019, 0.263172,-0.281167,-0.130435, 0.247851,0.256254,-0.130435, 0.308871,0.008019,-0.130435, 0.268707,0.210552,0.010520, 0.116203,0.335344,-0.130435, 0.263499,0.226082,-0.009852, -0.255650,0.197121,-0.130435, -0.218222,0.197121,0.052318, -}; -// h04 -const int h04_numv = 18; -const float h04_volu = 0.049776; -const float h04_pos[3] = { 0.037853,-0.892026,-0.431971 }; -const float h04_verts[ h04_numv * 3 ] = { - -0.100436,0.123651,-0.175624, 0.353999,-0.060233,0.083056, 0.061744,0.223165,-0.173434, -0.054772,-0.107974,-0.318463, 0.079577,0.232813,-0.134685, 0.365414,-0.107974,0.061633, 0.111359,-0.107974,-0.372542, -0.262592,0.026248,0.047682, -0.327682,-0.107974,0.107959, -0.050341,0.191801,0.101262, -0.248632,-0.107974,0.379486, -0.172400,0.111003,0.201378, 0.324182,-0.074827,0.146980, 0.312271,-0.107974,0.174077, -0.248842,-0.086035,0.364515, -0.264984,-0.107974,0.352871, 0.027221,0.221023,-0.163380, 0.037030,0.236507,-0.089715, -}; -// h05 -const int h05_numv = 12; -const float h05_volu = 0.060052; -const float h05_pos[3] = { -0.361440,-0.882680,-0.728709 }; -const float h05_verts[ h05_numv * 3 ] = { - -0.444817,-0.117320,-0.271291, 0.140076,-0.117320,-0.271291, 0.136701,0.016901,0.344420, -0.031407,0.126842,-0.271291, 0.070855,0.236044,-0.052837, -0.114373,0.170111,0.116744, 0.344521,-0.117320,-0.021725, 0.298857,0.114305,0.121114, -0.444469,-0.108411,-0.271291, 0.071611,-0.117320,0.404697, -0.173458,0.135300,0.111770, -0.010820,-0.117320,0.364447, -}; -// h06 -const int h06_numv = 16; -const float h06_volu = 0.067458; -const float h06_pos[3] = { 0.885250,-0.616510,-0.689541 }; -const float h06_verts[ h06_numv * 3 ] = { - -0.230633,-0.043361,0.025874, -0.001305,-0.383490,-0.079103, 0.114750,-0.383490,0.055891, 0.114750,0.141993,-0.310459, 0.042572,0.157183,0.322917, 0.114750,0.349093,0.009138, 0.114750,-0.209139,-0.310459, 0.114750,-0.383490,-0.220772, 0.114750,0.143660,0.326163, -0.023969,0.120047,-0.310459, -0.230634,0.218132,-0.108639, -0.072958,0.349093,0.054965, -0.138827,-0.119612,0.199579, 0.020027,-0.383490,0.025057, -0.041036,-0.038390,0.301047, 0.114750,-0.091790,0.305977, -}; -// h07 -const int h07_numv = 18; -const float h07_volu = 0.100040; -const float h07_pos[3] = { 0.439796,-0.816642,-0.690430 }; -const float h07_verts[ h07_numv * 3 ] = { - -0.290584,-0.183358,-0.114083, 0.444149,-0.183358,-0.078214, -0.340199,0.147781,0.085025, -0.036530,-0.183358,0.320092, -0.047944,-0.135617,0.341515, 0.306627,0.080520,0.200468, -0.322367,0.157429,0.123774, 0.465481,-0.183358,0.025945, 0.214820,0.156771,0.026763, -0.144796,0.105827,-0.309570, 0.159858,-0.183358,-0.309570, -0.190496,-0.183358,-0.309570, -0.155412,0.298926,0.091748, -0.184960,0.308361,-0.168615, -0.134267,0.332806,-0.106403, 0.196572,0.110989,0.274357, -0.157992,0.325768,-0.131745, -0.142419,0.333870,-0.095406, -}; -// h08 -const int h08_numv = 22; -const float h08_volu = 0.095115; -const float h08_pos[3] = { 0.582909,-0.382310,-0.514785 }; -const float h08_verts[ h08_numv * 3 ] = { - 0.039696,0.333763,-0.114253, -0.040720,0.073975,-0.343437, -0.281418,0.194479,0.107755, 0.071707,-0.016068,-0.283395, 0.071707,-0.277561,-0.148882, 0.163514,-0.353812,0.024824, 0.072380,0.310495,-0.182078, 0.344912,-0.077018,0.148161, 0.229382,0.114893,-0.119790, 0.056106,0.251986,0.176207, 0.261304,-0.272590,0.126291, 0.053460,-0.323343,0.098712, -0.280479,0.198156,0.096008, -0.285532,-0.100462,-0.271051, 0.094134,-0.250952,0.200497, -0.277380,-0.101526,-0.282048, -0.010614,0.002589,0.315575, -0.026292,0.211375,0.249710, 0.146296,0.123570,0.286302, 0.056041,0.119791,0.321947, -0.290185,0.102104,0.127875, -0.298525,-0.135406,-0.083897, -}; -// h09 -const int h09_numv = 16; -const float h09_volu = 0.059582; -const float h09_pos[3] = { 0.627742,-0.657906,-0.898694 }; -const float h09_verts[ h09_numv * 3 ] = { - -0.028087,-0.342094,-0.101306, 0.372258,-0.342094,-0.101306, 0.233539,0.161443,-0.101306, 0.372258,-0.167743,-0.101306, 0.256203,-0.342094,0.130050, 0.372258,-0.342094,-0.011619, -0.322212,0.174071,0.101861, 0.026875,-0.001965,0.235027, -0.098160,0.388838,-0.101306, 0.026875,0.259528,0.100514, -0.332742,-0.052909,-0.101306, -0.085552,0.349571,0.040471, -0.393762,0.195327,-0.101306, -0.372906,0.149626,0.039648, -0.378114,0.165155,0.019276, -0.345937,0.167033,0.076519, -}; -// h10 -const int h10_numv = 18; -const float h10_volu = 0.082139; -const float h10_pos[3] = { -0.348593,-0.203405,-0.827574 }; -const float h10_verts[ h10_numv * 3 ] = { - 0.351136,-0.038001,-0.172426, 0.318157,0.110282,-0.172426, -0.183035,-0.085679,0.342730, -0.360226,-0.040315,-0.172426, 0.190400,0.248876,-0.172426, 0.296736,0.161596,-0.025823, 0.116500,-0.318307,0.010327, -0.282440,-0.040315,0.207384, -0.155944,0.334915,-0.140051, -0.055732,-0.013566,0.359774, 0.296359,0.169251,-0.045236, -0.155944,0.347503,-0.172426, 0.079072,-0.318307,-0.172426, 0.043711,-0.022416,0.312735, 0.326723,-0.161591,-0.172426, 0.179366,-0.279946,0.021290, 0.100706,0.105108,0.263039, 0.042697,0.111008,0.290353, -}; -// h11 -const int h11_numv = 18; -const float h11_volu = 0.058443; -const float h11_pos[3] = { -0.902277,0.042835,-0.283464 }; -const float h11_verts[ h11_numv * 3 ] = { - 0.065494,-0.341848,-0.057123, 0.194525,0.153131,-0.091230, -0.097723,-0.350111,0.163707, 0.194525,-0.144351,0.061796, 0.065493,0.122511,-0.295991, -0.097723,-0.183345,0.306682, -0.097723,0.152153,0.335446, -0.097723,-0.428001,-0.052654, 0.107269,-0.156775,0.196004, -0.097723,0.199975,-0.375687, 0.037223,0.358435,0.033582, -0.097723,0.406471,-0.057020, -0.067761,-0.416891,-0.051054, -0.040073,-0.340339,0.134552, 0.056142,-0.350169,-0.055126, 0.004412,-0.376327,-0.008857, 0.025793,-0.108438,0.290488, -0.096343,0.152412,0.335215, -}; -// h12 -const int h12_numv = 22; -const float h12_volu = 0.106128; -const float h12_pos[3] = { -0.838340,-0.076123,-0.758521 }; -const float h12_verts[ h12_numv * 3 ] = { - 0.207307,-0.167597,0.138331, 0.129521,-0.167597,-0.241479, -0.161660,0.318933,0.099371, 0.312802,0.272050,-0.241479, -0.161660,-0.330252,0.400013, -0.074718,-0.363580,0.273473, 0.001556,0.241469,0.179066, -0.161660,-0.309043,0.422403, -0.161660,-0.407271,0.186072, -0.161660,-0.351860,-0.241479, -0.007794,-0.231211,0.419931, 0.001557,-0.222890,0.417934, 0.309084,0.269226,-0.210613, -0.161660,0.422173,-0.241479, 0.072963,0.309250,0.057032, -0.161660,0.392766,-0.014569, -0.131698,-0.297933,0.424004, -0.161660,-0.327468,0.404309, 0.114980,-0.245845,0.291286, 0.009169,-0.227496,0.411012, 0.333803,0.207633,-0.209104, 0.333803,0.220221,-0.241479, -}; -// h13 -const int h13_numv = 22; -const float h13_volu = 0.080573; -const float h13_pos[3] = { -0.579196,0.019592,-0.524795 }; -const float h13_verts[ h13_numv * 3 ] = { - -0.186181,0.213535,-0.176694, 0.154423,-0.034973,0.266436, 0.105286,0.335497,0.021835, 0.055737,-0.302317,0.075780, -0.128556,-0.121108,0.303127, 0.252786,0.058395,0.170378, -0.257588,0.145754,-0.054660, 0.097995,0.334920,0.024505, 0.093556,-0.038093,0.287537, 0.074659,0.111918,-0.442830, -0.051837,-0.263312,-0.095394, -0.257587,-0.318605,0.184208, 0.273300,-0.111989,-0.012426, 0.049940,0.173511,-0.444339, -0.026589,0.239892,0.129875, -0.128556,0.176374,0.150102, 0.038054,-0.313581,0.048402, 0.047568,-0.308676,0.039952, -0.249976,-0.323211,0.177286, -0.144164,-0.341560,0.057561, 0.174871,-0.236563,0.056995, 0.154423,-0.246614,0.084987, -}; -// h14 -const int h14_numv = 24; -const float h14_volu = 0.092625; -const float h14_pos[3] = { 0.037294,-0.326434,-0.629340 }; -const float h14_verts[ h14_numv * 3 ] = { - 0.244511,-0.164440,-0.192835, -0.034752,0.085028,-0.370660, -0.037506,-0.162763,0.334991, -0.206521,-0.156917,-0.176944, 0.151340,0.267484,0.166363, 0.265137,0.142280,0.210563, 0.260084,-0.156338,-0.156496, -0.285181,0.228137,0.064806, 0.037588,-0.329085,0.107655, -0.342176,0.100614,0.114501, 0.027780,-0.344569,0.033990, -0.089151,0.284625,-0.224057, -0.059164,-0.038562,-0.370660, 0.065038,-0.057055,-0.370660, 0.036995,0.362842,0.085406, 0.062303,-0.342427,0.023935, 0.217542,-0.181847,-0.229705, 0.212334,-0.166317,-0.250077, 0.224212,0.171137,0.236256, 0.080136,-0.332779,0.062684, 0.146779,-0.002116,0.303773, 0.264198,0.138603,0.222310, 0.247091,-0.191282,0.030659, 0.255431,0.046228,0.242430, -}; -// h15 -const int h15_numv = 16; -const float h15_volu = 0.047330; -const float h15_pos[3] = { 0.221274,0.213040,-0.893886 }; -const float h15_verts[ h15_numv * 3 ] = { - -0.273508,-0.247194,0.021075, -0.214206,0.249387,-0.106114, -0.394680,0.092354,-0.106114, 0.468273,-0.026582,-0.106114, -0.379467,-0.167569,-0.106114, -0.251710,-0.306163,-0.106114, -0.130453,-0.090301,0.212222, 0.215618,0.100683,0.162583, 0.108399,0.111587,0.216806, 0.543500,0.089559,-0.106114, 0.556660,0.080198,-0.106114, 0.496376,0.018888,-0.040935, 0.000444,-0.021162,0.246756, 0.322381,0.024676,0.097420, 0.541635,0.087788,-0.096097, 0.556215,0.081512,-0.106114, -}; -// h16 -const int h16_numv = 24; -const float h16_volu = 0.105221; -const float h16_pos[3] = { -0.230932,0.200668,-0.677519 }; -const float h16_verts[ h16_numv * 3 ] = { - 0.072738,-0.155197,-0.322481, 0.178698,-0.234822,-0.195293, -0.074965,-0.293065,0.140297, -0.273605,-0.069158,-0.290106, -0.242978,0.154421,0.174559, 0.321753,-0.077929,-0.004145, 0.331656,-0.130769,0.158361, -0.234281,0.105965,-0.322481, 0.057526,0.104725,-0.322481, -0.070916,0.357222,-0.022485, 0.179075,-0.242477,-0.175878, 0.305221,-0.164260,0.133584, 0.289986,0.017556,0.326217, -0.205442,0.224195,0.181431, -0.273605,-0.056571,-0.322481, -0.016955,-0.298965,0.112984, -0.012263,0.183238,-0.322481, -0.122870,0.351842,-0.002882, -0.294606,-0.004741,-0.322481, -0.298324,-0.007565,-0.291615, 0.354068,-0.072999,0.110530, 0.306083,0.044665,0.287425, 0.072223,0.006072,0.394149, -0.095479,-0.122681,0.323101, -}; -// h17 -const int h17_numv = 26; -const float h17_volu = 0.108916; -const float h17_pos[3] = { 0.335926,-0.094685,-0.795267 }; -const float h17_verts[ h17_numv * 3 ] = { - 0.319363,0.022871,0.098404, -0.388160,0.060531,-0.077543, 0.353621,0.281144,-0.204733, 0.207729,0.332401,-0.001198, 0.193656,-0.174383,-0.204733, -0.101947,-0.367894,-0.204733, -0.366362,0.001562,-0.204733, -0.261637,0.131093,0.251333, 0.356211,0.239639,0.008049, -0.212790,0.222354,0.228279, -0.038549,-0.388087,0.009431, -0.033495,-0.089469,0.376490, -0.054122,-0.396189,-0.026907, 0.286680,0.046139,0.166229, 0.206263,-0.213650,-0.062955, -0.030396,-0.389151,-0.001566, -0.086298,-0.398066,-0.084150, -0.233594,-0.288804,-0.204733, -0.114208,0.286563,0.148137, -0.245105,0.217424,0.113603, 0.376946,0.258587,-0.036908, 0.381724,0.326613,-0.139554, -0.147292,0.035735,0.332290, -0.235202,0.164584,0.276109, -0.333383,-0.146721,-0.204733, -0.387783,0.052876,-0.058130, -}; -// h18 -const int h18_numv = 18; -const float h18_volu = 0.081077; -const float h18_pos[3] = { 0.870716,-0.039183,-0.528244 }; -const float h18_verts[ h18_numv * 3 ] = { - -0.102809,0.184137,0.110997, 0.129284,0.393063,-0.471756, 0.129284,0.325763,0.151471, 0.124364,0.395398,-0.471756, -0.058424,-0.228234,-0.106332, 0.057106,-0.420144,0.161620, -0.248110,-0.009363,-0.100794, -0.231701,-0.091141,0.189666, 0.129284,-0.228234,-0.152159, 0.129284,-0.433667,0.164866, 0.129284,-0.166980,0.404939, -0.141510,-0.219557,0.299761, 0.129284,0.397646,-0.471756, -0.215427,-0.032631,-0.168619, 0.102902,0.388713,-0.463077, 0.129284,0.404181,-0.453605, -0.178579,0.184137,-0.258974, -0.157844,0.203085,-0.303931, -}; -// h19 -const int h19_numv = 16; -const float h19_volu = 0.057269; -const float h19_pos[3] = { 0.808301,-0.134672,-0.879100 }; -const float h19_verts[ h19_numv * 3 ] = { - 0.052980,-0.361791,-0.120900, 0.191699,-0.339845,-0.120900, -0.030366,0.427910,-0.120900, 0.191699,0.488552,-0.120900, -0.118754,0.321131,-0.120900, 0.191699,-0.132745,0.198697, 0.186779,0.490887,-0.120900, 0.003992,-0.132745,0.244524, -0.153012,0.062857,0.182237, -0.153685,-0.263706,0.080920, -0.278719,-0.134396,-0.120900, -0.266112,-0.173663,0.020877, -0.090651,0.366600,-0.055721, -0.095429,0.298574,0.046924, -0.012422,0.433588,-0.120900, 0.165316,0.484202,-0.112221, -}; -// h20 -const int h20_numv = 30; -const float h20_volu = 0.107509; -const float h20_pos[3] = { 0.402458,0.140897,-0.404353 }; -const float h20_verts[ h20_numv * 3 ] = { - -0.100408,0.282050,-0.142576, 0.065914,0.236686,0.319509, -0.125820,0.203801,0.337118, 0.365449,0.004057,-0.012894, 0.056400,0.231781,0.327959, 0.034434,0.172826,-0.326950, -0.072786,0.183730,-0.272727, -0.247229,0.030507,0.295489, 0.136546,-0.281738,0.161639, 0.289679,0.004057,-0.382865, 0.141197,0.096819,-0.392113, -0.100966,-0.328728,-0.002677, -0.140953,-0.296194,0.011269, -0.180740,0.050981,-0.242777, -0.253566,0.024492,0.286206, -0.033492,0.282050,0.184162, 0.236557,-0.271221,0.065774, 0.154159,-0.311832,0.139278, -0.301735,-0.070997,-0.114805, -0.213824,-0.199847,-0.058625, -0.310451,0.100424,0.233258, -0.241567,0.131963,0.326249, -0.062874,0.247232,-0.227963, -0.327109,0.098788,0.164544, -0.279322,-0.013228,-0.162635, -0.343405,0.077327,0.053051, -0.313038,0.127071,0.015013, -0.327307,0.104436,0.014259, -0.100027,-0.325051,-0.014425, 0.220147,-0.189444,-0.224685, -}; -// h21 -const int h21_numv = 20; -const float h21_volu = 0.107886; -const float h21_pos[3] = { -0.701261,0.516623,-0.734170 }; -const float h21_verts[ h21_numv * 3 ] = { - 0.220060,-0.162111,0.233880, -0.071194,0.139979,-0.265830, 0.326350,0.086982,0.076961, 0.175723,-0.320696,-0.265830, -0.194481,0.286846,0.262411, 0.236048,-0.209990,-0.265830, -0.298739,0.200252,0.166960, 0.264887,-0.091760,0.238083, 0.347459,0.035887,0.053770, -0.298739,0.031984,-0.265830, -0.298739,-0.199980,-0.038920, -0.298739,-0.170573,-0.265830, -0.064116,-0.283496,0.032682, 0.172005,-0.323520,-0.234964, 0.067327,0.317485,0.021628, 0.227351,-0.161534,0.231210, 0.015724,0.286846,0.365050, -0.065674,0.367082,0.311546, 0.153155,0.171345,0.362933, 0.139764,0.180879,0.371107, -}; -// h22 -const int h22_numv = 14; -const float h22_volu = 0.065276; -const float h22_pos[3] = { -0.383570,0.726249,-0.891974 }; -const float h22_verts[ h22_numv * 3 ] = { - 0.403835,0.273751,-0.108026, -0.250365,0.107859,0.179431, -0.224444,0.273751,-0.108026, 0.311631,-0.076337,-0.108026, -0.388885,-0.069647,-0.108026, 0.349740,0.107545,0.033083, 0.400677,0.273751,-0.064850, -0.189576,0.273751,0.079255, 0.008658,-0.122644,0.234765, -0.081643,-0.419616,-0.108026, 0.029768,-0.173739,0.211573, 0.125191,-0.098941,0.194122, 0.140375,-0.342343,-0.108026, 0.081722,-0.168359,0.191970, -}; -// h23 -const int h23_numv = 16; -const float h23_volu = 0.051599; -const float h23_pos[3] = { -0.800668,0.450995,-0.472891 }; -const float h23_verts[ h23_numv * 3 ] = { - 0.035291,-0.217869,-0.228598, -0.199332,-0.134353,-0.300199, -0.199332,0.265879,-0.094319, -0.095074,0.352473,0.001132, -0.199332,-0.001690,0.132407, -0.199332,-0.208186,-0.186260, 0.189555,0.299490,0.167366, -0.199332,0.309177,-0.027504, -0.064385,-0.049725,0.223009, -0.036116,-0.285650,-0.106564, 0.116475,0.143410,0.211970, 0.319467,-0.096483,-0.027399, 0.092916,-0.255030,0.098198, 0.194883,-0.191512,0.077971, 0.239171,0.246507,0.109828, 0.115131,0.352473,0.103771, -}; -// h24 -const int h24_numv = 12; -const float h24_volu = 0.050770; -const float h24_pos[3] = { -0.845297,0.862613,-0.757515 }; -const float h24_verts[ h24_numv * 3 ] = { - 0.078361,0.021092,0.334891, -0.154703,-0.145738,0.190305, -0.154703,0.137387,-0.242485, -0.154703,-0.314006,-0.242485, 0.072842,-0.206011,-0.242485, 0.237283,0.137387,-0.242485, -0.154703,-0.102441,0.257120, -0.050445,-0.059144,0.285756, 0.211362,-0.028505,0.044972, -0.154703,0.137387,0.380489, 0.272151,0.137387,-0.055204, 0.060041,0.137387,0.393596, -}; -// h25 -const int h25_numv = 16; -const float h25_volu = 0.064196; -const float h25_pos[3] = { 0.265380,0.609017,-0.859766 }; -const float h25_verts[ h25_numv * 3 ] = { - 0.171512,-0.295294,0.128463, -0.112864,0.390983,-0.140234, -0.179972,0.258217,0.163631, -0.171482,0.390983,0.031499, -0.146465,0.312621,0.159756, 0.063572,-0.117444,0.267684, -0.245115,0.390983,-0.140234, -0.337319,0.040895,-0.140234, 0.499394,-0.306418,-0.140234, 0.112578,-0.021086,0.259138, 0.074204,-0.220888,0.227450, 0.064293,-0.284390,0.182686, -0.258312,-0.146590,-0.140234, 0.497529,-0.308188,-0.130217, -0.299210,0.224777,0.000875, -0.248273,0.390983,-0.097058, -}; -// h26 -const int h26_numv = 24; -const float h26_volu = 0.101687; -const float h26_pos[3] = { -0.341007,0.877992,-0.537072 }; -const float h26_verts[ h26_numv * 3 ] = { - 0.358114,0.122008,-0.419752, -0.168425,-0.052359,0.397165, -0.220490,-0.180490,0.174009, 0.459922,0.043646,-0.162938, 0.324251,-0.109249,-0.070985, -0.202046,0.011183,0.424477, 0.252084,0.007514,0.202105, -0.286958,0.122008,0.388199, 0.307177,-0.044198,-0.321819, 0.426415,-0.010758,-0.159063, 0.082627,-0.250684,-0.160780, -0.033904,-0.274387,-0.120138, -0.232139,0.122008,-0.275647, -0.292928,-0.043884,-0.175471, -0.344531,-0.074523,0.167952, -0.207099,-0.190024,0.165835, -0.444249,0.122008,0.173153, -0.425929,0.005713,0.114448, 0.327136,0.122008,0.185091, -0.202046,0.122008,0.443480, 0.434905,0.122008,-0.291195, 0.483509,0.122008,-0.120325, -0.187210,-0.038985,0.408631, -0.270106,-0.127507,0.231547, -}; -// h27 -const int h27_numv = 24; -const float h27_volu = 0.100588; -const float h27_pos[3] = { 0.167088,0.649940,-0.364014 }; -const float h27_verts[ h27_numv * 3 ] = { - -0.183844,0.118803,-0.244043, -0.044353,-0.266136,0.405236, -0.256011,0.235567,0.029047, 0.161864,-0.158366,-0.228068, 0.300539,0.065664,-0.127155, -0.024586,0.350060,-0.293383, -0.048173,0.271698,-0.335996, -0.180959,0.350060,0.012033, -0.081680,0.217294,-0.332121, -0.044357,0.350060,0.088262, -0.006196,-0.377080,0.285910, 0.201878,-0.226993,0.143823, -0.003872,-0.277036,0.420726, 0.210870,-0.062009,-0.236614, -0.003871,0.350060,0.098146, 0.183618,0.350060,-0.130723, -0.165155,-0.254165,0.331667, -0.075081,-0.408619,0.192919, -0.091738,-0.410255,0.124205, 0.005721,-0.287236,0.414262, -0.077668,-0.381972,-0.025325, -0.102748,-0.401170,0.182332, 0.134962,-0.226993,-0.182915, 0.109551,-0.305242,0.296779, -}; -// h28 -const int h28_numv = 18; -const float h28_volu = 0.075441; -const float h28_pos[3] = { 0.013616,0.472900,-0.719797 }; -const float h28_verts[ h28_numv * 3 ] = { - -0.187022,-0.167506,-0.280203, 0.109520,-0.345231,0.152809, -0.085555,0.177012,-0.280203, -0.271995,0.154408,0.021945, -0.030372,0.295843,0.111740, 0.061535,-0.227567,0.329703, 0.075804,-0.204932,0.330457, 0.071792,0.394334,0.023662, 0.208102,-0.281022,0.072668, -0.047446,0.360894,-0.139094, 0.077205,-0.350161,0.038133, -0.006548,-0.010473,-0.280203, 0.288434,-0.049953,0.172868, 0.315336,0.018674,0.127715, 0.316057,-0.148273,0.042717, 0.325968,-0.084770,0.087482, -0.256811,-0.088994,-0.280203, -0.315464,0.084990,0.019794, -}; -// h29 -const int h29_numv = 20; -const float h29_volu = 0.090754; -const float h29_pos[3] = { -0.195482,0.549508,-0.348926 }; -const float h29_verts[ h29_numv * 3 ] = { - -0.062897,0.077801,-0.348926, 0.254536,-0.331284,-0.002375, -0.179429,0.054098,-0.308283, 0.178726,0.219235,-0.259131, -0.352624,0.138460,-0.022310, 0.259822,-0.300738,0.167244, 0.197415,-0.153733,0.316579, 0.065987,-0.327570,0.133724, 0.114982,-0.134660,0.333685, 0.270633,-0.304175,-0.041168, -0.106366,0.008382,-0.351078, 0.106560,0.335999,0.013959, -0.240892,-0.124645,-0.147161, -0.313950,0.276125,0.209019, -0.158320,0.003002,-0.331475, 0.036774,-0.342768,0.065557, 0.284902,-0.281540,-0.040413, 0.270832,-0.309823,0.109117, 0.013405,-0.084041,0.336165, 0.046528,-0.137097,0.329090, -}; -// h30 -const int h30_numv = 26; -const float h30_volu = 0.141813; -const float h30_pos[3] = { 0.709749,0.432546,-0.520590 }; -const float h30_verts[ h30_numv * 3 ] = { - 0.086130,-0.133630,-0.479410, 0.290251,-0.067548,-0.461259, 0.290251,0.254276,-0.130163, -0.166094,-0.194830,-0.275875, -0.114073,0.017151,0.452790, 0.263868,-0.083016,-0.470730, -0.015645,0.141724,0.383369, -0.170984,0.316821,0.046789, -0.242122,0.283058,0.029421, 0.290251,0.110614,0.239339, -0.340783,-0.009598,0.300399, 0.290251,-0.018830,0.261535, 0.067740,-0.137994,-0.479410, -0.241377,-0.054963,0.435747, 0.058158,-0.287592,0.103343, 0.290251,-0.145966,0.143817, 0.068185,-0.139308,-0.479410, -0.017612,-0.287592,-0.266628, 0.053160,-0.131717,-0.469392, -0.272857,-0.118823,-0.210712, 0.007901,-0.200618,-0.414231, 0.003123,-0.268644,-0.311584, -0.331791,0.155385,-0.080037, -0.407699,-0.009598,-0.026339, -0.380797,0.059028,-0.071491, -0.370165,-0.044416,-0.111725, -}; -// h31 -const int h31_numv = 20; -const float h31_volu = 0.145607; -const float h31_pos[3] = { 0.628702,0.773411,-0.793457 }; -const float h31_verts[ h31_numv * 3 ] = { - -0.189575,0.226589,0.317223, 0.371298,-0.414948,-0.206543, -0.476185,0.226589,-0.206543, 0.371298,0.226589,-0.206543, -0.250744,-0.185480,0.192828, 0.148787,-0.478859,-0.206543, -0.509787,0.148227,0.093447, -0.534804,0.226589,-0.034811, -0.277996,0.226589,0.298719, -0.486200,0.226589,0.136059, 0.371298,-0.408413,-0.188392, 0.167177,-0.474495,-0.206543, 0.366378,-0.417196,-0.206543, 0.344915,-0.423881,-0.197864, 0.371298,-0.086589,0.142703, 0.371298,0.226589,0.089002, -0.161075,-0.057807,0.302287, -0.089936,-0.024044,0.319655, 0.134207,-0.472582,-0.196526, 0.136072,-0.470812,-0.206543, -}; -// h32 -const int h32_numv = 22; -const float h32_volu = 0.092552; -const float h32_pos[3] = { -0.648077,-0.694629,-0.055690 }; -const float h32_verts[ h32_numv * 3 ] = { - -0.351923,0.020682,-0.162313, -0.351923,0.291038,-0.298522, 0.116588,0.074450,0.304425, 0.180292,0.145010,-0.063690, -0.351923,0.286862,-0.299238, 0.082653,-0.305371,0.200452, 0.444715,-0.214767,0.086986, 0.440565,-0.305371,0.060643, 0.437298,-0.305371,0.003205, 0.441236,-0.180086,0.007980, 0.202670,-0.305371,-0.129990, -0.122926,-0.305371,-0.050498, -0.351923,0.343433,0.003710, 0.034975,0.067995,0.334312, -0.249787,0.361137,-0.236631, 0.059834,0.222599,0.089656, 0.420946,-0.305371,-0.023410, 0.437088,-0.283432,-0.011766, -0.351923,0.387353,-0.064067, -0.294272,0.397125,-0.093222, -0.351923,0.309463,-0.280428, -0.321961,0.320573,-0.278827, -}; -// h33 -const int h33_numv = 18; -const float h33_volu = 0.056945; -const float h33_pos[3] = { -0.288352,-0.547292,0.050646 }; -const float h33_verts[ h33_numv * 3 ] = { - 0.084990,-0.362104,-0.019350, -0.079434,0.021164,0.334816, 0.019488,-0.072734,0.262363, 0.115516,0.076855,-0.268585, 0.213070,0.021874,-0.243280, 0.274323,0.089944,-0.132397, 0.019789,0.332949,0.053313, 0.257211,0.025988,-0.078610, 0.131191,0.288888,-0.060012, 0.118204,-0.320377,0.031687, 0.081511,-0.327423,-0.098356, -0.243137,-0.072887,0.198089, -0.179433,-0.002327,-0.170026, -0.299891,0.075262,-0.016680, -0.055817,0.322184,0.088384, -0.038680,0.277450,0.153234, 0.148159,-0.119839,-0.229545, 0.048588,0.033746,-0.272086, -}; -// h34 -const int h34_numv = 24; -const float h34_volu = 0.086482; -const float h34_pos[3] = { -0.499709,-0.643458,-0.327986 }; -const float h34_verts[ h34_numv * 3 ] = { - -0.500291,0.235691,-0.026942, -0.413349,0.203755,-0.157062, -0.223651,0.321490,-0.139249, 0.209880,-0.356542,0.003973, 0.365162,-0.137565,0.097393, 0.292868,-0.231257,0.280276, 0.359516,-0.023673,0.149087, -0.329463,0.339839,-0.019523, -0.041433,0.349469,-0.148408, 0.054302,-0.356542,0.142306, 0.272578,-0.356542,0.248886, 0.288720,-0.334603,0.260530, 0.023896,-0.069111,-0.283979, 0.274970,-0.222320,-0.056303, 0.127449,-0.356542,-0.036276, -0.035189,-0.103922,-0.288953, -0.023751,0.360733,-0.121029, -0.500291,0.237083,-0.030523, -0.346425,0.336124,-0.010604, 0.259945,0.129913,0.106546, -0.500291,0.239867,-0.026226, -0.470329,0.269402,-0.006532, -0.398155,0.309966,0.035665, 0.031924,0.093839,0.208606, -}; -// h35 -const int h35_numv = 12; -const float h35_volu = 0.072358; -const float h35_pos[3] = { -0.852811,-0.781078,0.150064 }; -const float h35_verts[ h35_numv * 3 ] = { - -0.147189,-0.218922,0.332047, 0.103613,-0.074924,0.288589, -0.147189,0.429882,-0.202044, -0.147189,-0.218922,-0.312160, 0.239709,0.154443,0.128558, 0.287386,-0.218922,-0.005301, -0.043492,-0.218922,0.344705, 0.074717,-0.218922,0.306226, -0.147189,0.402063,0.012610, 0.208223,0.167113,0.176854, -0.147189,0.107130,-0.368067, 0.081807,-0.218922,-0.256252, -}; -// h36 -const int h36_numv = 18; -const float h36_volu = 0.076715; -const float h36_pos[3] = { 0.330903,-0.599381,-0.308448 }; -const float h36_verts[ h36_numv * 3 ] = { - 0.235744,-0.093981,0.208985, 0.157036,0.091360,0.296934, -0.213473,-0.059832,-0.258208, 0.131366,0.084254,0.304768, 0.060949,-0.352878,-0.040467, 0.031132,-0.367472,0.023458, -0.038178,0.319175,-0.078462, 0.346140,-0.033881,-0.005840, 0.305466,-0.106272,-0.107625, -0.256020,-0.056138,-0.213238, -0.331115,0.110184,0.014099, -0.356965,0.085987,0.067218, 0.185622,-0.147504,0.212044, 0.241393,0.219660,0.109239, -0.343391,-0.100844,-0.022261, -0.046519,0.081665,-0.290234, -0.272849,0.156195,0.144404, -0.146830,0.270831,-0.017119, -}; -// h37 -const int h37_numv = 18; -const float h37_volu = 0.098217; -const float h37_pos[3] = { 0.055330,-0.588368,0.333127 }; -const float h37_verts[ h37_numv * 3 ] = { - -0.107417,0.016721,0.347927, 0.283844,-0.036335,0.197820, 0.129290,0.324988,-0.064466, -0.012100,0.128834,-0.356552, 0.344968,0.171444,-0.038138, -0.270436,0.127441,0.395275, -0.130084,-0.375511,-0.154724, 0.001812,-0.380727,-0.087638, -0.247911,0.142505,0.383526, 0.360906,0.133475,0.137346, 0.062042,-0.352141,-0.072933, 0.261216,0.073240,-0.194499, 0.127844,0.325300,-0.059106, 0.361773,0.137946,0.130076, -0.225478,-0.279302,-0.250794, -0.324194,-0.031659,-0.020118, -0.297963,0.086614,0.328910, -0.086471,0.067064,-0.361091, -}; -// h38 -const int h38_numv = 28; -const float h38_volu = 0.093559; -const float h38_pos[3] = { 0.133166,-0.773583,-0.050905 }; -const float h38_verts[ h38_numv * 3 ] = { - -0.076024,-0.195512,0.296394, 0.264846,-0.226417,0.026836, 0.183380,0.258456,0.189533, -0.015793,-0.166926,0.311098, -0.267713,-0.007440,-0.179688, -0.159228,0.260189,-0.190326, -0.343945,-0.226417,-0.001580, -0.273359,0.106452,-0.127994, 0.216958,-0.226417,-0.206989, 0.383359,0.026697,-0.045499, 0.329103,0.258456,0.047225, -0.089936,0.314049,0.027481, -0.145654,0.073358,-0.279804, 0.228869,-0.193270,-0.234086, -0.131382,0.326289,-0.026485, -0.075112,0.330397,-0.113139, -0.208448,0.248166,-0.141729, -0.011151,-0.226417,0.296364, -0.211663,-0.226417,0.216210, -0.072038,-0.226417,0.288931, -0.336528,-0.135813,0.082201, -0.147195,0.316236,-0.030846, -0.340678,-0.226417,0.055858, -0.164307,0.252279,0.022941, -0.344155,-0.204478,-0.016551, -0.340007,-0.101132,0.003195, -0.207920,-0.190296,0.229308, -0.303314,-0.094086,0.133238, -}; -// h39 -const int h39_numv = 32; -const float h39_volu = 0.060173; -const float h39_pos[3] = { -0.130993,-0.349156,0.297470 }; -const float h39_verts[ h39_numv * 3 ] = { - 0.132777,-0.098138,-0.374861, 0.174223,-0.110378,-0.320895, -0.236793,-0.176972,0.087992, 0.120090,0.163784,-0.274197, -0.036262,0.126682,-0.293283, -0.239846,-0.040235,0.342234, -0.196039,0.079314,-0.093590, -0.026168,0.090752,-0.306837, -0.084113,-0.111771,0.430932, -0.132771,0.138527,-0.197817, -0.061588,-0.096707,0.419183, -0.167047,-0.030107,0.457226, 0.314167,0.086089,-0.023449, 0.140527,0.255266,-0.004320, -0.137571,0.134813,-0.193511, 0.315613,0.085777,-0.028809, 0.116964,-0.108191,-0.379221, 0.099852,-0.172148,-0.325434, -0.176687,-0.026318,0.447418, -0.168971,-0.023213,0.453768, -0.137871,-0.270870,0.015539, -0.111640,-0.152598,0.364567, -0.122362,-0.092357,0.456223, -0.127730,-0.079472,0.460978, -0.243030,-0.080780,0.324741, -0.136583,-0.114124,0.420896, -0.241856,-0.054541,0.348612, -0.178625,-0.028253,0.445248, -0.171209,-0.024409,0.453290, -0.169333,-0.024798,0.455225, 0.224076,0.244621,-0.088171, 0.213513,0.251212,-0.061379, -}; -// h40 -const int h40_numv = 24; -const float h40_volu = 0.115424; -const float h40_pos[3] = { 0.492476,-0.748212,0.263785 }; -const float h40_verts[ h40_numv * 3 ] = { - -0.375103,-0.192297,-0.003592, 0.259307,0.208511,0.137583, 0.097667,-0.251788,0.295436, 0.264741,-0.251788,-0.112461, -0.092178,0.331289,0.031204, 0.024049,0.001327,-0.360189, 0.074171,0.054850,-0.363248, 0.312772,-0.115013,-0.159366, -0.175930,0.233085,-0.125157, -0.094464,-0.251788,-0.287854, -0.004537,0.240191,-0.275299, -0.030207,0.233085,-0.267465, -0.370461,-0.251788,-0.018326, 0.056736,-0.251788,0.315422, -0.153302,0.123509,0.267162, -0.068302,0.078845,0.319783, 0.171724,0.348803,0.156293, 0.053571,0.367605,-0.023060, -0.075373,0.297791,0.199418, 0.109457,0.331072,0.189737, -0.005042,0.303901,0.226077, 0.014996,0.282164,0.244247, -0.076239,0.293319,0.206688, -0.068649,0.297216,0.207331, -}; -// h41 -const int h41_numv = 18; -const float h41_volu = 0.076473; -const float h41_pos[3] = { 0.741085,-0.876917,-0.246261 }; -const float h41_verts[ h41_numv * 3 ] = { - 0.005338,0.140795,-0.243701, -0.174437,0.183555,0.146798, 0.258916,-0.123083,-0.387389, 0.103129,0.222017,-0.142233, 0.164192,-0.123083,-0.418224, 0.016133,-0.123083,0.397585, 0.258916,0.168617,-0.137303, 0.258916,-0.123083,0.279039, -0.343073,-0.123083,0.222192, -0.064041,0.243655,-0.068027, -0.104715,0.171264,-0.169812, -0.390960,-0.123083,-0.011633, -0.224559,0.130032,0.149857, -0.379049,-0.089936,-0.038730, -0.349233,-0.075342,-0.102654, -0.337817,-0.123083,-0.124077, 0.258916,-0.009416,0.259549, 0.064164,0.013692,0.350680, -}; -// h42 -const int h42_numv = 26; -const float h42_volu = 0.137951; -const float h42_pos[3] = { 0.814994,-0.482932,0.027418 }; -const float h42_verts[ h42_numv * 3 ] = { - -0.063211,-0.056769,0.373950, 0.185005,0.097851,0.415613, -0.248347,-0.210430,-0.126881, 0.112828,0.023604,-0.394042, -0.108847,0.115253,0.400661, -0.327055,-0.025089,-0.038931, -0.085789,0.224192,-0.255901, 0.185005,-0.403401,-0.014130, 0.185005,-0.225368,-0.410982, -0.009747,-0.380293,0.077002, -0.175394,0.222730,-0.208732, 0.002670,0.221670,0.389944, -0.150794,0.083523,0.392660, 0.160182,0.229752,0.436714, 0.133897,0.345057,0.231744, -0.006362,0.255606,0.329122, 0.185005,0.234054,0.438967, 0.185005,0.352490,0.238788, 0.029219,-0.171968,-0.415912, -0.137952,-0.150330,-0.341706, 0.185005,0.276769,-0.150723, 0.185005,0.010082,-0.390796, -0.176045,0.220413,-0.220256, -0.242698,0.103211,-0.226628, -0.268948,0.102325,0.213307, -0.248100,0.136462,0.190657, -}; -// h43 -const int h43_numv = 26; -const float h43_volu = 0.091347; -const float h43_pos[3] = { -0.439313,0.395062,-0.161996 }; -const float h43_verts[ h43_numv * 3 ] = { - -0.171800,0.355423,-0.143529, -0.041887,-0.040549,-0.338294, -0.088904,0.443945,0.033555, -0.050746,0.256028,0.267789, -0.120718,0.085236,0.331241, 0.112903,-0.317075,-0.192421, -0.024680,-0.380539,0.081401, 0.014540,-0.410443,-0.096363, -0.166472,-0.135578,-0.232924, -0.179653,0.199344,0.219565, 0.056744,-0.387608,-0.004660, -0.088904,0.425462,0.081094, -0.046327,-0.413563,-0.075262, -0.024725,0.299814,0.247575, -0.150602,0.151087,0.286944, -0.050613,-0.134365,0.334664, -0.244880,0.199344,-0.098926, -0.122184,0.302440,-0.201067, -0.108793,0.292906,-0.209241, -0.034597,-0.039973,-0.340964, 0.309817,-0.173124,-0.053206, -0.070119,0.430571,0.022089, 0.002939,0.029802,-0.334091, 0.280604,-0.188322,-0.121373, 0.290359,0.017349,0.142160, 0.257236,0.070405,0.149235, -}; -// h44 -const int h44_numv = 26; -const float h44_volu = 0.104111; -const float h44_pos[3] = { -0.656166,-0.300748,0.215302 }; -const float h44_verts[ h44_numv * 3 ] = { - -0.220317,0.235145,-0.208278, 0.078796,0.351295,-0.102059, 0.283317,-0.102949,0.430780, 0.285327,-0.088643,0.424402, 0.201177,0.226255,-0.138992, 0.124677,-0.319431,0.033433, 0.117727,0.304230,-0.184196, 0.043064,-0.325887,0.063320, -0.138842,0.186808,-0.302762, 0.311997,0.075640,-0.076273, 0.067923,-0.171282,-0.181336, -0.343834,-0.050448,-0.267282, -0.343834,-0.078267,-0.052628, -0.343834,0.035932,0.053112, 0.088073,0.239020,0.159535, 0.282143,-0.129188,0.406909, -0.286183,0.003244,-0.364214, -0.343834,0.054532,0.043544, 0.011578,-0.313217,0.111616, 0.329134,0.030906,-0.011422, 0.089881,-0.140507,0.355648, 0.092412,-0.225203,0.279944, 0.288380,-0.225380,0.170160, 0.101854,0.336248,-0.130909, -0.343834,-0.006528,-0.335059, -0.343834,0.160238,-0.192084, -}; -// h45 -const int h45_numv = 22; -const float h45_volu = 0.073607; -const float h45_pos[3] = { -0.692003,0.228592,-0.074767 }; -const float h45_verts[ h45_numv * 3 ] = { - 0.206363,-0.247093,-0.162491, 0.114633,-0.178045,0.188010, 0.007810,0.365814,-0.186155, -0.306616,-0.033345,0.126518, -0.055718,0.198405,0.254002, 0.153565,-0.225110,0.105873, -0.184480,-0.294195,0.081791, 0.073037,0.365814,0.132336, 0.155930,-0.080562,0.225951, -0.173050,0.172678,-0.175116, -0.103005,-0.342532,-0.012694, -0.015749,-0.330108,-0.146901, 0.086218,0.030892,-0.320153, -0.015750,-0.032626,-0.299926, 0.228010,-0.214069,-0.005829, 0.104078,0.176805,0.286842, 0.137691,-0.193092,0.159160, 0.102087,0.317557,0.199715, -0.062260,0.197254,0.252076, 0.131971,0.251706,0.244012, 0.186972,0.021095,0.262581, 0.202077,0.032105,0.247435, -}; -// h46 -const int h46_numv = 24; -const float h46_volu = 0.077166; -const float h46_pos[3] = { -0.506861,-0.263372,-0.148064 }; -const float h46_verts[ h46_numv * 3 ] = { - -0.435488,-0.034132,-0.000849, 0.039076,-0.286247,0.028683, -0.031577,0.266854,0.179170, 0.042868,0.277895,0.067468, 0.334025,-0.207064,-0.069876, -0.200891,0.161856,-0.073604, -0.329922,-0.035641,-0.192524, -0.391003,-0.070120,-0.144257, 0.124292,0.270826,-0.018593, -0.288147,0.149432,0.060603, 0.051872,0.188879,0.224374, -0.081382,-0.208658,0.182030, 0.243097,0.052743,0.247717, 0.267097,-0.250173,-0.073376, 0.162691,0.038264,0.287094, 0.339607,0.040898,0.152251, 0.238297,0.049029,0.252023, 0.349700,0.004968,0.138697, 0.021220,0.244871,-0.089194, -0.322311,-0.040247,-0.199445, -0.016599,-0.019353,-0.300951, 0.082088,0.247991,-0.110295, -0.339273,-0.043963,-0.190526, 0.082087,0.036350,-0.291745, -}; -// h47 -const int h47_numv = 36; -const float h47_volu = 0.096745; -const float h47_pos[3] = { -0.132135,0.108975,0.072319 }; -const float h47_verts[ h47_numv * 3 ] = { - 0.298509,0.263511,-0.009995, -0.406303,-0.105494,-0.041213, 0.295351,0.263929,-0.015607, -0.362255,0.123840,0.142831, -0.016819,0.303436,-0.092155, 0.214655,-0.206919,0.163772, 0.119596,0.038081,0.333996, -0.357791,0.151721,0.100349, 0.141669,-0.202865,0.220831, -0.322854,-0.183468,0.003991, -0.422177,-0.073475,0.012073, 0.248529,0.277838,-0.020262, -0.331858,-0.094452,-0.152914, -0.250434,-0.101521,-0.238975, -0.131628,-0.319604,0.027334, 0.281027,0.056414,-0.190466, 0.134068,0.286800,-0.104666, 0.293847,0.266235,0.003176, -0.403938,0.039055,0.078865, -0.372896,0.140712,0.115495, -0.035119,-0.331449,-0.068132, 0.121232,-0.294347,-0.049046, 0.051634,0.305873,-0.087560, 0.254870,0.274829,-0.031097, 0.196475,0.139795,-0.254001, 0.002640,0.112963,-0.287521, 0.198447,0.073853,0.288417, 0.224142,0.132346,-0.243414, 0.225218,-0.213510,0.136980, 0.298178,-0.027388,0.023425, 0.292448,0.199019,0.106734, 0.304944,0.253729,-0.022071, 0.308556,0.186869,0.065231, 0.305066,0.254217,-0.020526, 0.293027,0.163885,-0.150423, 0.287364,0.062429,-0.181183, -}; -// h48 -const int h48_numv = 24; -const float h48_volu = 0.097516; -const float h48_pos[3] = { 0.292729,-0.243911,-0.041409 }; -const float h48_verts[ h48_numv * 3 ] = { - -0.303632,0.058539,0.064682, -0.108656,-0.084639,-0.284158, 0.263889,0.072976,-0.223666, 0.274166,-0.102559,0.259484, 0.253318,-0.136696,0.282134, 0.346872,-0.016291,-0.139905, -0.290945,-0.203383,-0.035982, 0.008763,0.056080,-0.365621, 0.246275,0.103070,-0.201305, 0.107569,-0.173012,0.336398, -0.249499,-0.215623,0.017984, -0.234675,-0.199275,-0.122635, 0.023817,-0.271216,0.180037, 0.169540,-0.271216,0.037729, -0.126686,0.325499,0.137154, 0.195210,-0.264110,0.029895, 0.346221,-0.018608,-0.151429, 0.279567,-0.135810,-0.157801, -0.143837,0.409300,-0.076739, -0.137500,0.415315,-0.067456, -0.031223,0.088614,-0.351675, -0.000004,-0.036295,-0.345501, -0.199646,0.139376,0.250708, -0.108109,-0.019468,0.310070, -}; -// h49 -const int h49_numv = 30; -const float h49_volu = 0.103417; -const float h49_pos[3] = { -0.082648,-0.117151,-0.277803 }; -const float h49_verts[ h49_numv * 3 ] = { - 0.344154,-0.038146,-0.115281, -0.165239,0.018854,-0.286732, -0.342125,0.101770,0.019444, -0.222234,-0.108669,-0.237036, -0.321677,-0.099820,-0.189997, 0.084432,-0.330143,0.200412, -0.076061,0.323891,-0.005566, -0.299921,0.124605,0.111147, -0.223248,0.024754,-0.259418, 0.141702,0.335375,-0.073499, 0.231540,0.282540,0.159656, 0.156937,0.153559,-0.266131, -0.243762,0.195138,-0.076614, -0.084607,-0.105324,0.281990, 0.266721,-0.211399,-0.047765, 0.071745,-0.068221,0.301076, -0.090188,-0.353285,0.059864, -0.342125,-0.109871,-0.162005, -0.074513,-0.141253,0.268436, 0.140702,-0.326035,0.113759, 0.082436,-0.372046,-0.016546, 0.056586,-0.396243,0.036572, 0.007365,-0.408266,0.085169, 0.068619,-0.340196,0.196052, 0.183372,0.187050,-0.241355, 0.271282,0.058201,-0.185174, 0.174655,0.358472,0.106708, -0.046848,0.339089,0.062601, 0.146988,0.365921,0.096121, 0.157998,0.356836,0.037994, -}; -// h50 -const int h50_numv = 20; -const float h50_volu = 0.069183; -const float h50_pos[3] = { -0.304007,-0.060848,0.383791 }; -const float h50_verts[ h50_numv * 3 ] = { - 0.035443,-0.153495,-0.279832, 0.291468,0.207904,0.022524, -0.264086,-0.000880,-0.008953, -0.190383,0.293663,-0.168640, 0.004043,-0.311521,0.367447, -0.001962,-0.311376,0.364440, -0.150982,-0.013645,-0.307481, -0.250305,0.096348,-0.299398, 0.040243,-0.149781,-0.284138, -0.040162,-0.164260,-0.244761, -0.228192,0.064423,0.060664, 0.001805,-0.312717,0.366969, -0.232066,0.208878,-0.232607, -0.273363,0.111395,-0.270548, 0.313541,-0.033043,-0.090641, -0.003673,-0.314626,0.361097, -0.023025,-0.208994,-0.179911, -0.066832,-0.328543,0.255913, -0.170020,0.271491,-0.017447, 0.190786,0.198102,0.196479, -}; -// h51 -const int h51_numv = 20; -const float h51_volu = 0.097496; -const float h51_pos[3] = { 0.796238,0.092236,-0.101631 }; -const float h51_verts[ h51_numv * 3 ] = { - -0.221011,0.347408,0.061823, -0.319697,0.291705,0.052616, 0.203762,-0.222678,0.367837, -0.200562,0.357460,0.033830, 0.203762,0.194344,-0.275142, -0.239620,-0.263171,-0.163444, 0.152653,-0.230111,0.360793, 0.203762,0.321480,-0.157424, -0.337380,0.280442,0.025237, -0.327866,0.285347,0.016786, -0.028332,0.052718,-0.315616, 0.203762,-0.298399,-0.021674, -0.257234,-0.233077,-0.141083, -0.157288,-0.354755,-0.091207, 0.203762,0.006585,0.328526, -0.156637,-0.352438,-0.079683, 0.030926,0.103995,0.283692, -0.036002,0.060886,0.280191, -0.157223,-0.222560,-0.236947, -0.067033,-0.350976,-0.126852, -}; -// h52 -const int h52_numv = 16; -const float h52_volu = 0.084293; -const float h52_pos[3] = { 0.513157,0.018456,0.067444 }; -const float h52_verts[ h52_numv * 3 ] = { - -0.347114,0.063132,0.028301, -0.352265,0.254404,-0.145548, 0.247079,0.134666,0.111116, -0.336736,0.277388,0.070106, 0.126444,-0.278658,-0.248758, -0.340226,0.344736,-0.015651, 0.295476,-0.245782,0.289096, -0.054299,0.354222,-0.143838, 0.053738,-0.364926,0.150631, -0.036616,0.365485,-0.116459, 0.025847,-0.159297,-0.310158, -0.357928,0.152948,-0.176308, 0.019058,0.098592,0.213176, 0.435734,-0.156331,0.191718, -0.340348,0.344248,-0.017196, -0.236518,0.326242,-0.134679, -}; -// h53 -const int h53_numv = 16; -const float h53_volu = 0.086476; -const float h53_pos[3] = { -0.781555,0.807509,0.197497 }; -const float h53_verts[ h53_numv * 3 ] = { - 0.291496,-0.156419,-0.091704, -0.218445,0.192491,0.461269, -0.218445,0.192491,-0.255541, -0.218445,-0.397567,0.047987, 0.027292,-0.381663,-0.020188, -0.218445,-0.373860,0.169935, 0.033835,-0.380512,-0.018262, 0.352556,0.192491,0.043056, 0.162589,-0.213103,-0.139928, 0.191640,-0.261360,-0.072549, 0.238502,0.192491,-0.291089, 0.253338,0.013015,-0.278399, 0.326334,-0.087525,-0.081781, 0.317517,-0.112633,-0.111918, 0.238502,0.081667,-0.310092, 0.153590,0.192491,-0.346370, -}; -// h54 -const int h54_numv = 20; -const float h54_volu = 0.089003; -const float h54_pos[3] = { -0.845912,0.679404,-0.140778 }; -const float h54_verts[ h54_numv * 3 ] = { - 0.317695,0.141120,0.059877, 0.091649,-0.253558,0.318087, -0.154088,0.080768,-0.359617, -0.152707,-0.484157,0.192529, -0.154088,0.320596,0.082735, 0.078976,0.204301,-0.281846, -0.154088,-0.269462,0.386262, -0.154088,0.320596,-0.236248, -0.154088,-0.484416,0.192760, 0.226946,-0.084997,0.198347, 0.060656,0.320596,-0.223141, 0.161719,-0.084997,-0.120143, 0.217947,0.320596,-0.008094, -0.049829,0.124065,-0.330981, -0.154088,-0.230098,-0.199706, -0.019141,-0.278134,-0.109104, 0.160374,0.124065,-0.228342, 0.234799,0.071081,-0.164747, 0.302859,0.209772,0.028184, 0.317695,0.159603,0.012337, -}; -// h55 -const int h55_numv = 16; -const float h55_volu = 0.055290; -const float h55_pos[3] = { 0.087136,0.788999,0.139771 }; -const float h55_verts[ h55_numv * 3 ] = { - 0.076080,-0.416095,-0.083059, -0.323951,0.211001,0.286715, 0.205112,0.211001,-0.185127, 0.076081,0.211001,-0.405639, -0.148237,0.211001,0.332473, 0.101171,-0.226374,0.192117, -0.006832,-0.085411,0.277812, 0.205111,-0.223849,0.038561, -0.274823,0.078877,0.258729, 0.035595,0.211001,-0.415523, 0.074576,-0.413789,-0.064275, 0.079238,-0.416513,-0.077447, 0.107256,-0.249478,0.168347, 0.117855,-0.236273,0.172768, 0.029258,-0.402186,-0.087713, 0.035598,-0.405195,-0.098549, -}; -// h56 -const int h56_numv = 20; -const float h56_volu = 0.096963; -const float h56_pos[3] = { -0.186579,0.800379,0.005269 }; -const float h56_verts[ h56_numv * 3 ] = { - 0.004502,-0.334912,-0.018030, 0.302973,-0.413566,0.046788, 0.309310,0.199621,-0.281021, -0.242420,0.199621,0.235284, -0.121421,0.199621,0.412527, 0.172708,0.199621,-0.357250, -0.050236,0.199621,0.421217, -0.341638,0.020145,-0.086171, -0.356474,0.199621,-0.098861, 0.097656,0.085128,-0.340236, -0.001108,0.067497,0.393231, -0.356474,0.088797,-0.117864, -0.277459,-0.105503,0.080310, 0.309314,-0.416575,0.035953, 0.106078,-0.385531,-0.020510, 0.188512,-0.404604,-0.037617, -0.268642,-0.080395,0.110447, -0.118494,0.123210,0.393231, -0.341638,0.038628,-0.133710, -0.322853,0.025254,-0.145176, -}; -// h57 -const int h57_numv = 16; -const float h57_volu = 0.081294; -const float h57_pos[3] = { 0.851151,0.533342,0.098902 }; -const float h57_verts[ h57_numv * 3 ] = { - -0.184097,0.265595,0.004922, 0.148849,0.009818,-0.380153, 0.148849,-0.049459,0.325702, -0.275924,-0.093697,-0.138710, 0.148849,-0.119626,-0.357957, -0.275924,0.137573,0.059567, -0.112901,0.343928,0.059438, -0.249462,0.157589,0.121951, 0.148849,-0.434521,0.127992, 0.148849,0.447452,0.070089, 0.148849,-0.343521,0.212252, -0.023987,-0.337111,0.083159, -0.018406,-0.089149,0.305285, -0.008312,-0.125079,0.291731, -0.255475,-0.083645,-0.166703, -0.157047,0.040928,-0.236124, -}; -// h58 -const int h58_numv = 20; -const float h58_volu = 0.077812; -const float h58_pos[3] = { 0.374418,0.849026,0.291935 }; -const float h58_verts[ h58_numv * 3 ] = { - -0.082171,-0.283876,-0.113603, 0.200809,-0.178111,-0.133466, -0.082170,0.150974,-0.337291, 0.089508,-0.034332,0.259248, 0.146093,0.150974,0.326019, 0.410849,0.150974,-0.104898, -0.435519,0.150974,0.180309, -0.294114,-0.145438,0.125648, 0.292636,-0.050089,-0.188111, 0.183309,0.150974,-0.304884, 0.227271,-0.158095,-0.071082, 0.363832,0.028244,-0.133595, -0.169427,-0.296300,0.020604, 0.087144,-0.178878,0.139171, 0.071270,-0.146859,0.192458, -0.429747,0.150974,0.185433, -0.186111,-0.286401,0.039952, 0.048213,-0.131812,0.221308, -0.268420,-0.171352,0.132706, -0.212551,-0.233071,0.128708, -}; -// h59 -const int h59_numv = 12; -const float h59_volu = 0.098632; -const float h59_pos[3] = { 0.795288,0.838821,-0.270144 }; -const float h59_verts[ h59_numv * 3 ] = { - -0.010021,0.161179,0.457181, -0.356162,0.161179,-0.206090, 0.204712,-0.152000,-0.380610, 0.204712,0.161179,-0.434310, -0.057037,0.038449,0.428484, -0.237561,0.161179,0.257195, -0.256523,-0.089455,-0.203657, -0.128234,-0.039885,0.373968, 0.204712,-0.295661,-0.011106, -0.101183,-0.264551,0.132922, 0.204712,0.141973,0.439135, 0.204712,0.161179,0.444075, -}; -// h60 -const int h60_numv = 22; -const float h60_volu = 0.091310; -const float h60_pos[3] = { 0.415485,0.715407,-0.130668 }; -const float h60_verts[ h60_numv * 3 ] = { - -0.064779,0.284593,-0.364069, 0.142242,0.284593,0.117719, -0.242554,-0.352215,0.182461, 0.061056,-0.331466,0.081653, 0.180191,-0.265711,0.062868, 0.251569,0.083531,0.234492, -0.123237,0.284593,0.085312, -0.123238,-0.150257,0.309000, 0.159742,-0.044491,0.289138, 0.278619,-0.141137,-0.006553, -0.252268,0.284593,-0.135200, 0.123280,0.033960,-0.343133, 0.052142,0.000197,-0.360501, 0.023641,0.284593,-0.345566, 0.159742,-0.275763,0.090860, -0.138846,-0.370709,0.063434, -0.249111,-0.342921,0.192992, -0.046519,-0.292460,-0.089523, -0.252269,-0.342503,0.187380, -0.242676,-0.352703,0.180916, 0.052887,-0.337824,0.045824, 0.043373,-0.342729,0.054274, -}; -// h61 -const int h61_numv = 24; -const float h61_volu = 0.075853; -const float h61_pos[3] = { 0.499694,0.403970,0.252554 }; -const float h61_verts[ h61_numv * 3 ] = { - 0.101994,0.286961,-0.031701, -0.294704,0.148756,0.059985, -0.023153,-0.020028,-0.301569, 0.156136,0.037589,0.286475, -0.323273,-0.108125,-0.115004, 0.032521,-0.286922,0.028066, -0.038132,0.266178,0.178552, 0.260541,-0.250848,-0.073994, 0.327470,-0.207739,-0.070493, 0.075532,0.266945,-0.094084, 0.075532,0.035675,-0.292362, 0.343145,0.004293,0.138079, 0.231743,0.048354,0.251404, 0.045317,0.188205,0.223756, -0.087937,-0.209333,0.181412, -0.330859,-0.089605,0.055955, 0.333052,0.040223,0.151633, 0.236542,0.052068,0.247099, -0.339382,-0.095975,-0.073501, -0.326763,-0.040778,-0.200761, -0.207448,0.161180,-0.074222, -0.333320,-0.031483,-0.190230, -0.305302,0.135551,0.055565, -0.337982,-0.028760,-0.177059, -}; -// h62 -const int h62_numv = 18; -const float h62_volu = 0.089635; -const float h62_pos[3] = { -0.412607,-0.798932,0.393221 }; -const float h62_verts[ h62_numv * 3 ] = { - 0.143743,0.178906,-0.080212, -0.336591,-0.057070,0.045432, -0.365487,-0.201068,0.063069, -0.043446,-0.201068,0.325146, -0.118881,0.178753,-0.144486, -0.152818,-0.201068,-0.248459, 0.205095,-0.201068,-0.388268, 0.337853,-0.164947,-0.214818, 0.038585,0.368996,0.228990, 0.242459,-0.068737,-0.310888, -0.200495,0.172297,-0.114599, -0.231981,0.184967,-0.066303, 0.334110,-0.201068,-0.227916, 0.209245,-0.110463,-0.361925, 0.145031,0.335652,0.325145, 0.169974,0.297178,0.268816, -0.151147,0.272981,0.102025, 0.044821,0.272804,-0.007759, -}; -// h63 -const int h63_numv = 20; -const float h63_volu = 0.065070; -const float h63_pos[3] = { -0.683722,-0.408459,0.881106 }; -const float h63_verts[ h63_numv * 3 ] = { - 0.408763,0.050375,-0.050997, 0.001643,0.372246,0.104787, -0.316278,-0.373443,0.118894, -0.000569,0.379463,0.118894, -0.316278,-0.303582,-0.012874, 0.413107,-0.090210,0.118894, 0.072977,-0.026465,-0.250457, -0.316278,0.104758,0.118894, -0.133134,0.036421,-0.232486, -0.316278,-0.061367,-0.137470, 0.406500,0.014459,-0.083368, 0.416439,0.055265,0.118894, 0.411396,0.069115,-0.001513, 0.370009,0.144956,0.118894, 0.377753,0.036235,-0.132875, 0.381520,0.034894,-0.130346, 0.374104,0.031050,-0.138388, 0.376042,0.032985,-0.136218, 0.383396,0.034505,-0.128411, 0.385682,0.029196,-0.126410, -}; -// h64 -const int h64_numv = 14; -const float h64_volu = 0.063334; -const float h64_pos[3] = { -0.862240,-0.589074,0.504780 }; -const float h64_verts[ h64_numv * 3 ] = { - -0.034062,-0.410926,-0.010011, 0.045384,0.217035,0.143840, 0.295955,0.147819,0.066170, 0.251495,0.154150,0.125869, -0.137760,-0.410926,0.116573, -0.137760,0.324258,-0.236366, -0.137760,0.210059,-0.342106, -0.137760,-0.122967,0.363452, -0.137760,-0.410926,-0.022669, 0.298486,0.063123,-0.009534, -0.137760,0.298525,-0.037806, 0.113042,-0.266928,-0.066127, -0.137760,0.119248,0.238856, 0.217652,-0.024891,-0.177862, -}; -// h65 -const int h65_numv = 22; -const float h65_volu = 0.115639; -const float h65_pos[3] = { -0.632833,-0.759826,0.781144 }; -const float h65_verts[ h65_numv * 3 ] = { - -0.367167,-0.022076,0.218856, 0.176779,-0.240174,-0.062777, -0.145261,-0.240174,-0.324854, -0.367167,-0.240174,-0.159791, -0.367167,-0.240174,0.218856, 0.229214,-0.240174,0.218856, -0.367167,0.047785,0.087088, 0.379478,0.318313,-0.027451, 0.258810,0.329890,-0.158933, 0.022088,0.324902,-0.150495, -0.263470,-0.240174,-0.286375, -0.116365,-0.096176,-0.342491, 0.384007,0.200623,0.218856, 0.365257,0.296546,-0.062778, 0.323215,0.382417,-0.038426, 0.362218,0.261157,0.218856, 0.374110,0.331198,-0.022696, 0.069079,0.233875,-0.285898, 0.066548,0.318571,-0.210194, 0.259984,0.356129,-0.135062, 0.334793,0.380563,-0.026448, 0.355611,0.365826,0.016594, -}; -// h66 -const int h66_numv = 12; -const float h66_volu = 0.090843; -const float h66_pos[3] = { 0.194452,-0.846656,0.702344 }; -const float h66_verts[ h66_numv * 3 ] = { - 0.144722,0.221953,-0.171396, 0.354760,-0.153344,-0.123136, 0.229722,0.177289,-0.118776, -0.077080,-0.093853,-0.442151, -0.263367,-0.153344,0.297656, 0.293204,-0.153344,0.297656, -0.291202,0.163722,0.297656, 0.229722,0.015381,0.297656, -0.072437,-0.153344,-0.456885, -0.246539,0.275009,-0.021290, -0.133324,-0.153344,-0.464317, -0.137311,-0.122439,-0.456854, -}; -// h67 -const int h67_numv = 14; -const float h67_volu = 0.073139; -const float h67_pos[3] = { -0.182450,-0.819619,0.699488 }; -const float h67_verts[ h67_numv * 3 ] = { - 0.085699,0.136685,0.300512, -0.221169,-0.180381,0.300512, -0.273604,-0.180381,0.018878, 0.130363,0.247972,-0.018435, -0.085126,0.356339,0.018877, 0.113535,-0.180381,0.300512, -0.066376,0.260416,0.300512, -0.060183,0.317865,-0.037452, 0.103953,-0.180381,-0.534183, 0.107696,-0.144260,-0.521085, 0.239592,-0.149476,-0.453999, 0.243578,-0.180381,-0.461462, -0.070905,0.378106,0.054205, -0.032656,0.358692,0.028913, -}; -// h68 -const int h68_numv = 24; -const float h68_volu = 0.110178; -const float h68_pos[3] = { 0.194790,-0.476753,0.823942 }; -const float h68_verts[ h68_numv * 3 ] = { - -0.387371,0.030890,-0.107289, 0.221446,0.021860,-0.353469, -0.465405,-0.021917,0.176058, -0.291540,-0.206181,0.176058, 0.076464,0.334736,-0.007133, 0.229384,-0.354523,0.176058, 0.292644,0.032441,-0.334080, -0.452945,0.146290,0.025179, 0.246219,0.093034,-0.297244, 0.229037,0.025757,-0.352826, 0.107091,0.321655,0.176058, 0.390186,-0.018723,0.176058, 0.312682,0.010704,-0.315910, 0.229384,-0.192615,-0.240374, 0.144384,-0.147950,-0.292995, -0.246877,-0.094895,-0.142888, -0.409896,0.015825,-0.095540, -0.443616,-0.082450,0.176058, -0.462073,0.123559,0.176058, -0.472012,0.082753,-0.026204, -0.453513,0.048124,-0.065494, -0.448145,0.035240,-0.070249, -0.469749,0.118668,0.006167, -0.467116,0.137408,0.055651, -}; -// h69 -const int h69_numv = 18; -const float h69_volu = 0.150904; -const float h69_pos[3] = { 0.751581,-0.668854,0.749549 }; -const float h69_verts[ h69_numv * 3 ] = { - 0.248419,0.357221,0.250451, -0.263925,-0.331146,0.250451, 0.248419,0.283773,-0.306518, 0.248419,-0.331146,0.009798, 0.000203,0.129153,-0.348181, 0.248419,-0.331146,0.250451, -0.202369,-0.331146,-0.170342, -0.161439,-0.331146,-0.190328, 0.248419,0.424683,-0.270088, -0.087381,0.269445,-0.329471, -0.149648,0.251714,-0.296027, -0.327407,-0.162422,0.250451, -0.166605,0.173379,0.250451, -0.045433,0.301175,-0.321470, -0.327407,-0.000512,-0.165981, -0.244109,0.202806,-0.241517, 0.223596,0.415674,-0.285417, 0.248419,0.419976,-0.283164, -}; -// h70 -const int h70_numv = 8; -const float h70_volu = 0.052841; -const float h70_pos[3] = { 0.870032,-0.820199,0.384721 }; -const float h70_verts[ h70_numv * 3 ] = { - 0.129968,-0.179801,0.374626, 0.129968,-0.179801,-0.351943, -0.279890,-0.179801,0.174500, 0.129968,0.435118,0.058310, -0.112815,-0.179801,-0.233397, -0.118249,0.280498,0.016648, 0.129968,-0.066134,-0.371433, -0.064784,-0.043027,-0.280302, -}; -// h71 -const int h71_numv = 16; -const float h71_volu = 0.078575; -const float h71_pos[3] = { -0.715618,-0.146967,0.614144 }; -const float h71_verts[ h71_numv * 3 ] = { - -0.284382,-0.099249,-0.355298, 0.407938,-0.228507,0.130744, -0.284382,-0.117849,-0.345730, 0.406000,-0.230442,0.128574, 0.033539,0.110754,0.371749, 0.104873,-0.287957,0.016505, -0.197952,0.422046,0.249299, -0.284382,0.237452,0.048837, -0.101238,-0.225072,0.034476, -0.284382,-0.143582,-0.147170, 0.149333,-0.294288,-0.043194, 0.409649,-0.225257,0.134087, 0.147525,0.085239,-0.239307, 0.183419,0.150542,-0.169689, 0.342769,-0.256730,0.031938, 0.344779,-0.242424,0.025560, -}; -// h72 -const int h72_numv = 24; -const float h72_volu = 0.135103; -const float h72_pos[3] = { -0.469590,0.119774,0.755853 }; -const float h72_verts[ h72_numv * 3 ] = { - -0.212489,-0.155987,0.230040, -0.214701,-0.148769,0.244147, -0.443980,0.155306,0.107590, 0.375305,0.040715,-0.139275, -0.004437,0.090870,-0.389509, 0.311360,0.156806,0.046426, -0.480672,0.247962,0.244147, -0.005314,0.363706,-0.137567, 0.163621,-0.491997,-0.007622, 0.213688,0.055724,0.244147, -0.495580,0.247143,0.161130, -0.499540,0.269230,0.219387, 0.144703,0.290282,-0.088352, 0.355676,0.140088,-0.062598, -0.062609,-0.116199,-0.311398, -0.088334,0.254773,-0.303291, 0.356369,0.017480,-0.175583, 0.155877,-0.383277,0.244147, 0.169264,-0.493727,-0.003158, 0.197264,-0.459118,0.123740, 0.194631,-0.477857,0.074256, 0.211435,-0.450236,0.093267, 0.167388,-0.493339,-0.005093, 0.169626,-0.492143,-0.004615, -}; -// h73 -const int h73_numv = 16; -const float h73_volu = 0.036032; -const float h73_pos[3] = { -0.912743,-0.085439,0.831075 }; -const float h73_verts[ h73_numv * 3 ] = { - 0.095887,-0.286600,-0.182455, -0.087257,0.175924,-0.168094, -0.087257,-0.205110,-0.364101, 0.230664,0.049226,0.154818, -0.037519,0.453174,0.168925, 0.228452,0.056443,0.168925, -0.087257,0.484247,0.168925, -0.000826,0.360518,0.032367, -0.087257,-0.218262,0.168925, -0.087257,-0.384387,-0.087440, -0.087257,0.485343,0.150329, -0.064760,0.476158,0.168925, -0.052427,0.452355,0.085908, -0.087257,0.457669,0.073457, -0.056387,0.474442,0.144165, -0.056885,0.474757,0.144652, -}; -// h74 -const int h74_numv = 22; -const float h74_volu = 0.115647; -const float h74_pos[3] = { -0.806688,0.162223,0.365754 }; -const float h74_verts[ h74_numv * 3 ] = { - -0.106882,0.112856,0.497689, -0.158482,0.204693,0.551229, 0.218764,0.243174,-0.153679, 0.270615,-0.014193,-0.214570, -0.193312,-0.071737,0.297227, 0.312298,0.070592,-0.150604, -0.069795,-0.227826,-0.358730, 0.248765,0.212323,0.086808, -0.193312,-0.408439,-0.106908, -0.193312,0.210007,0.538778, 0.301657,0.087464,-0.177940, -0.191931,0.033024,-0.314003, -0.193312,0.271426,0.001678, 0.058968,0.264774,-0.186519, -0.193312,0.247719,-0.120270, 0.052425,0.263623,-0.188445, 0.332661,0.048420,0.000590, 0.274489,-0.158648,0.078702, 0.238595,-0.223951,0.009084, 0.229318,-0.111676,-0.252511, -0.193312,-0.302733,-0.342536, -0.193312,0.032765,-0.313772, -}; -// h75 -const int h75_numv = 18; -const float h75_volu = 0.089620; -const float h75_pos[3] = { 0.052817,0.072055,0.868740 }; -const float h75_verts[ h75_numv * 3 ] = { - 0.433734,0.123433,0.131260, 0.005775,0.176863,-0.278988, 0.218437,-0.214071,-0.051932, -0.366530,-0.335558,0.131260, -0.308719,0.103443,0.131260, -0.147102,0.088434,-0.252162, -0.310972,-0.402518,-0.019619, -0.003079,0.231496,-0.237914, 0.112171,0.347564,-0.006639, 0.302595,-0.019353,-0.141822, 0.235603,0.353295,0.131260, 0.077918,0.377107,0.131260, 0.249063,-0.227153,0.131260, -0.166731,0.187806,-0.175486, -0.093909,0.310921,0.131260, -0.211047,0.204525,-0.066461, -0.325143,-0.411399,0.010853, -0.320100,-0.425249,0.131260, -}; -// h76 -const int h76_numv = 24; -const float h76_volu = 0.095138; -const float h76_pos[3] = { 0.088788,-0.142804,0.576459 }; -const float h76_verts[ h76_numv * 3 ] = { - 0.352221,-0.240915,-0.049761, -0.386828,-0.236459,0.178237, 0.182466,0.000788,0.240349, -0.006268,0.044860,-0.340368, 0.298110,0.182836,0.102163, -0.389114,-0.231150,0.176236, -0.030195,0.391722,0.013292, -0.363747,-0.215280,0.253650, -0.388752,-0.229565,0.174779, -0.101327,0.289860,-0.170144, 0.328315,-0.307617,-0.113256, -0.079254,0.048914,-0.283309, 0.094387,-0.120263,-0.302438, -0.281369,-0.303059,0.140194, 0.335039,-0.308192,-0.105343, 0.327448,-0.312089,-0.105986, 0.022142,0.379302,-0.133650, -0.346943,-0.187659,0.272661, -0.202009,0.280058,0.003811, -0.183073,0.303293,0.040119, 0.266624,0.195506,0.150459, -0.022476,0.325632,-0.215723, -0.347511,-0.285824,0.181989, -0.366010,-0.251196,0.221279, -}; -// h77 -const int h77_numv = 26; -const float h77_volu = 0.087804; -const float h77_pos[3] = { 0.390778,-0.073451,0.362494 }; -const float h77_verts[ h77_numv * 3 ] = { - -0.003880,0.113483,0.316128, 0.315369,-0.294228,0.065585, -0.206158,-0.189928,-0.093832, 0.020979,0.268088,0.071472, -0.324466,0.256279,-0.001758, -0.230465,0.381445,-0.183441, 0.426887,-0.187811,0.054869, 0.211155,-0.343689,0.091028, -0.224735,0.155039,-0.266749, 0.077733,0.119939,0.286241, 0.026325,-0.376970,0.100709, -0.297695,-0.031084,-0.153195, 0.009520,-0.343472,-0.067504, 0.155269,-0.307156,-0.121769, -0.207604,-0.189616,-0.088472, -0.308258,-0.024493,-0.126403, 0.050231,-0.310268,0.164204, 0.176117,-0.273019,-0.144419, 0.417855,-0.153875,-0.005953, 0.273422,-0.325958,0.057585, 0.096656,-0.370860,0.127368, 0.033049,-0.377545,0.108622, -0.214357,0.369295,-0.224944, 0.141437,0.190499,-0.081874, -0.279848,0.309949,0.080316, -0.221943,0.387815,-0.053985, -}; -// h78 -const int h78_numv = 20; -const float h78_volu = 0.126407; -const float h78_pos[3] = { 0.652845,-0.171711,0.785711 }; -const float h78_verts[ h78_numv * 3 ] = { - -0.350965,0.016612,0.214289, 0.347155,-0.072460,-0.306250, -0.381591,0.029695,0.031097, 0.347155,-0.139922,0.214289, 0.322332,-0.081469,-0.321579, -0.265947,0.211743,-0.107089, -0.020631,0.312250,-0.000249, 0.347155,0.151286,0.214289, 0.347155,-0.036860,-0.269624, -0.184333,0.218199,-0.136976, -0.297433,0.224413,-0.058793, -0.211836,-0.212008,-0.259013, -0.050911,-0.245429,-0.332189, -0.067869,-0.323764,0.214289, -0.166294,0.367199,0.214289, -0.026282,0.399418,0.214289, -0.145373,-0.294337,-0.277679, -0.165410,-0.272600,-0.295849, 0.053302,-0.195968,-0.357632, 0.164820,-0.089551,-0.368349, -}; -// h79 -const int h79_numv = 20; -const float h79_volu = 0.069132; -const float h79_pos[3] = { 0.747670,0.086302,0.441993 }; -const float h79_verts[ h79_numv * 3 ] = { - 0.252330,0.012519,-0.215098, 0.012566,0.066820,-0.263433, 0.201221,-0.224177,-0.182831, 0.095169,0.321961,-0.051360, -0.091840,0.355257,0.097036, -0.215455,0.030746,-0.161373, -0.279159,-0.039814,0.206742, 0.060963,-0.313628,-0.085453, -0.115456,0.054238,0.343469, 0.252330,-0.294873,0.074094, -0.016233,0.366022,0.061965, -0.074702,0.310522,0.161887, 0.252330,0.103519,-0.130839, 0.252330,-0.216744,-0.175787, -0.335913,0.108335,-0.008027, 0.079494,0.109929,-0.259932, 0.069995,-0.347564,-0.024631, 0.252330,-0.330473,0.037468, 0.252330,-0.335180,0.024392, 0.227507,-0.339482,0.022139, -}; -// h80 -const int h80_numv = 14; -const float h80_volu = 0.076324; -const float h80_pos[3] = { 0.872729,0.237609,0.718600 }; -const float h80_verts[ h80_numv * 3 ] = { - 0.127271,0.331095,-0.032200, 0.127271,-0.258034,0.281400, 0.127271,-0.446180,-0.202512, -0.199761,0.159215,-0.114719, -0.141292,0.214715,-0.214641, -0.136492,0.218429,-0.218946, -0.240515,-0.097070,0.066863, -0.246166,-0.009903,0.281400, -0.239577,0.050556,0.281400, 0.127271,0.263358,0.281400, 0.127271,0.246274,-0.293996, 0.127271,-0.047788,-0.407445, -0.039983,0.206584,-0.314412, -0.029889,0.170654,-0.327966, -}; -// h81 -const int h81_numv = 10; -const float h81_volu = 0.092471; -const float h81_pos[3] = { -0.647649,0.823554,0.820209 }; -const float h81_verts[ h81_numv * 3 ] = { - 0.457657,0.176446,0.179791, -0.352351,-0.423650,0.161195, -0.352351,0.176446,-0.147497, -0.352351,-0.424746,0.179791, -0.352351,0.176446,0.179791, 0.395926,0.059255,0.179791, 0.203225,-0.169390,-0.173056, 0.338792,0.176446,-0.400601, -0.321979,-0.434236,0.155518, -0.329854,-0.432835,0.179791, -}; -// h82 -const int h82_numv = 22; -const float h82_volu = 0.133984; -const float h82_pos[3] = { -0.704013,0.655334,0.510913 }; -const float h82_verts[ h82_numv * 3 ] = { - -0.295987,0.344666,0.147853, 0.143982,-0.175036,-0.341668, -0.295987,-0.255430,0.470491, 0.398940,0.268255,-0.112413, -0.265615,-0.266016,0.464814, -0.043708,-0.228337,-0.331678, 0.395156,0.344666,-0.091306, 0.146090,-0.280788,-0.058352, 0.259589,-0.001170,0.136240, -0.295987,0.344666,0.161799, 0.268488,-0.087750,0.102566, -0.295987,-0.221685,-0.143481, -0.265117,-0.266331,0.464327, 0.229109,-0.171854,0.107373, -0.295987,-0.283104,0.393619, -0.261157,-0.288418,0.406070, 0.116089,-0.249937,-0.298838, 0.396013,0.344666,-0.093117, 0.248792,0.064649,-0.395197, 0.275014,0.344666,-0.270360, 0.114098,-0.109185,-0.385965, 0.213954,-0.004245,-0.405120, -}; -// h83 -const int h83_numv = 12; -const float h83_volu = 0.056796; -const float h83_pos[3] = { -0.429347,0.488254,0.882979 }; -const float h83_verts[ h83_numv * 3 ] = { - -0.006178,0.079330,-0.269501, -0.548156,-0.097535,0.117020, -0.015077,0.165910,-0.235826, -0.540281,-0.098936,0.092747, 0.104460,-0.078198,-0.215479, 0.388255,-0.105278,0.117020, 0.173445,-0.312756,0.117020, 0.177624,0.394555,0.117020, -0.045557,-0.004774,-0.264694, 0.271117,-0.211674,-0.080700, -0.539783,-0.099251,0.092261, -0.520915,-0.120519,0.117020, -}; -// h84 -const int h84_numv = 22; -const float h84_volu = 0.109330; -const float h84_pos[3] = { -0.121674,0.670783,0.713170 }; -const float h84_verts[ h84_numv * 3 ] = { - -0.313851,-0.103198,-0.099691, -0.010109,0.329217,0.286830, 0.252410,-0.221620,0.286830, -0.068318,0.329217,0.286830, 0.080582,-0.287807,0.286830, 0.201978,0.032805,-0.295587, -0.187183,0.329217,-0.293562, 0.227672,0.006891,-0.288529, -0.130049,0.212026,0.286830, -0.322750,-0.016619,-0.066017, -0.036556,-0.394202,0.089109, 0.171412,-0.367231,-0.082344, -0.203213,-0.260726,-0.045669, 0.007760,-0.410921,-0.019916, 0.265234,-0.083360,-0.251274, 0.286662,-0.251163,0.148930, -0.115141,0.329217,-0.286684, -0.066013,0.197094,-0.314670, -0.183399,0.252807,-0.314670, -0.186326,0.329217,-0.295374, 0.060573,0.329217,-0.240926, 0.066345,0.329217,-0.235802, -}; -// h85 -const int h85_numv = 36; -const float h85_volu = 0.148789; -const float h85_pos[3] = { -0.198763,0.456116,0.345386 }; -const float h85_verts[ h85_numv * 3 ] = { - 0.248501,-0.152565,0.285440, 0.011075,0.411760,0.053114, 0.304761,0.221558,0.079254, 0.360475,-0.080906,-0.269891, -0.389161,-0.050719,-0.133311, 0.279067,0.247472,0.072197, 0.342323,0.131307,0.116509, -0.236762,0.111468,0.268093, 0.084849,-0.196255,0.347868, 0.186224,-0.309060,0.060929, -0.295627,-0.223301,-0.130236, 0.016686,0.009351,-0.358147, 0.315157,-0.069303,-0.293328, -0.106311,0.467473,0.053114, 0.257356,-0.207198,0.244366, 0.367598,-0.141752,-0.036878, 0.104478,-0.295627,0.271192, -0.126124,-0.046060,0.322115, -0.256458,0.263868,-0.229670, 0.085542,-0.318862,0.234884, -0.291296,0.194974,-0.239593, -0.265275,0.238760,-0.259807, -0.361268,0.024182,-0.176141, -0.291163,-0.195420,-0.172718, -0.276141,0.027364,0.272900, -0.306268,-0.206429,-0.157572, -0.275264,-0.245473,0.020958, -0.359160,-0.081570,0.107176, 0.360630,0.159839,0.075257, 0.387070,0.106509,-0.013499, 0.393155,0.083405,-0.037268, 0.359076,-0.148122,-0.166333, 0.309693,-0.219618,0.097423, 0.265075,-0.273288,0.015350, 0.118262,-0.041268,-0.360627, 0.049809,-0.043705,-0.365222, -}; -// h86 -const int h86_numv = 14; -const float h86_volu = 0.108919; -const float h86_pos[3] = { 0.238541,0.789776,0.775739 }; -const float h86_verts[ h86_numv * 3 ] = { - -0.094981,-0.202353,-0.313843, -0.370325,0.210224,0.224261, -0.076674,-0.173821,-0.355096, 0.281969,0.210224,-0.157785, 0.225385,0.024918,-0.224556, 0.374020,0.210224,0.224261, 0.316487,0.210224,-0.084750, -0.107806,-0.340614,0.224261, 0.201351,-0.281476,0.224261, 0.184090,-0.072562,-0.262496, -0.073553,-0.370157,0.086361, 0.049879,-0.364426,0.224261, -0.132543,-0.112102,-0.351098, -0.293871,0.210224,-0.298371, -}; -// h87 -const int h87_numv = 16; -const float h87_volu = 0.089360; -const float h87_pos[3] = { 0.798384,0.791714,0.481127 }; -const float h87_verts[ h87_numv * 3 ] = { - -0.277873,0.208286,0.136827, -0.253373,-0.199539,-0.004817, 0.201616,0.208286,-0.307196, 0.201616,0.189080,-0.312136, 0.201616,-0.223010,0.205272, 0.201616,0.208286,0.427133, 0.201616,-0.307831,-0.056523, -0.352696,-0.089547,0.003266, -0.060134,0.085556,-0.322787, -0.013117,0.208286,-0.294090, -0.336822,-0.121565,-0.050021, -0.196695,-0.100782,-0.260274, -0.062147,-0.335676,0.018525, 0.034362,-0.347521,-0.076940, -0.334458,0.022980,0.070056, -0.243356,0.208286,0.209862, -}; -// h88 -const int h88_numv = 26; -const float h88_volu = 0.102785; -const float h88_pos[3] = { 0.372790,0.365732,0.656967 }; -const float h88_verts[ h88_numv * 3 ] = { - -0.084370,0.059618,0.343033, 0.095722,-0.319244,-0.008232, 0.172221,0.226443,-0.180656, 0.300178,0.031092,-0.053086, 0.259424,-0.225193,0.128495, 0.253773,-0.138025,0.343033, -0.207802,0.053887,0.205134, 0.072899,0.336435,-0.172573, -0.203955,-0.051368,-0.348458, 0.260362,-0.077566,0.343033, 0.038967,-0.171095,-0.223000, 0.088772,0.304416,-0.225861, 0.113761,-0.170244,0.343033, 0.067103,0.142568,0.343033, -0.229230,0.221691,-0.195070, -0.323052,-0.062181,-0.026140, 0.014109,-0.325700,0.021656, -0.261860,-0.129234,-0.214158, -0.017378,-0.313030,0.069951, -0.314197,-0.116814,-0.067215, 0.049841,0.351482,-0.143724, -0.178398,0.173789,-0.348849, -0.210923,0.250223,-0.236324, 0.283040,0.075827,-0.117937, -0.184483,0.196893,-0.325078, -0.167799,0.186994,-0.344427, -}; -// h89 -const int h89_numv = 16; -const float h89_volu = 0.098811; -const float h89_pos[3] = { 0.713605,0.673779,0.814484 }; -const float h89_verts[ h89_numv * 3 ] = { - -0.273713,-0.165479,0.185516, -0.080453,-0.385613,0.185516, 0.286395,-0.172812,0.185516, 0.286395,0.326221,0.093776, -0.101044,0.326221,0.185516, 0.286395,0.326221,0.185516, 0.017832,-0.221455,-0.310526, 0.286395,-0.105074,-0.128085, -0.040637,-0.276955,-0.210604, -0.057774,-0.232220,-0.275455, -0.158577,0.326221,-0.123495, -0.267917,0.028388,-0.330091, -0.290974,0.043435,-0.301241, -0.249679,0.140915,-0.263301, -0.168594,-0.081604,-0.338174, 0.022632,-0.217741,-0.314831, -}; - -//Aggregate of all cells. -const int halton_numc = 90; -const int halton_numv[ halton_numc ] = { - h00_numv,h01_numv,h02_numv,h03_numv,h04_numv,h05_numv,h06_numv,h07_numv,h08_numv,h09_numv,h10_numv,h11_numv,h12_numv,h13_numv,h14_numv,h15_numv,h16_numv,h17_numv,h18_numv,h19_numv,h20_numv,h21_numv,h22_numv,h23_numv,h24_numv,h25_numv,h26_numv,h27_numv,h28_numv,h29_numv,h30_numv,h31_numv,h32_numv,h33_numv,h34_numv,h35_numv,h36_numv,h37_numv,h38_numv,h39_numv,h40_numv,h41_numv,h42_numv,h43_numv,h44_numv,h45_numv,h46_numv,h47_numv,h48_numv,h49_numv,h50_numv,h51_numv,h52_numv,h53_numv,h54_numv,h55_numv,h56_numv,h57_numv,h58_numv,h59_numv,h60_numv,h61_numv,h62_numv,h63_numv,h64_numv,h65_numv,h66_numv,h67_numv,h68_numv,h69_numv,h70_numv,h71_numv,h72_numv,h73_numv,h74_numv,h75_numv,h76_numv,h77_numv,h78_numv,h79_numv,h80_numv,h81_numv,h82_numv,h83_numv,h84_numv,h85_numv,h86_numv,h87_numv,h88_numv,h89_numv, -}; -const float halton_volu[ halton_numc ] = { - h00_volu,h01_volu,h02_volu,h03_volu,h04_volu,h05_volu,h06_volu,h07_volu,h08_volu,h09_volu,h10_volu,h11_volu,h12_volu,h13_volu,h14_volu,h15_volu,h16_volu,h17_volu,h18_volu,h19_volu,h20_volu,h21_volu,h22_volu,h23_volu,h24_volu,h25_volu,h26_volu,h27_volu,h28_volu,h29_volu,h30_volu,h31_volu,h32_volu,h33_volu,h34_volu,h35_volu,h36_volu,h37_volu,h38_volu,h39_volu,h40_volu,h41_volu,h42_volu,h43_volu,h44_volu,h45_volu,h46_volu,h47_volu,h48_volu,h49_volu,h50_volu,h51_volu,h52_volu,h53_volu,h54_volu,h55_volu,h56_volu,h57_volu,h58_volu,h59_volu,h60_volu,h61_volu,h62_volu,h63_volu,h64_volu,h65_volu,h66_volu,h67_volu,h68_volu,h69_volu,h70_volu,h71_volu,h72_volu,h73_volu,h74_volu,h75_volu,h76_volu,h77_volu,h78_volu,h79_volu,h80_volu,h81_volu,h82_volu,h83_volu,h84_volu,h85_volu,h86_volu,h87_volu,h88_volu,h89_volu, -}; -const float* halton_pos[ halton_numc ] = { - h00_pos,h01_pos,h02_pos,h03_pos,h04_pos,h05_pos,h06_pos,h07_pos,h08_pos,h09_pos,h10_pos,h11_pos,h12_pos,h13_pos,h14_pos,h15_pos,h16_pos,h17_pos,h18_pos,h19_pos,h20_pos,h21_pos,h22_pos,h23_pos,h24_pos,h25_pos,h26_pos,h27_pos,h28_pos,h29_pos,h30_pos,h31_pos,h32_pos,h33_pos,h34_pos,h35_pos,h36_pos,h37_pos,h38_pos,h39_pos,h40_pos,h41_pos,h42_pos,h43_pos,h44_pos,h45_pos,h46_pos,h47_pos,h48_pos,h49_pos,h50_pos,h51_pos,h52_pos,h53_pos,h54_pos,h55_pos,h56_pos,h57_pos,h58_pos,h59_pos,h60_pos,h61_pos,h62_pos,h63_pos,h64_pos,h65_pos,h66_pos,h67_pos,h68_pos,h69_pos,h70_pos,h71_pos,h72_pos,h73_pos,h74_pos,h75_pos,h76_pos,h77_pos,h78_pos,h79_pos,h80_pos,h81_pos,h82_pos,h83_pos,h84_pos,h85_pos,h86_pos,h87_pos,h88_pos,h89_pos, -}; -const float* halton_verts[ halton_numc ] = { - h00_verts,h01_verts,h02_verts,h03_verts,h04_verts,h05_verts,h06_verts,h07_verts,h08_verts,h09_verts,h10_verts,h11_verts,h12_verts,h13_verts,h14_verts,h15_verts,h16_verts,h17_verts,h18_verts,h19_verts,h20_verts,h21_verts,h22_verts,h23_verts,h24_verts,h25_verts,h26_verts,h27_verts,h28_verts,h29_verts,h30_verts,h31_verts,h32_verts,h33_verts,h34_verts,h35_verts,h36_verts,h37_verts,h38_verts,h39_verts,h40_verts,h41_verts,h42_verts,h43_verts,h44_verts,h45_verts,h46_verts,h47_verts,h48_verts,h49_verts,h50_verts,h51_verts,h52_verts,h53_verts,h54_verts,h55_verts,h56_verts,h57_verts,h58_verts,h59_verts,h60_verts,h61_verts,h62_verts,h63_verts,h64_verts,h65_verts,h66_verts,h67_verts,h68_verts,h69_verts,h70_verts,h71_verts,h72_verts,h73_verts,h74_verts,h75_verts,h76_verts,h77_verts,h78_verts,h79_verts,h80_verts,h81_verts,h82_verts,h83_verts,h84_verts,h85_verts,h86_verts,h87_verts,h88_verts,h89_verts, -}; diff --git a/engine/inc/bullet/Benchmarks/TaruData.h b/engine/inc/bullet/Benchmarks/TaruData.h deleted file mode 100644 index d7847898..00000000 --- a/engine/inc/bullet/Benchmarks/TaruData.h +++ /dev/null @@ -1,134 +0,0 @@ -#define TaruVtxCount 43 -#define TaruIdxCount 132 - -static 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, -}; diff --git a/engine/inc/bullet/Benchmarks/landscapeData.h b/engine/inc/bullet/Benchmarks/landscapeData.h deleted file mode 100644 index 6005026e..00000000 --- a/engine/inc/bullet/Benchmarks/landscapeData.h +++ /dev/null @@ -1,235704 +0,0 @@ -#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/engine/inc/bullet/Bullet2FileLoader/autogenerated/bullet2.h b/engine/inc/bullet/Bullet2FileLoader/autogenerated/bullet2.h deleted file mode 100644 index eaa27dfe..00000000 --- a/engine/inc/bullet/Bullet2FileLoader/autogenerated/bullet2.h +++ /dev/null @@ -1,987 +0,0 @@ -/* Copyright (C) 2011 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from Bullet/Extras/HeaderGenerator/bulletGenerate.py -#ifndef __BULLET2_H__ -#define __BULLET2_H__ -namespace Bullet3SerializeBullet2 -{ -// put an empty struct in the case -typedef struct bInvalidHandle -{ - int unused; -} bInvalidHandle; - -class PointerArray; -class b3PhysicsSystem; -class ListBase; -class b3Vector3FloatData; -class b3Vector3DoubleData; -class b3Matrix3x3FloatData; -class b3Matrix3x3DoubleData; -class b3TransformFloatData; -class b3TransformDoubleData; -class b3BvhSubtreeInfoData; -class b3OptimizedBvhNodeFloatData; -class b3OptimizedBvhNodeDoubleData; -class b3QuantizedBvhNodeData; -class b3QuantizedBvhFloatData; -class b3QuantizedBvhDoubleData; -class b3CollisionShapeData; -class b3StaticPlaneShapeData; -class b3ConvexInternalShapeData; -class b3PositionAndRadius; -class b3MultiSphereShapeData; -class b3IntIndexData; -class b3ShortIntIndexData; -class b3ShortIntIndexTripletData; -class b3CharIndexTripletData; -class b3MeshPartData; -class b3StridingMeshInterfaceData; -class b3TriangleMeshShapeData; -class b3ScaledTriangleMeshShapeData; -class b3CompoundShapeChildData; -class b3CompoundShapeData; -class b3CylinderShapeData; -class b3CapsuleShapeData; -class b3TriangleInfoData; -class b3TriangleInfoMapData; -class b3GImpactMeshShapeData; -class b3ConvexHullShapeData; -class b3CollisionObjectDoubleData; -class b3CollisionObjectFloatData; -class b3DynamicsWorldDoubleData; -class b3DynamicsWorldFloatData; -class b3RigidBodyFloatData; -class b3RigidBodyDoubleData; -class b3ConstraintInfo1; -class b3TypedConstraintData; -class b3Point2PointConstraintFloatData; -class b3Point2PointConstraintDoubleData; -class b3HingeConstraintDoubleData; -class b3HingeConstraintFloatData; -class b3ConeTwistConstraintData; -class b3Generic6DofConstraintData; -class b3Generic6DofSpringConstraintData; -class b3SliderConstraintData; -class b3ContactSolverInfoDoubleData; -class b3ContactSolverInfoFloatData; -class SoftBodyMaterialData; -class SoftBodyNodeData; -class SoftBodyLinkData; -class SoftBodyFaceData; -class SoftBodyTetraData; -class SoftRigidAnchorData; -class SoftBodyConfigData; -class SoftBodyPoseData; -class SoftBodyClusterData; -class b3SoftBodyJointData; -class b3SoftBodyFloatData; -// -------------------------------------------------- // -class PointerArray -{ -public: - int m_size; - int m_capacity; - void *m_data; -}; - -// -------------------------------------------------- // -class b3PhysicsSystem -{ -public: - PointerArray m_collisionShapes; - PointerArray m_collisionObjects; - PointerArray m_constraints; -}; - -// -------------------------------------------------- // -class ListBase -{ -public: - void *first; - void *last; -}; - -// -------------------------------------------------- // -class b3Vector3FloatData -{ -public: - float m_floats[4]; -}; - -// -------------------------------------------------- // -class b3Vector3DoubleData -{ -public: - double m_floats[4]; -}; - -// -------------------------------------------------- // -class b3Matrix3x3FloatData -{ -public: - b3Vector3FloatData m_el[3]; -}; - -// -------------------------------------------------- // -class b3Matrix3x3DoubleData -{ -public: - b3Vector3DoubleData m_el[3]; -}; - -// -------------------------------------------------- // -class b3TransformFloatData -{ -public: - b3Matrix3x3FloatData m_basis; - b3Vector3FloatData m_origin; -}; - -// -------------------------------------------------- // -class b3TransformDoubleData -{ -public: - b3Matrix3x3DoubleData m_basis; - b3Vector3DoubleData m_origin; -}; - -// -------------------------------------------------- // -class b3BvhSubtreeInfoData -{ -public: - int m_rootNodeIndex; - int m_subtreeSize; - short m_quantizedAabbMin[3]; - short m_quantizedAabbMax[3]; -}; - -// -------------------------------------------------- // -class b3OptimizedBvhNodeFloatData -{ -public: - b3Vector3FloatData m_aabbMinOrg; - b3Vector3FloatData m_aabbMaxOrg; - int m_escapeIndex; - int m_subPart; - int m_triangleIndex; - char m_pad[4]; -}; - -// -------------------------------------------------- // -class b3OptimizedBvhNodeDoubleData -{ -public: - b3Vector3DoubleData m_aabbMinOrg; - b3Vector3DoubleData m_aabbMaxOrg; - int m_escapeIndex; - int m_subPart; - int m_triangleIndex; - char m_pad[4]; -}; - -// -------------------------------------------------- // -class b3QuantizedBvhNodeData -{ -public: - short m_quantizedAabbMin[3]; - short m_quantizedAabbMax[3]; - int m_escapeIndexOrTriangleIndex; -}; - -// -------------------------------------------------- // -class b3QuantizedBvhFloatData -{ -public: - b3Vector3FloatData m_bvhAabbMin; - b3Vector3FloatData m_bvhAabbMax; - b3Vector3FloatData m_bvhQuantization; - int m_curNodeIndex; - int m_useQuantization; - int m_numContiguousLeafNodes; - int m_numQuantizedContiguousNodes; - b3OptimizedBvhNodeFloatData *m_contiguousNodesPtr; - b3QuantizedBvhNodeData *m_quantizedContiguousNodesPtr; - b3BvhSubtreeInfoData *m_subTreeInfoPtr; - int m_traversalMode; - int m_numSubtreeHeaders; -}; - -// -------------------------------------------------- // -class b3QuantizedBvhDoubleData -{ -public: - b3Vector3DoubleData m_bvhAabbMin; - b3Vector3DoubleData m_bvhAabbMax; - b3Vector3DoubleData m_bvhQuantization; - int m_curNodeIndex; - int m_useQuantization; - int m_numContiguousLeafNodes; - int m_numQuantizedContiguousNodes; - b3OptimizedBvhNodeDoubleData *m_contiguousNodesPtr; - b3QuantizedBvhNodeData *m_quantizedContiguousNodesPtr; - int m_traversalMode; - int m_numSubtreeHeaders; - b3BvhSubtreeInfoData *m_subTreeInfoPtr; -}; - -// -------------------------------------------------- // -class b3CollisionShapeData -{ -public: - char *m_name; - int m_shapeType; - char m_padding[4]; -}; - -// -------------------------------------------------- // -class b3StaticPlaneShapeData -{ -public: - b3CollisionShapeData m_collisionShapeData; - b3Vector3FloatData m_localScaling; - b3Vector3FloatData m_planeNormal; - float m_planeConstant; - char m_pad[4]; -}; - -// -------------------------------------------------- // -class b3ConvexInternalShapeData -{ -public: - b3CollisionShapeData m_collisionShapeData; - b3Vector3FloatData m_localScaling; - b3Vector3FloatData m_implicitShapeDimensions; - float m_collisionMargin; - int m_padding; -}; - -// -------------------------------------------------- // -class b3PositionAndRadius -{ -public: - b3Vector3FloatData m_pos; - float m_radius; -}; - -// -------------------------------------------------- // -class b3MultiSphereShapeData -{ -public: - b3ConvexInternalShapeData m_convexInternalShapeData; - b3PositionAndRadius *m_localPositionArrayPtr; - int m_localPositionArraySize; - char m_padding[4]; -}; - -// -------------------------------------------------- // -class b3IntIndexData -{ -public: - int m_value; -}; - -// -------------------------------------------------- // -class b3ShortIntIndexData -{ -public: - short m_value; - char m_pad[2]; -}; - -// -------------------------------------------------- // -class b3ShortIntIndexTripletData -{ -public: - short m_values[3]; - char m_pad[2]; -}; - -// -------------------------------------------------- // -class b3CharIndexTripletData -{ -public: - char m_values[3]; - char m_pad; -}; - -// -------------------------------------------------- // -class b3MeshPartData -{ -public: - b3Vector3FloatData *m_vertices3f; - b3Vector3DoubleData *m_vertices3d; - b3IntIndexData *m_indices32; - b3ShortIntIndexTripletData *m_3indices16; - b3CharIndexTripletData *m_3indices8; - b3ShortIntIndexData *m_indices16; - int m_numTriangles; - int m_numVertices; -}; - -// -------------------------------------------------- // -class b3StridingMeshInterfaceData -{ -public: - b3MeshPartData *m_meshPartsPtr; - b3Vector3FloatData m_scaling; - int m_numMeshParts; - char m_padding[4]; -}; - -// -------------------------------------------------- // -class b3TriangleMeshShapeData -{ -public: - b3CollisionShapeData m_collisionShapeData; - b3StridingMeshInterfaceData m_meshInterface; - b3QuantizedBvhFloatData *m_quantizedFloatBvh; - b3QuantizedBvhDoubleData *m_quantizedDoubleBvh; - b3TriangleInfoMapData *m_triangleInfoMap; - float m_collisionMargin; - char m_pad3[4]; -}; - -// -------------------------------------------------- // -class b3ScaledTriangleMeshShapeData -{ -public: - b3TriangleMeshShapeData m_trimeshShapeData; - b3Vector3FloatData m_localScaling; -}; - -// -------------------------------------------------- // -class b3CompoundShapeChildData -{ -public: - b3TransformFloatData m_transform; - b3CollisionShapeData *m_childShape; - int m_childShapeType; - float m_childMargin; -}; - -// -------------------------------------------------- // -class b3CompoundShapeData -{ -public: - b3CollisionShapeData m_collisionShapeData; - b3CompoundShapeChildData *m_childShapePtr; - int m_numChildShapes; - float m_collisionMargin; -}; - -// -------------------------------------------------- // -class b3CylinderShapeData -{ -public: - b3ConvexInternalShapeData m_convexInternalShapeData; - int m_upAxis; - char m_padding[4]; -}; - -// -------------------------------------------------- // -class b3CapsuleShapeData -{ -public: - b3ConvexInternalShapeData m_convexInternalShapeData; - int m_upAxis; - char m_padding[4]; -}; - -// -------------------------------------------------- // -class b3TriangleInfoData -{ -public: - int m_flags; - float m_edgeV0V1Angle; - float m_edgeV1V2Angle; - float m_edgeV2V0Angle; -}; - -// -------------------------------------------------- // -class b3TriangleInfoMapData -{ -public: - int *m_hashTablePtr; - int *m_nextPtr; - b3TriangleInfoData *m_valueArrayPtr; - int *m_keyArrayPtr; - float m_convexEpsilon; - float m_planarEpsilon; - float m_equalVertexThreshold; - float m_edgeDistanceThreshold; - float m_zeroAreaThreshold; - int m_nextSize; - int m_hashTableSize; - int m_numValues; - int m_numKeys; - char m_padding[4]; -}; - -// -------------------------------------------------- // -class b3GImpactMeshShapeData -{ -public: - b3CollisionShapeData m_collisionShapeData; - b3StridingMeshInterfaceData m_meshInterface; - b3Vector3FloatData m_localScaling; - float m_collisionMargin; - int m_gimpactSubType; -}; - -// -------------------------------------------------- // -class b3ConvexHullShapeData -{ -public: - b3ConvexInternalShapeData m_convexInternalShapeData; - b3Vector3FloatData *m_unscaledPointsFloatPtr; - b3Vector3DoubleData *m_unscaledPointsDoublePtr; - int m_numUnscaledPoints; - char m_padding3[4]; -}; - -// -------------------------------------------------- // -class b3CollisionObjectDoubleData -{ -public: - void *m_broadphaseHandle; - void *m_collisionShape; - b3CollisionShapeData *m_rootCollisionShape; - char *m_name; - b3TransformDoubleData m_worldTransform; - b3TransformDoubleData m_interpolationWorldTransform; - b3Vector3DoubleData m_interpolationLinearVelocity; - b3Vector3DoubleData m_interpolationAngularVelocity; - b3Vector3DoubleData m_anisotropicFriction; - double m_contactProcessingThreshold; - double m_deactivationTime; - double m_friction; - double m_rollingFriction; - double m_restitution; - double m_hitFraction; - double m_ccdSweptSphereRadius; - double m_ccdMotionThreshold; - int m_hasAnisotropicFriction; - int m_collisionFlags; - int m_islandTag1; - int m_companionId; - int m_activationState1; - int m_internalType; - int m_checkCollideWith; - char m_padding[4]; -}; - -// -------------------------------------------------- // -class b3CollisionObjectFloatData -{ -public: - void *m_broadphaseHandle; - void *m_collisionShape; - b3CollisionShapeData *m_rootCollisionShape; - char *m_name; - b3TransformFloatData m_worldTransform; - b3TransformFloatData m_interpolationWorldTransform; - b3Vector3FloatData m_interpolationLinearVelocity; - b3Vector3FloatData m_interpolationAngularVelocity; - b3Vector3FloatData m_anisotropicFriction; - float m_contactProcessingThreshold; - float m_deactivationTime; - float m_friction; - float m_rollingFriction; - float m_restitution; - float m_hitFraction; - float m_ccdSweptSphereRadius; - float m_ccdMotionThreshold; - int m_hasAnisotropicFriction; - int m_collisionFlags; - int m_islandTag1; - int m_companionId; - int m_activationState1; - int m_internalType; - int m_checkCollideWith; - char m_padding[4]; -}; - -// -------------------------------------------------- // -class b3RigidBodyFloatData -{ -public: - b3CollisionObjectFloatData m_collisionObjectData; - b3Matrix3x3FloatData m_invInertiaTensorWorld; - b3Vector3FloatData m_linearVelocity; - b3Vector3FloatData m_angularVelocity; - b3Vector3FloatData m_angularFactor; - b3Vector3FloatData m_linearFactor; - b3Vector3FloatData m_gravity; - b3Vector3FloatData m_gravity_acceleration; - b3Vector3FloatData m_invInertiaLocal; - b3Vector3FloatData m_totalForce; - b3Vector3FloatData m_totalTorque; - float m_inverseMass; - float m_linearDamping; - float m_angularDamping; - float m_additionalDampingFactor; - float m_additionalLinearDampingThresholdSqr; - float m_additionalAngularDampingThresholdSqr; - float m_additionalAngularDampingFactor; - float m_linearSleepingThreshold; - float m_angularSleepingThreshold; - int m_additionalDamping; -}; - -// -------------------------------------------------- // -class b3RigidBodyDoubleData -{ -public: - b3CollisionObjectDoubleData m_collisionObjectData; - b3Matrix3x3DoubleData m_invInertiaTensorWorld; - b3Vector3DoubleData m_linearVelocity; - b3Vector3DoubleData m_angularVelocity; - b3Vector3DoubleData m_angularFactor; - b3Vector3DoubleData m_linearFactor; - b3Vector3DoubleData m_gravity; - b3Vector3DoubleData m_gravity_acceleration; - b3Vector3DoubleData m_invInertiaLocal; - b3Vector3DoubleData m_totalForce; - b3Vector3DoubleData m_totalTorque; - double m_inverseMass; - double m_linearDamping; - double m_angularDamping; - double m_additionalDampingFactor; - double m_additionalLinearDampingThresholdSqr; - double m_additionalAngularDampingThresholdSqr; - double m_additionalAngularDampingFactor; - double m_linearSleepingThreshold; - double m_angularSleepingThreshold; - int m_additionalDamping; - char m_padding[4]; -}; - -// -------------------------------------------------- // -class b3ConstraintInfo1 -{ -public: - int m_numConstraintRows; - int nub; -}; - -// -------------------------------------------------- // -class b3TypedConstraintData -{ -public: - bInvalidHandle *m_rbA; - bInvalidHandle *m_rbB; - char *m_name; - int m_objectType; - int m_userConstraintType; - int m_userConstraintId; - int m_needsFeedback; - float m_appliedImpulse; - float m_dbgDrawSize; - int m_disableCollisionsBetweenLinkedBodies; - int m_overrideNumSolverIterations; - float m_breakingImpulseThreshold; - int m_isEnabled; -}; - -// -------------------------------------------------- // -class b3Point2PointConstraintFloatData -{ -public: - b3TypedConstraintData m_typeConstraintData; - b3Vector3FloatData m_pivotInA; - b3Vector3FloatData m_pivotInB; -}; - -// -------------------------------------------------- // -class b3Point2PointConstraintDoubleData -{ -public: - b3TypedConstraintData m_typeConstraintData; - b3Vector3DoubleData m_pivotInA; - b3Vector3DoubleData m_pivotInB; -}; - -// -------------------------------------------------- // -class b3HingeConstraintDoubleData -{ -public: - b3TypedConstraintData m_typeConstraintData; - b3TransformDoubleData m_rbAFrame; - b3TransformDoubleData m_rbBFrame; - int m_useReferenceFrameA; - int m_angularOnly; - int m_enableAngularMotor; - float m_motorTargetVelocity; - float m_maxMotorImpulse; - float m_lowerLimit; - float m_upperLimit; - float m_limitSoftness; - float m_biasFactor; - float m_relaxationFactor; -}; - -// -------------------------------------------------- // -class b3HingeConstraintFloatData -{ -public: - b3TypedConstraintData m_typeConstraintData; - b3TransformFloatData m_rbAFrame; - b3TransformFloatData m_rbBFrame; - int m_useReferenceFrameA; - int m_angularOnly; - int m_enableAngularMotor; - float m_motorTargetVelocity; - float m_maxMotorImpulse; - float m_lowerLimit; - float m_upperLimit; - float m_limitSoftness; - float m_biasFactor; - float m_relaxationFactor; -}; - -// -------------------------------------------------- // -class b3ConeTwistConstraintData -{ -public: - b3TypedConstraintData m_typeConstraintData; - b3TransformFloatData m_rbAFrame; - b3TransformFloatData m_rbBFrame; - float m_swingSpan1; - float m_swingSpan2; - float m_twistSpan; - float m_limitSoftness; - float m_biasFactor; - float m_relaxationFactor; - float m_damping; - char m_pad[4]; -}; - -// -------------------------------------------------- // -class b3Generic6DofConstraintData -{ -public: - b3TypedConstraintData m_typeConstraintData; - b3TransformFloatData m_rbAFrame; - b3TransformFloatData m_rbBFrame; - b3Vector3FloatData m_linearUpperLimit; - b3Vector3FloatData m_linearLowerLimit; - b3Vector3FloatData m_angularUpperLimit; - b3Vector3FloatData m_angularLowerLimit; - int m_useLinearReferenceFrameA; - int m_useOffsetForConstraintFrame; -}; - -// -------------------------------------------------- // -class b3Generic6DofSpringConstraintData -{ -public: - b3Generic6DofConstraintData m_6dofData; - int m_springEnabled[6]; - float m_equilibriumPoint[6]; - float m_springStiffness[6]; - float m_springDamping[6]; -}; - -// -------------------------------------------------- // -class b3SliderConstraintData -{ -public: - b3TypedConstraintData m_typeConstraintData; - b3TransformFloatData m_rbAFrame; - b3TransformFloatData m_rbBFrame; - float m_linearUpperLimit; - float m_linearLowerLimit; - float m_angularUpperLimit; - float m_angularLowerLimit; - int m_useLinearReferenceFrameA; - int m_useOffsetForConstraintFrame; -}; - -// -------------------------------------------------- // -class b3ContactSolverInfoDoubleData -{ -public: - double m_tau; - double m_damping; - double m_friction; - double m_timeStep; - double m_restitution; - double m_maxErrorReduction; - double m_sor; - double m_erp; - double m_erp2; - double m_globalCfm; - double m_splitImpulsePenetrationThreshold; - double m_splitImpulseTurnErp; - double m_linearSlop; - double m_warmstartingFactor; - double m_maxGyroscopicForce; - double m_singleAxisRollingFrictionThreshold; - int m_numIterations; - int m_solverMode; - int m_restingContactRestitutionThreshold; - int m_minimumSolverBatchSize; - int m_splitImpulse; - char m_padding[4]; -}; - -// -------------------------------------------------- // -class b3ContactSolverInfoFloatData -{ -public: - float m_tau; - float m_damping; - float m_friction; - float m_timeStep; - float m_restitution; - float m_maxErrorReduction; - float m_sor; - float m_erp; - float m_erp2; - float m_globalCfm; - float m_splitImpulsePenetrationThreshold; - float m_splitImpulseTurnErp; - float m_linearSlop; - float m_warmstartingFactor; - float m_maxGyroscopicForce; - float m_singleAxisRollingFrictionThreshold; - int m_numIterations; - int m_solverMode; - int m_restingContactRestitutionThreshold; - int m_minimumSolverBatchSize; - int m_splitImpulse; - char m_padding[4]; -}; - -// -------------------------------------------------- // -class b3DynamicsWorldDoubleData -{ -public: - b3ContactSolverInfoDoubleData m_solverInfo; - b3Vector3DoubleData m_gravity; -}; - -// -------------------------------------------------- // -class b3DynamicsWorldFloatData -{ -public: - b3ContactSolverInfoFloatData m_solverInfo; - b3Vector3FloatData m_gravity; -}; - -// -------------------------------------------------- // -class SoftBodyMaterialData -{ -public: - float m_linearStiffness; - float m_angularStiffness; - float m_volumeStiffness; - int m_flags; -}; - -// -------------------------------------------------- // -class SoftBodyNodeData -{ -public: - SoftBodyMaterialData *m_material; - b3Vector3FloatData m_position; - b3Vector3FloatData m_previousPosition; - b3Vector3FloatData m_velocity; - b3Vector3FloatData m_accumulatedForce; - b3Vector3FloatData m_normal; - float m_inverseMass; - float m_area; - int m_attach; - int m_pad; -}; - -// -------------------------------------------------- // -class SoftBodyLinkData -{ -public: - SoftBodyMaterialData *m_material; - int m_nodeIndices[2]; - float m_restLength; - int m_bbending; -}; - -// -------------------------------------------------- // -class SoftBodyFaceData -{ -public: - b3Vector3FloatData m_normal; - SoftBodyMaterialData *m_material; - int m_nodeIndices[3]; - float m_restArea; -}; - -// -------------------------------------------------- // -class SoftBodyTetraData -{ -public: - b3Vector3FloatData m_c0[4]; - SoftBodyMaterialData *m_material; - int m_nodeIndices[4]; - float m_restVolume; - float m_c1; - float m_c2; - int m_pad; -}; - -// -------------------------------------------------- // -class SoftRigidAnchorData -{ -public: - b3Matrix3x3FloatData m_c0; - b3Vector3FloatData m_c1; - b3Vector3FloatData m_localFrame; - bInvalidHandle *m_rigidBody; - int m_nodeIndex; - float m_c2; -}; - -// -------------------------------------------------- // -class SoftBodyConfigData -{ -public: - int m_aeroModel; - float m_baumgarte; - float m_damping; - float m_drag; - float m_lift; - float m_pressure; - float m_volume; - float m_dynamicFriction; - float m_poseMatch; - float m_rigidContactHardness; - float m_kineticContactHardness; - float m_softContactHardness; - float m_anchorHardness; - float m_softRigidClusterHardness; - float m_softKineticClusterHardness; - float m_softSoftClusterHardness; - float m_softRigidClusterImpulseSplit; - float m_softKineticClusterImpulseSplit; - float m_softSoftClusterImpulseSplit; - float m_maxVolume; - float m_timeScale; - int m_velocityIterations; - int m_positionIterations; - int m_driftIterations; - int m_clusterIterations; - int m_collisionFlags; -}; - -// -------------------------------------------------- // -class SoftBodyPoseData -{ -public: - b3Matrix3x3FloatData m_rot; - b3Matrix3x3FloatData m_scale; - b3Matrix3x3FloatData m_aqq; - b3Vector3FloatData m_com; - b3Vector3FloatData *m_positions; - float *m_weights; - int m_numPositions; - int m_numWeigts; - int m_bvolume; - int m_bframe; - float m_restVolume; - int m_pad; -}; - -// -------------------------------------------------- // -class SoftBodyClusterData -{ -public: - b3TransformFloatData m_framexform; - b3Matrix3x3FloatData m_locii; - b3Matrix3x3FloatData m_invwi; - b3Vector3FloatData m_com; - b3Vector3FloatData m_vimpulses[2]; - b3Vector3FloatData m_dimpulses[2]; - b3Vector3FloatData m_lv; - b3Vector3FloatData m_av; - b3Vector3FloatData *m_framerefs; - int *m_nodeIndices; - float *m_masses; - int m_numFrameRefs; - int m_numNodes; - int m_numMasses; - float m_idmass; - float m_imass; - int m_nvimpulses; - int m_ndimpulses; - float m_ndamping; - float m_ldamping; - float m_adamping; - float m_matching; - float m_maxSelfCollisionImpulse; - float m_selfCollisionImpulseFactor; - int m_containsAnchor; - int m_collide; - int m_clusterIndex; -}; - -// -------------------------------------------------- // -class b3SoftBodyJointData -{ -public: - void *m_bodyA; - void *m_bodyB; - b3Vector3FloatData m_refs[2]; - float m_cfm; - float m_erp; - float m_split; - int m_delete; - b3Vector3FloatData m_relPosition[2]; - int m_bodyAtype; - int m_bodyBtype; - int m_jointType; - int m_pad; -}; - -// -------------------------------------------------- // -class b3SoftBodyFloatData -{ -public: - b3CollisionObjectFloatData m_collisionObjectData; - SoftBodyPoseData *m_pose; - SoftBodyMaterialData **m_materials; - SoftBodyNodeData *m_nodes; - SoftBodyLinkData *m_links; - SoftBodyFaceData *m_faces; - SoftBodyTetraData *m_tetrahedra; - SoftRigidAnchorData *m_anchors; - SoftBodyClusterData *m_clusters; - b3SoftBodyJointData *m_joints; - int m_numMaterials; - int m_numNodes; - int m_numLinks; - int m_numFaces; - int m_numTetrahedra; - int m_numAnchors; - int m_numClusters; - int m_numJoints; - SoftBodyConfigData m_config; -}; - -} // namespace Bullet3SerializeBullet2 -#endif //__BULLET2_H__ \ No newline at end of file diff --git a/engine/inc/bullet/Bullet2FileLoader/b3BulletFile.h b/engine/inc/bullet/Bullet2FileLoader/b3BulletFile.h deleted file mode 100644 index ede1d378..00000000 --- a/engine/inc/bullet/Bullet2FileLoader/b3BulletFile.h +++ /dev/null @@ -1,74 +0,0 @@ -/* -bParse -Copyright (c) 2006-2010 Charlie C & Erwin Coumans http://gamekit.googlecode.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 B3_BULLET_FILE_H -#define B3_BULLET_FILE_H - -#include "b3File.h" -#include "Bullet3Common/b3AlignedObjectArray.h" -#include "b3Defines.h" - -#include "Bullet3Serialize/Bullet2FileLoader/b3Serializer.h" - -namespace bParse -{ -// ----------------------------------------------------- // -class b3BulletFile : public bFile -{ -protected: - char* m_DnaCopy; - -public: - b3AlignedObjectArray m_softBodies; - - b3AlignedObjectArray m_rigidBodies; - - b3AlignedObjectArray m_collisionObjects; - - b3AlignedObjectArray m_collisionShapes; - - b3AlignedObjectArray m_constraints; - - b3AlignedObjectArray m_bvhs; - - b3AlignedObjectArray m_triangleInfoMaps; - - b3AlignedObjectArray m_dynamicsWorldInfo; - - b3AlignedObjectArray m_dataBlocks; - b3BulletFile(); - - b3BulletFile(const char* fileName); - - b3BulletFile(char* memoryBuffer, int len); - - virtual ~b3BulletFile(); - - virtual void addDataBlock(char* dataBlock); - - // experimental - virtual int write(const char* fileName, bool fixupPointers = false); - - virtual void parse(int verboseMode); - - virtual void parseData(); - - virtual void writeDNA(FILE* fp); - - void addStruct(const char* structType, void* data, int len, void* oldPtr, int code); -}; -}; // namespace bParse - -#endif //B3_BULLET_FILE_H diff --git a/engine/inc/bullet/Bullet2FileLoader/b3Chunk.h b/engine/inc/bullet/Bullet2FileLoader/b3Chunk.h deleted file mode 100644 index c9d0f37d..00000000 --- a/engine/inc/bullet/Bullet2FileLoader/b3Chunk.h +++ /dev/null @@ -1,84 +0,0 @@ -/* -bParse -Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.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 __BCHUNK_H__ -#define __BCHUNK_H__ - -#if defined(_WIN32) && !defined(__MINGW32__) -#define b3Long64 __int64 -#elif defined(__MINGW32__) -#include -#define b3Long64 int64_t -#else -#define b3Long64 long long -#endif - -namespace bParse -{ -// ----------------------------------------------------- // -class bChunkPtr4 -{ -public: - bChunkPtr4() {} - int code; - int len; - union { - int m_uniqueInt; - }; - int dna_nr; - int nr; -}; - -// ----------------------------------------------------- // -class bChunkPtr8 -{ -public: - bChunkPtr8() {} - int code, len; - union { - b3Long64 oldPrev; - int m_uniqueInts[2]; - }; - int dna_nr, nr; -}; - -// ----------------------------------------------------- // -class bChunkInd -{ -public: - bChunkInd() {} - int code, len; - void *oldPtr; - int dna_nr, nr; -}; - -// ----------------------------------------------------- // -class ChunkUtils -{ -public: - // file chunk offset - static int getOffset(int flags); - - // endian utils - static short swapShort(short sht); - static int swapInt(int inte); - static b3Long64 swapLong64(b3Long64 lng); -}; - -const int CHUNK_HEADER_LEN = ((sizeof(bChunkInd))); -const bool VOID_IS_8 = ((sizeof(void *) == 8)); -} // namespace bParse - -#endif //__BCHUNK_H__ diff --git a/engine/inc/bullet/Bullet2FileLoader/b3Common.h b/engine/inc/bullet/Bullet2FileLoader/b3Common.h deleted file mode 100644 index 5884fad4..00000000 --- a/engine/inc/bullet/Bullet2FileLoader/b3Common.h +++ /dev/null @@ -1,40 +0,0 @@ -/* -bParse -Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.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 __BCOMMON_H__ -#define __BCOMMON_H__ - -#include -//#include "bLog.h" -#include "Bullet3Common/b3AlignedObjectArray.h" -#include "Bullet3Common/b3HashMap.h" - -namespace bParse -{ -class bMain; -class bFileData; -class bFile; -class bDNA; - -// delete void* undefined -typedef struct bStructHandle -{ - int unused; -} bStructHandle; -typedef b3AlignedObjectArray bListBasePtr; -typedef b3HashMap bPtrMap; -} // namespace bParse - -#endif //__BCOMMON_H__ diff --git a/engine/inc/bullet/Bullet2FileLoader/b3DNA.h b/engine/inc/bullet/Bullet2FileLoader/b3DNA.h deleted file mode 100644 index ca6004d9..00000000 --- a/engine/inc/bullet/Bullet2FileLoader/b3DNA.h +++ /dev/null @@ -1,101 +0,0 @@ -/* -bParse -Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.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 __BDNA_H__ -#define __BDNA_H__ - -#include "b3Common.h" - -namespace bParse -{ -struct bNameInfo -{ - char *m_name; - bool m_isPointer; - int m_dim0; - int m_dim1; -}; - -class bDNA -{ -public: - bDNA(); - ~bDNA(); - - void init(char *data, int len, bool swap = false); - - int getArraySize(char *str); - int getArraySizeNew(short name) - { - const bNameInfo &nameInfo = m_Names[name]; - return nameInfo.m_dim0 * nameInfo.m_dim1; - } - int getElementSize(short type, short name) - { - const bNameInfo &nameInfo = m_Names[name]; - int size = nameInfo.m_isPointer ? mPtrLen * nameInfo.m_dim0 * nameInfo.m_dim1 : mTlens[type] * nameInfo.m_dim0 * nameInfo.m_dim1; - return size; - } - - int getNumNames() const - { - return m_Names.size(); - } - - char *getName(int ind); - char *getType(int ind); - short *getStruct(int ind); - short getLength(int ind); - int getReverseType(short type); - int getReverseType(const char *type); - - int getNumStructs(); - - // - bool lessThan(bDNA *other); - - void initCmpFlags(bDNA *memDNA); - bool flagNotEqual(int dna_nr); - bool flagEqual(int dna_nr); - bool flagNone(int dna_nr); - - int getPointerSize(); - - void dumpTypeDefinitions(); - -private: - enum FileDNAFlags - { - FDF_NONE = 0, - FDF_STRUCT_NEQU, - FDF_STRUCT_EQU - }; - - void initRecurseCmpFlags(int i); - - b3AlignedObjectArray mCMPFlags; - - b3AlignedObjectArray m_Names; - b3AlignedObjectArray mTypes; - b3AlignedObjectArray mStructs; - b3AlignedObjectArray mTlens; - b3HashMap mStructReverse; - b3HashMap mTypeLookup; - - int mPtrLen; -}; -} // namespace bParse - -#endif //__BDNA_H__ diff --git a/engine/inc/bullet/Bullet2FileLoader/b3Defines.h b/engine/inc/bullet/Bullet2FileLoader/b3Defines.h deleted file mode 100644 index 0524c94d..00000000 --- a/engine/inc/bullet/Bullet2FileLoader/b3Defines.h +++ /dev/null @@ -1,149 +0,0 @@ -/* Copyright (C) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.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 __B_DEFINES_H__ -#define __B_DEFINES_H__ - -// MISC defines, see BKE_global.h, BKE_utildefines.h -#define B3_SIZEOFBLENDERHEADER 12 - -// ------------------------------------------------------------ -#if defined(__sgi) || defined(__sparc) || defined(__sparc__) || defined(__PPC__) || defined(__ppc__) || defined(__BIG_ENDIAN__) -#define B3_MAKE_ID(a, b, c, d) ((int)(a) << 24 | (int)(b) << 16 | (c) << 8 | (d)) -#else -#define B3_MAKE_ID(a, b, c, d) ((int)(d) << 24 | (int)(c) << 16 | (b) << 8 | (a)) -#endif - -// ------------------------------------------------------------ -#if defined(__sgi) || defined(__sparc) || defined(__sparc__) || defined(__PPC__) || defined(__ppc__) || defined(__BIG_ENDIAN__) -#define B3_MAKE_ID2(c, d) ((c) << 8 | (d)) -#else -#define B3_MAKE_ID2(c, d) ((d) << 8 | (c)) -#endif - -// ------------------------------------------------------------ -#define B3_ID_SCE B3_MAKE_ID2('S', 'C') -#define B3_ID_LI B3_MAKE_ID2('L', 'I') -#define B3_ID_OB B3_MAKE_ID2('O', 'B') -#define B3_ID_ME B3_MAKE_ID2('M', 'E') -#define B3_ID_CU B3_MAKE_ID2('C', 'U') -#define B3_ID_MB B3_MAKE_ID2('M', 'B') -#define B3_ID_MA B3_MAKE_ID2('M', 'A') -#define B3_ID_TE B3_MAKE_ID2('T', 'E') -#define B3_ID_IM B3_MAKE_ID2('I', 'M') -#define B3_ID_IK B3_MAKE_ID2('I', 'K') -#define B3_ID_WV B3_MAKE_ID2('W', 'V') -#define B3_ID_LT B3_MAKE_ID2('L', 'T') -#define B3_ID_SE B3_MAKE_ID2('S', 'E') -#define B3_ID_LF B3_MAKE_ID2('L', 'F') -#define B3_ID_LA B3_MAKE_ID2('L', 'A') -#define B3_ID_CA B3_MAKE_ID2('C', 'A') -#define B3_ID_IP B3_MAKE_ID2('I', 'P') -#define B3_ID_KE B3_MAKE_ID2('K', 'E') -#define B3_ID_WO B3_MAKE_ID2('W', 'O') -#define B3_ID_SCR B3_MAKE_ID2('S', 'R') -#define B3_ID_VF B3_MAKE_ID2('V', 'F') -#define B3_ID_TXT B3_MAKE_ID2('T', 'X') -#define B3_ID_SO B3_MAKE_ID2('S', 'O') -#define B3_ID_SAMPLE B3_MAKE_ID2('S', 'A') -#define B3_ID_GR B3_MAKE_ID2('G', 'R') -#define B3_ID_ID B3_MAKE_ID2('I', 'D') -#define B3_ID_AR B3_MAKE_ID2('A', 'R') -#define B3_ID_AC B3_MAKE_ID2('A', 'C') -#define B3_ID_SCRIPT B3_MAKE_ID2('P', 'Y') -#define B3_ID_FLUIDSIM B3_MAKE_ID2('F', 'S') -#define B3_ID_NT B3_MAKE_ID2('N', 'T') -#define B3_ID_BR B3_MAKE_ID2('B', 'R') - -#define B3_ID_SEQ B3_MAKE_ID2('S', 'Q') -#define B3_ID_CO B3_MAKE_ID2('C', 'O') -#define B3_ID_PO B3_MAKE_ID2('A', 'C') -#define B3_ID_NLA B3_MAKE_ID2('N', 'L') - -#define B3_ID_VS B3_MAKE_ID2('V', 'S') -#define B3_ID_VN B3_MAKE_ID2('V', 'N') - -// ------------------------------------------------------------ -#define B3_FORM B3_MAKE_ID('F', 'O', 'R', 'M') -#define B3_DDG1 B3_MAKE_ID('3', 'D', 'G', '1') -#define B3_DDG2 B3_MAKE_ID('3', 'D', 'G', '2') -#define B3_DDG3 B3_MAKE_ID('3', 'D', 'G', '3') -#define B3_DDG4 B3_MAKE_ID('3', 'D', 'G', '4') -#define B3_GOUR B3_MAKE_ID('G', 'O', 'U', 'R') -#define B3_BLEN B3_MAKE_ID('B', 'L', 'E', 'N') -#define B3_DER_ B3_MAKE_ID('D', 'E', 'R', '_') -#define B3_V100 B3_MAKE_ID('V', '1', '0', '0') -#define B3_DATA B3_MAKE_ID('D', 'A', 'T', 'A') -#define B3_GLOB B3_MAKE_ID('G', 'L', 'O', 'B') -#define B3_IMAG B3_MAKE_ID('I', 'M', 'A', 'G') -#define B3_TEST B3_MAKE_ID('T', 'E', 'S', 'T') -#define B3_USER B3_MAKE_ID('U', 'S', 'E', 'R') - -// ------------------------------------------------------------ -#define B3_DNA1 B3_MAKE_ID('D', 'N', 'A', '1') -#define B3_REND B3_MAKE_ID('R', 'E', 'N', 'D') -#define B3_ENDB B3_MAKE_ID('E', 'N', 'D', 'B') -#define B3_NAME B3_MAKE_ID('N', 'A', 'M', 'E') -#define B3_SDNA B3_MAKE_ID('S', 'D', 'N', 'A') -#define B3_TYPE B3_MAKE_ID('T', 'Y', 'P', 'E') -#define B3_TLEN B3_MAKE_ID('T', 'L', 'E', 'N') -#define B3_STRC B3_MAKE_ID('S', 'T', 'R', 'C') - -// ------------------------------------------------------------ -#define B3_SWITCH_INT(a) \ - { \ - char s_i, *p_i; \ - p_i = (char *)&(a); \ - s_i = p_i[0]; \ - p_i[0] = p_i[3]; \ - p_i[3] = s_i; \ - s_i = p_i[1]; \ - p_i[1] = p_i[2]; \ - p_i[2] = s_i; \ - } - -// ------------------------------------------------------------ -#define B3_SWITCH_SHORT(a) \ - { \ - char s_i, *p_i; \ - p_i = (char *)&(a); \ - s_i = p_i[0]; \ - p_i[0] = p_i[1]; \ - p_i[1] = s_i; \ - } - -// ------------------------------------------------------------ -#define B3_SWITCH_LONGINT(a) \ - { \ - char s_i, *p_i; \ - p_i = (char *)&(a); \ - s_i = p_i[0]; \ - p_i[0] = p_i[7]; \ - p_i[7] = s_i; \ - s_i = p_i[1]; \ - p_i[1] = p_i[6]; \ - p_i[6] = s_i; \ - s_i = p_i[2]; \ - p_i[2] = p_i[5]; \ - p_i[5] = s_i; \ - s_i = p_i[3]; \ - p_i[3] = p_i[4]; \ - p_i[4] = s_i; \ - } - -#endif //__B_DEFINES_H__ diff --git a/engine/inc/bullet/Bullet2FileLoader/b3File.h b/engine/inc/bullet/Bullet2FileLoader/b3File.h deleted file mode 100644 index bda229cf..00000000 --- a/engine/inc/bullet/Bullet2FileLoader/b3File.h +++ /dev/null @@ -1,158 +0,0 @@ -/* -bParse -Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.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 __BFILE_H__ -#define __BFILE_H__ - -#include "b3Common.h" -#include "b3Chunk.h" -#include - -namespace bParse -{ -// ----------------------------------------------------- // -enum bFileFlags -{ - FD_INVALID = 0, - FD_OK = 1, - FD_VOID_IS_8 = 2, - FD_ENDIAN_SWAP = 4, - FD_FILE_64 = 8, - FD_BITS_VARIES = 16, - FD_VERSION_VARIES = 32, - FD_DOUBLE_PRECISION = 64, - FD_BROKEN_DNA = 128 -}; - -enum bFileVerboseMode -{ - FD_VERBOSE_EXPORT_XML = 1, - FD_VERBOSE_DUMP_DNA_TYPE_DEFINITIONS = 2, - FD_VERBOSE_DUMP_CHUNKS = 4, - FD_VERBOSE_DUMP_FILE_INFO = 8, -}; -// ----------------------------------------------------- // -class bFile -{ -protected: - char m_headerString[7]; - - bool mOwnsBuffer; - char *mFileBuffer; - int mFileLen; - int mVersion; - - bPtrMap mLibPointers; - - int mDataStart; - bDNA *mFileDNA; - bDNA *mMemoryDNA; - - b3AlignedObjectArray m_pointerFixupArray; - b3AlignedObjectArray m_pointerPtrFixupArray; - - b3AlignedObjectArray m_chunks; - b3HashMap m_chunkPtrPtrMap; - - // - - bPtrMap mDataPointers; - - int mFlags; - - // //////////////////////////////////////////////////////////////////////////// - - // buffer offset util - int getNextBlock(bChunkInd *dataChunk, const char *dataPtr, const int flags); - void safeSwapPtr(char *dst, const char *src); - - virtual void parseHeader(); - - virtual void parseData() = 0; - - void resolvePointersMismatch(); - void resolvePointersChunk(const bChunkInd &dataChunk, int verboseMode); - - int resolvePointersStructRecursive(char *strcPtr, int old_dna, int verboseMode, int recursion); - //void swapPtr(char *dst, char *src); - - void parseStruct(char *strcPtr, char *dtPtr, int old_dna, int new_dna, bool fixupPointers); - void getMatchingFileDNA(short *old, const char *lookupName, const char *lookupType, char *strcData, char *data, bool fixupPointers); - char *getFileElement(short *firstStruct, char *lookupName, char *lookupType, char *data, short **foundPos); - - void swap(char *head, class bChunkInd &ch, bool ignoreEndianFlag); - void swapData(char *data, short type, int arraySize, bool ignoreEndianFlag); - void swapStruct(int dna_nr, char *data, bool ignoreEndianFlag); - void swapLen(char *dataPtr); - void swapDNA(char *ptr); - - char *readStruct(char *head, class bChunkInd &chunk); - char *getAsString(int code); - - void parseInternal(int verboseMode, char *memDna, int memDnaLength); - -public: - bFile(const char *filename, const char headerString[7]); - - //todo: make memoryBuffer const char - //bFile( const char *memoryBuffer, int len); - bFile(char *memoryBuffer, int len, const char headerString[7]); - virtual ~bFile(); - - bDNA *getFileDNA() - { - return mFileDNA; - } - - virtual void addDataBlock(char *dataBlock) = 0; - - int getFlags() const - { - return mFlags; - } - - bPtrMap &getLibPointers() - { - return mLibPointers; - } - - void *findLibPointer(void *ptr); - - bool ok(); - - virtual void parse(int verboseMode) = 0; - - virtual int write(const char *fileName, bool fixupPointers = false) = 0; - - virtual void writeChunks(FILE *fp, bool fixupPointers); - - virtual void writeDNA(FILE *fp) = 0; - - void updateOldPointers(); - void resolvePointers(int verboseMode); - - void dumpChunks(bDNA *dna); - - int getVersion() const - { - return mVersion; - } - //pre-swap the endianness, so that data loaded on a target with different endianness doesn't need to be swapped - void preSwap(); - void writeFile(const char *fileName); -}; -} // namespace bParse - -#endif //__BFILE_H__ diff --git a/engine/inc/bullet/Bullet2FileLoader/b3Serializer.h b/engine/inc/bullet/Bullet2FileLoader/b3Serializer.h deleted file mode 100644 index d9e153e2..00000000 --- a/engine/inc/bullet/Bullet2FileLoader/b3Serializer.h +++ /dev/null @@ -1,601 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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 B3_SERIALIZER_H -#define B3_SERIALIZER_H - -#include "Bullet3Common/b3Scalar.h" // has definitions like B3_FORCE_INLINE -#include "Bullet3Common/b3StackAlloc.h" -#include "Bullet3Common/b3HashMap.h" - -#if !defined(__CELLOS_LV2__) && !defined(__MWERKS__) -#include -#endif -#include - -extern char b3s_bulletDNAstr[]; -extern int b3s_bulletDNAlen; -extern char b3s_bulletDNAstr64[]; -extern int b3s_bulletDNAlen64; - -B3_FORCE_INLINE int b3StrLen(const char* str) -{ - if (!str) - return (0); - int len = 0; - - while (*str != 0) - { - str++; - len++; - } - - return len; -} - -class b3Chunk -{ -public: - int m_chunkCode; - int m_length; - void* m_oldPtr; - int m_dna_nr; - int m_number; -}; - -enum b3SerializationFlags -{ - B3_SERIALIZE_NO_BVH = 1, - B3_SERIALIZE_NO_TRIANGLEINFOMAP = 2, - B3_SERIALIZE_NO_DUPLICATE_ASSERT = 4 -}; - -class b3Serializer -{ -public: - virtual ~b3Serializer() {} - - virtual const unsigned char* getBufferPointer() const = 0; - - virtual int getCurrentBufferSize() const = 0; - - virtual b3Chunk* allocate(size_t size, int numElements) = 0; - - virtual void finalizeChunk(b3Chunk* chunk, const char* structType, int chunkCode, void* oldPtr) = 0; - - virtual void* findPointer(void* oldPtr) = 0; - - virtual void* getUniquePointer(void* oldPtr) = 0; - - virtual void startSerialization() = 0; - - virtual void finishSerialization() = 0; - - virtual const char* findNameForPointer(const void* ptr) const = 0; - - virtual void registerNameForPointer(const void* ptr, const char* name) = 0; - - virtual void serializeName(const char* ptr) = 0; - - virtual int getSerializationFlags() const = 0; - - virtual void setSerializationFlags(int flags) = 0; -}; - -#define B3_HEADER_LENGTH 12 -#if defined(__sgi) || defined(__sparc) || defined(__sparc__) || defined(__PPC__) || defined(__ppc__) || defined(__BIG_ENDIAN__) -#define B3_MAKE_ID(a, b, c, d) ((int)(a) << 24 | (int)(b) << 16 | (c) << 8 | (d)) -#else -#define B3_MAKE_ID(a, b, c, d) ((int)(d) << 24 | (int)(c) << 16 | (b) << 8 | (a)) -#endif - -#define B3_SOFTBODY_CODE B3_MAKE_ID('S', 'B', 'D', 'Y') -#define B3_COLLISIONOBJECT_CODE B3_MAKE_ID('C', 'O', 'B', 'J') -#define B3_RIGIDBODY_CODE B3_MAKE_ID('R', 'B', 'D', 'Y') -#define B3_CONSTRAINT_CODE B3_MAKE_ID('C', 'O', 'N', 'S') -#define B3_BOXSHAPE_CODE B3_MAKE_ID('B', 'O', 'X', 'S') -#define B3_QUANTIZED_BVH_CODE B3_MAKE_ID('Q', 'B', 'V', 'H') -#define B3_TRIANLGE_INFO_MAP B3_MAKE_ID('T', 'M', 'A', 'P') -#define B3_SHAPE_CODE B3_MAKE_ID('S', 'H', 'A', 'P') -#define B3_ARRAY_CODE B3_MAKE_ID('A', 'R', 'A', 'Y') -#define B3_SBMATERIAL_CODE B3_MAKE_ID('S', 'B', 'M', 'T') -#define B3_SBNODE_CODE B3_MAKE_ID('S', 'B', 'N', 'D') -#define B3_DYNAMICSWORLD_CODE B3_MAKE_ID('D', 'W', 'L', 'D') -#define B3_DNA_CODE B3_MAKE_ID('D', 'N', 'A', '1') - -struct b3PointerUid -{ - union { - void* m_ptr; - int m_uniqueIds[2]; - }; -}; - -///The b3DefaultSerializer is the main Bullet serialization class. -///The constructor takes an optional argument for backwards compatibility, it is recommended to leave this empty/zero. -class b3DefaultSerializer : public b3Serializer -{ - b3AlignedObjectArray mTypes; - b3AlignedObjectArray mStructs; - b3AlignedObjectArray mTlens; - b3HashMap mStructReverse; - b3HashMap mTypeLookup; - - b3HashMap m_chunkP; - - b3HashMap m_nameMap; - - b3HashMap m_uniquePointers; - int m_uniqueIdGenerator; - - int m_totalSize; - unsigned char* m_buffer; - int m_currentSize; - void* m_dna; - int m_dnaLength; - - int m_serializationFlags; - - b3AlignedObjectArray m_chunkPtrs; - -protected: - virtual void* findPointer(void* oldPtr) - { - void** ptr = m_chunkP.find(oldPtr); - if (ptr && *ptr) - return *ptr; - return 0; - } - - void writeDNA() - { - b3Chunk* dnaChunk = allocate(m_dnaLength, 1); - memcpy(dnaChunk->m_oldPtr, m_dna, m_dnaLength); - finalizeChunk(dnaChunk, "DNA1", B3_DNA_CODE, m_dna); - } - - int getReverseType(const char* type) const - { - b3HashString key(type); - const int* valuePtr = mTypeLookup.find(key); - if (valuePtr) - return *valuePtr; - - return -1; - } - - void initDNA(const char* bdnaOrg, int dnalen) - { - ///was already initialized - if (m_dna) - return; - - int littleEndian = 1; - littleEndian = ((char*)&littleEndian)[0]; - - m_dna = b3AlignedAlloc(dnalen, 16); - memcpy(m_dna, bdnaOrg, dnalen); - m_dnaLength = dnalen; - - int* intPtr = 0; - short* shtPtr = 0; - char* cp = 0; - int dataLen = 0; - intPtr = (int*)m_dna; - - /* - SDNA (4 bytes) (magic number) - NAME (4 bytes) - (4 bytes) amount of names (int) - - - */ - - if (strncmp((const char*)m_dna, "SDNA", 4) == 0) - { - // skip ++ NAME - intPtr++; - intPtr++; - } - - // Parse names - if (!littleEndian) - *intPtr = b3SwapEndian(*intPtr); - - dataLen = *intPtr; - - intPtr++; - - cp = (char*)intPtr; - int i; - for (i = 0; i < dataLen; i++) - { - while (*cp) cp++; - cp++; - } - cp = b3AlignPointer(cp, 4); - - /* - TYPE (4 bytes) - amount of types (int) - - - */ - - intPtr = (int*)cp; - b3Assert(strncmp(cp, "TYPE", 4) == 0); - intPtr++; - - if (!littleEndian) - *intPtr = b3SwapEndian(*intPtr); - - dataLen = *intPtr; - intPtr++; - - cp = (char*)intPtr; - for (i = 0; i < dataLen; i++) - { - mTypes.push_back(cp); - while (*cp) cp++; - cp++; - } - - cp = b3AlignPointer(cp, 4); - - /* - TLEN (4 bytes) - (short) the lengths of types - - */ - - // Parse type lens - intPtr = (int*)cp; - b3Assert(strncmp(cp, "TLEN", 4) == 0); - intPtr++; - - dataLen = (int)mTypes.size(); - - shtPtr = (short*)intPtr; - for (i = 0; i < dataLen; i++, shtPtr++) - { - if (!littleEndian) - shtPtr[0] = b3SwapEndian(shtPtr[0]); - mTlens.push_back(shtPtr[0]); - } - - if (dataLen & 1) shtPtr++; - - /* - STRC (4 bytes) - amount of structs (int) - - - - - - - */ - - intPtr = (int*)shtPtr; - cp = (char*)intPtr; - b3Assert(strncmp(cp, "STRC", 4) == 0); - intPtr++; - - if (!littleEndian) - *intPtr = b3SwapEndian(*intPtr); - dataLen = *intPtr; - intPtr++; - - shtPtr = (short*)intPtr; - for (i = 0; i < dataLen; i++) - { - mStructs.push_back(shtPtr); - - if (!littleEndian) - { - shtPtr[0] = b3SwapEndian(shtPtr[0]); - shtPtr[1] = b3SwapEndian(shtPtr[1]); - - int len = shtPtr[1]; - shtPtr += 2; - - for (int a = 0; a < len; a++, shtPtr += 2) - { - shtPtr[0] = b3SwapEndian(shtPtr[0]); - shtPtr[1] = b3SwapEndian(shtPtr[1]); - } - } - else - { - shtPtr += (2 * shtPtr[1]) + 2; - } - } - - // build reverse lookups - for (i = 0; i < (int)mStructs.size(); i++) - { - short* strc = mStructs.at(i); - mStructReverse.insert(strc[0], i); - mTypeLookup.insert(b3HashString(mTypes[strc[0]]), i); - } - } - -public: - b3DefaultSerializer(int totalSize = 0) - : m_totalSize(totalSize), - m_currentSize(0), - m_dna(0), - m_dnaLength(0), - m_serializationFlags(0) - { - m_buffer = m_totalSize ? (unsigned char*)b3AlignedAlloc(totalSize, 16) : 0; - - const bool VOID_IS_8 = ((sizeof(void*) == 8)); - -#ifdef B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES - if (VOID_IS_8) - { -#if _WIN64 - initDNA((const char*)b3s_bulletDNAstr64, b3s_bulletDNAlen64); -#else - b3Assert(0); -#endif - } - else - { -#ifndef _WIN64 - initDNA((const char*)b3s_bulletDNAstr, b3s_bulletDNAlen); -#else - b3Assert(0); -#endif - } - -#else //B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES - if (VOID_IS_8) - { - initDNA((const char*)b3s_bulletDNAstr64, b3s_bulletDNAlen64); - } - else - { - initDNA((const char*)b3s_bulletDNAstr, b3s_bulletDNAlen); - } -#endif //B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES - } - - virtual ~b3DefaultSerializer() - { - if (m_buffer) - b3AlignedFree(m_buffer); - if (m_dna) - b3AlignedFree(m_dna); - } - - void writeHeader(unsigned char* buffer) const - { -#ifdef B3_USE_DOUBLE_PRECISION - memcpy(buffer, "BULLETd", 7); -#else - memcpy(buffer, "BULLETf", 7); -#endif //B3_USE_DOUBLE_PRECISION - - int littleEndian = 1; - littleEndian = ((char*)&littleEndian)[0]; - - if (sizeof(void*) == 8) - { - buffer[7] = '-'; - } - else - { - buffer[7] = '_'; - } - - if (littleEndian) - { - buffer[8] = 'v'; - } - else - { - buffer[8] = 'V'; - } - - buffer[9] = '2'; - buffer[10] = '8'; - buffer[11] = '1'; - } - - virtual void startSerialization() - { - m_uniqueIdGenerator = 1; - if (m_totalSize) - { - unsigned char* buffer = internalAlloc(B3_HEADER_LENGTH); - writeHeader(buffer); - } - } - - virtual void finishSerialization() - { - writeDNA(); - - //if we didn't pre-allocate a buffer, we need to create a contiguous buffer now - int mysize = 0; - if (!m_totalSize) - { - if (m_buffer) - b3AlignedFree(m_buffer); - - m_currentSize += B3_HEADER_LENGTH; - m_buffer = (unsigned char*)b3AlignedAlloc(m_currentSize, 16); - - unsigned char* currentPtr = m_buffer; - writeHeader(m_buffer); - currentPtr += B3_HEADER_LENGTH; - mysize += B3_HEADER_LENGTH; - for (int i = 0; i < m_chunkPtrs.size(); i++) - { - int curLength = sizeof(b3Chunk) + m_chunkPtrs[i]->m_length; - memcpy(currentPtr, m_chunkPtrs[i], curLength); - b3AlignedFree(m_chunkPtrs[i]); - currentPtr += curLength; - mysize += curLength; - } - } - - mTypes.clear(); - mStructs.clear(); - mTlens.clear(); - mStructReverse.clear(); - mTypeLookup.clear(); - m_chunkP.clear(); - m_nameMap.clear(); - m_uniquePointers.clear(); - m_chunkPtrs.clear(); - } - - virtual void* getUniquePointer(void* oldPtr) - { - if (!oldPtr) - return 0; - - b3PointerUid* uptr = (b3PointerUid*)m_uniquePointers.find(oldPtr); - if (uptr) - { - return uptr->m_ptr; - } - m_uniqueIdGenerator++; - - b3PointerUid uid; - uid.m_uniqueIds[0] = m_uniqueIdGenerator; - uid.m_uniqueIds[1] = m_uniqueIdGenerator; - m_uniquePointers.insert(oldPtr, uid); - return uid.m_ptr; - } - - virtual const unsigned char* getBufferPointer() const - { - return m_buffer; - } - - virtual int getCurrentBufferSize() const - { - return m_currentSize; - } - - virtual void finalizeChunk(b3Chunk* chunk, const char* structType, int chunkCode, void* oldPtr) - { - if (!(m_serializationFlags & B3_SERIALIZE_NO_DUPLICATE_ASSERT)) - { - b3Assert(!findPointer(oldPtr)); - } - - chunk->m_dna_nr = getReverseType(structType); - - chunk->m_chunkCode = chunkCode; - - void* uniquePtr = getUniquePointer(oldPtr); - - m_chunkP.insert(oldPtr, uniquePtr); //chunk->m_oldPtr); - chunk->m_oldPtr = uniquePtr; //oldPtr; - } - - virtual unsigned char* internalAlloc(size_t size) - { - unsigned char* ptr = 0; - - if (m_totalSize) - { - ptr = m_buffer + m_currentSize; - m_currentSize += int(size); - b3Assert(m_currentSize < m_totalSize); - } - else - { - ptr = (unsigned char*)b3AlignedAlloc(size, 16); - m_currentSize += int(size); - } - return ptr; - } - - virtual b3Chunk* allocate(size_t size, int numElements) - { - unsigned char* ptr = internalAlloc(int(size) * numElements + sizeof(b3Chunk)); - - unsigned char* data = ptr + sizeof(b3Chunk); - - b3Chunk* chunk = (b3Chunk*)ptr; - chunk->m_chunkCode = 0; - chunk->m_oldPtr = data; - chunk->m_length = int(size) * numElements; - chunk->m_number = numElements; - - m_chunkPtrs.push_back(chunk); - - return chunk; - } - - virtual const char* findNameForPointer(const void* ptr) const - { - const char* const* namePtr = m_nameMap.find(ptr); - if (namePtr && *namePtr) - return *namePtr; - return 0; - } - - virtual void registerNameForPointer(const void* ptr, const char* name) - { - m_nameMap.insert(ptr, name); - } - - virtual void serializeName(const char* name) - { - if (name) - { - //don't serialize name twice - if (findPointer((void*)name)) - return; - - int len = b3StrLen(name); - if (len) - { - int newLen = len + 1; - int padding = ((newLen + 3) & ~3) - newLen; - newLen += padding; - - //serialize name string now - b3Chunk* chunk = allocate(sizeof(char), newLen); - char* destinationName = (char*)chunk->m_oldPtr; - for (int i = 0; i < len; i++) - { - destinationName[i] = name[i]; - } - destinationName[len] = 0; - finalizeChunk(chunk, "char", B3_ARRAY_CODE, (void*)name); - } - } - } - - virtual int getSerializationFlags() const - { - return m_serializationFlags; - } - - virtual void setSerializationFlags(int flags) - { - m_serializationFlags = flags; - } -}; - -#endif //B3_SERIALIZER_H diff --git a/engine/inc/bullet/Bullet3Collision/BroadPhaseCollision/b3BroadphaseCallback.h b/engine/inc/bullet/Bullet3Collision/BroadPhaseCollision/b3BroadphaseCallback.h deleted file mode 100644 index bec0800a..00000000 --- a/engine/inc/bullet/Bullet3Collision/BroadPhaseCollision/b3BroadphaseCallback.h +++ /dev/null @@ -1,38 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2013 Erwin Coumans http://bulletphysics.org - -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 B3_BROADPHASE_CALLBACK_H -#define B3_BROADPHASE_CALLBACK_H - -#include "Bullet3Common/b3Vector3.h" -struct b3BroadphaseProxy; - -struct b3BroadphaseAabbCallback -{ - virtual ~b3BroadphaseAabbCallback() {} - virtual bool process(const b3BroadphaseProxy* proxy) = 0; -}; - -struct b3BroadphaseRayCallback : public b3BroadphaseAabbCallback -{ - ///added some cached data to accelerate ray-AABB tests - b3Vector3 m_rayDirectionInverse; - unsigned int m_signs[3]; - b3Scalar m_lambda_max; - - virtual ~b3BroadphaseRayCallback() {} -}; - -#endif //B3_BROADPHASE_CALLBACK_H diff --git a/engine/inc/bullet/Bullet3Collision/BroadPhaseCollision/b3DynamicBvh.h b/engine/inc/bullet/Bullet3Collision/BroadPhaseCollision/b3DynamicBvh.h deleted file mode 100644 index f44e3377..00000000 --- a/engine/inc/bullet/Bullet3Collision/BroadPhaseCollision/b3DynamicBvh.h +++ /dev/null @@ -1,1332 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2013 Erwin Coumans http://bulletphysics.org - -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. -*/ -///b3DynamicBvh implementation by Nathanael Presson - -#ifndef B3_DYNAMIC_BOUNDING_VOLUME_TREE_H -#define B3_DYNAMIC_BOUNDING_VOLUME_TREE_H - -#include "Bullet3Common/b3AlignedObjectArray.h" -#include "Bullet3Common/b3Vector3.h" -#include "Bullet3Common/b3Transform.h" -#include "Bullet3Geometry/b3AabbUtil.h" - -// -// Compile time configuration -// - -// Implementation profiles -#define B3_DBVT_IMPL_GENERIC 0 // Generic implementation -#define B3_DBVT_IMPL_SSE 1 // SSE - -// Template implementation of ICollide -#ifdef _WIN32 -#if (defined(_MSC_VER) && _MSC_VER >= 1400) -#define B3_DBVT_USE_TEMPLATE 1 -#else -#define B3_DBVT_USE_TEMPLATE 0 -#endif -#else -#define B3_DBVT_USE_TEMPLATE 0 -#endif - -// Use only intrinsics instead of inline asm -#define B3_DBVT_USE_INTRINSIC_SSE 1 - -// Using memmov for collideOCL -#define B3_DBVT_USE_MEMMOVE 1 - -// Enable benchmarking code -#define B3_DBVT_ENABLE_BENCHMARK 0 - -// Inlining -#define B3_DBVT_INLINE B3_FORCE_INLINE - -// Specific methods implementation - -//SSE gives errors on a MSVC 7.1 -#if defined(B3_USE_SSE) //&& defined (_WIN32) -#define B3_DBVT_SELECT_IMPL B3_DBVT_IMPL_SSE -#define B3_DBVT_MERGE_IMPL B3_DBVT_IMPL_SSE -#define B3_DBVT_INT0_IMPL B3_DBVT_IMPL_SSE -#else -#define B3_DBVT_SELECT_IMPL B3_DBVT_IMPL_GENERIC -#define B3_DBVT_MERGE_IMPL B3_DBVT_IMPL_GENERIC -#define B3_DBVT_INT0_IMPL B3_DBVT_IMPL_GENERIC -#endif - -#if (B3_DBVT_SELECT_IMPL == B3_DBVT_IMPL_SSE) || \ - (B3_DBVT_MERGE_IMPL == B3_DBVT_IMPL_SSE) || \ - (B3_DBVT_INT0_IMPL == B3_DBVT_IMPL_SSE) -#include -#endif - -// -// Auto config and checks -// - -#if B3_DBVT_USE_TEMPLATE -#define B3_DBVT_VIRTUAL -#define B3_DBVT_VIRTUAL_DTOR(a) -#define B3_DBVT_PREFIX template -#define B3_DBVT_IPOLICY T& policy -#define B3_DBVT_CHECKTYPE \ - static const ICollide& typechecker = *(T*)1; \ - (void)typechecker; -#else -#define B3_DBVT_VIRTUAL_DTOR(a) \ - virtual ~a() {} -#define B3_DBVT_VIRTUAL virtual -#define B3_DBVT_PREFIX -#define B3_DBVT_IPOLICY ICollide& policy -#define B3_DBVT_CHECKTYPE -#endif - -#if B3_DBVT_USE_MEMMOVE -#if !defined(__CELLOS_LV2__) && !defined(__MWERKS__) -#include -#endif -#include -#endif - -#ifndef B3_DBVT_USE_TEMPLATE -#error "B3_DBVT_USE_TEMPLATE undefined" -#endif - -#ifndef B3_DBVT_USE_MEMMOVE -#error "B3_DBVT_USE_MEMMOVE undefined" -#endif - -#ifndef B3_DBVT_ENABLE_BENCHMARK -#error "B3_DBVT_ENABLE_BENCHMARK undefined" -#endif - -#ifndef B3_DBVT_SELECT_IMPL -#error "B3_DBVT_SELECT_IMPL undefined" -#endif - -#ifndef B3_DBVT_MERGE_IMPL -#error "B3_DBVT_MERGE_IMPL undefined" -#endif - -#ifndef B3_DBVT_INT0_IMPL -#error "B3_DBVT_INT0_IMPL undefined" -#endif - -// -// Defaults volumes -// - -/* b3DbvtAabbMm */ -struct b3DbvtAabbMm -{ - B3_DBVT_INLINE b3Vector3 Center() const { return ((mi + mx) / 2); } - B3_DBVT_INLINE b3Vector3 Lengths() const { return (mx - mi); } - B3_DBVT_INLINE b3Vector3 Extents() const { return ((mx - mi) / 2); } - B3_DBVT_INLINE const b3Vector3& Mins() const { return (mi); } - B3_DBVT_INLINE const b3Vector3& Maxs() const { return (mx); } - static inline b3DbvtAabbMm FromCE(const b3Vector3& c, const b3Vector3& e); - static inline b3DbvtAabbMm FromCR(const b3Vector3& c, b3Scalar r); - static inline b3DbvtAabbMm FromMM(const b3Vector3& mi, const b3Vector3& mx); - static inline b3DbvtAabbMm FromPoints(const b3Vector3* pts, int n); - static inline b3DbvtAabbMm FromPoints(const b3Vector3** ppts, int n); - B3_DBVT_INLINE void Expand(const b3Vector3& e); - B3_DBVT_INLINE void SignedExpand(const b3Vector3& e); - B3_DBVT_INLINE bool Contain(const b3DbvtAabbMm& a) const; - B3_DBVT_INLINE int Classify(const b3Vector3& n, b3Scalar o, int s) const; - B3_DBVT_INLINE b3Scalar ProjectMinimum(const b3Vector3& v, unsigned signs) const; - B3_DBVT_INLINE friend bool b3Intersect(const b3DbvtAabbMm& a, - const b3DbvtAabbMm& b); - - B3_DBVT_INLINE friend bool b3Intersect(const b3DbvtAabbMm& a, - const b3Vector3& b); - - B3_DBVT_INLINE friend b3Scalar b3Proximity(const b3DbvtAabbMm& a, - const b3DbvtAabbMm& b); - B3_DBVT_INLINE friend int b3Select(const b3DbvtAabbMm& o, - const b3DbvtAabbMm& a, - const b3DbvtAabbMm& b); - B3_DBVT_INLINE friend void b3Merge(const b3DbvtAabbMm& a, - const b3DbvtAabbMm& b, - b3DbvtAabbMm& r); - B3_DBVT_INLINE friend bool b3NotEqual(const b3DbvtAabbMm& a, - const b3DbvtAabbMm& b); - - B3_DBVT_INLINE b3Vector3& tMins() { return (mi); } - B3_DBVT_INLINE b3Vector3& tMaxs() { return (mx); } - -private: - B3_DBVT_INLINE void AddSpan(const b3Vector3& d, b3Scalar& smi, b3Scalar& smx) const; - -private: - b3Vector3 mi, mx; -}; - -// Types -typedef b3DbvtAabbMm b3DbvtVolume; - -/* b3DbvtNode */ -struct b3DbvtNode -{ - b3DbvtVolume volume; - b3DbvtNode* parent; - B3_DBVT_INLINE bool isleaf() const { return (childs[1] == 0); } - B3_DBVT_INLINE bool isinternal() const { return (!isleaf()); } - union { - b3DbvtNode* childs[2]; - void* data; - int dataAsInt; - }; -}; - -///The b3DynamicBvh class implements a fast dynamic bounding volume tree based on axis aligned bounding boxes (aabb tree). -///This b3DynamicBvh is used for soft body collision detection and for the b3DynamicBvhBroadphase. It has a fast insert, remove and update of nodes. -///Unlike the b3QuantizedBvh, nodes can be dynamically moved around, which allows for change in topology of the underlying data structure. -struct b3DynamicBvh -{ - /* Stack element */ - struct sStkNN - { - const b3DbvtNode* a; - const b3DbvtNode* b; - sStkNN() {} - sStkNN(const b3DbvtNode* na, const b3DbvtNode* nb) : a(na), b(nb) {} - }; - struct sStkNP - { - const b3DbvtNode* node; - int mask; - sStkNP(const b3DbvtNode* n, unsigned m) : node(n), mask(m) {} - }; - struct sStkNPS - { - const b3DbvtNode* node; - int mask; - b3Scalar value; - sStkNPS() {} - sStkNPS(const b3DbvtNode* n, unsigned m, b3Scalar v) : node(n), mask(m), value(v) {} - }; - struct sStkCLN - { - const b3DbvtNode* node; - b3DbvtNode* parent; - sStkCLN(const b3DbvtNode* n, b3DbvtNode* p) : node(n), parent(p) {} - }; - // Policies/Interfaces - - /* ICollide */ - struct ICollide - { - B3_DBVT_VIRTUAL_DTOR(ICollide) - B3_DBVT_VIRTUAL void Process(const b3DbvtNode*, const b3DbvtNode*) {} - B3_DBVT_VIRTUAL void Process(const b3DbvtNode*) {} - B3_DBVT_VIRTUAL void Process(const b3DbvtNode* n, b3Scalar) { Process(n); } - B3_DBVT_VIRTUAL bool Descent(const b3DbvtNode*) { return (true); } - B3_DBVT_VIRTUAL bool AllLeaves(const b3DbvtNode*) { return (true); } - }; - /* IWriter */ - struct IWriter - { - virtual ~IWriter() {} - virtual void Prepare(const b3DbvtNode* root, int numnodes) = 0; - virtual void WriteNode(const b3DbvtNode*, int index, int parent, int child0, int child1) = 0; - virtual void WriteLeaf(const b3DbvtNode*, int index, int parent) = 0; - }; - /* IClone */ - struct IClone - { - virtual ~IClone() {} - virtual void CloneLeaf(b3DbvtNode*) {} - }; - - // Constants - enum - { - B3_SIMPLE_STACKSIZE = 64, - B3_DOUBLE_STACKSIZE = B3_SIMPLE_STACKSIZE * 2 - }; - - // Fields - b3DbvtNode* m_root; - b3DbvtNode* m_free; - int m_lkhd; - int m_leaves; - unsigned m_opath; - - b3AlignedObjectArray m_stkStack; - mutable b3AlignedObjectArray m_rayTestStack; - - // Methods - b3DynamicBvh(); - ~b3DynamicBvh(); - void clear(); - bool empty() const { return (0 == m_root); } - void optimizeBottomUp(); - void optimizeTopDown(int bu_treshold = 128); - void optimizeIncremental(int passes); - b3DbvtNode* insert(const b3DbvtVolume& box, void* data); - void update(b3DbvtNode* leaf, int lookahead = -1); - void update(b3DbvtNode* leaf, b3DbvtVolume& volume); - bool update(b3DbvtNode* leaf, b3DbvtVolume& volume, const b3Vector3& velocity, b3Scalar margin); - bool update(b3DbvtNode* leaf, b3DbvtVolume& volume, const b3Vector3& velocity); - bool update(b3DbvtNode* leaf, b3DbvtVolume& volume, b3Scalar margin); - void remove(b3DbvtNode* leaf); - void write(IWriter* iwriter) const; - void clone(b3DynamicBvh& dest, IClone* iclone = 0) const; - static int maxdepth(const b3DbvtNode* node); - static int countLeaves(const b3DbvtNode* node); - static void extractLeaves(const b3DbvtNode* node, b3AlignedObjectArray& leaves); -#if B3_DBVT_ENABLE_BENCHMARK - static void benchmark(); -#else - static void benchmark() - { - } -#endif - // B3_DBVT_IPOLICY must support ICollide policy/interface - B3_DBVT_PREFIX - static void enumNodes(const b3DbvtNode* root, - B3_DBVT_IPOLICY); - B3_DBVT_PREFIX - static void enumLeaves(const b3DbvtNode* root, - B3_DBVT_IPOLICY); - B3_DBVT_PREFIX - void collideTT(const b3DbvtNode* root0, - const b3DbvtNode* root1, - B3_DBVT_IPOLICY); - - B3_DBVT_PREFIX - void collideTTpersistentStack(const b3DbvtNode* root0, - const b3DbvtNode* root1, - B3_DBVT_IPOLICY); -#if 0 - B3_DBVT_PREFIX - void collideTT( const b3DbvtNode* root0, - const b3DbvtNode* root1, - const b3Transform& xform, - B3_DBVT_IPOLICY); - B3_DBVT_PREFIX - void collideTT( const b3DbvtNode* root0, - const b3Transform& xform0, - const b3DbvtNode* root1, - const b3Transform& xform1, - B3_DBVT_IPOLICY); -#endif - - B3_DBVT_PREFIX - void collideTV(const b3DbvtNode* root, - const b3DbvtVolume& volume, - B3_DBVT_IPOLICY) const; - ///rayTest is a re-entrant ray test, and can be called in parallel as long as the b3AlignedAlloc is thread-safe (uses locking etc) - ///rayTest is slower than rayTestInternal, because it builds a local stack, using memory allocations, and it recomputes signs/rayDirectionInverses each time - B3_DBVT_PREFIX - static void rayTest(const b3DbvtNode* root, - const b3Vector3& rayFrom, - const b3Vector3& rayTo, - B3_DBVT_IPOLICY); - ///rayTestInternal is faster than rayTest, because it uses a persistent stack (to reduce dynamic memory allocations to a minimum) and it uses precomputed signs/rayInverseDirections - ///rayTestInternal is used by b3DynamicBvhBroadphase to accelerate world ray casts - B3_DBVT_PREFIX - void rayTestInternal(const b3DbvtNode* root, - const b3Vector3& rayFrom, - const b3Vector3& rayTo, - const b3Vector3& rayDirectionInverse, - unsigned int signs[3], - b3Scalar lambda_max, - const b3Vector3& aabbMin, - const b3Vector3& aabbMax, - B3_DBVT_IPOLICY) const; - - B3_DBVT_PREFIX - static void collideKDOP(const b3DbvtNode* root, - const b3Vector3* normals, - const b3Scalar* offsets, - int count, - B3_DBVT_IPOLICY); - B3_DBVT_PREFIX - static void collideOCL(const b3DbvtNode* root, - const b3Vector3* normals, - const b3Scalar* offsets, - const b3Vector3& sortaxis, - int count, - B3_DBVT_IPOLICY, - bool fullsort = true); - B3_DBVT_PREFIX - static void collideTU(const b3DbvtNode* root, - B3_DBVT_IPOLICY); - // Helpers - static B3_DBVT_INLINE int nearest(const int* i, const b3DynamicBvh::sStkNPS* a, b3Scalar v, int l, int h) - { - int m = 0; - while (l < h) - { - m = (l + h) >> 1; - if (a[i[m]].value >= v) - l = m + 1; - else - h = m; - } - return (h); - } - static B3_DBVT_INLINE int allocate(b3AlignedObjectArray& ifree, - b3AlignedObjectArray& stock, - const sStkNPS& value) - { - int i; - if (ifree.size() > 0) - { - i = ifree[ifree.size() - 1]; - ifree.pop_back(); - stock[i] = value; - } - else - { - i = stock.size(); - stock.push_back(value); - } - return (i); - } - // -private: - b3DynamicBvh(const b3DynamicBvh&) {} -}; - -// -// Inline's -// - -// -inline b3DbvtAabbMm b3DbvtAabbMm::FromCE(const b3Vector3& c, const b3Vector3& e) -{ - b3DbvtAabbMm box; - box.mi = c - e; - box.mx = c + e; - return (box); -} - -// -inline b3DbvtAabbMm b3DbvtAabbMm::FromCR(const b3Vector3& c, b3Scalar r) -{ - return (FromCE(c, b3MakeVector3(r, r, r))); -} - -// -inline b3DbvtAabbMm b3DbvtAabbMm::FromMM(const b3Vector3& mi, const b3Vector3& mx) -{ - b3DbvtAabbMm box; - box.mi = mi; - box.mx = mx; - return (box); -} - -// -inline b3DbvtAabbMm b3DbvtAabbMm::FromPoints(const b3Vector3* pts, int n) -{ - b3DbvtAabbMm box; - box.mi = box.mx = pts[0]; - for (int i = 1; i < n; ++i) - { - box.mi.setMin(pts[i]); - box.mx.setMax(pts[i]); - } - return (box); -} - -// -inline b3DbvtAabbMm b3DbvtAabbMm::FromPoints(const b3Vector3** ppts, int n) -{ - b3DbvtAabbMm box; - box.mi = box.mx = *ppts[0]; - for (int i = 1; i < n; ++i) - { - box.mi.setMin(*ppts[i]); - box.mx.setMax(*ppts[i]); - } - return (box); -} - -// -B3_DBVT_INLINE void b3DbvtAabbMm::Expand(const b3Vector3& e) -{ - mi -= e; - mx += e; -} - -// -B3_DBVT_INLINE void b3DbvtAabbMm::SignedExpand(const b3Vector3& e) -{ - if (e.x > 0) - mx.setX(mx.x + e[0]); - else - mi.setX(mi.x + e[0]); - if (e.y > 0) - mx.setY(mx.y + e[1]); - else - mi.setY(mi.y + e[1]); - if (e.z > 0) - mx.setZ(mx.z + e[2]); - else - mi.setZ(mi.z + e[2]); -} - -// -B3_DBVT_INLINE bool b3DbvtAabbMm::Contain(const b3DbvtAabbMm& a) const -{ - return ((mi.x <= a.mi.x) && - (mi.y <= a.mi.y) && - (mi.z <= a.mi.z) && - (mx.x >= a.mx.x) && - (mx.y >= a.mx.y) && - (mx.z >= a.mx.z)); -} - -// -B3_DBVT_INLINE int b3DbvtAabbMm::Classify(const b3Vector3& n, b3Scalar o, int s) const -{ - b3Vector3 pi, px; - switch (s) - { - case (0 + 0 + 0): - px = b3MakeVector3(mi.x, mi.y, mi.z); - pi = b3MakeVector3(mx.x, mx.y, mx.z); - break; - case (1 + 0 + 0): - px = b3MakeVector3(mx.x, mi.y, mi.z); - pi = b3MakeVector3(mi.x, mx.y, mx.z); - break; - case (0 + 2 + 0): - px = b3MakeVector3(mi.x, mx.y, mi.z); - pi = b3MakeVector3(mx.x, mi.y, mx.z); - break; - case (1 + 2 + 0): - px = b3MakeVector3(mx.x, mx.y, mi.z); - pi = b3MakeVector3(mi.x, mi.y, mx.z); - break; - case (0 + 0 + 4): - px = b3MakeVector3(mi.x, mi.y, mx.z); - pi = b3MakeVector3(mx.x, mx.y, mi.z); - break; - case (1 + 0 + 4): - px = b3MakeVector3(mx.x, mi.y, mx.z); - pi = b3MakeVector3(mi.x, mx.y, mi.z); - break; - case (0 + 2 + 4): - px = b3MakeVector3(mi.x, mx.y, mx.z); - pi = b3MakeVector3(mx.x, mi.y, mi.z); - break; - case (1 + 2 + 4): - px = b3MakeVector3(mx.x, mx.y, mx.z); - pi = b3MakeVector3(mi.x, mi.y, mi.z); - break; - } - if ((b3Dot(n, px) + o) < 0) return (-1); - if ((b3Dot(n, pi) + o) >= 0) return (+1); - return (0); -} - -// -B3_DBVT_INLINE b3Scalar b3DbvtAabbMm::ProjectMinimum(const b3Vector3& v, unsigned signs) const -{ - const b3Vector3* b[] = {&mx, &mi}; - const b3Vector3 p = b3MakeVector3(b[(signs >> 0) & 1]->x, - b[(signs >> 1) & 1]->y, - b[(signs >> 2) & 1]->z); - return (b3Dot(p, v)); -} - -// -B3_DBVT_INLINE void b3DbvtAabbMm::AddSpan(const b3Vector3& d, b3Scalar& smi, b3Scalar& smx) const -{ - for (int i = 0; i < 3; ++i) - { - if (d[i] < 0) - { - smi += mx[i] * d[i]; - smx += mi[i] * d[i]; - } - else - { - smi += mi[i] * d[i]; - smx += mx[i] * d[i]; - } - } -} - -// -B3_DBVT_INLINE bool b3Intersect(const b3DbvtAabbMm& a, - const b3DbvtAabbMm& b) -{ -#if B3_DBVT_INT0_IMPL == B3_DBVT_IMPL_SSE - const __m128 rt(_mm_or_ps(_mm_cmplt_ps(_mm_load_ps(b.mx), _mm_load_ps(a.mi)), - _mm_cmplt_ps(_mm_load_ps(a.mx), _mm_load_ps(b.mi)))); -#if defined(_WIN32) - const __int32* pu((const __int32*)&rt); -#else - const int* pu((const int*)&rt); -#endif - return ((pu[0] | pu[1] | pu[2]) == 0); -#else - return ((a.mi.x <= b.mx.x) && - (a.mx.x >= b.mi.x) && - (a.mi.y <= b.mx.y) && - (a.mx.y >= b.mi.y) && - (a.mi.z <= b.mx.z) && - (a.mx.z >= b.mi.z)); -#endif -} - -// -B3_DBVT_INLINE bool b3Intersect(const b3DbvtAabbMm& a, - const b3Vector3& b) -{ - return ((b.x >= a.mi.x) && - (b.y >= a.mi.y) && - (b.z >= a.mi.z) && - (b.x <= a.mx.x) && - (b.y <= a.mx.y) && - (b.z <= a.mx.z)); -} - -////////////////////////////////////// - -// -B3_DBVT_INLINE b3Scalar b3Proximity(const b3DbvtAabbMm& a, - const b3DbvtAabbMm& b) -{ - const b3Vector3 d = (a.mi + a.mx) - (b.mi + b.mx); - return (b3Fabs(d.x) + b3Fabs(d.y) + b3Fabs(d.z)); -} - -// -B3_DBVT_INLINE int b3Select(const b3DbvtAabbMm& o, - const b3DbvtAabbMm& a, - const b3DbvtAabbMm& b) -{ -#if B3_DBVT_SELECT_IMPL == B3_DBVT_IMPL_SSE - -#if defined(_WIN32) - static B3_ATTRIBUTE_ALIGNED16(const unsigned __int32) mask[] = {0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff}; -#else - static B3_ATTRIBUTE_ALIGNED16(const unsigned int) mask[] = {0x7fffffff, 0x7fffffff, 0x7fffffff, 0x00000000 /*0x7fffffff*/}; -#endif - ///@todo: the intrinsic version is 11% slower -#if B3_DBVT_USE_INTRINSIC_SSE - - union b3SSEUnion ///NOTE: if we use more intrinsics, move b3SSEUnion into the LinearMath directory - { - __m128 ssereg; - float floats[4]; - int ints[4]; - }; - - __m128 omi(_mm_load_ps(o.mi)); - omi = _mm_add_ps(omi, _mm_load_ps(o.mx)); - __m128 ami(_mm_load_ps(a.mi)); - ami = _mm_add_ps(ami, _mm_load_ps(a.mx)); - ami = _mm_sub_ps(ami, omi); - ami = _mm_and_ps(ami, _mm_load_ps((const float*)mask)); - __m128 bmi(_mm_load_ps(b.mi)); - bmi = _mm_add_ps(bmi, _mm_load_ps(b.mx)); - bmi = _mm_sub_ps(bmi, omi); - bmi = _mm_and_ps(bmi, _mm_load_ps((const float*)mask)); - __m128 t0(_mm_movehl_ps(ami, ami)); - ami = _mm_add_ps(ami, t0); - ami = _mm_add_ss(ami, _mm_shuffle_ps(ami, ami, 1)); - __m128 t1(_mm_movehl_ps(bmi, bmi)); - bmi = _mm_add_ps(bmi, t1); - bmi = _mm_add_ss(bmi, _mm_shuffle_ps(bmi, bmi, 1)); - - b3SSEUnion tmp; - tmp.ssereg = _mm_cmple_ss(bmi, ami); - return tmp.ints[0] & 1; - -#else - B3_ATTRIBUTE_ALIGNED16(__int32 r[1]); - __asm - { - mov eax,o - mov ecx,a - mov edx,b - movaps xmm0,[eax] - movaps xmm5,mask - addps xmm0,[eax+16] - movaps xmm1,[ecx] - movaps xmm2,[edx] - addps xmm1,[ecx+16] - addps xmm2,[edx+16] - subps xmm1,xmm0 - subps xmm2,xmm0 - andps xmm1,xmm5 - andps xmm2,xmm5 - movhlps xmm3,xmm1 - movhlps xmm4,xmm2 - addps xmm1,xmm3 - addps xmm2,xmm4 - pshufd xmm3,xmm1,1 - pshufd xmm4,xmm2,1 - addss xmm1,xmm3 - addss xmm2,xmm4 - cmpless xmm2,xmm1 - movss r,xmm2 - } - return (r[0] & 1); -#endif -#else - return (b3Proximity(o, a) < b3Proximity(o, b) ? 0 : 1); -#endif -} - -// -B3_DBVT_INLINE void b3Merge(const b3DbvtAabbMm& a, - const b3DbvtAabbMm& b, - b3DbvtAabbMm& r) -{ -#if B3_DBVT_MERGE_IMPL == B3_DBVT_IMPL_SSE - __m128 ami(_mm_load_ps(a.mi)); - __m128 amx(_mm_load_ps(a.mx)); - __m128 bmi(_mm_load_ps(b.mi)); - __m128 bmx(_mm_load_ps(b.mx)); - ami = _mm_min_ps(ami, bmi); - amx = _mm_max_ps(amx, bmx); - _mm_store_ps(r.mi, ami); - _mm_store_ps(r.mx, amx); -#else - for (int i = 0; i < 3; ++i) - { - if (a.mi[i] < b.mi[i]) - r.mi[i] = a.mi[i]; - else - r.mi[i] = b.mi[i]; - if (a.mx[i] > b.mx[i]) - r.mx[i] = a.mx[i]; - else - r.mx[i] = b.mx[i]; - } -#endif -} - -// -B3_DBVT_INLINE bool b3NotEqual(const b3DbvtAabbMm& a, - const b3DbvtAabbMm& b) -{ - return ((a.mi.x != b.mi.x) || - (a.mi.y != b.mi.y) || - (a.mi.z != b.mi.z) || - (a.mx.x != b.mx.x) || - (a.mx.y != b.mx.y) || - (a.mx.z != b.mx.z)); -} - -// -// Inline's -// - -// -B3_DBVT_PREFIX -inline void b3DynamicBvh::enumNodes(const b3DbvtNode* root, - B3_DBVT_IPOLICY) -{ - B3_DBVT_CHECKTYPE - policy.Process(root); - if (root->isinternal()) - { - enumNodes(root->childs[0], policy); - enumNodes(root->childs[1], policy); - } -} - -// -B3_DBVT_PREFIX -inline void b3DynamicBvh::enumLeaves(const b3DbvtNode* root, - B3_DBVT_IPOLICY) -{ - B3_DBVT_CHECKTYPE - if (root->isinternal()) - { - enumLeaves(root->childs[0], policy); - enumLeaves(root->childs[1], policy); - } - else - { - policy.Process(root); - } -} - -// -B3_DBVT_PREFIX -inline void b3DynamicBvh::collideTT(const b3DbvtNode* root0, - const b3DbvtNode* root1, - B3_DBVT_IPOLICY) -{ - B3_DBVT_CHECKTYPE - if (root0 && root1) - { - int depth = 1; - int treshold = B3_DOUBLE_STACKSIZE - 4; - b3AlignedObjectArray stkStack; - stkStack.resize(B3_DOUBLE_STACKSIZE); - stkStack[0] = sStkNN(root0, root1); - do - { - sStkNN p = stkStack[--depth]; - if (depth > treshold) - { - stkStack.resize(stkStack.size() * 2); - treshold = stkStack.size() - 4; - } - if (p.a == p.b) - { - if (p.a->isinternal()) - { - stkStack[depth++] = sStkNN(p.a->childs[0], p.a->childs[0]); - stkStack[depth++] = sStkNN(p.a->childs[1], p.a->childs[1]); - stkStack[depth++] = sStkNN(p.a->childs[0], p.a->childs[1]); - } - } - else if (b3Intersect(p.a->volume, p.b->volume)) - { - if (p.a->isinternal()) - { - if (p.b->isinternal()) - { - stkStack[depth++] = sStkNN(p.a->childs[0], p.b->childs[0]); - stkStack[depth++] = sStkNN(p.a->childs[1], p.b->childs[0]); - stkStack[depth++] = sStkNN(p.a->childs[0], p.b->childs[1]); - stkStack[depth++] = sStkNN(p.a->childs[1], p.b->childs[1]); - } - else - { - stkStack[depth++] = sStkNN(p.a->childs[0], p.b); - stkStack[depth++] = sStkNN(p.a->childs[1], p.b); - } - } - else - { - if (p.b->isinternal()) - { - stkStack[depth++] = sStkNN(p.a, p.b->childs[0]); - stkStack[depth++] = sStkNN(p.a, p.b->childs[1]); - } - else - { - policy.Process(p.a, p.b); - } - } - } - } while (depth); - } -} - -B3_DBVT_PREFIX -inline void b3DynamicBvh::collideTTpersistentStack(const b3DbvtNode* root0, - const b3DbvtNode* root1, - B3_DBVT_IPOLICY) -{ - B3_DBVT_CHECKTYPE - if (root0 && root1) - { - int depth = 1; - int treshold = B3_DOUBLE_STACKSIZE - 4; - - m_stkStack.resize(B3_DOUBLE_STACKSIZE); - m_stkStack[0] = sStkNN(root0, root1); - do - { - sStkNN p = m_stkStack[--depth]; - if (depth > treshold) - { - m_stkStack.resize(m_stkStack.size() * 2); - treshold = m_stkStack.size() - 4; - } - if (p.a == p.b) - { - if (p.a->isinternal()) - { - m_stkStack[depth++] = sStkNN(p.a->childs[0], p.a->childs[0]); - m_stkStack[depth++] = sStkNN(p.a->childs[1], p.a->childs[1]); - m_stkStack[depth++] = sStkNN(p.a->childs[0], p.a->childs[1]); - } - } - else if (b3Intersect(p.a->volume, p.b->volume)) - { - if (p.a->isinternal()) - { - if (p.b->isinternal()) - { - m_stkStack[depth++] = sStkNN(p.a->childs[0], p.b->childs[0]); - m_stkStack[depth++] = sStkNN(p.a->childs[1], p.b->childs[0]); - m_stkStack[depth++] = sStkNN(p.a->childs[0], p.b->childs[1]); - m_stkStack[depth++] = sStkNN(p.a->childs[1], p.b->childs[1]); - } - else - { - m_stkStack[depth++] = sStkNN(p.a->childs[0], p.b); - m_stkStack[depth++] = sStkNN(p.a->childs[1], p.b); - } - } - else - { - if (p.b->isinternal()) - { - m_stkStack[depth++] = sStkNN(p.a, p.b->childs[0]); - m_stkStack[depth++] = sStkNN(p.a, p.b->childs[1]); - } - else - { - policy.Process(p.a, p.b); - } - } - } - } while (depth); - } -} - -#if 0 -// -B3_DBVT_PREFIX -inline void b3DynamicBvh::collideTT( const b3DbvtNode* root0, - const b3DbvtNode* root1, - const b3Transform& xform, - B3_DBVT_IPOLICY) -{ - B3_DBVT_CHECKTYPE - if(root0&&root1) - { - int depth=1; - int treshold=B3_DOUBLE_STACKSIZE-4; - b3AlignedObjectArray stkStack; - stkStack.resize(B3_DOUBLE_STACKSIZE); - stkStack[0]=sStkNN(root0,root1); - do { - sStkNN p=stkStack[--depth]; - if(b3Intersect(p.a->volume,p.b->volume,xform)) - { - if(depth>treshold) - { - stkStack.resize(stkStack.size()*2); - treshold=stkStack.size()-4; - } - if(p.a->isinternal()) - { - if(p.b->isinternal()) - { - stkStack[depth++]=sStkNN(p.a->childs[0],p.b->childs[0]); - stkStack[depth++]=sStkNN(p.a->childs[1],p.b->childs[0]); - stkStack[depth++]=sStkNN(p.a->childs[0],p.b->childs[1]); - stkStack[depth++]=sStkNN(p.a->childs[1],p.b->childs[1]); - } - else - { - stkStack[depth++]=sStkNN(p.a->childs[0],p.b); - stkStack[depth++]=sStkNN(p.a->childs[1],p.b); - } - } - else - { - if(p.b->isinternal()) - { - stkStack[depth++]=sStkNN(p.a,p.b->childs[0]); - stkStack[depth++]=sStkNN(p.a,p.b->childs[1]); - } - else - { - policy.Process(p.a,p.b); - } - } - } - } while(depth); - } -} -// -B3_DBVT_PREFIX -inline void b3DynamicBvh::collideTT( const b3DbvtNode* root0, - const b3Transform& xform0, - const b3DbvtNode* root1, - const b3Transform& xform1, - B3_DBVT_IPOLICY) -{ - const b3Transform xform=xform0.inverse()*xform1; - collideTT(root0,root1,xform,policy); -} -#endif - -// -B3_DBVT_PREFIX -inline void b3DynamicBvh::collideTV(const b3DbvtNode* root, - const b3DbvtVolume& vol, - B3_DBVT_IPOLICY) const -{ - B3_DBVT_CHECKTYPE - if (root) - { - B3_ATTRIBUTE_ALIGNED16(b3DbvtVolume) - volume(vol); - b3AlignedObjectArray stack; - stack.resize(0); - stack.reserve(B3_SIMPLE_STACKSIZE); - stack.push_back(root); - do - { - const b3DbvtNode* n = stack[stack.size() - 1]; - stack.pop_back(); - if (b3Intersect(n->volume, volume)) - { - if (n->isinternal()) - { - stack.push_back(n->childs[0]); - stack.push_back(n->childs[1]); - } - else - { - policy.Process(n); - } - } - } while (stack.size() > 0); - } -} - -B3_DBVT_PREFIX -inline void b3DynamicBvh::rayTestInternal(const b3DbvtNode* root, - const b3Vector3& rayFrom, - const b3Vector3& rayTo, - const b3Vector3& rayDirectionInverse, - unsigned int signs[3], - b3Scalar lambda_max, - const b3Vector3& aabbMin, - const b3Vector3& aabbMax, - B3_DBVT_IPOLICY) const -{ - (void)rayTo; - B3_DBVT_CHECKTYPE - if (root) - { - int depth = 1; - int treshold = B3_DOUBLE_STACKSIZE - 2; - b3AlignedObjectArray& stack = m_rayTestStack; - stack.resize(B3_DOUBLE_STACKSIZE); - stack[0] = root; - b3Vector3 bounds[2]; - do - { - const b3DbvtNode* node = stack[--depth]; - bounds[0] = node->volume.Mins() - aabbMax; - bounds[1] = node->volume.Maxs() - aabbMin; - b3Scalar tmin = 1.f, lambda_min = 0.f; - unsigned int result1 = false; - result1 = b3RayAabb2(rayFrom, rayDirectionInverse, signs, bounds, tmin, lambda_min, lambda_max); - if (result1) - { - if (node->isinternal()) - { - if (depth > treshold) - { - stack.resize(stack.size() * 2); - treshold = stack.size() - 2; - } - stack[depth++] = node->childs[0]; - stack[depth++] = node->childs[1]; - } - else - { - policy.Process(node); - } - } - } while (depth); - } -} - -// -B3_DBVT_PREFIX -inline void b3DynamicBvh::rayTest(const b3DbvtNode* root, - const b3Vector3& rayFrom, - const b3Vector3& rayTo, - B3_DBVT_IPOLICY) -{ - B3_DBVT_CHECKTYPE - if (root) - { - b3Vector3 rayDir = (rayTo - rayFrom); - rayDir.normalize(); - - ///what about division by zero? --> just set rayDirection[i] to INF/B3_LARGE_FLOAT - b3Vector3 rayDirectionInverse; - rayDirectionInverse[0] = rayDir[0] == b3Scalar(0.0) ? b3Scalar(B3_LARGE_FLOAT) : b3Scalar(1.0) / rayDir[0]; - rayDirectionInverse[1] = rayDir[1] == b3Scalar(0.0) ? b3Scalar(B3_LARGE_FLOAT) : b3Scalar(1.0) / rayDir[1]; - rayDirectionInverse[2] = rayDir[2] == b3Scalar(0.0) ? b3Scalar(B3_LARGE_FLOAT) : b3Scalar(1.0) / rayDir[2]; - unsigned int signs[3] = {rayDirectionInverse[0] < 0.0, rayDirectionInverse[1] < 0.0, rayDirectionInverse[2] < 0.0}; - - b3Scalar lambda_max = rayDir.dot(rayTo - rayFrom); -#ifdef COMPARE_BTRAY_AABB2 - b3Vector3 resultNormal; -#endif //COMPARE_BTRAY_AABB2 - - b3AlignedObjectArray stack; - - int depth = 1; - int treshold = B3_DOUBLE_STACKSIZE - 2; - - stack.resize(B3_DOUBLE_STACKSIZE); - stack[0] = root; - b3Vector3 bounds[2]; - do - { - const b3DbvtNode* node = stack[--depth]; - - bounds[0] = node->volume.Mins(); - bounds[1] = node->volume.Maxs(); - - b3Scalar tmin = 1.f, lambda_min = 0.f; - unsigned int result1 = b3RayAabb2(rayFrom, rayDirectionInverse, signs, bounds, tmin, lambda_min, lambda_max); - -#ifdef COMPARE_BTRAY_AABB2 - b3Scalar param = 1.f; - bool result2 = b3RayAabb(rayFrom, rayTo, node->volume.Mins(), node->volume.Maxs(), param, resultNormal); - b3Assert(result1 == result2); -#endif //TEST_BTRAY_AABB2 - - if (result1) - { - if (node->isinternal()) - { - if (depth > treshold) - { - stack.resize(stack.size() * 2); - treshold = stack.size() - 2; - } - stack[depth++] = node->childs[0]; - stack[depth++] = node->childs[1]; - } - else - { - policy.Process(node); - } - } - } while (depth); - } -} - -// -B3_DBVT_PREFIX -inline void b3DynamicBvh::collideKDOP(const b3DbvtNode* root, - const b3Vector3* normals, - const b3Scalar* offsets, - int count, - B3_DBVT_IPOLICY) -{ - B3_DBVT_CHECKTYPE - if (root) - { - const int inside = (1 << count) - 1; - b3AlignedObjectArray stack; - int signs[sizeof(unsigned) * 8]; - b3Assert(count < int(sizeof(signs) / sizeof(signs[0]))); - for (int i = 0; i < count; ++i) - { - signs[i] = ((normals[i].x >= 0) ? 1 : 0) + - ((normals[i].y >= 0) ? 2 : 0) + - ((normals[i].z >= 0) ? 4 : 0); - } - stack.reserve(B3_SIMPLE_STACKSIZE); - stack.push_back(sStkNP(root, 0)); - do - { - sStkNP se = stack[stack.size() - 1]; - bool out = false; - stack.pop_back(); - for (int i = 0, j = 1; (!out) && (i < count); ++i, j <<= 1) - { - if (0 == (se.mask & j)) - { - const int side = se.node->volume.Classify(normals[i], offsets[i], signs[i]); - switch (side) - { - case -1: - out = true; - break; - case +1: - se.mask |= j; - break; - } - } - } - if (!out) - { - if ((se.mask != inside) && (se.node->isinternal())) - { - stack.push_back(sStkNP(se.node->childs[0], se.mask)); - stack.push_back(sStkNP(se.node->childs[1], se.mask)); - } - else - { - if (policy.AllLeaves(se.node)) enumLeaves(se.node, policy); - } - } - } while (stack.size()); - } -} - -// -B3_DBVT_PREFIX -inline void b3DynamicBvh::collideOCL(const b3DbvtNode* root, - const b3Vector3* normals, - const b3Scalar* offsets, - const b3Vector3& sortaxis, - int count, - B3_DBVT_IPOLICY, - bool fsort) -{ - B3_DBVT_CHECKTYPE - if (root) - { - const unsigned srtsgns = (sortaxis[0] >= 0 ? 1 : 0) + - (sortaxis[1] >= 0 ? 2 : 0) + - (sortaxis[2] >= 0 ? 4 : 0); - const int inside = (1 << count) - 1; - b3AlignedObjectArray stock; - b3AlignedObjectArray ifree; - b3AlignedObjectArray stack; - int signs[sizeof(unsigned) * 8]; - b3Assert(count < int(sizeof(signs) / sizeof(signs[0]))); - for (int i = 0; i < count; ++i) - { - signs[i] = ((normals[i].x >= 0) ? 1 : 0) + - ((normals[i].y >= 0) ? 2 : 0) + - ((normals[i].z >= 0) ? 4 : 0); - } - stock.reserve(B3_SIMPLE_STACKSIZE); - stack.reserve(B3_SIMPLE_STACKSIZE); - ifree.reserve(B3_SIMPLE_STACKSIZE); - stack.push_back(allocate(ifree, stock, sStkNPS(root, 0, root->volume.ProjectMinimum(sortaxis, srtsgns)))); - do - { - const int id = stack[stack.size() - 1]; - sStkNPS se = stock[id]; - stack.pop_back(); - ifree.push_back(id); - if (se.mask != inside) - { - bool out = false; - for (int i = 0, j = 1; (!out) && (i < count); ++i, j <<= 1) - { - if (0 == (se.mask & j)) - { - const int side = se.node->volume.Classify(normals[i], offsets[i], signs[i]); - switch (side) - { - case -1: - out = true; - break; - case +1: - se.mask |= j; - break; - } - } - } - if (out) continue; - } - if (policy.Descent(se.node)) - { - if (se.node->isinternal()) - { - const b3DbvtNode* pns[] = {se.node->childs[0], se.node->childs[1]}; - sStkNPS nes[] = {sStkNPS(pns[0], se.mask, pns[0]->volume.ProjectMinimum(sortaxis, srtsgns)), - sStkNPS(pns[1], se.mask, pns[1]->volume.ProjectMinimum(sortaxis, srtsgns))}; - const int q = nes[0].value < nes[1].value ? 1 : 0; - int j = stack.size(); - if (fsort && (j > 0)) - { - /* Insert 0 */ - j = nearest(&stack[0], &stock[0], nes[q].value, 0, stack.size()); - stack.push_back(0); -#if B3_DBVT_USE_MEMMOVE - memmove(&stack[j + 1], &stack[j], sizeof(int) * (stack.size() - j - 1)); -#else - for (int k = stack.size() - 1; k > j; --k) stack[k] = stack[k - 1]; -#endif - stack[j] = allocate(ifree, stock, nes[q]); - /* Insert 1 */ - j = nearest(&stack[0], &stock[0], nes[1 - q].value, j, stack.size()); - stack.push_back(0); -#if B3_DBVT_USE_MEMMOVE - memmove(&stack[j + 1], &stack[j], sizeof(int) * (stack.size() - j - 1)); -#else - for (int k = stack.size() - 1; k > j; --k) stack[k] = stack[k - 1]; -#endif - stack[j] = allocate(ifree, stock, nes[1 - q]); - } - else - { - stack.push_back(allocate(ifree, stock, nes[q])); - stack.push_back(allocate(ifree, stock, nes[1 - q])); - } - } - else - { - policy.Process(se.node, se.value); - } - } - } while (stack.size()); - } -} - -// -B3_DBVT_PREFIX -inline void b3DynamicBvh::collideTU(const b3DbvtNode* root, - B3_DBVT_IPOLICY) -{ - B3_DBVT_CHECKTYPE - if (root) - { - b3AlignedObjectArray stack; - stack.reserve(B3_SIMPLE_STACKSIZE); - stack.push_back(root); - do - { - const b3DbvtNode* n = stack[stack.size() - 1]; - stack.pop_back(); - if (policy.Descent(n)) - { - if (n->isinternal()) - { - stack.push_back(n->childs[0]); - stack.push_back(n->childs[1]); - } - else - { - policy.Process(n); - } - } - } while (stack.size() > 0); - } -} - -// -// PP Cleanup -// - -#undef B3_DBVT_USE_MEMMOVE -#undef B3_DBVT_USE_TEMPLATE -#undef B3_DBVT_VIRTUAL_DTOR -#undef B3_DBVT_VIRTUAL -#undef B3_DBVT_PREFIX -#undef B3_DBVT_IPOLICY -#undef B3_DBVT_CHECKTYPE -#undef B3_DBVT_IMPL_GENERIC -#undef B3_DBVT_IMPL_SSE -#undef B3_DBVT_USE_INTRINSIC_SSE -#undef B3_DBVT_SELECT_IMPL -#undef B3_DBVT_MERGE_IMPL -#undef B3_DBVT_INT0_IMPL - -#endif diff --git a/engine/inc/bullet/Bullet3Collision/BroadPhaseCollision/b3DynamicBvhBroadphase.h b/engine/inc/bullet/Bullet3Collision/BroadPhaseCollision/b3DynamicBvhBroadphase.h deleted file mode 100644 index c235e401..00000000 --- a/engine/inc/bullet/Bullet3Collision/BroadPhaseCollision/b3DynamicBvhBroadphase.h +++ /dev/null @@ -1,197 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2013 Erwin Coumans http://bulletphysics.org - -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. -*/ - -///b3DynamicBvhBroadphase implementation by Nathanael Presson -#ifndef B3_DBVT_BROADPHASE_H -#define B3_DBVT_BROADPHASE_H - -#include "Bullet3Collision/BroadPhaseCollision/b3DynamicBvh.h" -#include "Bullet3Collision/BroadPhaseCollision/b3OverlappingPairCache.h" -#include "Bullet3Common/b3AlignedObjectArray.h" - -#include "b3BroadphaseCallback.h" - -// -// Compile time config -// - -#define B3_DBVT_BP_PROFILE 0 -//#define B3_DBVT_BP_SORTPAIRS 1 -#define B3_DBVT_BP_PREVENTFALSEUPDATE 0 -#define B3_DBVT_BP_ACCURATESLEEPING 0 -#define B3_DBVT_BP_ENABLE_BENCHMARK 0 -#define B3_DBVT_BP_MARGIN (b3Scalar)0.05 - -#if B3_DBVT_BP_PROFILE -#define B3_DBVT_BP_PROFILING_RATE 256 - -#endif - -B3_ATTRIBUTE_ALIGNED16(struct) -b3BroadphaseProxy -{ - B3_DECLARE_ALIGNED_ALLOCATOR(); - - ///optional filtering to cull potential collisions - enum CollisionFilterGroups - { - DefaultFilter = 1, - StaticFilter = 2, - KinematicFilter = 4, - DebrisFilter = 8, - SensorTrigger = 16, - CharacterFilter = 32, - AllFilter = -1 //all bits sets: DefaultFilter | StaticFilter | KinematicFilter | DebrisFilter | SensorTrigger - }; - - //Usually the client b3CollisionObject or Rigidbody class - void* m_clientObject; - int m_collisionFilterGroup; - int m_collisionFilterMask; - int m_uniqueId; //m_uniqueId is introduced for paircache. could get rid of this, by calculating the address offset etc. - - b3Vector3 m_aabbMin; - b3Vector3 m_aabbMax; - - B3_FORCE_INLINE int getUid() const - { - return m_uniqueId; - } - - //used for memory pools - b3BroadphaseProxy() : m_clientObject(0) - { - } - - b3BroadphaseProxy(const b3Vector3& aabbMin, const b3Vector3& aabbMax, void* userPtr, int collisionFilterGroup, int collisionFilterMask) - : m_clientObject(userPtr), - m_collisionFilterGroup(collisionFilterGroup), - m_collisionFilterMask(collisionFilterMask), - m_aabbMin(aabbMin), - m_aabbMax(aabbMax) - { - } -}; - -// -// b3DbvtProxy -// -struct b3DbvtProxy : b3BroadphaseProxy -{ - /* Fields */ - //b3DbvtAabbMm aabb; - b3DbvtNode* leaf; - b3DbvtProxy* links[2]; - int stage; - /* ctor */ - - explicit b3DbvtProxy() {} - b3DbvtProxy(const b3Vector3& aabbMin, const b3Vector3& aabbMax, void* userPtr, int collisionFilterGroup, int collisionFilterMask) : b3BroadphaseProxy(aabbMin, aabbMax, userPtr, collisionFilterGroup, collisionFilterMask) - { - links[0] = links[1] = 0; - } -}; - -typedef b3AlignedObjectArray b3DbvtProxyArray; - -///The b3DynamicBvhBroadphase implements a broadphase using two dynamic AABB bounding volume hierarchies/trees (see b3DynamicBvh). -///One tree is used for static/non-moving objects, and another tree is used for dynamic objects. Objects can move from one tree to the other. -///This is a very fast broadphase, especially for very dynamic worlds where many objects are moving. Its insert/add and remove of objects is generally faster than the sweep and prune broadphases b3AxisSweep3 and b332BitAxisSweep3. -struct b3DynamicBvhBroadphase -{ - /* Config */ - enum - { - DYNAMIC_SET = 0, /* Dynamic set index */ - FIXED_SET = 1, /* Fixed set index */ - STAGECOUNT = 2 /* Number of stages */ - }; - /* Fields */ - b3DynamicBvh m_sets[2]; // Dbvt sets - b3DbvtProxy* m_stageRoots[STAGECOUNT + 1]; // Stages list - - b3AlignedObjectArray m_proxies; - b3OverlappingPairCache* m_paircache; // Pair cache - b3Scalar m_prediction; // Velocity prediction - int m_stageCurrent; // Current stage - int m_fupdates; // % of fixed updates per frame - int m_dupdates; // % of dynamic updates per frame - int m_cupdates; // % of cleanup updates per frame - int m_newpairs; // Number of pairs created - int m_fixedleft; // Fixed optimization left - unsigned m_updates_call; // Number of updates call - unsigned m_updates_done; // Number of updates done - b3Scalar m_updates_ratio; // m_updates_done/m_updates_call - int m_pid; // Parse id - int m_cid; // Cleanup index - bool m_releasepaircache; // Release pair cache on delete - bool m_deferedcollide; // Defere dynamic/static collision to collide call - bool m_needcleanup; // Need to run cleanup? -#if B3_DBVT_BP_PROFILE - b3Clock m_clock; - struct - { - unsigned long m_total; - unsigned long m_ddcollide; - unsigned long m_fdcollide; - unsigned long m_cleanup; - unsigned long m_jobcount; - } m_profiling; -#endif - /* Methods */ - b3DynamicBvhBroadphase(int proxyCapacity, b3OverlappingPairCache* paircache = 0); - virtual ~b3DynamicBvhBroadphase(); - void collide(b3Dispatcher* dispatcher); - void optimize(); - - /* b3BroadphaseInterface Implementation */ - b3BroadphaseProxy* createProxy(const b3Vector3& aabbMin, const b3Vector3& aabbMax, int objectIndex, void* userPtr, int collisionFilterGroup, int collisionFilterMask); - virtual void destroyProxy(b3BroadphaseProxy* proxy, b3Dispatcher* dispatcher); - virtual void setAabb(int objectId, const b3Vector3& aabbMin, const b3Vector3& aabbMax, b3Dispatcher* dispatcher); - virtual void rayTest(const b3Vector3& rayFrom, const b3Vector3& rayTo, b3BroadphaseRayCallback& rayCallback, const b3Vector3& aabbMin = b3MakeVector3(0, 0, 0), const b3Vector3& aabbMax = b3MakeVector3(0, 0, 0)); - virtual void aabbTest(const b3Vector3& aabbMin, const b3Vector3& aabbMax, b3BroadphaseAabbCallback& callback); - - //virtual void getAabb(b3BroadphaseProxy* proxy,b3Vector3& aabbMin, b3Vector3& aabbMax ) const; - virtual void getAabb(int objectId, b3Vector3& aabbMin, b3Vector3& aabbMax) const; - virtual void calculateOverlappingPairs(b3Dispatcher* dispatcher = 0); - virtual b3OverlappingPairCache* getOverlappingPairCache(); - virtual const b3OverlappingPairCache* getOverlappingPairCache() const; - virtual void getBroadphaseAabb(b3Vector3& aabbMin, b3Vector3& aabbMax) const; - virtual void printStats(); - - ///reset broadphase internal structures, to ensure determinism/reproducability - virtual void resetPool(b3Dispatcher* dispatcher); - - void performDeferredRemoval(b3Dispatcher* dispatcher); - - void setVelocityPrediction(b3Scalar prediction) - { - m_prediction = prediction; - } - b3Scalar getVelocityPrediction() const - { - return m_prediction; - } - - ///this setAabbForceUpdate is similar to setAabb but always forces the aabb update. - ///it is not part of the b3BroadphaseInterface but specific to b3DynamicBvhBroadphase. - ///it bypasses certain optimizations that prevent aabb updates (when the aabb shrinks), see - ///http://code.google.com/p/bullet/issues/detail?id=223 - void setAabbForceUpdate(b3BroadphaseProxy* absproxy, const b3Vector3& aabbMin, const b3Vector3& aabbMax, b3Dispatcher* /*dispatcher*/); - - //static void benchmark(b3BroadphaseInterface*); -}; - -#endif diff --git a/engine/inc/bullet/Bullet3Collision/BroadPhaseCollision/b3OverlappingPair.h b/engine/inc/bullet/Bullet3Collision/BroadPhaseCollision/b3OverlappingPair.h deleted file mode 100644 index 4ff9ebae..00000000 --- a/engine/inc/bullet/Bullet3Collision/BroadPhaseCollision/b3OverlappingPair.h +++ /dev/null @@ -1,70 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2013 Erwin Coumans http://bulletphysics.org - -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 B3_OVERLAPPING_PAIR_H -#define B3_OVERLAPPING_PAIR_H - -#include "Bullet3Common/shared/b3Int4.h" - -#define B3_NEW_PAIR_MARKER -1 -#define B3_REMOVED_PAIR_MARKER -2 - -typedef b3Int4 b3BroadphasePair; - -inline b3Int4 b3MakeBroadphasePair(int xx, int yy) -{ - b3Int4 pair; - - if (xx < yy) - { - pair.x = xx; - pair.y = yy; - } - else - { - pair.x = yy; - pair.y = xx; - } - pair.z = B3_NEW_PAIR_MARKER; - pair.w = B3_NEW_PAIR_MARKER; - return pair; -} - -/*struct b3BroadphasePair : public b3Int4 -{ - explicit b3BroadphasePair(){} - -}; -*/ - -class b3BroadphasePairSortPredicate -{ -public: - bool operator()(const b3BroadphasePair& a, const b3BroadphasePair& b) const - { - const int uidA0 = a.x; - const int uidB0 = b.x; - const int uidA1 = a.y; - const int uidB1 = b.y; - return uidA0 > uidB0 || (uidA0 == uidB0 && uidA1 > uidB1); - } -}; - -B3_FORCE_INLINE bool operator==(const b3BroadphasePair& a, const b3BroadphasePair& b) -{ - return (a.x == b.x) && (a.y == b.y); -} - -#endif //B3_OVERLAPPING_PAIR_H diff --git a/engine/inc/bullet/Bullet3Collision/BroadPhaseCollision/b3OverlappingPairCache.h b/engine/inc/bullet/Bullet3Collision/BroadPhaseCollision/b3OverlappingPairCache.h deleted file mode 100644 index f1de1d94..00000000 --- a/engine/inc/bullet/Bullet3Collision/BroadPhaseCollision/b3OverlappingPairCache.h +++ /dev/null @@ -1,427 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2013 Erwin Coumans http://bulletphysics.org - -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 B3_OVERLAPPING_PAIR_CACHE_H -#define B3_OVERLAPPING_PAIR_CACHE_H - -#include "Bullet3Common/shared/b3Int2.h" -#include "Bullet3Common/b3AlignedObjectArray.h" - -class b3Dispatcher; -#include "b3OverlappingPair.h" - -typedef b3AlignedObjectArray b3BroadphasePairArray; - -struct b3OverlapCallback -{ - virtual ~b3OverlapCallback() - { - } - //return true for deletion of the pair - virtual bool processOverlap(b3BroadphasePair& pair) = 0; -}; - -struct b3OverlapFilterCallback -{ - virtual ~b3OverlapFilterCallback() - { - } - // return true when pairs need collision - virtual bool needBroadphaseCollision(int proxy0, int proxy1) const = 0; -}; - -extern int b3g_removePairs; -extern int b3g_addedPairs; -extern int b3g_findPairs; - -const int B3_NULL_PAIR = 0xffffffff; - -///The b3OverlappingPairCache provides an interface for overlapping pair management (add, remove, storage), used by the b3BroadphaseInterface broadphases. -///The b3HashedOverlappingPairCache and b3SortedOverlappingPairCache classes are two implementations. -class b3OverlappingPairCache -{ -public: - virtual ~b3OverlappingPairCache() {} // this is needed so we can get to the derived class destructor - - virtual b3BroadphasePair* getOverlappingPairArrayPtr() = 0; - - virtual const b3BroadphasePair* getOverlappingPairArrayPtr() const = 0; - - virtual b3BroadphasePairArray& getOverlappingPairArray() = 0; - - virtual void cleanOverlappingPair(b3BroadphasePair& pair, b3Dispatcher* dispatcher) = 0; - - virtual int getNumOverlappingPairs() const = 0; - - virtual void cleanProxyFromPairs(int proxy, b3Dispatcher* dispatcher) = 0; - - virtual void setOverlapFilterCallback(b3OverlapFilterCallback* callback) = 0; - - virtual void processAllOverlappingPairs(b3OverlapCallback*, b3Dispatcher* dispatcher) = 0; - - virtual b3BroadphasePair* findPair(int proxy0, int proxy1) = 0; - - virtual bool hasDeferredRemoval() = 0; - - //virtual void setInternalGhostPairCallback(b3OverlappingPairCallback* ghostPairCallback)=0; - - virtual b3BroadphasePair* addOverlappingPair(int proxy0, int proxy1) = 0; - virtual void* removeOverlappingPair(int proxy0, int proxy1, b3Dispatcher* dispatcher) = 0; - virtual void removeOverlappingPairsContainingProxy(int /*proxy0*/, b3Dispatcher* /*dispatcher*/) = 0; - - virtual void sortOverlappingPairs(b3Dispatcher* dispatcher) = 0; -}; - -/// Hash-space based Pair Cache, thanks to Erin Catto, Box2D, http://www.box2d.org, and Pierre Terdiman, Codercorner, http://codercorner.com -class b3HashedOverlappingPairCache : public b3OverlappingPairCache -{ - b3BroadphasePairArray m_overlappingPairArray; - b3OverlapFilterCallback* m_overlapFilterCallback; - // bool m_blockedForChanges; - -public: - b3HashedOverlappingPairCache(); - virtual ~b3HashedOverlappingPairCache(); - - virtual void removeOverlappingPairsContainingProxy(int proxy, b3Dispatcher* dispatcher); - - virtual void* removeOverlappingPair(int proxy0, int proxy1, b3Dispatcher* dispatcher); - - B3_FORCE_INLINE bool needsBroadphaseCollision(int proxy0, int proxy1) const - { - if (m_overlapFilterCallback) - return m_overlapFilterCallback->needBroadphaseCollision(proxy0, proxy1); - - bool collides = true; //(proxy0->m_collisionFilterGroup & proxy1->m_collisionFilterMask) != 0; - //collides = collides && (proxy1->m_collisionFilterGroup & proxy0->m_collisionFilterMask); - - return collides; - } - - // Add a pair and return the new pair. If the pair already exists, - // no new pair is created and the old one is returned. - virtual b3BroadphasePair* addOverlappingPair(int proxy0, int proxy1) - { - b3g_addedPairs++; - - if (!needsBroadphaseCollision(proxy0, proxy1)) - return 0; - - return internalAddPair(proxy0, proxy1); - } - - void cleanProxyFromPairs(int proxy, b3Dispatcher* dispatcher); - - virtual void processAllOverlappingPairs(b3OverlapCallback*, b3Dispatcher* dispatcher); - - virtual b3BroadphasePair* getOverlappingPairArrayPtr() - { - return &m_overlappingPairArray[0]; - } - - const b3BroadphasePair* getOverlappingPairArrayPtr() const - { - return &m_overlappingPairArray[0]; - } - - b3BroadphasePairArray& getOverlappingPairArray() - { - return m_overlappingPairArray; - } - - const b3BroadphasePairArray& getOverlappingPairArray() const - { - return m_overlappingPairArray; - } - - void cleanOverlappingPair(b3BroadphasePair& pair, b3Dispatcher* dispatcher); - - b3BroadphasePair* findPair(int proxy0, int proxy1); - - int GetCount() const { return m_overlappingPairArray.size(); } - // b3BroadphasePair* GetPairs() { return m_pairs; } - - b3OverlapFilterCallback* getOverlapFilterCallback() - { - return m_overlapFilterCallback; - } - - void setOverlapFilterCallback(b3OverlapFilterCallback* callback) - { - m_overlapFilterCallback = callback; - } - - int getNumOverlappingPairs() const - { - return m_overlappingPairArray.size(); - } - -private: - b3BroadphasePair* internalAddPair(int proxy0, int proxy1); - - void growTables(); - - B3_FORCE_INLINE bool equalsPair(const b3BroadphasePair& pair, int proxyId1, int proxyId2) - { - return pair.x == proxyId1 && pair.y == proxyId2; - } - - /* - // Thomas Wang's hash, see: http://www.concentric.net/~Ttwang/tech/inthash.htm - // This assumes proxyId1 and proxyId2 are 16-bit. - B3_FORCE_INLINE int getHash(int proxyId1, int proxyId2) - { - int key = (proxyId2 << 16) | proxyId1; - key = ~key + (key << 15); - key = key ^ (key >> 12); - key = key + (key << 2); - key = key ^ (key >> 4); - key = key * 2057; - key = key ^ (key >> 16); - return key; - } - */ - - B3_FORCE_INLINE unsigned int getHash(unsigned int proxyId1, unsigned int proxyId2) - { - int key = static_cast(((unsigned int)proxyId1) | (((unsigned int)proxyId2) << 16)); - // Thomas Wang's hash - - key += ~(key << 15); - key ^= (key >> 10); - key += (key << 3); - key ^= (key >> 6); - key += ~(key << 11); - key ^= (key >> 16); - return static_cast(key); - } - - B3_FORCE_INLINE b3BroadphasePair* internalFindPair(int proxy0, int proxy1, int hash) - { - int proxyId1 = proxy0; - int proxyId2 = proxy1; -#if 0 // wrong, 'equalsPair' use unsorted uids, copy-past devil striked again. Nat. - if (proxyId1 > proxyId2) - b3Swap(proxyId1, proxyId2); -#endif - - int index = m_hashTable[hash]; - - while (index != B3_NULL_PAIR && equalsPair(m_overlappingPairArray[index], proxyId1, proxyId2) == false) - { - index = m_next[index]; - } - - if (index == B3_NULL_PAIR) - { - return NULL; - } - - b3Assert(index < m_overlappingPairArray.size()); - - return &m_overlappingPairArray[index]; - } - - virtual bool hasDeferredRemoval() - { - return false; - } - - /* virtual void setInternalGhostPairCallback(b3OverlappingPairCallback* ghostPairCallback) - { - m_ghostPairCallback = ghostPairCallback; - } - */ - - virtual void sortOverlappingPairs(b3Dispatcher* dispatcher); - -protected: - b3AlignedObjectArray m_hashTable; - b3AlignedObjectArray m_next; - // b3OverlappingPairCallback* m_ghostPairCallback; -}; - -///b3SortedOverlappingPairCache maintains the objects with overlapping AABB -///Typically managed by the Broadphase, Axis3Sweep or b3SimpleBroadphase -class b3SortedOverlappingPairCache : public b3OverlappingPairCache -{ -protected: - //avoid brute-force finding all the time - b3BroadphasePairArray m_overlappingPairArray; - - //during the dispatch, check that user doesn't destroy/create proxy - bool m_blockedForChanges; - - ///by default, do the removal during the pair traversal - bool m_hasDeferredRemoval; - - //if set, use the callback instead of the built in filter in needBroadphaseCollision - b3OverlapFilterCallback* m_overlapFilterCallback; - - // b3OverlappingPairCallback* m_ghostPairCallback; - -public: - b3SortedOverlappingPairCache(); - virtual ~b3SortedOverlappingPairCache(); - - virtual void processAllOverlappingPairs(b3OverlapCallback*, b3Dispatcher* dispatcher); - - void* removeOverlappingPair(int proxy0, int proxy1, b3Dispatcher* dispatcher); - - void cleanOverlappingPair(b3BroadphasePair& pair, b3Dispatcher* dispatcher); - - b3BroadphasePair* addOverlappingPair(int proxy0, int proxy1); - - b3BroadphasePair* findPair(int proxy0, int proxy1); - - void cleanProxyFromPairs(int proxy, b3Dispatcher* dispatcher); - - virtual void removeOverlappingPairsContainingProxy(int proxy, b3Dispatcher* dispatcher); - - inline bool needsBroadphaseCollision(int proxy0, int proxy1) const - { - if (m_overlapFilterCallback) - return m_overlapFilterCallback->needBroadphaseCollision(proxy0, proxy1); - - bool collides = true; //(proxy0->m_collisionFilterGroup & proxy1->m_collisionFilterMask) != 0; - //collides = collides && (proxy1->m_collisionFilterGroup & proxy0->m_collisionFilterMask); - - return collides; - } - - b3BroadphasePairArray& getOverlappingPairArray() - { - return m_overlappingPairArray; - } - - const b3BroadphasePairArray& getOverlappingPairArray() const - { - return m_overlappingPairArray; - } - - b3BroadphasePair* getOverlappingPairArrayPtr() - { - return &m_overlappingPairArray[0]; - } - - const b3BroadphasePair* getOverlappingPairArrayPtr() const - { - return &m_overlappingPairArray[0]; - } - - int getNumOverlappingPairs() const - { - return m_overlappingPairArray.size(); - } - - b3OverlapFilterCallback* getOverlapFilterCallback() - { - return m_overlapFilterCallback; - } - - void setOverlapFilterCallback(b3OverlapFilterCallback* callback) - { - m_overlapFilterCallback = callback; - } - - virtual bool hasDeferredRemoval() - { - return m_hasDeferredRemoval; - } - - /* virtual void setInternalGhostPairCallback(b3OverlappingPairCallback* ghostPairCallback) - { - m_ghostPairCallback = ghostPairCallback; - } - */ - virtual void sortOverlappingPairs(b3Dispatcher* dispatcher); -}; - -///b3NullPairCache skips add/removal of overlapping pairs. Userful for benchmarking and unit testing. -class b3NullPairCache : public b3OverlappingPairCache -{ - b3BroadphasePairArray m_overlappingPairArray; - -public: - virtual b3BroadphasePair* getOverlappingPairArrayPtr() - { - return &m_overlappingPairArray[0]; - } - const b3BroadphasePair* getOverlappingPairArrayPtr() const - { - return &m_overlappingPairArray[0]; - } - b3BroadphasePairArray& getOverlappingPairArray() - { - return m_overlappingPairArray; - } - - virtual void cleanOverlappingPair(b3BroadphasePair& /*pair*/, b3Dispatcher* /*dispatcher*/) - { - } - - virtual int getNumOverlappingPairs() const - { - return 0; - } - - virtual void cleanProxyFromPairs(int /*proxy*/, b3Dispatcher* /*dispatcher*/) - { - } - - virtual void setOverlapFilterCallback(b3OverlapFilterCallback* /*callback*/) - { - } - - virtual void processAllOverlappingPairs(b3OverlapCallback*, b3Dispatcher* /*dispatcher*/) - { - } - - virtual b3BroadphasePair* findPair(int /*proxy0*/, int /*proxy1*/) - { - return 0; - } - - virtual bool hasDeferredRemoval() - { - return true; - } - - // virtual void setInternalGhostPairCallback(b3OverlappingPairCallback* /* ghostPairCallback */) - // { - // - // } - - virtual b3BroadphasePair* addOverlappingPair(int /*proxy0*/, int /*proxy1*/) - { - return 0; - } - - virtual void* removeOverlappingPair(int /*proxy0*/, int /*proxy1*/, b3Dispatcher* /*dispatcher*/) - { - return 0; - } - - virtual void removeOverlappingPairsContainingProxy(int /*proxy0*/, b3Dispatcher* /*dispatcher*/) - { - } - - virtual void sortOverlappingPairs(b3Dispatcher* dispatcher) - { - (void)dispatcher; - } -}; - -#endif //B3_OVERLAPPING_PAIR_CACHE_H diff --git a/engine/inc/bullet/Bullet3Collision/BroadPhaseCollision/shared/b3Aabb.h b/engine/inc/bullet/Bullet3Collision/BroadPhaseCollision/shared/b3Aabb.h deleted file mode 100644 index 343a2c0e..00000000 --- a/engine/inc/bullet/Bullet3Collision/BroadPhaseCollision/shared/b3Aabb.h +++ /dev/null @@ -1,56 +0,0 @@ - -#ifndef B3_AABB_H -#define B3_AABB_H - -#include "Bullet3Common/shared/b3Float4.h" -#include "Bullet3Common/shared/b3Mat3x3.h" - -typedef struct b3Aabb b3Aabb_t; - -struct b3Aabb -{ - union { - float m_min[4]; - b3Float4 m_minVec; - int m_minIndices[4]; - }; - union { - float m_max[4]; - b3Float4 m_maxVec; - int m_signedMaxIndices[4]; - }; -}; - -inline void b3TransformAabb2(b3Float4ConstArg localAabbMin, b3Float4ConstArg localAabbMax, float margin, - b3Float4ConstArg pos, - b3QuatConstArg orn, - b3Float4* aabbMinOut, b3Float4* aabbMaxOut) -{ - b3Float4 localHalfExtents = 0.5f * (localAabbMax - localAabbMin); - localHalfExtents += b3MakeFloat4(margin, margin, margin, 0.f); - b3Float4 localCenter = 0.5f * (localAabbMax + localAabbMin); - b3Mat3x3 m; - m = b3QuatGetRotationMatrix(orn); - b3Mat3x3 abs_b = b3AbsoluteMat3x3(m); - b3Float4 center = b3TransformPoint(localCenter, pos, orn); - - b3Float4 extent = b3MakeFloat4(b3Dot3F4(localHalfExtents, b3GetRow(abs_b, 0)), - b3Dot3F4(localHalfExtents, b3GetRow(abs_b, 1)), - b3Dot3F4(localHalfExtents, b3GetRow(abs_b, 2)), - 0.f); - *aabbMinOut = center - extent; - *aabbMaxOut = center + extent; -} - -/// conservative test for overlap between two aabbs -inline bool b3TestAabbAgainstAabb(b3Float4ConstArg aabbMin1, b3Float4ConstArg aabbMax1, - b3Float4ConstArg aabbMin2, b3Float4ConstArg aabbMax2) -{ - bool overlap = true; - overlap = (aabbMin1.x > aabbMax2.x || aabbMax1.x < aabbMin2.x) ? false : overlap; - overlap = (aabbMin1.z > aabbMax2.z || aabbMax1.z < aabbMin2.z) ? false : overlap; - overlap = (aabbMin1.y > aabbMax2.y || aabbMax1.y < aabbMin2.y) ? false : overlap; - return overlap; -} - -#endif //B3_AABB_H diff --git a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/b3Config.h b/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/b3Config.h deleted file mode 100644 index 518da89c..00000000 --- a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/b3Config.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef B3_CONFIG_H -#define B3_CONFIG_H - -struct b3Config -{ - int m_maxConvexBodies; - int m_maxConvexShapes; - int m_maxBroadphasePairs; - int m_maxContactCapacity; - int m_compoundPairCapacity; - - int m_maxVerticesPerFace; - int m_maxFacesPerShape; - int m_maxConvexVertices; - int m_maxConvexIndices; - int m_maxConvexUniqueEdges; - - int m_maxCompoundChildShapes; - - int m_maxTriConvexPairCapacity; - - b3Config() - : m_maxConvexBodies(128 * 1024), - m_maxVerticesPerFace(64), - m_maxFacesPerShape(12), - m_maxConvexVertices(8192), - m_maxConvexIndices(81920), - m_maxConvexUniqueEdges(8192), - m_maxCompoundChildShapes(8192), - m_maxTriConvexPairCapacity(256 * 1024) - { - m_maxConvexShapes = m_maxConvexBodies; - m_maxBroadphasePairs = 16 * m_maxConvexBodies; - m_maxContactCapacity = m_maxBroadphasePairs; - m_compoundPairCapacity = 1024 * 1024; - } -}; - -#endif //B3_CONFIG_H diff --git a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/b3Contact4.h b/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/b3Contact4.h deleted file mode 100644 index c2cd3c72..00000000 --- a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/b3Contact4.h +++ /dev/null @@ -1,55 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2013 Erwin Coumans http://bulletphysics.org - -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 B3_CONTACT4_H -#define B3_CONTACT4_H - -#include "Bullet3Common/b3Vector3.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3Contact4Data.h" - -B3_ATTRIBUTE_ALIGNED16(struct) -b3Contact4 : public b3Contact4Data -{ - B3_DECLARE_ALIGNED_ALLOCATOR(); - - int getBodyA() const { return abs(m_bodyAPtrAndSignBit); } - int getBodyB() const { return abs(m_bodyBPtrAndSignBit); } - bool isBodyAFixed() const { return m_bodyAPtrAndSignBit < 0; } - bool isBodyBFixed() const { return m_bodyBPtrAndSignBit < 0; } - // todo. make it safer - int& getBatchIdx() { return m_batchIdx; } - const int& getBatchIdx() const { return m_batchIdx; } - float getRestituitionCoeff() const { return ((float)m_restituitionCoeffCmp / (float)0xffff); } - void setRestituitionCoeff(float c) - { - b3Assert(c >= 0.f && c <= 1.f); - m_restituitionCoeffCmp = (unsigned short)(c * 0xffff); - } - float getFrictionCoeff() const { return ((float)m_frictionCoeffCmp / (float)0xffff); } - void setFrictionCoeff(float c) - { - b3Assert(c >= 0.f && c <= 1.f); - m_frictionCoeffCmp = (unsigned short)(c * 0xffff); - } - - //float& getNPoints() { return m_worldNormal[3]; } - int getNPoints() const { return (int)m_worldNormalOnB.w; } - - float getPenetration(int idx) const { return m_worldPosB[idx].w; } - - bool isInvalid() const { return (getBodyA() == 0 || getBodyB() == 0); } -}; - -#endif //B3_CONTACT4_H diff --git a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/b3ConvexUtility.h b/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/b3ConvexUtility.h deleted file mode 100644 index 4c8a88cb..00000000 --- a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/b3ConvexUtility.h +++ /dev/null @@ -1,55 +0,0 @@ - -/* -Copyright (c) 2012 Advanced Micro Devices, Inc. - -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 Erwin Coumans - -#ifndef _BT_CONVEX_UTILITY_H -#define _BT_CONVEX_UTILITY_H - -#include "Bullet3Common/b3AlignedObjectArray.h" -#include "Bullet3Common/b3Transform.h" - -struct b3MyFace -{ - b3AlignedObjectArray m_indices; - b3Scalar m_plane[4]; -}; - -B3_ATTRIBUTE_ALIGNED16(class) -b3ConvexUtility -{ -public: - B3_DECLARE_ALIGNED_ALLOCATOR(); - - b3Vector3 m_localCenter; - b3Vector3 m_extents; - b3Vector3 mC; - b3Vector3 mE; - b3Scalar m_radius; - - b3AlignedObjectArray m_vertices; - b3AlignedObjectArray m_faces; - b3AlignedObjectArray m_uniqueEdges; - - b3ConvexUtility() - { - } - virtual ~b3ConvexUtility(); - - bool initializePolyhedralFeatures(const b3Vector3* orgVertices, int numVertices, bool mergeCoplanarTriangles = true); - - void initialize(); - bool testContainment() const; -}; -#endif diff --git a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/b3CpuNarrowPhase.h b/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/b3CpuNarrowPhase.h deleted file mode 100644 index f02353c2..00000000 --- a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/b3CpuNarrowPhase.h +++ /dev/null @@ -1,92 +0,0 @@ -#ifndef B3_CPU_NARROWPHASE_H -#define B3_CPU_NARROWPHASE_H - -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3Collidable.h" -#include "Bullet3Common/b3AlignedObjectArray.h" -#include "Bullet3Common/b3Vector3.h" -#include "Bullet3Collision/BroadPhaseCollision/shared/b3Aabb.h" -#include "Bullet3Common/shared/b3Int4.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3RigidBodyData.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3Contact4Data.h" - -class b3CpuNarrowPhase -{ -protected: - struct b3CpuNarrowPhaseInternalData* m_data; - int m_acceleratedCompanionShapeIndex; - int m_planeBodyIndex; - int m_static0Index; - - int registerConvexHullShapeInternal(class b3ConvexUtility* convexPtr, b3Collidable& col); - int registerConcaveMeshShape(b3AlignedObjectArray* vertices, b3AlignedObjectArray* indices, b3Collidable& col, const float* scaling); - -public: - b3CpuNarrowPhase(const struct b3Config& config); - - virtual ~b3CpuNarrowPhase(void); - - int registerSphereShape(float radius); - int registerPlaneShape(const b3Vector3& planeNormal, float planeConstant); - - int registerCompoundShape(b3AlignedObjectArray* childShapes); - int registerFace(const b3Vector3& faceNormal, float faceConstant); - - int registerConcaveMesh(b3AlignedObjectArray* vertices, b3AlignedObjectArray* indices, const float* scaling); - - //do they need to be merged? - - int registerConvexHullShape(b3ConvexUtility* utilPtr); - int registerConvexHullShape(const float* vertices, int strideInBytes, int numVertices, const float* scaling); - - //int registerRigidBody(int collidableIndex, float mass, const float* position, const float* orientation, const float* aabbMin, const float* aabbMax,bool writeToGpu); - void setObjectTransform(const float* position, const float* orientation, int bodyIndex); - - void writeAllBodiesToGpu(); - void reset(); - void readbackAllBodiesToCpu(); - bool getObjectTransformFromCpu(float* position, float* orientation, int bodyIndex) const; - - void setObjectTransformCpu(float* position, float* orientation, int bodyIndex); - void setObjectVelocityCpu(float* linVel, float* angVel, int bodyIndex); - - //virtual void computeContacts(cl_mem broadphasePairs, int numBroadphasePairs, cl_mem aabbsWorldSpace, int numObjects); - virtual void computeContacts(b3AlignedObjectArray& pairs, b3AlignedObjectArray& aabbsWorldSpace, b3AlignedObjectArray& bodies); - - const struct b3RigidBodyData* getBodiesCpu() const; - //struct b3RigidBodyData* getBodiesCpu(); - - int getNumBodiesGpu() const; - - int getNumBodyInertiasGpu() const; - - const struct b3Collidable* getCollidablesCpu() const; - int getNumCollidablesGpu() const; - - /*const struct b3Contact4* getContactsCPU() const; - - - int getNumContactsGpu() const; - */ - - const b3AlignedObjectArray& getContacts() const; - - int getNumRigidBodies() const; - - int allocateCollidable(); - - int getStatic0Index() const - { - return m_static0Index; - } - b3Collidable& getCollidableCpu(int collidableIndex); - const b3Collidable& getCollidableCpu(int collidableIndex) const; - - const b3CpuNarrowPhaseInternalData* getInternalData() const - { - return m_data; - } - - const struct b3Aabb& getLocalSpaceAabb(int collidableIndex) const; -}; - -#endif //B3_CPU_NARROWPHASE_H diff --git a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/b3RaycastInfo.h b/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/b3RaycastInfo.h deleted file mode 100644 index b50c0eca..00000000 --- a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/b3RaycastInfo.h +++ /dev/null @@ -1,25 +0,0 @@ - -#ifndef B3_RAYCAST_INFO_H -#define B3_RAYCAST_INFO_H - -#include "Bullet3Common/b3Vector3.h" - -B3_ATTRIBUTE_ALIGNED16(struct) -b3RayInfo -{ - b3Vector3 m_from; - b3Vector3 m_to; -}; - -B3_ATTRIBUTE_ALIGNED16(struct) -b3RayHit -{ - b3Scalar m_hitFraction; - int m_hitBody; - int m_hitResult1; - int m_hitResult2; - b3Vector3 m_hitPoint; - b3Vector3 m_hitNormal; -}; - -#endif //B3_RAYCAST_INFO_H diff --git a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/b3RigidBodyCL.h b/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/b3RigidBodyCL.h deleted file mode 100644 index be1be57f..00000000 --- a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/b3RigidBodyCL.h +++ /dev/null @@ -1,28 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2013 Erwin Coumans http://bulletphysics.org - -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 B3_RIGID_BODY_CL -#define B3_RIGID_BODY_CL - -#include "Bullet3Common/b3Scalar.h" -#include "Bullet3Common/b3Matrix3x3.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3RigidBodyData.h" - -inline float b3GetInvMass(const b3RigidBodyData& body) -{ - return body.m_invMass; -} - -#endif //B3_RIGID_BODY_CL diff --git a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3BvhSubtreeInfoData.h b/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3BvhSubtreeInfoData.h deleted file mode 100644 index d6beb662..00000000 --- a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3BvhSubtreeInfoData.h +++ /dev/null @@ -1,19 +0,0 @@ - -#ifndef B3_BVH_SUBTREE_INFO_DATA_H -#define B3_BVH_SUBTREE_INFO_DATA_H - -typedef struct b3BvhSubtreeInfoData b3BvhSubtreeInfoData_t; - -struct b3BvhSubtreeInfoData -{ - //12 bytes - unsigned short int m_quantizedAabbMin[3]; - unsigned short int m_quantizedAabbMax[3]; - //4 bytes, points to the root of the subtree - int m_rootNodeIndex; - //4 bytes - int m_subtreeSize; - int m_padding[3]; -}; - -#endif //B3_BVH_SUBTREE_INFO_DATA_H diff --git a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3BvhTraversal.h b/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3BvhTraversal.h deleted file mode 100644 index 7c2507cc..00000000 --- a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3BvhTraversal.h +++ /dev/null @@ -1,123 +0,0 @@ - - -#include "Bullet3Common/shared/b3Int4.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3RigidBodyData.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3Collidable.h" -#include "Bullet3Collision/BroadPhaseCollision/shared/b3Aabb.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3BvhSubtreeInfoData.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3QuantizedBvhNodeData.h" - -// work-in-progress -void b3BvhTraversal(__global const b3Int4* pairs, - __global const b3RigidBodyData* rigidBodies, - __global const b3Collidable* collidables, - __global b3Aabb* aabbs, - __global b3Int4* concavePairsOut, - __global volatile int* numConcavePairsOut, - __global const b3BvhSubtreeInfo* subtreeHeadersRoot, - __global const b3QuantizedBvhNode* quantizedNodesRoot, - __global const b3BvhInfo* bvhInfos, - int numPairs, - int maxNumConcavePairsCapacity, - int id) -{ - int bodyIndexA = pairs[id].x; - int bodyIndexB = pairs[id].y; - int collidableIndexA = rigidBodies[bodyIndexA].m_collidableIdx; - int collidableIndexB = rigidBodies[bodyIndexB].m_collidableIdx; - - //once the broadphase avoids static-static pairs, we can remove this test - if ((rigidBodies[bodyIndexA].m_invMass == 0) && (rigidBodies[bodyIndexB].m_invMass == 0)) - { - return; - } - - if (collidables[collidableIndexA].m_shapeType != SHAPE_CONCAVE_TRIMESH) - return; - - int shapeTypeB = collidables[collidableIndexB].m_shapeType; - - if (shapeTypeB != SHAPE_CONVEX_HULL && - shapeTypeB != SHAPE_SPHERE && - shapeTypeB != SHAPE_COMPOUND_OF_CONVEX_HULLS) - return; - - b3BvhInfo bvhInfo = bvhInfos[collidables[collidableIndexA].m_numChildShapes]; - - b3Float4 bvhAabbMin = bvhInfo.m_aabbMin; - b3Float4 bvhAabbMax = bvhInfo.m_aabbMax; - b3Float4 bvhQuantization = bvhInfo.m_quantization; - int numSubtreeHeaders = bvhInfo.m_numSubTrees; - __global const b3BvhSubtreeInfoData* subtreeHeaders = &subtreeHeadersRoot[bvhInfo.m_subTreeOffset]; - __global const b3QuantizedBvhNodeData* quantizedNodes = &quantizedNodesRoot[bvhInfo.m_nodeOffset]; - - unsigned short int quantizedQueryAabbMin[3]; - unsigned short int quantizedQueryAabbMax[3]; - b3QuantizeWithClamp(quantizedQueryAabbMin, aabbs[bodyIndexB].m_minVec, false, bvhAabbMin, bvhAabbMax, bvhQuantization); - b3QuantizeWithClamp(quantizedQueryAabbMax, aabbs[bodyIndexB].m_maxVec, true, bvhAabbMin, bvhAabbMax, bvhQuantization); - - for (int i = 0; i < numSubtreeHeaders; i++) - { - b3BvhSubtreeInfoData subtree = subtreeHeaders[i]; - - int overlap = b3TestQuantizedAabbAgainstQuantizedAabbSlow(quantizedQueryAabbMin, quantizedQueryAabbMax, subtree.m_quantizedAabbMin, subtree.m_quantizedAabbMax); - if (overlap != 0) - { - int startNodeIndex = subtree.m_rootNodeIndex; - int endNodeIndex = subtree.m_rootNodeIndex + subtree.m_subtreeSize; - int curIndex = startNodeIndex; - int escapeIndex; - int isLeafNode; - int aabbOverlap; - while (curIndex < endNodeIndex) - { - b3QuantizedBvhNodeData rootNode = quantizedNodes[curIndex]; - aabbOverlap = b3TestQuantizedAabbAgainstQuantizedAabbSlow(quantizedQueryAabbMin, quantizedQueryAabbMax, rootNode.m_quantizedAabbMin, rootNode.m_quantizedAabbMax); - isLeafNode = b3IsLeaf(&rootNode); - if (aabbOverlap) - { - if (isLeafNode) - { - int triangleIndex = b3GetTriangleIndex(&rootNode); - if (shapeTypeB == SHAPE_COMPOUND_OF_CONVEX_HULLS) - { - int numChildrenB = collidables[collidableIndexB].m_numChildShapes; - int pairIdx = b3AtomicAdd(numConcavePairsOut, numChildrenB); - for (int b = 0; b < numChildrenB; b++) - { - if ((pairIdx + b) < maxNumConcavePairsCapacity) - { - int childShapeIndexB = collidables[collidableIndexB].m_shapeIndex + b; - b3Int4 newPair = b3MakeInt4(bodyIndexA, bodyIndexB, triangleIndex, childShapeIndexB); - concavePairsOut[pairIdx + b] = newPair; - } - } - } - else - { - int pairIdx = b3AtomicInc(numConcavePairsOut); - if (pairIdx < maxNumConcavePairsCapacity) - { - b3Int4 newPair = b3MakeInt4(bodyIndexA, bodyIndexB, triangleIndex, 0); - concavePairsOut[pairIdx] = newPair; - } - } - } - curIndex++; - } - else - { - if (isLeafNode) - { - curIndex++; - } - else - { - escapeIndex = b3GetEscapeIndex(&rootNode); - curIndex += escapeIndex; - } - } - } - } - } -} \ No newline at end of file diff --git a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ClipFaces.h b/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ClipFaces.h deleted file mode 100644 index 0d9b13f1..00000000 --- a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ClipFaces.h +++ /dev/null @@ -1,171 +0,0 @@ -#ifndef B3_CLIP_FACES_H -#define B3_CLIP_FACES_H - -#include "Bullet3Common/shared/b3Int4.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3RigidBodyData.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3Collidable.h" -#include "Bullet3Collision/BroadPhaseCollision/shared/b3Aabb.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3BvhSubtreeInfoData.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3QuantizedBvhNodeData.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3ConvexPolyhedronData.h" - -inline b3Float4 b3Lerp3(b3Float4ConstArg a, b3Float4ConstArg b, float t) -{ - return b3MakeFloat4(a.x + (b.x - a.x) * t, - a.y + (b.y - a.y) * t, - a.z + (b.z - a.z) * t, - 0.f); -} - -// Clips a face to the back of a plane, return the number of vertices out, stored in ppVtxOut -int clipFaceGlobal(__global const b3Float4* pVtxIn, int numVertsIn, b3Float4ConstArg planeNormalWS, float planeEqWS, __global b3Float4* ppVtxOut) -{ - int ve; - float ds, de; - int numVertsOut = 0; - //double-check next test - // if (numVertsIn < 2) - // return 0; - - b3Float4 firstVertex = pVtxIn[numVertsIn - 1]; - b3Float4 endVertex = pVtxIn[0]; - - ds = b3Dot(planeNormalWS, firstVertex) + planeEqWS; - - for (ve = 0; ve < numVertsIn; ve++) - { - endVertex = pVtxIn[ve]; - de = b3Dot(planeNormalWS, endVertex) + planeEqWS; - if (ds < 0) - { - if (de < 0) - { - // Start < 0, end < 0, so output endVertex - ppVtxOut[numVertsOut++] = endVertex; - } - else - { - // Start < 0, end >= 0, so output intersection - ppVtxOut[numVertsOut++] = b3Lerp3(firstVertex, endVertex, (ds * 1.f / (ds - de))); - } - } - else - { - if (de < 0) - { - // Start >= 0, end < 0 so output intersection and end - ppVtxOut[numVertsOut++] = b3Lerp3(firstVertex, endVertex, (ds * 1.f / (ds - de))); - ppVtxOut[numVertsOut++] = endVertex; - } - } - firstVertex = endVertex; - ds = de; - } - return numVertsOut; -} - -__kernel void clipFacesAndFindContactsKernel(__global const b3Float4* separatingNormals, - __global const int* hasSeparatingAxis, - __global b3Int4* clippingFacesOut, - __global b3Float4* worldVertsA1, - __global b3Float4* worldNormalsA1, - __global b3Float4* worldVertsB1, - __global b3Float4* worldVertsB2, - int vertexFaceCapacity, - int pairIndex) -{ - // int i = get_global_id(0); - //int pairIndex = i; - int i = pairIndex; - - float minDist = -1e30f; - float maxDist = 0.02f; - - // if (i= 0) - { - // clip polygon to back of planes of all faces of hull A that are adjacent to witness face - - for (int e0 = 0; e0 < numVertsInA; e0++) - { - const b3Float4 aw = worldVertsA1[pairIndex * capacityWorldVertsB2 + e0]; - const b3Float4 bw = worldVertsA1[pairIndex * capacityWorldVertsB2 + ((e0 + 1) % numVertsInA)]; - const b3Float4 WorldEdge0 = aw - bw; - b3Float4 worldPlaneAnormal1 = worldNormalsA1[pairIndex]; - b3Float4 planeNormalWS1 = -b3Cross(WorldEdge0, worldPlaneAnormal1); - b3Float4 worldA1 = aw; - float planeEqWS1 = -b3Dot(worldA1, planeNormalWS1); - b3Float4 planeNormalWS = planeNormalWS1; - float planeEqWS = planeEqWS1; - numVertsOut = clipFaceGlobal(pVtxIn, numVertsInB, planeNormalWS, planeEqWS, pVtxOut); - __global b3Float4* tmp = pVtxOut; - pVtxOut = pVtxIn; - pVtxIn = tmp; - numVertsInB = numVertsOut; - numVertsOut = 0; - } - - b3Float4 planeNormalWS = worldNormalsA1[pairIndex]; - float planeEqWS = -b3Dot(planeNormalWS, worldVertsA1[pairIndex * capacityWorldVertsB2]); - - for (int i = 0; i < numVertsInB; i++) - { - float depth = b3Dot(planeNormalWS, pVtxIn[i]) + planeEqWS; - if (depth <= minDist) - { - depth = minDist; - } - /* - static float maxDepth = 0.f; - if (depth < maxDepth) - { - maxDepth = depth; - if (maxDepth < -10) - { - printf("error at framecount %d?\n",myframecount); - } - printf("maxDepth = %f\n", maxDepth); - - } -*/ - if (depth <= maxDist) - { - b3Float4 pointInWorld = pVtxIn[i]; - pVtxOut[numLocalContactsOut++] = b3MakeFloat4(pointInWorld.x, pointInWorld.y, pointInWorld.z, depth); - } - } - } - clippingFaces[pairIndex].w = numLocalContactsOut; - } - - for (int i = 0; i < numLocalContactsOut; i++) - pVtxIn[i] = pVtxOut[i]; - - } // if (hasSeparatingAxis[i]) - } // if (im_worldNormalOnB.w; -}; - -inline void b3Contact4Data_setNumPoints(struct b3Contact4Data* contact, int numPoints) -{ - contact->m_worldNormalOnB.w = (float)numPoints; -}; - -#endif //B3_CONTACT4DATA_H \ No newline at end of file diff --git a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ContactConvexConvexSAT.h b/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ContactConvexConvexSAT.h deleted file mode 100644 index ca68f4bc..00000000 --- a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ContactConvexConvexSAT.h +++ /dev/null @@ -1,486 +0,0 @@ - -#ifndef B3_CONTACT_CONVEX_CONVEX_SAT_H -#define B3_CONTACT_CONVEX_CONVEX_SAT_H - -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3Contact4Data.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3FindSeparatingAxis.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3ReduceContacts.h" - -#define B3_MAX_VERTS 1024 - -inline b3Float4 b3Lerp3(const b3Float4& a, const b3Float4& b, float t) -{ - return b3MakeVector3(a.x + (b.x - a.x) * t, - a.y + (b.y - a.y) * t, - a.z + (b.z - a.z) * t, - 0.f); -} - -// Clips a face to the back of a plane, return the number of vertices out, stored in ppVtxOut -inline int b3ClipFace(const b3Float4* pVtxIn, int numVertsIn, b3Float4& planeNormalWS, float planeEqWS, b3Float4* ppVtxOut) -{ - int ve; - float ds, de; - int numVertsOut = 0; - if (numVertsIn < 2) - return 0; - - b3Float4 firstVertex = pVtxIn[numVertsIn - 1]; - b3Float4 endVertex = pVtxIn[0]; - - ds = b3Dot3F4(planeNormalWS, firstVertex) + planeEqWS; - - for (ve = 0; ve < numVertsIn; ve++) - { - endVertex = pVtxIn[ve]; - - de = b3Dot3F4(planeNormalWS, endVertex) + planeEqWS; - - if (ds < 0) - { - if (de < 0) - { - // Start < 0, end < 0, so output endVertex - ppVtxOut[numVertsOut++] = endVertex; - } - else - { - // Start < 0, end >= 0, so output intersection - ppVtxOut[numVertsOut++] = b3Lerp3(firstVertex, endVertex, (ds * 1.f / (ds - de))); - } - } - else - { - if (de < 0) - { - // Start >= 0, end < 0 so output intersection and end - ppVtxOut[numVertsOut++] = b3Lerp3(firstVertex, endVertex, (ds * 1.f / (ds - de))); - ppVtxOut[numVertsOut++] = endVertex; - } - } - firstVertex = endVertex; - ds = de; - } - return numVertsOut; -} - -inline int b3ClipFaceAgainstHull(const b3Float4& separatingNormal, const b3ConvexPolyhedronData* hullA, - const b3Float4& posA, const b3Quaternion& ornA, b3Float4* worldVertsB1, int numWorldVertsB1, - b3Float4* worldVertsB2, int capacityWorldVertsB2, - const float minDist, float maxDist, - const b3AlignedObjectArray& verticesA, const b3AlignedObjectArray& facesA, const b3AlignedObjectArray& indicesA, - //const b3Float4* verticesB, const b3GpuFace* facesB, const int* indicesB, - b3Float4* contactsOut, - int contactCapacity) -{ - int numContactsOut = 0; - - b3Float4* pVtxIn = worldVertsB1; - b3Float4* pVtxOut = worldVertsB2; - - int numVertsIn = numWorldVertsB1; - int numVertsOut = 0; - - int closestFaceA = -1; - { - float dmin = FLT_MAX; - for (int face = 0; face < hullA->m_numFaces; face++) - { - const b3Float4 Normal = b3MakeVector3( - facesA[hullA->m_faceOffset + face].m_plane.x, - facesA[hullA->m_faceOffset + face].m_plane.y, - facesA[hullA->m_faceOffset + face].m_plane.z, 0.f); - const b3Float4 faceANormalWS = b3QuatRotate(ornA, Normal); - - float d = b3Dot3F4(faceANormalWS, separatingNormal); - if (d < dmin) - { - dmin = d; - closestFaceA = face; - } - } - } - if (closestFaceA < 0) - return numContactsOut; - - b3GpuFace polyA = facesA[hullA->m_faceOffset + closestFaceA]; - - // clip polygon to back of planes of all faces of hull A that are adjacent to witness face - //int numContacts = numWorldVertsB1; - int numVerticesA = polyA.m_numIndices; - for (int e0 = 0; e0 < numVerticesA; e0++) - { - const b3Float4 a = verticesA[hullA->m_vertexOffset + indicesA[polyA.m_indexOffset + e0]]; - const b3Float4 b = verticesA[hullA->m_vertexOffset + indicesA[polyA.m_indexOffset + ((e0 + 1) % numVerticesA)]]; - const b3Float4 edge0 = a - b; - const b3Float4 WorldEdge0 = b3QuatRotate(ornA, edge0); - b3Float4 planeNormalA = b3MakeFloat4(polyA.m_plane.x, polyA.m_plane.y, polyA.m_plane.z, 0.f); - b3Float4 worldPlaneAnormal1 = b3QuatRotate(ornA, planeNormalA); - - b3Float4 planeNormalWS1 = -b3Cross3(WorldEdge0, worldPlaneAnormal1); - b3Float4 worldA1 = b3TransformPoint(a, posA, ornA); - float planeEqWS1 = -b3Dot3F4(worldA1, planeNormalWS1); - - b3Float4 planeNormalWS = planeNormalWS1; - float planeEqWS = planeEqWS1; - - //clip face - //clipFace(*pVtxIn, *pVtxOut,planeNormalWS,planeEqWS); - numVertsOut = b3ClipFace(pVtxIn, numVertsIn, planeNormalWS, planeEqWS, pVtxOut); - - //btSwap(pVtxIn,pVtxOut); - b3Float4* tmp = pVtxOut; - pVtxOut = pVtxIn; - pVtxIn = tmp; - numVertsIn = numVertsOut; - numVertsOut = 0; - } - - // only keep points that are behind the witness face - { - b3Float4 localPlaneNormal = b3MakeFloat4(polyA.m_plane.x, polyA.m_plane.y, polyA.m_plane.z, 0.f); - float localPlaneEq = polyA.m_plane.w; - b3Float4 planeNormalWS = b3QuatRotate(ornA, localPlaneNormal); - float planeEqWS = localPlaneEq - b3Dot3F4(planeNormalWS, posA); - for (int i = 0; i < numVertsIn; i++) - { - float depth = b3Dot3F4(planeNormalWS, pVtxIn[i]) + planeEqWS; - if (depth <= minDist) - { - depth = minDist; - } - if (numContactsOut < contactCapacity) - { - if (depth <= maxDist) - { - b3Float4 pointInWorld = pVtxIn[i]; - //resultOut.addContactPoint(separatingNormal,point,depth); - contactsOut[numContactsOut++] = b3MakeVector3(pointInWorld.x, pointInWorld.y, pointInWorld.z, depth); - //printf("depth=%f\n",depth); - } - } - else - { - b3Error("exceeding contact capacity (%d,%df)\n", numContactsOut, contactCapacity); - } - } - } - - return numContactsOut; -} - -inline int b3ClipHullAgainstHull(const b3Float4& separatingNormal, - const b3ConvexPolyhedronData& hullA, const b3ConvexPolyhedronData& hullB, - const b3Float4& posA, const b3Quaternion& ornA, const b3Float4& posB, const b3Quaternion& ornB, - b3Float4* worldVertsB1, b3Float4* worldVertsB2, int capacityWorldVerts, - const float minDist, float maxDist, - const b3AlignedObjectArray& verticesA, const b3AlignedObjectArray& facesA, const b3AlignedObjectArray& indicesA, - const b3AlignedObjectArray& verticesB, const b3AlignedObjectArray& facesB, const b3AlignedObjectArray& indicesB, - - b3Float4* contactsOut, - int contactCapacity) -{ - int numContactsOut = 0; - int numWorldVertsB1 = 0; - - B3_PROFILE("clipHullAgainstHull"); - - //float curMaxDist=maxDist; - int closestFaceB = -1; - float dmax = -FLT_MAX; - - { - //B3_PROFILE("closestFaceB"); - if (hullB.m_numFaces != 1) - { - //printf("wtf\n"); - } - static bool once = true; - //printf("separatingNormal=%f,%f,%f\n",separatingNormal.x,separatingNormal.y,separatingNormal.z); - - for (int face = 0; face < hullB.m_numFaces; face++) - { -#ifdef BT_DEBUG_SAT_FACE - if (once) - printf("face %d\n", face); - const b3GpuFace* faceB = &facesB[hullB.m_faceOffset + face]; - if (once) - { - for (int i = 0; i < faceB->m_numIndices; i++) - { - b3Float4 vert = verticesB[hullB.m_vertexOffset + indicesB[faceB->m_indexOffset + i]]; - printf("vert[%d] = %f,%f,%f\n", i, vert.x, vert.y, vert.z); - } - } -#endif //BT_DEBUG_SAT_FACE \ - //if (facesB[hullB.m_faceOffset+face].m_numIndices>2) - { - const b3Float4 Normal = b3MakeVector3(facesB[hullB.m_faceOffset + face].m_plane.x, - facesB[hullB.m_faceOffset + face].m_plane.y, facesB[hullB.m_faceOffset + face].m_plane.z, 0.f); - const b3Float4 WorldNormal = b3QuatRotate(ornB, Normal); -#ifdef BT_DEBUG_SAT_FACE - if (once) - printf("faceNormal = %f,%f,%f\n", Normal.x, Normal.y, Normal.z); -#endif - float d = b3Dot3F4(WorldNormal, separatingNormal); - if (d > dmax) - { - dmax = d; - closestFaceB = face; - } - } - } - once = false; - } - - b3Assert(closestFaceB >= 0); - { - //B3_PROFILE("worldVertsB1"); - const b3GpuFace& polyB = facesB[hullB.m_faceOffset + closestFaceB]; - const int numVertices = polyB.m_numIndices; - for (int e0 = 0; e0 < numVertices; e0++) - { - const b3Float4& b = verticesB[hullB.m_vertexOffset + indicesB[polyB.m_indexOffset + e0]]; - worldVertsB1[numWorldVertsB1++] = b3TransformPoint(b, posB, ornB); - } - } - - if (closestFaceB >= 0) - { - //B3_PROFILE("clipFaceAgainstHull"); - numContactsOut = b3ClipFaceAgainstHull((b3Float4&)separatingNormal, &hullA, - posA, ornA, - worldVertsB1, numWorldVertsB1, worldVertsB2, capacityWorldVerts, minDist, maxDist, - verticesA, facesA, indicesA, - contactsOut, contactCapacity); - } - - return numContactsOut; -} - -inline int b3ClipHullHullSingle( - int bodyIndexA, int bodyIndexB, - const b3Float4& posA, - const b3Quaternion& ornA, - const b3Float4& posB, - const b3Quaternion& ornB, - - int collidableIndexA, int collidableIndexB, - - const b3AlignedObjectArray* bodyBuf, - b3AlignedObjectArray* globalContactOut, - int& nContacts, - - const b3AlignedObjectArray& hostConvexDataA, - const b3AlignedObjectArray& hostConvexDataB, - - const b3AlignedObjectArray& verticesA, - const b3AlignedObjectArray& uniqueEdgesA, - const b3AlignedObjectArray& facesA, - const b3AlignedObjectArray& indicesA, - - const b3AlignedObjectArray& verticesB, - const b3AlignedObjectArray& uniqueEdgesB, - const b3AlignedObjectArray& facesB, - const b3AlignedObjectArray& indicesB, - - const b3AlignedObjectArray& hostCollidablesA, - const b3AlignedObjectArray& hostCollidablesB, - const b3Vector3& sepNormalWorldSpace, - int maxContactCapacity) -{ - int contactIndex = -1; - b3ConvexPolyhedronData hullA, hullB; - - b3Collidable colA = hostCollidablesA[collidableIndexA]; - hullA = hostConvexDataA[colA.m_shapeIndex]; - //printf("numvertsA = %d\n",hullA.m_numVertices); - - b3Collidable colB = hostCollidablesB[collidableIndexB]; - hullB = hostConvexDataB[colB.m_shapeIndex]; - //printf("numvertsB = %d\n",hullB.m_numVertices); - - b3Float4 contactsOut[B3_MAX_VERTS]; - int localContactCapacity = B3_MAX_VERTS; - -#ifdef _WIN32 - b3Assert(_finite(bodyBuf->at(bodyIndexA).m_pos.x)); - b3Assert(_finite(bodyBuf->at(bodyIndexB).m_pos.x)); -#endif - - { - b3Float4 worldVertsB1[B3_MAX_VERTS]; - b3Float4 worldVertsB2[B3_MAX_VERTS]; - int capacityWorldVerts = B3_MAX_VERTS; - - b3Float4 hostNormal = b3MakeFloat4(sepNormalWorldSpace.x, sepNormalWorldSpace.y, sepNormalWorldSpace.z, 0.f); - int shapeA = hostCollidablesA[collidableIndexA].m_shapeIndex; - int shapeB = hostCollidablesB[collidableIndexB].m_shapeIndex; - - b3Scalar minDist = -1; - b3Scalar maxDist = 0.; - - b3Transform trA, trB; - { - //B3_PROFILE("b3TransformPoint computation"); - //trA.setIdentity(); - trA.setOrigin(b3MakeVector3(posA.x, posA.y, posA.z)); - trA.setRotation(b3Quaternion(ornA.x, ornA.y, ornA.z, ornA.w)); - - //trB.setIdentity(); - trB.setOrigin(b3MakeVector3(posB.x, posB.y, posB.z)); - trB.setRotation(b3Quaternion(ornB.x, ornB.y, ornB.z, ornB.w)); - } - - b3Quaternion trAorn = trA.getRotation(); - b3Quaternion trBorn = trB.getRotation(); - - int numContactsOut = b3ClipHullAgainstHull(hostNormal, - hostConvexDataA.at(shapeA), - hostConvexDataB.at(shapeB), - (b3Float4&)trA.getOrigin(), (b3Quaternion&)trAorn, - (b3Float4&)trB.getOrigin(), (b3Quaternion&)trBorn, - worldVertsB1, worldVertsB2, capacityWorldVerts, - minDist, maxDist, - verticesA, facesA, indicesA, - verticesB, facesB, indicesB, - - contactsOut, localContactCapacity); - - if (numContactsOut > 0) - { - B3_PROFILE("overlap"); - - b3Float4 normalOnSurfaceB = (b3Float4&)hostNormal; - // b3Float4 centerOut; - - b3Int4 contactIdx; - contactIdx.x = 0; - contactIdx.y = 1; - contactIdx.z = 2; - contactIdx.w = 3; - - int numPoints = 0; - - { - B3_PROFILE("extractManifold"); - numPoints = b3ReduceContacts(contactsOut, numContactsOut, normalOnSurfaceB, &contactIdx); - } - - b3Assert(numPoints); - - if (nContacts < maxContactCapacity) - { - contactIndex = nContacts; - globalContactOut->expand(); - b3Contact4Data& contact = globalContactOut->at(nContacts); - contact.m_batchIdx = 0; //i; - contact.m_bodyAPtrAndSignBit = (bodyBuf->at(bodyIndexA).m_invMass == 0) ? -bodyIndexA : bodyIndexA; - contact.m_bodyBPtrAndSignBit = (bodyBuf->at(bodyIndexB).m_invMass == 0) ? -bodyIndexB : bodyIndexB; - - contact.m_frictionCoeffCmp = 45874; - contact.m_restituitionCoeffCmp = 0; - - // float distance = 0.f; - for (int p = 0; p < numPoints; p++) - { - contact.m_worldPosB[p] = contactsOut[contactIdx.s[p]]; //check if it is actually on B - contact.m_worldNormalOnB = normalOnSurfaceB; - } - //printf("bodyIndexA %d,bodyIndexB %d,normal=%f,%f,%f numPoints %d\n",bodyIndexA,bodyIndexB,normalOnSurfaceB.x,normalOnSurfaceB.y,normalOnSurfaceB.z,numPoints); - contact.m_worldNormalOnB.w = (b3Scalar)numPoints; - nContacts++; - } - else - { - b3Error("Error: exceeding contact capacity (%d/%d)\n", nContacts, maxContactCapacity); - } - } - } - return contactIndex; -} - -inline int b3ContactConvexConvexSAT( - int pairIndex, - int bodyIndexA, int bodyIndexB, - int collidableIndexA, int collidableIndexB, - const b3AlignedObjectArray& rigidBodies, - const b3AlignedObjectArray& collidables, - const b3AlignedObjectArray& convexShapes, - const b3AlignedObjectArray& convexVertices, - const b3AlignedObjectArray& uniqueEdges, - const b3AlignedObjectArray& convexIndices, - const b3AlignedObjectArray& faces, - b3AlignedObjectArray& globalContactsOut, - int& nGlobalContactsOut, - int maxContactCapacity) -{ - int contactIndex = -1; - - b3Float4 posA = rigidBodies[bodyIndexA].m_pos; - b3Quaternion ornA = rigidBodies[bodyIndexA].m_quat; - b3Float4 posB = rigidBodies[bodyIndexB].m_pos; - b3Quaternion ornB = rigidBodies[bodyIndexB].m_quat; - - b3ConvexPolyhedronData hullA, hullB; - - b3Float4 sepNormalWorldSpace; - - b3Collidable colA = collidables[collidableIndexA]; - hullA = convexShapes[colA.m_shapeIndex]; - //printf("numvertsA = %d\n",hullA.m_numVertices); - - b3Collidable colB = collidables[collidableIndexB]; - hullB = convexShapes[colB.m_shapeIndex]; - //printf("numvertsB = %d\n",hullB.m_numVertices); - -#ifdef _WIN32 - b3Assert(_finite(rigidBodies[bodyIndexA].m_pos.x)); - b3Assert(_finite(rigidBodies[bodyIndexB].m_pos.x)); -#endif - - bool foundSepAxis = b3FindSeparatingAxis(hullA, hullB, - posA, - ornA, - posB, - ornB, - - convexVertices, uniqueEdges, faces, convexIndices, - convexVertices, uniqueEdges, faces, convexIndices, - - sepNormalWorldSpace); - - if (foundSepAxis) - { - contactIndex = b3ClipHullHullSingle( - bodyIndexA, bodyIndexB, - posA, ornA, - posB, ornB, - collidableIndexA, collidableIndexB, - &rigidBodies, - &globalContactsOut, - nGlobalContactsOut, - - convexShapes, - convexShapes, - - convexVertices, - uniqueEdges, - faces, - convexIndices, - - convexVertices, - uniqueEdges, - faces, - convexIndices, - - collidables, - collidables, - sepNormalWorldSpace, - maxContactCapacity); - } - - return contactIndex; -} - -#endif //B3_CONTACT_CONVEX_CONVEX_SAT_H diff --git a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ContactSphereSphere.h b/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ContactSphereSphere.h deleted file mode 100644 index acf7c1b1..00000000 --- a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ContactSphereSphere.h +++ /dev/null @@ -1,153 +0,0 @@ - -#ifndef B3_CONTACT_SPHERE_SPHERE_H -#define B3_CONTACT_SPHERE_SPHERE_H - -void computeContactSphereConvex(int pairIndex, - int bodyIndexA, int bodyIndexB, - int collidableIndexA, int collidableIndexB, - const b3RigidBodyData* rigidBodies, - const b3Collidable* collidables, - const b3ConvexPolyhedronData* convexShapes, - const b3Vector3* convexVertices, - const int* convexIndices, - const b3GpuFace* faces, - b3Contact4* globalContactsOut, - int& nGlobalContactsOut, - int maxContactCapacity) -{ - float radius = collidables[collidableIndexA].m_radius; - float4 spherePos1 = rigidBodies[bodyIndexA].m_pos; - b3Quaternion sphereOrn = rigidBodies[bodyIndexA].m_quat; - - float4 pos = rigidBodies[bodyIndexB].m_pos; - - b3Quaternion quat = rigidBodies[bodyIndexB].m_quat; - - b3Transform tr; - tr.setIdentity(); - tr.setOrigin(pos); - tr.setRotation(quat); - b3Transform trInv = tr.inverse(); - - float4 spherePos = trInv(spherePos1); - - int collidableIndex = rigidBodies[bodyIndexB].m_collidableIdx; - int shapeIndex = collidables[collidableIndex].m_shapeIndex; - int numFaces = convexShapes[shapeIndex].m_numFaces; - float4 closestPnt = b3MakeVector3(0, 0, 0, 0); - float4 hitNormalWorld = b3MakeVector3(0, 0, 0, 0); - float minDist = -1000000.f; // TODO: What is the largest/smallest float? - bool bCollide = true; - int region = -1; - float4 localHitNormal; - for (int f = 0; f < numFaces; f++) - { - b3GpuFace face = faces[convexShapes[shapeIndex].m_faceOffset + f]; - float4 planeEqn; - float4 localPlaneNormal = b3MakeVector3(face.m_plane.x, face.m_plane.y, face.m_plane.z, 0.f); - float4 n1 = localPlaneNormal; //quatRotate(quat,localPlaneNormal); - planeEqn = n1; - planeEqn[3] = face.m_plane.w; - - float4 pntReturn; - float dist = signedDistanceFromPointToPlane(spherePos, planeEqn, &pntReturn); - - if (dist > radius) - { - bCollide = false; - break; - } - - if (dist > 0) - { - //might hit an edge or vertex - b3Vector3 out; - - bool isInPoly = IsPointInPolygon(spherePos, - &face, - &convexVertices[convexShapes[shapeIndex].m_vertexOffset], - convexIndices, - &out); - if (isInPoly) - { - if (dist > minDist) - { - minDist = dist; - closestPnt = pntReturn; - localHitNormal = planeEqn; - region = 1; - } - } - else - { - b3Vector3 tmp = spherePos - out; - b3Scalar l2 = tmp.length2(); - if (l2 < radius * radius) - { - dist = b3Sqrt(l2); - if (dist > minDist) - { - minDist = dist; - closestPnt = out; - localHitNormal = tmp / dist; - region = 2; - } - } - else - { - bCollide = false; - break; - } - } - } - else - { - if (dist > minDist) - { - minDist = dist; - closestPnt = pntReturn; - localHitNormal = planeEqn; - region = 3; - } - } - } - static int numChecks = 0; - numChecks++; - - if (bCollide && minDist > -10000) - { - float4 normalOnSurfaceB1 = tr.getBasis() * localHitNormal; //-hitNormalWorld; - float4 pOnB1 = tr(closestPnt); - //printf("dist ,%f,",minDist); - float actualDepth = minDist - radius; - if (actualDepth < 0) - { - //printf("actualDepth = ,%f,", actualDepth); - //printf("normalOnSurfaceB1 = ,%f,%f,%f,", normalOnSurfaceB1.x,normalOnSurfaceB1.y,normalOnSurfaceB1.z); - //printf("region=,%d,\n", region); - pOnB1[3] = actualDepth; - - int dstIdx; - // dstIdx = nGlobalContactsOut++;//AppendInc( nGlobalContactsOut, dstIdx ); - - if (nGlobalContactsOut < maxContactCapacity) - { - dstIdx = nGlobalContactsOut; - nGlobalContactsOut++; - - b3Contact4* c = &globalContactsOut[dstIdx]; - c->m_worldNormalOnB = normalOnSurfaceB1; - c->setFrictionCoeff(0.7); - c->setRestituitionCoeff(0.f); - - c->m_batchIdx = pairIndex; - c->m_bodyAPtrAndSignBit = rigidBodies[bodyIndexA].m_invMass == 0 ? -bodyIndexA : bodyIndexA; - c->m_bodyBPtrAndSignBit = rigidBodies[bodyIndexB].m_invMass == 0 ? -bodyIndexB : bodyIndexB; - c->m_worldPosB[0] = pOnB1; - int numPoints = 1; - c->m_worldNormalOnB.w = (b3Scalar)numPoints; - } //if (dstIdx < numPairs) - } - } //if (hasCollision) -} -#endif //B3_CONTACT_SPHERE_SPHERE_H diff --git a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ConvexPolyhedronData.h b/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ConvexPolyhedronData.h deleted file mode 100644 index d5a73bd4..00000000 --- a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ConvexPolyhedronData.h +++ /dev/null @@ -1,38 +0,0 @@ - -#ifndef B3_CONVEX_POLYHEDRON_DATA_H -#define B3_CONVEX_POLYHEDRON_DATA_H - -#include "Bullet3Common/shared/b3Float4.h" -#include "Bullet3Common/shared/b3Quat.h" - -typedef struct b3GpuFace b3GpuFace_t; -struct b3GpuFace -{ - b3Float4 m_plane; - int m_indexOffset; - int m_numIndices; - int m_unusedPadding1; - int m_unusedPadding2; -}; - -typedef struct b3ConvexPolyhedronData b3ConvexPolyhedronData_t; - -struct b3ConvexPolyhedronData -{ - b3Float4 m_localCenter; - b3Float4 m_extents; - b3Float4 mC; - b3Float4 mE; - - float m_radius; - int m_faceOffset; - int m_numFaces; - int m_numVertices; - - int m_vertexOffset; - int m_uniqueEdgesOffset; - int m_numUniqueEdges; - int m_unused; -}; - -#endif //B3_CONVEX_POLYHEDRON_DATA_H diff --git a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3FindConcaveSatAxis.h b/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3FindConcaveSatAxis.h deleted file mode 100644 index 983554eb..00000000 --- a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3FindConcaveSatAxis.h +++ /dev/null @@ -1,797 +0,0 @@ -#ifndef B3_FIND_CONCAVE_SEPARATING_AXIS_H -#define B3_FIND_CONCAVE_SEPARATING_AXIS_H - -#define B3_TRIANGLE_NUM_CONVEX_FACES 5 - -#include "Bullet3Common/shared/b3Int4.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3RigidBodyData.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3Collidable.h" -#include "Bullet3Collision/BroadPhaseCollision/shared/b3Aabb.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3BvhSubtreeInfoData.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3QuantizedBvhNodeData.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3ConvexPolyhedronData.h" - -inline void b3Project(__global const b3ConvexPolyhedronData* hull, b3Float4ConstArg pos, b3QuatConstArg orn, - const b3Float4* dir, __global const b3Float4* vertices, float* min, float* max) -{ - min[0] = FLT_MAX; - max[0] = -FLT_MAX; - int numVerts = hull->m_numVertices; - - const b3Float4 localDir = b3QuatRotate(b3QuatInverse(orn), *dir); - float offset = b3Dot(pos, *dir); - for (int i = 0; i < numVerts; i++) - { - float dp = b3Dot(vertices[hull->m_vertexOffset + i], localDir); - if (dp < min[0]) - min[0] = dp; - if (dp > max[0]) - max[0] = dp; - } - if (min[0] > max[0]) - { - float tmp = min[0]; - min[0] = max[0]; - max[0] = tmp; - } - min[0] += offset; - max[0] += offset; -} - -inline bool b3TestSepAxis(const b3ConvexPolyhedronData* hullA, __global const b3ConvexPolyhedronData* hullB, - b3Float4ConstArg posA, b3QuatConstArg ornA, - b3Float4ConstArg posB, b3QuatConstArg ornB, - b3Float4* sep_axis, const b3Float4* verticesA, __global const b3Float4* verticesB, float* depth) -{ - float Min0, Max0; - float Min1, Max1; - b3Project(hullA, posA, ornA, sep_axis, verticesA, &Min0, &Max0); - b3Project(hullB, posB, ornB, sep_axis, verticesB, &Min1, &Max1); - - if (Max0 < Min1 || Max1 < Min0) - return false; - - float d0 = Max0 - Min1; - float d1 = Max1 - Min0; - *depth = d0 < d1 ? d0 : d1; - return true; -} - -bool b3FindSeparatingAxis(const b3ConvexPolyhedronData* hullA, __global const b3ConvexPolyhedronData* hullB, - b3Float4ConstArg posA1, - b3QuatConstArg ornA, - b3Float4ConstArg posB1, - b3QuatConstArg ornB, - b3Float4ConstArg DeltaC2, - - const b3Float4* verticesA, - const b3Float4* uniqueEdgesA, - const b3GpuFace* facesA, - const int* indicesA, - - __global const b3Float4* verticesB, - __global const b3Float4* uniqueEdgesB, - __global const b3GpuFace* facesB, - __global const int* indicesB, - b3Float4* sep, - float* dmin) -{ - b3Float4 posA = posA1; - posA.w = 0.f; - b3Float4 posB = posB1; - posB.w = 0.f; - /* - static int maxFaceVertex = 0; - - int curFaceVertexAB = hullA->m_numFaces*hullB->m_numVertices; - curFaceVertexAB+= hullB->m_numFaces*hullA->m_numVertices; - - if (curFaceVertexAB>maxFaceVertex) - { - maxFaceVertex = curFaceVertexAB; - printf("curFaceVertexAB = %d\n",curFaceVertexAB); - printf("hullA->m_numFaces = %d\n",hullA->m_numFaces); - printf("hullA->m_numVertices = %d\n",hullA->m_numVertices); - printf("hullB->m_numVertices = %d\n",hullB->m_numVertices); - } -*/ - - int curPlaneTests = 0; - { - int numFacesA = hullA->m_numFaces; - // Test normals from hullA - for (int i = 0; i < numFacesA; i++) - { - const b3Float4 normal = facesA[hullA->m_faceOffset + i].m_plane; - b3Float4 faceANormalWS = b3QuatRotate(ornA, normal); - if (b3Dot(DeltaC2, faceANormalWS) < 0) - faceANormalWS *= -1.f; - curPlaneTests++; - float d; - if (!b3TestSepAxis(hullA, hullB, posA, ornA, posB, ornB, &faceANormalWS, verticesA, verticesB, &d)) - return false; - if (d < *dmin) - { - *dmin = d; - *sep = faceANormalWS; - } - } - } - if ((b3Dot(-DeltaC2, *sep)) > 0.0f) - { - *sep = -(*sep); - } - return true; -} - -b3Vector3 unitSphere162[] = - { - b3MakeVector3(0.000000, -1.000000, 0.000000), - b3MakeVector3(0.203181, -0.967950, 0.147618), - b3MakeVector3(-0.077607, -0.967950, 0.238853), - b3MakeVector3(0.723607, -0.447220, 0.525725), - b3MakeVector3(0.609547, -0.657519, 0.442856), - b3MakeVector3(0.812729, -0.502301, 0.295238), - b3MakeVector3(-0.251147, -0.967949, 0.000000), - b3MakeVector3(-0.077607, -0.967950, -0.238853), - b3MakeVector3(0.203181, -0.967950, -0.147618), - b3MakeVector3(0.860698, -0.251151, 0.442858), - b3MakeVector3(-0.276388, -0.447220, 0.850649), - b3MakeVector3(-0.029639, -0.502302, 0.864184), - b3MakeVector3(-0.155215, -0.251152, 0.955422), - b3MakeVector3(-0.894426, -0.447216, 0.000000), - b3MakeVector3(-0.831051, -0.502299, 0.238853), - b3MakeVector3(-0.956626, -0.251149, 0.147618), - b3MakeVector3(-0.276388, -0.447220, -0.850649), - b3MakeVector3(-0.483971, -0.502302, -0.716565), - b3MakeVector3(-0.436007, -0.251152, -0.864188), - b3MakeVector3(0.723607, -0.447220, -0.525725), - b3MakeVector3(0.531941, -0.502302, -0.681712), - b3MakeVector3(0.687159, -0.251152, -0.681715), - b3MakeVector3(0.687159, -0.251152, 0.681715), - b3MakeVector3(-0.436007, -0.251152, 0.864188), - b3MakeVector3(-0.956626, -0.251149, -0.147618), - b3MakeVector3(-0.155215, -0.251152, -0.955422), - b3MakeVector3(0.860698, -0.251151, -0.442858), - b3MakeVector3(0.276388, 0.447220, 0.850649), - b3MakeVector3(0.483971, 0.502302, 0.716565), - b3MakeVector3(0.232822, 0.657519, 0.716563), - b3MakeVector3(-0.723607, 0.447220, 0.525725), - b3MakeVector3(-0.531941, 0.502302, 0.681712), - b3MakeVector3(-0.609547, 0.657519, 0.442856), - b3MakeVector3(-0.723607, 0.447220, -0.525725), - b3MakeVector3(-0.812729, 0.502301, -0.295238), - b3MakeVector3(-0.609547, 0.657519, -0.442856), - b3MakeVector3(0.276388, 0.447220, -0.850649), - b3MakeVector3(0.029639, 0.502302, -0.864184), - b3MakeVector3(0.232822, 0.657519, -0.716563), - b3MakeVector3(0.894426, 0.447216, 0.000000), - b3MakeVector3(0.831051, 0.502299, -0.238853), - b3MakeVector3(0.753442, 0.657515, 0.000000), - b3MakeVector3(-0.232822, -0.657519, 0.716563), - b3MakeVector3(-0.162456, -0.850654, 0.499995), - b3MakeVector3(0.052790, -0.723612, 0.688185), - b3MakeVector3(0.138199, -0.894429, 0.425321), - b3MakeVector3(0.262869, -0.525738, 0.809012), - b3MakeVector3(0.361805, -0.723611, 0.587779), - b3MakeVector3(0.531941, -0.502302, 0.681712), - b3MakeVector3(0.425323, -0.850654, 0.309011), - b3MakeVector3(0.812729, -0.502301, -0.295238), - b3MakeVector3(0.609547, -0.657519, -0.442856), - b3MakeVector3(0.850648, -0.525736, 0.000000), - b3MakeVector3(0.670817, -0.723611, -0.162457), - b3MakeVector3(0.670817, -0.723610, 0.162458), - b3MakeVector3(0.425323, -0.850654, -0.309011), - b3MakeVector3(0.447211, -0.894428, 0.000001), - b3MakeVector3(-0.753442, -0.657515, 0.000000), - b3MakeVector3(-0.525730, -0.850652, 0.000000), - b3MakeVector3(-0.638195, -0.723609, 0.262864), - b3MakeVector3(-0.361801, -0.894428, 0.262864), - b3MakeVector3(-0.688189, -0.525736, 0.499997), - b3MakeVector3(-0.447211, -0.723610, 0.525729), - b3MakeVector3(-0.483971, -0.502302, 0.716565), - b3MakeVector3(-0.232822, -0.657519, -0.716563), - b3MakeVector3(-0.162456, -0.850654, -0.499995), - b3MakeVector3(-0.447211, -0.723611, -0.525727), - b3MakeVector3(-0.361801, -0.894429, -0.262863), - b3MakeVector3(-0.688189, -0.525736, -0.499997), - b3MakeVector3(-0.638195, -0.723609, -0.262863), - b3MakeVector3(-0.831051, -0.502299, -0.238853), - b3MakeVector3(0.361804, -0.723612, -0.587779), - b3MakeVector3(0.138197, -0.894429, -0.425321), - b3MakeVector3(0.262869, -0.525738, -0.809012), - b3MakeVector3(0.052789, -0.723611, -0.688186), - b3MakeVector3(-0.029639, -0.502302, -0.864184), - b3MakeVector3(0.956626, 0.251149, 0.147618), - b3MakeVector3(0.956626, 0.251149, -0.147618), - b3MakeVector3(0.951058, -0.000000, 0.309013), - b3MakeVector3(1.000000, 0.000000, 0.000000), - b3MakeVector3(0.947213, -0.276396, 0.162458), - b3MakeVector3(0.951058, 0.000000, -0.309013), - b3MakeVector3(0.947213, -0.276396, -0.162458), - b3MakeVector3(0.155215, 0.251152, 0.955422), - b3MakeVector3(0.436007, 0.251152, 0.864188), - b3MakeVector3(-0.000000, -0.000000, 1.000000), - b3MakeVector3(0.309017, 0.000000, 0.951056), - b3MakeVector3(0.138199, -0.276398, 0.951055), - b3MakeVector3(0.587786, 0.000000, 0.809017), - b3MakeVector3(0.447216, -0.276398, 0.850648), - b3MakeVector3(-0.860698, 0.251151, 0.442858), - b3MakeVector3(-0.687159, 0.251152, 0.681715), - b3MakeVector3(-0.951058, -0.000000, 0.309013), - b3MakeVector3(-0.809018, 0.000000, 0.587783), - b3MakeVector3(-0.861803, -0.276396, 0.425324), - b3MakeVector3(-0.587786, 0.000000, 0.809017), - b3MakeVector3(-0.670819, -0.276397, 0.688191), - b3MakeVector3(-0.687159, 0.251152, -0.681715), - b3MakeVector3(-0.860698, 0.251151, -0.442858), - b3MakeVector3(-0.587786, -0.000000, -0.809017), - b3MakeVector3(-0.809018, -0.000000, -0.587783), - b3MakeVector3(-0.670819, -0.276397, -0.688191), - b3MakeVector3(-0.951058, 0.000000, -0.309013), - b3MakeVector3(-0.861803, -0.276396, -0.425324), - b3MakeVector3(0.436007, 0.251152, -0.864188), - b3MakeVector3(0.155215, 0.251152, -0.955422), - b3MakeVector3(0.587786, -0.000000, -0.809017), - b3MakeVector3(0.309017, -0.000000, -0.951056), - b3MakeVector3(0.447216, -0.276398, -0.850648), - b3MakeVector3(0.000000, 0.000000, -1.000000), - b3MakeVector3(0.138199, -0.276398, -0.951055), - b3MakeVector3(0.670820, 0.276396, 0.688190), - b3MakeVector3(0.809019, -0.000002, 0.587783), - b3MakeVector3(0.688189, 0.525736, 0.499997), - b3MakeVector3(0.861804, 0.276394, 0.425323), - b3MakeVector3(0.831051, 0.502299, 0.238853), - b3MakeVector3(-0.447216, 0.276397, 0.850649), - b3MakeVector3(-0.309017, -0.000001, 0.951056), - b3MakeVector3(-0.262869, 0.525738, 0.809012), - b3MakeVector3(-0.138199, 0.276397, 0.951055), - b3MakeVector3(0.029639, 0.502302, 0.864184), - b3MakeVector3(-0.947213, 0.276396, -0.162458), - b3MakeVector3(-1.000000, 0.000001, 0.000000), - b3MakeVector3(-0.850648, 0.525736, -0.000000), - b3MakeVector3(-0.947213, 0.276397, 0.162458), - b3MakeVector3(-0.812729, 0.502301, 0.295238), - b3MakeVector3(-0.138199, 0.276397, -0.951055), - b3MakeVector3(-0.309016, -0.000000, -0.951057), - b3MakeVector3(-0.262869, 0.525738, -0.809012), - b3MakeVector3(-0.447215, 0.276397, -0.850649), - b3MakeVector3(-0.531941, 0.502302, -0.681712), - b3MakeVector3(0.861804, 0.276396, -0.425322), - b3MakeVector3(0.809019, 0.000000, -0.587782), - b3MakeVector3(0.688189, 0.525736, -0.499997), - b3MakeVector3(0.670821, 0.276397, -0.688189), - b3MakeVector3(0.483971, 0.502302, -0.716565), - b3MakeVector3(0.077607, 0.967950, 0.238853), - b3MakeVector3(0.251147, 0.967949, 0.000000), - b3MakeVector3(0.000000, 1.000000, 0.000000), - b3MakeVector3(0.162456, 0.850654, 0.499995), - b3MakeVector3(0.361800, 0.894429, 0.262863), - b3MakeVector3(0.447209, 0.723612, 0.525728), - b3MakeVector3(0.525730, 0.850652, 0.000000), - b3MakeVector3(0.638194, 0.723610, 0.262864), - b3MakeVector3(-0.203181, 0.967950, 0.147618), - b3MakeVector3(-0.425323, 0.850654, 0.309011), - b3MakeVector3(-0.138197, 0.894430, 0.425320), - b3MakeVector3(-0.361804, 0.723612, 0.587778), - b3MakeVector3(-0.052790, 0.723612, 0.688185), - b3MakeVector3(-0.203181, 0.967950, -0.147618), - b3MakeVector3(-0.425323, 0.850654, -0.309011), - b3MakeVector3(-0.447210, 0.894429, 0.000000), - b3MakeVector3(-0.670817, 0.723611, -0.162457), - b3MakeVector3(-0.670817, 0.723611, 0.162457), - b3MakeVector3(0.077607, 0.967950, -0.238853), - b3MakeVector3(0.162456, 0.850654, -0.499995), - b3MakeVector3(-0.138197, 0.894430, -0.425320), - b3MakeVector3(-0.052790, 0.723612, -0.688185), - b3MakeVector3(-0.361804, 0.723612, -0.587778), - b3MakeVector3(0.361800, 0.894429, -0.262863), - b3MakeVector3(0.638194, 0.723610, -0.262864), - b3MakeVector3(0.447209, 0.723612, -0.525728)}; - -bool b3FindSeparatingAxisEdgeEdge(const b3ConvexPolyhedronData* hullA, __global const b3ConvexPolyhedronData* hullB, - b3Float4ConstArg posA1, - b3QuatConstArg ornA, - b3Float4ConstArg posB1, - b3QuatConstArg ornB, - b3Float4ConstArg DeltaC2, - const b3Float4* verticesA, - const b3Float4* uniqueEdgesA, - const b3GpuFace* facesA, - const int* indicesA, - __global const b3Float4* verticesB, - __global const b3Float4* uniqueEdgesB, - __global const b3GpuFace* facesB, - __global const int* indicesB, - b3Float4* sep, - float* dmin, - bool searchAllEdgeEdge) -{ - b3Float4 posA = posA1; - posA.w = 0.f; - b3Float4 posB = posB1; - posB.w = 0.f; - - // int curPlaneTests=0; - - int curEdgeEdge = 0; - // Test edges - static int maxEdgeTests = 0; - int curEdgeTests = hullA->m_numUniqueEdges * hullB->m_numUniqueEdges; - if (curEdgeTests > maxEdgeTests) - { - maxEdgeTests = curEdgeTests; - printf("maxEdgeTests = %d\n", maxEdgeTests); - printf("hullA->m_numUniqueEdges = %d\n", hullA->m_numUniqueEdges); - printf("hullB->m_numUniqueEdges = %d\n", hullB->m_numUniqueEdges); - } - - if (searchAllEdgeEdge) - { - for (int e0 = 0; e0 < hullA->m_numUniqueEdges; e0++) - { - const b3Float4 edge0 = uniqueEdgesA[hullA->m_uniqueEdgesOffset + e0]; - b3Float4 edge0World = b3QuatRotate(ornA, edge0); - - for (int e1 = 0; e1 < hullB->m_numUniqueEdges; e1++) - { - const b3Float4 edge1 = uniqueEdgesB[hullB->m_uniqueEdgesOffset + e1]; - b3Float4 edge1World = b3QuatRotate(ornB, edge1); - - b3Float4 crossje = b3Cross(edge0World, edge1World); - - curEdgeEdge++; - if (!b3IsAlmostZero(crossje)) - { - crossje = b3Normalized(crossje); - if (b3Dot(DeltaC2, crossje) < 0) - crossje *= -1.f; - - float dist; - bool result = true; - { - float Min0, Max0; - float Min1, Max1; - b3Project(hullA, posA, ornA, &crossje, verticesA, &Min0, &Max0); - b3Project(hullB, posB, ornB, &crossje, verticesB, &Min1, &Max1); - - if (Max0 < Min1 || Max1 < Min0) - return false; - - float d0 = Max0 - Min1; - float d1 = Max1 - Min0; - dist = d0 < d1 ? d0 : d1; - result = true; - } - - if (dist < *dmin) - { - *dmin = dist; - *sep = crossje; - } - } - } - } - } - else - { - int numDirections = sizeof(unitSphere162) / sizeof(b3Vector3); - //printf("numDirections =%d\n",numDirections ); - - for (int i = 0; i < numDirections; i++) - { - b3Float4 crossje = unitSphere162[i]; - { - //if (b3Dot(DeltaC2,crossje)>0) - { - float dist; - bool result = true; - { - float Min0, Max0; - float Min1, Max1; - b3Project(hullA, posA, ornA, &crossje, verticesA, &Min0, &Max0); - b3Project(hullB, posB, ornB, &crossje, verticesB, &Min1, &Max1); - - if (Max0 < Min1 || Max1 < Min0) - return false; - - float d0 = Max0 - Min1; - float d1 = Max1 - Min0; - dist = d0 < d1 ? d0 : d1; - result = true; - } - - if (dist < *dmin) - { - *dmin = dist; - *sep = crossje; - } - } - } - } - } - - if ((b3Dot(-DeltaC2, *sep)) > 0.0f) - { - *sep = -(*sep); - } - return true; -} - -inline int b3FindClippingFaces(b3Float4ConstArg separatingNormal, - __global const b3ConvexPolyhedronData_t* hullA, __global const b3ConvexPolyhedronData_t* hullB, - b3Float4ConstArg posA, b3QuatConstArg ornA, b3Float4ConstArg posB, b3QuatConstArg ornB, - __global b3Float4* worldVertsA1, - __global b3Float4* worldNormalsA1, - __global b3Float4* worldVertsB1, - int capacityWorldVerts, - const float minDist, float maxDist, - __global const b3Float4* verticesA, - __global const b3GpuFace_t* facesA, - __global const int* indicesA, - __global const b3Float4* verticesB, - __global const b3GpuFace_t* facesB, - __global const int* indicesB, - - __global b3Int4* clippingFaces, int pairIndex) -{ - int numContactsOut = 0; - int numWorldVertsB1 = 0; - - int closestFaceB = -1; - float dmax = -FLT_MAX; - - { - for (int face = 0; face < hullB->m_numFaces; face++) - { - const b3Float4 Normal = b3MakeFloat4(facesB[hullB->m_faceOffset + face].m_plane.x, - facesB[hullB->m_faceOffset + face].m_plane.y, facesB[hullB->m_faceOffset + face].m_plane.z, 0.f); - const b3Float4 WorldNormal = b3QuatRotate(ornB, Normal); - float d = b3Dot(WorldNormal, separatingNormal); - if (d > dmax) - { - dmax = d; - closestFaceB = face; - } - } - } - - { - const b3GpuFace_t polyB = facesB[hullB->m_faceOffset + closestFaceB]; - const int numVertices = polyB.m_numIndices; - for (int e0 = 0; e0 < numVertices; e0++) - { - const b3Float4 b = verticesB[hullB->m_vertexOffset + indicesB[polyB.m_indexOffset + e0]]; - worldVertsB1[pairIndex * capacityWorldVerts + numWorldVertsB1++] = b3TransformPoint(b, posB, ornB); - } - } - - int closestFaceA = -1; - { - float dmin = FLT_MAX; - for (int face = 0; face < hullA->m_numFaces; face++) - { - const b3Float4 Normal = b3MakeFloat4( - facesA[hullA->m_faceOffset + face].m_plane.x, - facesA[hullA->m_faceOffset + face].m_plane.y, - facesA[hullA->m_faceOffset + face].m_plane.z, - 0.f); - const b3Float4 faceANormalWS = b3QuatRotate(ornA, Normal); - - float d = b3Dot(faceANormalWS, separatingNormal); - if (d < dmin) - { - dmin = d; - closestFaceA = face; - worldNormalsA1[pairIndex] = faceANormalWS; - } - } - } - - int numVerticesA = facesA[hullA->m_faceOffset + closestFaceA].m_numIndices; - for (int e0 = 0; e0 < numVerticesA; e0++) - { - const b3Float4 a = verticesA[hullA->m_vertexOffset + indicesA[facesA[hullA->m_faceOffset + closestFaceA].m_indexOffset + e0]]; - worldVertsA1[pairIndex * capacityWorldVerts + e0] = b3TransformPoint(a, posA, ornA); - } - - clippingFaces[pairIndex].x = closestFaceA; - clippingFaces[pairIndex].y = closestFaceB; - clippingFaces[pairIndex].z = numVerticesA; - clippingFaces[pairIndex].w = numWorldVertsB1; - - return numContactsOut; -} - -__kernel void b3FindConcaveSeparatingAxisKernel(__global b3Int4* concavePairs, - __global const b3RigidBodyData* rigidBodies, - __global const b3Collidable* collidables, - __global const b3ConvexPolyhedronData* convexShapes, - __global const b3Float4* vertices, - __global const b3Float4* uniqueEdges, - __global const b3GpuFace* faces, - __global const int* indices, - __global const b3GpuChildShape* gpuChildShapes, - __global b3Aabb* aabbs, - __global b3Float4* concaveSeparatingNormalsOut, - __global b3Int4* clippingFacesOut, - __global b3Vector3* worldVertsA1Out, - __global b3Vector3* worldNormalsA1Out, - __global b3Vector3* worldVertsB1Out, - __global int* hasSeparatingNormals, - int vertexFaceCapacity, - int numConcavePairs, - int pairIdx) -{ - int i = pairIdx; - /* int i = get_global_id(0); - if (i>=numConcavePairs) - return; - int pairIdx = i; - */ - - int bodyIndexA = concavePairs[i].x; - int bodyIndexB = concavePairs[i].y; - - int collidableIndexA = rigidBodies[bodyIndexA].m_collidableIdx; - int collidableIndexB = rigidBodies[bodyIndexB].m_collidableIdx; - - int shapeIndexA = collidables[collidableIndexA].m_shapeIndex; - int shapeIndexB = collidables[collidableIndexB].m_shapeIndex; - - if (collidables[collidableIndexB].m_shapeType != SHAPE_CONVEX_HULL && - collidables[collidableIndexB].m_shapeType != SHAPE_COMPOUND_OF_CONVEX_HULLS) - { - concavePairs[pairIdx].w = -1; - return; - } - - hasSeparatingNormals[i] = 0; - - // int numFacesA = convexShapes[shapeIndexA].m_numFaces; - int numActualConcaveConvexTests = 0; - - int f = concavePairs[i].z; - - bool overlap = false; - - b3ConvexPolyhedronData convexPolyhedronA; - - //add 3 vertices of the triangle - convexPolyhedronA.m_numVertices = 3; - convexPolyhedronA.m_vertexOffset = 0; - b3Float4 localCenter = b3MakeFloat4(0.f, 0.f, 0.f, 0.f); - - b3GpuFace face = faces[convexShapes[shapeIndexA].m_faceOffset + f]; - b3Aabb triAabb; - triAabb.m_minVec = b3MakeFloat4(1e30f, 1e30f, 1e30f, 0.f); - triAabb.m_maxVec = b3MakeFloat4(-1e30f, -1e30f, -1e30f, 0.f); - - b3Float4 verticesA[3]; - for (int i = 0; i < 3; i++) - { - int index = indices[face.m_indexOffset + i]; - b3Float4 vert = vertices[convexShapes[shapeIndexA].m_vertexOffset + index]; - verticesA[i] = vert; - localCenter += vert; - - triAabb.m_minVec = b3MinFloat4(triAabb.m_minVec, vert); - triAabb.m_maxVec = b3MaxFloat4(triAabb.m_maxVec, vert); - } - - overlap = true; - overlap = (triAabb.m_minVec.x > aabbs[bodyIndexB].m_maxVec.x || triAabb.m_maxVec.x < aabbs[bodyIndexB].m_minVec.x) ? false : overlap; - overlap = (triAabb.m_minVec.z > aabbs[bodyIndexB].m_maxVec.z || triAabb.m_maxVec.z < aabbs[bodyIndexB].m_minVec.z) ? false : overlap; - overlap = (triAabb.m_minVec.y > aabbs[bodyIndexB].m_maxVec.y || triAabb.m_maxVec.y < aabbs[bodyIndexB].m_minVec.y) ? false : overlap; - - if (overlap) - { - float dmin = FLT_MAX; - int hasSeparatingAxis = 5; - b3Float4 sepAxis = b3MakeFloat4(1, 2, 3, 4); - - // int localCC=0; - numActualConcaveConvexTests++; - - //a triangle has 3 unique edges - convexPolyhedronA.m_numUniqueEdges = 3; - convexPolyhedronA.m_uniqueEdgesOffset = 0; - b3Float4 uniqueEdgesA[3]; - - uniqueEdgesA[0] = (verticesA[1] - verticesA[0]); - uniqueEdgesA[1] = (verticesA[2] - verticesA[1]); - uniqueEdgesA[2] = (verticesA[0] - verticesA[2]); - - convexPolyhedronA.m_faceOffset = 0; - - b3Float4 normal = b3MakeFloat4(face.m_plane.x, face.m_plane.y, face.m_plane.z, 0.f); - - b3GpuFace facesA[B3_TRIANGLE_NUM_CONVEX_FACES]; - int indicesA[3 + 3 + 2 + 2 + 2]; - int curUsedIndices = 0; - int fidx = 0; - - //front size of triangle - { - facesA[fidx].m_indexOffset = curUsedIndices; - indicesA[0] = 0; - indicesA[1] = 1; - indicesA[2] = 2; - curUsedIndices += 3; - float c = face.m_plane.w; - facesA[fidx].m_plane.x = normal.x; - facesA[fidx].m_plane.y = normal.y; - facesA[fidx].m_plane.z = normal.z; - facesA[fidx].m_plane.w = c; - facesA[fidx].m_numIndices = 3; - } - fidx++; - //back size of triangle - { - facesA[fidx].m_indexOffset = curUsedIndices; - indicesA[3] = 2; - indicesA[4] = 1; - indicesA[5] = 0; - curUsedIndices += 3; - float c = b3Dot(normal, verticesA[0]); - // float c1 = -face.m_plane.w; - facesA[fidx].m_plane.x = -normal.x; - facesA[fidx].m_plane.y = -normal.y; - facesA[fidx].m_plane.z = -normal.z; - facesA[fidx].m_plane.w = c; - facesA[fidx].m_numIndices = 3; - } - fidx++; - - bool addEdgePlanes = true; - if (addEdgePlanes) - { - int numVertices = 3; - int prevVertex = numVertices - 1; - for (int i = 0; i < numVertices; i++) - { - b3Float4 v0 = verticesA[i]; - b3Float4 v1 = verticesA[prevVertex]; - - b3Float4 edgeNormal = b3Normalized(b3Cross(normal, v1 - v0)); - float c = -b3Dot(edgeNormal, v0); - - facesA[fidx].m_numIndices = 2; - facesA[fidx].m_indexOffset = curUsedIndices; - indicesA[curUsedIndices++] = i; - indicesA[curUsedIndices++] = prevVertex; - - facesA[fidx].m_plane.x = edgeNormal.x; - facesA[fidx].m_plane.y = edgeNormal.y; - facesA[fidx].m_plane.z = edgeNormal.z; - facesA[fidx].m_plane.w = c; - fidx++; - prevVertex = i; - } - } - convexPolyhedronA.m_numFaces = B3_TRIANGLE_NUM_CONVEX_FACES; - convexPolyhedronA.m_localCenter = localCenter * (1.f / 3.f); - - b3Float4 posA = rigidBodies[bodyIndexA].m_pos; - posA.w = 0.f; - b3Float4 posB = rigidBodies[bodyIndexB].m_pos; - posB.w = 0.f; - - b3Quaternion ornA = rigidBodies[bodyIndexA].m_quat; - b3Quaternion ornB = rigidBodies[bodyIndexB].m_quat; - - /////////////////// - ///compound shape support - - if (collidables[collidableIndexB].m_shapeType == SHAPE_COMPOUND_OF_CONVEX_HULLS) - { - int compoundChild = concavePairs[pairIdx].w; - int childShapeIndexB = compoundChild; //collidables[collidableIndexB].m_shapeIndex+compoundChild; - int childColIndexB = gpuChildShapes[childShapeIndexB].m_shapeIndex; - b3Float4 childPosB = gpuChildShapes[childShapeIndexB].m_childPosition; - b3Quaternion childOrnB = gpuChildShapes[childShapeIndexB].m_childOrientation; - b3Float4 newPosB = b3TransformPoint(childPosB, posB, ornB); - b3Quaternion newOrnB = b3QuatMul(ornB, childOrnB); - posB = newPosB; - ornB = newOrnB; - shapeIndexB = collidables[childColIndexB].m_shapeIndex; - } - ////////////////// - - b3Float4 c0local = convexPolyhedronA.m_localCenter; - b3Float4 c0 = b3TransformPoint(c0local, posA, ornA); - b3Float4 c1local = convexShapes[shapeIndexB].m_localCenter; - b3Float4 c1 = b3TransformPoint(c1local, posB, ornB); - const b3Float4 DeltaC2 = c0 - c1; - - bool sepA = b3FindSeparatingAxis(&convexPolyhedronA, &convexShapes[shapeIndexB], - posA, ornA, - posB, ornB, - DeltaC2, - verticesA, uniqueEdgesA, facesA, indicesA, - vertices, uniqueEdges, faces, indices, - &sepAxis, &dmin); - hasSeparatingAxis = 4; - if (!sepA) - { - hasSeparatingAxis = 0; - } - else - { - bool sepB = b3FindSeparatingAxis(&convexShapes[shapeIndexB], &convexPolyhedronA, - posB, ornB, - posA, ornA, - DeltaC2, - vertices, uniqueEdges, faces, indices, - verticesA, uniqueEdgesA, facesA, indicesA, - &sepAxis, &dmin); - - if (!sepB) - { - hasSeparatingAxis = 0; - } - else - { - bool sepEE = b3FindSeparatingAxisEdgeEdge(&convexPolyhedronA, &convexShapes[shapeIndexB], - posA, ornA, - posB, ornB, - DeltaC2, - verticesA, uniqueEdgesA, facesA, indicesA, - vertices, uniqueEdges, faces, indices, - &sepAxis, &dmin, true); - - if (!sepEE) - { - hasSeparatingAxis = 0; - } - else - { - hasSeparatingAxis = 1; - } - } - } - - if (hasSeparatingAxis) - { - hasSeparatingNormals[i] = 1; - sepAxis.w = dmin; - concaveSeparatingNormalsOut[pairIdx] = sepAxis; - - //now compute clipping faces A and B, and world-space clipping vertices A and B... - - float minDist = -1e30f; - float maxDist = 0.02f; - - b3FindClippingFaces(sepAxis, - &convexPolyhedronA, - &convexShapes[shapeIndexB], - posA, ornA, - posB, ornB, - worldVertsA1Out, - worldNormalsA1Out, - worldVertsB1Out, - vertexFaceCapacity, - minDist, maxDist, - verticesA, - facesA, - indicesA, - - vertices, - faces, - indices, - clippingFacesOut, pairIdx); - } - else - { - //mark this pair as in-active - concavePairs[pairIdx].w = -1; - } - } - else - { - //mark this pair as in-active - concavePairs[pairIdx].w = -1; - } -} - -#endif //B3_FIND_CONCAVE_SEPARATING_AXIS_H diff --git a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3FindSeparatingAxis.h b/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3FindSeparatingAxis.h deleted file mode 100644 index b4981ae6..00000000 --- a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3FindSeparatingAxis.h +++ /dev/null @@ -1,197 +0,0 @@ -#ifndef B3_FIND_SEPARATING_AXIS_H -#define B3_FIND_SEPARATING_AXIS_H - -inline void b3ProjectAxis(const b3ConvexPolyhedronData& hull, const b3Float4& pos, const b3Quaternion& orn, const b3Float4& dir, const b3AlignedObjectArray& vertices, b3Scalar& min, b3Scalar& max) -{ - min = FLT_MAX; - max = -FLT_MAX; - int numVerts = hull.m_numVertices; - - const b3Float4 localDir = b3QuatRotate(orn.inverse(), dir); - - b3Scalar offset = b3Dot3F4(pos, dir); - - for (int i = 0; i < numVerts; i++) - { - //b3Vector3 pt = trans * vertices[m_vertexOffset+i]; - //b3Scalar dp = pt.dot(dir); - //b3Vector3 vertex = vertices[hull.m_vertexOffset+i]; - b3Scalar dp = b3Dot3F4((b3Float4&)vertices[hull.m_vertexOffset + i], localDir); - //b3Assert(dp==dpL); - if (dp < min) min = dp; - if (dp > max) max = dp; - } - if (min > max) - { - b3Scalar tmp = min; - min = max; - max = tmp; - } - min += offset; - max += offset; -} - -inline bool b3TestSepAxis(const b3ConvexPolyhedronData& hullA, const b3ConvexPolyhedronData& hullB, - const b3Float4& posA, const b3Quaternion& ornA, - const b3Float4& posB, const b3Quaternion& ornB, - const b3Float4& sep_axis, const b3AlignedObjectArray& verticesA, const b3AlignedObjectArray& verticesB, b3Scalar& depth) -{ - b3Scalar Min0, Max0; - b3Scalar Min1, Max1; - b3ProjectAxis(hullA, posA, ornA, sep_axis, verticesA, Min0, Max0); - b3ProjectAxis(hullB, posB, ornB, sep_axis, verticesB, Min1, Max1); - - if (Max0 < Min1 || Max1 < Min0) - return false; - - b3Scalar d0 = Max0 - Min1; - b3Assert(d0 >= 0.0f); - b3Scalar d1 = Max1 - Min0; - b3Assert(d1 >= 0.0f); - depth = d0 < d1 ? d0 : d1; - return true; -} - -inline bool b3FindSeparatingAxis(const b3ConvexPolyhedronData& hullA, const b3ConvexPolyhedronData& hullB, - const b3Float4& posA1, - const b3Quaternion& ornA, - const b3Float4& posB1, - const b3Quaternion& ornB, - const b3AlignedObjectArray& verticesA, - const b3AlignedObjectArray& uniqueEdgesA, - const b3AlignedObjectArray& facesA, - const b3AlignedObjectArray& indicesA, - const b3AlignedObjectArray& verticesB, - const b3AlignedObjectArray& uniqueEdgesB, - const b3AlignedObjectArray& facesB, - const b3AlignedObjectArray& indicesB, - - b3Vector3& sep) -{ - B3_PROFILE("findSeparatingAxis"); - - b3Float4 posA = posA1; - posA.w = 0.f; - b3Float4 posB = posB1; - posB.w = 0.f; - //#ifdef TEST_INTERNAL_OBJECTS - b3Float4 c0local = (b3Float4&)hullA.m_localCenter; - - b3Float4 c0 = b3TransformPoint(c0local, posA, ornA); - b3Float4 c1local = (b3Float4&)hullB.m_localCenter; - b3Float4 c1 = b3TransformPoint(c1local, posB, ornB); - const b3Float4 deltaC2 = c0 - c1; - //#endif - - b3Scalar dmin = FLT_MAX; - int curPlaneTests = 0; - - int numFacesA = hullA.m_numFaces; - // Test normals from hullA - for (int i = 0; i < numFacesA; i++) - { - const b3Float4& normal = (b3Float4&)facesA[hullA.m_faceOffset + i].m_plane; - b3Float4 faceANormalWS = b3QuatRotate(ornA, normal); - - if (b3Dot3F4(deltaC2, faceANormalWS) < 0) - faceANormalWS *= -1.f; - - curPlaneTests++; -#ifdef TEST_INTERNAL_OBJECTS - gExpectedNbTests++; - if (gUseInternalObject && !TestInternalObjects(transA, transB, DeltaC2, faceANormalWS, hullA, hullB, dmin)) - continue; - gActualNbTests++; -#endif - - b3Scalar d; - if (!b3TestSepAxis(hullA, hullB, posA, ornA, posB, ornB, faceANormalWS, verticesA, verticesB, d)) - return false; - - if (d < dmin) - { - dmin = d; - sep = (b3Vector3&)faceANormalWS; - } - } - - int numFacesB = hullB.m_numFaces; - // Test normals from hullB - for (int i = 0; i < numFacesB; i++) - { - b3Float4 normal = (b3Float4&)facesB[hullB.m_faceOffset + i].m_plane; - b3Float4 WorldNormal = b3QuatRotate(ornB, normal); - - if (b3Dot3F4(deltaC2, WorldNormal) < 0) - { - WorldNormal *= -1.f; - } - curPlaneTests++; -#ifdef TEST_INTERNAL_OBJECTS - gExpectedNbTests++; - if (gUseInternalObject && !TestInternalObjects(transA, transB, DeltaC2, WorldNormal, hullA, hullB, dmin)) - continue; - gActualNbTests++; -#endif - - b3Scalar d; - if (!b3TestSepAxis(hullA, hullB, posA, ornA, posB, ornB, WorldNormal, verticesA, verticesB, d)) - return false; - - if (d < dmin) - { - dmin = d; - sep = (b3Vector3&)WorldNormal; - } - } - - // b3Vector3 edgeAstart,edgeAend,edgeBstart,edgeBend; - - int curEdgeEdge = 0; - // Test edges - for (int e0 = 0; e0 < hullA.m_numUniqueEdges; e0++) - { - const b3Float4& edge0 = (b3Float4&)uniqueEdgesA[hullA.m_uniqueEdgesOffset + e0]; - b3Float4 edge0World = b3QuatRotate(ornA, (b3Float4&)edge0); - - for (int e1 = 0; e1 < hullB.m_numUniqueEdges; e1++) - { - const b3Vector3 edge1 = uniqueEdgesB[hullB.m_uniqueEdgesOffset + e1]; - b3Float4 edge1World = b3QuatRotate(ornB, (b3Float4&)edge1); - - b3Float4 crossje = b3Cross3(edge0World, edge1World); - - curEdgeEdge++; - if (!b3IsAlmostZero((b3Vector3&)crossje)) - { - crossje = b3FastNormalized3(crossje); - if (b3Dot3F4(deltaC2, crossje) < 0) - crossje *= -1.f; - -#ifdef TEST_INTERNAL_OBJECTS - gExpectedNbTests++; - if (gUseInternalObject && !TestInternalObjects(transA, transB, DeltaC2, Cross, hullA, hullB, dmin)) - continue; - gActualNbTests++; -#endif - - b3Scalar dist; - if (!b3TestSepAxis(hullA, hullB, posA, ornA, posB, ornB, crossje, verticesA, verticesB, dist)) - return false; - - if (dist < dmin) - { - dmin = dist; - sep = (b3Vector3&)crossje; - } - } - } - } - - if ((b3Dot3F4(-deltaC2, (b3Float4&)sep)) > 0.0f) - sep = -sep; - - return true; -} - -#endif //B3_FIND_SEPARATING_AXIS_H diff --git a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3MprPenetration.h b/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3MprPenetration.h deleted file mode 100644 index a3bfbf29..00000000 --- a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3MprPenetration.h +++ /dev/null @@ -1,888 +0,0 @@ - -/*** - * --------------------------------- - * Copyright (c)2012 Daniel Fiser - * - * This file was ported from mpr.c file, part of libccd. - * The Minkoski Portal Refinement implementation was ported - * to OpenCL by Erwin Coumans for the Bullet 3 Physics library. - * at http://github.com/erwincoumans/bullet3 - * - * Distributed under the OSI-approved BSD License (the "License"); - * see . - * This software is distributed WITHOUT ANY WARRANTY; without even the - * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the License for more information. - */ - -#ifndef B3_MPR_PENETRATION_H -#define B3_MPR_PENETRATION_H - -#include "Bullet3Common/shared/b3PlatformDefinitions.h" -#include "Bullet3Common/shared/b3Float4.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3RigidBodyData.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3ConvexPolyhedronData.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3Collidable.h" - -#ifdef __cplusplus -#define B3_MPR_SQRT sqrtf -#else -#define B3_MPR_SQRT sqrt -#endif -#define B3_MPR_FMIN(x, y) ((x) < (y) ? (x) : (y)) -#define B3_MPR_FABS fabs - -#define B3_MPR_TOLERANCE 1E-6f -#define B3_MPR_MAX_ITERATIONS 1000 - -struct _b3MprSupport_t -{ - b3Float4 v; //!< Support point in minkowski sum - b3Float4 v1; //!< Support point in obj1 - b3Float4 v2; //!< Support point in obj2 -}; -typedef struct _b3MprSupport_t b3MprSupport_t; - -struct _b3MprSimplex_t -{ - b3MprSupport_t ps[4]; - int last; //!< index of last added point -}; -typedef struct _b3MprSimplex_t b3MprSimplex_t; - -inline b3MprSupport_t *b3MprSimplexPointW(b3MprSimplex_t *s, int idx) -{ - return &s->ps[idx]; -} - -inline void b3MprSimplexSetSize(b3MprSimplex_t *s, int size) -{ - s->last = size - 1; -} - -inline int b3MprSimplexSize(const b3MprSimplex_t *s) -{ - return s->last + 1; -} - -inline const b3MprSupport_t *b3MprSimplexPoint(const b3MprSimplex_t *s, int idx) -{ - // here is no check on boundaries - return &s->ps[idx]; -} - -inline void b3MprSupportCopy(b3MprSupport_t *d, const b3MprSupport_t *s) -{ - *d = *s; -} - -inline void b3MprSimplexSet(b3MprSimplex_t *s, size_t pos, const b3MprSupport_t *a) -{ - b3MprSupportCopy(s->ps + pos, a); -} - -inline void b3MprSimplexSwap(b3MprSimplex_t *s, size_t pos1, size_t pos2) -{ - b3MprSupport_t supp; - - b3MprSupportCopy(&supp, &s->ps[pos1]); - b3MprSupportCopy(&s->ps[pos1], &s->ps[pos2]); - b3MprSupportCopy(&s->ps[pos2], &supp); -} - -inline int b3MprIsZero(float val) -{ - return B3_MPR_FABS(val) < FLT_EPSILON; -} - -inline int b3MprEq(float _a, float _b) -{ - float ab; - float a, b; - - ab = B3_MPR_FABS(_a - _b); - if (B3_MPR_FABS(ab) < FLT_EPSILON) - return 1; - - a = B3_MPR_FABS(_a); - b = B3_MPR_FABS(_b); - if (b > a) - { - return ab < FLT_EPSILON * b; - } - else - { - return ab < FLT_EPSILON * a; - } -} - -inline int b3MprVec3Eq(const b3Float4 *a, const b3Float4 *b) -{ - return b3MprEq((*a).x, (*b).x) && b3MprEq((*a).y, (*b).y) && b3MprEq((*a).z, (*b).z); -} - -inline b3Float4 b3LocalGetSupportVertex(b3Float4ConstArg supportVec, __global const b3ConvexPolyhedronData_t *hull, b3ConstArray(b3Float4) verticesA) -{ - b3Float4 supVec = b3MakeFloat4(0, 0, 0, 0); - float maxDot = -B3_LARGE_FLOAT; - - if (0 < hull->m_numVertices) - { - const b3Float4 scaled = supportVec; - int index = b3MaxDot(scaled, &verticesA[hull->m_vertexOffset], hull->m_numVertices, &maxDot); - return verticesA[hull->m_vertexOffset + index]; - } - - return supVec; -} - -B3_STATIC void b3MprConvexSupport(int pairIndex, int bodyIndex, b3ConstArray(b3RigidBodyData_t) cpuBodyBuf, - b3ConstArray(b3ConvexPolyhedronData_t) cpuConvexData, - b3ConstArray(b3Collidable_t) cpuCollidables, - b3ConstArray(b3Float4) cpuVertices, - __global b3Float4 *sepAxis, - const b3Float4 *_dir, b3Float4 *outp, int logme) -{ - //dir is in worldspace, move to local space - - b3Float4 pos = cpuBodyBuf[bodyIndex].m_pos; - b3Quat orn = cpuBodyBuf[bodyIndex].m_quat; - - b3Float4 dir = b3MakeFloat4((*_dir).x, (*_dir).y, (*_dir).z, 0.f); - - const b3Float4 localDir = b3QuatRotate(b3QuatInverse(orn), dir); - - //find local support vertex - int colIndex = cpuBodyBuf[bodyIndex].m_collidableIdx; - - b3Assert(cpuCollidables[colIndex].m_shapeType == SHAPE_CONVEX_HULL); - __global const b3ConvexPolyhedronData_t *hull = &cpuConvexData[cpuCollidables[colIndex].m_shapeIndex]; - - b3Float4 pInA; - if (logme) - { - // b3Float4 supVec = b3MakeFloat4(0,0,0,0); - float maxDot = -B3_LARGE_FLOAT; - - if (0 < hull->m_numVertices) - { - const b3Float4 scaled = localDir; - int index = b3MaxDot(scaled, &cpuVertices[hull->m_vertexOffset], hull->m_numVertices, &maxDot); - pInA = cpuVertices[hull->m_vertexOffset + index]; - } - } - else - { - pInA = b3LocalGetSupportVertex(localDir, hull, cpuVertices); - } - - //move vertex to world space - *outp = b3TransformPoint(pInA, pos, orn); -} - -inline void b3MprSupport(int pairIndex, int bodyIndexA, int bodyIndexB, b3ConstArray(b3RigidBodyData_t) cpuBodyBuf, - b3ConstArray(b3ConvexPolyhedronData_t) cpuConvexData, - b3ConstArray(b3Collidable_t) cpuCollidables, - b3ConstArray(b3Float4) cpuVertices, - __global b3Float4 *sepAxis, - const b3Float4 *_dir, b3MprSupport_t *supp) -{ - b3Float4 dir; - dir = *_dir; - b3MprConvexSupport(pairIndex, bodyIndexA, cpuBodyBuf, cpuConvexData, cpuCollidables, cpuVertices, sepAxis, &dir, &supp->v1, 0); - dir = *_dir * -1.f; - b3MprConvexSupport(pairIndex, bodyIndexB, cpuBodyBuf, cpuConvexData, cpuCollidables, cpuVertices, sepAxis, &dir, &supp->v2, 0); - supp->v = supp->v1 - supp->v2; -} - -inline void b3FindOrigin(int bodyIndexA, int bodyIndexB, b3ConstArray(b3RigidBodyData_t) cpuBodyBuf, b3MprSupport_t *center) -{ - center->v1 = cpuBodyBuf[bodyIndexA].m_pos; - center->v2 = cpuBodyBuf[bodyIndexB].m_pos; - center->v = center->v1 - center->v2; -} - -inline void b3MprVec3Set(b3Float4 *v, float x, float y, float z) -{ - (*v).x = x; - (*v).y = y; - (*v).z = z; - (*v).w = 0.f; -} - -inline void b3MprVec3Add(b3Float4 *v, const b3Float4 *w) -{ - (*v).x += (*w).x; - (*v).y += (*w).y; - (*v).z += (*w).z; -} - -inline void b3MprVec3Copy(b3Float4 *v, const b3Float4 *w) -{ - *v = *w; -} - -inline void b3MprVec3Scale(b3Float4 *d, float k) -{ - *d *= k; -} - -inline float b3MprVec3Dot(const b3Float4 *a, const b3Float4 *b) -{ - float dot; - - dot = b3Dot3F4(*a, *b); - return dot; -} - -inline float b3MprVec3Len2(const b3Float4 *v) -{ - return b3MprVec3Dot(v, v); -} - -inline void b3MprVec3Normalize(b3Float4 *d) -{ - float k = 1.f / B3_MPR_SQRT(b3MprVec3Len2(d)); - b3MprVec3Scale(d, k); -} - -inline void b3MprVec3Cross(b3Float4 *d, const b3Float4 *a, const b3Float4 *b) -{ - *d = b3Cross3(*a, *b); -} - -inline void b3MprVec3Sub2(b3Float4 *d, const b3Float4 *v, const b3Float4 *w) -{ - *d = *v - *w; -} - -inline void b3PortalDir(const b3MprSimplex_t *portal, b3Float4 *dir) -{ - b3Float4 v2v1, v3v1; - - b3MprVec3Sub2(&v2v1, &b3MprSimplexPoint(portal, 2)->v, - &b3MprSimplexPoint(portal, 1)->v); - b3MprVec3Sub2(&v3v1, &b3MprSimplexPoint(portal, 3)->v, - &b3MprSimplexPoint(portal, 1)->v); - b3MprVec3Cross(dir, &v2v1, &v3v1); - b3MprVec3Normalize(dir); -} - -inline int portalEncapsulesOrigin(const b3MprSimplex_t *portal, - const b3Float4 *dir) -{ - float dot; - dot = b3MprVec3Dot(dir, &b3MprSimplexPoint(portal, 1)->v); - return b3MprIsZero(dot) || dot > 0.f; -} - -inline int portalReachTolerance(const b3MprSimplex_t *portal, - const b3MprSupport_t *v4, - const b3Float4 *dir) -{ - float dv1, dv2, dv3, dv4; - float dot1, dot2, dot3; - - // find the smallest dot product of dir and {v1-v4, v2-v4, v3-v4} - - dv1 = b3MprVec3Dot(&b3MprSimplexPoint(portal, 1)->v, dir); - dv2 = b3MprVec3Dot(&b3MprSimplexPoint(portal, 2)->v, dir); - dv3 = b3MprVec3Dot(&b3MprSimplexPoint(portal, 3)->v, dir); - dv4 = b3MprVec3Dot(&v4->v, dir); - - dot1 = dv4 - dv1; - dot2 = dv4 - dv2; - dot3 = dv4 - dv3; - - dot1 = B3_MPR_FMIN(dot1, dot2); - dot1 = B3_MPR_FMIN(dot1, dot3); - - return b3MprEq(dot1, B3_MPR_TOLERANCE) || dot1 < B3_MPR_TOLERANCE; -} - -inline int portalCanEncapsuleOrigin(const b3MprSimplex_t *portal, - const b3MprSupport_t *v4, - const b3Float4 *dir) -{ - float dot; - dot = b3MprVec3Dot(&v4->v, dir); - return b3MprIsZero(dot) || dot > 0.f; -} - -inline void b3ExpandPortal(b3MprSimplex_t *portal, - const b3MprSupport_t *v4) -{ - float dot; - b3Float4 v4v0; - - b3MprVec3Cross(&v4v0, &v4->v, &b3MprSimplexPoint(portal, 0)->v); - dot = b3MprVec3Dot(&b3MprSimplexPoint(portal, 1)->v, &v4v0); - if (dot > 0.f) - { - dot = b3MprVec3Dot(&b3MprSimplexPoint(portal, 2)->v, &v4v0); - if (dot > 0.f) - { - b3MprSimplexSet(portal, 1, v4); - } - else - { - b3MprSimplexSet(portal, 3, v4); - } - } - else - { - dot = b3MprVec3Dot(&b3MprSimplexPoint(portal, 3)->v, &v4v0); - if (dot > 0.f) - { - b3MprSimplexSet(portal, 2, v4); - } - else - { - b3MprSimplexSet(portal, 1, v4); - } - } -} - -B3_STATIC int b3DiscoverPortal(int pairIndex, int bodyIndexA, int bodyIndexB, b3ConstArray(b3RigidBodyData_t) cpuBodyBuf, - b3ConstArray(b3ConvexPolyhedronData_t) cpuConvexData, - b3ConstArray(b3Collidable_t) cpuCollidables, - b3ConstArray(b3Float4) cpuVertices, - __global b3Float4 *sepAxis, - __global int *hasSepAxis, - b3MprSimplex_t *portal) -{ - b3Float4 dir, va, vb; - float dot; - int cont; - - // vertex 0 is center of portal - b3FindOrigin(bodyIndexA, bodyIndexB, cpuBodyBuf, b3MprSimplexPointW(portal, 0)); - // vertex 0 is center of portal - b3MprSimplexSetSize(portal, 1); - - b3Float4 zero = b3MakeFloat4(0, 0, 0, 0); - b3Float4 *b3mpr_vec3_origin = &zero; - - if (b3MprVec3Eq(&b3MprSimplexPoint(portal, 0)->v, b3mpr_vec3_origin)) - { - // Portal's center lies on origin (0,0,0) => we know that objects - // intersect but we would need to know penetration info. - // So move center little bit... - b3MprVec3Set(&va, FLT_EPSILON * 10.f, 0.f, 0.f); - b3MprVec3Add(&b3MprSimplexPointW(portal, 0)->v, &va); - } - - // vertex 1 = support in direction of origin - b3MprVec3Copy(&dir, &b3MprSimplexPoint(portal, 0)->v); - b3MprVec3Scale(&dir, -1.f); - b3MprVec3Normalize(&dir); - - b3MprSupport(pairIndex, bodyIndexA, bodyIndexB, cpuBodyBuf, cpuConvexData, cpuCollidables, cpuVertices, sepAxis, &dir, b3MprSimplexPointW(portal, 1)); - - b3MprSimplexSetSize(portal, 2); - - // test if origin isn't outside of v1 - dot = b3MprVec3Dot(&b3MprSimplexPoint(portal, 1)->v, &dir); - - if (b3MprIsZero(dot) || dot < 0.f) - return -1; - - // vertex 2 - b3MprVec3Cross(&dir, &b3MprSimplexPoint(portal, 0)->v, - &b3MprSimplexPoint(portal, 1)->v); - if (b3MprIsZero(b3MprVec3Len2(&dir))) - { - if (b3MprVec3Eq(&b3MprSimplexPoint(portal, 1)->v, b3mpr_vec3_origin)) - { - // origin lies on v1 - return 1; - } - else - { - // origin lies on v0-v1 segment - return 2; - } - } - - b3MprVec3Normalize(&dir); - b3MprSupport(pairIndex, bodyIndexA, bodyIndexB, cpuBodyBuf, cpuConvexData, cpuCollidables, cpuVertices, sepAxis, &dir, b3MprSimplexPointW(portal, 2)); - - dot = b3MprVec3Dot(&b3MprSimplexPoint(portal, 2)->v, &dir); - if (b3MprIsZero(dot) || dot < 0.f) - return -1; - - b3MprSimplexSetSize(portal, 3); - - // vertex 3 direction - b3MprVec3Sub2(&va, &b3MprSimplexPoint(portal, 1)->v, - &b3MprSimplexPoint(portal, 0)->v); - b3MprVec3Sub2(&vb, &b3MprSimplexPoint(portal, 2)->v, - &b3MprSimplexPoint(portal, 0)->v); - b3MprVec3Cross(&dir, &va, &vb); - b3MprVec3Normalize(&dir); - - // it is better to form portal faces to be oriented "outside" origin - dot = b3MprVec3Dot(&dir, &b3MprSimplexPoint(portal, 0)->v); - if (dot > 0.f) - { - b3MprSimplexSwap(portal, 1, 2); - b3MprVec3Scale(&dir, -1.f); - } - - while (b3MprSimplexSize(portal) < 4) - { - b3MprSupport(pairIndex, bodyIndexA, bodyIndexB, cpuBodyBuf, cpuConvexData, cpuCollidables, cpuVertices, sepAxis, &dir, b3MprSimplexPointW(portal, 3)); - - dot = b3MprVec3Dot(&b3MprSimplexPoint(portal, 3)->v, &dir); - if (b3MprIsZero(dot) || dot < 0.f) - return -1; - - cont = 0; - - // test if origin is outside (v1, v0, v3) - set v2 as v3 and - // continue - b3MprVec3Cross(&va, &b3MprSimplexPoint(portal, 1)->v, - &b3MprSimplexPoint(portal, 3)->v); - dot = b3MprVec3Dot(&va, &b3MprSimplexPoint(portal, 0)->v); - if (dot < 0.f && !b3MprIsZero(dot)) - { - b3MprSimplexSet(portal, 2, b3MprSimplexPoint(portal, 3)); - cont = 1; - } - - if (!cont) - { - // test if origin is outside (v3, v0, v2) - set v1 as v3 and - // continue - b3MprVec3Cross(&va, &b3MprSimplexPoint(portal, 3)->v, - &b3MprSimplexPoint(portal, 2)->v); - dot = b3MprVec3Dot(&va, &b3MprSimplexPoint(portal, 0)->v); - if (dot < 0.f && !b3MprIsZero(dot)) - { - b3MprSimplexSet(portal, 1, b3MprSimplexPoint(portal, 3)); - cont = 1; - } - } - - if (cont) - { - b3MprVec3Sub2(&va, &b3MprSimplexPoint(portal, 1)->v, - &b3MprSimplexPoint(portal, 0)->v); - b3MprVec3Sub2(&vb, &b3MprSimplexPoint(portal, 2)->v, - &b3MprSimplexPoint(portal, 0)->v); - b3MprVec3Cross(&dir, &va, &vb); - b3MprVec3Normalize(&dir); - } - else - { - b3MprSimplexSetSize(portal, 4); - } - } - - return 0; -} - -B3_STATIC int b3RefinePortal(int pairIndex, int bodyIndexA, int bodyIndexB, b3ConstArray(b3RigidBodyData_t) cpuBodyBuf, - b3ConstArray(b3ConvexPolyhedronData_t) cpuConvexData, - b3ConstArray(b3Collidable_t) cpuCollidables, - b3ConstArray(b3Float4) cpuVertices, - __global b3Float4 *sepAxis, - b3MprSimplex_t *portal) -{ - b3Float4 dir; - b3MprSupport_t v4; - - for (int i = 0; i < B3_MPR_MAX_ITERATIONS; i++) - //while (1) - { - // compute direction outside the portal (from v0 throught v1,v2,v3 - // face) - b3PortalDir(portal, &dir); - - // test if origin is inside the portal - if (portalEncapsulesOrigin(portal, &dir)) - return 0; - - // get next support point - - b3MprSupport(pairIndex, bodyIndexA, bodyIndexB, cpuBodyBuf, cpuConvexData, cpuCollidables, cpuVertices, sepAxis, &dir, &v4); - - // test if v4 can expand portal to contain origin and if portal - // expanding doesn't reach given tolerance - if (!portalCanEncapsuleOrigin(portal, &v4, &dir) || portalReachTolerance(portal, &v4, &dir)) - { - return -1; - } - - // v1-v2-v3 triangle must be rearranged to face outside Minkowski - // difference (direction from v0). - b3ExpandPortal(portal, &v4); - } - - return -1; -} - -B3_STATIC void b3FindPos(const b3MprSimplex_t *portal, b3Float4 *pos) -{ - b3Float4 zero = b3MakeFloat4(0, 0, 0, 0); - b3Float4 *b3mpr_vec3_origin = &zero; - - b3Float4 dir; - size_t i; - float b[4], sum, inv; - b3Float4 vec, p1, p2; - - b3PortalDir(portal, &dir); - - // use barycentric coordinates of tetrahedron to find origin - b3MprVec3Cross(&vec, &b3MprSimplexPoint(portal, 1)->v, - &b3MprSimplexPoint(portal, 2)->v); - b[0] = b3MprVec3Dot(&vec, &b3MprSimplexPoint(portal, 3)->v); - - b3MprVec3Cross(&vec, &b3MprSimplexPoint(portal, 3)->v, - &b3MprSimplexPoint(portal, 2)->v); - b[1] = b3MprVec3Dot(&vec, &b3MprSimplexPoint(portal, 0)->v); - - b3MprVec3Cross(&vec, &b3MprSimplexPoint(portal, 0)->v, - &b3MprSimplexPoint(portal, 1)->v); - b[2] = b3MprVec3Dot(&vec, &b3MprSimplexPoint(portal, 3)->v); - - b3MprVec3Cross(&vec, &b3MprSimplexPoint(portal, 2)->v, - &b3MprSimplexPoint(portal, 1)->v); - b[3] = b3MprVec3Dot(&vec, &b3MprSimplexPoint(portal, 0)->v); - - sum = b[0] + b[1] + b[2] + b[3]; - - if (b3MprIsZero(sum) || sum < 0.f) - { - b[0] = 0.f; - - b3MprVec3Cross(&vec, &b3MprSimplexPoint(portal, 2)->v, - &b3MprSimplexPoint(portal, 3)->v); - b[1] = b3MprVec3Dot(&vec, &dir); - b3MprVec3Cross(&vec, &b3MprSimplexPoint(portal, 3)->v, - &b3MprSimplexPoint(portal, 1)->v); - b[2] = b3MprVec3Dot(&vec, &dir); - b3MprVec3Cross(&vec, &b3MprSimplexPoint(portal, 1)->v, - &b3MprSimplexPoint(portal, 2)->v); - b[3] = b3MprVec3Dot(&vec, &dir); - - sum = b[1] + b[2] + b[3]; - } - - inv = 1.f / sum; - - b3MprVec3Copy(&p1, b3mpr_vec3_origin); - b3MprVec3Copy(&p2, b3mpr_vec3_origin); - for (i = 0; i < 4; i++) - { - b3MprVec3Copy(&vec, &b3MprSimplexPoint(portal, i)->v1); - b3MprVec3Scale(&vec, b[i]); - b3MprVec3Add(&p1, &vec); - - b3MprVec3Copy(&vec, &b3MprSimplexPoint(portal, i)->v2); - b3MprVec3Scale(&vec, b[i]); - b3MprVec3Add(&p2, &vec); - } - b3MprVec3Scale(&p1, inv); - b3MprVec3Scale(&p2, inv); - - b3MprVec3Copy(pos, &p1); - b3MprVec3Add(pos, &p2); - b3MprVec3Scale(pos, 0.5); -} - -inline float b3MprVec3Dist2(const b3Float4 *a, const b3Float4 *b) -{ - b3Float4 ab; - b3MprVec3Sub2(&ab, a, b); - return b3MprVec3Len2(&ab); -} - -inline float _b3MprVec3PointSegmentDist2(const b3Float4 *P, - const b3Float4 *x0, - const b3Float4 *b, - b3Float4 *witness) -{ - // The computation comes from solving equation of segment: - // S(t) = x0 + t.d - // where - x0 is initial point of segment - // - d is direction of segment from x0 (|d| > 0) - // - t belongs to <0, 1> interval - // - // Than, distance from a segment to some point P can be expressed: - // D(t) = |x0 + t.d - P|^2 - // which is distance from any point on segment. Minimization - // of this function brings distance from P to segment. - // Minimization of D(t) leads to simple quadratic equation that's - // solving is straightforward. - // - // Bonus of this method is witness point for free. - - float dist, t; - b3Float4 d, a; - - // direction of segment - b3MprVec3Sub2(&d, b, x0); - - // precompute vector from P to x0 - b3MprVec3Sub2(&a, x0, P); - - t = -1.f * b3MprVec3Dot(&a, &d); - t /= b3MprVec3Len2(&d); - - if (t < 0.f || b3MprIsZero(t)) - { - dist = b3MprVec3Dist2(x0, P); - if (witness) - b3MprVec3Copy(witness, x0); - } - else if (t > 1.f || b3MprEq(t, 1.f)) - { - dist = b3MprVec3Dist2(b, P); - if (witness) - b3MprVec3Copy(witness, b); - } - else - { - if (witness) - { - b3MprVec3Copy(witness, &d); - b3MprVec3Scale(witness, t); - b3MprVec3Add(witness, x0); - dist = b3MprVec3Dist2(witness, P); - } - else - { - // recycling variables - b3MprVec3Scale(&d, t); - b3MprVec3Add(&d, &a); - dist = b3MprVec3Len2(&d); - } - } - - return dist; -} - -inline float b3MprVec3PointTriDist2(const b3Float4 *P, - const b3Float4 *x0, const b3Float4 *B, - const b3Float4 *C, - b3Float4 *witness) -{ - // Computation comes from analytic expression for triangle (x0, B, C) - // T(s, t) = x0 + s.d1 + t.d2, where d1 = B - x0 and d2 = C - x0 and - // Then equation for distance is: - // D(s, t) = | T(s, t) - P |^2 - // This leads to minimization of quadratic function of two variables. - // The solution from is taken only if s is between 0 and 1, t is - // between 0 and 1 and t + s < 1, otherwise distance from segment is - // computed. - - b3Float4 d1, d2, a; - float u, v, w, p, q, r; - float s, t, dist, dist2; - b3Float4 witness2; - - b3MprVec3Sub2(&d1, B, x0); - b3MprVec3Sub2(&d2, C, x0); - b3MprVec3Sub2(&a, x0, P); - - u = b3MprVec3Dot(&a, &a); - v = b3MprVec3Dot(&d1, &d1); - w = b3MprVec3Dot(&d2, &d2); - p = b3MprVec3Dot(&a, &d1); - q = b3MprVec3Dot(&a, &d2); - r = b3MprVec3Dot(&d1, &d2); - - s = (q * r - w * p) / (w * v - r * r); - t = (-s * r - q) / w; - - if ((b3MprIsZero(s) || s > 0.f) && (b3MprEq(s, 1.f) || s < 1.f) && (b3MprIsZero(t) || t > 0.f) && (b3MprEq(t, 1.f) || t < 1.f) && (b3MprEq(t + s, 1.f) || t + s < 1.f)) - { - if (witness) - { - b3MprVec3Scale(&d1, s); - b3MprVec3Scale(&d2, t); - b3MprVec3Copy(witness, x0); - b3MprVec3Add(witness, &d1); - b3MprVec3Add(witness, &d2); - - dist = b3MprVec3Dist2(witness, P); - } - else - { - dist = s * s * v; - dist += t * t * w; - dist += 2.f * s * t * r; - dist += 2.f * s * p; - dist += 2.f * t * q; - dist += u; - } - } - else - { - dist = _b3MprVec3PointSegmentDist2(P, x0, B, witness); - - dist2 = _b3MprVec3PointSegmentDist2(P, x0, C, &witness2); - if (dist2 < dist) - { - dist = dist2; - if (witness) - b3MprVec3Copy(witness, &witness2); - } - - dist2 = _b3MprVec3PointSegmentDist2(P, B, C, &witness2); - if (dist2 < dist) - { - dist = dist2; - if (witness) - b3MprVec3Copy(witness, &witness2); - } - } - - return dist; -} - -B3_STATIC void b3FindPenetr(int pairIndex, int bodyIndexA, int bodyIndexB, b3ConstArray(b3RigidBodyData_t) cpuBodyBuf, - b3ConstArray(b3ConvexPolyhedronData_t) cpuConvexData, - b3ConstArray(b3Collidable_t) cpuCollidables, - b3ConstArray(b3Float4) cpuVertices, - __global b3Float4 *sepAxis, - b3MprSimplex_t *portal, - float *depth, b3Float4 *pdir, b3Float4 *pos) -{ - b3Float4 dir; - b3MprSupport_t v4; - unsigned long iterations; - - b3Float4 zero = b3MakeFloat4(0, 0, 0, 0); - b3Float4 *b3mpr_vec3_origin = &zero; - - iterations = 1UL; - for (int i = 0; i < B3_MPR_MAX_ITERATIONS; i++) - //while (1) - { - // compute portal direction and obtain next support point - b3PortalDir(portal, &dir); - - b3MprSupport(pairIndex, bodyIndexA, bodyIndexB, cpuBodyBuf, cpuConvexData, cpuCollidables, cpuVertices, sepAxis, &dir, &v4); - - // reached tolerance -> find penetration info - if (portalReachTolerance(portal, &v4, &dir) || iterations == B3_MPR_MAX_ITERATIONS) - { - *depth = b3MprVec3PointTriDist2(b3mpr_vec3_origin, &b3MprSimplexPoint(portal, 1)->v, &b3MprSimplexPoint(portal, 2)->v, &b3MprSimplexPoint(portal, 3)->v, pdir); - *depth = B3_MPR_SQRT(*depth); - - if (b3MprIsZero((*pdir).x) && b3MprIsZero((*pdir).y) && b3MprIsZero((*pdir).z)) - { - *pdir = dir; - } - b3MprVec3Normalize(pdir); - - // barycentric coordinates: - b3FindPos(portal, pos); - - return; - } - - b3ExpandPortal(portal, &v4); - - iterations++; - } -} - -B3_STATIC void b3FindPenetrTouch(b3MprSimplex_t *portal, float *depth, b3Float4 *dir, b3Float4 *pos) -{ - // Touching contact on portal's v1 - so depth is zero and direction - // is unimportant and pos can be guessed - *depth = 0.f; - b3Float4 zero = b3MakeFloat4(0, 0, 0, 0); - b3Float4 *b3mpr_vec3_origin = &zero; - - b3MprVec3Copy(dir, b3mpr_vec3_origin); - - b3MprVec3Copy(pos, &b3MprSimplexPoint(portal, 1)->v1); - b3MprVec3Add(pos, &b3MprSimplexPoint(portal, 1)->v2); - b3MprVec3Scale(pos, 0.5); -} - -B3_STATIC void b3FindPenetrSegment(b3MprSimplex_t *portal, - float *depth, b3Float4 *dir, b3Float4 *pos) -{ - // Origin lies on v0-v1 segment. - // Depth is distance to v1, direction also and position must be - // computed - - b3MprVec3Copy(pos, &b3MprSimplexPoint(portal, 1)->v1); - b3MprVec3Add(pos, &b3MprSimplexPoint(portal, 1)->v2); - b3MprVec3Scale(pos, 0.5f); - - b3MprVec3Copy(dir, &b3MprSimplexPoint(portal, 1)->v); - *depth = B3_MPR_SQRT(b3MprVec3Len2(dir)); - b3MprVec3Normalize(dir); -} - -inline int b3MprPenetration(int pairIndex, int bodyIndexA, int bodyIndexB, - b3ConstArray(b3RigidBodyData_t) cpuBodyBuf, - b3ConstArray(b3ConvexPolyhedronData_t) cpuConvexData, - b3ConstArray(b3Collidable_t) cpuCollidables, - b3ConstArray(b3Float4) cpuVertices, - __global b3Float4 *sepAxis, - __global int *hasSepAxis, - float *depthOut, b3Float4 *dirOut, b3Float4 *posOut) -{ - b3MprSimplex_t portal; - - // if (!hasSepAxis[pairIndex]) - // return -1; - - hasSepAxis[pairIndex] = 0; - int res; - - // Phase 1: Portal discovery - res = b3DiscoverPortal(pairIndex, bodyIndexA, bodyIndexB, cpuBodyBuf, cpuConvexData, cpuCollidables, cpuVertices, sepAxis, hasSepAxis, &portal); - - //sepAxis[pairIndex] = *pdir;//or -dir? - - switch (res) - { - case 0: - { - // Phase 2: Portal refinement - - res = b3RefinePortal(pairIndex, bodyIndexA, bodyIndexB, cpuBodyBuf, cpuConvexData, cpuCollidables, cpuVertices, sepAxis, &portal); - if (res < 0) - return -1; - - // Phase 3. Penetration info - b3FindPenetr(pairIndex, bodyIndexA, bodyIndexB, cpuBodyBuf, cpuConvexData, cpuCollidables, cpuVertices, sepAxis, &portal, depthOut, dirOut, posOut); - hasSepAxis[pairIndex] = 1; - sepAxis[pairIndex] = -*dirOut; - break; - } - case 1: - { - // Touching contact on portal's v1. - b3FindPenetrTouch(&portal, depthOut, dirOut, posOut); - break; - } - case 2: - { - b3FindPenetrSegment(&portal, depthOut, dirOut, posOut); - break; - } - default: - { - hasSepAxis[pairIndex] = 0; - //if (res < 0) - //{ - // Origin isn't inside portal - no collision. - return -1; - //} - } - }; - - return 0; -}; - -#endif //B3_MPR_PENETRATION_H diff --git a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3NewContactReduction.h b/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3NewContactReduction.h deleted file mode 100644 index 6e991e14..00000000 --- a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3NewContactReduction.h +++ /dev/null @@ -1,175 +0,0 @@ - -#ifndef B3_NEW_CONTACT_REDUCTION_H -#define B3_NEW_CONTACT_REDUCTION_H - -#include "Bullet3Common/shared/b3Float4.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3RigidBodyData.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3Contact4Data.h" - -#define GET_NPOINTS(x) (x).m_worldNormalOnB.w - -int b3ExtractManifoldSequentialGlobal(__global const b3Float4* p, int nPoints, b3Float4ConstArg nearNormal, b3Int4* contactIdx) -{ - if (nPoints == 0) - return 0; - - if (nPoints <= 4) - return nPoints; - - if (nPoints > 64) - nPoints = 64; - - b3Float4 center = b3MakeFloat4(0, 0, 0, 0); - { - for (int i = 0; i < nPoints; i++) - center += p[i]; - center /= (float)nPoints; - } - - // sample 4 directions - - b3Float4 aVector = p[0] - center; - b3Float4 u = b3Cross(nearNormal, aVector); - b3Float4 v = b3Cross(nearNormal, u); - u = b3Normalized(u); - v = b3Normalized(v); - - //keep point with deepest penetration - float minW = FLT_MAX; - - int minIndex = -1; - - b3Float4 maxDots; - maxDots.x = FLT_MIN; - maxDots.y = FLT_MIN; - maxDots.z = FLT_MIN; - maxDots.w = FLT_MIN; - - // idx, distance - for (int ie = 0; ie < nPoints; ie++) - { - if (p[ie].w < minW) - { - minW = p[ie].w; - minIndex = ie; - } - float f; - b3Float4 r = p[ie] - center; - f = b3Dot(u, r); - if (f < maxDots.x) - { - maxDots.x = f; - contactIdx[0].x = ie; - } - - f = b3Dot(-u, r); - if (f < maxDots.y) - { - maxDots.y = f; - contactIdx[0].y = ie; - } - - f = b3Dot(v, r); - if (f < maxDots.z) - { - maxDots.z = f; - contactIdx[0].z = ie; - } - - f = b3Dot(-v, r); - if (f < maxDots.w) - { - maxDots.w = f; - contactIdx[0].w = ie; - } - } - - if (contactIdx[0].x != minIndex && contactIdx[0].y != minIndex && contactIdx[0].z != minIndex && contactIdx[0].w != minIndex) - { - //replace the first contact with minimum (todo: replace contact with least penetration) - contactIdx[0].x = minIndex; - } - - return 4; -} - -__kernel void b3NewContactReductionKernel(__global b3Int4* pairs, - __global const b3RigidBodyData_t* rigidBodies, - __global const b3Float4* separatingNormals, - __global const int* hasSeparatingAxis, - __global struct b3Contact4Data* globalContactsOut, - __global b3Int4* clippingFaces, - __global b3Float4* worldVertsB2, - volatile __global int* nGlobalContactsOut, - int vertexFaceCapacity, - int contactCapacity, - int numPairs, - int pairIndex) -{ - // int i = get_global_id(0); - //int pairIndex = i; - int i = pairIndex; - - b3Int4 contactIdx; - contactIdx = b3MakeInt4(0, 1, 2, 3); - - if (i < numPairs) - { - if (hasSeparatingAxis[i]) - { - int nPoints = clippingFaces[pairIndex].w; - - if (nPoints > 0) - { - __global b3Float4* pointsIn = &worldVertsB2[pairIndex * vertexFaceCapacity]; - b3Float4 normal = -separatingNormals[i]; - - int nReducedContacts = b3ExtractManifoldSequentialGlobal(pointsIn, nPoints, normal, &contactIdx); - - int dstIdx; - dstIdx = b3AtomicInc(nGlobalContactsOut); - - //#if 0 - b3Assert(dstIdx < contactCapacity); - if (dstIdx < contactCapacity) - { - __global struct b3Contact4Data* c = &globalContactsOut[dstIdx]; - c->m_worldNormalOnB = -normal; - c->m_restituitionCoeffCmp = (0.f * 0xffff); - c->m_frictionCoeffCmp = (0.7f * 0xffff); - c->m_batchIdx = pairIndex; - int bodyA = pairs[pairIndex].x; - int bodyB = pairs[pairIndex].y; - - pairs[pairIndex].w = dstIdx; - - c->m_bodyAPtrAndSignBit = rigidBodies[bodyA].m_invMass == 0 ? -bodyA : bodyA; - c->m_bodyBPtrAndSignBit = rigidBodies[bodyB].m_invMass == 0 ? -bodyB : bodyB; - c->m_childIndexA = -1; - c->m_childIndexB = -1; - - switch (nReducedContacts) - { - case 4: - c->m_worldPosB[3] = pointsIn[contactIdx.w]; - case 3: - c->m_worldPosB[2] = pointsIn[contactIdx.z]; - case 2: - c->m_worldPosB[1] = pointsIn[contactIdx.y]; - case 1: - c->m_worldPosB[0] = pointsIn[contactIdx.x]; - default: - { - } - }; - - GET_NPOINTS(*c) = nReducedContacts; - } - - //#endif - - } // if (numContactsOut>0) - } // if (hasSeparatingAxis[i]) - } // if (im_escapeIndexOrTriangleIndex & ~(y)); -} - -inline int b3IsLeaf(const b3QuantizedBvhNodeData* rootNode) -{ - //skipindex is negative (internal node), triangleindex >=0 (leafnode) - return (rootNode->m_escapeIndexOrTriangleIndex >= 0) ? 1 : 0; -} - -inline int b3GetEscapeIndex(const b3QuantizedBvhNodeData* rootNode) -{ - return -rootNode->m_escapeIndexOrTriangleIndex; -} - -inline void b3QuantizeWithClamp(unsigned short* out, b3Float4ConstArg point2, int isMax, b3Float4ConstArg bvhAabbMin, b3Float4ConstArg bvhAabbMax, b3Float4ConstArg bvhQuantization) -{ - b3Float4 clampedPoint = b3MaxFloat4(point2, bvhAabbMin); - clampedPoint = b3MinFloat4(clampedPoint, bvhAabbMax); - - b3Float4 v = (clampedPoint - bvhAabbMin) * bvhQuantization; - if (isMax) - { - out[0] = (unsigned short)(((unsigned short)(v.x + 1.f) | 1)); - out[1] = (unsigned short)(((unsigned short)(v.y + 1.f) | 1)); - out[2] = (unsigned short)(((unsigned short)(v.z + 1.f) | 1)); - } - else - { - out[0] = (unsigned short)(((unsigned short)(v.x) & 0xfffe)); - out[1] = (unsigned short)(((unsigned short)(v.y) & 0xfffe)); - out[2] = (unsigned short)(((unsigned short)(v.z) & 0xfffe)); - } -} - -inline int b3TestQuantizedAabbAgainstQuantizedAabbSlow( - const unsigned short int* aabbMin1, - const unsigned short int* aabbMax1, - const unsigned short int* aabbMin2, - const unsigned short int* aabbMax2) -{ - //int overlap = 1; - if (aabbMin1[0] > aabbMax2[0]) - return 0; - if (aabbMax1[0] < aabbMin2[0]) - return 0; - if (aabbMin1[1] > aabbMax2[1]) - return 0; - if (aabbMax1[1] < aabbMin2[1]) - return 0; - if (aabbMin1[2] > aabbMax2[2]) - return 0; - if (aabbMax1[2] < aabbMin2[2]) - return 0; - return 1; - //overlap = ((aabbMin1[0] > aabbMax2[0]) || (aabbMax1[0] < aabbMin2[0])) ? 0 : overlap; - //overlap = ((aabbMin1[2] > aabbMax2[2]) || (aabbMax1[2] < aabbMin2[2])) ? 0 : overlap; - //overlap = ((aabbMin1[1] > aabbMax2[1]) || (aabbMax1[1] < aabbMin2[1])) ? 0 : overlap; - //return overlap; -} - -#endif //B3_QUANTIZED_BVH_NODE_H diff --git a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ReduceContacts.h b/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ReduceContacts.h deleted file mode 100644 index c108255b..00000000 --- a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ReduceContacts.h +++ /dev/null @@ -1,89 +0,0 @@ -#ifndef B3_REDUCE_CONTACTS_H -#define B3_REDUCE_CONTACTS_H - -inline int b3ReduceContacts(const b3Float4* p, int nPoints, const b3Float4& nearNormal, b3Int4* contactIdx) -{ - if (nPoints == 0) - return 0; - - if (nPoints <= 4) - return nPoints; - - if (nPoints > 64) - nPoints = 64; - - b3Float4 center = b3MakeFloat4(0, 0, 0, 0); - { - for (int i = 0; i < nPoints; i++) - center += p[i]; - center /= (float)nPoints; - } - - // sample 4 directions - - b3Float4 aVector = p[0] - center; - b3Float4 u = b3Cross3(nearNormal, aVector); - b3Float4 v = b3Cross3(nearNormal, u); - u = b3FastNormalized3(u); - v = b3FastNormalized3(v); - - //keep point with deepest penetration - float minW = FLT_MAX; - - int minIndex = -1; - - b3Float4 maxDots; - maxDots.x = FLT_MIN; - maxDots.y = FLT_MIN; - maxDots.z = FLT_MIN; - maxDots.w = FLT_MIN; - - // idx, distance - for (int ie = 0; ie < nPoints; ie++) - { - if (p[ie].w < minW) - { - minW = p[ie].w; - minIndex = ie; - } - float f; - b3Float4 r = p[ie] - center; - f = b3Dot3F4(u, r); - if (f < maxDots.x) - { - maxDots.x = f; - contactIdx[0].x = ie; - } - - f = b3Dot3F4(-u, r); - if (f < maxDots.y) - { - maxDots.y = f; - contactIdx[0].y = ie; - } - - f = b3Dot3F4(v, r); - if (f < maxDots.z) - { - maxDots.z = f; - contactIdx[0].z = ie; - } - - f = b3Dot3F4(-v, r); - if (f < maxDots.w) - { - maxDots.w = f; - contactIdx[0].w = ie; - } - } - - if (contactIdx[0].x != minIndex && contactIdx[0].y != minIndex && contactIdx[0].z != minIndex && contactIdx[0].w != minIndex) - { - //replace the first contact with minimum (todo: replace contact with least penetration) - contactIdx[0].x = minIndex; - } - - return 4; -} - -#endif //B3_REDUCE_CONTACTS_H diff --git a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3RigidBodyData.h b/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3RigidBodyData.h deleted file mode 100644 index 663e946f..00000000 --- a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3RigidBodyData.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef B3_RIGIDBODY_DATA_H -#define B3_RIGIDBODY_DATA_H - -#include "Bullet3Common/shared/b3Float4.h" -#include "Bullet3Common/shared/b3Quat.h" -#include "Bullet3Common/shared/b3Mat3x3.h" - -typedef struct b3RigidBodyData b3RigidBodyData_t; - -struct b3RigidBodyData -{ - b3Float4 m_pos; - b3Quat m_quat; - b3Float4 m_linVel; - b3Float4 m_angVel; - - int m_collidableIdx; - float m_invMass; - float m_restituitionCoeff; - float m_frictionCoeff; -}; - -typedef struct b3InertiaData b3InertiaData_t; - -struct b3InertiaData -{ - b3Mat3x3 m_invInertiaWorld; - b3Mat3x3 m_initInvInertia; -}; - -#endif //B3_RIGIDBODY_DATA_H diff --git a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3UpdateAabbs.h b/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3UpdateAabbs.h deleted file mode 100644 index e0c3a5cf..00000000 --- a/engine/inc/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3UpdateAabbs.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef B3_UPDATE_AABBS_H -#define B3_UPDATE_AABBS_H - -#include "Bullet3Collision/BroadPhaseCollision/shared/b3Aabb.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3Collidable.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3RigidBodyData.h" - -void b3ComputeWorldAabb(int bodyId, __global const b3RigidBodyData_t* bodies, __global const b3Collidable_t* collidables, __global const b3Aabb_t* localShapeAABB, __global b3Aabb_t* worldAabbs) -{ - __global const b3RigidBodyData_t* body = &bodies[bodyId]; - - b3Float4 position = body->m_pos; - b3Quat orientation = body->m_quat; - - int collidableIndex = body->m_collidableIdx; - int shapeIndex = collidables[collidableIndex].m_shapeIndex; - - if (shapeIndex >= 0) - { - b3Aabb_t localAabb = localShapeAABB[collidableIndex]; - b3Aabb_t worldAabb; - - b3Float4 aabbAMinOut, aabbAMaxOut; - float margin = 0.f; - b3TransformAabb2(localAabb.m_minVec, localAabb.m_maxVec, margin, position, orientation, &aabbAMinOut, &aabbAMaxOut); - - worldAabb.m_minVec = aabbAMinOut; - worldAabb.m_minIndices[3] = bodyId; - worldAabb.m_maxVec = aabbAMaxOut; - worldAabb.m_signedMaxIndices[3] = body[bodyId].m_invMass == 0.f ? 0 : 1; - worldAabbs[bodyId] = worldAabb; - } -} - -#endif //B3_UPDATE_AABBS_H diff --git a/engine/inc/bullet/Bullet3Common/b3AlignedAllocator.h b/engine/inc/bullet/Bullet3Common/b3AlignedAllocator.h deleted file mode 100644 index bcff9f12..00000000 --- a/engine/inc/bullet/Bullet3Common/b3AlignedAllocator.h +++ /dev/null @@ -1,110 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2013 Erwin Coumans http://bulletphysics.org - -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 B3_ALIGNED_ALLOCATOR -#define B3_ALIGNED_ALLOCATOR - -///we probably replace this with our own aligned memory allocator -///so we replace _aligned_malloc and _aligned_free with our own -///that is better portable and more predictable - -#include "b3Scalar.h" -//#define B3_DEBUG_MEMORY_ALLOCATIONS 1 -#ifdef B3_DEBUG_MEMORY_ALLOCATIONS - -#define b3AlignedAlloc(a, b) \ - b3AlignedAllocInternal(a, b, __LINE__, __FILE__) - -#define b3AlignedFree(ptr) \ - b3AlignedFreeInternal(ptr, __LINE__, __FILE__) - -void* b3AlignedAllocInternal(size_t size, int alignment, int line, char* filename); - -void b3AlignedFreeInternal(void* ptr, int line, char* filename); - -#else -void* b3AlignedAllocInternal(size_t size, int alignment); -void b3AlignedFreeInternal(void* ptr); - -#define b3AlignedAlloc(size, alignment) b3AlignedAllocInternal(size, alignment) -#define b3AlignedFree(ptr) b3AlignedFreeInternal(ptr) - -#endif -typedef int btSizeType; - -typedef void*(b3AlignedAllocFunc)(size_t size, int alignment); -typedef void(b3AlignedFreeFunc)(void* memblock); -typedef void*(b3AllocFunc)(size_t size); -typedef void(b3FreeFunc)(void* memblock); - -///The developer can let all Bullet memory allocations go through a custom memory allocator, using b3AlignedAllocSetCustom -void b3AlignedAllocSetCustom(b3AllocFunc* allocFunc, b3FreeFunc* freeFunc); -///If the developer has already an custom aligned allocator, then b3AlignedAllocSetCustomAligned can be used. The default aligned allocator pre-allocates extra memory using the non-aligned allocator, and instruments it. -void b3AlignedAllocSetCustomAligned(b3AlignedAllocFunc* allocFunc, b3AlignedFreeFunc* freeFunc); - -///The b3AlignedAllocator is a portable class for aligned memory allocations. -///Default implementations for unaligned and aligned allocations can be overridden by a custom allocator using b3AlignedAllocSetCustom and b3AlignedAllocSetCustomAligned. -template -class b3AlignedAllocator -{ - typedef b3AlignedAllocator self_type; - -public: - //just going down a list: - b3AlignedAllocator() {} - /* - b3AlignedAllocator( const self_type & ) {} - */ - - template - b3AlignedAllocator(const b3AlignedAllocator&) - { - } - - typedef const T* const_pointer; - typedef const T& const_reference; - typedef T* pointer; - typedef T& reference; - typedef T value_type; - - pointer address(reference ref) const { return &ref; } - const_pointer address(const_reference ref) const { return &ref; } - pointer allocate(btSizeType n, const_pointer* hint = 0) - { - (void)hint; - return reinterpret_cast(b3AlignedAlloc(sizeof(value_type) * n, Alignment)); - } - void construct(pointer ptr, const value_type& value) { new (ptr) value_type(value); } - void deallocate(pointer ptr) - { - b3AlignedFree(reinterpret_cast(ptr)); - } - void destroy(pointer ptr) { ptr->~value_type(); } - - template - struct rebind - { - typedef b3AlignedAllocator other; - }; - template - self_type& operator=(const b3AlignedAllocator&) - { - return *this; - } - - friend bool operator==(const self_type&, const self_type&) { return true; } -}; - -#endif //B3_ALIGNED_ALLOCATOR diff --git a/engine/inc/bullet/Bullet3Common/b3AlignedObjectArray.h b/engine/inc/bullet/Bullet3Common/b3AlignedObjectArray.h deleted file mode 100644 index 249e381b..00000000 --- a/engine/inc/bullet/Bullet3Common/b3AlignedObjectArray.h +++ /dev/null @@ -1,522 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2013 Erwin Coumans http://bulletphysics.org - -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 B3_OBJECT_ARRAY__ -#define B3_OBJECT_ARRAY__ - -#include "b3Scalar.h" // has definitions like B3_FORCE_INLINE -#include "b3AlignedAllocator.h" - -///If the platform doesn't support placement new, you can disable B3_USE_PLACEMENT_NEW -///then the b3AlignedObjectArray doesn't support objects with virtual methods, and non-trivial constructors/destructors -///You can enable B3_USE_MEMCPY, then swapping elements in the array will use memcpy instead of operator= -///see discussion here: http://continuousphysics.com/Bullet/phpBB2/viewtopic.php?t=1231 and -///http://www.continuousphysics.com/Bullet/phpBB2/viewtopic.php?t=1240 - -#define B3_USE_PLACEMENT_NEW 1 -//#define B3_USE_MEMCPY 1 //disable, because it is cumbersome to find out for each platform where memcpy is defined. It can be in or or otherwise... -#define B3_ALLOW_ARRAY_COPY_OPERATOR // enabling this can accidently perform deep copies of data if you are not careful - -#ifdef B3_USE_MEMCPY -#include -#include -#endif //B3_USE_MEMCPY - -#ifdef B3_USE_PLACEMENT_NEW -#include //for placement new -#endif //B3_USE_PLACEMENT_NEW - -///The b3AlignedObjectArray template class uses a subset of the stl::vector interface for its methods -///It is developed to replace stl::vector to avoid portability issues, including STL alignment issues to add SIMD/SSE data -template -//template -class b3AlignedObjectArray -{ - b3AlignedAllocator m_allocator; - - int m_size; - int m_capacity; - T* m_data; - //PCK: added this line - bool m_ownsMemory; - -#ifdef B3_ALLOW_ARRAY_COPY_OPERATOR -public: - B3_FORCE_INLINE b3AlignedObjectArray& operator=(const b3AlignedObjectArray& other) - { - copyFromArray(other); - return *this; - } -#else //B3_ALLOW_ARRAY_COPY_OPERATOR -private: - B3_FORCE_INLINE b3AlignedObjectArray& operator=(const b3AlignedObjectArray& other); -#endif //B3_ALLOW_ARRAY_COPY_OPERATOR - -protected: - B3_FORCE_INLINE int allocSize(int size) - { - return (size ? size * 2 : 1); - } - B3_FORCE_INLINE void copy(int start, int end, T* dest) const - { - int i; - for (i = start; i < end; ++i) -#ifdef B3_USE_PLACEMENT_NEW - new (&dest[i]) T(m_data[i]); -#else - dest[i] = m_data[i]; -#endif //B3_USE_PLACEMENT_NEW - } - - B3_FORCE_INLINE void init() - { - //PCK: added this line - m_ownsMemory = true; - m_data = 0; - m_size = 0; - m_capacity = 0; - } - B3_FORCE_INLINE void destroy(int first, int last) - { - int i; - for (i = first; i < last; i++) - { - m_data[i].~T(); - } - } - - B3_FORCE_INLINE void* allocate(int size) - { - if (size) - return m_allocator.allocate(size); - return 0; - } - - B3_FORCE_INLINE void deallocate() - { - if (m_data) - { - //PCK: enclosed the deallocation in this block - if (m_ownsMemory) - { - m_allocator.deallocate(m_data); - } - m_data = 0; - } - } - -public: - b3AlignedObjectArray() - { - init(); - } - - ~b3AlignedObjectArray() - { - clear(); - } - - ///Generally it is best to avoid using the copy constructor of an b3AlignedObjectArray, and use a (const) reference to the array instead. - b3AlignedObjectArray(const b3AlignedObjectArray& otherArray) - { - init(); - - int otherSize = otherArray.size(); - resize(otherSize); - otherArray.copy(0, otherSize, m_data); - } - - /// return the number of elements in the array - B3_FORCE_INLINE int size() const - { - return m_size; - } - - B3_FORCE_INLINE const T& at(int n) const - { - b3Assert(n >= 0); - b3Assert(n < size()); - return m_data[n]; - } - - B3_FORCE_INLINE T& at(int n) - { - b3Assert(n >= 0); - b3Assert(n < size()); - return m_data[n]; - } - - B3_FORCE_INLINE const T& operator[](int n) const - { - b3Assert(n >= 0); - b3Assert(n < size()); - return m_data[n]; - } - - B3_FORCE_INLINE T& operator[](int n) - { - b3Assert(n >= 0); - b3Assert(n < size()); - return m_data[n]; - } - - ///clear the array, deallocated memory. Generally it is better to use array.resize(0), to reduce performance overhead of run-time memory (de)allocations. - B3_FORCE_INLINE void clear() - { - destroy(0, size()); - - deallocate(); - - init(); - } - - B3_FORCE_INLINE void pop_back() - { - b3Assert(m_size > 0); - m_size--; - m_data[m_size].~T(); - } - - ///resize changes the number of elements in the array. If the new size is larger, the new elements will be constructed using the optional second argument. - ///when the new number of elements is smaller, the destructor will be called, but memory will not be freed, to reduce performance overhead of run-time memory (de)allocations. - B3_FORCE_INLINE void resizeNoInitialize(int newsize) - { - int curSize = size(); - - if (newsize < curSize) - { - } - else - { - if (newsize > size()) - { - reserve(newsize); - } - //leave this uninitialized - } - m_size = newsize; - } - - B3_FORCE_INLINE void resize(int newsize, const T& fillData = T()) - { - int curSize = size(); - - if (newsize < curSize) - { - for (int i = newsize; i < curSize; i++) - { - m_data[i].~T(); - } - } - else - { - if (newsize > size()) - { - reserve(newsize); - } -#ifdef B3_USE_PLACEMENT_NEW - for (int i = curSize; i < newsize; i++) - { - new (&m_data[i]) T(fillData); - } -#endif //B3_USE_PLACEMENT_NEW - } - - m_size = newsize; - } - B3_FORCE_INLINE T& expandNonInitializing() - { - int sz = size(); - if (sz == capacity()) - { - reserve(allocSize(size())); - } - m_size++; - - return m_data[sz]; - } - - B3_FORCE_INLINE T& expand(const T& fillValue = T()) - { - int sz = size(); - if (sz == capacity()) - { - reserve(allocSize(size())); - } - m_size++; -#ifdef B3_USE_PLACEMENT_NEW - new (&m_data[sz]) T(fillValue); //use the in-place new (not really allocating heap memory) -#endif - - return m_data[sz]; - } - - B3_FORCE_INLINE void push_back(const T& _Val) - { - int sz = size(); - if (sz == capacity()) - { - reserve(allocSize(size())); - } - -#ifdef B3_USE_PLACEMENT_NEW - new (&m_data[m_size]) T(_Val); -#else - m_data[size()] = _Val; -#endif //B3_USE_PLACEMENT_NEW - - m_size++; - } - - /// return the pre-allocated (reserved) elements, this is at least as large as the total number of elements,see size() and reserve() - B3_FORCE_INLINE int capacity() const - { - return m_capacity; - } - - B3_FORCE_INLINE void reserve(int _Count) - { // determine new minimum length of allocated storage - if (capacity() < _Count) - { // not enough room, reallocate - T* s = (T*)allocate(_Count); - b3Assert(s); - if (s == 0) - { - b3Error("b3AlignedObjectArray reserve out-of-memory\n"); - _Count = 0; - m_size = 0; - } - copy(0, size(), s); - - destroy(0, size()); - - deallocate(); - - //PCK: added this line - m_ownsMemory = true; - - m_data = s; - - m_capacity = _Count; - } - } - - class less - { - public: - bool operator()(const T& a, const T& b) - { - return (a < b); - } - }; - - template - void quickSortInternal(const L& CompareFunc, int lo, int hi) - { - // lo is the lower index, hi is the upper index - // of the region of array a that is to be sorted - int i = lo, j = hi; - T x = m_data[(lo + hi) / 2]; - - // partition - do - { - while (CompareFunc(m_data[i], x)) - i++; - while (CompareFunc(x, m_data[j])) - j--; - if (i <= j) - { - swap(i, j); - i++; - j--; - } - } while (i <= j); - - // recursion - if (lo < j) - quickSortInternal(CompareFunc, lo, j); - if (i < hi) - quickSortInternal(CompareFunc, i, hi); - } - - template - void quickSort(const L& CompareFunc) - { - //don't sort 0 or 1 elements - if (size() > 1) - { - quickSortInternal(CompareFunc, 0, size() - 1); - } - } - - ///heap sort from http://www.csse.monash.edu.au/~lloyd/tildeAlgDS/Sort/Heap/ - template - void downHeap(T* pArr, int k, int n, const L& CompareFunc) - { - /* PRE: a[k+1..N] is a heap */ - /* POST: a[k..N] is a heap */ - - T temp = pArr[k - 1]; - /* k has child(s) */ - while (k <= n / 2) - { - int child = 2 * k; - - if ((child < n) && CompareFunc(pArr[child - 1], pArr[child])) - { - child++; - } - /* pick larger child */ - if (CompareFunc(temp, pArr[child - 1])) - { - /* move child up */ - pArr[k - 1] = pArr[child - 1]; - k = child; - } - else - { - break; - } - } - pArr[k - 1] = temp; - } /*downHeap*/ - - void swap(int index0, int index1) - { -#ifdef B3_USE_MEMCPY - char temp[sizeof(T)]; - memcpy(temp, &m_data[index0], sizeof(T)); - memcpy(&m_data[index0], &m_data[index1], sizeof(T)); - memcpy(&m_data[index1], temp, sizeof(T)); -#else - T temp = m_data[index0]; - m_data[index0] = m_data[index1]; - m_data[index1] = temp; -#endif //B3_USE_PLACEMENT_NEW - } - - template - void heapSort(const L& CompareFunc) - { - /* sort a[0..N-1], N.B. 0 to N-1 */ - int k; - int n = m_size; - for (k = n / 2; k > 0; k--) - { - downHeap(m_data, k, n, CompareFunc); - } - - /* a[1..N] is now a heap */ - while (n >= 1) - { - swap(0, n - 1); /* largest of a[0..n-1] */ - - n = n - 1; - /* restore a[1..i-1] heap */ - downHeap(m_data, 1, n, CompareFunc); - } - } - - ///non-recursive binary search, assumes sorted array - int findBinarySearch(const T& key) const - { - int first = 0; - int last = size() - 1; - - //assume sorted array - while (first <= last) - { - int mid = (first + last) / 2; // compute mid point. - if (key > m_data[mid]) - first = mid + 1; // repeat search in top half. - else if (key < m_data[mid]) - last = mid - 1; // repeat search in bottom half. - else - return mid; // found it. return position ///// - } - return size(); // failed to find key - } - - int findLinearSearch(const T& key) const - { - int index = size(); - int i; - - for (i = 0; i < size(); i++) - { - if (m_data[i] == key) - { - index = i; - break; - } - } - return index; - } - - int findLinearSearch2(const T& key) const - { - int index = -1; - int i; - - for (i = 0; i < size(); i++) - { - if (m_data[i] == key) - { - index = i; - break; - } - } - return index; - } - - void remove(const T& key) - { - int findIndex = findLinearSearch(key); - if (findIndex < size()) - { - swap(findIndex, size() - 1); - pop_back(); - } - } - - //PCK: whole function - void initializeFromBuffer(void* buffer, int size, int capacity) - { - clear(); - m_ownsMemory = false; - m_data = (T*)buffer; - m_size = size; - m_capacity = capacity; - } - - void copyFromArray(const b3AlignedObjectArray& otherArray) - { - int otherSize = otherArray.size(); - resize(otherSize); - otherArray.copy(0, otherSize, m_data); - } - - void removeAtIndex(int index) - { - if (index < size()) - { - swap(index, size() - 1); - pop_back(); - } - } -}; - -#endif //B3_OBJECT_ARRAY__ diff --git a/engine/inc/bullet/Bullet3Common/b3CommandLineArgs.h b/engine/inc/bullet/Bullet3Common/b3CommandLineArgs.h deleted file mode 100644 index 5fe4f25f..00000000 --- a/engine/inc/bullet/Bullet3Common/b3CommandLineArgs.h +++ /dev/null @@ -1,106 +0,0 @@ -#ifndef COMMAND_LINE_ARGS_H -#define COMMAND_LINE_ARGS_H - -/****************************************************************************** - * Command-line parsing - ******************************************************************************/ -#include -#include -#include -#include -#include -class b3CommandLineArgs -{ -protected: - std::map pairs; - -public: - // Constructor - b3CommandLineArgs(int argc, char **argv) - { - addArgs(argc, argv); - } - - void addArgs(int argc, char **argv) - { - for (int i = 1; i < argc; i++) - { - std::string arg = argv[i]; - - if ((arg.length() < 2) || (arg[0] != '-') || (arg[1] != '-')) - { - continue; - } - - std::string::size_type pos; - std::string key, val; - if ((pos = arg.find('=')) == std::string::npos) - { - key = std::string(arg, 2, arg.length() - 2); - val = ""; - } - else - { - key = std::string(arg, 2, pos - 2); - val = std::string(arg, pos + 1, arg.length() - 1); - } - - //only add new keys, don't replace existing - if (pairs.find(key) == pairs.end()) - { - pairs[key] = val; - } - } - } - - bool CheckCmdLineFlag(const char *arg_name) - { - std::map::iterator itr; - if ((itr = pairs.find(arg_name)) != pairs.end()) - { - return true; - } - return false; - } - - template - bool GetCmdLineArgument(const char *arg_name, T &val); - - int ParsedArgc() - { - return pairs.size(); - } -}; - -template -inline bool b3CommandLineArgs::GetCmdLineArgument(const char *arg_name, T &val) -{ - std::map::iterator itr; - if ((itr = pairs.find(arg_name)) != pairs.end()) - { - std::istringstream strstream(itr->second); - strstream >> val; - return true; - } - return false; -} - -template <> -inline bool b3CommandLineArgs::GetCmdLineArgument(const char *arg_name, char *&val) -{ - std::map::iterator itr; - if ((itr = pairs.find(arg_name)) != pairs.end()) - { - std::string s = itr->second; - val = (char *)malloc(sizeof(char) * (s.length() + 1)); - std::strcpy(val, s.c_str()); - return true; - } - else - { - val = NULL; - } - return false; -} - -#endif //COMMAND_LINE_ARGS_H diff --git a/engine/inc/bullet/Bullet3Common/b3FileUtils.h b/engine/inc/bullet/Bullet3Common/b3FileUtils.h deleted file mode 100644 index 9ded17ea..00000000 --- a/engine/inc/bullet/Bullet3Common/b3FileUtils.h +++ /dev/null @@ -1,133 +0,0 @@ -#ifndef B3_FILE_UTILS_H -#define B3_FILE_UTILS_H - -#include -#include "b3Scalar.h" -#include //ptrdiff_h -#include - -struct b3FileUtils -{ - b3FileUtils() - { - } - virtual ~b3FileUtils() - { - } - - static bool findFile(const char* orgFileName, char* relativeFileName, int maxRelativeFileNameMaxLen) - { - FILE* f = 0; - f = fopen(orgFileName, "rb"); - if (f) - { - //printf("original file found: [%s]\n", orgFileName); - sprintf(relativeFileName, "%s", orgFileName); - fclose(f); - return true; - } - - //printf("Trying various directories, relative to current working directory\n"); - const char* prefix[] = {"./", "./data/", "../data/", "../../data/", "../../../data/", "../../../../data/"}; - int numPrefixes = sizeof(prefix) / sizeof(const char*); - - f = 0; - bool fileFound = false; - - for (int i = 0; !f && i < numPrefixes; i++) - { -#ifdef _MSC_VER - sprintf_s(relativeFileName, maxRelativeFileNameMaxLen, "%s%s", prefix[i], orgFileName); -#else - sprintf(relativeFileName, "%s%s", prefix[i], orgFileName); -#endif - f = fopen(relativeFileName, "rb"); - if (f) - { - fileFound = true; - break; - } - } - if (f) - { - fclose(f); - } - - return fileFound; - } - - static const char* strip2(const char* name, const char* pattern) - { - size_t const patlen = strlen(pattern); - size_t patcnt = 0; - const char* oriptr; - const char* patloc; - // find how many times the pattern occurs in the original string - for (oriptr = name; (patloc = strstr(oriptr, pattern)); oriptr = patloc + patlen) - { - patcnt++; - } - return oriptr; - } - - static int extractPath(const char* fileName, char* path, int maxPathLength) - { - const char* stripped = strip2(fileName, "/"); - stripped = strip2(stripped, "\\"); - - ptrdiff_t len = stripped - fileName; - b3Assert((len + 1) < maxPathLength); - - if (len && ((len + 1) < maxPathLength)) - { - for (int i = 0; i < len; i++) - { - path[i] = fileName[i]; - } - path[len] = 0; - } - else - { - len = 0; - b3Assert(maxPathLength > 0); - if (maxPathLength > 0) - { - path[len] = 0; - } - } - return len; - } - - static char toLowerChar(const char t) - { - if (t >= (char)'A' && t <= (char)'Z') - return t + ((char)'a' - (char)'A'); - else - return t; - } - - static void toLower(char* str) - { - int len = strlen(str); - for (int i = 0; i < len; i++) - { - str[i] = toLowerChar(str[i]); - } - } - - /*static const char* strip2(const char* name, const char* pattern) - { - size_t const patlen = strlen(pattern); - size_t patcnt = 0; - const char * oriptr; - const char * patloc; - // find how many times the pattern occurs in the original string - for (oriptr = name; patloc = strstr(oriptr, pattern); oriptr = patloc + patlen) - { - patcnt++; - } - return oriptr; - } - */ -}; -#endif //B3_FILE_UTILS_H diff --git a/engine/inc/bullet/Bullet3Common/b3HashMap.h b/engine/inc/bullet/Bullet3Common/b3HashMap.h deleted file mode 100644 index 3009e2cf..00000000 --- a/engine/inc/bullet/Bullet3Common/b3HashMap.h +++ /dev/null @@ -1,462 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2013 Erwin Coumans http://bulletphysics.org - -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 B3_HASH_MAP_H -#define B3_HASH_MAP_H - -#include "b3AlignedObjectArray.h" - -#include - -///very basic hashable string implementation, compatible with b3HashMap -struct b3HashString -{ - std::string m_string; - unsigned int m_hash; - - B3_FORCE_INLINE unsigned int getHash() const - { - return m_hash; - } - - b3HashString(const char* name) - : m_string(name) - { - /* magic numbers from http://www.isthe.com/chongo/tech/comp/fnv/ */ - static const unsigned int InitialFNV = 2166136261u; - static const unsigned int FNVMultiple = 16777619u; - - /* Fowler / Noll / Vo (FNV) Hash */ - unsigned int hash = InitialFNV; - int len = m_string.length(); - for (int i = 0; i < len; i++) - { - hash = hash ^ (m_string[i]); /* xor the low 8 bits */ - hash = hash * FNVMultiple; /* multiply by the magic number */ - } - m_hash = hash; - } - - int portableStringCompare(const char* src, const char* dst) const - { - int ret = 0; - - while (!(ret = *(unsigned char*)src - *(unsigned char*)dst) && *dst) - ++src, ++dst; - - if (ret < 0) - ret = -1; - else if (ret > 0) - ret = 1; - - return (ret); - } - - bool equals(const b3HashString& other) const - { - return (m_string == other.m_string); - } -}; - -const int B3_HASH_NULL = 0xffffffff; - -class b3HashInt -{ - int m_uid; - -public: - b3HashInt(int uid) : m_uid(uid) - { - } - - int getUid1() const - { - return m_uid; - } - - void setUid1(int uid) - { - m_uid = uid; - } - - bool equals(const b3HashInt& other) const - { - return getUid1() == other.getUid1(); - } - //to our success - B3_FORCE_INLINE unsigned int getHash() const - { - int key = m_uid; - // Thomas Wang's hash - key += ~(key << 15); - key ^= (key >> 10); - key += (key << 3); - key ^= (key >> 6); - key += ~(key << 11); - key ^= (key >> 16); - return key; - } -}; - -class b3HashPtr -{ - union { - const void* m_pointer; - int m_hashValues[2]; - }; - -public: - b3HashPtr(const void* ptr) - : m_pointer(ptr) - { - } - - const void* getPointer() const - { - return m_pointer; - } - - bool equals(const b3HashPtr& other) const - { - return getPointer() == other.getPointer(); - } - - //to our success - B3_FORCE_INLINE unsigned int getHash() const - { - const bool VOID_IS_8 = ((sizeof(void*) == 8)); - - int key = VOID_IS_8 ? m_hashValues[0] + m_hashValues[1] : m_hashValues[0]; - - // Thomas Wang's hash - key += ~(key << 15); - key ^= (key >> 10); - key += (key << 3); - key ^= (key >> 6); - key += ~(key << 11); - key ^= (key >> 16); - return key; - } -}; - -template -class b3HashKeyPtr -{ - int m_uid; - -public: - b3HashKeyPtr(int uid) : m_uid(uid) - { - } - - int getUid1() const - { - return m_uid; - } - - bool equals(const b3HashKeyPtr& other) const - { - return getUid1() == other.getUid1(); - } - - //to our success - B3_FORCE_INLINE unsigned int getHash() const - { - int key = m_uid; - // Thomas Wang's hash - key += ~(key << 15); - key ^= (key >> 10); - key += (key << 3); - key ^= (key >> 6); - key += ~(key << 11); - key ^= (key >> 16); - return key; - } -}; - -template -class b3HashKey -{ - int m_uid; - -public: - b3HashKey(int uid) : m_uid(uid) - { - } - - int getUid1() const - { - return m_uid; - } - - bool equals(const b3HashKey& other) const - { - return getUid1() == other.getUid1(); - } - //to our success - B3_FORCE_INLINE unsigned int getHash() const - { - int key = m_uid; - // Thomas Wang's hash - key += ~(key << 15); - key ^= (key >> 10); - key += (key << 3); - key ^= (key >> 6); - key += ~(key << 11); - key ^= (key >> 16); - return key; - } -}; - -///The b3HashMap template class implements a generic and lightweight hashmap. -///A basic sample of how to use b3HashMap is located in Demos\BasicDemo\main.cpp -template -class b3HashMap -{ -protected: - b3AlignedObjectArray m_hashTable; - b3AlignedObjectArray m_next; - - b3AlignedObjectArray m_valueArray; - b3AlignedObjectArray m_keyArray; - - void growTables(const Key& /*key*/) - { - int newCapacity = m_valueArray.capacity(); - - if (m_hashTable.size() < newCapacity) - { - //grow hashtable and next table - int curHashtableSize = m_hashTable.size(); - - m_hashTable.resize(newCapacity); - m_next.resize(newCapacity); - - int i; - - for (i = 0; i < newCapacity; ++i) - { - m_hashTable[i] = B3_HASH_NULL; - } - for (i = 0; i < newCapacity; ++i) - { - m_next[i] = B3_HASH_NULL; - } - - for (i = 0; i < curHashtableSize; i++) - { - //const Value& value = m_valueArray[i]; - //const Key& key = m_keyArray[i]; - - int hashValue = m_keyArray[i].getHash() & (m_valueArray.capacity() - 1); // New hash value with new mask - m_next[i] = m_hashTable[hashValue]; - m_hashTable[hashValue] = i; - } - } - } - -public: - void insert(const Key& key, const Value& value) - { - int hash = key.getHash() & (m_valueArray.capacity() - 1); - - //replace value if the key is already there - int index = findIndex(key); - if (index != B3_HASH_NULL) - { - m_valueArray[index] = value; - return; - } - - int count = m_valueArray.size(); - int oldCapacity = m_valueArray.capacity(); - m_valueArray.push_back(value); - m_keyArray.push_back(key); - - int newCapacity = m_valueArray.capacity(); - if (oldCapacity < newCapacity) - { - growTables(key); - //hash with new capacity - hash = key.getHash() & (m_valueArray.capacity() - 1); - } - m_next[count] = m_hashTable[hash]; - m_hashTable[hash] = count; - } - - void remove(const Key& key) - { - int hash = key.getHash() & (m_valueArray.capacity() - 1); - - int pairIndex = findIndex(key); - - if (pairIndex == B3_HASH_NULL) - { - return; - } - - // Remove the pair from the hash table. - int index = m_hashTable[hash]; - b3Assert(index != B3_HASH_NULL); - - int previous = B3_HASH_NULL; - while (index != pairIndex) - { - previous = index; - index = m_next[index]; - } - - if (previous != B3_HASH_NULL) - { - b3Assert(m_next[previous] == pairIndex); - m_next[previous] = m_next[pairIndex]; - } - else - { - m_hashTable[hash] = m_next[pairIndex]; - } - - // We now move the last pair into spot of the - // pair being removed. We need to fix the hash - // table indices to support the move. - - int lastPairIndex = m_valueArray.size() - 1; - - // If the removed pair is the last pair, we are done. - if (lastPairIndex == pairIndex) - { - m_valueArray.pop_back(); - m_keyArray.pop_back(); - return; - } - - // Remove the last pair from the hash table. - int lastHash = m_keyArray[lastPairIndex].getHash() & (m_valueArray.capacity() - 1); - - index = m_hashTable[lastHash]; - b3Assert(index != B3_HASH_NULL); - - previous = B3_HASH_NULL; - while (index != lastPairIndex) - { - previous = index; - index = m_next[index]; - } - - if (previous != B3_HASH_NULL) - { - b3Assert(m_next[previous] == lastPairIndex); - m_next[previous] = m_next[lastPairIndex]; - } - else - { - m_hashTable[lastHash] = m_next[lastPairIndex]; - } - - // Copy the last pair into the remove pair's spot. - m_valueArray[pairIndex] = m_valueArray[lastPairIndex]; - m_keyArray[pairIndex] = m_keyArray[lastPairIndex]; - - // Insert the last pair into the hash table - m_next[pairIndex] = m_hashTable[lastHash]; - m_hashTable[lastHash] = pairIndex; - - m_valueArray.pop_back(); - m_keyArray.pop_back(); - } - - int size() const - { - return m_valueArray.size(); - } - - const Value* getAtIndex(int index) const - { - b3Assert(index < m_valueArray.size()); - - return &m_valueArray[index]; - } - - Value* getAtIndex(int index) - { - b3Assert(index < m_valueArray.size()); - - return &m_valueArray[index]; - } - - Key getKeyAtIndex(int index) - { - b3Assert(index < m_keyArray.size()); - return m_keyArray[index]; - } - - const Key getKeyAtIndex(int index) const - { - b3Assert(index < m_keyArray.size()); - return m_keyArray[index]; - } - - Value* operator[](const Key& key) - { - return find(key); - } - - const Value* find(const Key& key) const - { - int index = findIndex(key); - if (index == B3_HASH_NULL) - { - return NULL; - } - return &m_valueArray[index]; - } - - Value* find(const Key& key) - { - int index = findIndex(key); - if (index == B3_HASH_NULL) - { - return NULL; - } - return &m_valueArray[index]; - } - - int findIndex(const Key& key) const - { - unsigned int hash = key.getHash() & (m_valueArray.capacity() - 1); - - if (hash >= (unsigned int)m_hashTable.size()) - { - return B3_HASH_NULL; - } - - int index = m_hashTable[hash]; - while ((index != B3_HASH_NULL) && key.equals(m_keyArray[index]) == false) - { - index = m_next[index]; - } - return index; - } - - void clear() - { - m_hashTable.clear(); - m_next.clear(); - m_valueArray.clear(); - m_keyArray.clear(); - } -}; - -#endif //B3_HASH_MAP_H diff --git a/engine/inc/bullet/Bullet3Common/b3Logging.h b/engine/inc/bullet/Bullet3Common/b3Logging.h deleted file mode 100644 index f61149de..00000000 --- a/engine/inc/bullet/Bullet3Common/b3Logging.h +++ /dev/null @@ -1,74 +0,0 @@ - -#ifndef B3_LOGGING_H -#define B3_LOGGING_H - -#ifdef __cplusplus -extern "C" -{ -#endif - -///We add the do/while so that the statement "if (condition) b3Printf("test"); else {...}" would fail -///You can also customize the message by uncommenting out a different line below -#define b3Printf(...) b3OutputPrintfVarArgsInternal(__VA_ARGS__) - //#define b3Printf(...) do {b3OutputPrintfVarArgsInternal("b3Printf[%s,%d]:",__FILE__,__LINE__);b3OutputPrintfVarArgsInternal(__VA_ARGS__); } while(0) - //#define b3Printf b3OutputPrintfVarArgsInternal - //#define b3Printf(...) printf(__VA_ARGS__) - //#define b3Printf(...) -#define b3Warning(...) do{ b3OutputWarningMessageVarArgsInternal("b3Warning[%s,%d]:\n", __FILE__, __LINE__);b3OutputWarningMessageVarArgsInternal(__VA_ARGS__);} while (0) -#define b3Error(...)do {b3OutputErrorMessageVarArgsInternal("b3Error[%s,%d]:\n", __FILE__, __LINE__);b3OutputErrorMessageVarArgsInternal(__VA_ARGS__);} while (0) -#ifndef B3_NO_PROFILE - - void b3EnterProfileZone(const char* name); - void b3LeaveProfileZone(); -#ifdef __cplusplus - - class b3ProfileZone - { - public: - b3ProfileZone(const char* name) - { - b3EnterProfileZone(name); - } - - ~b3ProfileZone() - { - b3LeaveProfileZone(); - } - }; - -#define B3_PROFILE(name) b3ProfileZone __profile(name) -#endif - -#else //B3_NO_PROFILE - -#define B3_PROFILE(name) -#define b3StartProfile(a) -#define b3StopProfile - -#endif //#ifndef B3_NO_PROFILE - - typedef void(b3PrintfFunc)(const char* msg); - typedef void(b3WarningMessageFunc)(const char* msg); - typedef void(b3ErrorMessageFunc)(const char* msg); - typedef void(b3EnterProfileZoneFunc)(const char* msg); - typedef void(b3LeaveProfileZoneFunc)(); - - ///The developer can route b3Printf output using their own implementation - void b3SetCustomPrintfFunc(b3PrintfFunc* printfFunc); - void b3SetCustomWarningMessageFunc(b3WarningMessageFunc* warningMsgFunc); - void b3SetCustomErrorMessageFunc(b3ErrorMessageFunc* errorMsgFunc); - - ///Set custom profile zone functions (zones can be nested) - void b3SetCustomEnterProfileZoneFunc(b3EnterProfileZoneFunc* enterFunc); - void b3SetCustomLeaveProfileZoneFunc(b3LeaveProfileZoneFunc* leaveFunc); - - ///Don't use those internal functions directly, use the b3Printf or b3SetCustomPrintfFunc instead (or warning/error version) - void b3OutputPrintfVarArgsInternal(const char* str, ...); - void b3OutputWarningMessageVarArgsInternal(const char* str, ...); - void b3OutputErrorMessageVarArgsInternal(const char* str, ...); - -#ifdef __cplusplus -} -#endif - -#endif //B3_LOGGING_H \ No newline at end of file diff --git a/engine/inc/bullet/Bullet3Common/b3Matrix3x3.h b/engine/inc/bullet/Bullet3Common/b3Matrix3x3.h deleted file mode 100644 index 6c46536a..00000000 --- a/engine/inc/bullet/Bullet3Common/b3Matrix3x3.h +++ /dev/null @@ -1,1354 +0,0 @@ -/* -Copyright (c) 2003-2013 Gino van den Bergen / Erwin Coumans http://bulletphysics.org - -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 B3_MATRIX3x3_H -#define B3_MATRIX3x3_H - -#include "b3Vector3.h" -#include "b3Quaternion.h" -#include - -#ifdef B3_USE_SSE -//const __m128 B3_ATTRIBUTE_ALIGNED16(b3v2220) = {2.0f, 2.0f, 2.0f, 0.0f}; -const __m128 B3_ATTRIBUTE_ALIGNED16(b3vMPPP) = {-0.0f, +0.0f, +0.0f, +0.0f}; -#endif - -#if defined(B3_USE_SSE) || defined(B3_USE_NEON) -const b3SimdFloat4 B3_ATTRIBUTE_ALIGNED16(b3v1000) = {1.0f, 0.0f, 0.0f, 0.0f}; -const b3SimdFloat4 B3_ATTRIBUTE_ALIGNED16(b3v0100) = {0.0f, 1.0f, 0.0f, 0.0f}; -const b3SimdFloat4 B3_ATTRIBUTE_ALIGNED16(b3v0010) = {0.0f, 0.0f, 1.0f, 0.0f}; -#endif - -#ifdef B3_USE_DOUBLE_PRECISION -#define b3Matrix3x3Data b3Matrix3x3DoubleData -#else -#define b3Matrix3x3Data b3Matrix3x3FloatData -#endif //B3_USE_DOUBLE_PRECISION - -/**@brief The b3Matrix3x3 class implements a 3x3 rotation matrix, to perform linear algebra in combination with b3Quaternion, b3Transform and b3Vector3. -* Make sure to only include a pure orthogonal matrix without scaling. */ -B3_ATTRIBUTE_ALIGNED16(class) -b3Matrix3x3 -{ - ///Data storage for the matrix, each vector is a row of the matrix - b3Vector3 m_el[3]; - -public: - /** @brief No initializaion constructor */ - b3Matrix3x3() {} - - // explicit b3Matrix3x3(const b3Scalar *m) { setFromOpenGLSubMatrix(m); } - - /**@brief Constructor from Quaternion */ - explicit b3Matrix3x3(const b3Quaternion& q) { setRotation(q); } - /* - template - Matrix3x3(const b3Scalar& yaw, const b3Scalar& pitch, const b3Scalar& roll) - { - setEulerYPR(yaw, pitch, roll); - } - */ - /** @brief Constructor with row major formatting */ - b3Matrix3x3(const b3Scalar& xx, const b3Scalar& xy, const b3Scalar& xz, - const b3Scalar& yx, const b3Scalar& yy, const b3Scalar& yz, - const b3Scalar& zx, const b3Scalar& zy, const b3Scalar& zz) - { - setValue(xx, xy, xz, - yx, yy, yz, - zx, zy, zz); - } - -#if (defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE)) || defined(B3_USE_NEON) - B3_FORCE_INLINE b3Matrix3x3(const b3SimdFloat4 v0, const b3SimdFloat4 v1, const b3SimdFloat4 v2) - { - m_el[0].mVec128 = v0; - m_el[1].mVec128 = v1; - m_el[2].mVec128 = v2; - } - - B3_FORCE_INLINE b3Matrix3x3(const b3Vector3& v0, const b3Vector3& v1, const b3Vector3& v2) - { - m_el[0] = v0; - m_el[1] = v1; - m_el[2] = v2; - } - - // Copy constructor - B3_FORCE_INLINE b3Matrix3x3(const b3Matrix3x3& rhs) - { - m_el[0].mVec128 = rhs.m_el[0].mVec128; - m_el[1].mVec128 = rhs.m_el[1].mVec128; - m_el[2].mVec128 = rhs.m_el[2].mVec128; - } - - // Assignment Operator - B3_FORCE_INLINE b3Matrix3x3& operator=(const b3Matrix3x3& m) - { - m_el[0].mVec128 = m.m_el[0].mVec128; - m_el[1].mVec128 = m.m_el[1].mVec128; - m_el[2].mVec128 = m.m_el[2].mVec128; - - return *this; - } - -#else - - /** @brief Copy constructor */ - B3_FORCE_INLINE b3Matrix3x3(const b3Matrix3x3& other) - { - m_el[0] = other.m_el[0]; - m_el[1] = other.m_el[1]; - m_el[2] = other.m_el[2]; - } - - /** @brief Assignment Operator */ - B3_FORCE_INLINE b3Matrix3x3& operator=(const b3Matrix3x3& other) - { - m_el[0] = other.m_el[0]; - m_el[1] = other.m_el[1]; - m_el[2] = other.m_el[2]; - return *this; - } - -#endif - - /** @brief Get a column of the matrix as a vector - * @param i Column number 0 indexed */ - B3_FORCE_INLINE b3Vector3 getColumn(int i) const - { - return b3MakeVector3(m_el[0][i], m_el[1][i], m_el[2][i]); - } - - /** @brief Get a row of the matrix as a vector - * @param i Row number 0 indexed */ - B3_FORCE_INLINE const b3Vector3& getRow(int i) const - { - b3FullAssert(0 <= i && i < 3); - return m_el[i]; - } - - /** @brief Get a mutable reference to a row of the matrix as a vector - * @param i Row number 0 indexed */ - B3_FORCE_INLINE b3Vector3& operator[](int i) - { - b3FullAssert(0 <= i && i < 3); - return m_el[i]; - } - - /** @brief Get a const reference to a row of the matrix as a vector - * @param i Row number 0 indexed */ - B3_FORCE_INLINE const b3Vector3& operator[](int i) const - { - b3FullAssert(0 <= i && i < 3); - return m_el[i]; - } - - /** @brief Multiply by the target matrix on the right - * @param m Rotation matrix to be applied - * Equivilant to this = this * m */ - b3Matrix3x3& operator*=(const b3Matrix3x3& m); - - /** @brief Adds by the target matrix on the right - * @param m matrix to be applied - * Equivilant to this = this + m */ - b3Matrix3x3& operator+=(const b3Matrix3x3& m); - - /** @brief Substractss by the target matrix on the right - * @param m matrix to be applied - * Equivilant to this = this - m */ - b3Matrix3x3& operator-=(const b3Matrix3x3& m); - - /** @brief Set from the rotational part of a 4x4 OpenGL matrix - * @param m A pointer to the beginning of the array of scalars*/ - void setFromOpenGLSubMatrix(const b3Scalar* m) - { - m_el[0].setValue(m[0], m[4], m[8]); - m_el[1].setValue(m[1], m[5], m[9]); - m_el[2].setValue(m[2], m[6], m[10]); - } - /** @brief Set the values of the matrix explicitly (row major) - * @param xx Top left - * @param xy Top Middle - * @param xz Top Right - * @param yx Middle Left - * @param yy Middle Middle - * @param yz Middle Right - * @param zx Bottom Left - * @param zy Bottom Middle - * @param zz Bottom Right*/ - void setValue(const b3Scalar& xx, const b3Scalar& xy, const b3Scalar& xz, - const b3Scalar& yx, const b3Scalar& yy, const b3Scalar& yz, - const b3Scalar& zx, const b3Scalar& zy, const b3Scalar& zz) - { - m_el[0].setValue(xx, xy, xz); - m_el[1].setValue(yx, yy, yz); - m_el[2].setValue(zx, zy, zz); - } - - /** @brief Set the matrix from a quaternion - * @param q The Quaternion to match */ - void setRotation(const b3Quaternion& q) - { - b3Scalar d = q.length2(); - b3FullAssert(d != b3Scalar(0.0)); - b3Scalar s = b3Scalar(2.0) / d; - -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - __m128 vs, Q = q.get128(); - __m128i Qi = b3CastfTo128i(Q); - __m128 Y, Z; - __m128 V1, V2, V3; - __m128 V11, V21, V31; - __m128 NQ = _mm_xor_ps(Q, b3vMzeroMask); - __m128i NQi = b3CastfTo128i(NQ); - - V1 = b3CastiTo128f(_mm_shuffle_epi32(Qi, B3_SHUFFLE(1, 0, 2, 3))); // Y X Z W - V2 = _mm_shuffle_ps(NQ, Q, B3_SHUFFLE(0, 0, 1, 3)); // -X -X Y W - V3 = b3CastiTo128f(_mm_shuffle_epi32(Qi, B3_SHUFFLE(2, 1, 0, 3))); // Z Y X W - V1 = _mm_xor_ps(V1, b3vMPPP); // change the sign of the first element - - V11 = b3CastiTo128f(_mm_shuffle_epi32(Qi, B3_SHUFFLE(1, 1, 0, 3))); // Y Y X W - V21 = _mm_unpackhi_ps(Q, Q); // Z Z W W - V31 = _mm_shuffle_ps(Q, NQ, B3_SHUFFLE(0, 2, 0, 3)); // X Z -X -W - - V2 = V2 * V1; // - V1 = V1 * V11; // - V3 = V3 * V31; // - - V11 = _mm_shuffle_ps(NQ, Q, B3_SHUFFLE(2, 3, 1, 3)); // -Z -W Y W - V11 = V11 * V21; // - V21 = _mm_xor_ps(V21, b3vMPPP); // change the sign of the first element - V31 = _mm_shuffle_ps(Q, NQ, B3_SHUFFLE(3, 3, 1, 3)); // W W -Y -W - V31 = _mm_xor_ps(V31, b3vMPPP); // change the sign of the first element - Y = b3CastiTo128f(_mm_shuffle_epi32(NQi, B3_SHUFFLE(3, 2, 0, 3))); // -W -Z -X -W - Z = b3CastiTo128f(_mm_shuffle_epi32(Qi, B3_SHUFFLE(1, 0, 1, 3))); // Y X Y W - - vs = _mm_load_ss(&s); - V21 = V21 * Y; - V31 = V31 * Z; - - V1 = V1 + V11; - V2 = V2 + V21; - V3 = V3 + V31; - - vs = b3_splat3_ps(vs, 0); - // s ready - V1 = V1 * vs; - V2 = V2 * vs; - V3 = V3 * vs; - - V1 = V1 + b3v1000; - V2 = V2 + b3v0100; - V3 = V3 + b3v0010; - - m_el[0] = b3MakeVector3(V1); - m_el[1] = b3MakeVector3(V2); - m_el[2] = b3MakeVector3(V3); -#else - b3Scalar xs = q.getX() * s, ys = q.getY() * s, zs = q.getZ() * s; - b3Scalar wx = q.getW() * xs, wy = q.getW() * ys, wz = q.getW() * zs; - b3Scalar xx = q.getX() * xs, xy = q.getX() * ys, xz = q.getX() * zs; - b3Scalar yy = q.getY() * ys, yz = q.getY() * zs, zz = q.getZ() * zs; - setValue( - b3Scalar(1.0) - (yy + zz), xy - wz, xz + wy, - xy + wz, b3Scalar(1.0) - (xx + zz), yz - wx, - xz - wy, yz + wx, b3Scalar(1.0) - (xx + yy)); -#endif - } - - /** @brief Set the matrix from euler angles using YPR around YXZ respectively - * @param yaw Yaw about Y axis - * @param pitch Pitch about X axis - * @param roll Roll about Z axis - */ - void setEulerYPR(const b3Scalar& yaw, const b3Scalar& pitch, const b3Scalar& roll) - { - setEulerZYX(roll, pitch, yaw); - } - - /** @brief Set the matrix from euler angles YPR around ZYX axes - * @param eulerX Roll about X axis - * @param eulerY Pitch around Y axis - * @param eulerZ Yaw aboud Z axis - * - * These angles are used to produce a rotation matrix. The euler - * angles are applied in ZYX order. I.e a vector is first rotated - * about X then Y and then Z - **/ - void setEulerZYX(b3Scalar eulerX, b3Scalar eulerY, b3Scalar eulerZ) - { - ///@todo proposed to reverse this since it's labeled zyx but takes arguments xyz and it will match all other parts of the code - b3Scalar ci(b3Cos(eulerX)); - b3Scalar cj(b3Cos(eulerY)); - b3Scalar ch(b3Cos(eulerZ)); - b3Scalar si(b3Sin(eulerX)); - b3Scalar sj(b3Sin(eulerY)); - b3Scalar sh(b3Sin(eulerZ)); - b3Scalar cc = ci * ch; - b3Scalar cs = ci * sh; - b3Scalar sc = si * ch; - b3Scalar ss = si * sh; - - setValue(cj * ch, sj * sc - cs, sj * cc + ss, - cj * sh, sj * ss + cc, sj * cs - sc, - -sj, cj * si, cj * ci); - } - - /**@brief Set the matrix to the identity */ - void setIdentity() - { -#if (defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE)) || defined(B3_USE_NEON) - m_el[0] = b3MakeVector3(b3v1000); - m_el[1] = b3MakeVector3(b3v0100); - m_el[2] = b3MakeVector3(b3v0010); -#else - setValue(b3Scalar(1.0), b3Scalar(0.0), b3Scalar(0.0), - b3Scalar(0.0), b3Scalar(1.0), b3Scalar(0.0), - b3Scalar(0.0), b3Scalar(0.0), b3Scalar(1.0)); -#endif - } - - static const b3Matrix3x3& getIdentity() - { -#if (defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE)) || defined(B3_USE_NEON) - static const b3Matrix3x3 - identityMatrix(b3v1000, b3v0100, b3v0010); -#else - static const b3Matrix3x3 - identityMatrix( - b3Scalar(1.0), b3Scalar(0.0), b3Scalar(0.0), - b3Scalar(0.0), b3Scalar(1.0), b3Scalar(0.0), - b3Scalar(0.0), b3Scalar(0.0), b3Scalar(1.0)); -#endif - return identityMatrix; - } - - /**@brief Fill the rotational part of an OpenGL matrix and clear the shear/perspective - * @param m The array to be filled */ - void getOpenGLSubMatrix(b3Scalar * m) const - { -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - __m128 v0 = m_el[0].mVec128; - __m128 v1 = m_el[1].mVec128; - __m128 v2 = m_el[2].mVec128; // x2 y2 z2 w2 - __m128* vm = (__m128*)m; - __m128 vT; - - v2 = _mm_and_ps(v2, b3vFFF0fMask); // x2 y2 z2 0 - - vT = _mm_unpackhi_ps(v0, v1); // z0 z1 * * - v0 = _mm_unpacklo_ps(v0, v1); // x0 x1 y0 y1 - - v1 = _mm_shuffle_ps(v0, v2, B3_SHUFFLE(2, 3, 1, 3)); // y0 y1 y2 0 - v0 = _mm_shuffle_ps(v0, v2, B3_SHUFFLE(0, 1, 0, 3)); // x0 x1 x2 0 - v2 = b3CastdTo128f(_mm_move_sd(b3CastfTo128d(v2), b3CastfTo128d(vT))); // z0 z1 z2 0 - - vm[0] = v0; - vm[1] = v1; - vm[2] = v2; -#elif defined(B3_USE_NEON) - // note: zeros the w channel. We can preserve it at the cost of two more vtrn instructions. - static const uint32x2_t zMask = (const uint32x2_t){-1, 0}; - float32x4_t* vm = (float32x4_t*)m; - float32x4x2_t top = vtrnq_f32(m_el[0].mVec128, m_el[1].mVec128); // {x0 x1 z0 z1}, {y0 y1 w0 w1} - float32x2x2_t bl = vtrn_f32(vget_low_f32(m_el[2].mVec128), vdup_n_f32(0.0f)); // {x2 0 }, {y2 0} - float32x4_t v0 = vcombine_f32(vget_low_f32(top.val[0]), bl.val[0]); - float32x4_t v1 = vcombine_f32(vget_low_f32(top.val[1]), bl.val[1]); - float32x2_t q = (float32x2_t)vand_u32((uint32x2_t)vget_high_f32(m_el[2].mVec128), zMask); - float32x4_t v2 = vcombine_f32(vget_high_f32(top.val[0]), q); // z0 z1 z2 0 - - vm[0] = v0; - vm[1] = v1; - vm[2] = v2; -#else - m[0] = b3Scalar(m_el[0].getX()); - m[1] = b3Scalar(m_el[1].getX()); - m[2] = b3Scalar(m_el[2].getX()); - m[3] = b3Scalar(0.0); - m[4] = b3Scalar(m_el[0].getY()); - m[5] = b3Scalar(m_el[1].getY()); - m[6] = b3Scalar(m_el[2].getY()); - m[7] = b3Scalar(0.0); - m[8] = b3Scalar(m_el[0].getZ()); - m[9] = b3Scalar(m_el[1].getZ()); - m[10] = b3Scalar(m_el[2].getZ()); - m[11] = b3Scalar(0.0); -#endif - } - - /**@brief Get the matrix represented as a quaternion - * @param q The quaternion which will be set */ - void getRotation(b3Quaternion & q) const - { -#if (defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE)) || defined(B3_USE_NEON) - b3Scalar trace = m_el[0].getX() + m_el[1].getY() + m_el[2].getZ(); - b3Scalar s, x; - - union { - b3SimdFloat4 vec; - b3Scalar f[4]; - } temp; - - if (trace > b3Scalar(0.0)) - { - x = trace + b3Scalar(1.0); - - temp.f[0] = m_el[2].getY() - m_el[1].getZ(); - temp.f[1] = m_el[0].getZ() - m_el[2].getX(); - temp.f[2] = m_el[1].getX() - m_el[0].getY(); - temp.f[3] = x; - //temp.f[3]= s * b3Scalar(0.5); - } - else - { - int i, j, k; - if (m_el[0].getX() < m_el[1].getY()) - { - if (m_el[1].getY() < m_el[2].getZ()) - { - i = 2; - j = 0; - k = 1; - } - else - { - i = 1; - j = 2; - k = 0; - } - } - else - { - if (m_el[0].getX() < m_el[2].getZ()) - { - i = 2; - j = 0; - k = 1; - } - else - { - i = 0; - j = 1; - k = 2; - } - } - - x = m_el[i][i] - m_el[j][j] - m_el[k][k] + b3Scalar(1.0); - - temp.f[3] = (m_el[k][j] - m_el[j][k]); - temp.f[j] = (m_el[j][i] + m_el[i][j]); - temp.f[k] = (m_el[k][i] + m_el[i][k]); - temp.f[i] = x; - //temp.f[i] = s * b3Scalar(0.5); - } - - s = b3Sqrt(x); - q.set128(temp.vec); - s = b3Scalar(0.5) / s; - - q *= s; -#else - b3Scalar trace = m_el[0].getX() + m_el[1].getY() + m_el[2].getZ(); - - b3Scalar temp[4]; - - if (trace > b3Scalar(0.0)) - { - b3Scalar s = b3Sqrt(trace + b3Scalar(1.0)); - temp[3] = (s * b3Scalar(0.5)); - s = b3Scalar(0.5) / s; - - temp[0] = ((m_el[2].getY() - m_el[1].getZ()) * s); - temp[1] = ((m_el[0].getZ() - m_el[2].getX()) * s); - temp[2] = ((m_el[1].getX() - m_el[0].getY()) * s); - } - else - { - int i = m_el[0].getX() < m_el[1].getY() ? (m_el[1].getY() < m_el[2].getZ() ? 2 : 1) : (m_el[0].getX() < m_el[2].getZ() ? 2 : 0); - int j = (i + 1) % 3; - int k = (i + 2) % 3; - - b3Scalar s = b3Sqrt(m_el[i][i] - m_el[j][j] - m_el[k][k] + b3Scalar(1.0)); - temp[i] = s * b3Scalar(0.5); - s = b3Scalar(0.5) / s; - - temp[3] = (m_el[k][j] - m_el[j][k]) * s; - temp[j] = (m_el[j][i] + m_el[i][j]) * s; - temp[k] = (m_el[k][i] + m_el[i][k]) * s; - } - q.setValue(temp[0], temp[1], temp[2], temp[3]); -#endif - } - - /**@brief Get the matrix represented as euler angles around YXZ, roundtrip with setEulerYPR - * @param yaw Yaw around Y axis - * @param pitch Pitch around X axis - * @param roll around Z axis */ - void getEulerYPR(b3Scalar & yaw, b3Scalar & pitch, b3Scalar & roll) const - { - // first use the normal calculus - yaw = b3Scalar(b3Atan2(m_el[1].getX(), m_el[0].getX())); - pitch = b3Scalar(b3Asin(-m_el[2].getX())); - roll = b3Scalar(b3Atan2(m_el[2].getY(), m_el[2].getZ())); - - // on pitch = +/-HalfPI - if (b3Fabs(pitch) == B3_HALF_PI) - { - if (yaw > 0) - yaw -= B3_PI; - else - yaw += B3_PI; - - if (roll > 0) - roll -= B3_PI; - else - roll += B3_PI; - } - }; - - /**@brief Get the matrix represented as euler angles around ZYX - * @param yaw Yaw around X axis - * @param pitch Pitch around Y axis - * @param roll around X axis - * @param solution_number Which solution of two possible solutions ( 1 or 2) are possible values*/ - void getEulerZYX(b3Scalar & yaw, b3Scalar & pitch, b3Scalar & roll, unsigned int solution_number = 1) const - { - struct Euler - { - b3Scalar yaw; - b3Scalar pitch; - b3Scalar roll; - }; - - Euler euler_out; - Euler euler_out2; //second solution - //get the pointer to the raw data - - // Check that pitch is not at a singularity - if (b3Fabs(m_el[2].getX()) >= 1) - { - euler_out.yaw = 0; - euler_out2.yaw = 0; - - // From difference of angles formula - b3Scalar delta = b3Atan2(m_el[0].getX(), m_el[0].getZ()); - if (m_el[2].getX() > 0) //gimbal locked up - { - euler_out.pitch = B3_PI / b3Scalar(2.0); - euler_out2.pitch = B3_PI / b3Scalar(2.0); - euler_out.roll = euler_out.pitch + delta; - euler_out2.roll = euler_out.pitch + delta; - } - else // gimbal locked down - { - euler_out.pitch = -B3_PI / b3Scalar(2.0); - euler_out2.pitch = -B3_PI / b3Scalar(2.0); - euler_out.roll = -euler_out.pitch + delta; - euler_out2.roll = -euler_out.pitch + delta; - } - } - else - { - euler_out.pitch = -b3Asin(m_el[2].getX()); - euler_out2.pitch = B3_PI - euler_out.pitch; - - euler_out.roll = b3Atan2(m_el[2].getY() / b3Cos(euler_out.pitch), - m_el[2].getZ() / b3Cos(euler_out.pitch)); - euler_out2.roll = b3Atan2(m_el[2].getY() / b3Cos(euler_out2.pitch), - m_el[2].getZ() / b3Cos(euler_out2.pitch)); - - euler_out.yaw = b3Atan2(m_el[1].getX() / b3Cos(euler_out.pitch), - m_el[0].getX() / b3Cos(euler_out.pitch)); - euler_out2.yaw = b3Atan2(m_el[1].getX() / b3Cos(euler_out2.pitch), - m_el[0].getX() / b3Cos(euler_out2.pitch)); - } - - if (solution_number == 1) - { - yaw = euler_out.yaw; - pitch = euler_out.pitch; - roll = euler_out.roll; - } - else - { - yaw = euler_out2.yaw; - pitch = euler_out2.pitch; - roll = euler_out2.roll; - } - } - - /**@brief Create a scaled copy of the matrix - * @param s Scaling vector The elements of the vector will scale each column */ - - b3Matrix3x3 scaled(const b3Vector3& s) const - { -#if (defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE)) || defined(B3_USE_NEON) - return b3Matrix3x3(m_el[0] * s, m_el[1] * s, m_el[2] * s); -#else - return b3Matrix3x3( - m_el[0].getX() * s.getX(), m_el[0].getY() * s.getY(), m_el[0].getZ() * s.getZ(), - m_el[1].getX() * s.getX(), m_el[1].getY() * s.getY(), m_el[1].getZ() * s.getZ(), - m_el[2].getX() * s.getX(), m_el[2].getY() * s.getY(), m_el[2].getZ() * s.getZ()); -#endif - } - - /**@brief Return the determinant of the matrix */ - b3Scalar determinant() const; - /**@brief Return the adjoint of the matrix */ - b3Matrix3x3 adjoint() const; - /**@brief Return the matrix with all values non negative */ - b3Matrix3x3 absolute() const; - /**@brief Return the transpose of the matrix */ - b3Matrix3x3 transpose() const; - /**@brief Return the inverse of the matrix */ - b3Matrix3x3 inverse() const; - - b3Matrix3x3 transposeTimes(const b3Matrix3x3& m) const; - b3Matrix3x3 timesTranspose(const b3Matrix3x3& m) const; - - B3_FORCE_INLINE b3Scalar tdotx(const b3Vector3& v) const - { - return m_el[0].getX() * v.getX() + m_el[1].getX() * v.getY() + m_el[2].getX() * v.getZ(); - } - B3_FORCE_INLINE b3Scalar tdoty(const b3Vector3& v) const - { - return m_el[0].getY() * v.getX() + m_el[1].getY() * v.getY() + m_el[2].getY() * v.getZ(); - } - B3_FORCE_INLINE b3Scalar tdotz(const b3Vector3& v) const - { - return m_el[0].getZ() * v.getX() + m_el[1].getZ() * v.getY() + m_el[2].getZ() * v.getZ(); - } - - /**@brief diagonalizes this matrix by the Jacobi method. - * @param rot stores the rotation from the coordinate system in which the matrix is diagonal to the original - * coordinate system, i.e., old_this = rot * new_this * rot^T. - * @param threshold See iteration - * @param iteration The iteration stops when all off-diagonal elements are less than the threshold multiplied - * by the sum of the absolute values of the diagonal, or when maxSteps have been executed. - * - * Note that this matrix is assumed to be symmetric. - */ - void diagonalize(b3Matrix3x3 & rot, b3Scalar threshold, int maxSteps) - { - rot.setIdentity(); - for (int step = maxSteps; step > 0; step--) - { - // find off-diagonal element [p][q] with largest magnitude - int p = 0; - int q = 1; - int r = 2; - b3Scalar max = b3Fabs(m_el[0][1]); - b3Scalar v = b3Fabs(m_el[0][2]); - if (v > max) - { - q = 2; - r = 1; - max = v; - } - v = b3Fabs(m_el[1][2]); - if (v > max) - { - p = 1; - q = 2; - r = 0; - max = v; - } - - b3Scalar t = threshold * (b3Fabs(m_el[0][0]) + b3Fabs(m_el[1][1]) + b3Fabs(m_el[2][2])); - if (max <= t) - { - if (max <= B3_EPSILON * t) - { - return; - } - step = 1; - } - - // compute Jacobi rotation J which leads to a zero for element [p][q] - b3Scalar mpq = m_el[p][q]; - b3Scalar theta = (m_el[q][q] - m_el[p][p]) / (2 * mpq); - b3Scalar theta2 = theta * theta; - b3Scalar cos; - b3Scalar sin; - if (theta2 * theta2 < b3Scalar(10 / B3_EPSILON)) - { - t = (theta >= 0) ? 1 / (theta + b3Sqrt(1 + theta2)) - : 1 / (theta - b3Sqrt(1 + theta2)); - cos = 1 / b3Sqrt(1 + t * t); - sin = cos * t; - } - else - { - // approximation for large theta-value, i.e., a nearly diagonal matrix - t = 1 / (theta * (2 + b3Scalar(0.5) / theta2)); - cos = 1 - b3Scalar(0.5) * t * t; - sin = cos * t; - } - - // apply rotation to matrix (this = J^T * this * J) - m_el[p][q] = m_el[q][p] = 0; - m_el[p][p] -= t * mpq; - m_el[q][q] += t * mpq; - b3Scalar mrp = m_el[r][p]; - b3Scalar mrq = m_el[r][q]; - m_el[r][p] = m_el[p][r] = cos * mrp - sin * mrq; - m_el[r][q] = m_el[q][r] = cos * mrq + sin * mrp; - - // apply rotation to rot (rot = rot * J) - for (int i = 0; i < 3; i++) - { - b3Vector3& row = rot[i]; - mrp = row[p]; - mrq = row[q]; - row[p] = cos * mrp - sin * mrq; - row[q] = cos * mrq + sin * mrp; - } - } - } - - /**@brief Calculate the matrix cofactor - * @param r1 The first row to use for calculating the cofactor - * @param c1 The first column to use for calculating the cofactor - * @param r1 The second row to use for calculating the cofactor - * @param c1 The second column to use for calculating the cofactor - * See http://en.wikipedia.org/wiki/Cofactor_(linear_algebra) for more details - */ - b3Scalar cofac(int r1, int c1, int r2, int c2) const - { - return m_el[r1][c1] * m_el[r2][c2] - m_el[r1][c2] * m_el[r2][c1]; - } - - void serialize(struct b3Matrix3x3Data & dataOut) const; - - void serializeFloat(struct b3Matrix3x3FloatData & dataOut) const; - - void deSerialize(const struct b3Matrix3x3Data& dataIn); - - void deSerializeFloat(const struct b3Matrix3x3FloatData& dataIn); - - void deSerializeDouble(const struct b3Matrix3x3DoubleData& dataIn); -}; - -B3_FORCE_INLINE b3Matrix3x3& -b3Matrix3x3::operator*=(const b3Matrix3x3& m) -{ -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - __m128 rv00, rv01, rv02; - __m128 rv10, rv11, rv12; - __m128 rv20, rv21, rv22; - __m128 mv0, mv1, mv2; - - rv02 = m_el[0].mVec128; - rv12 = m_el[1].mVec128; - rv22 = m_el[2].mVec128; - - mv0 = _mm_and_ps(m[0].mVec128, b3vFFF0fMask); - mv1 = _mm_and_ps(m[1].mVec128, b3vFFF0fMask); - mv2 = _mm_and_ps(m[2].mVec128, b3vFFF0fMask); - - // rv0 - rv00 = b3_splat_ps(rv02, 0); - rv01 = b3_splat_ps(rv02, 1); - rv02 = b3_splat_ps(rv02, 2); - - rv00 = _mm_mul_ps(rv00, mv0); - rv01 = _mm_mul_ps(rv01, mv1); - rv02 = _mm_mul_ps(rv02, mv2); - - // rv1 - rv10 = b3_splat_ps(rv12, 0); - rv11 = b3_splat_ps(rv12, 1); - rv12 = b3_splat_ps(rv12, 2); - - rv10 = _mm_mul_ps(rv10, mv0); - rv11 = _mm_mul_ps(rv11, mv1); - rv12 = _mm_mul_ps(rv12, mv2); - - // rv2 - rv20 = b3_splat_ps(rv22, 0); - rv21 = b3_splat_ps(rv22, 1); - rv22 = b3_splat_ps(rv22, 2); - - rv20 = _mm_mul_ps(rv20, mv0); - rv21 = _mm_mul_ps(rv21, mv1); - rv22 = _mm_mul_ps(rv22, mv2); - - rv00 = _mm_add_ps(rv00, rv01); - rv10 = _mm_add_ps(rv10, rv11); - rv20 = _mm_add_ps(rv20, rv21); - - m_el[0].mVec128 = _mm_add_ps(rv00, rv02); - m_el[1].mVec128 = _mm_add_ps(rv10, rv12); - m_el[2].mVec128 = _mm_add_ps(rv20, rv22); - -#elif defined(B3_USE_NEON) - - float32x4_t rv0, rv1, rv2; - float32x4_t v0, v1, v2; - float32x4_t mv0, mv1, mv2; - - v0 = m_el[0].mVec128; - v1 = m_el[1].mVec128; - v2 = m_el[2].mVec128; - - mv0 = (float32x4_t)vandq_s32((int32x4_t)m[0].mVec128, b3vFFF0Mask); - mv1 = (float32x4_t)vandq_s32((int32x4_t)m[1].mVec128, b3vFFF0Mask); - mv2 = (float32x4_t)vandq_s32((int32x4_t)m[2].mVec128, b3vFFF0Mask); - - rv0 = vmulq_lane_f32(mv0, vget_low_f32(v0), 0); - rv1 = vmulq_lane_f32(mv0, vget_low_f32(v1), 0); - rv2 = vmulq_lane_f32(mv0, vget_low_f32(v2), 0); - - rv0 = vmlaq_lane_f32(rv0, mv1, vget_low_f32(v0), 1); - rv1 = vmlaq_lane_f32(rv1, mv1, vget_low_f32(v1), 1); - rv2 = vmlaq_lane_f32(rv2, mv1, vget_low_f32(v2), 1); - - rv0 = vmlaq_lane_f32(rv0, mv2, vget_high_f32(v0), 0); - rv1 = vmlaq_lane_f32(rv1, mv2, vget_high_f32(v1), 0); - rv2 = vmlaq_lane_f32(rv2, mv2, vget_high_f32(v2), 0); - - m_el[0].mVec128 = rv0; - m_el[1].mVec128 = rv1; - m_el[2].mVec128 = rv2; -#else - setValue( - m.tdotx(m_el[0]), m.tdoty(m_el[0]), m.tdotz(m_el[0]), - m.tdotx(m_el[1]), m.tdoty(m_el[1]), m.tdotz(m_el[1]), - m.tdotx(m_el[2]), m.tdoty(m_el[2]), m.tdotz(m_el[2])); -#endif - return *this; -} - -B3_FORCE_INLINE b3Matrix3x3& -b3Matrix3x3::operator+=(const b3Matrix3x3& m) -{ -#if (defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE)) || defined(B3_USE_NEON) - m_el[0].mVec128 = m_el[0].mVec128 + m.m_el[0].mVec128; - m_el[1].mVec128 = m_el[1].mVec128 + m.m_el[1].mVec128; - m_el[2].mVec128 = m_el[2].mVec128 + m.m_el[2].mVec128; -#else - setValue( - m_el[0][0] + m.m_el[0][0], - m_el[0][1] + m.m_el[0][1], - m_el[0][2] + m.m_el[0][2], - m_el[1][0] + m.m_el[1][0], - m_el[1][1] + m.m_el[1][1], - m_el[1][2] + m.m_el[1][2], - m_el[2][0] + m.m_el[2][0], - m_el[2][1] + m.m_el[2][1], - m_el[2][2] + m.m_el[2][2]); -#endif - return *this; -} - -B3_FORCE_INLINE b3Matrix3x3 -operator*(const b3Matrix3x3& m, const b3Scalar& k) -{ -#if (defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE)) - __m128 vk = b3_splat_ps(_mm_load_ss((float*)&k), 0x80); - return b3Matrix3x3( - _mm_mul_ps(m[0].mVec128, vk), - _mm_mul_ps(m[1].mVec128, vk), - _mm_mul_ps(m[2].mVec128, vk)); -#elif defined(B3_USE_NEON) - return b3Matrix3x3( - vmulq_n_f32(m[0].mVec128, k), - vmulq_n_f32(m[1].mVec128, k), - vmulq_n_f32(m[2].mVec128, k)); -#else - return b3Matrix3x3( - m[0].getX() * k, m[0].getY() * k, m[0].getZ() * k, - m[1].getX() * k, m[1].getY() * k, m[1].getZ() * k, - m[2].getX() * k, m[2].getY() * k, m[2].getZ() * k); -#endif -} - -B3_FORCE_INLINE b3Matrix3x3 -operator+(const b3Matrix3x3& m1, const b3Matrix3x3& m2) -{ -#if (defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE)) || defined(B3_USE_NEON) - return b3Matrix3x3( - m1[0].mVec128 + m2[0].mVec128, - m1[1].mVec128 + m2[1].mVec128, - m1[2].mVec128 + m2[2].mVec128); -#else - return b3Matrix3x3( - m1[0][0] + m2[0][0], - m1[0][1] + m2[0][1], - m1[0][2] + m2[0][2], - - m1[1][0] + m2[1][0], - m1[1][1] + m2[1][1], - m1[1][2] + m2[1][2], - - m1[2][0] + m2[2][0], - m1[2][1] + m2[2][1], - m1[2][2] + m2[2][2]); -#endif -} - -B3_FORCE_INLINE b3Matrix3x3 -operator-(const b3Matrix3x3& m1, const b3Matrix3x3& m2) -{ -#if (defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE)) || defined(B3_USE_NEON) - return b3Matrix3x3( - m1[0].mVec128 - m2[0].mVec128, - m1[1].mVec128 - m2[1].mVec128, - m1[2].mVec128 - m2[2].mVec128); -#else - return b3Matrix3x3( - m1[0][0] - m2[0][0], - m1[0][1] - m2[0][1], - m1[0][2] - m2[0][2], - - m1[1][0] - m2[1][0], - m1[1][1] - m2[1][1], - m1[1][2] - m2[1][2], - - m1[2][0] - m2[2][0], - m1[2][1] - m2[2][1], - m1[2][2] - m2[2][2]); -#endif -} - -B3_FORCE_INLINE b3Matrix3x3& -b3Matrix3x3::operator-=(const b3Matrix3x3& m) -{ -#if (defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE)) || defined(B3_USE_NEON) - m_el[0].mVec128 = m_el[0].mVec128 - m.m_el[0].mVec128; - m_el[1].mVec128 = m_el[1].mVec128 - m.m_el[1].mVec128; - m_el[2].mVec128 = m_el[2].mVec128 - m.m_el[2].mVec128; -#else - setValue( - m_el[0][0] - m.m_el[0][0], - m_el[0][1] - m.m_el[0][1], - m_el[0][2] - m.m_el[0][2], - m_el[1][0] - m.m_el[1][0], - m_el[1][1] - m.m_el[1][1], - m_el[1][2] - m.m_el[1][2], - m_el[2][0] - m.m_el[2][0], - m_el[2][1] - m.m_el[2][1], - m_el[2][2] - m.m_el[2][2]); -#endif - return *this; -} - -B3_FORCE_INLINE b3Scalar -b3Matrix3x3::determinant() const -{ - return b3Triple((*this)[0], (*this)[1], (*this)[2]); -} - -B3_FORCE_INLINE b3Matrix3x3 -b3Matrix3x3::absolute() const -{ -#if (defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE)) - return b3Matrix3x3( - _mm_and_ps(m_el[0].mVec128, b3vAbsfMask), - _mm_and_ps(m_el[1].mVec128, b3vAbsfMask), - _mm_and_ps(m_el[2].mVec128, b3vAbsfMask)); -#elif defined(B3_USE_NEON) - return b3Matrix3x3( - (float32x4_t)vandq_s32((int32x4_t)m_el[0].mVec128, b3v3AbsMask), - (float32x4_t)vandq_s32((int32x4_t)m_el[1].mVec128, b3v3AbsMask), - (float32x4_t)vandq_s32((int32x4_t)m_el[2].mVec128, b3v3AbsMask)); -#else - return b3Matrix3x3( - b3Fabs(m_el[0].getX()), b3Fabs(m_el[0].getY()), b3Fabs(m_el[0].getZ()), - b3Fabs(m_el[1].getX()), b3Fabs(m_el[1].getY()), b3Fabs(m_el[1].getZ()), - b3Fabs(m_el[2].getX()), b3Fabs(m_el[2].getY()), b3Fabs(m_el[2].getZ())); -#endif -} - -B3_FORCE_INLINE b3Matrix3x3 -b3Matrix3x3::transpose() const -{ -#if (defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE)) - __m128 v0 = m_el[0].mVec128; - __m128 v1 = m_el[1].mVec128; - __m128 v2 = m_el[2].mVec128; // x2 y2 z2 w2 - __m128 vT; - - v2 = _mm_and_ps(v2, b3vFFF0fMask); // x2 y2 z2 0 - - vT = _mm_unpackhi_ps(v0, v1); // z0 z1 * * - v0 = _mm_unpacklo_ps(v0, v1); // x0 x1 y0 y1 - - v1 = _mm_shuffle_ps(v0, v2, B3_SHUFFLE(2, 3, 1, 3)); // y0 y1 y2 0 - v0 = _mm_shuffle_ps(v0, v2, B3_SHUFFLE(0, 1, 0, 3)); // x0 x1 x2 0 - v2 = b3CastdTo128f(_mm_move_sd(b3CastfTo128d(v2), b3CastfTo128d(vT))); // z0 z1 z2 0 - - return b3Matrix3x3(v0, v1, v2); -#elif defined(B3_USE_NEON) - // note: zeros the w channel. We can preserve it at the cost of two more vtrn instructions. - static const uint32x2_t zMask = (const uint32x2_t){-1, 0}; - float32x4x2_t top = vtrnq_f32(m_el[0].mVec128, m_el[1].mVec128); // {x0 x1 z0 z1}, {y0 y1 w0 w1} - float32x2x2_t bl = vtrn_f32(vget_low_f32(m_el[2].mVec128), vdup_n_f32(0.0f)); // {x2 0 }, {y2 0} - float32x4_t v0 = vcombine_f32(vget_low_f32(top.val[0]), bl.val[0]); - float32x4_t v1 = vcombine_f32(vget_low_f32(top.val[1]), bl.val[1]); - float32x2_t q = (float32x2_t)vand_u32((uint32x2_t)vget_high_f32(m_el[2].mVec128), zMask); - float32x4_t v2 = vcombine_f32(vget_high_f32(top.val[0]), q); // z0 z1 z2 0 - return b3Matrix3x3(v0, v1, v2); -#else - return b3Matrix3x3(m_el[0].getX(), m_el[1].getX(), m_el[2].getX(), - m_el[0].getY(), m_el[1].getY(), m_el[2].getY(), - m_el[0].getZ(), m_el[1].getZ(), m_el[2].getZ()); -#endif -} - -B3_FORCE_INLINE b3Matrix3x3 -b3Matrix3x3::adjoint() const -{ - return b3Matrix3x3(cofac(1, 1, 2, 2), cofac(0, 2, 2, 1), cofac(0, 1, 1, 2), - cofac(1, 2, 2, 0), cofac(0, 0, 2, 2), cofac(0, 2, 1, 0), - cofac(1, 0, 2, 1), cofac(0, 1, 2, 0), cofac(0, 0, 1, 1)); -} - -B3_FORCE_INLINE b3Matrix3x3 -b3Matrix3x3::inverse() const -{ - b3Vector3 co = b3MakeVector3(cofac(1, 1, 2, 2), cofac(1, 2, 2, 0), cofac(1, 0, 2, 1)); - b3Scalar det = (*this)[0].dot(co); - b3FullAssert(det != b3Scalar(0.0)); - b3Scalar s = b3Scalar(1.0) / det; - return b3Matrix3x3(co.getX() * s, cofac(0, 2, 2, 1) * s, cofac(0, 1, 1, 2) * s, - co.getY() * s, cofac(0, 0, 2, 2) * s, cofac(0, 2, 1, 0) * s, - co.getZ() * s, cofac(0, 1, 2, 0) * s, cofac(0, 0, 1, 1) * s); -} - -B3_FORCE_INLINE b3Matrix3x3 -b3Matrix3x3::transposeTimes(const b3Matrix3x3& m) const -{ -#if (defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE)) - // zeros w - // static const __m128i xyzMask = (const __m128i){ -1ULL, 0xffffffffULL }; - __m128 row = m_el[0].mVec128; - __m128 m0 = _mm_and_ps(m.getRow(0).mVec128, b3vFFF0fMask); - __m128 m1 = _mm_and_ps(m.getRow(1).mVec128, b3vFFF0fMask); - __m128 m2 = _mm_and_ps(m.getRow(2).mVec128, b3vFFF0fMask); - __m128 r0 = _mm_mul_ps(m0, _mm_shuffle_ps(row, row, 0)); - __m128 r1 = _mm_mul_ps(m0, _mm_shuffle_ps(row, row, 0x55)); - __m128 r2 = _mm_mul_ps(m0, _mm_shuffle_ps(row, row, 0xaa)); - row = m_el[1].mVec128; - r0 = _mm_add_ps(r0, _mm_mul_ps(m1, _mm_shuffle_ps(row, row, 0))); - r1 = _mm_add_ps(r1, _mm_mul_ps(m1, _mm_shuffle_ps(row, row, 0x55))); - r2 = _mm_add_ps(r2, _mm_mul_ps(m1, _mm_shuffle_ps(row, row, 0xaa))); - row = m_el[2].mVec128; - r0 = _mm_add_ps(r0, _mm_mul_ps(m2, _mm_shuffle_ps(row, row, 0))); - r1 = _mm_add_ps(r1, _mm_mul_ps(m2, _mm_shuffle_ps(row, row, 0x55))); - r2 = _mm_add_ps(r2, _mm_mul_ps(m2, _mm_shuffle_ps(row, row, 0xaa))); - return b3Matrix3x3(r0, r1, r2); - -#elif defined B3_USE_NEON - // zeros w - static const uint32x4_t xyzMask = (const uint32x4_t){-1, -1, -1, 0}; - float32x4_t m0 = (float32x4_t)vandq_u32((uint32x4_t)m.getRow(0).mVec128, xyzMask); - float32x4_t m1 = (float32x4_t)vandq_u32((uint32x4_t)m.getRow(1).mVec128, xyzMask); - float32x4_t m2 = (float32x4_t)vandq_u32((uint32x4_t)m.getRow(2).mVec128, xyzMask); - float32x4_t row = m_el[0].mVec128; - float32x4_t r0 = vmulq_lane_f32(m0, vget_low_f32(row), 0); - float32x4_t r1 = vmulq_lane_f32(m0, vget_low_f32(row), 1); - float32x4_t r2 = vmulq_lane_f32(m0, vget_high_f32(row), 0); - row = m_el[1].mVec128; - r0 = vmlaq_lane_f32(r0, m1, vget_low_f32(row), 0); - r1 = vmlaq_lane_f32(r1, m1, vget_low_f32(row), 1); - r2 = vmlaq_lane_f32(r2, m1, vget_high_f32(row), 0); - row = m_el[2].mVec128; - r0 = vmlaq_lane_f32(r0, m2, vget_low_f32(row), 0); - r1 = vmlaq_lane_f32(r1, m2, vget_low_f32(row), 1); - r2 = vmlaq_lane_f32(r2, m2, vget_high_f32(row), 0); - return b3Matrix3x3(r0, r1, r2); -#else - return b3Matrix3x3( - m_el[0].getX() * m[0].getX() + m_el[1].getX() * m[1].getX() + m_el[2].getX() * m[2].getX(), - m_el[0].getX() * m[0].getY() + m_el[1].getX() * m[1].getY() + m_el[2].getX() * m[2].getY(), - m_el[0].getX() * m[0].getZ() + m_el[1].getX() * m[1].getZ() + m_el[2].getX() * m[2].getZ(), - m_el[0].getY() * m[0].getX() + m_el[1].getY() * m[1].getX() + m_el[2].getY() * m[2].getX(), - m_el[0].getY() * m[0].getY() + m_el[1].getY() * m[1].getY() + m_el[2].getY() * m[2].getY(), - m_el[0].getY() * m[0].getZ() + m_el[1].getY() * m[1].getZ() + m_el[2].getY() * m[2].getZ(), - m_el[0].getZ() * m[0].getX() + m_el[1].getZ() * m[1].getX() + m_el[2].getZ() * m[2].getX(), - m_el[0].getZ() * m[0].getY() + m_el[1].getZ() * m[1].getY() + m_el[2].getZ() * m[2].getY(), - m_el[0].getZ() * m[0].getZ() + m_el[1].getZ() * m[1].getZ() + m_el[2].getZ() * m[2].getZ()); -#endif -} - -B3_FORCE_INLINE b3Matrix3x3 -b3Matrix3x3::timesTranspose(const b3Matrix3x3& m) const -{ -#if (defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE)) - __m128 a0 = m_el[0].mVec128; - __m128 a1 = m_el[1].mVec128; - __m128 a2 = m_el[2].mVec128; - - b3Matrix3x3 mT = m.transpose(); // we rely on transpose() zeroing w channel so that we don't have to do it here - __m128 mx = mT[0].mVec128; - __m128 my = mT[1].mVec128; - __m128 mz = mT[2].mVec128; - - __m128 r0 = _mm_mul_ps(mx, _mm_shuffle_ps(a0, a0, 0x00)); - __m128 r1 = _mm_mul_ps(mx, _mm_shuffle_ps(a1, a1, 0x00)); - __m128 r2 = _mm_mul_ps(mx, _mm_shuffle_ps(a2, a2, 0x00)); - r0 = _mm_add_ps(r0, _mm_mul_ps(my, _mm_shuffle_ps(a0, a0, 0x55))); - r1 = _mm_add_ps(r1, _mm_mul_ps(my, _mm_shuffle_ps(a1, a1, 0x55))); - r2 = _mm_add_ps(r2, _mm_mul_ps(my, _mm_shuffle_ps(a2, a2, 0x55))); - r0 = _mm_add_ps(r0, _mm_mul_ps(mz, _mm_shuffle_ps(a0, a0, 0xaa))); - r1 = _mm_add_ps(r1, _mm_mul_ps(mz, _mm_shuffle_ps(a1, a1, 0xaa))); - r2 = _mm_add_ps(r2, _mm_mul_ps(mz, _mm_shuffle_ps(a2, a2, 0xaa))); - return b3Matrix3x3(r0, r1, r2); - -#elif defined B3_USE_NEON - float32x4_t a0 = m_el[0].mVec128; - float32x4_t a1 = m_el[1].mVec128; - float32x4_t a2 = m_el[2].mVec128; - - b3Matrix3x3 mT = m.transpose(); // we rely on transpose() zeroing w channel so that we don't have to do it here - float32x4_t mx = mT[0].mVec128; - float32x4_t my = mT[1].mVec128; - float32x4_t mz = mT[2].mVec128; - - float32x4_t r0 = vmulq_lane_f32(mx, vget_low_f32(a0), 0); - float32x4_t r1 = vmulq_lane_f32(mx, vget_low_f32(a1), 0); - float32x4_t r2 = vmulq_lane_f32(mx, vget_low_f32(a2), 0); - r0 = vmlaq_lane_f32(r0, my, vget_low_f32(a0), 1); - r1 = vmlaq_lane_f32(r1, my, vget_low_f32(a1), 1); - r2 = vmlaq_lane_f32(r2, my, vget_low_f32(a2), 1); - r0 = vmlaq_lane_f32(r0, mz, vget_high_f32(a0), 0); - r1 = vmlaq_lane_f32(r1, mz, vget_high_f32(a1), 0); - r2 = vmlaq_lane_f32(r2, mz, vget_high_f32(a2), 0); - return b3Matrix3x3(r0, r1, r2); - -#else - return b3Matrix3x3( - m_el[0].dot(m[0]), m_el[0].dot(m[1]), m_el[0].dot(m[2]), - m_el[1].dot(m[0]), m_el[1].dot(m[1]), m_el[1].dot(m[2]), - m_el[2].dot(m[0]), m_el[2].dot(m[1]), m_el[2].dot(m[2])); -#endif -} - -B3_FORCE_INLINE b3Vector3 -operator*(const b3Matrix3x3& m, const b3Vector3& v) -{ -#if (defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE)) || defined(B3_USE_NEON) - return v.dot3(m[0], m[1], m[2]); -#else - return b3MakeVector3(m[0].dot(v), m[1].dot(v), m[2].dot(v)); -#endif -} - -B3_FORCE_INLINE b3Vector3 -operator*(const b3Vector3& v, const b3Matrix3x3& m) -{ -#if (defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE)) - - const __m128 vv = v.mVec128; - - __m128 c0 = b3_splat_ps(vv, 0); - __m128 c1 = b3_splat_ps(vv, 1); - __m128 c2 = b3_splat_ps(vv, 2); - - c0 = _mm_mul_ps(c0, _mm_and_ps(m[0].mVec128, b3vFFF0fMask)); - c1 = _mm_mul_ps(c1, _mm_and_ps(m[1].mVec128, b3vFFF0fMask)); - c0 = _mm_add_ps(c0, c1); - c2 = _mm_mul_ps(c2, _mm_and_ps(m[2].mVec128, b3vFFF0fMask)); - - return b3MakeVector3(_mm_add_ps(c0, c2)); -#elif defined(B3_USE_NEON) - const float32x4_t vv = v.mVec128; - const float32x2_t vlo = vget_low_f32(vv); - const float32x2_t vhi = vget_high_f32(vv); - - float32x4_t c0, c1, c2; - - c0 = (float32x4_t)vandq_s32((int32x4_t)m[0].mVec128, b3vFFF0Mask); - c1 = (float32x4_t)vandq_s32((int32x4_t)m[1].mVec128, b3vFFF0Mask); - c2 = (float32x4_t)vandq_s32((int32x4_t)m[2].mVec128, b3vFFF0Mask); - - c0 = vmulq_lane_f32(c0, vlo, 0); - c1 = vmulq_lane_f32(c1, vlo, 1); - c2 = vmulq_lane_f32(c2, vhi, 0); - c0 = vaddq_f32(c0, c1); - c0 = vaddq_f32(c0, c2); - - return b3MakeVector3(c0); -#else - return b3MakeVector3(m.tdotx(v), m.tdoty(v), m.tdotz(v)); -#endif -} - -B3_FORCE_INLINE b3Matrix3x3 -operator*(const b3Matrix3x3& m1, const b3Matrix3x3& m2) -{ -#if (defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE)) - - __m128 m10 = m1[0].mVec128; - __m128 m11 = m1[1].mVec128; - __m128 m12 = m1[2].mVec128; - - __m128 m2v = _mm_and_ps(m2[0].mVec128, b3vFFF0fMask); - - __m128 c0 = b3_splat_ps(m10, 0); - __m128 c1 = b3_splat_ps(m11, 0); - __m128 c2 = b3_splat_ps(m12, 0); - - c0 = _mm_mul_ps(c0, m2v); - c1 = _mm_mul_ps(c1, m2v); - c2 = _mm_mul_ps(c2, m2v); - - m2v = _mm_and_ps(m2[1].mVec128, b3vFFF0fMask); - - __m128 c0_1 = b3_splat_ps(m10, 1); - __m128 c1_1 = b3_splat_ps(m11, 1); - __m128 c2_1 = b3_splat_ps(m12, 1); - - c0_1 = _mm_mul_ps(c0_1, m2v); - c1_1 = _mm_mul_ps(c1_1, m2v); - c2_1 = _mm_mul_ps(c2_1, m2v); - - m2v = _mm_and_ps(m2[2].mVec128, b3vFFF0fMask); - - c0 = _mm_add_ps(c0, c0_1); - c1 = _mm_add_ps(c1, c1_1); - c2 = _mm_add_ps(c2, c2_1); - - m10 = b3_splat_ps(m10, 2); - m11 = b3_splat_ps(m11, 2); - m12 = b3_splat_ps(m12, 2); - - m10 = _mm_mul_ps(m10, m2v); - m11 = _mm_mul_ps(m11, m2v); - m12 = _mm_mul_ps(m12, m2v); - - c0 = _mm_add_ps(c0, m10); - c1 = _mm_add_ps(c1, m11); - c2 = _mm_add_ps(c2, m12); - - return b3Matrix3x3(c0, c1, c2); - -#elif defined(B3_USE_NEON) - - float32x4_t rv0, rv1, rv2; - float32x4_t v0, v1, v2; - float32x4_t mv0, mv1, mv2; - - v0 = m1[0].mVec128; - v1 = m1[1].mVec128; - v2 = m1[2].mVec128; - - mv0 = (float32x4_t)vandq_s32((int32x4_t)m2[0].mVec128, b3vFFF0Mask); - mv1 = (float32x4_t)vandq_s32((int32x4_t)m2[1].mVec128, b3vFFF0Mask); - mv2 = (float32x4_t)vandq_s32((int32x4_t)m2[2].mVec128, b3vFFF0Mask); - - rv0 = vmulq_lane_f32(mv0, vget_low_f32(v0), 0); - rv1 = vmulq_lane_f32(mv0, vget_low_f32(v1), 0); - rv2 = vmulq_lane_f32(mv0, vget_low_f32(v2), 0); - - rv0 = vmlaq_lane_f32(rv0, mv1, vget_low_f32(v0), 1); - rv1 = vmlaq_lane_f32(rv1, mv1, vget_low_f32(v1), 1); - rv2 = vmlaq_lane_f32(rv2, mv1, vget_low_f32(v2), 1); - - rv0 = vmlaq_lane_f32(rv0, mv2, vget_high_f32(v0), 0); - rv1 = vmlaq_lane_f32(rv1, mv2, vget_high_f32(v1), 0); - rv2 = vmlaq_lane_f32(rv2, mv2, vget_high_f32(v2), 0); - - return b3Matrix3x3(rv0, rv1, rv2); - -#else - return b3Matrix3x3( - m2.tdotx(m1[0]), m2.tdoty(m1[0]), m2.tdotz(m1[0]), - m2.tdotx(m1[1]), m2.tdoty(m1[1]), m2.tdotz(m1[1]), - m2.tdotx(m1[2]), m2.tdoty(m1[2]), m2.tdotz(m1[2])); -#endif -} - -/* -B3_FORCE_INLINE b3Matrix3x3 b3MultTransposeLeft(const b3Matrix3x3& m1, const b3Matrix3x3& m2) { -return b3Matrix3x3( -m1[0][0] * m2[0][0] + m1[1][0] * m2[1][0] + m1[2][0] * m2[2][0], -m1[0][0] * m2[0][1] + m1[1][0] * m2[1][1] + m1[2][0] * m2[2][1], -m1[0][0] * m2[0][2] + m1[1][0] * m2[1][2] + m1[2][0] * m2[2][2], -m1[0][1] * m2[0][0] + m1[1][1] * m2[1][0] + m1[2][1] * m2[2][0], -m1[0][1] * m2[0][1] + m1[1][1] * m2[1][1] + m1[2][1] * m2[2][1], -m1[0][1] * m2[0][2] + m1[1][1] * m2[1][2] + m1[2][1] * m2[2][2], -m1[0][2] * m2[0][0] + m1[1][2] * m2[1][0] + m1[2][2] * m2[2][0], -m1[0][2] * m2[0][1] + m1[1][2] * m2[1][1] + m1[2][2] * m2[2][1], -m1[0][2] * m2[0][2] + m1[1][2] * m2[1][2] + m1[2][2] * m2[2][2]); -} -*/ - -/**@brief Equality operator between two matrices -* It will test all elements are equal. */ -B3_FORCE_INLINE bool operator==(const b3Matrix3x3& m1, const b3Matrix3x3& m2) -{ -#if (defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE)) - - __m128 c0, c1, c2; - - c0 = _mm_cmpeq_ps(m1[0].mVec128, m2[0].mVec128); - c1 = _mm_cmpeq_ps(m1[1].mVec128, m2[1].mVec128); - c2 = _mm_cmpeq_ps(m1[2].mVec128, m2[2].mVec128); - - c0 = _mm_and_ps(c0, c1); - c0 = _mm_and_ps(c0, c2); - - return (0x7 == _mm_movemask_ps((__m128)c0)); -#else - return (m1[0][0] == m2[0][0] && m1[1][0] == m2[1][0] && m1[2][0] == m2[2][0] && - m1[0][1] == m2[0][1] && m1[1][1] == m2[1][1] && m1[2][1] == m2[2][1] && - m1[0][2] == m2[0][2] && m1[1][2] == m2[1][2] && m1[2][2] == m2[2][2]); -#endif -} - -///for serialization -struct b3Matrix3x3FloatData -{ - b3Vector3FloatData m_el[3]; -}; - -///for serialization -struct b3Matrix3x3DoubleData -{ - b3Vector3DoubleData m_el[3]; -}; - -B3_FORCE_INLINE void b3Matrix3x3::serialize(struct b3Matrix3x3Data& dataOut) const -{ - for (int i = 0; i < 3; i++) - m_el[i].serialize(dataOut.m_el[i]); -} - -B3_FORCE_INLINE void b3Matrix3x3::serializeFloat(struct b3Matrix3x3FloatData& dataOut) const -{ - for (int i = 0; i < 3; i++) - m_el[i].serializeFloat(dataOut.m_el[i]); -} - -B3_FORCE_INLINE void b3Matrix3x3::deSerialize(const struct b3Matrix3x3Data& dataIn) -{ - for (int i = 0; i < 3; i++) - m_el[i].deSerialize(dataIn.m_el[i]); -} - -B3_FORCE_INLINE void b3Matrix3x3::deSerializeFloat(const struct b3Matrix3x3FloatData& dataIn) -{ - for (int i = 0; i < 3; i++) - m_el[i].deSerializeFloat(dataIn.m_el[i]); -} - -B3_FORCE_INLINE void b3Matrix3x3::deSerializeDouble(const struct b3Matrix3x3DoubleData& dataIn) -{ - for (int i = 0; i < 3; i++) - m_el[i].deSerializeDouble(dataIn.m_el[i]); -} - -#endif //B3_MATRIX3x3_H diff --git a/engine/inc/bullet/Bullet3Common/b3MinMax.h b/engine/inc/bullet/Bullet3Common/b3MinMax.h deleted file mode 100644 index c09c3db3..00000000 --- a/engine/inc/bullet/Bullet3Common/b3MinMax.h +++ /dev/null @@ -1,69 +0,0 @@ -/* -Copyright (c) 2003-2013 Gino van den Bergen / Erwin Coumans http://bulletphysics.org - -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 B3_GEN_MINMAX_H -#define B3_GEN_MINMAX_H - -#include "b3Scalar.h" - -template -B3_FORCE_INLINE const T& b3Min(const T& a, const T& b) -{ - return a < b ? a : b; -} - -template -B3_FORCE_INLINE const T& b3Max(const T& a, const T& b) -{ - return a > b ? a : b; -} - -template -B3_FORCE_INLINE const T& b3Clamped(const T& a, const T& lb, const T& ub) -{ - return a < lb ? lb : (ub < a ? ub : a); -} - -template -B3_FORCE_INLINE void b3SetMin(T& a, const T& b) -{ - if (b < a) - { - a = b; - } -} - -template -B3_FORCE_INLINE void b3SetMax(T& a, const T& b) -{ - if (a < b) - { - a = b; - } -} - -template -B3_FORCE_INLINE void b3Clamp(T& a, const T& lb, const T& ub) -{ - if (a < lb) - { - a = lb; - } - else if (ub < a) - { - a = ub; - } -} - -#endif //B3_GEN_MINMAX_H diff --git a/engine/inc/bullet/Bullet3Common/b3PoolAllocator.h b/engine/inc/bullet/Bullet3Common/b3PoolAllocator.h deleted file mode 100644 index ed56bc62..00000000 --- a/engine/inc/bullet/Bullet3Common/b3PoolAllocator.h +++ /dev/null @@ -1,121 +0,0 @@ -/* -Copyright (c) 2003-2013 Gino van den Bergen / Erwin Coumans http://bulletphysics.org - -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_POOL_ALLOCATOR_H -#define _BT_POOL_ALLOCATOR_H - -#include "b3Scalar.h" -#include "b3AlignedAllocator.h" - -///The b3PoolAllocator class allows to efficiently allocate a large pool of objects, instead of dynamically allocating them separately. -class b3PoolAllocator -{ - int m_elemSize; - int m_maxElements; - int m_freeCount; - void* m_firstFree; - unsigned char* m_pool; - -public: - b3PoolAllocator(int elemSize, int maxElements) - : m_elemSize(elemSize), - m_maxElements(maxElements) - { - m_pool = (unsigned char*)b3AlignedAlloc(static_cast(m_elemSize * m_maxElements), 16); - - unsigned char* p = m_pool; - m_firstFree = p; - m_freeCount = m_maxElements; - int count = m_maxElements; - while (--count) - { - *(void**)p = (p + m_elemSize); - p += m_elemSize; - } - *(void**)p = 0; - } - - ~b3PoolAllocator() - { - b3AlignedFree(m_pool); - } - - int getFreeCount() const - { - return m_freeCount; - } - - int getUsedCount() const - { - return m_maxElements - m_freeCount; - } - - int getMaxCount() const - { - return m_maxElements; - } - - void* allocate(int size) - { - // release mode fix - (void)size; - b3Assert(!size || size <= m_elemSize); - b3Assert(m_freeCount > 0); - void* result = m_firstFree; - m_firstFree = *(void**)m_firstFree; - --m_freeCount; - return result; - } - - bool validPtr(void* ptr) - { - if (ptr) - { - if (((unsigned char*)ptr >= m_pool && (unsigned char*)ptr < m_pool + m_maxElements * m_elemSize)) - { - return true; - } - } - return false; - } - - void freeMemory(void* ptr) - { - if (ptr) - { - b3Assert((unsigned char*)ptr >= m_pool && (unsigned char*)ptr < m_pool + m_maxElements * m_elemSize); - - *(void**)ptr = m_firstFree; - m_firstFree = ptr; - ++m_freeCount; - } - } - - int getElementSize() const - { - return m_elemSize; - } - - unsigned char* getPoolAddress() - { - return m_pool; - } - - const unsigned char* getPoolAddress() const - { - return m_pool; - } -}; - -#endif //_BT_POOL_ALLOCATOR_H diff --git a/engine/inc/bullet/Bullet3Common/b3QuadWord.h b/engine/inc/bullet/Bullet3Common/b3QuadWord.h deleted file mode 100644 index 0def305f..00000000 --- a/engine/inc/bullet/Bullet3Common/b3QuadWord.h +++ /dev/null @@ -1,242 +0,0 @@ -/* -Copyright (c) 2003-2013 Gino van den Bergen / Erwin Coumans http://bulletphysics.org - -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 B3_SIMD_QUADWORD_H -#define B3_SIMD_QUADWORD_H - -#include "b3Scalar.h" -#include "b3MinMax.h" - -#if defined(__CELLOS_LV2) && defined(__SPU__) -#include -#endif - -/**@brief The b3QuadWord class is base class for b3Vector3 and b3Quaternion. - * Some issues under PS3 Linux with IBM 2.1 SDK, gcc compiler prevent from using aligned quadword. - */ -#ifndef USE_LIBSPE2 -B3_ATTRIBUTE_ALIGNED16(class) -b3QuadWord -#else -class b3QuadWord -#endif -{ -protected: -#if defined(__SPU__) && defined(__CELLOS_LV2__) - union { - vec_float4 mVec128; - b3Scalar m_floats[4]; - }; - -public: - vec_float4 get128() const - { - return mVec128; - } - -#else //__CELLOS_LV2__ __SPU__ - -#if defined(B3_USE_SSE) || defined(B3_USE_NEON) -public: - union { - b3SimdFloat4 mVec128; - b3Scalar m_floats[4]; - struct - { - b3Scalar x, y, z, w; - }; - }; - -public: - B3_FORCE_INLINE b3SimdFloat4 get128() const - { - return mVec128; - } - B3_FORCE_INLINE void set128(b3SimdFloat4 v128) - { - mVec128 = v128; - } -#else -public: - union { - b3Scalar m_floats[4]; - struct - { - b3Scalar x, y, z, w; - }; - }; -#endif // B3_USE_SSE - -#endif //__CELLOS_LV2__ __SPU__ - -public: -#if defined(B3_USE_SSE) || defined(B3_USE_NEON) - - // Set Vector - B3_FORCE_INLINE b3QuadWord(const b3SimdFloat4 vec) - { - mVec128 = vec; - } - - // Copy constructor - B3_FORCE_INLINE b3QuadWord(const b3QuadWord& rhs) - { - mVec128 = rhs.mVec128; - } - - // Assignment Operator - B3_FORCE_INLINE b3QuadWord& - operator=(const b3QuadWord& v) - { - mVec128 = v.mVec128; - - return *this; - } - -#endif - - /**@brief Return the x value */ - B3_FORCE_INLINE const b3Scalar& getX() const { return m_floats[0]; } - /**@brief Return the y value */ - B3_FORCE_INLINE const b3Scalar& getY() const { return m_floats[1]; } - /**@brief Return the z value */ - B3_FORCE_INLINE const b3Scalar& getZ() const { return m_floats[2]; } - /**@brief Set the x value */ - B3_FORCE_INLINE void setX(b3Scalar _x) { m_floats[0] = _x; }; - /**@brief Set the y value */ - B3_FORCE_INLINE void setY(b3Scalar _y) { m_floats[1] = _y; }; - /**@brief Set the z value */ - B3_FORCE_INLINE void setZ(b3Scalar _z) { m_floats[2] = _z; }; - /**@brief Set the w value */ - B3_FORCE_INLINE void setW(b3Scalar _w) { m_floats[3] = _w; }; - /**@brief Return the x value */ - - //B3_FORCE_INLINE b3Scalar& operator[](int i) { return (&m_floats[0])[i]; } - //B3_FORCE_INLINE const b3Scalar& operator[](int i) const { return (&m_floats[0])[i]; } - ///operator b3Scalar*() replaces operator[], using implicit conversion. We added operator != and operator == to avoid pointer comparisons. - B3_FORCE_INLINE operator b3Scalar*() { return &m_floats[0]; } - B3_FORCE_INLINE operator const b3Scalar*() const { return &m_floats[0]; } - - B3_FORCE_INLINE bool operator==(const b3QuadWord& other) const - { -#ifdef B3_USE_SSE - return (0xf == _mm_movemask_ps((__m128)_mm_cmpeq_ps(mVec128, other.mVec128))); -#else - return ((m_floats[3] == other.m_floats[3]) && - (m_floats[2] == other.m_floats[2]) && - (m_floats[1] == other.m_floats[1]) && - (m_floats[0] == other.m_floats[0])); -#endif - } - - B3_FORCE_INLINE bool operator!=(const b3QuadWord& other) const - { - return !(*this == other); - } - - /**@brief Set x,y,z and zero w - * @param x Value of x - * @param y Value of y - * @param z Value of z - */ - B3_FORCE_INLINE void setValue(const b3Scalar& _x, const b3Scalar& _y, const b3Scalar& _z) - { - m_floats[0] = _x; - m_floats[1] = _y; - m_floats[2] = _z; - m_floats[3] = 0.f; - } - - /* void getValue(b3Scalar *m) const - { - m[0] = m_floats[0]; - m[1] = m_floats[1]; - m[2] = m_floats[2]; - } -*/ - /**@brief Set the values - * @param x Value of x - * @param y Value of y - * @param z Value of z - * @param w Value of w - */ - B3_FORCE_INLINE void setValue(const b3Scalar& _x, const b3Scalar& _y, const b3Scalar& _z, const b3Scalar& _w) - { - m_floats[0] = _x; - m_floats[1] = _y; - m_floats[2] = _z; - m_floats[3] = _w; - } - /**@brief No initialization constructor */ - B3_FORCE_INLINE b3QuadWord() - // :m_floats[0](b3Scalar(0.)),m_floats[1](b3Scalar(0.)),m_floats[2](b3Scalar(0.)),m_floats[3](b3Scalar(0.)) - { - } - - /**@brief Three argument constructor (zeros w) - * @param x Value of x - * @param y Value of y - * @param z Value of z - */ - B3_FORCE_INLINE b3QuadWord(const b3Scalar& _x, const b3Scalar& _y, const b3Scalar& _z) - { - m_floats[0] = _x, m_floats[1] = _y, m_floats[2] = _z, m_floats[3] = 0.0f; - } - - /**@brief Initializing constructor - * @param x Value of x - * @param y Value of y - * @param z Value of z - * @param w Value of w - */ - B3_FORCE_INLINE b3QuadWord(const b3Scalar& _x, const b3Scalar& _y, const b3Scalar& _z, const b3Scalar& _w) - { - m_floats[0] = _x, m_floats[1] = _y, m_floats[2] = _z, m_floats[3] = _w; - } - - /**@brief Set each element to the max of the current values and the values of another b3QuadWord - * @param other The other b3QuadWord to compare with - */ - B3_FORCE_INLINE void setMax(const b3QuadWord& other) - { -#ifdef B3_USE_SSE - mVec128 = _mm_max_ps(mVec128, other.mVec128); -#elif defined(B3_USE_NEON) - mVec128 = vmaxq_f32(mVec128, other.mVec128); -#else - b3SetMax(m_floats[0], other.m_floats[0]); - b3SetMax(m_floats[1], other.m_floats[1]); - b3SetMax(m_floats[2], other.m_floats[2]); - b3SetMax(m_floats[3], other.m_floats[3]); -#endif - } - /**@brief Set each element to the min of the current values and the values of another b3QuadWord - * @param other The other b3QuadWord to compare with - */ - B3_FORCE_INLINE void setMin(const b3QuadWord& other) - { -#ifdef B3_USE_SSE - mVec128 = _mm_min_ps(mVec128, other.mVec128); -#elif defined(B3_USE_NEON) - mVec128 = vminq_f32(mVec128, other.mVec128); -#else - b3SetMin(m_floats[0], other.m_floats[0]); - b3SetMin(m_floats[1], other.m_floats[1]); - b3SetMin(m_floats[2], other.m_floats[2]); - b3SetMin(m_floats[3], other.m_floats[3]); -#endif - } -}; - -#endif //B3_SIMD_QUADWORD_H diff --git a/engine/inc/bullet/Bullet3Common/b3Quaternion.h b/engine/inc/bullet/Bullet3Common/b3Quaternion.h deleted file mode 100644 index 4fdd72dc..00000000 --- a/engine/inc/bullet/Bullet3Common/b3Quaternion.h +++ /dev/null @@ -1,908 +0,0 @@ -/* -Copyright (c) 2003-2013 Gino van den Bergen / Erwin Coumans http://bulletphysics.org - -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 B3_SIMD__QUATERNION_H_ -#define B3_SIMD__QUATERNION_H_ - -#include "b3Vector3.h" -#include "b3QuadWord.h" - -#ifdef B3_USE_SSE - -const __m128 B3_ATTRIBUTE_ALIGNED16(b3vOnes) = {1.0f, 1.0f, 1.0f, 1.0f}; - -#endif - -#if defined(B3_USE_SSE) || defined(B3_USE_NEON) - -const b3SimdFloat4 B3_ATTRIBUTE_ALIGNED16(b3vQInv) = {-0.0f, -0.0f, -0.0f, +0.0f}; -const b3SimdFloat4 B3_ATTRIBUTE_ALIGNED16(b3vPPPM) = {+0.0f, +0.0f, +0.0f, -0.0f}; - -#endif - -/**@brief The b3Quaternion implements quaternion to perform linear algebra rotations in combination with b3Matrix3x3, b3Vector3 and b3Transform. */ -class b3Quaternion : public b3QuadWord -{ -public: - /**@brief No initialization constructor */ - b3Quaternion() {} - -#if (defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE)) || defined(B3_USE_NEON) - // Set Vector - B3_FORCE_INLINE b3Quaternion(const b3SimdFloat4 vec) - { - mVec128 = vec; - } - - // Copy constructor - B3_FORCE_INLINE b3Quaternion(const b3Quaternion& rhs) - { - mVec128 = rhs.mVec128; - } - - // Assignment Operator - B3_FORCE_INLINE b3Quaternion& - operator=(const b3Quaternion& v) - { - mVec128 = v.mVec128; - - return *this; - } - -#endif - - // template - // explicit Quaternion(const b3Scalar *v) : Tuple4(v) {} - /**@brief Constructor from scalars */ - b3Quaternion(const b3Scalar& _x, const b3Scalar& _y, const b3Scalar& _z, const b3Scalar& _w) - : b3QuadWord(_x, _y, _z, _w) - { - //b3Assert(!((_x==1.f) && (_y==0.f) && (_z==0.f) && (_w==0.f))); - } - /**@brief Axis angle Constructor - * @param axis The axis which the rotation is around - * @param angle The magnitude of the rotation around the angle (Radians) */ - b3Quaternion(const b3Vector3& _axis, const b3Scalar& _angle) - { - setRotation(_axis, _angle); - } - /**@brief Constructor from Euler angles - * @param yaw Angle around Y unless B3_EULER_DEFAULT_ZYX defined then Z - * @param pitch Angle around X unless B3_EULER_DEFAULT_ZYX defined then Y - * @param roll Angle around Z unless B3_EULER_DEFAULT_ZYX defined then X */ - b3Quaternion(const b3Scalar& yaw, const b3Scalar& pitch, const b3Scalar& roll) - { -#ifndef B3_EULER_DEFAULT_ZYX - setEuler(yaw, pitch, roll); -#else - setEulerZYX(yaw, pitch, roll); -#endif - } - /**@brief Set the rotation using axis angle notation - * @param axis The axis around which to rotate - * @param angle The magnitude of the rotation in Radians */ - void setRotation(const b3Vector3& axis1, const b3Scalar& _angle) - { - b3Vector3 axis = axis1; - axis.safeNormalize(); - - b3Scalar d = axis.length(); - b3Assert(d != b3Scalar(0.0)); - if (d < B3_EPSILON) - { - setValue(0, 0, 0, 1); - } - else - { - b3Scalar s = b3Sin(_angle * b3Scalar(0.5)) / d; - setValue(axis.getX() * s, axis.getY() * s, axis.getZ() * s, - b3Cos(_angle * b3Scalar(0.5))); - } - } - /**@brief Set the quaternion using Euler angles - * @param yaw Angle around Y - * @param pitch Angle around X - * @param roll Angle around Z */ - void setEuler(const b3Scalar& yaw, const b3Scalar& pitch, const b3Scalar& roll) - { - b3Scalar halfYaw = b3Scalar(yaw) * b3Scalar(0.5); - b3Scalar halfPitch = b3Scalar(pitch) * b3Scalar(0.5); - b3Scalar halfRoll = b3Scalar(roll) * b3Scalar(0.5); - b3Scalar cosYaw = b3Cos(halfYaw); - b3Scalar sinYaw = b3Sin(halfYaw); - b3Scalar cosPitch = b3Cos(halfPitch); - b3Scalar sinPitch = b3Sin(halfPitch); - b3Scalar cosRoll = b3Cos(halfRoll); - b3Scalar sinRoll = b3Sin(halfRoll); - setValue(cosRoll * sinPitch * cosYaw + sinRoll * cosPitch * sinYaw, - cosRoll * cosPitch * sinYaw - sinRoll * sinPitch * cosYaw, - sinRoll * cosPitch * cosYaw - cosRoll * sinPitch * sinYaw, - cosRoll * cosPitch * cosYaw + sinRoll * sinPitch * sinYaw); - } - - /**@brief Set the quaternion using euler angles - * @param yaw Angle around Z - * @param pitch Angle around Y - * @param roll Angle around X */ - void setEulerZYX(const b3Scalar& yawZ, const b3Scalar& pitchY, const b3Scalar& rollX) - { - b3Scalar halfYaw = b3Scalar(yawZ) * b3Scalar(0.5); - b3Scalar halfPitch = b3Scalar(pitchY) * b3Scalar(0.5); - b3Scalar halfRoll = b3Scalar(rollX) * b3Scalar(0.5); - b3Scalar cosYaw = b3Cos(halfYaw); - b3Scalar sinYaw = b3Sin(halfYaw); - b3Scalar cosPitch = b3Cos(halfPitch); - b3Scalar sinPitch = b3Sin(halfPitch); - b3Scalar cosRoll = b3Cos(halfRoll); - b3Scalar sinRoll = b3Sin(halfRoll); - setValue(sinRoll * cosPitch * cosYaw - cosRoll * sinPitch * sinYaw, //x - cosRoll * sinPitch * cosYaw + sinRoll * cosPitch * sinYaw, //y - cosRoll * cosPitch * sinYaw - sinRoll * sinPitch * cosYaw, //z - cosRoll * cosPitch * cosYaw + sinRoll * sinPitch * sinYaw); //formerly yzx - normalize(); - } - - /**@brief Get the euler angles from this quaternion - * @param yaw Angle around Z - * @param pitch Angle around Y - * @param roll Angle around X */ - void getEulerZYX(b3Scalar& yawZ, b3Scalar& pitchY, b3Scalar& rollX) const - { - b3Scalar squ; - b3Scalar sqx; - b3Scalar sqy; - b3Scalar sqz; - b3Scalar sarg; - sqx = m_floats[0] * m_floats[0]; - sqy = m_floats[1] * m_floats[1]; - sqz = m_floats[2] * m_floats[2]; - squ = m_floats[3] * m_floats[3]; - rollX = b3Atan2(2 * (m_floats[1] * m_floats[2] + m_floats[3] * m_floats[0]), squ - sqx - sqy + sqz); - sarg = b3Scalar(-2.) * (m_floats[0] * m_floats[2] - m_floats[3] * m_floats[1]); - pitchY = sarg <= b3Scalar(-1.0) ? b3Scalar(-0.5) * B3_PI : (sarg >= b3Scalar(1.0) ? b3Scalar(0.5) * B3_PI : b3Asin(sarg)); - yawZ = b3Atan2(2 * (m_floats[0] * m_floats[1] + m_floats[3] * m_floats[2]), squ + sqx - sqy - sqz); - } - - /**@brief Add two quaternions - * @param q The quaternion to add to this one */ - B3_FORCE_INLINE b3Quaternion& operator+=(const b3Quaternion& q) - { -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - mVec128 = _mm_add_ps(mVec128, q.mVec128); -#elif defined(B3_USE_NEON) - mVec128 = vaddq_f32(mVec128, q.mVec128); -#else - m_floats[0] += q.getX(); - m_floats[1] += q.getY(); - m_floats[2] += q.getZ(); - m_floats[3] += q.m_floats[3]; -#endif - return *this; - } - - /**@brief Subtract out a quaternion - * @param q The quaternion to subtract from this one */ - b3Quaternion& operator-=(const b3Quaternion& q) - { -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - mVec128 = _mm_sub_ps(mVec128, q.mVec128); -#elif defined(B3_USE_NEON) - mVec128 = vsubq_f32(mVec128, q.mVec128); -#else - m_floats[0] -= q.getX(); - m_floats[1] -= q.getY(); - m_floats[2] -= q.getZ(); - m_floats[3] -= q.m_floats[3]; -#endif - return *this; - } - - /**@brief Scale this quaternion - * @param s The scalar to scale by */ - b3Quaternion& operator*=(const b3Scalar& s) - { -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - __m128 vs = _mm_load_ss(&s); // (S 0 0 0) - vs = b3_pshufd_ps(vs, 0); // (S S S S) - mVec128 = _mm_mul_ps(mVec128, vs); -#elif defined(B3_USE_NEON) - mVec128 = vmulq_n_f32(mVec128, s); -#else - m_floats[0] *= s; - m_floats[1] *= s; - m_floats[2] *= s; - m_floats[3] *= s; -#endif - return *this; - } - - /**@brief Multiply this quaternion by q on the right - * @param q The other quaternion - * Equivilant to this = this * q */ - b3Quaternion& operator*=(const b3Quaternion& q) - { -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - __m128 vQ2 = q.get128(); - - __m128 A1 = b3_pshufd_ps(mVec128, B3_SHUFFLE(0, 1, 2, 0)); - __m128 B1 = b3_pshufd_ps(vQ2, B3_SHUFFLE(3, 3, 3, 0)); - - A1 = A1 * B1; - - __m128 A2 = b3_pshufd_ps(mVec128, B3_SHUFFLE(1, 2, 0, 1)); - __m128 B2 = b3_pshufd_ps(vQ2, B3_SHUFFLE(2, 0, 1, 1)); - - A2 = A2 * B2; - - B1 = b3_pshufd_ps(mVec128, B3_SHUFFLE(2, 0, 1, 2)); - B2 = b3_pshufd_ps(vQ2, B3_SHUFFLE(1, 2, 0, 2)); - - B1 = B1 * B2; // A3 *= B3 - - mVec128 = b3_splat_ps(mVec128, 3); // A0 - mVec128 = mVec128 * vQ2; // A0 * B0 - - A1 = A1 + A2; // AB12 - mVec128 = mVec128 - B1; // AB03 = AB0 - AB3 - A1 = _mm_xor_ps(A1, b3vPPPM); // change sign of the last element - mVec128 = mVec128 + A1; // AB03 + AB12 - -#elif defined(B3_USE_NEON) - - float32x4_t vQ1 = mVec128; - float32x4_t vQ2 = q.get128(); - float32x4_t A0, A1, B1, A2, B2, A3, B3; - float32x2_t vQ1zx, vQ2wx, vQ1yz, vQ2zx, vQ2yz, vQ2xz; - - { - float32x2x2_t tmp; - tmp = vtrn_f32(vget_high_f32(vQ1), vget_low_f32(vQ1)); // {z x}, {w y} - vQ1zx = tmp.val[0]; - - tmp = vtrn_f32(vget_high_f32(vQ2), vget_low_f32(vQ2)); // {z x}, {w y} - vQ2zx = tmp.val[0]; - } - vQ2wx = vext_f32(vget_high_f32(vQ2), vget_low_f32(vQ2), 1); - - vQ1yz = vext_f32(vget_low_f32(vQ1), vget_high_f32(vQ1), 1); - - vQ2yz = vext_f32(vget_low_f32(vQ2), vget_high_f32(vQ2), 1); - vQ2xz = vext_f32(vQ2zx, vQ2zx, 1); - - A1 = vcombine_f32(vget_low_f32(vQ1), vQ1zx); // X Y z x - B1 = vcombine_f32(vdup_lane_f32(vget_high_f32(vQ2), 1), vQ2wx); // W W W X - - A2 = vcombine_f32(vQ1yz, vget_low_f32(vQ1)); - B2 = vcombine_f32(vQ2zx, vdup_lane_f32(vget_low_f32(vQ2), 1)); - - A3 = vcombine_f32(vQ1zx, vQ1yz); // Z X Y Z - B3 = vcombine_f32(vQ2yz, vQ2xz); // Y Z x z - - A1 = vmulq_f32(A1, B1); - A2 = vmulq_f32(A2, B2); - A3 = vmulq_f32(A3, B3); // A3 *= B3 - A0 = vmulq_lane_f32(vQ2, vget_high_f32(vQ1), 1); // A0 * B0 - - A1 = vaddq_f32(A1, A2); // AB12 = AB1 + AB2 - A0 = vsubq_f32(A0, A3); // AB03 = AB0 - AB3 - - // change the sign of the last element - A1 = (b3SimdFloat4)veorq_s32((int32x4_t)A1, (int32x4_t)b3vPPPM); - A0 = vaddq_f32(A0, A1); // AB03 + AB12 - - mVec128 = A0; -#else - setValue( - m_floats[3] * q.getX() + m_floats[0] * q.m_floats[3] + m_floats[1] * q.getZ() - m_floats[2] * q.getY(), - m_floats[3] * q.getY() + m_floats[1] * q.m_floats[3] + m_floats[2] * q.getX() - m_floats[0] * q.getZ(), - m_floats[3] * q.getZ() + m_floats[2] * q.m_floats[3] + m_floats[0] * q.getY() - m_floats[1] * q.getX(), - m_floats[3] * q.m_floats[3] - m_floats[0] * q.getX() - m_floats[1] * q.getY() - m_floats[2] * q.getZ()); -#endif - return *this; - } - /**@brief Return the dot product between this quaternion and another - * @param q The other quaternion */ - b3Scalar dot(const b3Quaternion& q) const - { -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - __m128 vd; - - vd = _mm_mul_ps(mVec128, q.mVec128); - - __m128 t = _mm_movehl_ps(vd, vd); - vd = _mm_add_ps(vd, t); - t = _mm_shuffle_ps(vd, vd, 0x55); - vd = _mm_add_ss(vd, t); - - return _mm_cvtss_f32(vd); -#elif defined(B3_USE_NEON) - float32x4_t vd = vmulq_f32(mVec128, q.mVec128); - float32x2_t x = vpadd_f32(vget_low_f32(vd), vget_high_f32(vd)); - x = vpadd_f32(x, x); - return vget_lane_f32(x, 0); -#else - return m_floats[0] * q.getX() + - m_floats[1] * q.getY() + - m_floats[2] * q.getZ() + - m_floats[3] * q.m_floats[3]; -#endif - } - - /**@brief Return the length squared of the quaternion */ - b3Scalar length2() const - { - return dot(*this); - } - - /**@brief Return the length of the quaternion */ - b3Scalar length() const - { - return b3Sqrt(length2()); - } - - /**@brief Normalize the quaternion - * Such that x^2 + y^2 + z^2 +w^2 = 1 */ - b3Quaternion& normalize() - { -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - __m128 vd; - - vd = _mm_mul_ps(mVec128, mVec128); - - __m128 t = _mm_movehl_ps(vd, vd); - vd = _mm_add_ps(vd, t); - t = _mm_shuffle_ps(vd, vd, 0x55); - vd = _mm_add_ss(vd, t); - - vd = _mm_sqrt_ss(vd); - vd = _mm_div_ss(b3vOnes, vd); - vd = b3_pshufd_ps(vd, 0); // splat - mVec128 = _mm_mul_ps(mVec128, vd); - - return *this; -#else - return *this /= length(); -#endif - } - - /**@brief Return a scaled version of this quaternion - * @param s The scale factor */ - B3_FORCE_INLINE b3Quaternion - operator*(const b3Scalar& s) const - { -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - __m128 vs = _mm_load_ss(&s); // (S 0 0 0) - vs = b3_pshufd_ps(vs, 0x00); // (S S S S) - - return b3Quaternion(_mm_mul_ps(mVec128, vs)); -#elif defined(B3_USE_NEON) - return b3Quaternion(vmulq_n_f32(mVec128, s)); -#else - return b3Quaternion(getX() * s, getY() * s, getZ() * s, m_floats[3] * s); -#endif - } - - /**@brief Return an inversely scaled versionof this quaternion - * @param s The inverse scale factor */ - b3Quaternion operator/(const b3Scalar& s) const - { - b3Assert(s != b3Scalar(0.0)); - return *this * (b3Scalar(1.0) / s); - } - - /**@brief Inversely scale this quaternion - * @param s The scale factor */ - b3Quaternion& operator/=(const b3Scalar& s) - { - b3Assert(s != b3Scalar(0.0)); - return *this *= b3Scalar(1.0) / s; - } - - /**@brief Return a normalized version of this quaternion */ - b3Quaternion normalized() const - { - return *this / length(); - } - /**@brief Return the angle between this quaternion and the other - * @param q The other quaternion */ - b3Scalar angle(const b3Quaternion& q) const - { - b3Scalar s = b3Sqrt(length2() * q.length2()); - b3Assert(s != b3Scalar(0.0)); - return b3Acos(dot(q) / s); - } - /**@brief Return the angle of rotation represented by this quaternion */ - b3Scalar getAngle() const - { - b3Scalar s = b3Scalar(2.) * b3Acos(m_floats[3]); - return s; - } - - /**@brief Return the axis of the rotation represented by this quaternion */ - b3Vector3 getAxis() const - { - b3Scalar s_squared = 1.f - m_floats[3] * m_floats[3]; - - if (s_squared < b3Scalar(10.) * B3_EPSILON) //Check for divide by zero - return b3MakeVector3(1.0, 0.0, 0.0); // Arbitrary - b3Scalar s = 1.f / b3Sqrt(s_squared); - return b3MakeVector3(m_floats[0] * s, m_floats[1] * s, m_floats[2] * s); - } - - /**@brief Return the inverse of this quaternion */ - b3Quaternion inverse() const - { -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - return b3Quaternion(_mm_xor_ps(mVec128, b3vQInv)); -#elif defined(B3_USE_NEON) - return b3Quaternion((b3SimdFloat4)veorq_s32((int32x4_t)mVec128, (int32x4_t)b3vQInv)); -#else - return b3Quaternion(-m_floats[0], -m_floats[1], -m_floats[2], m_floats[3]); -#endif - } - - /**@brief Return the sum of this quaternion and the other - * @param q2 The other quaternion */ - B3_FORCE_INLINE b3Quaternion - operator+(const b3Quaternion& q2) const - { -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - return b3Quaternion(_mm_add_ps(mVec128, q2.mVec128)); -#elif defined(B3_USE_NEON) - return b3Quaternion(vaddq_f32(mVec128, q2.mVec128)); -#else - const b3Quaternion& q1 = *this; - return b3Quaternion(q1.getX() + q2.getX(), q1.getY() + q2.getY(), q1.getZ() + q2.getZ(), q1.m_floats[3] + q2.m_floats[3]); -#endif - } - - /**@brief Return the difference between this quaternion and the other - * @param q2 The other quaternion */ - B3_FORCE_INLINE b3Quaternion - operator-(const b3Quaternion& q2) const - { -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - return b3Quaternion(_mm_sub_ps(mVec128, q2.mVec128)); -#elif defined(B3_USE_NEON) - return b3Quaternion(vsubq_f32(mVec128, q2.mVec128)); -#else - const b3Quaternion& q1 = *this; - return b3Quaternion(q1.getX() - q2.getX(), q1.getY() - q2.getY(), q1.getZ() - q2.getZ(), q1.m_floats[3] - q2.m_floats[3]); -#endif - } - - /**@brief Return the negative of this quaternion - * This simply negates each element */ - B3_FORCE_INLINE b3Quaternion operator-() const - { -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - return b3Quaternion(_mm_xor_ps(mVec128, b3vMzeroMask)); -#elif defined(B3_USE_NEON) - return b3Quaternion((b3SimdFloat4)veorq_s32((int32x4_t)mVec128, (int32x4_t)b3vMzeroMask)); -#else - const b3Quaternion& q2 = *this; - return b3Quaternion(-q2.getX(), -q2.getY(), -q2.getZ(), -q2.m_floats[3]); -#endif - } - /**@todo document this and it's use */ - B3_FORCE_INLINE b3Quaternion farthest(const b3Quaternion& qd) const - { - b3Quaternion diff, sum; - diff = *this - qd; - sum = *this + qd; - if (diff.dot(diff) > sum.dot(sum)) - return qd; - return (-qd); - } - - /**@todo document this and it's use */ - B3_FORCE_INLINE b3Quaternion nearest(const b3Quaternion& qd) const - { - b3Quaternion diff, sum; - diff = *this - qd; - sum = *this + qd; - if (diff.dot(diff) < sum.dot(sum)) - return qd; - return (-qd); - } - - /**@brief Return the quaternion which is the result of Spherical Linear Interpolation between this and the other quaternion - * @param q The other quaternion to interpolate with - * @param t The ratio between this and q to interpolate. If t = 0 the result is this, if t=1 the result is q. - * Slerp interpolates assuming constant velocity. */ - b3Quaternion slerp(const b3Quaternion& q, const b3Scalar& t) const - { - b3Scalar magnitude = b3Sqrt(length2() * q.length2()); - b3Assert(magnitude > b3Scalar(0)); - - b3Scalar product = dot(q) / magnitude; - if (b3Fabs(product) < b3Scalar(1)) - { - // Take care of long angle case see http://en.wikipedia.org/wiki/Slerp - const b3Scalar sign = (product < 0) ? b3Scalar(-1) : b3Scalar(1); - - const b3Scalar theta = b3Acos(sign * product); - const b3Scalar s1 = b3Sin(sign * t * theta); - const b3Scalar d = b3Scalar(1.0) / b3Sin(theta); - const b3Scalar s0 = b3Sin((b3Scalar(1.0) - t) * theta); - - return b3Quaternion( - (m_floats[0] * s0 + q.getX() * s1) * d, - (m_floats[1] * s0 + q.getY() * s1) * d, - (m_floats[2] * s0 + q.getZ() * s1) * d, - (m_floats[3] * s0 + q.m_floats[3] * s1) * d); - } - else - { - return *this; - } - } - - static const b3Quaternion& getIdentity() - { - static const b3Quaternion identityQuat(b3Scalar(0.), b3Scalar(0.), b3Scalar(0.), b3Scalar(1.)); - return identityQuat; - } - - B3_FORCE_INLINE const b3Scalar& getW() const { return m_floats[3]; } -}; - -/**@brief Return the product of two quaternions */ -B3_FORCE_INLINE b3Quaternion -operator*(const b3Quaternion& q1, const b3Quaternion& q2) -{ -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - __m128 vQ1 = q1.get128(); - __m128 vQ2 = q2.get128(); - __m128 A0, A1, B1, A2, B2; - - A1 = b3_pshufd_ps(vQ1, B3_SHUFFLE(0, 1, 2, 0)); // X Y z x // vtrn - B1 = b3_pshufd_ps(vQ2, B3_SHUFFLE(3, 3, 3, 0)); // W W W X // vdup vext - - A1 = A1 * B1; - - A2 = b3_pshufd_ps(vQ1, B3_SHUFFLE(1, 2, 0, 1)); // Y Z X Y // vext - B2 = b3_pshufd_ps(vQ2, B3_SHUFFLE(2, 0, 1, 1)); // z x Y Y // vtrn vdup - - A2 = A2 * B2; - - B1 = b3_pshufd_ps(vQ1, B3_SHUFFLE(2, 0, 1, 2)); // z x Y Z // vtrn vext - B2 = b3_pshufd_ps(vQ2, B3_SHUFFLE(1, 2, 0, 2)); // Y Z x z // vext vtrn - - B1 = B1 * B2; // A3 *= B3 - - A0 = b3_splat_ps(vQ1, 3); // A0 - A0 = A0 * vQ2; // A0 * B0 - - A1 = A1 + A2; // AB12 - A0 = A0 - B1; // AB03 = AB0 - AB3 - - A1 = _mm_xor_ps(A1, b3vPPPM); // change sign of the last element - A0 = A0 + A1; // AB03 + AB12 - - return b3Quaternion(A0); - -#elif defined(B3_USE_NEON) - - float32x4_t vQ1 = q1.get128(); - float32x4_t vQ2 = q2.get128(); - float32x4_t A0, A1, B1, A2, B2, A3, B3; - float32x2_t vQ1zx, vQ2wx, vQ1yz, vQ2zx, vQ2yz, vQ2xz; - - { - float32x2x2_t tmp; - tmp = vtrn_f32(vget_high_f32(vQ1), vget_low_f32(vQ1)); // {z x}, {w y} - vQ1zx = tmp.val[0]; - - tmp = vtrn_f32(vget_high_f32(vQ2), vget_low_f32(vQ2)); // {z x}, {w y} - vQ2zx = tmp.val[0]; - } - vQ2wx = vext_f32(vget_high_f32(vQ2), vget_low_f32(vQ2), 1); - - vQ1yz = vext_f32(vget_low_f32(vQ1), vget_high_f32(vQ1), 1); - - vQ2yz = vext_f32(vget_low_f32(vQ2), vget_high_f32(vQ2), 1); - vQ2xz = vext_f32(vQ2zx, vQ2zx, 1); - - A1 = vcombine_f32(vget_low_f32(vQ1), vQ1zx); // X Y z x - B1 = vcombine_f32(vdup_lane_f32(vget_high_f32(vQ2), 1), vQ2wx); // W W W X - - A2 = vcombine_f32(vQ1yz, vget_low_f32(vQ1)); - B2 = vcombine_f32(vQ2zx, vdup_lane_f32(vget_low_f32(vQ2), 1)); - - A3 = vcombine_f32(vQ1zx, vQ1yz); // Z X Y Z - B3 = vcombine_f32(vQ2yz, vQ2xz); // Y Z x z - - A1 = vmulq_f32(A1, B1); - A2 = vmulq_f32(A2, B2); - A3 = vmulq_f32(A3, B3); // A3 *= B3 - A0 = vmulq_lane_f32(vQ2, vget_high_f32(vQ1), 1); // A0 * B0 - - A1 = vaddq_f32(A1, A2); // AB12 = AB1 + AB2 - A0 = vsubq_f32(A0, A3); // AB03 = AB0 - AB3 - - // change the sign of the last element - A1 = (b3SimdFloat4)veorq_s32((int32x4_t)A1, (int32x4_t)b3vPPPM); - A0 = vaddq_f32(A0, A1); // AB03 + AB12 - - return b3Quaternion(A0); - -#else - return b3Quaternion( - q1.getW() * q2.getX() + q1.getX() * q2.getW() + q1.getY() * q2.getZ() - q1.getZ() * q2.getY(), - q1.getW() * q2.getY() + q1.getY() * q2.getW() + q1.getZ() * q2.getX() - q1.getX() * q2.getZ(), - q1.getW() * q2.getZ() + q1.getZ() * q2.getW() + q1.getX() * q2.getY() - q1.getY() * q2.getX(), - q1.getW() * q2.getW() - q1.getX() * q2.getX() - q1.getY() * q2.getY() - q1.getZ() * q2.getZ()); -#endif -} - -B3_FORCE_INLINE b3Quaternion -operator*(const b3Quaternion& q, const b3Vector3& w) -{ -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - __m128 vQ1 = q.get128(); - __m128 vQ2 = w.get128(); - __m128 A1, B1, A2, B2, A3, B3; - - A1 = b3_pshufd_ps(vQ1, B3_SHUFFLE(3, 3, 3, 0)); - B1 = b3_pshufd_ps(vQ2, B3_SHUFFLE(0, 1, 2, 0)); - - A1 = A1 * B1; - - A2 = b3_pshufd_ps(vQ1, B3_SHUFFLE(1, 2, 0, 1)); - B2 = b3_pshufd_ps(vQ2, B3_SHUFFLE(2, 0, 1, 1)); - - A2 = A2 * B2; - - A3 = b3_pshufd_ps(vQ1, B3_SHUFFLE(2, 0, 1, 2)); - B3 = b3_pshufd_ps(vQ2, B3_SHUFFLE(1, 2, 0, 2)); - - A3 = A3 * B3; // A3 *= B3 - - A1 = A1 + A2; // AB12 - A1 = _mm_xor_ps(A1, b3vPPPM); // change sign of the last element - A1 = A1 - A3; // AB123 = AB12 - AB3 - - return b3Quaternion(A1); - -#elif defined(B3_USE_NEON) - - float32x4_t vQ1 = q.get128(); - float32x4_t vQ2 = w.get128(); - float32x4_t A1, B1, A2, B2, A3, B3; - float32x2_t vQ1wx, vQ2zx, vQ1yz, vQ2yz, vQ1zx, vQ2xz; - - vQ1wx = vext_f32(vget_high_f32(vQ1), vget_low_f32(vQ1), 1); - { - float32x2x2_t tmp; - - tmp = vtrn_f32(vget_high_f32(vQ2), vget_low_f32(vQ2)); // {z x}, {w y} - vQ2zx = tmp.val[0]; - - tmp = vtrn_f32(vget_high_f32(vQ1), vget_low_f32(vQ1)); // {z x}, {w y} - vQ1zx = tmp.val[0]; - } - - vQ1yz = vext_f32(vget_low_f32(vQ1), vget_high_f32(vQ1), 1); - - vQ2yz = vext_f32(vget_low_f32(vQ2), vget_high_f32(vQ2), 1); - vQ2xz = vext_f32(vQ2zx, vQ2zx, 1); - - A1 = vcombine_f32(vdup_lane_f32(vget_high_f32(vQ1), 1), vQ1wx); // W W W X - B1 = vcombine_f32(vget_low_f32(vQ2), vQ2zx); // X Y z x - - A2 = vcombine_f32(vQ1yz, vget_low_f32(vQ1)); - B2 = vcombine_f32(vQ2zx, vdup_lane_f32(vget_low_f32(vQ2), 1)); - - A3 = vcombine_f32(vQ1zx, vQ1yz); // Z X Y Z - B3 = vcombine_f32(vQ2yz, vQ2xz); // Y Z x z - - A1 = vmulq_f32(A1, B1); - A2 = vmulq_f32(A2, B2); - A3 = vmulq_f32(A3, B3); // A3 *= B3 - - A1 = vaddq_f32(A1, A2); // AB12 = AB1 + AB2 - - // change the sign of the last element - A1 = (b3SimdFloat4)veorq_s32((int32x4_t)A1, (int32x4_t)b3vPPPM); - - A1 = vsubq_f32(A1, A3); // AB123 = AB12 - AB3 - - return b3Quaternion(A1); - -#else - return b3Quaternion( - q.getW() * w.getX() + q.getY() * w.getZ() - q.getZ() * w.getY(), - q.getW() * w.getY() + q.getZ() * w.getX() - q.getX() * w.getZ(), - q.getW() * w.getZ() + q.getX() * w.getY() - q.getY() * w.getX(), - -q.getX() * w.getX() - q.getY() * w.getY() - q.getZ() * w.getZ()); -#endif -} - -B3_FORCE_INLINE b3Quaternion -operator*(const b3Vector3& w, const b3Quaternion& q) -{ -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - __m128 vQ1 = w.get128(); - __m128 vQ2 = q.get128(); - __m128 A1, B1, A2, B2, A3, B3; - - A1 = b3_pshufd_ps(vQ1, B3_SHUFFLE(0, 1, 2, 0)); // X Y z x - B1 = b3_pshufd_ps(vQ2, B3_SHUFFLE(3, 3, 3, 0)); // W W W X - - A1 = A1 * B1; - - A2 = b3_pshufd_ps(vQ1, B3_SHUFFLE(1, 2, 0, 1)); - B2 = b3_pshufd_ps(vQ2, B3_SHUFFLE(2, 0, 1, 1)); - - A2 = A2 * B2; - - A3 = b3_pshufd_ps(vQ1, B3_SHUFFLE(2, 0, 1, 2)); - B3 = b3_pshufd_ps(vQ2, B3_SHUFFLE(1, 2, 0, 2)); - - A3 = A3 * B3; // A3 *= B3 - - A1 = A1 + A2; // AB12 - A1 = _mm_xor_ps(A1, b3vPPPM); // change sign of the last element - A1 = A1 - A3; // AB123 = AB12 - AB3 - - return b3Quaternion(A1); - -#elif defined(B3_USE_NEON) - - float32x4_t vQ1 = w.get128(); - float32x4_t vQ2 = q.get128(); - float32x4_t A1, B1, A2, B2, A3, B3; - float32x2_t vQ1zx, vQ2wx, vQ1yz, vQ2zx, vQ2yz, vQ2xz; - - { - float32x2x2_t tmp; - - tmp = vtrn_f32(vget_high_f32(vQ1), vget_low_f32(vQ1)); // {z x}, {w y} - vQ1zx = tmp.val[0]; - - tmp = vtrn_f32(vget_high_f32(vQ2), vget_low_f32(vQ2)); // {z x}, {w y} - vQ2zx = tmp.val[0]; - } - vQ2wx = vext_f32(vget_high_f32(vQ2), vget_low_f32(vQ2), 1); - - vQ1yz = vext_f32(vget_low_f32(vQ1), vget_high_f32(vQ1), 1); - - vQ2yz = vext_f32(vget_low_f32(vQ2), vget_high_f32(vQ2), 1); - vQ2xz = vext_f32(vQ2zx, vQ2zx, 1); - - A1 = vcombine_f32(vget_low_f32(vQ1), vQ1zx); // X Y z x - B1 = vcombine_f32(vdup_lane_f32(vget_high_f32(vQ2), 1), vQ2wx); // W W W X - - A2 = vcombine_f32(vQ1yz, vget_low_f32(vQ1)); - B2 = vcombine_f32(vQ2zx, vdup_lane_f32(vget_low_f32(vQ2), 1)); - - A3 = vcombine_f32(vQ1zx, vQ1yz); // Z X Y Z - B3 = vcombine_f32(vQ2yz, vQ2xz); // Y Z x z - - A1 = vmulq_f32(A1, B1); - A2 = vmulq_f32(A2, B2); - A3 = vmulq_f32(A3, B3); // A3 *= B3 - - A1 = vaddq_f32(A1, A2); // AB12 = AB1 + AB2 - - // change the sign of the last element - A1 = (b3SimdFloat4)veorq_s32((int32x4_t)A1, (int32x4_t)b3vPPPM); - - A1 = vsubq_f32(A1, A3); // AB123 = AB12 - AB3 - - return b3Quaternion(A1); - -#else - return b3Quaternion( - +w.getX() * q.getW() + w.getY() * q.getZ() - w.getZ() * q.getY(), - +w.getY() * q.getW() + w.getZ() * q.getX() - w.getX() * q.getZ(), - +w.getZ() * q.getW() + w.getX() * q.getY() - w.getY() * q.getX(), - -w.getX() * q.getX() - w.getY() * q.getY() - w.getZ() * q.getZ()); -#endif -} - -/**@brief Calculate the dot product between two quaternions */ -B3_FORCE_INLINE b3Scalar -b3Dot(const b3Quaternion& q1, const b3Quaternion& q2) -{ - return q1.dot(q2); -} - -/**@brief Return the length of a quaternion */ -B3_FORCE_INLINE b3Scalar -b3Length(const b3Quaternion& q) -{ - return q.length(); -} - -/**@brief Return the angle between two quaternions*/ -B3_FORCE_INLINE b3Scalar -b3Angle(const b3Quaternion& q1, const b3Quaternion& q2) -{ - return q1.angle(q2); -} - -/**@brief Return the inverse of a quaternion*/ -B3_FORCE_INLINE b3Quaternion -b3Inverse(const b3Quaternion& q) -{ - return q.inverse(); -} - -/**@brief Return the result of spherical linear interpolation betwen two quaternions - * @param q1 The first quaternion - * @param q2 The second quaternion - * @param t The ration between q1 and q2. t = 0 return q1, t=1 returns q2 - * Slerp assumes constant velocity between positions. */ -B3_FORCE_INLINE b3Quaternion -b3Slerp(const b3Quaternion& q1, const b3Quaternion& q2, const b3Scalar& t) -{ - return q1.slerp(q2, t); -} - -B3_FORCE_INLINE b3Quaternion -b3QuatMul(const b3Quaternion& rot0, const b3Quaternion& rot1) -{ - return rot0 * rot1; -} - -B3_FORCE_INLINE b3Quaternion -b3QuatNormalized(const b3Quaternion& orn) -{ - return orn.normalized(); -} - -B3_FORCE_INLINE b3Vector3 -b3QuatRotate(const b3Quaternion& rotation, const b3Vector3& v) -{ - b3Quaternion q = rotation * v; - q *= rotation.inverse(); -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - return b3MakeVector3(_mm_and_ps(q.get128(), b3vFFF0fMask)); -#elif defined(B3_USE_NEON) - return b3MakeVector3((float32x4_t)vandq_s32((int32x4_t)q.get128(), b3vFFF0Mask)); -#else - return b3MakeVector3(q.getX(), q.getY(), q.getZ()); -#endif -} - -B3_FORCE_INLINE b3Quaternion -b3ShortestArcQuat(const b3Vector3& v0, const b3Vector3& v1) // Game Programming Gems 2.10. make sure v0,v1 are normalized -{ - b3Vector3 c = v0.cross(v1); - b3Scalar d = v0.dot(v1); - - if (d < -1.0 + B3_EPSILON) - { - b3Vector3 n, unused; - b3PlaneSpace1(v0, n, unused); - return b3Quaternion(n.getX(), n.getY(), n.getZ(), 0.0f); // just pick any vector that is orthogonal to v0 - } - - b3Scalar s = b3Sqrt((1.0f + d) * 2.0f); - b3Scalar rs = 1.0f / s; - - return b3Quaternion(c.getX() * rs, c.getY() * rs, c.getZ() * rs, s * 0.5f); -} - -B3_FORCE_INLINE b3Quaternion -b3ShortestArcQuatNormalize2(b3Vector3& v0, b3Vector3& v1) -{ - v0.normalize(); - v1.normalize(); - return b3ShortestArcQuat(v0, v1); -} - -#endif //B3_SIMD__QUATERNION_H_ diff --git a/engine/inc/bullet/Bullet3Common/b3Random.h b/engine/inc/bullet/Bullet3Common/b3Random.h deleted file mode 100644 index c2e21496..00000000 --- a/engine/inc/bullet/Bullet3Common/b3Random.h +++ /dev/null @@ -1,46 +0,0 @@ -/* -Copyright (c) 2003-2013 Gino van den Bergen / Erwin Coumans http://bulletphysics.org - -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 B3_GEN_RANDOM_H -#define B3_GEN_RANDOM_H - -#include "b3Scalar.h" - -#ifdef MT19937 - -#include -#include - -#define B3_RAND_MAX UINT_MAX - -B3_FORCE_INLINE void b3Srand(unsigned int seed) { init_genrand(seed); } -B3_FORCE_INLINE unsigned int b3rand() { return genrand_int32(); } - -#else - -#include - -#define B3_RAND_MAX RAND_MAX - -B3_FORCE_INLINE void b3Srand(unsigned int seed) { srand(seed); } -B3_FORCE_INLINE unsigned int b3rand() { return rand(); } - -#endif - -inline b3Scalar b3RandRange(b3Scalar minRange, b3Scalar maxRange) -{ - return (b3rand() / (b3Scalar(B3_RAND_MAX) + b3Scalar(1.0))) * (maxRange - minRange) + minRange; -} - -#endif //B3_GEN_RANDOM_H diff --git a/engine/inc/bullet/Bullet3Common/b3ResizablePool.h b/engine/inc/bullet/Bullet3Common/b3ResizablePool.h deleted file mode 100644 index cafe3ff3..00000000 --- a/engine/inc/bullet/Bullet3Common/b3ResizablePool.h +++ /dev/null @@ -1,171 +0,0 @@ - -#ifndef B3_RESIZABLE_POOL_H -#define B3_RESIZABLE_POOL_H - -#include "Bullet3Common/b3AlignedObjectArray.h" - -enum -{ - B3_POOL_HANDLE_TERMINAL_FREE = -1, - B3_POOL_HANDLE_TERMINAL_USED = -2 -}; - -template -struct b3PoolBodyHandle : public U -{ - B3_DECLARE_ALIGNED_ALLOCATOR(); - - int m_nextFreeHandle; - void setNextFree(int next) - { - m_nextFreeHandle = next; - } - int getNextFree() const - { - return m_nextFreeHandle; - } -}; - -template -class b3ResizablePool -{ -protected: - b3AlignedObjectArray m_bodyHandles; - int m_numUsedHandles; // number of active handles - int m_firstFreeHandle; // free handles list - - T* getHandleInternal(int handle) - { - return &m_bodyHandles[handle]; - } - const T* getHandleInternal(int handle) const - { - return &m_bodyHandles[handle]; - } - -public: - b3ResizablePool() - { - initHandles(); - } - - virtual ~b3ResizablePool() - { - exitHandles(); - } - ///handle management - - int getNumHandles() const - { - return m_bodyHandles.size(); - } - - void getUsedHandles(b3AlignedObjectArray& usedHandles) const - { - for (int i = 0; i < m_bodyHandles.size(); i++) - { - if (m_bodyHandles[i].getNextFree() == B3_POOL_HANDLE_TERMINAL_USED) - { - usedHandles.push_back(i); - } - } - } - - T* getHandle(int handle) - { - b3Assert(handle >= 0); - b3Assert(handle < m_bodyHandles.size()); - if ((handle < 0) || (handle >= m_bodyHandles.size())) - { - return 0; - } - - if (m_bodyHandles[handle].getNextFree() == B3_POOL_HANDLE_TERMINAL_USED) - { - return &m_bodyHandles[handle]; - } - return 0; - } - const T* getHandle(int handle) const - { - b3Assert(handle >= 0); - b3Assert(handle < m_bodyHandles.size()); - if ((handle < 0) || (handle >= m_bodyHandles.size())) - { - return 0; - } - - if (m_bodyHandles[handle].getNextFree() == B3_POOL_HANDLE_TERMINAL_USED) - { - return &m_bodyHandles[handle]; - } - return 0; - } - - void increaseHandleCapacity(int extraCapacity) - { - int curCapacity = m_bodyHandles.size(); - //b3Assert(curCapacity == m_numUsedHandles); - int newCapacity = curCapacity + extraCapacity; - m_bodyHandles.resize(newCapacity); - - { - for (int i = curCapacity; i < newCapacity; i++) - m_bodyHandles[i].setNextFree(i + 1); - - m_bodyHandles[newCapacity - 1].setNextFree(-1); - } - m_firstFreeHandle = curCapacity; - } - void initHandles() - { - m_numUsedHandles = 0; - m_firstFreeHandle = -1; - - increaseHandleCapacity(1); - } - - void exitHandles() - { - m_bodyHandles.resize(0); - m_firstFreeHandle = -1; - m_numUsedHandles = 0; - } - - int allocHandle() - { - b3Assert(m_firstFreeHandle >= 0); - - int handle = m_firstFreeHandle; - m_firstFreeHandle = getHandleInternal(handle)->getNextFree(); - m_numUsedHandles++; - - if (m_firstFreeHandle < 0) - { - //int curCapacity = m_bodyHandles.size(); - int additionalCapacity = m_bodyHandles.size(); - increaseHandleCapacity(additionalCapacity); - - getHandleInternal(handle)->setNextFree(m_firstFreeHandle); - } - getHandleInternal(handle)->setNextFree(B3_POOL_HANDLE_TERMINAL_USED); - getHandleInternal(handle)->clear(); - return handle; - } - - void freeHandle(int handle) - { - b3Assert(handle >= 0); - - if (m_bodyHandles[handle].getNextFree() == B3_POOL_HANDLE_TERMINAL_USED) - { - getHandleInternal(handle)->clear(); - getHandleInternal(handle)->setNextFree(m_firstFreeHandle); - m_firstFreeHandle = handle; - m_numUsedHandles--; - } - } -}; -///end handle management - -#endif //B3_RESIZABLE_POOL_H diff --git a/engine/inc/bullet/Bullet3Common/b3Scalar.h b/engine/inc/bullet/Bullet3Common/b3Scalar.h deleted file mode 100644 index eeb70ed6..00000000 --- a/engine/inc/bullet/Bullet3Common/b3Scalar.h +++ /dev/null @@ -1,689 +0,0 @@ -/* -Copyright (c) 2003-2013 Gino van den Bergen / Erwin Coumans http://bulletphysics.org - -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 B3_SCALAR_H -#define B3_SCALAR_H - -#ifdef B3_MANAGED_CODE -//Aligned data types not supported in managed code -#pragma unmanaged -#endif - -#include -#include //size_t for MSVC 6.0 -#include - -//Original repository is at http://github.com/erwincoumans/bullet3 -#define B3_BULLET_VERSION 300 - -inline int b3GetVersion() -{ - return B3_BULLET_VERSION; -} - -#if defined(DEBUG) || defined(_DEBUG) -#define B3_DEBUG -#endif - -#include "b3Logging.h" //for b3Error - -#ifdef _WIN32 - -#if defined(__GNUC__) // it should handle both MINGW and CYGWIN -#define B3_FORCE_INLINE __inline__ __attribute__((always_inline)) -#define B3_ATTRIBUTE_ALIGNED16(a) a __attribute__((aligned(16))) -#define B3_ATTRIBUTE_ALIGNED64(a) a __attribute__((aligned(64))) -#define B3_ATTRIBUTE_ALIGNED128(a) a __attribute__((aligned(128))) -#elif ( defined(_MSC_VER) && _MSC_VER < 1300 ) -#define B3_FORCE_INLINE inline -#define B3_ATTRIBUTE_ALIGNED16(a) a -#define B3_ATTRIBUTE_ALIGNED64(a) a -#define B3_ATTRIBUTE_ALIGNED128(a) a -#else -//#define B3_HAS_ALIGNED_ALLOCATOR -#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 - -#define B3_FORCE_INLINE __forceinline -#define B3_ATTRIBUTE_ALIGNED16(a) __declspec(align(16)) a -#define B3_ATTRIBUTE_ALIGNED64(a) __declspec(align(64)) a -#define B3_ATTRIBUTE_ALIGNED128(a) __declspec(align(128)) a -#ifdef _XBOX -#define B3_USE_VMX128 - -#include -#define B3_HAVE_NATIVE_FSEL -#define b3Fsel(a, b, c) __fsel((a), (b), (c)) -#else - -#if (defined(_WIN32) && (_MSC_VER) && _MSC_VER >= 1400) && (!defined(B3_USE_DOUBLE_PRECISION)) -#if (defined(_M_IX86) || defined(_M_X64)) - - -#ifdef __clang__ -//#define B3_NO_SIMD_OPERATOR_OVERLOADS -#define B3_DISABLE_SSE -#endif //__clang__ - -#ifndef B3_DISABLE_SSE -#define B3_USE_SSE -#endif //B3_DISABLE_SSE - -#ifdef B3_USE_SSE -//B3_USE_SSE_IN_API is disabled under Windows by default, because -//it makes it harder to integrate Bullet into your application under Windows -//(structured embedding Bullet structs/classes need to be 16-byte aligned) -//with relatively little performance gain -//If you are not embedded Bullet data in your classes, or make sure that you align those classes on 16-byte boundaries -//you can manually enable this line or set it in the build system for a bit of performance gain (a few percent, dependent on usage) -//#define B3_USE_SSE_IN_API -#endif //B3_USE_SSE -#include -#endif -#endif - -#endif //_XBOX - -#endif //__MINGW32__ - -#ifdef B3_DEBUG -#ifdef _MSC_VER -#include -#define b3Assert(x) { if(!(x)){b3Error("Assert " __FILE__ ":%u (%s)\n", __LINE__, #x);__debugbreak(); }} -#else //_MSC_VER -#include -#define b3Assert assert -#endif //_MSC_VER -#else -#define b3Assert(x) -#endif -//b3FullAssert is optional, slows down a lot -#define b3FullAssert(x) - -#define b3Likely(_c) _c -#define b3Unlikely(_c) _c - -#else - -#if defined(__CELLOS_LV2__) -#define B3_FORCE_INLINE inline __attribute__((always_inline)) -#define B3_ATTRIBUTE_ALIGNED16(a) a __attribute__((aligned(16))) -#define B3_ATTRIBUTE_ALIGNED64(a) a __attribute__((aligned(64))) -#define B3_ATTRIBUTE_ALIGNED128(a) a __attribute__((aligned(128))) -#ifndef assert -#include -#endif -#ifdef B3_DEBUG -#ifdef __SPU__ -#include -#define printf spu_printf -#define b3Assert(x) \ - { \ - if (!(x)) \ - { \ - b3Error( \ - "Assert "__FILE__ \ - ":%u (" #x ")\n", \ - __LINE__); \ - spu_hcmpeq(0, 0); \ - } \ - } -#else -#define b3Assert assert -#endif - -#else -#define b3Assert(x) -#endif -//b3FullAssert is optional, slows down a lot -#define b3FullAssert(x) - -#define b3Likely(_c) _c -#define b3Unlikely(_c) _c - -#else - -#ifdef USE_LIBSPE2 - -#define B3_FORCE_INLINE __inline -#define B3_ATTRIBUTE_ALIGNED16(a) a __attribute__((aligned(16))) -#define B3_ATTRIBUTE_ALIGNED64(a) a __attribute__((aligned(64))) -#define B3_ATTRIBUTE_ALIGNED128(a) a __attribute__((aligned(128))) -#ifndef assert -#include -#endif -#ifdef B3_DEBUG -#define b3Assert assert -#else -#define b3Assert(x) -#endif -//b3FullAssert is optional, slows down a lot -#define b3FullAssert(x) - -#define b3Likely(_c) __builtin_expect((_c), 1) -#define b3Unlikely(_c) __builtin_expect((_c), 0) - -#else -//non-windows systems - -#if (defined(__APPLE__) && (!defined(B3_USE_DOUBLE_PRECISION))) -#if defined(__i386__) || defined(__x86_64__) -#define B3_USE_SSE -//B3_USE_SSE_IN_API is enabled on Mac OSX by default, because memory is automatically aligned on 16-byte boundaries -//if apps run into issues, we will disable the next line -#define B3_USE_SSE_IN_API -#ifdef B3_USE_SSE -// include appropriate SSE level -#if defined(__SSE4_1__) -#include -#elif defined(__SSSE3__) -#include -#elif defined(__SSE3__) -#include -#else -#include -#endif -#endif //B3_USE_SSE -#elif defined(__armv7__) -#ifdef __clang__ -#define B3_USE_NEON 1 - -#if defined B3_USE_NEON && defined(__clang__) -#include -#endif //B3_USE_NEON -#endif //__clang__ -#endif //__arm__ - -#define B3_FORCE_INLINE inline __attribute__((always_inline)) -///@todo: check out alignment methods for other platforms/compilers -#define B3_ATTRIBUTE_ALIGNED16(a) a __attribute__((aligned(16))) -#define B3_ATTRIBUTE_ALIGNED64(a) a __attribute__((aligned(64))) -#define B3_ATTRIBUTE_ALIGNED128(a) a __attribute__((aligned(128))) -#ifndef assert -#include -#endif - -#if defined(DEBUG) || defined(_DEBUG) -#if defined(__i386__) || defined(__x86_64__) -#include -#define b3Assert(x) \ - { \ - if (!(x)) \ - { \ - b3Error("Assert %s in line %d, file %s\n", #x, __LINE__, __FILE__); \ - asm volatile("int3"); \ - } \ - } -#else //defined (__i386__) || defined (__x86_64__) -#define b3Assert assert -#endif //defined (__i386__) || defined (__x86_64__) -#else //defined(DEBUG) || defined (_DEBUG) -#define b3Assert(x) -#endif //defined(DEBUG) || defined (_DEBUG) - -//b3FullAssert is optional, slows down a lot -#define b3FullAssert(x) -#define b3Likely(_c) _c -#define b3Unlikely(_c) _c - -#else - -#define B3_FORCE_INLINE inline -///@todo: check out alignment methods for other platforms/compilers -#define B3_ATTRIBUTE_ALIGNED16(a) a __attribute__((aligned(16))) -#define B3_ATTRIBUTE_ALIGNED64(a) a __attribute__((aligned(64))) -#define B3_ATTRIBUTE_ALIGNED128(a) a __attribute__((aligned(128))) -///#define B3_ATTRIBUTE_ALIGNED16(a) a -///#define B3_ATTRIBUTE_ALIGNED64(a) a -///#define B3_ATTRIBUTE_ALIGNED128(a) a -#ifndef assert -#include -#endif - -#if defined(DEBUG) || defined(_DEBUG) -#define b3Assert assert -#else -#define b3Assert(x) -#endif - -//b3FullAssert is optional, slows down a lot -#define b3FullAssert(x) -#define b3Likely(_c) _c -#define b3Unlikely(_c) _c -#endif //__APPLE__ - -#endif // LIBSPE2 - -#endif //__CELLOS_LV2__ -#endif - -///The b3Scalar type abstracts floating point numbers, to easily switch between double and single floating point precision. -#if defined(B3_USE_DOUBLE_PRECISION) -typedef double b3Scalar; -//this number could be bigger in double precision -#define B3_LARGE_FLOAT 1e30 -#else -typedef float b3Scalar; -//keep B3_LARGE_FLOAT*B3_LARGE_FLOAT < FLT_MAX -#define B3_LARGE_FLOAT 1e18f -#endif - -#ifdef B3_USE_SSE -typedef __m128 b3SimdFloat4; -#endif //B3_USE_SSE - -#if defined B3_USE_SSE_IN_API && defined(B3_USE_SSE) -#ifdef _WIN32 - -#ifndef B3_NAN -static int b3NanMask = 0x7F800001; -#define B3_NAN (*(float *)&b3NanMask) -#endif - -#ifndef B3_INFINITY_MASK -static int b3InfinityMask = 0x7F800000; -#define B3_INFINITY_MASK (*(float *)&b3InfinityMask) -#endif -#ifndef B3_NO_SIMD_OPERATOR_OVERLOADS -inline __m128 operator+(const __m128 A, const __m128 B) -{ - return _mm_add_ps(A, B); -} - -inline __m128 operator-(const __m128 A, const __m128 B) -{ - return _mm_sub_ps(A, B); -} - -inline __m128 operator*(const __m128 A, const __m128 B) -{ - return _mm_mul_ps(A, B); -} -#endif //B3_NO_SIMD_OPERATOR_OVERLOADS -#define b3CastfTo128i(a) (_mm_castps_si128(a)) -#define b3CastfTo128d(a) (_mm_castps_pd(a)) -#define b3CastiTo128f(a) (_mm_castsi128_ps(a)) -#define b3CastdTo128f(a) (_mm_castpd_ps(a)) -#define b3CastdTo128i(a) (_mm_castpd_si128(a)) -#define b3Assign128(r0, r1, r2, r3) _mm_setr_ps(r0, r1, r2, r3) - -#else //_WIN32 - -#define b3CastfTo128i(a) ((__m128i)(a)) -#define b3CastfTo128d(a) ((__m128d)(a)) -#define b3CastiTo128f(a) ((__m128)(a)) -#define b3CastdTo128f(a) ((__m128)(a)) -#define b3CastdTo128i(a) ((__m128i)(a)) -#define b3Assign128(r0, r1, r2, r3) \ - (__m128) { r0, r1, r2, r3 } -#endif //_WIN32 -#endif //B3_USE_SSE_IN_API - -#ifdef B3_USE_NEON -#include - -typedef float32x4_t b3SimdFloat4; -#define B3_INFINITY INFINITY -#define B3_NAN NAN -#define b3Assign128(r0, r1, r2, r3) \ - (float32x4_t) { r0, r1, r2, r3 } -#endif - -#define B3_DECLARE_ALIGNED_ALLOCATOR() \ - B3_FORCE_INLINE void *operator new(size_t sizeInBytes) { return b3AlignedAlloc(sizeInBytes, 16); } \ - B3_FORCE_INLINE void operator delete(void *ptr) { b3AlignedFree(ptr); } \ - B3_FORCE_INLINE void *operator new(size_t, void *ptr) { return ptr; } \ - B3_FORCE_INLINE void operator delete(void *, void *) {} \ - B3_FORCE_INLINE void *operator new[](size_t sizeInBytes) { return b3AlignedAlloc(sizeInBytes, 16); } \ - B3_FORCE_INLINE void operator delete[](void *ptr) { b3AlignedFree(ptr); } \ - B3_FORCE_INLINE void *operator new[](size_t, void *ptr) { return ptr; } \ - B3_FORCE_INLINE void operator delete[](void *, void *) {} - -#if defined(B3_USE_DOUBLE_PRECISION) || defined(B3_FORCE_DOUBLE_FUNCTIONS) - -B3_FORCE_INLINE b3Scalar b3Sqrt(b3Scalar x) -{ - return sqrt(x); -} -B3_FORCE_INLINE b3Scalar b3Fabs(b3Scalar x) { return fabs(x); } -B3_FORCE_INLINE b3Scalar b3Cos(b3Scalar x) { return cos(x); } -B3_FORCE_INLINE b3Scalar b3Sin(b3Scalar x) { return sin(x); } -B3_FORCE_INLINE b3Scalar b3Tan(b3Scalar x) { return tan(x); } -B3_FORCE_INLINE b3Scalar b3Acos(b3Scalar x) -{ - if (x < b3Scalar(-1)) x = b3Scalar(-1); - if (x > b3Scalar(1)) x = b3Scalar(1); - return acos(x); -} -B3_FORCE_INLINE b3Scalar b3Asin(b3Scalar x) -{ - if (x < b3Scalar(-1)) x = b3Scalar(-1); - if (x > b3Scalar(1)) x = b3Scalar(1); - return asin(x); -} -B3_FORCE_INLINE b3Scalar b3Atan(b3Scalar x) { return atan(x); } -B3_FORCE_INLINE b3Scalar b3Atan2(b3Scalar x, b3Scalar y) { return atan2(x, y); } -B3_FORCE_INLINE b3Scalar b3Exp(b3Scalar x) { return exp(x); } -B3_FORCE_INLINE b3Scalar b3Log(b3Scalar x) { return log(x); } -B3_FORCE_INLINE b3Scalar b3Pow(b3Scalar x, b3Scalar y) { return pow(x, y); } -B3_FORCE_INLINE b3Scalar b3Fmod(b3Scalar x, b3Scalar y) { return fmod(x, y); } - -#else - -B3_FORCE_INLINE b3Scalar b3Sqrt(b3Scalar y) -{ -#ifdef USE_APPROXIMATION - double x, z, tempf; - unsigned long *tfptr = ((unsigned long *)&tempf) + 1; - - tempf = y; - *tfptr = (0xbfcdd90a - *tfptr) >> 1; /* estimate of 1/sqrt(y) */ - x = tempf; - z = y * b3Scalar(0.5); - x = (b3Scalar(1.5) * x) - (x * x) * (x * z); /* iteration formula */ - x = (b3Scalar(1.5) * x) - (x * x) * (x * z); - x = (b3Scalar(1.5) * x) - (x * x) * (x * z); - x = (b3Scalar(1.5) * x) - (x * x) * (x * z); - x = (b3Scalar(1.5) * x) - (x * x) * (x * z); - return x * y; -#else - return sqrtf(y); -#endif -} -B3_FORCE_INLINE b3Scalar b3Fabs(b3Scalar x) { return fabsf(x); } -B3_FORCE_INLINE b3Scalar b3Cos(b3Scalar x) { return cosf(x); } -B3_FORCE_INLINE b3Scalar b3Sin(b3Scalar x) { return sinf(x); } -B3_FORCE_INLINE b3Scalar b3Tan(b3Scalar x) { return tanf(x); } -B3_FORCE_INLINE b3Scalar b3Acos(b3Scalar x) -{ - if (x < b3Scalar(-1)) - x = b3Scalar(-1); - if (x > b3Scalar(1)) - x = b3Scalar(1); - return acosf(x); -} -B3_FORCE_INLINE b3Scalar b3Asin(b3Scalar x) -{ - if (x < b3Scalar(-1)) - x = b3Scalar(-1); - if (x > b3Scalar(1)) - x = b3Scalar(1); - return asinf(x); -} -B3_FORCE_INLINE b3Scalar b3Atan(b3Scalar x) { return atanf(x); } -B3_FORCE_INLINE b3Scalar b3Atan2(b3Scalar x, b3Scalar y) { return atan2f(x, y); } -B3_FORCE_INLINE b3Scalar b3Exp(b3Scalar x) { return expf(x); } -B3_FORCE_INLINE b3Scalar b3Log(b3Scalar x) { return logf(x); } -B3_FORCE_INLINE b3Scalar b3Pow(b3Scalar x, b3Scalar y) { return powf(x, y); } -B3_FORCE_INLINE b3Scalar b3Fmod(b3Scalar x, b3Scalar y) { return fmodf(x, y); } - -#endif - -#define B3_2_PI b3Scalar(6.283185307179586232) -#define B3_PI (B3_2_PI * b3Scalar(0.5)) -#define B3_HALF_PI (B3_2_PI * b3Scalar(0.25)) -#define B3_RADS_PER_DEG (B3_2_PI / b3Scalar(360.0)) -#define B3_DEGS_PER_RAD (b3Scalar(360.0) / B3_2_PI) -#define B3_SQRT12 b3Scalar(0.7071067811865475244008443621048490) - -#define b3RecipSqrt(x) ((b3Scalar)(b3Scalar(1.0) / b3Sqrt(b3Scalar(x)))) /* reciprocal square root */ - -#ifdef B3_USE_DOUBLE_PRECISION -#define B3_EPSILON DBL_EPSILON -#define B3_INFINITY DBL_MAX -#else -#define B3_EPSILON FLT_EPSILON -#define B3_INFINITY FLT_MAX -#endif - -B3_FORCE_INLINE b3Scalar b3Atan2Fast(b3Scalar y, b3Scalar x) -{ - b3Scalar coeff_1 = B3_PI / 4.0f; - b3Scalar coeff_2 = 3.0f * coeff_1; - b3Scalar abs_y = b3Fabs(y); - b3Scalar angle; - if (x >= 0.0f) - { - b3Scalar r = (x - abs_y) / (x + abs_y); - angle = coeff_1 - coeff_1 * r; - } - else - { - b3Scalar r = (x + abs_y) / (abs_y - x); - angle = coeff_2 - coeff_1 * r; - } - return (y < 0.0f) ? -angle : angle; -} - -B3_FORCE_INLINE bool b3FuzzyZero(b3Scalar x) { return b3Fabs(x) < B3_EPSILON; } - -B3_FORCE_INLINE bool b3Equal(b3Scalar a, b3Scalar eps) -{ - return (((a) <= eps) && !((a) < -eps)); -} -B3_FORCE_INLINE bool b3GreaterEqual(b3Scalar a, b3Scalar eps) -{ - return (!((a) <= eps)); -} - -B3_FORCE_INLINE int b3IsNegative(b3Scalar x) -{ - return x < b3Scalar(0.0) ? 1 : 0; -} - -B3_FORCE_INLINE b3Scalar b3Radians(b3Scalar x) { return x * B3_RADS_PER_DEG; } -B3_FORCE_INLINE b3Scalar b3Degrees(b3Scalar x) { return x * B3_DEGS_PER_RAD; } - -#define B3_DECLARE_HANDLE(name) \ - typedef struct name##__ \ - { \ - int unused; \ - } * name - -#ifndef b3Fsel -B3_FORCE_INLINE b3Scalar b3Fsel(b3Scalar a, b3Scalar b, b3Scalar c) -{ - return a >= 0 ? b : c; -} -#endif -#define b3Fsels(a, b, c) (b3Scalar) b3Fsel(a, b, c) - -B3_FORCE_INLINE bool b3MachineIsLittleEndian() -{ - long int i = 1; - const char *p = (const char *)&i; - if (p[0] == 1) // Lowest address contains the least significant byte - return true; - else - return false; -} - -///b3Select avoids branches, which makes performance much better for consoles like Playstation 3 and XBox 360 -///Thanks Phil Knight. See also http://www.cellperformance.com/articles/2006/04/more_techniques_for_eliminatin_1.html -B3_FORCE_INLINE unsigned b3Select(unsigned condition, unsigned valueIfConditionNonZero, unsigned valueIfConditionZero) -{ - // Set testNz to 0xFFFFFFFF if condition is nonzero, 0x00000000 if condition is zero - // Rely on positive value or'ed with its negative having sign bit on - // and zero value or'ed with its negative (which is still zero) having sign bit off - // Use arithmetic shift right, shifting the sign bit through all 32 bits - unsigned testNz = (unsigned)(((int)condition | -(int)condition) >> 31); - unsigned testEqz = ~testNz; - return ((valueIfConditionNonZero & testNz) | (valueIfConditionZero & testEqz)); -} -B3_FORCE_INLINE int b3Select(unsigned condition, int valueIfConditionNonZero, int valueIfConditionZero) -{ - unsigned testNz = (unsigned)(((int)condition | -(int)condition) >> 31); - unsigned testEqz = ~testNz; - return static_cast((valueIfConditionNonZero & testNz) | (valueIfConditionZero & testEqz)); -} -B3_FORCE_INLINE float b3Select(unsigned condition, float valueIfConditionNonZero, float valueIfConditionZero) -{ -#ifdef B3_HAVE_NATIVE_FSEL - return (float)b3Fsel((b3Scalar)condition - b3Scalar(1.0f), valueIfConditionNonZero, valueIfConditionZero); -#else - return (condition != 0) ? valueIfConditionNonZero : valueIfConditionZero; -#endif -} - -template -B3_FORCE_INLINE void b3Swap(T &a, T &b) -{ - T tmp = a; - a = b; - b = tmp; -} - -//PCK: endian swapping functions -B3_FORCE_INLINE unsigned b3SwapEndian(unsigned val) -{ - return (((val & 0xff000000) >> 24) | ((val & 0x00ff0000) >> 8) | ((val & 0x0000ff00) << 8) | ((val & 0x000000ff) << 24)); -} - -B3_FORCE_INLINE unsigned short b3SwapEndian(unsigned short val) -{ - return static_cast(((val & 0xff00) >> 8) | ((val & 0x00ff) << 8)); -} - -B3_FORCE_INLINE unsigned b3SwapEndian(int val) -{ - return b3SwapEndian((unsigned)val); -} - -B3_FORCE_INLINE unsigned short b3SwapEndian(short val) -{ - return b3SwapEndian((unsigned short)val); -} - -///b3SwapFloat uses using char pointers to swap the endianness -////b3SwapFloat/b3SwapDouble will NOT return a float, because the machine might 'correct' invalid floating point values -///Not all values of sign/exponent/mantissa are valid floating point numbers according to IEEE 754. -///When a floating point unit is faced with an invalid value, it may actually change the value, or worse, throw an exception. -///In most systems, running user mode code, you wouldn't get an exception, but instead the hardware/os/runtime will 'fix' the number for you. -///so instead of returning a float/double, we return integer/long long integer -B3_FORCE_INLINE unsigned int b3SwapEndianFloat(float d) -{ - unsigned int a = 0; - unsigned char *dst = (unsigned char *)&a; - unsigned char *src = (unsigned char *)&d; - - dst[0] = src[3]; - dst[1] = src[2]; - dst[2] = src[1]; - dst[3] = src[0]; - return a; -} - -// unswap using char pointers -B3_FORCE_INLINE float b3UnswapEndianFloat(unsigned int a) -{ - float d = 0.0f; - unsigned char *src = (unsigned char *)&a; - unsigned char *dst = (unsigned char *)&d; - - dst[0] = src[3]; - dst[1] = src[2]; - dst[2] = src[1]; - dst[3] = src[0]; - - return d; -} - -// swap using char pointers -B3_FORCE_INLINE void b3SwapEndianDouble(double d, unsigned char *dst) -{ - unsigned char *src = (unsigned char *)&d; - - dst[0] = src[7]; - dst[1] = src[6]; - dst[2] = src[5]; - dst[3] = src[4]; - dst[4] = src[3]; - dst[5] = src[2]; - dst[6] = src[1]; - dst[7] = src[0]; -} - -// unswap using char pointers -B3_FORCE_INLINE double b3UnswapEndianDouble(const unsigned char *src) -{ - double d = 0.0; - unsigned char *dst = (unsigned char *)&d; - - dst[0] = src[7]; - dst[1] = src[6]; - dst[2] = src[5]; - dst[3] = src[4]; - dst[4] = src[3]; - dst[5] = src[2]; - dst[6] = src[1]; - dst[7] = src[0]; - - return d; -} - -// returns normalized value in range [-B3_PI, B3_PI] -B3_FORCE_INLINE b3Scalar b3NormalizeAngle(b3Scalar angleInRadians) -{ - angleInRadians = b3Fmod(angleInRadians, B3_2_PI); - if (angleInRadians < -B3_PI) - { - return angleInRadians + B3_2_PI; - } - else if (angleInRadians > B3_PI) - { - return angleInRadians - B3_2_PI; - } - else - { - return angleInRadians; - } -} - -///rudimentary class to provide type info -struct b3TypedObject -{ - b3TypedObject(int objectType) - : m_objectType(objectType) - { - } - int m_objectType; - inline int getObjectType() const - { - return m_objectType; - } -}; - -///align a pointer to the provided alignment, upwards -template -T *b3AlignPointer(T *unalignedPtr, size_t alignment) -{ - struct b3ConvertPointerSizeT - { - union { - T *ptr; - size_t integer; - }; - }; - b3ConvertPointerSizeT converter; - - const size_t bit_mask = ~(alignment - 1); - converter.ptr = unalignedPtr; - converter.integer += alignment - 1; - converter.integer &= bit_mask; - return converter.ptr; -} - -#endif //B3_SCALAR_H diff --git a/engine/inc/bullet/Bullet3Common/b3StackAlloc.h b/engine/inc/bullet/Bullet3Common/b3StackAlloc.h deleted file mode 100644 index 4972236a..00000000 --- a/engine/inc/bullet/Bullet3Common/b3StackAlloc.h +++ /dev/null @@ -1,118 +0,0 @@ -/* -Copyright (c) 2003-2013 Gino van den Bergen / Erwin Coumans http://bulletphysics.org - -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. -*/ - -/* -StackAlloc extracted from GJK-EPA collision solver by Nathanael Presson -Nov.2006 -*/ - -#ifndef B3_STACK_ALLOC -#define B3_STACK_ALLOC - -#include "b3Scalar.h" //for b3Assert -#include "b3AlignedAllocator.h" - -///The b3Block class is an internal structure for the b3StackAlloc memory allocator. -struct b3Block -{ - b3Block* previous; - unsigned char* address; -}; - -///The StackAlloc class provides some fast stack-based memory allocator (LIFO last-in first-out) -class b3StackAlloc -{ -public: - b3StackAlloc(unsigned int size) - { - ctor(); - create(size); - } - ~b3StackAlloc() { destroy(); } - - inline void create(unsigned int size) - { - destroy(); - data = (unsigned char*)b3AlignedAlloc(size, 16); - totalsize = size; - } - inline void destroy() - { - b3Assert(usedsize == 0); - //Raise(L"StackAlloc is still in use"); - - if (usedsize == 0) - { - if (!ischild && data) - b3AlignedFree(data); - - data = 0; - usedsize = 0; - } - } - - int getAvailableMemory() const - { - return static_cast(totalsize - usedsize); - } - - unsigned char* allocate(unsigned int size) - { - const unsigned int nus(usedsize + size); - if (nus < totalsize) - { - usedsize = nus; - return (data + (usedsize - size)); - } - b3Assert(0); - //&& (L"Not enough memory")); - - return (0); - } - B3_FORCE_INLINE b3Block* beginBlock() - { - b3Block* pb = (b3Block*)allocate(sizeof(b3Block)); - pb->previous = current; - pb->address = data + usedsize; - current = pb; - return (pb); - } - B3_FORCE_INLINE void endBlock(b3Block* block) - { - b3Assert(block == current); - //Raise(L"Unmatched blocks"); - if (block == current) - { - current = block->previous; - usedsize = (unsigned int)((block->address - data) - sizeof(b3Block)); - } - } - -private: - void ctor() - { - data = 0; - totalsize = 0; - usedsize = 0; - current = 0; - ischild = false; - } - unsigned char* data; - unsigned int totalsize; - unsigned int usedsize; - b3Block* current; - bool ischild; -}; - -#endif //B3_STACK_ALLOC diff --git a/engine/inc/bullet/Bullet3Common/b3Transform.h b/engine/inc/bullet/Bullet3Common/b3Transform.h deleted file mode 100644 index 149da9d1..00000000 --- a/engine/inc/bullet/Bullet3Common/b3Transform.h +++ /dev/null @@ -1,286 +0,0 @@ -/* -Copyright (c) 2003-2013 Gino van den Bergen / Erwin Coumans http://bulletphysics.org - -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 B3_TRANSFORM_H -#define B3_TRANSFORM_H - -#include "b3Matrix3x3.h" - -#ifdef B3_USE_DOUBLE_PRECISION -#define b3TransformData b3TransformDoubleData -#else -#define b3TransformData b3TransformFloatData -#endif - -/**@brief The b3Transform class supports rigid transforms with only translation and rotation and no scaling/shear. - *It can be used in combination with b3Vector3, b3Quaternion and b3Matrix3x3 linear algebra classes. */ -B3_ATTRIBUTE_ALIGNED16(class) -b3Transform -{ - ///Storage for the rotation - b3Matrix3x3 m_basis; - ///Storage for the translation - b3Vector3 m_origin; - -public: - /**@brief No initialization constructor */ - b3Transform() {} - /**@brief Constructor from b3Quaternion (optional b3Vector3 ) - * @param q Rotation from quaternion - * @param c Translation from Vector (default 0,0,0) */ - explicit B3_FORCE_INLINE b3Transform(const b3Quaternion& q, - const b3Vector3& c = b3MakeVector3(b3Scalar(0), b3Scalar(0), b3Scalar(0))) - : m_basis(q), - m_origin(c) - { - } - - /**@brief Constructor from b3Matrix3x3 (optional b3Vector3) - * @param b Rotation from Matrix - * @param c Translation from Vector default (0,0,0)*/ - explicit B3_FORCE_INLINE b3Transform(const b3Matrix3x3& b, - const b3Vector3& c = b3MakeVector3(b3Scalar(0), b3Scalar(0), b3Scalar(0))) - : m_basis(b), - m_origin(c) - { - } - /**@brief Copy constructor */ - B3_FORCE_INLINE b3Transform(const b3Transform& other) - : m_basis(other.m_basis), - m_origin(other.m_origin) - { - } - /**@brief Assignment Operator */ - B3_FORCE_INLINE b3Transform& operator=(const b3Transform& other) - { - m_basis = other.m_basis; - m_origin = other.m_origin; - return *this; - } - - /**@brief Set the current transform as the value of the product of two transforms - * @param t1 Transform 1 - * @param t2 Transform 2 - * This = Transform1 * Transform2 */ - B3_FORCE_INLINE void mult(const b3Transform& t1, const b3Transform& t2) - { - m_basis = t1.m_basis * t2.m_basis; - m_origin = t1(t2.m_origin); - } - - /* void multInverseLeft(const b3Transform& t1, const b3Transform& t2) { - b3Vector3 v = t2.m_origin - t1.m_origin; - m_basis = b3MultTransposeLeft(t1.m_basis, t2.m_basis); - m_origin = v * t1.m_basis; - } - */ - - /**@brief Return the transform of the vector */ - B3_FORCE_INLINE b3Vector3 operator()(const b3Vector3& x) const - { - return x.dot3(m_basis[0], m_basis[1], m_basis[2]) + m_origin; - } - - /**@brief Return the transform of the vector */ - B3_FORCE_INLINE b3Vector3 operator*(const b3Vector3& x) const - { - return (*this)(x); - } - - /**@brief Return the transform of the b3Quaternion */ - B3_FORCE_INLINE b3Quaternion operator*(const b3Quaternion& q) const - { - return getRotation() * q; - } - - /**@brief Return the basis matrix for the rotation */ - B3_FORCE_INLINE b3Matrix3x3& getBasis() { return m_basis; } - /**@brief Return the basis matrix for the rotation */ - B3_FORCE_INLINE const b3Matrix3x3& getBasis() const { return m_basis; } - - /**@brief Return the origin vector translation */ - B3_FORCE_INLINE b3Vector3& getOrigin() { return m_origin; } - /**@brief Return the origin vector translation */ - B3_FORCE_INLINE const b3Vector3& getOrigin() const { return m_origin; } - - /**@brief Return a quaternion representing the rotation */ - b3Quaternion getRotation() const - { - b3Quaternion q; - m_basis.getRotation(q); - return q; - } - - /**@brief Set from an array - * @param m A pointer to a 15 element array (12 rotation(row major padded on the right by 1), and 3 translation */ - void setFromOpenGLMatrix(const b3Scalar* m) - { - m_basis.setFromOpenGLSubMatrix(m); - m_origin.setValue(m[12], m[13], m[14]); - } - - /**@brief Fill an array representation - * @param m A pointer to a 15 element array (12 rotation(row major padded on the right by 1), and 3 translation */ - void getOpenGLMatrix(b3Scalar * m) const - { - m_basis.getOpenGLSubMatrix(m); - m[12] = m_origin.getX(); - m[13] = m_origin.getY(); - m[14] = m_origin.getZ(); - m[15] = b3Scalar(1.0); - } - - /**@brief Set the translational element - * @param origin The vector to set the translation to */ - B3_FORCE_INLINE void setOrigin(const b3Vector3& origin) - { - m_origin = origin; - } - - B3_FORCE_INLINE b3Vector3 invXform(const b3Vector3& inVec) const; - - /**@brief Set the rotational element by b3Matrix3x3 */ - B3_FORCE_INLINE void setBasis(const b3Matrix3x3& basis) - { - m_basis = basis; - } - - /**@brief Set the rotational element by b3Quaternion */ - B3_FORCE_INLINE void setRotation(const b3Quaternion& q) - { - m_basis.setRotation(q); - } - - /**@brief Set this transformation to the identity */ - void setIdentity() - { - m_basis.setIdentity(); - m_origin.setValue(b3Scalar(0.0), b3Scalar(0.0), b3Scalar(0.0)); - } - - /**@brief Multiply this Transform by another(this = this * another) - * @param t The other transform */ - b3Transform& operator*=(const b3Transform& t) - { - m_origin += m_basis * t.m_origin; - m_basis *= t.m_basis; - return *this; - } - - /**@brief Return the inverse of this transform */ - b3Transform inverse() const - { - b3Matrix3x3 inv = m_basis.transpose(); - return b3Transform(inv, inv * -m_origin); - } - - /**@brief Return the inverse of this transform times the other transform - * @param t The other transform - * return this.inverse() * the other */ - b3Transform inverseTimes(const b3Transform& t) const; - - /**@brief Return the product of this transform and the other */ - b3Transform operator*(const b3Transform& t) const; - - /**@brief Return an identity transform */ - static const b3Transform& getIdentity() - { - static const b3Transform identityTransform(b3Matrix3x3::getIdentity()); - return identityTransform; - } - - void serialize(struct b3TransformData & dataOut) const; - - void serializeFloat(struct b3TransformFloatData & dataOut) const; - - void deSerialize(const struct b3TransformData& dataIn); - - void deSerializeDouble(const struct b3TransformDoubleData& dataIn); - - void deSerializeFloat(const struct b3TransformFloatData& dataIn); -}; - -B3_FORCE_INLINE b3Vector3 -b3Transform::invXform(const b3Vector3& inVec) const -{ - b3Vector3 v = inVec - m_origin; - return (m_basis.transpose() * v); -} - -B3_FORCE_INLINE b3Transform -b3Transform::inverseTimes(const b3Transform& t) const -{ - b3Vector3 v = t.getOrigin() - m_origin; - return b3Transform(m_basis.transposeTimes(t.m_basis), - v * m_basis); -} - -B3_FORCE_INLINE b3Transform - b3Transform::operator*(const b3Transform& t) const -{ - return b3Transform(m_basis * t.m_basis, - (*this)(t.m_origin)); -} - -/**@brief Test if two transforms have all elements equal */ -B3_FORCE_INLINE bool operator==(const b3Transform& t1, const b3Transform& t2) -{ - return (t1.getBasis() == t2.getBasis() && - t1.getOrigin() == t2.getOrigin()); -} - -///for serialization -struct b3TransformFloatData -{ - b3Matrix3x3FloatData m_basis; - b3Vector3FloatData m_origin; -}; - -struct b3TransformDoubleData -{ - b3Matrix3x3DoubleData m_basis; - b3Vector3DoubleData m_origin; -}; - -B3_FORCE_INLINE void b3Transform::serialize(b3TransformData& dataOut) const -{ - m_basis.serialize(dataOut.m_basis); - m_origin.serialize(dataOut.m_origin); -} - -B3_FORCE_INLINE void b3Transform::serializeFloat(b3TransformFloatData& dataOut) const -{ - m_basis.serializeFloat(dataOut.m_basis); - m_origin.serializeFloat(dataOut.m_origin); -} - -B3_FORCE_INLINE void b3Transform::deSerialize(const b3TransformData& dataIn) -{ - m_basis.deSerialize(dataIn.m_basis); - m_origin.deSerialize(dataIn.m_origin); -} - -B3_FORCE_INLINE void b3Transform::deSerializeFloat(const b3TransformFloatData& dataIn) -{ - m_basis.deSerializeFloat(dataIn.m_basis); - m_origin.deSerializeFloat(dataIn.m_origin); -} - -B3_FORCE_INLINE void b3Transform::deSerializeDouble(const b3TransformDoubleData& dataIn) -{ - m_basis.deSerializeDouble(dataIn.m_basis); - m_origin.deSerializeDouble(dataIn.m_origin); -} - -#endif //B3_TRANSFORM_H diff --git a/engine/inc/bullet/Bullet3Common/b3TransformUtil.h b/engine/inc/bullet/Bullet3Common/b3TransformUtil.h deleted file mode 100644 index 1850a9be..00000000 --- a/engine/inc/bullet/Bullet3Common/b3TransformUtil.h +++ /dev/null @@ -1,210 +0,0 @@ -/* -Copyright (c) 2003-2013 Gino van den Bergen / Erwin Coumans http://bulletphysics.org - -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 B3_TRANSFORM_UTIL_H -#define B3_TRANSFORM_UTIL_H - -#include "b3Transform.h" -#define B3_ANGULAR_MOTION_THRESHOLD b3Scalar(0.5) * B3_HALF_PI - -B3_FORCE_INLINE b3Vector3 b3AabbSupport(const b3Vector3& halfExtents, const b3Vector3& supportDir) -{ - return b3MakeVector3(supportDir.getX() < b3Scalar(0.0) ? -halfExtents.getX() : halfExtents.getX(), - supportDir.getY() < b3Scalar(0.0) ? -halfExtents.getY() : halfExtents.getY(), - supportDir.getZ() < b3Scalar(0.0) ? -halfExtents.getZ() : halfExtents.getZ()); -} - -/// Utils related to temporal transforms -class b3TransformUtil -{ -public: - static void integrateTransform(const b3Transform& curTrans, const b3Vector3& linvel, const b3Vector3& angvel, b3Scalar timeStep, b3Transform& predictedTransform) - { - predictedTransform.setOrigin(curTrans.getOrigin() + linvel * timeStep); - // #define QUATERNION_DERIVATIVE -#ifdef QUATERNION_DERIVATIVE - b3Quaternion predictedOrn = curTrans.getRotation(); - predictedOrn += (angvel * predictedOrn) * (timeStep * b3Scalar(0.5)); - predictedOrn.normalize(); -#else - //Exponential map - //google for "Practical Parameterization of Rotations Using the Exponential Map", F. Sebastian Grassia - - b3Vector3 axis; - b3Scalar fAngle = angvel.length(); - //limit the angular motion - if (fAngle * timeStep > B3_ANGULAR_MOTION_THRESHOLD) - { - fAngle = B3_ANGULAR_MOTION_THRESHOLD / timeStep; - } - - if (fAngle < b3Scalar(0.001)) - { - // use Taylor's expansions of sync function - axis = angvel * (b3Scalar(0.5) * timeStep - (timeStep * timeStep * timeStep) * (b3Scalar(0.020833333333)) * fAngle * fAngle); - } - else - { - // sync(fAngle) = sin(c*fAngle)/t - axis = angvel * (b3Sin(b3Scalar(0.5) * fAngle * timeStep) / fAngle); - } - b3Quaternion dorn(axis.getX(), axis.getY(), axis.getZ(), b3Cos(fAngle * timeStep * b3Scalar(0.5))); - b3Quaternion orn0 = curTrans.getRotation(); - - b3Quaternion predictedOrn = dorn * orn0; - predictedOrn.normalize(); -#endif - predictedTransform.setRotation(predictedOrn); - } - - static void calculateVelocityQuaternion(const b3Vector3& pos0, const b3Vector3& pos1, const b3Quaternion& orn0, const b3Quaternion& orn1, b3Scalar timeStep, b3Vector3& linVel, b3Vector3& angVel) - { - linVel = (pos1 - pos0) / timeStep; - b3Vector3 axis; - b3Scalar angle; - if (orn0 != orn1) - { - calculateDiffAxisAngleQuaternion(orn0, orn1, axis, angle); - angVel = axis * angle / timeStep; - } - else - { - angVel.setValue(0, 0, 0); - } - } - - static void calculateDiffAxisAngleQuaternion(const b3Quaternion& orn0, const b3Quaternion& orn1a, b3Vector3& axis, b3Scalar& angle) - { - b3Quaternion orn1 = orn0.nearest(orn1a); - b3Quaternion dorn = orn1 * orn0.inverse(); - angle = dorn.getAngle(); - axis = b3MakeVector3(dorn.getX(), dorn.getY(), dorn.getZ()); - axis[3] = b3Scalar(0.); - //check for axis length - b3Scalar len = axis.length2(); - if (len < B3_EPSILON * B3_EPSILON) - axis = b3MakeVector3(b3Scalar(1.), b3Scalar(0.), b3Scalar(0.)); - else - axis /= b3Sqrt(len); - } - - static void calculateVelocity(const b3Transform& transform0, const b3Transform& transform1, b3Scalar timeStep, b3Vector3& linVel, b3Vector3& angVel) - { - linVel = (transform1.getOrigin() - transform0.getOrigin()) / timeStep; - b3Vector3 axis; - b3Scalar angle; - calculateDiffAxisAngle(transform0, transform1, axis, angle); - angVel = axis * angle / timeStep; - } - - static void calculateDiffAxisAngle(const b3Transform& transform0, const b3Transform& transform1, b3Vector3& axis, b3Scalar& angle) - { - b3Matrix3x3 dmat = transform1.getBasis() * transform0.getBasis().inverse(); - b3Quaternion dorn; - dmat.getRotation(dorn); - - ///floating point inaccuracy can lead to w component > 1..., which breaks - dorn.normalize(); - - angle = dorn.getAngle(); - axis = b3MakeVector3(dorn.getX(), dorn.getY(), dorn.getZ()); - axis[3] = b3Scalar(0.); - //check for axis length - b3Scalar len = axis.length2(); - if (len < B3_EPSILON * B3_EPSILON) - axis = b3MakeVector3(b3Scalar(1.), b3Scalar(0.), b3Scalar(0.)); - else - axis /= b3Sqrt(len); - } -}; - -///The b3ConvexSeparatingDistanceUtil can help speed up convex collision detection -///by conservatively updating a cached separating distance/vector instead of re-calculating the closest distance -class b3ConvexSeparatingDistanceUtil -{ - b3Quaternion m_ornA; - b3Quaternion m_ornB; - b3Vector3 m_posA; - b3Vector3 m_posB; - - b3Vector3 m_separatingNormal; - - b3Scalar m_boundingRadiusA; - b3Scalar m_boundingRadiusB; - b3Scalar m_separatingDistance; - -public: - b3ConvexSeparatingDistanceUtil(b3Scalar boundingRadiusA, b3Scalar boundingRadiusB) - : m_boundingRadiusA(boundingRadiusA), - m_boundingRadiusB(boundingRadiusB), - m_separatingDistance(0.f) - { - } - - b3Scalar getConservativeSeparatingDistance() - { - return m_separatingDistance; - } - - void updateSeparatingDistance(const b3Transform& transA, const b3Transform& transB) - { - const b3Vector3& toPosA = transA.getOrigin(); - const b3Vector3& toPosB = transB.getOrigin(); - b3Quaternion toOrnA = transA.getRotation(); - b3Quaternion toOrnB = transB.getRotation(); - - if (m_separatingDistance > 0.f) - { - b3Vector3 linVelA, angVelA, linVelB, angVelB; - b3TransformUtil::calculateVelocityQuaternion(m_posA, toPosA, m_ornA, toOrnA, b3Scalar(1.), linVelA, angVelA); - b3TransformUtil::calculateVelocityQuaternion(m_posB, toPosB, m_ornB, toOrnB, b3Scalar(1.), linVelB, angVelB); - b3Scalar maxAngularProjectedVelocity = angVelA.length() * m_boundingRadiusA + angVelB.length() * m_boundingRadiusB; - b3Vector3 relLinVel = (linVelB - linVelA); - b3Scalar relLinVelocLength = relLinVel.dot(m_separatingNormal); - if (relLinVelocLength < 0.f) - { - relLinVelocLength = 0.f; - } - - b3Scalar projectedMotion = maxAngularProjectedVelocity + relLinVelocLength; - m_separatingDistance -= projectedMotion; - } - - m_posA = toPosA; - m_posB = toPosB; - m_ornA = toOrnA; - m_ornB = toOrnB; - } - - void initSeparatingDistance(const b3Vector3& separatingVector, b3Scalar separatingDistance, const b3Transform& transA, const b3Transform& transB) - { - m_separatingDistance = separatingDistance; - - if (m_separatingDistance > 0.f) - { - m_separatingNormal = separatingVector; - - const b3Vector3& toPosA = transA.getOrigin(); - const b3Vector3& toPosB = transB.getOrigin(); - b3Quaternion toOrnA = transA.getRotation(); - b3Quaternion toOrnB = transB.getRotation(); - m_posA = toPosA; - m_posB = toPosB; - m_ornA = toOrnA; - m_ornB = toOrnB; - } - } -}; - -#endif //B3_TRANSFORM_UTIL_H diff --git a/engine/inc/bullet/Bullet3Common/b3Vector3.h b/engine/inc/bullet/Bullet3Common/b3Vector3.h deleted file mode 100644 index a70d68d6..00000000 --- a/engine/inc/bullet/Bullet3Common/b3Vector3.h +++ /dev/null @@ -1,1303 +0,0 @@ -/* -Copyright (c) 2003-2013 Gino van den Bergen / Erwin Coumans http://bulletphysics.org - -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 B3_VECTOR3_H -#define B3_VECTOR3_H - -//#include -#include "b3Scalar.h" -#include "b3MinMax.h" -#include "b3AlignedAllocator.h" - -#ifdef B3_USE_DOUBLE_PRECISION -#define b3Vector3Data b3Vector3DoubleData -#define b3Vector3DataName "b3Vector3DoubleData" -#else -#define b3Vector3Data b3Vector3FloatData -#define b3Vector3DataName "b3Vector3FloatData" -#endif //B3_USE_DOUBLE_PRECISION - -#if defined B3_USE_SSE - -//typedef uint32_t __m128i __attribute__ ((vector_size(16))); - -#ifdef _MSC_VER -#pragma warning(disable : 4556) // value of intrinsic immediate argument '4294967239' is out of range '0 - 255' -#endif - -#define B3_SHUFFLE(x, y, z, w) (((w) << 6 | (z) << 4 | (y) << 2 | (x)) & 0xff) -//#define b3_pshufd_ps( _a, _mask ) (__m128) _mm_shuffle_epi32((__m128i)(_a), (_mask) ) -#define b3_pshufd_ps(_a, _mask) _mm_shuffle_ps((_a), (_a), (_mask)) -#define b3_splat3_ps(_a, _i) b3_pshufd_ps((_a), B3_SHUFFLE(_i, _i, _i, 3)) -#define b3_splat_ps(_a, _i) b3_pshufd_ps((_a), B3_SHUFFLE(_i, _i, _i, _i)) - -#define b3v3AbsiMask (_mm_set_epi32(0x00000000, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF)) -#define b3vAbsMask (_mm_set_epi32(0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF)) -#define b3vFFF0Mask (_mm_set_epi32(0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF)) -#define b3v3AbsfMask b3CastiTo128f(b3v3AbsiMask) -#define b3vFFF0fMask b3CastiTo128f(b3vFFF0Mask) -#define b3vxyzMaskf b3vFFF0fMask -#define b3vAbsfMask b3CastiTo128f(b3vAbsMask) - -const __m128 B3_ATTRIBUTE_ALIGNED16(b3vMzeroMask) = {-0.0f, -0.0f, -0.0f, -0.0f}; -const __m128 B3_ATTRIBUTE_ALIGNED16(b3v1110) = {1.0f, 1.0f, 1.0f, 0.0f}; -const __m128 B3_ATTRIBUTE_ALIGNED16(b3vHalf) = {0.5f, 0.5f, 0.5f, 0.5f}; -const __m128 B3_ATTRIBUTE_ALIGNED16(b3v1_5) = {1.5f, 1.5f, 1.5f, 1.5f}; - -#endif - -#ifdef B3_USE_NEON - -const float32x4_t B3_ATTRIBUTE_ALIGNED16(b3vMzeroMask) = (float32x4_t){-0.0f, -0.0f, -0.0f, -0.0f}; -const int32x4_t B3_ATTRIBUTE_ALIGNED16(b3vFFF0Mask) = (int32x4_t){0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0}; -const int32x4_t B3_ATTRIBUTE_ALIGNED16(b3vAbsMask) = (int32x4_t){0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF}; -const int32x4_t B3_ATTRIBUTE_ALIGNED16(b3v3AbsMask) = (int32x4_t){0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x0}; - -#endif - -class b3Vector3; -class b3Vector4; - -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) -//#if defined (B3_USE_SSE) || defined (B3_USE_NEON) -inline b3Vector3 b3MakeVector3(b3SimdFloat4 v); -inline b3Vector4 b3MakeVector4(b3SimdFloat4 vec); -#endif - -inline b3Vector3 b3MakeVector3(b3Scalar x, b3Scalar y, b3Scalar z); -inline b3Vector3 b3MakeVector3(b3Scalar x, b3Scalar y, b3Scalar z, b3Scalar w); -inline b3Vector4 b3MakeVector4(b3Scalar x, b3Scalar y, b3Scalar z, b3Scalar w); - -/**@brief b3Vector3 can be used to represent 3D points and vectors. - * It has an un-used w component to suit 16-byte alignment when b3Vector3 is stored in containers. This extra component can be used by derived classes (Quaternion?) or by user - * Ideally, this class should be replaced by a platform optimized SIMD version that keeps the data in registers - */ -B3_ATTRIBUTE_ALIGNED16(class) -b3Vector3 -{ -public: -#if defined(B3_USE_SSE) || defined(B3_USE_NEON) // _WIN32 || ARM - union { - b3SimdFloat4 mVec128; - float m_floats[4]; - struct - { - float x, y, z, w; - }; - }; -#else - union { - float m_floats[4]; - struct - { - float x, y, z, w; - }; - }; -#endif - -public: - B3_DECLARE_ALIGNED_ALLOCATOR(); - -#if defined(B3_USE_SSE) || defined(B3_USE_NEON) // _WIN32 || ARM - - /*B3_FORCE_INLINE b3Vector3() - { - } - */ - - B3_FORCE_INLINE b3SimdFloat4 get128() const - { - return mVec128; - } - B3_FORCE_INLINE void set128(b3SimdFloat4 v128) - { - mVec128 = v128; - } -#endif - -public: - /**@brief Add a vector to this one - * @param The vector to add to this one */ - B3_FORCE_INLINE b3Vector3& operator+=(const b3Vector3& v) - { -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - mVec128 = _mm_add_ps(mVec128, v.mVec128); -#elif defined(B3_USE_NEON) - mVec128 = vaddq_f32(mVec128, v.mVec128); -#else - m_floats[0] += v.m_floats[0]; - m_floats[1] += v.m_floats[1]; - m_floats[2] += v.m_floats[2]; -#endif - return *this; - } - - /**@brief Subtract a vector from this one - * @param The vector to subtract */ - B3_FORCE_INLINE b3Vector3& operator-=(const b3Vector3& v) - { -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - mVec128 = _mm_sub_ps(mVec128, v.mVec128); -#elif defined(B3_USE_NEON) - mVec128 = vsubq_f32(mVec128, v.mVec128); -#else - m_floats[0] -= v.m_floats[0]; - m_floats[1] -= v.m_floats[1]; - m_floats[2] -= v.m_floats[2]; -#endif - return *this; - } - - /**@brief Scale the vector - * @param s Scale factor */ - B3_FORCE_INLINE b3Vector3& operator*=(const b3Scalar& s) - { -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - __m128 vs = _mm_load_ss(&s); // (S 0 0 0) - vs = b3_pshufd_ps(vs, 0x80); // (S S S 0.0) - mVec128 = _mm_mul_ps(mVec128, vs); -#elif defined(B3_USE_NEON) - mVec128 = vmulq_n_f32(mVec128, s); -#else - m_floats[0] *= s; - m_floats[1] *= s; - m_floats[2] *= s; -#endif - return *this; - } - - /**@brief Inversely scale the vector - * @param s Scale factor to divide by */ - B3_FORCE_INLINE b3Vector3& operator/=(const b3Scalar& s) - { - b3FullAssert(s != b3Scalar(0.0)); - -#if 0 //defined(B3_USE_SSE_IN_API) -// this code is not faster ! - __m128 vs = _mm_load_ss(&s); - vs = _mm_div_ss(b3v1110, vs); - vs = b3_pshufd_ps(vs, 0x00); // (S S S S) - - mVec128 = _mm_mul_ps(mVec128, vs); - - return *this; -#else - return *this *= b3Scalar(1.0) / s; -#endif - } - - /**@brief Return the dot product - * @param v The other vector in the dot product */ - B3_FORCE_INLINE b3Scalar dot(const b3Vector3& v) const - { -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - __m128 vd = _mm_mul_ps(mVec128, v.mVec128); - __m128 z = _mm_movehl_ps(vd, vd); - __m128 y = _mm_shuffle_ps(vd, vd, 0x55); - vd = _mm_add_ss(vd, y); - vd = _mm_add_ss(vd, z); - return _mm_cvtss_f32(vd); -#elif defined(B3_USE_NEON) - float32x4_t vd = vmulq_f32(mVec128, v.mVec128); - float32x2_t x = vpadd_f32(vget_low_f32(vd), vget_low_f32(vd)); - x = vadd_f32(x, vget_high_f32(vd)); - return vget_lane_f32(x, 0); -#else - return m_floats[0] * v.m_floats[0] + - m_floats[1] * v.m_floats[1] + - m_floats[2] * v.m_floats[2]; -#endif - } - - /**@brief Return the length of the vector squared */ - B3_FORCE_INLINE b3Scalar length2() const - { - return dot(*this); - } - - /**@brief Return the length of the vector */ - B3_FORCE_INLINE b3Scalar length() const - { - return b3Sqrt(length2()); - } - - /**@brief Return the distance squared between the ends of this and another vector - * This is symantically treating the vector like a point */ - B3_FORCE_INLINE b3Scalar distance2(const b3Vector3& v) const; - - /**@brief Return the distance between the ends of this and another vector - * This is symantically treating the vector like a point */ - B3_FORCE_INLINE b3Scalar distance(const b3Vector3& v) const; - - B3_FORCE_INLINE b3Vector3& safeNormalize() - { - b3Scalar l2 = length2(); - //triNormal.normalize(); - if (l2 >= B3_EPSILON * B3_EPSILON) - { - (*this) /= b3Sqrt(l2); - } - else - { - setValue(1, 0, 0); - } - return *this; - } - - /**@brief Normalize this vector - * x^2 + y^2 + z^2 = 1 */ - B3_FORCE_INLINE b3Vector3& normalize() - { -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - // dot product first - __m128 vd = _mm_mul_ps(mVec128, mVec128); - __m128 z = _mm_movehl_ps(vd, vd); - __m128 y = _mm_shuffle_ps(vd, vd, 0x55); - vd = _mm_add_ss(vd, y); - vd = _mm_add_ss(vd, z); - -#if 0 - vd = _mm_sqrt_ss(vd); - vd = _mm_div_ss(b3v1110, vd); - vd = b3_splat_ps(vd, 0x80); - mVec128 = _mm_mul_ps(mVec128, vd); -#else - - // NR step 1/sqrt(x) - vd is x, y is output - y = _mm_rsqrt_ss(vd); // estimate - - // one step NR - z = b3v1_5; - vd = _mm_mul_ss(vd, b3vHalf); // vd * 0.5 - //x2 = vd; - vd = _mm_mul_ss(vd, y); // vd * 0.5 * y0 - vd = _mm_mul_ss(vd, y); // vd * 0.5 * y0 * y0 - z = _mm_sub_ss(z, vd); // 1.5 - vd * 0.5 * y0 * y0 - - y = _mm_mul_ss(y, z); // y0 * (1.5 - vd * 0.5 * y0 * y0) - - y = b3_splat_ps(y, 0x80); - mVec128 = _mm_mul_ps(mVec128, y); - -#endif - - return *this; -#else - return *this /= length(); -#endif - } - - /**@brief Return a normalized version of this vector */ - B3_FORCE_INLINE b3Vector3 normalized() const; - - /**@brief Return a rotated version of this vector - * @param wAxis The axis to rotate about - * @param angle The angle to rotate by */ - B3_FORCE_INLINE b3Vector3 rotate(const b3Vector3& wAxis, const b3Scalar angle) const; - - /**@brief Return the angle between this and another vector - * @param v The other vector */ - B3_FORCE_INLINE b3Scalar angle(const b3Vector3& v) const - { - b3Scalar s = b3Sqrt(length2() * v.length2()); - b3FullAssert(s != b3Scalar(0.0)); - return b3Acos(dot(v) / s); - } - - /**@brief Return a vector will the absolute values of each element */ - B3_FORCE_INLINE b3Vector3 absolute() const - { -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - return b3MakeVector3(_mm_and_ps(mVec128, b3v3AbsfMask)); -#elif defined(B3_USE_NEON) - return b3Vector3(vabsq_f32(mVec128)); -#else - return b3MakeVector3( - b3Fabs(m_floats[0]), - b3Fabs(m_floats[1]), - b3Fabs(m_floats[2])); -#endif - } - - /**@brief Return the cross product between this and another vector - * @param v The other vector */ - B3_FORCE_INLINE b3Vector3 cross(const b3Vector3& v) const - { -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - __m128 T, V; - - T = b3_pshufd_ps(mVec128, B3_SHUFFLE(1, 2, 0, 3)); // (Y Z X 0) - V = b3_pshufd_ps(v.mVec128, B3_SHUFFLE(1, 2, 0, 3)); // (Y Z X 0) - - V = _mm_mul_ps(V, mVec128); - T = _mm_mul_ps(T, v.mVec128); - V = _mm_sub_ps(V, T); - - V = b3_pshufd_ps(V, B3_SHUFFLE(1, 2, 0, 3)); - return b3MakeVector3(V); -#elif defined(B3_USE_NEON) - float32x4_t T, V; - // form (Y, Z, X, _) of mVec128 and v.mVec128 - float32x2_t Tlow = vget_low_f32(mVec128); - float32x2_t Vlow = vget_low_f32(v.mVec128); - T = vcombine_f32(vext_f32(Tlow, vget_high_f32(mVec128), 1), Tlow); - V = vcombine_f32(vext_f32(Vlow, vget_high_f32(v.mVec128), 1), Vlow); - - V = vmulq_f32(V, mVec128); - T = vmulq_f32(T, v.mVec128); - V = vsubq_f32(V, T); - Vlow = vget_low_f32(V); - // form (Y, Z, X, _); - V = vcombine_f32(vext_f32(Vlow, vget_high_f32(V), 1), Vlow); - V = (float32x4_t)vandq_s32((int32x4_t)V, b3vFFF0Mask); - - return b3Vector3(V); -#else - return b3MakeVector3( - m_floats[1] * v.m_floats[2] - m_floats[2] * v.m_floats[1], - m_floats[2] * v.m_floats[0] - m_floats[0] * v.m_floats[2], - m_floats[0] * v.m_floats[1] - m_floats[1] * v.m_floats[0]); -#endif - } - - B3_FORCE_INLINE b3Scalar triple(const b3Vector3& v1, const b3Vector3& v2) const - { -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - // cross: - __m128 T = _mm_shuffle_ps(v1.mVec128, v1.mVec128, B3_SHUFFLE(1, 2, 0, 3)); // (Y Z X 0) - __m128 V = _mm_shuffle_ps(v2.mVec128, v2.mVec128, B3_SHUFFLE(1, 2, 0, 3)); // (Y Z X 0) - - V = _mm_mul_ps(V, v1.mVec128); - T = _mm_mul_ps(T, v2.mVec128); - V = _mm_sub_ps(V, T); - - V = _mm_shuffle_ps(V, V, B3_SHUFFLE(1, 2, 0, 3)); - - // dot: - V = _mm_mul_ps(V, mVec128); - __m128 z = _mm_movehl_ps(V, V); - __m128 y = _mm_shuffle_ps(V, V, 0x55); - V = _mm_add_ss(V, y); - V = _mm_add_ss(V, z); - return _mm_cvtss_f32(V); - -#elif defined(B3_USE_NEON) - // cross: - float32x4_t T, V; - // form (Y, Z, X, _) of mVec128 and v.mVec128 - float32x2_t Tlow = vget_low_f32(v1.mVec128); - float32x2_t Vlow = vget_low_f32(v2.mVec128); - T = vcombine_f32(vext_f32(Tlow, vget_high_f32(v1.mVec128), 1), Tlow); - V = vcombine_f32(vext_f32(Vlow, vget_high_f32(v2.mVec128), 1), Vlow); - - V = vmulq_f32(V, v1.mVec128); - T = vmulq_f32(T, v2.mVec128); - V = vsubq_f32(V, T); - Vlow = vget_low_f32(V); - // form (Y, Z, X, _); - V = vcombine_f32(vext_f32(Vlow, vget_high_f32(V), 1), Vlow); - - // dot: - V = vmulq_f32(mVec128, V); - float32x2_t x = vpadd_f32(vget_low_f32(V), vget_low_f32(V)); - x = vadd_f32(x, vget_high_f32(V)); - return vget_lane_f32(x, 0); -#else - return m_floats[0] * (v1.m_floats[1] * v2.m_floats[2] - v1.m_floats[2] * v2.m_floats[1]) + - m_floats[1] * (v1.m_floats[2] * v2.m_floats[0] - v1.m_floats[0] * v2.m_floats[2]) + - m_floats[2] * (v1.m_floats[0] * v2.m_floats[1] - v1.m_floats[1] * v2.m_floats[0]); -#endif - } - - /**@brief Return the axis with the smallest value - * Note return values are 0,1,2 for x, y, or z */ - B3_FORCE_INLINE int minAxis() const - { - return m_floats[0] < m_floats[1] ? (m_floats[0] < m_floats[2] ? 0 : 2) : (m_floats[1] < m_floats[2] ? 1 : 2); - } - - /**@brief Return the axis with the largest value - * Note return values are 0,1,2 for x, y, or z */ - B3_FORCE_INLINE int maxAxis() const - { - return m_floats[0] < m_floats[1] ? (m_floats[1] < m_floats[2] ? 2 : 1) : (m_floats[0] < m_floats[2] ? 2 : 0); - } - - B3_FORCE_INLINE int furthestAxis() const - { - return absolute().minAxis(); - } - - B3_FORCE_INLINE int closestAxis() const - { - return absolute().maxAxis(); - } - - B3_FORCE_INLINE void setInterpolate3(const b3Vector3& v0, const b3Vector3& v1, b3Scalar rt) - { -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - __m128 vrt = _mm_load_ss(&rt); // (rt 0 0 0) - b3Scalar s = b3Scalar(1.0) - rt; - __m128 vs = _mm_load_ss(&s); // (S 0 0 0) - vs = b3_pshufd_ps(vs, 0x80); // (S S S 0.0) - __m128 r0 = _mm_mul_ps(v0.mVec128, vs); - vrt = b3_pshufd_ps(vrt, 0x80); // (rt rt rt 0.0) - __m128 r1 = _mm_mul_ps(v1.mVec128, vrt); - __m128 tmp3 = _mm_add_ps(r0, r1); - mVec128 = tmp3; -#elif defined(B3_USE_NEON) - float32x4_t vl = vsubq_f32(v1.mVec128, v0.mVec128); - vl = vmulq_n_f32(vl, rt); - mVec128 = vaddq_f32(vl, v0.mVec128); -#else - b3Scalar s = b3Scalar(1.0) - rt; - m_floats[0] = s * v0.m_floats[0] + rt * v1.m_floats[0]; - m_floats[1] = s * v0.m_floats[1] + rt * v1.m_floats[1]; - m_floats[2] = s * v0.m_floats[2] + rt * v1.m_floats[2]; - //don't do the unused w component - // m_co[3] = s * v0[3] + rt * v1[3]; -#endif - } - - /**@brief Return the linear interpolation between this and another vector - * @param v The other vector - * @param t The ration of this to v (t = 0 => return this, t=1 => return other) */ - B3_FORCE_INLINE b3Vector3 lerp(const b3Vector3& v, const b3Scalar& t) const - { -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - __m128 vt = _mm_load_ss(&t); // (t 0 0 0) - vt = b3_pshufd_ps(vt, 0x80); // (rt rt rt 0.0) - __m128 vl = _mm_sub_ps(v.mVec128, mVec128); - vl = _mm_mul_ps(vl, vt); - vl = _mm_add_ps(vl, mVec128); - - return b3MakeVector3(vl); -#elif defined(B3_USE_NEON) - float32x4_t vl = vsubq_f32(v.mVec128, mVec128); - vl = vmulq_n_f32(vl, t); - vl = vaddq_f32(vl, mVec128); - - return b3Vector3(vl); -#else - return b3MakeVector3(m_floats[0] + (v.m_floats[0] - m_floats[0]) * t, - m_floats[1] + (v.m_floats[1] - m_floats[1]) * t, - m_floats[2] + (v.m_floats[2] - m_floats[2]) * t); -#endif - } - - /**@brief Elementwise multiply this vector by the other - * @param v The other vector */ - B3_FORCE_INLINE b3Vector3& operator*=(const b3Vector3& v) - { -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - mVec128 = _mm_mul_ps(mVec128, v.mVec128); -#elif defined(B3_USE_NEON) - mVec128 = vmulq_f32(mVec128, v.mVec128); -#else - m_floats[0] *= v.m_floats[0]; - m_floats[1] *= v.m_floats[1]; - m_floats[2] *= v.m_floats[2]; -#endif - return *this; - } - - /**@brief Return the x value */ - B3_FORCE_INLINE const b3Scalar& getX() const { return m_floats[0]; } - /**@brief Return the y value */ - B3_FORCE_INLINE const b3Scalar& getY() const { return m_floats[1]; } - /**@brief Return the z value */ - B3_FORCE_INLINE const b3Scalar& getZ() const { return m_floats[2]; } - /**@brief Return the w value */ - B3_FORCE_INLINE const b3Scalar& getW() const { return m_floats[3]; } - - /**@brief Set the x value */ - B3_FORCE_INLINE void setX(b3Scalar _x) { m_floats[0] = _x; }; - /**@brief Set the y value */ - B3_FORCE_INLINE void setY(b3Scalar _y) { m_floats[1] = _y; }; - /**@brief Set the z value */ - B3_FORCE_INLINE void setZ(b3Scalar _z) { m_floats[2] = _z; }; - /**@brief Set the w value */ - B3_FORCE_INLINE void setW(b3Scalar _w) { m_floats[3] = _w; }; - - //B3_FORCE_INLINE b3Scalar& operator[](int i) { return (&m_floats[0])[i]; } - //B3_FORCE_INLINE const b3Scalar& operator[](int i) const { return (&m_floats[0])[i]; } - ///operator b3Scalar*() replaces operator[], using implicit conversion. We added operator != and operator == to avoid pointer comparisons. - B3_FORCE_INLINE operator b3Scalar*() { return &m_floats[0]; } - B3_FORCE_INLINE operator const b3Scalar*() const { return &m_floats[0]; } - - B3_FORCE_INLINE bool operator==(const b3Vector3& other) const - { -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - return (0xf == _mm_movemask_ps((__m128)_mm_cmpeq_ps(mVec128, other.mVec128))); -#else - return ((m_floats[3] == other.m_floats[3]) && - (m_floats[2] == other.m_floats[2]) && - (m_floats[1] == other.m_floats[1]) && - (m_floats[0] == other.m_floats[0])); -#endif - } - - B3_FORCE_INLINE bool operator!=(const b3Vector3& other) const - { - return !(*this == other); - } - - /**@brief Set each element to the max of the current values and the values of another b3Vector3 - * @param other The other b3Vector3 to compare with - */ - B3_FORCE_INLINE void setMax(const b3Vector3& other) - { -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - mVec128 = _mm_max_ps(mVec128, other.mVec128); -#elif defined(B3_USE_NEON) - mVec128 = vmaxq_f32(mVec128, other.mVec128); -#else - b3SetMax(m_floats[0], other.m_floats[0]); - b3SetMax(m_floats[1], other.m_floats[1]); - b3SetMax(m_floats[2], other.m_floats[2]); - b3SetMax(m_floats[3], other.m_floats[3]); -#endif - } - - /**@brief Set each element to the min of the current values and the values of another b3Vector3 - * @param other The other b3Vector3 to compare with - */ - B3_FORCE_INLINE void setMin(const b3Vector3& other) - { -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - mVec128 = _mm_min_ps(mVec128, other.mVec128); -#elif defined(B3_USE_NEON) - mVec128 = vminq_f32(mVec128, other.mVec128); -#else - b3SetMin(m_floats[0], other.m_floats[0]); - b3SetMin(m_floats[1], other.m_floats[1]); - b3SetMin(m_floats[2], other.m_floats[2]); - b3SetMin(m_floats[3], other.m_floats[3]); -#endif - } - - B3_FORCE_INLINE void setValue(const b3Scalar& _x, const b3Scalar& _y, const b3Scalar& _z) - { - m_floats[0] = _x; - m_floats[1] = _y; - m_floats[2] = _z; - m_floats[3] = b3Scalar(0.f); - } - - void getSkewSymmetricMatrix(b3Vector3 * v0, b3Vector3 * v1, b3Vector3 * v2) const - { -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - - __m128 V = _mm_and_ps(mVec128, b3vFFF0fMask); - __m128 V0 = _mm_xor_ps(b3vMzeroMask, V); - __m128 V2 = _mm_movelh_ps(V0, V); - - __m128 V1 = _mm_shuffle_ps(V, V0, 0xCE); - - V0 = _mm_shuffle_ps(V0, V, 0xDB); - V2 = _mm_shuffle_ps(V2, V, 0xF9); - - v0->mVec128 = V0; - v1->mVec128 = V1; - v2->mVec128 = V2; -#else - v0->setValue(0., -getZ(), getY()); - v1->setValue(getZ(), 0., -getX()); - v2->setValue(-getY(), getX(), 0.); -#endif - } - - void setZero() - { -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - mVec128 = (__m128)_mm_xor_ps(mVec128, mVec128); -#elif defined(B3_USE_NEON) - int32x4_t vi = vdupq_n_s32(0); - mVec128 = vreinterpretq_f32_s32(vi); -#else - setValue(b3Scalar(0.), b3Scalar(0.), b3Scalar(0.)); -#endif - } - - B3_FORCE_INLINE bool isZero() const - { - return m_floats[0] == b3Scalar(0) && m_floats[1] == b3Scalar(0) && m_floats[2] == b3Scalar(0); - } - - B3_FORCE_INLINE bool fuzzyZero() const - { - return length2() < B3_EPSILON; - } - - B3_FORCE_INLINE void serialize(struct b3Vector3Data & dataOut) const; - - B3_FORCE_INLINE void deSerialize(const struct b3Vector3Data& dataIn); - - B3_FORCE_INLINE void serializeFloat(struct b3Vector3FloatData & dataOut) const; - - B3_FORCE_INLINE void deSerializeFloat(const struct b3Vector3FloatData& dataIn); - - B3_FORCE_INLINE void serializeDouble(struct b3Vector3DoubleData & dataOut) const; - - B3_FORCE_INLINE void deSerializeDouble(const struct b3Vector3DoubleData& dataIn); - - /**@brief returns index of maximum dot product between this and vectors in array[] - * @param array The other vectors - * @param array_count The number of other vectors - * @param dotOut The maximum dot product */ - B3_FORCE_INLINE long maxDot(const b3Vector3* array, long array_count, b3Scalar& dotOut) const; - - /**@brief returns index of minimum dot product between this and vectors in array[] - * @param array The other vectors - * @param array_count The number of other vectors - * @param dotOut The minimum dot product */ - B3_FORCE_INLINE long minDot(const b3Vector3* array, long array_count, b3Scalar& dotOut) const; - - /* create a vector as b3Vector3( this->dot( b3Vector3 v0 ), this->dot( b3Vector3 v1), this->dot( b3Vector3 v2 )) */ - B3_FORCE_INLINE b3Vector3 dot3(const b3Vector3& v0, const b3Vector3& v1, const b3Vector3& v2) const - { -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - - __m128 a0 = _mm_mul_ps(v0.mVec128, this->mVec128); - __m128 a1 = _mm_mul_ps(v1.mVec128, this->mVec128); - __m128 a2 = _mm_mul_ps(v2.mVec128, this->mVec128); - __m128 b0 = _mm_unpacklo_ps(a0, a1); - __m128 b1 = _mm_unpackhi_ps(a0, a1); - __m128 b2 = _mm_unpacklo_ps(a2, _mm_setzero_ps()); - __m128 r = _mm_movelh_ps(b0, b2); - r = _mm_add_ps(r, _mm_movehl_ps(b2, b0)); - a2 = _mm_and_ps(a2, b3vxyzMaskf); - r = _mm_add_ps(r, b3CastdTo128f(_mm_move_sd(b3CastfTo128d(a2), b3CastfTo128d(b1)))); - return b3MakeVector3(r); - -#elif defined(B3_USE_NEON) - static const uint32x4_t xyzMask = (const uint32x4_t){-1, -1, -1, 0}; - float32x4_t a0 = vmulq_f32(v0.mVec128, this->mVec128); - float32x4_t a1 = vmulq_f32(v1.mVec128, this->mVec128); - float32x4_t a2 = vmulq_f32(v2.mVec128, this->mVec128); - float32x2x2_t zLo = vtrn_f32(vget_high_f32(a0), vget_high_f32(a1)); - a2 = (float32x4_t)vandq_u32((uint32x4_t)a2, xyzMask); - float32x2_t b0 = vadd_f32(vpadd_f32(vget_low_f32(a0), vget_low_f32(a1)), zLo.val[0]); - float32x2_t b1 = vpadd_f32(vpadd_f32(vget_low_f32(a2), vget_high_f32(a2)), vdup_n_f32(0.0f)); - return b3Vector3(vcombine_f32(b0, b1)); -#else - return b3MakeVector3(dot(v0), dot(v1), dot(v2)); -#endif - } -}; - -/**@brief Return the sum of two vectors (Point symantics)*/ -B3_FORCE_INLINE b3Vector3 -operator+(const b3Vector3& v1, const b3Vector3& v2) -{ -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - return b3MakeVector3(_mm_add_ps(v1.mVec128, v2.mVec128)); -#elif defined(B3_USE_NEON) - return b3MakeVector3(vaddq_f32(v1.mVec128, v2.mVec128)); -#else - return b3MakeVector3( - v1.m_floats[0] + v2.m_floats[0], - v1.m_floats[1] + v2.m_floats[1], - v1.m_floats[2] + v2.m_floats[2]); -#endif -} - -/**@brief Return the elementwise product of two vectors */ -B3_FORCE_INLINE b3Vector3 -operator*(const b3Vector3& v1, const b3Vector3& v2) -{ -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - return b3MakeVector3(_mm_mul_ps(v1.mVec128, v2.mVec128)); -#elif defined(B3_USE_NEON) - return b3MakeVector3(vmulq_f32(v1.mVec128, v2.mVec128)); -#else - return b3MakeVector3( - v1.m_floats[0] * v2.m_floats[0], - v1.m_floats[1] * v2.m_floats[1], - v1.m_floats[2] * v2.m_floats[2]); -#endif -} - -/**@brief Return the difference between two vectors */ -B3_FORCE_INLINE b3Vector3 -operator-(const b3Vector3& v1, const b3Vector3& v2) -{ -#if (defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE)) - - // without _mm_and_ps this code causes slowdown in Concave moving - __m128 r = _mm_sub_ps(v1.mVec128, v2.mVec128); - return b3MakeVector3(_mm_and_ps(r, b3vFFF0fMask)); -#elif defined(B3_USE_NEON) - float32x4_t r = vsubq_f32(v1.mVec128, v2.mVec128); - return b3MakeVector3((float32x4_t)vandq_s32((int32x4_t)r, b3vFFF0Mask)); -#else - return b3MakeVector3( - v1.m_floats[0] - v2.m_floats[0], - v1.m_floats[1] - v2.m_floats[1], - v1.m_floats[2] - v2.m_floats[2]); -#endif -} - -/**@brief Return the negative of the vector */ -B3_FORCE_INLINE b3Vector3 -operator-(const b3Vector3& v) -{ -#if (defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE)) - __m128 r = _mm_xor_ps(v.mVec128, b3vMzeroMask); - return b3MakeVector3(_mm_and_ps(r, b3vFFF0fMask)); -#elif defined(B3_USE_NEON) - return b3MakeVector3((b3SimdFloat4)veorq_s32((int32x4_t)v.mVec128, (int32x4_t)b3vMzeroMask)); -#else - return b3MakeVector3(-v.m_floats[0], -v.m_floats[1], -v.m_floats[2]); -#endif -} - -/**@brief Return the vector scaled by s */ -B3_FORCE_INLINE b3Vector3 -operator*(const b3Vector3& v, const b3Scalar& s) -{ -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - __m128 vs = _mm_load_ss(&s); // (S 0 0 0) - vs = b3_pshufd_ps(vs, 0x80); // (S S S 0.0) - return b3MakeVector3(_mm_mul_ps(v.mVec128, vs)); -#elif defined(B3_USE_NEON) - float32x4_t r = vmulq_n_f32(v.mVec128, s); - return b3MakeVector3((float32x4_t)vandq_s32((int32x4_t)r, b3vFFF0Mask)); -#else - return b3MakeVector3(v.m_floats[0] * s, v.m_floats[1] * s, v.m_floats[2] * s); -#endif -} - -/**@brief Return the vector scaled by s */ -B3_FORCE_INLINE b3Vector3 -operator*(const b3Scalar& s, const b3Vector3& v) -{ - return v * s; -} - -/**@brief Return the vector inversely scaled by s */ -B3_FORCE_INLINE b3Vector3 -operator/(const b3Vector3& v, const b3Scalar& s) -{ - b3FullAssert(s != b3Scalar(0.0)); -#if 0 //defined(B3_USE_SSE_IN_API) -// this code is not faster ! - __m128 vs = _mm_load_ss(&s); - vs = _mm_div_ss(b3v1110, vs); - vs = b3_pshufd_ps(vs, 0x00); // (S S S S) - - return b3Vector3(_mm_mul_ps(v.mVec128, vs)); -#else - return v * (b3Scalar(1.0) / s); -#endif -} - -/**@brief Return the vector inversely scaled by s */ -B3_FORCE_INLINE b3Vector3 -operator/(const b3Vector3& v1, const b3Vector3& v2) -{ -#if (defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE)) - __m128 vec = _mm_div_ps(v1.mVec128, v2.mVec128); - vec = _mm_and_ps(vec, b3vFFF0fMask); - return b3MakeVector3(vec); -#elif defined(B3_USE_NEON) - float32x4_t x, y, v, m; - - x = v1.mVec128; - y = v2.mVec128; - - v = vrecpeq_f32(y); // v ~ 1/y - m = vrecpsq_f32(y, v); // m = (2-v*y) - v = vmulq_f32(v, m); // vv = v*m ~~ 1/y - m = vrecpsq_f32(y, v); // mm = (2-vv*y) - v = vmulq_f32(v, x); // x*vv - v = vmulq_f32(v, m); // (x*vv)*(2-vv*y) = x*(vv(2-vv*y)) ~~~ x/y - - return b3Vector3(v); -#else - return b3MakeVector3( - v1.m_floats[0] / v2.m_floats[0], - v1.m_floats[1] / v2.m_floats[1], - v1.m_floats[2] / v2.m_floats[2]); -#endif -} - -/**@brief Return the dot product between two vectors */ -B3_FORCE_INLINE b3Scalar -b3Dot(const b3Vector3& v1, const b3Vector3& v2) -{ - return v1.dot(v2); -} - -/**@brief Return the distance squared between two vectors */ -B3_FORCE_INLINE b3Scalar -b3Distance2(const b3Vector3& v1, const b3Vector3& v2) -{ - return v1.distance2(v2); -} - -/**@brief Return the distance between two vectors */ -B3_FORCE_INLINE b3Scalar -b3Distance(const b3Vector3& v1, const b3Vector3& v2) -{ - return v1.distance(v2); -} - -/**@brief Return the angle between two vectors */ -B3_FORCE_INLINE b3Scalar -b3Angle(const b3Vector3& v1, const b3Vector3& v2) -{ - return v1.angle(v2); -} - -/**@brief Return the cross product of two vectors */ -B3_FORCE_INLINE b3Vector3 -b3Cross(const b3Vector3& v1, const b3Vector3& v2) -{ - return v1.cross(v2); -} - -B3_FORCE_INLINE b3Scalar -b3Triple(const b3Vector3& v1, const b3Vector3& v2, const b3Vector3& v3) -{ - return v1.triple(v2, v3); -} - -/**@brief Return the linear interpolation between two vectors - * @param v1 One vector - * @param v2 The other vector - * @param t The ration of this to v (t = 0 => return v1, t=1 => return v2) */ -B3_FORCE_INLINE b3Vector3 -b3Lerp(const b3Vector3& v1, const b3Vector3& v2, const b3Scalar& t) -{ - return v1.lerp(v2, t); -} - -B3_FORCE_INLINE b3Scalar b3Vector3::distance2(const b3Vector3& v) const -{ - return (v - *this).length2(); -} - -B3_FORCE_INLINE b3Scalar b3Vector3::distance(const b3Vector3& v) const -{ - return (v - *this).length(); -} - -B3_FORCE_INLINE b3Vector3 b3Vector3::normalized() const -{ -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - b3Vector3 norm = *this; - - return norm.normalize(); -#else - return *this / length(); -#endif -} - -B3_FORCE_INLINE b3Vector3 b3Vector3::rotate(const b3Vector3& wAxis, const b3Scalar _angle) const -{ - // wAxis must be a unit lenght vector - -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - - __m128 O = _mm_mul_ps(wAxis.mVec128, mVec128); - b3Scalar ssin = b3Sin(_angle); - __m128 C = wAxis.cross(b3MakeVector3(mVec128)).mVec128; - O = _mm_and_ps(O, b3vFFF0fMask); - b3Scalar scos = b3Cos(_angle); - - __m128 vsin = _mm_load_ss(&ssin); // (S 0 0 0) - __m128 vcos = _mm_load_ss(&scos); // (S 0 0 0) - - __m128 Y = b3_pshufd_ps(O, 0xC9); // (Y Z X 0) - __m128 Z = b3_pshufd_ps(O, 0xD2); // (Z X Y 0) - O = _mm_add_ps(O, Y); - vsin = b3_pshufd_ps(vsin, 0x80); // (S S S 0) - O = _mm_add_ps(O, Z); - vcos = b3_pshufd_ps(vcos, 0x80); // (S S S 0) - - vsin = vsin * C; - O = O * wAxis.mVec128; - __m128 X = mVec128 - O; - - O = O + vsin; - vcos = vcos * X; - O = O + vcos; - - return b3MakeVector3(O); -#else - b3Vector3 o = wAxis * wAxis.dot(*this); - b3Vector3 _x = *this - o; - b3Vector3 _y; - - _y = wAxis.cross(*this); - - return (o + _x * b3Cos(_angle) + _y * b3Sin(_angle)); -#endif -} - -B3_FORCE_INLINE long b3Vector3::maxDot(const b3Vector3* array, long array_count, b3Scalar& dotOut) const -{ -#if defined(B3_USE_SSE) || defined(B3_USE_NEON) -#if defined _WIN32 || defined(B3_USE_SSE) - const long scalar_cutoff = 10; - long b3_maxdot_large(const float* array, const float* vec, unsigned long array_count, float* dotOut); -#elif defined B3_USE_NEON - const long scalar_cutoff = 4; - extern long (*_maxdot_large)(const float* array, const float* vec, unsigned long array_count, float* dotOut); -#endif - if (array_count < scalar_cutoff) -#else - -#endif //B3_USE_SSE || B3_USE_NEON - { - b3Scalar maxDot = -B3_INFINITY; - int i = 0; - int ptIndex = -1; - for (i = 0; i < array_count; i++) - { - b3Scalar dot = array[i].dot(*this); - - if (dot > maxDot) - { - maxDot = dot; - ptIndex = i; - } - } - - b3Assert(ptIndex >= 0); - if (ptIndex < 0) - { - ptIndex = 0; - } - dotOut = maxDot; - return ptIndex; - } -#if defined(B3_USE_SSE) || defined(B3_USE_NEON) - return b3_maxdot_large((float*)array, (float*)&m_floats[0], array_count, &dotOut); -#endif -} - -B3_FORCE_INLINE long b3Vector3::minDot(const b3Vector3* array, long array_count, b3Scalar& dotOut) const -{ -#if defined(B3_USE_SSE) || defined(B3_USE_NEON) -#if defined B3_USE_SSE - const long scalar_cutoff = 10; - long b3_mindot_large(const float* array, const float* vec, unsigned long array_count, float* dotOut); -#elif defined B3_USE_NEON - const long scalar_cutoff = 4; - extern long (*b3_mindot_large)(const float* array, const float* vec, unsigned long array_count, float* dotOut); -#else -#error unhandled arch! -#endif - - if (array_count < scalar_cutoff) -#endif //B3_USE_SSE || B3_USE_NEON - { - b3Scalar minDot = B3_INFINITY; - int i = 0; - int ptIndex = -1; - - for (i = 0; i < array_count; i++) - { - b3Scalar dot = array[i].dot(*this); - - if (dot < minDot) - { - minDot = dot; - ptIndex = i; - } - } - - dotOut = minDot; - - return ptIndex; - } -#if defined(B3_USE_SSE) || defined(B3_USE_NEON) - return b3_mindot_large((float*)array, (float*)&m_floats[0], array_count, &dotOut); -#endif -} - -class b3Vector4 : public b3Vector3 -{ -public: - B3_FORCE_INLINE b3Vector4 absolute4() const - { -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - return b3MakeVector4(_mm_and_ps(mVec128, b3vAbsfMask)); -#elif defined(B3_USE_NEON) - return b3Vector4(vabsq_f32(mVec128)); -#else - return b3MakeVector4( - b3Fabs(m_floats[0]), - b3Fabs(m_floats[1]), - b3Fabs(m_floats[2]), - b3Fabs(m_floats[3])); -#endif - } - - b3Scalar getW() const { return m_floats[3]; } - - B3_FORCE_INLINE int maxAxis4() const - { - int maxIndex = -1; - b3Scalar maxVal = b3Scalar(-B3_LARGE_FLOAT); - if (m_floats[0] > maxVal) - { - maxIndex = 0; - maxVal = m_floats[0]; - } - if (m_floats[1] > maxVal) - { - maxIndex = 1; - maxVal = m_floats[1]; - } - if (m_floats[2] > maxVal) - { - maxIndex = 2; - maxVal = m_floats[2]; - } - if (m_floats[3] > maxVal) - { - maxIndex = 3; - } - - return maxIndex; - } - - B3_FORCE_INLINE int minAxis4() const - { - int minIndex = -1; - b3Scalar minVal = b3Scalar(B3_LARGE_FLOAT); - if (m_floats[0] < minVal) - { - minIndex = 0; - minVal = m_floats[0]; - } - if (m_floats[1] < minVal) - { - minIndex = 1; - minVal = m_floats[1]; - } - if (m_floats[2] < minVal) - { - minIndex = 2; - minVal = m_floats[2]; - } - if (m_floats[3] < minVal) - { - minIndex = 3; - minVal = m_floats[3]; - } - - return minIndex; - } - - B3_FORCE_INLINE int closestAxis4() const - { - return absolute4().maxAxis4(); - } - - /**@brief Set x,y,z and zero w - * @param x Value of x - * @param y Value of y - * @param z Value of z - */ - - /* void getValue(b3Scalar *m) const - { - m[0] = m_floats[0]; - m[1] = m_floats[1]; - m[2] =m_floats[2]; - } -*/ - /**@brief Set the values - * @param x Value of x - * @param y Value of y - * @param z Value of z - * @param w Value of w - */ - B3_FORCE_INLINE void setValue(const b3Scalar& _x, const b3Scalar& _y, const b3Scalar& _z, const b3Scalar& _w) - { - m_floats[0] = _x; - m_floats[1] = _y; - m_floats[2] = _z; - m_floats[3] = _w; - } -}; - -///b3SwapVector3Endian swaps vector endianness, useful for network and cross-platform serialization -B3_FORCE_INLINE void b3SwapScalarEndian(const b3Scalar& sourceVal, b3Scalar& destVal) -{ -#ifdef B3_USE_DOUBLE_PRECISION - unsigned char* dest = (unsigned char*)&destVal; - unsigned char* src = (unsigned char*)&sourceVal; - dest[0] = src[7]; - dest[1] = src[6]; - dest[2] = src[5]; - dest[3] = src[4]; - dest[4] = src[3]; - dest[5] = src[2]; - dest[6] = src[1]; - dest[7] = src[0]; -#else - unsigned char* dest = (unsigned char*)&destVal; - unsigned char* src = (unsigned char*)&sourceVal; - dest[0] = src[3]; - dest[1] = src[2]; - dest[2] = src[1]; - dest[3] = src[0]; -#endif //B3_USE_DOUBLE_PRECISION -} -///b3SwapVector3Endian swaps vector endianness, useful for network and cross-platform serialization -B3_FORCE_INLINE void b3SwapVector3Endian(const b3Vector3& sourceVec, b3Vector3& destVec) -{ - for (int i = 0; i < 4; i++) - { - b3SwapScalarEndian(sourceVec[i], destVec[i]); - } -} - -///b3UnSwapVector3Endian swaps vector endianness, useful for network and cross-platform serialization -B3_FORCE_INLINE void b3UnSwapVector3Endian(b3Vector3& vector) -{ - b3Vector3 swappedVec; - for (int i = 0; i < 4; i++) - { - b3SwapScalarEndian(vector[i], swappedVec[i]); - } - vector = swappedVec; -} - -template -B3_FORCE_INLINE void b3PlaneSpace1(const T& n, T& p, T& q) -{ - if (b3Fabs(n[2]) > B3_SQRT12) - { - // choose p in y-z plane - b3Scalar a = n[1] * n[1] + n[2] * n[2]; - b3Scalar k = b3RecipSqrt(a); - p[0] = 0; - p[1] = -n[2] * k; - p[2] = n[1] * k; - // set q = n x p - q[0] = a * k; - q[1] = -n[0] * p[2]; - q[2] = n[0] * p[1]; - } - else - { - // choose p in x-y plane - b3Scalar a = n[0] * n[0] + n[1] * n[1]; - b3Scalar k = b3RecipSqrt(a); - p[0] = -n[1] * k; - p[1] = n[0] * k; - p[2] = 0; - // set q = n x p - q[0] = -n[2] * p[1]; - q[1] = n[2] * p[0]; - q[2] = a * k; - } -} - -struct b3Vector3FloatData -{ - float m_floats[4]; -}; - -struct b3Vector3DoubleData -{ - double m_floats[4]; -}; - -B3_FORCE_INLINE void b3Vector3::serializeFloat(struct b3Vector3FloatData& dataOut) const -{ - ///could also do a memcpy, check if it is worth it - for (int i = 0; i < 4; i++) - dataOut.m_floats[i] = float(m_floats[i]); -} - -B3_FORCE_INLINE void b3Vector3::deSerializeFloat(const struct b3Vector3FloatData& dataIn) -{ - for (int i = 0; i < 4; i++) - m_floats[i] = b3Scalar(dataIn.m_floats[i]); -} - -B3_FORCE_INLINE void b3Vector3::serializeDouble(struct b3Vector3DoubleData& dataOut) const -{ - ///could also do a memcpy, check if it is worth it - for (int i = 0; i < 4; i++) - dataOut.m_floats[i] = double(m_floats[i]); -} - -B3_FORCE_INLINE void b3Vector3::deSerializeDouble(const struct b3Vector3DoubleData& dataIn) -{ - for (int i = 0; i < 4; i++) - m_floats[i] = b3Scalar(dataIn.m_floats[i]); -} - -B3_FORCE_INLINE void b3Vector3::serialize(struct b3Vector3Data& dataOut) const -{ - ///could also do a memcpy, check if it is worth it - for (int i = 0; i < 4; i++) - dataOut.m_floats[i] = m_floats[i]; -} - -B3_FORCE_INLINE void b3Vector3::deSerialize(const struct b3Vector3Data& dataIn) -{ - for (int i = 0; i < 4; i++) - m_floats[i] = dataIn.m_floats[i]; -} - -inline b3Vector3 b3MakeVector3(b3Scalar x, b3Scalar y, b3Scalar z) -{ - b3Vector3 tmp; - tmp.setValue(x, y, z); - return tmp; -} - -inline b3Vector3 b3MakeVector3(b3Scalar x, b3Scalar y, b3Scalar z, b3Scalar w) -{ - b3Vector3 tmp; - tmp.setValue(x, y, z); - tmp.w = w; - return tmp; -} - -inline b3Vector4 b3MakeVector4(b3Scalar x, b3Scalar y, b3Scalar z, b3Scalar w) -{ - b3Vector4 tmp; - tmp.setValue(x, y, z, w); - return tmp; -} - -#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE) - -inline b3Vector3 b3MakeVector3(b3SimdFloat4 v) -{ - b3Vector3 tmp; - tmp.set128(v); - return tmp; -} - -inline b3Vector4 b3MakeVector4(b3SimdFloat4 vec) -{ - b3Vector4 tmp; - tmp.set128(vec); - return tmp; -} - -#endif - -#endif //B3_VECTOR3_H diff --git a/engine/inc/bullet/Bullet3Common/shared/b3Float4.h b/engine/inc/bullet/Bullet3Common/shared/b3Float4.h deleted file mode 100644 index d8a9f474..00000000 --- a/engine/inc/bullet/Bullet3Common/shared/b3Float4.h +++ /dev/null @@ -1,90 +0,0 @@ -#ifndef B3_FLOAT4_H -#define B3_FLOAT4_H - -#include "Bullet3Common/shared/b3PlatformDefinitions.h" - -#ifdef __cplusplus -#include "Bullet3Common/b3Vector3.h" -#define b3Float4 b3Vector3 -#define b3Float4ConstArg const b3Vector3& -#define b3Dot3F4 b3Dot -#define b3Cross3 b3Cross -#define b3MakeFloat4 b3MakeVector3 -inline b3Vector3 b3Normalized(const b3Vector3& vec) -{ - return vec.normalized(); -} - -inline b3Float4 b3FastNormalized3(b3Float4ConstArg v) -{ - return v.normalized(); -} - -inline b3Float4 b3MaxFloat4(const b3Float4& a, const b3Float4& b) -{ - b3Float4 tmp = a; - tmp.setMax(b); - return tmp; -} -inline b3Float4 b3MinFloat4(const b3Float4& a, const b3Float4& b) -{ - b3Float4 tmp = a; - tmp.setMin(b); - return tmp; -} - -#else -typedef float4 b3Float4; -#define b3Float4ConstArg const b3Float4 -#define b3MakeFloat4 (float4) -float b3Dot3F4(b3Float4ConstArg v0, b3Float4ConstArg v1) -{ - float4 a1 = b3MakeFloat4(v0.xyz, 0.f); - float4 b1 = b3MakeFloat4(v1.xyz, 0.f); - return dot(a1, b1); -} -b3Float4 b3Cross3(b3Float4ConstArg v0, b3Float4ConstArg v1) -{ - float4 a1 = b3MakeFloat4(v0.xyz, 0.f); - float4 b1 = b3MakeFloat4(v1.xyz, 0.f); - return cross(a1, b1); -} -#define b3MinFloat4 min -#define b3MaxFloat4 max - -#define b3Normalized(a) normalize(a) - -#endif - -inline bool b3IsAlmostZero(b3Float4ConstArg v) -{ - if (b3Fabs(v.x) > 1e-6 || b3Fabs(v.y) > 1e-6 || b3Fabs(v.z) > 1e-6) - return false; - return true; -} - -inline int b3MaxDot(b3Float4ConstArg vec, __global const b3Float4* vecArray, int vecLen, float* dotOut) -{ - float maxDot = -B3_INFINITY; - int i = 0; - int ptIndex = -1; - for (i = 0; i < vecLen; i++) - { - float dot = b3Dot3F4(vecArray[i], vec); - - if (dot > maxDot) - { - maxDot = dot; - ptIndex = i; - } - } - b3Assert(ptIndex >= 0); - if (ptIndex < 0) - { - ptIndex = 0; - } - *dotOut = maxDot; - return ptIndex; -} - -#endif //B3_FLOAT4_H diff --git a/engine/inc/bullet/Bullet3Common/shared/b3Int2.h b/engine/inc/bullet/Bullet3Common/shared/b3Int2.h deleted file mode 100644 index 7b84de44..00000000 --- a/engine/inc/bullet/Bullet3Common/shared/b3Int2.h +++ /dev/null @@ -1,63 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2013 Erwin Coumans http://bulletphysics.org - -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 B3_INT2_H -#define B3_INT2_H - -#ifdef __cplusplus - -struct b3UnsignedInt2 -{ - union { - struct - { - unsigned int x, y; - }; - struct - { - unsigned int s[2]; - }; - }; -}; - -struct b3Int2 -{ - union { - struct - { - int x, y; - }; - struct - { - int s[2]; - }; - }; -}; - -inline b3Int2 b3MakeInt2(int x, int y) -{ - b3Int2 v; - v.s[0] = x; - v.s[1] = y; - return v; -} -#else - -#define b3UnsignedInt2 uint2 -#define b3Int2 int2 -#define b3MakeInt2 (int2) - -#endif //__cplusplus -#endif \ No newline at end of file diff --git a/engine/inc/bullet/Bullet3Common/shared/b3Int4.h b/engine/inc/bullet/Bullet3Common/shared/b3Int4.h deleted file mode 100644 index f6a17542..00000000 --- a/engine/inc/bullet/Bullet3Common/shared/b3Int4.h +++ /dev/null @@ -1,71 +0,0 @@ -#ifndef B3_INT4_H -#define B3_INT4_H - -#ifdef __cplusplus - -#include "Bullet3Common/b3Scalar.h" - -B3_ATTRIBUTE_ALIGNED16(struct) -b3UnsignedInt4 -{ - B3_DECLARE_ALIGNED_ALLOCATOR(); - - union { - struct - { - unsigned int x, y, z, w; - }; - struct - { - unsigned int s[4]; - }; - }; -}; - -B3_ATTRIBUTE_ALIGNED16(struct) -b3Int4 -{ - B3_DECLARE_ALIGNED_ALLOCATOR(); - - union { - struct - { - int x, y, z, w; - }; - struct - { - int s[4]; - }; - }; -}; - -B3_FORCE_INLINE b3Int4 b3MakeInt4(int x, int y, int z, int w = 0) -{ - b3Int4 v; - v.s[0] = x; - v.s[1] = y; - v.s[2] = z; - v.s[3] = w; - return v; -} - -B3_FORCE_INLINE b3UnsignedInt4 b3MakeUnsignedInt4(unsigned int x, unsigned int y, unsigned int z, unsigned int w = 0) -{ - b3UnsignedInt4 v; - v.s[0] = x; - v.s[1] = y; - v.s[2] = z; - v.s[3] = w; - return v; -} - -#else - -#define b3UnsignedInt4 uint4 -#define b3Int4 int4 -#define b3MakeInt4 (int4) -#define b3MakeUnsignedInt4 (uint4) - -#endif //__cplusplus - -#endif //B3_INT4_H diff --git a/engine/inc/bullet/Bullet3Common/shared/b3Mat3x3.h b/engine/inc/bullet/Bullet3Common/shared/b3Mat3x3.h deleted file mode 100644 index ce6482b5..00000000 --- a/engine/inc/bullet/Bullet3Common/shared/b3Mat3x3.h +++ /dev/null @@ -1,157 +0,0 @@ - -#ifndef B3_MAT3x3_H -#define B3_MAT3x3_H - -#include "Bullet3Common/shared/b3Quat.h" - -#ifdef __cplusplus - -#include "Bullet3Common/b3Matrix3x3.h" - -#define b3Mat3x3 b3Matrix3x3 -#define b3Mat3x3ConstArg const b3Matrix3x3& - -inline b3Mat3x3 b3QuatGetRotationMatrix(b3QuatConstArg quat) -{ - return b3Mat3x3(quat); -} - -inline b3Mat3x3 b3AbsoluteMat3x3(b3Mat3x3ConstArg mat) -{ - return mat.absolute(); -} - -#define b3GetRow(m, row) m.getRow(row) - -__inline b3Float4 mtMul3(b3Float4ConstArg a, b3Mat3x3ConstArg b) -{ - return b * a; -} - -#else - -typedef struct -{ - b3Float4 m_row[3]; -} b3Mat3x3; - -#define b3Mat3x3ConstArg const b3Mat3x3 -#define b3GetRow(m, row) (m.m_row[row]) - -inline b3Mat3x3 b3QuatGetRotationMatrix(b3Quat quat) -{ - b3Float4 quat2 = (b3Float4)(quat.x * quat.x, quat.y * quat.y, quat.z * quat.z, 0.f); - b3Mat3x3 out; - - out.m_row[0].x = 1 - 2 * quat2.y - 2 * quat2.z; - out.m_row[0].y = 2 * quat.x * quat.y - 2 * quat.w * quat.z; - out.m_row[0].z = 2 * quat.x * quat.z + 2 * quat.w * quat.y; - out.m_row[0].w = 0.f; - - out.m_row[1].x = 2 * quat.x * quat.y + 2 * quat.w * quat.z; - out.m_row[1].y = 1 - 2 * quat2.x - 2 * quat2.z; - out.m_row[1].z = 2 * quat.y * quat.z - 2 * quat.w * quat.x; - out.m_row[1].w = 0.f; - - out.m_row[2].x = 2 * quat.x * quat.z - 2 * quat.w * quat.y; - out.m_row[2].y = 2 * quat.y * quat.z + 2 * quat.w * quat.x; - out.m_row[2].z = 1 - 2 * quat2.x - 2 * quat2.y; - out.m_row[2].w = 0.f; - - return out; -} - -inline b3Mat3x3 b3AbsoluteMat3x3(b3Mat3x3ConstArg matIn) -{ - b3Mat3x3 out; - out.m_row[0] = fabs(matIn.m_row[0]); - out.m_row[1] = fabs(matIn.m_row[1]); - out.m_row[2] = fabs(matIn.m_row[2]); - return out; -} - -__inline b3Mat3x3 mtZero(); - -__inline b3Mat3x3 mtIdentity(); - -__inline b3Mat3x3 mtTranspose(b3Mat3x3 m); - -__inline b3Mat3x3 mtMul(b3Mat3x3 a, b3Mat3x3 b); - -__inline b3Float4 mtMul1(b3Mat3x3 a, b3Float4 b); - -__inline b3Float4 mtMul3(b3Float4 a, b3Mat3x3 b); - -__inline b3Mat3x3 mtZero() -{ - b3Mat3x3 m; - m.m_row[0] = (b3Float4)(0.f); - m.m_row[1] = (b3Float4)(0.f); - m.m_row[2] = (b3Float4)(0.f); - return m; -} - -__inline b3Mat3x3 mtIdentity() -{ - b3Mat3x3 m; - m.m_row[0] = (b3Float4)(1, 0, 0, 0); - m.m_row[1] = (b3Float4)(0, 1, 0, 0); - m.m_row[2] = (b3Float4)(0, 0, 1, 0); - return m; -} - -__inline b3Mat3x3 mtTranspose(b3Mat3x3 m) -{ - b3Mat3x3 out; - out.m_row[0] = (b3Float4)(m.m_row[0].x, m.m_row[1].x, m.m_row[2].x, 0.f); - out.m_row[1] = (b3Float4)(m.m_row[0].y, m.m_row[1].y, m.m_row[2].y, 0.f); - out.m_row[2] = (b3Float4)(m.m_row[0].z, m.m_row[1].z, m.m_row[2].z, 0.f); - return out; -} - -__inline b3Mat3x3 mtMul(b3Mat3x3 a, b3Mat3x3 b) -{ - b3Mat3x3 transB; - transB = mtTranspose(b); - b3Mat3x3 ans; - // why this doesn't run when 0ing in the for{} - a.m_row[0].w = 0.f; - a.m_row[1].w = 0.f; - a.m_row[2].w = 0.f; - for (int i = 0; i < 3; i++) - { - // a.m_row[i].w = 0.f; - ans.m_row[i].x = b3Dot3F4(a.m_row[i], transB.m_row[0]); - ans.m_row[i].y = b3Dot3F4(a.m_row[i], transB.m_row[1]); - ans.m_row[i].z = b3Dot3F4(a.m_row[i], transB.m_row[2]); - ans.m_row[i].w = 0.f; - } - return ans; -} - -__inline b3Float4 mtMul1(b3Mat3x3 a, b3Float4 b) -{ - b3Float4 ans; - ans.x = b3Dot3F4(a.m_row[0], b); - ans.y = b3Dot3F4(a.m_row[1], b); - ans.z = b3Dot3F4(a.m_row[2], b); - ans.w = 0.f; - return ans; -} - -__inline b3Float4 mtMul3(b3Float4 a, b3Mat3x3 b) -{ - b3Float4 colx = b3MakeFloat4(b.m_row[0].x, b.m_row[1].x, b.m_row[2].x, 0); - b3Float4 coly = b3MakeFloat4(b.m_row[0].y, b.m_row[1].y, b.m_row[2].y, 0); - b3Float4 colz = b3MakeFloat4(b.m_row[0].z, b.m_row[1].z, b.m_row[2].z, 0); - - b3Float4 ans; - ans.x = b3Dot3F4(a, colx); - ans.y = b3Dot3F4(a, coly); - ans.z = b3Dot3F4(a, colz); - return ans; -} - -#endif - -#endif //B3_MAT3x3_H diff --git a/engine/inc/bullet/Bullet3Common/shared/b3PlatformDefinitions.h b/engine/inc/bullet/Bullet3Common/shared/b3PlatformDefinitions.h deleted file mode 100644 index b72bee93..00000000 --- a/engine/inc/bullet/Bullet3Common/shared/b3PlatformDefinitions.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef B3_PLATFORM_DEFINITIONS_H -#define B3_PLATFORM_DEFINITIONS_H - -struct MyTest -{ - int bla; -}; - -#ifdef __cplusplus -//#define b3ConstArray(a) const b3AlignedObjectArray& -#define b3ConstArray(a) const a * -#define b3AtomicInc(a) ((*a)++) - -inline int b3AtomicAdd(volatile int *p, int val) -{ - int oldValue = *p; - int newValue = oldValue + val; - *p = newValue; - return oldValue; -} - -#define __global - -#define B3_STATIC static -#else -//keep B3_LARGE_FLOAT*B3_LARGE_FLOAT < FLT_MAX -#define B3_LARGE_FLOAT 1e18f -#define B3_INFINITY 1e18f -#define b3Assert(a) -#define b3ConstArray(a) __global const a * -#define b3AtomicInc atomic_inc -#define b3AtomicAdd atomic_add -#define b3Fabs fabs -#define b3Sqrt native_sqrt -#define b3Sin native_sin -#define b3Cos native_cos - -#define B3_STATIC -#endif - -#endif diff --git a/engine/inc/bullet/Bullet3Common/shared/b3Quat.h b/engine/inc/bullet/Bullet3Common/shared/b3Quat.h deleted file mode 100644 index 940610c7..00000000 --- a/engine/inc/bullet/Bullet3Common/shared/b3Quat.h +++ /dev/null @@ -1,100 +0,0 @@ -#ifndef B3_QUAT_H -#define B3_QUAT_H - -#include "Bullet3Common/shared/b3PlatformDefinitions.h" -#include "Bullet3Common/shared/b3Float4.h" - -#ifdef __cplusplus -#include "Bullet3Common/b3Quaternion.h" -#include "Bullet3Common/b3Transform.h" - -#define b3Quat b3Quaternion -#define b3QuatConstArg const b3Quaternion& -inline b3Quat b3QuatInverse(b3QuatConstArg orn) -{ - return orn.inverse(); -} - -inline b3Float4 b3TransformPoint(b3Float4ConstArg point, b3Float4ConstArg translation, b3QuatConstArg orientation) -{ - b3Transform tr; - tr.setOrigin(translation); - tr.setRotation(orientation); - return tr(point); -} - -#else -typedef float4 b3Quat; -#define b3QuatConstArg const b3Quat - -inline float4 b3FastNormalize4(float4 v) -{ - v = (float4)(v.xyz, 0.f); - return fast_normalize(v); -} - -inline b3Quat b3QuatMul(b3Quat a, b3Quat b); -inline b3Quat b3QuatNormalized(b3QuatConstArg in); -inline b3Quat b3QuatRotate(b3QuatConstArg q, b3QuatConstArg vec); -inline b3Quat b3QuatInvert(b3QuatConstArg q); -inline b3Quat b3QuatInverse(b3QuatConstArg q); - -inline b3Quat b3QuatMul(b3QuatConstArg a, b3QuatConstArg b) -{ - b3Quat ans; - ans = b3Cross3(a, b); - ans += a.w * b + b.w * a; - // ans.w = a.w*b.w - (a.x*b.x+a.y*b.y+a.z*b.z); - ans.w = a.w * b.w - b3Dot3F4(a, b); - return ans; -} - -inline b3Quat b3QuatNormalized(b3QuatConstArg in) -{ - b3Quat q; - q = in; - //return b3FastNormalize4(in); - float len = native_sqrt(dot(q, q)); - if (len > 0.f) - { - q *= 1.f / len; - } - else - { - q.x = q.y = q.z = 0.f; - q.w = 1.f; - } - return q; -} -inline float4 b3QuatRotate(b3QuatConstArg q, b3QuatConstArg vec) -{ - b3Quat qInv = b3QuatInvert(q); - float4 vcpy = vec; - vcpy.w = 0.f; - float4 out = b3QuatMul(b3QuatMul(q, vcpy), qInv); - return out; -} - -inline b3Quat b3QuatInverse(b3QuatConstArg q) -{ - return (b3Quat)(-q.xyz, q.w); -} - -inline b3Quat b3QuatInvert(b3QuatConstArg q) -{ - return (b3Quat)(-q.xyz, q.w); -} - -inline float4 b3QuatInvRotate(b3QuatConstArg q, b3QuatConstArg vec) -{ - return b3QuatRotate(b3QuatInvert(q), vec); -} - -inline b3Float4 b3TransformPoint(b3Float4ConstArg point, b3Float4ConstArg translation, b3QuatConstArg orientation) -{ - return b3QuatRotate(orientation, point) + (translation); -} - -#endif - -#endif //B3_QUAT_H diff --git a/engine/inc/bullet/Bullet3Dynamics/ConstraintSolver/b3ContactSolverInfo.h b/engine/inc/bullet/Bullet3Dynamics/ConstraintSolver/b3ContactSolverInfo.h deleted file mode 100644 index 049c9116..00000000 --- a/engine/inc/bullet/Bullet3Dynamics/ConstraintSolver/b3ContactSolverInfo.h +++ /dev/null @@ -1,149 +0,0 @@ -/* -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 B3_CONTACT_SOLVER_INFO -#define B3_CONTACT_SOLVER_INFO - -#include "Bullet3Common/b3Scalar.h" - -enum b3SolverMode -{ - B3_SOLVER_RANDMIZE_ORDER = 1, - B3_SOLVER_FRICTION_SEPARATE = 2, - B3_SOLVER_USE_WARMSTARTING = 4, - B3_SOLVER_USE_2_FRICTION_DIRECTIONS = 16, - B3_SOLVER_ENABLE_FRICTION_DIRECTION_CACHING = 32, - B3_SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION = 64, - B3_SOLVER_CACHE_FRIENDLY = 128, - B3_SOLVER_SIMD = 256, - B3_SOLVER_INTERLEAVE_CONTACT_AND_FRICTION_CONSTRAINTS = 512, - B3_SOLVER_ALLOW_ZERO_LENGTH_FRICTION_DIRECTIONS = 1024 -}; - -struct b3ContactSolverInfoData -{ - b3Scalar m_tau; - b3Scalar m_damping; //global non-contact constraint damping, can be locally overridden by constraints during 'getInfo2'. - b3Scalar m_friction; - b3Scalar m_timeStep; - b3Scalar m_restitution; - int m_numIterations; - b3Scalar m_maxErrorReduction; - b3Scalar m_sor; - b3Scalar m_erp; //used as Baumgarte factor - b3Scalar m_erp2; //used in Split Impulse - b3Scalar m_globalCfm; //constraint force mixing - int m_splitImpulse; - b3Scalar m_splitImpulsePenetrationThreshold; - b3Scalar m_splitImpulseTurnErp; - b3Scalar m_linearSlop; - b3Scalar m_warmstartingFactor; - - int m_solverMode; - int m_restingContactRestitutionThreshold; - int m_minimumSolverBatchSize; - b3Scalar m_maxGyroscopicForce; - b3Scalar m_singleAxisRollingFrictionThreshold; -}; - -struct b3ContactSolverInfo : public b3ContactSolverInfoData -{ - inline b3ContactSolverInfo() - { - m_tau = b3Scalar(0.6); - m_damping = b3Scalar(1.0); - m_friction = b3Scalar(0.3); - m_timeStep = b3Scalar(1.f / 60.f); - m_restitution = b3Scalar(0.); - m_maxErrorReduction = b3Scalar(20.); - m_numIterations = 10; - m_erp = b3Scalar(0.2); - m_erp2 = b3Scalar(0.8); - m_globalCfm = b3Scalar(0.); - m_sor = b3Scalar(1.); - m_splitImpulse = true; - m_splitImpulsePenetrationThreshold = -.04f; - m_splitImpulseTurnErp = 0.1f; - m_linearSlop = b3Scalar(0.0); - m_warmstartingFactor = b3Scalar(0.85); - //m_solverMode = B3_SOLVER_USE_WARMSTARTING | B3_SOLVER_SIMD | B3_SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION|B3_SOLVER_USE_2_FRICTION_DIRECTIONS|B3_SOLVER_ENABLE_FRICTION_DIRECTION_CACHING;// | B3_SOLVER_RANDMIZE_ORDER; - m_solverMode = B3_SOLVER_USE_WARMSTARTING | B3_SOLVER_SIMD; // | B3_SOLVER_RANDMIZE_ORDER; - m_restingContactRestitutionThreshold = 2; //unused as of 2.81 - m_minimumSolverBatchSize = 128; //try to combine islands until the amount of constraints reaches this limit - m_maxGyroscopicForce = 100.f; ///only used to clamp forces for bodies that have their B3_ENABLE_GYROPSCOPIC_FORCE flag set (using b3RigidBody::setFlag) - m_singleAxisRollingFrictionThreshold = 1e30f; ///if the velocity is above this threshold, it will use a single constraint row (axis), otherwise 3 rows. - } -}; - -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct b3ContactSolverInfoDoubleData -{ - double m_tau; - double m_damping; //global non-contact constraint damping, can be locally overridden by constraints during 'getInfo2'. - double m_friction; - double m_timeStep; - double m_restitution; - double m_maxErrorReduction; - double m_sor; - double m_erp; //used as Baumgarte factor - double m_erp2; //used in Split Impulse - double m_globalCfm; //constraint force mixing - double m_splitImpulsePenetrationThreshold; - double m_splitImpulseTurnErp; - double m_linearSlop; - double m_warmstartingFactor; - double m_maxGyroscopicForce; - double m_singleAxisRollingFrictionThreshold; - - int m_numIterations; - int m_solverMode; - int m_restingContactRestitutionThreshold; - int m_minimumSolverBatchSize; - int m_splitImpulse; - char m_padding[4]; -}; -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct b3ContactSolverInfoFloatData -{ - float m_tau; - float m_damping; //global non-contact constraint damping, can be locally overridden by constraints during 'getInfo2'. - float m_friction; - float m_timeStep; - - float m_restitution; - float m_maxErrorReduction; - float m_sor; - float m_erp; //used as Baumgarte factor - - float m_erp2; //used in Split Impulse - float m_globalCfm; //constraint force mixing - float m_splitImpulsePenetrationThreshold; - float m_splitImpulseTurnErp; - - float m_linearSlop; - float m_warmstartingFactor; - float m_maxGyroscopicForce; - float m_singleAxisRollingFrictionThreshold; - - int m_numIterations; - int m_solverMode; - int m_restingContactRestitutionThreshold; - int m_minimumSolverBatchSize; - - int m_splitImpulse; - char m_padding[4]; -}; - -#endif //B3_CONTACT_SOLVER_INFO diff --git a/engine/inc/bullet/Bullet3Dynamics/ConstraintSolver/b3FixedConstraint.h b/engine/inc/bullet/Bullet3Dynamics/ConstraintSolver/b3FixedConstraint.h deleted file mode 100644 index 64809666..00000000 --- a/engine/inc/bullet/Bullet3Dynamics/ConstraintSolver/b3FixedConstraint.h +++ /dev/null @@ -1,34 +0,0 @@ - -#ifndef B3_FIXED_CONSTRAINT_H -#define B3_FIXED_CONSTRAINT_H - -#include "b3TypedConstraint.h" - -B3_ATTRIBUTE_ALIGNED16(class) -b3FixedConstraint : public b3TypedConstraint -{ - b3Vector3 m_pivotInA; - b3Vector3 m_pivotInB; - b3Quaternion m_relTargetAB; - -public: - b3FixedConstraint(int rbA, int rbB, const b3Transform& frameInA, const b3Transform& frameInB); - - virtual ~b3FixedConstraint(); - - virtual void getInfo1(b3ConstraintInfo1 * info, const b3RigidBodyData* bodies); - - virtual void getInfo2(b3ConstraintInfo2 * info, const b3RigidBodyData* bodies); - - virtual void setParam(int num, b3Scalar value, int axis = -1) - { - b3Assert(0); - } - virtual b3Scalar getParam(int num, int axis = -1) const - { - b3Assert(0); - return 0.f; - } -}; - -#endif //B3_FIXED_CONSTRAINT_H diff --git a/engine/inc/bullet/Bullet3Dynamics/ConstraintSolver/b3Generic6DofConstraint.h b/engine/inc/bullet/Bullet3Dynamics/ConstraintSolver/b3Generic6DofConstraint.h deleted file mode 100644 index 1597809d..00000000 --- a/engine/inc/bullet/Bullet3Dynamics/ConstraintSolver/b3Generic6DofConstraint.h +++ /dev/null @@ -1,517 +0,0 @@ -/* -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. -*/ - -/// 2009 March: b3Generic6DofConstraint refactored by Roman Ponomarev -/// Added support for generic constraint solver through getInfo1/getInfo2 methods - -/* -2007-09-09 -b3Generic6DofConstraint Refactored by Francisco Le?n -email: projectileman@yahoo.com -http://gimpact.sf.net -*/ - -#ifndef B3_GENERIC_6DOF_CONSTRAINT_H -#define B3_GENERIC_6DOF_CONSTRAINT_H - -#include "Bullet3Common/b3Vector3.h" -#include "b3JacobianEntry.h" -#include "b3TypedConstraint.h" - -struct b3RigidBodyData; - -//! Rotation Limit structure for generic joints -class b3RotationalLimitMotor -{ -public: - //! limit_parameters - //!@{ - b3Scalar m_loLimit; //!< joint limit - b3Scalar m_hiLimit; //!< joint limit - b3Scalar m_targetVelocity; //!< target motor velocity - b3Scalar m_maxMotorForce; //!< max force on motor - b3Scalar m_maxLimitForce; //!< max force on limit - b3Scalar m_damping; //!< Damping. - b3Scalar m_limitSoftness; //! Relaxation factor - b3Scalar m_normalCFM; //!< Constraint force mixing factor - b3Scalar m_stopERP; //!< Error tolerance factor when joint is at limit - b3Scalar m_stopCFM; //!< Constraint force mixing factor when joint is at limit - b3Scalar m_bounce; //!< restitution factor - bool m_enableMotor; - - //!@} - - //! temp_variables - //!@{ - b3Scalar m_currentLimitError; //! How much is violated this limit - b3Scalar m_currentPosition; //! current value of angle - int m_currentLimit; //!< 0=free, 1=at lo limit, 2=at hi limit - b3Scalar m_accumulatedImpulse; - //!@} - - b3RotationalLimitMotor() - { - m_accumulatedImpulse = 0.f; - m_targetVelocity = 0; - m_maxMotorForce = 6.0f; - m_maxLimitForce = 300.0f; - m_loLimit = 1.0f; - m_hiLimit = -1.0f; - m_normalCFM = 0.f; - m_stopERP = 0.2f; - m_stopCFM = 0.f; - m_bounce = 0.0f; - m_damping = 1.0f; - m_limitSoftness = 0.5f; - m_currentLimit = 0; - m_currentLimitError = 0; - m_enableMotor = false; - } - - b3RotationalLimitMotor(const b3RotationalLimitMotor& limot) - { - m_targetVelocity = limot.m_targetVelocity; - m_maxMotorForce = limot.m_maxMotorForce; - m_limitSoftness = limot.m_limitSoftness; - m_loLimit = limot.m_loLimit; - m_hiLimit = limot.m_hiLimit; - m_normalCFM = limot.m_normalCFM; - m_stopERP = limot.m_stopERP; - m_stopCFM = limot.m_stopCFM; - m_bounce = limot.m_bounce; - m_currentLimit = limot.m_currentLimit; - m_currentLimitError = limot.m_currentLimitError; - m_enableMotor = limot.m_enableMotor; - } - - //! Is limited - bool isLimited() - { - if (m_loLimit > m_hiLimit) return false; - return true; - } - - //! Need apply correction - bool needApplyTorques() - { - if (m_currentLimit == 0 && m_enableMotor == false) return false; - return true; - } - - //! calculates error - /*! - calculates m_currentLimit and m_currentLimitError. - */ - int testLimitValue(b3Scalar test_value); - - //! apply the correction impulses for two bodies - b3Scalar solveAngularLimits(b3Scalar timeStep, b3Vector3& axis, b3Scalar jacDiagABInv, b3RigidBodyData* body0, b3RigidBodyData* body1); -}; - -class b3TranslationalLimitMotor -{ -public: - b3Vector3 m_lowerLimit; //!< the constraint lower limits - b3Vector3 m_upperLimit; //!< the constraint upper limits - b3Vector3 m_accumulatedImpulse; - //! Linear_Limit_parameters - //!@{ - b3Vector3 m_normalCFM; //!< Constraint force mixing factor - b3Vector3 m_stopERP; //!< Error tolerance factor when joint is at limit - b3Vector3 m_stopCFM; //!< Constraint force mixing factor when joint is at limit - b3Vector3 m_targetVelocity; //!< target motor velocity - b3Vector3 m_maxMotorForce; //!< max force on motor - b3Vector3 m_currentLimitError; //! How much is violated this limit - b3Vector3 m_currentLinearDiff; //! Current relative offset of constraint frames - b3Scalar m_limitSoftness; //!< Softness for linear limit - b3Scalar m_damping; //!< Damping for linear limit - b3Scalar m_restitution; //! Bounce parameter for linear limit - //!@} - bool m_enableMotor[3]; - int m_currentLimit[3]; //!< 0=free, 1=at lower limit, 2=at upper limit - - b3TranslationalLimitMotor() - { - m_lowerLimit.setValue(0.f, 0.f, 0.f); - m_upperLimit.setValue(0.f, 0.f, 0.f); - m_accumulatedImpulse.setValue(0.f, 0.f, 0.f); - m_normalCFM.setValue(0.f, 0.f, 0.f); - m_stopERP.setValue(0.2f, 0.2f, 0.2f); - m_stopCFM.setValue(0.f, 0.f, 0.f); - - m_limitSoftness = 0.7f; - m_damping = b3Scalar(1.0f); - m_restitution = b3Scalar(0.5f); - for (int i = 0; i < 3; i++) - { - m_enableMotor[i] = false; - m_targetVelocity[i] = b3Scalar(0.f); - m_maxMotorForce[i] = b3Scalar(0.f); - } - } - - b3TranslationalLimitMotor(const b3TranslationalLimitMotor& other) - { - m_lowerLimit = other.m_lowerLimit; - m_upperLimit = other.m_upperLimit; - m_accumulatedImpulse = other.m_accumulatedImpulse; - - m_limitSoftness = other.m_limitSoftness; - m_damping = other.m_damping; - m_restitution = other.m_restitution; - m_normalCFM = other.m_normalCFM; - m_stopERP = other.m_stopERP; - m_stopCFM = other.m_stopCFM; - - for (int i = 0; i < 3; i++) - { - m_enableMotor[i] = other.m_enableMotor[i]; - m_targetVelocity[i] = other.m_targetVelocity[i]; - m_maxMotorForce[i] = other.m_maxMotorForce[i]; - } - } - - //! Test limit - /*! - - free means upper < lower, - - locked means upper == lower - - limited means upper > lower - - limitIndex: first 3 are linear, next 3 are angular - */ - inline bool isLimited(int limitIndex) - { - return (m_upperLimit[limitIndex] >= m_lowerLimit[limitIndex]); - } - inline bool needApplyForce(int limitIndex) - { - if (m_currentLimit[limitIndex] == 0 && m_enableMotor[limitIndex] == false) return false; - return true; - } - int testLimitValue(int limitIndex, b3Scalar test_value); - - b3Scalar solveLinearAxis( - b3Scalar timeStep, - b3Scalar jacDiagABInv, - b3RigidBodyData& body1, const b3Vector3& pointInA, - b3RigidBodyData& body2, const b3Vector3& pointInB, - int limit_index, - const b3Vector3& axis_normal_on_a, - const b3Vector3& anchorPos); -}; - -enum b36DofFlags -{ - B3_6DOF_FLAGS_CFM_NORM = 1, - B3_6DOF_FLAGS_CFM_STOP = 2, - B3_6DOF_FLAGS_ERP_STOP = 4 -}; -#define B3_6DOF_FLAGS_AXIS_SHIFT 3 // bits per axis - -/// b3Generic6DofConstraint between two rigidbodies each with a pivotpoint that descibes the axis location in local space -/*! -b3Generic6DofConstraint can leave any of the 6 degree of freedom 'free' or 'locked'. -currently this limit supports rotational motors
-
    -
  • For Linear limits, use b3Generic6DofConstraint.setLinearUpperLimit, b3Generic6DofConstraint.setLinearLowerLimit. You can set the parameters with the b3TranslationalLimitMotor structure accsesible through the b3Generic6DofConstraint.getTranslationalLimitMotor method. -At this moment translational motors are not supported. May be in the future.
  • - -
  • For Angular limits, use the b3RotationalLimitMotor structure for configuring the limit. -This is accessible through b3Generic6DofConstraint.getLimitMotor method, -This brings support for limit parameters and motors.
  • - -
  • Angulars limits have these possible ranges: - - - - - - - - - - - - - - - - - - -
    AXISMIN ANGLEMAX ANGLE
    X-PIPI
    Y-PI/2PI/2
    Z-PIPI
    -
  • -
- -*/ -B3_ATTRIBUTE_ALIGNED16(class) -b3Generic6DofConstraint : public b3TypedConstraint -{ -protected: - //! relative_frames - //!@{ - b3Transform m_frameInA; //!< the constraint space w.r.t body A - b3Transform m_frameInB; //!< the constraint space w.r.t body B - //!@} - - //! Jacobians - //!@{ - // b3JacobianEntry m_jacLinear[3];//!< 3 orthogonal linear constraints - // b3JacobianEntry m_jacAng[3];//!< 3 orthogonal angular constraints - //!@} - - //! Linear_Limit_parameters - //!@{ - b3TranslationalLimitMotor m_linearLimits; - //!@} - - //! hinge_parameters - //!@{ - b3RotationalLimitMotor m_angularLimits[3]; - //!@} - -protected: - //! temporal variables - //!@{ - b3Transform m_calculatedTransformA; - b3Transform m_calculatedTransformB; - b3Vector3 m_calculatedAxisAngleDiff; - b3Vector3 m_calculatedAxis[3]; - b3Vector3 m_calculatedLinearDiff; - b3Scalar m_timeStep; - b3Scalar m_factA; - b3Scalar m_factB; - bool m_hasStaticBody; - - b3Vector3 m_AnchorPos; // point betwen pivots of bodies A and B to solve linear axes - - bool m_useLinearReferenceFrameA; - bool m_useOffsetForConstraintFrame; - - int m_flags; - - //!@} - - b3Generic6DofConstraint& operator=(b3Generic6DofConstraint& other) - { - b3Assert(0); - (void)other; - return *this; - } - - int setAngularLimits(b3ConstraintInfo2 * info, int row_offset, const b3Transform& transA, const b3Transform& transB, const b3Vector3& linVelA, const b3Vector3& linVelB, const b3Vector3& angVelA, const b3Vector3& angVelB); - - int setLinearLimits(b3ConstraintInfo2 * info, int row, const b3Transform& transA, const b3Transform& transB, const b3Vector3& linVelA, const b3Vector3& linVelB, const b3Vector3& angVelA, const b3Vector3& angVelB); - - // tests linear limits - void calculateLinearInfo(); - - //! calcs the euler angles between the two bodies. - void calculateAngleInfo(); - -public: - B3_DECLARE_ALIGNED_ALLOCATOR(); - - b3Generic6DofConstraint(int rbA, int rbB, const b3Transform& frameInA, const b3Transform& frameInB, bool useLinearReferenceFrameA, const b3RigidBodyData* bodies); - - //! Calcs global transform of the offsets - /*! - Calcs the global transform for the joint offset for body A an B, and also calcs the agle differences between the bodies. - \sa b3Generic6DofConstraint.getCalculatedTransformA , b3Generic6DofConstraint.getCalculatedTransformB, b3Generic6DofConstraint.calculateAngleInfo - */ - void calculateTransforms(const b3Transform& transA, const b3Transform& transB, const b3RigidBodyData* bodies); - - void calculateTransforms(const b3RigidBodyData* bodies); - - //! Gets the global transform of the offset for body A - /*! - \sa b3Generic6DofConstraint.getFrameOffsetA, b3Generic6DofConstraint.getFrameOffsetB, b3Generic6DofConstraint.calculateAngleInfo. - */ - const b3Transform& getCalculatedTransformA() const - { - return m_calculatedTransformA; - } - - //! Gets the global transform of the offset for body B - /*! - \sa b3Generic6DofConstraint.getFrameOffsetA, b3Generic6DofConstraint.getFrameOffsetB, b3Generic6DofConstraint.calculateAngleInfo. - */ - const b3Transform& getCalculatedTransformB() const - { - return m_calculatedTransformB; - } - - const b3Transform& getFrameOffsetA() const - { - return m_frameInA; - } - - const b3Transform& getFrameOffsetB() const - { - return m_frameInB; - } - - b3Transform& getFrameOffsetA() - { - return m_frameInA; - } - - b3Transform& getFrameOffsetB() - { - return m_frameInB; - } - - virtual void getInfo1(b3ConstraintInfo1 * info, const b3RigidBodyData* bodies); - - void getInfo1NonVirtual(b3ConstraintInfo1 * info, const b3RigidBodyData* bodies); - - virtual void getInfo2(b3ConstraintInfo2 * info, const b3RigidBodyData* bodies); - - void getInfo2NonVirtual(b3ConstraintInfo2 * info, const b3Transform& transA, const b3Transform& transB, const b3Vector3& linVelA, const b3Vector3& linVelB, const b3Vector3& angVelA, const b3Vector3& angVelB, const b3RigidBodyData* bodies); - - void updateRHS(b3Scalar timeStep); - - //! Get the rotation axis in global coordinates - b3Vector3 getAxis(int axis_index) const; - - //! Get the relative Euler angle - /*! - \pre b3Generic6DofConstraint::calculateTransforms() must be called previously. - */ - b3Scalar getAngle(int axis_index) const; - - //! Get the relative position of the constraint pivot - /*! - \pre b3Generic6DofConstraint::calculateTransforms() must be called previously. - */ - b3Scalar getRelativePivotPosition(int axis_index) const; - - void setFrames(const b3Transform& frameA, const b3Transform& frameB, const b3RigidBodyData* bodies); - - //! Test angular limit. - /*! - Calculates angular correction and returns true if limit needs to be corrected. - \pre b3Generic6DofConstraint::calculateTransforms() must be called previously. - */ - bool testAngularLimitMotor(int axis_index); - - void setLinearLowerLimit(const b3Vector3& linearLower) - { - m_linearLimits.m_lowerLimit = linearLower; - } - - void getLinearLowerLimit(b3Vector3 & linearLower) - { - linearLower = m_linearLimits.m_lowerLimit; - } - - void setLinearUpperLimit(const b3Vector3& linearUpper) - { - m_linearLimits.m_upperLimit = linearUpper; - } - - void getLinearUpperLimit(b3Vector3 & linearUpper) - { - linearUpper = m_linearLimits.m_upperLimit; - } - - void setAngularLowerLimit(const b3Vector3& angularLower) - { - for (int i = 0; i < 3; i++) - m_angularLimits[i].m_loLimit = b3NormalizeAngle(angularLower[i]); - } - - void getAngularLowerLimit(b3Vector3 & angularLower) - { - for (int i = 0; i < 3; i++) - angularLower[i] = m_angularLimits[i].m_loLimit; - } - - void setAngularUpperLimit(const b3Vector3& angularUpper) - { - for (int i = 0; i < 3; i++) - m_angularLimits[i].m_hiLimit = b3NormalizeAngle(angularUpper[i]); - } - - void getAngularUpperLimit(b3Vector3 & angularUpper) - { - for (int i = 0; i < 3; i++) - angularUpper[i] = m_angularLimits[i].m_hiLimit; - } - - //! Retrieves the angular limit informacion - b3RotationalLimitMotor* getRotationalLimitMotor(int index) - { - return &m_angularLimits[index]; - } - - //! Retrieves the limit informacion - b3TranslationalLimitMotor* getTranslationalLimitMotor() - { - return &m_linearLimits; - } - - //first 3 are linear, next 3 are angular - void setLimit(int axis, b3Scalar lo, b3Scalar hi) - { - if (axis < 3) - { - m_linearLimits.m_lowerLimit[axis] = lo; - m_linearLimits.m_upperLimit[axis] = hi; - } - else - { - lo = b3NormalizeAngle(lo); - hi = b3NormalizeAngle(hi); - m_angularLimits[axis - 3].m_loLimit = lo; - m_angularLimits[axis - 3].m_hiLimit = hi; - } - } - - //! Test limit - /*! - - free means upper < lower, - - locked means upper == lower - - limited means upper > lower - - limitIndex: first 3 are linear, next 3 are angular - */ - bool isLimited(int limitIndex) - { - if (limitIndex < 3) - { - return m_linearLimits.isLimited(limitIndex); - } - return m_angularLimits[limitIndex - 3].isLimited(); - } - - virtual void calcAnchorPos(const b3RigidBodyData* bodies); // overridable - - int get_limit_motor_info2(b3RotationalLimitMotor * limot, - const b3Transform& transA, const b3Transform& transB, const b3Vector3& linVelA, const b3Vector3& linVelB, const b3Vector3& angVelA, const b3Vector3& angVelB, - b3ConstraintInfo2* info, int row, b3Vector3& ax1, int rotational, int rotAllowed = false); - - // access for UseFrameOffset - bool getUseFrameOffset() { return m_useOffsetForConstraintFrame; } - void setUseFrameOffset(bool frameOffsetOnOff) { m_useOffsetForConstraintFrame = frameOffsetOnOff; } - - ///override the default global value of a parameter (such as ERP or CFM), optionally provide the axis (0..5). - ///If no axis is provided, it uses the default axis for this constraint. - virtual void setParam(int num, b3Scalar value, int axis = -1); - ///return the local value of parameter - virtual b3Scalar getParam(int num, int axis = -1) const; - - void setAxis(const b3Vector3& axis1, const b3Vector3& axis2, const b3RigidBodyData* bodies); -}; - -#endif //B3_GENERIC_6DOF_CONSTRAINT_H diff --git a/engine/inc/bullet/Bullet3Dynamics/ConstraintSolver/b3JacobianEntry.h b/engine/inc/bullet/Bullet3Dynamics/ConstraintSolver/b3JacobianEntry.h deleted file mode 100644 index 13269deb..00000000 --- a/engine/inc/bullet/Bullet3Dynamics/ConstraintSolver/b3JacobianEntry.h +++ /dev/null @@ -1,150 +0,0 @@ -/* -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 B3_JACOBIAN_ENTRY_H -#define B3_JACOBIAN_ENTRY_H - -#include "Bullet3Common/b3Matrix3x3.h" - -//notes: -// Another memory optimization would be to store m_1MinvJt in the remaining 3 w components -// which makes the b3JacobianEntry memory layout 16 bytes -// if you only are interested in angular part, just feed massInvA and massInvB zero - -/// Jacobian entry is an abstraction that allows to describe constraints -/// it can be used in combination with a constraint solver -/// Can be used to relate the effect of an impulse to the constraint error -B3_ATTRIBUTE_ALIGNED16(class) -b3JacobianEntry -{ -public: - b3JacobianEntry(){}; - //constraint between two different rigidbodies - b3JacobianEntry( - const b3Matrix3x3& world2A, - const b3Matrix3x3& world2B, - const b3Vector3& rel_pos1, const b3Vector3& rel_pos2, - const b3Vector3& jointAxis, - const b3Vector3& inertiaInvA, - const b3Scalar massInvA, - const b3Vector3& inertiaInvB, - const b3Scalar massInvB) - : m_linearJointAxis(jointAxis) - { - m_aJ = world2A * (rel_pos1.cross(m_linearJointAxis)); - m_bJ = world2B * (rel_pos2.cross(-m_linearJointAxis)); - m_0MinvJt = inertiaInvA * m_aJ; - m_1MinvJt = inertiaInvB * m_bJ; - m_Adiag = massInvA + m_0MinvJt.dot(m_aJ) + massInvB + m_1MinvJt.dot(m_bJ); - - b3Assert(m_Adiag > b3Scalar(0.0)); - } - - //angular constraint between two different rigidbodies - b3JacobianEntry(const b3Vector3& jointAxis, - const b3Matrix3x3& world2A, - const b3Matrix3x3& world2B, - const b3Vector3& inertiaInvA, - const b3Vector3& inertiaInvB) - : m_linearJointAxis(b3MakeVector3(b3Scalar(0.), b3Scalar(0.), b3Scalar(0.))) - { - m_aJ = world2A * jointAxis; - m_bJ = world2B * -jointAxis; - m_0MinvJt = inertiaInvA * m_aJ; - m_1MinvJt = inertiaInvB * m_bJ; - m_Adiag = m_0MinvJt.dot(m_aJ) + m_1MinvJt.dot(m_bJ); - - b3Assert(m_Adiag > b3Scalar(0.0)); - } - - //angular constraint between two different rigidbodies - b3JacobianEntry(const b3Vector3& axisInA, - const b3Vector3& axisInB, - const b3Vector3& inertiaInvA, - const b3Vector3& inertiaInvB) - : m_linearJointAxis(b3MakeVector3(b3Scalar(0.), b3Scalar(0.), b3Scalar(0.))), m_aJ(axisInA), m_bJ(-axisInB) - { - m_0MinvJt = inertiaInvA * m_aJ; - m_1MinvJt = inertiaInvB * m_bJ; - m_Adiag = m_0MinvJt.dot(m_aJ) + m_1MinvJt.dot(m_bJ); - - b3Assert(m_Adiag > b3Scalar(0.0)); - } - - //constraint on one rigidbody - b3JacobianEntry( - const b3Matrix3x3& world2A, - const b3Vector3& rel_pos1, const b3Vector3& rel_pos2, - const b3Vector3& jointAxis, - const b3Vector3& inertiaInvA, - const b3Scalar massInvA) - : m_linearJointAxis(jointAxis) - { - m_aJ = world2A * (rel_pos1.cross(jointAxis)); - m_bJ = world2A * (rel_pos2.cross(-jointAxis)); - m_0MinvJt = inertiaInvA * m_aJ; - m_1MinvJt = b3MakeVector3(b3Scalar(0.), b3Scalar(0.), b3Scalar(0.)); - m_Adiag = massInvA + m_0MinvJt.dot(m_aJ); - - b3Assert(m_Adiag > b3Scalar(0.0)); - } - - b3Scalar getDiagonal() const { return m_Adiag; } - - // for two constraints on the same rigidbody (for example vehicle friction) - b3Scalar getNonDiagonal(const b3JacobianEntry& jacB, const b3Scalar massInvA) const - { - const b3JacobianEntry& jacA = *this; - b3Scalar lin = massInvA * jacA.m_linearJointAxis.dot(jacB.m_linearJointAxis); - b3Scalar ang = jacA.m_0MinvJt.dot(jacB.m_aJ); - return lin + ang; - } - - // for two constraints on sharing two same rigidbodies (for example two contact points between two rigidbodies) - b3Scalar getNonDiagonal(const b3JacobianEntry& jacB, const b3Scalar massInvA, const b3Scalar massInvB) const - { - const b3JacobianEntry& jacA = *this; - b3Vector3 lin = jacA.m_linearJointAxis * jacB.m_linearJointAxis; - b3Vector3 ang0 = jacA.m_0MinvJt * jacB.m_aJ; - b3Vector3 ang1 = jacA.m_1MinvJt * jacB.m_bJ; - b3Vector3 lin0 = massInvA * lin; - b3Vector3 lin1 = massInvB * lin; - b3Vector3 sum = ang0 + ang1 + lin0 + lin1; - return sum[0] + sum[1] + sum[2]; - } - - b3Scalar getRelativeVelocity(const b3Vector3& linvelA, const b3Vector3& angvelA, const b3Vector3& linvelB, const b3Vector3& angvelB) - { - b3Vector3 linrel = linvelA - linvelB; - b3Vector3 angvela = angvelA * m_aJ; - b3Vector3 angvelb = angvelB * m_bJ; - linrel *= m_linearJointAxis; - angvela += angvelb; - angvela += linrel; - b3Scalar rel_vel2 = angvela[0] + angvela[1] + angvela[2]; - return rel_vel2 + B3_EPSILON; - } - //private: - - b3Vector3 m_linearJointAxis; - b3Vector3 m_aJ; - b3Vector3 m_bJ; - b3Vector3 m_0MinvJt; - b3Vector3 m_1MinvJt; - //Optimization: can be stored in the w/last component of one of the vectors - b3Scalar m_Adiag; -}; - -#endif //B3_JACOBIAN_ENTRY_H diff --git a/engine/inc/bullet/Bullet3Dynamics/ConstraintSolver/b3PgsJacobiSolver.h b/engine/inc/bullet/Bullet3Dynamics/ConstraintSolver/b3PgsJacobiSolver.h deleted file mode 100644 index 5b616541..00000000 --- a/engine/inc/bullet/Bullet3Dynamics/ConstraintSolver/b3PgsJacobiSolver.h +++ /dev/null @@ -1,133 +0,0 @@ -#ifndef B3_PGS_JACOBI_SOLVER -#define B3_PGS_JACOBI_SOLVER - -struct b3Contact4; -struct b3ContactPoint; - -class b3Dispatcher; - -#include "b3TypedConstraint.h" -#include "b3ContactSolverInfo.h" -#include "b3SolverBody.h" -#include "b3SolverConstraint.h" - -struct b3RigidBodyData; -struct b3InertiaData; - -class b3PgsJacobiSolver -{ -protected: - b3AlignedObjectArray m_tmpSolverBodyPool; - b3ConstraintArray m_tmpSolverContactConstraintPool; - b3ConstraintArray m_tmpSolverNonContactConstraintPool; - b3ConstraintArray m_tmpSolverContactFrictionConstraintPool; - b3ConstraintArray m_tmpSolverContactRollingFrictionConstraintPool; - - b3AlignedObjectArray m_orderTmpConstraintPool; - b3AlignedObjectArray m_orderNonContactConstraintPool; - b3AlignedObjectArray m_orderFrictionConstraintPool; - b3AlignedObjectArray m_tmpConstraintSizesPool; - - b3AlignedObjectArray m_bodyCount; - b3AlignedObjectArray m_bodyCountCheck; - - b3AlignedObjectArray m_deltaLinearVelocities; - b3AlignedObjectArray m_deltaAngularVelocities; - - bool m_usePgs; - void averageVelocities(); - - int m_maxOverrideNumSolverIterations; - - int m_numSplitImpulseRecoveries; - - b3Scalar getContactProcessingThreshold(b3Contact4* contact) - { - return 0.02f; - } - void setupFrictionConstraint(b3RigidBodyData* bodies, b3InertiaData* inertias, b3SolverConstraint& solverConstraint, const b3Vector3& normalAxis, int solverBodyIdA, int solverBodyIdB, - b3ContactPoint& cp, const b3Vector3& rel_pos1, const b3Vector3& rel_pos2, - b3RigidBodyData* colObj0, b3RigidBodyData* colObj1, b3Scalar relaxation, - b3Scalar desiredVelocity = 0., b3Scalar cfmSlip = 0.); - - void setupRollingFrictionConstraint(b3RigidBodyData* bodies, b3InertiaData* inertias, b3SolverConstraint& solverConstraint, const b3Vector3& normalAxis, int solverBodyIdA, int solverBodyIdB, - b3ContactPoint& cp, const b3Vector3& rel_pos1, const b3Vector3& rel_pos2, - b3RigidBodyData* colObj0, b3RigidBodyData* colObj1, b3Scalar relaxation, - b3Scalar desiredVelocity = 0., b3Scalar cfmSlip = 0.); - - b3SolverConstraint& addFrictionConstraint(b3RigidBodyData* bodies, b3InertiaData* inertias, const b3Vector3& normalAxis, int solverBodyIdA, int solverBodyIdB, int frictionIndex, b3ContactPoint& cp, const b3Vector3& rel_pos1, const b3Vector3& rel_pos2, b3RigidBodyData* colObj0, b3RigidBodyData* colObj1, b3Scalar relaxation, b3Scalar desiredVelocity = 0., b3Scalar cfmSlip = 0.); - b3SolverConstraint& addRollingFrictionConstraint(b3RigidBodyData* bodies, b3InertiaData* inertias, const b3Vector3& normalAxis, int solverBodyIdA, int solverBodyIdB, int frictionIndex, b3ContactPoint& cp, const b3Vector3& rel_pos1, const b3Vector3& rel_pos2, b3RigidBodyData* colObj0, b3RigidBodyData* colObj1, b3Scalar relaxation, b3Scalar desiredVelocity = 0, b3Scalar cfmSlip = 0.f); - - void setupContactConstraint(b3RigidBodyData* bodies, b3InertiaData* inertias, - b3SolverConstraint& solverConstraint, int solverBodyIdA, int solverBodyIdB, b3ContactPoint& cp, - const b3ContactSolverInfo& infoGlobal, b3Vector3& vel, b3Scalar& rel_vel, b3Scalar& relaxation, - b3Vector3& rel_pos1, b3Vector3& rel_pos2); - - void setFrictionConstraintImpulse(b3RigidBodyData* bodies, b3InertiaData* inertias, b3SolverConstraint& solverConstraint, int solverBodyIdA, int solverBodyIdB, - b3ContactPoint& cp, const b3ContactSolverInfo& infoGlobal); - - ///m_btSeed2 is used for re-arranging the constraint rows. improves convergence/quality of friction - unsigned long m_btSeed2; - - b3Scalar restitutionCurve(b3Scalar rel_vel, b3Scalar restitution); - - void convertContact(b3RigidBodyData* bodies, b3InertiaData* inertias, b3Contact4* manifold, const b3ContactSolverInfo& infoGlobal); - - void resolveSplitPenetrationSIMD( - b3SolverBody& bodyA, b3SolverBody& bodyB, - const b3SolverConstraint& contactConstraint); - - void resolveSplitPenetrationImpulseCacheFriendly( - b3SolverBody& bodyA, b3SolverBody& bodyB, - const b3SolverConstraint& contactConstraint); - - //internal method - int getOrInitSolverBody(int bodyIndex, b3RigidBodyData* bodies, b3InertiaData* inertias); - void initSolverBody(int bodyIndex, b3SolverBody* solverBody, b3RigidBodyData* collisionObject); - - void resolveSingleConstraintRowGeneric(b3SolverBody& bodyA, b3SolverBody& bodyB, const b3SolverConstraint& contactConstraint); - - void resolveSingleConstraintRowGenericSIMD(b3SolverBody& bodyA, b3SolverBody& bodyB, const b3SolverConstraint& contactConstraint); - - void resolveSingleConstraintRowLowerLimit(b3SolverBody& bodyA, b3SolverBody& bodyB, const b3SolverConstraint& contactConstraint); - - void resolveSingleConstraintRowLowerLimitSIMD(b3SolverBody& bodyA, b3SolverBody& bodyB, const b3SolverConstraint& contactConstraint); - -protected: - virtual b3Scalar solveGroupCacheFriendlySetup(b3RigidBodyData* bodies, b3InertiaData* inertias, int numBodies, b3Contact4* manifoldPtr, int numManifolds, b3TypedConstraint** constraints, int numConstraints, const b3ContactSolverInfo& infoGlobal); - - virtual b3Scalar solveGroupCacheFriendlyIterations(b3TypedConstraint** constraints, int numConstraints, const b3ContactSolverInfo& infoGlobal); - virtual void solveGroupCacheFriendlySplitImpulseIterations(b3TypedConstraint** constraints, int numConstraints, const b3ContactSolverInfo& infoGlobal); - b3Scalar solveSingleIteration(int iteration, b3TypedConstraint** constraints, int numConstraints, const b3ContactSolverInfo& infoGlobal); - - virtual b3Scalar solveGroupCacheFriendlyFinish(b3RigidBodyData* bodies, b3InertiaData* inertias, int numBodies, const b3ContactSolverInfo& infoGlobal); - -public: - B3_DECLARE_ALIGNED_ALLOCATOR(); - - b3PgsJacobiSolver(bool usePgs); - virtual ~b3PgsJacobiSolver(); - - // void solveContacts(int numBodies, b3RigidBodyData* bodies, b3InertiaData* inertias, int numContacts, b3Contact4* contacts); - void solveContacts(int numBodies, b3RigidBodyData* bodies, b3InertiaData* inertias, int numContacts, b3Contact4* contacts, int numConstraints, b3TypedConstraint** constraints); - - b3Scalar solveGroup(b3RigidBodyData* bodies, b3InertiaData* inertias, int numBodies, b3Contact4* manifoldPtr, int numManifolds, b3TypedConstraint** constraints, int numConstraints, const b3ContactSolverInfo& infoGlobal); - - ///clear internal cached data and reset random seed - virtual void reset(); - - unsigned long b3Rand2(); - - int b3RandInt2(int n); - - void setRandSeed(unsigned long seed) - { - m_btSeed2 = seed; - } - unsigned long getRandSeed() const - { - return m_btSeed2; - } -}; - -#endif //B3_PGS_JACOBI_SOLVER diff --git a/engine/inc/bullet/Bullet3Dynamics/ConstraintSolver/b3Point2PointConstraint.h b/engine/inc/bullet/Bullet3Dynamics/ConstraintSolver/b3Point2PointConstraint.h deleted file mode 100644 index 14762a3e..00000000 --- a/engine/inc/bullet/Bullet3Dynamics/ConstraintSolver/b3Point2PointConstraint.h +++ /dev/null @@ -1,153 +0,0 @@ -/* -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 B3_POINT2POINTCONSTRAINT_H -#define B3_POINT2POINTCONSTRAINT_H - -#include "Bullet3Common/b3Vector3.h" -//#include "b3JacobianEntry.h" -#include "b3TypedConstraint.h" - -class b3RigidBody; - -#ifdef B3_USE_DOUBLE_PRECISION -#define b3Point2PointConstraintData b3Point2PointConstraintDoubleData -#define b3Point2PointConstraintDataName "b3Point2PointConstraintDoubleData" -#else -#define b3Point2PointConstraintData b3Point2PointConstraintFloatData -#define b3Point2PointConstraintDataName "b3Point2PointConstraintFloatData" -#endif //B3_USE_DOUBLE_PRECISION - -struct b3ConstraintSetting -{ - b3ConstraintSetting() : m_tau(b3Scalar(0.3)), - m_damping(b3Scalar(1.)), - m_impulseClamp(b3Scalar(0.)) - { - } - b3Scalar m_tau; - b3Scalar m_damping; - b3Scalar m_impulseClamp; -}; - -enum b3Point2PointFlags -{ - B3_P2P_FLAGS_ERP = 1, - B3_P2P_FLAGS_CFM = 2 -}; - -/// point to point constraint between two rigidbodies each with a pivotpoint that descibes the 'ballsocket' location in local space -B3_ATTRIBUTE_ALIGNED16(class) -b3Point2PointConstraint : public b3TypedConstraint -{ -#ifdef IN_PARALLELL_SOLVER -public: -#endif - - b3Vector3 m_pivotInA; - b3Vector3 m_pivotInB; - - int m_flags; - b3Scalar m_erp; - b3Scalar m_cfm; - -public: - B3_DECLARE_ALIGNED_ALLOCATOR(); - - b3ConstraintSetting m_setting; - - b3Point2PointConstraint(int rbA, int rbB, const b3Vector3& pivotInA, const b3Vector3& pivotInB); - - //b3Point2PointConstraint(int rbA,const b3Vector3& pivotInA); - - virtual void getInfo1(b3ConstraintInfo1 * info, const b3RigidBodyData* bodies); - - void getInfo1NonVirtual(b3ConstraintInfo1 * info, const b3RigidBodyData* bodies); - - virtual void getInfo2(b3ConstraintInfo2 * info, const b3RigidBodyData* bodies); - - void getInfo2NonVirtual(b3ConstraintInfo2 * info, const b3Transform& body0_trans, const b3Transform& body1_trans); - - void updateRHS(b3Scalar timeStep); - - void setPivotA(const b3Vector3& pivotA) - { - m_pivotInA = pivotA; - } - - void setPivotB(const b3Vector3& pivotB) - { - m_pivotInB = pivotB; - } - - const b3Vector3& getPivotInA() const - { - return m_pivotInA; - } - - const b3Vector3& getPivotInB() const - { - return m_pivotInB; - } - - ///override the default global value of a parameter (such as ERP or CFM), optionally provide the axis (0..5). - ///If no axis is provided, it uses the default axis for this constraint. - virtual void setParam(int num, b3Scalar value, int axis = -1); - ///return the local value of parameter - virtual b3Scalar getParam(int num, int axis = -1) const; - - // virtual int calculateSerializeBufferSize() const; - - ///fills the dataBuffer and returns the struct name (and 0 on failure) - // virtual const char* serialize(void* dataBuffer, b3Serializer* serializer) const; -}; - -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct b3Point2PointConstraintFloatData -{ - b3TypedConstraintData m_typeConstraintData; - b3Vector3FloatData m_pivotInA; - b3Vector3FloatData m_pivotInB; -}; - -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct b3Point2PointConstraintDoubleData -{ - b3TypedConstraintData m_typeConstraintData; - b3Vector3DoubleData m_pivotInA; - b3Vector3DoubleData m_pivotInB; -}; - -/* -B3_FORCE_INLINE int b3Point2PointConstraint::calculateSerializeBufferSize() const -{ - return sizeof(b3Point2PointConstraintData); - -} - - ///fills the dataBuffer and returns the struct name (and 0 on failure) -B3_FORCE_INLINE const char* b3Point2PointConstraint::serialize(void* dataBuffer, b3Serializer* serializer) const -{ - b3Point2PointConstraintData* p2pData = (b3Point2PointConstraintData*)dataBuffer; - - b3TypedConstraint::serialize(&p2pData->m_typeConstraintData,serializer); - m_pivotInA.serialize(p2pData->m_pivotInA); - m_pivotInB.serialize(p2pData->m_pivotInB); - - return b3Point2PointConstraintDataName; -} -*/ - -#endif //B3_POINT2POINTCONSTRAINT_H diff --git a/engine/inc/bullet/Bullet3Dynamics/ConstraintSolver/b3SolverBody.h b/engine/inc/bullet/Bullet3Dynamics/ConstraintSolver/b3SolverBody.h deleted file mode 100644 index 196d0e57..00000000 --- a/engine/inc/bullet/Bullet3Dynamics/ConstraintSolver/b3SolverBody.h +++ /dev/null @@ -1,281 +0,0 @@ -/* -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 B3_SOLVER_BODY_H -#define B3_SOLVER_BODY_H - -#include "Bullet3Common/b3Vector3.h" -#include "Bullet3Common/b3Matrix3x3.h" - -#include "Bullet3Common/b3AlignedAllocator.h" -#include "Bullet3Common/b3TransformUtil.h" - -///Until we get other contributions, only use SIMD on Windows, when using Visual Studio 2008 or later, and not double precision -#ifdef B3_USE_SSE -#define USE_SIMD 1 -#endif // - -#ifdef USE_SIMD - -struct b3SimdScalar -{ - B3_FORCE_INLINE b3SimdScalar() - { - } - - B3_FORCE_INLINE b3SimdScalar(float fl) - : m_vec128(_mm_set1_ps(fl)) - { - } - - B3_FORCE_INLINE b3SimdScalar(__m128 v128) - : m_vec128(v128) - { - } - union { - __m128 m_vec128; - float m_floats[4]; - float x, y, z, w; - int m_ints[4]; - b3Scalar m_unusedPadding; - }; - B3_FORCE_INLINE __m128 get128() - { - return m_vec128; - } - - B3_FORCE_INLINE const __m128 get128() const - { - return m_vec128; - } - - B3_FORCE_INLINE void set128(__m128 v128) - { - m_vec128 = v128; - } - - B3_FORCE_INLINE operator __m128() - { - return m_vec128; - } - B3_FORCE_INLINE operator const __m128() const - { - return m_vec128; - } - - B3_FORCE_INLINE operator float() const - { - return m_floats[0]; - } -}; - -///@brief Return the elementwise product of two b3SimdScalar -B3_FORCE_INLINE b3SimdScalar -operator*(const b3SimdScalar& v1, const b3SimdScalar& v2) -{ - return b3SimdScalar(_mm_mul_ps(v1.get128(), v2.get128())); -} - -///@brief Return the elementwise product of two b3SimdScalar -B3_FORCE_INLINE b3SimdScalar -operator+(const b3SimdScalar& v1, const b3SimdScalar& v2) -{ - return b3SimdScalar(_mm_add_ps(v1.get128(), v2.get128())); -} - -#else -#define b3SimdScalar b3Scalar -#endif - -///The b3SolverBody is an internal datastructure for the constraint solver. Only necessary data is packed to increase cache coherence/performance. -B3_ATTRIBUTE_ALIGNED16(struct) -b3SolverBody -{ - B3_DECLARE_ALIGNED_ALLOCATOR(); - b3Transform m_worldTransform; - b3Vector3 m_deltaLinearVelocity; - b3Vector3 m_deltaAngularVelocity; - b3Vector3 m_angularFactor; - b3Vector3 m_linearFactor; - b3Vector3 m_invMass; - b3Vector3 m_pushVelocity; - b3Vector3 m_turnVelocity; - b3Vector3 m_linearVelocity; - b3Vector3 m_angularVelocity; - - union { - void* m_originalBody; - int m_originalBodyIndex; - }; - - int padding[3]; - - void setWorldTransform(const b3Transform& worldTransform) - { - m_worldTransform = worldTransform; - } - - const b3Transform& getWorldTransform() const - { - return m_worldTransform; - } - - B3_FORCE_INLINE void getVelocityInLocalPointObsolete(const b3Vector3& rel_pos, b3Vector3& velocity) const - { - if (m_originalBody) - velocity = m_linearVelocity + m_deltaLinearVelocity + (m_angularVelocity + m_deltaAngularVelocity).cross(rel_pos); - else - velocity.setValue(0, 0, 0); - } - - B3_FORCE_INLINE void getAngularVelocity(b3Vector3 & angVel) const - { - if (m_originalBody) - angVel = m_angularVelocity + m_deltaAngularVelocity; - else - angVel.setValue(0, 0, 0); - } - - //Optimization for the iterative solver: avoid calculating constant terms involving inertia, normal, relative position - B3_FORCE_INLINE void applyImpulse(const b3Vector3& linearComponent, const b3Vector3& angularComponent, const b3Scalar impulseMagnitude) - { - if (m_originalBody) - { - m_deltaLinearVelocity += linearComponent * impulseMagnitude * m_linearFactor; - m_deltaAngularVelocity += angularComponent * (impulseMagnitude * m_angularFactor); - } - } - - B3_FORCE_INLINE void internalApplyPushImpulse(const b3Vector3& linearComponent, const b3Vector3& angularComponent, b3Scalar impulseMagnitude) - { - if (m_originalBody) - { - m_pushVelocity += linearComponent * impulseMagnitude * m_linearFactor; - m_turnVelocity += angularComponent * (impulseMagnitude * m_angularFactor); - } - } - - const b3Vector3& getDeltaLinearVelocity() const - { - return m_deltaLinearVelocity; - } - - const b3Vector3& getDeltaAngularVelocity() const - { - return m_deltaAngularVelocity; - } - - const b3Vector3& getPushVelocity() const - { - return m_pushVelocity; - } - - const b3Vector3& getTurnVelocity() const - { - return m_turnVelocity; - } - - //////////////////////////////////////////////// - ///some internal methods, don't use them - - b3Vector3& internalGetDeltaLinearVelocity() - { - return m_deltaLinearVelocity; - } - - b3Vector3& internalGetDeltaAngularVelocity() - { - return m_deltaAngularVelocity; - } - - const b3Vector3& internalGetAngularFactor() const - { - return m_angularFactor; - } - - const b3Vector3& internalGetInvMass() const - { - return m_invMass; - } - - void internalSetInvMass(const b3Vector3& invMass) - { - m_invMass = invMass; - } - - b3Vector3& internalGetPushVelocity() - { - return m_pushVelocity; - } - - b3Vector3& internalGetTurnVelocity() - { - return m_turnVelocity; - } - - B3_FORCE_INLINE void internalGetVelocityInLocalPointObsolete(const b3Vector3& rel_pos, b3Vector3& velocity) const - { - velocity = m_linearVelocity + m_deltaLinearVelocity + (m_angularVelocity + m_deltaAngularVelocity).cross(rel_pos); - } - - B3_FORCE_INLINE void internalGetAngularVelocity(b3Vector3 & angVel) const - { - angVel = m_angularVelocity + m_deltaAngularVelocity; - } - - //Optimization for the iterative solver: avoid calculating constant terms involving inertia, normal, relative position - B3_FORCE_INLINE void internalApplyImpulse(const b3Vector3& linearComponent, const b3Vector3& angularComponent, const b3Scalar impulseMagnitude) - { - //if (m_originalBody) - { - m_deltaLinearVelocity += linearComponent * impulseMagnitude * m_linearFactor; - m_deltaAngularVelocity += angularComponent * (impulseMagnitude * m_angularFactor); - } - } - - void writebackVelocity() - { - //if (m_originalBody>=0) - { - m_linearVelocity += m_deltaLinearVelocity; - m_angularVelocity += m_deltaAngularVelocity; - - //m_originalBody->setCompanionId(-1); - } - } - - void writebackVelocityAndTransform(b3Scalar timeStep, b3Scalar splitImpulseTurnErp) - { - (void)timeStep; - if (m_originalBody) - { - m_linearVelocity += m_deltaLinearVelocity; - m_angularVelocity += m_deltaAngularVelocity; - - //correct the position/orientation based on push/turn recovery - b3Transform newTransform; - if (m_pushVelocity[0] != 0.f || m_pushVelocity[1] != 0 || m_pushVelocity[2] != 0 || m_turnVelocity[0] != 0.f || m_turnVelocity[1] != 0 || m_turnVelocity[2] != 0) - { - // b3Quaternion orn = m_worldTransform.getRotation(); - b3TransformUtil::integrateTransform(m_worldTransform, m_pushVelocity, m_turnVelocity * splitImpulseTurnErp, timeStep, newTransform); - m_worldTransform = newTransform; - } - //m_worldTransform.setRotation(orn); - //m_originalBody->setCompanionId(-1); - } - } -}; - -#endif //B3_SOLVER_BODY_H diff --git a/engine/inc/bullet/Bullet3Dynamics/ConstraintSolver/b3SolverConstraint.h b/engine/inc/bullet/Bullet3Dynamics/ConstraintSolver/b3SolverConstraint.h deleted file mode 100644 index 4927ae42..00000000 --- a/engine/inc/bullet/Bullet3Dynamics/ConstraintSolver/b3SolverConstraint.h +++ /dev/null @@ -1,73 +0,0 @@ -/* -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 B3_SOLVER_CONSTRAINT_H -#define B3_SOLVER_CONSTRAINT_H - -#include "Bullet3Common/b3Vector3.h" -#include "Bullet3Common/b3Matrix3x3.h" -//#include "b3JacobianEntry.h" -#include "Bullet3Common/b3AlignedObjectArray.h" - -//#define NO_FRICTION_TANGENTIALS 1 -#include "b3SolverBody.h" - -///1D constraint along a normal axis between bodyA and bodyB. It can be combined to solve contact and friction constraints. -B3_ATTRIBUTE_ALIGNED16(struct) -b3SolverConstraint -{ - B3_DECLARE_ALIGNED_ALLOCATOR(); - - b3Vector3 m_relpos1CrossNormal; - b3Vector3 m_contactNormal; - - b3Vector3 m_relpos2CrossNormal; - //b3Vector3 m_contactNormal2;//usually m_contactNormal2 == -m_contactNormal - - b3Vector3 m_angularComponentA; - b3Vector3 m_angularComponentB; - - mutable b3SimdScalar m_appliedPushImpulse; - mutable b3SimdScalar m_appliedImpulse; - int m_padding1; - int m_padding2; - b3Scalar m_friction; - b3Scalar m_jacDiagABInv; - b3Scalar m_rhs; - b3Scalar m_cfm; - - b3Scalar m_lowerLimit; - b3Scalar m_upperLimit; - b3Scalar m_rhsPenetration; - union { - void* m_originalContactPoint; - b3Scalar m_unusedPadding4; - }; - - int m_overrideNumSolverIterations; - int m_frictionIndex; - int m_solverBodyIdA; - int m_solverBodyIdB; - - enum b3SolverConstraintType - { - B3_SOLVER_CONTACT_1D = 0, - B3_SOLVER_FRICTION_1D - }; -}; - -typedef b3AlignedObjectArray b3ConstraintArray; - -#endif //B3_SOLVER_CONSTRAINT_H diff --git a/engine/inc/bullet/Bullet3Dynamics/ConstraintSolver/b3TypedConstraint.h b/engine/inc/bullet/Bullet3Dynamics/ConstraintSolver/b3TypedConstraint.h deleted file mode 100644 index f74aec4d..00000000 --- a/engine/inc/bullet/Bullet3Dynamics/ConstraintSolver/b3TypedConstraint.h +++ /dev/null @@ -1,469 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2010 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 B3_TYPED_CONSTRAINT_H -#define B3_TYPED_CONSTRAINT_H - -#include "Bullet3Common/b3Scalar.h" -#include "b3SolverConstraint.h" - -class b3Serializer; - -//Don't change any of the existing enum values, so add enum types at the end for serialization compatibility -enum b3TypedConstraintType -{ - B3_POINT2POINT_CONSTRAINT_TYPE = 3, - B3_HINGE_CONSTRAINT_TYPE, - B3_CONETWIST_CONSTRAINT_TYPE, - B3_D6_CONSTRAINT_TYPE, - B3_SLIDER_CONSTRAINT_TYPE, - B3_CONTACT_CONSTRAINT_TYPE, - B3_D6_SPRING_CONSTRAINT_TYPE, - B3_GEAR_CONSTRAINT_TYPE, - B3_FIXED_CONSTRAINT_TYPE, - B3_MAX_CONSTRAINT_TYPE -}; - -enum b3ConstraintParams -{ - B3_CONSTRAINT_ERP = 1, - B3_CONSTRAINT_STOP_ERP, - B3_CONSTRAINT_CFM, - B3_CONSTRAINT_STOP_CFM -}; - -#if 1 -#define b3AssertConstrParams(_par) b3Assert(_par) -#else -#define b3AssertConstrParams(_par) -#endif - -B3_ATTRIBUTE_ALIGNED16(struct) -b3JointFeedback -{ - b3Vector3 m_appliedForceBodyA; - b3Vector3 m_appliedTorqueBodyA; - b3Vector3 m_appliedForceBodyB; - b3Vector3 m_appliedTorqueBodyB; -}; - -struct b3RigidBodyData; - -///TypedConstraint is the baseclass for Bullet constraints and vehicles -B3_ATTRIBUTE_ALIGNED16(class) -b3TypedConstraint : public b3TypedObject -{ - int m_userConstraintType; - - union { - int m_userConstraintId; - void* m_userConstraintPtr; - }; - - b3Scalar m_breakingImpulseThreshold; - bool m_isEnabled; - bool m_needsFeedback; - int m_overrideNumSolverIterations; - - b3TypedConstraint& operator=(b3TypedConstraint& other) - { - b3Assert(0); - (void)other; - return *this; - } - -protected: - int m_rbA; - int m_rbB; - b3Scalar m_appliedImpulse; - b3Scalar m_dbgDrawSize; - b3JointFeedback* m_jointFeedback; - - ///internal method used by the constraint solver, don't use them directly - b3Scalar getMotorFactor(b3Scalar pos, b3Scalar lowLim, b3Scalar uppLim, b3Scalar vel, b3Scalar timeFact); - -public: - B3_DECLARE_ALIGNED_ALLOCATOR(); - - virtual ~b3TypedConstraint(){}; - b3TypedConstraint(b3TypedConstraintType type, int bodyA, int bodyB); - - struct b3ConstraintInfo1 - { - int m_numConstraintRows, nub; - }; - - struct b3ConstraintInfo2 - { - // integrator parameters: frames per second (1/stepsize), default error - // reduction parameter (0..1). - b3Scalar fps, erp; - - // for the first and second body, pointers to two (linear and angular) - // n*3 jacobian sub matrices, stored by rows. these matrices will have - // been initialized to 0 on entry. if the second body is zero then the - // J2xx pointers may be 0. - b3Scalar *m_J1linearAxis, *m_J1angularAxis, *m_J2linearAxis, *m_J2angularAxis; - - // elements to jump from one row to the next in J's - int rowskip; - - // right hand sides of the equation J*v = c + cfm * lambda. cfm is the - // "constraint force mixing" vector. c is set to zero on entry, cfm is - // set to a constant value (typically very small or zero) value on entry. - b3Scalar *m_constraintError, *cfm; - - // lo and hi limits for variables (set to -/+ infinity on entry). - b3Scalar *m_lowerLimit, *m_upperLimit; - - // findex vector for variables. see the LCP solver interface for a - // description of what this does. this is set to -1 on entry. - // note that the returned indexes are relative to the first index of - // the constraint. - int* findex; - // number of solver iterations - int m_numIterations; - - //damping of the velocity - b3Scalar m_damping; - }; - - int getOverrideNumSolverIterations() const - { - return m_overrideNumSolverIterations; - } - - ///override the number of constraint solver iterations used to solve this constraint - ///-1 will use the default number of iterations, as specified in SolverInfo.m_numIterations - void setOverrideNumSolverIterations(int overideNumIterations) - { - m_overrideNumSolverIterations = overideNumIterations; - } - - ///internal method used by the constraint solver, don't use them directly - virtual void setupSolverConstraint(b3ConstraintArray & ca, int solverBodyA, int solverBodyB, b3Scalar timeStep) - { - (void)ca; - (void)solverBodyA; - (void)solverBodyB; - (void)timeStep; - } - - ///internal method used by the constraint solver, don't use them directly - virtual void getInfo1(b3ConstraintInfo1 * info, const b3RigidBodyData* bodies) = 0; - - ///internal method used by the constraint solver, don't use them directly - virtual void getInfo2(b3ConstraintInfo2 * info, const b3RigidBodyData* bodies) = 0; - - ///internal method used by the constraint solver, don't use them directly - void internalSetAppliedImpulse(b3Scalar appliedImpulse) - { - m_appliedImpulse = appliedImpulse; - } - ///internal method used by the constraint solver, don't use them directly - b3Scalar internalGetAppliedImpulse() - { - return m_appliedImpulse; - } - - b3Scalar getBreakingImpulseThreshold() const - { - return m_breakingImpulseThreshold; - } - - void setBreakingImpulseThreshold(b3Scalar threshold) - { - m_breakingImpulseThreshold = threshold; - } - - bool isEnabled() const - { - return m_isEnabled; - } - - void setEnabled(bool enabled) - { - m_isEnabled = enabled; - } - - ///internal method used by the constraint solver, don't use them directly - virtual void solveConstraintObsolete(b3SolverBody& /*bodyA*/, b3SolverBody& /*bodyB*/, b3Scalar /*timeStep*/){}; - - int getRigidBodyA() const - { - return m_rbA; - } - int getRigidBodyB() const - { - return m_rbB; - } - - int getRigidBodyA() - { - return m_rbA; - } - int getRigidBodyB() - { - return m_rbB; - } - - int getUserConstraintType() const - { - return m_userConstraintType; - } - - void setUserConstraintType(int userConstraintType) - { - m_userConstraintType = userConstraintType; - }; - - void setUserConstraintId(int uid) - { - m_userConstraintId = uid; - } - - int getUserConstraintId() const - { - return m_userConstraintId; - } - - void setUserConstraintPtr(void* ptr) - { - m_userConstraintPtr = ptr; - } - - void* getUserConstraintPtr() - { - return m_userConstraintPtr; - } - - void setJointFeedback(b3JointFeedback * jointFeedback) - { - m_jointFeedback = jointFeedback; - } - - const b3JointFeedback* getJointFeedback() const - { - return m_jointFeedback; - } - - b3JointFeedback* getJointFeedback() - { - return m_jointFeedback; - } - - int getUid() const - { - return m_userConstraintId; - } - - bool needsFeedback() const - { - return m_needsFeedback; - } - - ///enableFeedback will allow to read the applied linear and angular impulse - ///use getAppliedImpulse, getAppliedLinearImpulse and getAppliedAngularImpulse to read feedback information - void enableFeedback(bool needsFeedback) - { - m_needsFeedback = needsFeedback; - } - - ///getAppliedImpulse is an estimated total applied impulse. - ///This feedback could be used to determine breaking constraints or playing sounds. - b3Scalar getAppliedImpulse() const - { - b3Assert(m_needsFeedback); - return m_appliedImpulse; - } - - b3TypedConstraintType getConstraintType() const - { - return b3TypedConstraintType(m_objectType); - } - - void setDbgDrawSize(b3Scalar dbgDrawSize) - { - m_dbgDrawSize = dbgDrawSize; - } - b3Scalar getDbgDrawSize() - { - return m_dbgDrawSize; - } - - ///override the default global value of a parameter (such as ERP or CFM), optionally provide the axis (0..5). - ///If no axis is provided, it uses the default axis for this constraint. - virtual void setParam(int num, b3Scalar value, int axis = -1) = 0; - - ///return the local value of parameter - virtual b3Scalar getParam(int num, int axis = -1) const = 0; - - // virtual int calculateSerializeBufferSize() const; - - ///fills the dataBuffer and returns the struct name (and 0 on failure) - //virtual const char* serialize(void* dataBuffer, b3Serializer* serializer) const; -}; - -// returns angle in range [-B3_2_PI, B3_2_PI], closest to one of the limits -// all arguments should be normalized angles (i.e. in range [-B3_PI, B3_PI]) -B3_FORCE_INLINE b3Scalar b3AdjustAngleToLimits(b3Scalar angleInRadians, b3Scalar angleLowerLimitInRadians, b3Scalar angleUpperLimitInRadians) -{ - if (angleLowerLimitInRadians >= angleUpperLimitInRadians) - { - return angleInRadians; - } - else if (angleInRadians < angleLowerLimitInRadians) - { - b3Scalar diffLo = b3Fabs(b3NormalizeAngle(angleLowerLimitInRadians - angleInRadians)); - b3Scalar diffHi = b3Fabs(b3NormalizeAngle(angleUpperLimitInRadians - angleInRadians)); - return (diffLo < diffHi) ? angleInRadians : (angleInRadians + B3_2_PI); - } - else if (angleInRadians > angleUpperLimitInRadians) - { - b3Scalar diffHi = b3Fabs(b3NormalizeAngle(angleInRadians - angleUpperLimitInRadians)); - b3Scalar diffLo = b3Fabs(b3NormalizeAngle(angleInRadians - angleLowerLimitInRadians)); - return (diffLo < diffHi) ? (angleInRadians - B3_2_PI) : angleInRadians; - } - else - { - return angleInRadians; - } -} - -// clang-format off -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct b3TypedConstraintData -{ - int m_bodyA; - int m_bodyB; - char *m_name; - - int m_objectType; - int m_userConstraintType; - int m_userConstraintId; - int m_needsFeedback; - - float m_appliedImpulse; - float m_dbgDrawSize; - - int m_disableCollisionsBetweenLinkedBodies; - int m_overrideNumSolverIterations; - - float m_breakingImpulseThreshold; - int m_isEnabled; - -}; - -// clang-format on - -/*B3_FORCE_INLINE int b3TypedConstraint::calculateSerializeBufferSize() const -{ - return sizeof(b3TypedConstraintData); -} -*/ - -class b3AngularLimit -{ -private: - b3Scalar - m_center, - m_halfRange, - m_softness, - m_biasFactor, - m_relaxationFactor, - m_correction, - m_sign; - - bool - m_solveLimit; - -public: - /// Default constructor initializes limit as inactive, allowing free constraint movement - b3AngularLimit() - : m_center(0.0f), - m_halfRange(-1.0f), - m_softness(0.9f), - m_biasFactor(0.3f), - m_relaxationFactor(1.0f), - m_correction(0.0f), - m_sign(0.0f), - m_solveLimit(false) - { - } - - /// Sets all limit's parameters. - /// When low > high limit becomes inactive. - /// When high - low > 2PI limit is ineffective too becouse no angle can exceed the limit - void set(b3Scalar low, b3Scalar high, b3Scalar _softness = 0.9f, b3Scalar _biasFactor = 0.3f, b3Scalar _relaxationFactor = 1.0f); - - /// Checks conastaint angle against limit. If limit is active and the angle violates the limit - /// correction is calculated. - void test(const b3Scalar angle); - - /// Returns limit's softness - inline b3Scalar getSoftness() const - { - return m_softness; - } - - /// Returns limit's bias factor - inline b3Scalar getBiasFactor() const - { - return m_biasFactor; - } - - /// Returns limit's relaxation factor - inline b3Scalar getRelaxationFactor() const - { - return m_relaxationFactor; - } - - /// Returns correction value evaluated when test() was invoked - inline b3Scalar getCorrection() const - { - return m_correction; - } - - /// Returns sign value evaluated when test() was invoked - inline b3Scalar getSign() const - { - return m_sign; - } - - /// Gives half of the distance between min and max limit angle - inline b3Scalar getHalfRange() const - { - return m_halfRange; - } - - /// Returns true when the last test() invocation recognized limit violation - inline bool isLimit() const - { - return m_solveLimit; - } - - /// Checks given angle against limit. If limit is active and angle doesn't fit it, the angle - /// returned is modified so it equals to the limit closest to given angle. - void fit(b3Scalar& angle) const; - - /// Returns correction value multiplied by sign value - b3Scalar getError() const; - - b3Scalar getLow() const; - - b3Scalar getHigh() const; -}; - -#endif //B3_TYPED_CONSTRAINT_H diff --git a/engine/inc/bullet/Bullet3Dynamics/b3CpuRigidBodyPipeline.h b/engine/inc/bullet/Bullet3Dynamics/b3CpuRigidBodyPipeline.h deleted file mode 100644 index 9c65419f..00000000 --- a/engine/inc/bullet/Bullet3Dynamics/b3CpuRigidBodyPipeline.h +++ /dev/null @@ -1,62 +0,0 @@ -/* -Copyright (c) 2013 Advanced Micro Devices, Inc. - -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 Erwin Coumans - -#ifndef B3_CPU_RIGIDBODY_PIPELINE_H -#define B3_CPU_RIGIDBODY_PIPELINE_H - -#include "Bullet3Common/b3AlignedObjectArray.h" -#include "Bullet3Collision/NarrowPhaseCollision/b3RaycastInfo.h" - -class b3CpuRigidBodyPipeline -{ -protected: - struct b3CpuRigidBodyPipelineInternalData* m_data; - - int allocateCollidable(); - -public: - b3CpuRigidBodyPipeline(class b3CpuNarrowPhase* narrowphase, struct b3DynamicBvhBroadphase* broadphaseDbvt, const struct b3Config& config); - virtual ~b3CpuRigidBodyPipeline(); - - virtual void stepSimulation(float deltaTime); - virtual void integrate(float timeStep); - virtual void updateAabbWorldSpace(); - virtual void computeOverlappingPairs(); - virtual void computeContactPoints(); - virtual void solveContactConstraints(); - - int registerConvexPolyhedron(class b3ConvexUtility* convex); - - int registerPhysicsInstance(float mass, const float* position, const float* orientation, int collisionShapeIndex, int userData); - void writeAllInstancesToGpu(); - void copyConstraintsToHost(); - void setGravity(const float* grav); - void reset(); - - int createPoint2PointConstraint(int bodyA, int bodyB, const float* pivotInA, const float* pivotInB, float breakingThreshold); - int createFixedConstraint(int bodyA, int bodyB, const float* pivotInA, const float* pivotInB, const float* relTargetAB, float breakingThreshold); - void removeConstraintByUid(int uid); - - void addConstraint(class b3TypedConstraint* constraint); - void removeConstraint(b3TypedConstraint* constraint); - - void castRays(const b3AlignedObjectArray& rays, b3AlignedObjectArray& hitResults); - - const struct b3RigidBodyData* getBodyBuffer() const; - - int getNumBodies() const; -}; - -#endif //B3_CPU_RIGIDBODY_PIPELINE_H \ No newline at end of file diff --git a/engine/inc/bullet/Bullet3Dynamics/shared/b3ContactConstraint4.h b/engine/inc/bullet/Bullet3Dynamics/shared/b3ContactConstraint4.h deleted file mode 100644 index cf2eed0e..00000000 --- a/engine/inc/bullet/Bullet3Dynamics/shared/b3ContactConstraint4.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef B3_CONTACT_CONSTRAINT5_H -#define B3_CONTACT_CONSTRAINT5_H - -#include "Bullet3Common/shared/b3Float4.h" - -typedef struct b3ContactConstraint4 b3ContactConstraint4_t; - -struct b3ContactConstraint4 -{ - b3Float4 m_linear; //normal? - b3Float4 m_worldPos[4]; - b3Float4 m_center; // friction - float m_jacCoeffInv[4]; - float m_b[4]; - float m_appliedRambdaDt[4]; - float m_fJacCoeffInv[2]; // friction - float m_fAppliedRambdaDt[2]; // friction - - unsigned int m_bodyA; - unsigned int m_bodyB; - int m_batchIdx; - unsigned int m_paddings; -}; - -//inline void setFrictionCoeff(float value) { m_linear[3] = value; } -inline float b3GetFrictionCoeff(b3ContactConstraint4_t* constraint) -{ - return constraint->m_linear.w; -} - -#endif //B3_CONTACT_CONSTRAINT5_H diff --git a/engine/inc/bullet/Bullet3Dynamics/shared/b3ConvertConstraint4.h b/engine/inc/bullet/Bullet3Dynamics/shared/b3ConvertConstraint4.h deleted file mode 100644 index 3e72f1c3..00000000 --- a/engine/inc/bullet/Bullet3Dynamics/shared/b3ConvertConstraint4.h +++ /dev/null @@ -1,148 +0,0 @@ - - -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3Contact4Data.h" -#include "Bullet3Dynamics/shared/b3ContactConstraint4.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3RigidBodyData.h" - -void b3PlaneSpace1(b3Float4ConstArg n, b3Float4* p, b3Float4* q); -void b3PlaneSpace1(b3Float4ConstArg n, b3Float4* p, b3Float4* q) -{ - if (b3Fabs(n.z) > 0.70710678f) - { - // choose p in y-z plane - float a = n.y * n.y + n.z * n.z; - float k = 1.f / sqrt(a); - p[0].x = 0; - p[0].y = -n.z * k; - p[0].z = n.y * k; - // set q = n x p - q[0].x = a * k; - q[0].y = -n.x * p[0].z; - q[0].z = n.x * p[0].y; - } - else - { - // choose p in x-y plane - float a = n.x * n.x + n.y * n.y; - float k = 1.f / sqrt(a); - p[0].x = -n.y * k; - p[0].y = n.x * k; - p[0].z = 0; - // set q = n x p - q[0].x = -n.z * p[0].y; - q[0].y = n.z * p[0].x; - q[0].z = a * k; - } -} - -void setLinearAndAngular(b3Float4ConstArg n, b3Float4ConstArg r0, b3Float4ConstArg r1, b3Float4* linear, b3Float4* angular0, b3Float4* angular1) -{ - *linear = b3MakeFloat4(n.x, n.y, n.z, 0.f); - *angular0 = b3Cross3(r0, n); - *angular1 = -b3Cross3(r1, n); -} - -float calcRelVel(b3Float4ConstArg l0, b3Float4ConstArg l1, b3Float4ConstArg a0, b3Float4ConstArg a1, b3Float4ConstArg linVel0, - b3Float4ConstArg angVel0, b3Float4ConstArg linVel1, b3Float4ConstArg angVel1) -{ - return b3Dot3F4(l0, linVel0) + b3Dot3F4(a0, angVel0) + b3Dot3F4(l1, linVel1) + b3Dot3F4(a1, angVel1); -} - -float calcJacCoeff(b3Float4ConstArg linear0, b3Float4ConstArg linear1, b3Float4ConstArg angular0, b3Float4ConstArg angular1, - float invMass0, const b3Mat3x3* invInertia0, float invMass1, const b3Mat3x3* invInertia1) -{ - // linear0,1 are normlized - float jmj0 = invMass0; //b3Dot3F4(linear0, linear0)*invMass0; - float jmj1 = b3Dot3F4(mtMul3(angular0, *invInertia0), angular0); - float jmj2 = invMass1; //b3Dot3F4(linear1, linear1)*invMass1; - float jmj3 = b3Dot3F4(mtMul3(angular1, *invInertia1), angular1); - return -1.f / (jmj0 + jmj1 + jmj2 + jmj3); -} - -void setConstraint4(b3Float4ConstArg posA, b3Float4ConstArg linVelA, b3Float4ConstArg angVelA, float invMassA, b3Mat3x3ConstArg invInertiaA, - b3Float4ConstArg posB, b3Float4ConstArg linVelB, b3Float4ConstArg angVelB, float invMassB, b3Mat3x3ConstArg invInertiaB, - __global struct b3Contact4Data* src, float dt, float positionDrift, float positionConstraintCoeff, - b3ContactConstraint4_t* dstC) -{ - dstC->m_bodyA = abs(src->m_bodyAPtrAndSignBit); - dstC->m_bodyB = abs(src->m_bodyBPtrAndSignBit); - - float dtInv = 1.f / dt; - for (int ic = 0; ic < 4; ic++) - { - dstC->m_appliedRambdaDt[ic] = 0.f; - } - dstC->m_fJacCoeffInv[0] = dstC->m_fJacCoeffInv[1] = 0.f; - - dstC->m_linear = src->m_worldNormalOnB; - dstC->m_linear.w = 0.7f; //src->getFrictionCoeff() ); - for (int ic = 0; ic < 4; ic++) - { - b3Float4 r0 = src->m_worldPosB[ic] - posA; - b3Float4 r1 = src->m_worldPosB[ic] - posB; - - if (ic >= src->m_worldNormalOnB.w) //npoints - { - dstC->m_jacCoeffInv[ic] = 0.f; - continue; - } - - float relVelN; - { - b3Float4 linear, angular0, angular1; - setLinearAndAngular(src->m_worldNormalOnB, r0, r1, &linear, &angular0, &angular1); - - dstC->m_jacCoeffInv[ic] = calcJacCoeff(linear, -linear, angular0, angular1, - invMassA, &invInertiaA, invMassB, &invInertiaB); - - relVelN = calcRelVel(linear, -linear, angular0, angular1, - linVelA, angVelA, linVelB, angVelB); - - float e = 0.f; //src->getRestituitionCoeff(); - if (relVelN * relVelN < 0.004f) e = 0.f; - - dstC->m_b[ic] = e * relVelN; - //float penetration = src->m_worldPosB[ic].w; - dstC->m_b[ic] += (src->m_worldPosB[ic].w + positionDrift) * positionConstraintCoeff * dtInv; - dstC->m_appliedRambdaDt[ic] = 0.f; - } - } - - if (src->m_worldNormalOnB.w > 0) //npoints - { // prepare friction - b3Float4 center = b3MakeFloat4(0.f, 0.f, 0.f, 0.f); - for (int i = 0; i < src->m_worldNormalOnB.w; i++) - center += src->m_worldPosB[i]; - center /= (float)src->m_worldNormalOnB.w; - - b3Float4 tangent[2]; - b3PlaneSpace1(src->m_worldNormalOnB, &tangent[0], &tangent[1]); - - b3Float4 r[2]; - r[0] = center - posA; - r[1] = center - posB; - - for (int i = 0; i < 2; i++) - { - b3Float4 linear, angular0, angular1; - setLinearAndAngular(tangent[i], r[0], r[1], &linear, &angular0, &angular1); - - dstC->m_fJacCoeffInv[i] = calcJacCoeff(linear, -linear, angular0, angular1, - invMassA, &invInertiaA, invMassB, &invInertiaB); - dstC->m_fAppliedRambdaDt[i] = 0.f; - } - dstC->m_center = center; - } - - for (int i = 0; i < 4; i++) - { - if (i < src->m_worldNormalOnB.w) - { - dstC->m_worldPos[i] = src->m_worldPosB[i]; - } - else - { - dstC->m_worldPos[i] = b3MakeFloat4(0.f, 0.f, 0.f, 0.f); - } - } -} diff --git a/engine/inc/bullet/Bullet3Dynamics/shared/b3Inertia.h b/engine/inc/bullet/Bullet3Dynamics/shared/b3Inertia.h deleted file mode 100644 index 602a1335..00000000 --- a/engine/inc/bullet/Bullet3Dynamics/shared/b3Inertia.h +++ /dev/null @@ -1,14 +0,0 @@ - - -#ifndef B3_INERTIA_H -#define B3_INERTIA_H - -#include "Bullet3Common/shared/b3Mat3x3.h" - -struct b3Inertia -{ - b3Mat3x3 m_invInertiaWorld; - b3Mat3x3 m_initInvInertia; -}; - -#endif //B3_INERTIA_H \ No newline at end of file diff --git a/engine/inc/bullet/Bullet3Dynamics/shared/b3IntegrateTransforms.h b/engine/inc/bullet/Bullet3Dynamics/shared/b3IntegrateTransforms.h deleted file mode 100644 index 56d9118f..00000000 --- a/engine/inc/bullet/Bullet3Dynamics/shared/b3IntegrateTransforms.h +++ /dev/null @@ -1,106 +0,0 @@ - - -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3RigidBodyData.h" - -inline void integrateSingleTransform(__global b3RigidBodyData_t* bodies, int nodeID, float timeStep, float angularDamping, b3Float4ConstArg gravityAcceleration) -{ - if (bodies[nodeID].m_invMass != 0.f) - { - float BT_GPU_ANGULAR_MOTION_THRESHOLD = (0.25f * 3.14159254f); - - //angular velocity - { - b3Float4 axis; - //add some hardcoded angular damping - bodies[nodeID].m_angVel.x *= angularDamping; - bodies[nodeID].m_angVel.y *= angularDamping; - bodies[nodeID].m_angVel.z *= angularDamping; - - b3Float4 angvel = bodies[nodeID].m_angVel; - - float fAngle = b3Sqrt(b3Dot3F4(angvel, angvel)); - - //limit the angular motion - if (fAngle * timeStep > BT_GPU_ANGULAR_MOTION_THRESHOLD) - { - fAngle = BT_GPU_ANGULAR_MOTION_THRESHOLD / timeStep; - } - if (fAngle < 0.001f) - { - // use Taylor's expansions of sync function - axis = angvel * (0.5f * timeStep - (timeStep * timeStep * timeStep) * 0.020833333333f * fAngle * fAngle); - } - else - { - // sync(fAngle) = sin(c*fAngle)/t - axis = angvel * (b3Sin(0.5f * fAngle * timeStep) / fAngle); - } - - b3Quat dorn; - dorn.x = axis.x; - dorn.y = axis.y; - dorn.z = axis.z; - dorn.w = b3Cos(fAngle * timeStep * 0.5f); - b3Quat orn0 = bodies[nodeID].m_quat; - b3Quat predictedOrn = b3QuatMul(dorn, orn0); - predictedOrn = b3QuatNormalized(predictedOrn); - bodies[nodeID].m_quat = predictedOrn; - } - //linear velocity - bodies[nodeID].m_pos += bodies[nodeID].m_linVel * timeStep; - - //apply gravity - bodies[nodeID].m_linVel += gravityAcceleration * timeStep; - } -} - -inline void b3IntegrateTransform(__global b3RigidBodyData_t* body, float timeStep, float angularDamping, b3Float4ConstArg gravityAcceleration) -{ - float BT_GPU_ANGULAR_MOTION_THRESHOLD = (0.25f * 3.14159254f); - - if ((body->m_invMass != 0.f)) - { - //angular velocity - { - b3Float4 axis; - //add some hardcoded angular damping - body->m_angVel.x *= angularDamping; - body->m_angVel.y *= angularDamping; - body->m_angVel.z *= angularDamping; - - b3Float4 angvel = body->m_angVel; - float fAngle = b3Sqrt(b3Dot3F4(angvel, angvel)); - //limit the angular motion - if (fAngle * timeStep > BT_GPU_ANGULAR_MOTION_THRESHOLD) - { - fAngle = BT_GPU_ANGULAR_MOTION_THRESHOLD / timeStep; - } - if (fAngle < 0.001f) - { - // use Taylor's expansions of sync function - axis = angvel * (0.5f * timeStep - (timeStep * timeStep * timeStep) * 0.020833333333f * fAngle * fAngle); - } - else - { - // sync(fAngle) = sin(c*fAngle)/t - axis = angvel * (b3Sin(0.5f * fAngle * timeStep) / fAngle); - } - b3Quat dorn; - dorn.x = axis.x; - dorn.y = axis.y; - dorn.z = axis.z; - dorn.w = b3Cos(fAngle * timeStep * 0.5f); - b3Quat orn0 = body->m_quat; - - b3Quat predictedOrn = b3QuatMul(dorn, orn0); - predictedOrn = b3QuatNormalized(predictedOrn); - body->m_quat = predictedOrn; - } - - //apply gravity - body->m_linVel += gravityAcceleration * timeStep; - - //linear velocity - body->m_pos += body->m_linVel * timeStep; - } -} diff --git a/engine/inc/bullet/Bullet3Geometry/b3AabbUtil.h b/engine/inc/bullet/Bullet3Geometry/b3AabbUtil.h deleted file mode 100644 index 396a4014..00000000 --- a/engine/inc/bullet/Bullet3Geometry/b3AabbUtil.h +++ /dev/null @@ -1,217 +0,0 @@ -/* -Copyright (c) 2003-2006 Gino van den Bergen / 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 B3_AABB_UTIL2 -#define B3_AABB_UTIL2 - -#include "Bullet3Common/b3Transform.h" -#include "Bullet3Common/b3Vector3.h" -#include "Bullet3Common/b3MinMax.h" - -B3_FORCE_INLINE void b3AabbExpand(b3Vector3& aabbMin, - b3Vector3& aabbMax, - const b3Vector3& expansionMin, - const b3Vector3& expansionMax) -{ - aabbMin = aabbMin + expansionMin; - aabbMax = aabbMax + expansionMax; -} - -/// conservative test for overlap between two aabbs -B3_FORCE_INLINE bool b3TestPointAgainstAabb2(const b3Vector3& aabbMin1, const b3Vector3& aabbMax1, - const b3Vector3& point) -{ - bool overlap = true; - overlap = (aabbMin1.getX() > point.getX() || aabbMax1.getX() < point.getX()) ? false : overlap; - overlap = (aabbMin1.getZ() > point.getZ() || aabbMax1.getZ() < point.getZ()) ? false : overlap; - overlap = (aabbMin1.getY() > point.getY() || aabbMax1.getY() < point.getY()) ? false : overlap; - return overlap; -} - -/// conservative test for overlap between two aabbs -B3_FORCE_INLINE bool b3TestAabbAgainstAabb2(const b3Vector3& aabbMin1, const b3Vector3& aabbMax1, - const b3Vector3& aabbMin2, const b3Vector3& aabbMax2) -{ - bool overlap = true; - overlap = (aabbMin1.getX() > aabbMax2.getX() || aabbMax1.getX() < aabbMin2.getX()) ? false : overlap; - overlap = (aabbMin1.getZ() > aabbMax2.getZ() || aabbMax1.getZ() < aabbMin2.getZ()) ? false : overlap; - overlap = (aabbMin1.getY() > aabbMax2.getY() || aabbMax1.getY() < aabbMin2.getY()) ? false : overlap; - return overlap; -} - -/// conservative test for overlap between triangle and aabb -B3_FORCE_INLINE bool b3TestTriangleAgainstAabb2(const b3Vector3* vertices, - const b3Vector3& aabbMin, const b3Vector3& aabbMax) -{ - const b3Vector3& p1 = vertices[0]; - const b3Vector3& p2 = vertices[1]; - const b3Vector3& p3 = vertices[2]; - - if (b3Min(b3Min(p1[0], p2[0]), p3[0]) > aabbMax[0]) return false; - if (b3Max(b3Max(p1[0], p2[0]), p3[0]) < aabbMin[0]) return false; - - if (b3Min(b3Min(p1[2], p2[2]), p3[2]) > aabbMax[2]) return false; - if (b3Max(b3Max(p1[2], p2[2]), p3[2]) < aabbMin[2]) return false; - - if (b3Min(b3Min(p1[1], p2[1]), p3[1]) > aabbMax[1]) return false; - if (b3Max(b3Max(p1[1], p2[1]), p3[1]) < aabbMin[1]) return false; - return true; -} - -B3_FORCE_INLINE int b3Outcode(const b3Vector3& p, const b3Vector3& halfExtent) -{ - return (p.getX() < -halfExtent.getX() ? 0x01 : 0x0) | - (p.getX() > halfExtent.getX() ? 0x08 : 0x0) | - (p.getY() < -halfExtent.getY() ? 0x02 : 0x0) | - (p.getY() > halfExtent.getY() ? 0x10 : 0x0) | - (p.getZ() < -halfExtent.getZ() ? 0x4 : 0x0) | - (p.getZ() > halfExtent.getZ() ? 0x20 : 0x0); -} - -B3_FORCE_INLINE bool b3RayAabb2(const b3Vector3& rayFrom, - const b3Vector3& rayInvDirection, - const unsigned int raySign[3], - const b3Vector3 bounds[2], - b3Scalar& tmin, - b3Scalar lambda_min, - b3Scalar lambda_max) -{ - b3Scalar tmax, tymin, tymax, tzmin, tzmax; - tmin = (bounds[raySign[0]].getX() - rayFrom.getX()) * rayInvDirection.getX(); - tmax = (bounds[1 - raySign[0]].getX() - rayFrom.getX()) * rayInvDirection.getX(); - tymin = (bounds[raySign[1]].getY() - rayFrom.getY()) * rayInvDirection.getY(); - tymax = (bounds[1 - raySign[1]].getY() - rayFrom.getY()) * rayInvDirection.getY(); - - if ((tmin > tymax) || (tymin > tmax)) - return false; - - if (tymin > tmin) - tmin = tymin; - - if (tymax < tmax) - tmax = tymax; - - tzmin = (bounds[raySign[2]].getZ() - rayFrom.getZ()) * rayInvDirection.getZ(); - tzmax = (bounds[1 - raySign[2]].getZ() - rayFrom.getZ()) * rayInvDirection.getZ(); - - if ((tmin > tzmax) || (tzmin > tmax)) - return false; - if (tzmin > tmin) - tmin = tzmin; - if (tzmax < tmax) - tmax = tzmax; - return ((tmin < lambda_max) && (tmax > lambda_min)); -} - -B3_FORCE_INLINE bool b3RayAabb(const b3Vector3& rayFrom, - const b3Vector3& rayTo, - const b3Vector3& aabbMin, - const b3Vector3& aabbMax, - b3Scalar& param, b3Vector3& normal) -{ - b3Vector3 aabbHalfExtent = (aabbMax - aabbMin) * b3Scalar(0.5); - b3Vector3 aabbCenter = (aabbMax + aabbMin) * b3Scalar(0.5); - b3Vector3 source = rayFrom - aabbCenter; - b3Vector3 target = rayTo - aabbCenter; - int sourceOutcode = b3Outcode(source, aabbHalfExtent); - int targetOutcode = b3Outcode(target, aabbHalfExtent); - if ((sourceOutcode & targetOutcode) == 0x0) - { - b3Scalar lambda_enter = b3Scalar(0.0); - b3Scalar lambda_exit = param; - b3Vector3 r = target - source; - int i; - b3Scalar normSign = 1; - b3Vector3 hitNormal = b3MakeVector3(0, 0, 0); - int bit = 1; - - for (int j = 0; j < 2; j++) - { - for (i = 0; i != 3; ++i) - { - if (sourceOutcode & bit) - { - b3Scalar lambda = (-source[i] - aabbHalfExtent[i] * normSign) / r[i]; - if (lambda_enter <= lambda) - { - lambda_enter = lambda; - hitNormal.setValue(0, 0, 0); - hitNormal[i] = normSign; - } - } - else if (targetOutcode & bit) - { - b3Scalar lambda = (-source[i] - aabbHalfExtent[i] * normSign) / r[i]; - b3SetMin(lambda_exit, lambda); - } - bit <<= 1; - } - normSign = b3Scalar(-1.); - } - if (lambda_enter <= lambda_exit) - { - param = lambda_enter; - normal = hitNormal; - return true; - } - } - return false; -} - -B3_FORCE_INLINE void b3TransformAabb(const b3Vector3& halfExtents, b3Scalar margin, const b3Transform& t, b3Vector3& aabbMinOut, b3Vector3& aabbMaxOut) -{ - b3Vector3 halfExtentsWithMargin = halfExtents + b3MakeVector3(margin, margin, margin); - b3Matrix3x3 abs_b = t.getBasis().absolute(); - b3Vector3 center = t.getOrigin(); - b3Vector3 extent = halfExtentsWithMargin.dot3(abs_b[0], abs_b[1], abs_b[2]); - aabbMinOut = center - extent; - aabbMaxOut = center + extent; -} - -B3_FORCE_INLINE void b3TransformAabb(const b3Vector3& localAabbMin, const b3Vector3& localAabbMax, b3Scalar margin, const b3Transform& trans, b3Vector3& aabbMinOut, b3Vector3& aabbMaxOut) -{ - //b3Assert(localAabbMin.getX() <= localAabbMax.getX()); - //b3Assert(localAabbMin.getY() <= localAabbMax.getY()); - //b3Assert(localAabbMin.getZ() <= localAabbMax.getZ()); - b3Vector3 localHalfExtents = b3Scalar(0.5) * (localAabbMax - localAabbMin); - localHalfExtents += b3MakeVector3(margin, margin, margin); - - b3Vector3 localCenter = b3Scalar(0.5) * (localAabbMax + localAabbMin); - b3Matrix3x3 abs_b = trans.getBasis().absolute(); - b3Vector3 center = trans(localCenter); - b3Vector3 extent = localHalfExtents.dot3(abs_b[0], abs_b[1], abs_b[2]); - aabbMinOut = center - extent; - aabbMaxOut = center + extent; -} - -#define B3_USE_BANCHLESS 1 -#ifdef B3_USE_BANCHLESS -//This block replaces the block below and uses no branches, and replaces the 8 bit return with a 32 bit return for improved performance (~3x on XBox 360) -B3_FORCE_INLINE unsigned b3TestQuantizedAabbAgainstQuantizedAabb(const unsigned short int* aabbMin1, const unsigned short int* aabbMax1, const unsigned short int* aabbMin2, const unsigned short int* aabbMax2) -{ - return static_cast(b3Select((unsigned)((aabbMin1[0] <= aabbMax2[0]) & (aabbMax1[0] >= aabbMin2[0]) & (aabbMin1[2] <= aabbMax2[2]) & (aabbMax1[2] >= aabbMin2[2]) & (aabbMin1[1] <= aabbMax2[1]) & (aabbMax1[1] >= aabbMin2[1])), - 1, 0)); -} -#else -B3_FORCE_INLINE bool b3TestQuantizedAabbAgainstQuantizedAabb(const unsigned short int* aabbMin1, const unsigned short int* aabbMax1, const unsigned short int* aabbMin2, const unsigned short int* aabbMax2) -{ - bool overlap = true; - overlap = (aabbMin1[0] > aabbMax2[0] || aabbMax1[0] < aabbMin2[0]) ? false : overlap; - overlap = (aabbMin1[2] > aabbMax2[2] || aabbMax1[2] < aabbMin2[2]) ? false : overlap; - overlap = (aabbMin1[1] > aabbMax2[1] || aabbMax1[1] < aabbMin2[1]) ? false : overlap; - return overlap; -} -#endif //B3_USE_BANCHLESS - -#endif //B3_AABB_UTIL2 diff --git a/engine/inc/bullet/Bullet3Geometry/b3ConvexHullComputer.h b/engine/inc/bullet/Bullet3Geometry/b3ConvexHullComputer.h deleted file mode 100644 index 8852c5a5..00000000 --- a/engine/inc/bullet/Bullet3Geometry/b3ConvexHullComputer.h +++ /dev/null @@ -1,99 +0,0 @@ -/* -Copyright (c) 2011 Ole Kniemeyer, MAXON, www.maxon.net - -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 B3_CONVEX_HULL_COMPUTER_H -#define B3_CONVEX_HULL_COMPUTER_H - -#include "Bullet3Common/b3Vector3.h" -#include "Bullet3Common/b3AlignedObjectArray.h" - -/// Convex hull implementation based on Preparata and Hong -/// See http://code.google.com/p/bullet/issues/detail?id=275 -/// Ole Kniemeyer, MAXON Computer GmbH -class b3ConvexHullComputer -{ -private: - b3Scalar compute(const void* coords, bool doubleCoords, int stride, int count, b3Scalar shrink, b3Scalar shrinkClamp); - -public: - class Edge - { - private: - int next; - int reverse; - int targetVertex; - - friend class b3ConvexHullComputer; - - public: - int getSourceVertex() const - { - return (this + reverse)->targetVertex; - } - - int getTargetVertex() const - { - return targetVertex; - } - - const Edge* getNextEdgeOfVertex() const // clockwise list of all edges of a vertex - { - return this + next; - } - - const Edge* getNextEdgeOfFace() const // counter-clockwise list of all edges of a face - { - return (this + reverse)->getNextEdgeOfVertex(); - } - - const Edge* getReverseEdge() const - { - return this + reverse; - } - }; - - // Vertices of the output hull - b3AlignedObjectArray vertices; - - // Edges of the output hull - b3AlignedObjectArray edges; - - // Faces of the convex hull. Each entry is an index into the "edges" array pointing to an edge of the face. Faces are planar n-gons - b3AlignedObjectArray faces; - - /* - Compute convex hull of "count" vertices stored in "coords". "stride" is the difference in bytes - between the addresses of consecutive vertices. If "shrink" is positive, the convex hull is shrunken - by that amount (each face is moved by "shrink" length units towards the center along its normal). - If "shrinkClamp" is positive, "shrink" is clamped to not exceed "shrinkClamp * innerRadius", where "innerRadius" - is the minimum distance of a face to the center of the convex hull. - - The returned value is the amount by which the hull has been shrunken. If it is negative, the amount was so large - that the resulting convex hull is empty. - - The output convex hull can be found in the member variables "vertices", "edges", "faces". - */ - b3Scalar compute(const float* coords, int stride, int count, b3Scalar shrink, b3Scalar shrinkClamp) - { - return compute(coords, false, stride, count, shrink, shrinkClamp); - } - - // same as above, but double precision - b3Scalar compute(const double* coords, int stride, int count, b3Scalar shrink, b3Scalar shrinkClamp) - { - return compute(coords, true, stride, count, shrink, shrinkClamp); - } -}; - -#endif //B3_CONVEX_HULL_COMPUTER_H diff --git a/engine/inc/bullet/Bullet3Geometry/b3GeometryUtil.h b/engine/inc/bullet/Bullet3Geometry/b3GeometryUtil.h deleted file mode 100644 index 967c8d67..00000000 --- a/engine/inc/bullet/Bullet3Geometry/b3GeometryUtil.h +++ /dev/null @@ -1,36 +0,0 @@ -/* -Copyright (c) 2003-2006 Gino van den Bergen / 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 B3_GEOMETRY_UTIL_H -#define B3_GEOMETRY_UTIL_H - -#include "Bullet3Common/b3Vector3.h" -#include "Bullet3Common/b3AlignedObjectArray.h" - -///The b3GeometryUtil helper class provides a few methods to convert between plane equations and vertices. -class b3GeometryUtil -{ -public: - static void getPlaneEquationsFromVertices(b3AlignedObjectArray& vertices, b3AlignedObjectArray& planeEquationsOut); - - static void getVerticesFromPlaneEquations(const b3AlignedObjectArray& planeEquations, b3AlignedObjectArray& verticesOut); - - static bool isInside(const b3AlignedObjectArray& vertices, const b3Vector3& planeNormal, b3Scalar margin); - - static bool isPointInsidePlanes(const b3AlignedObjectArray& planeEquations, const b3Vector3& point, b3Scalar margin); - - static bool areVerticesBehindPlane(const b3Vector3& planeNormal, const b3AlignedObjectArray& vertices, b3Scalar margin); -}; - -#endif //B3_GEOMETRY_UTIL_H diff --git a/engine/inc/bullet/Bullet3Geometry/b3GrahamScan2dConvexHull.h b/engine/inc/bullet/Bullet3Geometry/b3GrahamScan2dConvexHull.h deleted file mode 100644 index 8881c9a6..00000000 --- a/engine/inc/bullet/Bullet3Geometry/b3GrahamScan2dConvexHull.h +++ /dev/null @@ -1,116 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2011 Advanced Micro Devices, Inc. http://bulletphysics.org - -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 B3_GRAHAM_SCAN_2D_CONVEX_HULL_H -#define B3_GRAHAM_SCAN_2D_CONVEX_HULL_H - -#include "Bullet3Common/b3Vector3.h" -#include "Bullet3Common/b3AlignedObjectArray.h" - -struct b3GrahamVector3 : public b3Vector3 -{ - b3GrahamVector3(const b3Vector3& org, int orgIndex) - : b3Vector3(org), - m_orgIndex(orgIndex) - { - } - b3Scalar m_angle; - int m_orgIndex; -}; - -struct b3AngleCompareFunc -{ - b3Vector3 m_anchor; - b3AngleCompareFunc(const b3Vector3& anchor) - : m_anchor(anchor) - { - } - bool operator()(const b3GrahamVector3& a, const b3GrahamVector3& b) const - { - if (a.m_angle != b.m_angle) - return a.m_angle < b.m_angle; - else - { - b3Scalar al = (a - m_anchor).length2(); - b3Scalar bl = (b - m_anchor).length2(); - if (al != bl) - return al < bl; - else - { - return a.m_orgIndex < b.m_orgIndex; - } - } - } -}; - -inline void b3GrahamScanConvexHull2D(b3AlignedObjectArray& originalPoints, b3AlignedObjectArray& hull, const b3Vector3& normalAxis) -{ - b3Vector3 axis0, axis1; - b3PlaneSpace1(normalAxis, axis0, axis1); - - if (originalPoints.size() <= 1) - { - for (int i = 0; i < originalPoints.size(); i++) - hull.push_back(originalPoints[0]); - return; - } - //step1 : find anchor point with smallest projection on axis0 and move it to first location - for (int i = 0; i < originalPoints.size(); i++) - { - // const b3Vector3& left = originalPoints[i]; - // const b3Vector3& right = originalPoints[0]; - b3Scalar projL = originalPoints[i].dot(axis0); - b3Scalar projR = originalPoints[0].dot(axis0); - if (projL < projR) - { - originalPoints.swap(0, i); - } - } - - //also precompute angles - originalPoints[0].m_angle = -1e30f; - for (int i = 1; i < originalPoints.size(); i++) - { - b3Vector3 xvec = axis0; - b3Vector3 ar = originalPoints[i] - originalPoints[0]; - originalPoints[i].m_angle = b3Cross(xvec, ar).dot(normalAxis) / ar.length(); - } - - //step 2: sort all points, based on 'angle' with this anchor - b3AngleCompareFunc comp(originalPoints[0]); - originalPoints.quickSortInternal(comp, 1, originalPoints.size() - 1); - - int i; - for (i = 0; i < 2; i++) - hull.push_back(originalPoints[i]); - - //step 3: keep all 'convex' points and discard concave points (using back tracking) - for (; i != originalPoints.size(); i++) - { - bool isConvex = false; - while (!isConvex && hull.size() > 1) - { - b3Vector3& a = hull[hull.size() - 2]; - b3Vector3& b = hull[hull.size() - 1]; - isConvex = b3Cross(a - b, a - originalPoints[i]).dot(normalAxis) > 0; - if (!isConvex) - hull.pop_back(); - else - hull.push_back(originalPoints[i]); - } - } -} - -#endif //B3_GRAHAM_SCAN_2D_CONVEX_HULL_H diff --git a/engine/inc/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuBroadphaseInterface.h b/engine/inc/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuBroadphaseInterface.h deleted file mode 100644 index b2969925..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuBroadphaseInterface.h +++ /dev/null @@ -1,42 +0,0 @@ - -#ifndef B3_GPU_BROADPHASE_INTERFACE_H -#define B3_GPU_BROADPHASE_INTERFACE_H - -#include "Bullet3OpenCL/Initialize/b3OpenCLInclude.h" -#include "Bullet3Common/b3Vector3.h" -#include "b3SapAabb.h" -#include "Bullet3Common/shared/b3Int2.h" -#include "Bullet3Common/shared/b3Int4.h" -#include "Bullet3OpenCL/ParallelPrimitives/b3OpenCLArray.h" - -class b3GpuBroadphaseInterface -{ -public: - typedef class b3GpuBroadphaseInterface*(CreateFunc)(cl_context ctx, cl_device_id device, cl_command_queue q); - - virtual ~b3GpuBroadphaseInterface() - { - } - - virtual void createProxy(const b3Vector3& aabbMin, const b3Vector3& aabbMax, int userPtr, int collisionFilterGroup, int collisionFilterMask) = 0; - virtual void createLargeProxy(const b3Vector3& aabbMin, const b3Vector3& aabbMax, int userPtr, int collisionFilterGroup, int collisionFilterMask) = 0; - - virtual void calculateOverlappingPairs(int maxPairs) = 0; - virtual void calculateOverlappingPairsHost(int maxPairs) = 0; - - //call writeAabbsToGpu after done making all changes (createProxy etc) - virtual void writeAabbsToGpu() = 0; - - virtual cl_mem getAabbBufferWS() = 0; - virtual int getNumOverlap() = 0; - virtual cl_mem getOverlappingPairBuffer() = 0; - - virtual b3OpenCLArray& getAllAabbsGPU() = 0; - virtual b3AlignedObjectArray& getAllAabbsCPU() = 0; - - virtual b3OpenCLArray& getOverlappingPairsGPU() = 0; - virtual b3OpenCLArray& getSmallAabbIndicesGPU() = 0; - virtual b3OpenCLArray& getLargeAabbIndicesGPU() = 0; -}; - -#endif //B3_GPU_BROADPHASE_INTERFACE_H diff --git a/engine/inc/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuGridBroadphase.h b/engine/inc/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuGridBroadphase.h deleted file mode 100644 index b76cb43b..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuGridBroadphase.h +++ /dev/null @@ -1,80 +0,0 @@ -#ifndef B3_GPU_GRID_BROADPHASE_H -#define B3_GPU_GRID_BROADPHASE_H - -#include "b3GpuBroadphaseInterface.h" -#include "Bullet3OpenCL/ParallelPrimitives/b3RadixSort32CL.h" - -struct b3ParamsGridBroadphaseCL -{ - float m_invCellSize[4]; - int m_gridSize[4]; - - int getMaxBodiesPerCell() const - { - return m_gridSize[3]; - } - - void setMaxBodiesPerCell(int maxOverlap) - { - m_gridSize[3] = maxOverlap; - } -}; - -class b3GpuGridBroadphase : public b3GpuBroadphaseInterface -{ -protected: - cl_context m_context; - cl_device_id m_device; - cl_command_queue m_queue; - - b3OpenCLArray m_allAabbsGPU1; - b3AlignedObjectArray m_allAabbsCPU1; - - b3OpenCLArray m_smallAabbsMappingGPU; - b3AlignedObjectArray m_smallAabbsMappingCPU; - - b3OpenCLArray m_largeAabbsMappingGPU; - b3AlignedObjectArray m_largeAabbsMappingCPU; - - b3AlignedObjectArray m_hostPairs; - b3OpenCLArray m_gpuPairs; - - b3OpenCLArray m_hashGpu; - b3OpenCLArray m_cellStartGpu; - - b3ParamsGridBroadphaseCL m_paramsCPU; - b3OpenCLArray m_paramsGPU; - - class b3RadixSort32CL* m_sorter; - -public: - b3GpuGridBroadphase(cl_context ctx, cl_device_id device, cl_command_queue q); - virtual ~b3GpuGridBroadphase(); - - static b3GpuBroadphaseInterface* CreateFunc(cl_context ctx, cl_device_id device, cl_command_queue q) - { - return new b3GpuGridBroadphase(ctx, device, q); - } - - virtual void createProxy(const b3Vector3& aabbMin, const b3Vector3& aabbMax, int userPtr, int collisionFilterGroup, int collisionFilterMask); - virtual void createLargeProxy(const b3Vector3& aabbMin, const b3Vector3& aabbMax, int userPtr, int collisionFilterGroup, int collisionFilterMask); - - virtual void calculateOverlappingPairs(int maxPairs); - virtual void calculateOverlappingPairsHost(int maxPairs); - - //call writeAabbsToGpu after done making all changes (createProxy etc) - virtual void writeAabbsToGpu(); - - virtual cl_mem getAabbBufferWS(); - virtual int getNumOverlap(); - virtual cl_mem getOverlappingPairBuffer(); - - virtual b3OpenCLArray& getAllAabbsGPU(); - virtual b3AlignedObjectArray& getAllAabbsCPU(); - - virtual b3OpenCLArray& getOverlappingPairsGPU(); - virtual b3OpenCLArray& getSmallAabbIndicesGPU(); - virtual b3OpenCLArray& getLargeAabbIndicesGPU(); -}; - -#endif //B3_GPU_GRID_BROADPHASE_H \ No newline at end of file diff --git a/engine/inc/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvh.h b/engine/inc/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvh.h deleted file mode 100644 index b3907751..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvh.h +++ /dev/null @@ -1,125 +0,0 @@ -/* -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. -*/ -//Initial Author Jackson Lee, 2014 - -#ifndef B3_GPU_PARALLEL_LINEAR_BVH_H -#define B3_GPU_PARALLEL_LINEAR_BVH_H - -//#include "Bullet3Collision/BroadPhaseCollision/shared/b3Aabb.h" -#include "Bullet3OpenCL/BroadphaseCollision/b3SapAabb.h" -#include "Bullet3Common/shared/b3Int2.h" -#include "Bullet3Common/shared/b3Int4.h" -#include "Bullet3Collision/NarrowPhaseCollision/b3RaycastInfo.h" - -#include "Bullet3OpenCL/ParallelPrimitives/b3FillCL.h" -#include "Bullet3OpenCL/ParallelPrimitives/b3RadixSort32CL.h" -#include "Bullet3OpenCL/ParallelPrimitives/b3PrefixScanCL.h" - -#include "Bullet3OpenCL/BroadphaseCollision/kernels/parallelLinearBvhKernels.h" - -#define b3Int64 cl_long - -///@brief GPU Parallel Linearized Bounding Volume Heirarchy(LBVH) that is reconstructed every frame -///@remarks -///See presentation in docs/b3GpuParallelLinearBvh.pdf for algorithm details. -///@par -///Related papers: \n -///"Fast BVH Construction on GPUs" [Lauterbach et al. 2009] \n -///"Maximizing Parallelism in the Construction of BVHs, Octrees, and k-d trees" [Karras 2012] \n -///@par -///The basic algorithm for building the BVH as presented in [Lauterbach et al. 2009] consists of 4 stages: -/// - [fully parallel] Assign morton codes for each AABB using its center (after quantizing the AABB centers into a virtual grid) -/// - [fully parallel] Sort morton codes -/// - [somewhat parallel] Build binary radix tree (assign parent/child pointers for internal nodes of the BVH) -/// - [somewhat parallel] Set internal node AABBs -///@par -///[Karras 2012] improves on the algorithm by introducing fully parallel methods for the last 2 stages. -///The BVH implementation here shares many concepts with [Karras 2012], but a different method is used for constructing the tree. -///Instead of searching for the child nodes of each internal node, we search for the parent node of each node. -///Additionally, a non-atomic traversal that starts from the leaf nodes and moves towards the root node is used to set the AABBs. -class b3GpuParallelLinearBvh -{ - cl_command_queue m_queue; - - cl_program m_parallelLinearBvhProgram; - - cl_kernel m_separateAabbsKernel; - cl_kernel m_findAllNodesMergedAabbKernel; - cl_kernel m_assignMortonCodesAndAabbIndiciesKernel; - - //Binary radix tree construction kernels - cl_kernel m_computeAdjacentPairCommonPrefixKernel; - cl_kernel m_buildBinaryRadixTreeLeafNodesKernel; - cl_kernel m_buildBinaryRadixTreeInternalNodesKernel; - cl_kernel m_findDistanceFromRootKernel; - cl_kernel m_buildBinaryRadixTreeAabbsRecursiveKernel; - - cl_kernel m_findLeafIndexRangesKernel; - - //Traversal kernels - cl_kernel m_plbvhCalculateOverlappingPairsKernel; - cl_kernel m_plbvhRayTraverseKernel; - cl_kernel m_plbvhLargeAabbAabbTestKernel; - cl_kernel m_plbvhLargeAabbRayTestKernel; - - b3RadixSort32CL m_radixSorter; - - //1 element - b3OpenCLArray m_rootNodeIndex; //Most significant bit(0x80000000) is set to indicate internal node - b3OpenCLArray m_maxDistanceFromRoot; //Max number of internal nodes between an internal node and the root node - b3OpenCLArray m_temp; //Used to hold the number of pairs in calculateOverlappingPairs() - - //1 element per internal node (number_of_internal_nodes == number_of_leaves - 1) - b3OpenCLArray m_internalNodeAabbs; - b3OpenCLArray m_internalNodeLeafIndexRanges; //x == min leaf index, y == max leaf index - b3OpenCLArray m_internalNodeChildNodes; //x == left child, y == right child; msb(0x80000000) is set to indicate internal node - b3OpenCLArray m_internalNodeParentNodes; //For parent node index, msb(0x80000000) is not set since it is always internal - - //1 element per internal node; for binary radix tree construction - b3OpenCLArray m_commonPrefixes; - b3OpenCLArray m_commonPrefixLengths; - b3OpenCLArray m_distanceFromRoot; //Number of internal nodes between this node and the root - - //1 element per leaf node (leaf nodes only include small AABBs) - b3OpenCLArray m_leafNodeParentNodes; //For parent node index, msb(0x80000000) is not set since it is always internal - b3OpenCLArray m_mortonCodesAndAabbIndicies; //m_key == morton code, m_value == aabb index in m_leafNodeAabbs - b3OpenCLArray m_mergedAabb; //m_mergedAabb[0] contains the merged AABB of all leaf nodes - b3OpenCLArray m_leafNodeAabbs; //Contains only small AABBs - - //1 element per large AABB, which is not stored in the BVH - b3OpenCLArray m_largeAabbs; - -public: - b3GpuParallelLinearBvh(cl_context context, cl_device_id device, cl_command_queue queue); - virtual ~b3GpuParallelLinearBvh(); - - ///Must be called before any other function - void build(const b3OpenCLArray& worldSpaceAabbs, const b3OpenCLArray& smallAabbIndices, - const b3OpenCLArray& largeAabbIndices); - - ///calculateOverlappingPairs() uses the worldSpaceAabbs parameter of b3GpuParallelLinearBvh::build() as the query AABBs. - ///@param out_overlappingPairs The size() of this array is used to determine the max number of pairs. - ///If the number of overlapping pairs is < out_overlappingPairs.size(), out_overlappingPairs is resized. - void calculateOverlappingPairs(b3OpenCLArray& out_overlappingPairs); - - ///@param out_numRigidRayPairs Array of length 1; contains the number of detected ray-rigid AABB intersections; - ///this value may be greater than out_rayRigidPairs.size() if out_rayRigidPairs is not large enough. - ///@param out_rayRigidPairs Contains an array of rays intersecting rigid AABBs; x == ray index, y == rigid body index. - ///If the size of this array is insufficient to hold all ray-rigid AABB intersections, additional intersections are discarded. - void testRaysAgainstBvhAabbs(const b3OpenCLArray& rays, - b3OpenCLArray& out_numRayRigidPairs, b3OpenCLArray& out_rayRigidPairs); - -private: - void constructBinaryRadixTree(); -}; - -#endif diff --git a/engine/inc/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvhBroadphase.h b/engine/inc/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvhBroadphase.h deleted file mode 100644 index dda0eea7..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvhBroadphase.h +++ /dev/null @@ -1,66 +0,0 @@ -/* -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. -*/ -//Initial Author Jackson Lee, 2014 - -#ifndef B3_GPU_PARALLEL_LINEAR_BVH_BROADPHASE_H -#define B3_GPU_PARALLEL_LINEAR_BVH_BROADPHASE_H - -#include "Bullet3OpenCL/BroadphaseCollision/b3GpuBroadphaseInterface.h" - -#include "b3GpuParallelLinearBvh.h" - -class b3GpuParallelLinearBvhBroadphase : public b3GpuBroadphaseInterface -{ - b3GpuParallelLinearBvh m_plbvh; - - b3OpenCLArray m_overlappingPairsGpu; - - b3OpenCLArray m_aabbsGpu; - b3OpenCLArray m_smallAabbsMappingGpu; - b3OpenCLArray m_largeAabbsMappingGpu; - - b3AlignedObjectArray m_aabbsCpu; - b3AlignedObjectArray m_smallAabbsMappingCpu; - b3AlignedObjectArray m_largeAabbsMappingCpu; - -public: - b3GpuParallelLinearBvhBroadphase(cl_context context, cl_device_id device, cl_command_queue queue); - virtual ~b3GpuParallelLinearBvhBroadphase() {} - - virtual void createProxy(const b3Vector3& aabbMin, const b3Vector3& aabbMax, int userPtr, int collisionFilterGroup, int collisionFilterMask); - virtual void createLargeProxy(const b3Vector3& aabbMin, const b3Vector3& aabbMax, int userPtr, int collisionFilterGroup, int collisionFilterMask); - - virtual void calculateOverlappingPairs(int maxPairs); - virtual void calculateOverlappingPairsHost(int maxPairs); - - //call writeAabbsToGpu after done making all changes (createProxy etc) - virtual void writeAabbsToGpu(); - - virtual int getNumOverlap() { return m_overlappingPairsGpu.size(); } - virtual cl_mem getOverlappingPairBuffer() { return m_overlappingPairsGpu.getBufferCL(); } - - virtual cl_mem getAabbBufferWS() { return m_aabbsGpu.getBufferCL(); } - virtual b3OpenCLArray& getAllAabbsGPU() { return m_aabbsGpu; } - - virtual b3OpenCLArray& getOverlappingPairsGPU() { return m_overlappingPairsGpu; } - virtual b3OpenCLArray& getSmallAabbIndicesGPU() { return m_smallAabbsMappingGpu; } - virtual b3OpenCLArray& getLargeAabbIndicesGPU() { return m_largeAabbsMappingGpu; } - - virtual b3AlignedObjectArray& getAllAabbsCPU() { return m_aabbsCpu; } - - static b3GpuBroadphaseInterface* CreateFunc(cl_context context, cl_device_id device, cl_command_queue queue) - { - return new b3GpuParallelLinearBvhBroadphase(context, device, queue); - } -}; - -#endif diff --git a/engine/inc/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.h b/engine/inc/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.h deleted file mode 100644 index d17590b1..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.h +++ /dev/null @@ -1,143 +0,0 @@ -#ifndef B3_GPU_SAP_BROADPHASE_H -#define B3_GPU_SAP_BROADPHASE_H - -#include "Bullet3OpenCL/ParallelPrimitives/b3OpenCLArray.h" -#include "Bullet3OpenCL/ParallelPrimitives/b3FillCL.h" //b3Int2 -class b3Vector3; -#include "Bullet3OpenCL/ParallelPrimitives/b3RadixSort32CL.h" - -#include "b3SapAabb.h" -#include "Bullet3Common/shared/b3Int2.h" - -#include "b3GpuBroadphaseInterface.h" - -class b3GpuSapBroadphase : public b3GpuBroadphaseInterface -{ - cl_context m_context; - cl_device_id m_device; - cl_command_queue m_queue; - cl_kernel m_flipFloatKernel; - cl_kernel m_scatterKernel; - cl_kernel m_copyAabbsKernel; - cl_kernel m_sapKernel; - cl_kernel m_sap2Kernel; - cl_kernel m_prepareSumVarianceKernel; - - class b3RadixSort32CL* m_sorter; - - ///test for 3d SAP - b3AlignedObjectArray m_sortedAxisCPU[3][2]; - b3AlignedObjectArray m_objectMinMaxIndexCPU[3][2]; - b3OpenCLArray m_objectMinMaxIndexGPUaxis0; - b3OpenCLArray m_objectMinMaxIndexGPUaxis1; - b3OpenCLArray m_objectMinMaxIndexGPUaxis2; - b3OpenCLArray m_objectMinMaxIndexGPUaxis0prev; - b3OpenCLArray m_objectMinMaxIndexGPUaxis1prev; - b3OpenCLArray m_objectMinMaxIndexGPUaxis2prev; - - b3OpenCLArray m_sortedAxisGPU0; - b3OpenCLArray m_sortedAxisGPU1; - b3OpenCLArray m_sortedAxisGPU2; - b3OpenCLArray m_sortedAxisGPU0prev; - b3OpenCLArray m_sortedAxisGPU1prev; - b3OpenCLArray m_sortedAxisGPU2prev; - - b3OpenCLArray m_addedHostPairsGPU; - b3OpenCLArray m_removedHostPairsGPU; - b3OpenCLArray m_addedCountGPU; - b3OpenCLArray m_removedCountGPU; - - int m_currentBuffer; - -public: - b3OpenCLArray m_pairCount; - - b3OpenCLArray m_allAabbsGPU; - b3AlignedObjectArray m_allAabbsCPU; - - virtual b3OpenCLArray& getAllAabbsGPU() - { - return m_allAabbsGPU; - } - virtual b3AlignedObjectArray& getAllAabbsCPU() - { - return m_allAabbsCPU; - } - - b3OpenCLArray m_sum; - b3OpenCLArray m_sum2; - b3OpenCLArray m_dst; - - b3OpenCLArray m_smallAabbsMappingGPU; - b3AlignedObjectArray m_smallAabbsMappingCPU; - - b3OpenCLArray m_largeAabbsMappingGPU; - b3AlignedObjectArray m_largeAabbsMappingCPU; - - b3OpenCLArray m_overlappingPairs; - - //temporary gpu work memory - b3OpenCLArray m_gpuSmallSortData; - b3OpenCLArray m_gpuSmallSortedAabbs; - - class b3PrefixScanFloat4CL* m_prefixScanFloat4; - - enum b3GpuSapKernelType - { - B3_GPU_SAP_KERNEL_BRUTE_FORCE_CPU = 1, - B3_GPU_SAP_KERNEL_BRUTE_FORCE_GPU, - B3_GPU_SAP_KERNEL_ORIGINAL, - B3_GPU_SAP_KERNEL_BARRIER, - B3_GPU_SAP_KERNEL_LOCAL_SHARED_MEMORY - }; - - b3GpuSapBroadphase(cl_context ctx, cl_device_id device, cl_command_queue q, b3GpuSapKernelType kernelType = B3_GPU_SAP_KERNEL_LOCAL_SHARED_MEMORY); - virtual ~b3GpuSapBroadphase(); - - static b3GpuBroadphaseInterface* CreateFuncBruteForceCpu(cl_context ctx, cl_device_id device, cl_command_queue q) - { - return new b3GpuSapBroadphase(ctx, device, q, B3_GPU_SAP_KERNEL_BRUTE_FORCE_CPU); - } - - static b3GpuBroadphaseInterface* CreateFuncBruteForceGpu(cl_context ctx, cl_device_id device, cl_command_queue q) - { - return new b3GpuSapBroadphase(ctx, device, q, B3_GPU_SAP_KERNEL_BRUTE_FORCE_GPU); - } - - static b3GpuBroadphaseInterface* CreateFuncOriginal(cl_context ctx, cl_device_id device, cl_command_queue q) - { - return new b3GpuSapBroadphase(ctx, device, q, B3_GPU_SAP_KERNEL_ORIGINAL); - } - static b3GpuBroadphaseInterface* CreateFuncBarrier(cl_context ctx, cl_device_id device, cl_command_queue q) - { - return new b3GpuSapBroadphase(ctx, device, q, B3_GPU_SAP_KERNEL_BARRIER); - } - static b3GpuBroadphaseInterface* CreateFuncLocalMemory(cl_context ctx, cl_device_id device, cl_command_queue q) - { - return new b3GpuSapBroadphase(ctx, device, q, B3_GPU_SAP_KERNEL_LOCAL_SHARED_MEMORY); - } - - virtual void calculateOverlappingPairs(int maxPairs); - virtual void calculateOverlappingPairsHost(int maxPairs); - - void reset(); - - void init3dSap(); - virtual void calculateOverlappingPairsHostIncremental3Sap(); - - virtual void createProxy(const b3Vector3& aabbMin, const b3Vector3& aabbMax, int userPtr, int collisionFilterGroup, int collisionFilterMask); - virtual void createLargeProxy(const b3Vector3& aabbMin, const b3Vector3& aabbMax, int userPtr, int collisionFilterGroup, int collisionFilterMask); - - //call writeAabbsToGpu after done making all changes (createProxy etc) - virtual void writeAabbsToGpu(); - - virtual cl_mem getAabbBufferWS(); - virtual int getNumOverlap(); - virtual cl_mem getOverlappingPairBuffer(); - - virtual b3OpenCLArray& getOverlappingPairsGPU(); - virtual b3OpenCLArray& getSmallAabbIndicesGPU(); - virtual b3OpenCLArray& getLargeAabbIndicesGPU(); -}; - -#endif //B3_GPU_SAP_BROADPHASE_H \ No newline at end of file diff --git a/engine/inc/bullet/Bullet3OpenCL/BroadphaseCollision/b3SapAabb.h b/engine/inc/bullet/Bullet3OpenCL/BroadphaseCollision/b3SapAabb.h deleted file mode 100644 index 60570f26..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/BroadphaseCollision/b3SapAabb.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef B3_SAP_AABB_H -#define B3_SAP_AABB_H - -#include "Bullet3Common/b3Scalar.h" -#include "Bullet3Collision/BroadPhaseCollision/shared/b3Aabb.h" - -///just make sure that the b3Aabb is 16-byte aligned -B3_ATTRIBUTE_ALIGNED16(struct) -b3SapAabb : public b3Aabb{ - - }; - -#endif //B3_SAP_AABB_H diff --git a/engine/inc/bullet/Bullet3OpenCL/BroadphaseCollision/kernels/gridBroadphaseKernels.h b/engine/inc/bullet/Bullet3OpenCL/BroadphaseCollision/kernels/gridBroadphaseKernels.h deleted file mode 100644 index 01854177..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/BroadphaseCollision/kernels/gridBroadphaseKernels.h +++ /dev/null @@ -1,198 +0,0 @@ -//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project -static const char* gridBroadphaseCL = - "int getPosHash(int4 gridPos, __global float4* pParams)\n" - "{\n" - " int4 gridDim = *((__global int4*)(pParams + 1));\n" - " gridPos.x &= gridDim.x - 1;\n" - " gridPos.y &= gridDim.y - 1;\n" - " gridPos.z &= gridDim.z - 1;\n" - " int hash = gridPos.z * gridDim.y * gridDim.x + gridPos.y * gridDim.x + gridPos.x;\n" - " return hash;\n" - "} \n" - "int4 getGridPos(float4 worldPos, __global float4* pParams)\n" - "{\n" - " int4 gridPos;\n" - " int4 gridDim = *((__global int4*)(pParams + 1));\n" - " gridPos.x = (int)floor(worldPos.x * pParams[0].x) & (gridDim.x - 1);\n" - " gridPos.y = (int)floor(worldPos.y * pParams[0].y) & (gridDim.y - 1);\n" - " gridPos.z = (int)floor(worldPos.z * pParams[0].z) & (gridDim.z - 1);\n" - " return gridPos;\n" - "}\n" - "// calculate grid hash value for each body using its AABB\n" - "__kernel void kCalcHashAABB(int numObjects, __global float4* allpAABB, __global const int* smallAabbMapping, __global int2* pHash, __global float4* pParams )\n" - "{\n" - " int index = get_global_id(0);\n" - " if(index >= numObjects)\n" - " {\n" - " return;\n" - " }\n" - " float4 bbMin = allpAABB[smallAabbMapping[index]*2];\n" - " float4 bbMax = allpAABB[smallAabbMapping[index]*2 + 1];\n" - " float4 pos;\n" - " pos.x = (bbMin.x + bbMax.x) * 0.5f;\n" - " pos.y = (bbMin.y + bbMax.y) * 0.5f;\n" - " pos.z = (bbMin.z + bbMax.z) * 0.5f;\n" - " pos.w = 0.f;\n" - " // get address in grid\n" - " int4 gridPos = getGridPos(pos, pParams);\n" - " int gridHash = getPosHash(gridPos, pParams);\n" - " // store grid hash and body index\n" - " int2 hashVal;\n" - " hashVal.x = gridHash;\n" - " hashVal.y = index;\n" - " pHash[index] = hashVal;\n" - "}\n" - "__kernel void kClearCellStart( int numCells, \n" - " __global int* pCellStart )\n" - "{\n" - " int index = get_global_id(0);\n" - " if(index >= numCells)\n" - " {\n" - " return;\n" - " }\n" - " pCellStart[index] = -1;\n" - "}\n" - "__kernel void kFindCellStart(int numObjects, __global int2* pHash, __global int* cellStart )\n" - "{\n" - " __local int sharedHash[513];\n" - " int index = get_global_id(0);\n" - " int2 sortedData;\n" - " if(index < numObjects)\n" - " {\n" - " sortedData = pHash[index];\n" - " // Load hash data into shared memory so that we can look \n" - " // at neighboring body's hash value without loading\n" - " // two hash values per thread\n" - " sharedHash[get_local_id(0) + 1] = sortedData.x;\n" - " if((index > 0) && (get_local_id(0) == 0))\n" - " {\n" - " // first thread in block must load neighbor body hash\n" - " sharedHash[0] = pHash[index-1].x;\n" - " }\n" - " }\n" - " barrier(CLK_LOCAL_MEM_FENCE);\n" - " if(index < numObjects)\n" - " {\n" - " if((index == 0) || (sortedData.x != sharedHash[get_local_id(0)]))\n" - " {\n" - " cellStart[sortedData.x] = index;\n" - " }\n" - " }\n" - "}\n" - "int testAABBOverlap(float4 min0, float4 max0, float4 min1, float4 max1)\n" - "{\n" - " return (min0.x <= max1.x)&& (min1.x <= max0.x) && \n" - " (min0.y <= max1.y)&& (min1.y <= max0.y) && \n" - " (min0.z <= max1.z)&& (min1.z <= max0.z); \n" - "}\n" - "//search for AABB 'index' against other AABBs' in this cell\n" - "void findPairsInCell( int numObjects,\n" - " int4 gridPos,\n" - " int index,\n" - " __global int2* pHash,\n" - " __global int* pCellStart,\n" - " __global float4* allpAABB, \n" - " __global const int* smallAabbMapping,\n" - " __global float4* pParams,\n" - " volatile __global int* pairCount,\n" - " __global int4* pPairBuff2,\n" - " int maxPairs\n" - " )\n" - "{\n" - " int4 pGridDim = *((__global int4*)(pParams + 1));\n" - " int maxBodiesPerCell = pGridDim.w;\n" - " int gridHash = getPosHash(gridPos, pParams);\n" - " // get start of bucket for this cell\n" - " int bucketStart = pCellStart[gridHash];\n" - " if (bucketStart == -1)\n" - " {\n" - " return; // cell empty\n" - " }\n" - " // iterate over bodies in this cell\n" - " int2 sortedData = pHash[index];\n" - " int unsorted_indx = sortedData.y;\n" - " float4 min0 = allpAABB[smallAabbMapping[unsorted_indx]*2 + 0]; \n" - " float4 max0 = allpAABB[smallAabbMapping[unsorted_indx]*2 + 1];\n" - " int handleIndex = as_int(min0.w);\n" - " \n" - " int bucketEnd = bucketStart + maxBodiesPerCell;\n" - " bucketEnd = (bucketEnd > numObjects) ? numObjects : bucketEnd;\n" - " for(int index2 = bucketStart; index2 < bucketEnd; index2++) \n" - " {\n" - " int2 cellData = pHash[index2];\n" - " if (cellData.x != gridHash)\n" - " {\n" - " break; // no longer in same bucket\n" - " }\n" - " int unsorted_indx2 = cellData.y;\n" - " //if (unsorted_indx2 < unsorted_indx) // check not colliding with self\n" - " if (unsorted_indx2 != unsorted_indx) // check not colliding with self\n" - " { \n" - " float4 min1 = allpAABB[smallAabbMapping[unsorted_indx2]*2 + 0];\n" - " float4 max1 = allpAABB[smallAabbMapping[unsorted_indx2]*2 + 1];\n" - " if(testAABBOverlap(min0, max0, min1, max1))\n" - " {\n" - " if (pairCount)\n" - " {\n" - " int handleIndex2 = as_int(min1.w);\n" - " if (handleIndex= numObjects)\n" - " {\n" - " return;\n" - " }\n" - " int2 sortedData = pHash[index];\n" - " int unsorted_indx = sortedData.y;\n" - " float4 bbMin = allpAABB[smallAabbMapping[unsorted_indx]*2 + 0];\n" - " float4 bbMax = allpAABB[smallAabbMapping[unsorted_indx]*2 + 1];\n" - " float4 pos;\n" - " pos.x = (bbMin.x + bbMax.x) * 0.5f;\n" - " pos.y = (bbMin.y + bbMax.y) * 0.5f;\n" - " pos.z = (bbMin.z + bbMax.z) * 0.5f;\n" - " // get address in grid\n" - " int4 gridPosA = getGridPos(pos, pParams);\n" - " int4 gridPosB; \n" - " // examine only neighbouring cells\n" - " for(int z=-1; z<=1; z++) \n" - " {\n" - " gridPosB.z = gridPosA.z + z;\n" - " for(int y=-1; y<=1; y++) \n" - " {\n" - " gridPosB.y = gridPosA.y + y;\n" - " for(int x=-1; x<=1; x++) \n" - " {\n" - " gridPosB.x = gridPosA.x + x;\n" - " findPairsInCell(numObjects, gridPosB, index, pHash, pCellStart, allpAABB,smallAabbMapping, pParams, pairCount,pPairBuff2, maxPairs);\n" - " }\n" - " }\n" - " }\n" - "}\n"; diff --git a/engine/inc/bullet/Bullet3OpenCL/BroadphaseCollision/kernels/parallelLinearBvhKernels.h b/engine/inc/bullet/Bullet3OpenCL/BroadphaseCollision/kernels/parallelLinearBvhKernels.h deleted file mode 100644 index c02877dd..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/BroadphaseCollision/kernels/parallelLinearBvhKernels.h +++ /dev/null @@ -1,728 +0,0 @@ -//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project -static const char* parallelLinearBvhCL = - "/*\n" - "This software is provided 'as-is', without any express or implied warranty.\n" - "In no event will the authors be held liable for any damages arising from the use of this software.\n" - "Permission is granted to anyone to use this software for any purpose,\n" - "including commercial applications, and to alter it and redistribute it freely,\n" - "subject to the following restrictions:\n" - "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.\n" - "2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.\n" - "3. This notice may not be removed or altered from any source distribution.\n" - "*/\n" - "//Initial Author Jackson Lee, 2014\n" - "typedef float b3Scalar;\n" - "typedef float4 b3Vector3;\n" - "#define b3Max max\n" - "#define b3Min min\n" - "#define b3Sqrt sqrt\n" - "typedef struct\n" - "{\n" - " unsigned int m_key;\n" - " unsigned int m_value;\n" - "} SortDataCL;\n" - "typedef struct \n" - "{\n" - " union\n" - " {\n" - " float4 m_min;\n" - " float m_minElems[4];\n" - " int m_minIndices[4];\n" - " };\n" - " union\n" - " {\n" - " float4 m_max;\n" - " float m_maxElems[4];\n" - " int m_maxIndices[4];\n" - " };\n" - "} b3AabbCL;\n" - "unsigned int interleaveBits(unsigned int x)\n" - "{\n" - " //........ ........ ......12 3456789A //x\n" - " //....1..2 ..3..4.. 5..6..7. .8..9..A //x after interleaving bits\n" - " \n" - " //......12 3456789A ......12 3456789A //x ^ (x << 16)\n" - " //11111111 ........ ........ 11111111 //0x FF 00 00 FF\n" - " //......12 ........ ........ 3456789A //x = (x ^ (x << 16)) & 0xFF0000FF;\n" - " \n" - " //......12 ........ 3456789A 3456789A //x ^ (x << 8)\n" - " //......11 ........ 1111.... ....1111 //0x 03 00 F0 0F\n" - " //......12 ........ 3456.... ....789A //x = (x ^ (x << 8)) & 0x0300F00F;\n" - " \n" - " //..12..12 ....3456 3456.... 789A789A //x ^ (x << 4)\n" - " //......11 ....11.. ..11.... 11....11 //0x 03 0C 30 C3\n" - " //......12 ....34.. ..56.... 78....9A //x = (x ^ (x << 4)) & 0x030C30C3;\n" - " \n" - " //....1212 ..3434.. 5656..78 78..9A9A //x ^ (x << 2)\n" - " //....1..1 ..1..1.. 1..1..1. .1..1..1 //0x 09 24 92 49\n" - " //....1..2 ..3..4.. 5..6..7. .8..9..A //x = (x ^ (x << 2)) & 0x09249249;\n" - " \n" - " //........ ........ ......11 11111111 //0x000003FF\n" - " x &= 0x000003FF; //Clear all bits above bit 10\n" - " \n" - " x = (x ^ (x << 16)) & 0xFF0000FF;\n" - " x = (x ^ (x << 8)) & 0x0300F00F;\n" - " x = (x ^ (x << 4)) & 0x030C30C3;\n" - " x = (x ^ (x << 2)) & 0x09249249;\n" - " \n" - " return x;\n" - "}\n" - "unsigned int getMortonCode(unsigned int x, unsigned int y, unsigned int z)\n" - "{\n" - " return interleaveBits(x) << 0 | interleaveBits(y) << 1 | interleaveBits(z) << 2;\n" - "}\n" - "__kernel void separateAabbs(__global b3AabbCL* unseparatedAabbs, __global int* aabbIndices, __global b3AabbCL* out_aabbs, int numAabbsToSeparate)\n" - "{\n" - " int separatedAabbIndex = get_global_id(0);\n" - " if(separatedAabbIndex >= numAabbsToSeparate) return;\n" - " int unseparatedAabbIndex = aabbIndices[separatedAabbIndex];\n" - " out_aabbs[separatedAabbIndex] = unseparatedAabbs[unseparatedAabbIndex];\n" - "}\n" - "//Should replace with an optimized parallel reduction\n" - "__kernel void findAllNodesMergedAabb(__global b3AabbCL* out_mergedAabb, int numAabbsNeedingMerge)\n" - "{\n" - " //Each time this kernel is added to the command queue, \n" - " //the number of AABBs needing to be merged is halved\n" - " //\n" - " //Example with 159 AABBs:\n" - " // numRemainingAabbs == 159 / 2 + 159 % 2 == 80\n" - " // numMergedAabbs == 159 - 80 == 79\n" - " //So, indices [0, 78] are merged with [0 + 80, 78 + 80]\n" - " \n" - " int numRemainingAabbs = numAabbsNeedingMerge / 2 + numAabbsNeedingMerge % 2;\n" - " int numMergedAabbs = numAabbsNeedingMerge - numRemainingAabbs;\n" - " \n" - " int aabbIndex = get_global_id(0);\n" - " if(aabbIndex >= numMergedAabbs) return;\n" - " \n" - " int otherAabbIndex = aabbIndex + numRemainingAabbs;\n" - " \n" - " b3AabbCL aabb = out_mergedAabb[aabbIndex];\n" - " b3AabbCL otherAabb = out_mergedAabb[otherAabbIndex];\n" - " \n" - " b3AabbCL mergedAabb;\n" - " mergedAabb.m_min = b3Min(aabb.m_min, otherAabb.m_min);\n" - " mergedAabb.m_max = b3Max(aabb.m_max, otherAabb.m_max);\n" - " out_mergedAabb[aabbIndex] = mergedAabb;\n" - "}\n" - "__kernel void assignMortonCodesAndAabbIndicies(__global b3AabbCL* worldSpaceAabbs, __global b3AabbCL* mergedAabbOfAllNodes, \n" - " __global SortDataCL* out_mortonCodesAndAabbIndices, int numAabbs)\n" - "{\n" - " int leafNodeIndex = get_global_id(0); //Leaf node index == AABB index\n" - " if(leafNodeIndex >= numAabbs) return;\n" - " \n" - " b3AabbCL mergedAabb = mergedAabbOfAllNodes[0];\n" - " b3Vector3 gridCenter = (mergedAabb.m_min + mergedAabb.m_max) * 0.5f;\n" - " b3Vector3 gridCellSize = (mergedAabb.m_max - mergedAabb.m_min) / (float)1024;\n" - " \n" - " b3AabbCL aabb = worldSpaceAabbs[leafNodeIndex];\n" - " b3Vector3 aabbCenter = (aabb.m_min + aabb.m_max) * 0.5f;\n" - " b3Vector3 aabbCenterRelativeToGrid = aabbCenter - gridCenter;\n" - " \n" - " //Quantize into integer coordinates\n" - " //floor() is needed to prevent the center cell, at (0,0,0) from being twice the size\n" - " b3Vector3 gridPosition = aabbCenterRelativeToGrid / gridCellSize;\n" - " \n" - " int4 discretePosition;\n" - " discretePosition.x = (int)( (gridPosition.x >= 0.0f) ? gridPosition.x : floor(gridPosition.x) );\n" - " discretePosition.y = (int)( (gridPosition.y >= 0.0f) ? gridPosition.y : floor(gridPosition.y) );\n" - " discretePosition.z = (int)( (gridPosition.z >= 0.0f) ? gridPosition.z : floor(gridPosition.z) );\n" - " \n" - " //Clamp coordinates into [-512, 511], then convert range from [-512, 511] to [0, 1023]\n" - " discretePosition = b3Max( -512, b3Min(discretePosition, 511) );\n" - " discretePosition += 512;\n" - " \n" - " //Interleave bits(assign a morton code, also known as a z-curve)\n" - " unsigned int mortonCode = getMortonCode(discretePosition.x, discretePosition.y, discretePosition.z);\n" - " \n" - " //\n" - " SortDataCL mortonCodeIndexPair;\n" - " mortonCodeIndexPair.m_key = mortonCode;\n" - " mortonCodeIndexPair.m_value = leafNodeIndex;\n" - " \n" - " out_mortonCodesAndAabbIndices[leafNodeIndex] = mortonCodeIndexPair;\n" - "}\n" - "#define B3_PLVBH_TRAVERSE_MAX_STACK_SIZE 128\n" - "//The most significant bit(0x80000000) of a int32 is used to distinguish between leaf and internal nodes.\n" - "//If it is set, then the index is for an internal node; otherwise, it is a leaf node. \n" - "//In both cases, the bit should be cleared to access the actual node index.\n" - "int isLeafNode(int index) { return (index >> 31 == 0); }\n" - "int getIndexWithInternalNodeMarkerRemoved(int index) { return index & (~0x80000000); }\n" - "int getIndexWithInternalNodeMarkerSet(int isLeaf, int index) { return (isLeaf) ? index : (index | 0x80000000); }\n" - "//From sap.cl\n" - "#define NEW_PAIR_MARKER -1\n" - "bool TestAabbAgainstAabb2(const b3AabbCL* aabb1, const b3AabbCL* aabb2)\n" - "{\n" - " bool overlap = true;\n" - " overlap = (aabb1->m_min.x > aabb2->m_max.x || aabb1->m_max.x < aabb2->m_min.x) ? false : overlap;\n" - " overlap = (aabb1->m_min.z > aabb2->m_max.z || aabb1->m_max.z < aabb2->m_min.z) ? false : overlap;\n" - " overlap = (aabb1->m_min.y > aabb2->m_max.y || aabb1->m_max.y < aabb2->m_min.y) ? false : overlap;\n" - " return overlap;\n" - "}\n" - "//From sap.cl\n" - "__kernel void plbvhCalculateOverlappingPairs(__global b3AabbCL* rigidAabbs, \n" - " __global int* rootNodeIndex, \n" - " __global int2* internalNodeChildIndices, \n" - " __global b3AabbCL* internalNodeAabbs,\n" - " __global int2* internalNodeLeafIndexRanges,\n" - " \n" - " __global SortDataCL* mortonCodesAndAabbIndices,\n" - " __global int* out_numPairs, __global int4* out_overlappingPairs, \n" - " int maxPairs, int numQueryAabbs)\n" - "{\n" - " //Using get_group_id()/get_local_id() is Faster than get_global_id(0) since\n" - " //mortonCodesAndAabbIndices[] contains rigid body indices sorted along the z-curve (more spatially coherent)\n" - " int queryBvhNodeIndex = get_group_id(0) * get_local_size(0) + get_local_id(0);\n" - " if(queryBvhNodeIndex >= numQueryAabbs) return;\n" - " \n" - " int queryRigidIndex = mortonCodesAndAabbIndices[queryBvhNodeIndex].m_value;\n" - " b3AabbCL queryAabb = rigidAabbs[queryRigidIndex];\n" - " \n" - " int stack[B3_PLVBH_TRAVERSE_MAX_STACK_SIZE];\n" - " \n" - " int stackSize = 1;\n" - " stack[0] = *rootNodeIndex;\n" - " \n" - " while(stackSize)\n" - " {\n" - " int internalOrLeafNodeIndex = stack[ stackSize - 1 ];\n" - " --stackSize;\n" - " \n" - " int isLeaf = isLeafNode(internalOrLeafNodeIndex); //Internal node if false\n" - " int bvhNodeIndex = getIndexWithInternalNodeMarkerRemoved(internalOrLeafNodeIndex);\n" - " \n" - " //Optimization - if the BVH is structured as a binary radix tree, then\n" - " //each internal node corresponds to a contiguous range of leaf nodes(internalNodeLeafIndexRanges[]).\n" - " //This can be used to avoid testing each AABB-AABB pair twice, including preventing each node from colliding with itself.\n" - " {\n" - " int highestLeafIndex = (isLeaf) ? bvhNodeIndex : internalNodeLeafIndexRanges[bvhNodeIndex].y;\n" - " if(highestLeafIndex <= queryBvhNodeIndex) continue;\n" - " }\n" - " \n" - " //bvhRigidIndex is not used if internal node\n" - " int bvhRigidIndex = (isLeaf) ? mortonCodesAndAabbIndices[bvhNodeIndex].m_value : -1;\n" - " \n" - " b3AabbCL bvhNodeAabb = (isLeaf) ? rigidAabbs[bvhRigidIndex] : internalNodeAabbs[bvhNodeIndex];\n" - " if( TestAabbAgainstAabb2(&queryAabb, &bvhNodeAabb) )\n" - " {\n" - " if(isLeaf)\n" - " {\n" - " int4 pair;\n" - " pair.x = rigidAabbs[queryRigidIndex].m_minIndices[3];\n" - " pair.y = rigidAabbs[bvhRigidIndex].m_minIndices[3];\n" - " pair.z = NEW_PAIR_MARKER;\n" - " pair.w = NEW_PAIR_MARKER;\n" - " \n" - " int pairIndex = atomic_inc(out_numPairs);\n" - " if(pairIndex < maxPairs) out_overlappingPairs[pairIndex] = pair;\n" - " }\n" - " \n" - " if(!isLeaf) //Internal node\n" - " {\n" - " if(stackSize + 2 > B3_PLVBH_TRAVERSE_MAX_STACK_SIZE)\n" - " {\n" - " //Error\n" - " }\n" - " else\n" - " {\n" - " stack[ stackSize++ ] = internalNodeChildIndices[bvhNodeIndex].x;\n" - " stack[ stackSize++ ] = internalNodeChildIndices[bvhNodeIndex].y;\n" - " }\n" - " }\n" - " }\n" - " \n" - " }\n" - "}\n" - "//From rayCastKernels.cl\n" - "typedef struct\n" - "{\n" - " float4 m_from;\n" - " float4 m_to;\n" - "} b3RayInfo;\n" - "//From rayCastKernels.cl\n" - "b3Vector3 b3Vector3_normalize(b3Vector3 v)\n" - "{\n" - " b3Vector3 normal = (b3Vector3){v.x, v.y, v.z, 0.f};\n" - " return normalize(normal); //OpenCL normalize == vector4 normalize\n" - "}\n" - "b3Scalar b3Vector3_length2(b3Vector3 v) { return v.x*v.x + v.y*v.y + v.z*v.z; }\n" - "b3Scalar b3Vector3_dot(b3Vector3 a, b3Vector3 b) { return a.x*b.x + a.y*b.y + a.z*b.z; }\n" - "int rayIntersectsAabb(b3Vector3 rayOrigin, b3Scalar rayLength, b3Vector3 rayNormalizedDirection, b3AabbCL aabb)\n" - "{\n" - " //AABB is considered as 3 pairs of 2 planes( {x_min, x_max}, {y_min, y_max}, {z_min, z_max} ).\n" - " //t_min is the point of intersection with the closer plane, t_max is the point of intersection with the farther plane.\n" - " //\n" - " //if (rayNormalizedDirection.x < 0.0f), then max.x will be the near plane \n" - " //and min.x will be the far plane; otherwise, it is reversed.\n" - " //\n" - " //In order for there to be a collision, the t_min and t_max of each pair must overlap.\n" - " //This can be tested for by selecting the highest t_min and lowest t_max and comparing them.\n" - " \n" - " int4 isNegative = isless( rayNormalizedDirection, ((b3Vector3){0.0f, 0.0f, 0.0f, 0.0f}) ); //isless(x,y) returns (x < y)\n" - " \n" - " //When using vector types, the select() function checks the most signficant bit, \n" - " //but isless() sets the least significant bit.\n" - " isNegative <<= 31;\n" - " //select(b, a, condition) == condition ? a : b\n" - " //When using select() with vector types, (condition[i]) is true if its most significant bit is 1\n" - " b3Vector3 t_min = ( select(aabb.m_min, aabb.m_max, isNegative) - rayOrigin ) / rayNormalizedDirection;\n" - " b3Vector3 t_max = ( select(aabb.m_max, aabb.m_min, isNegative) - rayOrigin ) / rayNormalizedDirection;\n" - " \n" - " b3Scalar t_min_final = 0.0f;\n" - " b3Scalar t_max_final = rayLength;\n" - " \n" - " //Must use fmin()/fmax(); if one of the parameters is NaN, then the parameter that is not NaN is returned. \n" - " //Behavior of min()/max() with NaNs is undefined. (See OpenCL Specification 1.2 [6.12.2] and [6.12.4])\n" - " //Since the innermost fmin()/fmax() is always not NaN, this should never return NaN.\n" - " t_min_final = fmax( t_min.z, fmax(t_min.y, fmax(t_min.x, t_min_final)) );\n" - " t_max_final = fmin( t_max.z, fmin(t_max.y, fmin(t_max.x, t_max_final)) );\n" - " \n" - " return (t_min_final <= t_max_final);\n" - "}\n" - "__kernel void plbvhRayTraverse(__global b3AabbCL* rigidAabbs,\n" - " __global int* rootNodeIndex, \n" - " __global int2* internalNodeChildIndices, \n" - " __global b3AabbCL* internalNodeAabbs,\n" - " __global int2* internalNodeLeafIndexRanges,\n" - " __global SortDataCL* mortonCodesAndAabbIndices,\n" - " \n" - " __global b3RayInfo* rays,\n" - " \n" - " __global int* out_numRayRigidPairs, \n" - " __global int2* out_rayRigidPairs,\n" - " int maxRayRigidPairs, int numRays)\n" - "{\n" - " int rayIndex = get_global_id(0);\n" - " if(rayIndex >= numRays) return;\n" - " \n" - " //\n" - " b3Vector3 rayFrom = rays[rayIndex].m_from;\n" - " b3Vector3 rayTo = rays[rayIndex].m_to;\n" - " b3Vector3 rayNormalizedDirection = b3Vector3_normalize(rayTo - rayFrom);\n" - " b3Scalar rayLength = b3Sqrt( b3Vector3_length2(rayTo - rayFrom) );\n" - " \n" - " //\n" - " int stack[B3_PLVBH_TRAVERSE_MAX_STACK_SIZE];\n" - " \n" - " int stackSize = 1;\n" - " stack[0] = *rootNodeIndex;\n" - " \n" - " while(stackSize)\n" - " {\n" - " int internalOrLeafNodeIndex = stack[ stackSize - 1 ];\n" - " --stackSize;\n" - " \n" - " int isLeaf = isLeafNode(internalOrLeafNodeIndex); //Internal node if false\n" - " int bvhNodeIndex = getIndexWithInternalNodeMarkerRemoved(internalOrLeafNodeIndex);\n" - " \n" - " //bvhRigidIndex is not used if internal node\n" - " int bvhRigidIndex = (isLeaf) ? mortonCodesAndAabbIndices[bvhNodeIndex].m_value : -1;\n" - " \n" - " b3AabbCL bvhNodeAabb = (isLeaf) ? rigidAabbs[bvhRigidIndex] : internalNodeAabbs[bvhNodeIndex];\n" - " if( rayIntersectsAabb(rayFrom, rayLength, rayNormalizedDirection, bvhNodeAabb) )\n" - " {\n" - " if(isLeaf)\n" - " {\n" - " int2 rayRigidPair;\n" - " rayRigidPair.x = rayIndex;\n" - " rayRigidPair.y = rigidAabbs[bvhRigidIndex].m_minIndices[3];\n" - " \n" - " int pairIndex = atomic_inc(out_numRayRigidPairs);\n" - " if(pairIndex < maxRayRigidPairs) out_rayRigidPairs[pairIndex] = rayRigidPair;\n" - " }\n" - " \n" - " if(!isLeaf) //Internal node\n" - " {\n" - " if(stackSize + 2 > B3_PLVBH_TRAVERSE_MAX_STACK_SIZE)\n" - " {\n" - " //Error\n" - " }\n" - " else\n" - " {\n" - " stack[ stackSize++ ] = internalNodeChildIndices[bvhNodeIndex].x;\n" - " stack[ stackSize++ ] = internalNodeChildIndices[bvhNodeIndex].y;\n" - " }\n" - " }\n" - " }\n" - " }\n" - "}\n" - "__kernel void plbvhLargeAabbAabbTest(__global b3AabbCL* smallAabbs, __global b3AabbCL* largeAabbs, \n" - " __global int* out_numPairs, __global int4* out_overlappingPairs, \n" - " int maxPairs, int numLargeAabbRigids, int numSmallAabbRigids)\n" - "{\n" - " int smallAabbIndex = get_global_id(0);\n" - " if(smallAabbIndex >= numSmallAabbRigids) return;\n" - " \n" - " b3AabbCL smallAabb = smallAabbs[smallAabbIndex];\n" - " for(int i = 0; i < numLargeAabbRigids; ++i)\n" - " {\n" - " b3AabbCL largeAabb = largeAabbs[i];\n" - " if( TestAabbAgainstAabb2(&smallAabb, &largeAabb) )\n" - " {\n" - " int4 pair;\n" - " pair.x = largeAabb.m_minIndices[3];\n" - " pair.y = smallAabb.m_minIndices[3];\n" - " pair.z = NEW_PAIR_MARKER;\n" - " pair.w = NEW_PAIR_MARKER;\n" - " \n" - " int pairIndex = atomic_inc(out_numPairs);\n" - " if(pairIndex < maxPairs) out_overlappingPairs[pairIndex] = pair;\n" - " }\n" - " }\n" - "}\n" - "__kernel void plbvhLargeAabbRayTest(__global b3AabbCL* largeRigidAabbs, __global b3RayInfo* rays,\n" - " __global int* out_numRayRigidPairs, __global int2* out_rayRigidPairs,\n" - " int numLargeAabbRigids, int maxRayRigidPairs, int numRays)\n" - "{\n" - " int rayIndex = get_global_id(0);\n" - " if(rayIndex >= numRays) return;\n" - " \n" - " b3Vector3 rayFrom = rays[rayIndex].m_from;\n" - " b3Vector3 rayTo = rays[rayIndex].m_to;\n" - " b3Vector3 rayNormalizedDirection = b3Vector3_normalize(rayTo - rayFrom);\n" - " b3Scalar rayLength = b3Sqrt( b3Vector3_length2(rayTo - rayFrom) );\n" - " \n" - " for(int i = 0; i < numLargeAabbRigids; ++i)\n" - " {\n" - " b3AabbCL rigidAabb = largeRigidAabbs[i];\n" - " if( rayIntersectsAabb(rayFrom, rayLength, rayNormalizedDirection, rigidAabb) )\n" - " {\n" - " int2 rayRigidPair;\n" - " rayRigidPair.x = rayIndex;\n" - " rayRigidPair.y = rigidAabb.m_minIndices[3];\n" - " \n" - " int pairIndex = atomic_inc(out_numRayRigidPairs);\n" - " if(pairIndex < maxRayRigidPairs) out_rayRigidPairs[pairIndex] = rayRigidPair;\n" - " }\n" - " }\n" - "}\n" - "//Set so that it is always greater than the actual common prefixes, and never selected as a parent node.\n" - "//If there are no duplicates, then the highest common prefix is 32 or 64, depending on the number of bits used for the z-curve.\n" - "//Duplicate common prefixes increase the highest common prefix at most by the number of bits used to index the leaf node.\n" - "//Since 32 bit ints are used to index leaf nodes, the max prefix is 64(32 + 32 bit z-curve) or 96(32 + 64 bit z-curve).\n" - "#define B3_PLBVH_INVALID_COMMON_PREFIX 128\n" - "#define B3_PLBVH_ROOT_NODE_MARKER -1\n" - "#define b3Int64 long\n" - "int computeCommonPrefixLength(b3Int64 i, b3Int64 j) { return (int)clz(i ^ j); }\n" - "b3Int64 computeCommonPrefix(b3Int64 i, b3Int64 j) \n" - "{\n" - " //This function only needs to return (i & j) in order for the algorithm to work,\n" - " //but it may help with debugging to mask out the lower bits.\n" - " b3Int64 commonPrefixLength = (b3Int64)computeCommonPrefixLength(i, j);\n" - " b3Int64 sharedBits = i & j;\n" - " b3Int64 bitmask = ((b3Int64)(~0)) << (64 - commonPrefixLength); //Set all bits after the common prefix to 0\n" - " \n" - " return sharedBits & bitmask;\n" - "}\n" - "//Same as computeCommonPrefixLength(), but allows for prefixes with different lengths\n" - "int getSharedPrefixLength(b3Int64 prefixA, int prefixLengthA, b3Int64 prefixB, int prefixLengthB)\n" - "{\n" - " return b3Min( computeCommonPrefixLength(prefixA, prefixB), b3Min(prefixLengthA, prefixLengthB) );\n" - "}\n" - "__kernel void computeAdjacentPairCommonPrefix(__global SortDataCL* mortonCodesAndAabbIndices,\n" - " __global b3Int64* out_commonPrefixes,\n" - " __global int* out_commonPrefixLengths,\n" - " int numInternalNodes)\n" - "{\n" - " int internalNodeIndex = get_global_id(0);\n" - " if (internalNodeIndex >= numInternalNodes) return;\n" - " \n" - " //Here, (internalNodeIndex + 1) is never out of bounds since it is a leaf node index,\n" - " //and the number of internal nodes is always numLeafNodes - 1\n" - " int leftLeafIndex = internalNodeIndex;\n" - " int rightLeafIndex = internalNodeIndex + 1;\n" - " \n" - " int leftLeafMortonCode = mortonCodesAndAabbIndices[leftLeafIndex].m_key;\n" - " int rightLeafMortonCode = mortonCodesAndAabbIndices[rightLeafIndex].m_key;\n" - " \n" - " //Binary radix tree construction algorithm does not work if there are duplicate morton codes.\n" - " //Append the index of each leaf node to each morton code so that there are no duplicates.\n" - " //The algorithm also requires that the morton codes are sorted in ascending order; this requirement\n" - " //is also satisfied with this method, as (leftLeafIndex < rightLeafIndex) is always true.\n" - " //\n" - " //upsample(a, b) == ( ((b3Int64)a) << 32) | b\n" - " b3Int64 nonduplicateLeftMortonCode = upsample(leftLeafMortonCode, leftLeafIndex);\n" - " b3Int64 nonduplicateRightMortonCode = upsample(rightLeafMortonCode, rightLeafIndex);\n" - " \n" - " out_commonPrefixes[internalNodeIndex] = computeCommonPrefix(nonduplicateLeftMortonCode, nonduplicateRightMortonCode);\n" - " out_commonPrefixLengths[internalNodeIndex] = computeCommonPrefixLength(nonduplicateLeftMortonCode, nonduplicateRightMortonCode);\n" - "}\n" - "__kernel void buildBinaryRadixTreeLeafNodes(__global int* commonPrefixLengths, __global int* out_leafNodeParentNodes,\n" - " __global int2* out_childNodes, int numLeafNodes)\n" - "{\n" - " int leafNodeIndex = get_global_id(0);\n" - " if (leafNodeIndex >= numLeafNodes) return;\n" - " \n" - " int numInternalNodes = numLeafNodes - 1;\n" - " \n" - " int leftSplitIndex = leafNodeIndex - 1;\n" - " int rightSplitIndex = leafNodeIndex;\n" - " \n" - " int leftCommonPrefix = (leftSplitIndex >= 0) ? commonPrefixLengths[leftSplitIndex] : B3_PLBVH_INVALID_COMMON_PREFIX;\n" - " int rightCommonPrefix = (rightSplitIndex < numInternalNodes) ? commonPrefixLengths[rightSplitIndex] : B3_PLBVH_INVALID_COMMON_PREFIX;\n" - " \n" - " //Parent node is the highest adjacent common prefix that is lower than the node's common prefix\n" - " //Leaf nodes are considered as having the highest common prefix\n" - " int isLeftHigherCommonPrefix = (leftCommonPrefix > rightCommonPrefix);\n" - " \n" - " //Handle cases for the edge nodes; the first and last node\n" - " //For leaf nodes, leftCommonPrefix and rightCommonPrefix should never both be B3_PLBVH_INVALID_COMMON_PREFIX\n" - " if(leftCommonPrefix == B3_PLBVH_INVALID_COMMON_PREFIX) isLeftHigherCommonPrefix = false;\n" - " if(rightCommonPrefix == B3_PLBVH_INVALID_COMMON_PREFIX) isLeftHigherCommonPrefix = true;\n" - " \n" - " int parentNodeIndex = (isLeftHigherCommonPrefix) ? leftSplitIndex : rightSplitIndex;\n" - " out_leafNodeParentNodes[leafNodeIndex] = parentNodeIndex;\n" - " \n" - " int isRightChild = (isLeftHigherCommonPrefix); //If the left node is the parent, then this node is its right child and vice versa\n" - " \n" - " //out_childNodesAsInt[0] == int2.x == left child\n" - " //out_childNodesAsInt[1] == int2.y == right child\n" - " int isLeaf = 1;\n" - " __global int* out_childNodesAsInt = (__global int*)(&out_childNodes[parentNodeIndex]);\n" - " out_childNodesAsInt[isRightChild] = getIndexWithInternalNodeMarkerSet(isLeaf, leafNodeIndex);\n" - "}\n" - "__kernel void buildBinaryRadixTreeInternalNodes(__global b3Int64* commonPrefixes, __global int* commonPrefixLengths,\n" - " __global int2* out_childNodes,\n" - " __global int* out_internalNodeParentNodes, __global int* out_rootNodeIndex,\n" - " int numInternalNodes)\n" - "{\n" - " int internalNodeIndex = get_group_id(0) * get_local_size(0) + get_local_id(0);\n" - " if(internalNodeIndex >= numInternalNodes) return;\n" - " \n" - " b3Int64 nodePrefix = commonPrefixes[internalNodeIndex];\n" - " int nodePrefixLength = commonPrefixLengths[internalNodeIndex];\n" - " \n" - "//#define USE_LINEAR_SEARCH\n" - "#ifdef USE_LINEAR_SEARCH\n" - " int leftIndex = -1;\n" - " int rightIndex = -1;\n" - " \n" - " //Find nearest element to left with a lower common prefix\n" - " for(int i = internalNodeIndex - 1; i >= 0; --i)\n" - " {\n" - " int nodeLeftSharedPrefixLength = getSharedPrefixLength(nodePrefix, nodePrefixLength, commonPrefixes[i], commonPrefixLengths[i]);\n" - " if(nodeLeftSharedPrefixLength < nodePrefixLength)\n" - " {\n" - " leftIndex = i;\n" - " break;\n" - " }\n" - " }\n" - " \n" - " //Find nearest element to right with a lower common prefix\n" - " for(int i = internalNodeIndex + 1; i < numInternalNodes; ++i)\n" - " {\n" - " int nodeRightSharedPrefixLength = getSharedPrefixLength(nodePrefix, nodePrefixLength, commonPrefixes[i], commonPrefixLengths[i]);\n" - " if(nodeRightSharedPrefixLength < nodePrefixLength)\n" - " {\n" - " rightIndex = i;\n" - " break;\n" - " }\n" - " }\n" - " \n" - "#else //Use binary search\n" - " //Find nearest element to left with a lower common prefix\n" - " int leftIndex = -1;\n" - " {\n" - " int lower = 0;\n" - " int upper = internalNodeIndex - 1;\n" - " \n" - " while(lower <= upper)\n" - " {\n" - " int mid = (lower + upper) / 2;\n" - " b3Int64 midPrefix = commonPrefixes[mid];\n" - " int midPrefixLength = commonPrefixLengths[mid];\n" - " \n" - " int nodeMidSharedPrefixLength = getSharedPrefixLength(nodePrefix, nodePrefixLength, midPrefix, midPrefixLength);\n" - " if(nodeMidSharedPrefixLength < nodePrefixLength) \n" - " {\n" - " int right = mid + 1;\n" - " if(right < internalNodeIndex)\n" - " {\n" - " b3Int64 rightPrefix = commonPrefixes[right];\n" - " int rightPrefixLength = commonPrefixLengths[right];\n" - " \n" - " int nodeRightSharedPrefixLength = getSharedPrefixLength(nodePrefix, nodePrefixLength, rightPrefix, rightPrefixLength);\n" - " if(nodeRightSharedPrefixLength < nodePrefixLength) \n" - " {\n" - " lower = right;\n" - " leftIndex = right;\n" - " }\n" - " else \n" - " {\n" - " leftIndex = mid;\n" - " break;\n" - " }\n" - " }\n" - " else \n" - " {\n" - " leftIndex = mid;\n" - " break;\n" - " }\n" - " }\n" - " else upper = mid - 1;\n" - " }\n" - " }\n" - " \n" - " //Find nearest element to right with a lower common prefix\n" - " int rightIndex = -1;\n" - " {\n" - " int lower = internalNodeIndex + 1;\n" - " int upper = numInternalNodes - 1;\n" - " \n" - " while(lower <= upper)\n" - " {\n" - " int mid = (lower + upper) / 2;\n" - " b3Int64 midPrefix = commonPrefixes[mid];\n" - " int midPrefixLength = commonPrefixLengths[mid];\n" - " \n" - " int nodeMidSharedPrefixLength = getSharedPrefixLength(nodePrefix, nodePrefixLength, midPrefix, midPrefixLength);\n" - " if(nodeMidSharedPrefixLength < nodePrefixLength) \n" - " {\n" - " int left = mid - 1;\n" - " if(left > internalNodeIndex)\n" - " {\n" - " b3Int64 leftPrefix = commonPrefixes[left];\n" - " int leftPrefixLength = commonPrefixLengths[left];\n" - " \n" - " int nodeLeftSharedPrefixLength = getSharedPrefixLength(nodePrefix, nodePrefixLength, leftPrefix, leftPrefixLength);\n" - " if(nodeLeftSharedPrefixLength < nodePrefixLength) \n" - " {\n" - " upper = left;\n" - " rightIndex = left;\n" - " }\n" - " else \n" - " {\n" - " rightIndex = mid;\n" - " break;\n" - " }\n" - " }\n" - " else \n" - " {\n" - " rightIndex = mid;\n" - " break;\n" - " }\n" - " }\n" - " else lower = mid + 1;\n" - " }\n" - " }\n" - "#endif\n" - " \n" - " //Select parent\n" - " {\n" - " int leftPrefixLength = (leftIndex != -1) ? commonPrefixLengths[leftIndex] : B3_PLBVH_INVALID_COMMON_PREFIX;\n" - " int rightPrefixLength = (rightIndex != -1) ? commonPrefixLengths[rightIndex] : B3_PLBVH_INVALID_COMMON_PREFIX;\n" - " \n" - " int isLeftHigherPrefixLength = (leftPrefixLength > rightPrefixLength);\n" - " \n" - " if(leftPrefixLength == B3_PLBVH_INVALID_COMMON_PREFIX) isLeftHigherPrefixLength = false;\n" - " else if(rightPrefixLength == B3_PLBVH_INVALID_COMMON_PREFIX) isLeftHigherPrefixLength = true;\n" - " \n" - " int parentNodeIndex = (isLeftHigherPrefixLength) ? leftIndex : rightIndex;\n" - " \n" - " int isRootNode = (leftIndex == -1 && rightIndex == -1);\n" - " out_internalNodeParentNodes[internalNodeIndex] = (!isRootNode) ? parentNodeIndex : B3_PLBVH_ROOT_NODE_MARKER;\n" - " \n" - " int isLeaf = 0;\n" - " if(!isRootNode)\n" - " {\n" - " int isRightChild = (isLeftHigherPrefixLength); //If the left node is the parent, then this node is its right child and vice versa\n" - " \n" - " //out_childNodesAsInt[0] == int2.x == left child\n" - " //out_childNodesAsInt[1] == int2.y == right child\n" - " __global int* out_childNodesAsInt = (__global int*)(&out_childNodes[parentNodeIndex]);\n" - " out_childNodesAsInt[isRightChild] = getIndexWithInternalNodeMarkerSet(isLeaf, internalNodeIndex);\n" - " }\n" - " else *out_rootNodeIndex = getIndexWithInternalNodeMarkerSet(isLeaf, internalNodeIndex);\n" - " }\n" - "}\n" - "__kernel void findDistanceFromRoot(__global int* rootNodeIndex, __global int* internalNodeParentNodes,\n" - " __global int* out_maxDistanceFromRoot, __global int* out_distanceFromRoot, int numInternalNodes)\n" - "{\n" - " if( get_global_id(0) == 0 ) atomic_xchg(out_maxDistanceFromRoot, 0);\n" - " int internalNodeIndex = get_global_id(0);\n" - " if(internalNodeIndex >= numInternalNodes) return;\n" - " \n" - " //\n" - " int distanceFromRoot = 0;\n" - " {\n" - " int parentIndex = internalNodeParentNodes[internalNodeIndex];\n" - " while(parentIndex != B3_PLBVH_ROOT_NODE_MARKER)\n" - " {\n" - " parentIndex = internalNodeParentNodes[parentIndex];\n" - " ++distanceFromRoot;\n" - " }\n" - " }\n" - " out_distanceFromRoot[internalNodeIndex] = distanceFromRoot;\n" - " \n" - " //\n" - " __local int localMaxDistanceFromRoot;\n" - " if( get_local_id(0) == 0 ) localMaxDistanceFromRoot = 0;\n" - " barrier(CLK_LOCAL_MEM_FENCE);\n" - " \n" - " atomic_max(&localMaxDistanceFromRoot, distanceFromRoot);\n" - " barrier(CLK_LOCAL_MEM_FENCE);\n" - " \n" - " if( get_local_id(0) == 0 ) atomic_max(out_maxDistanceFromRoot, localMaxDistanceFromRoot);\n" - "}\n" - "__kernel void buildBinaryRadixTreeAabbsRecursive(__global int* distanceFromRoot, __global SortDataCL* mortonCodesAndAabbIndices,\n" - " __global int2* childNodes,\n" - " __global b3AabbCL* leafNodeAabbs, __global b3AabbCL* internalNodeAabbs,\n" - " int maxDistanceFromRoot, int processedDistance, int numInternalNodes)\n" - "{\n" - " int internalNodeIndex = get_global_id(0);\n" - " if(internalNodeIndex >= numInternalNodes) return;\n" - " \n" - " int distance = distanceFromRoot[internalNodeIndex];\n" - " \n" - " if(distance == processedDistance)\n" - " {\n" - " int leftChildIndex = childNodes[internalNodeIndex].x;\n" - " int rightChildIndex = childNodes[internalNodeIndex].y;\n" - " \n" - " int isLeftChildLeaf = isLeafNode(leftChildIndex);\n" - " int isRightChildLeaf = isLeafNode(rightChildIndex);\n" - " \n" - " leftChildIndex = getIndexWithInternalNodeMarkerRemoved(leftChildIndex);\n" - " rightChildIndex = getIndexWithInternalNodeMarkerRemoved(rightChildIndex);\n" - " \n" - " //leftRigidIndex/rightRigidIndex is not used if internal node\n" - " int leftRigidIndex = (isLeftChildLeaf) ? mortonCodesAndAabbIndices[leftChildIndex].m_value : -1;\n" - " int rightRigidIndex = (isRightChildLeaf) ? mortonCodesAndAabbIndices[rightChildIndex].m_value : -1;\n" - " \n" - " b3AabbCL leftChildAabb = (isLeftChildLeaf) ? leafNodeAabbs[leftRigidIndex] : internalNodeAabbs[leftChildIndex];\n" - " b3AabbCL rightChildAabb = (isRightChildLeaf) ? leafNodeAabbs[rightRigidIndex] : internalNodeAabbs[rightChildIndex];\n" - " \n" - " b3AabbCL mergedAabb;\n" - " mergedAabb.m_min = b3Min(leftChildAabb.m_min, rightChildAabb.m_min);\n" - " mergedAabb.m_max = b3Max(leftChildAabb.m_max, rightChildAabb.m_max);\n" - " internalNodeAabbs[internalNodeIndex] = mergedAabb;\n" - " }\n" - "}\n" - "__kernel void findLeafIndexRanges(__global int2* internalNodeChildNodes, __global int2* out_leafIndexRanges, int numInternalNodes)\n" - "{\n" - " int internalNodeIndex = get_global_id(0);\n" - " if(internalNodeIndex >= numInternalNodes) return;\n" - " \n" - " int numLeafNodes = numInternalNodes + 1;\n" - " \n" - " int2 childNodes = internalNodeChildNodes[internalNodeIndex];\n" - " \n" - " int2 leafIndexRange; //x == min leaf index, y == max leaf index\n" - " \n" - " //Find lowest leaf index covered by this internal node\n" - " {\n" - " int lowestIndex = childNodes.x; //childNodes.x == Left child\n" - " while( !isLeafNode(lowestIndex) ) lowestIndex = internalNodeChildNodes[ getIndexWithInternalNodeMarkerRemoved(lowestIndex) ].x;\n" - " leafIndexRange.x = lowestIndex;\n" - " }\n" - " \n" - " //Find highest leaf index covered by this internal node\n" - " {\n" - " int highestIndex = childNodes.y; //childNodes.y == Right child\n" - " while( !isLeafNode(highestIndex) ) highestIndex = internalNodeChildNodes[ getIndexWithInternalNodeMarkerRemoved(highestIndex) ].y;\n" - " leafIndexRange.y = highestIndex;\n" - " }\n" - " \n" - " //\n" - " out_leafIndexRanges[internalNodeIndex] = leafIndexRange;\n" - "}\n"; diff --git a/engine/inc/bullet/Bullet3OpenCL/BroadphaseCollision/kernels/sapKernels.h b/engine/inc/bullet/Bullet3OpenCL/BroadphaseCollision/kernels/sapKernels.h deleted file mode 100644 index d6999b94..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/BroadphaseCollision/kernels/sapKernels.h +++ /dev/null @@ -1,341 +0,0 @@ -//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project -static const char* sapCL = - "/*\n" - "Copyright (c) 2012 Advanced Micro Devices, Inc. \n" - "This software is provided 'as-is', without any express or implied warranty.\n" - "In no event will the authors be held liable for any damages arising from the use of this software.\n" - "Permission is granted to anyone to use this software for any purpose, \n" - "including commercial applications, and to alter it and redistribute it freely, \n" - "subject to the following restrictions:\n" - "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.\n" - "2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.\n" - "3. This notice may not be removed or altered from any source distribution.\n" - "*/\n" - "//Originally written by Erwin Coumans\n" - "#define NEW_PAIR_MARKER -1\n" - "typedef struct \n" - "{\n" - " union\n" - " {\n" - " float4 m_min;\n" - " float m_minElems[4];\n" - " int m_minIndices[4];\n" - " };\n" - " union\n" - " {\n" - " float4 m_max;\n" - " float m_maxElems[4];\n" - " int m_maxIndices[4];\n" - " };\n" - "} btAabbCL;\n" - "/// conservative test for overlap between two aabbs\n" - "bool TestAabbAgainstAabb2(const btAabbCL* aabb1, __local const btAabbCL* aabb2);\n" - "bool TestAabbAgainstAabb2(const btAabbCL* aabb1, __local const btAabbCL* aabb2)\n" - "{\n" - " bool overlap = true;\n" - " overlap = (aabb1->m_min.x > aabb2->m_max.x || aabb1->m_max.x < aabb2->m_min.x) ? false : overlap;\n" - " overlap = (aabb1->m_min.z > aabb2->m_max.z || aabb1->m_max.z < aabb2->m_min.z) ? false : overlap;\n" - " overlap = (aabb1->m_min.y > aabb2->m_max.y || aabb1->m_max.y < aabb2->m_min.y) ? false : overlap;\n" - " return overlap;\n" - "}\n" - "bool TestAabbAgainstAabb2GlobalGlobal(__global const btAabbCL* aabb1, __global const btAabbCL* aabb2);\n" - "bool TestAabbAgainstAabb2GlobalGlobal(__global const btAabbCL* aabb1, __global const btAabbCL* aabb2)\n" - "{\n" - " bool overlap = true;\n" - " overlap = (aabb1->m_min.x > aabb2->m_max.x || aabb1->m_max.x < aabb2->m_min.x) ? false : overlap;\n" - " overlap = (aabb1->m_min.z > aabb2->m_max.z || aabb1->m_max.z < aabb2->m_min.z) ? false : overlap;\n" - " overlap = (aabb1->m_min.y > aabb2->m_max.y || aabb1->m_max.y < aabb2->m_min.y) ? false : overlap;\n" - " return overlap;\n" - "}\n" - "bool TestAabbAgainstAabb2Global(const btAabbCL* aabb1, __global const btAabbCL* aabb2);\n" - "bool TestAabbAgainstAabb2Global(const btAabbCL* aabb1, __global const btAabbCL* aabb2)\n" - "{\n" - " bool overlap = true;\n" - " overlap = (aabb1->m_min.x > aabb2->m_max.x || aabb1->m_max.x < aabb2->m_min.x) ? false : overlap;\n" - " overlap = (aabb1->m_min.z > aabb2->m_max.z || aabb1->m_max.z < aabb2->m_min.z) ? false : overlap;\n" - " overlap = (aabb1->m_min.y > aabb2->m_max.y || aabb1->m_max.y < aabb2->m_min.y) ? false : overlap;\n" - " return overlap;\n" - "}\n" - "__kernel void computePairsKernelTwoArrays( __global const btAabbCL* unsortedAabbs, __global const int* unsortedAabbMapping, __global const int* unsortedAabbMapping2, volatile __global int4* pairsOut,volatile __global int* pairCount, int numUnsortedAabbs, int numUnSortedAabbs2, int axis, int maxPairs)\n" - "{\n" - " int i = get_global_id(0);\n" - " if (i>=numUnsortedAabbs)\n" - " return;\n" - " int j = get_global_id(1);\n" - " if (j>=numUnSortedAabbs2)\n" - " return;\n" - " __global const btAabbCL* unsortedAabbPtr = &unsortedAabbs[unsortedAabbMapping[i]];\n" - " __global const btAabbCL* unsortedAabbPtr2 = &unsortedAabbs[unsortedAabbMapping2[j]];\n" - " if (TestAabbAgainstAabb2GlobalGlobal(unsortedAabbPtr,unsortedAabbPtr2))\n" - " {\n" - " int4 myPair;\n" - " \n" - " int xIndex = unsortedAabbPtr[0].m_minIndices[3];\n" - " int yIndex = unsortedAabbPtr2[0].m_minIndices[3];\n" - " if (xIndex>yIndex)\n" - " {\n" - " int tmp = xIndex;\n" - " xIndex=yIndex;\n" - " yIndex=tmp;\n" - " }\n" - " \n" - " myPair.x = xIndex;\n" - " myPair.y = yIndex;\n" - " myPair.z = NEW_PAIR_MARKER;\n" - " myPair.w = NEW_PAIR_MARKER;\n" - " int curPair = atomic_inc (pairCount);\n" - " if (curPair=numObjects)\n" - " return;\n" - " for (int j=i+1;j=numObjects)\n" - " return;\n" - " for (int j=i+1;j=numObjects && !localBreak)\n" - " {\n" - " atomic_inc(breakRequest);\n" - " localBreak = 1;\n" - " }\n" - " barrier(CLK_LOCAL_MEM_FENCE);\n" - " \n" - " if (!localBreak)\n" - " {\n" - " if (TestAabbAgainstAabb2GlobalGlobal(&aabbs[i],&aabbs[j]))\n" - " {\n" - " int4 myPair;\n" - " myPair.x = aabbs[i].m_minIndices[3];\n" - " myPair.y = aabbs[j].m_minIndices[3];\n" - " myPair.z = NEW_PAIR_MARKER;\n" - " myPair.w = NEW_PAIR_MARKER;\n" - " int curPair = atomic_inc (pairCount);\n" - " if (curPair=numObjects && !localBreak)\n" - " {\n" - " atomic_inc(breakRequest);\n" - " localBreak = 1;\n" - " }\n" - " barrier(CLK_LOCAL_MEM_FENCE);\n" - " \n" - " if (!localBreak)\n" - " {\n" - " if (TestAabbAgainstAabb2(&myAabb,&localAabbs[localCount+localId+1]))\n" - " {\n" - " int4 myPair;\n" - " myPair.x = myAabb.m_minIndices[3];\n" - " myPair.y = localAabbs[localCount+localId+1].m_minIndices[3];\n" - " myPair.z = NEW_PAIR_MARKER;\n" - " myPair.w = NEW_PAIR_MARKER;\n" - " int curPair = atomic_inc (pairCount);\n" - " if (curPair> 31) | 0x80000000;\n" - " return f ^ mask;\n" - "}\n" - "float IFloatFlip(unsigned int f);\n" - "float IFloatFlip(unsigned int f)\n" - "{\n" - " unsigned int mask = ((f >> 31) - 1) | 0x80000000;\n" - " unsigned int fl = f ^ mask;\n" - " return *(float*)&fl;\n" - "}\n" - "__kernel void copyAabbsKernel( __global const btAabbCL* allAabbs, __global btAabbCL* destAabbs, int numObjects)\n" - "{\n" - " int i = get_global_id(0);\n" - " if (i>=numObjects)\n" - " return;\n" - " int src = destAabbs[i].m_maxIndices[3];\n" - " destAabbs[i] = allAabbs[src];\n" - " destAabbs[i].m_maxIndices[3] = src;\n" - "}\n" - "__kernel void flipFloatKernel( __global const btAabbCL* allAabbs, __global const int* smallAabbMapping, __global int2* sortData, int numObjects, int axis)\n" - "{\n" - " int i = get_global_id(0);\n" - " if (i>=numObjects)\n" - " return;\n" - " \n" - " \n" - " sortData[i].x = FloatFlip(allAabbs[smallAabbMapping[i]].m_minElems[axis]);\n" - " sortData[i].y = i;\n" - " \n" - "}\n" - "__kernel void scatterKernel( __global const btAabbCL* allAabbs, __global const int* smallAabbMapping, volatile __global const int2* sortData, __global btAabbCL* sortedAabbs, int numObjects)\n" - "{\n" - " int i = get_global_id(0);\n" - " if (i>=numObjects)\n" - " return;\n" - " \n" - " sortedAabbs[i] = allAabbs[smallAabbMapping[sortData[i].y]];\n" - "}\n" - "__kernel void prepareSumVarianceKernel( __global const btAabbCL* allAabbs, __global const int* smallAabbMapping, __global float4* sum, __global float4* sum2,int numAabbs)\n" - "{\n" - " int i = get_global_id(0);\n" - " if (i>=numAabbs)\n" - " return;\n" - " \n" - " btAabbCL smallAabb = allAabbs[smallAabbMapping[i]];\n" - " \n" - " float4 s;\n" - " s = (smallAabb.m_max+smallAabb.m_min)*0.5f;\n" - " sum[i]=s;\n" - " sum2[i]=s*s; \n" - "}\n"; diff --git a/engine/inc/bullet/Bullet3OpenCL/Initialize/b3OpenCLInclude.h b/engine/inc/bullet/Bullet3OpenCL/Initialize/b3OpenCLInclude.h deleted file mode 100644 index 61465382..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/Initialize/b3OpenCLInclude.h +++ /dev/null @@ -1,51 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2011 Advanced Micro Devices, Inc. http://bulletphysics.org - -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 B3_OPENCL_INCLUDE_H -#define B3_OPENCL_INCLUDE_H - -#ifdef B3_USE_CLEW -#include "clew/clew.h" -#else - -#ifdef __APPLE__ -#ifdef USE_MINICL -#include -#else -#include -#include //clLogMessagesToStderrAPPLE -#endif -#else -#ifdef USE_MINICL -#include -#else -#include -#ifdef _WIN32 -#include "CL/cl_gl.h" -#endif //_WIN32 -#endif -#endif //__APPLE__ -#endif //B3_USE_CLEW - -#include -#include -#define oclCHECKERROR(a, b) \ - if ((a) != (b)) \ - { \ - printf("OCL Error : %d\n", (a)); \ - assert((a) == (b)); \ - } - -#endif //B3_OPENCL_INCLUDE_H diff --git a/engine/inc/bullet/Bullet3OpenCL/Initialize/b3OpenCLUtils.h b/engine/inc/bullet/Bullet3OpenCL/Initialize/b3OpenCLUtils.h deleted file mode 100644 index 6c82eed2..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/Initialize/b3OpenCLUtils.h +++ /dev/null @@ -1,190 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org -Copyright (C) 2006 - 2011 Sony Computer Entertainment Inc. - -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. -*/ - -//original author: Roman Ponomarev -//cleanup by Erwin Coumans - -#ifndef B3_OPENCL_UTILS_H -#define B3_OPENCL_UTILS_H - -#include "b3OpenCLInclude.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - - ///C API for OpenCL utilities: convenience functions, see below for C++ API - - /// CL Context optionally takes a GL context. This is a generic type because we don't really want this code - /// to have to understand GL types. It is a HGLRC in _WIN32 or a GLXContext otherwise. - cl_context b3OpenCLUtils_createContextFromType(cl_device_type deviceType, cl_int* pErrNum, void* pGLCtx, void* pGLDC, int preferredDeviceIndex, int preferredPlatformIndex, cl_platform_id* platformId); - - int b3OpenCLUtils_getNumDevices(cl_context cxMainContext); - - cl_device_id b3OpenCLUtils_getDevice(cl_context cxMainContext, int nr); - - void b3OpenCLUtils_printDeviceInfo(cl_device_id device); - - cl_kernel b3OpenCLUtils_compileCLKernelFromString(cl_context clContext, cl_device_id device, const char* kernelSource, const char* kernelName, cl_int* pErrNum, cl_program prog, const char* additionalMacros); - - //optional - cl_program b3OpenCLUtils_compileCLProgramFromString(cl_context clContext, cl_device_id device, const char* kernelSource, cl_int* pErrNum, const char* additionalMacros, const char* srcFileNameForCaching, bool disableBinaryCaching); - - //the following optional APIs provide access using specific platform information - int b3OpenCLUtils_getNumPlatforms(cl_int* pErrNum); - - ///get the nr'th platform, where nr is in the range [0..getNumPlatforms) - cl_platform_id b3OpenCLUtils_getPlatform(int nr, cl_int* pErrNum); - - void b3OpenCLUtils_printPlatformInfo(cl_platform_id platform); - - const char* b3OpenCLUtils_getSdkVendorName(); - - ///set the path (directory/folder) where the compiled OpenCL kernel are stored - void b3OpenCLUtils_setCachePath(const char* path); - - cl_context b3OpenCLUtils_createContextFromPlatform(cl_platform_id platform, cl_device_type deviceType, cl_int* pErrNum, void* pGLCtx, void* pGLDC, int preferredDeviceIndex, int preferredPlatformIndex); - -#ifdef __cplusplus -} - -#define B3_MAX_STRING_LENGTH 1024 - -typedef struct -{ - char m_deviceName[B3_MAX_STRING_LENGTH]; - char m_deviceVendor[B3_MAX_STRING_LENGTH]; - char m_driverVersion[B3_MAX_STRING_LENGTH]; - char m_deviceExtensions[B3_MAX_STRING_LENGTH]; - - cl_device_type m_deviceType; - cl_uint m_computeUnits; - size_t m_workitemDims; - size_t m_workItemSize[3]; - size_t m_image2dMaxWidth; - size_t m_image2dMaxHeight; - size_t m_image3dMaxWidth; - size_t m_image3dMaxHeight; - size_t m_image3dMaxDepth; - size_t m_workgroupSize; - cl_uint m_clockFrequency; - cl_ulong m_constantBufferSize; - cl_ulong m_localMemSize; - cl_ulong m_globalMemSize; - cl_bool m_errorCorrectionSupport; - cl_device_local_mem_type m_localMemType; - cl_uint m_maxReadImageArgs; - cl_uint m_maxWriteImageArgs; - - cl_uint m_addressBits; - cl_ulong m_maxMemAllocSize; - cl_command_queue_properties m_queueProperties; - cl_bool m_imageSupport; - cl_uint m_vecWidthChar; - cl_uint m_vecWidthShort; - cl_uint m_vecWidthInt; - cl_uint m_vecWidthLong; - cl_uint m_vecWidthFloat; - cl_uint m_vecWidthDouble; - -} b3OpenCLDeviceInfo; - -struct b3OpenCLPlatformInfo -{ - char m_platformVendor[B3_MAX_STRING_LENGTH]; - char m_platformName[B3_MAX_STRING_LENGTH]; - char m_platformVersion[B3_MAX_STRING_LENGTH]; - - b3OpenCLPlatformInfo() - { - m_platformVendor[0] = 0; - m_platformName[0] = 0; - m_platformVersion[0] = 0; - } -}; - -///C++ API for OpenCL utilities: convenience functions -struct b3OpenCLUtils -{ - /// CL Context optionally takes a GL context. This is a generic type because we don't really want this code - /// to have to understand GL types. It is a HGLRC in _WIN32 or a GLXContext otherwise. - static inline cl_context createContextFromType(cl_device_type deviceType, cl_int* pErrNum, void* pGLCtx = 0, void* pGLDC = 0, int preferredDeviceIndex = -1, int preferredPlatformIndex = -1, cl_platform_id* platformId = 0) - { - return b3OpenCLUtils_createContextFromType(deviceType, pErrNum, pGLCtx, pGLDC, preferredDeviceIndex, preferredPlatformIndex, platformId); - } - - static inline int getNumDevices(cl_context cxMainContext) - { - return b3OpenCLUtils_getNumDevices(cxMainContext); - } - static inline cl_device_id getDevice(cl_context cxMainContext, int nr) - { - return b3OpenCLUtils_getDevice(cxMainContext, nr); - } - - static void getDeviceInfo(cl_device_id device, b3OpenCLDeviceInfo* info); - - static inline void printDeviceInfo(cl_device_id device) - { - b3OpenCLUtils_printDeviceInfo(device); - } - - static inline cl_kernel compileCLKernelFromString(cl_context clContext, cl_device_id device, const char* kernelSource, const char* kernelName, cl_int* pErrNum = 0, cl_program prog = 0, const char* additionalMacros = "") - { - return b3OpenCLUtils_compileCLKernelFromString(clContext, device, kernelSource, kernelName, pErrNum, prog, additionalMacros); - } - - //optional - static inline cl_program compileCLProgramFromString(cl_context clContext, cl_device_id device, const char* kernelSource, cl_int* pErrNum = 0, const char* additionalMacros = "", const char* srcFileNameForCaching = 0, bool disableBinaryCaching = false) - { - return b3OpenCLUtils_compileCLProgramFromString(clContext, device, kernelSource, pErrNum, additionalMacros, srcFileNameForCaching, disableBinaryCaching); - } - - //the following optional APIs provide access using specific platform information - static inline int getNumPlatforms(cl_int* pErrNum = 0) - { - return b3OpenCLUtils_getNumPlatforms(pErrNum); - } - ///get the nr'th platform, where nr is in the range [0..getNumPlatforms) - static inline cl_platform_id getPlatform(int nr, cl_int* pErrNum = 0) - { - return b3OpenCLUtils_getPlatform(nr, pErrNum); - } - - static void getPlatformInfo(cl_platform_id platform, b3OpenCLPlatformInfo* platformInfo); - - static inline void printPlatformInfo(cl_platform_id platform) - { - b3OpenCLUtils_printPlatformInfo(platform); - } - - static inline const char* getSdkVendorName() - { - return b3OpenCLUtils_getSdkVendorName(); - } - static inline cl_context createContextFromPlatform(cl_platform_id platform, cl_device_type deviceType, cl_int* pErrNum, void* pGLCtx = 0, void* pGLDC = 0, int preferredDeviceIndex = -1, int preferredPlatformIndex = -1) - { - return b3OpenCLUtils_createContextFromPlatform(platform, deviceType, pErrNum, pGLCtx, pGLDC, preferredDeviceIndex, preferredPlatformIndex); - } - static void setCachePath(const char* path) - { - b3OpenCLUtils_setCachePath(path); - } -}; - -#endif //__cplusplus - -#endif // B3_OPENCL_UTILS_H diff --git a/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3BvhInfo.h b/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3BvhInfo.h deleted file mode 100644 index 27835bb7..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3BvhInfo.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef B3_BVH_INFO_H -#define B3_BVH_INFO_H - -#include "Bullet3Common/b3Vector3.h" - -struct b3BvhInfo -{ - b3Vector3 m_aabbMin; - b3Vector3 m_aabbMax; - b3Vector3 m_quantization; - int m_numNodes; - int m_numSubTrees; - int m_nodeOffset; - int m_subTreeOffset; -}; - -#endif //B3_BVH_INFO_H \ No newline at end of file diff --git a/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3ContactCache.h b/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3ContactCache.h deleted file mode 100644 index a15fd0b2..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3ContactCache.h +++ /dev/null @@ -1,62 +0,0 @@ - -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2013 Erwin Coumans http://bulletphysics.org - -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 B3_CONTACT_CACHE_H -#define B3_CONTACT_CACHE_H - -#include "Bullet3Common/b3Vector3.h" -#include "Bullet3Common/b3Transform.h" -#include "Bullet3Common/b3AlignedAllocator.h" - -///maximum contact breaking and merging threshold -extern b3Scalar gContactBreakingThreshold; - -#define MANIFOLD_CACHE_SIZE 4 - -///b3ContactCache is a contact point cache, it stays persistent as long as objects are overlapping in the broadphase. -///Those contact points are created by the collision narrow phase. -///The cache can be empty, or hold 1,2,3 or 4 points. Some collision algorithms (GJK) might only add one point at a time. -///updates/refreshes old contact points, and throw them away if necessary (distance becomes too large) -///reduces the cache to 4 points, when more then 4 points are added, using following rules: -///the contact point with deepest penetration is always kept, and it tries to maximuze the area covered by the points -///note that some pairs of objects might have more then one contact manifold. -B3_ATTRIBUTE_ALIGNED16(class) -b3ContactCache -{ - /// sort cached points so most isolated points come first - int sortCachedPoints(const b3Vector3& pt); - -public: - B3_DECLARE_ALIGNED_ALLOCATOR(); - - int addManifoldPoint(const b3Vector3& newPoint); - - /*void replaceContactPoint(const b3Vector3& newPoint,int insertIndex) - { - b3Assert(validContactDistance(newPoint)); - m_pointCache[insertIndex] = newPoint; - } - */ - - static bool validContactDistance(const b3Vector3& pt); - - /// calculated new worldspace coordinates and depth, and reject points that exceed the collision margin - static void refreshContactPoints(const b3Transform& trA, const b3Transform& trB, struct b3Contact4Data& newContactCache); - - static void removeContactPoint(struct b3Contact4Data & newContactCache, int i); -}; - -#endif //B3_CONTACT_CACHE_H diff --git a/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3ConvexHullContact.h b/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3ConvexHullContact.h deleted file mode 100644 index 53e8c4ed..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3ConvexHullContact.h +++ /dev/null @@ -1,106 +0,0 @@ - -#ifndef _CONVEX_HULL_CONTACT_H -#define _CONVEX_HULL_CONTACT_H - -#include "Bullet3OpenCL/ParallelPrimitives/b3OpenCLArray.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3RigidBodyData.h" -#include "Bullet3Common/b3AlignedObjectArray.h" - -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3ConvexPolyhedronData.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3Collidable.h" -#include "Bullet3Collision/NarrowPhaseCollision/b3Contact4.h" -#include "Bullet3Common/shared/b3Int2.h" -#include "Bullet3Common/shared/b3Int4.h" -#include "b3OptimizedBvh.h" -#include "b3BvhInfo.h" -#include "Bullet3Collision/BroadPhaseCollision/shared/b3Aabb.h" - -//#include "../../dynamics/basic_demo/Stubs/ChNarrowPhase.h" - -struct GpuSatCollision -{ - cl_context m_context; - cl_device_id m_device; - cl_command_queue m_queue; - cl_kernel m_findSeparatingAxisKernel; - cl_kernel m_mprPenetrationKernel; - cl_kernel m_findSeparatingAxisUnitSphereKernel; - - cl_kernel m_findSeparatingAxisVertexFaceKernel; - cl_kernel m_findSeparatingAxisEdgeEdgeKernel; - - cl_kernel m_findConcaveSeparatingAxisKernel; - cl_kernel m_findConcaveSeparatingAxisVertexFaceKernel; - cl_kernel m_findConcaveSeparatingAxisEdgeEdgeKernel; - - cl_kernel m_findCompoundPairsKernel; - cl_kernel m_processCompoundPairsKernel; - - cl_kernel m_clipHullHullKernel; - cl_kernel m_clipCompoundsHullHullKernel; - - cl_kernel m_clipFacesAndFindContacts; - cl_kernel m_findClippingFacesKernel; - - cl_kernel m_clipHullHullConcaveConvexKernel; - // cl_kernel m_extractManifoldAndAddContactKernel; - cl_kernel m_newContactReductionKernel; - - cl_kernel m_bvhTraversalKernel; - cl_kernel m_primitiveContactsKernel; - cl_kernel m_findConcaveSphereContactsKernel; - - cl_kernel m_processCompoundPairsPrimitivesKernel; - - b3OpenCLArray m_unitSphereDirections; - - b3OpenCLArray m_totalContactsOut; - - b3OpenCLArray m_sepNormals; - b3OpenCLArray m_dmins; - - b3OpenCLArray m_hasSeparatingNormals; - b3OpenCLArray m_concaveSepNormals; - b3OpenCLArray m_concaveHasSeparatingNormals; - b3OpenCLArray m_numConcavePairsOut; - b3OpenCLArray m_gpuCompoundPairs; - b3OpenCLArray m_gpuCompoundSepNormals; - b3OpenCLArray m_gpuHasCompoundSepNormals; - b3OpenCLArray m_numCompoundPairsOut; - - GpuSatCollision(cl_context ctx, cl_device_id device, cl_command_queue q); - virtual ~GpuSatCollision(); - - void computeConvexConvexContactsGPUSAT(b3OpenCLArray* pairs, int nPairs, - const b3OpenCLArray* bodyBuf, - b3OpenCLArray* contactOut, int& nContacts, - const b3OpenCLArray* oldContacts, - int maxContactCapacity, - int compoundPairCapacity, - const b3OpenCLArray& hostConvexData, - const b3OpenCLArray& vertices, - const b3OpenCLArray& uniqueEdges, - const b3OpenCLArray& faces, - const b3OpenCLArray& indices, - const b3OpenCLArray& gpuCollidables, - const b3OpenCLArray& gpuChildShapes, - - const b3OpenCLArray& clAabbsWorldSpace, - const b3OpenCLArray& clAabbsLocalSpace, - - b3OpenCLArray& worldVertsB1GPU, - b3OpenCLArray& clippingFacesOutGPU, - b3OpenCLArray& worldNormalsAGPU, - b3OpenCLArray& worldVertsA1GPU, - b3OpenCLArray& worldVertsB2GPU, - b3AlignedObjectArray& bvhData, - b3OpenCLArray* treeNodesGPU, - b3OpenCLArray* subTreesGPU, - b3OpenCLArray* bvhInfo, - int numObjects, - int maxTriConvexPairCapacity, - b3OpenCLArray& triangleConvexPairs, - int& numTriConvexPairsOut); -}; - -#endif //_CONVEX_HULL_CONTACT_H diff --git a/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3ConvexPolyhedronCL.h b/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3ConvexPolyhedronCL.h deleted file mode 100644 index c4cf7000..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3ConvexPolyhedronCL.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef CONVEX_POLYHEDRON_CL -#define CONVEX_POLYHEDRON_CL - -#include "Bullet3Common/b3Transform.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3ConvexPolyhedronData.h" - -#endif //CONVEX_POLYHEDRON_CL diff --git a/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3GjkEpa.h b/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3GjkEpa.h deleted file mode 100644 index 7db32c63..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3GjkEpa.h +++ /dev/null @@ -1,79 +0,0 @@ -/* -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. -*/ - -/* -GJK-EPA collision solver by Nathanael Presson, 2008 -*/ -#ifndef B3_GJK_EPA2_H -#define B3_GJK_EPA2_H - -#include "Bullet3Common/b3AlignedObjectArray.h" -#include "Bullet3Common/b3Transform.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3ConvexPolyhedronData.h" - -///btGjkEpaSolver contributed under zlib by Nathanael Presson -struct b3GjkEpaSolver2 -{ - struct sResults - { - enum eStatus - { - Separated, /* Shapes doesnt penetrate */ - Penetrating, /* Shapes are penetrating */ - GJK_Failed, /* GJK phase fail, no big issue, shapes are probably just 'touching' */ - EPA_Failed /* EPA phase fail, bigger problem, need to save parameters, and debug */ - } status; - b3Vector3 witnesses[2]; - b3Vector3 normal; - b3Scalar distance; - }; - - static int StackSizeRequirement(); - - static bool Distance(const b3Transform& transA, const b3Transform& transB, - const b3ConvexPolyhedronData* hullA, const b3ConvexPolyhedronData* hullB, - const b3AlignedObjectArray& verticesA, - const b3AlignedObjectArray& verticesB, - const b3Vector3& guess, - sResults& results); - - static bool Penetration(const b3Transform& transA, const b3Transform& transB, - const b3ConvexPolyhedronData* hullA, const b3ConvexPolyhedronData* hullB, - const b3AlignedObjectArray& verticesA, - const b3AlignedObjectArray& verticesB, - const b3Vector3& guess, - sResults& results, - bool usemargins = true); -#if 0 -static b3Scalar SignedDistance( const b3Vector3& position, - b3Scalar margin, - const btConvexShape* shape, - const btTransform& wtrs, - sResults& results); - -static bool SignedDistance( const btConvexShape* shape0,const btTransform& wtrs0, - const btConvexShape* shape1,const btTransform& wtrs1, - const b3Vector3& guess, - sResults& results); -#endif -}; - -#endif //B3_GJK_EPA2_H diff --git a/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3OptimizedBvh.h b/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3OptimizedBvh.h deleted file mode 100644 index 12865529..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3OptimizedBvh.h +++ /dev/null @@ -1,56 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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 contributions from Disney Studio's - -#ifndef B3_OPTIMIZED_BVH_H -#define B3_OPTIMIZED_BVH_H - -#include "b3QuantizedBvh.h" - -class b3StridingMeshInterface; - -///The b3OptimizedBvh extends the b3QuantizedBvh to create AABB tree for triangle meshes, through the b3StridingMeshInterface. -B3_ATTRIBUTE_ALIGNED16(class) -b3OptimizedBvh : public b3QuantizedBvh -{ -public: - B3_DECLARE_ALIGNED_ALLOCATOR(); - -protected: -public: - b3OptimizedBvh(); - - virtual ~b3OptimizedBvh(); - - void build(b3StridingMeshInterface * triangles, bool useQuantizedAabbCompression, const b3Vector3& bvhAabbMin, const b3Vector3& bvhAabbMax); - - void refit(b3StridingMeshInterface * triangles, const b3Vector3& aabbMin, const b3Vector3& aabbMax); - - void refitPartial(b3StridingMeshInterface * triangles, const b3Vector3& aabbMin, const b3Vector3& aabbMax); - - void updateBvhNodes(b3StridingMeshInterface * meshInterface, int firstNode, int endNode, int index); - - /// Data buffer MUST be 16 byte aligned - virtual bool serializeInPlace(void* o_alignedDataBuffer, unsigned i_dataBufferSize, bool i_swapEndian) const - { - return b3QuantizedBvh::serialize(o_alignedDataBuffer, i_dataBufferSize, i_swapEndian); - } - - ///deSerializeInPlace loads and initializes a BVH from a buffer in memory 'in place' - static b3OptimizedBvh* deSerializeInPlace(void* i_alignedDataBuffer, unsigned int i_dataBufferSize, bool i_swapEndian); -}; - -#endif //B3_OPTIMIZED_BVH_H diff --git a/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3QuantizedBvh.h b/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3QuantizedBvh.h deleted file mode 100644 index 48b41abc..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3QuantizedBvh.h +++ /dev/null @@ -1,511 +0,0 @@ -/* -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 B3_QUANTIZED_BVH_H -#define B3_QUANTIZED_BVH_H - -class b3Serializer; - -//#define DEBUG_CHECK_DEQUANTIZATION 1 -#ifdef DEBUG_CHECK_DEQUANTIZATION -#ifdef __SPU__ -#define printf spu_printf -#endif //__SPU__ - -#include -#include -#endif //DEBUG_CHECK_DEQUANTIZATION - -#include "Bullet3Common/b3Vector3.h" -#include "Bullet3Common/b3AlignedAllocator.h" - -#ifdef B3_USE_DOUBLE_PRECISION -#define b3QuantizedBvhData b3QuantizedBvhDoubleData -#define b3OptimizedBvhNodeData b3OptimizedBvhNodeDoubleData -#define b3QuantizedBvhDataName "b3QuantizedBvhDoubleData" -#else -#define b3QuantizedBvhData b3QuantizedBvhFloatData -#define b3OptimizedBvhNodeData b3OptimizedBvhNodeFloatData -#define b3QuantizedBvhDataName "b3QuantizedBvhFloatData" -#endif - -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3QuantizedBvhNodeData.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3BvhSubtreeInfoData.h" - -//http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/vclrf__m128.asp - -//Note: currently we have 16 bytes per quantized node -#define MAX_SUBTREE_SIZE_IN_BYTES 2048 - -// 10 gives the potential for 1024 parts, with at most 2^21 (2097152) (minus one -// actually) triangles each (since the sign bit is reserved -#define MAX_NUM_PARTS_IN_BITS 10 - -///b3QuantizedBvhNode is a compressed aabb node, 16 bytes. -///Node can be used for leafnode or internal node. Leafnodes can point to 32-bit triangle index (non-negative range). -B3_ATTRIBUTE_ALIGNED16(struct) -b3QuantizedBvhNode : public b3QuantizedBvhNodeData -{ - B3_DECLARE_ALIGNED_ALLOCATOR(); - - bool isLeafNode() const - { - //skipindex is negative (internal node), triangleindex >=0 (leafnode) - return (m_escapeIndexOrTriangleIndex >= 0); - } - int getEscapeIndex() const - { - b3Assert(!isLeafNode()); - return -m_escapeIndexOrTriangleIndex; - } - int getTriangleIndex() const - { - b3Assert(isLeafNode()); - unsigned int x = 0; - unsigned int y = (~(x & 0)) << (31 - MAX_NUM_PARTS_IN_BITS); - // Get only the lower bits where the triangle index is stored - return (m_escapeIndexOrTriangleIndex & ~(y)); - } - int getPartId() const - { - b3Assert(isLeafNode()); - // Get only the highest bits where the part index is stored - return (m_escapeIndexOrTriangleIndex >> (31 - MAX_NUM_PARTS_IN_BITS)); - } -}; - -/// b3OptimizedBvhNode contains both internal and leaf node information. -/// Total node size is 44 bytes / node. You can use the compressed version of 16 bytes. -B3_ATTRIBUTE_ALIGNED16(struct) -b3OptimizedBvhNode -{ - B3_DECLARE_ALIGNED_ALLOCATOR(); - - //32 bytes - b3Vector3 m_aabbMinOrg; - b3Vector3 m_aabbMaxOrg; - - //4 - int m_escapeIndex; - - //8 - //for child nodes - int m_subPart; - int m_triangleIndex; - - //pad the size to 64 bytes - char m_padding[20]; -}; - -///b3BvhSubtreeInfo provides info to gather a subtree of limited size -B3_ATTRIBUTE_ALIGNED16(class) -b3BvhSubtreeInfo : public b3BvhSubtreeInfoData -{ -public: - B3_DECLARE_ALIGNED_ALLOCATOR(); - - b3BvhSubtreeInfo() - { - //memset(&m_padding[0], 0, sizeof(m_padding)); - } - - void setAabbFromQuantizeNode(const b3QuantizedBvhNode& quantizedNode) - { - m_quantizedAabbMin[0] = quantizedNode.m_quantizedAabbMin[0]; - m_quantizedAabbMin[1] = quantizedNode.m_quantizedAabbMin[1]; - m_quantizedAabbMin[2] = quantizedNode.m_quantizedAabbMin[2]; - m_quantizedAabbMax[0] = quantizedNode.m_quantizedAabbMax[0]; - m_quantizedAabbMax[1] = quantizedNode.m_quantizedAabbMax[1]; - m_quantizedAabbMax[2] = quantizedNode.m_quantizedAabbMax[2]; - } -}; - -class b3NodeOverlapCallback -{ -public: - virtual ~b3NodeOverlapCallback(){}; - - virtual void processNode(int subPart, int triangleIndex) = 0; -}; - -#include "Bullet3Common/b3AlignedAllocator.h" -#include "Bullet3Common/b3AlignedObjectArray.h" - -///for code readability: -typedef b3AlignedObjectArray NodeArray; -typedef b3AlignedObjectArray QuantizedNodeArray; -typedef b3AlignedObjectArray BvhSubtreeInfoArray; - -///The b3QuantizedBvh class stores an AABB tree that can be quickly traversed on CPU and Cell SPU. -///It is used by the b3BvhTriangleMeshShape as midphase -///It is recommended to use quantization for better performance and lower memory requirements. -B3_ATTRIBUTE_ALIGNED16(class) -b3QuantizedBvh -{ -public: - enum b3TraversalMode - { - TRAVERSAL_STACKLESS = 0, - TRAVERSAL_STACKLESS_CACHE_FRIENDLY, - TRAVERSAL_RECURSIVE - }; - - b3Vector3 m_bvhAabbMin; - b3Vector3 m_bvhAabbMax; - b3Vector3 m_bvhQuantization; - -protected: - int m_bulletVersion; //for serialization versioning. It could also be used to detect endianess. - - int m_curNodeIndex; - //quantization data - bool m_useQuantization; - - NodeArray m_leafNodes; - NodeArray m_contiguousNodes; - QuantizedNodeArray m_quantizedLeafNodes; - QuantizedNodeArray m_quantizedContiguousNodes; - - b3TraversalMode m_traversalMode; - BvhSubtreeInfoArray m_SubtreeHeaders; - - //This is only used for serialization so we don't have to add serialization directly to b3AlignedObjectArray - mutable int m_subtreeHeaderCount; - - ///two versions, one for quantized and normal nodes. This allows code-reuse while maintaining readability (no template/macro!) - ///this might be refactored into a virtual, it is usually not calculated at run-time - void setInternalNodeAabbMin(int nodeIndex, const b3Vector3& aabbMin) - { - if (m_useQuantization) - { - quantize(&m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMin[0], aabbMin, 0); - } - else - { - m_contiguousNodes[nodeIndex].m_aabbMinOrg = aabbMin; - } - } - void setInternalNodeAabbMax(int nodeIndex, const b3Vector3& aabbMax) - { - if (m_useQuantization) - { - quantize(&m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMax[0], aabbMax, 1); - } - else - { - m_contiguousNodes[nodeIndex].m_aabbMaxOrg = aabbMax; - } - } - - b3Vector3 getAabbMin(int nodeIndex) const - { - if (m_useQuantization) - { - return unQuantize(&m_quantizedLeafNodes[nodeIndex].m_quantizedAabbMin[0]); - } - //non-quantized - return m_leafNodes[nodeIndex].m_aabbMinOrg; - } - b3Vector3 getAabbMax(int nodeIndex) const - { - if (m_useQuantization) - { - return unQuantize(&m_quantizedLeafNodes[nodeIndex].m_quantizedAabbMax[0]); - } - //non-quantized - return m_leafNodes[nodeIndex].m_aabbMaxOrg; - } - - void setInternalNodeEscapeIndex(int nodeIndex, int escapeIndex) - { - if (m_useQuantization) - { - m_quantizedContiguousNodes[nodeIndex].m_escapeIndexOrTriangleIndex = -escapeIndex; - } - else - { - m_contiguousNodes[nodeIndex].m_escapeIndex = escapeIndex; - } - } - - void mergeInternalNodeAabb(int nodeIndex, const b3Vector3& newAabbMin, const b3Vector3& newAabbMax) - { - if (m_useQuantization) - { - unsigned short int quantizedAabbMin[3]; - unsigned short int quantizedAabbMax[3]; - quantize(quantizedAabbMin, newAabbMin, 0); - quantize(quantizedAabbMax, newAabbMax, 1); - for (int i = 0; i < 3; i++) - { - if (m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMin[i] > quantizedAabbMin[i]) - m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMin[i] = quantizedAabbMin[i]; - - if (m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMax[i] < quantizedAabbMax[i]) - m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMax[i] = quantizedAabbMax[i]; - } - } - else - { - //non-quantized - m_contiguousNodes[nodeIndex].m_aabbMinOrg.setMin(newAabbMin); - m_contiguousNodes[nodeIndex].m_aabbMaxOrg.setMax(newAabbMax); - } - } - - void swapLeafNodes(int firstIndex, int secondIndex); - - void assignInternalNodeFromLeafNode(int internalNode, int leafNodeIndex); - -protected: - void buildTree(int startIndex, int endIndex); - - int calcSplittingAxis(int startIndex, int endIndex); - - int sortAndCalcSplittingIndex(int startIndex, int endIndex, int splitAxis); - - void walkStacklessTree(b3NodeOverlapCallback * nodeCallback, const b3Vector3& aabbMin, const b3Vector3& aabbMax) const; - - void walkStacklessQuantizedTreeAgainstRay(b3NodeOverlapCallback * nodeCallback, const b3Vector3& raySource, const b3Vector3& rayTarget, const b3Vector3& aabbMin, const b3Vector3& aabbMax, int startNodeIndex, int endNodeIndex) const; - void walkStacklessQuantizedTree(b3NodeOverlapCallback * nodeCallback, unsigned short int* quantizedQueryAabbMin, unsigned short int* quantizedQueryAabbMax, int startNodeIndex, int endNodeIndex) const; - void walkStacklessTreeAgainstRay(b3NodeOverlapCallback * nodeCallback, const b3Vector3& raySource, const b3Vector3& rayTarget, const b3Vector3& aabbMin, const b3Vector3& aabbMax, int startNodeIndex, int endNodeIndex) const; - - ///tree traversal designed for small-memory processors like PS3 SPU - void walkStacklessQuantizedTreeCacheFriendly(b3NodeOverlapCallback * nodeCallback, unsigned short int* quantizedQueryAabbMin, unsigned short int* quantizedQueryAabbMax) const; - - ///use the 16-byte stackless 'skipindex' node tree to do a recursive traversal - void walkRecursiveQuantizedTreeAgainstQueryAabb(const b3QuantizedBvhNode* currentNode, b3NodeOverlapCallback* nodeCallback, unsigned short int* quantizedQueryAabbMin, unsigned short int* quantizedQueryAabbMax) const; - - ///use the 16-byte stackless 'skipindex' node tree to do a recursive traversal - void walkRecursiveQuantizedTreeAgainstQuantizedTree(const b3QuantizedBvhNode* treeNodeA, const b3QuantizedBvhNode* treeNodeB, b3NodeOverlapCallback* nodeCallback) const; - - void updateSubtreeHeaders(int leftChildNodexIndex, int rightChildNodexIndex); - -public: - B3_DECLARE_ALIGNED_ALLOCATOR(); - - b3QuantizedBvh(); - - virtual ~b3QuantizedBvh(); - - ///***************************************** expert/internal use only ************************* - void setQuantizationValues(const b3Vector3& bvhAabbMin, const b3Vector3& bvhAabbMax, b3Scalar quantizationMargin = b3Scalar(1.0)); - QuantizedNodeArray& getLeafNodeArray() { return m_quantizedLeafNodes; } - ///buildInternal is expert use only: assumes that setQuantizationValues and LeafNodeArray are initialized - void buildInternal(); - ///***************************************** expert/internal use only ************************* - - void reportAabbOverlappingNodex(b3NodeOverlapCallback * nodeCallback, const b3Vector3& aabbMin, const b3Vector3& aabbMax) const; - void reportRayOverlappingNodex(b3NodeOverlapCallback * nodeCallback, const b3Vector3& raySource, const b3Vector3& rayTarget) const; - void reportBoxCastOverlappingNodex(b3NodeOverlapCallback * nodeCallback, const b3Vector3& raySource, const b3Vector3& rayTarget, const b3Vector3& aabbMin, const b3Vector3& aabbMax) const; - - B3_FORCE_INLINE void quantize(unsigned short* out, const b3Vector3& point, int isMax) const - { - b3Assert(m_useQuantization); - - b3Assert(point.getX() <= m_bvhAabbMax.getX()); - b3Assert(point.getY() <= m_bvhAabbMax.getY()); - b3Assert(point.getZ() <= m_bvhAabbMax.getZ()); - - b3Assert(point.getX() >= m_bvhAabbMin.getX()); - b3Assert(point.getY() >= m_bvhAabbMin.getY()); - b3Assert(point.getZ() >= m_bvhAabbMin.getZ()); - - b3Vector3 v = (point - m_bvhAabbMin) * m_bvhQuantization; - ///Make sure rounding is done in a way that unQuantize(quantizeWithClamp(...)) is conservative - ///end-points always set the first bit, so that they are sorted properly (so that neighbouring AABBs overlap properly) - ///@todo: double-check this - if (isMax) - { - out[0] = (unsigned short)(((unsigned short)(v.getX() + b3Scalar(1.)) | 1)); - out[1] = (unsigned short)(((unsigned short)(v.getY() + b3Scalar(1.)) | 1)); - out[2] = (unsigned short)(((unsigned short)(v.getZ() + b3Scalar(1.)) | 1)); - } - else - { - out[0] = (unsigned short)(((unsigned short)(v.getX()) & 0xfffe)); - out[1] = (unsigned short)(((unsigned short)(v.getY()) & 0xfffe)); - out[2] = (unsigned short)(((unsigned short)(v.getZ()) & 0xfffe)); - } - -#ifdef DEBUG_CHECK_DEQUANTIZATION - b3Vector3 newPoint = unQuantize(out); - if (isMax) - { - if (newPoint.getX() < point.getX()) - { - printf("unconservative X, diffX = %f, oldX=%f,newX=%f\n", newPoint.getX() - point.getX(), newPoint.getX(), point.getX()); - } - if (newPoint.getY() < point.getY()) - { - printf("unconservative Y, diffY = %f, oldY=%f,newY=%f\n", newPoint.getY() - point.getY(), newPoint.getY(), point.getY()); - } - if (newPoint.getZ() < point.getZ()) - { - printf("unconservative Z, diffZ = %f, oldZ=%f,newZ=%f\n", newPoint.getZ() - point.getZ(), newPoint.getZ(), point.getZ()); - } - } - else - { - if (newPoint.getX() > point.getX()) - { - printf("unconservative X, diffX = %f, oldX=%f,newX=%f\n", newPoint.getX() - point.getX(), newPoint.getX(), point.getX()); - } - if (newPoint.getY() > point.getY()) - { - printf("unconservative Y, diffY = %f, oldY=%f,newY=%f\n", newPoint.getY() - point.getY(), newPoint.getY(), point.getY()); - } - if (newPoint.getZ() > point.getZ()) - { - printf("unconservative Z, diffZ = %f, oldZ=%f,newZ=%f\n", newPoint.getZ() - point.getZ(), newPoint.getZ(), point.getZ()); - } - } -#endif //DEBUG_CHECK_DEQUANTIZATION - } - - B3_FORCE_INLINE void quantizeWithClamp(unsigned short* out, const b3Vector3& point2, int isMax) const - { - b3Assert(m_useQuantization); - - b3Vector3 clampedPoint(point2); - clampedPoint.setMax(m_bvhAabbMin); - clampedPoint.setMin(m_bvhAabbMax); - - quantize(out, clampedPoint, isMax); - } - - B3_FORCE_INLINE b3Vector3 unQuantize(const unsigned short* vecIn) const - { - b3Vector3 vecOut; - vecOut.setValue( - (b3Scalar)(vecIn[0]) / (m_bvhQuantization.getX()), - (b3Scalar)(vecIn[1]) / (m_bvhQuantization.getY()), - (b3Scalar)(vecIn[2]) / (m_bvhQuantization.getZ())); - vecOut += m_bvhAabbMin; - return vecOut; - } - - ///setTraversalMode let's you choose between stackless, recursive or stackless cache friendly tree traversal. Note this is only implemented for quantized trees. - void setTraversalMode(b3TraversalMode traversalMode) - { - m_traversalMode = traversalMode; - } - - B3_FORCE_INLINE QuantizedNodeArray& getQuantizedNodeArray() - { - return m_quantizedContiguousNodes; - } - - B3_FORCE_INLINE BvhSubtreeInfoArray& getSubtreeInfoArray() - { - return m_SubtreeHeaders; - } - - //////////////////////////////////////////////////////////////////// - - /////Calculate space needed to store BVH for serialization - unsigned calculateSerializeBufferSize() const; - - /// Data buffer MUST be 16 byte aligned - virtual bool serialize(void* o_alignedDataBuffer, unsigned i_dataBufferSize, bool i_swapEndian) const; - - ///deSerializeInPlace loads and initializes a BVH from a buffer in memory 'in place' - static b3QuantizedBvh* deSerializeInPlace(void* i_alignedDataBuffer, unsigned int i_dataBufferSize, bool i_swapEndian); - - static unsigned int getAlignmentSerializationPadding(); - ////////////////////////////////////////////////////////////////////// - - virtual int calculateSerializeBufferSizeNew() const; - - ///fills the dataBuffer and returns the struct name (and 0 on failure) - virtual const char* serialize(void* dataBuffer, b3Serializer* serializer) const; - - virtual void deSerializeFloat(struct b3QuantizedBvhFloatData & quantizedBvhFloatData); - - virtual void deSerializeDouble(struct b3QuantizedBvhDoubleData & quantizedBvhDoubleData); - - //////////////////////////////////////////////////////////////////// - - B3_FORCE_INLINE bool isQuantized() - { - return m_useQuantization; - } - -private: - // Special "copy" constructor that allows for in-place deserialization - // Prevents b3Vector3's default constructor from being called, but doesn't inialize much else - // ownsMemory should most likely be false if deserializing, and if you are not, don't call this (it also changes the function signature, which we need) - b3QuantizedBvh(b3QuantizedBvh & other, bool ownsMemory); -}; - -struct b3OptimizedBvhNodeFloatData -{ - b3Vector3FloatData m_aabbMinOrg; - b3Vector3FloatData m_aabbMaxOrg; - int m_escapeIndex; - int m_subPart; - int m_triangleIndex; - char m_pad[4]; -}; - -struct b3OptimizedBvhNodeDoubleData -{ - b3Vector3DoubleData m_aabbMinOrg; - b3Vector3DoubleData m_aabbMaxOrg; - int m_escapeIndex; - int m_subPart; - int m_triangleIndex; - char m_pad[4]; -}; - -struct b3QuantizedBvhFloatData -{ - b3Vector3FloatData m_bvhAabbMin; - b3Vector3FloatData m_bvhAabbMax; - b3Vector3FloatData m_bvhQuantization; - int m_curNodeIndex; - int m_useQuantization; - int m_numContiguousLeafNodes; - int m_numQuantizedContiguousNodes; - b3OptimizedBvhNodeFloatData* m_contiguousNodesPtr; - b3QuantizedBvhNodeData* m_quantizedContiguousNodesPtr; - b3BvhSubtreeInfoData* m_subTreeInfoPtr; - int m_traversalMode; - int m_numSubtreeHeaders; -}; - -struct b3QuantizedBvhDoubleData -{ - b3Vector3DoubleData m_bvhAabbMin; - b3Vector3DoubleData m_bvhAabbMax; - b3Vector3DoubleData m_bvhQuantization; - int m_curNodeIndex; - int m_useQuantization; - int m_numContiguousLeafNodes; - int m_numQuantizedContiguousNodes; - b3OptimizedBvhNodeDoubleData* m_contiguousNodesPtr; - b3QuantizedBvhNodeData* m_quantizedContiguousNodesPtr; - - int m_traversalMode; - int m_numSubtreeHeaders; - b3BvhSubtreeInfoData* m_subTreeInfoPtr; -}; - -B3_FORCE_INLINE int b3QuantizedBvh::calculateSerializeBufferSizeNew() const -{ - return sizeof(b3QuantizedBvhData); -} - -#endif //B3_QUANTIZED_BVH_H diff --git a/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3StridingMeshInterface.h b/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3StridingMeshInterface.h deleted file mode 100644 index 2b1e63be..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3StridingMeshInterface.h +++ /dev/null @@ -1,158 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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 B3_STRIDING_MESHINTERFACE_H -#define B3_STRIDING_MESHINTERFACE_H - -#include "Bullet3Common/b3Vector3.h" -#include "b3TriangleCallback.h" -//#include "b3ConcaveShape.h" - -enum PHY_ScalarType -{ - PHY_FLOAT, - PHY_DOUBLE, - PHY_INTEGER, - PHY_SHORT, - PHY_FIXEDPOINT88, - PHY_UCHAR -}; - -/// The b3StridingMeshInterface is the interface class for high performance generic access to triangle meshes, used in combination with b3BvhTriangleMeshShape and some other collision shapes. -/// Using index striding of 3*sizeof(integer) it can use triangle arrays, using index striding of 1*sizeof(integer) it can handle triangle strips. -/// It allows for sharing graphics and collision meshes. Also it provides locking/unlocking of graphics meshes that are in gpu memory. -B3_ATTRIBUTE_ALIGNED16(class) -b3StridingMeshInterface -{ -protected: - b3Vector3 m_scaling; - -public: - B3_DECLARE_ALIGNED_ALLOCATOR(); - - b3StridingMeshInterface() : m_scaling(b3MakeVector3(b3Scalar(1.), b3Scalar(1.), b3Scalar(1.))) - { - } - - virtual ~b3StridingMeshInterface(); - - virtual void InternalProcessAllTriangles(b3InternalTriangleIndexCallback * callback, const b3Vector3& aabbMin, const b3Vector3& aabbMax) const; - - ///brute force method to calculate aabb - void calculateAabbBruteForce(b3Vector3 & aabbMin, b3Vector3 & aabbMax); - - /// 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) = 0; - - 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 = 0; - - /// 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) = 0; - - virtual void unLockReadOnlyVertexBase(int subpart) const = 0; - - /// getNumSubParts returns the number of separate subparts - /// each subpart has a continuous array of vertices and indices - virtual int getNumSubParts() const = 0; - - virtual void preallocateVertices(int numverts) = 0; - virtual void preallocateIndices(int numindices) = 0; - - virtual bool hasPremadeAabb() const { return false; } - virtual void setPremadeAabb(const b3Vector3& aabbMin, const b3Vector3& aabbMax) const - { - (void)aabbMin; - (void)aabbMax; - } - virtual void getPremadeAabb(b3Vector3 * aabbMin, b3Vector3 * aabbMax) const - { - (void)aabbMin; - (void)aabbMax; - } - - const b3Vector3& getScaling() const - { - return m_scaling; - } - void setScaling(const b3Vector3& scaling) - { - m_scaling = scaling; - } - - virtual int calculateSerializeBufferSize() const; - - ///fills the dataBuffer and returns the struct name (and 0 on failure) - //virtual const char* serialize(void* dataBuffer, b3Serializer* serializer) const; -}; - -struct b3IntIndexData -{ - int m_value; -}; - -struct b3ShortIntIndexData -{ - short m_value; - char m_pad[2]; -}; - -struct b3ShortIntIndexTripletData -{ - short m_values[3]; - char m_pad[2]; -}; - -struct b3CharIndexTripletData -{ - unsigned char m_values[3]; - char m_pad; -}; - -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct b3MeshPartData -{ - b3Vector3FloatData* m_vertices3f; - b3Vector3DoubleData* m_vertices3d; - - b3IntIndexData* m_indices32; - b3ShortIntIndexTripletData* m_3indices16; - b3CharIndexTripletData* m_3indices8; - - b3ShortIntIndexData* m_indices16; //backwards compatibility - - int m_numTriangles; //length of m_indices = m_numTriangles - int m_numVertices; -}; - -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct b3StridingMeshInterfaceData -{ - b3MeshPartData* m_meshPartsPtr; - b3Vector3FloatData m_scaling; - int m_numMeshParts; - char m_padding[4]; -}; - -B3_FORCE_INLINE int b3StridingMeshInterface::calculateSerializeBufferSize() const -{ - return sizeof(b3StridingMeshInterfaceData); -} - -#endif //B3_STRIDING_MESHINTERFACE_H diff --git a/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3SupportMappings.h b/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3SupportMappings.h deleted file mode 100644 index 9ca1e229..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3SupportMappings.h +++ /dev/null @@ -1,34 +0,0 @@ - -#ifndef B3_SUPPORT_MAPPINGS_H -#define B3_SUPPORT_MAPPINGS_H - -#include "Bullet3Common/b3Transform.h" -#include "Bullet3Common/b3AlignedObjectArray.h" -#include "b3VectorFloat4.h" - -struct b3GjkPairDetector; - -inline b3Vector3 localGetSupportVertexWithMargin(const float4& supportVec, const struct b3ConvexPolyhedronData* hull, - const b3AlignedObjectArray& verticesA, b3Scalar margin) -{ - b3Vector3 supVec = b3MakeVector3(b3Scalar(0.), b3Scalar(0.), b3Scalar(0.)); - b3Scalar maxDot = b3Scalar(-B3_LARGE_FLOAT); - - // Here we take advantage of dot(a, b*c) = dot(a*b, c). Note: This is true mathematically, but not numerically. - if (0 < hull->m_numVertices) - { - const b3Vector3 scaled = supportVec; - int index = (int)scaled.maxDot(&verticesA[hull->m_vertexOffset], hull->m_numVertices, maxDot); - return verticesA[hull->m_vertexOffset + index]; - } - - return supVec; -} - -inline b3Vector3 localGetSupportVertexWithoutMargin(const float4& supportVec, const struct b3ConvexPolyhedronData* hull, - const b3AlignedObjectArray& verticesA) -{ - return localGetSupportVertexWithMargin(supportVec, hull, verticesA, 0.f); -} - -#endif //B3_SUPPORT_MAPPINGS_H diff --git a/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3TriangleCallback.h b/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3TriangleCallback.h deleted file mode 100644 index a0fd3e7a..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3TriangleCallback.h +++ /dev/null @@ -1,37 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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 B3_TRIANGLE_CALLBACK_H -#define B3_TRIANGLE_CALLBACK_H - -#include "Bullet3Common/b3Vector3.h" - -///The b3TriangleCallback provides a callback for each overlapping triangle when calling processAllTriangles. -///This callback is called by processAllTriangles for all b3ConcaveShape derived class, such as b3BvhTriangleMeshShape, b3StaticPlaneShape and b3HeightfieldTerrainShape. -class b3TriangleCallback -{ -public: - virtual ~b3TriangleCallback(); - virtual void processTriangle(b3Vector3* triangle, int partId, int triangleIndex) = 0; -}; - -class b3InternalTriangleIndexCallback -{ -public: - virtual ~b3InternalTriangleIndexCallback(); - virtual void internalProcessTriangleIndex(b3Vector3* triangle, int partId, int triangleIndex) = 0; -}; - -#endif //B3_TRIANGLE_CALLBACK_H diff --git a/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3TriangleIndexVertexArray.h b/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3TriangleIndexVertexArray.h deleted file mode 100644 index 57cbf03d..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3TriangleIndexVertexArray.h +++ /dev/null @@ -1,128 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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 B3_TRIANGLE_INDEX_VERTEX_ARRAY_H -#define B3_TRIANGLE_INDEX_VERTEX_ARRAY_H - -#include "b3StridingMeshInterface.h" -#include "Bullet3Common/b3AlignedObjectArray.h" -#include "Bullet3Common/b3Scalar.h" - -///The b3IndexedMesh indexes a single vertex and index array. Multiple b3IndexedMesh objects can be passed into a b3TriangleIndexVertexArray using addIndexedMesh. -///Instead of the number of indices, we pass the number of triangles. -B3_ATTRIBUTE_ALIGNED16(struct) -b3IndexedMesh -{ - B3_DECLARE_ALIGNED_ALLOCATOR(); - - int m_numTriangles; - const unsigned char* m_triangleIndexBase; - // Size in byte of the indices for one triangle (3*sizeof(index_type) if the indices are tightly packed) - int m_triangleIndexStride; - int m_numVertices; - const unsigned char* m_vertexBase; - // Size of a vertex, in bytes - int m_vertexStride; - - // The index type is set when adding an indexed mesh to the - // b3TriangleIndexVertexArray, do not set it manually - PHY_ScalarType m_indexType; - - // The vertex type has a default type similar to Bullet's precision mode (float or double) - // but can be set manually if you for example run Bullet with double precision but have - // mesh data in single precision.. - PHY_ScalarType m_vertexType; - - b3IndexedMesh() - : m_indexType(PHY_INTEGER), -#ifdef B3_USE_DOUBLE_PRECISION - m_vertexType(PHY_DOUBLE) -#else // B3_USE_DOUBLE_PRECISION - m_vertexType(PHY_FLOAT) -#endif // B3_USE_DOUBLE_PRECISION - { - } -}; - -typedef b3AlignedObjectArray IndexedMeshArray; - -///The b3TriangleIndexVertexArray allows to access multiple triangle meshes, by indexing into existing triangle/index arrays. -///Additional meshes can be added using addIndexedMesh -///No duplcate is made of the vertex/index data, it only indexes into external vertex/index arrays. -///So keep those arrays around during the lifetime of this b3TriangleIndexVertexArray. -B3_ATTRIBUTE_ALIGNED16(class) -b3TriangleIndexVertexArray : public b3StridingMeshInterface -{ -protected: - IndexedMeshArray m_indexedMeshes; - int m_pad[2]; - mutable int m_hasAabb; // using int instead of bool to maintain alignment - mutable b3Vector3 m_aabbMin; - mutable b3Vector3 m_aabbMax; - -public: - B3_DECLARE_ALIGNED_ALLOCATOR(); - - b3TriangleIndexVertexArray() : m_hasAabb(0) - { - } - - virtual ~b3TriangleIndexVertexArray(); - - //just to be backwards compatible - b3TriangleIndexVertexArray(int numTriangles, int* triangleIndexBase, int triangleIndexStride, int numVertices, b3Scalar* vertexBase, int vertexStride); - - void addIndexedMesh(const b3IndexedMesh& mesh, PHY_ScalarType indexType = PHY_INTEGER) - { - m_indexedMeshes.push_back(mesh); - m_indexedMeshes[m_indexedMeshes.size() - 1].m_indexType = indexType; - } - - virtual void getLockedVertexIndexBase(unsigned char** vertexbase, int& numverts, PHY_ScalarType& type, int& vertexStride, unsigned char** indexbase, int& indexstride, int& numfaces, PHY_ScalarType& indicestype, int subpart = 0); - - virtual void getLockedReadOnlyVertexIndexBase(const unsigned char** vertexbase, int& numverts, PHY_ScalarType& type, int& vertexStride, const unsigned char** indexbase, int& indexstride, int& numfaces, PHY_ScalarType& indicestype, int subpart = 0) const; - - /// 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) { (void)subpart; } - - virtual void unLockReadOnlyVertexBase(int subpart) const { (void)subpart; } - - /// getNumSubParts returns the number of separate subparts - /// each subpart has a continuous array of vertices and indices - virtual int getNumSubParts() const - { - return (int)m_indexedMeshes.size(); - } - - IndexedMeshArray& getIndexedMeshArray() - { - return m_indexedMeshes; - } - - const IndexedMeshArray& getIndexedMeshArray() const - { - return m_indexedMeshes; - } - - virtual void preallocateVertices(int numverts) { (void)numverts; } - virtual void preallocateIndices(int numindices) { (void)numindices; } - - virtual bool hasPremadeAabb() const; - virtual void setPremadeAabb(const b3Vector3& aabbMin, const b3Vector3& aabbMax) const; - virtual void getPremadeAabb(b3Vector3 * aabbMin, b3Vector3 * aabbMax) const; -}; - -#endif //B3_TRIANGLE_INDEX_VERTEX_ARRAY_H diff --git a/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3VectorFloat4.h b/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3VectorFloat4.h deleted file mode 100644 index 5cc4b5a6..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3VectorFloat4.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef B3_VECTOR_FLOAT4_H -#define B3_VECTOR_FLOAT4_H - -#include "Bullet3Common/b3Transform.h" - -//#define cross3(a,b) (a.cross(b)) -#define float4 b3Vector3 -//#define make_float4(x,y,z,w) b3Vector4(x,y,z,w) - -#endif //B3_VECTOR_FLOAT4_H diff --git a/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3VoronoiSimplexSolver.h b/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3VoronoiSimplexSolver.h deleted file mode 100644 index b40b1699..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/b3VoronoiSimplexSolver.h +++ /dev/null @@ -1,164 +0,0 @@ -/* -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 B3_VORONOI_SIMPLEX_SOLVER_H -#define B3_VORONOI_SIMPLEX_SOLVER_H - -#include "Bullet3Common/b3Vector3.h" - -#define VORONOI_SIMPLEX_MAX_VERTS 5 - -///disable next define, or use defaultCollisionConfiguration->getSimplexSolver()->setEqualVertexThreshold(0.f) to disable/configure -//#define BT_USE_EQUAL_VERTEX_THRESHOLD -#define VORONOI_DEFAULT_EQUAL_VERTEX_THRESHOLD 0.0001f - -struct b3UsageBitfield -{ - b3UsageBitfield() - { - reset(); - } - - void reset() - { - usedVertexA = false; - usedVertexB = false; - usedVertexC = false; - usedVertexD = false; - } - unsigned short usedVertexA : 1; - unsigned short usedVertexB : 1; - unsigned short usedVertexC : 1; - unsigned short usedVertexD : 1; - unsigned short unused1 : 1; - unsigned short unused2 : 1; - unsigned short unused3 : 1; - unsigned short unused4 : 1; -}; - -struct b3SubSimplexClosestResult -{ - b3Vector3 m_closestPointOnSimplex; - //MASK for m_usedVertices - //stores the simplex vertex-usage, using the MASK, - // if m_usedVertices & MASK then the related vertex is used - b3UsageBitfield m_usedVertices; - b3Scalar m_barycentricCoords[4]; - bool m_degenerate; - - void reset() - { - m_degenerate = false; - setBarycentricCoordinates(); - m_usedVertices.reset(); - } - bool isValid() - { - bool valid = (m_barycentricCoords[0] >= b3Scalar(0.)) && - (m_barycentricCoords[1] >= b3Scalar(0.)) && - (m_barycentricCoords[2] >= b3Scalar(0.)) && - (m_barycentricCoords[3] >= b3Scalar(0.)); - - return valid; - } - void setBarycentricCoordinates(b3Scalar a = b3Scalar(0.), b3Scalar b = b3Scalar(0.), b3Scalar c = b3Scalar(0.), b3Scalar d = b3Scalar(0.)) - { - m_barycentricCoords[0] = a; - m_barycentricCoords[1] = b; - m_barycentricCoords[2] = c; - m_barycentricCoords[3] = d; - } -}; - -/// b3VoronoiSimplexSolver is an implementation of the closest point distance algorithm from a 1-4 points simplex to the origin. -/// Can be used with GJK, as an alternative to Johnson distance algorithm. - -B3_ATTRIBUTE_ALIGNED16(class) -b3VoronoiSimplexSolver -{ -public: - B3_DECLARE_ALIGNED_ALLOCATOR(); - - int m_numVertices; - - b3Vector3 m_simplexVectorW[VORONOI_SIMPLEX_MAX_VERTS]; - b3Vector3 m_simplexPointsP[VORONOI_SIMPLEX_MAX_VERTS]; - b3Vector3 m_simplexPointsQ[VORONOI_SIMPLEX_MAX_VERTS]; - - b3Vector3 m_cachedP1; - b3Vector3 m_cachedP2; - b3Vector3 m_cachedV; - b3Vector3 m_lastW; - - b3Scalar m_equalVertexThreshold; - bool m_cachedValidClosest; - - b3SubSimplexClosestResult m_cachedBC; - - bool m_needsUpdate; - - void removeVertex(int index); - void reduceVertices(const b3UsageBitfield& usedVerts); - bool updateClosestVectorAndPoints(); - - bool closestPtPointTetrahedron(const b3Vector3& p, const b3Vector3& a, const b3Vector3& b, const b3Vector3& c, const b3Vector3& d, b3SubSimplexClosestResult& finalResult); - int pointOutsideOfPlane(const b3Vector3& p, const b3Vector3& a, const b3Vector3& b, const b3Vector3& c, const b3Vector3& d); - bool closestPtPointTriangle(const b3Vector3& p, const b3Vector3& a, const b3Vector3& b, const b3Vector3& c, b3SubSimplexClosestResult& result); - -public: - b3VoronoiSimplexSolver() - : m_equalVertexThreshold(VORONOI_DEFAULT_EQUAL_VERTEX_THRESHOLD) - { - } - void reset(); - - void addVertex(const b3Vector3& w, const b3Vector3& p, const b3Vector3& q); - - void setEqualVertexThreshold(b3Scalar threshold) - { - m_equalVertexThreshold = threshold; - } - - b3Scalar getEqualVertexThreshold() const - { - return m_equalVertexThreshold; - } - - bool closest(b3Vector3 & v); - - b3Scalar maxVertex(); - - bool fullSimplex() const - { - return (m_numVertices == 4); - } - - int getSimplex(b3Vector3 * pBuf, b3Vector3 * qBuf, b3Vector3 * yBuf) const; - - bool inSimplex(const b3Vector3& w); - - void backup_closest(b3Vector3 & v); - - bool emptySimplex() const; - - void compute_points(b3Vector3 & p1, b3Vector3 & p2); - - int numVertices() const - { - return m_numVertices; - } -}; - -#endif //B3_VORONOI_SIMPLEX_SOLVER_H diff --git a/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/bvhTraversal.h b/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/bvhTraversal.h deleted file mode 100644 index f1df8a69..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/bvhTraversal.h +++ /dev/null @@ -1,257 +0,0 @@ -//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project -static const char* bvhTraversalKernelCL = - "//keep this enum in sync with the CPU version (in btCollidable.h)\n" - "//written by Erwin Coumans\n" - "#define SHAPE_CONVEX_HULL 3\n" - "#define SHAPE_CONCAVE_TRIMESH 5\n" - "#define TRIANGLE_NUM_CONVEX_FACES 5\n" - "#define SHAPE_COMPOUND_OF_CONVEX_HULLS 6\n" - "#define SHAPE_SPHERE 7\n" - "typedef unsigned int u32;\n" - "#define MAX_NUM_PARTS_IN_BITS 10\n" - "///btQuantizedBvhNode is a compressed aabb node, 16 bytes.\n" - "///Node can be used for leafnode or internal node. Leafnodes can point to 32-bit triangle index (non-negative range).\n" - "typedef struct\n" - "{\n" - " //12 bytes\n" - " unsigned short int m_quantizedAabbMin[3];\n" - " unsigned short int m_quantizedAabbMax[3];\n" - " //4 bytes\n" - " int m_escapeIndexOrTriangleIndex;\n" - "} btQuantizedBvhNode;\n" - "typedef struct\n" - "{\n" - " float4 m_aabbMin;\n" - " float4 m_aabbMax;\n" - " float4 m_quantization;\n" - " int m_numNodes;\n" - " int m_numSubTrees;\n" - " int m_nodeOffset;\n" - " int m_subTreeOffset;\n" - "} b3BvhInfo;\n" - "int getTriangleIndex(const btQuantizedBvhNode* rootNode)\n" - "{\n" - " unsigned int x=0;\n" - " unsigned int y = (~(x&0))<<(31-MAX_NUM_PARTS_IN_BITS);\n" - " // Get only the lower bits where the triangle index is stored\n" - " return (rootNode->m_escapeIndexOrTriangleIndex&~(y));\n" - "}\n" - "int isLeaf(const btQuantizedBvhNode* rootNode)\n" - "{\n" - " //skipindex is negative (internal node), triangleindex >=0 (leafnode)\n" - " return (rootNode->m_escapeIndexOrTriangleIndex >= 0)? 1 : 0;\n" - "}\n" - " \n" - "int getEscapeIndex(const btQuantizedBvhNode* rootNode)\n" - "{\n" - " return -rootNode->m_escapeIndexOrTriangleIndex;\n" - "}\n" - "typedef struct\n" - "{\n" - " //12 bytes\n" - " unsigned short int m_quantizedAabbMin[3];\n" - " unsigned short int m_quantizedAabbMax[3];\n" - " //4 bytes, points to the root of the subtree\n" - " int m_rootNodeIndex;\n" - " //4 bytes\n" - " int m_subtreeSize;\n" - " int m_padding[3];\n" - "} btBvhSubtreeInfo;\n" - "///keep this in sync with btCollidable.h\n" - "typedef struct\n" - "{\n" - " int m_numChildShapes;\n" - " int blaat2;\n" - " int m_shapeType;\n" - " int m_shapeIndex;\n" - " \n" - "} btCollidableGpu;\n" - "typedef struct\n" - "{\n" - " float4 m_childPosition;\n" - " float4 m_childOrientation;\n" - " int m_shapeIndex;\n" - " int m_unused0;\n" - " int m_unused1;\n" - " int m_unused2;\n" - "} btGpuChildShape;\n" - "typedef struct\n" - "{\n" - " float4 m_pos;\n" - " float4 m_quat;\n" - " float4 m_linVel;\n" - " float4 m_angVel;\n" - " u32 m_collidableIdx;\n" - " float m_invMass;\n" - " float m_restituitionCoeff;\n" - " float m_frictionCoeff;\n" - "} BodyData;\n" - "typedef struct \n" - "{\n" - " union\n" - " {\n" - " float4 m_min;\n" - " float m_minElems[4];\n" - " int m_minIndices[4];\n" - " };\n" - " union\n" - " {\n" - " float4 m_max;\n" - " float m_maxElems[4];\n" - " int m_maxIndices[4];\n" - " };\n" - "} btAabbCL;\n" - "int testQuantizedAabbAgainstQuantizedAabb(\n" - " const unsigned short int* aabbMin1,\n" - " const unsigned short int* aabbMax1,\n" - " const unsigned short int* aabbMin2,\n" - " const unsigned short int* aabbMax2)\n" - "{\n" - " //int overlap = 1;\n" - " if (aabbMin1[0] > aabbMax2[0])\n" - " return 0;\n" - " if (aabbMax1[0] < aabbMin2[0])\n" - " return 0;\n" - " if (aabbMin1[1] > aabbMax2[1])\n" - " return 0;\n" - " if (aabbMax1[1] < aabbMin2[1])\n" - " return 0;\n" - " if (aabbMin1[2] > aabbMax2[2])\n" - " return 0;\n" - " if (aabbMax1[2] < aabbMin2[2])\n" - " return 0;\n" - " return 1;\n" - " //overlap = ((aabbMin1[0] > aabbMax2[0]) || (aabbMax1[0] < aabbMin2[0])) ? 0 : overlap;\n" - " //overlap = ((aabbMin1[2] > aabbMax2[2]) || (aabbMax1[2] < aabbMin2[2])) ? 0 : overlap;\n" - " //overlap = ((aabbMin1[1] > aabbMax2[1]) || (aabbMax1[1] < aabbMin2[1])) ? 0 : overlap;\n" - " //return overlap;\n" - "}\n" - "void quantizeWithClamp(unsigned short* out, float4 point2,int isMax, float4 bvhAabbMin, float4 bvhAabbMax, float4 bvhQuantization)\n" - "{\n" - " float4 clampedPoint = max(point2,bvhAabbMin);\n" - " clampedPoint = min (clampedPoint, bvhAabbMax);\n" - " float4 v = (clampedPoint - bvhAabbMin) * bvhQuantization;\n" - " if (isMax)\n" - " {\n" - " out[0] = (unsigned short) (((unsigned short)(v.x+1.f) | 1));\n" - " out[1] = (unsigned short) (((unsigned short)(v.y+1.f) | 1));\n" - " out[2] = (unsigned short) (((unsigned short)(v.z+1.f) | 1));\n" - " } else\n" - " {\n" - " out[0] = (unsigned short) (((unsigned short)(v.x) & 0xfffe));\n" - " out[1] = (unsigned short) (((unsigned short)(v.y) & 0xfffe));\n" - " out[2] = (unsigned short) (((unsigned short)(v.z) & 0xfffe));\n" - " }\n" - "}\n" - "// work-in-progress\n" - "__kernel void bvhTraversalKernel( __global const int4* pairs, \n" - " __global const BodyData* rigidBodies, \n" - " __global const btCollidableGpu* collidables,\n" - " __global btAabbCL* aabbs,\n" - " __global int4* concavePairsOut,\n" - " __global volatile int* numConcavePairsOut,\n" - " __global const btBvhSubtreeInfo* subtreeHeadersRoot,\n" - " __global const btQuantizedBvhNode* quantizedNodesRoot,\n" - " __global const b3BvhInfo* bvhInfos,\n" - " int numPairs,\n" - " int maxNumConcavePairsCapacity)\n" - "{\n" - " int id = get_global_id(0);\n" - " if (id>=numPairs)\n" - " return;\n" - " \n" - " int bodyIndexA = pairs[id].x;\n" - " int bodyIndexB = pairs[id].y;\n" - " int collidableIndexA = rigidBodies[bodyIndexA].m_collidableIdx;\n" - " int collidableIndexB = rigidBodies[bodyIndexB].m_collidableIdx;\n" - " \n" - " //once the broadphase avoids static-static pairs, we can remove this test\n" - " if ((rigidBodies[bodyIndexA].m_invMass==0) &&(rigidBodies[bodyIndexB].m_invMass==0))\n" - " {\n" - " return;\n" - " }\n" - " \n" - " if (collidables[collidableIndexA].m_shapeType!=SHAPE_CONCAVE_TRIMESH)\n" - " return;\n" - " int shapeTypeB = collidables[collidableIndexB].m_shapeType;\n" - " \n" - " if (shapeTypeB!=SHAPE_CONVEX_HULL &&\n" - " shapeTypeB!=SHAPE_SPHERE &&\n" - " shapeTypeB!=SHAPE_COMPOUND_OF_CONVEX_HULLS\n" - " )\n" - " return;\n" - " b3BvhInfo bvhInfo = bvhInfos[collidables[collidableIndexA].m_numChildShapes];\n" - " float4 bvhAabbMin = bvhInfo.m_aabbMin;\n" - " float4 bvhAabbMax = bvhInfo.m_aabbMax;\n" - " float4 bvhQuantization = bvhInfo.m_quantization;\n" - " int numSubtreeHeaders = bvhInfo.m_numSubTrees;\n" - " __global const btBvhSubtreeInfo* subtreeHeaders = &subtreeHeadersRoot[bvhInfo.m_subTreeOffset];\n" - " __global const btQuantizedBvhNode* quantizedNodes = &quantizedNodesRoot[bvhInfo.m_nodeOffset];\n" - " \n" - " unsigned short int quantizedQueryAabbMin[3];\n" - " unsigned short int quantizedQueryAabbMax[3];\n" - " quantizeWithClamp(quantizedQueryAabbMin,aabbs[bodyIndexB].m_min,false,bvhAabbMin, bvhAabbMax,bvhQuantization);\n" - " quantizeWithClamp(quantizedQueryAabbMax,aabbs[bodyIndexB].m_max,true ,bvhAabbMin, bvhAabbMax,bvhQuantization);\n" - " \n" - " for (int i=0;i\n" - " *\n" - " * This file was ported from mpr.c file, part of libccd.\n" - " * The Minkoski Portal Refinement implementation was ported \n" - " * to OpenCL by Erwin Coumans for the Bullet 3 Physics library.\n" - " * at http://github.com/erwincoumans/bullet3\n" - " *\n" - " * Distributed under the OSI-approved BSD License (the \"License\");\n" - " * see .\n" - " * This software is distributed WITHOUT ANY WARRANTY; without even the\n" - " * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" - " * See the License for more information.\n" - " */\n" - "#ifndef B3_MPR_PENETRATION_H\n" - "#define B3_MPR_PENETRATION_H\n" - "#ifndef B3_PLATFORM_DEFINITIONS_H\n" - "#define B3_PLATFORM_DEFINITIONS_H\n" - "struct MyTest\n" - "{\n" - " int bla;\n" - "};\n" - "#ifdef __cplusplus\n" - "#else\n" - "//keep B3_LARGE_FLOAT*B3_LARGE_FLOAT < FLT_MAX\n" - "#define B3_LARGE_FLOAT 1e18f\n" - "#define B3_INFINITY 1e18f\n" - "#define b3Assert(a)\n" - "#define b3ConstArray(a) __global const a*\n" - "#define b3AtomicInc atomic_inc\n" - "#define b3AtomicAdd atomic_add\n" - "#define b3Fabs fabs\n" - "#define b3Sqrt native_sqrt\n" - "#define b3Sin native_sin\n" - "#define b3Cos native_cos\n" - "#define B3_STATIC\n" - "#endif\n" - "#endif\n" - "#ifndef B3_FLOAT4_H\n" - "#define B3_FLOAT4_H\n" - "#ifndef B3_PLATFORM_DEFINITIONS_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#endif\n" - "#endif\n" - "#ifdef __cplusplus\n" - "#else\n" - " typedef float4 b3Float4;\n" - " #define b3Float4ConstArg const b3Float4\n" - " #define b3MakeFloat4 (float4)\n" - " float b3Dot3F4(b3Float4ConstArg v0,b3Float4ConstArg v1)\n" - " {\n" - " float4 a1 = b3MakeFloat4(v0.xyz,0.f);\n" - " float4 b1 = b3MakeFloat4(v1.xyz,0.f);\n" - " return dot(a1, b1);\n" - " }\n" - " b3Float4 b3Cross3(b3Float4ConstArg v0,b3Float4ConstArg v1)\n" - " {\n" - " float4 a1 = b3MakeFloat4(v0.xyz,0.f);\n" - " float4 b1 = b3MakeFloat4(v1.xyz,0.f);\n" - " return cross(a1, b1);\n" - " }\n" - " #define b3MinFloat4 min\n" - " #define b3MaxFloat4 max\n" - " #define b3Normalized(a) normalize(a)\n" - "#endif \n" - " \n" - "inline bool b3IsAlmostZero(b3Float4ConstArg v)\n" - "{\n" - " if(b3Fabs(v.x)>1e-6 || b3Fabs(v.y)>1e-6 || b3Fabs(v.z)>1e-6) \n" - " return false;\n" - " return true;\n" - "}\n" - "inline int b3MaxDot( b3Float4ConstArg vec, __global const b3Float4* vecArray, int vecLen, float* dotOut )\n" - "{\n" - " float maxDot = -B3_INFINITY;\n" - " int i = 0;\n" - " int ptIndex = -1;\n" - " for( i = 0; i < vecLen; i++ )\n" - " {\n" - " float dot = b3Dot3F4(vecArray[i],vec);\n" - " \n" - " if( dot > maxDot )\n" - " {\n" - " maxDot = dot;\n" - " ptIndex = i;\n" - " }\n" - " }\n" - " b3Assert(ptIndex>=0);\n" - " if (ptIndex<0)\n" - " {\n" - " ptIndex = 0;\n" - " }\n" - " *dotOut = maxDot;\n" - " return ptIndex;\n" - "}\n" - "#endif //B3_FLOAT4_H\n" - "#ifndef B3_RIGIDBODY_DATA_H\n" - "#define B3_RIGIDBODY_DATA_H\n" - "#ifndef B3_FLOAT4_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#endif \n" - "#endif //B3_FLOAT4_H\n" - "#ifndef B3_QUAT_H\n" - "#define B3_QUAT_H\n" - "#ifndef B3_PLATFORM_DEFINITIONS_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#endif\n" - "#endif\n" - "#ifndef B3_FLOAT4_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#endif \n" - "#endif //B3_FLOAT4_H\n" - "#ifdef __cplusplus\n" - "#else\n" - " typedef float4 b3Quat;\n" - " #define b3QuatConstArg const b3Quat\n" - " \n" - " \n" - "inline float4 b3FastNormalize4(float4 v)\n" - "{\n" - " v = (float4)(v.xyz,0.f);\n" - " return fast_normalize(v);\n" - "}\n" - " \n" - "inline b3Quat b3QuatMul(b3Quat a, b3Quat b);\n" - "inline b3Quat b3QuatNormalized(b3QuatConstArg in);\n" - "inline b3Quat b3QuatRotate(b3QuatConstArg q, b3QuatConstArg vec);\n" - "inline b3Quat b3QuatInvert(b3QuatConstArg q);\n" - "inline b3Quat b3QuatInverse(b3QuatConstArg q);\n" - "inline b3Quat b3QuatMul(b3QuatConstArg a, b3QuatConstArg b)\n" - "{\n" - " b3Quat ans;\n" - " ans = b3Cross3( a, b );\n" - " ans += a.w*b+b.w*a;\n" - "// ans.w = a.w*b.w - (a.x*b.x+a.y*b.y+a.z*b.z);\n" - " ans.w = a.w*b.w - b3Dot3F4(a, b);\n" - " return ans;\n" - "}\n" - "inline b3Quat b3QuatNormalized(b3QuatConstArg in)\n" - "{\n" - " b3Quat q;\n" - " q=in;\n" - " //return b3FastNormalize4(in);\n" - " float len = native_sqrt(dot(q, q));\n" - " if(len > 0.f)\n" - " {\n" - " q *= 1.f / len;\n" - " }\n" - " else\n" - " {\n" - " q.x = q.y = q.z = 0.f;\n" - " q.w = 1.f;\n" - " }\n" - " return q;\n" - "}\n" - "inline float4 b3QuatRotate(b3QuatConstArg q, b3QuatConstArg vec)\n" - "{\n" - " b3Quat qInv = b3QuatInvert( q );\n" - " float4 vcpy = vec;\n" - " vcpy.w = 0.f;\n" - " float4 out = b3QuatMul(b3QuatMul(q,vcpy),qInv);\n" - " return out;\n" - "}\n" - "inline b3Quat b3QuatInverse(b3QuatConstArg q)\n" - "{\n" - " return (b3Quat)(-q.xyz, q.w);\n" - "}\n" - "inline b3Quat b3QuatInvert(b3QuatConstArg q)\n" - "{\n" - " return (b3Quat)(-q.xyz, q.w);\n" - "}\n" - "inline float4 b3QuatInvRotate(b3QuatConstArg q, b3QuatConstArg vec)\n" - "{\n" - " return b3QuatRotate( b3QuatInvert( q ), vec );\n" - "}\n" - "inline b3Float4 b3TransformPoint(b3Float4ConstArg point, b3Float4ConstArg translation, b3QuatConstArg orientation)\n" - "{\n" - " return b3QuatRotate( orientation, point ) + (translation);\n" - "}\n" - " \n" - "#endif \n" - "#endif //B3_QUAT_H\n" - "#ifndef B3_MAT3x3_H\n" - "#define B3_MAT3x3_H\n" - "#ifndef B3_QUAT_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#endif \n" - "#endif //B3_QUAT_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "typedef struct\n" - "{\n" - " b3Float4 m_row[3];\n" - "}b3Mat3x3;\n" - "#define b3Mat3x3ConstArg const b3Mat3x3\n" - "#define b3GetRow(m,row) (m.m_row[row])\n" - "inline b3Mat3x3 b3QuatGetRotationMatrix(b3Quat quat)\n" - "{\n" - " b3Float4 quat2 = (b3Float4)(quat.x*quat.x, quat.y*quat.y, quat.z*quat.z, 0.f);\n" - " b3Mat3x3 out;\n" - " out.m_row[0].x=1-2*quat2.y-2*quat2.z;\n" - " out.m_row[0].y=2*quat.x*quat.y-2*quat.w*quat.z;\n" - " out.m_row[0].z=2*quat.x*quat.z+2*quat.w*quat.y;\n" - " out.m_row[0].w = 0.f;\n" - " out.m_row[1].x=2*quat.x*quat.y+2*quat.w*quat.z;\n" - " out.m_row[1].y=1-2*quat2.x-2*quat2.z;\n" - " out.m_row[1].z=2*quat.y*quat.z-2*quat.w*quat.x;\n" - " out.m_row[1].w = 0.f;\n" - " out.m_row[2].x=2*quat.x*quat.z-2*quat.w*quat.y;\n" - " out.m_row[2].y=2*quat.y*quat.z+2*quat.w*quat.x;\n" - " out.m_row[2].z=1-2*quat2.x-2*quat2.y;\n" - " out.m_row[2].w = 0.f;\n" - " return out;\n" - "}\n" - "inline b3Mat3x3 b3AbsoluteMat3x3(b3Mat3x3ConstArg matIn)\n" - "{\n" - " b3Mat3x3 out;\n" - " out.m_row[0] = fabs(matIn.m_row[0]);\n" - " out.m_row[1] = fabs(matIn.m_row[1]);\n" - " out.m_row[2] = fabs(matIn.m_row[2]);\n" - " return out;\n" - "}\n" - "__inline\n" - "b3Mat3x3 mtZero();\n" - "__inline\n" - "b3Mat3x3 mtIdentity();\n" - "__inline\n" - "b3Mat3x3 mtTranspose(b3Mat3x3 m);\n" - "__inline\n" - "b3Mat3x3 mtMul(b3Mat3x3 a, b3Mat3x3 b);\n" - "__inline\n" - "b3Float4 mtMul1(b3Mat3x3 a, b3Float4 b);\n" - "__inline\n" - "b3Float4 mtMul3(b3Float4 a, b3Mat3x3 b);\n" - "__inline\n" - "b3Mat3x3 mtZero()\n" - "{\n" - " b3Mat3x3 m;\n" - " m.m_row[0] = (b3Float4)(0.f);\n" - " m.m_row[1] = (b3Float4)(0.f);\n" - " m.m_row[2] = (b3Float4)(0.f);\n" - " return m;\n" - "}\n" - "__inline\n" - "b3Mat3x3 mtIdentity()\n" - "{\n" - " b3Mat3x3 m;\n" - " m.m_row[0] = (b3Float4)(1,0,0,0);\n" - " m.m_row[1] = (b3Float4)(0,1,0,0);\n" - " m.m_row[2] = (b3Float4)(0,0,1,0);\n" - " return m;\n" - "}\n" - "__inline\n" - "b3Mat3x3 mtTranspose(b3Mat3x3 m)\n" - "{\n" - " b3Mat3x3 out;\n" - " out.m_row[0] = (b3Float4)(m.m_row[0].x, m.m_row[1].x, m.m_row[2].x, 0.f);\n" - " out.m_row[1] = (b3Float4)(m.m_row[0].y, m.m_row[1].y, m.m_row[2].y, 0.f);\n" - " out.m_row[2] = (b3Float4)(m.m_row[0].z, m.m_row[1].z, m.m_row[2].z, 0.f);\n" - " return out;\n" - "}\n" - "__inline\n" - "b3Mat3x3 mtMul(b3Mat3x3 a, b3Mat3x3 b)\n" - "{\n" - " b3Mat3x3 transB;\n" - " transB = mtTranspose( b );\n" - " b3Mat3x3 ans;\n" - " // why this doesn't run when 0ing in the for{}\n" - " a.m_row[0].w = 0.f;\n" - " a.m_row[1].w = 0.f;\n" - " a.m_row[2].w = 0.f;\n" - " for(int i=0; i<3; i++)\n" - " {\n" - "// a.m_row[i].w = 0.f;\n" - " ans.m_row[i].x = b3Dot3F4(a.m_row[i],transB.m_row[0]);\n" - " ans.m_row[i].y = b3Dot3F4(a.m_row[i],transB.m_row[1]);\n" - " ans.m_row[i].z = b3Dot3F4(a.m_row[i],transB.m_row[2]);\n" - " ans.m_row[i].w = 0.f;\n" - " }\n" - " return ans;\n" - "}\n" - "__inline\n" - "b3Float4 mtMul1(b3Mat3x3 a, b3Float4 b)\n" - "{\n" - " b3Float4 ans;\n" - " ans.x = b3Dot3F4( a.m_row[0], b );\n" - " ans.y = b3Dot3F4( a.m_row[1], b );\n" - " ans.z = b3Dot3F4( a.m_row[2], b );\n" - " ans.w = 0.f;\n" - " return ans;\n" - "}\n" - "__inline\n" - "b3Float4 mtMul3(b3Float4 a, b3Mat3x3 b)\n" - "{\n" - " b3Float4 colx = b3MakeFloat4(b.m_row[0].x, b.m_row[1].x, b.m_row[2].x, 0);\n" - " b3Float4 coly = b3MakeFloat4(b.m_row[0].y, b.m_row[1].y, b.m_row[2].y, 0);\n" - " b3Float4 colz = b3MakeFloat4(b.m_row[0].z, b.m_row[1].z, b.m_row[2].z, 0);\n" - " b3Float4 ans;\n" - " ans.x = b3Dot3F4( a, colx );\n" - " ans.y = b3Dot3F4( a, coly );\n" - " ans.z = b3Dot3F4( a, colz );\n" - " return ans;\n" - "}\n" - "#endif\n" - "#endif //B3_MAT3x3_H\n" - "typedef struct b3RigidBodyData b3RigidBodyData_t;\n" - "struct b3RigidBodyData\n" - "{\n" - " b3Float4 m_pos;\n" - " b3Quat m_quat;\n" - " b3Float4 m_linVel;\n" - " b3Float4 m_angVel;\n" - " int m_collidableIdx;\n" - " float m_invMass;\n" - " float m_restituitionCoeff;\n" - " float m_frictionCoeff;\n" - "};\n" - "typedef struct b3InertiaData b3InertiaData_t;\n" - "struct b3InertiaData\n" - "{\n" - " b3Mat3x3 m_invInertiaWorld;\n" - " b3Mat3x3 m_initInvInertia;\n" - "};\n" - "#endif //B3_RIGIDBODY_DATA_H\n" - " \n" - "#ifndef B3_CONVEX_POLYHEDRON_DATA_H\n" - "#define B3_CONVEX_POLYHEDRON_DATA_H\n" - "#ifndef B3_FLOAT4_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#endif \n" - "#endif //B3_FLOAT4_H\n" - "#ifndef B3_QUAT_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#endif \n" - "#endif //B3_QUAT_H\n" - "typedef struct b3GpuFace b3GpuFace_t;\n" - "struct b3GpuFace\n" - "{\n" - " b3Float4 m_plane;\n" - " int m_indexOffset;\n" - " int m_numIndices;\n" - " int m_unusedPadding1;\n" - " int m_unusedPadding2;\n" - "};\n" - "typedef struct b3ConvexPolyhedronData b3ConvexPolyhedronData_t;\n" - "struct b3ConvexPolyhedronData\n" - "{\n" - " b3Float4 m_localCenter;\n" - " b3Float4 m_extents;\n" - " b3Float4 mC;\n" - " b3Float4 mE;\n" - " float m_radius;\n" - " int m_faceOffset;\n" - " int m_numFaces;\n" - " int m_numVertices;\n" - " int m_vertexOffset;\n" - " int m_uniqueEdgesOffset;\n" - " int m_numUniqueEdges;\n" - " int m_unused;\n" - "};\n" - "#endif //B3_CONVEX_POLYHEDRON_DATA_H\n" - "#ifndef B3_COLLIDABLE_H\n" - "#define B3_COLLIDABLE_H\n" - "#ifndef B3_FLOAT4_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#endif \n" - "#endif //B3_FLOAT4_H\n" - "#ifndef B3_QUAT_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#endif \n" - "#endif //B3_QUAT_H\n" - "enum b3ShapeTypes\n" - "{\n" - " SHAPE_HEIGHT_FIELD=1,\n" - " SHAPE_CONVEX_HULL=3,\n" - " SHAPE_PLANE=4,\n" - " SHAPE_CONCAVE_TRIMESH=5,\n" - " SHAPE_COMPOUND_OF_CONVEX_HULLS=6,\n" - " SHAPE_SPHERE=7,\n" - " MAX_NUM_SHAPE_TYPES,\n" - "};\n" - "typedef struct b3Collidable b3Collidable_t;\n" - "struct b3Collidable\n" - "{\n" - " union {\n" - " int m_numChildShapes;\n" - " int m_bvhIndex;\n" - " };\n" - " union\n" - " {\n" - " float m_radius;\n" - " int m_compoundBvhIndex;\n" - " };\n" - " int m_shapeType;\n" - " int m_shapeIndex;\n" - "};\n" - "typedef struct b3GpuChildShape b3GpuChildShape_t;\n" - "struct b3GpuChildShape\n" - "{\n" - " b3Float4 m_childPosition;\n" - " b3Quat m_childOrientation;\n" - " int m_shapeIndex;\n" - " int m_unused0;\n" - " int m_unused1;\n" - " int m_unused2;\n" - "};\n" - "struct b3CompoundOverlappingPair\n" - "{\n" - " int m_bodyIndexA;\n" - " int m_bodyIndexB;\n" - "// int m_pairType;\n" - " int m_childShapeIndexA;\n" - " int m_childShapeIndexB;\n" - "};\n" - "#endif //B3_COLLIDABLE_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#define B3_MPR_SQRT sqrt\n" - "#endif\n" - "#define B3_MPR_FMIN(x, y) ((x) < (y) ? (x) : (y))\n" - "#define B3_MPR_FABS fabs\n" - "#define B3_MPR_TOLERANCE 1E-6f\n" - "#define B3_MPR_MAX_ITERATIONS 1000\n" - "struct _b3MprSupport_t \n" - "{\n" - " b3Float4 v; //!< Support point in minkowski sum\n" - " b3Float4 v1; //!< Support point in obj1\n" - " b3Float4 v2; //!< Support point in obj2\n" - "};\n" - "typedef struct _b3MprSupport_t b3MprSupport_t;\n" - "struct _b3MprSimplex_t \n" - "{\n" - " b3MprSupport_t ps[4];\n" - " int last; //!< index of last added point\n" - "};\n" - "typedef struct _b3MprSimplex_t b3MprSimplex_t;\n" - "inline b3MprSupport_t* b3MprSimplexPointW(b3MprSimplex_t *s, int idx)\n" - "{\n" - " return &s->ps[idx];\n" - "}\n" - "inline void b3MprSimplexSetSize(b3MprSimplex_t *s, int size)\n" - "{\n" - " s->last = size - 1;\n" - "}\n" - "inline int b3MprSimplexSize(const b3MprSimplex_t *s)\n" - "{\n" - " return s->last + 1;\n" - "}\n" - "inline const b3MprSupport_t* b3MprSimplexPoint(const b3MprSimplex_t* s, int idx)\n" - "{\n" - " // here is no check on boundaries\n" - " return &s->ps[idx];\n" - "}\n" - "inline void b3MprSupportCopy(b3MprSupport_t *d, const b3MprSupport_t *s)\n" - "{\n" - " *d = *s;\n" - "}\n" - "inline void b3MprSimplexSet(b3MprSimplex_t *s, size_t pos, const b3MprSupport_t *a)\n" - "{\n" - " b3MprSupportCopy(s->ps + pos, a);\n" - "}\n" - "inline void b3MprSimplexSwap(b3MprSimplex_t *s, size_t pos1, size_t pos2)\n" - "{\n" - " b3MprSupport_t supp;\n" - " b3MprSupportCopy(&supp, &s->ps[pos1]);\n" - " b3MprSupportCopy(&s->ps[pos1], &s->ps[pos2]);\n" - " b3MprSupportCopy(&s->ps[pos2], &supp);\n" - "}\n" - "inline int b3MprIsZero(float val)\n" - "{\n" - " return B3_MPR_FABS(val) < FLT_EPSILON;\n" - "}\n" - "inline int b3MprEq(float _a, float _b)\n" - "{\n" - " float ab;\n" - " float a, b;\n" - " ab = B3_MPR_FABS(_a - _b);\n" - " if (B3_MPR_FABS(ab) < FLT_EPSILON)\n" - " return 1;\n" - " a = B3_MPR_FABS(_a);\n" - " b = B3_MPR_FABS(_b);\n" - " if (b > a){\n" - " return ab < FLT_EPSILON * b;\n" - " }else{\n" - " return ab < FLT_EPSILON * a;\n" - " }\n" - "}\n" - "inline int b3MprVec3Eq(const b3Float4* a, const b3Float4 *b)\n" - "{\n" - " return b3MprEq((*a).x, (*b).x)\n" - " && b3MprEq((*a).y, (*b).y)\n" - " && b3MprEq((*a).z, (*b).z);\n" - "}\n" - "inline b3Float4 b3LocalGetSupportVertex(b3Float4ConstArg supportVec,__global const b3ConvexPolyhedronData_t* hull, b3ConstArray(b3Float4) verticesA)\n" - "{\n" - " b3Float4 supVec = b3MakeFloat4(0,0,0,0);\n" - " float maxDot = -B3_LARGE_FLOAT;\n" - " if( 0 < hull->m_numVertices )\n" - " {\n" - " const b3Float4 scaled = supportVec;\n" - " int index = b3MaxDot(scaled, &verticesA[hull->m_vertexOffset], hull->m_numVertices, &maxDot);\n" - " return verticesA[hull->m_vertexOffset+index];\n" - " }\n" - " return supVec;\n" - "}\n" - "B3_STATIC void b3MprConvexSupport(int pairIndex,int bodyIndex, b3ConstArray(b3RigidBodyData_t) cpuBodyBuf, \n" - " b3ConstArray(b3ConvexPolyhedronData_t) cpuConvexData, \n" - " b3ConstArray(b3Collidable_t) cpuCollidables,\n" - " b3ConstArray(b3Float4) cpuVertices,\n" - " __global b3Float4* sepAxis,\n" - " const b3Float4* _dir, b3Float4* outp, int logme)\n" - "{\n" - " //dir is in worldspace, move to local space\n" - " \n" - " b3Float4 pos = cpuBodyBuf[bodyIndex].m_pos;\n" - " b3Quat orn = cpuBodyBuf[bodyIndex].m_quat;\n" - " \n" - " b3Float4 dir = b3MakeFloat4((*_dir).x,(*_dir).y,(*_dir).z,0.f);\n" - " \n" - " const b3Float4 localDir = b3QuatRotate(b3QuatInverse(orn),dir);\n" - " \n" - " //find local support vertex\n" - " int colIndex = cpuBodyBuf[bodyIndex].m_collidableIdx;\n" - " \n" - " b3Assert(cpuCollidables[colIndex].m_shapeType==SHAPE_CONVEX_HULL);\n" - " __global const b3ConvexPolyhedronData_t* hull = &cpuConvexData[cpuCollidables[colIndex].m_shapeIndex];\n" - " \n" - " b3Float4 pInA;\n" - " if (logme)\n" - " {\n" - " b3Float4 supVec = b3MakeFloat4(0,0,0,0);\n" - " float maxDot = -B3_LARGE_FLOAT;\n" - " if( 0 < hull->m_numVertices )\n" - " {\n" - " const b3Float4 scaled = localDir;\n" - " int index = b3MaxDot(scaled, &cpuVertices[hull->m_vertexOffset], hull->m_numVertices, &maxDot);\n" - " pInA = cpuVertices[hull->m_vertexOffset+index];\n" - " \n" - " }\n" - " } else\n" - " {\n" - " pInA = b3LocalGetSupportVertex(localDir,hull,cpuVertices);\n" - " }\n" - " //move vertex to world space\n" - " *outp = b3TransformPoint(pInA,pos,orn);\n" - " \n" - "}\n" - "inline void b3MprSupport(int pairIndex,int bodyIndexA, int bodyIndexB, b3ConstArray(b3RigidBodyData_t) cpuBodyBuf, \n" - " b3ConstArray(b3ConvexPolyhedronData_t) cpuConvexData, \n" - " b3ConstArray(b3Collidable_t) cpuCollidables,\n" - " b3ConstArray(b3Float4) cpuVertices,\n" - " __global b3Float4* sepAxis,\n" - " const b3Float4* _dir, b3MprSupport_t *supp)\n" - "{\n" - " b3Float4 dir;\n" - " dir = *_dir;\n" - " b3MprConvexSupport(pairIndex,bodyIndexA,cpuBodyBuf,cpuConvexData,cpuCollidables,cpuVertices,sepAxis,&dir, &supp->v1,0);\n" - " dir = *_dir*-1.f;\n" - " b3MprConvexSupport(pairIndex,bodyIndexB,cpuBodyBuf,cpuConvexData,cpuCollidables,cpuVertices,sepAxis,&dir, &supp->v2,0);\n" - " supp->v = supp->v1 - supp->v2;\n" - "}\n" - "inline void b3FindOrigin(int bodyIndexA, int bodyIndexB, b3ConstArray(b3RigidBodyData_t) cpuBodyBuf, b3MprSupport_t *center)\n" - "{\n" - " center->v1 = cpuBodyBuf[bodyIndexA].m_pos;\n" - " center->v2 = cpuBodyBuf[bodyIndexB].m_pos;\n" - " center->v = center->v1 - center->v2;\n" - "}\n" - "inline void b3MprVec3Set(b3Float4 *v, float x, float y, float z)\n" - "{\n" - " (*v).x = x;\n" - " (*v).y = y;\n" - " (*v).z = z;\n" - " (*v).w = 0.f;\n" - "}\n" - "inline void b3MprVec3Add(b3Float4 *v, const b3Float4 *w)\n" - "{\n" - " (*v).x += (*w).x;\n" - " (*v).y += (*w).y;\n" - " (*v).z += (*w).z;\n" - "}\n" - "inline void b3MprVec3Copy(b3Float4 *v, const b3Float4 *w)\n" - "{\n" - " *v = *w;\n" - "}\n" - "inline void b3MprVec3Scale(b3Float4 *d, float k)\n" - "{\n" - " *d *= k;\n" - "}\n" - "inline float b3MprVec3Dot(const b3Float4 *a, const b3Float4 *b)\n" - "{\n" - " float dot;\n" - " dot = b3Dot3F4(*a,*b);\n" - " return dot;\n" - "}\n" - "inline float b3MprVec3Len2(const b3Float4 *v)\n" - "{\n" - " return b3MprVec3Dot(v, v);\n" - "}\n" - "inline void b3MprVec3Normalize(b3Float4 *d)\n" - "{\n" - " float k = 1.f / B3_MPR_SQRT(b3MprVec3Len2(d));\n" - " b3MprVec3Scale(d, k);\n" - "}\n" - "inline void b3MprVec3Cross(b3Float4 *d, const b3Float4 *a, const b3Float4 *b)\n" - "{\n" - " *d = b3Cross3(*a,*b);\n" - " \n" - "}\n" - "inline void b3MprVec3Sub2(b3Float4 *d, const b3Float4 *v, const b3Float4 *w)\n" - "{\n" - " *d = *v - *w;\n" - "}\n" - "inline void b3PortalDir(const b3MprSimplex_t *portal, b3Float4 *dir)\n" - "{\n" - " b3Float4 v2v1, v3v1;\n" - " b3MprVec3Sub2(&v2v1, &b3MprSimplexPoint(portal, 2)->v,\n" - " &b3MprSimplexPoint(portal, 1)->v);\n" - " b3MprVec3Sub2(&v3v1, &b3MprSimplexPoint(portal, 3)->v,\n" - " &b3MprSimplexPoint(portal, 1)->v);\n" - " b3MprVec3Cross(dir, &v2v1, &v3v1);\n" - " b3MprVec3Normalize(dir);\n" - "}\n" - "inline int portalEncapsulesOrigin(const b3MprSimplex_t *portal,\n" - " const b3Float4 *dir)\n" - "{\n" - " float dot;\n" - " dot = b3MprVec3Dot(dir, &b3MprSimplexPoint(portal, 1)->v);\n" - " return b3MprIsZero(dot) || dot > 0.f;\n" - "}\n" - "inline int portalReachTolerance(const b3MprSimplex_t *portal,\n" - " const b3MprSupport_t *v4,\n" - " const b3Float4 *dir)\n" - "{\n" - " float dv1, dv2, dv3, dv4;\n" - " float dot1, dot2, dot3;\n" - " // find the smallest dot product of dir and {v1-v4, v2-v4, v3-v4}\n" - " dv1 = b3MprVec3Dot(&b3MprSimplexPoint(portal, 1)->v, dir);\n" - " dv2 = b3MprVec3Dot(&b3MprSimplexPoint(portal, 2)->v, dir);\n" - " dv3 = b3MprVec3Dot(&b3MprSimplexPoint(portal, 3)->v, dir);\n" - " dv4 = b3MprVec3Dot(&v4->v, dir);\n" - " dot1 = dv4 - dv1;\n" - " dot2 = dv4 - dv2;\n" - " dot3 = dv4 - dv3;\n" - " dot1 = B3_MPR_FMIN(dot1, dot2);\n" - " dot1 = B3_MPR_FMIN(dot1, dot3);\n" - " return b3MprEq(dot1, B3_MPR_TOLERANCE) || dot1 < B3_MPR_TOLERANCE;\n" - "}\n" - "inline int portalCanEncapsuleOrigin(const b3MprSimplex_t *portal, \n" - " const b3MprSupport_t *v4,\n" - " const b3Float4 *dir)\n" - "{\n" - " float dot;\n" - " dot = b3MprVec3Dot(&v4->v, dir);\n" - " return b3MprIsZero(dot) || dot > 0.f;\n" - "}\n" - "inline void b3ExpandPortal(b3MprSimplex_t *portal,\n" - " const b3MprSupport_t *v4)\n" - "{\n" - " float dot;\n" - " b3Float4 v4v0;\n" - " b3MprVec3Cross(&v4v0, &v4->v, &b3MprSimplexPoint(portal, 0)->v);\n" - " dot = b3MprVec3Dot(&b3MprSimplexPoint(portal, 1)->v, &v4v0);\n" - " if (dot > 0.f){\n" - " dot = b3MprVec3Dot(&b3MprSimplexPoint(portal, 2)->v, &v4v0);\n" - " if (dot > 0.f){\n" - " b3MprSimplexSet(portal, 1, v4);\n" - " }else{\n" - " b3MprSimplexSet(portal, 3, v4);\n" - " }\n" - " }else{\n" - " dot = b3MprVec3Dot(&b3MprSimplexPoint(portal, 3)->v, &v4v0);\n" - " if (dot > 0.f){\n" - " b3MprSimplexSet(portal, 2, v4);\n" - " }else{\n" - " b3MprSimplexSet(portal, 1, v4);\n" - " }\n" - " }\n" - "}\n" - "B3_STATIC int b3DiscoverPortal(int pairIndex, int bodyIndexA, int bodyIndexB, b3ConstArray(b3RigidBodyData_t) cpuBodyBuf, \n" - " b3ConstArray(b3ConvexPolyhedronData_t) cpuConvexData, \n" - " b3ConstArray(b3Collidable_t) cpuCollidables,\n" - " b3ConstArray(b3Float4) cpuVertices,\n" - " __global b3Float4* sepAxis,\n" - " __global int* hasSepAxis,\n" - " b3MprSimplex_t *portal)\n" - "{\n" - " b3Float4 dir, va, vb;\n" - " float dot;\n" - " int cont;\n" - " \n" - " \n" - " // vertex 0 is center of portal\n" - " b3FindOrigin(bodyIndexA,bodyIndexB,cpuBodyBuf, b3MprSimplexPointW(portal, 0));\n" - " // vertex 0 is center of portal\n" - " b3MprSimplexSetSize(portal, 1);\n" - " \n" - " b3Float4 zero = b3MakeFloat4(0,0,0,0);\n" - " b3Float4* b3mpr_vec3_origin = &zero;\n" - " if (b3MprVec3Eq(&b3MprSimplexPoint(portal, 0)->v, b3mpr_vec3_origin)){\n" - " // Portal's center lies on origin (0,0,0) => we know that objects\n" - " // intersect but we would need to know penetration info.\n" - " // So move center little bit...\n" - " b3MprVec3Set(&va, FLT_EPSILON * 10.f, 0.f, 0.f);\n" - " b3MprVec3Add(&b3MprSimplexPointW(portal, 0)->v, &va);\n" - " }\n" - " // vertex 1 = support in direction of origin\n" - " b3MprVec3Copy(&dir, &b3MprSimplexPoint(portal, 0)->v);\n" - " b3MprVec3Scale(&dir, -1.f);\n" - " b3MprVec3Normalize(&dir);\n" - " b3MprSupport(pairIndex,bodyIndexA,bodyIndexB,cpuBodyBuf,cpuConvexData,cpuCollidables,cpuVertices, sepAxis,&dir, b3MprSimplexPointW(portal, 1));\n" - " b3MprSimplexSetSize(portal, 2);\n" - " // test if origin isn't outside of v1\n" - " dot = b3MprVec3Dot(&b3MprSimplexPoint(portal, 1)->v, &dir);\n" - " \n" - " if (b3MprIsZero(dot) || dot < 0.f)\n" - " return -1;\n" - " // vertex 2\n" - " b3MprVec3Cross(&dir, &b3MprSimplexPoint(portal, 0)->v,\n" - " &b3MprSimplexPoint(portal, 1)->v);\n" - " if (b3MprIsZero(b3MprVec3Len2(&dir))){\n" - " if (b3MprVec3Eq(&b3MprSimplexPoint(portal, 1)->v, b3mpr_vec3_origin)){\n" - " // origin lies on v1\n" - " return 1;\n" - " }else{\n" - " // origin lies on v0-v1 segment\n" - " return 2;\n" - " }\n" - " }\n" - " b3MprVec3Normalize(&dir);\n" - " b3MprSupport(pairIndex,bodyIndexA,bodyIndexB,cpuBodyBuf,cpuConvexData,cpuCollidables,cpuVertices, sepAxis,&dir, b3MprSimplexPointW(portal, 2));\n" - " \n" - " dot = b3MprVec3Dot(&b3MprSimplexPoint(portal, 2)->v, &dir);\n" - " if (b3MprIsZero(dot) || dot < 0.f)\n" - " return -1;\n" - " b3MprSimplexSetSize(portal, 3);\n" - " // vertex 3 direction\n" - " b3MprVec3Sub2(&va, &b3MprSimplexPoint(portal, 1)->v,\n" - " &b3MprSimplexPoint(portal, 0)->v);\n" - " b3MprVec3Sub2(&vb, &b3MprSimplexPoint(portal, 2)->v,\n" - " &b3MprSimplexPoint(portal, 0)->v);\n" - " b3MprVec3Cross(&dir, &va, &vb);\n" - " b3MprVec3Normalize(&dir);\n" - " // it is better to form portal faces to be oriented \"outside\" origin\n" - " dot = b3MprVec3Dot(&dir, &b3MprSimplexPoint(portal, 0)->v);\n" - " if (dot > 0.f){\n" - " b3MprSimplexSwap(portal, 1, 2);\n" - " b3MprVec3Scale(&dir, -1.f);\n" - " }\n" - " while (b3MprSimplexSize(portal) < 4){\n" - " b3MprSupport(pairIndex,bodyIndexA,bodyIndexB,cpuBodyBuf,cpuConvexData,cpuCollidables,cpuVertices, sepAxis,&dir, b3MprSimplexPointW(portal, 3));\n" - " \n" - " dot = b3MprVec3Dot(&b3MprSimplexPoint(portal, 3)->v, &dir);\n" - " if (b3MprIsZero(dot) || dot < 0.f)\n" - " return -1;\n" - " cont = 0;\n" - " // test if origin is outside (v1, v0, v3) - set v2 as v3 and\n" - " // continue\n" - " b3MprVec3Cross(&va, &b3MprSimplexPoint(portal, 1)->v,\n" - " &b3MprSimplexPoint(portal, 3)->v);\n" - " dot = b3MprVec3Dot(&va, &b3MprSimplexPoint(portal, 0)->v);\n" - " if (dot < 0.f && !b3MprIsZero(dot)){\n" - " b3MprSimplexSet(portal, 2, b3MprSimplexPoint(portal, 3));\n" - " cont = 1;\n" - " }\n" - " if (!cont){\n" - " // test if origin is outside (v3, v0, v2) - set v1 as v3 and\n" - " // continue\n" - " b3MprVec3Cross(&va, &b3MprSimplexPoint(portal, 3)->v,\n" - " &b3MprSimplexPoint(portal, 2)->v);\n" - " dot = b3MprVec3Dot(&va, &b3MprSimplexPoint(portal, 0)->v);\n" - " if (dot < 0.f && !b3MprIsZero(dot)){\n" - " b3MprSimplexSet(portal, 1, b3MprSimplexPoint(portal, 3));\n" - " cont = 1;\n" - " }\n" - " }\n" - " if (cont){\n" - " b3MprVec3Sub2(&va, &b3MprSimplexPoint(portal, 1)->v,\n" - " &b3MprSimplexPoint(portal, 0)->v);\n" - " b3MprVec3Sub2(&vb, &b3MprSimplexPoint(portal, 2)->v,\n" - " &b3MprSimplexPoint(portal, 0)->v);\n" - " b3MprVec3Cross(&dir, &va, &vb);\n" - " b3MprVec3Normalize(&dir);\n" - " }else{\n" - " b3MprSimplexSetSize(portal, 4);\n" - " }\n" - " }\n" - " return 0;\n" - "}\n" - "B3_STATIC int b3RefinePortal(int pairIndex,int bodyIndexA, int bodyIndexB, b3ConstArray(b3RigidBodyData_t) cpuBodyBuf, \n" - " b3ConstArray(b3ConvexPolyhedronData_t) cpuConvexData, \n" - " b3ConstArray(b3Collidable_t) cpuCollidables,\n" - " b3ConstArray(b3Float4) cpuVertices,\n" - " __global b3Float4* sepAxis,\n" - " b3MprSimplex_t *portal)\n" - "{\n" - " b3Float4 dir;\n" - " b3MprSupport_t v4;\n" - " for (int i=0;iv,\n" - " &b3MprSimplexPoint(portal, 2)->v);\n" - " b[0] = b3MprVec3Dot(&vec, &b3MprSimplexPoint(portal, 3)->v);\n" - " b3MprVec3Cross(&vec, &b3MprSimplexPoint(portal, 3)->v,\n" - " &b3MprSimplexPoint(portal, 2)->v);\n" - " b[1] = b3MprVec3Dot(&vec, &b3MprSimplexPoint(portal, 0)->v);\n" - " b3MprVec3Cross(&vec, &b3MprSimplexPoint(portal, 0)->v,\n" - " &b3MprSimplexPoint(portal, 1)->v);\n" - " b[2] = b3MprVec3Dot(&vec, &b3MprSimplexPoint(portal, 3)->v);\n" - " b3MprVec3Cross(&vec, &b3MprSimplexPoint(portal, 2)->v,\n" - " &b3MprSimplexPoint(portal, 1)->v);\n" - " b[3] = b3MprVec3Dot(&vec, &b3MprSimplexPoint(portal, 0)->v);\n" - " sum = b[0] + b[1] + b[2] + b[3];\n" - " if (b3MprIsZero(sum) || sum < 0.f){\n" - " b[0] = 0.f;\n" - " b3MprVec3Cross(&vec, &b3MprSimplexPoint(portal, 2)->v,\n" - " &b3MprSimplexPoint(portal, 3)->v);\n" - " b[1] = b3MprVec3Dot(&vec, &dir);\n" - " b3MprVec3Cross(&vec, &b3MprSimplexPoint(portal, 3)->v,\n" - " &b3MprSimplexPoint(portal, 1)->v);\n" - " b[2] = b3MprVec3Dot(&vec, &dir);\n" - " b3MprVec3Cross(&vec, &b3MprSimplexPoint(portal, 1)->v,\n" - " &b3MprSimplexPoint(portal, 2)->v);\n" - " b[3] = b3MprVec3Dot(&vec, &dir);\n" - " sum = b[1] + b[2] + b[3];\n" - " }\n" - " inv = 1.f / sum;\n" - " b3MprVec3Copy(&p1, b3mpr_vec3_origin);\n" - " b3MprVec3Copy(&p2, b3mpr_vec3_origin);\n" - " for (i = 0; i < 4; i++){\n" - " b3MprVec3Copy(&vec, &b3MprSimplexPoint(portal, i)->v1);\n" - " b3MprVec3Scale(&vec, b[i]);\n" - " b3MprVec3Add(&p1, &vec);\n" - " b3MprVec3Copy(&vec, &b3MprSimplexPoint(portal, i)->v2);\n" - " b3MprVec3Scale(&vec, b[i]);\n" - " b3MprVec3Add(&p2, &vec);\n" - " }\n" - " b3MprVec3Scale(&p1, inv);\n" - " b3MprVec3Scale(&p2, inv);\n" - " b3MprVec3Copy(pos, &p1);\n" - " b3MprVec3Add(pos, &p2);\n" - " b3MprVec3Scale(pos, 0.5);\n" - "}\n" - "inline float b3MprVec3Dist2(const b3Float4 *a, const b3Float4 *b)\n" - "{\n" - " b3Float4 ab;\n" - " b3MprVec3Sub2(&ab, a, b);\n" - " return b3MprVec3Len2(&ab);\n" - "}\n" - "inline float _b3MprVec3PointSegmentDist2(const b3Float4 *P,\n" - " const b3Float4 *x0,\n" - " const b3Float4 *b,\n" - " b3Float4 *witness)\n" - "{\n" - " // The computation comes from solving equation of segment:\n" - " // S(t) = x0 + t.d\n" - " // where - x0 is initial point of segment\n" - " // - d is direction of segment from x0 (|d| > 0)\n" - " // - t belongs to <0, 1> interval\n" - " // \n" - " // Than, distance from a segment to some point P can be expressed:\n" - " // D(t) = |x0 + t.d - P|^2\n" - " // which is distance from any point on segment. Minimization\n" - " // of this function brings distance from P to segment.\n" - " // Minimization of D(t) leads to simple quadratic equation that's\n" - " // solving is straightforward.\n" - " //\n" - " // Bonus of this method is witness point for free.\n" - " float dist, t;\n" - " b3Float4 d, a;\n" - " // direction of segment\n" - " b3MprVec3Sub2(&d, b, x0);\n" - " // precompute vector from P to x0\n" - " b3MprVec3Sub2(&a, x0, P);\n" - " t = -1.f * b3MprVec3Dot(&a, &d);\n" - " t /= b3MprVec3Len2(&d);\n" - " if (t < 0.f || b3MprIsZero(t)){\n" - " dist = b3MprVec3Dist2(x0, P);\n" - " if (witness)\n" - " b3MprVec3Copy(witness, x0);\n" - " }else if (t > 1.f || b3MprEq(t, 1.f)){\n" - " dist = b3MprVec3Dist2(b, P);\n" - " if (witness)\n" - " b3MprVec3Copy(witness, b);\n" - " }else{\n" - " if (witness){\n" - " b3MprVec3Copy(witness, &d);\n" - " b3MprVec3Scale(witness, t);\n" - " b3MprVec3Add(witness, x0);\n" - " dist = b3MprVec3Dist2(witness, P);\n" - " }else{\n" - " // recycling variables\n" - " b3MprVec3Scale(&d, t);\n" - " b3MprVec3Add(&d, &a);\n" - " dist = b3MprVec3Len2(&d);\n" - " }\n" - " }\n" - " return dist;\n" - "}\n" - "inline float b3MprVec3PointTriDist2(const b3Float4 *P,\n" - " const b3Float4 *x0, const b3Float4 *B,\n" - " const b3Float4 *C,\n" - " b3Float4 *witness)\n" - "{\n" - " // Computation comes from analytic expression for triangle (x0, B, C)\n" - " // T(s, t) = x0 + s.d1 + t.d2, where d1 = B - x0 and d2 = C - x0 and\n" - " // Then equation for distance is:\n" - " // D(s, t) = | T(s, t) - P |^2\n" - " // This leads to minimization of quadratic function of two variables.\n" - " // The solution from is taken only if s is between 0 and 1, t is\n" - " // between 0 and 1 and t + s < 1, otherwise distance from segment is\n" - " // computed.\n" - " b3Float4 d1, d2, a;\n" - " float u, v, w, p, q, r;\n" - " float s, t, dist, dist2;\n" - " b3Float4 witness2;\n" - " b3MprVec3Sub2(&d1, B, x0);\n" - " b3MprVec3Sub2(&d2, C, x0);\n" - " b3MprVec3Sub2(&a, x0, P);\n" - " u = b3MprVec3Dot(&a, &a);\n" - " v = b3MprVec3Dot(&d1, &d1);\n" - " w = b3MprVec3Dot(&d2, &d2);\n" - " p = b3MprVec3Dot(&a, &d1);\n" - " q = b3MprVec3Dot(&a, &d2);\n" - " r = b3MprVec3Dot(&d1, &d2);\n" - " s = (q * r - w * p) / (w * v - r * r);\n" - " t = (-s * r - q) / w;\n" - " if ((b3MprIsZero(s) || s > 0.f)\n" - " && (b3MprEq(s, 1.f) || s < 1.f)\n" - " && (b3MprIsZero(t) || t > 0.f)\n" - " && (b3MprEq(t, 1.f) || t < 1.f)\n" - " && (b3MprEq(t + s, 1.f) || t + s < 1.f)){\n" - " if (witness){\n" - " b3MprVec3Scale(&d1, s);\n" - " b3MprVec3Scale(&d2, t);\n" - " b3MprVec3Copy(witness, x0);\n" - " b3MprVec3Add(witness, &d1);\n" - " b3MprVec3Add(witness, &d2);\n" - " dist = b3MprVec3Dist2(witness, P);\n" - " }else{\n" - " dist = s * s * v;\n" - " dist += t * t * w;\n" - " dist += 2.f * s * t * r;\n" - " dist += 2.f * s * p;\n" - " dist += 2.f * t * q;\n" - " dist += u;\n" - " }\n" - " }else{\n" - " dist = _b3MprVec3PointSegmentDist2(P, x0, B, witness);\n" - " dist2 = _b3MprVec3PointSegmentDist2(P, x0, C, &witness2);\n" - " if (dist2 < dist){\n" - " dist = dist2;\n" - " if (witness)\n" - " b3MprVec3Copy(witness, &witness2);\n" - " }\n" - " dist2 = _b3MprVec3PointSegmentDist2(P, B, C, &witness2);\n" - " if (dist2 < dist){\n" - " dist = dist2;\n" - " if (witness)\n" - " b3MprVec3Copy(witness, &witness2);\n" - " }\n" - " }\n" - " return dist;\n" - "}\n" - "B3_STATIC void b3FindPenetr(int pairIndex,int bodyIndexA, int bodyIndexB, b3ConstArray(b3RigidBodyData_t) cpuBodyBuf, \n" - " b3ConstArray(b3ConvexPolyhedronData_t) cpuConvexData, \n" - " b3ConstArray(b3Collidable_t) cpuCollidables,\n" - " b3ConstArray(b3Float4) cpuVertices,\n" - " __global b3Float4* sepAxis,\n" - " b3MprSimplex_t *portal,\n" - " float *depth, b3Float4 *pdir, b3Float4 *pos)\n" - "{\n" - " b3Float4 dir;\n" - " b3MprSupport_t v4;\n" - " unsigned long iterations;\n" - " b3Float4 zero = b3MakeFloat4(0,0,0,0);\n" - " b3Float4* b3mpr_vec3_origin = &zero;\n" - " iterations = 1UL;\n" - " for (int i=0;i find penetration info\n" - " if (portalReachTolerance(portal, &v4, &dir)\n" - " || iterations ==B3_MPR_MAX_ITERATIONS)\n" - " {\n" - " *depth = b3MprVec3PointTriDist2(b3mpr_vec3_origin,&b3MprSimplexPoint(portal, 1)->v,&b3MprSimplexPoint(portal, 2)->v,&b3MprSimplexPoint(portal, 3)->v,pdir);\n" - " *depth = B3_MPR_SQRT(*depth);\n" - " \n" - " if (b3MprIsZero((*pdir).x) && b3MprIsZero((*pdir).y) && b3MprIsZero((*pdir).z))\n" - " {\n" - " \n" - " *pdir = dir;\n" - " } \n" - " b3MprVec3Normalize(pdir);\n" - " \n" - " // barycentric coordinates:\n" - " b3FindPos(portal, pos);\n" - " return;\n" - " }\n" - " b3ExpandPortal(portal, &v4);\n" - " iterations++;\n" - " }\n" - "}\n" - "B3_STATIC void b3FindPenetrTouch(b3MprSimplex_t *portal,float *depth, b3Float4 *dir, b3Float4 *pos)\n" - "{\n" - " // Touching contact on portal's v1 - so depth is zero and direction\n" - " // is unimportant and pos can be guessed\n" - " *depth = 0.f;\n" - " b3Float4 zero = b3MakeFloat4(0,0,0,0);\n" - " b3Float4* b3mpr_vec3_origin = &zero;\n" - " b3MprVec3Copy(dir, b3mpr_vec3_origin);\n" - " b3MprVec3Copy(pos, &b3MprSimplexPoint(portal, 1)->v1);\n" - " b3MprVec3Add(pos, &b3MprSimplexPoint(portal, 1)->v2);\n" - " b3MprVec3Scale(pos, 0.5);\n" - "}\n" - "B3_STATIC void b3FindPenetrSegment(b3MprSimplex_t *portal,\n" - " float *depth, b3Float4 *dir, b3Float4 *pos)\n" - "{\n" - " \n" - " // Origin lies on v0-v1 segment.\n" - " // Depth is distance to v1, direction also and position must be\n" - " // computed\n" - " b3MprVec3Copy(pos, &b3MprSimplexPoint(portal, 1)->v1);\n" - " b3MprVec3Add(pos, &b3MprSimplexPoint(portal, 1)->v2);\n" - " b3MprVec3Scale(pos, 0.5f);\n" - " \n" - " b3MprVec3Copy(dir, &b3MprSimplexPoint(portal, 1)->v);\n" - " *depth = B3_MPR_SQRT(b3MprVec3Len2(dir));\n" - " b3MprVec3Normalize(dir);\n" - "}\n" - "inline int b3MprPenetration(int pairIndex, int bodyIndexA, int bodyIndexB,\n" - " b3ConstArray(b3RigidBodyData_t) cpuBodyBuf,\n" - " b3ConstArray(b3ConvexPolyhedronData_t) cpuConvexData, \n" - " b3ConstArray(b3Collidable_t) cpuCollidables,\n" - " b3ConstArray(b3Float4) cpuVertices,\n" - " __global b3Float4* sepAxis,\n" - " __global int* hasSepAxis,\n" - " float *depthOut, b3Float4* dirOut, b3Float4* posOut)\n" - "{\n" - " \n" - " b3MprSimplex_t portal;\n" - " \n" - "// if (!hasSepAxis[pairIndex])\n" - " // return -1;\n" - " \n" - " hasSepAxis[pairIndex] = 0;\n" - " int res;\n" - " // Phase 1: Portal discovery\n" - " res = b3DiscoverPortal(pairIndex,bodyIndexA,bodyIndexB,cpuBodyBuf,cpuConvexData,cpuCollidables,cpuVertices,sepAxis,hasSepAxis, &portal);\n" - " \n" - " \n" - " //sepAxis[pairIndex] = *pdir;//or -dir?\n" - " switch (res)\n" - " {\n" - " case 0:\n" - " {\n" - " // Phase 2: Portal refinement\n" - " \n" - " res = b3RefinePortal(pairIndex,bodyIndexA,bodyIndexB,cpuBodyBuf,cpuConvexData,cpuCollidables,cpuVertices, sepAxis,&portal);\n" - " if (res < 0)\n" - " return -1;\n" - " // Phase 3. Penetration info\n" - " b3FindPenetr(pairIndex,bodyIndexA,bodyIndexB,cpuBodyBuf,cpuConvexData,cpuCollidables,cpuVertices, sepAxis,&portal, depthOut, dirOut, posOut);\n" - " hasSepAxis[pairIndex] = 1;\n" - " sepAxis[pairIndex] = -*dirOut;\n" - " break;\n" - " }\n" - " case 1:\n" - " {\n" - " // Touching contact on portal's v1.\n" - " b3FindPenetrTouch(&portal, depthOut, dirOut, posOut);\n" - " break;\n" - " }\n" - " case 2:\n" - " {\n" - " \n" - " b3FindPenetrSegment( &portal, depthOut, dirOut, posOut);\n" - " break;\n" - " }\n" - " default:\n" - " {\n" - " hasSepAxis[pairIndex]=0;\n" - " //if (res < 0)\n" - " //{\n" - " // Origin isn't inside portal - no collision.\n" - " return -1;\n" - " //}\n" - " }\n" - " };\n" - " \n" - " return 0;\n" - "};\n" - "#endif //B3_MPR_PENETRATION_H\n" - "#ifndef B3_CONTACT4DATA_H\n" - "#define B3_CONTACT4DATA_H\n" - "#ifndef B3_FLOAT4_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#endif \n" - "#endif //B3_FLOAT4_H\n" - "typedef struct b3Contact4Data b3Contact4Data_t;\n" - "struct b3Contact4Data\n" - "{\n" - " b3Float4 m_worldPosB[4];\n" - "// b3Float4 m_localPosA[4];\n" - "// b3Float4 m_localPosB[4];\n" - " b3Float4 m_worldNormalOnB; // w: m_nPoints\n" - " unsigned short m_restituitionCoeffCmp;\n" - " unsigned short m_frictionCoeffCmp;\n" - " int m_batchIdx;\n" - " int m_bodyAPtrAndSignBit;//x:m_bodyAPtr, y:m_bodyBPtr\n" - " int m_bodyBPtrAndSignBit;\n" - " int m_childIndexA;\n" - " int m_childIndexB;\n" - " int m_unused1;\n" - " int m_unused2;\n" - "};\n" - "inline int b3Contact4Data_getNumPoints(const struct b3Contact4Data* contact)\n" - "{\n" - " return (int)contact->m_worldNormalOnB.w;\n" - "};\n" - "inline void b3Contact4Data_setNumPoints(struct b3Contact4Data* contact, int numPoints)\n" - "{\n" - " contact->m_worldNormalOnB.w = (float)numPoints;\n" - "};\n" - "#endif //B3_CONTACT4DATA_H\n" - "#define AppendInc(x, out) out = atomic_inc(x)\n" - "#define GET_NPOINTS(x) (x).m_worldNormalOnB.w\n" - "#ifdef cl_ext_atomic_counters_32\n" - " #pragma OPENCL EXTENSION cl_ext_atomic_counters_32 : enable\n" - "#else\n" - " #define counter32_t volatile __global int*\n" - "#endif\n" - "__kernel void mprPenetrationKernel( __global int4* pairs,\n" - " __global const b3RigidBodyData_t* rigidBodies, \n" - " __global const b3Collidable_t* collidables,\n" - " __global const b3ConvexPolyhedronData_t* convexShapes, \n" - " __global const float4* vertices,\n" - " __global float4* separatingNormals,\n" - " __global int* hasSeparatingAxis,\n" - " __global struct b3Contact4Data* restrict globalContactsOut,\n" - " counter32_t nGlobalContactsOut,\n" - " int contactCapacity,\n" - " int numPairs)\n" - "{\n" - " int i = get_global_id(0);\n" - " int pairIndex = i;\n" - " if (im_worldNormalOnB = -dirOut;//normal;\n" - " c->m_restituitionCoeffCmp = (0.f*0xffff);c->m_frictionCoeffCmp = (0.7f*0xffff);\n" - " c->m_batchIdx = pairIndex;\n" - " int bodyA = pairs[pairIndex].x;\n" - " int bodyB = pairs[pairIndex].y;\n" - " c->m_bodyAPtrAndSignBit = rigidBodies[bodyA].m_invMass==0 ? -bodyA:bodyA;\n" - " c->m_bodyBPtrAndSignBit = rigidBodies[bodyB].m_invMass==0 ? -bodyB:bodyB;\n" - " c->m_childIndexA = -1;\n" - " c->m_childIndexB = -1;\n" - " //for (int i=0;im_worldPosB[0] = posOut;//localPoints[contactIdx[i]];\n" - " GET_NPOINTS(*c) = 1;//nContacts;\n" - " }\n" - " }\n" - " }\n" - "}\n" - "typedef float4 Quaternion;\n" - "#define make_float4 (float4)\n" - "__inline\n" - "float dot3F4(float4 a, float4 b)\n" - "{\n" - " float4 a1 = make_float4(a.xyz,0.f);\n" - " float4 b1 = make_float4(b.xyz,0.f);\n" - " return dot(a1, b1);\n" - "}\n" - "__inline\n" - "float4 cross3(float4 a, float4 b)\n" - "{\n" - " return cross(a,b);\n" - "}\n" - "__inline\n" - "Quaternion qtMul(Quaternion a, Quaternion b)\n" - "{\n" - " Quaternion ans;\n" - " ans = cross3( a, b );\n" - " ans += a.w*b+b.w*a;\n" - "// ans.w = a.w*b.w - (a.x*b.x+a.y*b.y+a.z*b.z);\n" - " ans.w = a.w*b.w - dot3F4(a, b);\n" - " return ans;\n" - "}\n" - "__inline\n" - "Quaternion qtInvert(Quaternion q)\n" - "{\n" - " return (Quaternion)(-q.xyz, q.w);\n" - "}\n" - "__inline\n" - "float4 qtRotate(Quaternion q, float4 vec)\n" - "{\n" - " Quaternion qInv = qtInvert( q );\n" - " float4 vcpy = vec;\n" - " vcpy.w = 0.f;\n" - " float4 out = qtMul(qtMul(q,vcpy),qInv);\n" - " return out;\n" - "}\n" - "__inline\n" - "float4 transform(const float4* p, const float4* translation, const Quaternion* orientation)\n" - "{\n" - " return qtRotate( *orientation, *p ) + (*translation);\n" - "}\n" - "__inline\n" - "float4 qtInvRotate(const Quaternion q, float4 vec)\n" - "{\n" - " return qtRotate( qtInvert( q ), vec );\n" - "}\n" - "inline void project(__global const b3ConvexPolyhedronData_t* hull, const float4 pos, const float4 orn, \n" - "const float4* dir, __global const float4* vertices, float* min, float* max)\n" - "{\n" - " min[0] = FLT_MAX;\n" - " max[0] = -FLT_MAX;\n" - " int numVerts = hull->m_numVertices;\n" - " const float4 localDir = qtInvRotate(orn,*dir);\n" - " float offset = dot(pos,*dir);\n" - " for(int i=0;im_vertexOffset+i],localDir);\n" - " if(dp < min[0]) \n" - " min[0] = dp;\n" - " if(dp > max[0]) \n" - " max[0] = dp;\n" - " }\n" - " if(min[0]>max[0])\n" - " {\n" - " float tmp = min[0];\n" - " min[0] = max[0];\n" - " max[0] = tmp;\n" - " }\n" - " min[0] += offset;\n" - " max[0] += offset;\n" - "}\n" - "bool findSeparatingAxisUnitSphere( __global const b3ConvexPolyhedronData_t* hullA, __global const b3ConvexPolyhedronData_t* hullB, \n" - " const float4 posA1,\n" - " const float4 ornA,\n" - " const float4 posB1,\n" - " const float4 ornB,\n" - " const float4 DeltaC2,\n" - " __global const float4* vertices,\n" - " __global const float4* unitSphereDirections,\n" - " int numUnitSphereDirections,\n" - " float4* sep,\n" - " float* dmin)\n" - "{\n" - " \n" - " float4 posA = posA1;\n" - " posA.w = 0.f;\n" - " float4 posB = posB1;\n" - " posB.w = 0.f;\n" - " int curPlaneTests=0;\n" - " int curEdgeEdge = 0;\n" - " // Test unit sphere directions\n" - " for (int i=0;i0)\n" - " crossje *= -1.f;\n" - " {\n" - " float dist;\n" - " bool result = true;\n" - " float Min0,Max0;\n" - " float Min1,Max1;\n" - " project(hullA,posA,ornA,&crossje,vertices, &Min0, &Max0);\n" - " project(hullB,posB,ornB,&crossje,vertices, &Min1, &Max1);\n" - " \n" - " if(Max00.0f)\n" - " {\n" - " *sep = -(*sep);\n" - " }\n" - " return true;\n" - "}\n" - "__kernel void findSeparatingAxisUnitSphereKernel( __global const int4* pairs, \n" - " __global const b3RigidBodyData_t* rigidBodies, \n" - " __global const b3Collidable_t* collidables,\n" - " __global const b3ConvexPolyhedronData_t* convexShapes, \n" - " __global const float4* vertices,\n" - " __global const float4* unitSphereDirections,\n" - " __global float4* separatingNormals,\n" - " __global int* hasSeparatingAxis,\n" - " __global float* dmins,\n" - " int numUnitSphereDirections,\n" - " int numPairs\n" - " )\n" - "{\n" - " int i = get_global_id(0);\n" - " \n" - " if (inumUnitSphereDirections)\n" - " {\n" - " bool sepEE = findSeparatingAxisUnitSphere( &convexShapes[shapeIndexA], &convexShapes[shapeIndexB],posA,ornA,\n" - " posB,ornB,\n" - " DeltaC2,\n" - " vertices,unitSphereDirections,numUnitSphereDirections,&sepNormal,&dmin);\n" - " if (!sepEE)\n" - " {\n" - " hasSeparatingAxis[i] = 0;\n" - " } else\n" - " {\n" - " hasSeparatingAxis[i] = 1;\n" - " separatingNormals[i] = sepNormal;\n" - " }\n" - " }\n" - " } //if (hasSeparatingAxis[i])\n" - " }//(i1e-6 || b3Fabs(v.y)>1e-6 || b3Fabs(v.z)>1e-6) \n" - " return false;\n" - " return true;\n" - "}\n" - "inline int b3MaxDot( b3Float4ConstArg vec, __global const b3Float4* vecArray, int vecLen, float* dotOut )\n" - "{\n" - " float maxDot = -B3_INFINITY;\n" - " int i = 0;\n" - " int ptIndex = -1;\n" - " for( i = 0; i < vecLen; i++ )\n" - " {\n" - " float dot = b3Dot3F4(vecArray[i],vec);\n" - " \n" - " if( dot > maxDot )\n" - " {\n" - " maxDot = dot;\n" - " ptIndex = i;\n" - " }\n" - " }\n" - " b3Assert(ptIndex>=0);\n" - " if (ptIndex<0)\n" - " {\n" - " ptIndex = 0;\n" - " }\n" - " *dotOut = maxDot;\n" - " return ptIndex;\n" - "}\n" - "#endif //B3_FLOAT4_H\n" - "typedef struct b3Contact4Data b3Contact4Data_t;\n" - "struct b3Contact4Data\n" - "{\n" - " b3Float4 m_worldPosB[4];\n" - "// b3Float4 m_localPosA[4];\n" - "// b3Float4 m_localPosB[4];\n" - " b3Float4 m_worldNormalOnB; // w: m_nPoints\n" - " unsigned short m_restituitionCoeffCmp;\n" - " unsigned short m_frictionCoeffCmp;\n" - " int m_batchIdx;\n" - " int m_bodyAPtrAndSignBit;//x:m_bodyAPtr, y:m_bodyBPtr\n" - " int m_bodyBPtrAndSignBit;\n" - " int m_childIndexA;\n" - " int m_childIndexB;\n" - " int m_unused1;\n" - " int m_unused2;\n" - "};\n" - "inline int b3Contact4Data_getNumPoints(const struct b3Contact4Data* contact)\n" - "{\n" - " return (int)contact->m_worldNormalOnB.w;\n" - "};\n" - "inline void b3Contact4Data_setNumPoints(struct b3Contact4Data* contact, int numPoints)\n" - "{\n" - " contact->m_worldNormalOnB.w = (float)numPoints;\n" - "};\n" - "#endif //B3_CONTACT4DATA_H\n" - "#define SHAPE_CONVEX_HULL 3\n" - "#define SHAPE_PLANE 4\n" - "#define SHAPE_CONCAVE_TRIMESH 5\n" - "#define SHAPE_COMPOUND_OF_CONVEX_HULLS 6\n" - "#define SHAPE_SPHERE 7\n" - "#pragma OPENCL EXTENSION cl_amd_printf : enable\n" - "#pragma OPENCL EXTENSION cl_khr_local_int32_base_atomics : enable\n" - "#pragma OPENCL EXTENSION cl_khr_global_int32_base_atomics : enable\n" - "#pragma OPENCL EXTENSION cl_khr_local_int32_extended_atomics : enable\n" - "#pragma OPENCL EXTENSION cl_khr_global_int32_extended_atomics : enable\n" - "#ifdef cl_ext_atomic_counters_32\n" - "#pragma OPENCL EXTENSION cl_ext_atomic_counters_32 : enable\n" - "#else\n" - "#define counter32_t volatile __global int*\n" - "#endif\n" - "#define GET_GROUP_IDX get_group_id(0)\n" - "#define GET_LOCAL_IDX get_local_id(0)\n" - "#define GET_GLOBAL_IDX get_global_id(0)\n" - "#define GET_GROUP_SIZE get_local_size(0)\n" - "#define GET_NUM_GROUPS get_num_groups(0)\n" - "#define GROUP_LDS_BARRIER barrier(CLK_LOCAL_MEM_FENCE)\n" - "#define GROUP_MEM_FENCE mem_fence(CLK_LOCAL_MEM_FENCE)\n" - "#define AtomInc(x) atom_inc(&(x))\n" - "#define AtomInc1(x, out) out = atom_inc(&(x))\n" - "#define AppendInc(x, out) out = atomic_inc(x)\n" - "#define AtomAdd(x, value) atom_add(&(x), value)\n" - "#define AtomCmpxhg(x, cmp, value) atom_cmpxchg( &(x), cmp, value )\n" - "#define AtomXhg(x, value) atom_xchg ( &(x), value )\n" - "#define max2 max\n" - "#define min2 min\n" - "typedef unsigned int u32;\n" - "typedef struct \n" - "{\n" - " union\n" - " {\n" - " float4 m_min;\n" - " float m_minElems[4];\n" - " int m_minIndices[4];\n" - " };\n" - " union\n" - " {\n" - " float4 m_max;\n" - " float m_maxElems[4];\n" - " int m_maxIndices[4];\n" - " };\n" - "} btAabbCL;\n" - "///keep this in sync with btCollidable.h\n" - "typedef struct\n" - "{\n" - " int m_numChildShapes;\n" - " float m_radius;\n" - " int m_shapeType;\n" - " int m_shapeIndex;\n" - " \n" - "} btCollidableGpu;\n" - "typedef struct\n" - "{\n" - " float4 m_childPosition;\n" - " float4 m_childOrientation;\n" - " int m_shapeIndex;\n" - " int m_unused0;\n" - " int m_unused1;\n" - " int m_unused2;\n" - "} btGpuChildShape;\n" - "#define GET_NPOINTS(x) (x).m_worldNormalOnB.w\n" - "typedef struct\n" - "{\n" - " float4 m_pos;\n" - " float4 m_quat;\n" - " float4 m_linVel;\n" - " float4 m_angVel;\n" - " u32 m_collidableIdx; \n" - " float m_invMass;\n" - " float m_restituitionCoeff;\n" - " float m_frictionCoeff;\n" - "} BodyData;\n" - "typedef struct \n" - "{\n" - " float4 m_localCenter;\n" - " float4 m_extents;\n" - " float4 mC;\n" - " float4 mE;\n" - " \n" - " float m_radius;\n" - " int m_faceOffset;\n" - " int m_numFaces;\n" - " int m_numVertices;\n" - " \n" - " int m_vertexOffset;\n" - " int m_uniqueEdgesOffset;\n" - " int m_numUniqueEdges;\n" - " int m_unused;\n" - "} ConvexPolyhedronCL;\n" - "typedef struct\n" - "{\n" - " float4 m_plane;\n" - " int m_indexOffset;\n" - " int m_numIndices;\n" - "} btGpuFace;\n" - "#define SELECT_UINT4( b, a, condition ) select( b,a,condition )\n" - "#define make_float4 (float4)\n" - "#define make_float2 (float2)\n" - "#define make_uint4 (uint4)\n" - "#define make_int4 (int4)\n" - "#define make_uint2 (uint2)\n" - "#define make_int2 (int2)\n" - "__inline\n" - "float fastDiv(float numerator, float denominator)\n" - "{\n" - " return native_divide(numerator, denominator); \n" - "// return numerator/denominator; \n" - "}\n" - "__inline\n" - "float4 fastDiv4(float4 numerator, float4 denominator)\n" - "{\n" - " return native_divide(numerator, denominator); \n" - "}\n" - "__inline\n" - "float4 cross3(float4 a, float4 b)\n" - "{\n" - " return cross(a,b);\n" - "}\n" - "//#define dot3F4 dot\n" - "__inline\n" - "float dot3F4(float4 a, float4 b)\n" - "{\n" - " float4 a1 = make_float4(a.xyz,0.f);\n" - " float4 b1 = make_float4(b.xyz,0.f);\n" - " return dot(a1, b1);\n" - "}\n" - "__inline\n" - "float4 fastNormalize4(float4 v)\n" - "{\n" - " return fast_normalize(v);\n" - "}\n" - "///////////////////////////////////////\n" - "// Quaternion\n" - "///////////////////////////////////////\n" - "typedef float4 Quaternion;\n" - "__inline\n" - "Quaternion qtMul(Quaternion a, Quaternion b);\n" - "__inline\n" - "Quaternion qtNormalize(Quaternion in);\n" - "__inline\n" - "float4 qtRotate(Quaternion q, float4 vec);\n" - "__inline\n" - "Quaternion qtInvert(Quaternion q);\n" - "__inline\n" - "Quaternion qtMul(Quaternion a, Quaternion b)\n" - "{\n" - " Quaternion ans;\n" - " ans = cross3( a, b );\n" - " ans += a.w*b+b.w*a;\n" - "// ans.w = a.w*b.w - (a.x*b.x+a.y*b.y+a.z*b.z);\n" - " ans.w = a.w*b.w - dot3F4(a, b);\n" - " return ans;\n" - "}\n" - "__inline\n" - "Quaternion qtNormalize(Quaternion in)\n" - "{\n" - " return fastNormalize4(in);\n" - "// in /= length( in );\n" - "// return in;\n" - "}\n" - "__inline\n" - "float4 qtRotate(Quaternion q, float4 vec)\n" - "{\n" - " Quaternion qInv = qtInvert( q );\n" - " float4 vcpy = vec;\n" - " vcpy.w = 0.f;\n" - " float4 out = qtMul(qtMul(q,vcpy),qInv);\n" - " return out;\n" - "}\n" - "__inline\n" - "Quaternion qtInvert(Quaternion q)\n" - "{\n" - " return (Quaternion)(-q.xyz, q.w);\n" - "}\n" - "__inline\n" - "float4 qtInvRotate(const Quaternion q, float4 vec)\n" - "{\n" - " return qtRotate( qtInvert( q ), vec );\n" - "}\n" - "__inline\n" - "float4 transform(const float4* p, const float4* translation, const Quaternion* orientation)\n" - "{\n" - " return qtRotate( *orientation, *p ) + (*translation);\n" - "}\n" - "void trInverse(float4 translationIn, Quaternion orientationIn,\n" - " float4* translationOut, Quaternion* orientationOut)\n" - "{\n" - " *orientationOut = qtInvert(orientationIn);\n" - " *translationOut = qtRotate(*orientationOut, -translationIn);\n" - "}\n" - "void trMul(float4 translationA, Quaternion orientationA,\n" - " float4 translationB, Quaternion orientationB,\n" - " float4* translationOut, Quaternion* orientationOut)\n" - "{\n" - " *orientationOut = qtMul(orientationA,orientationB);\n" - " *translationOut = transform(&translationB,&translationA,&orientationA);\n" - "}\n" - "__inline\n" - "float4 normalize3(const float4 a)\n" - "{\n" - " float4 n = make_float4(a.x, a.y, a.z, 0.f);\n" - " return fastNormalize4( n );\n" - "}\n" - "__inline float4 lerp3(const float4 a,const float4 b, float t)\n" - "{\n" - " return make_float4( a.x + (b.x - a.x) * t,\n" - " a.y + (b.y - a.y) * t,\n" - " a.z + (b.z - a.z) * t,\n" - " 0.f);\n" - "}\n" - "float signedDistanceFromPointToPlane(float4 point, float4 planeEqn, float4* closestPointOnFace)\n" - "{\n" - " float4 n = (float4)(planeEqn.x, planeEqn.y, planeEqn.z, 0);\n" - " float dist = dot3F4(n, point) + planeEqn.w;\n" - " *closestPointOnFace = point - dist * n;\n" - " return dist;\n" - "}\n" - "inline bool IsPointInPolygon(float4 p, \n" - " const btGpuFace* face,\n" - " __global const float4* baseVertex,\n" - " __global const int* convexIndices,\n" - " float4* out)\n" - "{\n" - " float4 a;\n" - " float4 b;\n" - " float4 ab;\n" - " float4 ap;\n" - " float4 v;\n" - " float4 plane = make_float4(face->m_plane.x,face->m_plane.y,face->m_plane.z,0.f);\n" - " \n" - " if (face->m_numIndices<2)\n" - " return false;\n" - " \n" - " float4 v0 = baseVertex[convexIndices[face->m_indexOffset + face->m_numIndices-1]];\n" - " \n" - " b = v0;\n" - " for(unsigned i=0; i != face->m_numIndices; ++i)\n" - " {\n" - " a = b;\n" - " float4 vi = baseVertex[convexIndices[face->m_indexOffset + i]];\n" - " b = vi;\n" - " ab = b-a;\n" - " ap = p-a;\n" - " v = cross3(ab,plane);\n" - " if (dot(ap, v) > 0.f)\n" - " {\n" - " float ab_m2 = dot(ab, ab);\n" - " float rt = ab_m2 != 0.f ? dot(ab, ap) / ab_m2 : 0.f;\n" - " if (rt <= 0.f)\n" - " {\n" - " *out = a;\n" - " }\n" - " else if (rt >= 1.f) \n" - " {\n" - " *out = b;\n" - " }\n" - " else\n" - " {\n" - " float s = 1.f - rt;\n" - " out[0].x = s * a.x + rt * b.x;\n" - " out[0].y = s * a.y + rt * b.y;\n" - " out[0].z = s * a.z + rt * b.z;\n" - " }\n" - " return false;\n" - " }\n" - " }\n" - " return true;\n" - "}\n" - "void computeContactSphereConvex(int pairIndex,\n" - " int bodyIndexA, int bodyIndexB, \n" - " int collidableIndexA, int collidableIndexB, \n" - " __global const BodyData* rigidBodies, \n" - " __global const btCollidableGpu* collidables,\n" - " __global const ConvexPolyhedronCL* convexShapes,\n" - " __global const float4* convexVertices,\n" - " __global const int* convexIndices,\n" - " __global const btGpuFace* faces,\n" - " __global struct b3Contact4Data* restrict globalContactsOut,\n" - " counter32_t nGlobalContactsOut,\n" - " int maxContactCapacity,\n" - " float4 spherePos2,\n" - " float radius,\n" - " float4 pos,\n" - " float4 quat\n" - " )\n" - "{\n" - " float4 invPos;\n" - " float4 invOrn;\n" - " trInverse(pos,quat, &invPos,&invOrn);\n" - " float4 spherePos = transform(&spherePos2,&invPos,&invOrn);\n" - " int shapeIndex = collidables[collidableIndexB].m_shapeIndex;\n" - " int numFaces = convexShapes[shapeIndex].m_numFaces;\n" - " float4 closestPnt = (float4)(0, 0, 0, 0);\n" - " float4 hitNormalWorld = (float4)(0, 0, 0, 0);\n" - " float minDist = -1000000.f;\n" - " bool bCollide = true;\n" - " for ( int f = 0; f < numFaces; f++ )\n" - " {\n" - " btGpuFace face = faces[convexShapes[shapeIndex].m_faceOffset+f];\n" - " // set up a plane equation \n" - " float4 planeEqn;\n" - " float4 n1 = face.m_plane;\n" - " n1.w = 0.f;\n" - " planeEqn = n1;\n" - " planeEqn.w = face.m_plane.w;\n" - " \n" - " \n" - " // compute a signed distance from the vertex in cloth to the face of rigidbody.\n" - " float4 pntReturn;\n" - " float dist = signedDistanceFromPointToPlane(spherePos, planeEqn, &pntReturn);\n" - " // If the distance is positive, the plane is a separating plane. \n" - " if ( dist > radius )\n" - " {\n" - " bCollide = false;\n" - " break;\n" - " }\n" - " if (dist>0)\n" - " {\n" - " //might hit an edge or vertex\n" - " float4 out;\n" - " float4 zeroPos = make_float4(0,0,0,0);\n" - " bool isInPoly = IsPointInPolygon(spherePos,\n" - " &face,\n" - " &convexVertices[convexShapes[shapeIndex].m_vertexOffset],\n" - " convexIndices,\n" - " &out);\n" - " if (isInPoly)\n" - " {\n" - " if (dist>minDist)\n" - " {\n" - " minDist = dist;\n" - " closestPnt = pntReturn;\n" - " hitNormalWorld = planeEqn;\n" - " \n" - " }\n" - " } else\n" - " {\n" - " float4 tmp = spherePos-out;\n" - " float l2 = dot(tmp,tmp);\n" - " if (l2minDist)\n" - " {\n" - " minDist = dist;\n" - " closestPnt = out;\n" - " hitNormalWorld = tmp/dist;\n" - " \n" - " }\n" - " \n" - " } else\n" - " {\n" - " bCollide = false;\n" - " break;\n" - " }\n" - " }\n" - " } else\n" - " {\n" - " if ( dist > minDist )\n" - " {\n" - " minDist = dist;\n" - " closestPnt = pntReturn;\n" - " hitNormalWorld.xyz = planeEqn.xyz;\n" - " }\n" - " }\n" - " \n" - " }\n" - " \n" - " if (bCollide && minDist > -10000)\n" - " {\n" - " float4 normalOnSurfaceB1 = qtRotate(quat,-hitNormalWorld);\n" - " float4 pOnB1 = transform(&closestPnt,&pos,&quat);\n" - " \n" - " float actualDepth = minDist-radius;\n" - " if (actualDepth<=0.f)\n" - " {\n" - " \n" - " pOnB1.w = actualDepth;\n" - " int dstIdx;\n" - " AppendInc( nGlobalContactsOut, dstIdx );\n" - " \n" - " \n" - " if (1)//dstIdx < maxContactCapacity)\n" - " {\n" - " __global struct b3Contact4Data* c = &globalContactsOut[dstIdx];\n" - " c->m_worldNormalOnB = -normalOnSurfaceB1;\n" - " c->m_restituitionCoeffCmp = (0.f*0xffff);c->m_frictionCoeffCmp = (0.7f*0xffff);\n" - " c->m_batchIdx = pairIndex;\n" - " c->m_bodyAPtrAndSignBit = rigidBodies[bodyIndexA].m_invMass==0?-bodyIndexA:bodyIndexA;\n" - " c->m_bodyBPtrAndSignBit = rigidBodies[bodyIndexB].m_invMass==0?-bodyIndexB:bodyIndexB;\n" - " c->m_worldPosB[0] = pOnB1;\n" - " c->m_childIndexA = -1;\n" - " c->m_childIndexB = -1;\n" - " GET_NPOINTS(*c) = 1;\n" - " } \n" - " }\n" - " }//if (hasCollision)\n" - "}\n" - " \n" - "int extractManifoldSequential(const float4* p, int nPoints, float4 nearNormal, int4* contactIdx)\n" - "{\n" - " if( nPoints == 0 )\n" - " return 0;\n" - " \n" - " if (nPoints <=4)\n" - " return nPoints;\n" - " \n" - " \n" - " if (nPoints >64)\n" - " nPoints = 64;\n" - " \n" - " float4 center = make_float4(0.f);\n" - " {\n" - " \n" - " for (int i=0;im_numVertices;i++)\n" - " {\n" - " float4 vtx = convexVertices[hullB->m_vertexOffset+i];\n" - " float curDot = dot(vtx,planeNormalInConvex);\n" - " if (curDot>maxDot)\n" - " {\n" - " hitVertex=i;\n" - " maxDot=curDot;\n" - " hitVtx = vtx;\n" - " //make sure the deepest points is always included\n" - " if (numPoints==MAX_PLANE_CONVEX_POINTS)\n" - " numPoints--;\n" - " }\n" - " if (numPoints4)\n" - " {\n" - " numReducedPoints = extractManifoldSequential( contactPoints, numPoints, planeNormalInConvex, &contactIdx);\n" - " }\n" - " if (numReducedPoints>0)\n" - " {\n" - " int dstIdx;\n" - " AppendInc( nGlobalContactsOut, dstIdx );\n" - " if (dstIdx < maxContactCapacity)\n" - " {\n" - " resultIndex = dstIdx;\n" - " __global struct b3Contact4Data* c = &globalContactsOut[dstIdx];\n" - " c->m_worldNormalOnB = -planeNormalWorld;\n" - " //c->setFrictionCoeff(0.7);\n" - " //c->setRestituitionCoeff(0.f);\n" - " c->m_restituitionCoeffCmp = (0.f*0xffff);c->m_frictionCoeffCmp = (0.7f*0xffff);\n" - " c->m_batchIdx = pairIndex;\n" - " c->m_bodyAPtrAndSignBit = rigidBodies[bodyIndexA].m_invMass==0?-bodyIndexA:bodyIndexA;\n" - " c->m_bodyBPtrAndSignBit = rigidBodies[bodyIndexB].m_invMass==0?-bodyIndexB:bodyIndexB;\n" - " c->m_childIndexA = -1;\n" - " c->m_childIndexB = -1;\n" - " switch (numReducedPoints)\n" - " {\n" - " case 4:\n" - " c->m_worldPosB[3] = contactPoints[contactIdx.w];\n" - " case 3:\n" - " c->m_worldPosB[2] = contactPoints[contactIdx.z];\n" - " case 2:\n" - " c->m_worldPosB[1] = contactPoints[contactIdx.y];\n" - " case 1:\n" - " c->m_worldPosB[0] = contactPoints[contactIdx.x];\n" - " default:\n" - " {\n" - " }\n" - " };\n" - " \n" - " GET_NPOINTS(*c) = numReducedPoints;\n" - " }//if (dstIdx < numPairs)\n" - " } \n" - " return resultIndex;\n" - "}\n" - "void computeContactPlaneSphere(int pairIndex,\n" - " int bodyIndexA, int bodyIndexB, \n" - " int collidableIndexA, int collidableIndexB, \n" - " __global const BodyData* rigidBodies, \n" - " __global const btCollidableGpu* collidables,\n" - " __global const btGpuFace* faces,\n" - " __global struct b3Contact4Data* restrict globalContactsOut,\n" - " counter32_t nGlobalContactsOut,\n" - " int maxContactCapacity)\n" - "{\n" - " float4 planeEq = faces[collidables[collidableIndexA].m_shapeIndex].m_plane;\n" - " float radius = collidables[collidableIndexB].m_radius;\n" - " float4 posA1 = rigidBodies[bodyIndexA].m_pos;\n" - " float4 ornA1 = rigidBodies[bodyIndexA].m_quat;\n" - " float4 posB1 = rigidBodies[bodyIndexB].m_pos;\n" - " float4 ornB1 = rigidBodies[bodyIndexB].m_quat;\n" - " \n" - " bool hasCollision = false;\n" - " float4 planeNormal1 = make_float4(planeEq.x,planeEq.y,planeEq.z,0.f);\n" - " float planeConstant = planeEq.w;\n" - " float4 convexInPlaneTransPos1; Quaternion convexInPlaneTransOrn1;\n" - " {\n" - " float4 invPosA;Quaternion invOrnA;\n" - " trInverse(posA1,ornA1,&invPosA,&invOrnA);\n" - " trMul(invPosA,invOrnA,posB1,ornB1,&convexInPlaneTransPos1,&convexInPlaneTransOrn1);\n" - " }\n" - " float4 planeInConvexPos1; Quaternion planeInConvexOrn1;\n" - " {\n" - " float4 invPosB;Quaternion invOrnB;\n" - " trInverse(posB1,ornB1,&invPosB,&invOrnB);\n" - " trMul(invPosB,invOrnB,posA1,ornA1,&planeInConvexPos1,&planeInConvexOrn1); \n" - " }\n" - " float4 vtx1 = qtRotate(planeInConvexOrn1,-planeNormal1)*radius;\n" - " float4 vtxInPlane1 = transform(&vtx1,&convexInPlaneTransPos1,&convexInPlaneTransOrn1);\n" - " float distance = dot3F4(planeNormal1,vtxInPlane1) - planeConstant;\n" - " hasCollision = distance < 0.f;//m_manifoldPtr->getContactBreakingThreshold();\n" - " if (hasCollision)\n" - " {\n" - " float4 vtxInPlaneProjected1 = vtxInPlane1 - distance*planeNormal1;\n" - " float4 vtxInPlaneWorld1 = transform(&vtxInPlaneProjected1,&posA1,&ornA1);\n" - " float4 normalOnSurfaceB1 = qtRotate(ornA1,planeNormal1);\n" - " float4 pOnB1 = vtxInPlaneWorld1+normalOnSurfaceB1*distance;\n" - " pOnB1.w = distance;\n" - " int dstIdx;\n" - " AppendInc( nGlobalContactsOut, dstIdx );\n" - " \n" - " if (dstIdx < maxContactCapacity)\n" - " {\n" - " __global struct b3Contact4Data* c = &globalContactsOut[dstIdx];\n" - " c->m_worldNormalOnB = -normalOnSurfaceB1;\n" - " c->m_restituitionCoeffCmp = (0.f*0xffff);c->m_frictionCoeffCmp = (0.7f*0xffff);\n" - " c->m_batchIdx = pairIndex;\n" - " c->m_bodyAPtrAndSignBit = rigidBodies[bodyIndexA].m_invMass==0?-bodyIndexA:bodyIndexA;\n" - " c->m_bodyBPtrAndSignBit = rigidBodies[bodyIndexB].m_invMass==0?-bodyIndexB:bodyIndexB;\n" - " c->m_worldPosB[0] = pOnB1;\n" - " c->m_childIndexA = -1;\n" - " c->m_childIndexB = -1;\n" - " GET_NPOINTS(*c) = 1;\n" - " }//if (dstIdx < numPairs)\n" - " }//if (hasCollision)\n" - "}\n" - "__kernel void primitiveContactsKernel( __global int4* pairs, \n" - " __global const BodyData* rigidBodies, \n" - " __global const btCollidableGpu* collidables,\n" - " __global const ConvexPolyhedronCL* convexShapes, \n" - " __global const float4* vertices,\n" - " __global const float4* uniqueEdges,\n" - " __global const btGpuFace* faces,\n" - " __global const int* indices,\n" - " __global struct b3Contact4Data* restrict globalContactsOut,\n" - " counter32_t nGlobalContactsOut,\n" - " int numPairs, int maxContactCapacity)\n" - "{\n" - " int i = get_global_id(0);\n" - " int pairIndex = i;\n" - " \n" - " float4 worldVertsB1[64];\n" - " float4 worldVertsB2[64];\n" - " int capacityWorldVerts = 64; \n" - " float4 localContactsOut[64];\n" - " int localContactCapacity=64;\n" - " \n" - " float minDist = -1e30f;\n" - " float maxDist = 0.02f;\n" - " if (i=0)\n" - " pairs[pairIndex].z = contactIndex;\n" - " return;\n" - " }\n" - " if (collidables[collidableIndexA].m_shapeType == SHAPE_CONVEX_HULL &&\n" - " collidables[collidableIndexB].m_shapeType == SHAPE_PLANE)\n" - " {\n" - " float4 posA;\n" - " posA = rigidBodies[bodyIndexA].m_pos;\n" - " Quaternion ornA;\n" - " ornA = rigidBodies[bodyIndexA].m_quat;\n" - " int contactIndex = computeContactPlaneConvex( pairIndex, bodyIndexB,bodyIndexA, collidableIndexB,collidableIndexA, \n" - " rigidBodies,collidables,convexShapes,vertices,indices,\n" - " faces, globalContactsOut, nGlobalContactsOut,maxContactCapacity,posA,ornA);\n" - " if (contactIndex>=0)\n" - " pairs[pairIndex].z = contactIndex;\n" - " return;\n" - " }\n" - " if (collidables[collidableIndexA].m_shapeType == SHAPE_PLANE &&\n" - " collidables[collidableIndexB].m_shapeType == SHAPE_SPHERE)\n" - " {\n" - " computeContactPlaneSphere(pairIndex, bodyIndexA, bodyIndexB, collidableIndexA, collidableIndexB, \n" - " rigidBodies,collidables,faces, globalContactsOut, nGlobalContactsOut,maxContactCapacity);\n" - " return;\n" - " }\n" - " if (collidables[collidableIndexA].m_shapeType == SHAPE_SPHERE &&\n" - " collidables[collidableIndexB].m_shapeType == SHAPE_PLANE)\n" - " {\n" - " computeContactPlaneSphere( pairIndex, bodyIndexB,bodyIndexA, collidableIndexB,collidableIndexA, \n" - " rigidBodies,collidables,\n" - " faces, globalContactsOut, nGlobalContactsOut,maxContactCapacity);\n" - " return;\n" - " }\n" - " \n" - " \n" - " if (collidables[collidableIndexA].m_shapeType == SHAPE_SPHERE &&\n" - " collidables[collidableIndexB].m_shapeType == SHAPE_CONVEX_HULL)\n" - " {\n" - " \n" - " float4 spherePos = rigidBodies[bodyIndexA].m_pos;\n" - " float sphereRadius = collidables[collidableIndexA].m_radius;\n" - " float4 convexPos = rigidBodies[bodyIndexB].m_pos;\n" - " float4 convexOrn = rigidBodies[bodyIndexB].m_quat;\n" - " computeContactSphereConvex(pairIndex, bodyIndexA, bodyIndexB, collidableIndexA, collidableIndexB, \n" - " rigidBodies,collidables,convexShapes,vertices,indices,faces, globalContactsOut, nGlobalContactsOut,maxContactCapacity,\n" - " spherePos,sphereRadius,convexPos,convexOrn);\n" - " return;\n" - " }\n" - " if (collidables[collidableIndexA].m_shapeType == SHAPE_CONVEX_HULL &&\n" - " collidables[collidableIndexB].m_shapeType == SHAPE_SPHERE)\n" - " {\n" - " \n" - " float4 spherePos = rigidBodies[bodyIndexB].m_pos;\n" - " float sphereRadius = collidables[collidableIndexB].m_radius;\n" - " float4 convexPos = rigidBodies[bodyIndexA].m_pos;\n" - " float4 convexOrn = rigidBodies[bodyIndexA].m_quat;\n" - " computeContactSphereConvex(pairIndex, bodyIndexB, bodyIndexA, collidableIndexB, collidableIndexA, \n" - " rigidBodies,collidables,convexShapes,vertices,indices,faces, globalContactsOut, nGlobalContactsOut,maxContactCapacity,\n" - " spherePos,sphereRadius,convexPos,convexOrn);\n" - " return;\n" - " }\n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " if (collidables[collidableIndexA].m_shapeType == SHAPE_SPHERE &&\n" - " collidables[collidableIndexB].m_shapeType == SHAPE_SPHERE)\n" - " {\n" - " //sphere-sphere\n" - " float radiusA = collidables[collidableIndexA].m_radius;\n" - " float radiusB = collidables[collidableIndexB].m_radius;\n" - " float4 posA = rigidBodies[bodyIndexA].m_pos;\n" - " float4 posB = rigidBodies[bodyIndexB].m_pos;\n" - " float4 diff = posA-posB;\n" - " float len = length(diff);\n" - " \n" - " ///iff distance positive, don't generate a new contact\n" - " if ( len <= (radiusA+radiusB))\n" - " {\n" - " ///distance (negative means penetration)\n" - " float dist = len - (radiusA+radiusB);\n" - " float4 normalOnSurfaceB = make_float4(1.f,0.f,0.f,0.f);\n" - " if (len > 0.00001)\n" - " {\n" - " normalOnSurfaceB = diff / len;\n" - " }\n" - " float4 contactPosB = posB + normalOnSurfaceB*radiusB;\n" - " contactPosB.w = dist;\n" - " \n" - " int dstIdx;\n" - " AppendInc( nGlobalContactsOut, dstIdx );\n" - " \n" - " if (dstIdx < maxContactCapacity)\n" - " {\n" - " __global struct b3Contact4Data* c = &globalContactsOut[dstIdx];\n" - " c->m_worldNormalOnB = normalOnSurfaceB;\n" - " c->m_restituitionCoeffCmp = (0.f*0xffff);c->m_frictionCoeffCmp = (0.7f*0xffff);\n" - " c->m_batchIdx = pairIndex;\n" - " int bodyA = pairs[pairIndex].x;\n" - " int bodyB = pairs[pairIndex].y;\n" - " c->m_bodyAPtrAndSignBit = rigidBodies[bodyA].m_invMass==0?-bodyA:bodyA;\n" - " c->m_bodyBPtrAndSignBit = rigidBodies[bodyB].m_invMass==0?-bodyB:bodyB;\n" - " c->m_worldPosB[0] = contactPosB;\n" - " c->m_childIndexA = -1;\n" - " c->m_childIndexB = -1;\n" - " GET_NPOINTS(*c) = 1;\n" - " }//if (dstIdx < numPairs)\n" - " }//if ( len <= (radiusA+radiusB))\n" - " return;\n" - " }//SHAPE_SPHERE SHAPE_SPHERE\n" - " }// if (i= 0)\n" - " {\n" - " collidableIndexA = gpuChildShapes[childShapeIndexA].m_shapeIndex;\n" - " float4 childPosA = gpuChildShapes[childShapeIndexA].m_childPosition;\n" - " float4 childOrnA = gpuChildShapes[childShapeIndexA].m_childOrientation;\n" - " float4 newPosA = qtRotate(ornA,childPosA)+posA;\n" - " float4 newOrnA = qtMul(ornA,childOrnA);\n" - " posA = newPosA;\n" - " ornA = newOrnA;\n" - " } else\n" - " {\n" - " collidableIndexA = rigidBodies[bodyIndexA].m_collidableIdx;\n" - " }\n" - " \n" - " if (childShapeIndexB>=0)\n" - " {\n" - " collidableIndexB = gpuChildShapes[childShapeIndexB].m_shapeIndex;\n" - " float4 childPosB = gpuChildShapes[childShapeIndexB].m_childPosition;\n" - " float4 childOrnB = gpuChildShapes[childShapeIndexB].m_childOrientation;\n" - " float4 newPosB = transform(&childPosB,&posB,&ornB);\n" - " float4 newOrnB = qtMul(ornB,childOrnB);\n" - " posB = newPosB;\n" - " ornB = newOrnB;\n" - " } else\n" - " {\n" - " collidableIndexB = rigidBodies[bodyIndexB].m_collidableIdx; \n" - " }\n" - " \n" - " int shapeIndexA = collidables[collidableIndexA].m_shapeIndex;\n" - " int shapeIndexB = collidables[collidableIndexB].m_shapeIndex;\n" - " \n" - " int shapeTypeA = collidables[collidableIndexA].m_shapeType;\n" - " int shapeTypeB = collidables[collidableIndexB].m_shapeType;\n" - " int pairIndex = i;\n" - " if ((shapeTypeA == SHAPE_PLANE) && (shapeTypeB==SHAPE_CONVEX_HULL))\n" - " {\n" - " computeContactPlaneConvex( pairIndex, bodyIndexA,bodyIndexB, collidableIndexA,collidableIndexB, \n" - " rigidBodies,collidables,convexShapes,vertices,indices,\n" - " faces, globalContactsOut, nGlobalContactsOut,maxContactCapacity,posB,ornB);\n" - " return;\n" - " }\n" - " if ((shapeTypeA == SHAPE_CONVEX_HULL) && (shapeTypeB==SHAPE_PLANE))\n" - " {\n" - " computeContactPlaneConvex( pairIndex, bodyIndexB,bodyIndexA, collidableIndexB,collidableIndexA, \n" - " rigidBodies,collidables,convexShapes,vertices,indices,\n" - " faces, globalContactsOut, nGlobalContactsOut,maxContactCapacity,posA,ornA);\n" - " return;\n" - " }\n" - " if ((shapeTypeA == SHAPE_CONVEX_HULL) && (shapeTypeB == SHAPE_SPHERE))\n" - " {\n" - " float4 spherePos = rigidBodies[bodyIndexB].m_pos;\n" - " float sphereRadius = collidables[collidableIndexB].m_radius;\n" - " float4 convexPos = posA;\n" - " float4 convexOrn = ornA;\n" - " \n" - " computeContactSphereConvex(pairIndex, bodyIndexB, bodyIndexA , collidableIndexB,collidableIndexA, \n" - " rigidBodies,collidables,convexShapes,vertices,indices,faces, globalContactsOut, nGlobalContactsOut,maxContactCapacity,\n" - " spherePos,sphereRadius,convexPos,convexOrn);\n" - " \n" - " return;\n" - " }\n" - " if ((shapeTypeA == SHAPE_SPHERE) && (shapeTypeB == SHAPE_CONVEX_HULL))\n" - " {\n" - " float4 spherePos = rigidBodies[bodyIndexA].m_pos;\n" - " float sphereRadius = collidables[collidableIndexA].m_radius;\n" - " float4 convexPos = posB;\n" - " float4 convexOrn = ornB;\n" - " \n" - " computeContactSphereConvex(pairIndex, bodyIndexA, bodyIndexB, collidableIndexA, collidableIndexB, \n" - " rigidBodies,collidables,convexShapes,vertices,indices,faces, globalContactsOut, nGlobalContactsOut,maxContactCapacity,\n" - " spherePos,sphereRadius,convexPos,convexOrn);\n" - " \n" - " return;\n" - " }\n" - " }// if (i 0 && r2 > 0 && r3 > 0 )\n" - " return true;\n" - " if ( r1 <= 0 && r2 <= 0 && r3 <= 0 ) \n" - " return true;\n" - " return false;\n" - "}\n" - "float segmentSqrDistance(float4 from, float4 to,float4 p, float4* nearest) \n" - "{\n" - " float4 diff = p - from;\n" - " float4 v = to - from;\n" - " float t = dot(v,diff);\n" - " \n" - " if (t > 0) \n" - " {\n" - " float dotVV = dot(v,v);\n" - " if (t < dotVV) \n" - " {\n" - " t /= dotVV;\n" - " diff -= t*v;\n" - " } else \n" - " {\n" - " t = 1;\n" - " diff -= v;\n" - " }\n" - " } else\n" - " {\n" - " t = 0;\n" - " }\n" - " *nearest = from + t*v;\n" - " return dot(diff,diff); \n" - "}\n" - "void computeContactSphereTriangle(int pairIndex,\n" - " int bodyIndexA, int bodyIndexB,\n" - " int collidableIndexA, int collidableIndexB, \n" - " __global const BodyData* rigidBodies, \n" - " __global const btCollidableGpu* collidables,\n" - " const float4* triangleVertices,\n" - " __global struct b3Contact4Data* restrict globalContactsOut,\n" - " counter32_t nGlobalContactsOut,\n" - " int maxContactCapacity,\n" - " float4 spherePos2,\n" - " float radius,\n" - " float4 pos,\n" - " float4 quat,\n" - " int faceIndex\n" - " )\n" - "{\n" - " float4 invPos;\n" - " float4 invOrn;\n" - " trInverse(pos,quat, &invPos,&invOrn);\n" - " float4 spherePos = transform(&spherePos2,&invPos,&invOrn);\n" - " int numFaces = 3;\n" - " float4 closestPnt = (float4)(0, 0, 0, 0);\n" - " float4 hitNormalWorld = (float4)(0, 0, 0, 0);\n" - " float minDist = -1000000.f;\n" - " bool bCollide = false;\n" - " \n" - " //////////////////////////////////////\n" - " float4 sphereCenter;\n" - " sphereCenter = spherePos;\n" - " const float4* vertices = triangleVertices;\n" - " float contactBreakingThreshold = 0.f;//todo?\n" - " float radiusWithThreshold = radius + contactBreakingThreshold;\n" - " float4 edge10;\n" - " edge10 = vertices[1]-vertices[0];\n" - " edge10.w = 0.f;//is this needed?\n" - " float4 edge20;\n" - " edge20 = vertices[2]-vertices[0];\n" - " edge20.w = 0.f;//is this needed?\n" - " float4 normal = cross3(edge10,edge20);\n" - " normal = normalize(normal);\n" - " float4 p1ToCenter;\n" - " p1ToCenter = sphereCenter - vertices[0];\n" - " \n" - " float distanceFromPlane = dot(p1ToCenter,normal);\n" - " if (distanceFromPlane < 0.f)\n" - " {\n" - " //triangle facing the other way\n" - " distanceFromPlane *= -1.f;\n" - " normal *= -1.f;\n" - " }\n" - " hitNormalWorld = normal;\n" - " bool isInsideContactPlane = distanceFromPlane < radiusWithThreshold;\n" - " \n" - " // Check for contact / intersection\n" - " bool hasContact = false;\n" - " float4 contactPoint;\n" - " if (isInsideContactPlane) \n" - " {\n" - " \n" - " if (pointInTriangle(vertices,&normal, &sphereCenter)) \n" - " {\n" - " // Inside the contact wedge - touches a point on the shell plane\n" - " hasContact = true;\n" - " contactPoint = sphereCenter - normal*distanceFromPlane;\n" - " \n" - " } else {\n" - " // Could be inside one of the contact capsules\n" - " float contactCapsuleRadiusSqr = radiusWithThreshold*radiusWithThreshold;\n" - " float4 nearestOnEdge;\n" - " int numEdges = 3;\n" - " for (int i = 0; i < numEdges; i++) \n" - " {\n" - " float4 pa =vertices[i];\n" - " float4 pb = vertices[(i+1)%3];\n" - " float distanceSqr = segmentSqrDistance(pa,pb,sphereCenter, &nearestOnEdge);\n" - " if (distanceSqr < contactCapsuleRadiusSqr) \n" - " {\n" - " // Yep, we're inside a capsule\n" - " hasContact = true;\n" - " contactPoint = nearestOnEdge;\n" - " \n" - " }\n" - " \n" - " }\n" - " }\n" - " }\n" - " if (hasContact) \n" - " {\n" - " closestPnt = contactPoint;\n" - " float4 contactToCenter = sphereCenter - contactPoint;\n" - " minDist = length(contactToCenter);\n" - " if (minDist>FLT_EPSILON)\n" - " {\n" - " hitNormalWorld = normalize(contactToCenter);//*(1./minDist);\n" - " bCollide = true;\n" - " }\n" - " \n" - " }\n" - " /////////////////////////////////////\n" - " if (bCollide && minDist > -10000)\n" - " {\n" - " \n" - " float4 normalOnSurfaceB1 = qtRotate(quat,-hitNormalWorld);\n" - " float4 pOnB1 = transform(&closestPnt,&pos,&quat);\n" - " float actualDepth = minDist-radius;\n" - " \n" - " if (actualDepth<=0.f)\n" - " {\n" - " pOnB1.w = actualDepth;\n" - " int dstIdx;\n" - " \n" - " float lenSqr = dot3F4(normalOnSurfaceB1,normalOnSurfaceB1);\n" - " if (lenSqr>FLT_EPSILON)\n" - " {\n" - " AppendInc( nGlobalContactsOut, dstIdx );\n" - " \n" - " if (dstIdx < maxContactCapacity)\n" - " {\n" - " __global struct b3Contact4Data* c = &globalContactsOut[dstIdx];\n" - " c->m_worldNormalOnB = -normalOnSurfaceB1;\n" - " c->m_restituitionCoeffCmp = (0.f*0xffff);c->m_frictionCoeffCmp = (0.7f*0xffff);\n" - " c->m_batchIdx = pairIndex;\n" - " c->m_bodyAPtrAndSignBit = rigidBodies[bodyIndexA].m_invMass==0?-bodyIndexA:bodyIndexA;\n" - " c->m_bodyBPtrAndSignBit = rigidBodies[bodyIndexB].m_invMass==0?-bodyIndexB:bodyIndexB;\n" - " c->m_worldPosB[0] = pOnB1;\n" - " c->m_childIndexA = -1;\n" - " c->m_childIndexB = faceIndex;\n" - " GET_NPOINTS(*c) = 1;\n" - " } \n" - " }\n" - " }\n" - " }//if (hasCollision)\n" - "}\n" - "// work-in-progress\n" - "__kernel void findConcaveSphereContactsKernel( __global int4* concavePairs,\n" - " __global const BodyData* rigidBodies,\n" - " __global const btCollidableGpu* collidables,\n" - " __global const ConvexPolyhedronCL* convexShapes, \n" - " __global const float4* vertices,\n" - " __global const float4* uniqueEdges,\n" - " __global const btGpuFace* faces,\n" - " __global const int* indices,\n" - " __global btAabbCL* aabbs,\n" - " __global struct b3Contact4Data* restrict globalContactsOut,\n" - " counter32_t nGlobalContactsOut,\n" - " int numConcavePairs, int maxContactCapacity\n" - " )\n" - "{\n" - " int i = get_global_id(0);\n" - " if (i>=numConcavePairs)\n" - " return;\n" - " int pairIdx = i;\n" - " int bodyIndexA = concavePairs[i].x;\n" - " int bodyIndexB = concavePairs[i].y;\n" - " int collidableIndexA = rigidBodies[bodyIndexA].m_collidableIdx;\n" - " int collidableIndexB = rigidBodies[bodyIndexB].m_collidableIdx;\n" - " int shapeIndexA = collidables[collidableIndexA].m_shapeIndex;\n" - " int shapeIndexB = collidables[collidableIndexB].m_shapeIndex;\n" - " if (collidables[collidableIndexB].m_shapeType==SHAPE_SPHERE)\n" - " {\n" - " int f = concavePairs[i].z;\n" - " btGpuFace face = faces[convexShapes[shapeIndexA].m_faceOffset+f];\n" - " \n" - " float4 verticesA[3];\n" - " for (int i=0;i<3;i++)\n" - " {\n" - " int index = indices[face.m_indexOffset+i];\n" - " float4 vert = vertices[convexShapes[shapeIndexA].m_vertexOffset+index];\n" - " verticesA[i] = vert;\n" - " }\n" - " float4 spherePos = rigidBodies[bodyIndexB].m_pos;\n" - " float sphereRadius = collidables[collidableIndexB].m_radius;\n" - " float4 convexPos = rigidBodies[bodyIndexA].m_pos;\n" - " float4 convexOrn = rigidBodies[bodyIndexA].m_quat;\n" - " computeContactSphereTriangle(i, bodyIndexB, bodyIndexA, collidableIndexB, collidableIndexA, \n" - " rigidBodies,collidables,\n" - " verticesA,\n" - " globalContactsOut, nGlobalContactsOut,maxContactCapacity,\n" - " spherePos,sphereRadius,convexPos,convexOrn, f);\n" - " return;\n" - " }\n" - "}\n"; diff --git a/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/satClipHullContacts.h b/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/satClipHullContacts.h deleted file mode 100644 index 907809d8..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/satClipHullContacts.h +++ /dev/null @@ -1,2098 +0,0 @@ -//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project -static const char* satClipKernelsCL = - "#define TRIANGLE_NUM_CONVEX_FACES 5\n" - "#pragma OPENCL EXTENSION cl_amd_printf : enable\n" - "#pragma OPENCL EXTENSION cl_khr_local_int32_base_atomics : enable\n" - "#pragma OPENCL EXTENSION cl_khr_global_int32_base_atomics : enable\n" - "#pragma OPENCL EXTENSION cl_khr_local_int32_extended_atomics : enable\n" - "#pragma OPENCL EXTENSION cl_khr_global_int32_extended_atomics : enable\n" - "#ifdef cl_ext_atomic_counters_32\n" - "#pragma OPENCL EXTENSION cl_ext_atomic_counters_32 : enable\n" - "#else\n" - "#define counter32_t volatile __global int*\n" - "#endif\n" - "#define GET_GROUP_IDX get_group_id(0)\n" - "#define GET_LOCAL_IDX get_local_id(0)\n" - "#define GET_GLOBAL_IDX get_global_id(0)\n" - "#define GET_GROUP_SIZE get_local_size(0)\n" - "#define GET_NUM_GROUPS get_num_groups(0)\n" - "#define GROUP_LDS_BARRIER barrier(CLK_LOCAL_MEM_FENCE)\n" - "#define GROUP_MEM_FENCE mem_fence(CLK_LOCAL_MEM_FENCE)\n" - "#define AtomInc(x) atom_inc(&(x))\n" - "#define AtomInc1(x, out) out = atom_inc(&(x))\n" - "#define AppendInc(x, out) out = atomic_inc(x)\n" - "#define AtomAdd(x, value) atom_add(&(x), value)\n" - "#define AtomCmpxhg(x, cmp, value) atom_cmpxchg( &(x), cmp, value )\n" - "#define AtomXhg(x, value) atom_xchg ( &(x), value )\n" - "#define max2 max\n" - "#define min2 min\n" - "typedef unsigned int u32;\n" - "#ifndef B3_CONTACT4DATA_H\n" - "#define B3_CONTACT4DATA_H\n" - "#ifndef B3_FLOAT4_H\n" - "#define B3_FLOAT4_H\n" - "#ifndef B3_PLATFORM_DEFINITIONS_H\n" - "#define B3_PLATFORM_DEFINITIONS_H\n" - "struct MyTest\n" - "{\n" - " int bla;\n" - "};\n" - "#ifdef __cplusplus\n" - "#else\n" - "//keep B3_LARGE_FLOAT*B3_LARGE_FLOAT < FLT_MAX\n" - "#define B3_LARGE_FLOAT 1e18f\n" - "#define B3_INFINITY 1e18f\n" - "#define b3Assert(a)\n" - "#define b3ConstArray(a) __global const a*\n" - "#define b3AtomicInc atomic_inc\n" - "#define b3AtomicAdd atomic_add\n" - "#define b3Fabs fabs\n" - "#define b3Sqrt native_sqrt\n" - "#define b3Sin native_sin\n" - "#define b3Cos native_cos\n" - "#define B3_STATIC\n" - "#endif\n" - "#endif\n" - "#ifdef __cplusplus\n" - "#else\n" - " typedef float4 b3Float4;\n" - " #define b3Float4ConstArg const b3Float4\n" - " #define b3MakeFloat4 (float4)\n" - " float b3Dot3F4(b3Float4ConstArg v0,b3Float4ConstArg v1)\n" - " {\n" - " float4 a1 = b3MakeFloat4(v0.xyz,0.f);\n" - " float4 b1 = b3MakeFloat4(v1.xyz,0.f);\n" - " return dot(a1, b1);\n" - " }\n" - " b3Float4 b3Cross3(b3Float4ConstArg v0,b3Float4ConstArg v1)\n" - " {\n" - " float4 a1 = b3MakeFloat4(v0.xyz,0.f);\n" - " float4 b1 = b3MakeFloat4(v1.xyz,0.f);\n" - " return cross(a1, b1);\n" - " }\n" - " #define b3MinFloat4 min\n" - " #define b3MaxFloat4 max\n" - " #define b3Normalized(a) normalize(a)\n" - "#endif \n" - " \n" - "inline bool b3IsAlmostZero(b3Float4ConstArg v)\n" - "{\n" - " if(b3Fabs(v.x)>1e-6 || b3Fabs(v.y)>1e-6 || b3Fabs(v.z)>1e-6) \n" - " return false;\n" - " return true;\n" - "}\n" - "inline int b3MaxDot( b3Float4ConstArg vec, __global const b3Float4* vecArray, int vecLen, float* dotOut )\n" - "{\n" - " float maxDot = -B3_INFINITY;\n" - " int i = 0;\n" - " int ptIndex = -1;\n" - " for( i = 0; i < vecLen; i++ )\n" - " {\n" - " float dot = b3Dot3F4(vecArray[i],vec);\n" - " \n" - " if( dot > maxDot )\n" - " {\n" - " maxDot = dot;\n" - " ptIndex = i;\n" - " }\n" - " }\n" - " b3Assert(ptIndex>=0);\n" - " if (ptIndex<0)\n" - " {\n" - " ptIndex = 0;\n" - " }\n" - " *dotOut = maxDot;\n" - " return ptIndex;\n" - "}\n" - "#endif //B3_FLOAT4_H\n" - "typedef struct b3Contact4Data b3Contact4Data_t;\n" - "struct b3Contact4Data\n" - "{\n" - " b3Float4 m_worldPosB[4];\n" - "// b3Float4 m_localPosA[4];\n" - "// b3Float4 m_localPosB[4];\n" - " b3Float4 m_worldNormalOnB; // w: m_nPoints\n" - " unsigned short m_restituitionCoeffCmp;\n" - " unsigned short m_frictionCoeffCmp;\n" - " int m_batchIdx;\n" - " int m_bodyAPtrAndSignBit;//x:m_bodyAPtr, y:m_bodyBPtr\n" - " int m_bodyBPtrAndSignBit;\n" - " int m_childIndexA;\n" - " int m_childIndexB;\n" - " int m_unused1;\n" - " int m_unused2;\n" - "};\n" - "inline int b3Contact4Data_getNumPoints(const struct b3Contact4Data* contact)\n" - "{\n" - " return (int)contact->m_worldNormalOnB.w;\n" - "};\n" - "inline void b3Contact4Data_setNumPoints(struct b3Contact4Data* contact, int numPoints)\n" - "{\n" - " contact->m_worldNormalOnB.w = (float)numPoints;\n" - "};\n" - "#endif //B3_CONTACT4DATA_H\n" - "#ifndef B3_CONVEX_POLYHEDRON_DATA_H\n" - "#define B3_CONVEX_POLYHEDRON_DATA_H\n" - "#ifndef B3_FLOAT4_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#endif \n" - "#endif //B3_FLOAT4_H\n" - "#ifndef B3_QUAT_H\n" - "#define B3_QUAT_H\n" - "#ifndef B3_PLATFORM_DEFINITIONS_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#endif\n" - "#endif\n" - "#ifndef B3_FLOAT4_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#endif \n" - "#endif //B3_FLOAT4_H\n" - "#ifdef __cplusplus\n" - "#else\n" - " typedef float4 b3Quat;\n" - " #define b3QuatConstArg const b3Quat\n" - " \n" - " \n" - "inline float4 b3FastNormalize4(float4 v)\n" - "{\n" - " v = (float4)(v.xyz,0.f);\n" - " return fast_normalize(v);\n" - "}\n" - " \n" - "inline b3Quat b3QuatMul(b3Quat a, b3Quat b);\n" - "inline b3Quat b3QuatNormalized(b3QuatConstArg in);\n" - "inline b3Quat b3QuatRotate(b3QuatConstArg q, b3QuatConstArg vec);\n" - "inline b3Quat b3QuatInvert(b3QuatConstArg q);\n" - "inline b3Quat b3QuatInverse(b3QuatConstArg q);\n" - "inline b3Quat b3QuatMul(b3QuatConstArg a, b3QuatConstArg b)\n" - "{\n" - " b3Quat ans;\n" - " ans = b3Cross3( a, b );\n" - " ans += a.w*b+b.w*a;\n" - "// ans.w = a.w*b.w - (a.x*b.x+a.y*b.y+a.z*b.z);\n" - " ans.w = a.w*b.w - b3Dot3F4(a, b);\n" - " return ans;\n" - "}\n" - "inline b3Quat b3QuatNormalized(b3QuatConstArg in)\n" - "{\n" - " b3Quat q;\n" - " q=in;\n" - " //return b3FastNormalize4(in);\n" - " float len = native_sqrt(dot(q, q));\n" - " if(len > 0.f)\n" - " {\n" - " q *= 1.f / len;\n" - " }\n" - " else\n" - " {\n" - " q.x = q.y = q.z = 0.f;\n" - " q.w = 1.f;\n" - " }\n" - " return q;\n" - "}\n" - "inline float4 b3QuatRotate(b3QuatConstArg q, b3QuatConstArg vec)\n" - "{\n" - " b3Quat qInv = b3QuatInvert( q );\n" - " float4 vcpy = vec;\n" - " vcpy.w = 0.f;\n" - " float4 out = b3QuatMul(b3QuatMul(q,vcpy),qInv);\n" - " return out;\n" - "}\n" - "inline b3Quat b3QuatInverse(b3QuatConstArg q)\n" - "{\n" - " return (b3Quat)(-q.xyz, q.w);\n" - "}\n" - "inline b3Quat b3QuatInvert(b3QuatConstArg q)\n" - "{\n" - " return (b3Quat)(-q.xyz, q.w);\n" - "}\n" - "inline float4 b3QuatInvRotate(b3QuatConstArg q, b3QuatConstArg vec)\n" - "{\n" - " return b3QuatRotate( b3QuatInvert( q ), vec );\n" - "}\n" - "inline b3Float4 b3TransformPoint(b3Float4ConstArg point, b3Float4ConstArg translation, b3QuatConstArg orientation)\n" - "{\n" - " return b3QuatRotate( orientation, point ) + (translation);\n" - "}\n" - " \n" - "#endif \n" - "#endif //B3_QUAT_H\n" - "typedef struct b3GpuFace b3GpuFace_t;\n" - "struct b3GpuFace\n" - "{\n" - " b3Float4 m_plane;\n" - " int m_indexOffset;\n" - " int m_numIndices;\n" - " int m_unusedPadding1;\n" - " int m_unusedPadding2;\n" - "};\n" - "typedef struct b3ConvexPolyhedronData b3ConvexPolyhedronData_t;\n" - "struct b3ConvexPolyhedronData\n" - "{\n" - " b3Float4 m_localCenter;\n" - " b3Float4 m_extents;\n" - " b3Float4 mC;\n" - " b3Float4 mE;\n" - " float m_radius;\n" - " int m_faceOffset;\n" - " int m_numFaces;\n" - " int m_numVertices;\n" - " int m_vertexOffset;\n" - " int m_uniqueEdgesOffset;\n" - " int m_numUniqueEdges;\n" - " int m_unused;\n" - "};\n" - "#endif //B3_CONVEX_POLYHEDRON_DATA_H\n" - "#ifndef B3_COLLIDABLE_H\n" - "#define B3_COLLIDABLE_H\n" - "#ifndef B3_FLOAT4_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#endif \n" - "#endif //B3_FLOAT4_H\n" - "#ifndef B3_QUAT_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#endif \n" - "#endif //B3_QUAT_H\n" - "enum b3ShapeTypes\n" - "{\n" - " SHAPE_HEIGHT_FIELD=1,\n" - " SHAPE_CONVEX_HULL=3,\n" - " SHAPE_PLANE=4,\n" - " SHAPE_CONCAVE_TRIMESH=5,\n" - " SHAPE_COMPOUND_OF_CONVEX_HULLS=6,\n" - " SHAPE_SPHERE=7,\n" - " MAX_NUM_SHAPE_TYPES,\n" - "};\n" - "typedef struct b3Collidable b3Collidable_t;\n" - "struct b3Collidable\n" - "{\n" - " union {\n" - " int m_numChildShapes;\n" - " int m_bvhIndex;\n" - " };\n" - " union\n" - " {\n" - " float m_radius;\n" - " int m_compoundBvhIndex;\n" - " };\n" - " int m_shapeType;\n" - " int m_shapeIndex;\n" - "};\n" - "typedef struct b3GpuChildShape b3GpuChildShape_t;\n" - "struct b3GpuChildShape\n" - "{\n" - " b3Float4 m_childPosition;\n" - " b3Quat m_childOrientation;\n" - " int m_shapeIndex;\n" - " int m_unused0;\n" - " int m_unused1;\n" - " int m_unused2;\n" - "};\n" - "struct b3CompoundOverlappingPair\n" - "{\n" - " int m_bodyIndexA;\n" - " int m_bodyIndexB;\n" - "// int m_pairType;\n" - " int m_childShapeIndexA;\n" - " int m_childShapeIndexB;\n" - "};\n" - "#endif //B3_COLLIDABLE_H\n" - "#ifndef B3_RIGIDBODY_DATA_H\n" - "#define B3_RIGIDBODY_DATA_H\n" - "#ifndef B3_FLOAT4_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#endif \n" - "#endif //B3_FLOAT4_H\n" - "#ifndef B3_QUAT_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#endif \n" - "#endif //B3_QUAT_H\n" - "#ifndef B3_MAT3x3_H\n" - "#define B3_MAT3x3_H\n" - "#ifndef B3_QUAT_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#endif \n" - "#endif //B3_QUAT_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "typedef struct\n" - "{\n" - " b3Float4 m_row[3];\n" - "}b3Mat3x3;\n" - "#define b3Mat3x3ConstArg const b3Mat3x3\n" - "#define b3GetRow(m,row) (m.m_row[row])\n" - "inline b3Mat3x3 b3QuatGetRotationMatrix(b3Quat quat)\n" - "{\n" - " b3Float4 quat2 = (b3Float4)(quat.x*quat.x, quat.y*quat.y, quat.z*quat.z, 0.f);\n" - " b3Mat3x3 out;\n" - " out.m_row[0].x=1-2*quat2.y-2*quat2.z;\n" - " out.m_row[0].y=2*quat.x*quat.y-2*quat.w*quat.z;\n" - " out.m_row[0].z=2*quat.x*quat.z+2*quat.w*quat.y;\n" - " out.m_row[0].w = 0.f;\n" - " out.m_row[1].x=2*quat.x*quat.y+2*quat.w*quat.z;\n" - " out.m_row[1].y=1-2*quat2.x-2*quat2.z;\n" - " out.m_row[1].z=2*quat.y*quat.z-2*quat.w*quat.x;\n" - " out.m_row[1].w = 0.f;\n" - " out.m_row[2].x=2*quat.x*quat.z-2*quat.w*quat.y;\n" - " out.m_row[2].y=2*quat.y*quat.z+2*quat.w*quat.x;\n" - " out.m_row[2].z=1-2*quat2.x-2*quat2.y;\n" - " out.m_row[2].w = 0.f;\n" - " return out;\n" - "}\n" - "inline b3Mat3x3 b3AbsoluteMat3x3(b3Mat3x3ConstArg matIn)\n" - "{\n" - " b3Mat3x3 out;\n" - " out.m_row[0] = fabs(matIn.m_row[0]);\n" - " out.m_row[1] = fabs(matIn.m_row[1]);\n" - " out.m_row[2] = fabs(matIn.m_row[2]);\n" - " return out;\n" - "}\n" - "__inline\n" - "b3Mat3x3 mtZero();\n" - "__inline\n" - "b3Mat3x3 mtIdentity();\n" - "__inline\n" - "b3Mat3x3 mtTranspose(b3Mat3x3 m);\n" - "__inline\n" - "b3Mat3x3 mtMul(b3Mat3x3 a, b3Mat3x3 b);\n" - "__inline\n" - "b3Float4 mtMul1(b3Mat3x3 a, b3Float4 b);\n" - "__inline\n" - "b3Float4 mtMul3(b3Float4 a, b3Mat3x3 b);\n" - "__inline\n" - "b3Mat3x3 mtZero()\n" - "{\n" - " b3Mat3x3 m;\n" - " m.m_row[0] = (b3Float4)(0.f);\n" - " m.m_row[1] = (b3Float4)(0.f);\n" - " m.m_row[2] = (b3Float4)(0.f);\n" - " return m;\n" - "}\n" - "__inline\n" - "b3Mat3x3 mtIdentity()\n" - "{\n" - " b3Mat3x3 m;\n" - " m.m_row[0] = (b3Float4)(1,0,0,0);\n" - " m.m_row[1] = (b3Float4)(0,1,0,0);\n" - " m.m_row[2] = (b3Float4)(0,0,1,0);\n" - " return m;\n" - "}\n" - "__inline\n" - "b3Mat3x3 mtTranspose(b3Mat3x3 m)\n" - "{\n" - " b3Mat3x3 out;\n" - " out.m_row[0] = (b3Float4)(m.m_row[0].x, m.m_row[1].x, m.m_row[2].x, 0.f);\n" - " out.m_row[1] = (b3Float4)(m.m_row[0].y, m.m_row[1].y, m.m_row[2].y, 0.f);\n" - " out.m_row[2] = (b3Float4)(m.m_row[0].z, m.m_row[1].z, m.m_row[2].z, 0.f);\n" - " return out;\n" - "}\n" - "__inline\n" - "b3Mat3x3 mtMul(b3Mat3x3 a, b3Mat3x3 b)\n" - "{\n" - " b3Mat3x3 transB;\n" - " transB = mtTranspose( b );\n" - " b3Mat3x3 ans;\n" - " // why this doesn't run when 0ing in the for{}\n" - " a.m_row[0].w = 0.f;\n" - " a.m_row[1].w = 0.f;\n" - " a.m_row[2].w = 0.f;\n" - " for(int i=0; i<3; i++)\n" - " {\n" - "// a.m_row[i].w = 0.f;\n" - " ans.m_row[i].x = b3Dot3F4(a.m_row[i],transB.m_row[0]);\n" - " ans.m_row[i].y = b3Dot3F4(a.m_row[i],transB.m_row[1]);\n" - " ans.m_row[i].z = b3Dot3F4(a.m_row[i],transB.m_row[2]);\n" - " ans.m_row[i].w = 0.f;\n" - " }\n" - " return ans;\n" - "}\n" - "__inline\n" - "b3Float4 mtMul1(b3Mat3x3 a, b3Float4 b)\n" - "{\n" - " b3Float4 ans;\n" - " ans.x = b3Dot3F4( a.m_row[0], b );\n" - " ans.y = b3Dot3F4( a.m_row[1], b );\n" - " ans.z = b3Dot3F4( a.m_row[2], b );\n" - " ans.w = 0.f;\n" - " return ans;\n" - "}\n" - "__inline\n" - "b3Float4 mtMul3(b3Float4 a, b3Mat3x3 b)\n" - "{\n" - " b3Float4 colx = b3MakeFloat4(b.m_row[0].x, b.m_row[1].x, b.m_row[2].x, 0);\n" - " b3Float4 coly = b3MakeFloat4(b.m_row[0].y, b.m_row[1].y, b.m_row[2].y, 0);\n" - " b3Float4 colz = b3MakeFloat4(b.m_row[0].z, b.m_row[1].z, b.m_row[2].z, 0);\n" - " b3Float4 ans;\n" - " ans.x = b3Dot3F4( a, colx );\n" - " ans.y = b3Dot3F4( a, coly );\n" - " ans.z = b3Dot3F4( a, colz );\n" - " return ans;\n" - "}\n" - "#endif\n" - "#endif //B3_MAT3x3_H\n" - "typedef struct b3RigidBodyData b3RigidBodyData_t;\n" - "struct b3RigidBodyData\n" - "{\n" - " b3Float4 m_pos;\n" - " b3Quat m_quat;\n" - " b3Float4 m_linVel;\n" - " b3Float4 m_angVel;\n" - " int m_collidableIdx;\n" - " float m_invMass;\n" - " float m_restituitionCoeff;\n" - " float m_frictionCoeff;\n" - "};\n" - "typedef struct b3InertiaData b3InertiaData_t;\n" - "struct b3InertiaData\n" - "{\n" - " b3Mat3x3 m_invInertiaWorld;\n" - " b3Mat3x3 m_initInvInertia;\n" - "};\n" - "#endif //B3_RIGIDBODY_DATA_H\n" - " \n" - "#define GET_NPOINTS(x) (x).m_worldNormalOnB.w\n" - "#define SELECT_UINT4( b, a, condition ) select( b,a,condition )\n" - "#define make_float4 (float4)\n" - "#define make_float2 (float2)\n" - "#define make_uint4 (uint4)\n" - "#define make_int4 (int4)\n" - "#define make_uint2 (uint2)\n" - "#define make_int2 (int2)\n" - "__inline\n" - "float fastDiv(float numerator, float denominator)\n" - "{\n" - " return native_divide(numerator, denominator); \n" - "// return numerator/denominator; \n" - "}\n" - "__inline\n" - "float4 fastDiv4(float4 numerator, float4 denominator)\n" - "{\n" - " return native_divide(numerator, denominator); \n" - "}\n" - "__inline\n" - "float4 cross3(float4 a, float4 b)\n" - "{\n" - " return cross(a,b);\n" - "}\n" - "//#define dot3F4 dot\n" - "__inline\n" - "float dot3F4(float4 a, float4 b)\n" - "{\n" - " float4 a1 = make_float4(a.xyz,0.f);\n" - " float4 b1 = make_float4(b.xyz,0.f);\n" - " return dot(a1, b1);\n" - "}\n" - "__inline\n" - "float4 fastNormalize4(float4 v)\n" - "{\n" - " return fast_normalize(v);\n" - "}\n" - "///////////////////////////////////////\n" - "// Quaternion\n" - "///////////////////////////////////////\n" - "typedef float4 Quaternion;\n" - "__inline\n" - "Quaternion qtMul(Quaternion a, Quaternion b);\n" - "__inline\n" - "Quaternion qtNormalize(Quaternion in);\n" - "__inline\n" - "float4 qtRotate(Quaternion q, float4 vec);\n" - "__inline\n" - "Quaternion qtInvert(Quaternion q);\n" - "__inline\n" - "Quaternion qtMul(Quaternion a, Quaternion b)\n" - "{\n" - " Quaternion ans;\n" - " ans = cross3( a, b );\n" - " ans += a.w*b+b.w*a;\n" - "// ans.w = a.w*b.w - (a.x*b.x+a.y*b.y+a.z*b.z);\n" - " ans.w = a.w*b.w - dot3F4(a, b);\n" - " return ans;\n" - "}\n" - "__inline\n" - "Quaternion qtNormalize(Quaternion in)\n" - "{\n" - " return fastNormalize4(in);\n" - "// in /= length( in );\n" - "// return in;\n" - "}\n" - "__inline\n" - "float4 qtRotate(Quaternion q, float4 vec)\n" - "{\n" - " Quaternion qInv = qtInvert( q );\n" - " float4 vcpy = vec;\n" - " vcpy.w = 0.f;\n" - " float4 out = qtMul(qtMul(q,vcpy),qInv);\n" - " return out;\n" - "}\n" - "__inline\n" - "Quaternion qtInvert(Quaternion q)\n" - "{\n" - " return (Quaternion)(-q.xyz, q.w);\n" - "}\n" - "__inline\n" - "float4 qtInvRotate(const Quaternion q, float4 vec)\n" - "{\n" - " return qtRotate( qtInvert( q ), vec );\n" - "}\n" - "__inline\n" - "float4 transform(const float4* p, const float4* translation, const Quaternion* orientation)\n" - "{\n" - " return qtRotate( *orientation, *p ) + (*translation);\n" - "}\n" - "__inline\n" - "float4 normalize3(const float4 a)\n" - "{\n" - " float4 n = make_float4(a.x, a.y, a.z, 0.f);\n" - " return fastNormalize4( n );\n" - "}\n" - "__inline float4 lerp3(const float4 a,const float4 b, float t)\n" - "{\n" - " return make_float4( a.x + (b.x - a.x) * t,\n" - " a.y + (b.y - a.y) * t,\n" - " a.z + (b.z - a.z) * t,\n" - " 0.f);\n" - "}\n" - "// Clips a face to the back of a plane, return the number of vertices out, stored in ppVtxOut\n" - "int clipFaceGlobal(__global const float4* pVtxIn, int numVertsIn, float4 planeNormalWS,float planeEqWS, __global float4* ppVtxOut)\n" - "{\n" - " \n" - " int ve;\n" - " float ds, de;\n" - " int numVertsOut = 0;\n" - " //double-check next test\n" - " if (numVertsIn < 2)\n" - " return 0;\n" - " \n" - " float4 firstVertex=pVtxIn[numVertsIn-1];\n" - " float4 endVertex = pVtxIn[0];\n" - " \n" - " ds = dot3F4(planeNormalWS,firstVertex)+planeEqWS;\n" - " \n" - " for (ve = 0; ve < numVertsIn; ve++)\n" - " {\n" - " endVertex=pVtxIn[ve];\n" - " de = dot3F4(planeNormalWS,endVertex)+planeEqWS;\n" - " if (ds<0)\n" - " {\n" - " if (de<0)\n" - " {\n" - " // Start < 0, end < 0, so output endVertex\n" - " ppVtxOut[numVertsOut++] = endVertex;\n" - " }\n" - " else\n" - " {\n" - " // Start < 0, end >= 0, so output intersection\n" - " ppVtxOut[numVertsOut++] = lerp3(firstVertex, endVertex,(ds * 1.f/(ds - de)) );\n" - " }\n" - " }\n" - " else\n" - " {\n" - " if (de<0)\n" - " {\n" - " // Start >= 0, end < 0 so output intersection and end\n" - " ppVtxOut[numVertsOut++] = lerp3(firstVertex, endVertex,(ds * 1.f/(ds - de)) );\n" - " ppVtxOut[numVertsOut++] = endVertex;\n" - " }\n" - " }\n" - " firstVertex = endVertex;\n" - " ds = de;\n" - " }\n" - " return numVertsOut;\n" - "}\n" - "// Clips a face to the back of a plane, return the number of vertices out, stored in ppVtxOut\n" - "int clipFace(const float4* pVtxIn, int numVertsIn, float4 planeNormalWS,float planeEqWS, float4* ppVtxOut)\n" - "{\n" - " \n" - " int ve;\n" - " float ds, de;\n" - " int numVertsOut = 0;\n" - "//double-check next test\n" - " if (numVertsIn < 2)\n" - " return 0;\n" - " float4 firstVertex=pVtxIn[numVertsIn-1];\n" - " float4 endVertex = pVtxIn[0];\n" - " \n" - " ds = dot3F4(planeNormalWS,firstVertex)+planeEqWS;\n" - " for (ve = 0; ve < numVertsIn; ve++)\n" - " {\n" - " endVertex=pVtxIn[ve];\n" - " de = dot3F4(planeNormalWS,endVertex)+planeEqWS;\n" - " if (ds<0)\n" - " {\n" - " if (de<0)\n" - " {\n" - " // Start < 0, end < 0, so output endVertex\n" - " ppVtxOut[numVertsOut++] = endVertex;\n" - " }\n" - " else\n" - " {\n" - " // Start < 0, end >= 0, so output intersection\n" - " ppVtxOut[numVertsOut++] = lerp3(firstVertex, endVertex,(ds * 1.f/(ds - de)) );\n" - " }\n" - " }\n" - " else\n" - " {\n" - " if (de<0)\n" - " {\n" - " // Start >= 0, end < 0 so output intersection and end\n" - " ppVtxOut[numVertsOut++] = lerp3(firstVertex, endVertex,(ds * 1.f/(ds - de)) );\n" - " ppVtxOut[numVertsOut++] = endVertex;\n" - " }\n" - " }\n" - " firstVertex = endVertex;\n" - " ds = de;\n" - " }\n" - " return numVertsOut;\n" - "}\n" - "int clipFaceAgainstHull(const float4 separatingNormal, __global const b3ConvexPolyhedronData_t* hullA, \n" - " const float4 posA, const Quaternion ornA, float4* worldVertsB1, int numWorldVertsB1,\n" - " float4* worldVertsB2, int capacityWorldVertsB2,\n" - " const float minDist, float maxDist,\n" - " __global const float4* vertices,\n" - " __global const b3GpuFace_t* faces,\n" - " __global const int* indices,\n" - " float4* contactsOut,\n" - " int contactCapacity)\n" - "{\n" - " int numContactsOut = 0;\n" - " float4* pVtxIn = worldVertsB1;\n" - " float4* pVtxOut = worldVertsB2;\n" - " \n" - " int numVertsIn = numWorldVertsB1;\n" - " int numVertsOut = 0;\n" - " int closestFaceA=-1;\n" - " {\n" - " float dmin = FLT_MAX;\n" - " for(int face=0;facem_numFaces;face++)\n" - " {\n" - " const float4 Normal = make_float4(\n" - " faces[hullA->m_faceOffset+face].m_plane.x, \n" - " faces[hullA->m_faceOffset+face].m_plane.y, \n" - " faces[hullA->m_faceOffset+face].m_plane.z,0.f);\n" - " const float4 faceANormalWS = qtRotate(ornA,Normal);\n" - " \n" - " float d = dot3F4(faceANormalWS,separatingNormal);\n" - " if (d < dmin)\n" - " {\n" - " dmin = d;\n" - " closestFaceA = face;\n" - " }\n" - " }\n" - " }\n" - " if (closestFaceA<0)\n" - " return numContactsOut;\n" - " b3GpuFace_t polyA = faces[hullA->m_faceOffset+closestFaceA];\n" - " // clip polygon to back of planes of all faces of hull A that are adjacent to witness face\n" - " int numVerticesA = polyA.m_numIndices;\n" - " for(int e0=0;e0m_vertexOffset+indices[polyA.m_indexOffset+e0]];\n" - " const float4 b = vertices[hullA->m_vertexOffset+indices[polyA.m_indexOffset+((e0+1)%numVerticesA)]];\n" - " const float4 edge0 = a - b;\n" - " const float4 WorldEdge0 = qtRotate(ornA,edge0);\n" - " float4 planeNormalA = make_float4(polyA.m_plane.x,polyA.m_plane.y,polyA.m_plane.z,0.f);\n" - " float4 worldPlaneAnormal1 = qtRotate(ornA,planeNormalA);\n" - " float4 planeNormalWS1 = -cross3(WorldEdge0,worldPlaneAnormal1);\n" - " float4 worldA1 = transform(&a,&posA,&ornA);\n" - " float planeEqWS1 = -dot3F4(worldA1,planeNormalWS1);\n" - " \n" - " float4 planeNormalWS = planeNormalWS1;\n" - " float planeEqWS=planeEqWS1;\n" - " \n" - " //clip face\n" - " //clipFace(*pVtxIn, *pVtxOut,planeNormalWS,planeEqWS);\n" - " numVertsOut = clipFace(pVtxIn, numVertsIn, planeNormalWS,planeEqWS, pVtxOut);\n" - " //btSwap(pVtxIn,pVtxOut);\n" - " float4* tmp = pVtxOut;\n" - " pVtxOut = pVtxIn;\n" - " pVtxIn = tmp;\n" - " numVertsIn = numVertsOut;\n" - " numVertsOut = 0;\n" - " }\n" - " \n" - " // only keep points that are behind the witness face\n" - " {\n" - " float4 localPlaneNormal = make_float4(polyA.m_plane.x,polyA.m_plane.y,polyA.m_plane.z,0.f);\n" - " float localPlaneEq = polyA.m_plane.w;\n" - " float4 planeNormalWS = qtRotate(ornA,localPlaneNormal);\n" - " float planeEqWS=localPlaneEq-dot3F4(planeNormalWS,posA);\n" - " for (int i=0;im_numFaces;face++)\n" - " {\n" - " const float4 Normal = make_float4(\n" - " facesA[hullA->m_faceOffset+face].m_plane.x, \n" - " facesA[hullA->m_faceOffset+face].m_plane.y, \n" - " facesA[hullA->m_faceOffset+face].m_plane.z,0.f);\n" - " const float4 faceANormalWS = qtRotate(ornA,Normal);\n" - " \n" - " float d = dot3F4(faceANormalWS,separatingNormal);\n" - " if (d < dmin)\n" - " {\n" - " dmin = d;\n" - " closestFaceA = face;\n" - " }\n" - " }\n" - " }\n" - " if (closestFaceA<0)\n" - " return numContactsOut;\n" - " b3GpuFace_t polyA = facesA[hullA->m_faceOffset+closestFaceA];\n" - " // clip polygon to back of planes of all faces of hull A that are adjacent to witness face\n" - " int numVerticesA = polyA.m_numIndices;\n" - " for(int e0=0;e0m_vertexOffset+indicesA[polyA.m_indexOffset+e0]];\n" - " const float4 b = verticesA[hullA->m_vertexOffset+indicesA[polyA.m_indexOffset+((e0+1)%numVerticesA)]];\n" - " const float4 edge0 = a - b;\n" - " const float4 WorldEdge0 = qtRotate(ornA,edge0);\n" - " float4 planeNormalA = make_float4(polyA.m_plane.x,polyA.m_plane.y,polyA.m_plane.z,0.f);\n" - " float4 worldPlaneAnormal1 = qtRotate(ornA,planeNormalA);\n" - " float4 planeNormalWS1 = -cross3(WorldEdge0,worldPlaneAnormal1);\n" - " float4 worldA1 = transform(&a,&posA,&ornA);\n" - " float planeEqWS1 = -dot3F4(worldA1,planeNormalWS1);\n" - " \n" - " float4 planeNormalWS = planeNormalWS1;\n" - " float planeEqWS=planeEqWS1;\n" - " \n" - " //clip face\n" - " //clipFace(*pVtxIn, *pVtxOut,planeNormalWS,planeEqWS);\n" - " numVertsOut = clipFace(pVtxIn, numVertsIn, planeNormalWS,planeEqWS, pVtxOut);\n" - " //btSwap(pVtxIn,pVtxOut);\n" - " float4* tmp = pVtxOut;\n" - " pVtxOut = pVtxIn;\n" - " pVtxIn = tmp;\n" - " numVertsIn = numVertsOut;\n" - " numVertsOut = 0;\n" - " }\n" - " \n" - " // only keep points that are behind the witness face\n" - " {\n" - " float4 localPlaneNormal = make_float4(polyA.m_plane.x,polyA.m_plane.y,polyA.m_plane.z,0.f);\n" - " float localPlaneEq = polyA.m_plane.w;\n" - " float4 planeNormalWS = qtRotate(ornA,localPlaneNormal);\n" - " float planeEqWS=localPlaneEq-dot3F4(planeNormalWS,posA);\n" - " for (int i=0;im_numFaces;face++)\n" - " {\n" - " const float4 Normal = make_float4(faces[hullB->m_faceOffset+face].m_plane.x, \n" - " faces[hullB->m_faceOffset+face].m_plane.y, faces[hullB->m_faceOffset+face].m_plane.z,0.f);\n" - " const float4 WorldNormal = qtRotate(ornB, Normal);\n" - " float d = dot3F4(WorldNormal,separatingNormal);\n" - " if (d > dmax)\n" - " {\n" - " dmax = d;\n" - " closestFaceB = face;\n" - " }\n" - " }\n" - " }\n" - " {\n" - " const b3GpuFace_t polyB = faces[hullB->m_faceOffset+closestFaceB];\n" - " const int numVertices = polyB.m_numIndices;\n" - " for(int e0=0;e0m_vertexOffset+indices[polyB.m_indexOffset+e0]];\n" - " worldVertsB1[numWorldVertsB1++] = transform(&b,&posB,&ornB);\n" - " }\n" - " }\n" - " if (closestFaceB>=0)\n" - " {\n" - " numContactsOut = clipFaceAgainstHull(separatingNormal, hullA, \n" - " posA,ornA,\n" - " worldVertsB1,numWorldVertsB1,worldVertsB2,capacityWorldVerts, minDist, maxDist,vertices,\n" - " faces,\n" - " indices,localContactsOut,localContactCapacity);\n" - " }\n" - " return numContactsOut;\n" - "}\n" - "int clipHullAgainstHullLocalA(const float4 separatingNormal,\n" - " const b3ConvexPolyhedronData_t* hullA, __global const b3ConvexPolyhedronData_t* hullB, \n" - " const float4 posA, const Quaternion ornA,const float4 posB, const Quaternion ornB, \n" - " float4* worldVertsB1, float4* worldVertsB2, int capacityWorldVerts,\n" - " const float minDist, float maxDist,\n" - " const float4* verticesA,\n" - " const b3GpuFace_t* facesA,\n" - " const int* indicesA,\n" - " __global const float4* verticesB,\n" - " __global const b3GpuFace_t* facesB,\n" - " __global const int* indicesB,\n" - " float4* localContactsOut,\n" - " int localContactCapacity)\n" - "{\n" - " int numContactsOut = 0;\n" - " int numWorldVertsB1= 0;\n" - " int closestFaceB=-1;\n" - " float dmax = -FLT_MAX;\n" - " {\n" - " for(int face=0;facem_numFaces;face++)\n" - " {\n" - " const float4 Normal = make_float4(facesB[hullB->m_faceOffset+face].m_plane.x, \n" - " facesB[hullB->m_faceOffset+face].m_plane.y, facesB[hullB->m_faceOffset+face].m_plane.z,0.f);\n" - " const float4 WorldNormal = qtRotate(ornB, Normal);\n" - " float d = dot3F4(WorldNormal,separatingNormal);\n" - " if (d > dmax)\n" - " {\n" - " dmax = d;\n" - " closestFaceB = face;\n" - " }\n" - " }\n" - " }\n" - " {\n" - " const b3GpuFace_t polyB = facesB[hullB->m_faceOffset+closestFaceB];\n" - " const int numVertices = polyB.m_numIndices;\n" - " for(int e0=0;e0m_vertexOffset+indicesB[polyB.m_indexOffset+e0]];\n" - " worldVertsB1[numWorldVertsB1++] = transform(&b,&posB,&ornB);\n" - " }\n" - " }\n" - " if (closestFaceB>=0)\n" - " {\n" - " numContactsOut = clipFaceAgainstHullLocalA(separatingNormal, hullA, \n" - " posA,ornA,\n" - " worldVertsB1,numWorldVertsB1,worldVertsB2,capacityWorldVerts, minDist, maxDist,\n" - " verticesA,facesA,indicesA,\n" - " verticesB,facesB,indicesB,\n" - " localContactsOut,localContactCapacity);\n" - " }\n" - " return numContactsOut;\n" - "}\n" - "#define PARALLEL_SUM(v, n) for(int j=1; j v[i+offset].y)? v[i]: v[i+offset]; }\n" - "#define REDUCE_MIN(v, n) {int i=0; for(int offset=0; offset64)\n" - " nPoints = 64;\n" - " \n" - " float4 center = make_float4(0.f);\n" - " {\n" - " \n" - " for (int i=0;i a[ie].x )? a[0].x: a[ie].x;\n" - " a[0].y = (a[0].y > a[ie].y )? a[0].y: a[ie].y;\n" - " a[0].z = (a[0].z > a[ie].z )? a[0].z: a[ie].z;\n" - " a[0].w = (a[0].w > a[ie].w )? a[0].w: a[ie].w;\n" - " }\n" - " idx[0] = (int)a[0].x & 0xff;\n" - " idx[1] = (int)a[0].y & 0xff;\n" - " idx[2] = (int)a[0].z & 0xff;\n" - " idx[3] = (int)a[0].w & 0xff;\n" - " }\n" - " }\n" - " {\n" - " float2 h[64];\n" - " PARALLEL_DO( h[ie] = make_float2((float)ie, p[ie].w), nPoints );\n" - " REDUCE_MIN( h, nPoints );\n" - " max00 = h[0];\n" - " }\n" - " }\n" - " contactIdx[0] = idx[0];\n" - " contactIdx[1] = idx[1];\n" - " contactIdx[2] = idx[2];\n" - " contactIdx[3] = idx[3];\n" - " return 4;\n" - " }\n" - "}\n" - "__kernel void extractManifoldAndAddContactKernel(__global const int4* pairs, \n" - " __global const b3RigidBodyData_t* rigidBodies, \n" - " __global const float4* closestPointsWorld,\n" - " __global const float4* separatingNormalsWorld,\n" - " __global const int* contactCounts,\n" - " __global const int* contactOffsets,\n" - " __global struct b3Contact4Data* restrict contactsOut,\n" - " counter32_t nContactsOut,\n" - " int contactCapacity,\n" - " int numPairs,\n" - " int pairIndex\n" - " )\n" - "{\n" - " int idx = get_global_id(0);\n" - " \n" - " if (idxm_worldNormalOnB = -normal;\n" - " c->m_restituitionCoeffCmp = (0.f*0xffff);c->m_frictionCoeffCmp = (0.7f*0xffff);\n" - " c->m_batchIdx = idx;\n" - " int bodyA = pairs[pairIndex].x;\n" - " int bodyB = pairs[pairIndex].y;\n" - " c->m_bodyAPtrAndSignBit = rigidBodies[bodyA].m_invMass==0 ? -bodyA:bodyA;\n" - " c->m_bodyBPtrAndSignBit = rigidBodies[bodyB].m_invMass==0 ? -bodyB:bodyB;\n" - " c->m_childIndexA = -1;\n" - " c->m_childIndexB = -1;\n" - " for (int i=0;im_worldPosB[i] = localPoints[contactIdx[i]];\n" - " }\n" - " GET_NPOINTS(*c) = nContacts;\n" - " }\n" - " }\n" - "}\n" - "void trInverse(float4 translationIn, Quaternion orientationIn,\n" - " float4* translationOut, Quaternion* orientationOut)\n" - "{\n" - " *orientationOut = qtInvert(orientationIn);\n" - " *translationOut = qtRotate(*orientationOut, -translationIn);\n" - "}\n" - "void trMul(float4 translationA, Quaternion orientationA,\n" - " float4 translationB, Quaternion orientationB,\n" - " float4* translationOut, Quaternion* orientationOut)\n" - "{\n" - " *orientationOut = qtMul(orientationA,orientationB);\n" - " *translationOut = transform(&translationB,&translationA,&orientationA);\n" - "}\n" - "__kernel void clipHullHullKernel( __global int4* pairs, \n" - " __global const b3RigidBodyData_t* rigidBodies, \n" - " __global const b3Collidable_t* collidables,\n" - " __global const b3ConvexPolyhedronData_t* convexShapes, \n" - " __global const float4* vertices,\n" - " __global const float4* uniqueEdges,\n" - " __global const b3GpuFace_t* faces,\n" - " __global const int* indices,\n" - " __global const float4* separatingNormals,\n" - " __global const int* hasSeparatingAxis,\n" - " __global struct b3Contact4Data* restrict globalContactsOut,\n" - " counter32_t nGlobalContactsOut,\n" - " int numPairs,\n" - " int contactCapacity)\n" - "{\n" - " int i = get_global_id(0);\n" - " int pairIndex = i;\n" - " \n" - " float4 worldVertsB1[64];\n" - " float4 worldVertsB2[64];\n" - " int capacityWorldVerts = 64; \n" - " float4 localContactsOut[64];\n" - " int localContactCapacity=64;\n" - " \n" - " float minDist = -1e30f;\n" - " float maxDist = 0.02f;\n" - " if (i0)\n" - " {\n" - " float4 normal = -separatingNormals[i];\n" - " int nPoints = numLocalContactsOut;\n" - " float4* pointsIn = localContactsOut;\n" - " int contactIdx[4];// = {-1,-1,-1,-1};\n" - " contactIdx[0] = -1;\n" - " contactIdx[1] = -1;\n" - " contactIdx[2] = -1;\n" - " contactIdx[3] = -1;\n" - " \n" - " int nReducedContacts = extractManifoldSequential(pointsIn, nPoints, normal, contactIdx);\n" - " \n" - " \n" - " int mprContactIndex = pairs[pairIndex].z;\n" - " int dstIdx = mprContactIndex;\n" - " if (dstIdx<0)\n" - " {\n" - " AppendInc( nGlobalContactsOut, dstIdx );\n" - " }\n" - " if (dstIdxm_worldNormalOnB = -normal;\n" - " c->m_restituitionCoeffCmp = (0.f*0xffff);c->m_frictionCoeffCmp = (0.7f*0xffff);\n" - " c->m_batchIdx = pairIndex;\n" - " int bodyA = pairs[pairIndex].x;\n" - " int bodyB = pairs[pairIndex].y;\n" - " c->m_bodyAPtrAndSignBit = rigidBodies[bodyA].m_invMass==0?-bodyA:bodyA;\n" - " c->m_bodyBPtrAndSignBit = rigidBodies[bodyB].m_invMass==0?-bodyB:bodyB;\n" - " c->m_childIndexA = -1;\n" - " c->m_childIndexB = -1;\n" - " for (int i=0;i0||(mprContactIndex<0))\n" - " {\n" - " c->m_worldPosB[i] = pointsIn[contactIdx[i]];\n" - " }\n" - " }\n" - " GET_NPOINTS(*c) = nReducedContacts;\n" - " }\n" - " \n" - " }// if (numContactsOut>0)\n" - " }// if (hasSeparatingAxis[i])\n" - " }// if (i= 0)\n" - " {\n" - " collidableIndexA = gpuChildShapes[childShapeIndexA].m_shapeIndex;\n" - " float4 childPosA = gpuChildShapes[childShapeIndexA].m_childPosition;\n" - " float4 childOrnA = gpuChildShapes[childShapeIndexA].m_childOrientation;\n" - " float4 newPosA = qtRotate(ornA,childPosA)+posA;\n" - " float4 newOrnA = qtMul(ornA,childOrnA);\n" - " posA = newPosA;\n" - " ornA = newOrnA;\n" - " } else\n" - " {\n" - " collidableIndexA = rigidBodies[bodyIndexA].m_collidableIdx;\n" - " }\n" - " \n" - " if (childShapeIndexB>=0)\n" - " {\n" - " collidableIndexB = gpuChildShapes[childShapeIndexB].m_shapeIndex;\n" - " float4 childPosB = gpuChildShapes[childShapeIndexB].m_childPosition;\n" - " float4 childOrnB = gpuChildShapes[childShapeIndexB].m_childOrientation;\n" - " float4 newPosB = transform(&childPosB,&posB,&ornB);\n" - " float4 newOrnB = qtMul(ornB,childOrnB);\n" - " posB = newPosB;\n" - " ornB = newOrnB;\n" - " } else\n" - " {\n" - " collidableIndexB = rigidBodies[bodyIndexB].m_collidableIdx; \n" - " }\n" - " \n" - " int shapeIndexA = collidables[collidableIndexA].m_shapeIndex;\n" - " int shapeIndexB = collidables[collidableIndexB].m_shapeIndex;\n" - " \n" - " int numLocalContactsOut = clipHullAgainstHull(gpuCompoundSepNormalsOut[i],\n" - " &convexShapes[shapeIndexA], &convexShapes[shapeIndexB],\n" - " posA,ornA,\n" - " posB,ornB,\n" - " worldVertsB1,worldVertsB2,capacityWorldVerts,\n" - " minDist, maxDist,\n" - " vertices,faces,indices,\n" - " localContactsOut,localContactCapacity);\n" - " \n" - " if (numLocalContactsOut>0)\n" - " {\n" - " float4 normal = -gpuCompoundSepNormalsOut[i];\n" - " int nPoints = numLocalContactsOut;\n" - " float4* pointsIn = localContactsOut;\n" - " int contactIdx[4];// = {-1,-1,-1,-1};\n" - " contactIdx[0] = -1;\n" - " contactIdx[1] = -1;\n" - " contactIdx[2] = -1;\n" - " contactIdx[3] = -1;\n" - " \n" - " int nReducedContacts = extractManifoldSequential(pointsIn, nPoints, normal, contactIdx);\n" - " \n" - " int dstIdx;\n" - " AppendInc( nGlobalContactsOut, dstIdx );\n" - " if ((dstIdx+nReducedContacts) < maxContactCapacity)\n" - " {\n" - " __global struct b3Contact4Data* c = globalContactsOut+ dstIdx;\n" - " c->m_worldNormalOnB = -normal;\n" - " c->m_restituitionCoeffCmp = (0.f*0xffff);c->m_frictionCoeffCmp = (0.7f*0xffff);\n" - " c->m_batchIdx = pairIndex;\n" - " int bodyA = gpuCompoundPairs[pairIndex].x;\n" - " int bodyB = gpuCompoundPairs[pairIndex].y;\n" - " c->m_bodyAPtrAndSignBit = rigidBodies[bodyA].m_invMass==0?-bodyA:bodyA;\n" - " c->m_bodyBPtrAndSignBit = rigidBodies[bodyB].m_invMass==0?-bodyB:bodyB;\n" - " c->m_childIndexA = childShapeIndexA;\n" - " c->m_childIndexB = childShapeIndexB;\n" - " for (int i=0;im_worldPosB[i] = pointsIn[contactIdx[i]];\n" - " }\n" - " GET_NPOINTS(*c) = nReducedContacts;\n" - " }\n" - " \n" - " }// if (numContactsOut>0)\n" - " }// if (gpuHasCompoundSepNormalsOut[i])\n" - " }// if (i 0.00001)\n" - " {\n" - " normalOnSurfaceB = diff / len;\n" - " }\n" - " float4 contactPosB = posB + normalOnSurfaceB*radiusB;\n" - " contactPosB.w = dist;\n" - " \n" - " int dstIdx;\n" - " AppendInc( nGlobalContactsOut, dstIdx );\n" - " if (dstIdx < contactCapacity)\n" - " {\n" - " __global struct b3Contact4Data* c = &globalContactsOut[dstIdx];\n" - " c->m_worldNormalOnB = -normalOnSurfaceB;\n" - " c->m_restituitionCoeffCmp = (0.f*0xffff);c->m_frictionCoeffCmp = (0.7f*0xffff);\n" - " c->m_batchIdx = pairIndex;\n" - " int bodyA = pairs[pairIndex].x;\n" - " int bodyB = pairs[pairIndex].y;\n" - " c->m_bodyAPtrAndSignBit = rigidBodies[bodyA].m_invMass==0?-bodyA:bodyA;\n" - " c->m_bodyBPtrAndSignBit = rigidBodies[bodyB].m_invMass==0?-bodyB:bodyB;\n" - " c->m_worldPosB[0] = contactPosB;\n" - " c->m_childIndexA = -1;\n" - " c->m_childIndexB = -1;\n" - " GET_NPOINTS(*c) = 1;\n" - " }//if (dstIdx < numPairs)\n" - " }//if ( len <= (radiusA+radiusB))\n" - " }//SHAPE_SPHERE SHAPE_SPHERE\n" - " }//if (i0)\n" - " {\n" - " float4 normal = -separatingNormals[i];\n" - " int nPoints = numLocalContactsOut;\n" - " float4* pointsIn = localContactsOut;\n" - " int contactIdx[4];// = {-1,-1,-1,-1};\n" - " contactIdx[0] = -1;\n" - " contactIdx[1] = -1;\n" - " contactIdx[2] = -1;\n" - " contactIdx[3] = -1;\n" - " \n" - " int nReducedContacts = extractManifoldSequential(pointsIn, nPoints, normal, contactIdx);\n" - " \n" - " int dstIdx;\n" - " AppendInc( nGlobalContactsOut, dstIdx );\n" - " if (dstIdxm_worldNormalOnB = -normal;\n" - " c->m_restituitionCoeffCmp = (0.f*0xffff);c->m_frictionCoeffCmp = (0.7f*0xffff);\n" - " c->m_batchIdx = pairIndex;\n" - " int bodyA = concavePairsIn[pairIndex].x;\n" - " int bodyB = concavePairsIn[pairIndex].y;\n" - " c->m_bodyAPtrAndSignBit = rigidBodies[bodyA].m_invMass==0?-bodyA:bodyA;\n" - " c->m_bodyBPtrAndSignBit = rigidBodies[bodyB].m_invMass==0?-bodyB:bodyB;\n" - " c->m_childIndexA = childShapeIndexA;\n" - " c->m_childIndexB = childShapeIndexB;\n" - " for (int i=0;im_worldPosB[i] = pointsIn[contactIdx[i]];\n" - " }\n" - " GET_NPOINTS(*c) = nReducedContacts;\n" - " }\n" - " \n" - " }// if (numContactsOut>0)\n" - " }// if (im_numFaces;face++)\n" - " {\n" - " const float4 Normal = make_float4(faces[hullB->m_faceOffset+face].m_plane.x,\n" - " faces[hullB->m_faceOffset+face].m_plane.y, faces[hullB->m_faceOffset+face].m_plane.z,0.f);\n" - " const float4 WorldNormal = qtRotate(ornB, Normal);\n" - " float d = dot3F4(WorldNormal,separatingNormal);\n" - " if (d > dmax)\n" - " {\n" - " dmax = d;\n" - " closestFaceB = face;\n" - " }\n" - " }\n" - " }\n" - " \n" - " {\n" - " const b3GpuFace_t polyB = faces[hullB->m_faceOffset+closestFaceB];\n" - " const int numVertices = polyB.m_numIndices;\n" - " for(int e0=0;e0m_vertexOffset+indices[polyB.m_indexOffset+e0]];\n" - " worldVertsB1[pairIndex*capacityWorldVerts+numWorldVertsB1++] = transform(&b,&posB,&ornB);\n" - " }\n" - " }\n" - " \n" - " int closestFaceA=-1;\n" - " {\n" - " float dmin = FLT_MAX;\n" - " for(int face=0;facem_numFaces;face++)\n" - " {\n" - " const float4 Normal = make_float4(\n" - " faces[hullA->m_faceOffset+face].m_plane.x,\n" - " faces[hullA->m_faceOffset+face].m_plane.y,\n" - " faces[hullA->m_faceOffset+face].m_plane.z,\n" - " 0.f);\n" - " const float4 faceANormalWS = qtRotate(ornA,Normal);\n" - " \n" - " float d = dot3F4(faceANormalWS,separatingNormal);\n" - " if (d < dmin)\n" - " {\n" - " dmin = d;\n" - " closestFaceA = face;\n" - " worldNormalsA1[pairIndex] = faceANormalWS;\n" - " }\n" - " }\n" - " }\n" - " \n" - " int numVerticesA = faces[hullA->m_faceOffset+closestFaceA].m_numIndices;\n" - " for(int e0=0;e0m_vertexOffset+indices[faces[hullA->m_faceOffset+closestFaceA].m_indexOffset+e0]];\n" - " worldVertsA1[pairIndex*capacityWorldVerts+e0] = transform(&a, &posA,&ornA);\n" - " }\n" - " \n" - " clippingFaces[pairIndex].x = closestFaceA;\n" - " clippingFaces[pairIndex].y = closestFaceB;\n" - " clippingFaces[pairIndex].z = numVerticesA;\n" - " clippingFaces[pairIndex].w = numWorldVertsB1;\n" - " \n" - " \n" - " return numContactsOut;\n" - "}\n" - "int clipFaces(__global float4* worldVertsA1,\n" - " __global float4* worldNormalsA1,\n" - " __global float4* worldVertsB1,\n" - " __global float4* worldVertsB2, \n" - " int capacityWorldVertsB2,\n" - " const float minDist, float maxDist,\n" - " __global int4* clippingFaces,\n" - " int pairIndex)\n" - "{\n" - " int numContactsOut = 0;\n" - " \n" - " int closestFaceA = clippingFaces[pairIndex].x;\n" - " int closestFaceB = clippingFaces[pairIndex].y;\n" - " int numVertsInA = clippingFaces[pairIndex].z;\n" - " int numVertsInB = clippingFaces[pairIndex].w;\n" - " \n" - " int numVertsOut = 0;\n" - " \n" - " if (closestFaceA<0)\n" - " return numContactsOut;\n" - " \n" - " __global float4* pVtxIn = &worldVertsB1[pairIndex*capacityWorldVertsB2];\n" - " __global float4* pVtxOut = &worldVertsB2[pairIndex*capacityWorldVertsB2];\n" - " \n" - " \n" - " \n" - " // clip polygon to back of planes of all faces of hull A that are adjacent to witness face\n" - " \n" - " for(int e0=0;e0=0)\n" - " {\n" - " \n" - " \n" - " \n" - " // clip polygon to back of planes of all faces of hull A that are adjacent to witness face\n" - " \n" - " for(int e0=0;e00)\n" - " {\n" - " __global float4* pointsIn = &worldVertsB2[pairIndex*vertexFaceCapacity];\n" - " float4 normal = -separatingNormals[i];\n" - " \n" - " int nReducedContacts = extractManifoldSequentialGlobal(pointsIn, nPoints, normal, &contactIdx);\n" - " \n" - " int mprContactIndex = pairs[pairIndex].z;\n" - " int dstIdx = mprContactIndex;\n" - " if (dstIdx<0)\n" - " {\n" - " AppendInc( nGlobalContactsOut, dstIdx );\n" - " }\n" - "//#if 0\n" - " \n" - " if (dstIdx < contactCapacity)\n" - " {\n" - " __global struct b3Contact4Data* c = &globalContactsOut[dstIdx];\n" - " c->m_worldNormalOnB = -normal;\n" - " c->m_restituitionCoeffCmp = (0.f*0xffff);c->m_frictionCoeffCmp = (0.7f*0xffff);\n" - " c->m_batchIdx = pairIndex;\n" - " int bodyA = pairs[pairIndex].x;\n" - " int bodyB = pairs[pairIndex].y;\n" - " pairs[pairIndex].w = dstIdx;\n" - " c->m_bodyAPtrAndSignBit = rigidBodies[bodyA].m_invMass==0?-bodyA:bodyA;\n" - " c->m_bodyBPtrAndSignBit = rigidBodies[bodyB].m_invMass==0?-bodyB:bodyB;\n" - " c->m_childIndexA =-1;\n" - " c->m_childIndexB =-1;\n" - " switch (nReducedContacts)\n" - " {\n" - " case 4:\n" - " c->m_worldPosB[3] = pointsIn[contactIdx.w];\n" - " case 3:\n" - " c->m_worldPosB[2] = pointsIn[contactIdx.z];\n" - " case 2:\n" - " c->m_worldPosB[1] = pointsIn[contactIdx.y];\n" - " case 1:\n" - " if (mprContactIndex<0)//test\n" - " c->m_worldPosB[0] = pointsIn[contactIdx.x];\n" - " default:\n" - " {\n" - " }\n" - " };\n" - " \n" - " GET_NPOINTS(*c) = nReducedContacts;\n" - " \n" - " }\n" - " \n" - " \n" - "//#endif\n" - " \n" - " }// if (numContactsOut>0)\n" - " }// if (hasSeparatingAxis[i])\n" - " }// if (im_escapeIndexOrTriangleIndex&~(y));\n" - "}\n" - "int getTriangleIndexGlobal(__global const b3QuantizedBvhNode* rootNode)\n" - "{\n" - " unsigned int x=0;\n" - " unsigned int y = (~(x&0))<<(31-MAX_NUM_PARTS_IN_BITS);\n" - " // Get only the lower bits where the triangle index is stored\n" - " return (rootNode->m_escapeIndexOrTriangleIndex&~(y));\n" - "}\n" - "int isLeafNode(const b3QuantizedBvhNode* rootNode)\n" - "{\n" - " //skipindex is negative (internal node), triangleindex >=0 (leafnode)\n" - " return (rootNode->m_escapeIndexOrTriangleIndex >= 0)? 1 : 0;\n" - "}\n" - "int isLeafNodeGlobal(__global const b3QuantizedBvhNode* rootNode)\n" - "{\n" - " //skipindex is negative (internal node), triangleindex >=0 (leafnode)\n" - " return (rootNode->m_escapeIndexOrTriangleIndex >= 0)? 1 : 0;\n" - "}\n" - " \n" - "int getEscapeIndex(const b3QuantizedBvhNode* rootNode)\n" - "{\n" - " return -rootNode->m_escapeIndexOrTriangleIndex;\n" - "}\n" - "int getEscapeIndexGlobal(__global const b3QuantizedBvhNode* rootNode)\n" - "{\n" - " return -rootNode->m_escapeIndexOrTriangleIndex;\n" - "}\n" - "typedef struct\n" - "{\n" - " //12 bytes\n" - " unsigned short int m_quantizedAabbMin[3];\n" - " unsigned short int m_quantizedAabbMax[3];\n" - " //4 bytes, points to the root of the subtree\n" - " int m_rootNodeIndex;\n" - " //4 bytes\n" - " int m_subtreeSize;\n" - " int m_padding[3];\n" - "} b3BvhSubtreeInfo;\n" - "typedef struct\n" - "{\n" - " float4 m_childPosition;\n" - " float4 m_childOrientation;\n" - " int m_shapeIndex;\n" - " int m_unused0;\n" - " int m_unused1;\n" - " int m_unused2;\n" - "} btGpuChildShape;\n" - "typedef struct\n" - "{\n" - " float4 m_pos;\n" - " float4 m_quat;\n" - " float4 m_linVel;\n" - " float4 m_angVel;\n" - " u32 m_collidableIdx;\n" - " float m_invMass;\n" - " float m_restituitionCoeff;\n" - " float m_frictionCoeff;\n" - "} BodyData;\n" - "typedef struct \n" - "{\n" - " float4 m_localCenter;\n" - " float4 m_extents;\n" - " float4 mC;\n" - " float4 mE;\n" - " \n" - " float m_radius;\n" - " int m_faceOffset;\n" - " int m_numFaces;\n" - " int m_numVertices;\n" - " int m_vertexOffset;\n" - " int m_uniqueEdgesOffset;\n" - " int m_numUniqueEdges;\n" - " int m_unused;\n" - "} ConvexPolyhedronCL;\n" - "typedef struct \n" - "{\n" - " union\n" - " {\n" - " float4 m_min;\n" - " float m_minElems[4];\n" - " int m_minIndices[4];\n" - " };\n" - " union\n" - " {\n" - " float4 m_max;\n" - " float m_maxElems[4];\n" - " int m_maxIndices[4];\n" - " };\n" - "} btAabbCL;\n" - "#ifndef B3_AABB_H\n" - "#define B3_AABB_H\n" - "#ifndef B3_FLOAT4_H\n" - "#define B3_FLOAT4_H\n" - "#ifndef B3_PLATFORM_DEFINITIONS_H\n" - "#define B3_PLATFORM_DEFINITIONS_H\n" - "struct MyTest\n" - "{\n" - " int bla;\n" - "};\n" - "#ifdef __cplusplus\n" - "#else\n" - "//keep B3_LARGE_FLOAT*B3_LARGE_FLOAT < FLT_MAX\n" - "#define B3_LARGE_FLOAT 1e18f\n" - "#define B3_INFINITY 1e18f\n" - "#define b3Assert(a)\n" - "#define b3ConstArray(a) __global const a*\n" - "#define b3AtomicInc atomic_inc\n" - "#define b3AtomicAdd atomic_add\n" - "#define b3Fabs fabs\n" - "#define b3Sqrt native_sqrt\n" - "#define b3Sin native_sin\n" - "#define b3Cos native_cos\n" - "#define B3_STATIC\n" - "#endif\n" - "#endif\n" - "#ifdef __cplusplus\n" - "#else\n" - " typedef float4 b3Float4;\n" - " #define b3Float4ConstArg const b3Float4\n" - " #define b3MakeFloat4 (float4)\n" - " float b3Dot3F4(b3Float4ConstArg v0,b3Float4ConstArg v1)\n" - " {\n" - " float4 a1 = b3MakeFloat4(v0.xyz,0.f);\n" - " float4 b1 = b3MakeFloat4(v1.xyz,0.f);\n" - " return dot(a1, b1);\n" - " }\n" - " b3Float4 b3Cross3(b3Float4ConstArg v0,b3Float4ConstArg v1)\n" - " {\n" - " float4 a1 = b3MakeFloat4(v0.xyz,0.f);\n" - " float4 b1 = b3MakeFloat4(v1.xyz,0.f);\n" - " return cross(a1, b1);\n" - " }\n" - " #define b3MinFloat4 min\n" - " #define b3MaxFloat4 max\n" - " #define b3Normalized(a) normalize(a)\n" - "#endif \n" - " \n" - "inline bool b3IsAlmostZero(b3Float4ConstArg v)\n" - "{\n" - " if(b3Fabs(v.x)>1e-6 || b3Fabs(v.y)>1e-6 || b3Fabs(v.z)>1e-6) \n" - " return false;\n" - " return true;\n" - "}\n" - "inline int b3MaxDot( b3Float4ConstArg vec, __global const b3Float4* vecArray, int vecLen, float* dotOut )\n" - "{\n" - " float maxDot = -B3_INFINITY;\n" - " int i = 0;\n" - " int ptIndex = -1;\n" - " for( i = 0; i < vecLen; i++ )\n" - " {\n" - " float dot = b3Dot3F4(vecArray[i],vec);\n" - " \n" - " if( dot > maxDot )\n" - " {\n" - " maxDot = dot;\n" - " ptIndex = i;\n" - " }\n" - " }\n" - " b3Assert(ptIndex>=0);\n" - " if (ptIndex<0)\n" - " {\n" - " ptIndex = 0;\n" - " }\n" - " *dotOut = maxDot;\n" - " return ptIndex;\n" - "}\n" - "#endif //B3_FLOAT4_H\n" - "#ifndef B3_MAT3x3_H\n" - "#define B3_MAT3x3_H\n" - "#ifndef B3_QUAT_H\n" - "#define B3_QUAT_H\n" - "#ifndef B3_PLATFORM_DEFINITIONS_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#endif\n" - "#endif\n" - "#ifndef B3_FLOAT4_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#endif \n" - "#endif //B3_FLOAT4_H\n" - "#ifdef __cplusplus\n" - "#else\n" - " typedef float4 b3Quat;\n" - " #define b3QuatConstArg const b3Quat\n" - " \n" - " \n" - "inline float4 b3FastNormalize4(float4 v)\n" - "{\n" - " v = (float4)(v.xyz,0.f);\n" - " return fast_normalize(v);\n" - "}\n" - " \n" - "inline b3Quat b3QuatMul(b3Quat a, b3Quat b);\n" - "inline b3Quat b3QuatNormalized(b3QuatConstArg in);\n" - "inline b3Quat b3QuatRotate(b3QuatConstArg q, b3QuatConstArg vec);\n" - "inline b3Quat b3QuatInvert(b3QuatConstArg q);\n" - "inline b3Quat b3QuatInverse(b3QuatConstArg q);\n" - "inline b3Quat b3QuatMul(b3QuatConstArg a, b3QuatConstArg b)\n" - "{\n" - " b3Quat ans;\n" - " ans = b3Cross3( a, b );\n" - " ans += a.w*b+b.w*a;\n" - "// ans.w = a.w*b.w - (a.x*b.x+a.y*b.y+a.z*b.z);\n" - " ans.w = a.w*b.w - b3Dot3F4(a, b);\n" - " return ans;\n" - "}\n" - "inline b3Quat b3QuatNormalized(b3QuatConstArg in)\n" - "{\n" - " b3Quat q;\n" - " q=in;\n" - " //return b3FastNormalize4(in);\n" - " float len = native_sqrt(dot(q, q));\n" - " if(len > 0.f)\n" - " {\n" - " q *= 1.f / len;\n" - " }\n" - " else\n" - " {\n" - " q.x = q.y = q.z = 0.f;\n" - " q.w = 1.f;\n" - " }\n" - " return q;\n" - "}\n" - "inline float4 b3QuatRotate(b3QuatConstArg q, b3QuatConstArg vec)\n" - "{\n" - " b3Quat qInv = b3QuatInvert( q );\n" - " float4 vcpy = vec;\n" - " vcpy.w = 0.f;\n" - " float4 out = b3QuatMul(b3QuatMul(q,vcpy),qInv);\n" - " return out;\n" - "}\n" - "inline b3Quat b3QuatInverse(b3QuatConstArg q)\n" - "{\n" - " return (b3Quat)(-q.xyz, q.w);\n" - "}\n" - "inline b3Quat b3QuatInvert(b3QuatConstArg q)\n" - "{\n" - " return (b3Quat)(-q.xyz, q.w);\n" - "}\n" - "inline float4 b3QuatInvRotate(b3QuatConstArg q, b3QuatConstArg vec)\n" - "{\n" - " return b3QuatRotate( b3QuatInvert( q ), vec );\n" - "}\n" - "inline b3Float4 b3TransformPoint(b3Float4ConstArg point, b3Float4ConstArg translation, b3QuatConstArg orientation)\n" - "{\n" - " return b3QuatRotate( orientation, point ) + (translation);\n" - "}\n" - " \n" - "#endif \n" - "#endif //B3_QUAT_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "typedef struct\n" - "{\n" - " b3Float4 m_row[3];\n" - "}b3Mat3x3;\n" - "#define b3Mat3x3ConstArg const b3Mat3x3\n" - "#define b3GetRow(m,row) (m.m_row[row])\n" - "inline b3Mat3x3 b3QuatGetRotationMatrix(b3Quat quat)\n" - "{\n" - " b3Float4 quat2 = (b3Float4)(quat.x*quat.x, quat.y*quat.y, quat.z*quat.z, 0.f);\n" - " b3Mat3x3 out;\n" - " out.m_row[0].x=1-2*quat2.y-2*quat2.z;\n" - " out.m_row[0].y=2*quat.x*quat.y-2*quat.w*quat.z;\n" - " out.m_row[0].z=2*quat.x*quat.z+2*quat.w*quat.y;\n" - " out.m_row[0].w = 0.f;\n" - " out.m_row[1].x=2*quat.x*quat.y+2*quat.w*quat.z;\n" - " out.m_row[1].y=1-2*quat2.x-2*quat2.z;\n" - " out.m_row[1].z=2*quat.y*quat.z-2*quat.w*quat.x;\n" - " out.m_row[1].w = 0.f;\n" - " out.m_row[2].x=2*quat.x*quat.z-2*quat.w*quat.y;\n" - " out.m_row[2].y=2*quat.y*quat.z+2*quat.w*quat.x;\n" - " out.m_row[2].z=1-2*quat2.x-2*quat2.y;\n" - " out.m_row[2].w = 0.f;\n" - " return out;\n" - "}\n" - "inline b3Mat3x3 b3AbsoluteMat3x3(b3Mat3x3ConstArg matIn)\n" - "{\n" - " b3Mat3x3 out;\n" - " out.m_row[0] = fabs(matIn.m_row[0]);\n" - " out.m_row[1] = fabs(matIn.m_row[1]);\n" - " out.m_row[2] = fabs(matIn.m_row[2]);\n" - " return out;\n" - "}\n" - "__inline\n" - "b3Mat3x3 mtZero();\n" - "__inline\n" - "b3Mat3x3 mtIdentity();\n" - "__inline\n" - "b3Mat3x3 mtTranspose(b3Mat3x3 m);\n" - "__inline\n" - "b3Mat3x3 mtMul(b3Mat3x3 a, b3Mat3x3 b);\n" - "__inline\n" - "b3Float4 mtMul1(b3Mat3x3 a, b3Float4 b);\n" - "__inline\n" - "b3Float4 mtMul3(b3Float4 a, b3Mat3x3 b);\n" - "__inline\n" - "b3Mat3x3 mtZero()\n" - "{\n" - " b3Mat3x3 m;\n" - " m.m_row[0] = (b3Float4)(0.f);\n" - " m.m_row[1] = (b3Float4)(0.f);\n" - " m.m_row[2] = (b3Float4)(0.f);\n" - " return m;\n" - "}\n" - "__inline\n" - "b3Mat3x3 mtIdentity()\n" - "{\n" - " b3Mat3x3 m;\n" - " m.m_row[0] = (b3Float4)(1,0,0,0);\n" - " m.m_row[1] = (b3Float4)(0,1,0,0);\n" - " m.m_row[2] = (b3Float4)(0,0,1,0);\n" - " return m;\n" - "}\n" - "__inline\n" - "b3Mat3x3 mtTranspose(b3Mat3x3 m)\n" - "{\n" - " b3Mat3x3 out;\n" - " out.m_row[0] = (b3Float4)(m.m_row[0].x, m.m_row[1].x, m.m_row[2].x, 0.f);\n" - " out.m_row[1] = (b3Float4)(m.m_row[0].y, m.m_row[1].y, m.m_row[2].y, 0.f);\n" - " out.m_row[2] = (b3Float4)(m.m_row[0].z, m.m_row[1].z, m.m_row[2].z, 0.f);\n" - " return out;\n" - "}\n" - "__inline\n" - "b3Mat3x3 mtMul(b3Mat3x3 a, b3Mat3x3 b)\n" - "{\n" - " b3Mat3x3 transB;\n" - " transB = mtTranspose( b );\n" - " b3Mat3x3 ans;\n" - " // why this doesn't run when 0ing in the for{}\n" - " a.m_row[0].w = 0.f;\n" - " a.m_row[1].w = 0.f;\n" - " a.m_row[2].w = 0.f;\n" - " for(int i=0; i<3; i++)\n" - " {\n" - "// a.m_row[i].w = 0.f;\n" - " ans.m_row[i].x = b3Dot3F4(a.m_row[i],transB.m_row[0]);\n" - " ans.m_row[i].y = b3Dot3F4(a.m_row[i],transB.m_row[1]);\n" - " ans.m_row[i].z = b3Dot3F4(a.m_row[i],transB.m_row[2]);\n" - " ans.m_row[i].w = 0.f;\n" - " }\n" - " return ans;\n" - "}\n" - "__inline\n" - "b3Float4 mtMul1(b3Mat3x3 a, b3Float4 b)\n" - "{\n" - " b3Float4 ans;\n" - " ans.x = b3Dot3F4( a.m_row[0], b );\n" - " ans.y = b3Dot3F4( a.m_row[1], b );\n" - " ans.z = b3Dot3F4( a.m_row[2], b );\n" - " ans.w = 0.f;\n" - " return ans;\n" - "}\n" - "__inline\n" - "b3Float4 mtMul3(b3Float4 a, b3Mat3x3 b)\n" - "{\n" - " b3Float4 colx = b3MakeFloat4(b.m_row[0].x, b.m_row[1].x, b.m_row[2].x, 0);\n" - " b3Float4 coly = b3MakeFloat4(b.m_row[0].y, b.m_row[1].y, b.m_row[2].y, 0);\n" - " b3Float4 colz = b3MakeFloat4(b.m_row[0].z, b.m_row[1].z, b.m_row[2].z, 0);\n" - " b3Float4 ans;\n" - " ans.x = b3Dot3F4( a, colx );\n" - " ans.y = b3Dot3F4( a, coly );\n" - " ans.z = b3Dot3F4( a, colz );\n" - " return ans;\n" - "}\n" - "#endif\n" - "#endif //B3_MAT3x3_H\n" - "typedef struct b3Aabb b3Aabb_t;\n" - "struct b3Aabb\n" - "{\n" - " union\n" - " {\n" - " float m_min[4];\n" - " b3Float4 m_minVec;\n" - " int m_minIndices[4];\n" - " };\n" - " union\n" - " {\n" - " float m_max[4];\n" - " b3Float4 m_maxVec;\n" - " int m_signedMaxIndices[4];\n" - " };\n" - "};\n" - "inline void b3TransformAabb2(b3Float4ConstArg localAabbMin,b3Float4ConstArg localAabbMax, float margin,\n" - " b3Float4ConstArg pos,\n" - " b3QuatConstArg orn,\n" - " b3Float4* aabbMinOut,b3Float4* aabbMaxOut)\n" - "{\n" - " b3Float4 localHalfExtents = 0.5f*(localAabbMax-localAabbMin);\n" - " localHalfExtents+=b3MakeFloat4(margin,margin,margin,0.f);\n" - " b3Float4 localCenter = 0.5f*(localAabbMax+localAabbMin);\n" - " b3Mat3x3 m;\n" - " m = b3QuatGetRotationMatrix(orn);\n" - " b3Mat3x3 abs_b = b3AbsoluteMat3x3(m);\n" - " b3Float4 center = b3TransformPoint(localCenter,pos,orn);\n" - " \n" - " b3Float4 extent = b3MakeFloat4(b3Dot3F4(localHalfExtents,b3GetRow(abs_b,0)),\n" - " b3Dot3F4(localHalfExtents,b3GetRow(abs_b,1)),\n" - " b3Dot3F4(localHalfExtents,b3GetRow(abs_b,2)),\n" - " 0.f);\n" - " *aabbMinOut = center-extent;\n" - " *aabbMaxOut = center+extent;\n" - "}\n" - "/// conservative test for overlap between two aabbs\n" - "inline bool b3TestAabbAgainstAabb(b3Float4ConstArg aabbMin1,b3Float4ConstArg aabbMax1,\n" - " b3Float4ConstArg aabbMin2, b3Float4ConstArg aabbMax2)\n" - "{\n" - " bool overlap = true;\n" - " overlap = (aabbMin1.x > aabbMax2.x || aabbMax1.x < aabbMin2.x) ? false : overlap;\n" - " overlap = (aabbMin1.z > aabbMax2.z || aabbMax1.z < aabbMin2.z) ? false : overlap;\n" - " overlap = (aabbMin1.y > aabbMax2.y || aabbMax1.y < aabbMin2.y) ? false : overlap;\n" - " return overlap;\n" - "}\n" - "#endif //B3_AABB_H\n" - "/*\n" - "Bullet Continuous Collision Detection and Physics Library\n" - "Copyright (c) 2003-2013 Erwin Coumans http://bulletphysics.org\n" - "This software is provided 'as-is', without any express or implied warranty.\n" - "In no event will the authors be held liable for any damages arising from the use of this software.\n" - "Permission is granted to anyone to use this software for any purpose,\n" - "including commercial applications, and to alter it and redistribute it freely,\n" - "subject to the following restrictions:\n" - "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.\n" - "2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.\n" - "3. This notice may not be removed or altered from any source distribution.\n" - "*/\n" - "#ifndef B3_INT2_H\n" - "#define B3_INT2_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#define b3UnsignedInt2 uint2\n" - "#define b3Int2 int2\n" - "#define b3MakeInt2 (int2)\n" - "#endif //__cplusplus\n" - "#endif\n" - "typedef struct\n" - "{\n" - " float4 m_plane;\n" - " int m_indexOffset;\n" - " int m_numIndices;\n" - "} btGpuFace;\n" - "#define make_float4 (float4)\n" - "__inline\n" - "float4 cross3(float4 a, float4 b)\n" - "{\n" - " return cross(a,b);\n" - " \n" - "// float4 a1 = make_float4(a.xyz,0.f);\n" - "// float4 b1 = make_float4(b.xyz,0.f);\n" - "// return cross(a1,b1);\n" - "//float4 c = make_float4(a.y*b.z - a.z*b.y,a.z*b.x - a.x*b.z,a.x*b.y - a.y*b.x,0.f);\n" - " \n" - " // float4 c = make_float4(a.y*b.z - a.z*b.y,1.f,a.x*b.y - a.y*b.x,0.f);\n" - " \n" - " //return c;\n" - "}\n" - "__inline\n" - "float dot3F4(float4 a, float4 b)\n" - "{\n" - " float4 a1 = make_float4(a.xyz,0.f);\n" - " float4 b1 = make_float4(b.xyz,0.f);\n" - " return dot(a1, b1);\n" - "}\n" - "__inline\n" - "float4 fastNormalize4(float4 v)\n" - "{\n" - " v = make_float4(v.xyz,0.f);\n" - " return fast_normalize(v);\n" - "}\n" - "///////////////////////////////////////\n" - "// Quaternion\n" - "///////////////////////////////////////\n" - "typedef float4 Quaternion;\n" - "__inline\n" - "Quaternion qtMul(Quaternion a, Quaternion b);\n" - "__inline\n" - "Quaternion qtNormalize(Quaternion in);\n" - "__inline\n" - "float4 qtRotate(Quaternion q, float4 vec);\n" - "__inline\n" - "Quaternion qtInvert(Quaternion q);\n" - "__inline\n" - "Quaternion qtMul(Quaternion a, Quaternion b)\n" - "{\n" - " Quaternion ans;\n" - " ans = cross3( a, b );\n" - " ans += a.w*b+b.w*a;\n" - "// ans.w = a.w*b.w - (a.x*b.x+a.y*b.y+a.z*b.z);\n" - " ans.w = a.w*b.w - dot3F4(a, b);\n" - " return ans;\n" - "}\n" - "__inline\n" - "Quaternion qtNormalize(Quaternion in)\n" - "{\n" - " return fastNormalize4(in);\n" - "// in /= length( in );\n" - "// return in;\n" - "}\n" - "__inline\n" - "float4 qtRotate(Quaternion q, float4 vec)\n" - "{\n" - " Quaternion qInv = qtInvert( q );\n" - " float4 vcpy = vec;\n" - " vcpy.w = 0.f;\n" - " float4 out = qtMul(qtMul(q,vcpy),qInv);\n" - " return out;\n" - "}\n" - "__inline\n" - "Quaternion qtInvert(Quaternion q)\n" - "{\n" - " return (Quaternion)(-q.xyz, q.w);\n" - "}\n" - "__inline\n" - "float4 qtInvRotate(const Quaternion q, float4 vec)\n" - "{\n" - " return qtRotate( qtInvert( q ), vec );\n" - "}\n" - "__inline\n" - "float4 transform(const float4* p, const float4* translation, const Quaternion* orientation)\n" - "{\n" - " return qtRotate( *orientation, *p ) + (*translation);\n" - "}\n" - "__inline\n" - "float4 normalize3(const float4 a)\n" - "{\n" - " float4 n = make_float4(a.x, a.y, a.z, 0.f);\n" - " return fastNormalize4( n );\n" - "}\n" - "inline void projectLocal(const ConvexPolyhedronCL* hull, const float4 pos, const float4 orn, \n" - "const float4* dir, const float4* vertices, float* min, float* max)\n" - "{\n" - " min[0] = FLT_MAX;\n" - " max[0] = -FLT_MAX;\n" - " int numVerts = hull->m_numVertices;\n" - " const float4 localDir = qtInvRotate(orn,*dir);\n" - " float offset = dot(pos,*dir);\n" - " for(int i=0;im_vertexOffset+i],localDir);\n" - " if(dp < min[0]) \n" - " min[0] = dp;\n" - " if(dp > max[0]) \n" - " max[0] = dp;\n" - " }\n" - " if(min[0]>max[0])\n" - " {\n" - " float tmp = min[0];\n" - " min[0] = max[0];\n" - " max[0] = tmp;\n" - " }\n" - " min[0] += offset;\n" - " max[0] += offset;\n" - "}\n" - "inline void project(__global const ConvexPolyhedronCL* hull, const float4 pos, const float4 orn, \n" - "const float4* dir, __global const float4* vertices, float* min, float* max)\n" - "{\n" - " min[0] = FLT_MAX;\n" - " max[0] = -FLT_MAX;\n" - " int numVerts = hull->m_numVertices;\n" - " const float4 localDir = qtInvRotate(orn,*dir);\n" - " float offset = dot(pos,*dir);\n" - " for(int i=0;im_vertexOffset+i],localDir);\n" - " if(dp < min[0]) \n" - " min[0] = dp;\n" - " if(dp > max[0]) \n" - " max[0] = dp;\n" - " }\n" - " if(min[0]>max[0])\n" - " {\n" - " float tmp = min[0];\n" - " min[0] = max[0];\n" - " max[0] = tmp;\n" - " }\n" - " min[0] += offset;\n" - " max[0] += offset;\n" - "}\n" - "inline bool TestSepAxisLocalA(const ConvexPolyhedronCL* hullA, __global const ConvexPolyhedronCL* hullB, \n" - " const float4 posA,const float4 ornA,\n" - " const float4 posB,const float4 ornB,\n" - " float4* sep_axis, const float4* verticesA, __global const float4* verticesB,float* depth)\n" - "{\n" - " float Min0,Max0;\n" - " float Min1,Max1;\n" - " projectLocal(hullA,posA,ornA,sep_axis,verticesA, &Min0, &Max0);\n" - " project(hullB,posB,ornB, sep_axis,verticesB, &Min1, &Max1);\n" - " if(Max01e-6f || fabs(v.y)>1e-6f || fabs(v.z)>1e-6f)\n" - " return false;\n" - " return true;\n" - "}\n" - "bool findSeparatingAxisLocalA( const ConvexPolyhedronCL* hullA, __global const ConvexPolyhedronCL* hullB, \n" - " const float4 posA1,\n" - " const float4 ornA,\n" - " const float4 posB1,\n" - " const float4 ornB,\n" - " const float4 DeltaC2,\n" - " \n" - " const float4* verticesA, \n" - " const float4* uniqueEdgesA, \n" - " const btGpuFace* facesA,\n" - " const int* indicesA,\n" - " __global const float4* verticesB, \n" - " __global const float4* uniqueEdgesB, \n" - " __global const btGpuFace* facesB,\n" - " __global const int* indicesB,\n" - " float4* sep,\n" - " float* dmin)\n" - "{\n" - " \n" - " float4 posA = posA1;\n" - " posA.w = 0.f;\n" - " float4 posB = posB1;\n" - " posB.w = 0.f;\n" - " int curPlaneTests=0;\n" - " {\n" - " int numFacesA = hullA->m_numFaces;\n" - " // Test normals from hullA\n" - " for(int i=0;im_faceOffset+i].m_plane;\n" - " float4 faceANormalWS = qtRotate(ornA,normal);\n" - " if (dot3F4(DeltaC2,faceANormalWS)<0)\n" - " faceANormalWS*=-1.f;\n" - " curPlaneTests++;\n" - " float d;\n" - " if(!TestSepAxisLocalA( hullA, hullB, posA,ornA,posB,ornB,&faceANormalWS, verticesA, verticesB,&d))\n" - " return false;\n" - " if(d<*dmin)\n" - " {\n" - " *dmin = d;\n" - " *sep = faceANormalWS;\n" - " }\n" - " }\n" - " }\n" - " if((dot3F4(-DeltaC2,*sep))>0.0f)\n" - " {\n" - " *sep = -(*sep);\n" - " }\n" - " return true;\n" - "}\n" - "bool findSeparatingAxisLocalB( __global const ConvexPolyhedronCL* hullA, const ConvexPolyhedronCL* hullB, \n" - " const float4 posA1,\n" - " const float4 ornA,\n" - " const float4 posB1,\n" - " const float4 ornB,\n" - " const float4 DeltaC2,\n" - " __global const float4* verticesA, \n" - " __global const float4* uniqueEdgesA, \n" - " __global const btGpuFace* facesA,\n" - " __global const int* indicesA,\n" - " const float4* verticesB,\n" - " const float4* uniqueEdgesB, \n" - " const btGpuFace* facesB,\n" - " const int* indicesB,\n" - " float4* sep,\n" - " float* dmin)\n" - "{\n" - " float4 posA = posA1;\n" - " posA.w = 0.f;\n" - " float4 posB = posB1;\n" - " posB.w = 0.f;\n" - " int curPlaneTests=0;\n" - " {\n" - " int numFacesA = hullA->m_numFaces;\n" - " // Test normals from hullA\n" - " for(int i=0;im_faceOffset+i].m_plane;\n" - " float4 faceANormalWS = qtRotate(ornA,normal);\n" - " if (dot3F4(DeltaC2,faceANormalWS)<0)\n" - " faceANormalWS *= -1.f;\n" - " curPlaneTests++;\n" - " float d;\n" - " if(!TestSepAxisLocalA( hullB, hullA, posB,ornB,posA,ornA, &faceANormalWS, verticesB,verticesA, &d))\n" - " return false;\n" - " if(d<*dmin)\n" - " {\n" - " *dmin = d;\n" - " *sep = faceANormalWS;\n" - " }\n" - " }\n" - " }\n" - " if((dot3F4(-DeltaC2,*sep))>0.0f)\n" - " {\n" - " *sep = -(*sep);\n" - " }\n" - " return true;\n" - "}\n" - "bool findSeparatingAxisEdgeEdgeLocalA( const ConvexPolyhedronCL* hullA, __global const ConvexPolyhedronCL* hullB, \n" - " const float4 posA1,\n" - " const float4 ornA,\n" - " const float4 posB1,\n" - " const float4 ornB,\n" - " const float4 DeltaC2,\n" - " const float4* verticesA, \n" - " const float4* uniqueEdgesA, \n" - " const btGpuFace* facesA,\n" - " const int* indicesA,\n" - " __global const float4* verticesB, \n" - " __global const float4* uniqueEdgesB, \n" - " __global const btGpuFace* facesB,\n" - " __global const int* indicesB,\n" - " float4* sep,\n" - " float* dmin)\n" - "{\n" - " float4 posA = posA1;\n" - " posA.w = 0.f;\n" - " float4 posB = posB1;\n" - " posB.w = 0.f;\n" - " int curPlaneTests=0;\n" - " int curEdgeEdge = 0;\n" - " // Test edges\n" - " for(int e0=0;e0m_numUniqueEdges;e0++)\n" - " {\n" - " const float4 edge0 = uniqueEdgesA[hullA->m_uniqueEdgesOffset+e0];\n" - " float4 edge0World = qtRotate(ornA,edge0);\n" - " for(int e1=0;e1m_numUniqueEdges;e1++)\n" - " {\n" - " const float4 edge1 = uniqueEdgesB[hullB->m_uniqueEdgesOffset+e1];\n" - " float4 edge1World = qtRotate(ornB,edge1);\n" - " float4 crossje = cross3(edge0World,edge1World);\n" - " curEdgeEdge++;\n" - " if(!IsAlmostZero(crossje))\n" - " {\n" - " crossje = normalize3(crossje);\n" - " if (dot3F4(DeltaC2,crossje)<0)\n" - " crossje *= -1.f;\n" - " float dist;\n" - " bool result = true;\n" - " {\n" - " float Min0,Max0;\n" - " float Min1,Max1;\n" - " projectLocal(hullA,posA,ornA,&crossje,verticesA, &Min0, &Max0);\n" - " project(hullB,posB,ornB,&crossje,verticesB, &Min1, &Max1);\n" - " \n" - " if(Max00.0f)\n" - " {\n" - " *sep = -(*sep);\n" - " }\n" - " return true;\n" - "}\n" - "inline int findClippingFaces(const float4 separatingNormal,\n" - " const ConvexPolyhedronCL* hullA, \n" - " __global const ConvexPolyhedronCL* hullB,\n" - " const float4 posA, const Quaternion ornA,const float4 posB, const Quaternion ornB,\n" - " __global float4* worldVertsA1,\n" - " __global float4* worldNormalsA1,\n" - " __global float4* worldVertsB1,\n" - " int capacityWorldVerts,\n" - " const float minDist, float maxDist,\n" - " const float4* verticesA,\n" - " const btGpuFace* facesA,\n" - " const int* indicesA,\n" - " __global const float4* verticesB,\n" - " __global const btGpuFace* facesB,\n" - " __global const int* indicesB,\n" - " __global int4* clippingFaces, int pairIndex)\n" - "{\n" - " int numContactsOut = 0;\n" - " int numWorldVertsB1= 0;\n" - " \n" - " \n" - " int closestFaceB=0;\n" - " float dmax = -FLT_MAX;\n" - " \n" - " {\n" - " for(int face=0;facem_numFaces;face++)\n" - " {\n" - " const float4 Normal = make_float4(facesB[hullB->m_faceOffset+face].m_plane.x,\n" - " facesB[hullB->m_faceOffset+face].m_plane.y, facesB[hullB->m_faceOffset+face].m_plane.z,0.f);\n" - " const float4 WorldNormal = qtRotate(ornB, Normal);\n" - " float d = dot3F4(WorldNormal,separatingNormal);\n" - " if (d > dmax)\n" - " {\n" - " dmax = d;\n" - " closestFaceB = face;\n" - " }\n" - " }\n" - " }\n" - " \n" - " {\n" - " const btGpuFace polyB = facesB[hullB->m_faceOffset+closestFaceB];\n" - " int numVertices = polyB.m_numIndices;\n" - " if (numVertices>capacityWorldVerts)\n" - " numVertices = capacityWorldVerts;\n" - " if (numVertices<0)\n" - " numVertices = 0;\n" - " \n" - " for(int e0=0;e0m_vertexOffset+indicesB[polyB.m_indexOffset+e0]];\n" - " worldVertsB1[pairIndex*capacityWorldVerts+numWorldVertsB1++] = transform(&b,&posB,&ornB);\n" - " }\n" - " }\n" - " }\n" - " \n" - " int closestFaceA=0;\n" - " {\n" - " float dmin = FLT_MAX;\n" - " for(int face=0;facem_numFaces;face++)\n" - " {\n" - " const float4 Normal = make_float4(\n" - " facesA[hullA->m_faceOffset+face].m_plane.x,\n" - " facesA[hullA->m_faceOffset+face].m_plane.y,\n" - " facesA[hullA->m_faceOffset+face].m_plane.z,\n" - " 0.f);\n" - " const float4 faceANormalWS = qtRotate(ornA,Normal);\n" - " \n" - " float d = dot3F4(faceANormalWS,separatingNormal);\n" - " if (d < dmin)\n" - " {\n" - " dmin = d;\n" - " closestFaceA = face;\n" - " worldNormalsA1[pairIndex] = faceANormalWS;\n" - " }\n" - " }\n" - " }\n" - " \n" - " int numVerticesA = facesA[hullA->m_faceOffset+closestFaceA].m_numIndices;\n" - " if (numVerticesA>capacityWorldVerts)\n" - " numVerticesA = capacityWorldVerts;\n" - " if (numVerticesA<0)\n" - " numVerticesA=0;\n" - " \n" - " for(int e0=0;e0m_vertexOffset+indicesA[facesA[hullA->m_faceOffset+closestFaceA].m_indexOffset+e0]];\n" - " worldVertsA1[pairIndex*capacityWorldVerts+e0] = transform(&a, &posA,&ornA);\n" - " }\n" - " }\n" - " \n" - " clippingFaces[pairIndex].x = closestFaceA;\n" - " clippingFaces[pairIndex].y = closestFaceB;\n" - " clippingFaces[pairIndex].z = numVerticesA;\n" - " clippingFaces[pairIndex].w = numWorldVertsB1;\n" - " \n" - " \n" - " return numContactsOut;\n" - "}\n" - "// work-in-progress\n" - "__kernel void findConcaveSeparatingAxisVertexFaceKernel( __global int4* concavePairs,\n" - " __global const BodyData* rigidBodies,\n" - " __global const btCollidableGpu* collidables,\n" - " __global const ConvexPolyhedronCL* convexShapes,\n" - " __global const float4* vertices,\n" - " __global const float4* uniqueEdges,\n" - " __global const btGpuFace* faces,\n" - " __global const int* indices,\n" - " __global const btGpuChildShape* gpuChildShapes,\n" - " __global btAabbCL* aabbs,\n" - " __global float4* concaveSeparatingNormalsOut,\n" - " __global int* concaveHasSeparatingNormals,\n" - " __global int4* clippingFacesOut,\n" - " __global float4* worldVertsA1GPU,\n" - " __global float4* worldNormalsAGPU,\n" - " __global float4* worldVertsB1GPU,\n" - " __global float* dmins,\n" - " int vertexFaceCapacity,\n" - " int numConcavePairs\n" - " )\n" - "{\n" - " \n" - " int i = get_global_id(0);\n" - " if (i>=numConcavePairs)\n" - " return;\n" - " \n" - " concaveHasSeparatingNormals[i] = 0;\n" - " \n" - " int pairIdx = i;\n" - " \n" - " int bodyIndexA = concavePairs[i].x;\n" - " int bodyIndexB = concavePairs[i].y;\n" - " \n" - " int collidableIndexA = rigidBodies[bodyIndexA].m_collidableIdx;\n" - " int collidableIndexB = rigidBodies[bodyIndexB].m_collidableIdx;\n" - " \n" - " int shapeIndexA = collidables[collidableIndexA].m_shapeIndex;\n" - " int shapeIndexB = collidables[collidableIndexB].m_shapeIndex;\n" - " \n" - " if (collidables[collidableIndexB].m_shapeType!=SHAPE_CONVEX_HULL&&\n" - " collidables[collidableIndexB].m_shapeType!=SHAPE_COMPOUND_OF_CONVEX_HULLS)\n" - " {\n" - " concavePairs[pairIdx].w = -1;\n" - " return;\n" - " }\n" - " \n" - " \n" - " \n" - " int numFacesA = convexShapes[shapeIndexA].m_numFaces;\n" - " int numActualConcaveConvexTests = 0;\n" - " \n" - " int f = concavePairs[i].z;\n" - " \n" - " bool overlap = false;\n" - " \n" - " ConvexPolyhedronCL convexPolyhedronA;\n" - " \n" - " //add 3 vertices of the triangle\n" - " convexPolyhedronA.m_numVertices = 3;\n" - " convexPolyhedronA.m_vertexOffset = 0;\n" - " float4 localCenter = make_float4(0.f,0.f,0.f,0.f);\n" - " \n" - " btGpuFace face = faces[convexShapes[shapeIndexA].m_faceOffset+f];\n" - " float4 triMinAabb, triMaxAabb;\n" - " btAabbCL triAabb;\n" - " triAabb.m_min = make_float4(1e30f,1e30f,1e30f,0.f);\n" - " triAabb.m_max = make_float4(-1e30f,-1e30f,-1e30f,0.f);\n" - " \n" - " float4 verticesA[3];\n" - " for (int i=0;i<3;i++)\n" - " {\n" - " int index = indices[face.m_indexOffset+i];\n" - " float4 vert = vertices[convexShapes[shapeIndexA].m_vertexOffset+index];\n" - " verticesA[i] = vert;\n" - " localCenter += vert;\n" - " \n" - " triAabb.m_min = min(triAabb.m_min,vert);\n" - " triAabb.m_max = max(triAabb.m_max,vert);\n" - " \n" - " }\n" - " \n" - " overlap = true;\n" - " overlap = (triAabb.m_min.x > aabbs[bodyIndexB].m_max.x || triAabb.m_max.x < aabbs[bodyIndexB].m_min.x) ? false : overlap;\n" - " overlap = (triAabb.m_min.z > aabbs[bodyIndexB].m_max.z || triAabb.m_max.z < aabbs[bodyIndexB].m_min.z) ? false : overlap;\n" - " overlap = (triAabb.m_min.y > aabbs[bodyIndexB].m_max.y || triAabb.m_max.y < aabbs[bodyIndexB].m_min.y) ? false : overlap;\n" - " \n" - " if (overlap)\n" - " {\n" - " float dmin = FLT_MAX;\n" - " int hasSeparatingAxis=5;\n" - " float4 sepAxis=make_float4(1,2,3,4);\n" - " \n" - " int localCC=0;\n" - " numActualConcaveConvexTests++;\n" - " \n" - " //a triangle has 3 unique edges\n" - " convexPolyhedronA.m_numUniqueEdges = 3;\n" - " convexPolyhedronA.m_uniqueEdgesOffset = 0;\n" - " float4 uniqueEdgesA[3];\n" - " \n" - " uniqueEdgesA[0] = (verticesA[1]-verticesA[0]);\n" - " uniqueEdgesA[1] = (verticesA[2]-verticesA[1]);\n" - " uniqueEdgesA[2] = (verticesA[0]-verticesA[2]);\n" - " \n" - " \n" - " convexPolyhedronA.m_faceOffset = 0;\n" - " \n" - " float4 normal = make_float4(face.m_plane.x,face.m_plane.y,face.m_plane.z,0.f);\n" - " \n" - " btGpuFace facesA[TRIANGLE_NUM_CONVEX_FACES];\n" - " int indicesA[3+3+2+2+2];\n" - " int curUsedIndices=0;\n" - " int fidx=0;\n" - " \n" - " //front size of triangle\n" - " {\n" - " facesA[fidx].m_indexOffset=curUsedIndices;\n" - " indicesA[0] = 0;\n" - " indicesA[1] = 1;\n" - " indicesA[2] = 2;\n" - " curUsedIndices+=3;\n" - " float c = face.m_plane.w;\n" - " facesA[fidx].m_plane.x = normal.x;\n" - " facesA[fidx].m_plane.y = normal.y;\n" - " facesA[fidx].m_plane.z = normal.z;\n" - " facesA[fidx].m_plane.w = c;\n" - " facesA[fidx].m_numIndices=3;\n" - " }\n" - " fidx++;\n" - " //back size of triangle\n" - " {\n" - " facesA[fidx].m_indexOffset=curUsedIndices;\n" - " indicesA[3]=2;\n" - " indicesA[4]=1;\n" - " indicesA[5]=0;\n" - " curUsedIndices+=3;\n" - " float c = dot(normal,verticesA[0]);\n" - " float c1 = -face.m_plane.w;\n" - " facesA[fidx].m_plane.x = -normal.x;\n" - " facesA[fidx].m_plane.y = -normal.y;\n" - " facesA[fidx].m_plane.z = -normal.z;\n" - " facesA[fidx].m_plane.w = c;\n" - " facesA[fidx].m_numIndices=3;\n" - " }\n" - " fidx++;\n" - " \n" - " bool addEdgePlanes = true;\n" - " if (addEdgePlanes)\n" - " {\n" - " int numVertices=3;\n" - " int prevVertex = numVertices-1;\n" - " for (int i=0;i=numConcavePairs)\n" - " return;\n" - " \n" - " if (!concaveHasSeparatingNormals[i])\n" - " return;\n" - " \n" - " int pairIdx = i;\n" - " \n" - " int bodyIndexA = concavePairs[i].x;\n" - " int bodyIndexB = concavePairs[i].y;\n" - " \n" - " int collidableIndexA = rigidBodies[bodyIndexA].m_collidableIdx;\n" - " int collidableIndexB = rigidBodies[bodyIndexB].m_collidableIdx;\n" - " \n" - " int shapeIndexA = collidables[collidableIndexA].m_shapeIndex;\n" - " int shapeIndexB = collidables[collidableIndexB].m_shapeIndex;\n" - " \n" - " \n" - " int numFacesA = convexShapes[shapeIndexA].m_numFaces;\n" - " int numActualConcaveConvexTests = 0;\n" - " \n" - " int f = concavePairs[i].z;\n" - " \n" - " bool overlap = false;\n" - " \n" - " ConvexPolyhedronCL convexPolyhedronA;\n" - " \n" - " //add 3 vertices of the triangle\n" - " convexPolyhedronA.m_numVertices = 3;\n" - " convexPolyhedronA.m_vertexOffset = 0;\n" - " float4 localCenter = make_float4(0.f,0.f,0.f,0.f);\n" - " \n" - " btGpuFace face = faces[convexShapes[shapeIndexA].m_faceOffset+f];\n" - " float4 triMinAabb, triMaxAabb;\n" - " btAabbCL triAabb;\n" - " triAabb.m_min = make_float4(1e30f,1e30f,1e30f,0.f);\n" - " triAabb.m_max = make_float4(-1e30f,-1e30f,-1e30f,0.f);\n" - " \n" - " float4 verticesA[3];\n" - " for (int i=0;i<3;i++)\n" - " {\n" - " int index = indices[face.m_indexOffset+i];\n" - " float4 vert = vertices[convexShapes[shapeIndexA].m_vertexOffset+index];\n" - " verticesA[i] = vert;\n" - " localCenter += vert;\n" - " \n" - " triAabb.m_min = min(triAabb.m_min,vert);\n" - " triAabb.m_max = max(triAabb.m_max,vert);\n" - " \n" - " }\n" - " \n" - " overlap = true;\n" - " overlap = (triAabb.m_min.x > aabbs[bodyIndexB].m_max.x || triAabb.m_max.x < aabbs[bodyIndexB].m_min.x) ? false : overlap;\n" - " overlap = (triAabb.m_min.z > aabbs[bodyIndexB].m_max.z || triAabb.m_max.z < aabbs[bodyIndexB].m_min.z) ? false : overlap;\n" - " overlap = (triAabb.m_min.y > aabbs[bodyIndexB].m_max.y || triAabb.m_max.y < aabbs[bodyIndexB].m_min.y) ? false : overlap;\n" - " \n" - " if (overlap)\n" - " {\n" - " float dmin = dmins[i];\n" - " int hasSeparatingAxis=5;\n" - " float4 sepAxis=make_float4(1,2,3,4);\n" - " sepAxis = concaveSeparatingNormalsOut[pairIdx];\n" - " \n" - " int localCC=0;\n" - " numActualConcaveConvexTests++;\n" - " \n" - " //a triangle has 3 unique edges\n" - " convexPolyhedronA.m_numUniqueEdges = 3;\n" - " convexPolyhedronA.m_uniqueEdgesOffset = 0;\n" - " float4 uniqueEdgesA[3];\n" - " \n" - " uniqueEdgesA[0] = (verticesA[1]-verticesA[0]);\n" - " uniqueEdgesA[1] = (verticesA[2]-verticesA[1]);\n" - " uniqueEdgesA[2] = (verticesA[0]-verticesA[2]);\n" - " \n" - " \n" - " convexPolyhedronA.m_faceOffset = 0;\n" - " \n" - " float4 normal = make_float4(face.m_plane.x,face.m_plane.y,face.m_plane.z,0.f);\n" - " \n" - " btGpuFace facesA[TRIANGLE_NUM_CONVEX_FACES];\n" - " int indicesA[3+3+2+2+2];\n" - " int curUsedIndices=0;\n" - " int fidx=0;\n" - " \n" - " //front size of triangle\n" - " {\n" - " facesA[fidx].m_indexOffset=curUsedIndices;\n" - " indicesA[0] = 0;\n" - " indicesA[1] = 1;\n" - " indicesA[2] = 2;\n" - " curUsedIndices+=3;\n" - " float c = face.m_plane.w;\n" - " facesA[fidx].m_plane.x = normal.x;\n" - " facesA[fidx].m_plane.y = normal.y;\n" - " facesA[fidx].m_plane.z = normal.z;\n" - " facesA[fidx].m_plane.w = c;\n" - " facesA[fidx].m_numIndices=3;\n" - " }\n" - " fidx++;\n" - " //back size of triangle\n" - " {\n" - " facesA[fidx].m_indexOffset=curUsedIndices;\n" - " indicesA[3]=2;\n" - " indicesA[4]=1;\n" - " indicesA[5]=0;\n" - " curUsedIndices+=3;\n" - " float c = dot(normal,verticesA[0]);\n" - " float c1 = -face.m_plane.w;\n" - " facesA[fidx].m_plane.x = -normal.x;\n" - " facesA[fidx].m_plane.y = -normal.y;\n" - " facesA[fidx].m_plane.z = -normal.z;\n" - " facesA[fidx].m_plane.w = c;\n" - " facesA[fidx].m_numIndices=3;\n" - " }\n" - " fidx++;\n" - " \n" - " bool addEdgePlanes = true;\n" - " if (addEdgePlanes)\n" - " {\n" - " int numVertices=3;\n" - " int prevVertex = numVertices-1;\n" - " for (int i=0;im_escapeIndexOrTriangleIndex&~(y));\n" - "}\n" - "int getTriangleIndexGlobal(__global const b3QuantizedBvhNode* rootNode)\n" - "{\n" - " unsigned int x=0;\n" - " unsigned int y = (~(x&0))<<(31-MAX_NUM_PARTS_IN_BITS);\n" - " // Get only the lower bits where the triangle index is stored\n" - " return (rootNode->m_escapeIndexOrTriangleIndex&~(y));\n" - "}\n" - "int isLeafNode(const b3QuantizedBvhNode* rootNode)\n" - "{\n" - " //skipindex is negative (internal node), triangleindex >=0 (leafnode)\n" - " return (rootNode->m_escapeIndexOrTriangleIndex >= 0)? 1 : 0;\n" - "}\n" - "int isLeafNodeGlobal(__global const b3QuantizedBvhNode* rootNode)\n" - "{\n" - " //skipindex is negative (internal node), triangleindex >=0 (leafnode)\n" - " return (rootNode->m_escapeIndexOrTriangleIndex >= 0)? 1 : 0;\n" - "}\n" - " \n" - "int getEscapeIndex(const b3QuantizedBvhNode* rootNode)\n" - "{\n" - " return -rootNode->m_escapeIndexOrTriangleIndex;\n" - "}\n" - "int getEscapeIndexGlobal(__global const b3QuantizedBvhNode* rootNode)\n" - "{\n" - " return -rootNode->m_escapeIndexOrTriangleIndex;\n" - "}\n" - "typedef struct\n" - "{\n" - " //12 bytes\n" - " unsigned short int m_quantizedAabbMin[3];\n" - " unsigned short int m_quantizedAabbMax[3];\n" - " //4 bytes, points to the root of the subtree\n" - " int m_rootNodeIndex;\n" - " //4 bytes\n" - " int m_subtreeSize;\n" - " int m_padding[3];\n" - "} b3BvhSubtreeInfo;\n" - "typedef struct\n" - "{\n" - " float4 m_childPosition;\n" - " float4 m_childOrientation;\n" - " int m_shapeIndex;\n" - " int m_unused0;\n" - " int m_unused1;\n" - " int m_unused2;\n" - "} btGpuChildShape;\n" - "typedef struct\n" - "{\n" - " float4 m_pos;\n" - " float4 m_quat;\n" - " float4 m_linVel;\n" - " float4 m_angVel;\n" - " u32 m_collidableIdx;\n" - " float m_invMass;\n" - " float m_restituitionCoeff;\n" - " float m_frictionCoeff;\n" - "} BodyData;\n" - "typedef struct \n" - "{\n" - " float4 m_localCenter;\n" - " float4 m_extents;\n" - " float4 mC;\n" - " float4 mE;\n" - " \n" - " float m_radius;\n" - " int m_faceOffset;\n" - " int m_numFaces;\n" - " int m_numVertices;\n" - " int m_vertexOffset;\n" - " int m_uniqueEdgesOffset;\n" - " int m_numUniqueEdges;\n" - " int m_unused;\n" - "} ConvexPolyhedronCL;\n" - "typedef struct \n" - "{\n" - " union\n" - " {\n" - " float4 m_min;\n" - " float m_minElems[4];\n" - " int m_minIndices[4];\n" - " };\n" - " union\n" - " {\n" - " float4 m_max;\n" - " float m_maxElems[4];\n" - " int m_maxIndices[4];\n" - " };\n" - "} btAabbCL;\n" - "#ifndef B3_AABB_H\n" - "#define B3_AABB_H\n" - "#ifndef B3_FLOAT4_H\n" - "#define B3_FLOAT4_H\n" - "#ifndef B3_PLATFORM_DEFINITIONS_H\n" - "#define B3_PLATFORM_DEFINITIONS_H\n" - "struct MyTest\n" - "{\n" - " int bla;\n" - "};\n" - "#ifdef __cplusplus\n" - "#else\n" - "//keep B3_LARGE_FLOAT*B3_LARGE_FLOAT < FLT_MAX\n" - "#define B3_LARGE_FLOAT 1e18f\n" - "#define B3_INFINITY 1e18f\n" - "#define b3Assert(a)\n" - "#define b3ConstArray(a) __global const a*\n" - "#define b3AtomicInc atomic_inc\n" - "#define b3AtomicAdd atomic_add\n" - "#define b3Fabs fabs\n" - "#define b3Sqrt native_sqrt\n" - "#define b3Sin native_sin\n" - "#define b3Cos native_cos\n" - "#define B3_STATIC\n" - "#endif\n" - "#endif\n" - "#ifdef __cplusplus\n" - "#else\n" - " typedef float4 b3Float4;\n" - " #define b3Float4ConstArg const b3Float4\n" - " #define b3MakeFloat4 (float4)\n" - " float b3Dot3F4(b3Float4ConstArg v0,b3Float4ConstArg v1)\n" - " {\n" - " float4 a1 = b3MakeFloat4(v0.xyz,0.f);\n" - " float4 b1 = b3MakeFloat4(v1.xyz,0.f);\n" - " return dot(a1, b1);\n" - " }\n" - " b3Float4 b3Cross3(b3Float4ConstArg v0,b3Float4ConstArg v1)\n" - " {\n" - " float4 a1 = b3MakeFloat4(v0.xyz,0.f);\n" - " float4 b1 = b3MakeFloat4(v1.xyz,0.f);\n" - " return cross(a1, b1);\n" - " }\n" - " #define b3MinFloat4 min\n" - " #define b3MaxFloat4 max\n" - " #define b3Normalized(a) normalize(a)\n" - "#endif \n" - " \n" - "inline bool b3IsAlmostZero(b3Float4ConstArg v)\n" - "{\n" - " if(b3Fabs(v.x)>1e-6 || b3Fabs(v.y)>1e-6 || b3Fabs(v.z)>1e-6) \n" - " return false;\n" - " return true;\n" - "}\n" - "inline int b3MaxDot( b3Float4ConstArg vec, __global const b3Float4* vecArray, int vecLen, float* dotOut )\n" - "{\n" - " float maxDot = -B3_INFINITY;\n" - " int i = 0;\n" - " int ptIndex = -1;\n" - " for( i = 0; i < vecLen; i++ )\n" - " {\n" - " float dot = b3Dot3F4(vecArray[i],vec);\n" - " \n" - " if( dot > maxDot )\n" - " {\n" - " maxDot = dot;\n" - " ptIndex = i;\n" - " }\n" - " }\n" - " b3Assert(ptIndex>=0);\n" - " if (ptIndex<0)\n" - " {\n" - " ptIndex = 0;\n" - " }\n" - " *dotOut = maxDot;\n" - " return ptIndex;\n" - "}\n" - "#endif //B3_FLOAT4_H\n" - "#ifndef B3_MAT3x3_H\n" - "#define B3_MAT3x3_H\n" - "#ifndef B3_QUAT_H\n" - "#define B3_QUAT_H\n" - "#ifndef B3_PLATFORM_DEFINITIONS_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#endif\n" - "#endif\n" - "#ifndef B3_FLOAT4_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#endif \n" - "#endif //B3_FLOAT4_H\n" - "#ifdef __cplusplus\n" - "#else\n" - " typedef float4 b3Quat;\n" - " #define b3QuatConstArg const b3Quat\n" - " \n" - " \n" - "inline float4 b3FastNormalize4(float4 v)\n" - "{\n" - " v = (float4)(v.xyz,0.f);\n" - " return fast_normalize(v);\n" - "}\n" - " \n" - "inline b3Quat b3QuatMul(b3Quat a, b3Quat b);\n" - "inline b3Quat b3QuatNormalized(b3QuatConstArg in);\n" - "inline b3Quat b3QuatRotate(b3QuatConstArg q, b3QuatConstArg vec);\n" - "inline b3Quat b3QuatInvert(b3QuatConstArg q);\n" - "inline b3Quat b3QuatInverse(b3QuatConstArg q);\n" - "inline b3Quat b3QuatMul(b3QuatConstArg a, b3QuatConstArg b)\n" - "{\n" - " b3Quat ans;\n" - " ans = b3Cross3( a, b );\n" - " ans += a.w*b+b.w*a;\n" - "// ans.w = a.w*b.w - (a.x*b.x+a.y*b.y+a.z*b.z);\n" - " ans.w = a.w*b.w - b3Dot3F4(a, b);\n" - " return ans;\n" - "}\n" - "inline b3Quat b3QuatNormalized(b3QuatConstArg in)\n" - "{\n" - " b3Quat q;\n" - " q=in;\n" - " //return b3FastNormalize4(in);\n" - " float len = native_sqrt(dot(q, q));\n" - " if(len > 0.f)\n" - " {\n" - " q *= 1.f / len;\n" - " }\n" - " else\n" - " {\n" - " q.x = q.y = q.z = 0.f;\n" - " q.w = 1.f;\n" - " }\n" - " return q;\n" - "}\n" - "inline float4 b3QuatRotate(b3QuatConstArg q, b3QuatConstArg vec)\n" - "{\n" - " b3Quat qInv = b3QuatInvert( q );\n" - " float4 vcpy = vec;\n" - " vcpy.w = 0.f;\n" - " float4 out = b3QuatMul(b3QuatMul(q,vcpy),qInv);\n" - " return out;\n" - "}\n" - "inline b3Quat b3QuatInverse(b3QuatConstArg q)\n" - "{\n" - " return (b3Quat)(-q.xyz, q.w);\n" - "}\n" - "inline b3Quat b3QuatInvert(b3QuatConstArg q)\n" - "{\n" - " return (b3Quat)(-q.xyz, q.w);\n" - "}\n" - "inline float4 b3QuatInvRotate(b3QuatConstArg q, b3QuatConstArg vec)\n" - "{\n" - " return b3QuatRotate( b3QuatInvert( q ), vec );\n" - "}\n" - "inline b3Float4 b3TransformPoint(b3Float4ConstArg point, b3Float4ConstArg translation, b3QuatConstArg orientation)\n" - "{\n" - " return b3QuatRotate( orientation, point ) + (translation);\n" - "}\n" - " \n" - "#endif \n" - "#endif //B3_QUAT_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "typedef struct\n" - "{\n" - " b3Float4 m_row[3];\n" - "}b3Mat3x3;\n" - "#define b3Mat3x3ConstArg const b3Mat3x3\n" - "#define b3GetRow(m,row) (m.m_row[row])\n" - "inline b3Mat3x3 b3QuatGetRotationMatrix(b3Quat quat)\n" - "{\n" - " b3Float4 quat2 = (b3Float4)(quat.x*quat.x, quat.y*quat.y, quat.z*quat.z, 0.f);\n" - " b3Mat3x3 out;\n" - " out.m_row[0].x=1-2*quat2.y-2*quat2.z;\n" - " out.m_row[0].y=2*quat.x*quat.y-2*quat.w*quat.z;\n" - " out.m_row[0].z=2*quat.x*quat.z+2*quat.w*quat.y;\n" - " out.m_row[0].w = 0.f;\n" - " out.m_row[1].x=2*quat.x*quat.y+2*quat.w*quat.z;\n" - " out.m_row[1].y=1-2*quat2.x-2*quat2.z;\n" - " out.m_row[1].z=2*quat.y*quat.z-2*quat.w*quat.x;\n" - " out.m_row[1].w = 0.f;\n" - " out.m_row[2].x=2*quat.x*quat.z-2*quat.w*quat.y;\n" - " out.m_row[2].y=2*quat.y*quat.z+2*quat.w*quat.x;\n" - " out.m_row[2].z=1-2*quat2.x-2*quat2.y;\n" - " out.m_row[2].w = 0.f;\n" - " return out;\n" - "}\n" - "inline b3Mat3x3 b3AbsoluteMat3x3(b3Mat3x3ConstArg matIn)\n" - "{\n" - " b3Mat3x3 out;\n" - " out.m_row[0] = fabs(matIn.m_row[0]);\n" - " out.m_row[1] = fabs(matIn.m_row[1]);\n" - " out.m_row[2] = fabs(matIn.m_row[2]);\n" - " return out;\n" - "}\n" - "__inline\n" - "b3Mat3x3 mtZero();\n" - "__inline\n" - "b3Mat3x3 mtIdentity();\n" - "__inline\n" - "b3Mat3x3 mtTranspose(b3Mat3x3 m);\n" - "__inline\n" - "b3Mat3x3 mtMul(b3Mat3x3 a, b3Mat3x3 b);\n" - "__inline\n" - "b3Float4 mtMul1(b3Mat3x3 a, b3Float4 b);\n" - "__inline\n" - "b3Float4 mtMul3(b3Float4 a, b3Mat3x3 b);\n" - "__inline\n" - "b3Mat3x3 mtZero()\n" - "{\n" - " b3Mat3x3 m;\n" - " m.m_row[0] = (b3Float4)(0.f);\n" - " m.m_row[1] = (b3Float4)(0.f);\n" - " m.m_row[2] = (b3Float4)(0.f);\n" - " return m;\n" - "}\n" - "__inline\n" - "b3Mat3x3 mtIdentity()\n" - "{\n" - " b3Mat3x3 m;\n" - " m.m_row[0] = (b3Float4)(1,0,0,0);\n" - " m.m_row[1] = (b3Float4)(0,1,0,0);\n" - " m.m_row[2] = (b3Float4)(0,0,1,0);\n" - " return m;\n" - "}\n" - "__inline\n" - "b3Mat3x3 mtTranspose(b3Mat3x3 m)\n" - "{\n" - " b3Mat3x3 out;\n" - " out.m_row[0] = (b3Float4)(m.m_row[0].x, m.m_row[1].x, m.m_row[2].x, 0.f);\n" - " out.m_row[1] = (b3Float4)(m.m_row[0].y, m.m_row[1].y, m.m_row[2].y, 0.f);\n" - " out.m_row[2] = (b3Float4)(m.m_row[0].z, m.m_row[1].z, m.m_row[2].z, 0.f);\n" - " return out;\n" - "}\n" - "__inline\n" - "b3Mat3x3 mtMul(b3Mat3x3 a, b3Mat3x3 b)\n" - "{\n" - " b3Mat3x3 transB;\n" - " transB = mtTranspose( b );\n" - " b3Mat3x3 ans;\n" - " // why this doesn't run when 0ing in the for{}\n" - " a.m_row[0].w = 0.f;\n" - " a.m_row[1].w = 0.f;\n" - " a.m_row[2].w = 0.f;\n" - " for(int i=0; i<3; i++)\n" - " {\n" - "// a.m_row[i].w = 0.f;\n" - " ans.m_row[i].x = b3Dot3F4(a.m_row[i],transB.m_row[0]);\n" - " ans.m_row[i].y = b3Dot3F4(a.m_row[i],transB.m_row[1]);\n" - " ans.m_row[i].z = b3Dot3F4(a.m_row[i],transB.m_row[2]);\n" - " ans.m_row[i].w = 0.f;\n" - " }\n" - " return ans;\n" - "}\n" - "__inline\n" - "b3Float4 mtMul1(b3Mat3x3 a, b3Float4 b)\n" - "{\n" - " b3Float4 ans;\n" - " ans.x = b3Dot3F4( a.m_row[0], b );\n" - " ans.y = b3Dot3F4( a.m_row[1], b );\n" - " ans.z = b3Dot3F4( a.m_row[2], b );\n" - " ans.w = 0.f;\n" - " return ans;\n" - "}\n" - "__inline\n" - "b3Float4 mtMul3(b3Float4 a, b3Mat3x3 b)\n" - "{\n" - " b3Float4 colx = b3MakeFloat4(b.m_row[0].x, b.m_row[1].x, b.m_row[2].x, 0);\n" - " b3Float4 coly = b3MakeFloat4(b.m_row[0].y, b.m_row[1].y, b.m_row[2].y, 0);\n" - " b3Float4 colz = b3MakeFloat4(b.m_row[0].z, b.m_row[1].z, b.m_row[2].z, 0);\n" - " b3Float4 ans;\n" - " ans.x = b3Dot3F4( a, colx );\n" - " ans.y = b3Dot3F4( a, coly );\n" - " ans.z = b3Dot3F4( a, colz );\n" - " return ans;\n" - "}\n" - "#endif\n" - "#endif //B3_MAT3x3_H\n" - "typedef struct b3Aabb b3Aabb_t;\n" - "struct b3Aabb\n" - "{\n" - " union\n" - " {\n" - " float m_min[4];\n" - " b3Float4 m_minVec;\n" - " int m_minIndices[4];\n" - " };\n" - " union\n" - " {\n" - " float m_max[4];\n" - " b3Float4 m_maxVec;\n" - " int m_signedMaxIndices[4];\n" - " };\n" - "};\n" - "inline void b3TransformAabb2(b3Float4ConstArg localAabbMin,b3Float4ConstArg localAabbMax, float margin,\n" - " b3Float4ConstArg pos,\n" - " b3QuatConstArg orn,\n" - " b3Float4* aabbMinOut,b3Float4* aabbMaxOut)\n" - "{\n" - " b3Float4 localHalfExtents = 0.5f*(localAabbMax-localAabbMin);\n" - " localHalfExtents+=b3MakeFloat4(margin,margin,margin,0.f);\n" - " b3Float4 localCenter = 0.5f*(localAabbMax+localAabbMin);\n" - " b3Mat3x3 m;\n" - " m = b3QuatGetRotationMatrix(orn);\n" - " b3Mat3x3 abs_b = b3AbsoluteMat3x3(m);\n" - " b3Float4 center = b3TransformPoint(localCenter,pos,orn);\n" - " \n" - " b3Float4 extent = b3MakeFloat4(b3Dot3F4(localHalfExtents,b3GetRow(abs_b,0)),\n" - " b3Dot3F4(localHalfExtents,b3GetRow(abs_b,1)),\n" - " b3Dot3F4(localHalfExtents,b3GetRow(abs_b,2)),\n" - " 0.f);\n" - " *aabbMinOut = center-extent;\n" - " *aabbMaxOut = center+extent;\n" - "}\n" - "/// conservative test for overlap between two aabbs\n" - "inline bool b3TestAabbAgainstAabb(b3Float4ConstArg aabbMin1,b3Float4ConstArg aabbMax1,\n" - " b3Float4ConstArg aabbMin2, b3Float4ConstArg aabbMax2)\n" - "{\n" - " bool overlap = true;\n" - " overlap = (aabbMin1.x > aabbMax2.x || aabbMax1.x < aabbMin2.x) ? false : overlap;\n" - " overlap = (aabbMin1.z > aabbMax2.z || aabbMax1.z < aabbMin2.z) ? false : overlap;\n" - " overlap = (aabbMin1.y > aabbMax2.y || aabbMax1.y < aabbMin2.y) ? false : overlap;\n" - " return overlap;\n" - "}\n" - "#endif //B3_AABB_H\n" - "/*\n" - "Bullet Continuous Collision Detection and Physics Library\n" - "Copyright (c) 2003-2013 Erwin Coumans http://bulletphysics.org\n" - "This software is provided 'as-is', without any express or implied warranty.\n" - "In no event will the authors be held liable for any damages arising from the use of this software.\n" - "Permission is granted to anyone to use this software for any purpose,\n" - "including commercial applications, and to alter it and redistribute it freely,\n" - "subject to the following restrictions:\n" - "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.\n" - "2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.\n" - "3. This notice may not be removed or altered from any source distribution.\n" - "*/\n" - "#ifndef B3_INT2_H\n" - "#define B3_INT2_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#define b3UnsignedInt2 uint2\n" - "#define b3Int2 int2\n" - "#define b3MakeInt2 (int2)\n" - "#endif //__cplusplus\n" - "#endif\n" - "typedef struct\n" - "{\n" - " float4 m_plane;\n" - " int m_indexOffset;\n" - " int m_numIndices;\n" - "} btGpuFace;\n" - "#define make_float4 (float4)\n" - "__inline\n" - "float4 cross3(float4 a, float4 b)\n" - "{\n" - " return cross(a,b);\n" - " \n" - "// float4 a1 = make_float4(a.xyz,0.f);\n" - "// float4 b1 = make_float4(b.xyz,0.f);\n" - "// return cross(a1,b1);\n" - "//float4 c = make_float4(a.y*b.z - a.z*b.y,a.z*b.x - a.x*b.z,a.x*b.y - a.y*b.x,0.f);\n" - " \n" - " // float4 c = make_float4(a.y*b.z - a.z*b.y,1.f,a.x*b.y - a.y*b.x,0.f);\n" - " \n" - " //return c;\n" - "}\n" - "__inline\n" - "float dot3F4(float4 a, float4 b)\n" - "{\n" - " float4 a1 = make_float4(a.xyz,0.f);\n" - " float4 b1 = make_float4(b.xyz,0.f);\n" - " return dot(a1, b1);\n" - "}\n" - "__inline\n" - "float4 fastNormalize4(float4 v)\n" - "{\n" - " v = make_float4(v.xyz,0.f);\n" - " return fast_normalize(v);\n" - "}\n" - "///////////////////////////////////////\n" - "// Quaternion\n" - "///////////////////////////////////////\n" - "typedef float4 Quaternion;\n" - "__inline\n" - "Quaternion qtMul(Quaternion a, Quaternion b);\n" - "__inline\n" - "Quaternion qtNormalize(Quaternion in);\n" - "__inline\n" - "float4 qtRotate(Quaternion q, float4 vec);\n" - "__inline\n" - "Quaternion qtInvert(Quaternion q);\n" - "__inline\n" - "Quaternion qtMul(Quaternion a, Quaternion b)\n" - "{\n" - " Quaternion ans;\n" - " ans = cross3( a, b );\n" - " ans += a.w*b+b.w*a;\n" - "// ans.w = a.w*b.w - (a.x*b.x+a.y*b.y+a.z*b.z);\n" - " ans.w = a.w*b.w - dot3F4(a, b);\n" - " return ans;\n" - "}\n" - "__inline\n" - "Quaternion qtNormalize(Quaternion in)\n" - "{\n" - " return fastNormalize4(in);\n" - "// in /= length( in );\n" - "// return in;\n" - "}\n" - "__inline\n" - "float4 qtRotate(Quaternion q, float4 vec)\n" - "{\n" - " Quaternion qInv = qtInvert( q );\n" - " float4 vcpy = vec;\n" - " vcpy.w = 0.f;\n" - " float4 out = qtMul(qtMul(q,vcpy),qInv);\n" - " return out;\n" - "}\n" - "__inline\n" - "Quaternion qtInvert(Quaternion q)\n" - "{\n" - " return (Quaternion)(-q.xyz, q.w);\n" - "}\n" - "__inline\n" - "float4 qtInvRotate(const Quaternion q, float4 vec)\n" - "{\n" - " return qtRotate( qtInvert( q ), vec );\n" - "}\n" - "__inline\n" - "float4 transform(const float4* p, const float4* translation, const Quaternion* orientation)\n" - "{\n" - " return qtRotate( *orientation, *p ) + (*translation);\n" - "}\n" - "__inline\n" - "float4 normalize3(const float4 a)\n" - "{\n" - " float4 n = make_float4(a.x, a.y, a.z, 0.f);\n" - " return fastNormalize4( n );\n" - "}\n" - "inline void projectLocal(const ConvexPolyhedronCL* hull, const float4 pos, const float4 orn, \n" - "const float4* dir, const float4* vertices, float* min, float* max)\n" - "{\n" - " min[0] = FLT_MAX;\n" - " max[0] = -FLT_MAX;\n" - " int numVerts = hull->m_numVertices;\n" - " const float4 localDir = qtInvRotate(orn,*dir);\n" - " float offset = dot(pos,*dir);\n" - " for(int i=0;im_vertexOffset+i],localDir);\n" - " if(dp < min[0]) \n" - " min[0] = dp;\n" - " if(dp > max[0]) \n" - " max[0] = dp;\n" - " }\n" - " if(min[0]>max[0])\n" - " {\n" - " float tmp = min[0];\n" - " min[0] = max[0];\n" - " max[0] = tmp;\n" - " }\n" - " min[0] += offset;\n" - " max[0] += offset;\n" - "}\n" - "inline void project(__global const ConvexPolyhedronCL* hull, const float4 pos, const float4 orn, \n" - "const float4* dir, __global const float4* vertices, float* min, float* max)\n" - "{\n" - " min[0] = FLT_MAX;\n" - " max[0] = -FLT_MAX;\n" - " int numVerts = hull->m_numVertices;\n" - " const float4 localDir = qtInvRotate(orn,*dir);\n" - " float offset = dot(pos,*dir);\n" - " for(int i=0;im_vertexOffset+i],localDir);\n" - " if(dp < min[0]) \n" - " min[0] = dp;\n" - " if(dp > max[0]) \n" - " max[0] = dp;\n" - " }\n" - " if(min[0]>max[0])\n" - " {\n" - " float tmp = min[0];\n" - " min[0] = max[0];\n" - " max[0] = tmp;\n" - " }\n" - " min[0] += offset;\n" - " max[0] += offset;\n" - "}\n" - "inline bool TestSepAxisLocalA(const ConvexPolyhedronCL* hullA, __global const ConvexPolyhedronCL* hullB, \n" - " const float4 posA,const float4 ornA,\n" - " const float4 posB,const float4 ornB,\n" - " float4* sep_axis, const float4* verticesA, __global const float4* verticesB,float* depth)\n" - "{\n" - " float Min0,Max0;\n" - " float Min1,Max1;\n" - " projectLocal(hullA,posA,ornA,sep_axis,verticesA, &Min0, &Max0);\n" - " project(hullB,posB,ornB, sep_axis,verticesB, &Min1, &Max1);\n" - " if(Max01e-6f || fabs(v.y)>1e-6f || fabs(v.z)>1e-6f)\n" - " return false;\n" - " return true;\n" - "}\n" - "bool findSeparatingAxisLocalA( const ConvexPolyhedronCL* hullA, __global const ConvexPolyhedronCL* hullB, \n" - " const float4 posA1,\n" - " const float4 ornA,\n" - " const float4 posB1,\n" - " const float4 ornB,\n" - " const float4 DeltaC2,\n" - " \n" - " const float4* verticesA, \n" - " const float4* uniqueEdgesA, \n" - " const btGpuFace* facesA,\n" - " const int* indicesA,\n" - " __global const float4* verticesB, \n" - " __global const float4* uniqueEdgesB, \n" - " __global const btGpuFace* facesB,\n" - " __global const int* indicesB,\n" - " float4* sep,\n" - " float* dmin)\n" - "{\n" - " \n" - " float4 posA = posA1;\n" - " posA.w = 0.f;\n" - " float4 posB = posB1;\n" - " posB.w = 0.f;\n" - " int curPlaneTests=0;\n" - " {\n" - " int numFacesA = hullA->m_numFaces;\n" - " // Test normals from hullA\n" - " for(int i=0;im_faceOffset+i].m_plane;\n" - " float4 faceANormalWS = qtRotate(ornA,normal);\n" - " if (dot3F4(DeltaC2,faceANormalWS)<0)\n" - " faceANormalWS*=-1.f;\n" - " curPlaneTests++;\n" - " float d;\n" - " if(!TestSepAxisLocalA( hullA, hullB, posA,ornA,posB,ornB,&faceANormalWS, verticesA, verticesB,&d))\n" - " return false;\n" - " if(d<*dmin)\n" - " {\n" - " *dmin = d;\n" - " *sep = faceANormalWS;\n" - " }\n" - " }\n" - " }\n" - " if((dot3F4(-DeltaC2,*sep))>0.0f)\n" - " {\n" - " *sep = -(*sep);\n" - " }\n" - " return true;\n" - "}\n" - "bool findSeparatingAxisLocalB( __global const ConvexPolyhedronCL* hullA, const ConvexPolyhedronCL* hullB, \n" - " const float4 posA1,\n" - " const float4 ornA,\n" - " const float4 posB1,\n" - " const float4 ornB,\n" - " const float4 DeltaC2,\n" - " __global const float4* verticesA, \n" - " __global const float4* uniqueEdgesA, \n" - " __global const btGpuFace* facesA,\n" - " __global const int* indicesA,\n" - " const float4* verticesB,\n" - " const float4* uniqueEdgesB, \n" - " const btGpuFace* facesB,\n" - " const int* indicesB,\n" - " float4* sep,\n" - " float* dmin)\n" - "{\n" - " float4 posA = posA1;\n" - " posA.w = 0.f;\n" - " float4 posB = posB1;\n" - " posB.w = 0.f;\n" - " int curPlaneTests=0;\n" - " {\n" - " int numFacesA = hullA->m_numFaces;\n" - " // Test normals from hullA\n" - " for(int i=0;im_faceOffset+i].m_plane;\n" - " float4 faceANormalWS = qtRotate(ornA,normal);\n" - " if (dot3F4(DeltaC2,faceANormalWS)<0)\n" - " faceANormalWS *= -1.f;\n" - " curPlaneTests++;\n" - " float d;\n" - " if(!TestSepAxisLocalA( hullB, hullA, posB,ornB,posA,ornA, &faceANormalWS, verticesB,verticesA, &d))\n" - " return false;\n" - " if(d<*dmin)\n" - " {\n" - " *dmin = d;\n" - " *sep = faceANormalWS;\n" - " }\n" - " }\n" - " }\n" - " if((dot3F4(-DeltaC2,*sep))>0.0f)\n" - " {\n" - " *sep = -(*sep);\n" - " }\n" - " return true;\n" - "}\n" - "bool findSeparatingAxisEdgeEdgeLocalA( const ConvexPolyhedronCL* hullA, __global const ConvexPolyhedronCL* hullB, \n" - " const float4 posA1,\n" - " const float4 ornA,\n" - " const float4 posB1,\n" - " const float4 ornB,\n" - " const float4 DeltaC2,\n" - " const float4* verticesA, \n" - " const float4* uniqueEdgesA, \n" - " const btGpuFace* facesA,\n" - " const int* indicesA,\n" - " __global const float4* verticesB, \n" - " __global const float4* uniqueEdgesB, \n" - " __global const btGpuFace* facesB,\n" - " __global const int* indicesB,\n" - " float4* sep,\n" - " float* dmin)\n" - "{\n" - " float4 posA = posA1;\n" - " posA.w = 0.f;\n" - " float4 posB = posB1;\n" - " posB.w = 0.f;\n" - " int curPlaneTests=0;\n" - " int curEdgeEdge = 0;\n" - " // Test edges\n" - " for(int e0=0;e0m_numUniqueEdges;e0++)\n" - " {\n" - " const float4 edge0 = uniqueEdgesA[hullA->m_uniqueEdgesOffset+e0];\n" - " float4 edge0World = qtRotate(ornA,edge0);\n" - " for(int e1=0;e1m_numUniqueEdges;e1++)\n" - " {\n" - " const float4 edge1 = uniqueEdgesB[hullB->m_uniqueEdgesOffset+e1];\n" - " float4 edge1World = qtRotate(ornB,edge1);\n" - " float4 crossje = cross3(edge0World,edge1World);\n" - " curEdgeEdge++;\n" - " if(!IsAlmostZero(crossje))\n" - " {\n" - " crossje = normalize3(crossje);\n" - " if (dot3F4(DeltaC2,crossje)<0)\n" - " crossje *= -1.f;\n" - " float dist;\n" - " bool result = true;\n" - " {\n" - " float Min0,Max0;\n" - " float Min1,Max1;\n" - " projectLocal(hullA,posA,ornA,&crossje,verticesA, &Min0, &Max0);\n" - " project(hullB,posB,ornB,&crossje,verticesB, &Min1, &Max1);\n" - " \n" - " if(Max00.0f)\n" - " {\n" - " *sep = -(*sep);\n" - " }\n" - " return true;\n" - "}\n" - "inline bool TestSepAxis(__global const ConvexPolyhedronCL* hullA, __global const ConvexPolyhedronCL* hullB, \n" - " const float4 posA,const float4 ornA,\n" - " const float4 posB,const float4 ornB,\n" - " float4* sep_axis, __global const float4* vertices,float* depth)\n" - "{\n" - " float Min0,Max0;\n" - " float Min1,Max1;\n" - " project(hullA,posA,ornA,sep_axis,vertices, &Min0, &Max0);\n" - " project(hullB,posB,ornB, sep_axis,vertices, &Min1, &Max1);\n" - " if(Max0m_numFaces;\n" - " // Test normals from hullA\n" - " for(int i=0;im_faceOffset+i].m_plane;\n" - " float4 faceANormalWS = qtRotate(ornA,normal);\n" - " \n" - " if (dot3F4(DeltaC2,faceANormalWS)<0)\n" - " faceANormalWS*=-1.f;\n" - " \n" - " curPlaneTests++;\n" - " \n" - " float d;\n" - " if(!TestSepAxis( hullA, hullB, posA,ornA,posB,ornB,&faceANormalWS, vertices,&d))\n" - " return false;\n" - " \n" - " if(d<*dmin)\n" - " {\n" - " *dmin = d;\n" - " *sep = faceANormalWS;\n" - " }\n" - " }\n" - " }\n" - " if((dot3F4(-DeltaC2,*sep))>0.0f)\n" - " {\n" - " *sep = -(*sep);\n" - " }\n" - " \n" - " return true;\n" - "}\n" - "bool findSeparatingAxisUnitSphere( __global const ConvexPolyhedronCL* hullA, __global const ConvexPolyhedronCL* hullB, \n" - " const float4 posA1,\n" - " const float4 ornA,\n" - " const float4 posB1,\n" - " const float4 ornB,\n" - " const float4 DeltaC2,\n" - " __global const float4* vertices,\n" - " __global const float4* unitSphereDirections,\n" - " int numUnitSphereDirections,\n" - " float4* sep,\n" - " float* dmin)\n" - "{\n" - " \n" - " float4 posA = posA1;\n" - " posA.w = 0.f;\n" - " float4 posB = posB1;\n" - " posB.w = 0.f;\n" - " int curPlaneTests=0;\n" - " int curEdgeEdge = 0;\n" - " // Test unit sphere directions\n" - " for (int i=0;i0)\n" - " crossje *= -1.f;\n" - " {\n" - " float dist;\n" - " bool result = true;\n" - " float Min0,Max0;\n" - " float Min1,Max1;\n" - " project(hullA,posA,ornA,&crossje,vertices, &Min0, &Max0);\n" - " project(hullB,posB,ornB,&crossje,vertices, &Min1, &Max1);\n" - " \n" - " if(Max00.0f)\n" - " {\n" - " *sep = -(*sep);\n" - " }\n" - " return true;\n" - "}\n" - "bool findSeparatingAxisEdgeEdge( __global const ConvexPolyhedronCL* hullA, __global const ConvexPolyhedronCL* hullB, \n" - " const float4 posA1,\n" - " const float4 ornA,\n" - " const float4 posB1,\n" - " const float4 ornB,\n" - " const float4 DeltaC2,\n" - " __global const float4* vertices, \n" - " __global const float4* uniqueEdges, \n" - " __global const btGpuFace* faces,\n" - " __global const int* indices,\n" - " float4* sep,\n" - " float* dmin)\n" - "{\n" - " \n" - " float4 posA = posA1;\n" - " posA.w = 0.f;\n" - " float4 posB = posB1;\n" - " posB.w = 0.f;\n" - " int curPlaneTests=0;\n" - " int curEdgeEdge = 0;\n" - " // Test edges\n" - " for(int e0=0;e0m_numUniqueEdges;e0++)\n" - " {\n" - " const float4 edge0 = uniqueEdges[hullA->m_uniqueEdgesOffset+e0];\n" - " float4 edge0World = qtRotate(ornA,edge0);\n" - " for(int e1=0;e1m_numUniqueEdges;e1++)\n" - " {\n" - " const float4 edge1 = uniqueEdges[hullB->m_uniqueEdgesOffset+e1];\n" - " float4 edge1World = qtRotate(ornB,edge1);\n" - " float4 crossje = cross3(edge0World,edge1World);\n" - " curEdgeEdge++;\n" - " if(!IsAlmostZero(crossje))\n" - " {\n" - " crossje = normalize3(crossje);\n" - " if (dot3F4(DeltaC2,crossje)<0)\n" - " crossje*=-1.f;\n" - " \n" - " float dist;\n" - " bool result = true;\n" - " {\n" - " float Min0,Max0;\n" - " float Min1,Max1;\n" - " project(hullA,posA,ornA,&crossje,vertices, &Min0, &Max0);\n" - " project(hullB,posB,ornB,&crossje,vertices, &Min1, &Max1);\n" - " \n" - " if(Max00.0f)\n" - " {\n" - " *sep = -(*sep);\n" - " }\n" - " return true;\n" - "}\n" - "// work-in-progress\n" - "__kernel void processCompoundPairsKernel( __global const int4* gpuCompoundPairs,\n" - " __global const BodyData* rigidBodies, \n" - " __global const btCollidableGpu* collidables,\n" - " __global const ConvexPolyhedronCL* convexShapes, \n" - " __global const float4* vertices,\n" - " __global const float4* uniqueEdges,\n" - " __global const btGpuFace* faces,\n" - " __global const int* indices,\n" - " __global btAabbCL* aabbs,\n" - " __global const btGpuChildShape* gpuChildShapes,\n" - " __global volatile float4* gpuCompoundSepNormalsOut,\n" - " __global volatile int* gpuHasCompoundSepNormalsOut,\n" - " int numCompoundPairs\n" - " )\n" - "{\n" - " int i = get_global_id(0);\n" - " if (i= 0)\n" - " {\n" - " collidableIndexA = gpuChildShapes[childShapeIndexA].m_shapeIndex;\n" - " float4 childPosA = gpuChildShapes[childShapeIndexA].m_childPosition;\n" - " float4 childOrnA = gpuChildShapes[childShapeIndexA].m_childOrientation;\n" - " float4 newPosA = qtRotate(ornA,childPosA)+posA;\n" - " float4 newOrnA = qtMul(ornA,childOrnA);\n" - " posA = newPosA;\n" - " ornA = newOrnA;\n" - " } else\n" - " {\n" - " collidableIndexA = rigidBodies[bodyIndexA].m_collidableIdx;\n" - " }\n" - " \n" - " if (childShapeIndexB>=0)\n" - " {\n" - " collidableIndexB = gpuChildShapes[childShapeIndexB].m_shapeIndex;\n" - " float4 childPosB = gpuChildShapes[childShapeIndexB].m_childPosition;\n" - " float4 childOrnB = gpuChildShapes[childShapeIndexB].m_childOrientation;\n" - " float4 newPosB = transform(&childPosB,&posB,&ornB);\n" - " float4 newOrnB = qtMul(ornB,childOrnB);\n" - " posB = newPosB;\n" - " ornB = newOrnB;\n" - " } else\n" - " {\n" - " collidableIndexB = rigidBodies[bodyIndexB].m_collidableIdx; \n" - " }\n" - " \n" - " gpuHasCompoundSepNormalsOut[i] = 0;\n" - " \n" - " int shapeIndexA = collidables[collidableIndexA].m_shapeIndex;\n" - " int shapeIndexB = collidables[collidableIndexB].m_shapeIndex;\n" - " \n" - " int shapeTypeA = collidables[collidableIndexA].m_shapeType;\n" - " int shapeTypeB = collidables[collidableIndexB].m_shapeType;\n" - " \n" - " if ((shapeTypeA != SHAPE_CONVEX_HULL) || (shapeTypeB != SHAPE_CONVEX_HULL))\n" - " {\n" - " return;\n" - " }\n" - " int hasSeparatingAxis = 5;\n" - " \n" - " int numFacesA = convexShapes[shapeIndexA].m_numFaces;\n" - " float dmin = FLT_MAX;\n" - " posA.w = 0.f;\n" - " posB.w = 0.f;\n" - " float4 c0local = convexShapes[shapeIndexA].m_localCenter;\n" - " float4 c0 = transform(&c0local, &posA, &ornA);\n" - " float4 c1local = convexShapes[shapeIndexB].m_localCenter;\n" - " float4 c1 = transform(&c1local,&posB,&ornB);\n" - " const float4 DeltaC2 = c0 - c1;\n" - " float4 sepNormal = make_float4(1,0,0,0);\n" - " bool sepA = findSeparatingAxis( &convexShapes[shapeIndexA], &convexShapes[shapeIndexB],posA,ornA,posB,ornB,DeltaC2,vertices,uniqueEdges,faces,indices,&sepNormal,&dmin);\n" - " hasSeparatingAxis = 4;\n" - " if (!sepA)\n" - " {\n" - " hasSeparatingAxis = 0;\n" - " } else\n" - " {\n" - " bool sepB = findSeparatingAxis( &convexShapes[shapeIndexB],&convexShapes[shapeIndexA],posB,ornB,posA,ornA,DeltaC2,vertices,uniqueEdges,faces,indices,&sepNormal,&dmin);\n" - " if (!sepB)\n" - " {\n" - " hasSeparatingAxis = 0;\n" - " } else//(!sepB)\n" - " {\n" - " bool sepEE = findSeparatingAxisEdgeEdge( &convexShapes[shapeIndexA], &convexShapes[shapeIndexB],posA,ornA,posB,ornB,DeltaC2,vertices,uniqueEdges,faces,indices,&sepNormal,&dmin);\n" - " if (sepEE)\n" - " {\n" - " gpuCompoundSepNormalsOut[i] = sepNormal;//fastNormalize4(sepNormal);\n" - " gpuHasCompoundSepNormalsOut[i] = 1;\n" - " }//sepEE\n" - " }//(!sepB)\n" - " }//(!sepA)\n" - " \n" - " \n" - " }\n" - " \n" - "}\n" - "inline b3Float4 MyUnQuantize(const unsigned short* vecIn, b3Float4 quantization, b3Float4 bvhAabbMin)\n" - "{\n" - " b3Float4 vecOut;\n" - " vecOut = b3MakeFloat4(\n" - " (float)(vecIn[0]) / (quantization.x),\n" - " (float)(vecIn[1]) / (quantization.y),\n" - " (float)(vecIn[2]) / (quantization.z),\n" - " 0.f);\n" - " vecOut += bvhAabbMin;\n" - " return vecOut;\n" - "}\n" - "inline b3Float4 MyUnQuantizeGlobal(__global const unsigned short* vecIn, b3Float4 quantization, b3Float4 bvhAabbMin)\n" - "{\n" - " b3Float4 vecOut;\n" - " vecOut = b3MakeFloat4(\n" - " (float)(vecIn[0]) / (quantization.x),\n" - " (float)(vecIn[1]) / (quantization.y),\n" - " (float)(vecIn[2]) / (quantization.z),\n" - " 0.f);\n" - " vecOut += bvhAabbMin;\n" - " return vecOut;\n" - "}\n" - "// work-in-progress\n" - "__kernel void findCompoundPairsKernel( __global const int4* pairs, \n" - " __global const BodyData* rigidBodies, \n" - " __global const btCollidableGpu* collidables,\n" - " __global const ConvexPolyhedronCL* convexShapes, \n" - " __global const float4* vertices,\n" - " __global const float4* uniqueEdges,\n" - " __global const btGpuFace* faces,\n" - " __global const int* indices,\n" - " __global b3Aabb_t* aabbLocalSpace,\n" - " __global const btGpuChildShape* gpuChildShapes,\n" - " __global volatile int4* gpuCompoundPairsOut,\n" - " __global volatile int* numCompoundPairsOut,\n" - " __global const b3BvhSubtreeInfo* subtrees,\n" - " __global const b3QuantizedBvhNode* quantizedNodes,\n" - " __global const b3BvhInfo* bvhInfos,\n" - " int numPairs,\n" - " int maxNumCompoundPairsCapacity\n" - " )\n" - "{\n" - " int i = get_global_id(0);\n" - " if (imaxStackDepth && !(isLeafA && isLeafB))\n" - " {\n" - " //printf(\"Error: traversal exceeded maxStackDepth\");\n" - " continue;\n" - " }\n" - " if(isInternalA)\n" - " {\n" - " int nodeAleftChild = node.x+1;\n" - " bool isNodeALeftChildLeaf = isLeafNodeGlobal(&quantizedNodes[node.x+1]);\n" - " int nodeArightChild = isNodeALeftChildLeaf? node.x+2 : node.x+1 + getEscapeIndexGlobal(&quantizedNodes[node.x+1]);\n" - " if(isInternalB)\n" - " { \n" - " int nodeBleftChild = node.y+1;\n" - " bool isNodeBLeftChildLeaf = isLeafNodeGlobal(&quantizedNodes[node.y+1]);\n" - " int nodeBrightChild = isNodeBLeftChildLeaf? node.y+2 : node.y+1 + getEscapeIndexGlobal(&quantizedNodes[node.y+1]);\n" - " nodeStack[depth++] = b3MakeInt2(nodeAleftChild, nodeBleftChild);\n" - " nodeStack[depth++] = b3MakeInt2(nodeArightChild, nodeBleftChild);\n" - " nodeStack[depth++] = b3MakeInt2(nodeAleftChild, nodeBrightChild);\n" - " nodeStack[depth++] = b3MakeInt2(nodeArightChild, nodeBrightChild);\n" - " }\n" - " else\n" - " {\n" - " nodeStack[depth++] = b3MakeInt2(nodeAleftChild,node.y);\n" - " nodeStack[depth++] = b3MakeInt2(nodeArightChild,node.y);\n" - " }\n" - " }\n" - " else\n" - " {\n" - " if(isInternalB)\n" - " {\n" - " int nodeBleftChild = node.y+1;\n" - " bool isNodeBLeftChildLeaf = isLeafNodeGlobal(&quantizedNodes[node.y+1]);\n" - " int nodeBrightChild = isNodeBLeftChildLeaf? node.y+2 : node.y+1 + getEscapeIndexGlobal(&quantizedNodes[node.y+1]);\n" - " nodeStack[depth++] = b3MakeInt2(node.x,nodeBleftChild);\n" - " nodeStack[depth++] = b3MakeInt2(node.x,nodeBrightChild);\n" - " }\n" - " else\n" - " {\n" - " int compoundPairIdx = atomic_inc(numCompoundPairsOut);\n" - " if (compoundPairIdxm_numFaces;face++)\n" - " {\n" - " const float4 Normal = make_float4(facesB[hullB->m_faceOffset+face].m_plane.x,\n" - " facesB[hullB->m_faceOffset+face].m_plane.y, facesB[hullB->m_faceOffset+face].m_plane.z,0.f);\n" - " const float4 WorldNormal = qtRotate(ornB, Normal);\n" - " float d = dot3F4(WorldNormal,separatingNormal);\n" - " if (d > dmax)\n" - " {\n" - " dmax = d;\n" - " closestFaceB = face;\n" - " }\n" - " }\n" - " }\n" - " \n" - " {\n" - " const btGpuFace polyB = facesB[hullB->m_faceOffset+closestFaceB];\n" - " int numVertices = polyB.m_numIndices;\n" - " if (numVertices>capacityWorldVerts)\n" - " numVertices = capacityWorldVerts;\n" - " \n" - " for(int e0=0;e0m_vertexOffset+indicesB[polyB.m_indexOffset+e0]];\n" - " worldVertsB1[pairIndex*capacityWorldVerts+numWorldVertsB1++] = transform(&b,&posB,&ornB);\n" - " }\n" - " }\n" - " }\n" - " \n" - " int closestFaceA=0;\n" - " {\n" - " float dmin = FLT_MAX;\n" - " for(int face=0;facem_numFaces;face++)\n" - " {\n" - " const float4 Normal = make_float4(\n" - " facesA[hullA->m_faceOffset+face].m_plane.x,\n" - " facesA[hullA->m_faceOffset+face].m_plane.y,\n" - " facesA[hullA->m_faceOffset+face].m_plane.z,\n" - " 0.f);\n" - " const float4 faceANormalWS = qtRotate(ornA,Normal);\n" - " \n" - " float d = dot3F4(faceANormalWS,separatingNormal);\n" - " if (d < dmin)\n" - " {\n" - " dmin = d;\n" - " closestFaceA = face;\n" - " worldNormalsA1[pairIndex] = faceANormalWS;\n" - " }\n" - " }\n" - " }\n" - " \n" - " int numVerticesA = facesA[hullA->m_faceOffset+closestFaceA].m_numIndices;\n" - " if (numVerticesA>capacityWorldVerts)\n" - " numVerticesA = capacityWorldVerts;\n" - " \n" - " for(int e0=0;e0m_vertexOffset+indicesA[facesA[hullA->m_faceOffset+closestFaceA].m_indexOffset+e0]];\n" - " worldVertsA1[pairIndex*capacityWorldVerts+e0] = transform(&a, &posA,&ornA);\n" - " }\n" - " }\n" - " \n" - " clippingFaces[pairIndex].x = closestFaceA;\n" - " clippingFaces[pairIndex].y = closestFaceB;\n" - " clippingFaces[pairIndex].z = numVerticesA;\n" - " clippingFaces[pairIndex].w = numWorldVertsB1;\n" - " \n" - " \n" - " return numContactsOut;\n" - "}\n" - "// work-in-progress\n" - "__kernel void findConcaveSeparatingAxisKernel( __global int4* concavePairs,\n" - " __global const BodyData* rigidBodies,\n" - " __global const btCollidableGpu* collidables,\n" - " __global const ConvexPolyhedronCL* convexShapes, \n" - " __global const float4* vertices,\n" - " __global const float4* uniqueEdges,\n" - " __global const btGpuFace* faces,\n" - " __global const int* indices,\n" - " __global const btGpuChildShape* gpuChildShapes,\n" - " __global btAabbCL* aabbs,\n" - " __global float4* concaveSeparatingNormalsOut,\n" - " __global int* concaveHasSeparatingNormals,\n" - " __global int4* clippingFacesOut,\n" - " __global float4* worldVertsA1GPU,\n" - " __global float4* worldNormalsAGPU,\n" - " __global float4* worldVertsB1GPU,\n" - " int vertexFaceCapacity,\n" - " int numConcavePairs\n" - " )\n" - "{\n" - " int i = get_global_id(0);\n" - " if (i>=numConcavePairs)\n" - " return;\n" - " concaveHasSeparatingNormals[i] = 0;\n" - " int pairIdx = i;\n" - " int bodyIndexA = concavePairs[i].x;\n" - " int bodyIndexB = concavePairs[i].y;\n" - " int collidableIndexA = rigidBodies[bodyIndexA].m_collidableIdx;\n" - " int collidableIndexB = rigidBodies[bodyIndexB].m_collidableIdx;\n" - " int shapeIndexA = collidables[collidableIndexA].m_shapeIndex;\n" - " int shapeIndexB = collidables[collidableIndexB].m_shapeIndex;\n" - " if (collidables[collidableIndexB].m_shapeType!=SHAPE_CONVEX_HULL&&\n" - " collidables[collidableIndexB].m_shapeType!=SHAPE_COMPOUND_OF_CONVEX_HULLS)\n" - " {\n" - " concavePairs[pairIdx].w = -1;\n" - " return;\n" - " }\n" - " int numFacesA = convexShapes[shapeIndexA].m_numFaces;\n" - " int numActualConcaveConvexTests = 0;\n" - " \n" - " int f = concavePairs[i].z;\n" - " \n" - " bool overlap = false;\n" - " \n" - " ConvexPolyhedronCL convexPolyhedronA;\n" - " //add 3 vertices of the triangle\n" - " convexPolyhedronA.m_numVertices = 3;\n" - " convexPolyhedronA.m_vertexOffset = 0;\n" - " float4 localCenter = make_float4(0.f,0.f,0.f,0.f);\n" - " btGpuFace face = faces[convexShapes[shapeIndexA].m_faceOffset+f];\n" - " float4 triMinAabb, triMaxAabb;\n" - " btAabbCL triAabb;\n" - " triAabb.m_min = make_float4(1e30f,1e30f,1e30f,0.f);\n" - " triAabb.m_max = make_float4(-1e30f,-1e30f,-1e30f,0.f);\n" - " \n" - " float4 verticesA[3];\n" - " for (int i=0;i<3;i++)\n" - " {\n" - " int index = indices[face.m_indexOffset+i];\n" - " float4 vert = vertices[convexShapes[shapeIndexA].m_vertexOffset+index];\n" - " verticesA[i] = vert;\n" - " localCenter += vert;\n" - " \n" - " triAabb.m_min = min(triAabb.m_min,vert); \n" - " triAabb.m_max = max(triAabb.m_max,vert); \n" - " }\n" - " overlap = true;\n" - " overlap = (triAabb.m_min.x > aabbs[bodyIndexB].m_max.x || triAabb.m_max.x < aabbs[bodyIndexB].m_min.x) ? false : overlap;\n" - " overlap = (triAabb.m_min.z > aabbs[bodyIndexB].m_max.z || triAabb.m_max.z < aabbs[bodyIndexB].m_min.z) ? false : overlap;\n" - " overlap = (triAabb.m_min.y > aabbs[bodyIndexB].m_max.y || triAabb.m_max.y < aabbs[bodyIndexB].m_min.y) ? false : overlap;\n" - " \n" - " if (overlap)\n" - " {\n" - " float dmin = FLT_MAX;\n" - " int hasSeparatingAxis=5;\n" - " float4 sepAxis=make_float4(1,2,3,4);\n" - " int localCC=0;\n" - " numActualConcaveConvexTests++;\n" - " //a triangle has 3 unique edges\n" - " convexPolyhedronA.m_numUniqueEdges = 3;\n" - " convexPolyhedronA.m_uniqueEdgesOffset = 0;\n" - " float4 uniqueEdgesA[3];\n" - " \n" - " uniqueEdgesA[0] = (verticesA[1]-verticesA[0]);\n" - " uniqueEdgesA[1] = (verticesA[2]-verticesA[1]);\n" - " uniqueEdgesA[2] = (verticesA[0]-verticesA[2]);\n" - " convexPolyhedronA.m_faceOffset = 0;\n" - " \n" - " float4 normal = make_float4(face.m_plane.x,face.m_plane.y,face.m_plane.z,0.f);\n" - " \n" - " btGpuFace facesA[TRIANGLE_NUM_CONVEX_FACES];\n" - " int indicesA[3+3+2+2+2];\n" - " int curUsedIndices=0;\n" - " int fidx=0;\n" - " //front size of triangle\n" - " {\n" - " facesA[fidx].m_indexOffset=curUsedIndices;\n" - " indicesA[0] = 0;\n" - " indicesA[1] = 1;\n" - " indicesA[2] = 2;\n" - " curUsedIndices+=3;\n" - " float c = face.m_plane.w;\n" - " facesA[fidx].m_plane.x = normal.x;\n" - " facesA[fidx].m_plane.y = normal.y;\n" - " facesA[fidx].m_plane.z = normal.z;\n" - " facesA[fidx].m_plane.w = c;\n" - " facesA[fidx].m_numIndices=3;\n" - " }\n" - " fidx++;\n" - " //back size of triangle\n" - " {\n" - " facesA[fidx].m_indexOffset=curUsedIndices;\n" - " indicesA[3]=2;\n" - " indicesA[4]=1;\n" - " indicesA[5]=0;\n" - " curUsedIndices+=3;\n" - " float c = dot(normal,verticesA[0]);\n" - " float c1 = -face.m_plane.w;\n" - " facesA[fidx].m_plane.x = -normal.x;\n" - " facesA[fidx].m_plane.y = -normal.y;\n" - " facesA[fidx].m_plane.z = -normal.z;\n" - " facesA[fidx].m_plane.w = c;\n" - " facesA[fidx].m_numIndices=3;\n" - " }\n" - " fidx++;\n" - " bool addEdgePlanes = true;\n" - " if (addEdgePlanes)\n" - " {\n" - " int numVertices=3;\n" - " int prevVertex = numVertices-1;\n" - " for (int i=0;i -#include -#include -#include -*/ - -#include "b3OpenCLArray.h" -#include "b3FillCL.h" -#include "b3RadixSort32CL.h" //for b3SortData (perhaps move it?) -class b3BoundSearchCL -{ -public: - enum Option - { - BOUND_LOWER, - BOUND_UPPER, - COUNT, - }; - - cl_context m_context; - cl_device_id m_device; - cl_command_queue m_queue; - - cl_kernel m_lowerSortDataKernel; - cl_kernel m_upperSortDataKernel; - cl_kernel m_subtractKernel; - - b3OpenCLArray* m_constbtOpenCLArray; - b3OpenCLArray* m_lower; - b3OpenCLArray* m_upper; - - b3FillCL* m_filler; - - b3BoundSearchCL(cl_context context, cl_device_id device, cl_command_queue queue, int size); - - virtual ~b3BoundSearchCL(); - - // src has to be src[i].m_key <= src[i+1].m_key - void execute(b3OpenCLArray& src, int nSrc, b3OpenCLArray& dst, int nDst, Option option = BOUND_LOWER); - - void executeHost(b3AlignedObjectArray& src, int nSrc, b3AlignedObjectArray& dst, int nDst, Option option = BOUND_LOWER); -}; - -#endif //B3_BOUNDSEARCH_H diff --git a/engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/b3BufferInfoCL.h b/engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/b3BufferInfoCL.h deleted file mode 100644 index 35fc467b..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/b3BufferInfoCL.h +++ /dev/null @@ -1,18 +0,0 @@ - -#ifndef B3_BUFFER_INFO_CL_H -#define B3_BUFFER_INFO_CL_H - -#include "b3OpenCLArray.h" - -struct b3BufferInfoCL -{ - //b3BufferInfoCL(){} - - // template - b3BufferInfoCL(cl_mem buff, bool isReadOnly = false) : m_clBuffer(buff), m_isReadOnly(isReadOnly) {} - - cl_mem m_clBuffer; - bool m_isReadOnly; -}; - -#endif //B3_BUFFER_INFO_CL_H diff --git a/engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/b3FillCL.h b/engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/b3FillCL.h deleted file mode 100644 index c92c3e51..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/b3FillCL.h +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef B3_FILL_CL_H -#define B3_FILL_CL_H - -#include "b3OpenCLArray.h" -#include "Bullet3Common/b3Scalar.h" - -#include "Bullet3Common/shared/b3Int2.h" -#include "Bullet3Common/shared/b3Int4.h" - -class b3FillCL -{ - cl_command_queue m_commandQueue; - - cl_kernel m_fillKernelInt2; - cl_kernel m_fillIntKernel; - cl_kernel m_fillUnsignedIntKernel; - cl_kernel m_fillFloatKernel; - -public: - struct b3ConstData - { - union { - b3Int4 m_data; - b3UnsignedInt4 m_UnsignedData; - }; - int m_offset; - int m_n; - int m_padding[2]; - }; - -protected: -public: - b3FillCL(cl_context ctx, cl_device_id device, cl_command_queue queue); - - virtual ~b3FillCL(); - - void execute(b3OpenCLArray& src, const unsigned int value, int n, int offset = 0); - - void execute(b3OpenCLArray& src, const int value, int n, int offset = 0); - - void execute(b3OpenCLArray& src, const float value, int n, int offset = 0); - - void execute(b3OpenCLArray& src, const b3Int2& value, int n, int offset = 0); - - void executeHost(b3AlignedObjectArray& src, const b3Int2& value, int n, int offset); - - void executeHost(b3AlignedObjectArray& src, const int value, int n, int offset); - - // void execute(b3OpenCLArray& src, const b3Int4& value, int n, int offset = 0); -}; - -#endif //B3_FILL_CL_H diff --git a/engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/b3LauncherCL.h b/engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/b3LauncherCL.h deleted file mode 100644 index 18e9c1db..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/b3LauncherCL.h +++ /dev/null @@ -1,128 +0,0 @@ - -#ifndef B3_LAUNCHER_CL_H -#define B3_LAUNCHER_CL_H - -#include "b3BufferInfoCL.h" -#include "Bullet3Common/b3MinMax.h" -#include "b3OpenCLArray.h" -#include - -#define B3_DEBUG_SERIALIZE_CL - -#ifdef _WIN32 -#pragma warning(disable : 4996) -#endif -#define B3_CL_MAX_ARG_SIZE 16 -B3_ATTRIBUTE_ALIGNED16(struct) -b3KernelArgData -{ - int m_isBuffer; - int m_argIndex; - int m_argSizeInBytes; - int m_unusedPadding; - union { - cl_mem m_clBuffer; - unsigned char m_argData[B3_CL_MAX_ARG_SIZE]; - }; -}; - -class b3LauncherCL -{ - cl_command_queue m_commandQueue; - cl_kernel m_kernel; - int m_idx; - - b3AlignedObjectArray m_kernelArguments; - int m_serializationSizeInBytes; - bool m_enableSerialization; - - const char* m_name; - -public: - b3AlignedObjectArray*> m_arrays; - - b3LauncherCL(cl_command_queue queue, cl_kernel kernel, const char* name); - - virtual ~b3LauncherCL(); - - void setBuffer(cl_mem clBuffer); - - void setBuffers(b3BufferInfoCL* buffInfo, int n); - - int getSerializationBufferSize() const - { - return m_serializationSizeInBytes; - } - - int deserializeArgs(unsigned char* buf, int bufSize, cl_context ctx); - - inline int validateResults(unsigned char* goldBuffer, int goldBufferCapacity, cl_context ctx); - - int serializeArguments(unsigned char* destBuffer, int destBufferCapacity); - - int getNumArguments() const - { - return m_kernelArguments.size(); - } - - b3KernelArgData getArgument(int index) - { - return m_kernelArguments[index]; - } - - void serializeToFile(const char* fileName, int numWorkItems); - - template - inline void setConst(const T& consts) - { - int sz = sizeof(T); - b3Assert(sz <= B3_CL_MAX_ARG_SIZE); - - if (m_enableSerialization) - { - b3KernelArgData kernelArg; - kernelArg.m_argIndex = m_idx; - kernelArg.m_isBuffer = 0; - T* destArg = (T*)kernelArg.m_argData; - *destArg = consts; - kernelArg.m_argSizeInBytes = sizeof(T); - m_kernelArguments.push_back(kernelArg); - m_serializationSizeInBytes += sizeof(b3KernelArgData); - } - - cl_int status = clSetKernelArg(m_kernel, m_idx++, sz, &consts); - b3Assert(status == CL_SUCCESS); - } - - inline void launch1D(int numThreads, int localSize = 64) - { - launch2D(numThreads, 1, localSize, 1); - } - - inline void launch2D(int numThreadsX, int numThreadsY, int localSizeX, int localSizeY) - { - size_t gRange[3] = {1, 1, 1}; - size_t lRange[3] = {1, 1, 1}; - lRange[0] = localSizeX; - lRange[1] = localSizeY; - gRange[0] = b3Max((size_t)1, (numThreadsX / lRange[0]) + (!(numThreadsX % lRange[0]) ? 0 : 1)); - gRange[0] *= lRange[0]; - gRange[1] = b3Max((size_t)1, (numThreadsY / lRange[1]) + (!(numThreadsY % lRange[1]) ? 0 : 1)); - gRange[1] *= lRange[1]; - - cl_int status = clEnqueueNDRangeKernel(m_commandQueue, - m_kernel, 2, NULL, gRange, lRange, 0, 0, 0); - if (status != CL_SUCCESS) - { - printf("Error: OpenCL status = %d\n", status); - } - b3Assert(status == CL_SUCCESS); - } - - void enableSerialization(bool serialize) - { - m_enableSerialization = serialize; - } -}; - -#endif //B3_LAUNCHER_CL_H diff --git a/engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/b3OpenCLArray.h b/engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/b3OpenCLArray.h deleted file mode 100644 index e837cceb..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/b3OpenCLArray.h +++ /dev/null @@ -1,300 +0,0 @@ -#ifndef B3_OPENCL_ARRAY_H -#define B3_OPENCL_ARRAY_H - -#include "Bullet3Common/b3AlignedObjectArray.h" -#include "Bullet3OpenCL/Initialize/b3OpenCLInclude.h" - -template -class b3OpenCLArray -{ - size_t m_size; - size_t m_capacity; - cl_mem m_clBuffer; - - cl_context m_clContext; - cl_command_queue m_commandQueue; - - bool m_ownsMemory; - - bool m_allowGrowingCapacity; - - void deallocate() - { - if (m_clBuffer && m_ownsMemory) - { - clReleaseMemObject(m_clBuffer); - } - m_clBuffer = 0; - m_capacity = 0; - } - - b3OpenCLArray& operator=(const b3OpenCLArray& src); - - B3_FORCE_INLINE size_t allocSize(size_t size) - { - return (size ? size * 2 : 1); - } - -public: - b3OpenCLArray(cl_context ctx, cl_command_queue queue, size_t initialCapacity = 0, bool allowGrowingCapacity = true) - : m_size(0), m_capacity(0), m_clBuffer(0), m_clContext(ctx), m_commandQueue(queue), m_ownsMemory(true), m_allowGrowingCapacity(true) - { - if (initialCapacity) - { - reserve(initialCapacity); - } - m_allowGrowingCapacity = allowGrowingCapacity; - } - - ///this is an error-prone method with no error checking, be careful! - void setFromOpenCLBuffer(cl_mem buffer, size_t sizeInElements) - { - deallocate(); - m_ownsMemory = false; - m_allowGrowingCapacity = false; - m_clBuffer = buffer; - m_size = sizeInElements; - m_capacity = sizeInElements; - } - - // we could enable this assignment, but need to make sure to avoid accidental deep copies - // b3OpenCLArray& operator=(const b3AlignedObjectArray& src) - // { - // copyFromArray(src); - // return *this; - // } - - cl_mem getBufferCL() const - { - return m_clBuffer; - } - - virtual ~b3OpenCLArray() - { - deallocate(); - m_size = 0; - m_capacity = 0; - } - - B3_FORCE_INLINE bool push_back(const T& _Val, bool waitForCompletion = true) - { - bool result = true; - size_t sz = size(); - if (sz == capacity()) - { - result = reserve(allocSize(size())); - } - copyFromHostPointer(&_Val, 1, sz, waitForCompletion); - m_size++; - return result; - } - - B3_FORCE_INLINE T forcedAt(size_t n) const - { - b3Assert(n >= 0); - b3Assert(n < capacity()); - T elem; - copyToHostPointer(&elem, 1, n, true); - return elem; - } - - B3_FORCE_INLINE T at(size_t n) const - { - b3Assert(n >= 0); - b3Assert(n < size()); - T elem; - copyToHostPointer(&elem, 1, n, true); - return elem; - } - - B3_FORCE_INLINE bool resize(size_t newsize, bool copyOldContents = true) - { - bool result = true; - size_t curSize = size(); - - if (newsize < curSize) - { - //leave the OpenCL memory for now - } - else - { - if (newsize > size()) - { - result = reserve(newsize, copyOldContents); - } - - //leave new data uninitialized (init in debug mode?) - //for (size_t i=curSize;i 0); - b3Assert(numElements <= m_size); - - size_t srcOffsetBytes = sizeof(T) * firstElem; - size_t dstOffsetInBytes = sizeof(T) * dstOffsetInElems; - - status = clEnqueueCopyBuffer(m_commandQueue, m_clBuffer, destination, - srcOffsetBytes, dstOffsetInBytes, sizeof(T) * numElements, 0, 0, 0); - - b3Assert(status == CL_SUCCESS); - } - - void copyFromHost(const b3AlignedObjectArray& srcArray, bool waitForCompletion = true) - { - size_t newSize = srcArray.size(); - - bool copyOldContents = false; - resize(newSize, copyOldContents); - if (newSize) - copyFromHostPointer(&srcArray[0], newSize, 0, waitForCompletion); - } - - void copyFromHostPointer(const T* src, size_t numElems, size_t destFirstElem = 0, bool waitForCompletion = true) - { - b3Assert(numElems + destFirstElem <= capacity()); - - if (numElems + destFirstElem) - { - cl_int status = 0; - size_t sizeInBytes = sizeof(T) * numElems; - status = clEnqueueWriteBuffer(m_commandQueue, m_clBuffer, 0, sizeof(T) * destFirstElem, sizeInBytes, - src, 0, 0, 0); - b3Assert(status == CL_SUCCESS); - if (waitForCompletion) - clFinish(m_commandQueue); - } - else - { - b3Error("copyFromHostPointer invalid range\n"); - } - } - - void copyToHost(b3AlignedObjectArray& destArray, bool waitForCompletion = true) const - { - destArray.resize(this->size()); - if (size()) - copyToHostPointer(&destArray[0], size(), 0, waitForCompletion); - } - - void copyToHostPointer(T* destPtr, size_t numElem, size_t srcFirstElem = 0, bool waitForCompletion = true) const - { - b3Assert(numElem + srcFirstElem <= capacity()); - - if (numElem + srcFirstElem <= capacity()) - { - cl_int status = 0; - status = clEnqueueReadBuffer(m_commandQueue, m_clBuffer, 0, sizeof(T) * srcFirstElem, sizeof(T) * numElem, - destPtr, 0, 0, 0); - b3Assert(status == CL_SUCCESS); - - if (waitForCompletion) - clFinish(m_commandQueue); - } - else - { - b3Error("copyToHostPointer invalid range\n"); - } - } - - void copyFromOpenCLArray(const b3OpenCLArray& src) - { - size_t newSize = src.size(); - resize(newSize); - if (size()) - { - src.copyToCL(m_clBuffer, size()); - } - } -}; - -#endif //B3_OPENCL_ARRAY_H diff --git a/engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/b3PrefixScanCL.h b/engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/b3PrefixScanCL.h deleted file mode 100644 index 346efa0c..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/b3PrefixScanCL.h +++ /dev/null @@ -1,35 +0,0 @@ - -#ifndef B3_PREFIX_SCAN_CL_H -#define B3_PREFIX_SCAN_CL_H - -#include "b3OpenCLArray.h" -#include "b3BufferInfoCL.h" -#include "Bullet3Common/b3AlignedObjectArray.h" - -class b3PrefixScanCL -{ - enum - { - BLOCK_SIZE = 128 - }; - - // Option m_option; - - cl_command_queue m_commandQueue; - - cl_kernel m_localScanKernel; - cl_kernel m_blockSumKernel; - cl_kernel m_propagationKernel; - - b3OpenCLArray* m_workBuffer; - -public: - b3PrefixScanCL(cl_context ctx, cl_device_id device, cl_command_queue queue, int size = 0); - - virtual ~b3PrefixScanCL(); - - void execute(b3OpenCLArray& src, b3OpenCLArray& dst, int n, unsigned int* sum = 0); - void executeHost(b3AlignedObjectArray& src, b3AlignedObjectArray& dst, int n, unsigned int* sum = 0); -}; - -#endif //B3_PREFIX_SCAN_CL_H diff --git a/engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/b3PrefixScanFloat4CL.h b/engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/b3PrefixScanFloat4CL.h deleted file mode 100644 index 122b0bfd..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/b3PrefixScanFloat4CL.h +++ /dev/null @@ -1,36 +0,0 @@ - -#ifndef B3_PREFIX_SCAN_CL_H -#define B3_PREFIX_SCAN_CL_H - -#include "b3OpenCLArray.h" -#include "b3BufferInfoCL.h" -#include "Bullet3Common/b3AlignedObjectArray.h" -#include "Bullet3Common/b3Vector3.h" - -class b3PrefixScanFloat4CL -{ - enum - { - BLOCK_SIZE = 128 - }; - - // Option m_option; - - cl_command_queue m_commandQueue; - - cl_kernel m_localScanKernel; - cl_kernel m_blockSumKernel; - cl_kernel m_propagationKernel; - - b3OpenCLArray* m_workBuffer; - -public: - b3PrefixScanFloat4CL(cl_context ctx, cl_device_id device, cl_command_queue queue, int size = 0); - - virtual ~b3PrefixScanFloat4CL(); - - void execute(b3OpenCLArray& src, b3OpenCLArray& dst, int n, b3Vector3* sum = 0); - void executeHost(b3AlignedObjectArray& src, b3AlignedObjectArray& dst, int n, b3Vector3* sum); -}; - -#endif //B3_PREFIX_SCAN_CL_H diff --git a/engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/b3RadixSort32CL.h b/engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/b3RadixSort32CL.h deleted file mode 100644 index 69caf182..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/b3RadixSort32CL.h +++ /dev/null @@ -1,84 +0,0 @@ - -#ifndef B3_RADIXSORT32_H -#define B3_RADIXSORT32_H - -#include "b3OpenCLArray.h" - -struct b3SortData -{ - union { - unsigned int m_key; - unsigned int x; - }; - - union { - unsigned int m_value; - unsigned int y; - }; -}; -#include "b3BufferInfoCL.h" - -class b3RadixSort32CL -{ - b3OpenCLArray* m_workBuffer1; - b3OpenCLArray* m_workBuffer2; - - b3OpenCLArray* m_workBuffer3; - b3OpenCLArray* m_workBuffer4; - - b3OpenCLArray* m_workBuffer3a; - b3OpenCLArray* m_workBuffer4a; - - cl_command_queue m_commandQueue; - - cl_kernel m_streamCountSortDataKernel; - cl_kernel m_streamCountKernel; - - cl_kernel m_prefixScanKernel; - cl_kernel m_sortAndScatterSortDataKernel; - cl_kernel m_sortAndScatterKernel; - - bool m_deviceCPU; - - class b3PrefixScanCL* m_scan; - class b3FillCL* m_fill; - -public: - struct b3ConstData - { - int m_n; - int m_nWGs; - int m_startBit; - int m_nBlocksPerWG; - }; - enum - { - DATA_ALIGNMENT = 256, - WG_SIZE = 64, - BLOCK_SIZE = 256, - ELEMENTS_PER_WORK_ITEM = (BLOCK_SIZE / WG_SIZE), - BITS_PER_PASS = 4, - NUM_BUCKET = (1 << BITS_PER_PASS), - // if you change this, change nPerWI in kernel as well - NUM_WGS = 20 * 6, // cypress - // NUM_WGS = 24*6, // cayman - // NUM_WGS = 32*4, // nv - }; - -private: -public: - b3RadixSort32CL(cl_context ctx, cl_device_id device, cl_command_queue queue, int initialCapacity = 0); - - virtual ~b3RadixSort32CL(); - - void execute(b3OpenCLArray& keysIn, b3OpenCLArray& keysOut, b3OpenCLArray& valuesIn, - b3OpenCLArray& valuesOut, int n, int sortBits = 32); - - ///keys only - void execute(b3OpenCLArray& keysInOut, int sortBits = 32); - - void execute(b3OpenCLArray& keyValuesInOut, int sortBits = 32); - void executeHost(b3OpenCLArray& keyValuesInOut, int sortBits = 32); - void executeHost(b3AlignedObjectArray& keyValuesInOut, int sortBits = 32); -}; -#endif //B3_RADIXSORT32_H diff --git a/engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/BoundSearchKernelsCL.h b/engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/BoundSearchKernelsCL.h deleted file mode 100644 index 1758dd41..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/BoundSearchKernelsCL.h +++ /dev/null @@ -1,86 +0,0 @@ -//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project -static const char* boundSearchKernelsCL = - "/*\n" - "Copyright (c) 2012 Advanced Micro Devices, Inc. \n" - "This software is provided 'as-is', without any express or implied warranty.\n" - "In no event will the authors be held liable for any damages arising from the use of this software.\n" - "Permission is granted to anyone to use this software for any purpose, \n" - "including commercial applications, and to alter it and redistribute it freely, \n" - "subject to the following restrictions:\n" - "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.\n" - "2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.\n" - "3. This notice may not be removed or altered from any source distribution.\n" - "*/\n" - "//Originally written by Takahiro Harada\n" - "typedef unsigned int u32;\n" - "#define GET_GROUP_IDX get_group_id(0)\n" - "#define GET_LOCAL_IDX get_local_id(0)\n" - "#define GET_GLOBAL_IDX get_global_id(0)\n" - "#define GET_GROUP_SIZE get_local_size(0)\n" - "#define GROUP_LDS_BARRIER barrier(CLK_LOCAL_MEM_FENCE)\n" - "typedef struct\n" - "{\n" - " u32 m_key; \n" - " u32 m_value;\n" - "}SortData;\n" - "typedef struct\n" - "{\n" - " u32 m_nSrc;\n" - " u32 m_nDst;\n" - " u32 m_padding[2];\n" - "} ConstBuffer;\n" - "__attribute__((reqd_work_group_size(64,1,1)))\n" - "__kernel\n" - "void SearchSortDataLowerKernel(__global SortData* src, __global u32 *dst, \n" - " unsigned int nSrc, unsigned int nDst)\n" - "{\n" - " int gIdx = GET_GLOBAL_IDX;\n" - " if( gIdx < nSrc )\n" - " {\n" - " SortData first; first.m_key = (u32)(-1); first.m_value = (u32)(-1);\n" - " SortData end; end.m_key = nDst; end.m_value = nDst;\n" - " SortData iData = (gIdx==0)? first: src[gIdx-1];\n" - " SortData jData = (gIdx==nSrc)? end: src[gIdx];\n" - " if( iData.m_key != jData.m_key )\n" - " {\n" - "// for(u32 k=iData.m_key+1; k<=min(jData.m_key, nDst-1); k++)\n" - " u32 k = jData.m_key;\n" - " {\n" - " dst[k] = gIdx;\n" - " }\n" - " }\n" - " }\n" - "}\n" - "__attribute__((reqd_work_group_size(64,1,1)))\n" - "__kernel\n" - "void SearchSortDataUpperKernel(__global SortData* src, __global u32 *dst, \n" - " unsigned int nSrc, unsigned int nDst)\n" - "{\n" - " int gIdx = GET_GLOBAL_IDX+1;\n" - " if( gIdx < nSrc+1 )\n" - " {\n" - " SortData first; first.m_key = 0; first.m_value = 0;\n" - " SortData end; end.m_key = nDst; end.m_value = nDst;\n" - " SortData iData = src[gIdx-1];\n" - " SortData jData = (gIdx==nSrc)? end: src[gIdx];\n" - " if( iData.m_key != jData.m_key )\n" - " {\n" - " u32 k = iData.m_key;\n" - " {\n" - " dst[k] = gIdx;\n" - " }\n" - " }\n" - " }\n" - "}\n" - "__attribute__((reqd_work_group_size(64,1,1)))\n" - "__kernel\n" - "void SubtractKernel(__global u32* A, __global u32 *B, __global u32 *C, \n" - " unsigned int nSrc, unsigned int nDst)\n" - "{\n" - " int gIdx = GET_GLOBAL_IDX;\n" - " \n" - " if( gIdx < nDst )\n" - " {\n" - " C[gIdx] = A[gIdx] - B[gIdx];\n" - " }\n" - "}\n"; diff --git a/engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/CopyKernelsCL.h b/engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/CopyKernelsCL.h deleted file mode 100644 index 33c92794..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/CopyKernelsCL.h +++ /dev/null @@ -1,131 +0,0 @@ -//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project -static const char* copyKernelsCL = - "/*\n" - "Copyright (c) 2012 Advanced Micro Devices, Inc. \n" - "\n" - "This software is provided 'as-is', without any express or implied warranty.\n" - "In no event will the authors be held liable for any damages arising from the use of this software.\n" - "Permission is granted to anyone to use this software for any purpose, \n" - "including commercial applications, and to alter it and redistribute it freely, \n" - "subject to the following restrictions:\n" - "\n" - "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.\n" - "2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.\n" - "3. This notice may not be removed or altered from any source distribution.\n" - "*/\n" - "//Originally written by Takahiro Harada\n" - "\n" - "#pragma OPENCL EXTENSION cl_amd_printf : enable\n" - "#pragma OPENCL EXTENSION cl_khr_local_int32_base_atomics : enable\n" - "\n" - "typedef unsigned int u32;\n" - "#define GET_GROUP_IDX get_group_id(0)\n" - "#define GET_LOCAL_IDX get_local_id(0)\n" - "#define GET_GLOBAL_IDX get_global_id(0)\n" - "#define GET_GROUP_SIZE get_local_size(0)\n" - "#define GROUP_LDS_BARRIER barrier(CLK_LOCAL_MEM_FENCE)\n" - "#define GROUP_MEM_FENCE mem_fence(CLK_LOCAL_MEM_FENCE)\n" - "#define AtomInc(x) atom_inc(&(x))\n" - "#define AtomInc1(x, out) out = atom_inc(&(x))\n" - "\n" - "#define make_uint4 (uint4)\n" - "#define make_uint2 (uint2)\n" - "#define make_int2 (int2)\n" - "\n" - "typedef struct\n" - "{\n" - " int m_n;\n" - " int m_padding[3];\n" - "} ConstBuffer;\n" - "\n" - "\n" - "\n" - "__kernel\n" - "__attribute__((reqd_work_group_size(64,1,1)))\n" - "void Copy1F4Kernel(__global float4* dst, __global float4* src, \n" - " ConstBuffer cb)\n" - "{\n" - " int gIdx = GET_GLOBAL_IDX;\n" - "\n" - " if( gIdx < cb.m_n )\n" - " {\n" - " float4 a0 = src[gIdx];\n" - "\n" - " dst[ gIdx ] = a0;\n" - " }\n" - "}\n" - "\n" - "__kernel\n" - "__attribute__((reqd_work_group_size(64,1,1)))\n" - "void Copy2F4Kernel(__global float4* dst, __global float4* src, \n" - " ConstBuffer cb)\n" - "{\n" - " int gIdx = GET_GLOBAL_IDX;\n" - "\n" - " if( 2*gIdx <= cb.m_n )\n" - " {\n" - " float4 a0 = src[gIdx*2+0];\n" - " float4 a1 = src[gIdx*2+1];\n" - "\n" - " dst[ gIdx*2+0 ] = a0;\n" - " dst[ gIdx*2+1 ] = a1;\n" - " }\n" - "}\n" - "\n" - "__kernel\n" - "__attribute__((reqd_work_group_size(64,1,1)))\n" - "void Copy4F4Kernel(__global float4* dst, __global float4* src, \n" - " ConstBuffer cb)\n" - "{\n" - " int gIdx = GET_GLOBAL_IDX;\n" - "\n" - " if( 4*gIdx <= cb.m_n )\n" - " {\n" - " int idx0 = gIdx*4+0;\n" - " int idx1 = gIdx*4+1;\n" - " int idx2 = gIdx*4+2;\n" - " int idx3 = gIdx*4+3;\n" - "\n" - " float4 a0 = src[idx0];\n" - " float4 a1 = src[idx1];\n" - " float4 a2 = src[idx2];\n" - " float4 a3 = src[idx3];\n" - "\n" - " dst[ idx0 ] = a0;\n" - " dst[ idx1 ] = a1;\n" - " dst[ idx2 ] = a2;\n" - " dst[ idx3 ] = a3;\n" - " }\n" - "}\n" - "\n" - "__kernel\n" - "__attribute__((reqd_work_group_size(64,1,1)))\n" - "void CopyF1Kernel(__global float* dstF1, __global float* srcF1, \n" - " ConstBuffer cb)\n" - "{\n" - " int gIdx = GET_GLOBAL_IDX;\n" - "\n" - " if( gIdx < cb.m_n )\n" - " {\n" - " float a0 = srcF1[gIdx];\n" - "\n" - " dstF1[ gIdx ] = a0;\n" - " }\n" - "}\n" - "\n" - "__kernel\n" - "__attribute__((reqd_work_group_size(64,1,1)))\n" - "void CopyF2Kernel(__global float2* dstF2, __global float2* srcF2, \n" - " ConstBuffer cb)\n" - "{\n" - " int gIdx = GET_GLOBAL_IDX;\n" - "\n" - " if( gIdx < cb.m_n )\n" - " {\n" - " float2 a0 = srcF2[gIdx];\n" - "\n" - " dstF2[ gIdx ] = a0;\n" - " }\n" - "}\n" - "\n" - "\n"; diff --git a/engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/FillKernelsCL.h b/engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/FillKernelsCL.h deleted file mode 100644 index 983e6522..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/FillKernelsCL.h +++ /dev/null @@ -1,90 +0,0 @@ -//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project -static const char* fillKernelsCL = - "/*\n" - "Copyright (c) 2012 Advanced Micro Devices, Inc. \n" - "This software is provided 'as-is', without any express or implied warranty.\n" - "In no event will the authors be held liable for any damages arising from the use of this software.\n" - "Permission is granted to anyone to use this software for any purpose, \n" - "including commercial applications, and to alter it and redistribute it freely, \n" - "subject to the following restrictions:\n" - "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.\n" - "2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.\n" - "3. This notice may not be removed or altered from any source distribution.\n" - "*/\n" - "//Originally written by Takahiro Harada\n" - "#pragma OPENCL EXTENSION cl_amd_printf : enable\n" - "#pragma OPENCL EXTENSION cl_khr_local_int32_base_atomics : enable\n" - "typedef unsigned int u32;\n" - "#define GET_GROUP_IDX get_group_id(0)\n" - "#define GET_LOCAL_IDX get_local_id(0)\n" - "#define GET_GLOBAL_IDX get_global_id(0)\n" - "#define GET_GROUP_SIZE get_local_size(0)\n" - "#define GROUP_LDS_BARRIER barrier(CLK_LOCAL_MEM_FENCE)\n" - "#define GROUP_MEM_FENCE mem_fence(CLK_LOCAL_MEM_FENCE)\n" - "#define AtomInc(x) atom_inc(&(x))\n" - "#define AtomInc1(x, out) out = atom_inc(&(x))\n" - "#define make_uint4 (uint4)\n" - "#define make_uint2 (uint2)\n" - "#define make_int2 (int2)\n" - "typedef struct\n" - "{\n" - " union\n" - " {\n" - " int4 m_data;\n" - " uint4 m_unsignedData;\n" - " float m_floatData;\n" - " };\n" - " int m_offset;\n" - " int m_n;\n" - " int m_padding[2];\n" - "} ConstBuffer;\n" - "__kernel\n" - "__attribute__((reqd_work_group_size(64,1,1)))\n" - "void FillIntKernel(__global int* dstInt, int num_elements, int value, const int offset)\n" - "{\n" - " int gIdx = GET_GLOBAL_IDX;\n" - " if( gIdx < num_elements )\n" - " {\n" - " dstInt[ offset+gIdx ] = value;\n" - " }\n" - "}\n" - "__kernel\n" - "__attribute__((reqd_work_group_size(64,1,1)))\n" - "void FillFloatKernel(__global float* dstFloat, int num_elements, float value, const int offset)\n" - "{\n" - " int gIdx = GET_GLOBAL_IDX;\n" - " if( gIdx < num_elements )\n" - " {\n" - " dstFloat[ offset+gIdx ] = value;\n" - " }\n" - "}\n" - "__kernel\n" - "__attribute__((reqd_work_group_size(64,1,1)))\n" - "void FillUnsignedIntKernel(__global unsigned int* dstInt, const int num, const unsigned int value, const int offset)\n" - "{\n" - " int gIdx = GET_GLOBAL_IDX;\n" - " if( gIdx < num )\n" - " {\n" - " dstInt[ offset+gIdx ] = value;\n" - " }\n" - "}\n" - "__kernel\n" - "__attribute__((reqd_work_group_size(64,1,1)))\n" - "void FillInt2Kernel(__global int2* dstInt2, const int num, const int2 value, const int offset)\n" - "{\n" - " int gIdx = GET_GLOBAL_IDX;\n" - " if( gIdx < num )\n" - " {\n" - " dstInt2[ gIdx + offset] = make_int2( value.x, value.y );\n" - " }\n" - "}\n" - "__kernel\n" - "__attribute__((reqd_work_group_size(64,1,1)))\n" - "void FillInt4Kernel(__global int4* dstInt4, const int num, const int4 value, const int offset)\n" - "{\n" - " int gIdx = GET_GLOBAL_IDX;\n" - " if( gIdx < num )\n" - " {\n" - " dstInt4[ offset+gIdx ] = value;\n" - " }\n" - "}\n"; diff --git a/engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/PrefixScanKernelsCL.h b/engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/PrefixScanKernelsCL.h deleted file mode 100644 index fc5e7b86..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/PrefixScanKernelsCL.h +++ /dev/null @@ -1,128 +0,0 @@ -//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project -static const char* prefixScanKernelsCL = - "/*\n" - "Copyright (c) 2012 Advanced Micro Devices, Inc. \n" - "This software is provided 'as-is', without any express or implied warranty.\n" - "In no event will the authors be held liable for any damages arising from the use of this software.\n" - "Permission is granted to anyone to use this software for any purpose, \n" - "including commercial applications, and to alter it and redistribute it freely, \n" - "subject to the following restrictions:\n" - "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.\n" - "2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.\n" - "3. This notice may not be removed or altered from any source distribution.\n" - "*/\n" - "//Originally written by Takahiro Harada\n" - "typedef unsigned int u32;\n" - "#define GET_GROUP_IDX get_group_id(0)\n" - "#define GET_LOCAL_IDX get_local_id(0)\n" - "#define GET_GLOBAL_IDX get_global_id(0)\n" - "#define GET_GROUP_SIZE get_local_size(0)\n" - "#define GROUP_LDS_BARRIER barrier(CLK_LOCAL_MEM_FENCE)\n" - "// takahiro end\n" - "#define WG_SIZE 128 \n" - "#define m_numElems x\n" - "#define m_numBlocks y\n" - "#define m_numScanBlocks z\n" - "/*typedef struct\n" - "{\n" - " uint m_numElems;\n" - " uint m_numBlocks;\n" - " uint m_numScanBlocks;\n" - " uint m_padding[1];\n" - "} ConstBuffer;\n" - "*/\n" - "u32 ScanExclusive(__local u32* data, u32 n, int lIdx, int lSize)\n" - "{\n" - " u32 blocksum;\n" - " int offset = 1;\n" - " for(int nActive=n>>1; nActive>0; nActive>>=1, offset<<=1)\n" - " {\n" - " GROUP_LDS_BARRIER;\n" - " for(int iIdx=lIdx; iIdx>= 1;\n" - " for(int nActive=1; nActive>=1 )\n" - " {\n" - " GROUP_LDS_BARRIER;\n" - " for( int iIdx = lIdx; iIdx>1; nActive>0; nActive>>=1, offset<<=1)\n" - " {\n" - " GROUP_LDS_BARRIER;\n" - " for(int iIdx=lIdx; iIdx>= 1;\n" - " for(int nActive=1; nActive>=1 )\n" - " {\n" - " GROUP_LDS_BARRIER;\n" - " for( int iIdx = lIdx; iIdx 64 )\n" - " {\n" - " sorterSharedMemory[idx] += sorterSharedMemory[idx-64];\n" - " GROUP_MEM_FENCE;\n" - " }\n" - " sorterSharedMemory[idx-1] += sorterSharedMemory[idx-2];\n" - " GROUP_MEM_FENCE;\n" - " }\n" - "#else\n" - " if( lIdx < 64 )\n" - " {\n" - " sorterSharedMemory[idx] += sorterSharedMemory[idx-1];\n" - " GROUP_MEM_FENCE;\n" - " sorterSharedMemory[idx] += sorterSharedMemory[idx-2]; \n" - " GROUP_MEM_FENCE;\n" - " sorterSharedMemory[idx] += sorterSharedMemory[idx-4];\n" - " GROUP_MEM_FENCE;\n" - " sorterSharedMemory[idx] += sorterSharedMemory[idx-8];\n" - " GROUP_MEM_FENCE;\n" - " sorterSharedMemory[idx] += sorterSharedMemory[idx-16];\n" - " GROUP_MEM_FENCE;\n" - " sorterSharedMemory[idx] += sorterSharedMemory[idx-32];\n" - " GROUP_MEM_FENCE;\n" - " if( wgSize > 64 )\n" - " {\n" - " sorterSharedMemory[idx] += sorterSharedMemory[idx-64];\n" - " GROUP_MEM_FENCE;\n" - " }\n" - " sorterSharedMemory[idx-1] += sorterSharedMemory[idx-2];\n" - " GROUP_MEM_FENCE;\n" - " }\n" - "#endif\n" - " }\n" - " GROUP_LDS_BARRIER;\n" - " *totalSum = sorterSharedMemory[wgSize*2-1];\n" - " u32 addValue = sorterSharedMemory[lIdx+wgSize-1];\n" - " return addValue;\n" - "}\n" - "//__attribute__((reqd_work_group_size(128,1,1)))\n" - "uint4 localPrefixSum128V( uint4 pData, uint lIdx, uint* totalSum, __local u32* sorterSharedMemory )\n" - "{\n" - " u32 s4 = prefixScanVectorEx( &pData );\n" - " u32 rank = localPrefixSum( s4, lIdx, totalSum, sorterSharedMemory, 128 );\n" - " return pData + make_uint4( rank, rank, rank, rank );\n" - "}\n" - "//__attribute__((reqd_work_group_size(64,1,1)))\n" - "uint4 localPrefixSum64V( uint4 pData, uint lIdx, uint* totalSum, __local u32* sorterSharedMemory )\n" - "{\n" - " u32 s4 = prefixScanVectorEx( &pData );\n" - " u32 rank = localPrefixSum( s4, lIdx, totalSum, sorterSharedMemory, 64 );\n" - " return pData + make_uint4( rank, rank, rank, rank );\n" - "}\n" - "u32 unpack4Key( u32 key, int keyIdx ){ return (key>>(keyIdx*8)) & 0xff;}\n" - "u32 bit8Scan(u32 v)\n" - "{\n" - " return (v<<8) + (v<<16) + (v<<24);\n" - "}\n" - "//===\n" - "#define MY_HISTOGRAM(idx) localHistogramMat[(idx)*WG_SIZE+lIdx]\n" - "__kernel\n" - "__attribute__((reqd_work_group_size(WG_SIZE,1,1)))\n" - "void StreamCountKernel( __global u32* gSrc, __global u32* histogramOut, int4 cb )\n" - "{\n" - " __local u32 localHistogramMat[NUM_BUCKET*WG_SIZE];\n" - " u32 gIdx = GET_GLOBAL_IDX;\n" - " u32 lIdx = GET_LOCAL_IDX;\n" - " u32 wgIdx = GET_GROUP_IDX;\n" - " u32 wgSize = GET_GROUP_SIZE;\n" - " const int startBit = cb.m_startBit;\n" - " const int n = cb.m_n;\n" - " const int nWGs = cb.m_nWGs;\n" - " const int nBlocksPerWG = cb.m_nBlocksPerWG;\n" - " for(int i=0; i>startBit) & 0xf;\n" - "#if defined(NV_GPU)\n" - " MY_HISTOGRAM( localKey )++;\n" - "#else\n" - " AtomInc( MY_HISTOGRAM( localKey ) );\n" - "#endif\n" - " }\n" - " }\n" - " }\n" - " GROUP_LDS_BARRIER;\n" - " \n" - " if( lIdx < NUM_BUCKET )\n" - " {\n" - " u32 sum = 0;\n" - " for(int i=0; i>startBit) & 0xf;\n" - "#if defined(NV_GPU)\n" - " MY_HISTOGRAM( localKey )++;\n" - "#else\n" - " AtomInc( MY_HISTOGRAM( localKey ) );\n" - "#endif\n" - " }\n" - " }\n" - " }\n" - " GROUP_LDS_BARRIER;\n" - " \n" - " if( lIdx < NUM_BUCKET )\n" - " {\n" - " u32 sum = 0;\n" - " for(int i=0; i>startBit) & mask, (sortData[1]>>startBit) & mask, (sortData[2]>>startBit) & mask, (sortData[3]>>startBit) & mask );\n" - " uint4 prefixSum = SELECT_UINT4( make_uint4(1,1,1,1), make_uint4(0,0,0,0), cmpResult != make_uint4(0,0,0,0) );\n" - " u32 total;\n" - " prefixSum = localPrefixSum64V( prefixSum, lIdx, &total, ldsSortData );\n" - " {\n" - " uint4 localAddr = make_uint4(lIdx*4+0,lIdx*4+1,lIdx*4+2,lIdx*4+3);\n" - " uint4 dstAddr = localAddr - prefixSum + make_uint4( total, total, total, total );\n" - " dstAddr = SELECT_UINT4( prefixSum, dstAddr, cmpResult != make_uint4(0, 0, 0, 0) );\n" - " GROUP_LDS_BARRIER;\n" - " ldsSortData[dstAddr.x] = sortData[0];\n" - " ldsSortData[dstAddr.y] = sortData[1];\n" - " ldsSortData[dstAddr.z] = sortData[2];\n" - " ldsSortData[dstAddr.w] = sortData[3];\n" - " GROUP_LDS_BARRIER;\n" - " sortData[0] = ldsSortData[localAddr.x];\n" - " sortData[1] = ldsSortData[localAddr.y];\n" - " sortData[2] = ldsSortData[localAddr.z];\n" - " sortData[3] = ldsSortData[localAddr.w];\n" - " GROUP_LDS_BARRIER;\n" - " }\n" - " }\n" - "}\n" - "// 2 scan, 2 exchange\n" - "void sort4Bits1(u32 sortData[4], int startBit, int lIdx, __local u32* ldsSortData)\n" - "{\n" - " for(uint ibit=0; ibit>(startBit+ibit)) & 0x3, \n" - " (sortData[1]>>(startBit+ibit)) & 0x3, \n" - " (sortData[2]>>(startBit+ibit)) & 0x3, \n" - " (sortData[3]>>(startBit+ibit)) & 0x3);\n" - " u32 key4;\n" - " u32 sKeyPacked[4] = { 0, 0, 0, 0 };\n" - " {\n" - " sKeyPacked[0] |= 1<<(8*b.x);\n" - " sKeyPacked[1] |= 1<<(8*b.y);\n" - " sKeyPacked[2] |= 1<<(8*b.z);\n" - " sKeyPacked[3] |= 1<<(8*b.w);\n" - " key4 = sKeyPacked[0] + sKeyPacked[1] + sKeyPacked[2] + sKeyPacked[3];\n" - " }\n" - " u32 rankPacked;\n" - " u32 sumPacked;\n" - " {\n" - " rankPacked = localPrefixSum( key4, lIdx, &sumPacked, ldsSortData, WG_SIZE );\n" - " }\n" - " GROUP_LDS_BARRIER;\n" - " u32 newOffset[4] = { 0,0,0,0 };\n" - " {\n" - " u32 sumScanned = bit8Scan( sumPacked );\n" - " u32 scannedKeys[4];\n" - " scannedKeys[0] = 1<<(8*b.x);\n" - " scannedKeys[1] = 1<<(8*b.y);\n" - " scannedKeys[2] = 1<<(8*b.z);\n" - " scannedKeys[3] = 1<<(8*b.w);\n" - " { // 4 scans at once\n" - " u32 sum4 = 0;\n" - " for(int ie=0; ie<4; ie++)\n" - " {\n" - " u32 tmp = scannedKeys[ie];\n" - " scannedKeys[ie] = sum4;\n" - " sum4 += tmp;\n" - " }\n" - " }\n" - " {\n" - " u32 sumPlusRank = sumScanned + rankPacked;\n" - " { u32 ie = b.x;\n" - " scannedKeys[0] += sumPlusRank;\n" - " newOffset[0] = unpack4Key( scannedKeys[0], ie );\n" - " }\n" - " { u32 ie = b.y;\n" - " scannedKeys[1] += sumPlusRank;\n" - " newOffset[1] = unpack4Key( scannedKeys[1], ie );\n" - " }\n" - " { u32 ie = b.z;\n" - " scannedKeys[2] += sumPlusRank;\n" - " newOffset[2] = unpack4Key( scannedKeys[2], ie );\n" - " }\n" - " { u32 ie = b.w;\n" - " scannedKeys[3] += sumPlusRank;\n" - " newOffset[3] = unpack4Key( scannedKeys[3], ie );\n" - " }\n" - " }\n" - " }\n" - " GROUP_LDS_BARRIER;\n" - " {\n" - " ldsSortData[newOffset[0]] = sortData[0];\n" - " ldsSortData[newOffset[1]] = sortData[1];\n" - " ldsSortData[newOffset[2]] = sortData[2];\n" - " ldsSortData[newOffset[3]] = sortData[3];\n" - " GROUP_LDS_BARRIER;\n" - " u32 dstAddr = 4*lIdx;\n" - " sortData[0] = ldsSortData[dstAddr+0];\n" - " sortData[1] = ldsSortData[dstAddr+1];\n" - " sortData[2] = ldsSortData[dstAddr+2];\n" - " sortData[3] = ldsSortData[dstAddr+3];\n" - " GROUP_LDS_BARRIER;\n" - " }\n" - " }\n" - "}\n" - "#define SET_HISTOGRAM(setIdx, key) ldsSortData[(setIdx)*NUM_BUCKET+key]\n" - "__kernel\n" - "__attribute__((reqd_work_group_size(WG_SIZE,1,1)))\n" - "void SortAndScatterKernel( __global const u32* restrict gSrc, __global const u32* rHistogram, __global u32* restrict gDst, int4 cb )\n" - "{\n" - " __local u32 ldsSortData[WG_SIZE*ELEMENTS_PER_WORK_ITEM+16];\n" - " __local u32 localHistogramToCarry[NUM_BUCKET];\n" - " __local u32 localHistogram[NUM_BUCKET*2];\n" - " u32 gIdx = GET_GLOBAL_IDX;\n" - " u32 lIdx = GET_LOCAL_IDX;\n" - " u32 wgIdx = GET_GROUP_IDX;\n" - " u32 wgSize = GET_GROUP_SIZE;\n" - " const int n = cb.m_n;\n" - " const int nWGs = cb.m_nWGs;\n" - " const int startBit = cb.m_startBit;\n" - " const int nBlocksPerWG = cb.m_nBlocksPerWG;\n" - " if( lIdx < (NUM_BUCKET) )\n" - " {\n" - " localHistogramToCarry[lIdx] = rHistogram[lIdx*nWGs + wgIdx];\n" - " }\n" - " GROUP_LDS_BARRIER;\n" - " const int blockSize = ELEMENTS_PER_WORK_ITEM*WG_SIZE;\n" - " int nBlocks = n/blockSize - nBlocksPerWG*wgIdx;\n" - " int addr = blockSize*nBlocksPerWG*wgIdx + ELEMENTS_PER_WORK_ITEM*lIdx;\n" - " for(int iblock=0; iblock>startBit) & 0xf;\n" - " { // create histogram\n" - " u32 setIdx = lIdx/16;\n" - " if( lIdx < NUM_BUCKET )\n" - " {\n" - " localHistogram[lIdx] = 0;\n" - " }\n" - " ldsSortData[lIdx] = 0;\n" - " GROUP_LDS_BARRIER;\n" - " for(int i=0; i>(startBit+ibit)) & 0x3, \n" - " (sortData[1]>>(startBit+ibit)) & 0x3, \n" - " (sortData[2]>>(startBit+ibit)) & 0x3, \n" - " (sortData[3]>>(startBit+ibit)) & 0x3);\n" - " u32 key4;\n" - " u32 sKeyPacked[4] = { 0, 0, 0, 0 };\n" - " {\n" - " sKeyPacked[0] |= 1<<(8*b.x);\n" - " sKeyPacked[1] |= 1<<(8*b.y);\n" - " sKeyPacked[2] |= 1<<(8*b.z);\n" - " sKeyPacked[3] |= 1<<(8*b.w);\n" - " key4 = sKeyPacked[0] + sKeyPacked[1] + sKeyPacked[2] + sKeyPacked[3];\n" - " }\n" - " u32 rankPacked;\n" - " u32 sumPacked;\n" - " {\n" - " rankPacked = localPrefixSum( key4, lIdx, &sumPacked, ldsSortData, WG_SIZE );\n" - " }\n" - " GROUP_LDS_BARRIER;\n" - " u32 newOffset[4] = { 0,0,0,0 };\n" - " {\n" - " u32 sumScanned = bit8Scan( sumPacked );\n" - " u32 scannedKeys[4];\n" - " scannedKeys[0] = 1<<(8*b.x);\n" - " scannedKeys[1] = 1<<(8*b.y);\n" - " scannedKeys[2] = 1<<(8*b.z);\n" - " scannedKeys[3] = 1<<(8*b.w);\n" - " { // 4 scans at once\n" - " u32 sum4 = 0;\n" - " for(int ie=0; ie<4; ie++)\n" - " {\n" - " u32 tmp = scannedKeys[ie];\n" - " scannedKeys[ie] = sum4;\n" - " sum4 += tmp;\n" - " }\n" - " }\n" - " {\n" - " u32 sumPlusRank = sumScanned + rankPacked;\n" - " { u32 ie = b.x;\n" - " scannedKeys[0] += sumPlusRank;\n" - " newOffset[0] = unpack4Key( scannedKeys[0], ie );\n" - " }\n" - " { u32 ie = b.y;\n" - " scannedKeys[1] += sumPlusRank;\n" - " newOffset[1] = unpack4Key( scannedKeys[1], ie );\n" - " }\n" - " { u32 ie = b.z;\n" - " scannedKeys[2] += sumPlusRank;\n" - " newOffset[2] = unpack4Key( scannedKeys[2], ie );\n" - " }\n" - " { u32 ie = b.w;\n" - " scannedKeys[3] += sumPlusRank;\n" - " newOffset[3] = unpack4Key( scannedKeys[3], ie );\n" - " }\n" - " }\n" - " }\n" - " GROUP_LDS_BARRIER;\n" - " {\n" - " ldsSortData[newOffset[0]] = sortData[0];\n" - " ldsSortData[newOffset[1]] = sortData[1];\n" - " ldsSortData[newOffset[2]] = sortData[2];\n" - " ldsSortData[newOffset[3]] = sortData[3];\n" - " ldsSortVal[newOffset[0]] = sortVal[0];\n" - " ldsSortVal[newOffset[1]] = sortVal[1];\n" - " ldsSortVal[newOffset[2]] = sortVal[2];\n" - " ldsSortVal[newOffset[3]] = sortVal[3];\n" - " GROUP_LDS_BARRIER;\n" - " u32 dstAddr = 4*lIdx;\n" - " sortData[0] = ldsSortData[dstAddr+0];\n" - " sortData[1] = ldsSortData[dstAddr+1];\n" - " sortData[2] = ldsSortData[dstAddr+2];\n" - " sortData[3] = ldsSortData[dstAddr+3];\n" - " sortVal[0] = ldsSortVal[dstAddr+0];\n" - " sortVal[1] = ldsSortVal[dstAddr+1];\n" - " sortVal[2] = ldsSortVal[dstAddr+2];\n" - " sortVal[3] = ldsSortVal[dstAddr+3];\n" - " GROUP_LDS_BARRIER;\n" - " }\n" - " }\n" - "}\n" - "__kernel\n" - "__attribute__((reqd_work_group_size(WG_SIZE,1,1)))\n" - "void SortAndScatterSortDataKernel( __global const SortDataCL* restrict gSrc, __global const u32* rHistogram, __global SortDataCL* restrict gDst, int4 cb)\n" - "{\n" - " __local int ldsSortData[WG_SIZE*ELEMENTS_PER_WORK_ITEM+16];\n" - " __local int ldsSortVal[WG_SIZE*ELEMENTS_PER_WORK_ITEM+16];\n" - " __local u32 localHistogramToCarry[NUM_BUCKET];\n" - " __local u32 localHistogram[NUM_BUCKET*2];\n" - " u32 gIdx = GET_GLOBAL_IDX;\n" - " u32 lIdx = GET_LOCAL_IDX;\n" - " u32 wgIdx = GET_GROUP_IDX;\n" - " u32 wgSize = GET_GROUP_SIZE;\n" - " const int n = cb.m_n;\n" - " const int nWGs = cb.m_nWGs;\n" - " const int startBit = cb.m_startBit;\n" - " const int nBlocksPerWG = cb.m_nBlocksPerWG;\n" - " if( lIdx < (NUM_BUCKET) )\n" - " {\n" - " localHistogramToCarry[lIdx] = rHistogram[lIdx*nWGs + wgIdx];\n" - " }\n" - " GROUP_LDS_BARRIER;\n" - " \n" - " const int blockSize = ELEMENTS_PER_WORK_ITEM*WG_SIZE;\n" - " int nBlocks = n/blockSize - nBlocksPerWG*wgIdx;\n" - " int addr = blockSize*nBlocksPerWG*wgIdx + ELEMENTS_PER_WORK_ITEM*lIdx;\n" - " for(int iblock=0; iblock>startBit) & 0xf;\n" - " { // create histogram\n" - " u32 setIdx = lIdx/16;\n" - " if( lIdx < NUM_BUCKET )\n" - " {\n" - " localHistogram[lIdx] = 0;\n" - " }\n" - " ldsSortData[lIdx] = 0;\n" - " GROUP_LDS_BARRIER;\n" - " for(int i=0; i0)\n" - " return;\n" - " \n" - " for (int c=0;c>startBit) & 0xf;//0xf = NUM_TABLES-1\n" - " gDst[rHistogram[tableIdx*nWGs+wgIdx] + counter[tableIdx]] = gSrc[i];\n" - " counter[tableIdx] ++;\n" - " }\n" - " }\n" - " }\n" - " }\n" - " \n" - "}\n" - "__kernel\n" - "__attribute__((reqd_work_group_size(WG_SIZE,1,1)))\n" - "void SortAndScatterKernelSerial( __global const u32* restrict gSrc, __global const u32* rHistogram, __global u32* restrict gDst, int4 cb )\n" - "{\n" - " \n" - " u32 gIdx = GET_GLOBAL_IDX;\n" - " u32 realLocalIdx = GET_LOCAL_IDX;\n" - " u32 wgIdx = GET_GROUP_IDX;\n" - " u32 wgSize = GET_GROUP_SIZE;\n" - " const int startBit = cb.m_startBit;\n" - " const int n = cb.m_n;\n" - " const int nWGs = cb.m_nWGs;\n" - " const int nBlocksPerWG = cb.m_nBlocksPerWG;\n" - " int counter[NUM_BUCKET];\n" - " \n" - " if (realLocalIdx>0)\n" - " return;\n" - " \n" - " for (int c=0;c>startBit) & 0xf;//0xf = NUM_TABLES-1\n" - " gDst[rHistogram[tableIdx*nWGs+wgIdx] + counter[tableIdx]] = gSrc[i];\n" - " counter[tableIdx] ++;\n" - " }\n" - " }\n" - " }\n" - " }\n" - " \n" - "}\n"; diff --git a/engine/inc/bullet/Bullet3OpenCL/Raycast/b3GpuRaycast.h b/engine/inc/bullet/Bullet3OpenCL/Raycast/b3GpuRaycast.h deleted file mode 100644 index f1f6ffd4..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/Raycast/b3GpuRaycast.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef B3_GPU_RAYCAST_H -#define B3_GPU_RAYCAST_H - -#include "Bullet3Common/b3Vector3.h" -#include "Bullet3OpenCL/Initialize/b3OpenCLInclude.h" - -#include "Bullet3Common/b3AlignedObjectArray.h" -#include "Bullet3Collision/NarrowPhaseCollision/b3RaycastInfo.h" - -class b3GpuRaycast -{ -protected: - struct b3GpuRaycastInternalData* m_data; - -public: - b3GpuRaycast(cl_context ctx, cl_device_id device, cl_command_queue q); - virtual ~b3GpuRaycast(); - - void castRaysHost(const b3AlignedObjectArray& raysIn, b3AlignedObjectArray& hitResults, - int numBodies, const struct b3RigidBodyData* bodies, int numCollidables, const struct b3Collidable* collidables, - const struct b3GpuNarrowPhaseInternalData* narrowphaseData); - - void castRays(const b3AlignedObjectArray& rays, b3AlignedObjectArray& hitResults, - int numBodies, const struct b3RigidBodyData* bodies, int numCollidables, const struct b3Collidable* collidables, - const struct b3GpuNarrowPhaseInternalData* narrowphaseData, class b3GpuBroadphaseInterface* broadphase); -}; - -#endif //B3_GPU_RAYCAST_H diff --git a/engine/inc/bullet/Bullet3OpenCL/Raycast/kernels/rayCastKernels.h b/engine/inc/bullet/Bullet3OpenCL/Raycast/kernels/rayCastKernels.h deleted file mode 100644 index 94f6a8eb..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/Raycast/kernels/rayCastKernels.h +++ /dev/null @@ -1,380 +0,0 @@ -//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project -static const char* rayCastKernelCL = - "#define SHAPE_CONVEX_HULL 3\n" - "#define SHAPE_PLANE 4\n" - "#define SHAPE_CONCAVE_TRIMESH 5\n" - "#define SHAPE_COMPOUND_OF_CONVEX_HULLS 6\n" - "#define SHAPE_SPHERE 7\n" - "typedef struct\n" - "{\n" - " float4 m_from;\n" - " float4 m_to;\n" - "} b3RayInfo;\n" - "typedef struct\n" - "{\n" - " float m_hitFraction;\n" - " int m_hitResult0;\n" - " int m_hitResult1;\n" - " int m_hitResult2;\n" - " float4 m_hitPoint;\n" - " float4 m_hitNormal;\n" - "} b3RayHit;\n" - "typedef struct\n" - "{\n" - " float4 m_pos;\n" - " float4 m_quat;\n" - " float4 m_linVel;\n" - " float4 m_angVel;\n" - " unsigned int m_collidableIdx;\n" - " float m_invMass;\n" - " float m_restituitionCoeff;\n" - " float m_frictionCoeff;\n" - "} Body;\n" - "typedef struct Collidable\n" - "{\n" - " union {\n" - " int m_numChildShapes;\n" - " int m_bvhIndex;\n" - " };\n" - " float m_radius;\n" - " int m_shapeType;\n" - " int m_shapeIndex;\n" - "} Collidable;\n" - "typedef struct \n" - "{\n" - " float4 m_localCenter;\n" - " float4 m_extents;\n" - " float4 mC;\n" - " float4 mE;\n" - " float m_radius;\n" - " int m_faceOffset;\n" - " int m_numFaces;\n" - " int m_numVertices;\n" - " int m_vertexOffset;\n" - " int m_uniqueEdgesOffset;\n" - " int m_numUniqueEdges;\n" - " int m_unused;\n" - "} ConvexPolyhedronCL;\n" - "typedef struct\n" - "{\n" - " float4 m_plane;\n" - " int m_indexOffset;\n" - " int m_numIndices;\n" - "} b3GpuFace;\n" - "///////////////////////////////////////\n" - "// Quaternion\n" - "///////////////////////////////////////\n" - "typedef float4 Quaternion;\n" - "__inline\n" - " Quaternion qtMul(Quaternion a, Quaternion b);\n" - "__inline\n" - " Quaternion qtNormalize(Quaternion in);\n" - "__inline\n" - " Quaternion qtInvert(Quaternion q);\n" - "__inline\n" - " float dot3F4(float4 a, float4 b)\n" - "{\n" - " float4 a1 = (float4)(a.xyz,0.f);\n" - " float4 b1 = (float4)(b.xyz,0.f);\n" - " return dot(a1, b1);\n" - "}\n" - "__inline\n" - " Quaternion qtMul(Quaternion a, Quaternion b)\n" - "{\n" - " Quaternion ans;\n" - " ans = cross( a, b );\n" - " ans += a.w*b+b.w*a;\n" - " // ans.w = a.w*b.w - (a.x*b.x+a.y*b.y+a.z*b.z);\n" - " ans.w = a.w*b.w - dot3F4(a, b);\n" - " return ans;\n" - "}\n" - "__inline\n" - " Quaternion qtNormalize(Quaternion in)\n" - "{\n" - " return fast_normalize(in);\n" - " // in /= length( in );\n" - " // return in;\n" - "}\n" - "__inline\n" - " float4 qtRotate(Quaternion q, float4 vec)\n" - "{\n" - " Quaternion qInv = qtInvert( q );\n" - " float4 vcpy = vec;\n" - " vcpy.w = 0.f;\n" - " float4 out = qtMul(q,vcpy);\n" - " out = qtMul(out,qInv);\n" - " return out;\n" - "}\n" - "__inline\n" - " Quaternion qtInvert(Quaternion q)\n" - "{\n" - " return (Quaternion)(-q.xyz, q.w);\n" - "}\n" - "__inline\n" - " float4 qtInvRotate(const Quaternion q, float4 vec)\n" - "{\n" - " return qtRotate( qtInvert( q ), vec );\n" - "}\n" - "void trInverse(float4 translationIn, Quaternion orientationIn,\n" - " float4* translationOut, Quaternion* orientationOut)\n" - "{\n" - " *orientationOut = qtInvert(orientationIn);\n" - " *translationOut = qtRotate(*orientationOut, -translationIn);\n" - "}\n" - "bool rayConvex(float4 rayFromLocal, float4 rayToLocal, int numFaces, int faceOffset,\n" - " __global const b3GpuFace* faces, float* hitFraction, float4* hitNormal)\n" - "{\n" - " rayFromLocal.w = 0.f;\n" - " rayToLocal.w = 0.f;\n" - " bool result = true;\n" - " float exitFraction = hitFraction[0];\n" - " float enterFraction = -0.3f;\n" - " float4 curHitNormal = (float4)(0,0,0,0);\n" - " for (int i=0;i= 0.f)\n" - " {\n" - " float fraction = fromPlaneDist / (fromPlaneDist-toPlaneDist);\n" - " if (exitFraction>fraction)\n" - " {\n" - " exitFraction = fraction;\n" - " }\n" - " } \n" - " } else\n" - " {\n" - " if (toPlaneDist<0.f)\n" - " {\n" - " float fraction = fromPlaneDist / (fromPlaneDist-toPlaneDist);\n" - " if (enterFraction <= fraction)\n" - " {\n" - " enterFraction = fraction;\n" - " curHitNormal = face.m_plane;\n" - " curHitNormal.w = 0.f;\n" - " }\n" - " } else\n" - " {\n" - " result = false;\n" - " }\n" - " }\n" - " if (exitFraction <= enterFraction)\n" - " result = false;\n" - " }\n" - " if (enterFraction < 0.f)\n" - " {\n" - " result = false;\n" - " }\n" - " if (result)\n" - " { \n" - " hitFraction[0] = enterFraction;\n" - " hitNormal[0] = curHitNormal;\n" - " }\n" - " return result;\n" - "}\n" - "bool sphere_intersect(float4 spherePos, float radius, float4 rayFrom, float4 rayTo, float* hitFraction)\n" - "{\n" - " float4 rs = rayFrom - spherePos;\n" - " rs.w = 0.f;\n" - " float4 rayDir = rayTo-rayFrom;\n" - " rayDir.w = 0.f;\n" - " float A = dot(rayDir,rayDir);\n" - " float B = dot(rs, rayDir);\n" - " float C = dot(rs, rs) - (radius * radius);\n" - " float D = B * B - A*C;\n" - " if (D > 0.0f)\n" - " {\n" - " float t = (-B - sqrt(D))/A;\n" - " if ( (t >= 0.0f) && (t < (*hitFraction)) )\n" - " {\n" - " *hitFraction = t;\n" - " return true;\n" - " }\n" - " }\n" - " return false;\n" - "}\n" - "float4 setInterpolate3(float4 from, float4 to, float t)\n" - "{\n" - " float s = 1.0f - t;\n" - " float4 result;\n" - " result = s * from + t * to;\n" - " result.w = 0.f; \n" - " return result; \n" - "}\n" - "__kernel void rayCastKernel( \n" - " int numRays, \n" - " const __global b3RayInfo* rays, \n" - " __global b3RayHit* hitResults, \n" - " const int numBodies, \n" - " __global Body* bodies,\n" - " __global Collidable* collidables,\n" - " __global const b3GpuFace* faces,\n" - " __global const ConvexPolyhedronCL* convexShapes )\n" - "{\n" - " int i = get_global_id(0);\n" - " if (i>=numRays)\n" - " return;\n" - " hitResults[i].m_hitFraction = 1.f;\n" - " float4 rayFrom = rays[i].m_from;\n" - " float4 rayTo = rays[i].m_to;\n" - " float hitFraction = 1.f;\n" - " float4 hitPoint;\n" - " float4 hitNormal;\n" - " int hitBodyIndex= -1;\n" - " int cachedCollidableIndex = -1;\n" - " Collidable cachedCollidable;\n" - " for (int b=0;b=0)\n" - " {\n" - " hitPoint = setInterpolate3(rayFrom, rayTo,hitFraction);\n" - " hitResults[i].m_hitFraction = hitFraction;\n" - " hitResults[i].m_hitPoint = hitPoint;\n" - " hitResults[i].m_hitNormal = normalize(hitNormal);\n" - " hitResults[i].m_hitResult0 = hitBodyIndex;\n" - " }\n" - "}\n" - "__kernel void findRayRigidPairIndexRanges(__global int2* rayRigidPairs, \n" - " __global int* out_firstRayRigidPairIndexPerRay,\n" - " __global int* out_numRayRigidPairsPerRay,\n" - " int numRayRigidPairs)\n" - "{\n" - " int rayRigidPairIndex = get_global_id(0);\n" - " if (rayRigidPairIndex >= numRayRigidPairs) return;\n" - " \n" - " int rayIndex = rayRigidPairs[rayRigidPairIndex].x;\n" - " \n" - " atomic_min(&out_firstRayRigidPairIndexPerRay[rayIndex], rayRigidPairIndex);\n" - " atomic_inc(&out_numRayRigidPairsPerRay[rayIndex]);\n" - "}\n" - "__kernel void rayCastPairsKernel(const __global b3RayInfo* rays, \n" - " __global b3RayHit* hitResults, \n" - " __global int* firstRayRigidPairIndexPerRay,\n" - " __global int* numRayRigidPairsPerRay,\n" - " \n" - " __global Body* bodies,\n" - " __global Collidable* collidables,\n" - " __global const b3GpuFace* faces,\n" - " __global const ConvexPolyhedronCL* convexShapes,\n" - " \n" - " __global int2* rayRigidPairs,\n" - " int numRays)\n" - "{\n" - " int i = get_global_id(0);\n" - " if (i >= numRays) return;\n" - " \n" - " float4 rayFrom = rays[i].m_from;\n" - " float4 rayTo = rays[i].m_to;\n" - " \n" - " hitResults[i].m_hitFraction = 1.f;\n" - " \n" - " float hitFraction = 1.f;\n" - " float4 hitPoint;\n" - " float4 hitNormal;\n" - " int hitBodyIndex = -1;\n" - " \n" - " //\n" - " for(int pair = 0; pair < numRayRigidPairsPerRay[i]; ++pair)\n" - " {\n" - " int rayRigidPairIndex = pair + firstRayRigidPairIndexPerRay[i];\n" - " int b = rayRigidPairs[rayRigidPairIndex].y;\n" - " \n" - " if (hitResults[i].m_hitResult2 == b) continue;\n" - " \n" - " Body body = bodies[b];\n" - " Collidable rigidCollidable = collidables[body.m_collidableIdx];\n" - " \n" - " float4 pos = body.m_pos;\n" - " float4 orn = body.m_quat;\n" - " \n" - " if (rigidCollidable.m_shapeType == SHAPE_CONVEX_HULL)\n" - " {\n" - " float4 invPos = (float4)(0,0,0,0);\n" - " float4 invOrn = (float4)(0,0,0,0);\n" - " float4 rayFromLocal = (float4)(0,0,0,0);\n" - " float4 rayToLocal = (float4)(0,0,0,0);\n" - " invOrn = qtInvert(orn);\n" - " invPos = qtRotate(invOrn, -pos);\n" - " rayFromLocal = qtRotate( invOrn, rayFrom ) + invPos;\n" - " rayToLocal = qtRotate( invOrn, rayTo) + invPos;\n" - " rayFromLocal.w = 0.f;\n" - " rayToLocal.w = 0.f;\n" - " int numFaces = convexShapes[rigidCollidable.m_shapeIndex].m_numFaces;\n" - " int faceOffset = convexShapes[rigidCollidable.m_shapeIndex].m_faceOffset;\n" - " \n" - " if (numFaces && rayConvex(rayFromLocal, rayToLocal, numFaces, faceOffset,faces, &hitFraction, &hitNormal))\n" - " {\n" - " hitBodyIndex = b;\n" - " hitPoint = setInterpolate3(rayFrom, rayTo, hitFraction);\n" - " }\n" - " }\n" - " \n" - " if (rigidCollidable.m_shapeType == SHAPE_SPHERE)\n" - " {\n" - " float radius = rigidCollidable.m_radius;\n" - " \n" - " if (sphere_intersect(pos, radius, rayFrom, rayTo, &hitFraction))\n" - " {\n" - " hitBodyIndex = b;\n" - " hitPoint = setInterpolate3(rayFrom, rayTo, hitFraction);\n" - " hitNormal = (float4) (hitPoint - bodies[b].m_pos);\n" - " }\n" - " }\n" - " }\n" - " \n" - " if (hitBodyIndex >= 0)\n" - " {\n" - " hitResults[i].m_hitFraction = hitFraction;\n" - " hitResults[i].m_hitPoint = hitPoint;\n" - " hitResults[i].m_hitNormal = normalize(hitNormal);\n" - " hitResults[i].m_hitResult0 = hitBodyIndex;\n" - " }\n" - " \n" - "}\n"; diff --git a/engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuConstraint4.h b/engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuConstraint4.h deleted file mode 100644 index 89c0142a..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuConstraint4.h +++ /dev/null @@ -1,17 +0,0 @@ - -#ifndef B3_CONSTRAINT4_h -#define B3_CONSTRAINT4_h -#include "Bullet3Common/b3Vector3.h" - -#include "Bullet3Dynamics/shared/b3ContactConstraint4.h" - -B3_ATTRIBUTE_ALIGNED16(struct) -b3GpuConstraint4 : public b3ContactConstraint4 -{ - B3_DECLARE_ALIGNED_ALLOCATOR(); - - inline void setFrictionCoeff(float value) { m_linear[3] = value; } - inline float getFrictionCoeff() const { return m_linear[3]; } -}; - -#endif //B3_CONSTRAINT4_h diff --git a/engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuGenericConstraint.h b/engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuGenericConstraint.h deleted file mode 100644 index 1f163ba7..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuGenericConstraint.h +++ /dev/null @@ -1,128 +0,0 @@ -/* -Copyright (c) 2013 Advanced Micro Devices, Inc. - -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 Erwin Coumans - -#ifndef B3_GPU_GENERIC_CONSTRAINT_H -#define B3_GPU_GENERIC_CONSTRAINT_H - -#include "Bullet3Common/b3Quaternion.h" -struct b3RigidBodyData; -enum B3_CONSTRAINT_FLAGS -{ - B3_CONSTRAINT_FLAG_ENABLED = 1, -}; - -enum b3GpuGenericConstraintType -{ - B3_GPU_POINT2POINT_CONSTRAINT_TYPE = 3, - B3_GPU_FIXED_CONSTRAINT_TYPE = 4, - // B3_HINGE_CONSTRAINT_TYPE, - // B3_CONETWIST_CONSTRAINT_TYPE, - // B3_D6_CONSTRAINT_TYPE, - // B3_SLIDER_CONSTRAINT_TYPE, - // B3_CONTACT_CONSTRAINT_TYPE, - // B3_D6_SPRING_CONSTRAINT_TYPE, - // B3_GEAR_CONSTRAINT_TYPE, - - B3_GPU_MAX_CONSTRAINT_TYPE -}; - -struct b3GpuConstraintInfo2 -{ - // integrator parameters: frames per second (1/stepsize), default error - // reduction parameter (0..1). - b3Scalar fps, erp; - - // for the first and second body, pointers to two (linear and angular) - // n*3 jacobian sub matrices, stored by rows. these matrices will have - // been initialized to 0 on entry. if the second body is zero then the - // J2xx pointers may be 0. - b3Scalar *m_J1linearAxis, *m_J1angularAxis, *m_J2linearAxis, *m_J2angularAxis; - - // elements to jump from one row to the next in J's - int rowskip; - - // right hand sides of the equation J*v = c + cfm * lambda. cfm is the - // "constraint force mixing" vector. c is set to zero on entry, cfm is - // set to a constant value (typically very small or zero) value on entry. - b3Scalar *m_constraintError, *cfm; - - // lo and hi limits for variables (set to -/+ infinity on entry). - b3Scalar *m_lowerLimit, *m_upperLimit; - - // findex vector for variables. see the LCP solver interface for a - // description of what this does. this is set to -1 on entry. - // note that the returned indexes are relative to the first index of - // the constraint. - int* findex; - // number of solver iterations - int m_numIterations; - - //damping of the velocity - b3Scalar m_damping; -}; - -B3_ATTRIBUTE_ALIGNED16(struct) -b3GpuGenericConstraint -{ - int m_constraintType; - int m_rbA; - int m_rbB; - float m_breakingImpulseThreshold; - - b3Vector3 m_pivotInA; - b3Vector3 m_pivotInB; - b3Quaternion m_relTargetAB; - - int m_flags; - int m_uid; - int m_padding[2]; - - int getRigidBodyA() const - { - return m_rbA; - } - int getRigidBodyB() const - { - return m_rbB; - } - - const b3Vector3& getPivotInA() const - { - return m_pivotInA; - } - - const b3Vector3& getPivotInB() const - { - return m_pivotInB; - } - - int isEnabled() const - { - return m_flags & B3_CONSTRAINT_FLAG_ENABLED; - } - - float getBreakingImpulseThreshold() const - { - return m_breakingImpulseThreshold; - } - - ///internal method used by the constraint solver, don't use them directly - void getInfo1(unsigned int* info, const b3RigidBodyData* bodies); - - ///internal method used by the constraint solver, don't use them directly - void getInfo2(b3GpuConstraintInfo2 * info, const b3RigidBodyData* bodies); -}; - -#endif //B3_GPU_GENERIC_CONSTRAINT_H \ No newline at end of file diff --git a/engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuJacobiContactSolver.h b/engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuJacobiContactSolver.h deleted file mode 100644 index 8281aee0..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuJacobiContactSolver.h +++ /dev/null @@ -1,56 +0,0 @@ - -#ifndef B3_GPU_JACOBI_CONTACT_SOLVER_H -#define B3_GPU_JACOBI_CONTACT_SOLVER_H -#include "Bullet3OpenCL/Initialize/b3OpenCLInclude.h" -//#include "Bullet3Collision/NarrowPhaseCollision/shared/b3RigidBodyData.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3RigidBodyData.h" - -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3Contact4Data.h" -#include "Bullet3OpenCL/ParallelPrimitives/b3OpenCLArray.h" - -//struct b3InertiaData; -//b3InertiaData - -class b3TypedConstraint; - -struct b3JacobiSolverInfo -{ - int m_fixedBodyIndex; - - float m_deltaTime; - float m_positionDrift; - float m_positionConstraintCoeff; - int m_numIterations; - - b3JacobiSolverInfo() - : m_fixedBodyIndex(0), - m_deltaTime(1. / 60.f), - m_positionDrift(0.005f), - m_positionConstraintCoeff(0.99f), - m_numIterations(7) - { - } -}; -class b3GpuJacobiContactSolver -{ -protected: - struct b3GpuJacobiSolverInternalData* m_data; - - cl_context m_context; - cl_device_id m_device; - cl_command_queue m_queue; - -public: - b3GpuJacobiContactSolver(cl_context ctx, cl_device_id device, cl_command_queue queue, int pairCapacity); - virtual ~b3GpuJacobiContactSolver(); - - void solveContacts(int numBodies, cl_mem bodyBuf, cl_mem inertiaBuf, int numContacts, cl_mem contactBuf, const struct b3Config& config, int static0Index); - void solveGroupHost(b3RigidBodyData* bodies, b3InertiaData* inertias, int numBodies, struct b3Contact4* manifoldPtr, int numManifolds, const b3JacobiSolverInfo& solverInfo); - //void solveGroupHost(btRigidBodyCL* bodies,b3InertiaData* inertias,int numBodies,btContact4* manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btJacobiSolverInfo& solverInfo); - - //b3Scalar solveGroup(b3OpenCLArray* gpuBodies,b3OpenCLArray* gpuInertias, int numBodies,b3OpenCLArray* gpuConstraints,int numConstraints,const b3ContactSolverInfo& infoGlobal); - - //void solveGroup(btOpenCLArray* bodies,btOpenCLArray* inertias,btOpenCLArray* manifoldPtr,const btJacobiSolverInfo& solverInfo); - //void solveGroupMixed(btOpenCLArray* bodies,btOpenCLArray* inertias,btOpenCLArray* manifoldPtr,const btJacobiSolverInfo& solverInfo); -}; -#endif //B3_GPU_JACOBI_CONTACT_SOLVER_H diff --git a/engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuNarrowPhase.h b/engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuNarrowPhase.h deleted file mode 100644 index 21a68de3..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuNarrowPhase.h +++ /dev/null @@ -1,101 +0,0 @@ -#ifndef B3_GPU_NARROWPHASE_H -#define B3_GPU_NARROWPHASE_H - -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3Collidable.h" -#include "Bullet3OpenCL/Initialize/b3OpenCLInclude.h" -#include "Bullet3Common/b3AlignedObjectArray.h" -#include "Bullet3Common/b3Vector3.h" - -class b3GpuNarrowPhase -{ -protected: - struct b3GpuNarrowPhaseInternalData* m_data; - int m_acceleratedCompanionShapeIndex; - int m_planeBodyIndex; - int m_static0Index; - - cl_context m_context; - cl_device_id m_device; - cl_command_queue m_queue; - - int registerConvexHullShapeInternal(class b3ConvexUtility* convexPtr, b3Collidable& col); - int registerConcaveMeshShape(b3AlignedObjectArray* vertices, b3AlignedObjectArray* indices, b3Collidable& col, const float* scaling); - -public: - b3GpuNarrowPhase(cl_context vtx, cl_device_id dev, cl_command_queue q, const struct b3Config& config); - - virtual ~b3GpuNarrowPhase(void); - - int registerSphereShape(float radius); - int registerPlaneShape(const b3Vector3& planeNormal, float planeConstant); - - int registerCompoundShape(b3AlignedObjectArray* childShapes); - int registerFace(const b3Vector3& faceNormal, float faceConstant); - - int registerConcaveMesh(b3AlignedObjectArray* vertices, b3AlignedObjectArray* indices, const float* scaling); - - //do they need to be merged? - - int registerConvexHullShape(b3ConvexUtility* utilPtr); - int registerConvexHullShape(const float* vertices, int strideInBytes, int numVertices, const float* scaling); - - int registerRigidBody(int collidableIndex, float mass, const float* position, const float* orientation, const float* aabbMin, const float* aabbMax, bool writeToGpu); - void setObjectTransform(const float* position, const float* orientation, int bodyIndex); - - void writeAllBodiesToGpu(); - void reset(); - void readbackAllBodiesToCpu(); - bool getObjectTransformFromCpu(float* position, float* orientation, int bodyIndex) const; - - void setObjectTransformCpu(float* position, float* orientation, int bodyIndex); - void setObjectVelocityCpu(float* linVel, float* angVel, int bodyIndex); - - virtual void computeContacts(cl_mem broadphasePairs, int numBroadphasePairs, cl_mem aabbsWorldSpace, int numObjects); - - cl_mem getBodiesGpu(); - const struct b3RigidBodyData* getBodiesCpu() const; - //struct b3RigidBodyData* getBodiesCpu(); - - int getNumBodiesGpu() const; - - cl_mem getBodyInertiasGpu(); - int getNumBodyInertiasGpu() const; - - cl_mem getCollidablesGpu(); - const struct b3Collidable* getCollidablesCpu() const; - int getNumCollidablesGpu() const; - - const struct b3SapAabb* getLocalSpaceAabbsCpu() const; - - const struct b3Contact4* getContactsCPU() const; - - cl_mem getContactsGpu(); - int getNumContactsGpu() const; - - cl_mem getAabbLocalSpaceBufferGpu(); - - int getNumRigidBodies() const; - - int allocateCollidable(); - - int getStatic0Index() const - { - return m_static0Index; - } - b3Collidable& getCollidableCpu(int collidableIndex); - const b3Collidable& getCollidableCpu(int collidableIndex) const; - - const b3GpuNarrowPhaseInternalData* getInternalData() const - { - return m_data; - } - - b3GpuNarrowPhaseInternalData* getInternalData() - { - return m_data; - } - - const struct b3SapAabb& getLocalSpaceAabb(int collidableIndex) const; -}; - -#endif //B3_GPU_NARROWPHASE_H diff --git a/engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuNarrowPhaseInternalData.h b/engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuNarrowPhaseInternalData.h deleted file mode 100644 index 716a5ea0..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuNarrowPhaseInternalData.h +++ /dev/null @@ -1,89 +0,0 @@ - -#ifndef B3_GPU_NARROWPHASE_INTERNAL_DATA_H -#define B3_GPU_NARROWPHASE_INTERNAL_DATA_H - -#include "Bullet3OpenCL/ParallelPrimitives/b3OpenCLArray.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3ConvexPolyhedronData.h" -#include "Bullet3Collision/NarrowPhaseCollision/b3Config.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3Collidable.h" - -#include "Bullet3OpenCL/Initialize/b3OpenCLInclude.h" -#include "Bullet3Common/b3AlignedObjectArray.h" -#include "Bullet3Common/b3Vector3.h" - -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3RigidBodyData.h" -#include "Bullet3Collision/NarrowPhaseCollision/b3Contact4.h" -#include "Bullet3OpenCL/BroadphaseCollision/b3SapAabb.h" - -#include "Bullet3OpenCL/NarrowphaseCollision/b3QuantizedBvh.h" -#include "Bullet3OpenCL/NarrowphaseCollision/b3BvhInfo.h" -#include "Bullet3Common/shared/b3Int4.h" -#include "Bullet3Common/shared/b3Int2.h" - -class b3ConvexUtility; - -struct b3GpuNarrowPhaseInternalData -{ - b3AlignedObjectArray* m_convexData; - - b3AlignedObjectArray m_convexPolyhedra; - b3AlignedObjectArray m_uniqueEdges; - b3AlignedObjectArray m_convexVertices; - b3AlignedObjectArray m_convexIndices; - - b3OpenCLArray* m_convexPolyhedraGPU; - b3OpenCLArray* m_uniqueEdgesGPU; - b3OpenCLArray* m_convexVerticesGPU; - b3OpenCLArray* m_convexIndicesGPU; - - b3OpenCLArray* m_worldVertsB1GPU; - b3OpenCLArray* m_clippingFacesOutGPU; - b3OpenCLArray* m_worldNormalsAGPU; - b3OpenCLArray* m_worldVertsA1GPU; - b3OpenCLArray* m_worldVertsB2GPU; - - b3AlignedObjectArray m_cpuChildShapes; - b3OpenCLArray* m_gpuChildShapes; - - b3AlignedObjectArray m_convexFaces; - b3OpenCLArray* m_convexFacesGPU; - - struct GpuSatCollision* m_gpuSatCollision; - - b3OpenCLArray* m_triangleConvexPairs; - - b3OpenCLArray* m_pBufContactBuffersGPU[2]; - int m_currentContactBuffer; - b3AlignedObjectArray* m_pBufContactOutCPU; - - b3AlignedObjectArray* m_bodyBufferCPU; - b3OpenCLArray* m_bodyBufferGPU; - - b3AlignedObjectArray* m_inertiaBufferCPU; - b3OpenCLArray* m_inertiaBufferGPU; - - int m_numAcceleratedShapes; - int m_numAcceleratedRigidBodies; - - b3AlignedObjectArray m_collidablesCPU; - b3OpenCLArray* m_collidablesGPU; - - b3OpenCLArray* m_localShapeAABBGPU; - b3AlignedObjectArray* m_localShapeAABBCPU; - - b3AlignedObjectArray m_bvhData; - b3AlignedObjectArray m_meshInterfaces; - - b3AlignedObjectArray m_treeNodesCPU; - b3AlignedObjectArray m_subTreesCPU; - - b3AlignedObjectArray m_bvhInfoCPU; - b3OpenCLArray* m_bvhInfoGPU; - - b3OpenCLArray* m_treeNodesGPU; - b3OpenCLArray* m_subTreesGPU; - - b3Config m_config; -}; - -#endif //B3_GPU_NARROWPHASE_INTERNAL_DATA_H diff --git a/engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuPgsConstraintSolver.h b/engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuPgsConstraintSolver.h deleted file mode 100644 index 00bc544f..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuPgsConstraintSolver.h +++ /dev/null @@ -1,76 +0,0 @@ -/* -Copyright (c) 2013 Advanced Micro Devices, Inc. - -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 Erwin Coumans - -#ifndef B3_GPU_PGS_CONSTRAINT_SOLVER_H -#define B3_GPU_PGS_CONSTRAINT_SOLVER_H - -struct b3Contact4; -struct b3ContactPoint; - -class b3Dispatcher; - -#include "Bullet3Dynamics/ConstraintSolver/b3TypedConstraint.h" -#include "Bullet3Dynamics/ConstraintSolver/b3ContactSolverInfo.h" -#include "b3GpuSolverBody.h" -#include "b3GpuSolverConstraint.h" -#include "Bullet3OpenCL/ParallelPrimitives/b3OpenCLArray.h" -struct b3RigidBodyData; -struct b3InertiaData; - -#include "Bullet3OpenCL/Initialize/b3OpenCLInclude.h" -#include "b3GpuGenericConstraint.h" - -class b3GpuPgsConstraintSolver -{ -protected: - int m_staticIdx; - struct b3GpuPgsJacobiSolverInternalData* m_gpuData; - -protected: - b3AlignedObjectArray m_tmpSolverBodyPool; - b3GpuConstraintArray m_tmpSolverContactConstraintPool; - b3GpuConstraintArray m_tmpSolverNonContactConstraintPool; - b3GpuConstraintArray m_tmpSolverContactFrictionConstraintPool; - b3GpuConstraintArray m_tmpSolverContactRollingFrictionConstraintPool; - - b3AlignedObjectArray m_tmpConstraintSizesPool; - - bool m_usePgs; - void averageVelocities(); - - int m_maxOverrideNumSolverIterations; - - int m_numSplitImpulseRecoveries; - - // int getOrInitSolverBody(int bodyIndex, b3RigidBodyData* bodies,b3InertiaData* inertias); - void initSolverBody(int bodyIndex, b3GpuSolverBody* solverBody, b3RigidBodyData* rb); - -public: - b3GpuPgsConstraintSolver(cl_context ctx, cl_device_id device, cl_command_queue queue, bool usePgs); - virtual ~b3GpuPgsConstraintSolver(); - - virtual b3Scalar solveGroupCacheFriendlyIterations(b3OpenCLArray* gpuConstraints1, int numConstraints, const b3ContactSolverInfo& infoGlobal); - virtual b3Scalar solveGroupCacheFriendlySetup(b3OpenCLArray* gpuBodies, b3OpenCLArray* gpuInertias, int numBodies, b3OpenCLArray* gpuConstraints, int numConstraints, const b3ContactSolverInfo& infoGlobal); - b3Scalar solveGroupCacheFriendlyFinish(b3OpenCLArray* gpuBodies, b3OpenCLArray* gpuInertias, int numBodies, b3OpenCLArray* gpuConstraints, int numConstraints, const b3ContactSolverInfo& infoGlobal); - - b3Scalar solveGroup(b3OpenCLArray* gpuBodies, b3OpenCLArray* gpuInertias, int numBodies, b3OpenCLArray* gpuConstraints, int numConstraints, const b3ContactSolverInfo& infoGlobal); - void solveJoints(int numBodies, b3OpenCLArray* gpuBodies, b3OpenCLArray* gpuInertias, - int numConstraints, b3OpenCLArray* gpuConstraints); - - int sortConstraintByBatch3(struct b3BatchConstraint* cs, int numConstraints, int simdWidth, int staticIdx, int numBodies); - void recomputeBatches(); -}; - -#endif //B3_GPU_PGS_CONSTRAINT_SOLVER_H diff --git a/engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuPgsContactSolver.h b/engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuPgsContactSolver.h deleted file mode 100644 index 6ab7502a..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuPgsContactSolver.h +++ /dev/null @@ -1,37 +0,0 @@ - -#ifndef B3_GPU_BATCHING_PGS_SOLVER_H -#define B3_GPU_BATCHING_PGS_SOLVER_H - -#include "Bullet3OpenCL/Initialize/b3OpenCLInclude.h" -#include "Bullet3OpenCL/ParallelPrimitives/b3OpenCLArray.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3RigidBodyData.h" -#include "Bullet3Collision/NarrowPhaseCollision/b3Contact4.h" -#include "b3GpuConstraint4.h" - -class b3GpuPgsContactSolver -{ -protected: - int m_debugOutput; - - struct b3GpuBatchingPgsSolverInternalData* m_data; - - void batchContacts(b3OpenCLArray* contacts, int nContacts, b3OpenCLArray* n, b3OpenCLArray* offsets, int staticIdx); - - inline int sortConstraintByBatch(b3Contact4* cs, int n, int simdWidth, int staticIdx, int numBodies); - inline int sortConstraintByBatch2(b3Contact4* cs, int n, int simdWidth, int staticIdx, int numBodies); - inline int sortConstraintByBatch3(b3Contact4* cs, int n, int simdWidth, int staticIdx, int numBodies, int* batchSizes); - - void solveContactConstraintBatchSizes(const b3OpenCLArray* bodyBuf, const b3OpenCLArray* shapeBuf, - b3OpenCLArray* constraint, void* additionalData, int n, int maxNumBatches, int numIterations, const b3AlignedObjectArray* batchSizes); //const b3OpenCLArray* gpuBatchSizes); - - void solveContactConstraint(const b3OpenCLArray* bodyBuf, const b3OpenCLArray* shapeBuf, - b3OpenCLArray* constraint, void* additionalData, int n, int maxNumBatches, int numIterations, const b3AlignedObjectArray* batchSizes); //const b3OpenCLArray* gpuBatchSizes); - -public: - b3GpuPgsContactSolver(cl_context ctx, cl_device_id device, cl_command_queue q, int pairCapacity); - virtual ~b3GpuPgsContactSolver(); - - void solveContacts(int numBodies, cl_mem bodyBuf, cl_mem inertiaBuf, int numContacts, cl_mem contactBuf, const struct b3Config& config, int static0Index); -}; - -#endif //B3_GPU_BATCHING_PGS_SOLVER_H diff --git a/engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipeline.h b/engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipeline.h deleted file mode 100644 index 0e5c6fec..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipeline.h +++ /dev/null @@ -1,70 +0,0 @@ -/* -Copyright (c) 2013 Advanced Micro Devices, Inc. - -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 Erwin Coumans - -#ifndef B3_GPU_RIGIDBODY_PIPELINE_H -#define B3_GPU_RIGIDBODY_PIPELINE_H - -#include "Bullet3OpenCL/Initialize/b3OpenCLInclude.h" -#include "Bullet3Collision/NarrowPhaseCollision/b3Config.h" - -#include "Bullet3Common/b3AlignedObjectArray.h" -#include "Bullet3Collision/NarrowPhaseCollision/b3RaycastInfo.h" - -class b3GpuRigidBodyPipeline -{ -protected: - struct b3GpuRigidBodyPipelineInternalData* m_data; - - int allocateCollidable(); - -public: - b3GpuRigidBodyPipeline(cl_context ctx, cl_device_id device, cl_command_queue q, class b3GpuNarrowPhase* narrowphase, class b3GpuBroadphaseInterface* broadphaseSap, struct b3DynamicBvhBroadphase* broadphaseDbvt, const b3Config& config); - virtual ~b3GpuRigidBodyPipeline(); - - void stepSimulation(float deltaTime); - void integrate(float timeStep); - void setupGpuAabbsFull(); - - int registerConvexPolyhedron(class b3ConvexUtility* convex); - - //int registerConvexPolyhedron(const float* vertices, int strideInBytes, int numVertices, const float* scaling); - //int registerSphereShape(float radius); - //int registerPlaneShape(const b3Vector3& planeNormal, float planeConstant); - - //int registerConcaveMesh(b3AlignedObjectArray* vertices, b3AlignedObjectArray* indices, const float* scaling); - //int registerCompoundShape(b3AlignedObjectArray* childShapes); - - int registerPhysicsInstance(float mass, const float* position, const float* orientation, int collisionShapeIndex, int userData, bool writeInstanceToGpu); - //if you passed "writeInstanceToGpu" false in the registerPhysicsInstance method (for performance) you need to call writeAllInstancesToGpu after all instances are registered - void writeAllInstancesToGpu(); - void copyConstraintsToHost(); - void setGravity(const float* grav); - void reset(); - - int createPoint2PointConstraint(int bodyA, int bodyB, const float* pivotInA, const float* pivotInB, float breakingThreshold); - int createFixedConstraint(int bodyA, int bodyB, const float* pivotInA, const float* pivotInB, const float* relTargetAB, float breakingThreshold); - void removeConstraintByUid(int uid); - - void addConstraint(class b3TypedConstraint* constraint); - void removeConstraint(b3TypedConstraint* constraint); - - void castRays(const b3AlignedObjectArray& rays, b3AlignedObjectArray& hitResults); - - cl_mem getBodyBuffer(); - - int getNumBodies() const; -}; - -#endif //B3_GPU_RIGIDBODY_PIPELINE_H \ No newline at end of file diff --git a/engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipelineInternalData.h b/engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipelineInternalData.h deleted file mode 100644 index e0a26fda..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipelineInternalData.h +++ /dev/null @@ -1,68 +0,0 @@ -/* -Copyright (c) 2013 Advanced Micro Devices, Inc. - -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 Erwin Coumans - -#ifndef B3_GPU_RIGIDBODY_PIPELINE_INTERNAL_DATA_H -#define B3_GPU_RIGIDBODY_PIPELINE_INTERNAL_DATA_H - -#include "Bullet3OpenCL/Initialize/b3OpenCLInclude.h" -#include "Bullet3Common/b3AlignedObjectArray.h" - -#include "Bullet3OpenCL/ParallelPrimitives/b3OpenCLArray.h" -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3Collidable.h" - -#include "Bullet3OpenCL/BroadphaseCollision/b3SapAabb.h" -#include "Bullet3Dynamics/ConstraintSolver/b3TypedConstraint.h" -#include "Bullet3Collision/NarrowPhaseCollision/b3Config.h" - -#include "Bullet3Collision/BroadPhaseCollision/b3OverlappingPair.h" -#include "Bullet3OpenCL/RigidBody/b3GpuGenericConstraint.h" - -struct b3GpuRigidBodyPipelineInternalData -{ - cl_context m_context; - cl_device_id m_device; - cl_command_queue m_queue; - - cl_kernel m_integrateTransformsKernel; - cl_kernel m_updateAabbsKernel; - cl_kernel m_clearOverlappingPairsKernel; - - class b3PgsJacobiSolver* m_solver; - - class b3GpuPgsConstraintSolver* m_gpuSolver; - - class b3GpuPgsContactSolver* m_solver2; - class b3GpuJacobiContactSolver* m_solver3; - class b3GpuRaycast* m_raycaster; - - class b3GpuBroadphaseInterface* m_broadphaseSap; - - struct b3DynamicBvhBroadphase* m_broadphaseDbvt; - b3OpenCLArray* m_allAabbsGPU; - b3AlignedObjectArray m_allAabbsCPU; - b3OpenCLArray* m_overlappingPairsGPU; - - b3OpenCLArray* m_gpuConstraints; - b3AlignedObjectArray m_cpuConstraints; - - b3AlignedObjectArray m_joints; - int m_constraintUid; - class b3GpuNarrowPhase* m_narrowphase; - b3Vector3 m_gravity; - - b3Config m_config; -}; - -#endif //B3_GPU_RIGIDBODY_PIPELINE_INTERNAL_DATA_H diff --git a/engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuSolverBody.h b/engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuSolverBody.h deleted file mode 100644 index db815d9b..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuSolverBody.h +++ /dev/null @@ -1,210 +0,0 @@ -/* -Copyright (c) 2013 Advanced Micro Devices, Inc. - -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 Erwin Coumans - -#ifndef B3_GPU_SOLVER_BODY_H -#define B3_GPU_SOLVER_BODY_H - -#include "Bullet3Common/b3Vector3.h" -#include "Bullet3Common/b3Matrix3x3.h" - -#include "Bullet3Common/b3AlignedAllocator.h" -#include "Bullet3Common/b3TransformUtil.h" - -///Until we get other contributions, only use SIMD on Windows, when using Visual Studio 2008 or later, and not double precision -#ifdef B3_USE_SSE -#define USE_SIMD 1 -#endif // - -///The b3SolverBody is an internal datastructure for the constraint solver. Only necessary data is packed to increase cache coherence/performance. -B3_ATTRIBUTE_ALIGNED16(struct) -b3GpuSolverBody -{ - B3_DECLARE_ALIGNED_ALLOCATOR(); - // b3Transform m_worldTransformUnused; - b3Vector3 m_deltaLinearVelocity; - b3Vector3 m_deltaAngularVelocity; - b3Vector3 m_angularFactor; - b3Vector3 m_linearFactor; - b3Vector3 m_invMass; - b3Vector3 m_pushVelocity; - b3Vector3 m_turnVelocity; - b3Vector3 m_linearVelocity; - b3Vector3 m_angularVelocity; - - union { - void* m_originalBody; - int m_originalBodyIndex; - }; - - int padding[3]; - - /* - void setWorldTransform(const b3Transform& worldTransform) - { - m_worldTransform = worldTransform; - } - - const b3Transform& getWorldTransform() const - { - return m_worldTransform; - } - */ - B3_FORCE_INLINE void getVelocityInLocalPointObsolete(const b3Vector3& rel_pos, b3Vector3& velocity) const - { - if (m_originalBody) - velocity = m_linearVelocity + m_deltaLinearVelocity + (m_angularVelocity + m_deltaAngularVelocity).cross(rel_pos); - else - velocity.setValue(0, 0, 0); - } - - B3_FORCE_INLINE void getAngularVelocity(b3Vector3 & angVel) const - { - if (m_originalBody) - angVel = m_angularVelocity + m_deltaAngularVelocity; - else - angVel.setValue(0, 0, 0); - } - - //Optimization for the iterative solver: avoid calculating constant terms involving inertia, normal, relative position - B3_FORCE_INLINE void applyImpulse(const b3Vector3& linearComponent, const b3Vector3& angularComponent, const b3Scalar impulseMagnitude) - { - if (m_originalBody) - { - m_deltaLinearVelocity += linearComponent * impulseMagnitude * m_linearFactor; - m_deltaAngularVelocity += angularComponent * (impulseMagnitude * m_angularFactor); - } - } - - B3_FORCE_INLINE void internalApplyPushImpulse(const b3Vector3& linearComponent, const b3Vector3& angularComponent, b3Scalar impulseMagnitude) - { - if (m_originalBody) - { - m_pushVelocity += linearComponent * impulseMagnitude * m_linearFactor; - m_turnVelocity += angularComponent * (impulseMagnitude * m_angularFactor); - } - } - - const b3Vector3& getDeltaLinearVelocity() const - { - return m_deltaLinearVelocity; - } - - const b3Vector3& getDeltaAngularVelocity() const - { - return m_deltaAngularVelocity; - } - - const b3Vector3& getPushVelocity() const - { - return m_pushVelocity; - } - - const b3Vector3& getTurnVelocity() const - { - return m_turnVelocity; - } - - //////////////////////////////////////////////// - ///some internal methods, don't use them - - b3Vector3& internalGetDeltaLinearVelocity() - { - return m_deltaLinearVelocity; - } - - b3Vector3& internalGetDeltaAngularVelocity() - { - return m_deltaAngularVelocity; - } - - const b3Vector3& internalGetAngularFactor() const - { - return m_angularFactor; - } - - const b3Vector3& internalGetInvMass() const - { - return m_invMass; - } - - void internalSetInvMass(const b3Vector3& invMass) - { - m_invMass = invMass; - } - - b3Vector3& internalGetPushVelocity() - { - return m_pushVelocity; - } - - b3Vector3& internalGetTurnVelocity() - { - return m_turnVelocity; - } - - B3_FORCE_INLINE void internalGetVelocityInLocalPointObsolete(const b3Vector3& rel_pos, b3Vector3& velocity) const - { - velocity = m_linearVelocity + m_deltaLinearVelocity + (m_angularVelocity + m_deltaAngularVelocity).cross(rel_pos); - } - - B3_FORCE_INLINE void internalGetAngularVelocity(b3Vector3 & angVel) const - { - angVel = m_angularVelocity + m_deltaAngularVelocity; - } - - //Optimization for the iterative solver: avoid calculating constant terms involving inertia, normal, relative position - B3_FORCE_INLINE void internalApplyImpulse(const b3Vector3& linearComponent, const b3Vector3& angularComponent, const b3Scalar impulseMagnitude) - { - //if (m_originalBody) - { - m_deltaLinearVelocity += linearComponent * impulseMagnitude * m_linearFactor; - m_deltaAngularVelocity += angularComponent * (impulseMagnitude * m_angularFactor); - } - } - - void writebackVelocity() - { - //if (m_originalBody>=0) - { - m_linearVelocity += m_deltaLinearVelocity; - m_angularVelocity += m_deltaAngularVelocity; - - //m_originalBody->setCompanionId(-1); - } - } - - void writebackVelocityAndTransform(b3Scalar timeStep, b3Scalar splitImpulseTurnErp) - { - (void)timeStep; - if (m_originalBody) - { - m_linearVelocity += m_deltaLinearVelocity; - m_angularVelocity += m_deltaAngularVelocity; - - //correct the position/orientation based on push/turn recovery - b3Transform newTransform; - if (m_pushVelocity[0] != 0.f || m_pushVelocity[1] != 0 || m_pushVelocity[2] != 0 || m_turnVelocity[0] != 0.f || m_turnVelocity[1] != 0 || m_turnVelocity[2] != 0) - { - // b3Quaternion orn = m_worldTransform.getRotation(); - // b3TransformUtil::integrateTransform(m_worldTransform,m_pushVelocity,m_turnVelocity*splitImpulseTurnErp,timeStep,newTransform); - // m_worldTransform = newTransform; - } - //m_worldTransform.setRotation(orn); - //m_originalBody->setCompanionId(-1); - } - } -}; - -#endif //B3_SOLVER_BODY_H diff --git a/engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuSolverConstraint.h b/engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuSolverConstraint.h deleted file mode 100644 index 7d9eea24..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/RigidBody/b3GpuSolverConstraint.h +++ /dev/null @@ -1,73 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2013 Erwin Coumans http://github.com/erwincoumans/bullet3 - -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 B3_GPU_SOLVER_CONSTRAINT_H -#define B3_GPU_SOLVER_CONSTRAINT_H - -#include "Bullet3Common/b3Vector3.h" -#include "Bullet3Common/b3Matrix3x3.h" -//#include "b3JacobianEntry.h" -#include "Bullet3Common/b3AlignedObjectArray.h" - -//#define NO_FRICTION_TANGENTIALS 1 - -///1D constraint along a normal axis between bodyA and bodyB. It can be combined to solve contact and friction constraints. -B3_ATTRIBUTE_ALIGNED16(struct) -b3GpuSolverConstraint -{ - B3_DECLARE_ALIGNED_ALLOCATOR(); - - b3Vector3 m_relpos1CrossNormal; - b3Vector3 m_contactNormal; - - b3Vector3 m_relpos2CrossNormal; - //b3Vector3 m_contactNormal2;//usually m_contactNormal2 == -m_contactNormal - - b3Vector3 m_angularComponentA; - b3Vector3 m_angularComponentB; - - mutable b3Scalar m_appliedPushImpulse; - mutable b3Scalar m_appliedImpulse; - int m_padding1; - int m_padding2; - b3Scalar m_friction; - b3Scalar m_jacDiagABInv; - b3Scalar m_rhs; - b3Scalar m_cfm; - - b3Scalar m_lowerLimit; - b3Scalar m_upperLimit; - b3Scalar m_rhsPenetration; - union { - void* m_originalContactPoint; - int m_originalConstraintIndex; - b3Scalar m_unusedPadding4; - }; - - int m_overrideNumSolverIterations; - int m_frictionIndex; - int m_solverBodyIdA; - int m_solverBodyIdB; - - enum b3SolverConstraintType - { - B3_SOLVER_CONTACT_1D = 0, - B3_SOLVER_FRICTION_1D - }; -}; - -typedef b3AlignedObjectArray b3GpuConstraintArray; - -#endif //B3_GPU_SOLVER_CONSTRAINT_H diff --git a/engine/inc/bullet/Bullet3OpenCL/RigidBody/b3Solver.h b/engine/inc/bullet/Bullet3OpenCL/RigidBody/b3Solver.h deleted file mode 100644 index ee63531d..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/RigidBody/b3Solver.h +++ /dev/null @@ -1,110 +0,0 @@ -/* -Copyright (c) 2012 Advanced Micro Devices, Inc. - -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 Takahiro Harada - -#ifndef __ADL_SOLVER_H -#define __ADL_SOLVER_H - -#include "Bullet3OpenCL/ParallelPrimitives/b3OpenCLArray.h" -#include "b3GpuConstraint4.h" - -#include "Bullet3Collision/NarrowPhaseCollision/shared/b3RigidBodyData.h" -#include "Bullet3Collision/NarrowPhaseCollision/b3Contact4.h" - -#include "Bullet3OpenCL/ParallelPrimitives/b3PrefixScanCL.h" -#include "Bullet3OpenCL/ParallelPrimitives/b3RadixSort32CL.h" -#include "Bullet3OpenCL/ParallelPrimitives/b3BoundSearchCL.h" - -#include "Bullet3OpenCL/Initialize/b3OpenCLUtils.h" - -#define B3NEXTMULTIPLEOF(num, alignment) (((num) / (alignment) + (((num) % (alignment) == 0) ? 0 : 1)) * (alignment)) - -enum -{ - B3_SOLVER_N_SPLIT_X = 8, //16,//4, - B3_SOLVER_N_SPLIT_Y = 4, //16,//4, - B3_SOLVER_N_SPLIT_Z = 8, //, - B3_SOLVER_N_CELLS = B3_SOLVER_N_SPLIT_X * B3_SOLVER_N_SPLIT_Y * B3_SOLVER_N_SPLIT_Z, - B3_SOLVER_N_BATCHES = 8, //4,//8,//4, - B3_MAX_NUM_BATCHES = 128, -}; - -class b3SolverBase -{ -public: - struct ConstraintCfg - { - ConstraintCfg(float dt = 0.f) : m_positionDrift(0.005f), m_positionConstraintCoeff(0.2f), m_dt(dt), m_staticIdx(-1) {} - - float m_positionDrift; - float m_positionConstraintCoeff; - float m_dt; - bool m_enableParallelSolve; - float m_batchCellSize; - int m_staticIdx; - }; -}; - -class b3Solver : public b3SolverBase -{ -public: - cl_context m_context; - cl_device_id m_device; - cl_command_queue m_queue; - - b3OpenCLArray* m_numConstraints; - b3OpenCLArray* m_offsets; - b3OpenCLArray m_batchSizes; - - int m_nIterations; - cl_kernel m_batchingKernel; - cl_kernel m_batchingKernelNew; - cl_kernel m_solveContactKernel; - cl_kernel m_solveFrictionKernel; - cl_kernel m_contactToConstraintKernel; - cl_kernel m_setSortDataKernel; - cl_kernel m_reorderContactKernel; - cl_kernel m_copyConstraintKernel; - - class b3RadixSort32CL* m_sort32; - class b3BoundSearchCL* m_search; - class b3PrefixScanCL* m_scan; - - b3OpenCLArray* m_sortDataBuffer; - b3OpenCLArray* m_contactBuffer2; - - enum - { - DYNAMIC_CONTACT_ALLOCATION_THRESHOLD = 2000000, - }; - - b3Solver(cl_context ctx, cl_device_id device, cl_command_queue queue, int pairCapacity); - - virtual ~b3Solver(); - - void solveContactConstraint(const b3OpenCLArray* bodyBuf, const b3OpenCLArray* inertiaBuf, - b3OpenCLArray* constraint, void* additionalData, int n, int maxNumBatches); - - void solveContactConstraintHost(b3OpenCLArray* bodyBuf, b3OpenCLArray* shapeBuf, - b3OpenCLArray* constraint, void* additionalData, int n, int maxNumBatches, b3AlignedObjectArray* batchSizes); - - void convertToConstraints(const b3OpenCLArray* bodyBuf, - const b3OpenCLArray* shapeBuf, - b3OpenCLArray* contactsIn, b3OpenCLArray* contactCOut, void* additionalData, - int nContacts, const ConstraintCfg& cfg); - - void batchContacts(b3OpenCLArray* contacts, int nContacts, b3OpenCLArray* n, b3OpenCLArray* offsets, int staticIdx); -}; - -#endif //__ADL_SOLVER_H diff --git a/engine/inc/bullet/Bullet3OpenCL/RigidBody/kernels/batchingKernels.h b/engine/inc/bullet/Bullet3OpenCL/RigidBody/kernels/batchingKernels.h deleted file mode 100644 index 7c73c96b..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/RigidBody/kernels/batchingKernels.h +++ /dev/null @@ -1,387 +0,0 @@ -//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project -static const char* batchingKernelsCL = - "/*\n" - "Copyright (c) 2012 Advanced Micro Devices, Inc. \n" - "This software is provided 'as-is', without any express or implied warranty.\n" - "In no event will the authors be held liable for any damages arising from the use of this software.\n" - "Permission is granted to anyone to use this software for any purpose, \n" - "including commercial applications, and to alter it and redistribute it freely, \n" - "subject to the following restrictions:\n" - "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.\n" - "2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.\n" - "3. This notice may not be removed or altered from any source distribution.\n" - "*/\n" - "//Originally written by Takahiro Harada\n" - "#ifndef B3_CONTACT4DATA_H\n" - "#define B3_CONTACT4DATA_H\n" - "#ifndef B3_FLOAT4_H\n" - "#define B3_FLOAT4_H\n" - "#ifndef B3_PLATFORM_DEFINITIONS_H\n" - "#define B3_PLATFORM_DEFINITIONS_H\n" - "struct MyTest\n" - "{\n" - " int bla;\n" - "};\n" - "#ifdef __cplusplus\n" - "#else\n" - "//keep B3_LARGE_FLOAT*B3_LARGE_FLOAT < FLT_MAX\n" - "#define B3_LARGE_FLOAT 1e18f\n" - "#define B3_INFINITY 1e18f\n" - "#define b3Assert(a)\n" - "#define b3ConstArray(a) __global const a*\n" - "#define b3AtomicInc atomic_inc\n" - "#define b3AtomicAdd atomic_add\n" - "#define b3Fabs fabs\n" - "#define b3Sqrt native_sqrt\n" - "#define b3Sin native_sin\n" - "#define b3Cos native_cos\n" - "#define B3_STATIC\n" - "#endif\n" - "#endif\n" - "#ifdef __cplusplus\n" - "#else\n" - " typedef float4 b3Float4;\n" - " #define b3Float4ConstArg const b3Float4\n" - " #define b3MakeFloat4 (float4)\n" - " float b3Dot3F4(b3Float4ConstArg v0,b3Float4ConstArg v1)\n" - " {\n" - " float4 a1 = b3MakeFloat4(v0.xyz,0.f);\n" - " float4 b1 = b3MakeFloat4(v1.xyz,0.f);\n" - " return dot(a1, b1);\n" - " }\n" - " b3Float4 b3Cross3(b3Float4ConstArg v0,b3Float4ConstArg v1)\n" - " {\n" - " float4 a1 = b3MakeFloat4(v0.xyz,0.f);\n" - " float4 b1 = b3MakeFloat4(v1.xyz,0.f);\n" - " return cross(a1, b1);\n" - " }\n" - " #define b3MinFloat4 min\n" - " #define b3MaxFloat4 max\n" - " #define b3Normalized(a) normalize(a)\n" - "#endif \n" - " \n" - "inline bool b3IsAlmostZero(b3Float4ConstArg v)\n" - "{\n" - " if(b3Fabs(v.x)>1e-6 || b3Fabs(v.y)>1e-6 || b3Fabs(v.z)>1e-6) \n" - " return false;\n" - " return true;\n" - "}\n" - "inline int b3MaxDot( b3Float4ConstArg vec, __global const b3Float4* vecArray, int vecLen, float* dotOut )\n" - "{\n" - " float maxDot = -B3_INFINITY;\n" - " int i = 0;\n" - " int ptIndex = -1;\n" - " for( i = 0; i < vecLen; i++ )\n" - " {\n" - " float dot = b3Dot3F4(vecArray[i],vec);\n" - " \n" - " if( dot > maxDot )\n" - " {\n" - " maxDot = dot;\n" - " ptIndex = i;\n" - " }\n" - " }\n" - " b3Assert(ptIndex>=0);\n" - " if (ptIndex<0)\n" - " {\n" - " ptIndex = 0;\n" - " }\n" - " *dotOut = maxDot;\n" - " return ptIndex;\n" - "}\n" - "#endif //B3_FLOAT4_H\n" - "typedef struct b3Contact4Data b3Contact4Data_t;\n" - "struct b3Contact4Data\n" - "{\n" - " b3Float4 m_worldPosB[4];\n" - "// b3Float4 m_localPosA[4];\n" - "// b3Float4 m_localPosB[4];\n" - " b3Float4 m_worldNormalOnB; // w: m_nPoints\n" - " unsigned short m_restituitionCoeffCmp;\n" - " unsigned short m_frictionCoeffCmp;\n" - " int m_batchIdx;\n" - " int m_bodyAPtrAndSignBit;//x:m_bodyAPtr, y:m_bodyBPtr\n" - " int m_bodyBPtrAndSignBit;\n" - " int m_childIndexA;\n" - " int m_childIndexB;\n" - " int m_unused1;\n" - " int m_unused2;\n" - "};\n" - "inline int b3Contact4Data_getNumPoints(const struct b3Contact4Data* contact)\n" - "{\n" - " return (int)contact->m_worldNormalOnB.w;\n" - "};\n" - "inline void b3Contact4Data_setNumPoints(struct b3Contact4Data* contact, int numPoints)\n" - "{\n" - " contact->m_worldNormalOnB.w = (float)numPoints;\n" - "};\n" - "#endif //B3_CONTACT4DATA_H\n" - "#pragma OPENCL EXTENSION cl_amd_printf : enable\n" - "#pragma OPENCL EXTENSION cl_khr_local_int32_base_atomics : enable\n" - "#pragma OPENCL EXTENSION cl_khr_global_int32_base_atomics : enable\n" - "#pragma OPENCL EXTENSION cl_khr_local_int32_extended_atomics : enable\n" - "#pragma OPENCL EXTENSION cl_khr_global_int32_extended_atomics : enable\n" - "#ifdef cl_ext_atomic_counters_32\n" - "#pragma OPENCL EXTENSION cl_ext_atomic_counters_32 : enable\n" - "#else\n" - "#define counter32_t volatile __global int*\n" - "#endif\n" - "typedef unsigned int u32;\n" - "typedef unsigned short u16;\n" - "typedef unsigned char u8;\n" - "#define GET_GROUP_IDX get_group_id(0)\n" - "#define GET_LOCAL_IDX get_local_id(0)\n" - "#define GET_GLOBAL_IDX get_global_id(0)\n" - "#define GET_GROUP_SIZE get_local_size(0)\n" - "#define GET_NUM_GROUPS get_num_groups(0)\n" - "#define GROUP_LDS_BARRIER barrier(CLK_LOCAL_MEM_FENCE)\n" - "#define GROUP_MEM_FENCE mem_fence(CLK_LOCAL_MEM_FENCE)\n" - "#define AtomInc(x) atom_inc(&(x))\n" - "#define AtomInc1(x, out) out = atom_inc(&(x))\n" - "#define AppendInc(x, out) out = atomic_inc(x)\n" - "#define AtomAdd(x, value) atom_add(&(x), value)\n" - "#define AtomCmpxhg(x, cmp, value) atom_cmpxchg( &(x), cmp, value )\n" - "#define AtomXhg(x, value) atom_xchg ( &(x), value )\n" - "#define SELECT_UINT4( b, a, condition ) select( b,a,condition )\n" - "#define make_float4 (float4)\n" - "#define make_float2 (float2)\n" - "#define make_uint4 (uint4)\n" - "#define make_int4 (int4)\n" - "#define make_uint2 (uint2)\n" - "#define make_int2 (int2)\n" - "#define max2 max\n" - "#define min2 min\n" - "#define WG_SIZE 64\n" - "typedef struct \n" - "{\n" - " int m_n;\n" - " int m_start;\n" - " int m_staticIdx;\n" - " int m_paddings[1];\n" - "} ConstBuffer;\n" - "typedef struct \n" - "{\n" - " int m_a;\n" - " int m_b;\n" - " u32 m_idx;\n" - "}Elem;\n" - "#define STACK_SIZE (WG_SIZE*10)\n" - "//#define STACK_SIZE (WG_SIZE)\n" - "#define RING_SIZE 1024\n" - "#define RING_SIZE_MASK (RING_SIZE-1)\n" - "#define CHECK_SIZE (WG_SIZE)\n" - "#define GET_RING_CAPACITY (RING_SIZE - ldsRingEnd)\n" - "#define RING_END ldsTmp\n" - "u32 readBuf(__local u32* buff, int idx)\n" - "{\n" - " idx = idx % (32*CHECK_SIZE);\n" - " int bitIdx = idx%32;\n" - " int bufIdx = idx/32;\n" - " return buff[bufIdx] & (1<> bitIdx)&1) == 0;\n" - "}\n" - "// batching on the GPU\n" - "__kernel void CreateBatches( __global const struct b3Contact4Data* gConstraints, __global struct b3Contact4Data* gConstraintsOut,\n" - " __global const u32* gN, __global const u32* gStart, __global int* batchSizes, \n" - " int m_staticIdx )\n" - "{\n" - " __local u32 ldsStackIdx[STACK_SIZE];\n" - " __local u32 ldsStackEnd;\n" - " __local Elem ldsRingElem[RING_SIZE];\n" - " __local u32 ldsRingEnd;\n" - " __local u32 ldsTmp;\n" - " __local u32 ldsCheckBuffer[CHECK_SIZE];\n" - " __local u32 ldsFixedBuffer[CHECK_SIZE];\n" - " __local u32 ldsGEnd;\n" - " __local u32 ldsDstEnd;\n" - " int wgIdx = GET_GROUP_IDX;\n" - " int lIdx = GET_LOCAL_IDX;\n" - " \n" - " const int m_n = gN[wgIdx];\n" - " const int m_start = gStart[wgIdx];\n" - " \n" - " if( lIdx == 0 )\n" - " {\n" - " ldsRingEnd = 0;\n" - " ldsGEnd = 0;\n" - " ldsStackEnd = 0;\n" - " ldsDstEnd = m_start;\n" - " }\n" - " \n" - " \n" - " \n" - "// while(1)\n" - "//was 250\n" - " int ie=0;\n" - " int maxBatch = 0;\n" - " for(ie=0; ie<50; ie++)\n" - " {\n" - " ldsFixedBuffer[lIdx] = 0;\n" - " for(int giter=0; giter<4; giter++)\n" - " {\n" - " int ringCap = GET_RING_CAPACITY;\n" - " \n" - " // 1. fill ring\n" - " if( ldsGEnd < m_n )\n" - " {\n" - " while( ringCap > WG_SIZE )\n" - " {\n" - " if( ldsGEnd >= m_n ) break;\n" - " if( lIdx < ringCap - WG_SIZE )\n" - " {\n" - " int srcIdx;\n" - " AtomInc1( ldsGEnd, srcIdx );\n" - " if( srcIdx < m_n )\n" - " {\n" - " int dstIdx;\n" - " AtomInc1( ldsRingEnd, dstIdx );\n" - " \n" - " int a = gConstraints[m_start+srcIdx].m_bodyAPtrAndSignBit;\n" - " int b = gConstraints[m_start+srcIdx].m_bodyBPtrAndSignBit;\n" - " ldsRingElem[dstIdx].m_a = (a>b)? b:a;\n" - " ldsRingElem[dstIdx].m_b = (a>b)? a:b;\n" - " ldsRingElem[dstIdx].m_idx = srcIdx;\n" - " }\n" - " }\n" - " ringCap = GET_RING_CAPACITY;\n" - " }\n" - " }\n" - " GROUP_LDS_BARRIER;\n" - " \n" - " // 2. fill stack\n" - " __local Elem* dst = ldsRingElem;\n" - " if( lIdx == 0 ) RING_END = 0;\n" - " int srcIdx=lIdx;\n" - " int end = ldsRingEnd;\n" - " {\n" - " for(int ii=0; ii1e-6 || b3Fabs(v.y)>1e-6 || b3Fabs(v.z)>1e-6) \n" - " return false;\n" - " return true;\n" - "}\n" - "inline int b3MaxDot( b3Float4ConstArg vec, __global const b3Float4* vecArray, int vecLen, float* dotOut )\n" - "{\n" - " float maxDot = -B3_INFINITY;\n" - " int i = 0;\n" - " int ptIndex = -1;\n" - " for( i = 0; i < vecLen; i++ )\n" - " {\n" - " float dot = b3Dot3F4(vecArray[i],vec);\n" - " \n" - " if( dot > maxDot )\n" - " {\n" - " maxDot = dot;\n" - " ptIndex = i;\n" - " }\n" - " }\n" - " b3Assert(ptIndex>=0);\n" - " if (ptIndex<0)\n" - " {\n" - " ptIndex = 0;\n" - " }\n" - " *dotOut = maxDot;\n" - " return ptIndex;\n" - "}\n" - "#endif //B3_FLOAT4_H\n" - "typedef struct b3Contact4Data b3Contact4Data_t;\n" - "struct b3Contact4Data\n" - "{\n" - " b3Float4 m_worldPosB[4];\n" - "// b3Float4 m_localPosA[4];\n" - "// b3Float4 m_localPosB[4];\n" - " b3Float4 m_worldNormalOnB; // w: m_nPoints\n" - " unsigned short m_restituitionCoeffCmp;\n" - " unsigned short m_frictionCoeffCmp;\n" - " int m_batchIdx;\n" - " int m_bodyAPtrAndSignBit;//x:m_bodyAPtr, y:m_bodyBPtr\n" - " int m_bodyBPtrAndSignBit;\n" - " int m_childIndexA;\n" - " int m_childIndexB;\n" - " int m_unused1;\n" - " int m_unused2;\n" - "};\n" - "inline int b3Contact4Data_getNumPoints(const struct b3Contact4Data* contact)\n" - "{\n" - " return (int)contact->m_worldNormalOnB.w;\n" - "};\n" - "inline void b3Contact4Data_setNumPoints(struct b3Contact4Data* contact, int numPoints)\n" - "{\n" - " contact->m_worldNormalOnB.w = (float)numPoints;\n" - "};\n" - "#endif //B3_CONTACT4DATA_H\n" - "#pragma OPENCL EXTENSION cl_amd_printf : enable\n" - "#pragma OPENCL EXTENSION cl_khr_local_int32_base_atomics : enable\n" - "#pragma OPENCL EXTENSION cl_khr_global_int32_base_atomics : enable\n" - "#pragma OPENCL EXTENSION cl_khr_local_int32_extended_atomics : enable\n" - "#pragma OPENCL EXTENSION cl_khr_global_int32_extended_atomics : enable\n" - "#ifdef cl_ext_atomic_counters_32\n" - "#pragma OPENCL EXTENSION cl_ext_atomic_counters_32 : enable\n" - "#else\n" - "#define counter32_t volatile __global int*\n" - "#endif\n" - "#define SIMD_WIDTH 64\n" - "typedef unsigned int u32;\n" - "typedef unsigned short u16;\n" - "typedef unsigned char u8;\n" - "#define GET_GROUP_IDX get_group_id(0)\n" - "#define GET_LOCAL_IDX get_local_id(0)\n" - "#define GET_GLOBAL_IDX get_global_id(0)\n" - "#define GET_GROUP_SIZE get_local_size(0)\n" - "#define GET_NUM_GROUPS get_num_groups(0)\n" - "#define GROUP_LDS_BARRIER barrier(CLK_LOCAL_MEM_FENCE)\n" - "#define GROUP_MEM_FENCE mem_fence(CLK_LOCAL_MEM_FENCE)\n" - "#define AtomInc(x) atom_inc(&(x))\n" - "#define AtomInc1(x, out) out = atom_inc(&(x))\n" - "#define AppendInc(x, out) out = atomic_inc(x)\n" - "#define AtomAdd(x, value) atom_add(&(x), value)\n" - "#define AtomCmpxhg(x, cmp, value) atom_cmpxchg( &(x), cmp, value )\n" - "#define AtomXhg(x, value) atom_xchg ( &(x), value )\n" - "#define SELECT_UINT4( b, a, condition ) select( b,a,condition )\n" - "#define make_float4 (float4)\n" - "#define make_float2 (float2)\n" - "#define make_uint4 (uint4)\n" - "#define make_int4 (int4)\n" - "#define make_uint2 (uint2)\n" - "#define make_int2 (int2)\n" - "#define max2 max\n" - "#define min2 min\n" - "#define WG_SIZE 64\n" - "typedef struct \n" - "{\n" - " int m_n;\n" - " int m_start;\n" - " int m_staticIdx;\n" - " int m_paddings[1];\n" - "} ConstBuffer;\n" - "typedef struct \n" - "{\n" - " int m_a;\n" - " int m_b;\n" - " u32 m_idx;\n" - "}Elem;\n" - "// batching on the GPU\n" - "__kernel void CreateBatchesBruteForce( __global struct b3Contact4Data* gConstraints, __global const u32* gN, __global const u32* gStart, int m_staticIdx )\n" - "{\n" - " int wgIdx = GET_GROUP_IDX;\n" - " int lIdx = GET_LOCAL_IDX;\n" - " \n" - " const int m_n = gN[wgIdx];\n" - " const int m_start = gStart[wgIdx];\n" - " \n" - " if( lIdx == 0 )\n" - " {\n" - " for (int i=0;i> bitIdx)&1) == 0;\n" - "}\n" - "// batching on the GPU\n" - "__kernel void CreateBatchesNew( __global struct b3Contact4Data* gConstraints, __global const u32* gN, __global const u32* gStart, __global int* batchSizes, int staticIdx )\n" - "{\n" - " int wgIdx = GET_GROUP_IDX;\n" - " int lIdx = GET_LOCAL_IDX;\n" - " const int numConstraints = gN[wgIdx];\n" - " const int m_start = gStart[wgIdx];\n" - " b3Contact4Data_t tmp;\n" - " \n" - " __local u32 ldsFixedBuffer[CHECK_SIZE];\n" - " \n" - " \n" - " \n" - " \n" - " \n" - " if( lIdx == 0 )\n" - " {\n" - " \n" - " \n" - " __global struct b3Contact4Data* cs = &gConstraints[m_start]; \n" - " \n" - " \n" - " int numValidConstraints = 0;\n" - " int batchIdx = 0;\n" - " while( numValidConstraints < numConstraints)\n" - " {\n" - " int nCurrentBatch = 0;\n" - " // clear flag\n" - " \n" - " for(int i=0; i1e-6 || b3Fabs(v.y)>1e-6 || b3Fabs(v.z)>1e-6) \n" - " return false;\n" - " return true;\n" - "}\n" - "inline int b3MaxDot( b3Float4ConstArg vec, __global const b3Float4* vecArray, int vecLen, float* dotOut )\n" - "{\n" - " float maxDot = -B3_INFINITY;\n" - " int i = 0;\n" - " int ptIndex = -1;\n" - " for( i = 0; i < vecLen; i++ )\n" - " {\n" - " float dot = b3Dot3F4(vecArray[i],vec);\n" - " \n" - " if( dot > maxDot )\n" - " {\n" - " maxDot = dot;\n" - " ptIndex = i;\n" - " }\n" - " }\n" - " b3Assert(ptIndex>=0);\n" - " if (ptIndex<0)\n" - " {\n" - " ptIndex = 0;\n" - " }\n" - " *dotOut = maxDot;\n" - " return ptIndex;\n" - "}\n" - "#endif //B3_FLOAT4_H\n" - "#ifndef B3_QUAT_H\n" - "#define B3_QUAT_H\n" - "#ifndef B3_PLATFORM_DEFINITIONS_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#endif\n" - "#endif\n" - "#ifndef B3_FLOAT4_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#endif \n" - "#endif //B3_FLOAT4_H\n" - "#ifdef __cplusplus\n" - "#else\n" - " typedef float4 b3Quat;\n" - " #define b3QuatConstArg const b3Quat\n" - " \n" - " \n" - "inline float4 b3FastNormalize4(float4 v)\n" - "{\n" - " v = (float4)(v.xyz,0.f);\n" - " return fast_normalize(v);\n" - "}\n" - " \n" - "inline b3Quat b3QuatMul(b3Quat a, b3Quat b);\n" - "inline b3Quat b3QuatNormalized(b3QuatConstArg in);\n" - "inline b3Quat b3QuatRotate(b3QuatConstArg q, b3QuatConstArg vec);\n" - "inline b3Quat b3QuatInvert(b3QuatConstArg q);\n" - "inline b3Quat b3QuatInverse(b3QuatConstArg q);\n" - "inline b3Quat b3QuatMul(b3QuatConstArg a, b3QuatConstArg b)\n" - "{\n" - " b3Quat ans;\n" - " ans = b3Cross3( a, b );\n" - " ans += a.w*b+b.w*a;\n" - "// ans.w = a.w*b.w - (a.x*b.x+a.y*b.y+a.z*b.z);\n" - " ans.w = a.w*b.w - b3Dot3F4(a, b);\n" - " return ans;\n" - "}\n" - "inline b3Quat b3QuatNormalized(b3QuatConstArg in)\n" - "{\n" - " b3Quat q;\n" - " q=in;\n" - " //return b3FastNormalize4(in);\n" - " float len = native_sqrt(dot(q, q));\n" - " if(len > 0.f)\n" - " {\n" - " q *= 1.f / len;\n" - " }\n" - " else\n" - " {\n" - " q.x = q.y = q.z = 0.f;\n" - " q.w = 1.f;\n" - " }\n" - " return q;\n" - "}\n" - "inline float4 b3QuatRotate(b3QuatConstArg q, b3QuatConstArg vec)\n" - "{\n" - " b3Quat qInv = b3QuatInvert( q );\n" - " float4 vcpy = vec;\n" - " vcpy.w = 0.f;\n" - " float4 out = b3QuatMul(b3QuatMul(q,vcpy),qInv);\n" - " return out;\n" - "}\n" - "inline b3Quat b3QuatInverse(b3QuatConstArg q)\n" - "{\n" - " return (b3Quat)(-q.xyz, q.w);\n" - "}\n" - "inline b3Quat b3QuatInvert(b3QuatConstArg q)\n" - "{\n" - " return (b3Quat)(-q.xyz, q.w);\n" - "}\n" - "inline float4 b3QuatInvRotate(b3QuatConstArg q, b3QuatConstArg vec)\n" - "{\n" - " return b3QuatRotate( b3QuatInvert( q ), vec );\n" - "}\n" - "inline b3Float4 b3TransformPoint(b3Float4ConstArg point, b3Float4ConstArg translation, b3QuatConstArg orientation)\n" - "{\n" - " return b3QuatRotate( orientation, point ) + (translation);\n" - "}\n" - " \n" - "#endif \n" - "#endif //B3_QUAT_H\n" - "#ifndef B3_MAT3x3_H\n" - "#define B3_MAT3x3_H\n" - "#ifndef B3_QUAT_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#endif \n" - "#endif //B3_QUAT_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "typedef struct\n" - "{\n" - " b3Float4 m_row[3];\n" - "}b3Mat3x3;\n" - "#define b3Mat3x3ConstArg const b3Mat3x3\n" - "#define b3GetRow(m,row) (m.m_row[row])\n" - "inline b3Mat3x3 b3QuatGetRotationMatrix(b3Quat quat)\n" - "{\n" - " b3Float4 quat2 = (b3Float4)(quat.x*quat.x, quat.y*quat.y, quat.z*quat.z, 0.f);\n" - " b3Mat3x3 out;\n" - " out.m_row[0].x=1-2*quat2.y-2*quat2.z;\n" - " out.m_row[0].y=2*quat.x*quat.y-2*quat.w*quat.z;\n" - " out.m_row[0].z=2*quat.x*quat.z+2*quat.w*quat.y;\n" - " out.m_row[0].w = 0.f;\n" - " out.m_row[1].x=2*quat.x*quat.y+2*quat.w*quat.z;\n" - " out.m_row[1].y=1-2*quat2.x-2*quat2.z;\n" - " out.m_row[1].z=2*quat.y*quat.z-2*quat.w*quat.x;\n" - " out.m_row[1].w = 0.f;\n" - " out.m_row[2].x=2*quat.x*quat.z-2*quat.w*quat.y;\n" - " out.m_row[2].y=2*quat.y*quat.z+2*quat.w*quat.x;\n" - " out.m_row[2].z=1-2*quat2.x-2*quat2.y;\n" - " out.m_row[2].w = 0.f;\n" - " return out;\n" - "}\n" - "inline b3Mat3x3 b3AbsoluteMat3x3(b3Mat3x3ConstArg matIn)\n" - "{\n" - " b3Mat3x3 out;\n" - " out.m_row[0] = fabs(matIn.m_row[0]);\n" - " out.m_row[1] = fabs(matIn.m_row[1]);\n" - " out.m_row[2] = fabs(matIn.m_row[2]);\n" - " return out;\n" - "}\n" - "__inline\n" - "b3Mat3x3 mtZero();\n" - "__inline\n" - "b3Mat3x3 mtIdentity();\n" - "__inline\n" - "b3Mat3x3 mtTranspose(b3Mat3x3 m);\n" - "__inline\n" - "b3Mat3x3 mtMul(b3Mat3x3 a, b3Mat3x3 b);\n" - "__inline\n" - "b3Float4 mtMul1(b3Mat3x3 a, b3Float4 b);\n" - "__inline\n" - "b3Float4 mtMul3(b3Float4 a, b3Mat3x3 b);\n" - "__inline\n" - "b3Mat3x3 mtZero()\n" - "{\n" - " b3Mat3x3 m;\n" - " m.m_row[0] = (b3Float4)(0.f);\n" - " m.m_row[1] = (b3Float4)(0.f);\n" - " m.m_row[2] = (b3Float4)(0.f);\n" - " return m;\n" - "}\n" - "__inline\n" - "b3Mat3x3 mtIdentity()\n" - "{\n" - " b3Mat3x3 m;\n" - " m.m_row[0] = (b3Float4)(1,0,0,0);\n" - " m.m_row[1] = (b3Float4)(0,1,0,0);\n" - " m.m_row[2] = (b3Float4)(0,0,1,0);\n" - " return m;\n" - "}\n" - "__inline\n" - "b3Mat3x3 mtTranspose(b3Mat3x3 m)\n" - "{\n" - " b3Mat3x3 out;\n" - " out.m_row[0] = (b3Float4)(m.m_row[0].x, m.m_row[1].x, m.m_row[2].x, 0.f);\n" - " out.m_row[1] = (b3Float4)(m.m_row[0].y, m.m_row[1].y, m.m_row[2].y, 0.f);\n" - " out.m_row[2] = (b3Float4)(m.m_row[0].z, m.m_row[1].z, m.m_row[2].z, 0.f);\n" - " return out;\n" - "}\n" - "__inline\n" - "b3Mat3x3 mtMul(b3Mat3x3 a, b3Mat3x3 b)\n" - "{\n" - " b3Mat3x3 transB;\n" - " transB = mtTranspose( b );\n" - " b3Mat3x3 ans;\n" - " // why this doesn't run when 0ing in the for{}\n" - " a.m_row[0].w = 0.f;\n" - " a.m_row[1].w = 0.f;\n" - " a.m_row[2].w = 0.f;\n" - " for(int i=0; i<3; i++)\n" - " {\n" - "// a.m_row[i].w = 0.f;\n" - " ans.m_row[i].x = b3Dot3F4(a.m_row[i],transB.m_row[0]);\n" - " ans.m_row[i].y = b3Dot3F4(a.m_row[i],transB.m_row[1]);\n" - " ans.m_row[i].z = b3Dot3F4(a.m_row[i],transB.m_row[2]);\n" - " ans.m_row[i].w = 0.f;\n" - " }\n" - " return ans;\n" - "}\n" - "__inline\n" - "b3Float4 mtMul1(b3Mat3x3 a, b3Float4 b)\n" - "{\n" - " b3Float4 ans;\n" - " ans.x = b3Dot3F4( a.m_row[0], b );\n" - " ans.y = b3Dot3F4( a.m_row[1], b );\n" - " ans.z = b3Dot3F4( a.m_row[2], b );\n" - " ans.w = 0.f;\n" - " return ans;\n" - "}\n" - "__inline\n" - "b3Float4 mtMul3(b3Float4 a, b3Mat3x3 b)\n" - "{\n" - " b3Float4 colx = b3MakeFloat4(b.m_row[0].x, b.m_row[1].x, b.m_row[2].x, 0);\n" - " b3Float4 coly = b3MakeFloat4(b.m_row[0].y, b.m_row[1].y, b.m_row[2].y, 0);\n" - " b3Float4 colz = b3MakeFloat4(b.m_row[0].z, b.m_row[1].z, b.m_row[2].z, 0);\n" - " b3Float4 ans;\n" - " ans.x = b3Dot3F4( a, colx );\n" - " ans.y = b3Dot3F4( a, coly );\n" - " ans.z = b3Dot3F4( a, colz );\n" - " return ans;\n" - "}\n" - "#endif\n" - "#endif //B3_MAT3x3_H\n" - "typedef struct b3RigidBodyData b3RigidBodyData_t;\n" - "struct b3RigidBodyData\n" - "{\n" - " b3Float4 m_pos;\n" - " b3Quat m_quat;\n" - " b3Float4 m_linVel;\n" - " b3Float4 m_angVel;\n" - " int m_collidableIdx;\n" - " float m_invMass;\n" - " float m_restituitionCoeff;\n" - " float m_frictionCoeff;\n" - "};\n" - "typedef struct b3InertiaData b3InertiaData_t;\n" - "struct b3InertiaData\n" - "{\n" - " b3Mat3x3 m_invInertiaWorld;\n" - " b3Mat3x3 m_initInvInertia;\n" - "};\n" - "#endif //B3_RIGIDBODY_DATA_H\n" - " \n" - "#ifndef B3_RIGIDBODY_DATA_H\n" - "#endif //B3_RIGIDBODY_DATA_H\n" - " \n" - "inline void integrateSingleTransform( __global b3RigidBodyData_t* bodies,int nodeID, float timeStep, float angularDamping, b3Float4ConstArg gravityAcceleration)\n" - "{\n" - " \n" - " if (bodies[nodeID].m_invMass != 0.f)\n" - " {\n" - " float BT_GPU_ANGULAR_MOTION_THRESHOLD = (0.25f * 3.14159254f);\n" - " //angular velocity\n" - " {\n" - " b3Float4 axis;\n" - " //add some hardcoded angular damping\n" - " bodies[nodeID].m_angVel.x *= angularDamping;\n" - " bodies[nodeID].m_angVel.y *= angularDamping;\n" - " bodies[nodeID].m_angVel.z *= angularDamping;\n" - " \n" - " b3Float4 angvel = bodies[nodeID].m_angVel;\n" - " float fAngle = b3Sqrt(b3Dot3F4(angvel, angvel));\n" - " \n" - " //limit the angular motion\n" - " if(fAngle*timeStep > BT_GPU_ANGULAR_MOTION_THRESHOLD)\n" - " {\n" - " fAngle = BT_GPU_ANGULAR_MOTION_THRESHOLD / timeStep;\n" - " }\n" - " if(fAngle < 0.001f)\n" - " {\n" - " // use Taylor's expansions of sync function\n" - " axis = angvel * (0.5f*timeStep-(timeStep*timeStep*timeStep)*0.020833333333f * fAngle * fAngle);\n" - " }\n" - " else\n" - " {\n" - " // sync(fAngle) = sin(c*fAngle)/t\n" - " axis = angvel * ( b3Sin(0.5f * fAngle * timeStep) / fAngle);\n" - " }\n" - " \n" - " b3Quat dorn;\n" - " dorn.x = axis.x;\n" - " dorn.y = axis.y;\n" - " dorn.z = axis.z;\n" - " dorn.w = b3Cos(fAngle * timeStep * 0.5f);\n" - " b3Quat orn0 = bodies[nodeID].m_quat;\n" - " b3Quat predictedOrn = b3QuatMul(dorn, orn0);\n" - " predictedOrn = b3QuatNormalized(predictedOrn);\n" - " bodies[nodeID].m_quat=predictedOrn;\n" - " }\n" - " //linear velocity \n" - " bodies[nodeID].m_pos += bodies[nodeID].m_linVel * timeStep;\n" - " \n" - " //apply gravity\n" - " bodies[nodeID].m_linVel += gravityAcceleration * timeStep;\n" - " \n" - " }\n" - " \n" - "}\n" - "inline void b3IntegrateTransform( __global b3RigidBodyData_t* body, float timeStep, float angularDamping, b3Float4ConstArg gravityAcceleration)\n" - "{\n" - " float BT_GPU_ANGULAR_MOTION_THRESHOLD = (0.25f * 3.14159254f);\n" - " \n" - " if( (body->m_invMass != 0.f))\n" - " {\n" - " //angular velocity\n" - " {\n" - " b3Float4 axis;\n" - " //add some hardcoded angular damping\n" - " body->m_angVel.x *= angularDamping;\n" - " body->m_angVel.y *= angularDamping;\n" - " body->m_angVel.z *= angularDamping;\n" - " \n" - " b3Float4 angvel = body->m_angVel;\n" - " float fAngle = b3Sqrt(b3Dot3F4(angvel, angvel));\n" - " //limit the angular motion\n" - " if(fAngle*timeStep > BT_GPU_ANGULAR_MOTION_THRESHOLD)\n" - " {\n" - " fAngle = BT_GPU_ANGULAR_MOTION_THRESHOLD / timeStep;\n" - " }\n" - " if(fAngle < 0.001f)\n" - " {\n" - " // use Taylor's expansions of sync function\n" - " axis = angvel * (0.5f*timeStep-(timeStep*timeStep*timeStep)*0.020833333333f * fAngle * fAngle);\n" - " }\n" - " else\n" - " {\n" - " // sync(fAngle) = sin(c*fAngle)/t\n" - " axis = angvel * ( b3Sin(0.5f * fAngle * timeStep) / fAngle);\n" - " }\n" - " b3Quat dorn;\n" - " dorn.x = axis.x;\n" - " dorn.y = axis.y;\n" - " dorn.z = axis.z;\n" - " dorn.w = b3Cos(fAngle * timeStep * 0.5f);\n" - " b3Quat orn0 = body->m_quat;\n" - " b3Quat predictedOrn = b3QuatMul(dorn, orn0);\n" - " predictedOrn = b3QuatNormalized(predictedOrn);\n" - " body->m_quat=predictedOrn;\n" - " }\n" - " //apply gravity\n" - " body->m_linVel += gravityAcceleration * timeStep;\n" - " //linear velocity \n" - " body->m_pos += body->m_linVel * timeStep;\n" - " \n" - " }\n" - " \n" - "}\n" - "__kernel void \n" - " integrateTransformsKernel( __global b3RigidBodyData_t* bodies,const int numNodes, float timeStep, float angularDamping, float4 gravityAcceleration)\n" - "{\n" - " int nodeID = get_global_id(0);\n" - " \n" - " if( nodeID < numNodes)\n" - " {\n" - " integrateSingleTransform(bodies,nodeID, timeStep, angularDamping,gravityAcceleration);\n" - " }\n" - "}\n"; diff --git a/engine/inc/bullet/Bullet3OpenCL/RigidBody/kernels/jointSolver.h b/engine/inc/bullet/Bullet3OpenCL/RigidBody/kernels/jointSolver.h deleted file mode 100644 index c94b5585..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/RigidBody/kernels/jointSolver.h +++ /dev/null @@ -1,720 +0,0 @@ -//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project -static const char* solveConstraintRowsCL = - "/*\n" - "Copyright (c) 2013 Advanced Micro Devices, Inc. \n" - "This software is provided 'as-is', without any express or implied warranty.\n" - "In no event will the authors be held liable for any damages arising from the use of this software.\n" - "Permission is granted to anyone to use this software for any purpose, \n" - "including commercial applications, and to alter it and redistribute it freely, \n" - "subject to the following restrictions:\n" - "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.\n" - "2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.\n" - "3. This notice may not be removed or altered from any source distribution.\n" - "*/\n" - "//Originally written by Erwin Coumans\n" - "#define B3_CONSTRAINT_FLAG_ENABLED 1\n" - "#define B3_GPU_POINT2POINT_CONSTRAINT_TYPE 3\n" - "#define B3_GPU_FIXED_CONSTRAINT_TYPE 4\n" - "#define MOTIONCLAMP 100000 //unused, for debugging/safety in case constraint solver fails\n" - "#define B3_INFINITY 1e30f\n" - "#define mymake_float4 (float4)\n" - "__inline float dot3F4(float4 a, float4 b)\n" - "{\n" - " float4 a1 = mymake_float4(a.xyz,0.f);\n" - " float4 b1 = mymake_float4(b.xyz,0.f);\n" - " return dot(a1, b1);\n" - "}\n" - "typedef float4 Quaternion;\n" - "typedef struct\n" - "{\n" - " float4 m_row[3];\n" - "}Matrix3x3;\n" - "__inline\n" - "float4 mtMul1(Matrix3x3 a, float4 b);\n" - "__inline\n" - "float4 mtMul3(float4 a, Matrix3x3 b);\n" - "__inline\n" - "float4 mtMul1(Matrix3x3 a, float4 b)\n" - "{\n" - " float4 ans;\n" - " ans.x = dot3F4( a.m_row[0], b );\n" - " ans.y = dot3F4( a.m_row[1], b );\n" - " ans.z = dot3F4( a.m_row[2], b );\n" - " ans.w = 0.f;\n" - " return ans;\n" - "}\n" - "__inline\n" - "float4 mtMul3(float4 a, Matrix3x3 b)\n" - "{\n" - " float4 colx = mymake_float4(b.m_row[0].x, b.m_row[1].x, b.m_row[2].x, 0);\n" - " float4 coly = mymake_float4(b.m_row[0].y, b.m_row[1].y, b.m_row[2].y, 0);\n" - " float4 colz = mymake_float4(b.m_row[0].z, b.m_row[1].z, b.m_row[2].z, 0);\n" - " float4 ans;\n" - " ans.x = dot3F4( a, colx );\n" - " ans.y = dot3F4( a, coly );\n" - " ans.z = dot3F4( a, colz );\n" - " return ans;\n" - "}\n" - "typedef struct\n" - "{\n" - " Matrix3x3 m_invInertiaWorld;\n" - " Matrix3x3 m_initInvInertia;\n" - "} BodyInertia;\n" - "typedef struct\n" - "{\n" - " Matrix3x3 m_basis;//orientation\n" - " float4 m_origin;//transform\n" - "}b3Transform;\n" - "typedef struct\n" - "{\n" - "// b3Transform m_worldTransformUnused;\n" - " float4 m_deltaLinearVelocity;\n" - " float4 m_deltaAngularVelocity;\n" - " float4 m_angularFactor;\n" - " float4 m_linearFactor;\n" - " float4 m_invMass;\n" - " float4 m_pushVelocity;\n" - " float4 m_turnVelocity;\n" - " float4 m_linearVelocity;\n" - " float4 m_angularVelocity;\n" - " union \n" - " {\n" - " void* m_originalBody;\n" - " int m_originalBodyIndex;\n" - " };\n" - " int padding[3];\n" - "} b3GpuSolverBody;\n" - "typedef struct\n" - "{\n" - " float4 m_pos;\n" - " Quaternion m_quat;\n" - " float4 m_linVel;\n" - " float4 m_angVel;\n" - " unsigned int m_shapeIdx;\n" - " float m_invMass;\n" - " float m_restituitionCoeff;\n" - " float m_frictionCoeff;\n" - "} b3RigidBodyCL;\n" - "typedef struct\n" - "{\n" - " float4 m_relpos1CrossNormal;\n" - " float4 m_contactNormal;\n" - " float4 m_relpos2CrossNormal;\n" - " //float4 m_contactNormal2;//usually m_contactNormal2 == -m_contactNormal\n" - " float4 m_angularComponentA;\n" - " float4 m_angularComponentB;\n" - " \n" - " float m_appliedPushImpulse;\n" - " float m_appliedImpulse;\n" - " int m_padding1;\n" - " int m_padding2;\n" - " float m_friction;\n" - " float m_jacDiagABInv;\n" - " float m_rhs;\n" - " float m_cfm;\n" - " \n" - " float m_lowerLimit;\n" - " float m_upperLimit;\n" - " float m_rhsPenetration;\n" - " int m_originalConstraint;\n" - " int m_overrideNumSolverIterations;\n" - " int m_frictionIndex;\n" - " int m_solverBodyIdA;\n" - " int m_solverBodyIdB;\n" - "} b3SolverConstraint;\n" - "typedef struct \n" - "{\n" - " int m_bodyAPtrAndSignBit;\n" - " int m_bodyBPtrAndSignBit;\n" - " int m_originalConstraintIndex;\n" - " int m_batchId;\n" - "} b3BatchConstraint;\n" - "typedef struct \n" - "{\n" - " int m_constraintType;\n" - " int m_rbA;\n" - " int m_rbB;\n" - " float m_breakingImpulseThreshold;\n" - " float4 m_pivotInA;\n" - " float4 m_pivotInB;\n" - " Quaternion m_relTargetAB;\n" - " int m_flags;\n" - " int m_padding[3];\n" - "} b3GpuGenericConstraint;\n" - "/*b3Transform getWorldTransform(b3RigidBodyCL* rb)\n" - "{\n" - " b3Transform newTrans;\n" - " newTrans.setOrigin(rb->m_pos);\n" - " newTrans.setRotation(rb->m_quat);\n" - " return newTrans;\n" - "}*/\n" - "__inline\n" - "float4 cross3(float4 a, float4 b)\n" - "{\n" - " return cross(a,b);\n" - "}\n" - "__inline\n" - "float4 fastNormalize4(float4 v)\n" - "{\n" - " v = mymake_float4(v.xyz,0.f);\n" - " return fast_normalize(v);\n" - "}\n" - "__inline\n" - "Quaternion qtMul(Quaternion a, Quaternion b);\n" - "__inline\n" - "Quaternion qtNormalize(Quaternion in);\n" - "__inline\n" - "float4 qtRotate(Quaternion q, float4 vec);\n" - "__inline\n" - "Quaternion qtInvert(Quaternion q);\n" - "__inline\n" - "Quaternion qtMul(Quaternion a, Quaternion b)\n" - "{\n" - " Quaternion ans;\n" - " ans = cross3( a, b );\n" - " ans += a.w*b+b.w*a;\n" - "// ans.w = a.w*b.w - (a.x*b.x+a.y*b.y+a.z*b.z);\n" - " ans.w = a.w*b.w - dot3F4(a, b);\n" - " return ans;\n" - "}\n" - "__inline\n" - "Quaternion qtNormalize(Quaternion in)\n" - "{\n" - " return fastNormalize4(in);\n" - "// in /= length( in );\n" - "// return in;\n" - "}\n" - "__inline\n" - "float4 qtRotate(Quaternion q, float4 vec)\n" - "{\n" - " Quaternion qInv = qtInvert( q );\n" - " float4 vcpy = vec;\n" - " vcpy.w = 0.f;\n" - " float4 out = qtMul(qtMul(q,vcpy),qInv);\n" - " return out;\n" - "}\n" - "__inline\n" - "Quaternion qtInvert(Quaternion q)\n" - "{\n" - " return (Quaternion)(-q.xyz, q.w);\n" - "}\n" - "__inline void internalApplyImpulse(__global b3GpuSolverBody* body, float4 linearComponent, float4 angularComponent,float impulseMagnitude)\n" - "{\n" - " body->m_deltaLinearVelocity += linearComponent*impulseMagnitude*body->m_linearFactor;\n" - " body->m_deltaAngularVelocity += angularComponent*(impulseMagnitude*body->m_angularFactor);\n" - "}\n" - "void resolveSingleConstraintRowGeneric(__global b3GpuSolverBody* body1, __global b3GpuSolverBody* body2, __global b3SolverConstraint* c)\n" - "{\n" - " float deltaImpulse = c->m_rhs-c->m_appliedImpulse*c->m_cfm;\n" - " float deltaVel1Dotn = dot3F4(c->m_contactNormal,body1->m_deltaLinearVelocity) + dot3F4(c->m_relpos1CrossNormal,body1->m_deltaAngularVelocity);\n" - " float deltaVel2Dotn = -dot3F4(c->m_contactNormal,body2->m_deltaLinearVelocity) + dot3F4(c->m_relpos2CrossNormal,body2->m_deltaAngularVelocity);\n" - " deltaImpulse -= deltaVel1Dotn*c->m_jacDiagABInv;\n" - " deltaImpulse -= deltaVel2Dotn*c->m_jacDiagABInv;\n" - " float sum = c->m_appliedImpulse + deltaImpulse;\n" - " if (sum < c->m_lowerLimit)\n" - " {\n" - " deltaImpulse = c->m_lowerLimit-c->m_appliedImpulse;\n" - " c->m_appliedImpulse = c->m_lowerLimit;\n" - " }\n" - " else if (sum > c->m_upperLimit) \n" - " {\n" - " deltaImpulse = c->m_upperLimit-c->m_appliedImpulse;\n" - " c->m_appliedImpulse = c->m_upperLimit;\n" - " }\n" - " else\n" - " {\n" - " c->m_appliedImpulse = sum;\n" - " }\n" - " internalApplyImpulse(body1,c->m_contactNormal*body1->m_invMass,c->m_angularComponentA,deltaImpulse);\n" - " internalApplyImpulse(body2,-c->m_contactNormal*body2->m_invMass,c->m_angularComponentB,deltaImpulse);\n" - "}\n" - "__kernel void solveJointConstraintRows(__global b3GpuSolverBody* solverBodies,\n" - " __global b3BatchConstraint* batchConstraints,\n" - " __global b3SolverConstraint* rows,\n" - " __global unsigned int* numConstraintRowsInfo1, \n" - " __global unsigned int* rowOffsets,\n" - " __global b3GpuGenericConstraint* constraints,\n" - " int batchOffset,\n" - " int numConstraintsInBatch\n" - " )\n" - "{\n" - " int b = get_global_id(0);\n" - " if (b>=numConstraintsInBatch)\n" - " return;\n" - " __global b3BatchConstraint* c = &batchConstraints[b+batchOffset];\n" - " int originalConstraintIndex = c->m_originalConstraintIndex;\n" - " if (constraints[originalConstraintIndex].m_flags&B3_CONSTRAINT_FLAG_ENABLED)\n" - " {\n" - " int numConstraintRows = numConstraintRowsInfo1[originalConstraintIndex];\n" - " int rowOffset = rowOffsets[originalConstraintIndex];\n" - " for (int jj=0;jjm_solverBodyIdA],&solverBodies[constraint->m_solverBodyIdB],constraint);\n" - " }\n" - " }\n" - "};\n" - "__kernel void initSolverBodies(__global b3GpuSolverBody* solverBodies,__global b3RigidBodyCL* bodiesCL, int numBodies)\n" - "{\n" - " int i = get_global_id(0);\n" - " if (i>=numBodies)\n" - " return;\n" - " __global b3GpuSolverBody* solverBody = &solverBodies[i];\n" - " __global b3RigidBodyCL* bodyCL = &bodiesCL[i];\n" - " solverBody->m_deltaLinearVelocity = (float4)(0.f,0.f,0.f,0.f);\n" - " solverBody->m_deltaAngularVelocity = (float4)(0.f,0.f,0.f,0.f);\n" - " solverBody->m_pushVelocity = (float4)(0.f,0.f,0.f,0.f);\n" - " solverBody->m_pushVelocity = (float4)(0.f,0.f,0.f,0.f);\n" - " solverBody->m_invMass = (float4)(bodyCL->m_invMass,bodyCL->m_invMass,bodyCL->m_invMass,0.f);\n" - " solverBody->m_originalBodyIndex = i;\n" - " solverBody->m_angularFactor = (float4)(1,1,1,0);\n" - " solverBody->m_linearFactor = (float4) (1,1,1,0);\n" - " solverBody->m_linearVelocity = bodyCL->m_linVel;\n" - " solverBody->m_angularVelocity = bodyCL->m_angVel;\n" - "}\n" - "__kernel void breakViolatedConstraintsKernel(__global b3GpuGenericConstraint* constraints, __global unsigned int* numConstraintRows, __global unsigned int* rowOffsets, __global b3SolverConstraint* rows, int numConstraints)\n" - "{\n" - " int cid = get_global_id(0);\n" - " if (cid>=numConstraints)\n" - " return;\n" - " int numRows = numConstraintRows[cid];\n" - " if (numRows)\n" - " {\n" - " for (int i=0;i= breakingThreshold)\n" - " {\n" - " constraints[cid].m_flags =0;//&= ~B3_CONSTRAINT_FLAG_ENABLED;\n" - " }\n" - " }\n" - " }\n" - "}\n" - "__kernel void getInfo1Kernel(__global unsigned int* infos, __global b3GpuGenericConstraint* constraints, int numConstraints)\n" - "{\n" - " int i = get_global_id(0);\n" - " if (i>=numConstraints)\n" - " return;\n" - " __global b3GpuGenericConstraint* constraint = &constraints[i];\n" - " switch (constraint->m_constraintType)\n" - " {\n" - " case B3_GPU_POINT2POINT_CONSTRAINT_TYPE:\n" - " {\n" - " infos[i] = 3;\n" - " break;\n" - " }\n" - " case B3_GPU_FIXED_CONSTRAINT_TYPE:\n" - " {\n" - " infos[i] = 6;\n" - " break;\n" - " }\n" - " default:\n" - " {\n" - " }\n" - " }\n" - "}\n" - "__kernel void initBatchConstraintsKernel(__global unsigned int* numConstraintRows, __global unsigned int* rowOffsets, \n" - " __global b3BatchConstraint* batchConstraints, \n" - " __global b3GpuGenericConstraint* constraints,\n" - " __global b3RigidBodyCL* bodies,\n" - " int numConstraints)\n" - "{\n" - " int i = get_global_id(0);\n" - " if (i>=numConstraints)\n" - " return;\n" - " int rbA = constraints[i].m_rbA;\n" - " int rbB = constraints[i].m_rbB;\n" - " batchConstraints[i].m_bodyAPtrAndSignBit = bodies[rbA].m_invMass != 0.f ? rbA : -rbA;\n" - " batchConstraints[i].m_bodyBPtrAndSignBit = bodies[rbB].m_invMass != 0.f ? rbB : -rbB;\n" - " batchConstraints[i].m_batchId = -1;\n" - " batchConstraints[i].m_originalConstraintIndex = i;\n" - "}\n" - "typedef struct\n" - "{\n" - " // integrator parameters: frames per second (1/stepsize), default error\n" - " // reduction parameter (0..1).\n" - " float fps,erp;\n" - " // for the first and second body, pointers to two (linear and angular)\n" - " // n*3 jacobian sub matrices, stored by rows. these matrices will have\n" - " // been initialized to 0 on entry. if the second body is zero then the\n" - " // J2xx pointers may be 0.\n" - " union \n" - " {\n" - " __global float4* m_J1linearAxisFloat4;\n" - " __global float* m_J1linearAxis;\n" - " };\n" - " union\n" - " {\n" - " __global float4* m_J1angularAxisFloat4;\n" - " __global float* m_J1angularAxis;\n" - " };\n" - " union\n" - " {\n" - " __global float4* m_J2linearAxisFloat4;\n" - " __global float* m_J2linearAxis;\n" - " };\n" - " union\n" - " {\n" - " __global float4* m_J2angularAxisFloat4;\n" - " __global float* m_J2angularAxis;\n" - " };\n" - " // elements to jump from one row to the next in J's\n" - " int rowskip;\n" - " // right hand sides of the equation J*v = c + cfm * lambda. cfm is the\n" - " // \"constraint force mixing\" vector. c is set to zero on entry, cfm is\n" - " // set to a constant value (typically very small or zero) value on entry.\n" - " __global float* m_constraintError;\n" - " __global float* cfm;\n" - " // lo and hi limits for variables (set to -/+ infinity on entry).\n" - " __global float* m_lowerLimit;\n" - " __global float* m_upperLimit;\n" - " // findex vector for variables. see the LCP solver interface for a\n" - " // description of what this does. this is set to -1 on entry.\n" - " // note that the returned indexes are relative to the first index of\n" - " // the constraint.\n" - " __global int *findex;\n" - " // number of solver iterations\n" - " int m_numIterations;\n" - " //damping of the velocity\n" - " float m_damping;\n" - "} b3GpuConstraintInfo2;\n" - "void getSkewSymmetricMatrix(float4 vecIn, __global float4* v0,__global float4* v1,__global float4* v2)\n" - "{\n" - " *v0 = (float4)(0. ,-vecIn.z ,vecIn.y,0.f);\n" - " *v1 = (float4)(vecIn.z ,0. ,-vecIn.x,0.f);\n" - " *v2 = (float4)(-vecIn.y ,vecIn.x ,0.f,0.f);\n" - "}\n" - "void getInfo2Point2Point(__global b3GpuGenericConstraint* constraint,b3GpuConstraintInfo2* info,__global b3RigidBodyCL* bodies)\n" - "{\n" - " float4 posA = bodies[constraint->m_rbA].m_pos;\n" - " Quaternion rotA = bodies[constraint->m_rbA].m_quat;\n" - " float4 posB = bodies[constraint->m_rbB].m_pos;\n" - " Quaternion rotB = bodies[constraint->m_rbB].m_quat;\n" - " // anchor points in global coordinates with respect to body PORs.\n" - " \n" - " // set jacobian\n" - " info->m_J1linearAxis[0] = 1;\n" - " info->m_J1linearAxis[info->rowskip+1] = 1;\n" - " info->m_J1linearAxis[2*info->rowskip+2] = 1;\n" - " float4 a1 = qtRotate(rotA,constraint->m_pivotInA);\n" - " {\n" - " __global float4* angular0 = (__global float4*)(info->m_J1angularAxis);\n" - " __global float4* angular1 = (__global float4*)(info->m_J1angularAxis+info->rowskip);\n" - " __global float4* angular2 = (__global float4*)(info->m_J1angularAxis+2*info->rowskip);\n" - " float4 a1neg = -a1;\n" - " getSkewSymmetricMatrix(a1neg,angular0,angular1,angular2);\n" - " }\n" - " if (info->m_J2linearAxis)\n" - " {\n" - " info->m_J2linearAxis[0] = -1;\n" - " info->m_J2linearAxis[info->rowskip+1] = -1;\n" - " info->m_J2linearAxis[2*info->rowskip+2] = -1;\n" - " }\n" - " \n" - " float4 a2 = qtRotate(rotB,constraint->m_pivotInB);\n" - " \n" - " {\n" - " // float4 a2n = -a2;\n" - " __global float4* angular0 = (__global float4*)(info->m_J2angularAxis);\n" - " __global float4* angular1 = (__global float4*)(info->m_J2angularAxis+info->rowskip);\n" - " __global float4* angular2 = (__global float4*)(info->m_J2angularAxis+2*info->rowskip);\n" - " getSkewSymmetricMatrix(a2,angular0,angular1,angular2);\n" - " }\n" - " \n" - " // set right hand side\n" - "// float currERP = (m_flags & B3_P2P_FLAGS_ERP) ? m_erp : info->erp;\n" - " float currERP = info->erp;\n" - " float k = info->fps * currERP;\n" - " int j;\n" - " float4 result = a2 + posB - a1 - posA;\n" - " float* resultPtr = &result;\n" - " for (j=0; j<3; j++)\n" - " {\n" - " info->m_constraintError[j*info->rowskip] = k * (resultPtr[j]);\n" - " }\n" - "}\n" - "Quaternion nearest( Quaternion first, Quaternion qd)\n" - "{\n" - " Quaternion diff,sum;\n" - " diff = first- qd;\n" - " sum = first + qd;\n" - " \n" - " if( dot(diff,diff) < dot(sum,sum) )\n" - " return qd;\n" - " return (-qd);\n" - "}\n" - "float b3Acos(float x) \n" - "{ \n" - " if (x<-1) \n" - " x=-1; \n" - " if (x>1) \n" - " x=1;\n" - " return acos(x); \n" - "}\n" - "float getAngle(Quaternion orn)\n" - "{\n" - " if (orn.w>=1.f)\n" - " orn.w=1.f;\n" - " float s = 2.f * b3Acos(orn.w);\n" - " return s;\n" - "}\n" - "void calculateDiffAxisAngleQuaternion( Quaternion orn0,Quaternion orn1a,float4* axis,float* angle)\n" - "{\n" - " Quaternion orn1 = nearest(orn0,orn1a);\n" - " \n" - " Quaternion dorn = qtMul(orn1,qtInvert(orn0));\n" - " *angle = getAngle(dorn);\n" - " *axis = (float4)(dorn.x,dorn.y,dorn.z,0.f);\n" - " \n" - " //check for axis length\n" - " float len = dot3F4(*axis,*axis);\n" - " if (len < FLT_EPSILON*FLT_EPSILON)\n" - " *axis = (float4)(1,0,0,0);\n" - " else\n" - " *axis /= sqrt(len);\n" - "}\n" - "void getInfo2FixedOrientation(__global b3GpuGenericConstraint* constraint,b3GpuConstraintInfo2* info,__global b3RigidBodyCL* bodies, int start_row)\n" - "{\n" - " Quaternion worldOrnA = bodies[constraint->m_rbA].m_quat;\n" - " Quaternion worldOrnB = bodies[constraint->m_rbB].m_quat;\n" - " int s = info->rowskip;\n" - " int start_index = start_row * s;\n" - " // 3 rows to make body rotations equal\n" - " info->m_J1angularAxis[start_index] = 1;\n" - " info->m_J1angularAxis[start_index + s + 1] = 1;\n" - " info->m_J1angularAxis[start_index + s*2+2] = 1;\n" - " if ( info->m_J2angularAxis)\n" - " {\n" - " info->m_J2angularAxis[start_index] = -1;\n" - " info->m_J2angularAxis[start_index + s+1] = -1;\n" - " info->m_J2angularAxis[start_index + s*2+2] = -1;\n" - " }\n" - " \n" - " float currERP = info->erp;\n" - " float k = info->fps * currERP;\n" - " float4 diff;\n" - " float angle;\n" - " float4 qrelCur = qtMul(worldOrnA,qtInvert(worldOrnB));\n" - " \n" - " calculateDiffAxisAngleQuaternion(constraint->m_relTargetAB,qrelCur,&diff,&angle);\n" - " diff*=-angle;\n" - " \n" - " float* resultPtr = &diff;\n" - " \n" - " for (int j=0; j<3; j++)\n" - " {\n" - " info->m_constraintError[(3+j)*info->rowskip] = k * resultPtr[j];\n" - " }\n" - " \n" - "}\n" - "__kernel void writeBackVelocitiesKernel(__global b3RigidBodyCL* bodies,__global b3GpuSolverBody* solverBodies,int numBodies)\n" - "{\n" - " int i = get_global_id(0);\n" - " if (i>=numBodies)\n" - " return;\n" - " if (bodies[i].m_invMass)\n" - " {\n" - "// if (length(solverBodies[i].m_deltaLinearVelocity)=numConstraints)\n" - " return;\n" - " \n" - " //for now, always initialize the batch info\n" - " int info1 = infos[i];\n" - " \n" - " __global b3SolverConstraint* currentConstraintRow = &solverConstraintRows[constraintRowOffsets[i]];\n" - " __global b3GpuGenericConstraint* constraint = &constraints[i];\n" - " __global b3RigidBodyCL* rbA = &bodies[ constraint->m_rbA];\n" - " __global b3RigidBodyCL* rbB = &bodies[ constraint->m_rbB];\n" - " int solverBodyIdA = constraint->m_rbA;\n" - " int solverBodyIdB = constraint->m_rbB;\n" - " __global b3GpuSolverBody* bodyAPtr = &solverBodies[solverBodyIdA];\n" - " __global b3GpuSolverBody* bodyBPtr = &solverBodies[solverBodyIdB];\n" - " if (rbA->m_invMass)\n" - " {\n" - " batchConstraints[i].m_bodyAPtrAndSignBit = solverBodyIdA;\n" - " } else\n" - " {\n" - "// if (!solverBodyIdA)\n" - "// m_staticIdx = 0;\n" - " batchConstraints[i].m_bodyAPtrAndSignBit = -solverBodyIdA;\n" - " }\n" - " if (rbB->m_invMass)\n" - " {\n" - " batchConstraints[i].m_bodyBPtrAndSignBit = solverBodyIdB;\n" - " } else\n" - " {\n" - "// if (!solverBodyIdB)\n" - "// m_staticIdx = 0;\n" - " batchConstraints[i].m_bodyBPtrAndSignBit = -solverBodyIdB;\n" - " }\n" - " if (info1)\n" - " {\n" - " int overrideNumSolverIterations = 0;//constraint->getOverrideNumSolverIterations() > 0 ? constraint->getOverrideNumSolverIterations() : infoGlobal.m_numIterations;\n" - "// if (overrideNumSolverIterations>m_maxOverrideNumSolverIterations)\n" - " // m_maxOverrideNumSolverIterations = overrideNumSolverIterations;\n" - " int j;\n" - " for ( j=0;jm_deltaLinearVelocity = (float4)(0,0,0,0);\n" - " bodyAPtr->m_deltaAngularVelocity = (float4)(0,0,0,0);\n" - " bodyAPtr->m_pushVelocity = (float4)(0,0,0,0);\n" - " bodyAPtr->m_turnVelocity = (float4)(0,0,0,0);\n" - " bodyBPtr->m_deltaLinearVelocity = (float4)(0,0,0,0);\n" - " bodyBPtr->m_deltaAngularVelocity = (float4)(0,0,0,0);\n" - " bodyBPtr->m_pushVelocity = (float4)(0,0,0,0);\n" - " bodyBPtr->m_turnVelocity = (float4)(0,0,0,0);\n" - " int rowskip = sizeof(b3SolverConstraint)/sizeof(float);//check this\n" - " \n" - " b3GpuConstraintInfo2 info2;\n" - " info2.fps = 1.f/timeStep;\n" - " info2.erp = globalErp;\n" - " info2.m_J1linearAxisFloat4 = ¤tConstraintRow->m_contactNormal;\n" - " info2.m_J1angularAxisFloat4 = ¤tConstraintRow->m_relpos1CrossNormal;\n" - " info2.m_J2linearAxisFloat4 = 0;\n" - " info2.m_J2angularAxisFloat4 = ¤tConstraintRow->m_relpos2CrossNormal;\n" - " info2.rowskip = sizeof(b3SolverConstraint)/sizeof(float);//check this\n" - " ///the size of b3SolverConstraint needs be a multiple of float\n" - "// b3Assert(info2.rowskip*sizeof(float)== sizeof(b3SolverConstraint));\n" - " info2.m_constraintError = ¤tConstraintRow->m_rhs;\n" - " currentConstraintRow->m_cfm = globalCfm;\n" - " info2.m_damping = globalDamping;\n" - " info2.cfm = ¤tConstraintRow->m_cfm;\n" - " info2.m_lowerLimit = ¤tConstraintRow->m_lowerLimit;\n" - " info2.m_upperLimit = ¤tConstraintRow->m_upperLimit;\n" - " info2.m_numIterations = globalNumIterations;\n" - " switch (constraint->m_constraintType)\n" - " {\n" - " case B3_GPU_POINT2POINT_CONSTRAINT_TYPE:\n" - " {\n" - " getInfo2Point2Point(constraint,&info2,bodies);\n" - " break;\n" - " }\n" - " case B3_GPU_FIXED_CONSTRAINT_TYPE:\n" - " {\n" - " getInfo2Point2Point(constraint,&info2,bodies);\n" - " getInfo2FixedOrientation(constraint,&info2,bodies,3);\n" - " break;\n" - " }\n" - " default:\n" - " {\n" - " }\n" - " }\n" - " ///finalize the constraint setup\n" - " for ( j=0;jm_upperLimit>=constraint->m_breakingImpulseThreshold)\n" - " {\n" - " solverConstraint->m_upperLimit = constraint->m_breakingImpulseThreshold;\n" - " }\n" - " if (solverConstraint->m_lowerLimit<=-constraint->m_breakingImpulseThreshold)\n" - " {\n" - " solverConstraint->m_lowerLimit = -constraint->m_breakingImpulseThreshold;\n" - " }\n" - "// solverConstraint->m_originalContactPoint = constraint;\n" - " \n" - " Matrix3x3 invInertiaWorldA= inertias[constraint->m_rbA].m_invInertiaWorld;\n" - " {\n" - " //float4 angularFactorA(1,1,1);\n" - " float4 ftorqueAxis1 = solverConstraint->m_relpos1CrossNormal;\n" - " solverConstraint->m_angularComponentA = mtMul1(invInertiaWorldA,ftorqueAxis1);//*angularFactorA;\n" - " }\n" - " \n" - " Matrix3x3 invInertiaWorldB= inertias[constraint->m_rbB].m_invInertiaWorld;\n" - " {\n" - " float4 ftorqueAxis2 = solverConstraint->m_relpos2CrossNormal;\n" - " solverConstraint->m_angularComponentB = mtMul1(invInertiaWorldB,ftorqueAxis2);//*constraint->m_rbB.getAngularFactor();\n" - " }\n" - " {\n" - " //it is ok to use solverConstraint->m_contactNormal instead of -solverConstraint->m_contactNormal\n" - " //because it gets multiplied iMJlB\n" - " float4 iMJlA = solverConstraint->m_contactNormal*rbA->m_invMass;\n" - " float4 iMJaA = mtMul3(solverConstraint->m_relpos1CrossNormal,invInertiaWorldA);\n" - " float4 iMJlB = solverConstraint->m_contactNormal*rbB->m_invMass;//sign of normal?\n" - " float4 iMJaB = mtMul3(solverConstraint->m_relpos2CrossNormal,invInertiaWorldB);\n" - " float sum = dot3F4(iMJlA,solverConstraint->m_contactNormal);\n" - " sum += dot3F4(iMJaA,solverConstraint->m_relpos1CrossNormal);\n" - " sum += dot3F4(iMJlB,solverConstraint->m_contactNormal);\n" - " sum += dot3F4(iMJaB,solverConstraint->m_relpos2CrossNormal);\n" - " float fsum = fabs(sum);\n" - " if (fsum>FLT_EPSILON)\n" - " {\n" - " solverConstraint->m_jacDiagABInv = 1.f/sum;\n" - " } else\n" - " {\n" - " solverConstraint->m_jacDiagABInv = 0.f;\n" - " }\n" - " }\n" - " ///fix rhs\n" - " ///todo: add force/torque accelerators\n" - " {\n" - " float rel_vel;\n" - " float vel1Dotn = dot3F4(solverConstraint->m_contactNormal,rbA->m_linVel) + dot3F4(solverConstraint->m_relpos1CrossNormal,rbA->m_angVel);\n" - " float vel2Dotn = -dot3F4(solverConstraint->m_contactNormal,rbB->m_linVel) + dot3F4(solverConstraint->m_relpos2CrossNormal,rbB->m_angVel);\n" - " rel_vel = vel1Dotn+vel2Dotn;\n" - " float restitution = 0.f;\n" - " float positionalError = solverConstraint->m_rhs;//already filled in by getConstraintInfo2\n" - " float velocityError = restitution - rel_vel * info2.m_damping;\n" - " float penetrationImpulse = positionalError*solverConstraint->m_jacDiagABInv;\n" - " float velocityImpulse = velocityError *solverConstraint->m_jacDiagABInv;\n" - " solverConstraint->m_rhs = penetrationImpulse+velocityImpulse;\n" - " solverConstraint->m_appliedImpulse = 0.f;\n" - " }\n" - " }\n" - " }\n" - "}\n"; diff --git a/engine/inc/bullet/Bullet3OpenCL/RigidBody/kernels/solveContact.h b/engine/inc/bullet/Bullet3OpenCL/RigidBody/kernels/solveContact.h deleted file mode 100644 index 6e14ad51..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/RigidBody/kernels/solveContact.h +++ /dev/null @@ -1,392 +0,0 @@ -//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project -static const char* solveContactCL = - "/*\n" - "Copyright (c) 2012 Advanced Micro Devices, Inc. \n" - "This software is provided 'as-is', without any express or implied warranty.\n" - "In no event will the authors be held liable for any damages arising from the use of this software.\n" - "Permission is granted to anyone to use this software for any purpose, \n" - "including commercial applications, and to alter it and redistribute it freely, \n" - "subject to the following restrictions:\n" - "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.\n" - "2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.\n" - "3. This notice may not be removed or altered from any source distribution.\n" - "*/\n" - "//Originally written by Takahiro Harada\n" - "//#pragma OPENCL EXTENSION cl_amd_printf : enable\n" - "#pragma OPENCL EXTENSION cl_khr_local_int32_base_atomics : enable\n" - "#pragma OPENCL EXTENSION cl_khr_global_int32_base_atomics : enable\n" - "#pragma OPENCL EXTENSION cl_khr_local_int32_extended_atomics : enable\n" - "#pragma OPENCL EXTENSION cl_khr_global_int32_extended_atomics : enable\n" - "#ifdef cl_ext_atomic_counters_32\n" - "#pragma OPENCL EXTENSION cl_ext_atomic_counters_32 : enable\n" - "#else\n" - "#define counter32_t volatile global int*\n" - "#endif\n" - "typedef unsigned int u32;\n" - "typedef unsigned short u16;\n" - "typedef unsigned char u8;\n" - "#define GET_GROUP_IDX get_group_id(0)\n" - "#define GET_LOCAL_IDX get_local_id(0)\n" - "#define GET_GLOBAL_IDX get_global_id(0)\n" - "#define GET_GROUP_SIZE get_local_size(0)\n" - "#define GET_NUM_GROUPS get_num_groups(0)\n" - "#define GROUP_LDS_BARRIER barrier(CLK_LOCAL_MEM_FENCE)\n" - "#define GROUP_MEM_FENCE mem_fence(CLK_LOCAL_MEM_FENCE)\n" - "#define AtomInc(x) atom_inc(&(x))\n" - "#define AtomInc1(x, out) out = atom_inc(&(x))\n" - "#define AppendInc(x, out) out = atomic_inc(x)\n" - "#define AtomAdd(x, value) atom_add(&(x), value)\n" - "#define AtomCmpxhg(x, cmp, value) atom_cmpxchg( &(x), cmp, value )\n" - "#define AtomXhg(x, value) atom_xchg ( &(x), value )\n" - "#define SELECT_UINT4( b, a, condition ) select( b,a,condition )\n" - "#define mymake_float4 (float4)\n" - "//#define make_float2 (float2)\n" - "//#define make_uint4 (uint4)\n" - "//#define make_int4 (int4)\n" - "//#define make_uint2 (uint2)\n" - "//#define make_int2 (int2)\n" - "#define max2 max\n" - "#define min2 min\n" - "///////////////////////////////////////\n" - "// Vector\n" - "///////////////////////////////////////\n" - "__inline\n" - "float4 fastNormalize4(float4 v)\n" - "{\n" - " return fast_normalize(v);\n" - "}\n" - "__inline\n" - "float4 cross3(float4 a, float4 b)\n" - "{\n" - " return cross(a,b);\n" - "}\n" - "__inline\n" - "float dot3F4(float4 a, float4 b)\n" - "{\n" - " float4 a1 = mymake_float4(a.xyz,0.f);\n" - " float4 b1 = mymake_float4(b.xyz,0.f);\n" - " return dot(a1, b1);\n" - "}\n" - "__inline\n" - "float4 normalize3(const float4 a)\n" - "{\n" - " float4 n = mymake_float4(a.x, a.y, a.z, 0.f);\n" - " return fastNormalize4( n );\n" - "// float length = sqrtf(dot3F4(a, a));\n" - "// return 1.f/length * a;\n" - "}\n" - "///////////////////////////////////////\n" - "// Matrix3x3\n" - "///////////////////////////////////////\n" - "typedef struct\n" - "{\n" - " float4 m_row[3];\n" - "}Matrix3x3;\n" - "__inline\n" - "float4 mtMul1(Matrix3x3 a, float4 b);\n" - "__inline\n" - "float4 mtMul3(float4 a, Matrix3x3 b);\n" - "__inline\n" - "float4 mtMul1(Matrix3x3 a, float4 b)\n" - "{\n" - " float4 ans;\n" - " ans.x = dot3F4( a.m_row[0], b );\n" - " ans.y = dot3F4( a.m_row[1], b );\n" - " ans.z = dot3F4( a.m_row[2], b );\n" - " ans.w = 0.f;\n" - " return ans;\n" - "}\n" - "__inline\n" - "float4 mtMul3(float4 a, Matrix3x3 b)\n" - "{\n" - " float4 colx = mymake_float4(b.m_row[0].x, b.m_row[1].x, b.m_row[2].x, 0);\n" - " float4 coly = mymake_float4(b.m_row[0].y, b.m_row[1].y, b.m_row[2].y, 0);\n" - " float4 colz = mymake_float4(b.m_row[0].z, b.m_row[1].z, b.m_row[2].z, 0);\n" - " float4 ans;\n" - " ans.x = dot3F4( a, colx );\n" - " ans.y = dot3F4( a, coly );\n" - " ans.z = dot3F4( a, colz );\n" - " return ans;\n" - "}\n" - "///////////////////////////////////////\n" - "// Quaternion\n" - "///////////////////////////////////////\n" - "typedef float4 Quaternion;\n" - "#define WG_SIZE 64\n" - "typedef struct\n" - "{\n" - " float4 m_pos;\n" - " Quaternion m_quat;\n" - " float4 m_linVel;\n" - " float4 m_angVel;\n" - " u32 m_shapeIdx;\n" - " float m_invMass;\n" - " float m_restituitionCoeff;\n" - " float m_frictionCoeff;\n" - "} Body;\n" - "typedef struct\n" - "{\n" - " Matrix3x3 m_invInertia;\n" - " Matrix3x3 m_initInvInertia;\n" - "} Shape;\n" - "typedef struct\n" - "{\n" - " float4 m_linear;\n" - " float4 m_worldPos[4];\n" - " float4 m_center; \n" - " float m_jacCoeffInv[4];\n" - " float m_b[4];\n" - " float m_appliedRambdaDt[4];\n" - " float m_fJacCoeffInv[2]; \n" - " float m_fAppliedRambdaDt[2]; \n" - " u32 m_bodyA;\n" - " u32 m_bodyB;\n" - " int m_batchIdx;\n" - " u32 m_paddings[1];\n" - "} Constraint4;\n" - "typedef struct\n" - "{\n" - " int m_nConstraints;\n" - " int m_start;\n" - " int m_batchIdx;\n" - " int m_nSplit;\n" - "// int m_paddings[1];\n" - "} ConstBuffer;\n" - "typedef struct\n" - "{\n" - " int m_solveFriction;\n" - " int m_maxBatch; // long batch really kills the performance\n" - " int m_batchIdx;\n" - " int m_nSplit;\n" - "// int m_paddings[1];\n" - "} ConstBufferBatchSolve;\n" - "void setLinearAndAngular( float4 n, float4 r0, float4 r1, float4* linear, float4* angular0, float4* angular1);\n" - "void setLinearAndAngular( float4 n, float4 r0, float4 r1, float4* linear, float4* angular0, float4* angular1)\n" - "{\n" - " *linear = mymake_float4(-n.xyz,0.f);\n" - " *angular0 = -cross3(r0, n);\n" - " *angular1 = cross3(r1, n);\n" - "}\n" - "float calcRelVel( float4 l0, float4 l1, float4 a0, float4 a1, float4 linVel0, float4 angVel0, float4 linVel1, float4 angVel1 );\n" - "float calcRelVel( float4 l0, float4 l1, float4 a0, float4 a1, float4 linVel0, float4 angVel0, float4 linVel1, float4 angVel1 )\n" - "{\n" - " return dot3F4(l0, linVel0) + dot3F4(a0, angVel0) + dot3F4(l1, linVel1) + dot3F4(a1, angVel1);\n" - "}\n" - "float calcJacCoeff(const float4 linear0, const float4 linear1, const float4 angular0, const float4 angular1,\n" - " float invMass0, const Matrix3x3* invInertia0, float invMass1, const Matrix3x3* invInertia1);\n" - "float calcJacCoeff(const float4 linear0, const float4 linear1, const float4 angular0, const float4 angular1,\n" - " float invMass0, const Matrix3x3* invInertia0, float invMass1, const Matrix3x3* invInertia1)\n" - "{\n" - " // linear0,1 are normlized\n" - " float jmj0 = invMass0;//dot3F4(linear0, linear0)*invMass0;\n" - " float jmj1 = dot3F4(mtMul3(angular0,*invInertia0), angular0);\n" - " float jmj2 = invMass1;//dot3F4(linear1, linear1)*invMass1;\n" - " float jmj3 = dot3F4(mtMul3(angular1,*invInertia1), angular1);\n" - " return -1.f/(jmj0+jmj1+jmj2+jmj3);\n" - "}\n" - "void solveContact(__global Constraint4* cs,\n" - " float4 posA, float4* linVelA, float4* angVelA, float invMassA, Matrix3x3 invInertiaA,\n" - " float4 posB, float4* linVelB, float4* angVelB, float invMassB, Matrix3x3 invInertiaB);\n" - "void solveContact(__global Constraint4* cs,\n" - " float4 posA, float4* linVelA, float4* angVelA, float invMassA, Matrix3x3 invInertiaA,\n" - " float4 posB, float4* linVelB, float4* angVelB, float invMassB, Matrix3x3 invInertiaB)\n" - "{\n" - " float minRambdaDt = 0;\n" - " float maxRambdaDt = FLT_MAX;\n" - " for(int ic=0; ic<4; ic++)\n" - " {\n" - " if( cs->m_jacCoeffInv[ic] == 0.f ) continue;\n" - " float4 angular0, angular1, linear;\n" - " float4 r0 = cs->m_worldPos[ic] - posA;\n" - " float4 r1 = cs->m_worldPos[ic] - posB;\n" - " setLinearAndAngular( -cs->m_linear, r0, r1, &linear, &angular0, &angular1 );\n" - " float rambdaDt = calcRelVel( cs->m_linear, -cs->m_linear, angular0, angular1, \n" - " *linVelA, *angVelA, *linVelB, *angVelB ) + cs->m_b[ic];\n" - " rambdaDt *= cs->m_jacCoeffInv[ic];\n" - " {\n" - " float prevSum = cs->m_appliedRambdaDt[ic];\n" - " float updated = prevSum;\n" - " updated += rambdaDt;\n" - " updated = max2( updated, minRambdaDt );\n" - " updated = min2( updated, maxRambdaDt );\n" - " rambdaDt = updated - prevSum;\n" - " cs->m_appliedRambdaDt[ic] = updated;\n" - " }\n" - " float4 linImp0 = invMassA*linear*rambdaDt;\n" - " float4 linImp1 = invMassB*(-linear)*rambdaDt;\n" - " float4 angImp0 = mtMul1(invInertiaA, angular0)*rambdaDt;\n" - " float4 angImp1 = mtMul1(invInertiaB, angular1)*rambdaDt;\n" - " *linVelA += linImp0;\n" - " *angVelA += angImp0;\n" - " *linVelB += linImp1;\n" - " *angVelB += angImp1;\n" - " }\n" - "}\n" - "void btPlaneSpace1 (const float4* n, float4* p, float4* q);\n" - " void btPlaneSpace1 (const float4* n, float4* p, float4* q)\n" - "{\n" - " if (fabs(n[0].z) > 0.70710678f) {\n" - " // choose p in y-z plane\n" - " float a = n[0].y*n[0].y + n[0].z*n[0].z;\n" - " float k = 1.f/sqrt(a);\n" - " p[0].x = 0;\n" - " p[0].y = -n[0].z*k;\n" - " p[0].z = n[0].y*k;\n" - " // set q = n x p\n" - " q[0].x = a*k;\n" - " q[0].y = -n[0].x*p[0].z;\n" - " q[0].z = n[0].x*p[0].y;\n" - " }\n" - " else {\n" - " // choose p in x-y plane\n" - " float a = n[0].x*n[0].x + n[0].y*n[0].y;\n" - " float k = 1.f/sqrt(a);\n" - " p[0].x = -n[0].y*k;\n" - " p[0].y = n[0].x*k;\n" - " p[0].z = 0;\n" - " // set q = n x p\n" - " q[0].x = -n[0].z*p[0].y;\n" - " q[0].y = n[0].z*p[0].x;\n" - " q[0].z = a*k;\n" - " }\n" - "}\n" - "void solveContactConstraint(__global Body* gBodies, __global Shape* gShapes, __global Constraint4* ldsCs);\n" - "void solveContactConstraint(__global Body* gBodies, __global Shape* gShapes, __global Constraint4* ldsCs)\n" - "{\n" - " //float frictionCoeff = ldsCs[0].m_linear.w;\n" - " int aIdx = ldsCs[0].m_bodyA;\n" - " int bIdx = ldsCs[0].m_bodyB;\n" - " float4 posA = gBodies[aIdx].m_pos;\n" - " float4 linVelA = gBodies[aIdx].m_linVel;\n" - " float4 angVelA = gBodies[aIdx].m_angVel;\n" - " float invMassA = gBodies[aIdx].m_invMass;\n" - " Matrix3x3 invInertiaA = gShapes[aIdx].m_invInertia;\n" - " float4 posB = gBodies[bIdx].m_pos;\n" - " float4 linVelB = gBodies[bIdx].m_linVel;\n" - " float4 angVelB = gBodies[bIdx].m_angVel;\n" - " float invMassB = gBodies[bIdx].m_invMass;\n" - " Matrix3x3 invInertiaB = gShapes[bIdx].m_invInertia;\n" - " solveContact( ldsCs, posA, &linVelA, &angVelA, invMassA, invInertiaA,\n" - " posB, &linVelB, &angVelB, invMassB, invInertiaB );\n" - " if (gBodies[aIdx].m_invMass)\n" - " {\n" - " gBodies[aIdx].m_linVel = linVelA;\n" - " gBodies[aIdx].m_angVel = angVelA;\n" - " } else\n" - " {\n" - " gBodies[aIdx].m_linVel = mymake_float4(0,0,0,0);\n" - " gBodies[aIdx].m_angVel = mymake_float4(0,0,0,0);\n" - " \n" - " }\n" - " if (gBodies[bIdx].m_invMass)\n" - " {\n" - " gBodies[bIdx].m_linVel = linVelB;\n" - " gBodies[bIdx].m_angVel = angVelB;\n" - " } else\n" - " {\n" - " gBodies[bIdx].m_linVel = mymake_float4(0,0,0,0);\n" - " gBodies[bIdx].m_angVel = mymake_float4(0,0,0,0);\n" - " \n" - " }\n" - "}\n" - "typedef struct \n" - "{\n" - " int m_valInt0;\n" - " int m_valInt1;\n" - " int m_valInt2;\n" - " int m_valInt3;\n" - " float m_val0;\n" - " float m_val1;\n" - " float m_val2;\n" - " float m_val3;\n" - "} SolverDebugInfo;\n" - "__kernel\n" - "__attribute__((reqd_work_group_size(WG_SIZE,1,1)))\n" - "void BatchSolveKernelContact(__global Body* gBodies,\n" - " __global Shape* gShapes,\n" - " __global Constraint4* gConstraints,\n" - " __global int* gN,\n" - " __global int* gOffsets,\n" - " __global int* batchSizes,\n" - " int maxBatch1,\n" - " int cellBatch,\n" - " int4 nSplit\n" - " )\n" - "{\n" - " //__local int ldsBatchIdx[WG_SIZE+1];\n" - " __local int ldsCurBatch;\n" - " __local int ldsNextBatch;\n" - " __local int ldsStart;\n" - " int lIdx = GET_LOCAL_IDX;\n" - " int wgIdx = GET_GROUP_IDX;\n" - "// int gIdx = GET_GLOBAL_IDX;\n" - "// debugInfo[gIdx].m_valInt0 = gIdx;\n" - " //debugInfo[gIdx].m_valInt1 = GET_GROUP_SIZE;\n" - " \n" - " \n" - " int zIdx = (wgIdx/((nSplit.x*nSplit.y)/4))*2+((cellBatch&4)>>2);\n" - " int remain= (wgIdx%((nSplit.x*nSplit.y)/4));\n" - " int yIdx = (remain/(nSplit.x/2))*2 + ((cellBatch&2)>>1);\n" - " int xIdx = (remain%(nSplit.x/2))*2 + (cellBatch&1);\n" - " int cellIdx = xIdx+yIdx*nSplit.x+zIdx*(nSplit.x*nSplit.y);\n" - " //int xIdx = (wgIdx/(nSplit/2))*2 + (bIdx&1);\n" - " //int yIdx = (wgIdx%(nSplit/2))*2 + (bIdx>>1);\n" - " //int cellIdx = xIdx+yIdx*nSplit;\n" - " \n" - " if( gN[cellIdx] == 0 ) \n" - " return;\n" - " int maxBatch = batchSizes[cellIdx];\n" - " \n" - " \n" - " const int start = gOffsets[cellIdx];\n" - " const int end = start + gN[cellIdx];\n" - " \n" - " \n" - " \n" - " if( lIdx == 0 )\n" - " {\n" - " ldsCurBatch = 0;\n" - " ldsNextBatch = 0;\n" - " ldsStart = start;\n" - " }\n" - " GROUP_LDS_BARRIER;\n" - " int idx=ldsStart+lIdx;\n" - " while (ldsCurBatch < maxBatch)\n" - " {\n" - " for(; idx 0.70710678f) {\n" - " // choose p in y-z plane\n" - " float a = n[0].y*n[0].y + n[0].z*n[0].z;\n" - " float k = 1.f/sqrt(a);\n" - " p[0].x = 0;\n" - " p[0].y = -n[0].z*k;\n" - " p[0].z = n[0].y*k;\n" - " // set q = n x p\n" - " q[0].x = a*k;\n" - " q[0].y = -n[0].x*p[0].z;\n" - " q[0].z = n[0].x*p[0].y;\n" - " }\n" - " else {\n" - " // choose p in x-y plane\n" - " float a = n[0].x*n[0].x + n[0].y*n[0].y;\n" - " float k = 1.f/sqrt(a);\n" - " p[0].x = -n[0].y*k;\n" - " p[0].y = n[0].x*k;\n" - " p[0].z = 0;\n" - " // set q = n x p\n" - " q[0].x = -n[0].z*p[0].y;\n" - " q[0].y = n[0].z*p[0].x;\n" - " q[0].z = a*k;\n" - " }\n" - "}\n" - "void solveFrictionConstraint(__global Body* gBodies, __global Shape* gShapes, __global Constraint4* ldsCs);\n" - "void solveFrictionConstraint(__global Body* gBodies, __global Shape* gShapes, __global Constraint4* ldsCs)\n" - "{\n" - " float frictionCoeff = ldsCs[0].m_linear.w;\n" - " int aIdx = ldsCs[0].m_bodyA;\n" - " int bIdx = ldsCs[0].m_bodyB;\n" - " float4 posA = gBodies[aIdx].m_pos;\n" - " float4 linVelA = gBodies[aIdx].m_linVel;\n" - " float4 angVelA = gBodies[aIdx].m_angVel;\n" - " float invMassA = gBodies[aIdx].m_invMass;\n" - " Matrix3x3 invInertiaA = gShapes[aIdx].m_invInertia;\n" - " float4 posB = gBodies[bIdx].m_pos;\n" - " float4 linVelB = gBodies[bIdx].m_linVel;\n" - " float4 angVelB = gBodies[bIdx].m_angVel;\n" - " float invMassB = gBodies[bIdx].m_invMass;\n" - " Matrix3x3 invInertiaB = gShapes[bIdx].m_invInertia;\n" - " \n" - " {\n" - " float maxRambdaDt[4] = {FLT_MAX,FLT_MAX,FLT_MAX,FLT_MAX};\n" - " float minRambdaDt[4] = {0.f,0.f,0.f,0.f};\n" - " float sum = 0;\n" - " for(int j=0; j<4; j++)\n" - " {\n" - " sum +=ldsCs[0].m_appliedRambdaDt[j];\n" - " }\n" - " frictionCoeff = 0.7f;\n" - " for(int j=0; j<4; j++)\n" - " {\n" - " maxRambdaDt[j] = frictionCoeff*sum;\n" - " minRambdaDt[j] = -maxRambdaDt[j];\n" - " }\n" - " \n" - "// solveFriction( ldsCs, posA, &linVelA, &angVelA, invMassA, invInertiaA,\n" - "// posB, &linVelB, &angVelB, invMassB, invInertiaB, maxRambdaDt, minRambdaDt );\n" - " \n" - " \n" - " {\n" - " \n" - " __global Constraint4* cs = ldsCs;\n" - " \n" - " if( cs->m_fJacCoeffInv[0] == 0 && cs->m_fJacCoeffInv[0] == 0 ) return;\n" - " const float4 center = cs->m_center;\n" - " \n" - " float4 n = -cs->m_linear;\n" - " \n" - " float4 tangent[2];\n" - " btPlaneSpace1(&n,&tangent[0],&tangent[1]);\n" - " float4 angular0, angular1, linear;\n" - " float4 r0 = center - posA;\n" - " float4 r1 = center - posB;\n" - " for(int i=0; i<2; i++)\n" - " {\n" - " setLinearAndAngular( tangent[i], r0, r1, &linear, &angular0, &angular1 );\n" - " float rambdaDt = calcRelVel(linear, -linear, angular0, angular1,\n" - " linVelA, angVelA, linVelB, angVelB );\n" - " rambdaDt *= cs->m_fJacCoeffInv[i];\n" - " \n" - " {\n" - " float prevSum = cs->m_fAppliedRambdaDt[i];\n" - " float updated = prevSum;\n" - " updated += rambdaDt;\n" - " updated = max2( updated, minRambdaDt[i] );\n" - " updated = min2( updated, maxRambdaDt[i] );\n" - " rambdaDt = updated - prevSum;\n" - " cs->m_fAppliedRambdaDt[i] = updated;\n" - " }\n" - " \n" - " float4 linImp0 = invMassA*linear*rambdaDt;\n" - " float4 linImp1 = invMassB*(-linear)*rambdaDt;\n" - " float4 angImp0 = mtMul1(invInertiaA, angular0)*rambdaDt;\n" - " float4 angImp1 = mtMul1(invInertiaB, angular1)*rambdaDt;\n" - " \n" - " linVelA += linImp0;\n" - " angVelA += angImp0;\n" - " linVelB += linImp1;\n" - " angVelB += angImp1;\n" - " }\n" - " { // angular damping for point constraint\n" - " float4 ab = normalize3( posB - posA );\n" - " float4 ac = normalize3( center - posA );\n" - " if( dot3F4( ab, ac ) > 0.95f || (invMassA == 0.f || invMassB == 0.f))\n" - " {\n" - " float angNA = dot3F4( n, angVelA );\n" - " float angNB = dot3F4( n, angVelB );\n" - " \n" - " angVelA -= (angNA*0.1f)*n;\n" - " angVelB -= (angNB*0.1f)*n;\n" - " }\n" - " }\n" - " }\n" - " \n" - " \n" - " }\n" - " if (gBodies[aIdx].m_invMass)\n" - " {\n" - " gBodies[aIdx].m_linVel = linVelA;\n" - " gBodies[aIdx].m_angVel = angVelA;\n" - " } else\n" - " {\n" - " gBodies[aIdx].m_linVel = mymake_float4(0,0,0,0);\n" - " gBodies[aIdx].m_angVel = mymake_float4(0,0,0,0);\n" - " }\n" - " if (gBodies[bIdx].m_invMass)\n" - " {\n" - " gBodies[bIdx].m_linVel = linVelB;\n" - " gBodies[bIdx].m_angVel = angVelB;\n" - " } else\n" - " {\n" - " gBodies[bIdx].m_linVel = mymake_float4(0,0,0,0);\n" - " gBodies[bIdx].m_angVel = mymake_float4(0,0,0,0);\n" - " }\n" - " \n" - "}\n" - "typedef struct \n" - "{\n" - " int m_valInt0;\n" - " int m_valInt1;\n" - " int m_valInt2;\n" - " int m_valInt3;\n" - " float m_val0;\n" - " float m_val1;\n" - " float m_val2;\n" - " float m_val3;\n" - "} SolverDebugInfo;\n" - "__kernel\n" - "__attribute__((reqd_work_group_size(WG_SIZE,1,1)))\n" - "void BatchSolveKernelFriction(__global Body* gBodies,\n" - " __global Shape* gShapes,\n" - " __global Constraint4* gConstraints,\n" - " __global int* gN,\n" - " __global int* gOffsets,\n" - " __global int* batchSizes,\n" - " int maxBatch1,\n" - " int cellBatch,\n" - " int4 nSplit\n" - " )\n" - "{\n" - " //__local int ldsBatchIdx[WG_SIZE+1];\n" - " __local int ldsCurBatch;\n" - " __local int ldsNextBatch;\n" - " __local int ldsStart;\n" - " int lIdx = GET_LOCAL_IDX;\n" - " int wgIdx = GET_GROUP_IDX;\n" - "// int gIdx = GET_GLOBAL_IDX;\n" - "// debugInfo[gIdx].m_valInt0 = gIdx;\n" - " //debugInfo[gIdx].m_valInt1 = GET_GROUP_SIZE;\n" - " int zIdx = (wgIdx/((nSplit.x*nSplit.y)/4))*2+((cellBatch&4)>>2);\n" - " int remain= (wgIdx%((nSplit.x*nSplit.y)/4));\n" - " int yIdx = (remain/(nSplit.x/2))*2 + ((cellBatch&2)>>1);\n" - " int xIdx = (remain%(nSplit.x/2))*2 + (cellBatch&1);\n" - " int cellIdx = xIdx+yIdx*nSplit.x+zIdx*(nSplit.x*nSplit.y);\n" - " \n" - " if( gN[cellIdx] == 0 ) \n" - " return;\n" - " int maxBatch = batchSizes[cellIdx];\n" - " const int start = gOffsets[cellIdx];\n" - " const int end = start + gN[cellIdx];\n" - " \n" - " if( lIdx == 0 )\n" - " {\n" - " ldsCurBatch = 0;\n" - " ldsNextBatch = 0;\n" - " ldsStart = start;\n" - " }\n" - " GROUP_LDS_BARRIER;\n" - " int idx=ldsStart+lIdx;\n" - " while (ldsCurBatch < maxBatch)\n" - " {\n" - " for(; idx1e-6 || b3Fabs(v.y)>1e-6 || b3Fabs(v.z)>1e-6) \n" - " return false;\n" - " return true;\n" - "}\n" - "inline int b3MaxDot( b3Float4ConstArg vec, __global const b3Float4* vecArray, int vecLen, float* dotOut )\n" - "{\n" - " float maxDot = -B3_INFINITY;\n" - " int i = 0;\n" - " int ptIndex = -1;\n" - " for( i = 0; i < vecLen; i++ )\n" - " {\n" - " float dot = b3Dot3F4(vecArray[i],vec);\n" - " \n" - " if( dot > maxDot )\n" - " {\n" - " maxDot = dot;\n" - " ptIndex = i;\n" - " }\n" - " }\n" - " b3Assert(ptIndex>=0);\n" - " if (ptIndex<0)\n" - " {\n" - " ptIndex = 0;\n" - " }\n" - " *dotOut = maxDot;\n" - " return ptIndex;\n" - "}\n" - "#endif //B3_FLOAT4_H\n" - "typedef struct b3Contact4Data b3Contact4Data_t;\n" - "struct b3Contact4Data\n" - "{\n" - " b3Float4 m_worldPosB[4];\n" - "// b3Float4 m_localPosA[4];\n" - "// b3Float4 m_localPosB[4];\n" - " b3Float4 m_worldNormalOnB; // w: m_nPoints\n" - " unsigned short m_restituitionCoeffCmp;\n" - " unsigned short m_frictionCoeffCmp;\n" - " int m_batchIdx;\n" - " int m_bodyAPtrAndSignBit;//x:m_bodyAPtr, y:m_bodyBPtr\n" - " int m_bodyBPtrAndSignBit;\n" - " int m_childIndexA;\n" - " int m_childIndexB;\n" - " int m_unused1;\n" - " int m_unused2;\n" - "};\n" - "inline int b3Contact4Data_getNumPoints(const struct b3Contact4Data* contact)\n" - "{\n" - " return (int)contact->m_worldNormalOnB.w;\n" - "};\n" - "inline void b3Contact4Data_setNumPoints(struct b3Contact4Data* contact, int numPoints)\n" - "{\n" - " contact->m_worldNormalOnB.w = (float)numPoints;\n" - "};\n" - "#endif //B3_CONTACT4DATA_H\n" - "#ifndef B3_CONTACT_CONSTRAINT5_H\n" - "#define B3_CONTACT_CONSTRAINT5_H\n" - "#ifndef B3_FLOAT4_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#endif \n" - "#endif //B3_FLOAT4_H\n" - "typedef struct b3ContactConstraint4 b3ContactConstraint4_t;\n" - "struct b3ContactConstraint4\n" - "{\n" - " b3Float4 m_linear;//normal?\n" - " b3Float4 m_worldPos[4];\n" - " b3Float4 m_center; // friction\n" - " float m_jacCoeffInv[4];\n" - " float m_b[4];\n" - " float m_appliedRambdaDt[4];\n" - " float m_fJacCoeffInv[2]; // friction\n" - " float m_fAppliedRambdaDt[2]; // friction\n" - " unsigned int m_bodyA;\n" - " unsigned int m_bodyB;\n" - " int m_batchIdx;\n" - " unsigned int m_paddings;\n" - "};\n" - "//inline void setFrictionCoeff(float value) { m_linear[3] = value; }\n" - "inline float b3GetFrictionCoeff(b3ContactConstraint4_t* constraint) \n" - "{\n" - " return constraint->m_linear.w; \n" - "}\n" - "#endif //B3_CONTACT_CONSTRAINT5_H\n" - "#ifndef B3_RIGIDBODY_DATA_H\n" - "#define B3_RIGIDBODY_DATA_H\n" - "#ifndef B3_FLOAT4_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#endif \n" - "#endif //B3_FLOAT4_H\n" - "#ifndef B3_QUAT_H\n" - "#define B3_QUAT_H\n" - "#ifndef B3_PLATFORM_DEFINITIONS_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#endif\n" - "#endif\n" - "#ifndef B3_FLOAT4_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#endif \n" - "#endif //B3_FLOAT4_H\n" - "#ifdef __cplusplus\n" - "#else\n" - " typedef float4 b3Quat;\n" - " #define b3QuatConstArg const b3Quat\n" - " \n" - " \n" - "inline float4 b3FastNormalize4(float4 v)\n" - "{\n" - " v = (float4)(v.xyz,0.f);\n" - " return fast_normalize(v);\n" - "}\n" - " \n" - "inline b3Quat b3QuatMul(b3Quat a, b3Quat b);\n" - "inline b3Quat b3QuatNormalized(b3QuatConstArg in);\n" - "inline b3Quat b3QuatRotate(b3QuatConstArg q, b3QuatConstArg vec);\n" - "inline b3Quat b3QuatInvert(b3QuatConstArg q);\n" - "inline b3Quat b3QuatInverse(b3QuatConstArg q);\n" - "inline b3Quat b3QuatMul(b3QuatConstArg a, b3QuatConstArg b)\n" - "{\n" - " b3Quat ans;\n" - " ans = b3Cross3( a, b );\n" - " ans += a.w*b+b.w*a;\n" - "// ans.w = a.w*b.w - (a.x*b.x+a.y*b.y+a.z*b.z);\n" - " ans.w = a.w*b.w - b3Dot3F4(a, b);\n" - " return ans;\n" - "}\n" - "inline b3Quat b3QuatNormalized(b3QuatConstArg in)\n" - "{\n" - " b3Quat q;\n" - " q=in;\n" - " //return b3FastNormalize4(in);\n" - " float len = native_sqrt(dot(q, q));\n" - " if(len > 0.f)\n" - " {\n" - " q *= 1.f / len;\n" - " }\n" - " else\n" - " {\n" - " q.x = q.y = q.z = 0.f;\n" - " q.w = 1.f;\n" - " }\n" - " return q;\n" - "}\n" - "inline float4 b3QuatRotate(b3QuatConstArg q, b3QuatConstArg vec)\n" - "{\n" - " b3Quat qInv = b3QuatInvert( q );\n" - " float4 vcpy = vec;\n" - " vcpy.w = 0.f;\n" - " float4 out = b3QuatMul(b3QuatMul(q,vcpy),qInv);\n" - " return out;\n" - "}\n" - "inline b3Quat b3QuatInverse(b3QuatConstArg q)\n" - "{\n" - " return (b3Quat)(-q.xyz, q.w);\n" - "}\n" - "inline b3Quat b3QuatInvert(b3QuatConstArg q)\n" - "{\n" - " return (b3Quat)(-q.xyz, q.w);\n" - "}\n" - "inline float4 b3QuatInvRotate(b3QuatConstArg q, b3QuatConstArg vec)\n" - "{\n" - " return b3QuatRotate( b3QuatInvert( q ), vec );\n" - "}\n" - "inline b3Float4 b3TransformPoint(b3Float4ConstArg point, b3Float4ConstArg translation, b3QuatConstArg orientation)\n" - "{\n" - " return b3QuatRotate( orientation, point ) + (translation);\n" - "}\n" - " \n" - "#endif \n" - "#endif //B3_QUAT_H\n" - "#ifndef B3_MAT3x3_H\n" - "#define B3_MAT3x3_H\n" - "#ifndef B3_QUAT_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#endif \n" - "#endif //B3_QUAT_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "typedef struct\n" - "{\n" - " b3Float4 m_row[3];\n" - "}b3Mat3x3;\n" - "#define b3Mat3x3ConstArg const b3Mat3x3\n" - "#define b3GetRow(m,row) (m.m_row[row])\n" - "inline b3Mat3x3 b3QuatGetRotationMatrix(b3Quat quat)\n" - "{\n" - " b3Float4 quat2 = (b3Float4)(quat.x*quat.x, quat.y*quat.y, quat.z*quat.z, 0.f);\n" - " b3Mat3x3 out;\n" - " out.m_row[0].x=1-2*quat2.y-2*quat2.z;\n" - " out.m_row[0].y=2*quat.x*quat.y-2*quat.w*quat.z;\n" - " out.m_row[0].z=2*quat.x*quat.z+2*quat.w*quat.y;\n" - " out.m_row[0].w = 0.f;\n" - " out.m_row[1].x=2*quat.x*quat.y+2*quat.w*quat.z;\n" - " out.m_row[1].y=1-2*quat2.x-2*quat2.z;\n" - " out.m_row[1].z=2*quat.y*quat.z-2*quat.w*quat.x;\n" - " out.m_row[1].w = 0.f;\n" - " out.m_row[2].x=2*quat.x*quat.z-2*quat.w*quat.y;\n" - " out.m_row[2].y=2*quat.y*quat.z+2*quat.w*quat.x;\n" - " out.m_row[2].z=1-2*quat2.x-2*quat2.y;\n" - " out.m_row[2].w = 0.f;\n" - " return out;\n" - "}\n" - "inline b3Mat3x3 b3AbsoluteMat3x3(b3Mat3x3ConstArg matIn)\n" - "{\n" - " b3Mat3x3 out;\n" - " out.m_row[0] = fabs(matIn.m_row[0]);\n" - " out.m_row[1] = fabs(matIn.m_row[1]);\n" - " out.m_row[2] = fabs(matIn.m_row[2]);\n" - " return out;\n" - "}\n" - "__inline\n" - "b3Mat3x3 mtZero();\n" - "__inline\n" - "b3Mat3x3 mtIdentity();\n" - "__inline\n" - "b3Mat3x3 mtTranspose(b3Mat3x3 m);\n" - "__inline\n" - "b3Mat3x3 mtMul(b3Mat3x3 a, b3Mat3x3 b);\n" - "__inline\n" - "b3Float4 mtMul1(b3Mat3x3 a, b3Float4 b);\n" - "__inline\n" - "b3Float4 mtMul3(b3Float4 a, b3Mat3x3 b);\n" - "__inline\n" - "b3Mat3x3 mtZero()\n" - "{\n" - " b3Mat3x3 m;\n" - " m.m_row[0] = (b3Float4)(0.f);\n" - " m.m_row[1] = (b3Float4)(0.f);\n" - " m.m_row[2] = (b3Float4)(0.f);\n" - " return m;\n" - "}\n" - "__inline\n" - "b3Mat3x3 mtIdentity()\n" - "{\n" - " b3Mat3x3 m;\n" - " m.m_row[0] = (b3Float4)(1,0,0,0);\n" - " m.m_row[1] = (b3Float4)(0,1,0,0);\n" - " m.m_row[2] = (b3Float4)(0,0,1,0);\n" - " return m;\n" - "}\n" - "__inline\n" - "b3Mat3x3 mtTranspose(b3Mat3x3 m)\n" - "{\n" - " b3Mat3x3 out;\n" - " out.m_row[0] = (b3Float4)(m.m_row[0].x, m.m_row[1].x, m.m_row[2].x, 0.f);\n" - " out.m_row[1] = (b3Float4)(m.m_row[0].y, m.m_row[1].y, m.m_row[2].y, 0.f);\n" - " out.m_row[2] = (b3Float4)(m.m_row[0].z, m.m_row[1].z, m.m_row[2].z, 0.f);\n" - " return out;\n" - "}\n" - "__inline\n" - "b3Mat3x3 mtMul(b3Mat3x3 a, b3Mat3x3 b)\n" - "{\n" - " b3Mat3x3 transB;\n" - " transB = mtTranspose( b );\n" - " b3Mat3x3 ans;\n" - " // why this doesn't run when 0ing in the for{}\n" - " a.m_row[0].w = 0.f;\n" - " a.m_row[1].w = 0.f;\n" - " a.m_row[2].w = 0.f;\n" - " for(int i=0; i<3; i++)\n" - " {\n" - "// a.m_row[i].w = 0.f;\n" - " ans.m_row[i].x = b3Dot3F4(a.m_row[i],transB.m_row[0]);\n" - " ans.m_row[i].y = b3Dot3F4(a.m_row[i],transB.m_row[1]);\n" - " ans.m_row[i].z = b3Dot3F4(a.m_row[i],transB.m_row[2]);\n" - " ans.m_row[i].w = 0.f;\n" - " }\n" - " return ans;\n" - "}\n" - "__inline\n" - "b3Float4 mtMul1(b3Mat3x3 a, b3Float4 b)\n" - "{\n" - " b3Float4 ans;\n" - " ans.x = b3Dot3F4( a.m_row[0], b );\n" - " ans.y = b3Dot3F4( a.m_row[1], b );\n" - " ans.z = b3Dot3F4( a.m_row[2], b );\n" - " ans.w = 0.f;\n" - " return ans;\n" - "}\n" - "__inline\n" - "b3Float4 mtMul3(b3Float4 a, b3Mat3x3 b)\n" - "{\n" - " b3Float4 colx = b3MakeFloat4(b.m_row[0].x, b.m_row[1].x, b.m_row[2].x, 0);\n" - " b3Float4 coly = b3MakeFloat4(b.m_row[0].y, b.m_row[1].y, b.m_row[2].y, 0);\n" - " b3Float4 colz = b3MakeFloat4(b.m_row[0].z, b.m_row[1].z, b.m_row[2].z, 0);\n" - " b3Float4 ans;\n" - " ans.x = b3Dot3F4( a, colx );\n" - " ans.y = b3Dot3F4( a, coly );\n" - " ans.z = b3Dot3F4( a, colz );\n" - " return ans;\n" - "}\n" - "#endif\n" - "#endif //B3_MAT3x3_H\n" - "typedef struct b3RigidBodyData b3RigidBodyData_t;\n" - "struct b3RigidBodyData\n" - "{\n" - " b3Float4 m_pos;\n" - " b3Quat m_quat;\n" - " b3Float4 m_linVel;\n" - " b3Float4 m_angVel;\n" - " int m_collidableIdx;\n" - " float m_invMass;\n" - " float m_restituitionCoeff;\n" - " float m_frictionCoeff;\n" - "};\n" - "typedef struct b3InertiaData b3InertiaData_t;\n" - "struct b3InertiaData\n" - "{\n" - " b3Mat3x3 m_invInertiaWorld;\n" - " b3Mat3x3 m_initInvInertia;\n" - "};\n" - "#endif //B3_RIGIDBODY_DATA_H\n" - " \n" - "void b3PlaneSpace1 (b3Float4ConstArg n, b3Float4* p, b3Float4* q);\n" - " void b3PlaneSpace1 (b3Float4ConstArg n, b3Float4* p, b3Float4* q)\n" - "{\n" - " if (b3Fabs(n.z) > 0.70710678f) {\n" - " // choose p in y-z plane\n" - " float a = n.y*n.y + n.z*n.z;\n" - " float k = 1.f/sqrt(a);\n" - " p[0].x = 0;\n" - " p[0].y = -n.z*k;\n" - " p[0].z = n.y*k;\n" - " // set q = n x p\n" - " q[0].x = a*k;\n" - " q[0].y = -n.x*p[0].z;\n" - " q[0].z = n.x*p[0].y;\n" - " }\n" - " else {\n" - " // choose p in x-y plane\n" - " float a = n.x*n.x + n.y*n.y;\n" - " float k = 1.f/sqrt(a);\n" - " p[0].x = -n.y*k;\n" - " p[0].y = n.x*k;\n" - " p[0].z = 0;\n" - " // set q = n x p\n" - " q[0].x = -n.z*p[0].y;\n" - " q[0].y = n.z*p[0].x;\n" - " q[0].z = a*k;\n" - " }\n" - "}\n" - " \n" - "void setLinearAndAngular( b3Float4ConstArg n, b3Float4ConstArg r0, b3Float4ConstArg r1, b3Float4* linear, b3Float4* angular0, b3Float4* angular1)\n" - "{\n" - " *linear = b3MakeFloat4(n.x,n.y,n.z,0.f);\n" - " *angular0 = b3Cross3(r0, n);\n" - " *angular1 = -b3Cross3(r1, n);\n" - "}\n" - "float calcRelVel( b3Float4ConstArg l0, b3Float4ConstArg l1, b3Float4ConstArg a0, b3Float4ConstArg a1, b3Float4ConstArg linVel0,\n" - " b3Float4ConstArg angVel0, b3Float4ConstArg linVel1, b3Float4ConstArg angVel1 )\n" - "{\n" - " return b3Dot3F4(l0, linVel0) + b3Dot3F4(a0, angVel0) + b3Dot3F4(l1, linVel1) + b3Dot3F4(a1, angVel1);\n" - "}\n" - "float calcJacCoeff(b3Float4ConstArg linear0, b3Float4ConstArg linear1, b3Float4ConstArg angular0, b3Float4ConstArg angular1,\n" - " float invMass0, const b3Mat3x3* invInertia0, float invMass1, const b3Mat3x3* invInertia1)\n" - "{\n" - " // linear0,1 are normlized\n" - " float jmj0 = invMass0;//b3Dot3F4(linear0, linear0)*invMass0;\n" - " float jmj1 = b3Dot3F4(mtMul3(angular0,*invInertia0), angular0);\n" - " float jmj2 = invMass1;//b3Dot3F4(linear1, linear1)*invMass1;\n" - " float jmj3 = b3Dot3F4(mtMul3(angular1,*invInertia1), angular1);\n" - " return -1.f/(jmj0+jmj1+jmj2+jmj3);\n" - "}\n" - "void setConstraint4( b3Float4ConstArg posA, b3Float4ConstArg linVelA, b3Float4ConstArg angVelA, float invMassA, b3Mat3x3ConstArg invInertiaA,\n" - " b3Float4ConstArg posB, b3Float4ConstArg linVelB, b3Float4ConstArg angVelB, float invMassB, b3Mat3x3ConstArg invInertiaB, \n" - " __global struct b3Contact4Data* src, float dt, float positionDrift, float positionConstraintCoeff,\n" - " b3ContactConstraint4_t* dstC )\n" - "{\n" - " dstC->m_bodyA = abs(src->m_bodyAPtrAndSignBit);\n" - " dstC->m_bodyB = abs(src->m_bodyBPtrAndSignBit);\n" - " float dtInv = 1.f/dt;\n" - " for(int ic=0; ic<4; ic++)\n" - " {\n" - " dstC->m_appliedRambdaDt[ic] = 0.f;\n" - " }\n" - " dstC->m_fJacCoeffInv[0] = dstC->m_fJacCoeffInv[1] = 0.f;\n" - " dstC->m_linear = src->m_worldNormalOnB;\n" - " dstC->m_linear.w = 0.7f ;//src->getFrictionCoeff() );\n" - " for(int ic=0; ic<4; ic++)\n" - " {\n" - " b3Float4 r0 = src->m_worldPosB[ic] - posA;\n" - " b3Float4 r1 = src->m_worldPosB[ic] - posB;\n" - " if( ic >= src->m_worldNormalOnB.w )//npoints\n" - " {\n" - " dstC->m_jacCoeffInv[ic] = 0.f;\n" - " continue;\n" - " }\n" - " float relVelN;\n" - " {\n" - " b3Float4 linear, angular0, angular1;\n" - " setLinearAndAngular(src->m_worldNormalOnB, r0, r1, &linear, &angular0, &angular1);\n" - " dstC->m_jacCoeffInv[ic] = calcJacCoeff(linear, -linear, angular0, angular1,\n" - " invMassA, &invInertiaA, invMassB, &invInertiaB );\n" - " relVelN = calcRelVel(linear, -linear, angular0, angular1,\n" - " linVelA, angVelA, linVelB, angVelB);\n" - " float e = 0.f;//src->getRestituitionCoeff();\n" - " if( relVelN*relVelN < 0.004f ) e = 0.f;\n" - " dstC->m_b[ic] = e*relVelN;\n" - " //float penetration = src->m_worldPosB[ic].w;\n" - " dstC->m_b[ic] += (src->m_worldPosB[ic].w + positionDrift)*positionConstraintCoeff*dtInv;\n" - " dstC->m_appliedRambdaDt[ic] = 0.f;\n" - " }\n" - " }\n" - " if( src->m_worldNormalOnB.w > 0 )//npoints\n" - " { // prepare friction\n" - " b3Float4 center = b3MakeFloat4(0.f,0.f,0.f,0.f);\n" - " for(int i=0; im_worldNormalOnB.w; i++) \n" - " center += src->m_worldPosB[i];\n" - " center /= (float)src->m_worldNormalOnB.w;\n" - " b3Float4 tangent[2];\n" - " b3PlaneSpace1(src->m_worldNormalOnB,&tangent[0],&tangent[1]);\n" - " \n" - " b3Float4 r[2];\n" - " r[0] = center - posA;\n" - " r[1] = center - posB;\n" - " for(int i=0; i<2; i++)\n" - " {\n" - " b3Float4 linear, angular0, angular1;\n" - " setLinearAndAngular(tangent[i], r[0], r[1], &linear, &angular0, &angular1);\n" - " dstC->m_fJacCoeffInv[i] = calcJacCoeff(linear, -linear, angular0, angular1,\n" - " invMassA, &invInertiaA, invMassB, &invInertiaB );\n" - " dstC->m_fAppliedRambdaDt[i] = 0.f;\n" - " }\n" - " dstC->m_center = center;\n" - " }\n" - " for(int i=0; i<4; i++)\n" - " {\n" - " if( im_worldNormalOnB.w )\n" - " {\n" - " dstC->m_worldPos[i] = src->m_worldPosB[i];\n" - " }\n" - " else\n" - " {\n" - " dstC->m_worldPos[i] = b3MakeFloat4(0.f,0.f,0.f,0.f);\n" - " }\n" - " }\n" - "}\n" - "#pragma OPENCL EXTENSION cl_amd_printf : enable\n" - "#pragma OPENCL EXTENSION cl_khr_local_int32_base_atomics : enable\n" - "#pragma OPENCL EXTENSION cl_khr_global_int32_base_atomics : enable\n" - "#pragma OPENCL EXTENSION cl_khr_local_int32_extended_atomics : enable\n" - "#pragma OPENCL EXTENSION cl_khr_global_int32_extended_atomics : enable\n" - "#ifdef cl_ext_atomic_counters_32\n" - "#pragma OPENCL EXTENSION cl_ext_atomic_counters_32 : enable\n" - "#else\n" - "#define counter32_t volatile global int*\n" - "#endif\n" - "typedef unsigned int u32;\n" - "typedef unsigned short u16;\n" - "typedef unsigned char u8;\n" - "#define GET_GROUP_IDX get_group_id(0)\n" - "#define GET_LOCAL_IDX get_local_id(0)\n" - "#define GET_GLOBAL_IDX get_global_id(0)\n" - "#define GET_GROUP_SIZE get_local_size(0)\n" - "#define GET_NUM_GROUPS get_num_groups(0)\n" - "#define GROUP_LDS_BARRIER barrier(CLK_LOCAL_MEM_FENCE)\n" - "#define GROUP_MEM_FENCE mem_fence(CLK_LOCAL_MEM_FENCE)\n" - "#define AtomInc(x) atom_inc(&(x))\n" - "#define AtomInc1(x, out) out = atom_inc(&(x))\n" - "#define AppendInc(x, out) out = atomic_inc(x)\n" - "#define AtomAdd(x, value) atom_add(&(x), value)\n" - "#define AtomCmpxhg(x, cmp, value) atom_cmpxchg( &(x), cmp, value )\n" - "#define AtomXhg(x, value) atom_xchg ( &(x), value )\n" - "#define SELECT_UINT4( b, a, condition ) select( b,a,condition )\n" - "#define make_float4 (float4)\n" - "#define make_float2 (float2)\n" - "#define make_uint4 (uint4)\n" - "#define make_int4 (int4)\n" - "#define make_uint2 (uint2)\n" - "#define make_int2 (int2)\n" - "#define max2 max\n" - "#define min2 min\n" - "///////////////////////////////////////\n" - "// Vector\n" - "///////////////////////////////////////\n" - "__inline\n" - "float fastDiv(float numerator, float denominator)\n" - "{\n" - " return native_divide(numerator, denominator); \n" - "// return numerator/denominator; \n" - "}\n" - "__inline\n" - "float4 fastDiv4(float4 numerator, float4 denominator)\n" - "{\n" - " return native_divide(numerator, denominator); \n" - "}\n" - "__inline\n" - "float fastSqrtf(float f2)\n" - "{\n" - " return native_sqrt(f2);\n" - "// return sqrt(f2);\n" - "}\n" - "__inline\n" - "float fastRSqrt(float f2)\n" - "{\n" - " return native_rsqrt(f2);\n" - "}\n" - "__inline\n" - "float fastLength4(float4 v)\n" - "{\n" - " return fast_length(v);\n" - "}\n" - "__inline\n" - "float4 fastNormalize4(float4 v)\n" - "{\n" - " return fast_normalize(v);\n" - "}\n" - "__inline\n" - "float sqrtf(float a)\n" - "{\n" - "// return sqrt(a);\n" - " return native_sqrt(a);\n" - "}\n" - "__inline\n" - "float4 cross3(float4 a, float4 b)\n" - "{\n" - " return cross(a,b);\n" - "}\n" - "__inline\n" - "float dot3F4(float4 a, float4 b)\n" - "{\n" - " float4 a1 = make_float4(a.xyz,0.f);\n" - " float4 b1 = make_float4(b.xyz,0.f);\n" - " return dot(a1, b1);\n" - "}\n" - "__inline\n" - "float length3(const float4 a)\n" - "{\n" - " return sqrtf(dot3F4(a,a));\n" - "}\n" - "__inline\n" - "float dot4(const float4 a, const float4 b)\n" - "{\n" - " return dot( a, b );\n" - "}\n" - "// for height\n" - "__inline\n" - "float dot3w1(const float4 point, const float4 eqn)\n" - "{\n" - " return dot3F4(point,eqn) + eqn.w;\n" - "}\n" - "__inline\n" - "float4 normalize3(const float4 a)\n" - "{\n" - " float4 n = make_float4(a.x, a.y, a.z, 0.f);\n" - " return fastNormalize4( n );\n" - "// float length = sqrtf(dot3F4(a, a));\n" - "// return 1.f/length * a;\n" - "}\n" - "__inline\n" - "float4 normalize4(const float4 a)\n" - "{\n" - " float length = sqrtf(dot4(a, a));\n" - " return 1.f/length * a;\n" - "}\n" - "__inline\n" - "float4 createEquation(const float4 a, const float4 b, const float4 c)\n" - "{\n" - " float4 eqn;\n" - " float4 ab = b-a;\n" - " float4 ac = c-a;\n" - " eqn = normalize3( cross3(ab, ac) );\n" - " eqn.w = -dot3F4(eqn,a);\n" - " return eqn;\n" - "}\n" - "#define WG_SIZE 64\n" - "typedef struct\n" - "{\n" - " int m_nConstraints;\n" - " int m_start;\n" - " int m_batchIdx;\n" - " int m_nSplit;\n" - "// int m_paddings[1];\n" - "} ConstBuffer;\n" - "typedef struct\n" - "{\n" - " int m_solveFriction;\n" - " int m_maxBatch; // long batch really kills the performance\n" - " int m_batchIdx;\n" - " int m_nSplit;\n" - "// int m_paddings[1];\n" - "} ConstBufferBatchSolve;\n" - " \n" - "typedef struct \n" - "{\n" - " int m_valInt0;\n" - " int m_valInt1;\n" - " int m_valInt2;\n" - " int m_valInt3;\n" - " float m_val0;\n" - " float m_val1;\n" - " float m_val2;\n" - " float m_val3;\n" - "} SolverDebugInfo;\n" - "typedef struct\n" - "{\n" - " int m_nContacts;\n" - " float m_dt;\n" - " float m_positionDrift;\n" - " float m_positionConstraintCoeff;\n" - "} ConstBufferCTC;\n" - "__kernel\n" - "__attribute__((reqd_work_group_size(WG_SIZE,1,1)))\n" - "void ContactToConstraintKernel(__global struct b3Contact4Data* gContact, __global b3RigidBodyData_t* gBodies, __global b3InertiaData_t* gShapes, __global b3ContactConstraint4_t* gConstraintOut, \n" - "int nContacts,\n" - "float dt,\n" - "float positionDrift,\n" - "float positionConstraintCoeff\n" - ")\n" - "{\n" - " int gIdx = GET_GLOBAL_IDX;\n" - " \n" - " if( gIdx < nContacts )\n" - " {\n" - " int aIdx = abs(gContact[gIdx].m_bodyAPtrAndSignBit);\n" - " int bIdx = abs(gContact[gIdx].m_bodyBPtrAndSignBit);\n" - " float4 posA = gBodies[aIdx].m_pos;\n" - " float4 linVelA = gBodies[aIdx].m_linVel;\n" - " float4 angVelA = gBodies[aIdx].m_angVel;\n" - " float invMassA = gBodies[aIdx].m_invMass;\n" - " b3Mat3x3 invInertiaA = gShapes[aIdx].m_initInvInertia;\n" - " float4 posB = gBodies[bIdx].m_pos;\n" - " float4 linVelB = gBodies[bIdx].m_linVel;\n" - " float4 angVelB = gBodies[bIdx].m_angVel;\n" - " float invMassB = gBodies[bIdx].m_invMass;\n" - " b3Mat3x3 invInertiaB = gShapes[bIdx].m_initInvInertia;\n" - " b3ContactConstraint4_t cs;\n" - " setConstraint4( posA, linVelA, angVelA, invMassA, invInertiaA, posB, linVelB, angVelB, invMassB, invInertiaB,\n" - " &gContact[gIdx], dt, positionDrift, positionConstraintCoeff,\n" - " &cs );\n" - " \n" - " cs.m_batchIdx = gContact[gIdx].m_batchIdx;\n" - " gConstraintOut[gIdx] = cs;\n" - " }\n" - "}\n"; diff --git a/engine/inc/bullet/Bullet3OpenCL/RigidBody/kernels/solverSetup2.h b/engine/inc/bullet/Bullet3OpenCL/RigidBody/kernels/solverSetup2.h deleted file mode 100644 index 1e6e3579..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/RigidBody/kernels/solverSetup2.h +++ /dev/null @@ -1,600 +0,0 @@ -//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project -static const char* solverSetup2CL = - "/*\n" - "Copyright (c) 2012 Advanced Micro Devices, Inc. \n" - "This software is provided 'as-is', without any express or implied warranty.\n" - "In no event will the authors be held liable for any damages arising from the use of this software.\n" - "Permission is granted to anyone to use this software for any purpose, \n" - "including commercial applications, and to alter it and redistribute it freely, \n" - "subject to the following restrictions:\n" - "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.\n" - "2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.\n" - "3. This notice may not be removed or altered from any source distribution.\n" - "*/\n" - "//Originally written by Takahiro Harada\n" - "#ifndef B3_CONTACT4DATA_H\n" - "#define B3_CONTACT4DATA_H\n" - "#ifndef B3_FLOAT4_H\n" - "#define B3_FLOAT4_H\n" - "#ifndef B3_PLATFORM_DEFINITIONS_H\n" - "#define B3_PLATFORM_DEFINITIONS_H\n" - "struct MyTest\n" - "{\n" - " int bla;\n" - "};\n" - "#ifdef __cplusplus\n" - "#else\n" - "//keep B3_LARGE_FLOAT*B3_LARGE_FLOAT < FLT_MAX\n" - "#define B3_LARGE_FLOAT 1e18f\n" - "#define B3_INFINITY 1e18f\n" - "#define b3Assert(a)\n" - "#define b3ConstArray(a) __global const a*\n" - "#define b3AtomicInc atomic_inc\n" - "#define b3AtomicAdd atomic_add\n" - "#define b3Fabs fabs\n" - "#define b3Sqrt native_sqrt\n" - "#define b3Sin native_sin\n" - "#define b3Cos native_cos\n" - "#define B3_STATIC\n" - "#endif\n" - "#endif\n" - "#ifdef __cplusplus\n" - "#else\n" - " typedef float4 b3Float4;\n" - " #define b3Float4ConstArg const b3Float4\n" - " #define b3MakeFloat4 (float4)\n" - " float b3Dot3F4(b3Float4ConstArg v0,b3Float4ConstArg v1)\n" - " {\n" - " float4 a1 = b3MakeFloat4(v0.xyz,0.f);\n" - " float4 b1 = b3MakeFloat4(v1.xyz,0.f);\n" - " return dot(a1, b1);\n" - " }\n" - " b3Float4 b3Cross3(b3Float4ConstArg v0,b3Float4ConstArg v1)\n" - " {\n" - " float4 a1 = b3MakeFloat4(v0.xyz,0.f);\n" - " float4 b1 = b3MakeFloat4(v1.xyz,0.f);\n" - " return cross(a1, b1);\n" - " }\n" - " #define b3MinFloat4 min\n" - " #define b3MaxFloat4 max\n" - " #define b3Normalized(a) normalize(a)\n" - "#endif \n" - " \n" - "inline bool b3IsAlmostZero(b3Float4ConstArg v)\n" - "{\n" - " if(b3Fabs(v.x)>1e-6 || b3Fabs(v.y)>1e-6 || b3Fabs(v.z)>1e-6) \n" - " return false;\n" - " return true;\n" - "}\n" - "inline int b3MaxDot( b3Float4ConstArg vec, __global const b3Float4* vecArray, int vecLen, float* dotOut )\n" - "{\n" - " float maxDot = -B3_INFINITY;\n" - " int i = 0;\n" - " int ptIndex = -1;\n" - " for( i = 0; i < vecLen; i++ )\n" - " {\n" - " float dot = b3Dot3F4(vecArray[i],vec);\n" - " \n" - " if( dot > maxDot )\n" - " {\n" - " maxDot = dot;\n" - " ptIndex = i;\n" - " }\n" - " }\n" - " b3Assert(ptIndex>=0);\n" - " if (ptIndex<0)\n" - " {\n" - " ptIndex = 0;\n" - " }\n" - " *dotOut = maxDot;\n" - " return ptIndex;\n" - "}\n" - "#endif //B3_FLOAT4_H\n" - "typedef struct b3Contact4Data b3Contact4Data_t;\n" - "struct b3Contact4Data\n" - "{\n" - " b3Float4 m_worldPosB[4];\n" - "// b3Float4 m_localPosA[4];\n" - "// b3Float4 m_localPosB[4];\n" - " b3Float4 m_worldNormalOnB; // w: m_nPoints\n" - " unsigned short m_restituitionCoeffCmp;\n" - " unsigned short m_frictionCoeffCmp;\n" - " int m_batchIdx;\n" - " int m_bodyAPtrAndSignBit;//x:m_bodyAPtr, y:m_bodyBPtr\n" - " int m_bodyBPtrAndSignBit;\n" - " int m_childIndexA;\n" - " int m_childIndexB;\n" - " int m_unused1;\n" - " int m_unused2;\n" - "};\n" - "inline int b3Contact4Data_getNumPoints(const struct b3Contact4Data* contact)\n" - "{\n" - " return (int)contact->m_worldNormalOnB.w;\n" - "};\n" - "inline void b3Contact4Data_setNumPoints(struct b3Contact4Data* contact, int numPoints)\n" - "{\n" - " contact->m_worldNormalOnB.w = (float)numPoints;\n" - "};\n" - "#endif //B3_CONTACT4DATA_H\n" - "#pragma OPENCL EXTENSION cl_amd_printf : enable\n" - "#pragma OPENCL EXTENSION cl_khr_local_int32_base_atomics : enable\n" - "#pragma OPENCL EXTENSION cl_khr_global_int32_base_atomics : enable\n" - "#pragma OPENCL EXTENSION cl_khr_local_int32_extended_atomics : enable\n" - "#pragma OPENCL EXTENSION cl_khr_global_int32_extended_atomics : enable\n" - "#ifdef cl_ext_atomic_counters_32\n" - "#pragma OPENCL EXTENSION cl_ext_atomic_counters_32 : enable\n" - "#else\n" - "#define counter32_t volatile global int*\n" - "#endif\n" - "typedef unsigned int u32;\n" - "typedef unsigned short u16;\n" - "typedef unsigned char u8;\n" - "#define GET_GROUP_IDX get_group_id(0)\n" - "#define GET_LOCAL_IDX get_local_id(0)\n" - "#define GET_GLOBAL_IDX get_global_id(0)\n" - "#define GET_GROUP_SIZE get_local_size(0)\n" - "#define GET_NUM_GROUPS get_num_groups(0)\n" - "#define GROUP_LDS_BARRIER barrier(CLK_LOCAL_MEM_FENCE)\n" - "#define GROUP_MEM_FENCE mem_fence(CLK_LOCAL_MEM_FENCE)\n" - "#define AtomInc(x) atom_inc(&(x))\n" - "#define AtomInc1(x, out) out = atom_inc(&(x))\n" - "#define AppendInc(x, out) out = atomic_inc(x)\n" - "#define AtomAdd(x, value) atom_add(&(x), value)\n" - "#define AtomCmpxhg(x, cmp, value) atom_cmpxchg( &(x), cmp, value )\n" - "#define AtomXhg(x, value) atom_xchg ( &(x), value )\n" - "#define SELECT_UINT4( b, a, condition ) select( b,a,condition )\n" - "#define make_float4 (float4)\n" - "#define make_float2 (float2)\n" - "#define make_uint4 (uint4)\n" - "#define make_int4 (int4)\n" - "#define make_uint2 (uint2)\n" - "#define make_int2 (int2)\n" - "#define max2 max\n" - "#define min2 min\n" - "///////////////////////////////////////\n" - "// Vector\n" - "///////////////////////////////////////\n" - "__inline\n" - "float fastDiv(float numerator, float denominator)\n" - "{\n" - " return native_divide(numerator, denominator); \n" - "// return numerator/denominator; \n" - "}\n" - "__inline\n" - "float4 fastDiv4(float4 numerator, float4 denominator)\n" - "{\n" - " return native_divide(numerator, denominator); \n" - "}\n" - "__inline\n" - "float fastSqrtf(float f2)\n" - "{\n" - " return native_sqrt(f2);\n" - "// return sqrt(f2);\n" - "}\n" - "__inline\n" - "float fastRSqrt(float f2)\n" - "{\n" - " return native_rsqrt(f2);\n" - "}\n" - "__inline\n" - "float fastLength4(float4 v)\n" - "{\n" - " return fast_length(v);\n" - "}\n" - "__inline\n" - "float4 fastNormalize4(float4 v)\n" - "{\n" - " return fast_normalize(v);\n" - "}\n" - "__inline\n" - "float sqrtf(float a)\n" - "{\n" - "// return sqrt(a);\n" - " return native_sqrt(a);\n" - "}\n" - "__inline\n" - "float4 cross3(float4 a, float4 b)\n" - "{\n" - " return cross(a,b);\n" - "}\n" - "__inline\n" - "float dot3F4(float4 a, float4 b)\n" - "{\n" - " float4 a1 = make_float4(a.xyz,0.f);\n" - " float4 b1 = make_float4(b.xyz,0.f);\n" - " return dot(a1, b1);\n" - "}\n" - "__inline\n" - "float length3(const float4 a)\n" - "{\n" - " return sqrtf(dot3F4(a,a));\n" - "}\n" - "__inline\n" - "float dot4(const float4 a, const float4 b)\n" - "{\n" - " return dot( a, b );\n" - "}\n" - "// for height\n" - "__inline\n" - "float dot3w1(const float4 point, const float4 eqn)\n" - "{\n" - " return dot3F4(point,eqn) + eqn.w;\n" - "}\n" - "__inline\n" - "float4 normalize3(const float4 a)\n" - "{\n" - " float4 n = make_float4(a.x, a.y, a.z, 0.f);\n" - " return fastNormalize4( n );\n" - "// float length = sqrtf(dot3F4(a, a));\n" - "// return 1.f/length * a;\n" - "}\n" - "__inline\n" - "float4 normalize4(const float4 a)\n" - "{\n" - " float length = sqrtf(dot4(a, a));\n" - " return 1.f/length * a;\n" - "}\n" - "__inline\n" - "float4 createEquation(const float4 a, const float4 b, const float4 c)\n" - "{\n" - " float4 eqn;\n" - " float4 ab = b-a;\n" - " float4 ac = c-a;\n" - " eqn = normalize3( cross3(ab, ac) );\n" - " eqn.w = -dot3F4(eqn,a);\n" - " return eqn;\n" - "}\n" - "///////////////////////////////////////\n" - "// Matrix3x3\n" - "///////////////////////////////////////\n" - "typedef struct\n" - "{\n" - " float4 m_row[3];\n" - "}Matrix3x3;\n" - "__inline\n" - "Matrix3x3 mtZero();\n" - "__inline\n" - "Matrix3x3 mtIdentity();\n" - "__inline\n" - "Matrix3x3 mtTranspose(Matrix3x3 m);\n" - "__inline\n" - "Matrix3x3 mtMul(Matrix3x3 a, Matrix3x3 b);\n" - "__inline\n" - "float4 mtMul1(Matrix3x3 a, float4 b);\n" - "__inline\n" - "float4 mtMul3(float4 a, Matrix3x3 b);\n" - "__inline\n" - "Matrix3x3 mtZero()\n" - "{\n" - " Matrix3x3 m;\n" - " m.m_row[0] = (float4)(0.f);\n" - " m.m_row[1] = (float4)(0.f);\n" - " m.m_row[2] = (float4)(0.f);\n" - " return m;\n" - "}\n" - "__inline\n" - "Matrix3x3 mtIdentity()\n" - "{\n" - " Matrix3x3 m;\n" - " m.m_row[0] = (float4)(1,0,0,0);\n" - " m.m_row[1] = (float4)(0,1,0,0);\n" - " m.m_row[2] = (float4)(0,0,1,0);\n" - " return m;\n" - "}\n" - "__inline\n" - "Matrix3x3 mtTranspose(Matrix3x3 m)\n" - "{\n" - " Matrix3x3 out;\n" - " out.m_row[0] = (float4)(m.m_row[0].x, m.m_row[1].x, m.m_row[2].x, 0.f);\n" - " out.m_row[1] = (float4)(m.m_row[0].y, m.m_row[1].y, m.m_row[2].y, 0.f);\n" - " out.m_row[2] = (float4)(m.m_row[0].z, m.m_row[1].z, m.m_row[2].z, 0.f);\n" - " return out;\n" - "}\n" - "__inline\n" - "Matrix3x3 mtMul(Matrix3x3 a, Matrix3x3 b)\n" - "{\n" - " Matrix3x3 transB;\n" - " transB = mtTranspose( b );\n" - " Matrix3x3 ans;\n" - " // why this doesn't run when 0ing in the for{}\n" - " a.m_row[0].w = 0.f;\n" - " a.m_row[1].w = 0.f;\n" - " a.m_row[2].w = 0.f;\n" - " for(int i=0; i<3; i++)\n" - " {\n" - "// a.m_row[i].w = 0.f;\n" - " ans.m_row[i].x = dot3F4(a.m_row[i],transB.m_row[0]);\n" - " ans.m_row[i].y = dot3F4(a.m_row[i],transB.m_row[1]);\n" - " ans.m_row[i].z = dot3F4(a.m_row[i],transB.m_row[2]);\n" - " ans.m_row[i].w = 0.f;\n" - " }\n" - " return ans;\n" - "}\n" - "__inline\n" - "float4 mtMul1(Matrix3x3 a, float4 b)\n" - "{\n" - " float4 ans;\n" - " ans.x = dot3F4( a.m_row[0], b );\n" - " ans.y = dot3F4( a.m_row[1], b );\n" - " ans.z = dot3F4( a.m_row[2], b );\n" - " ans.w = 0.f;\n" - " return ans;\n" - "}\n" - "__inline\n" - "float4 mtMul3(float4 a, Matrix3x3 b)\n" - "{\n" - " float4 colx = make_float4(b.m_row[0].x, b.m_row[1].x, b.m_row[2].x, 0);\n" - " float4 coly = make_float4(b.m_row[0].y, b.m_row[1].y, b.m_row[2].y, 0);\n" - " float4 colz = make_float4(b.m_row[0].z, b.m_row[1].z, b.m_row[2].z, 0);\n" - " float4 ans;\n" - " ans.x = dot3F4( a, colx );\n" - " ans.y = dot3F4( a, coly );\n" - " ans.z = dot3F4( a, colz );\n" - " return ans;\n" - "}\n" - "///////////////////////////////////////\n" - "// Quaternion\n" - "///////////////////////////////////////\n" - "typedef float4 Quaternion;\n" - "__inline\n" - "Quaternion qtMul(Quaternion a, Quaternion b);\n" - "__inline\n" - "Quaternion qtNormalize(Quaternion in);\n" - "__inline\n" - "float4 qtRotate(Quaternion q, float4 vec);\n" - "__inline\n" - "Quaternion qtInvert(Quaternion q);\n" - "__inline\n" - "Quaternion qtMul(Quaternion a, Quaternion b)\n" - "{\n" - " Quaternion ans;\n" - " ans = cross3( a, b );\n" - " ans += a.w*b+b.w*a;\n" - "// ans.w = a.w*b.w - (a.x*b.x+a.y*b.y+a.z*b.z);\n" - " ans.w = a.w*b.w - dot3F4(a, b);\n" - " return ans;\n" - "}\n" - "__inline\n" - "Quaternion qtNormalize(Quaternion in)\n" - "{\n" - " return fastNormalize4(in);\n" - "// in /= length( in );\n" - "// return in;\n" - "}\n" - "__inline\n" - "float4 qtRotate(Quaternion q, float4 vec)\n" - "{\n" - " Quaternion qInv = qtInvert( q );\n" - " float4 vcpy = vec;\n" - " vcpy.w = 0.f;\n" - " float4 out = qtMul(qtMul(q,vcpy),qInv);\n" - " return out;\n" - "}\n" - "__inline\n" - "Quaternion qtInvert(Quaternion q)\n" - "{\n" - " return (Quaternion)(-q.xyz, q.w);\n" - "}\n" - "__inline\n" - "float4 qtInvRotate(const Quaternion q, float4 vec)\n" - "{\n" - " return qtRotate( qtInvert( q ), vec );\n" - "}\n" - "#define WG_SIZE 64\n" - "typedef struct\n" - "{\n" - " float4 m_pos;\n" - " Quaternion m_quat;\n" - " float4 m_linVel;\n" - " float4 m_angVel;\n" - " u32 m_shapeIdx;\n" - " float m_invMass;\n" - " float m_restituitionCoeff;\n" - " float m_frictionCoeff;\n" - "} Body;\n" - "typedef struct\n" - "{\n" - " Matrix3x3 m_invInertia;\n" - " Matrix3x3 m_initInvInertia;\n" - "} Shape;\n" - "typedef struct\n" - "{\n" - " float4 m_linear;\n" - " float4 m_worldPos[4];\n" - " float4 m_center; \n" - " float m_jacCoeffInv[4];\n" - " float m_b[4];\n" - " float m_appliedRambdaDt[4];\n" - " float m_fJacCoeffInv[2]; \n" - " float m_fAppliedRambdaDt[2]; \n" - " u32 m_bodyA;\n" - " u32 m_bodyB;\n" - " int m_batchIdx;\n" - " u32 m_paddings[1];\n" - "} Constraint4;\n" - "typedef struct\n" - "{\n" - " int m_nConstraints;\n" - " int m_start;\n" - " int m_batchIdx;\n" - " int m_nSplit;\n" - "// int m_paddings[1];\n" - "} ConstBuffer;\n" - "typedef struct\n" - "{\n" - " int m_solveFriction;\n" - " int m_maxBatch; // long batch really kills the performance\n" - " int m_batchIdx;\n" - " int m_nSplit;\n" - "// int m_paddings[1];\n" - "} ConstBufferBatchSolve;\n" - " \n" - "typedef struct \n" - "{\n" - " int m_valInt0;\n" - " int m_valInt1;\n" - " int m_valInt2;\n" - " int m_valInt3;\n" - " float m_val0;\n" - " float m_val1;\n" - " float m_val2;\n" - " float m_val3;\n" - "} SolverDebugInfo;\n" - "// others\n" - "__kernel\n" - "__attribute__((reqd_work_group_size(WG_SIZE,1,1)))\n" - "void ReorderContactKernel(__global struct b3Contact4Data* in, __global struct b3Contact4Data* out, __global int2* sortData, int4 cb )\n" - "{\n" - " int nContacts = cb.x;\n" - " int gIdx = GET_GLOBAL_IDX;\n" - " if( gIdx < nContacts )\n" - " {\n" - " int srcIdx = sortData[gIdx].y;\n" - " out[gIdx] = in[srcIdx];\n" - " }\n" - "}\n" - "__kernel __attribute__((reqd_work_group_size(WG_SIZE,1,1)))\n" - "void SetDeterminismSortDataChildShapeB(__global struct b3Contact4Data* contactsIn, __global int2* sortDataOut, int nContacts)\n" - "{\n" - " int gIdx = GET_GLOBAL_IDX;\n" - " if( gIdx < nContacts )\n" - " {\n" - " int2 sd;\n" - " sd.x = contactsIn[gIdx].m_childIndexB;\n" - " sd.y = gIdx;\n" - " sortDataOut[gIdx] = sd;\n" - " }\n" - "}\n" - "__kernel __attribute__((reqd_work_group_size(WG_SIZE,1,1)))\n" - "void SetDeterminismSortDataChildShapeA(__global struct b3Contact4Data* contactsIn, __global int2* sortDataInOut, int nContacts)\n" - "{\n" - " int gIdx = GET_GLOBAL_IDX;\n" - " if( gIdx < nContacts )\n" - " {\n" - " int2 sdIn;\n" - " sdIn = sortDataInOut[gIdx];\n" - " int2 sdOut;\n" - " sdOut.x = contactsIn[sdIn.y].m_childIndexA;\n" - " sdOut.y = sdIn.y;\n" - " sortDataInOut[gIdx] = sdOut;\n" - " }\n" - "}\n" - "__kernel __attribute__((reqd_work_group_size(WG_SIZE,1,1)))\n" - "void SetDeterminismSortDataBodyA(__global struct b3Contact4Data* contactsIn, __global int2* sortDataInOut, int nContacts)\n" - "{\n" - " int gIdx = GET_GLOBAL_IDX;\n" - " if( gIdx < nContacts )\n" - " {\n" - " int2 sdIn;\n" - " sdIn = sortDataInOut[gIdx];\n" - " int2 sdOut;\n" - " sdOut.x = contactsIn[sdIn.y].m_bodyAPtrAndSignBit;\n" - " sdOut.y = sdIn.y;\n" - " sortDataInOut[gIdx] = sdOut;\n" - " }\n" - "}\n" - "__kernel\n" - "__attribute__((reqd_work_group_size(WG_SIZE,1,1)))\n" - "void SetDeterminismSortDataBodyB(__global struct b3Contact4Data* contactsIn, __global int2* sortDataInOut, int nContacts)\n" - "{\n" - " int gIdx = GET_GLOBAL_IDX;\n" - " if( gIdx < nContacts )\n" - " {\n" - " int2 sdIn;\n" - " sdIn = sortDataInOut[gIdx];\n" - " int2 sdOut;\n" - " sdOut.x = contactsIn[sdIn.y].m_bodyBPtrAndSignBit;\n" - " sdOut.y = sdIn.y;\n" - " sortDataInOut[gIdx] = sdOut;\n" - " }\n" - "}\n" - "typedef struct\n" - "{\n" - " int m_nContacts;\n" - " int m_staticIdx;\n" - " float m_scale;\n" - " int m_nSplit;\n" - "} ConstBufferSSD;\n" - "__constant const int gridTable4x4[] = \n" - "{\n" - " 0,1,17,16,\n" - " 1,2,18,19,\n" - " 17,18,32,3,\n" - " 16,19,3,34\n" - "};\n" - "__constant const int gridTable8x8[] = \n" - "{\n" - " 0, 2, 3, 16, 17, 18, 19, 1,\n" - " 66, 64, 80, 67, 82, 81, 65, 83,\n" - " 131,144,128,130,147,129,145,146,\n" - " 208,195,194,192,193,211,210,209,\n" - " 21, 22, 23, 5, 4, 6, 7, 20,\n" - " 86, 85, 69, 87, 70, 68, 84, 71,\n" - " 151,133,149,150,135,148,132,134,\n" - " 197,27,214,213,212,199,198,196\n" - " \n" - "};\n" - "#define USE_SPATIAL_BATCHING 1\n" - "#define USE_4x4_GRID 1\n" - "__kernel\n" - "__attribute__((reqd_work_group_size(WG_SIZE,1,1)))\n" - "void SetSortDataKernel(__global struct b3Contact4Data* gContact, __global Body* gBodies, __global int2* gSortDataOut, \n" - "int nContacts,float scale,int4 nSplit,int staticIdx)\n" - "{\n" - " int gIdx = GET_GLOBAL_IDX;\n" - " \n" - " if( gIdx < nContacts )\n" - " {\n" - " int aPtrAndSignBit = gContact[gIdx].m_bodyAPtrAndSignBit;\n" - " int bPtrAndSignBit = gContact[gIdx].m_bodyBPtrAndSignBit;\n" - " int aIdx = abs(aPtrAndSignBit );\n" - " int bIdx = abs(bPtrAndSignBit);\n" - " bool aStatic = (aPtrAndSignBit<0) ||(aPtrAndSignBit==staticIdx);\n" - " bool bStatic = (bPtrAndSignBit<0) ||(bPtrAndSignBit==staticIdx);\n" - "#if USE_SPATIAL_BATCHING \n" - " int idx = (aStatic)? bIdx: aIdx;\n" - " float4 p = gBodies[idx].m_pos;\n" - " int xIdx = (int)((p.x-((p.x<0.f)?1.f:0.f))*scale) & (nSplit.x-1);\n" - " int yIdx = (int)((p.y-((p.y<0.f)?1.f:0.f))*scale) & (nSplit.y-1);\n" - " int zIdx = (int)((p.z-((p.z<0.f)?1.f:0.f))*scale) & (nSplit.z-1);\n" - " int newIndex = (xIdx+yIdx*nSplit.x+zIdx*nSplit.x*nSplit.y);\n" - " \n" - "#else//USE_SPATIAL_BATCHING\n" - " #if USE_4x4_GRID\n" - " int aa = aIdx&3;\n" - " int bb = bIdx&3;\n" - " if (aStatic)\n" - " aa = bb;\n" - " if (bStatic)\n" - " bb = aa;\n" - " int gridIndex = aa + bb*4;\n" - " int newIndex = gridTable4x4[gridIndex];\n" - " #else//USE_4x4_GRID\n" - " int aa = aIdx&7;\n" - " int bb = bIdx&7;\n" - " if (aStatic)\n" - " aa = bb;\n" - " if (bStatic)\n" - " bb = aa;\n" - " int gridIndex = aa + bb*8;\n" - " int newIndex = gridTable8x8[gridIndex];\n" - " #endif//USE_4x4_GRID\n" - "#endif//USE_SPATIAL_BATCHING\n" - " gSortDataOut[gIdx].x = newIndex;\n" - " gSortDataOut[gIdx].y = gIdx;\n" - " }\n" - " else\n" - " {\n" - " gSortDataOut[gIdx].x = 0xffffffff;\n" - " }\n" - "}\n" - "__kernel\n" - "__attribute__((reqd_work_group_size(WG_SIZE,1,1)))\n" - "void CopyConstraintKernel(__global struct b3Contact4Data* gIn, __global struct b3Contact4Data* gOut, int4 cb )\n" - "{\n" - " int gIdx = GET_GLOBAL_IDX;\n" - " if( gIdx < cb.x )\n" - " {\n" - " gOut[gIdx] = gIn[gIdx];\n" - " }\n" - "}\n"; diff --git a/engine/inc/bullet/Bullet3OpenCL/RigidBody/kernels/solverUtils.h b/engine/inc/bullet/Bullet3OpenCL/RigidBody/kernels/solverUtils.h deleted file mode 100644 index f4d98d99..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/RigidBody/kernels/solverUtils.h +++ /dev/null @@ -1,908 +0,0 @@ -//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project -static const char* solverUtilsCL = - "/*\n" - "Copyright (c) 2013 Advanced Micro Devices, Inc. \n" - "This software is provided 'as-is', without any express or implied warranty.\n" - "In no event will the authors be held liable for any damages arising from the use of this software.\n" - "Permission is granted to anyone to use this software for any purpose, \n" - "including commercial applications, and to alter it and redistribute it freely, \n" - "subject to the following restrictions:\n" - "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.\n" - "2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.\n" - "3. This notice may not be removed or altered from any source distribution.\n" - "*/\n" - "//Originally written by Erwin Coumans\n" - "#ifndef B3_CONTACT4DATA_H\n" - "#define B3_CONTACT4DATA_H\n" - "#ifndef B3_FLOAT4_H\n" - "#define B3_FLOAT4_H\n" - "#ifndef B3_PLATFORM_DEFINITIONS_H\n" - "#define B3_PLATFORM_DEFINITIONS_H\n" - "struct MyTest\n" - "{\n" - " int bla;\n" - "};\n" - "#ifdef __cplusplus\n" - "#else\n" - "//keep B3_LARGE_FLOAT*B3_LARGE_FLOAT < FLT_MAX\n" - "#define B3_LARGE_FLOAT 1e18f\n" - "#define B3_INFINITY 1e18f\n" - "#define b3Assert(a)\n" - "#define b3ConstArray(a) __global const a*\n" - "#define b3AtomicInc atomic_inc\n" - "#define b3AtomicAdd atomic_add\n" - "#define b3Fabs fabs\n" - "#define b3Sqrt native_sqrt\n" - "#define b3Sin native_sin\n" - "#define b3Cos native_cos\n" - "#define B3_STATIC\n" - "#endif\n" - "#endif\n" - "#ifdef __cplusplus\n" - "#else\n" - " typedef float4 b3Float4;\n" - " #define b3Float4ConstArg const b3Float4\n" - " #define b3MakeFloat4 (float4)\n" - " float b3Dot3F4(b3Float4ConstArg v0,b3Float4ConstArg v1)\n" - " {\n" - " float4 a1 = b3MakeFloat4(v0.xyz,0.f);\n" - " float4 b1 = b3MakeFloat4(v1.xyz,0.f);\n" - " return dot(a1, b1);\n" - " }\n" - " b3Float4 b3Cross3(b3Float4ConstArg v0,b3Float4ConstArg v1)\n" - " {\n" - " float4 a1 = b3MakeFloat4(v0.xyz,0.f);\n" - " float4 b1 = b3MakeFloat4(v1.xyz,0.f);\n" - " return cross(a1, b1);\n" - " }\n" - " #define b3MinFloat4 min\n" - " #define b3MaxFloat4 max\n" - " #define b3Normalized(a) normalize(a)\n" - "#endif \n" - " \n" - "inline bool b3IsAlmostZero(b3Float4ConstArg v)\n" - "{\n" - " if(b3Fabs(v.x)>1e-6 || b3Fabs(v.y)>1e-6 || b3Fabs(v.z)>1e-6) \n" - " return false;\n" - " return true;\n" - "}\n" - "inline int b3MaxDot( b3Float4ConstArg vec, __global const b3Float4* vecArray, int vecLen, float* dotOut )\n" - "{\n" - " float maxDot = -B3_INFINITY;\n" - " int i = 0;\n" - " int ptIndex = -1;\n" - " for( i = 0; i < vecLen; i++ )\n" - " {\n" - " float dot = b3Dot3F4(vecArray[i],vec);\n" - " \n" - " if( dot > maxDot )\n" - " {\n" - " maxDot = dot;\n" - " ptIndex = i;\n" - " }\n" - " }\n" - " b3Assert(ptIndex>=0);\n" - " if (ptIndex<0)\n" - " {\n" - " ptIndex = 0;\n" - " }\n" - " *dotOut = maxDot;\n" - " return ptIndex;\n" - "}\n" - "#endif //B3_FLOAT4_H\n" - "typedef struct b3Contact4Data b3Contact4Data_t;\n" - "struct b3Contact4Data\n" - "{\n" - " b3Float4 m_worldPosB[4];\n" - "// b3Float4 m_localPosA[4];\n" - "// b3Float4 m_localPosB[4];\n" - " b3Float4 m_worldNormalOnB; // w: m_nPoints\n" - " unsigned short m_restituitionCoeffCmp;\n" - " unsigned short m_frictionCoeffCmp;\n" - " int m_batchIdx;\n" - " int m_bodyAPtrAndSignBit;//x:m_bodyAPtr, y:m_bodyBPtr\n" - " int m_bodyBPtrAndSignBit;\n" - " int m_childIndexA;\n" - " int m_childIndexB;\n" - " int m_unused1;\n" - " int m_unused2;\n" - "};\n" - "inline int b3Contact4Data_getNumPoints(const struct b3Contact4Data* contact)\n" - "{\n" - " return (int)contact->m_worldNormalOnB.w;\n" - "};\n" - "inline void b3Contact4Data_setNumPoints(struct b3Contact4Data* contact, int numPoints)\n" - "{\n" - " contact->m_worldNormalOnB.w = (float)numPoints;\n" - "};\n" - "#endif //B3_CONTACT4DATA_H\n" - "#pragma OPENCL EXTENSION cl_amd_printf : enable\n" - "#pragma OPENCL EXTENSION cl_khr_local_int32_base_atomics : enable\n" - "#pragma OPENCL EXTENSION cl_khr_global_int32_base_atomics : enable\n" - "#pragma OPENCL EXTENSION cl_khr_local_int32_extended_atomics : enable\n" - "#pragma OPENCL EXTENSION cl_khr_global_int32_extended_atomics : enable\n" - "#ifdef cl_ext_atomic_counters_32\n" - "#pragma OPENCL EXTENSION cl_ext_atomic_counters_32 : enable\n" - "#else\n" - "#define counter32_t volatile global int*\n" - "#endif\n" - "typedef unsigned int u32;\n" - "typedef unsigned short u16;\n" - "typedef unsigned char u8;\n" - "#define GET_GROUP_IDX get_group_id(0)\n" - "#define GET_LOCAL_IDX get_local_id(0)\n" - "#define GET_GLOBAL_IDX get_global_id(0)\n" - "#define GET_GROUP_SIZE get_local_size(0)\n" - "#define GET_NUM_GROUPS get_num_groups(0)\n" - "#define GROUP_LDS_BARRIER barrier(CLK_LOCAL_MEM_FENCE)\n" - "#define GROUP_MEM_FENCE mem_fence(CLK_LOCAL_MEM_FENCE)\n" - "#define AtomInc(x) atom_inc(&(x))\n" - "#define AtomInc1(x, out) out = atom_inc(&(x))\n" - "#define AppendInc(x, out) out = atomic_inc(x)\n" - "#define AtomAdd(x, value) atom_add(&(x), value)\n" - "#define AtomCmpxhg(x, cmp, value) atom_cmpxchg( &(x), cmp, value )\n" - "#define AtomXhg(x, value) atom_xchg ( &(x), value )\n" - "#define SELECT_UINT4( b, a, condition ) select( b,a,condition )\n" - "#define make_float4 (float4)\n" - "#define make_float2 (float2)\n" - "#define make_uint4 (uint4)\n" - "#define make_int4 (int4)\n" - "#define make_uint2 (uint2)\n" - "#define make_int2 (int2)\n" - "#define max2 max\n" - "#define min2 min\n" - "///////////////////////////////////////\n" - "// Vector\n" - "///////////////////////////////////////\n" - "__inline\n" - "float fastDiv(float numerator, float denominator)\n" - "{\n" - " return native_divide(numerator, denominator); \n" - "// return numerator/denominator; \n" - "}\n" - "__inline\n" - "float4 fastDiv4(float4 numerator, float4 denominator)\n" - "{\n" - " return native_divide(numerator, denominator); \n" - "}\n" - "__inline\n" - "float fastSqrtf(float f2)\n" - "{\n" - " return native_sqrt(f2);\n" - "// return sqrt(f2);\n" - "}\n" - "__inline\n" - "float fastRSqrt(float f2)\n" - "{\n" - " return native_rsqrt(f2);\n" - "}\n" - "__inline\n" - "float fastLength4(float4 v)\n" - "{\n" - " return fast_length(v);\n" - "}\n" - "__inline\n" - "float4 fastNormalize4(float4 v)\n" - "{\n" - " return fast_normalize(v);\n" - "}\n" - "__inline\n" - "float sqrtf(float a)\n" - "{\n" - "// return sqrt(a);\n" - " return native_sqrt(a);\n" - "}\n" - "__inline\n" - "float4 cross3(float4 a1, float4 b1)\n" - "{\n" - " float4 a=make_float4(a1.xyz,0.f);\n" - " float4 b=make_float4(b1.xyz,0.f);\n" - " //float4 a=a1;\n" - " //float4 b=b1;\n" - " return cross(a,b);\n" - "}\n" - "__inline\n" - "float dot3F4(float4 a, float4 b)\n" - "{\n" - " float4 a1 = make_float4(a.xyz,0.f);\n" - " float4 b1 = make_float4(b.xyz,0.f);\n" - " return dot(a1, b1);\n" - "}\n" - "__inline\n" - "float length3(const float4 a)\n" - "{\n" - " return sqrtf(dot3F4(a,a));\n" - "}\n" - "__inline\n" - "float dot4(const float4 a, const float4 b)\n" - "{\n" - " return dot( a, b );\n" - "}\n" - "// for height\n" - "__inline\n" - "float dot3w1(const float4 point, const float4 eqn)\n" - "{\n" - " return dot3F4(point,eqn) + eqn.w;\n" - "}\n" - "__inline\n" - "float4 normalize3(const float4 a)\n" - "{\n" - " float4 n = make_float4(a.x, a.y, a.z, 0.f);\n" - " return fastNormalize4( n );\n" - "// float length = sqrtf(dot3F4(a, a));\n" - "// return 1.f/length * a;\n" - "}\n" - "__inline\n" - "float4 normalize4(const float4 a)\n" - "{\n" - " float length = sqrtf(dot4(a, a));\n" - " return 1.f/length * a;\n" - "}\n" - "__inline\n" - "float4 createEquation(const float4 a, const float4 b, const float4 c)\n" - "{\n" - " float4 eqn;\n" - " float4 ab = b-a;\n" - " float4 ac = c-a;\n" - " eqn = normalize3( cross3(ab, ac) );\n" - " eqn.w = -dot3F4(eqn,a);\n" - " return eqn;\n" - "}\n" - "///////////////////////////////////////\n" - "// Matrix3x3\n" - "///////////////////////////////////////\n" - "typedef struct\n" - "{\n" - " float4 m_row[3];\n" - "}Matrix3x3;\n" - "__inline\n" - "Matrix3x3 mtZero();\n" - "__inline\n" - "Matrix3x3 mtIdentity();\n" - "__inline\n" - "Matrix3x3 mtTranspose(Matrix3x3 m);\n" - "__inline\n" - "Matrix3x3 mtMul(Matrix3x3 a, Matrix3x3 b);\n" - "__inline\n" - "float4 mtMul1(Matrix3x3 a, float4 b);\n" - "__inline\n" - "float4 mtMul3(float4 a, Matrix3x3 b);\n" - "__inline\n" - "Matrix3x3 mtZero()\n" - "{\n" - " Matrix3x3 m;\n" - " m.m_row[0] = (float4)(0.f);\n" - " m.m_row[1] = (float4)(0.f);\n" - " m.m_row[2] = (float4)(0.f);\n" - " return m;\n" - "}\n" - "__inline\n" - "Matrix3x3 mtIdentity()\n" - "{\n" - " Matrix3x3 m;\n" - " m.m_row[0] = (float4)(1,0,0,0);\n" - " m.m_row[1] = (float4)(0,1,0,0);\n" - " m.m_row[2] = (float4)(0,0,1,0);\n" - " return m;\n" - "}\n" - "__inline\n" - "Matrix3x3 mtTranspose(Matrix3x3 m)\n" - "{\n" - " Matrix3x3 out;\n" - " out.m_row[0] = (float4)(m.m_row[0].x, m.m_row[1].x, m.m_row[2].x, 0.f);\n" - " out.m_row[1] = (float4)(m.m_row[0].y, m.m_row[1].y, m.m_row[2].y, 0.f);\n" - " out.m_row[2] = (float4)(m.m_row[0].z, m.m_row[1].z, m.m_row[2].z, 0.f);\n" - " return out;\n" - "}\n" - "__inline\n" - "Matrix3x3 mtMul(Matrix3x3 a, Matrix3x3 b)\n" - "{\n" - " Matrix3x3 transB;\n" - " transB = mtTranspose( b );\n" - " Matrix3x3 ans;\n" - " // why this doesn't run when 0ing in the for{}\n" - " a.m_row[0].w = 0.f;\n" - " a.m_row[1].w = 0.f;\n" - " a.m_row[2].w = 0.f;\n" - " for(int i=0; i<3; i++)\n" - " {\n" - "// a.m_row[i].w = 0.f;\n" - " ans.m_row[i].x = dot3F4(a.m_row[i],transB.m_row[0]);\n" - " ans.m_row[i].y = dot3F4(a.m_row[i],transB.m_row[1]);\n" - " ans.m_row[i].z = dot3F4(a.m_row[i],transB.m_row[2]);\n" - " ans.m_row[i].w = 0.f;\n" - " }\n" - " return ans;\n" - "}\n" - "__inline\n" - "float4 mtMul1(Matrix3x3 a, float4 b)\n" - "{\n" - " float4 ans;\n" - " ans.x = dot3F4( a.m_row[0], b );\n" - " ans.y = dot3F4( a.m_row[1], b );\n" - " ans.z = dot3F4( a.m_row[2], b );\n" - " ans.w = 0.f;\n" - " return ans;\n" - "}\n" - "__inline\n" - "float4 mtMul3(float4 a, Matrix3x3 b)\n" - "{\n" - " float4 colx = make_float4(b.m_row[0].x, b.m_row[1].x, b.m_row[2].x, 0);\n" - " float4 coly = make_float4(b.m_row[0].y, b.m_row[1].y, b.m_row[2].y, 0);\n" - " float4 colz = make_float4(b.m_row[0].z, b.m_row[1].z, b.m_row[2].z, 0);\n" - " float4 ans;\n" - " ans.x = dot3F4( a, colx );\n" - " ans.y = dot3F4( a, coly );\n" - " ans.z = dot3F4( a, colz );\n" - " return ans;\n" - "}\n" - "///////////////////////////////////////\n" - "// Quaternion\n" - "///////////////////////////////////////\n" - "typedef float4 Quaternion;\n" - "__inline\n" - "Quaternion qtMul(Quaternion a, Quaternion b);\n" - "__inline\n" - "Quaternion qtNormalize(Quaternion in);\n" - "__inline\n" - "float4 qtRotate(Quaternion q, float4 vec);\n" - "__inline\n" - "Quaternion qtInvert(Quaternion q);\n" - "__inline\n" - "Quaternion qtMul(Quaternion a, Quaternion b)\n" - "{\n" - " Quaternion ans;\n" - " ans = cross3( a, b );\n" - " ans += a.w*b+b.w*a;\n" - "// ans.w = a.w*b.w - (a.x*b.x+a.y*b.y+a.z*b.z);\n" - " ans.w = a.w*b.w - dot3F4(a, b);\n" - " return ans;\n" - "}\n" - "__inline\n" - "Quaternion qtNormalize(Quaternion in)\n" - "{\n" - " return fastNormalize4(in);\n" - "// in /= length( in );\n" - "// return in;\n" - "}\n" - "__inline\n" - "float4 qtRotate(Quaternion q, float4 vec)\n" - "{\n" - " Quaternion qInv = qtInvert( q );\n" - " float4 vcpy = vec;\n" - " vcpy.w = 0.f;\n" - " float4 out = qtMul(qtMul(q,vcpy),qInv);\n" - " return out;\n" - "}\n" - "__inline\n" - "Quaternion qtInvert(Quaternion q)\n" - "{\n" - " return (Quaternion)(-q.xyz, q.w);\n" - "}\n" - "__inline\n" - "float4 qtInvRotate(const Quaternion q, float4 vec)\n" - "{\n" - " return qtRotate( qtInvert( q ), vec );\n" - "}\n" - "#define WG_SIZE 64\n" - "typedef struct\n" - "{\n" - " float4 m_pos;\n" - " Quaternion m_quat;\n" - " float4 m_linVel;\n" - " float4 m_angVel;\n" - " u32 m_shapeIdx;\n" - " float m_invMass;\n" - " float m_restituitionCoeff;\n" - " float m_frictionCoeff;\n" - "} Body;\n" - "typedef struct\n" - "{\n" - " Matrix3x3 m_invInertia;\n" - " Matrix3x3 m_initInvInertia;\n" - "} Shape;\n" - "typedef struct\n" - "{\n" - " float4 m_linear;\n" - " float4 m_worldPos[4];\n" - " float4 m_center; \n" - " float m_jacCoeffInv[4];\n" - " float m_b[4];\n" - " float m_appliedRambdaDt[4];\n" - " float m_fJacCoeffInv[2]; \n" - " float m_fAppliedRambdaDt[2]; \n" - " u32 m_bodyA;\n" - " u32 m_bodyB;\n" - " int m_batchIdx;\n" - " u32 m_paddings;\n" - "} Constraint4;\n" - "__kernel void CountBodiesKernel(__global struct b3Contact4Data* manifoldPtr, __global unsigned int* bodyCount, __global int2* contactConstraintOffsets, int numContactManifolds, int fixedBodyIndex)\n" - "{\n" - " int i = GET_GLOBAL_IDX;\n" - " \n" - " if( i < numContactManifolds)\n" - " {\n" - " int pa = manifoldPtr[i].m_bodyAPtrAndSignBit;\n" - " bool isFixedA = (pa <0) || (pa == fixedBodyIndex);\n" - " int bodyIndexA = abs(pa);\n" - " if (!isFixedA)\n" - " {\n" - " AtomInc1(bodyCount[bodyIndexA],contactConstraintOffsets[i].x);\n" - " }\n" - " barrier(CLK_GLOBAL_MEM_FENCE);\n" - " int pb = manifoldPtr[i].m_bodyBPtrAndSignBit;\n" - " bool isFixedB = (pb <0) || (pb == fixedBodyIndex);\n" - " int bodyIndexB = abs(pb);\n" - " if (!isFixedB)\n" - " {\n" - " AtomInc1(bodyCount[bodyIndexB],contactConstraintOffsets[i].y);\n" - " } \n" - " }\n" - "}\n" - "__kernel void ClearVelocitiesKernel(__global float4* linearVelocities,__global float4* angularVelocities, int numSplitBodies)\n" - "{\n" - " int i = GET_GLOBAL_IDX;\n" - " \n" - " if( i < numSplitBodies)\n" - " {\n" - " linearVelocities[i] = make_float4(0);\n" - " angularVelocities[i] = make_float4(0);\n" - " }\n" - "}\n" - "__kernel void AverageVelocitiesKernel(__global Body* gBodies,__global int* offsetSplitBodies,__global const unsigned int* bodyCount,\n" - "__global float4* deltaLinearVelocities, __global float4* deltaAngularVelocities, int numBodies)\n" - "{\n" - " int i = GET_GLOBAL_IDX;\n" - " if (i 0.70710678f) {\n" - " // choose p in y-z plane\n" - " float a = n.y*n.y + n.z*n.z;\n" - " float k = 1.f/sqrt(a);\n" - " p[0].x = 0;\n" - " p[0].y = -n.z*k;\n" - " p[0].z = n.y*k;\n" - " // set q = n x p\n" - " q[0].x = a*k;\n" - " q[0].y = -n.x*p[0].z;\n" - " q[0].z = n.x*p[0].y;\n" - " }\n" - " else {\n" - " // choose p in x-y plane\n" - " float a = n.x*n.x + n.y*n.y;\n" - " float k = 1.f/sqrt(a);\n" - " p[0].x = -n.y*k;\n" - " p[0].y = n.x*k;\n" - " p[0].z = 0;\n" - " // set q = n x p\n" - " q[0].x = -n.z*p[0].y;\n" - " q[0].y = n.z*p[0].x;\n" - " q[0].z = a*k;\n" - " }\n" - "}\n" - "void solveContact(__global Constraint4* cs,\n" - " float4 posA, float4* linVelA, float4* angVelA, float invMassA, Matrix3x3 invInertiaA,\n" - " float4 posB, float4* linVelB, float4* angVelB, float invMassB, Matrix3x3 invInertiaB,\n" - " float4* dLinVelA, float4* dAngVelA, float4* dLinVelB, float4* dAngVelB)\n" - "{\n" - " float minRambdaDt = 0;\n" - " float maxRambdaDt = FLT_MAX;\n" - " for(int ic=0; ic<4; ic++)\n" - " {\n" - " if( cs->m_jacCoeffInv[ic] == 0.f ) continue;\n" - " float4 angular0, angular1, linear;\n" - " float4 r0 = cs->m_worldPos[ic] - posA;\n" - " float4 r1 = cs->m_worldPos[ic] - posB;\n" - " setLinearAndAngular( cs->m_linear, r0, r1, &linear, &angular0, &angular1 );\n" - " \n" - " float rambdaDt = calcRelVel( cs->m_linear, -cs->m_linear, angular0, angular1, \n" - " *linVelA+*dLinVelA, *angVelA+*dAngVelA, *linVelB+*dLinVelB, *angVelB+*dAngVelB ) + cs->m_b[ic];\n" - " rambdaDt *= cs->m_jacCoeffInv[ic];\n" - " \n" - " {\n" - " float prevSum = cs->m_appliedRambdaDt[ic];\n" - " float updated = prevSum;\n" - " updated += rambdaDt;\n" - " updated = max2( updated, minRambdaDt );\n" - " updated = min2( updated, maxRambdaDt );\n" - " rambdaDt = updated - prevSum;\n" - " cs->m_appliedRambdaDt[ic] = updated;\n" - " }\n" - " \n" - " float4 linImp0 = invMassA*linear*rambdaDt;\n" - " float4 linImp1 = invMassB*(-linear)*rambdaDt;\n" - " float4 angImp0 = mtMul1(invInertiaA, angular0)*rambdaDt;\n" - " float4 angImp1 = mtMul1(invInertiaB, angular1)*rambdaDt;\n" - " \n" - " if (invMassA)\n" - " {\n" - " *dLinVelA += linImp0;\n" - " *dAngVelA += angImp0;\n" - " }\n" - " if (invMassB)\n" - " {\n" - " *dLinVelB += linImp1;\n" - " *dAngVelB += angImp1;\n" - " }\n" - " }\n" - "}\n" - "// solveContactConstraint( gBodies, gShapes, &gConstraints[i] ,contactConstraintOffsets,offsetSplitBodies, deltaLinearVelocities, deltaAngularVelocities);\n" - "void solveContactConstraint(__global Body* gBodies, __global Shape* gShapes, __global Constraint4* ldsCs, \n" - "__global int2* contactConstraintOffsets,__global unsigned int* offsetSplitBodies,\n" - "__global float4* deltaLinearVelocities, __global float4* deltaAngularVelocities)\n" - "{\n" - " //float frictionCoeff = ldsCs[0].m_linear.w;\n" - " int aIdx = ldsCs[0].m_bodyA;\n" - " int bIdx = ldsCs[0].m_bodyB;\n" - " float4 posA = gBodies[aIdx].m_pos;\n" - " float4 linVelA = gBodies[aIdx].m_linVel;\n" - " float4 angVelA = gBodies[aIdx].m_angVel;\n" - " float invMassA = gBodies[aIdx].m_invMass;\n" - " Matrix3x3 invInertiaA = gShapes[aIdx].m_invInertia;\n" - " float4 posB = gBodies[bIdx].m_pos;\n" - " float4 linVelB = gBodies[bIdx].m_linVel;\n" - " float4 angVelB = gBodies[bIdx].m_angVel;\n" - " float invMassB = gBodies[bIdx].m_invMass;\n" - " Matrix3x3 invInertiaB = gShapes[bIdx].m_invInertia;\n" - " \n" - " float4 dLinVelA = make_float4(0,0,0,0);\n" - " float4 dAngVelA = make_float4(0,0,0,0);\n" - " float4 dLinVelB = make_float4(0,0,0,0);\n" - " float4 dAngVelB = make_float4(0,0,0,0);\n" - " \n" - " int bodyOffsetA = offsetSplitBodies[aIdx];\n" - " int constraintOffsetA = contactConstraintOffsets[0].x;\n" - " int splitIndexA = bodyOffsetA+constraintOffsetA;\n" - " \n" - " if (invMassA)\n" - " {\n" - " dLinVelA = deltaLinearVelocities[splitIndexA];\n" - " dAngVelA = deltaAngularVelocities[splitIndexA];\n" - " }\n" - " int bodyOffsetB = offsetSplitBodies[bIdx];\n" - " int constraintOffsetB = contactConstraintOffsets[0].y;\n" - " int splitIndexB= bodyOffsetB+constraintOffsetB;\n" - " if (invMassB)\n" - " {\n" - " dLinVelB = deltaLinearVelocities[splitIndexB];\n" - " dAngVelB = deltaAngularVelocities[splitIndexB];\n" - " }\n" - " solveContact( ldsCs, posA, &linVelA, &angVelA, invMassA, invInertiaA,\n" - " posB, &linVelB, &angVelB, invMassB, invInertiaB ,&dLinVelA, &dAngVelA, &dLinVelB, &dAngVelB);\n" - " if (invMassA)\n" - " {\n" - " deltaLinearVelocities[splitIndexA] = dLinVelA;\n" - " deltaAngularVelocities[splitIndexA] = dAngVelA;\n" - " } \n" - " if (invMassB)\n" - " {\n" - " deltaLinearVelocities[splitIndexB] = dLinVelB;\n" - " deltaAngularVelocities[splitIndexB] = dAngVelB;\n" - " }\n" - "}\n" - "__kernel void SolveContactJacobiKernel(__global Constraint4* gConstraints, __global Body* gBodies, __global Shape* gShapes ,\n" - "__global int2* contactConstraintOffsets,__global unsigned int* offsetSplitBodies,__global float4* deltaLinearVelocities, __global float4* deltaAngularVelocities,\n" - "float deltaTime, float positionDrift, float positionConstraintCoeff, int fixedBodyIndex, int numManifolds\n" - ")\n" - "{\n" - " int i = GET_GLOBAL_IDX;\n" - " if (im_fJacCoeffInv[0] == 0 && cs->m_fJacCoeffInv[0] == 0 ) return;\n" - " const float4 center = cs->m_center;\n" - " \n" - " float4 n = -cs->m_linear;\n" - " \n" - " float4 tangent[2];\n" - " btPlaneSpace1(n,&tangent[0],&tangent[1]);\n" - " float4 angular0, angular1, linear;\n" - " float4 r0 = center - posA;\n" - " float4 r1 = center - posB;\n" - " for(int i=0; i<2; i++)\n" - " {\n" - " setLinearAndAngular( tangent[i], r0, r1, &linear, &angular0, &angular1 );\n" - " float rambdaDt = calcRelVel(linear, -linear, angular0, angular1,\n" - " linVelA+dLinVelA, angVelA+dAngVelA, linVelB+dLinVelB, angVelB+dAngVelB );\n" - " rambdaDt *= cs->m_fJacCoeffInv[i];\n" - " \n" - " {\n" - " float prevSum = cs->m_fAppliedRambdaDt[i];\n" - " float updated = prevSum;\n" - " updated += rambdaDt;\n" - " updated = max2( updated, minRambdaDt[i] );\n" - " updated = min2( updated, maxRambdaDt[i] );\n" - " rambdaDt = updated - prevSum;\n" - " cs->m_fAppliedRambdaDt[i] = updated;\n" - " }\n" - " \n" - " float4 linImp0 = invMassA*linear*rambdaDt;\n" - " float4 linImp1 = invMassB*(-linear)*rambdaDt;\n" - " float4 angImp0 = mtMul1(invInertiaA, angular0)*rambdaDt;\n" - " float4 angImp1 = mtMul1(invInertiaB, angular1)*rambdaDt;\n" - " \n" - " dLinVelA += linImp0;\n" - " dAngVelA += angImp0;\n" - " dLinVelB += linImp1;\n" - " dAngVelB += angImp1;\n" - " }\n" - " { // angular damping for point constraint\n" - " float4 ab = normalize3( posB - posA );\n" - " float4 ac = normalize3( center - posA );\n" - " if( dot3F4( ab, ac ) > 0.95f || (invMassA == 0.f || invMassB == 0.f))\n" - " {\n" - " float angNA = dot3F4( n, angVelA );\n" - " float angNB = dot3F4( n, angVelB );\n" - " \n" - " dAngVelA -= (angNA*0.1f)*n;\n" - " dAngVelB -= (angNB*0.1f)*n;\n" - " }\n" - " }\n" - " }\n" - " \n" - " \n" - " }\n" - " if (invMassA)\n" - " {\n" - " deltaLinearVelocities[splitIndexA] = dLinVelA;\n" - " deltaAngularVelocities[splitIndexA] = dAngVelA;\n" - " } \n" - " if (invMassB)\n" - " {\n" - " deltaLinearVelocities[splitIndexB] = dLinVelB;\n" - " deltaAngularVelocities[splitIndexB] = dAngVelB;\n" - " }\n" - " \n" - "}\n" - "__kernel void SolveFrictionJacobiKernel(__global Constraint4* gConstraints, __global Body* gBodies, __global Shape* gShapes ,\n" - " __global int2* contactConstraintOffsets,__global unsigned int* offsetSplitBodies,\n" - " __global float4* deltaLinearVelocities, __global float4* deltaAngularVelocities,\n" - " float deltaTime, float positionDrift, float positionConstraintCoeff, int fixedBodyIndex, int numManifolds\n" - ")\n" - "{\n" - " int i = GET_GLOBAL_IDX;\n" - " if (im_bodyA = abs(src->m_bodyAPtrAndSignBit);\n" - " dstC->m_bodyB = abs(src->m_bodyBPtrAndSignBit);\n" - " float dtInv = 1.f/dt;\n" - " for(int ic=0; ic<4; ic++)\n" - " {\n" - " dstC->m_appliedRambdaDt[ic] = 0.f;\n" - " }\n" - " dstC->m_fJacCoeffInv[0] = dstC->m_fJacCoeffInv[1] = 0.f;\n" - " dstC->m_linear = src->m_worldNormalOnB;\n" - " dstC->m_linear.w = 0.7f ;//src->getFrictionCoeff() );\n" - " for(int ic=0; ic<4; ic++)\n" - " {\n" - " float4 r0 = src->m_worldPosB[ic] - posA;\n" - " float4 r1 = src->m_worldPosB[ic] - posB;\n" - " if( ic >= src->m_worldNormalOnB.w )//npoints\n" - " {\n" - " dstC->m_jacCoeffInv[ic] = 0.f;\n" - " continue;\n" - " }\n" - " float relVelN;\n" - " {\n" - " float4 linear, angular0, angular1;\n" - " setLinearAndAngular(src->m_worldNormalOnB, r0, r1, &linear, &angular0, &angular1);\n" - " dstC->m_jacCoeffInv[ic] = calcJacCoeff(linear, -linear, angular0, angular1,\n" - " invMassA, &invInertiaA, invMassB, &invInertiaB , countA, countB);\n" - " relVelN = calcRelVel(linear, -linear, angular0, angular1,\n" - " linVelA, angVelA, linVelB, angVelB);\n" - " float e = 0.f;//src->getRestituitionCoeff();\n" - " if( relVelN*relVelN < 0.004f ) e = 0.f;\n" - " dstC->m_b[ic] = e*relVelN;\n" - " //float penetration = src->m_worldPosB[ic].w;\n" - " dstC->m_b[ic] += (src->m_worldPosB[ic].w + positionDrift)*positionConstraintCoeff*dtInv;\n" - " dstC->m_appliedRambdaDt[ic] = 0.f;\n" - " }\n" - " }\n" - " if( src->m_worldNormalOnB.w > 0 )//npoints\n" - " { // prepare friction\n" - " float4 center = make_float4(0.f);\n" - " for(int i=0; im_worldNormalOnB.w; i++) \n" - " center += src->m_worldPosB[i];\n" - " center /= (float)src->m_worldNormalOnB.w;\n" - " float4 tangent[2];\n" - " btPlaneSpace1(-src->m_worldNormalOnB,&tangent[0],&tangent[1]);\n" - " \n" - " float4 r[2];\n" - " r[0] = center - posA;\n" - " r[1] = center - posB;\n" - " for(int i=0; i<2; i++)\n" - " {\n" - " float4 linear, angular0, angular1;\n" - " setLinearAndAngular(tangent[i], r[0], r[1], &linear, &angular0, &angular1);\n" - " dstC->m_fJacCoeffInv[i] = calcJacCoeff(linear, -linear, angular0, angular1,\n" - " invMassA, &invInertiaA, invMassB, &invInertiaB ,countA, countB);\n" - " dstC->m_fAppliedRambdaDt[i] = 0.f;\n" - " }\n" - " dstC->m_center = center;\n" - " }\n" - " for(int i=0; i<4; i++)\n" - " {\n" - " if( im_worldNormalOnB.w )\n" - " {\n" - " dstC->m_worldPos[i] = src->m_worldPosB[i];\n" - " }\n" - " else\n" - " {\n" - " dstC->m_worldPos[i] = make_float4(0.f);\n" - " }\n" - " }\n" - "}\n" - "__kernel\n" - "__attribute__((reqd_work_group_size(WG_SIZE,1,1)))\n" - "void ContactToConstraintSplitKernel(__global const struct b3Contact4Data* gContact, __global const Body* gBodies, __global const Shape* gShapes, __global Constraint4* gConstraintOut, \n" - "__global const unsigned int* bodyCount,\n" - "int nContacts,\n" - "float dt,\n" - "float positionDrift,\n" - "float positionConstraintCoeff\n" - ")\n" - "{\n" - " int gIdx = GET_GLOBAL_IDX;\n" - " \n" - " if( gIdx < nContacts )\n" - " {\n" - " int aIdx = abs(gContact[gIdx].m_bodyAPtrAndSignBit);\n" - " int bIdx = abs(gContact[gIdx].m_bodyBPtrAndSignBit);\n" - " float4 posA = gBodies[aIdx].m_pos;\n" - " float4 linVelA = gBodies[aIdx].m_linVel;\n" - " float4 angVelA = gBodies[aIdx].m_angVel;\n" - " float invMassA = gBodies[aIdx].m_invMass;\n" - " Matrix3x3 invInertiaA = gShapes[aIdx].m_invInertia;\n" - " float4 posB = gBodies[bIdx].m_pos;\n" - " float4 linVelB = gBodies[bIdx].m_linVel;\n" - " float4 angVelB = gBodies[bIdx].m_angVel;\n" - " float invMassB = gBodies[bIdx].m_invMass;\n" - " Matrix3x3 invInertiaB = gShapes[bIdx].m_invInertia;\n" - " Constraint4 cs;\n" - " float countA = invMassA != 0.f ? (float)bodyCount[aIdx] : 1;\n" - " float countB = invMassB != 0.f ? (float)bodyCount[bIdx] : 1;\n" - " setConstraint4( posA, linVelA, angVelA, invMassA, invInertiaA, posB, linVelB, angVelB, invMassB, invInertiaB,\n" - " &gContact[gIdx], dt, positionDrift, positionConstraintCoeff,countA,countB,\n" - " &cs );\n" - " \n" - " cs.m_batchIdx = gContact[gIdx].m_batchIdx;\n" - " gConstraintOut[gIdx] = cs;\n" - " }\n" - "}\n"; diff --git a/engine/inc/bullet/Bullet3OpenCL/RigidBody/kernels/updateAabbsKernel.h b/engine/inc/bullet/Bullet3OpenCL/RigidBody/kernels/updateAabbsKernel.h deleted file mode 100644 index bb949b20..00000000 --- a/engine/inc/bullet/Bullet3OpenCL/RigidBody/kernels/updateAabbsKernel.h +++ /dev/null @@ -1,482 +0,0 @@ -//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project -static const char* updateAabbsKernelCL = - "#ifndef B3_UPDATE_AABBS_H\n" - "#define B3_UPDATE_AABBS_H\n" - "#ifndef B3_AABB_H\n" - "#define B3_AABB_H\n" - "#ifndef B3_FLOAT4_H\n" - "#define B3_FLOAT4_H\n" - "#ifndef B3_PLATFORM_DEFINITIONS_H\n" - "#define B3_PLATFORM_DEFINITIONS_H\n" - "struct MyTest\n" - "{\n" - " int bla;\n" - "};\n" - "#ifdef __cplusplus\n" - "#else\n" - "//keep B3_LARGE_FLOAT*B3_LARGE_FLOAT < FLT_MAX\n" - "#define B3_LARGE_FLOAT 1e18f\n" - "#define B3_INFINITY 1e18f\n" - "#define b3Assert(a)\n" - "#define b3ConstArray(a) __global const a*\n" - "#define b3AtomicInc atomic_inc\n" - "#define b3AtomicAdd atomic_add\n" - "#define b3Fabs fabs\n" - "#define b3Sqrt native_sqrt\n" - "#define b3Sin native_sin\n" - "#define b3Cos native_cos\n" - "#define B3_STATIC\n" - "#endif\n" - "#endif\n" - "#ifdef __cplusplus\n" - "#else\n" - " typedef float4 b3Float4;\n" - " #define b3Float4ConstArg const b3Float4\n" - " #define b3MakeFloat4 (float4)\n" - " float b3Dot3F4(b3Float4ConstArg v0,b3Float4ConstArg v1)\n" - " {\n" - " float4 a1 = b3MakeFloat4(v0.xyz,0.f);\n" - " float4 b1 = b3MakeFloat4(v1.xyz,0.f);\n" - " return dot(a1, b1);\n" - " }\n" - " b3Float4 b3Cross3(b3Float4ConstArg v0,b3Float4ConstArg v1)\n" - " {\n" - " float4 a1 = b3MakeFloat4(v0.xyz,0.f);\n" - " float4 b1 = b3MakeFloat4(v1.xyz,0.f);\n" - " return cross(a1, b1);\n" - " }\n" - " #define b3MinFloat4 min\n" - " #define b3MaxFloat4 max\n" - " #define b3Normalized(a) normalize(a)\n" - "#endif \n" - " \n" - "inline bool b3IsAlmostZero(b3Float4ConstArg v)\n" - "{\n" - " if(b3Fabs(v.x)>1e-6 || b3Fabs(v.y)>1e-6 || b3Fabs(v.z)>1e-6) \n" - " return false;\n" - " return true;\n" - "}\n" - "inline int b3MaxDot( b3Float4ConstArg vec, __global const b3Float4* vecArray, int vecLen, float* dotOut )\n" - "{\n" - " float maxDot = -B3_INFINITY;\n" - " int i = 0;\n" - " int ptIndex = -1;\n" - " for( i = 0; i < vecLen; i++ )\n" - " {\n" - " float dot = b3Dot3F4(vecArray[i],vec);\n" - " \n" - " if( dot > maxDot )\n" - " {\n" - " maxDot = dot;\n" - " ptIndex = i;\n" - " }\n" - " }\n" - " b3Assert(ptIndex>=0);\n" - " if (ptIndex<0)\n" - " {\n" - " ptIndex = 0;\n" - " }\n" - " *dotOut = maxDot;\n" - " return ptIndex;\n" - "}\n" - "#endif //B3_FLOAT4_H\n" - "#ifndef B3_MAT3x3_H\n" - "#define B3_MAT3x3_H\n" - "#ifndef B3_QUAT_H\n" - "#define B3_QUAT_H\n" - "#ifndef B3_PLATFORM_DEFINITIONS_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#endif\n" - "#endif\n" - "#ifndef B3_FLOAT4_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#endif \n" - "#endif //B3_FLOAT4_H\n" - "#ifdef __cplusplus\n" - "#else\n" - " typedef float4 b3Quat;\n" - " #define b3QuatConstArg const b3Quat\n" - " \n" - " \n" - "inline float4 b3FastNormalize4(float4 v)\n" - "{\n" - " v = (float4)(v.xyz,0.f);\n" - " return fast_normalize(v);\n" - "}\n" - " \n" - "inline b3Quat b3QuatMul(b3Quat a, b3Quat b);\n" - "inline b3Quat b3QuatNormalized(b3QuatConstArg in);\n" - "inline b3Quat b3QuatRotate(b3QuatConstArg q, b3QuatConstArg vec);\n" - "inline b3Quat b3QuatInvert(b3QuatConstArg q);\n" - "inline b3Quat b3QuatInverse(b3QuatConstArg q);\n" - "inline b3Quat b3QuatMul(b3QuatConstArg a, b3QuatConstArg b)\n" - "{\n" - " b3Quat ans;\n" - " ans = b3Cross3( a, b );\n" - " ans += a.w*b+b.w*a;\n" - "// ans.w = a.w*b.w - (a.x*b.x+a.y*b.y+a.z*b.z);\n" - " ans.w = a.w*b.w - b3Dot3F4(a, b);\n" - " return ans;\n" - "}\n" - "inline b3Quat b3QuatNormalized(b3QuatConstArg in)\n" - "{\n" - " b3Quat q;\n" - " q=in;\n" - " //return b3FastNormalize4(in);\n" - " float len = native_sqrt(dot(q, q));\n" - " if(len > 0.f)\n" - " {\n" - " q *= 1.f / len;\n" - " }\n" - " else\n" - " {\n" - " q.x = q.y = q.z = 0.f;\n" - " q.w = 1.f;\n" - " }\n" - " return q;\n" - "}\n" - "inline float4 b3QuatRotate(b3QuatConstArg q, b3QuatConstArg vec)\n" - "{\n" - " b3Quat qInv = b3QuatInvert( q );\n" - " float4 vcpy = vec;\n" - " vcpy.w = 0.f;\n" - " float4 out = b3QuatMul(b3QuatMul(q,vcpy),qInv);\n" - " return out;\n" - "}\n" - "inline b3Quat b3QuatInverse(b3QuatConstArg q)\n" - "{\n" - " return (b3Quat)(-q.xyz, q.w);\n" - "}\n" - "inline b3Quat b3QuatInvert(b3QuatConstArg q)\n" - "{\n" - " return (b3Quat)(-q.xyz, q.w);\n" - "}\n" - "inline float4 b3QuatInvRotate(b3QuatConstArg q, b3QuatConstArg vec)\n" - "{\n" - " return b3QuatRotate( b3QuatInvert( q ), vec );\n" - "}\n" - "inline b3Float4 b3TransformPoint(b3Float4ConstArg point, b3Float4ConstArg translation, b3QuatConstArg orientation)\n" - "{\n" - " return b3QuatRotate( orientation, point ) + (translation);\n" - "}\n" - " \n" - "#endif \n" - "#endif //B3_QUAT_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "typedef struct\n" - "{\n" - " b3Float4 m_row[3];\n" - "}b3Mat3x3;\n" - "#define b3Mat3x3ConstArg const b3Mat3x3\n" - "#define b3GetRow(m,row) (m.m_row[row])\n" - "inline b3Mat3x3 b3QuatGetRotationMatrix(b3Quat quat)\n" - "{\n" - " b3Float4 quat2 = (b3Float4)(quat.x*quat.x, quat.y*quat.y, quat.z*quat.z, 0.f);\n" - " b3Mat3x3 out;\n" - " out.m_row[0].x=1-2*quat2.y-2*quat2.z;\n" - " out.m_row[0].y=2*quat.x*quat.y-2*quat.w*quat.z;\n" - " out.m_row[0].z=2*quat.x*quat.z+2*quat.w*quat.y;\n" - " out.m_row[0].w = 0.f;\n" - " out.m_row[1].x=2*quat.x*quat.y+2*quat.w*quat.z;\n" - " out.m_row[1].y=1-2*quat2.x-2*quat2.z;\n" - " out.m_row[1].z=2*quat.y*quat.z-2*quat.w*quat.x;\n" - " out.m_row[1].w = 0.f;\n" - " out.m_row[2].x=2*quat.x*quat.z-2*quat.w*quat.y;\n" - " out.m_row[2].y=2*quat.y*quat.z+2*quat.w*quat.x;\n" - " out.m_row[2].z=1-2*quat2.x-2*quat2.y;\n" - " out.m_row[2].w = 0.f;\n" - " return out;\n" - "}\n" - "inline b3Mat3x3 b3AbsoluteMat3x3(b3Mat3x3ConstArg matIn)\n" - "{\n" - " b3Mat3x3 out;\n" - " out.m_row[0] = fabs(matIn.m_row[0]);\n" - " out.m_row[1] = fabs(matIn.m_row[1]);\n" - " out.m_row[2] = fabs(matIn.m_row[2]);\n" - " return out;\n" - "}\n" - "__inline\n" - "b3Mat3x3 mtZero();\n" - "__inline\n" - "b3Mat3x3 mtIdentity();\n" - "__inline\n" - "b3Mat3x3 mtTranspose(b3Mat3x3 m);\n" - "__inline\n" - "b3Mat3x3 mtMul(b3Mat3x3 a, b3Mat3x3 b);\n" - "__inline\n" - "b3Float4 mtMul1(b3Mat3x3 a, b3Float4 b);\n" - "__inline\n" - "b3Float4 mtMul3(b3Float4 a, b3Mat3x3 b);\n" - "__inline\n" - "b3Mat3x3 mtZero()\n" - "{\n" - " b3Mat3x3 m;\n" - " m.m_row[0] = (b3Float4)(0.f);\n" - " m.m_row[1] = (b3Float4)(0.f);\n" - " m.m_row[2] = (b3Float4)(0.f);\n" - " return m;\n" - "}\n" - "__inline\n" - "b3Mat3x3 mtIdentity()\n" - "{\n" - " b3Mat3x3 m;\n" - " m.m_row[0] = (b3Float4)(1,0,0,0);\n" - " m.m_row[1] = (b3Float4)(0,1,0,0);\n" - " m.m_row[2] = (b3Float4)(0,0,1,0);\n" - " return m;\n" - "}\n" - "__inline\n" - "b3Mat3x3 mtTranspose(b3Mat3x3 m)\n" - "{\n" - " b3Mat3x3 out;\n" - " out.m_row[0] = (b3Float4)(m.m_row[0].x, m.m_row[1].x, m.m_row[2].x, 0.f);\n" - " out.m_row[1] = (b3Float4)(m.m_row[0].y, m.m_row[1].y, m.m_row[2].y, 0.f);\n" - " out.m_row[2] = (b3Float4)(m.m_row[0].z, m.m_row[1].z, m.m_row[2].z, 0.f);\n" - " return out;\n" - "}\n" - "__inline\n" - "b3Mat3x3 mtMul(b3Mat3x3 a, b3Mat3x3 b)\n" - "{\n" - " b3Mat3x3 transB;\n" - " transB = mtTranspose( b );\n" - " b3Mat3x3 ans;\n" - " // why this doesn't run when 0ing in the for{}\n" - " a.m_row[0].w = 0.f;\n" - " a.m_row[1].w = 0.f;\n" - " a.m_row[2].w = 0.f;\n" - " for(int i=0; i<3; i++)\n" - " {\n" - "// a.m_row[i].w = 0.f;\n" - " ans.m_row[i].x = b3Dot3F4(a.m_row[i],transB.m_row[0]);\n" - " ans.m_row[i].y = b3Dot3F4(a.m_row[i],transB.m_row[1]);\n" - " ans.m_row[i].z = b3Dot3F4(a.m_row[i],transB.m_row[2]);\n" - " ans.m_row[i].w = 0.f;\n" - " }\n" - " return ans;\n" - "}\n" - "__inline\n" - "b3Float4 mtMul1(b3Mat3x3 a, b3Float4 b)\n" - "{\n" - " b3Float4 ans;\n" - " ans.x = b3Dot3F4( a.m_row[0], b );\n" - " ans.y = b3Dot3F4( a.m_row[1], b );\n" - " ans.z = b3Dot3F4( a.m_row[2], b );\n" - " ans.w = 0.f;\n" - " return ans;\n" - "}\n" - "__inline\n" - "b3Float4 mtMul3(b3Float4 a, b3Mat3x3 b)\n" - "{\n" - " b3Float4 colx = b3MakeFloat4(b.m_row[0].x, b.m_row[1].x, b.m_row[2].x, 0);\n" - " b3Float4 coly = b3MakeFloat4(b.m_row[0].y, b.m_row[1].y, b.m_row[2].y, 0);\n" - " b3Float4 colz = b3MakeFloat4(b.m_row[0].z, b.m_row[1].z, b.m_row[2].z, 0);\n" - " b3Float4 ans;\n" - " ans.x = b3Dot3F4( a, colx );\n" - " ans.y = b3Dot3F4( a, coly );\n" - " ans.z = b3Dot3F4( a, colz );\n" - " return ans;\n" - "}\n" - "#endif\n" - "#endif //B3_MAT3x3_H\n" - "typedef struct b3Aabb b3Aabb_t;\n" - "struct b3Aabb\n" - "{\n" - " union\n" - " {\n" - " float m_min[4];\n" - " b3Float4 m_minVec;\n" - " int m_minIndices[4];\n" - " };\n" - " union\n" - " {\n" - " float m_max[4];\n" - " b3Float4 m_maxVec;\n" - " int m_signedMaxIndices[4];\n" - " };\n" - "};\n" - "inline void b3TransformAabb2(b3Float4ConstArg localAabbMin,b3Float4ConstArg localAabbMax, float margin,\n" - " b3Float4ConstArg pos,\n" - " b3QuatConstArg orn,\n" - " b3Float4* aabbMinOut,b3Float4* aabbMaxOut)\n" - "{\n" - " b3Float4 localHalfExtents = 0.5f*(localAabbMax-localAabbMin);\n" - " localHalfExtents+=b3MakeFloat4(margin,margin,margin,0.f);\n" - " b3Float4 localCenter = 0.5f*(localAabbMax+localAabbMin);\n" - " b3Mat3x3 m;\n" - " m = b3QuatGetRotationMatrix(orn);\n" - " b3Mat3x3 abs_b = b3AbsoluteMat3x3(m);\n" - " b3Float4 center = b3TransformPoint(localCenter,pos,orn);\n" - " \n" - " b3Float4 extent = b3MakeFloat4(b3Dot3F4(localHalfExtents,b3GetRow(abs_b,0)),\n" - " b3Dot3F4(localHalfExtents,b3GetRow(abs_b,1)),\n" - " b3Dot3F4(localHalfExtents,b3GetRow(abs_b,2)),\n" - " 0.f);\n" - " *aabbMinOut = center-extent;\n" - " *aabbMaxOut = center+extent;\n" - "}\n" - "/// conservative test for overlap between two aabbs\n" - "inline bool b3TestAabbAgainstAabb(b3Float4ConstArg aabbMin1,b3Float4ConstArg aabbMax1,\n" - " b3Float4ConstArg aabbMin2, b3Float4ConstArg aabbMax2)\n" - "{\n" - " bool overlap = true;\n" - " overlap = (aabbMin1.x > aabbMax2.x || aabbMax1.x < aabbMin2.x) ? false : overlap;\n" - " overlap = (aabbMin1.z > aabbMax2.z || aabbMax1.z < aabbMin2.z) ? false : overlap;\n" - " overlap = (aabbMin1.y > aabbMax2.y || aabbMax1.y < aabbMin2.y) ? false : overlap;\n" - " return overlap;\n" - "}\n" - "#endif //B3_AABB_H\n" - "#ifndef B3_COLLIDABLE_H\n" - "#define B3_COLLIDABLE_H\n" - "#ifndef B3_FLOAT4_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#endif \n" - "#endif //B3_FLOAT4_H\n" - "#ifndef B3_QUAT_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#endif \n" - "#endif //B3_QUAT_H\n" - "enum b3ShapeTypes\n" - "{\n" - " SHAPE_HEIGHT_FIELD=1,\n" - " SHAPE_CONVEX_HULL=3,\n" - " SHAPE_PLANE=4,\n" - " SHAPE_CONCAVE_TRIMESH=5,\n" - " SHAPE_COMPOUND_OF_CONVEX_HULLS=6,\n" - " SHAPE_SPHERE=7,\n" - " MAX_NUM_SHAPE_TYPES,\n" - "};\n" - "typedef struct b3Collidable b3Collidable_t;\n" - "struct b3Collidable\n" - "{\n" - " union {\n" - " int m_numChildShapes;\n" - " int m_bvhIndex;\n" - " };\n" - " union\n" - " {\n" - " float m_radius;\n" - " int m_compoundBvhIndex;\n" - " };\n" - " int m_shapeType;\n" - " union\n" - " {\n" - " int m_shapeIndex;\n" - " float m_height;\n" - " };\n" - "};\n" - "typedef struct b3GpuChildShape b3GpuChildShape_t;\n" - "struct b3GpuChildShape\n" - "{\n" - " b3Float4 m_childPosition;\n" - " b3Quat m_childOrientation;\n" - " union\n" - " {\n" - " int m_shapeIndex;//used for SHAPE_COMPOUND_OF_CONVEX_HULLS\n" - " int m_capsuleAxis;\n" - " };\n" - " union \n" - " {\n" - " float m_radius;//used for childshape of SHAPE_COMPOUND_OF_SPHERES or SHAPE_COMPOUND_OF_CAPSULES\n" - " int m_numChildShapes;//used for compound shape\n" - " };\n" - " union \n" - " {\n" - " float m_height;//used for childshape of SHAPE_COMPOUND_OF_CAPSULES\n" - " int m_collidableShapeIndex;\n" - " };\n" - " int m_shapeType;\n" - "};\n" - "struct b3CompoundOverlappingPair\n" - "{\n" - " int m_bodyIndexA;\n" - " int m_bodyIndexB;\n" - "// int m_pairType;\n" - " int m_childShapeIndexA;\n" - " int m_childShapeIndexB;\n" - "};\n" - "#endif //B3_COLLIDABLE_H\n" - "#ifndef B3_RIGIDBODY_DATA_H\n" - "#define B3_RIGIDBODY_DATA_H\n" - "#ifndef B3_FLOAT4_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#endif \n" - "#endif //B3_FLOAT4_H\n" - "#ifndef B3_QUAT_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#endif \n" - "#endif //B3_QUAT_H\n" - "#ifndef B3_MAT3x3_H\n" - "#ifdef __cplusplus\n" - "#else\n" - "#endif\n" - "#endif //B3_MAT3x3_H\n" - "typedef struct b3RigidBodyData b3RigidBodyData_t;\n" - "struct b3RigidBodyData\n" - "{\n" - " b3Float4 m_pos;\n" - " b3Quat m_quat;\n" - " b3Float4 m_linVel;\n" - " b3Float4 m_angVel;\n" - " int m_collidableIdx;\n" - " float m_invMass;\n" - " float m_restituitionCoeff;\n" - " float m_frictionCoeff;\n" - "};\n" - "typedef struct b3InertiaData b3InertiaData_t;\n" - "struct b3InertiaData\n" - "{\n" - " b3Mat3x3 m_invInertiaWorld;\n" - " b3Mat3x3 m_initInvInertia;\n" - "};\n" - "#endif //B3_RIGIDBODY_DATA_H\n" - " \n" - "void b3ComputeWorldAabb( int bodyId, __global const b3RigidBodyData_t* bodies, __global const b3Collidable_t* collidables, __global const b3Aabb_t* localShapeAABB, __global b3Aabb_t* worldAabbs)\n" - "{\n" - " __global const b3RigidBodyData_t* body = &bodies[bodyId];\n" - " b3Float4 position = body->m_pos;\n" - " b3Quat orientation = body->m_quat;\n" - " \n" - " int collidableIndex = body->m_collidableIdx;\n" - " int shapeIndex = collidables[collidableIndex].m_shapeIndex;\n" - " \n" - " if (shapeIndex>=0)\n" - " {\n" - " \n" - " b3Aabb_t localAabb = localShapeAABB[collidableIndex];\n" - " b3Aabb_t worldAabb;\n" - " \n" - " b3Float4 aabbAMinOut,aabbAMaxOut; \n" - " float margin = 0.f;\n" - " b3TransformAabb2(localAabb.m_minVec,localAabb.m_maxVec,margin,position,orientation,&aabbAMinOut,&aabbAMaxOut);\n" - " \n" - " worldAabb.m_minVec =aabbAMinOut;\n" - " worldAabb.m_minIndices[3] = bodyId;\n" - " worldAabb.m_maxVec = aabbAMaxOut;\n" - " worldAabb.m_signedMaxIndices[3] = body[bodyId].m_invMass==0.f? 0 : 1;\n" - " worldAabbs[bodyId] = worldAabb;\n" - " }\n" - "}\n" - "#endif //B3_UPDATE_AABBS_H\n" - "__kernel void initializeGpuAabbsFull( const int numNodes, __global b3RigidBodyData_t* gBodies,__global b3Collidable_t* collidables, __global b3Aabb_t* plocalShapeAABB, __global b3Aabb_t* pAABB)\n" - "{\n" - " int nodeID = get_global_id(0);\n" - " if( nodeID < numNodes )\n" - " {\n" - " b3ComputeWorldAabb(nodeID, gBodies, collidables, plocalShapeAABB,pAABB);\n" - " }\n" - "}\n" - "__kernel void clearOverlappingPairsKernel( __global int4* pairs, int numPairs)\n" - "{\n" - " int pairId = get_global_id(0);\n" - " if( pairId< numPairs )\n" - " {\n" - " pairs[pairId].z = 0xffffffff;\n" - " }\n" - "}\n"; diff --git a/engine/inc/bullet/BulletCollision/BroadphaseCollision/btAxisSweep3.h b/engine/inc/bullet/BulletCollision/BroadphaseCollision/btAxisSweep3.h deleted file mode 100644 index 1e42f25f..00000000 --- a/engine/inc/bullet/BulletCollision/BroadphaseCollision/btAxisSweep3.h +++ /dev/null @@ -1,48 +0,0 @@ -//Bullet Continuous Collision Detection and Physics Library -//Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ - -// -// btAxisSweep3.h -// -// Copyright (c) 2006 Simon Hobbs -// -// 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_AXIS_SWEEP_3_H -#define BT_AXIS_SWEEP_3_H - -#include "LinearMath/btVector3.h" -#include "btOverlappingPairCache.h" -#include "btBroadphaseInterface.h" -#include "btBroadphaseProxy.h" -#include "btOverlappingPairCallback.h" -#include "btDbvtBroadphase.h" -#include "btAxisSweep3Internal.h" - -/// The btAxisSweep3 is an efficient implementation of the 3d axis sweep and prune broadphase. -/// It uses arrays rather then lists for storage of the 3 axis. Also it operates using 16 bit integer coordinates instead of floats. -/// For large worlds and many objects, use bt32BitAxisSweep3 or btDbvtBroadphase instead. bt32BitAxisSweep3 has higher precision and allows more then 16384 objects at the cost of more memory and bit of performance. -class btAxisSweep3 : public btAxisSweep3Internal -{ -public: - btAxisSweep3(const btVector3& worldAabbMin, const btVector3& worldAabbMax, unsigned short int maxHandles = 16384, btOverlappingPairCache* pairCache = 0, bool disableRaycastAccelerator = false); -}; - -/// The bt32BitAxisSweep3 allows higher precision quantization and more objects compared to the btAxisSweep3 sweep and prune. -/// This comes at the cost of more memory per handle, and a bit slower performance. -/// It uses arrays rather then lists for storage of the 3 axis. -class bt32BitAxisSweep3 : public btAxisSweep3Internal -{ -public: - bt32BitAxisSweep3(const btVector3& worldAabbMin, const btVector3& worldAabbMax, unsigned int maxHandles = 1500000, btOverlappingPairCache* pairCache = 0, bool disableRaycastAccelerator = false); -}; - -#endif diff --git a/engine/inc/bullet/BulletCollision/BroadphaseCollision/btAxisSweep3Internal.h b/engine/inc/bullet/BulletCollision/BroadphaseCollision/btAxisSweep3Internal.h deleted file mode 100644 index 2ee35528..00000000 --- a/engine/inc/bullet/BulletCollision/BroadphaseCollision/btAxisSweep3Internal.h +++ /dev/null @@ -1,954 +0,0 @@ -//Bullet Continuous Collision Detection and Physics Library -//Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ - -// -// btAxisSweep3.h -// -// Copyright (c) 2006 Simon Hobbs -// -// 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_AXIS_SWEEP_3_INTERNAL_H -#define BT_AXIS_SWEEP_3_INTERNAL_H - -#include "LinearMath/btVector3.h" -#include "btOverlappingPairCache.h" -#include "btBroadphaseInterface.h" -#include "btBroadphaseProxy.h" -#include "btOverlappingPairCallback.h" -#include "btDbvtBroadphase.h" - -//#define DEBUG_BROADPHASE 1 -#define USE_OVERLAP_TEST_ON_REMOVES 1 - -/// The internal templace class btAxisSweep3Internal implements the sweep and prune broadphase. -/// It uses quantized integers to represent the begin and end points for each of the 3 axis. -/// Dont use this class directly, use btAxisSweep3 or bt32BitAxisSweep3 instead. -template -class btAxisSweep3Internal : public btBroadphaseInterface -{ -protected: - BP_FP_INT_TYPE m_bpHandleMask; - BP_FP_INT_TYPE m_handleSentinel; - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - class Edge - { - public: - BP_FP_INT_TYPE m_pos; // low bit is min/max - BP_FP_INT_TYPE m_handle; - - BP_FP_INT_TYPE IsMax() const { return static_cast(m_pos & 1); } - }; - -public: - class Handle : public btBroadphaseProxy - { - public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - // indexes into the edge arrays - BP_FP_INT_TYPE m_minEdges[3], m_maxEdges[3]; // 6 * 2 = 12 - // BP_FP_INT_TYPE m_uniqueId; - btBroadphaseProxy* m_dbvtProxy; //for faster raycast - //void* m_pOwner; this is now in btBroadphaseProxy.m_clientObject - - SIMD_FORCE_INLINE void SetNextFree(BP_FP_INT_TYPE next) { m_minEdges[0] = next; } - SIMD_FORCE_INLINE BP_FP_INT_TYPE GetNextFree() const { return m_minEdges[0]; } - }; // 24 bytes + 24 for Edge structures = 44 bytes total per entry - -protected: - btVector3 m_worldAabbMin; // overall system bounds - btVector3 m_worldAabbMax; // overall system bounds - - btVector3 m_quantize; // scaling factor for quantization - - BP_FP_INT_TYPE m_numHandles; // number of active handles - BP_FP_INT_TYPE m_maxHandles; // max number of handles - Handle* m_pHandles; // handles pool - - BP_FP_INT_TYPE m_firstFreeHandle; // free handles list - - Edge* m_pEdges[3]; // edge arrays for the 3 axes (each array has m_maxHandles * 2 + 2 sentinel entries) - void* m_pEdgesRawPtr[3]; - - btOverlappingPairCache* m_pairCache; - - ///btOverlappingPairCallback is an additional optional user callback for adding/removing overlapping pairs, similar interface to btOverlappingPairCache. - btOverlappingPairCallback* m_userPairCallback; - - bool m_ownsPairCache; - - int m_invalidPair; - - ///additional dynamic aabb structure, used to accelerate ray cast queries. - ///can be disabled using a optional argument in the constructor - btDbvtBroadphase* m_raycastAccelerator; - btOverlappingPairCache* m_nullPairCache; - - // allocation/deallocation - BP_FP_INT_TYPE allocHandle(); - void freeHandle(BP_FP_INT_TYPE handle); - - bool testOverlap2D(const Handle* pHandleA, const Handle* pHandleB, int axis0, int axis1); - -#ifdef DEBUG_BROADPHASE - void debugPrintAxis(int axis, bool checkCardinality = true); -#endif //DEBUG_BROADPHASE - - //Overlap* AddOverlap(BP_FP_INT_TYPE handleA, BP_FP_INT_TYPE handleB); - //void RemoveOverlap(BP_FP_INT_TYPE handleA, BP_FP_INT_TYPE handleB); - - void sortMinDown(int axis, BP_FP_INT_TYPE edge, btDispatcher* dispatcher, bool updateOverlaps); - void sortMinUp(int axis, BP_FP_INT_TYPE edge, btDispatcher* dispatcher, bool updateOverlaps); - void sortMaxDown(int axis, BP_FP_INT_TYPE edge, btDispatcher* dispatcher, bool updateOverlaps); - void sortMaxUp(int axis, BP_FP_INT_TYPE edge, btDispatcher* dispatcher, bool updateOverlaps); - -public: - btAxisSweep3Internal(const btVector3& worldAabbMin, const btVector3& worldAabbMax, BP_FP_INT_TYPE handleMask, BP_FP_INT_TYPE handleSentinel, BP_FP_INT_TYPE maxHandles = 16384, btOverlappingPairCache* pairCache = 0, bool disableRaycastAccelerator = false); - - virtual ~btAxisSweep3Internal(); - - BP_FP_INT_TYPE getNumHandles() const - { - return m_numHandles; - } - - virtual void calculateOverlappingPairs(btDispatcher* dispatcher); - - BP_FP_INT_TYPE addHandle(const btVector3& aabbMin, const btVector3& aabbMax, void* pOwner, int collisionFilterGroup, int collisionFilterMask, btDispatcher* dispatcher); - void removeHandle(BP_FP_INT_TYPE handle, btDispatcher* dispatcher); - void updateHandle(BP_FP_INT_TYPE handle, const btVector3& aabbMin, const btVector3& aabbMax, btDispatcher* dispatcher); - SIMD_FORCE_INLINE Handle* getHandle(BP_FP_INT_TYPE index) const { return m_pHandles + index; } - - virtual void resetPool(btDispatcher* dispatcher); - - void processAllOverlappingPairs(btOverlapCallback* callback); - - //Broadphase Interface - virtual btBroadphaseProxy* createProxy(const btVector3& aabbMin, const btVector3& aabbMax, int shapeType, void* userPtr, int collisionFilterGroup, int collisionFilterMask, btDispatcher* dispatcher); - virtual void destroyProxy(btBroadphaseProxy* proxy, btDispatcher* dispatcher); - virtual void setAabb(btBroadphaseProxy* proxy, const btVector3& aabbMin, const btVector3& aabbMax, btDispatcher* dispatcher); - virtual void getAabb(btBroadphaseProxy* proxy, btVector3& aabbMin, btVector3& aabbMax) const; - - virtual void rayTest(const btVector3& rayFrom, const btVector3& rayTo, btBroadphaseRayCallback& rayCallback, const btVector3& aabbMin = btVector3(0, 0, 0), const btVector3& aabbMax = btVector3(0, 0, 0)); - virtual void aabbTest(const btVector3& aabbMin, const btVector3& aabbMax, btBroadphaseAabbCallback& callback); - - void quantize(BP_FP_INT_TYPE* out, const btVector3& point, int isMax) const; - ///unQuantize should be conservative: aabbMin/aabbMax should be larger then 'getAabb' result - void unQuantize(btBroadphaseProxy* proxy, btVector3& aabbMin, btVector3& aabbMax) const; - - bool testAabbOverlap(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1); - - btOverlappingPairCache* getOverlappingPairCache() - { - return m_pairCache; - } - const btOverlappingPairCache* getOverlappingPairCache() const - { - return m_pairCache; - } - - void setOverlappingPairUserCallback(btOverlappingPairCallback* pairCallback) - { - m_userPairCallback = pairCallback; - } - const btOverlappingPairCallback* getOverlappingPairUserCallback() const - { - return m_userPairCallback; - } - - ///getAabb returns the axis aligned bounding box in the 'global' coordinate frame - ///will add some transform later - virtual void getBroadphaseAabb(btVector3& aabbMin, btVector3& aabbMax) const - { - aabbMin = m_worldAabbMin; - aabbMax = m_worldAabbMax; - } - - virtual void printStats() - { - /* printf("btAxisSweep3.h\n"); - printf("numHandles = %d, maxHandles = %d\n",m_numHandles,m_maxHandles); - printf("aabbMin=%f,%f,%f,aabbMax=%f,%f,%f\n",m_worldAabbMin.getX(),m_worldAabbMin.getY(),m_worldAabbMin.getZ(), - m_worldAabbMax.getX(),m_worldAabbMax.getY(),m_worldAabbMax.getZ()); - */ - } -}; - -//////////////////////////////////////////////////////////////////// - -#ifdef DEBUG_BROADPHASE -#include - -template -void btAxisSweep3::debugPrintAxis(int axis, bool checkCardinality) -{ - int numEdges = m_pHandles[0].m_maxEdges[axis]; - printf("SAP Axis %d, numEdges=%d\n", axis, numEdges); - - int i; - for (i = 0; i < numEdges + 1; i++) - { - Edge* pEdge = m_pEdges[axis] + i; - Handle* pHandlePrev = getHandle(pEdge->m_handle); - int handleIndex = pEdge->IsMax() ? pHandlePrev->m_maxEdges[axis] : pHandlePrev->m_minEdges[axis]; - char beginOrEnd; - beginOrEnd = pEdge->IsMax() ? 'E' : 'B'; - printf(" [%c,h=%d,p=%x,i=%d]\n", beginOrEnd, pEdge->m_handle, pEdge->m_pos, handleIndex); - } - - if (checkCardinality) - btAssert(numEdges == m_numHandles * 2 + 1); -} -#endif //DEBUG_BROADPHASE - -template -btBroadphaseProxy* btAxisSweep3Internal::createProxy(const btVector3& aabbMin, const btVector3& aabbMax, int shapeType, void* userPtr, int collisionFilterGroup, int collisionFilterMask, btDispatcher* dispatcher) -{ - (void)shapeType; - BP_FP_INT_TYPE handleId = addHandle(aabbMin, aabbMax, userPtr, collisionFilterGroup, collisionFilterMask, dispatcher); - - Handle* handle = getHandle(handleId); - - if (m_raycastAccelerator) - { - btBroadphaseProxy* rayProxy = m_raycastAccelerator->createProxy(aabbMin, aabbMax, shapeType, userPtr, collisionFilterGroup, collisionFilterMask, dispatcher); - handle->m_dbvtProxy = rayProxy; - } - return handle; -} - -template -void btAxisSweep3Internal::destroyProxy(btBroadphaseProxy* proxy, btDispatcher* dispatcher) -{ - Handle* handle = static_cast(proxy); - if (m_raycastAccelerator) - m_raycastAccelerator->destroyProxy(handle->m_dbvtProxy, dispatcher); - removeHandle(static_cast(handle->m_uniqueId), dispatcher); -} - -template -void btAxisSweep3Internal::setAabb(btBroadphaseProxy* proxy, const btVector3& aabbMin, const btVector3& aabbMax, btDispatcher* dispatcher) -{ - Handle* handle = static_cast(proxy); - handle->m_aabbMin = aabbMin; - handle->m_aabbMax = aabbMax; - updateHandle(static_cast(handle->m_uniqueId), aabbMin, aabbMax, dispatcher); - if (m_raycastAccelerator) - m_raycastAccelerator->setAabb(handle->m_dbvtProxy, aabbMin, aabbMax, dispatcher); -} - -template -void btAxisSweep3Internal::rayTest(const btVector3& rayFrom, const btVector3& rayTo, btBroadphaseRayCallback& rayCallback, const btVector3& aabbMin, const btVector3& aabbMax) -{ - if (m_raycastAccelerator) - { - m_raycastAccelerator->rayTest(rayFrom, rayTo, rayCallback, aabbMin, aabbMax); - } - else - { - //choose axis? - BP_FP_INT_TYPE axis = 0; - //for each proxy - for (BP_FP_INT_TYPE i = 1; i < m_numHandles * 2 + 1; i++) - { - if (m_pEdges[axis][i].IsMax()) - { - rayCallback.process(getHandle(m_pEdges[axis][i].m_handle)); - } - } - } -} - -template -void btAxisSweep3Internal::aabbTest(const btVector3& aabbMin, const btVector3& aabbMax, btBroadphaseAabbCallback& callback) -{ - if (m_raycastAccelerator) - { - m_raycastAccelerator->aabbTest(aabbMin, aabbMax, callback); - } - else - { - //choose axis? - BP_FP_INT_TYPE axis = 0; - //for each proxy - for (BP_FP_INT_TYPE i = 1; i < m_numHandles * 2 + 1; i++) - { - if (m_pEdges[axis][i].IsMax()) - { - Handle* handle = getHandle(m_pEdges[axis][i].m_handle); - if (TestAabbAgainstAabb2(aabbMin, aabbMax, handle->m_aabbMin, handle->m_aabbMax)) - { - callback.process(handle); - } - } - } - } -} - -template -void btAxisSweep3Internal::getAabb(btBroadphaseProxy* proxy, btVector3& aabbMin, btVector3& aabbMax) const -{ - Handle* pHandle = static_cast(proxy); - aabbMin = pHandle->m_aabbMin; - aabbMax = pHandle->m_aabbMax; -} - -template -void btAxisSweep3Internal::unQuantize(btBroadphaseProxy* proxy, btVector3& aabbMin, btVector3& aabbMax) const -{ - Handle* pHandle = static_cast(proxy); - - unsigned short vecInMin[3]; - unsigned short vecInMax[3]; - - vecInMin[0] = m_pEdges[0][pHandle->m_minEdges[0]].m_pos; - vecInMax[0] = m_pEdges[0][pHandle->m_maxEdges[0]].m_pos + 1; - vecInMin[1] = m_pEdges[1][pHandle->m_minEdges[1]].m_pos; - vecInMax[1] = m_pEdges[1][pHandle->m_maxEdges[1]].m_pos + 1; - vecInMin[2] = m_pEdges[2][pHandle->m_minEdges[2]].m_pos; - vecInMax[2] = m_pEdges[2][pHandle->m_maxEdges[2]].m_pos + 1; - - aabbMin.setValue((btScalar)(vecInMin[0]) / (m_quantize.getX()), (btScalar)(vecInMin[1]) / (m_quantize.getY()), (btScalar)(vecInMin[2]) / (m_quantize.getZ())); - aabbMin += m_worldAabbMin; - - aabbMax.setValue((btScalar)(vecInMax[0]) / (m_quantize.getX()), (btScalar)(vecInMax[1]) / (m_quantize.getY()), (btScalar)(vecInMax[2]) / (m_quantize.getZ())); - aabbMax += m_worldAabbMin; -} - -template -btAxisSweep3Internal::btAxisSweep3Internal(const btVector3& worldAabbMin, const btVector3& worldAabbMax, BP_FP_INT_TYPE handleMask, BP_FP_INT_TYPE handleSentinel, BP_FP_INT_TYPE userMaxHandles, btOverlappingPairCache* pairCache, bool disableRaycastAccelerator) - : m_bpHandleMask(handleMask), - m_handleSentinel(handleSentinel), - m_pairCache(pairCache), - m_userPairCallback(0), - m_ownsPairCache(false), - m_invalidPair(0), - m_raycastAccelerator(0) -{ - BP_FP_INT_TYPE maxHandles = static_cast(userMaxHandles + 1); //need to add one sentinel handle - - if (!m_pairCache) - { - void* ptr = btAlignedAlloc(sizeof(btHashedOverlappingPairCache), 16); - m_pairCache = new (ptr) btHashedOverlappingPairCache(); - m_ownsPairCache = true; - } - - if (!disableRaycastAccelerator) - { - m_nullPairCache = new (btAlignedAlloc(sizeof(btNullPairCache), 16)) btNullPairCache(); - m_raycastAccelerator = new (btAlignedAlloc(sizeof(btDbvtBroadphase), 16)) btDbvtBroadphase(m_nullPairCache); //m_pairCache); - m_raycastAccelerator->m_deferedcollide = true; //don't add/remove pairs - } - - //btAssert(bounds.HasVolume()); - - // init bounds - m_worldAabbMin = worldAabbMin; - m_worldAabbMax = worldAabbMax; - - btVector3 aabbSize = m_worldAabbMax - m_worldAabbMin; - - BP_FP_INT_TYPE maxInt = m_handleSentinel; - - m_quantize = btVector3(btScalar(maxInt), btScalar(maxInt), btScalar(maxInt)) / aabbSize; - - // allocate handles buffer, using btAlignedAlloc, and put all handles on free list - m_pHandles = new Handle[maxHandles]; - - m_maxHandles = maxHandles; - m_numHandles = 0; - - // handle 0 is reserved as the null index, and is also used as the sentinel - m_firstFreeHandle = 1; - { - for (BP_FP_INT_TYPE i = m_firstFreeHandle; i < maxHandles; i++) - m_pHandles[i].SetNextFree(static_cast(i + 1)); - m_pHandles[maxHandles - 1].SetNextFree(0); - } - - { - // allocate edge buffers - for (int i = 0; i < 3; i++) - { - m_pEdgesRawPtr[i] = btAlignedAlloc(sizeof(Edge) * maxHandles * 2, 16); - m_pEdges[i] = new (m_pEdgesRawPtr[i]) Edge[maxHandles * 2]; - } - } - //removed overlap management - - // make boundary sentinels - - m_pHandles[0].m_clientObject = 0; - - for (int axis = 0; axis < 3; axis++) - { - m_pHandles[0].m_minEdges[axis] = 0; - m_pHandles[0].m_maxEdges[axis] = 1; - - m_pEdges[axis][0].m_pos = 0; - m_pEdges[axis][0].m_handle = 0; - m_pEdges[axis][1].m_pos = m_handleSentinel; - m_pEdges[axis][1].m_handle = 0; -#ifdef DEBUG_BROADPHASE - debugPrintAxis(axis); -#endif //DEBUG_BROADPHASE - } -} - -template -btAxisSweep3Internal::~btAxisSweep3Internal() -{ - if (m_raycastAccelerator) - { - m_nullPairCache->~btOverlappingPairCache(); - btAlignedFree(m_nullPairCache); - m_raycastAccelerator->~btDbvtBroadphase(); - btAlignedFree(m_raycastAccelerator); - } - - for (int i = 2; i >= 0; i--) - { - btAlignedFree(m_pEdgesRawPtr[i]); - } - delete[] m_pHandles; - - if (m_ownsPairCache) - { - m_pairCache->~btOverlappingPairCache(); - btAlignedFree(m_pairCache); - } -} - -template -void btAxisSweep3Internal::quantize(BP_FP_INT_TYPE* out, const btVector3& point, int isMax) const -{ -#ifdef OLD_CLAMPING_METHOD - ///problem with this clamping method is that the floating point during quantization might still go outside the range [(0|isMax) .. (m_handleSentinel&m_bpHandleMask]|isMax] - ///see http://code.google.com/p/bullet/issues/detail?id=87 - btVector3 clampedPoint(point); - clampedPoint.setMax(m_worldAabbMin); - clampedPoint.setMin(m_worldAabbMax); - btVector3 v = (clampedPoint - m_worldAabbMin) * m_quantize; - out[0] = (BP_FP_INT_TYPE)(((BP_FP_INT_TYPE)v.getX() & m_bpHandleMask) | isMax); - out[1] = (BP_FP_INT_TYPE)(((BP_FP_INT_TYPE)v.getY() & m_bpHandleMask) | isMax); - out[2] = (BP_FP_INT_TYPE)(((BP_FP_INT_TYPE)v.getZ() & m_bpHandleMask) | isMax); -#else - btVector3 v = (point - m_worldAabbMin) * m_quantize; - out[0] = (v[0] <= 0) ? (BP_FP_INT_TYPE)isMax : (v[0] >= m_handleSentinel) ? (BP_FP_INT_TYPE)((m_handleSentinel & m_bpHandleMask) | isMax) : (BP_FP_INT_TYPE)(((BP_FP_INT_TYPE)v[0] & m_bpHandleMask) | isMax); - out[1] = (v[1] <= 0) ? (BP_FP_INT_TYPE)isMax : (v[1] >= m_handleSentinel) ? (BP_FP_INT_TYPE)((m_handleSentinel & m_bpHandleMask) | isMax) : (BP_FP_INT_TYPE)(((BP_FP_INT_TYPE)v[1] & m_bpHandleMask) | isMax); - out[2] = (v[2] <= 0) ? (BP_FP_INT_TYPE)isMax : (v[2] >= m_handleSentinel) ? (BP_FP_INT_TYPE)((m_handleSentinel & m_bpHandleMask) | isMax) : (BP_FP_INT_TYPE)(((BP_FP_INT_TYPE)v[2] & m_bpHandleMask) | isMax); -#endif //OLD_CLAMPING_METHOD -} - -template -BP_FP_INT_TYPE btAxisSweep3Internal::allocHandle() -{ - btAssert(m_firstFreeHandle); - - BP_FP_INT_TYPE handle = m_firstFreeHandle; - m_firstFreeHandle = getHandle(handle)->GetNextFree(); - m_numHandles++; - - return handle; -} - -template -void btAxisSweep3Internal::freeHandle(BP_FP_INT_TYPE handle) -{ - btAssert(handle > 0 && handle < m_maxHandles); - - getHandle(handle)->SetNextFree(m_firstFreeHandle); - m_firstFreeHandle = handle; - - m_numHandles--; -} - -template -BP_FP_INT_TYPE btAxisSweep3Internal::addHandle(const btVector3& aabbMin, const btVector3& aabbMax, void* pOwner, int collisionFilterGroup, int collisionFilterMask, btDispatcher* dispatcher) -{ - // quantize the bounds - BP_FP_INT_TYPE min[3], max[3]; - quantize(min, aabbMin, 0); - quantize(max, aabbMax, 1); - - // allocate a handle - BP_FP_INT_TYPE handle = allocHandle(); - - Handle* pHandle = getHandle(handle); - - pHandle->m_uniqueId = static_cast(handle); - //pHandle->m_pOverlaps = 0; - pHandle->m_clientObject = pOwner; - pHandle->m_collisionFilterGroup = collisionFilterGroup; - pHandle->m_collisionFilterMask = collisionFilterMask; - - // compute current limit of edge arrays - BP_FP_INT_TYPE limit = static_cast(m_numHandles * 2); - - // insert new edges just inside the max boundary edge - for (BP_FP_INT_TYPE axis = 0; axis < 3; axis++) - { - m_pHandles[0].m_maxEdges[axis] += 2; - - m_pEdges[axis][limit + 1] = m_pEdges[axis][limit - 1]; - - m_pEdges[axis][limit - 1].m_pos = min[axis]; - m_pEdges[axis][limit - 1].m_handle = handle; - - m_pEdges[axis][limit].m_pos = max[axis]; - m_pEdges[axis][limit].m_handle = handle; - - pHandle->m_minEdges[axis] = static_cast(limit - 1); - pHandle->m_maxEdges[axis] = limit; - } - - // now sort the new edges to their correct position - sortMinDown(0, pHandle->m_minEdges[0], dispatcher, false); - sortMaxDown(0, pHandle->m_maxEdges[0], dispatcher, false); - sortMinDown(1, pHandle->m_minEdges[1], dispatcher, false); - sortMaxDown(1, pHandle->m_maxEdges[1], dispatcher, false); - sortMinDown(2, pHandle->m_minEdges[2], dispatcher, true); - sortMaxDown(2, pHandle->m_maxEdges[2], dispatcher, true); - - return handle; -} - -template -void btAxisSweep3Internal::removeHandle(BP_FP_INT_TYPE handle, btDispatcher* dispatcher) -{ - Handle* pHandle = getHandle(handle); - - //explicitly remove the pairs containing the proxy - //we could do it also in the sortMinUp (passing true) - ///@todo: compare performance - if (!m_pairCache->hasDeferredRemoval()) - { - m_pairCache->removeOverlappingPairsContainingProxy(pHandle, dispatcher); - } - - // compute current limit of edge arrays - int limit = static_cast(m_numHandles * 2); - - int axis; - - for (axis = 0; axis < 3; axis++) - { - m_pHandles[0].m_maxEdges[axis] -= 2; - } - - // remove the edges by sorting them up to the end of the list - for (axis = 0; axis < 3; axis++) - { - Edge* pEdges = m_pEdges[axis]; - BP_FP_INT_TYPE max = pHandle->m_maxEdges[axis]; - pEdges[max].m_pos = m_handleSentinel; - - sortMaxUp(axis, max, dispatcher, false); - - BP_FP_INT_TYPE i = pHandle->m_minEdges[axis]; - pEdges[i].m_pos = m_handleSentinel; - - sortMinUp(axis, i, dispatcher, false); - - pEdges[limit - 1].m_handle = 0; - pEdges[limit - 1].m_pos = m_handleSentinel; - -#ifdef DEBUG_BROADPHASE - debugPrintAxis(axis, false); -#endif //DEBUG_BROADPHASE - } - - // free the handle - freeHandle(handle); -} - -template -void btAxisSweep3Internal::resetPool(btDispatcher* /*dispatcher*/) -{ - if (m_numHandles == 0) - { - m_firstFreeHandle = 1; - { - for (BP_FP_INT_TYPE i = m_firstFreeHandle; i < m_maxHandles; i++) - m_pHandles[i].SetNextFree(static_cast(i + 1)); - m_pHandles[m_maxHandles - 1].SetNextFree(0); - } - } -} - -//#include - -template -void btAxisSweep3Internal::calculateOverlappingPairs(btDispatcher* dispatcher) -{ - if (m_pairCache->hasDeferredRemoval()) - { - btBroadphasePairArray& overlappingPairArray = m_pairCache->getOverlappingPairArray(); - - //perform a sort, to find duplicates and to sort 'invalid' pairs to the end - overlappingPairArray.quickSort(btBroadphasePairSortPredicate()); - - overlappingPairArray.resize(overlappingPairArray.size() - m_invalidPair); - m_invalidPair = 0; - - int i; - - btBroadphasePair previousPair; - previousPair.m_pProxy0 = 0; - previousPair.m_pProxy1 = 0; - previousPair.m_algorithm = 0; - - for (i = 0; i < overlappingPairArray.size(); i++) - { - btBroadphasePair& pair = overlappingPairArray[i]; - - bool isDuplicate = (pair == previousPair); - - previousPair = pair; - - bool needsRemoval = false; - - if (!isDuplicate) - { - ///important to use an AABB test that is consistent with the broadphase - bool hasOverlap = testAabbOverlap(pair.m_pProxy0, pair.m_pProxy1); - - if (hasOverlap) - { - needsRemoval = false; //callback->processOverlap(pair); - } - else - { - needsRemoval = true; - } - } - else - { - //remove duplicate - needsRemoval = true; - //should have no algorithm - btAssert(!pair.m_algorithm); - } - - if (needsRemoval) - { - m_pairCache->cleanOverlappingPair(pair, dispatcher); - - // m_overlappingPairArray.swap(i,m_overlappingPairArray.size()-1); - // m_overlappingPairArray.pop_back(); - pair.m_pProxy0 = 0; - pair.m_pProxy1 = 0; - m_invalidPair++; - } - } - -///if you don't like to skip the invalid pairs in the array, execute following code: -#define CLEAN_INVALID_PAIRS 1 -#ifdef CLEAN_INVALID_PAIRS - - //perform a sort, to sort 'invalid' pairs to the end - overlappingPairArray.quickSort(btBroadphasePairSortPredicate()); - - overlappingPairArray.resize(overlappingPairArray.size() - m_invalidPair); - m_invalidPair = 0; -#endif //CLEAN_INVALID_PAIRS - - //printf("overlappingPairArray.size()=%d\n",overlappingPairArray.size()); - } -} - -template -bool btAxisSweep3Internal::testAabbOverlap(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1) -{ - const Handle* pHandleA = static_cast(proxy0); - const Handle* pHandleB = static_cast(proxy1); - - //optimization 1: check the array index (memory address), instead of the m_pos - - for (int axis = 0; axis < 3; axis++) - { - if (pHandleA->m_maxEdges[axis] < pHandleB->m_minEdges[axis] || - pHandleB->m_maxEdges[axis] < pHandleA->m_minEdges[axis]) - { - return false; - } - } - return true; -} - -template -bool btAxisSweep3Internal::testOverlap2D(const Handle* pHandleA, const Handle* pHandleB, int axis0, int axis1) -{ - //optimization 1: check the array index (memory address), instead of the m_pos - - if (pHandleA->m_maxEdges[axis0] < pHandleB->m_minEdges[axis0] || - pHandleB->m_maxEdges[axis0] < pHandleA->m_minEdges[axis0] || - pHandleA->m_maxEdges[axis1] < pHandleB->m_minEdges[axis1] || - pHandleB->m_maxEdges[axis1] < pHandleA->m_minEdges[axis1]) - { - return false; - } - return true; -} - -template -void btAxisSweep3Internal::updateHandle(BP_FP_INT_TYPE handle, const btVector3& aabbMin, const btVector3& aabbMax, btDispatcher* dispatcher) -{ - // btAssert(bounds.IsFinite()); - //btAssert(bounds.HasVolume()); - - Handle* pHandle = getHandle(handle); - - // quantize the new bounds - BP_FP_INT_TYPE min[3], max[3]; - quantize(min, aabbMin, 0); - quantize(max, aabbMax, 1); - - // update changed edges - for (int axis = 0; axis < 3; axis++) - { - BP_FP_INT_TYPE emin = pHandle->m_minEdges[axis]; - BP_FP_INT_TYPE emax = pHandle->m_maxEdges[axis]; - - int dmin = (int)min[axis] - (int)m_pEdges[axis][emin].m_pos; - int dmax = (int)max[axis] - (int)m_pEdges[axis][emax].m_pos; - - m_pEdges[axis][emin].m_pos = min[axis]; - m_pEdges[axis][emax].m_pos = max[axis]; - - // expand (only adds overlaps) - if (dmin < 0) - sortMinDown(axis, emin, dispatcher, true); - - if (dmax > 0) - sortMaxUp(axis, emax, dispatcher, true); - - // shrink (only removes overlaps) - if (dmin > 0) - sortMinUp(axis, emin, dispatcher, true); - - if (dmax < 0) - sortMaxDown(axis, emax, dispatcher, true); - -#ifdef DEBUG_BROADPHASE - debugPrintAxis(axis); -#endif //DEBUG_BROADPHASE - } -} - -// sorting a min edge downwards can only ever *add* overlaps -template -void btAxisSweep3Internal::sortMinDown(int axis, BP_FP_INT_TYPE edge, btDispatcher* /* dispatcher */, bool updateOverlaps) -{ - Edge* pEdge = m_pEdges[axis] + edge; - Edge* pPrev = pEdge - 1; - Handle* pHandleEdge = getHandle(pEdge->m_handle); - - while (pEdge->m_pos < pPrev->m_pos) - { - Handle* pHandlePrev = getHandle(pPrev->m_handle); - - if (pPrev->IsMax()) - { - // if previous edge is a maximum check the bounds and add an overlap if necessary - const int axis1 = (1 << axis) & 3; - const int axis2 = (1 << axis1) & 3; - if (updateOverlaps && testOverlap2D(pHandleEdge, pHandlePrev, axis1, axis2)) - { - m_pairCache->addOverlappingPair(pHandleEdge, pHandlePrev); - if (m_userPairCallback) - m_userPairCallback->addOverlappingPair(pHandleEdge, pHandlePrev); - - //AddOverlap(pEdge->m_handle, pPrev->m_handle); - } - - // update edge reference in other handle - pHandlePrev->m_maxEdges[axis]++; - } - else - pHandlePrev->m_minEdges[axis]++; - - pHandleEdge->m_minEdges[axis]--; - - // swap the edges - Edge swap = *pEdge; - *pEdge = *pPrev; - *pPrev = swap; - - // decrement - pEdge--; - pPrev--; - } - -#ifdef DEBUG_BROADPHASE - debugPrintAxis(axis); -#endif //DEBUG_BROADPHASE -} - -// sorting a min edge upwards can only ever *remove* overlaps -template -void btAxisSweep3Internal::sortMinUp(int axis, BP_FP_INT_TYPE edge, btDispatcher* dispatcher, bool updateOverlaps) -{ - Edge* pEdge = m_pEdges[axis] + edge; - Edge* pNext = pEdge + 1; - Handle* pHandleEdge = getHandle(pEdge->m_handle); - - while (pNext->m_handle && (pEdge->m_pos >= pNext->m_pos)) - { - Handle* pHandleNext = getHandle(pNext->m_handle); - - if (pNext->IsMax()) - { - Handle* handle0 = getHandle(pEdge->m_handle); - Handle* handle1 = getHandle(pNext->m_handle); - const int axis1 = (1 << axis) & 3; - const int axis2 = (1 << axis1) & 3; - - // if next edge is maximum remove any overlap between the two handles - if (updateOverlaps -#ifdef USE_OVERLAP_TEST_ON_REMOVES - && testOverlap2D(handle0, handle1, axis1, axis2) -#endif //USE_OVERLAP_TEST_ON_REMOVES - ) - { - m_pairCache->removeOverlappingPair(handle0, handle1, dispatcher); - if (m_userPairCallback) - m_userPairCallback->removeOverlappingPair(handle0, handle1, dispatcher); - } - - // update edge reference in other handle - pHandleNext->m_maxEdges[axis]--; - } - else - pHandleNext->m_minEdges[axis]--; - - pHandleEdge->m_minEdges[axis]++; - - // swap the edges - Edge swap = *pEdge; - *pEdge = *pNext; - *pNext = swap; - - // increment - pEdge++; - pNext++; - } -} - -// sorting a max edge downwards can only ever *remove* overlaps -template -void btAxisSweep3Internal::sortMaxDown(int axis, BP_FP_INT_TYPE edge, btDispatcher* dispatcher, bool updateOverlaps) -{ - Edge* pEdge = m_pEdges[axis] + edge; - Edge* pPrev = pEdge - 1; - Handle* pHandleEdge = getHandle(pEdge->m_handle); - - while (pEdge->m_pos < pPrev->m_pos) - { - Handle* pHandlePrev = getHandle(pPrev->m_handle); - - if (!pPrev->IsMax()) - { - // if previous edge was a minimum remove any overlap between the two handles - Handle* handle0 = getHandle(pEdge->m_handle); - Handle* handle1 = getHandle(pPrev->m_handle); - const int axis1 = (1 << axis) & 3; - const int axis2 = (1 << axis1) & 3; - - if (updateOverlaps -#ifdef USE_OVERLAP_TEST_ON_REMOVES - && testOverlap2D(handle0, handle1, axis1, axis2) -#endif //USE_OVERLAP_TEST_ON_REMOVES - ) - { - //this is done during the overlappingpairarray iteration/narrowphase collision - - m_pairCache->removeOverlappingPair(handle0, handle1, dispatcher); - if (m_userPairCallback) - m_userPairCallback->removeOverlappingPair(handle0, handle1, dispatcher); - } - - // update edge reference in other handle - pHandlePrev->m_minEdges[axis]++; - ; - } - else - pHandlePrev->m_maxEdges[axis]++; - - pHandleEdge->m_maxEdges[axis]--; - - // swap the edges - Edge swap = *pEdge; - *pEdge = *pPrev; - *pPrev = swap; - - // decrement - pEdge--; - pPrev--; - } - -#ifdef DEBUG_BROADPHASE - debugPrintAxis(axis); -#endif //DEBUG_BROADPHASE -} - -// sorting a max edge upwards can only ever *add* overlaps -template -void btAxisSweep3Internal::sortMaxUp(int axis, BP_FP_INT_TYPE edge, btDispatcher* /* dispatcher */, bool updateOverlaps) -{ - Edge* pEdge = m_pEdges[axis] + edge; - Edge* pNext = pEdge + 1; - Handle* pHandleEdge = getHandle(pEdge->m_handle); - - while (pNext->m_handle && (pEdge->m_pos >= pNext->m_pos)) - { - Handle* pHandleNext = getHandle(pNext->m_handle); - - const int axis1 = (1 << axis) & 3; - const int axis2 = (1 << axis1) & 3; - - if (!pNext->IsMax()) - { - // if next edge is a minimum check the bounds and add an overlap if necessary - if (updateOverlaps && testOverlap2D(pHandleEdge, pHandleNext, axis1, axis2)) - { - Handle* handle0 = getHandle(pEdge->m_handle); - Handle* handle1 = getHandle(pNext->m_handle); - m_pairCache->addOverlappingPair(handle0, handle1); - if (m_userPairCallback) - m_userPairCallback->addOverlappingPair(handle0, handle1); - } - - // update edge reference in other handle - pHandleNext->m_minEdges[axis]--; - } - else - pHandleNext->m_maxEdges[axis]--; - - pHandleEdge->m_maxEdges[axis]++; - - // swap the edges - Edge swap = *pEdge; - *pEdge = *pNext; - *pNext = swap; - - // increment - pEdge++; - pNext++; - } -} - -#endif diff --git a/engine/inc/bullet/BulletCollision/BroadphaseCollision/btBroadphaseInterface.h b/engine/inc/bullet/BulletCollision/BroadphaseCollision/btBroadphaseInterface.h deleted file mode 100644 index b097eca5..00000000 --- a/engine/inc/bullet/BulletCollision/BroadphaseCollision/btBroadphaseInterface.h +++ /dev/null @@ -1,79 +0,0 @@ -/* -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_BROADPHASE_INTERFACE_H -#define BT_BROADPHASE_INTERFACE_H - -struct btDispatcherInfo; -class btDispatcher; -#include "btBroadphaseProxy.h" - -class btOverlappingPairCache; - -struct btBroadphaseAabbCallback -{ - virtual ~btBroadphaseAabbCallback() {} - virtual bool process(const btBroadphaseProxy* proxy) = 0; -}; - -struct btBroadphaseRayCallback : public btBroadphaseAabbCallback -{ - ///added some cached data to accelerate ray-AABB tests - btVector3 m_rayDirectionInverse; - unsigned int m_signs[3]; - btScalar m_lambda_max; - - virtual ~btBroadphaseRayCallback() {} - -protected: - btBroadphaseRayCallback() {} -}; - -#include "LinearMath/btVector3.h" - -///The btBroadphaseInterface class provides an interface to detect aabb-overlapping object pairs. -///Some implementations for this broadphase interface include btAxisSweep3, bt32BitAxisSweep3 and btDbvtBroadphase. -///The actual overlapping pair management, storage, adding and removing of pairs is dealt by the btOverlappingPairCache class. -class btBroadphaseInterface -{ -public: - virtual ~btBroadphaseInterface() {} - - virtual btBroadphaseProxy* createProxy(const btVector3& aabbMin, const btVector3& aabbMax, int shapeType, void* userPtr, int collisionFilterGroup, int collisionFilterMask, btDispatcher* dispatcher) = 0; - virtual void destroyProxy(btBroadphaseProxy* proxy, btDispatcher* dispatcher) = 0; - virtual void setAabb(btBroadphaseProxy* proxy, const btVector3& aabbMin, const btVector3& aabbMax, btDispatcher* dispatcher) = 0; - virtual void getAabb(btBroadphaseProxy* proxy, btVector3& aabbMin, btVector3& aabbMax) const = 0; - - virtual void rayTest(const btVector3& rayFrom, const btVector3& rayTo, btBroadphaseRayCallback& rayCallback, const btVector3& aabbMin = btVector3(0, 0, 0), const btVector3& aabbMax = btVector3(0, 0, 0)) = 0; - - virtual void aabbTest(const btVector3& aabbMin, const btVector3& aabbMax, btBroadphaseAabbCallback& callback) = 0; - - ///calculateOverlappingPairs is optional: incremental algorithms (sweep and prune) might do it during the set aabb - virtual void calculateOverlappingPairs(btDispatcher* dispatcher) = 0; - - virtual btOverlappingPairCache* getOverlappingPairCache() = 0; - virtual const btOverlappingPairCache* getOverlappingPairCache() const = 0; - - ///getAabb returns the axis aligned bounding box in the 'global' coordinate frame - ///will add some transform later - virtual void getBroadphaseAabb(btVector3& aabbMin, btVector3& aabbMax) const = 0; - - ///reset broadphase internal structures, to ensure determinism/reproducability - virtual void resetPool(btDispatcher* dispatcher) { (void)dispatcher; }; - - virtual void printStats() = 0; -}; - -#endif //BT_BROADPHASE_INTERFACE_H diff --git a/engine/inc/bullet/BulletCollision/BroadphaseCollision/btBroadphaseProxy.h b/engine/inc/bullet/BulletCollision/BroadphaseCollision/btBroadphaseProxy.h deleted file mode 100644 index bc0742ad..00000000 --- a/engine/inc/bullet/BulletCollision/BroadphaseCollision/btBroadphaseProxy.h +++ /dev/null @@ -1,248 +0,0 @@ -/* -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_BROADPHASE_PROXY_H -#define BT_BROADPHASE_PROXY_H - -#include "LinearMath/btScalar.h" //for SIMD_FORCE_INLINE -#include "LinearMath/btVector3.h" -#include "LinearMath/btAlignedAllocator.h" - -/// btDispatcher uses these types -/// IMPORTANT NOTE:The types are ordered polyhedral, implicit convex and concave -/// to facilitate type checking -/// CUSTOM_POLYHEDRAL_SHAPE_TYPE,CUSTOM_CONVEX_SHAPE_TYPE and CUSTOM_CONCAVE_SHAPE_TYPE can be used to extend Bullet without modifying source code -enum BroadphaseNativeTypes -{ - // polyhedral convex shapes - BOX_SHAPE_PROXYTYPE, - TRIANGLE_SHAPE_PROXYTYPE, - TETRAHEDRAL_SHAPE_PROXYTYPE, - CONVEX_TRIANGLEMESH_SHAPE_PROXYTYPE, - CONVEX_HULL_SHAPE_PROXYTYPE, - CONVEX_POINT_CLOUD_SHAPE_PROXYTYPE, - CUSTOM_POLYHEDRAL_SHAPE_TYPE, - //implicit convex shapes - IMPLICIT_CONVEX_SHAPES_START_HERE, - SPHERE_SHAPE_PROXYTYPE, - MULTI_SPHERE_SHAPE_PROXYTYPE, - CAPSULE_SHAPE_PROXYTYPE, - CONE_SHAPE_PROXYTYPE, - CONVEX_SHAPE_PROXYTYPE, - CYLINDER_SHAPE_PROXYTYPE, - UNIFORM_SCALING_SHAPE_PROXYTYPE, - MINKOWSKI_SUM_SHAPE_PROXYTYPE, - MINKOWSKI_DIFFERENCE_SHAPE_PROXYTYPE, - BOX_2D_SHAPE_PROXYTYPE, - CONVEX_2D_SHAPE_PROXYTYPE, - CUSTOM_CONVEX_SHAPE_TYPE, - //concave shapes - CONCAVE_SHAPES_START_HERE, - //keep all the convex shapetype below here, for the check IsConvexShape in broadphase proxy! - TRIANGLE_MESH_SHAPE_PROXYTYPE, - SCALED_TRIANGLE_MESH_SHAPE_PROXYTYPE, - ///used for demo integration FAST/Swift collision library and Bullet - FAST_CONCAVE_MESH_PROXYTYPE, - //terrain - TERRAIN_SHAPE_PROXYTYPE, - ///Used for GIMPACT Trimesh integration - GIMPACT_SHAPE_PROXYTYPE, - ///Multimaterial mesh - MULTIMATERIAL_TRIANGLE_MESH_PROXYTYPE, - - EMPTY_SHAPE_PROXYTYPE, - STATIC_PLANE_PROXYTYPE, - CUSTOM_CONCAVE_SHAPE_TYPE, - SDF_SHAPE_PROXYTYPE = CUSTOM_CONCAVE_SHAPE_TYPE, - CONCAVE_SHAPES_END_HERE, - - COMPOUND_SHAPE_PROXYTYPE, - - SOFTBODY_SHAPE_PROXYTYPE, - HFFLUID_SHAPE_PROXYTYPE, - HFFLUID_BUOYANT_CONVEX_SHAPE_PROXYTYPE, - INVALID_SHAPE_PROXYTYPE, - - MAX_BROADPHASE_COLLISION_TYPES - -}; - -///The btBroadphaseProxy is the main class that can be used with the Bullet broadphases. -///It stores collision shape type information, collision filter information and a client object, typically a btCollisionObject or btRigidBody. -ATTRIBUTE_ALIGNED16(struct) -btBroadphaseProxy -{ - BT_DECLARE_ALIGNED_ALLOCATOR(); - - ///optional filtering to cull potential collisions - enum CollisionFilterGroups - { - DefaultFilter = 1, - StaticFilter = 2, - KinematicFilter = 4, - DebrisFilter = 8, - SensorTrigger = 16, - CharacterFilter = 32, - AllFilter = -1 //all bits sets: DefaultFilter | StaticFilter | KinematicFilter | DebrisFilter | SensorTrigger - }; - - //Usually the client btCollisionObject or Rigidbody class - void* m_clientObject; - int m_collisionFilterGroup; - int m_collisionFilterMask; - - int m_uniqueId; //m_uniqueId is introduced for paircache. could get rid of this, by calculating the address offset etc. - - btVector3 m_aabbMin; - btVector3 m_aabbMax; - - SIMD_FORCE_INLINE int getUid() const - { - return m_uniqueId; - } - - //used for memory pools - btBroadphaseProxy() : m_clientObject(0) - { - } - - btBroadphaseProxy(const btVector3& aabbMin, const btVector3& aabbMax, void* userPtr, int collisionFilterGroup, int collisionFilterMask) - : m_clientObject(userPtr), - m_collisionFilterGroup(collisionFilterGroup), - m_collisionFilterMask(collisionFilterMask), - m_aabbMin(aabbMin), - m_aabbMax(aabbMax) - { - } - - static SIMD_FORCE_INLINE bool isPolyhedral(int proxyType) - { - return (proxyType < IMPLICIT_CONVEX_SHAPES_START_HERE); - } - - static SIMD_FORCE_INLINE bool isConvex(int proxyType) - { - return (proxyType < CONCAVE_SHAPES_START_HERE); - } - - static SIMD_FORCE_INLINE bool isNonMoving(int proxyType) - { - return (isConcave(proxyType) && !(proxyType == GIMPACT_SHAPE_PROXYTYPE)); - } - - static SIMD_FORCE_INLINE bool isConcave(int proxyType) - { - return ((proxyType > CONCAVE_SHAPES_START_HERE) && - (proxyType < CONCAVE_SHAPES_END_HERE)); - } - static SIMD_FORCE_INLINE bool isCompound(int proxyType) - { - return (proxyType == COMPOUND_SHAPE_PROXYTYPE); - } - - static SIMD_FORCE_INLINE bool isSoftBody(int proxyType) - { - return (proxyType == SOFTBODY_SHAPE_PROXYTYPE); - } - - static SIMD_FORCE_INLINE bool isInfinite(int proxyType) - { - return (proxyType == STATIC_PLANE_PROXYTYPE); - } - - static SIMD_FORCE_INLINE bool isConvex2d(int proxyType) - { - return (proxyType == BOX_2D_SHAPE_PROXYTYPE) || (proxyType == CONVEX_2D_SHAPE_PROXYTYPE); - } -}; - -class btCollisionAlgorithm; - -struct btBroadphaseProxy; - -///The btBroadphasePair class contains a pair of aabb-overlapping objects. -///A btDispatcher can search a btCollisionAlgorithm that performs exact/narrowphase collision detection on the actual collision shapes. -ATTRIBUTE_ALIGNED16(struct) -btBroadphasePair -{ - btBroadphasePair() - : m_pProxy0(0), - m_pProxy1(0), - m_algorithm(0), - m_internalInfo1(0) - { - } - - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btBroadphasePair(btBroadphaseProxy & proxy0, btBroadphaseProxy & proxy1) - { - //keep them sorted, so the std::set operations work - if (proxy0.m_uniqueId < proxy1.m_uniqueId) - { - m_pProxy0 = &proxy0; - m_pProxy1 = &proxy1; - } - else - { - m_pProxy0 = &proxy1; - m_pProxy1 = &proxy0; - } - - m_algorithm = 0; - m_internalInfo1 = 0; - } - - btBroadphaseProxy* m_pProxy0; - btBroadphaseProxy* m_pProxy1; - - mutable btCollisionAlgorithm* m_algorithm; - union { - void* m_internalInfo1; - int m_internalTmpValue; - }; //don't use this data, it will be removed in future version. -}; - -/* -//comparison for set operation, see Solid DT_Encounter -SIMD_FORCE_INLINE bool operator<(const btBroadphasePair& a, const btBroadphasePair& b) -{ - return a.m_pProxy0 < b.m_pProxy0 || - (a.m_pProxy0 == b.m_pProxy0 && a.m_pProxy1 < b.m_pProxy1); -} -*/ - -class btBroadphasePairSortPredicate -{ -public: - bool operator()(const btBroadphasePair& a, const btBroadphasePair& b) const - { - const int uidA0 = a.m_pProxy0 ? a.m_pProxy0->m_uniqueId : -1; - const int uidB0 = b.m_pProxy0 ? b.m_pProxy0->m_uniqueId : -1; - const int uidA1 = a.m_pProxy1 ? a.m_pProxy1->m_uniqueId : -1; - const int uidB1 = b.m_pProxy1 ? b.m_pProxy1->m_uniqueId : -1; - - return uidA0 > uidB0 || - (a.m_pProxy0 == b.m_pProxy0 && uidA1 > uidB1) || - (a.m_pProxy0 == b.m_pProxy0 && a.m_pProxy1 == b.m_pProxy1 && a.m_algorithm > b.m_algorithm); - } -}; - -SIMD_FORCE_INLINE bool operator==(const btBroadphasePair& a, const btBroadphasePair& b) -{ - return (a.m_pProxy0 == b.m_pProxy0) && (a.m_pProxy1 == b.m_pProxy1); -} - -#endif //BT_BROADPHASE_PROXY_H diff --git a/engine/inc/bullet/BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h b/engine/inc/bullet/BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h deleted file mode 100644 index b00c0b1b..00000000 --- a/engine/inc/bullet/BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h +++ /dev/null @@ -1,75 +0,0 @@ -/* -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_COLLISION_ALGORITHM_H -#define BT_COLLISION_ALGORITHM_H - -#include "LinearMath/btScalar.h" -#include "LinearMath/btAlignedObjectArray.h" - -struct btBroadphaseProxy; -class btDispatcher; -class btManifoldResult; -class btCollisionObject; -struct btCollisionObjectWrapper; -struct btDispatcherInfo; -class btPersistentManifold; - -typedef btAlignedObjectArray btManifoldArray; - -struct btCollisionAlgorithmConstructionInfo -{ - btCollisionAlgorithmConstructionInfo() - : m_dispatcher1(0), - m_manifold(0) - { - } - btCollisionAlgorithmConstructionInfo(btDispatcher* dispatcher, int temp) - : m_dispatcher1(dispatcher) - { - (void)temp; - } - - btDispatcher* m_dispatcher1; - btPersistentManifold* m_manifold; - - // int getDispatcherId(); -}; - -///btCollisionAlgorithm is an collision interface that is compatible with the Broadphase and btDispatcher. -///It is persistent over frames -class btCollisionAlgorithm -{ -protected: - btDispatcher* m_dispatcher; - -protected: - // int getDispatcherId(); - -public: - btCollisionAlgorithm(){}; - - btCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci); - - virtual ~btCollisionAlgorithm(){}; - - virtual void processCollision(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut) = 0; - - virtual btScalar calculateTimeOfImpact(btCollisionObject* body0, btCollisionObject* body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut) = 0; - - virtual void getAllContactManifolds(btManifoldArray& manifoldArray) = 0; -}; - -#endif //BT_COLLISION_ALGORITHM_H diff --git a/engine/inc/bullet/BulletCollision/BroadphaseCollision/btDbvt.h b/engine/inc/bullet/BulletCollision/BroadphaseCollision/btDbvt.h deleted file mode 100644 index 55daa7fb..00000000 --- a/engine/inc/bullet/BulletCollision/BroadphaseCollision/btDbvt.h +++ /dev/null @@ -1,1578 +0,0 @@ -/* -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. -*/ -///btDbvt implementation by Nathanael Presson - -#ifndef BT_DYNAMIC_BOUNDING_VOLUME_TREE_H -#define BT_DYNAMIC_BOUNDING_VOLUME_TREE_H - -#include "LinearMath/btAlignedObjectArray.h" -#include "LinearMath/btVector3.h" -#include "LinearMath/btTransform.h" -#include "LinearMath/btAabbUtil2.h" -// -// Compile time configuration -// - -// Implementation profiles -#define DBVT_IMPL_GENERIC 0 // Generic implementation -#define DBVT_IMPL_SSE 1 // SSE - -// Template implementation of ICollide -#ifdef _WIN32 -#if (defined(_MSC_VER) && _MSC_VER >= 1400) -#define DBVT_USE_TEMPLATE 1 -#else -#define DBVT_USE_TEMPLATE 0 -#endif -#else -#define DBVT_USE_TEMPLATE 0 -#endif - -// Use only intrinsics instead of inline asm -#define DBVT_USE_INTRINSIC_SSE 1 - -// Using memmov for collideOCL -#define DBVT_USE_MEMMOVE 1 - -// Enable benchmarking code -#define DBVT_ENABLE_BENCHMARK 0 - -// Inlining -#define DBVT_INLINE SIMD_FORCE_INLINE - -// Specific methods implementation - -//SSE gives errors on a MSVC 7.1 -#if defined(BT_USE_SSE) //&& defined (_WIN32) -#define DBVT_SELECT_IMPL DBVT_IMPL_SSE -#define DBVT_MERGE_IMPL DBVT_IMPL_SSE -#define DBVT_INT0_IMPL DBVT_IMPL_SSE -#else -#define DBVT_SELECT_IMPL DBVT_IMPL_GENERIC -#define DBVT_MERGE_IMPL DBVT_IMPL_GENERIC -#define DBVT_INT0_IMPL DBVT_IMPL_GENERIC -#endif - -#if (DBVT_SELECT_IMPL == DBVT_IMPL_SSE) || \ - (DBVT_MERGE_IMPL == DBVT_IMPL_SSE) || \ - (DBVT_INT0_IMPL == DBVT_IMPL_SSE) -#include -#endif - -// -// Auto config and checks -// - -#if DBVT_USE_TEMPLATE -#define DBVT_VIRTUAL -#define DBVT_VIRTUAL_DTOR(a) -#define DBVT_PREFIX template -#define DBVT_IPOLICY T& policy -#define DBVT_CHECKTYPE \ - static const ICollide& typechecker = *(T*)1; \ - (void)typechecker; -#else -#define DBVT_VIRTUAL_DTOR(a) \ - virtual ~a() {} -#define DBVT_VIRTUAL virtual -#define DBVT_PREFIX -#define DBVT_IPOLICY ICollide& policy -#define DBVT_CHECKTYPE -#endif - -#if DBVT_USE_MEMMOVE -#if !defined(__CELLOS_LV2__) && !defined(__MWERKS__) -#include -#endif -#include -#endif - -#ifndef DBVT_USE_TEMPLATE -#error "DBVT_USE_TEMPLATE undefined" -#endif - -#ifndef DBVT_USE_MEMMOVE -#error "DBVT_USE_MEMMOVE undefined" -#endif - -#ifndef DBVT_ENABLE_BENCHMARK -#error "DBVT_ENABLE_BENCHMARK undefined" -#endif - -#ifndef DBVT_SELECT_IMPL -#error "DBVT_SELECT_IMPL undefined" -#endif - -#ifndef DBVT_MERGE_IMPL -#error "DBVT_MERGE_IMPL undefined" -#endif - -#ifndef DBVT_INT0_IMPL -#error "DBVT_INT0_IMPL undefined" -#endif - -// -// Defaults volumes -// - -/* btDbvtAabbMm */ -struct btDbvtAabbMm -{ - DBVT_INLINE btDbvtAabbMm(){} - DBVT_INLINE btVector3 Center() const { return ((mi + mx) / 2); } - DBVT_INLINE btVector3 Lengths() const { return (mx - mi); } - DBVT_INLINE btVector3 Extents() const { return ((mx - mi) / 2); } - DBVT_INLINE const btVector3& Mins() const { return (mi); } - DBVT_INLINE const btVector3& Maxs() const { return (mx); } - static inline btDbvtAabbMm FromCE(const btVector3& c, const btVector3& e); - static inline btDbvtAabbMm FromCR(const btVector3& c, btScalar r); - static inline btDbvtAabbMm FromMM(const btVector3& mi, const btVector3& mx); - static inline btDbvtAabbMm FromPoints(const btVector3* pts, int n); - static inline btDbvtAabbMm FromPoints(const btVector3** ppts, int n); - DBVT_INLINE void Expand(const btVector3& e); - DBVT_INLINE void SignedExpand(const btVector3& e); - DBVT_INLINE bool Contain(const btDbvtAabbMm& a) const; - DBVT_INLINE int Classify(const btVector3& n, btScalar o, int s) const; - DBVT_INLINE btScalar ProjectMinimum(const btVector3& v, unsigned signs) const; - DBVT_INLINE friend bool Intersect(const btDbvtAabbMm& a, - const btDbvtAabbMm& b); - - DBVT_INLINE friend bool Intersect(const btDbvtAabbMm& a, - const btVector3& b); - - DBVT_INLINE friend btScalar Proximity(const btDbvtAabbMm& a, - const btDbvtAabbMm& b); - DBVT_INLINE friend int Select(const btDbvtAabbMm& o, - const btDbvtAabbMm& a, - const btDbvtAabbMm& b); - DBVT_INLINE friend void Merge(const btDbvtAabbMm& a, - const btDbvtAabbMm& b, - btDbvtAabbMm& r); - DBVT_INLINE friend bool NotEqual(const btDbvtAabbMm& a, - const btDbvtAabbMm& b); - - DBVT_INLINE btVector3& tMins() { return (mi); } - DBVT_INLINE btVector3& tMaxs() { return (mx); } - -private: - DBVT_INLINE void AddSpan(const btVector3& d, btScalar& smi, btScalar& smx) const; - -private: - btVector3 mi, mx; -}; - -// Types -typedef btDbvtAabbMm btDbvtVolume; - -/* btDbvtNode */ -struct btDbvtNode -{ - btDbvtVolume volume; - btDbvtNode* parent; - DBVT_INLINE bool isleaf() const { return (childs[1] == 0); } - DBVT_INLINE bool isinternal() const { return (!isleaf()); } - union { - btDbvtNode* childs[2]; - void* data; - int dataAsInt; - }; -}; - -/* btDbv(normal)tNode */ -struct btDbvntNode -{ - btDbvtVolume volume; - btVector3 normal; - btScalar angle; - DBVT_INLINE bool isleaf() const { return (childs[1] == 0); } - DBVT_INLINE bool isinternal() const { return (!isleaf()); } - btDbvntNode* childs[2]; - void* data; - - btDbvntNode(const btDbvtNode* n) - : volume(n->volume) - , normal(0,0,0) - , angle(0) - , data(n->data) - { - childs[0] = 0; - childs[1] = 0; - } - - ~btDbvntNode() - { - if (childs[0]) - delete childs[0]; - if (childs[1]) - delete childs[1]; - } -}; - -typedef btAlignedObjectArray btNodeStack; - -///The btDbvt class implements a fast dynamic bounding volume tree based on axis aligned bounding boxes (aabb tree). -///This btDbvt is used for soft body collision detection and for the btDbvtBroadphase. It has a fast insert, remove and update of nodes. -///Unlike the btQuantizedBvh, nodes can be dynamically moved around, which allows for change in topology of the underlying data structure. -struct btDbvt -{ - /* Stack element */ - struct sStkNN - { - const btDbvtNode* a; - const btDbvtNode* b; - sStkNN() {} - sStkNN(const btDbvtNode* na, const btDbvtNode* nb) : a(na), b(nb) {} - }; - struct sStkNP - { - const btDbvtNode* node; - int mask; - sStkNP(const btDbvtNode* n, unsigned m) : node(n), mask(m) {} - }; - struct sStkNPS - { - const btDbvtNode* node; - int mask; - btScalar value; - sStkNPS() {} - sStkNPS(const btDbvtNode* n, unsigned m, btScalar v) : node(n), mask(m), value(v) {} - }; - struct sStkCLN - { - const btDbvtNode* node; - btDbvtNode* parent; - sStkCLN(const btDbvtNode* n, btDbvtNode* p) : node(n), parent(p) {} - }; - - struct sStknNN - { - const btDbvntNode* a; - const btDbvntNode* b; - sStknNN() {} - sStknNN(const btDbvntNode* na, const btDbvntNode* nb) : a(na), b(nb) {} - }; - // Policies/Interfaces - - /* ICollide */ - struct ICollide - { - DBVT_VIRTUAL_DTOR(ICollide) - DBVT_VIRTUAL void Process(const btDbvtNode*, const btDbvtNode*) {} - DBVT_VIRTUAL void Process(const btDbvtNode*) {} - DBVT_VIRTUAL void Process(const btDbvtNode* n, btScalar) { Process(n); } - DBVT_VIRTUAL void Process(const btDbvntNode*, const btDbvntNode*) {} - DBVT_VIRTUAL bool Descent(const btDbvtNode*) { return (true); } - DBVT_VIRTUAL bool AllLeaves(const btDbvtNode*) { return (true); } - }; - /* IWriter */ - struct IWriter - { - virtual ~IWriter() {} - virtual void Prepare(const btDbvtNode* root, int numnodes) = 0; - virtual void WriteNode(const btDbvtNode*, int index, int parent, int child0, int child1) = 0; - virtual void WriteLeaf(const btDbvtNode*, int index, int parent) = 0; - }; - /* IClone */ - struct IClone - { - virtual ~IClone() {} - virtual void CloneLeaf(btDbvtNode*) {} - }; - - // Constants - enum - { - SIMPLE_STACKSIZE = 64, - DOUBLE_STACKSIZE = SIMPLE_STACKSIZE * 2 - }; - - // Fields - btDbvtNode* m_root; - btDbvtNode* m_free; - int m_lkhd; - int m_leaves; - unsigned m_opath; - - btAlignedObjectArray m_stkStack; - - // Methods - btDbvt(); - ~btDbvt(); - void clear(); - bool empty() const { return (0 == m_root); } - void optimizeBottomUp(); - void optimizeTopDown(int bu_treshold = 128); - void optimizeIncremental(int passes); - btDbvtNode* insert(const btDbvtVolume& box, void* data); - void update(btDbvtNode* leaf, int lookahead = -1); - void update(btDbvtNode* leaf, btDbvtVolume& volume); - bool update(btDbvtNode* leaf, btDbvtVolume& volume, const btVector3& velocity, btScalar margin); - bool update(btDbvtNode* leaf, btDbvtVolume& volume, const btVector3& velocity); - bool update(btDbvtNode* leaf, btDbvtVolume& volume, btScalar margin); - void remove(btDbvtNode* leaf); - void write(IWriter* iwriter) const; - void clone(btDbvt& dest, IClone* iclone = 0) const; - static int maxdepth(const btDbvtNode* node); - static int countLeaves(const btDbvtNode* node); - static void extractLeaves(const btDbvtNode* node, btAlignedObjectArray& leaves); -#if DBVT_ENABLE_BENCHMARK - static void benchmark(); -#else - static void benchmark() - { - } -#endif - // DBVT_IPOLICY must support ICollide policy/interface - DBVT_PREFIX - static void enumNodes(const btDbvtNode* root, - DBVT_IPOLICY); - DBVT_PREFIX - static void enumLeaves(const btDbvtNode* root, - DBVT_IPOLICY); - DBVT_PREFIX - void collideTT(const btDbvtNode* root0, - const btDbvtNode* root1, - DBVT_IPOLICY); - DBVT_PREFIX - void selfCollideT(const btDbvntNode* root, - DBVT_IPOLICY); - DBVT_PREFIX - void selfCollideTT(const btDbvtNode* root, - DBVT_IPOLICY); - - DBVT_PREFIX - void collideTTpersistentStack(const btDbvtNode* root0, - const btDbvtNode* root1, - DBVT_IPOLICY); -#if 0 - DBVT_PREFIX - void collideTT( const btDbvtNode* root0, - const btDbvtNode* root1, - const btTransform& xform, - DBVT_IPOLICY); - DBVT_PREFIX - void collideTT( const btDbvtNode* root0, - const btTransform& xform0, - const btDbvtNode* root1, - const btTransform& xform1, - DBVT_IPOLICY); -#endif - - DBVT_PREFIX - void collideTV(const btDbvtNode* root, - const btDbvtVolume& volume, - DBVT_IPOLICY) const; - - DBVT_PREFIX - void collideTVNoStackAlloc(const btDbvtNode* root, - const btDbvtVolume& volume, - btNodeStack& stack, - DBVT_IPOLICY) const; - - ///rayTest is a re-entrant ray test, and can be called in parallel as long as the btAlignedAlloc is thread-safe (uses locking etc) - ///rayTest is slower than rayTestInternal, because it builds a local stack, using memory allocations, and it recomputes signs/rayDirectionInverses each time - DBVT_PREFIX - static void rayTest(const btDbvtNode* root, - const btVector3& rayFrom, - const btVector3& rayTo, - DBVT_IPOLICY); - ///rayTestInternal is faster than rayTest, because it uses a persistent stack (to reduce dynamic memory allocations to a minimum) and it uses precomputed signs/rayInverseDirections - ///rayTestInternal is used by btDbvtBroadphase to accelerate world ray casts - DBVT_PREFIX - void rayTestInternal(const btDbvtNode* root, - const btVector3& rayFrom, - const btVector3& rayTo, - const btVector3& rayDirectionInverse, - unsigned int signs[3], - btScalar lambda_max, - const btVector3& aabbMin, - const btVector3& aabbMax, - btAlignedObjectArray& stack, - DBVT_IPOLICY) const; - - DBVT_PREFIX - static void collideKDOP(const btDbvtNode* root, - const btVector3* normals, - const btScalar* offsets, - int count, - DBVT_IPOLICY); - DBVT_PREFIX - static void collideOCL(const btDbvtNode* root, - const btVector3* normals, - const btScalar* offsets, - const btVector3& sortaxis, - int count, - DBVT_IPOLICY, - bool fullsort = true); - DBVT_PREFIX - static void collideTU(const btDbvtNode* root, - DBVT_IPOLICY); - // Helpers - static DBVT_INLINE int nearest(const int* i, const btDbvt::sStkNPS* a, btScalar v, int l, int h) - { - int m = 0; - while (l < h) - { - m = (l + h) >> 1; - if (a[i[m]].value >= v) - l = m + 1; - else - h = m; - } - return (h); - } - static DBVT_INLINE int allocate(btAlignedObjectArray& ifree, - btAlignedObjectArray& stock, - const sStkNPS& value) - { - int i; - if (ifree.size() > 0) - { - i = ifree[ifree.size() - 1]; - ifree.pop_back(); - stock[i] = value; - } - else - { - i = stock.size(); - stock.push_back(value); - } - return (i); - } - // -private: - btDbvt(const btDbvt&) {} -}; - -// -// Inline's -// - -// -inline btDbvtAabbMm btDbvtAabbMm::FromCE(const btVector3& c, const btVector3& e) -{ - btDbvtAabbMm box; - box.mi = c - e; - box.mx = c + e; - return (box); -} - -// -inline btDbvtAabbMm btDbvtAabbMm::FromCR(const btVector3& c, btScalar r) -{ - return (FromCE(c, btVector3(r, r, r))); -} - -// -inline btDbvtAabbMm btDbvtAabbMm::FromMM(const btVector3& mi, const btVector3& mx) -{ - btDbvtAabbMm box; - box.mi = mi; - box.mx = mx; - return (box); -} - -// -inline btDbvtAabbMm btDbvtAabbMm::FromPoints(const btVector3* pts, int n) -{ - btDbvtAabbMm box; - box.mi = box.mx = pts[0]; - for (int i = 1; i < n; ++i) - { - box.mi.setMin(pts[i]); - box.mx.setMax(pts[i]); - } - return (box); -} - -// -inline btDbvtAabbMm btDbvtAabbMm::FromPoints(const btVector3** ppts, int n) -{ - btDbvtAabbMm box; - box.mi = box.mx = *ppts[0]; - for (int i = 1; i < n; ++i) - { - box.mi.setMin(*ppts[i]); - box.mx.setMax(*ppts[i]); - } - return (box); -} - -// -DBVT_INLINE void btDbvtAabbMm::Expand(const btVector3& e) -{ - mi -= e; - mx += e; -} - -// -DBVT_INLINE void btDbvtAabbMm::SignedExpand(const btVector3& e) -{ - if (e.x() > 0) - mx.setX(mx.x() + e[0]); - else - mi.setX(mi.x() + e[0]); - if (e.y() > 0) - mx.setY(mx.y() + e[1]); - else - mi.setY(mi.y() + e[1]); - if (e.z() > 0) - mx.setZ(mx.z() + e[2]); - else - mi.setZ(mi.z() + e[2]); -} - -// -DBVT_INLINE bool btDbvtAabbMm::Contain(const btDbvtAabbMm& a) const -{ - return ((mi.x() <= a.mi.x()) && - (mi.y() <= a.mi.y()) && - (mi.z() <= a.mi.z()) && - (mx.x() >= a.mx.x()) && - (mx.y() >= a.mx.y()) && - (mx.z() >= a.mx.z())); -} - -// -DBVT_INLINE int btDbvtAabbMm::Classify(const btVector3& n, btScalar o, int s) const -{ - btVector3 pi, px; - switch (s) - { - case (0 + 0 + 0): - px = btVector3(mi.x(), mi.y(), mi.z()); - pi = btVector3(mx.x(), mx.y(), mx.z()); - break; - case (1 + 0 + 0): - px = btVector3(mx.x(), mi.y(), mi.z()); - pi = btVector3(mi.x(), mx.y(), mx.z()); - break; - case (0 + 2 + 0): - px = btVector3(mi.x(), mx.y(), mi.z()); - pi = btVector3(mx.x(), mi.y(), mx.z()); - break; - case (1 + 2 + 0): - px = btVector3(mx.x(), mx.y(), mi.z()); - pi = btVector3(mi.x(), mi.y(), mx.z()); - break; - case (0 + 0 + 4): - px = btVector3(mi.x(), mi.y(), mx.z()); - pi = btVector3(mx.x(), mx.y(), mi.z()); - break; - case (1 + 0 + 4): - px = btVector3(mx.x(), mi.y(), mx.z()); - pi = btVector3(mi.x(), mx.y(), mi.z()); - break; - case (0 + 2 + 4): - px = btVector3(mi.x(), mx.y(), mx.z()); - pi = btVector3(mx.x(), mi.y(), mi.z()); - break; - case (1 + 2 + 4): - px = btVector3(mx.x(), mx.y(), mx.z()); - pi = btVector3(mi.x(), mi.y(), mi.z()); - break; - } - if ((btDot(n, px) + o) < 0) return (-1); - if ((btDot(n, pi) + o) >= 0) return (+1); - return (0); -} - -// -DBVT_INLINE btScalar btDbvtAabbMm::ProjectMinimum(const btVector3& v, unsigned signs) const -{ - const btVector3* b[] = {&mx, &mi}; - const btVector3 p(b[(signs >> 0) & 1]->x(), - b[(signs >> 1) & 1]->y(), - b[(signs >> 2) & 1]->z()); - return (btDot(p, v)); -} - -// -DBVT_INLINE void btDbvtAabbMm::AddSpan(const btVector3& d, btScalar& smi, btScalar& smx) const -{ - for (int i = 0; i < 3; ++i) - { - if (d[i] < 0) - { - smi += mx[i] * d[i]; - smx += mi[i] * d[i]; - } - else - { - smi += mi[i] * d[i]; - smx += mx[i] * d[i]; - } - } -} - -// -DBVT_INLINE bool Intersect(const btDbvtAabbMm& a, - const btDbvtAabbMm& b) -{ -#if DBVT_INT0_IMPL == DBVT_IMPL_SSE - const __m128 rt(_mm_or_ps(_mm_cmplt_ps(_mm_load_ps(b.mx), _mm_load_ps(a.mi)), - _mm_cmplt_ps(_mm_load_ps(a.mx), _mm_load_ps(b.mi)))); -#if defined(_WIN32) - const __int32* pu((const __int32*)&rt); -#else - const int* pu((const int*)&rt); -#endif - return ((pu[0] | pu[1] | pu[2]) == 0); -#else - return ((a.mi.x() <= b.mx.x()) && - (a.mx.x() >= b.mi.x()) && - (a.mi.y() <= b.mx.y()) && - (a.mx.y() >= b.mi.y()) && - (a.mi.z() <= b.mx.z()) && - (a.mx.z() >= b.mi.z())); -#endif -} - -// -DBVT_INLINE bool Intersect(const btDbvtAabbMm& a, - const btVector3& b) -{ - return ((b.x() >= a.mi.x()) && - (b.y() >= a.mi.y()) && - (b.z() >= a.mi.z()) && - (b.x() <= a.mx.x()) && - (b.y() <= a.mx.y()) && - (b.z() <= a.mx.z())); -} - -////////////////////////////////////// - -// -DBVT_INLINE btScalar Proximity(const btDbvtAabbMm& a, - const btDbvtAabbMm& b) -{ - const btVector3 d = (a.mi + a.mx) - (b.mi + b.mx); - return (btFabs(d.x()) + btFabs(d.y()) + btFabs(d.z())); -} - -// -DBVT_INLINE int Select(const btDbvtAabbMm& o, - const btDbvtAabbMm& a, - const btDbvtAabbMm& b) -{ -#if DBVT_SELECT_IMPL == DBVT_IMPL_SSE - -#if defined(_WIN32) - static ATTRIBUTE_ALIGNED16(const unsigned __int32) mask[] = {0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff}; -#else - static ATTRIBUTE_ALIGNED16(const unsigned int) mask[] = {0x7fffffff, 0x7fffffff, 0x7fffffff, 0x00000000 /*0x7fffffff*/}; -#endif - ///@todo: the intrinsic version is 11% slower -#if DBVT_USE_INTRINSIC_SSE - - union btSSEUnion ///NOTE: if we use more intrinsics, move btSSEUnion into the LinearMath directory - { - __m128 ssereg; - float floats[4]; - int ints[4]; - }; - - __m128 omi(_mm_load_ps(o.mi)); - omi = _mm_add_ps(omi, _mm_load_ps(o.mx)); - __m128 ami(_mm_load_ps(a.mi)); - ami = _mm_add_ps(ami, _mm_load_ps(a.mx)); - ami = _mm_sub_ps(ami, omi); - ami = _mm_and_ps(ami, _mm_load_ps((const float*)mask)); - __m128 bmi(_mm_load_ps(b.mi)); - bmi = _mm_add_ps(bmi, _mm_load_ps(b.mx)); - bmi = _mm_sub_ps(bmi, omi); - bmi = _mm_and_ps(bmi, _mm_load_ps((const float*)mask)); - __m128 t0(_mm_movehl_ps(ami, ami)); - ami = _mm_add_ps(ami, t0); - ami = _mm_add_ss(ami, _mm_shuffle_ps(ami, ami, 1)); - __m128 t1(_mm_movehl_ps(bmi, bmi)); - bmi = _mm_add_ps(bmi, t1); - bmi = _mm_add_ss(bmi, _mm_shuffle_ps(bmi, bmi, 1)); - - btSSEUnion tmp; - tmp.ssereg = _mm_cmple_ss(bmi, ami); - return tmp.ints[0] & 1; - -#else - ATTRIBUTE_ALIGNED16(__int32 r[1]); - __asm - { - mov eax,o - mov ecx,a - mov edx,b - movaps xmm0,[eax] - movaps xmm5,mask - addps xmm0,[eax+16] - movaps xmm1,[ecx] - movaps xmm2,[edx] - addps xmm1,[ecx+16] - addps xmm2,[edx+16] - subps xmm1,xmm0 - subps xmm2,xmm0 - andps xmm1,xmm5 - andps xmm2,xmm5 - movhlps xmm3,xmm1 - movhlps xmm4,xmm2 - addps xmm1,xmm3 - addps xmm2,xmm4 - pshufd xmm3,xmm1,1 - pshufd xmm4,xmm2,1 - addss xmm1,xmm3 - addss xmm2,xmm4 - cmpless xmm2,xmm1 - movss r,xmm2 - } - return (r[0] & 1); -#endif -#else - return (Proximity(o, a) < Proximity(o, b) ? 0 : 1); -#endif -} - -// -DBVT_INLINE void Merge(const btDbvtAabbMm& a, - const btDbvtAabbMm& b, - btDbvtAabbMm& r) -{ -#if DBVT_MERGE_IMPL == DBVT_IMPL_SSE - __m128 ami(_mm_load_ps(a.mi)); - __m128 amx(_mm_load_ps(a.mx)); - __m128 bmi(_mm_load_ps(b.mi)); - __m128 bmx(_mm_load_ps(b.mx)); - ami = _mm_min_ps(ami, bmi); - amx = _mm_max_ps(amx, bmx); - _mm_store_ps(r.mi, ami); - _mm_store_ps(r.mx, amx); -#else - for (int i = 0; i < 3; ++i) - { - if (a.mi[i] < b.mi[i]) - r.mi[i] = a.mi[i]; - else - r.mi[i] = b.mi[i]; - if (a.mx[i] > b.mx[i]) - r.mx[i] = a.mx[i]; - else - r.mx[i] = b.mx[i]; - } -#endif -} - -// -DBVT_INLINE bool NotEqual(const btDbvtAabbMm& a, - const btDbvtAabbMm& b) -{ - return ((a.mi.x() != b.mi.x()) || - (a.mi.y() != b.mi.y()) || - (a.mi.z() != b.mi.z()) || - (a.mx.x() != b.mx.x()) || - (a.mx.y() != b.mx.y()) || - (a.mx.z() != b.mx.z())); -} - -// -// Inline's -// - -// -DBVT_PREFIX -inline void btDbvt::enumNodes(const btDbvtNode* root, - DBVT_IPOLICY) -{ - DBVT_CHECKTYPE - policy.Process(root); - if (root->isinternal()) - { - enumNodes(root->childs[0], policy); - enumNodes(root->childs[1], policy); - } -} - -// -DBVT_PREFIX -inline void btDbvt::enumLeaves(const btDbvtNode* root, - DBVT_IPOLICY) -{ - DBVT_CHECKTYPE - if (root->isinternal()) - { - enumLeaves(root->childs[0], policy); - enumLeaves(root->childs[1], policy); - } - else - { - policy.Process(root); - } -} - -// -DBVT_PREFIX -inline void btDbvt::collideTT(const btDbvtNode* root0, - const btDbvtNode* root1, - DBVT_IPOLICY) -{ - DBVT_CHECKTYPE - if (root0 && root1) - { - int depth = 1; - int treshold = DOUBLE_STACKSIZE - 4; - btAlignedObjectArray stkStack; - stkStack.resize(DOUBLE_STACKSIZE); - stkStack[0] = sStkNN(root0, root1); - do - { - sStkNN p = stkStack[--depth]; - if (depth > treshold) - { - stkStack.resize(stkStack.size() * 2); - treshold = stkStack.size() - 4; - } - if (p.a == p.b) - { - if (p.a->isinternal()) - { - stkStack[depth++] = sStkNN(p.a->childs[0], p.a->childs[0]); - stkStack[depth++] = sStkNN(p.a->childs[1], p.a->childs[1]); - stkStack[depth++] = sStkNN(p.a->childs[0], p.a->childs[1]); - } - } - else if (Intersect(p.a->volume, p.b->volume)) - { - if (p.a->isinternal()) - { - if (p.b->isinternal()) - { - stkStack[depth++] = sStkNN(p.a->childs[0], p.b->childs[0]); - stkStack[depth++] = sStkNN(p.a->childs[1], p.b->childs[0]); - stkStack[depth++] = sStkNN(p.a->childs[0], p.b->childs[1]); - stkStack[depth++] = sStkNN(p.a->childs[1], p.b->childs[1]); - } - else - { - stkStack[depth++] = sStkNN(p.a->childs[0], p.b); - stkStack[depth++] = sStkNN(p.a->childs[1], p.b); - } - } - else - { - if (p.b->isinternal()) - { - stkStack[depth++] = sStkNN(p.a, p.b->childs[0]); - stkStack[depth++] = sStkNN(p.a, p.b->childs[1]); - } - else - { - policy.Process(p.a, p.b); - } - } - } - } while (depth); - } -} - -// -DBVT_PREFIX -inline void btDbvt::selfCollideT(const btDbvntNode* root, - DBVT_IPOLICY) -{ - DBVT_CHECKTYPE - if (root) - { - int depth = 1; - int treshold = DOUBLE_STACKSIZE - 4; - btAlignedObjectArray stkStack; - stkStack.resize(DOUBLE_STACKSIZE); - stkStack[0] = sStknNN(root, root); - do - { - sStknNN p = stkStack[--depth]; - if (depth > treshold) - { - stkStack.resize(stkStack.size() * 2); - treshold = stkStack.size() - 4; - } - if (p.a == p.b) - { - if (p.a->isinternal() && p.a->angle > SIMD_PI) - { - stkStack[depth++] = sStknNN(p.a->childs[0], p.a->childs[0]); - stkStack[depth++] = sStknNN(p.a->childs[1], p.a->childs[1]); - stkStack[depth++] = sStknNN(p.a->childs[0], p.a->childs[1]); - } - } - else if (Intersect(p.a->volume, p.b->volume)) - { - if (p.a->isinternal()) - { - if (p.b->isinternal()) - { - stkStack[depth++] = sStknNN(p.a->childs[0], p.b->childs[0]); - stkStack[depth++] = sStknNN(p.a->childs[1], p.b->childs[0]); - stkStack[depth++] = sStknNN(p.a->childs[0], p.b->childs[1]); - stkStack[depth++] = sStknNN(p.a->childs[1], p.b->childs[1]); - } - else - { - stkStack[depth++] = sStknNN(p.a->childs[0], p.b); - stkStack[depth++] = sStknNN(p.a->childs[1], p.b); - } - } - else - { - if (p.b->isinternal()) - { - stkStack[depth++] = sStknNN(p.a, p.b->childs[0]); - stkStack[depth++] = sStknNN(p.a, p.b->childs[1]); - } - else - { - policy.Process(p.a, p.b); - } - } - } - } while (depth); - } -} - -// -DBVT_PREFIX -inline void btDbvt::selfCollideTT(const btDbvtNode* root, - DBVT_IPOLICY) -{ - DBVT_CHECKTYPE - if (root) - { - int depth = 1; - int treshold = DOUBLE_STACKSIZE - 4; - btAlignedObjectArray stkStack; - stkStack.resize(DOUBLE_STACKSIZE); - stkStack[0] = sStkNN(root, root); - do - { - sStkNN p = stkStack[--depth]; - if (depth > treshold) - { - stkStack.resize(stkStack.size() * 2); - treshold = stkStack.size() - 4; - } - if (p.a == p.b) - { - if (p.a->isinternal()) - { - stkStack[depth++] = sStkNN(p.a->childs[0], p.a->childs[0]); - stkStack[depth++] = sStkNN(p.a->childs[1], p.a->childs[1]); - stkStack[depth++] = sStkNN(p.a->childs[0], p.a->childs[1]); - } - } - else if (Intersect(p.a->volume, p.b->volume)) - { - if (p.a->isinternal()) - { - if (p.b->isinternal()) - { - stkStack[depth++] = sStkNN(p.a->childs[0], p.b->childs[0]); - stkStack[depth++] = sStkNN(p.a->childs[1], p.b->childs[0]); - stkStack[depth++] = sStkNN(p.a->childs[0], p.b->childs[1]); - stkStack[depth++] = sStkNN(p.a->childs[1], p.b->childs[1]); - } - else - { - stkStack[depth++] = sStkNN(p.a->childs[0], p.b); - stkStack[depth++] = sStkNN(p.a->childs[1], p.b); - } - } - else - { - if (p.b->isinternal()) - { - stkStack[depth++] = sStkNN(p.a, p.b->childs[0]); - stkStack[depth++] = sStkNN(p.a, p.b->childs[1]); - } - else - { - policy.Process(p.a, p.b); - } - } - } - } while (depth); - } -} - - -DBVT_PREFIX -inline void btDbvt::collideTTpersistentStack(const btDbvtNode* root0, - const btDbvtNode* root1, - DBVT_IPOLICY) -{ - DBVT_CHECKTYPE - if (root0 && root1) - { - int depth = 1; - int treshold = DOUBLE_STACKSIZE - 4; - - m_stkStack.resize(DOUBLE_STACKSIZE); - m_stkStack[0] = sStkNN(root0, root1); - do - { - sStkNN p = m_stkStack[--depth]; - if (depth > treshold) - { - m_stkStack.resize(m_stkStack.size() * 2); - treshold = m_stkStack.size() - 4; - } - if (p.a == p.b) - { - if (p.a->isinternal()) - { - m_stkStack[depth++] = sStkNN(p.a->childs[0], p.a->childs[0]); - m_stkStack[depth++] = sStkNN(p.a->childs[1], p.a->childs[1]); - m_stkStack[depth++] = sStkNN(p.a->childs[0], p.a->childs[1]); - } - } - else if (Intersect(p.a->volume, p.b->volume)) - { - if (p.a->isinternal()) - { - if (p.b->isinternal()) - { - m_stkStack[depth++] = sStkNN(p.a->childs[0], p.b->childs[0]); - m_stkStack[depth++] = sStkNN(p.a->childs[1], p.b->childs[0]); - m_stkStack[depth++] = sStkNN(p.a->childs[0], p.b->childs[1]); - m_stkStack[depth++] = sStkNN(p.a->childs[1], p.b->childs[1]); - } - else - { - m_stkStack[depth++] = sStkNN(p.a->childs[0], p.b); - m_stkStack[depth++] = sStkNN(p.a->childs[1], p.b); - } - } - else - { - if (p.b->isinternal()) - { - m_stkStack[depth++] = sStkNN(p.a, p.b->childs[0]); - m_stkStack[depth++] = sStkNN(p.a, p.b->childs[1]); - } - else - { - policy.Process(p.a, p.b); - } - } - } - } while (depth); - } -} - -#if 0 -// -DBVT_PREFIX -inline void btDbvt::collideTT( const btDbvtNode* root0, - const btDbvtNode* root1, - const btTransform& xform, - DBVT_IPOLICY) -{ - DBVT_CHECKTYPE - if(root0&&root1) - { - int depth=1; - int treshold=DOUBLE_STACKSIZE-4; - btAlignedObjectArray stkStack; - stkStack.resize(DOUBLE_STACKSIZE); - stkStack[0]=sStkNN(root0,root1); - do { - sStkNN p=stkStack[--depth]; - if(Intersect(p.a->volume,p.b->volume,xform)) - { - if(depth>treshold) - { - stkStack.resize(stkStack.size()*2); - treshold=stkStack.size()-4; - } - if(p.a->isinternal()) - { - if(p.b->isinternal()) - { - stkStack[depth++]=sStkNN(p.a->childs[0],p.b->childs[0]); - stkStack[depth++]=sStkNN(p.a->childs[1],p.b->childs[0]); - stkStack[depth++]=sStkNN(p.a->childs[0],p.b->childs[1]); - stkStack[depth++]=sStkNN(p.a->childs[1],p.b->childs[1]); - } - else - { - stkStack[depth++]=sStkNN(p.a->childs[0],p.b); - stkStack[depth++]=sStkNN(p.a->childs[1],p.b); - } - } - else - { - if(p.b->isinternal()) - { - stkStack[depth++]=sStkNN(p.a,p.b->childs[0]); - stkStack[depth++]=sStkNN(p.a,p.b->childs[1]); - } - else - { - policy.Process(p.a,p.b); - } - } - } - } while(depth); - } -} -// -DBVT_PREFIX -inline void btDbvt::collideTT( const btDbvtNode* root0, - const btTransform& xform0, - const btDbvtNode* root1, - const btTransform& xform1, - DBVT_IPOLICY) -{ - const btTransform xform=xform0.inverse()*xform1; - collideTT(root0,root1,xform,policy); -} -#endif - -DBVT_PREFIX -inline void btDbvt::collideTV(const btDbvtNode* root, - const btDbvtVolume& vol, - DBVT_IPOLICY) const -{ - DBVT_CHECKTYPE - if (root) - { - ATTRIBUTE_ALIGNED16(btDbvtVolume) - volume(vol); - btAlignedObjectArray stack; - stack.resize(0); -#ifndef BT_DISABLE_STACK_TEMP_MEMORY - char tempmemory[SIMPLE_STACKSIZE * sizeof(const btDbvtNode*)]; - stack.initializeFromBuffer(tempmemory, 0, SIMPLE_STACKSIZE); -#else - stack.reserve(SIMPLE_STACKSIZE); -#endif //BT_DISABLE_STACK_TEMP_MEMORY - - stack.push_back(root); - do - { - const btDbvtNode* n = stack[stack.size() - 1]; - stack.pop_back(); - if (Intersect(n->volume, volume)) - { - if (n->isinternal()) - { - stack.push_back(n->childs[0]); - stack.push_back(n->childs[1]); - } - else - { - policy.Process(n); - } - } - } while (stack.size() > 0); - } -} - -// -DBVT_PREFIX -inline void btDbvt::collideTVNoStackAlloc(const btDbvtNode* root, - const btDbvtVolume& vol, - btNodeStack& stack, - DBVT_IPOLICY) const -{ - DBVT_CHECKTYPE - if (root) - { - ATTRIBUTE_ALIGNED16(btDbvtVolume) - volume(vol); - stack.resize(0); - stack.reserve(SIMPLE_STACKSIZE); - stack.push_back(root); - do - { - const btDbvtNode* n = stack[stack.size() - 1]; - stack.pop_back(); - if (Intersect(n->volume, volume)) - { - if (n->isinternal()) - { - stack.push_back(n->childs[0]); - stack.push_back(n->childs[1]); - } - else - { - policy.Process(n); - } - } - } while (stack.size() > 0); - } -} - -DBVT_PREFIX -inline void btDbvt::rayTestInternal(const btDbvtNode* root, - const btVector3& rayFrom, - const btVector3& rayTo, - const btVector3& rayDirectionInverse, - unsigned int signs[3], - btScalar lambda_max, - const btVector3& aabbMin, - const btVector3& aabbMax, - btAlignedObjectArray& stack, - DBVT_IPOLICY) const -{ - (void)rayTo; - DBVT_CHECKTYPE - if (root) - { - btVector3 resultNormal; - - int depth = 1; - int treshold = DOUBLE_STACKSIZE - 2; - stack.resize(DOUBLE_STACKSIZE); - stack[0] = root; - btVector3 bounds[2]; - do - { - const btDbvtNode* node = stack[--depth]; - bounds[0] = node->volume.Mins() - aabbMax; - bounds[1] = node->volume.Maxs() - aabbMin; - btScalar tmin = 1.f, lambda_min = 0.f; - unsigned int result1 = false; - result1 = btRayAabb2(rayFrom, rayDirectionInverse, signs, bounds, tmin, lambda_min, lambda_max); - if (result1) - { - if (node->isinternal()) - { - if (depth > treshold) - { - stack.resize(stack.size() * 2); - treshold = stack.size() - 2; - } - stack[depth++] = node->childs[0]; - stack[depth++] = node->childs[1]; - } - else - { - policy.Process(node); - } - } - } while (depth); - } -} - -// -DBVT_PREFIX -inline void btDbvt::rayTest(const btDbvtNode* root, - const btVector3& rayFrom, - const btVector3& rayTo, - DBVT_IPOLICY) -{ - DBVT_CHECKTYPE - if (root) - { - btVector3 rayDir = (rayTo - rayFrom); - rayDir.normalize(); - - ///what about division by zero? --> just set rayDirection[i] to INF/BT_LARGE_FLOAT - btVector3 rayDirectionInverse; - rayDirectionInverse[0] = rayDir[0] == btScalar(0.0) ? btScalar(BT_LARGE_FLOAT) : btScalar(1.0) / rayDir[0]; - rayDirectionInverse[1] = rayDir[1] == btScalar(0.0) ? btScalar(BT_LARGE_FLOAT) : btScalar(1.0) / rayDir[1]; - rayDirectionInverse[2] = rayDir[2] == btScalar(0.0) ? btScalar(BT_LARGE_FLOAT) : btScalar(1.0) / rayDir[2]; - unsigned int signs[3] = {rayDirectionInverse[0] < 0.0, rayDirectionInverse[1] < 0.0, rayDirectionInverse[2] < 0.0}; - - btScalar lambda_max = rayDir.dot(rayTo - rayFrom); - - btVector3 resultNormal; - - btAlignedObjectArray stack; - - int depth = 1; - int treshold = DOUBLE_STACKSIZE - 2; - - char tempmemory[DOUBLE_STACKSIZE * sizeof(const btDbvtNode*)]; -#ifndef BT_DISABLE_STACK_TEMP_MEMORY - stack.initializeFromBuffer(tempmemory, DOUBLE_STACKSIZE, DOUBLE_STACKSIZE); -#else //BT_DISABLE_STACK_TEMP_MEMORY - stack.resize(DOUBLE_STACKSIZE); -#endif //BT_DISABLE_STACK_TEMP_MEMORY - stack[0] = root; - btVector3 bounds[2]; - do - { - const btDbvtNode* node = stack[--depth]; - - bounds[0] = node->volume.Mins(); - bounds[1] = node->volume.Maxs(); - - btScalar tmin = 1.f, lambda_min = 0.f; - unsigned int result1 = btRayAabb2(rayFrom, rayDirectionInverse, signs, bounds, tmin, lambda_min, lambda_max); - -#ifdef COMPARE_BTRAY_AABB2 - btScalar param = 1.f; - bool result2 = btRayAabb(rayFrom, rayTo, node->volume.Mins(), node->volume.Maxs(), param, resultNormal); - btAssert(result1 == result2); -#endif //TEST_BTRAY_AABB2 - - if (result1) - { - if (node->isinternal()) - { - if (depth > treshold) - { - stack.resize(stack.size() * 2); - treshold = stack.size() - 2; - } - stack[depth++] = node->childs[0]; - stack[depth++] = node->childs[1]; - } - else - { - policy.Process(node); - } - } - } while (depth); - } -} - -// -DBVT_PREFIX -inline void btDbvt::collideKDOP(const btDbvtNode* root, - const btVector3* normals, - const btScalar* offsets, - int count, - DBVT_IPOLICY) -{ - DBVT_CHECKTYPE - if (root) - { - const int inside = (1 << count) - 1; - btAlignedObjectArray stack; - int signs[sizeof(unsigned) * 8]; - btAssert(count < int(sizeof(signs) / sizeof(signs[0]))); - for (int i = 0; i < count; ++i) - { - signs[i] = ((normals[i].x() >= 0) ? 1 : 0) + - ((normals[i].y() >= 0) ? 2 : 0) + - ((normals[i].z() >= 0) ? 4 : 0); - } - stack.reserve(SIMPLE_STACKSIZE); - stack.push_back(sStkNP(root, 0)); - do - { - sStkNP se = stack[stack.size() - 1]; - bool out = false; - stack.pop_back(); - for (int i = 0, j = 1; (!out) && (i < count); ++i, j <<= 1) - { - if (0 == (se.mask & j)) - { - const int side = se.node->volume.Classify(normals[i], offsets[i], signs[i]); - switch (side) - { - case -1: - out = true; - break; - case +1: - se.mask |= j; - break; - } - } - } - if (!out) - { - if ((se.mask != inside) && (se.node->isinternal())) - { - stack.push_back(sStkNP(se.node->childs[0], se.mask)); - stack.push_back(sStkNP(se.node->childs[1], se.mask)); - } - else - { - if (policy.AllLeaves(se.node)) enumLeaves(se.node, policy); - } - } - } while (stack.size()); - } -} - -// -DBVT_PREFIX -inline void btDbvt::collideOCL(const btDbvtNode* root, - const btVector3* normals, - const btScalar* offsets, - const btVector3& sortaxis, - int count, - DBVT_IPOLICY, - bool fsort) -{ - DBVT_CHECKTYPE - if (root) - { - const unsigned srtsgns = (sortaxis[0] >= 0 ? 1 : 0) + - (sortaxis[1] >= 0 ? 2 : 0) + - (sortaxis[2] >= 0 ? 4 : 0); - const int inside = (1 << count) - 1; - btAlignedObjectArray stock; - btAlignedObjectArray ifree; - btAlignedObjectArray stack; - int signs[sizeof(unsigned) * 8]; - btAssert(count < int(sizeof(signs) / sizeof(signs[0]))); - for (int i = 0; i < count; ++i) - { - signs[i] = ((normals[i].x() >= 0) ? 1 : 0) + - ((normals[i].y() >= 0) ? 2 : 0) + - ((normals[i].z() >= 0) ? 4 : 0); - } - stock.reserve(SIMPLE_STACKSIZE); - stack.reserve(SIMPLE_STACKSIZE); - ifree.reserve(SIMPLE_STACKSIZE); - stack.push_back(allocate(ifree, stock, sStkNPS(root, 0, root->volume.ProjectMinimum(sortaxis, srtsgns)))); - do - { - const int id = stack[stack.size() - 1]; - sStkNPS se = stock[id]; - stack.pop_back(); - ifree.push_back(id); - if (se.mask != inside) - { - bool out = false; - for (int i = 0, j = 1; (!out) && (i < count); ++i, j <<= 1) - { - if (0 == (se.mask & j)) - { - const int side = se.node->volume.Classify(normals[i], offsets[i], signs[i]); - switch (side) - { - case -1: - out = true; - break; - case +1: - se.mask |= j; - break; - } - } - } - if (out) continue; - } - if (policy.Descent(se.node)) - { - if (se.node->isinternal()) - { - const btDbvtNode* pns[] = {se.node->childs[0], se.node->childs[1]}; - sStkNPS nes[] = {sStkNPS(pns[0], se.mask, pns[0]->volume.ProjectMinimum(sortaxis, srtsgns)), - sStkNPS(pns[1], se.mask, pns[1]->volume.ProjectMinimum(sortaxis, srtsgns))}; - const int q = nes[0].value < nes[1].value ? 1 : 0; - int j = stack.size(); - if (fsort && (j > 0)) - { - /* Insert 0 */ - j = nearest(&stack[0], &stock[0], nes[q].value, 0, stack.size()); - stack.push_back(0); - - //void * memmove ( void * destination, const void * source, size_t num ); - -#if DBVT_USE_MEMMOVE - { - int num_items_to_move = stack.size() - 1 - j; - if (num_items_to_move > 0) - memmove(&stack[j + 1], &stack[j], sizeof(int) * num_items_to_move); - } -#else - for (int k = stack.size() - 1; k > j; --k) - { - stack[k] = stack[k - 1]; - } -#endif - stack[j] = allocate(ifree, stock, nes[q]); - /* Insert 1 */ - j = nearest(&stack[0], &stock[0], nes[1 - q].value, j, stack.size()); - stack.push_back(0); -#if DBVT_USE_MEMMOVE - { - int num_items_to_move = stack.size() - 1 - j; - if (num_items_to_move > 0) - memmove(&stack[j + 1], &stack[j], sizeof(int) * num_items_to_move); - } -#else - for (int k = stack.size() - 1; k > j; --k) - { - stack[k] = stack[k - 1]; - } -#endif - stack[j] = allocate(ifree, stock, nes[1 - q]); - } - else - { - stack.push_back(allocate(ifree, stock, nes[q])); - stack.push_back(allocate(ifree, stock, nes[1 - q])); - } - } - else - { - policy.Process(se.node, se.value); - } - } - } while (stack.size()); - } -} - -// -DBVT_PREFIX -inline void btDbvt::collideTU(const btDbvtNode* root, - DBVT_IPOLICY) -{ - DBVT_CHECKTYPE - if (root) - { - btAlignedObjectArray stack; - stack.reserve(SIMPLE_STACKSIZE); - stack.push_back(root); - do - { - const btDbvtNode* n = stack[stack.size() - 1]; - stack.pop_back(); - if (policy.Descent(n)) - { - if (n->isinternal()) - { - stack.push_back(n->childs[0]); - stack.push_back(n->childs[1]); - } - else - { - policy.Process(n); - } - } - } while (stack.size() > 0); - } -} - -// -// PP Cleanup -// - -#undef DBVT_USE_MEMMOVE -#undef DBVT_USE_TEMPLATE -#undef DBVT_VIRTUAL_DTOR -#undef DBVT_VIRTUAL -#undef DBVT_PREFIX -#undef DBVT_IPOLICY -#undef DBVT_CHECKTYPE -#undef DBVT_IMPL_GENERIC -#undef DBVT_IMPL_SSE -#undef DBVT_USE_INTRINSIC_SSE -#undef DBVT_SELECT_IMPL -#undef DBVT_MERGE_IMPL -#undef DBVT_INT0_IMPL - -#endif diff --git a/engine/inc/bullet/BulletCollision/BroadphaseCollision/btDbvtBroadphase.h b/engine/inc/bullet/BulletCollision/BroadphaseCollision/btDbvtBroadphase.h deleted file mode 100644 index a71feef5..00000000 --- a/engine/inc/bullet/BulletCollision/BroadphaseCollision/btDbvtBroadphase.h +++ /dev/null @@ -1,146 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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. -*/ - -///btDbvtBroadphase implementation by Nathanael Presson -#ifndef BT_DBVT_BROADPHASE_H -#define BT_DBVT_BROADPHASE_H - -#include "BulletCollision/BroadphaseCollision/btDbvt.h" -#include "BulletCollision/BroadphaseCollision/btOverlappingPairCache.h" - -// -// Compile time config -// - -#define DBVT_BP_PROFILE 0 -//#define DBVT_BP_SORTPAIRS 1 -#define DBVT_BP_PREVENTFALSEUPDATE 0 -#define DBVT_BP_ACCURATESLEEPING 0 -#define DBVT_BP_ENABLE_BENCHMARK 0 -//#define DBVT_BP_MARGIN (btScalar)0.05 -extern btScalar gDbvtMargin; - -#if DBVT_BP_PROFILE -#define DBVT_BP_PROFILING_RATE 256 -#include "LinearMath/btQuickprof.h" -#endif - -// -// btDbvtProxy -// -struct btDbvtProxy : btBroadphaseProxy -{ - /* Fields */ - //btDbvtAabbMm aabb; - btDbvtNode* leaf; - btDbvtProxy* links[2]; - int stage; - /* ctor */ - btDbvtProxy(const btVector3& aabbMin, const btVector3& aabbMax, void* userPtr, int collisionFilterGroup, int collisionFilterMask) : btBroadphaseProxy(aabbMin, aabbMax, userPtr, collisionFilterGroup, collisionFilterMask) - { - links[0] = links[1] = 0; - } -}; - -typedef btAlignedObjectArray btDbvtProxyArray; - -///The btDbvtBroadphase implements a broadphase using two dynamic AABB bounding volume hierarchies/trees (see btDbvt). -///One tree is used for static/non-moving objects, and another tree is used for dynamic objects. Objects can move from one tree to the other. -///This is a very fast broadphase, especially for very dynamic worlds where many objects are moving. Its insert/add and remove of objects is generally faster than the sweep and prune broadphases btAxisSweep3 and bt32BitAxisSweep3. -struct btDbvtBroadphase : btBroadphaseInterface -{ - /* Config */ - enum - { - DYNAMIC_SET = 0, /* Dynamic set index */ - FIXED_SET = 1, /* Fixed set index */ - STAGECOUNT = 2 /* Number of stages */ - }; - /* Fields */ - btDbvt m_sets[2]; // Dbvt sets - btDbvtProxy* m_stageRoots[STAGECOUNT + 1]; // Stages list - btOverlappingPairCache* m_paircache; // Pair cache - btScalar m_prediction; // Velocity prediction - int m_stageCurrent; // Current stage - int m_fupdates; // % of fixed updates per frame - int m_dupdates; // % of dynamic updates per frame - int m_cupdates; // % of cleanup updates per frame - int m_newpairs; // Number of pairs created - int m_fixedleft; // Fixed optimization left - unsigned m_updates_call; // Number of updates call - unsigned m_updates_done; // Number of updates done - btScalar m_updates_ratio; // m_updates_done/m_updates_call - int m_pid; // Parse id - int m_cid; // Cleanup index - int m_gid; // Gen id - bool m_releasepaircache; // Release pair cache on delete - bool m_deferedcollide; // Defere dynamic/static collision to collide call - bool m_needcleanup; // Need to run cleanup? - btAlignedObjectArray > m_rayTestStacks; -#if DBVT_BP_PROFILE - btClock m_clock; - struct - { - unsigned long m_total; - unsigned long m_ddcollide; - unsigned long m_fdcollide; - unsigned long m_cleanup; - unsigned long m_jobcount; - } m_profiling; -#endif - /* Methods */ - btDbvtBroadphase(btOverlappingPairCache* paircache = 0); - ~btDbvtBroadphase(); - void collide(btDispatcher* dispatcher); - void optimize(); - - /* btBroadphaseInterface Implementation */ - btBroadphaseProxy* createProxy(const btVector3& aabbMin, const btVector3& aabbMax, int shapeType, void* userPtr, int collisionFilterGroup, int collisionFilterMask, btDispatcher* dispatcher); - virtual void destroyProxy(btBroadphaseProxy* proxy, btDispatcher* dispatcher); - virtual void setAabb(btBroadphaseProxy* proxy, const btVector3& aabbMin, const btVector3& aabbMax, btDispatcher* dispatcher); - virtual void rayTest(const btVector3& rayFrom, const btVector3& rayTo, btBroadphaseRayCallback& rayCallback, const btVector3& aabbMin = btVector3(0, 0, 0), const btVector3& aabbMax = btVector3(0, 0, 0)); - virtual void aabbTest(const btVector3& aabbMin, const btVector3& aabbMax, btBroadphaseAabbCallback& callback); - - virtual void getAabb(btBroadphaseProxy* proxy, btVector3& aabbMin, btVector3& aabbMax) const; - virtual void calculateOverlappingPairs(btDispatcher* dispatcher); - virtual btOverlappingPairCache* getOverlappingPairCache(); - virtual const btOverlappingPairCache* getOverlappingPairCache() const; - virtual void getBroadphaseAabb(btVector3& aabbMin, btVector3& aabbMax) const; - virtual void printStats(); - - ///reset broadphase internal structures, to ensure determinism/reproducability - virtual void resetPool(btDispatcher* dispatcher); - - void performDeferredRemoval(btDispatcher* dispatcher); - - void setVelocityPrediction(btScalar prediction) - { - m_prediction = prediction; - } - btScalar getVelocityPrediction() const - { - return m_prediction; - } - - ///this setAabbForceUpdate is similar to setAabb but always forces the aabb update. - ///it is not part of the btBroadphaseInterface but specific to btDbvtBroadphase. - ///it bypasses certain optimizations that prevent aabb updates (when the aabb shrinks), see - ///http://code.google.com/p/bullet/issues/detail?id=223 - void setAabbForceUpdate(btBroadphaseProxy* absproxy, const btVector3& aabbMin, const btVector3& aabbMax, btDispatcher* /*dispatcher*/); - - static void benchmark(btBroadphaseInterface*); -}; - -#endif diff --git a/engine/inc/bullet/BulletCollision/BroadphaseCollision/btDispatcher.h b/engine/inc/bullet/BulletCollision/BroadphaseCollision/btDispatcher.h deleted file mode 100644 index b09b7d4d..00000000 --- a/engine/inc/bullet/BulletCollision/BroadphaseCollision/btDispatcher.h +++ /dev/null @@ -1,110 +0,0 @@ -/* -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_DISPATCHER_H -#define BT_DISPATCHER_H -#include "LinearMath/btScalar.h" - -class btCollisionAlgorithm; -struct btBroadphaseProxy; -class btRigidBody; -class btCollisionObject; -class btOverlappingPairCache; -struct btCollisionObjectWrapper; - -class btPersistentManifold; -class btPoolAllocator; - -struct btDispatcherInfo -{ - enum DispatchFunc - { - DISPATCH_DISCRETE = 1, - DISPATCH_CONTINUOUS - }; - btDispatcherInfo() - : m_timeStep(btScalar(0.)), - m_stepCount(0), - m_dispatchFunc(DISPATCH_DISCRETE), - m_timeOfImpact(btScalar(1.)), - m_useContinuous(true), - m_debugDraw(0), - m_enableSatConvex(false), - m_enableSPU(true), - m_useEpa(true), - m_allowedCcdPenetration(btScalar(0.04)), - m_useConvexConservativeDistanceUtil(false), - m_convexConservativeDistanceThreshold(0.0f), - m_deterministicOverlappingPairs(false) - { - } - btScalar m_timeStep; - int m_stepCount; - int m_dispatchFunc; - mutable btScalar m_timeOfImpact; - bool m_useContinuous; - class btIDebugDraw* m_debugDraw; - bool m_enableSatConvex; - bool m_enableSPU; - bool m_useEpa; - btScalar m_allowedCcdPenetration; - bool m_useConvexConservativeDistanceUtil; - btScalar m_convexConservativeDistanceThreshold; - bool m_deterministicOverlappingPairs; -}; - -enum ebtDispatcherQueryType -{ - BT_CONTACT_POINT_ALGORITHMS = 1, - BT_CLOSEST_POINT_ALGORITHMS = 2 -}; - -///The btDispatcher interface class can be used in combination with broadphase to dispatch calculations for overlapping pairs. -///For example for pairwise collision detection, calculating contact points stored in btPersistentManifold or user callbacks (game logic). -class btDispatcher -{ -public: - virtual ~btDispatcher(); - - virtual btCollisionAlgorithm* findAlgorithm(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, btPersistentManifold* sharedManifold, ebtDispatcherQueryType queryType) = 0; - - virtual btPersistentManifold* getNewManifold(const btCollisionObject* b0, const btCollisionObject* b1) = 0; - - virtual void releaseManifold(btPersistentManifold* manifold) = 0; - - virtual void clearManifold(btPersistentManifold* manifold) = 0; - - virtual bool needsCollision(const btCollisionObject* body0, const btCollisionObject* body1) = 0; - - virtual bool needsResponse(const btCollisionObject* body0, const btCollisionObject* body1) = 0; - - virtual void dispatchAllCollisionPairs(btOverlappingPairCache* pairCache, const btDispatcherInfo& dispatchInfo, btDispatcher* dispatcher) = 0; - - virtual int getNumManifolds() const = 0; - - virtual btPersistentManifold* getManifoldByIndexInternal(int index) = 0; - - virtual btPersistentManifold** getInternalManifoldPointer() = 0; - - virtual btPoolAllocator* getInternalManifoldPool() = 0; - - virtual const btPoolAllocator* getInternalManifoldPool() const = 0; - - virtual void* allocateCollisionAlgorithm(int size) = 0; - - virtual void freeCollisionAlgorithm(void* ptr) = 0; -}; - -#endif //BT_DISPATCHER_H diff --git a/engine/inc/bullet/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h b/engine/inc/bullet/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h deleted file mode 100644 index 56011899..00000000 --- a/engine/inc/bullet/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h +++ /dev/null @@ -1,434 +0,0 @@ -/* -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_OVERLAPPING_PAIR_CACHE_H -#define BT_OVERLAPPING_PAIR_CACHE_H - -#include "btBroadphaseInterface.h" -#include "btBroadphaseProxy.h" -#include "btOverlappingPairCallback.h" - -#include "LinearMath/btAlignedObjectArray.h" -class btDispatcher; - -typedef btAlignedObjectArray btBroadphasePairArray; - -struct btOverlapCallback -{ - virtual ~btOverlapCallback() - { - } - //return true for deletion of the pair - virtual bool processOverlap(btBroadphasePair& pair) = 0; -}; - -struct btOverlapFilterCallback -{ - virtual ~btOverlapFilterCallback() - { - } - // return true when pairs need collision - virtual bool needBroadphaseCollision(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1) const = 0; -}; - -const int BT_NULL_PAIR = 0xffffffff; - -///The btOverlappingPairCache provides an interface for overlapping pair management (add, remove, storage), used by the btBroadphaseInterface broadphases. -///The btHashedOverlappingPairCache and btSortedOverlappingPairCache classes are two implementations. -class btOverlappingPairCache : public btOverlappingPairCallback -{ -public: - virtual ~btOverlappingPairCache() {} // this is needed so we can get to the derived class destructor - - virtual btBroadphasePair* getOverlappingPairArrayPtr() = 0; - - virtual const btBroadphasePair* getOverlappingPairArrayPtr() const = 0; - - virtual btBroadphasePairArray& getOverlappingPairArray() = 0; - - virtual void cleanOverlappingPair(btBroadphasePair& pair, btDispatcher* dispatcher) = 0; - - virtual int getNumOverlappingPairs() const = 0; - virtual bool needsBroadphaseCollision(btBroadphaseProxy * proxy0, btBroadphaseProxy * proxy1) const = 0; - virtual btOverlapFilterCallback* getOverlapFilterCallback() = 0; - virtual void cleanProxyFromPairs(btBroadphaseProxy* proxy, btDispatcher* dispatcher) = 0; - - virtual void setOverlapFilterCallback(btOverlapFilterCallback* callback) = 0; - - virtual void processAllOverlappingPairs(btOverlapCallback*, btDispatcher* dispatcher) = 0; - - virtual void processAllOverlappingPairs(btOverlapCallback* callback, btDispatcher* dispatcher, const struct btDispatcherInfo& /*dispatchInfo*/) - { - processAllOverlappingPairs(callback, dispatcher); - } - virtual btBroadphasePair* findPair(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1) = 0; - - virtual bool hasDeferredRemoval() = 0; - - virtual void setInternalGhostPairCallback(btOverlappingPairCallback* ghostPairCallback) = 0; - - virtual void sortOverlappingPairs(btDispatcher* dispatcher) = 0; -}; - -/// Hash-space based Pair Cache, thanks to Erin Catto, Box2D, http://www.box2d.org, and Pierre Terdiman, Codercorner, http://codercorner.com - -ATTRIBUTE_ALIGNED16(class) -btHashedOverlappingPairCache : public btOverlappingPairCache -{ - btBroadphasePairArray m_overlappingPairArray; - btOverlapFilterCallback* m_overlapFilterCallback; - -protected: - btAlignedObjectArray m_hashTable; - btAlignedObjectArray m_next; - btOverlappingPairCallback* m_ghostPairCallback; - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btHashedOverlappingPairCache(); - virtual ~btHashedOverlappingPairCache(); - - void removeOverlappingPairsContainingProxy(btBroadphaseProxy * proxy, btDispatcher * dispatcher); - - virtual void* removeOverlappingPair(btBroadphaseProxy * proxy0, btBroadphaseProxy * proxy1, btDispatcher * dispatcher); - - SIMD_FORCE_INLINE bool needsBroadphaseCollision(btBroadphaseProxy * proxy0, btBroadphaseProxy * proxy1) const - { - if (m_overlapFilterCallback) - return m_overlapFilterCallback->needBroadphaseCollision(proxy0, proxy1); - - bool collides = (proxy0->m_collisionFilterGroup & proxy1->m_collisionFilterMask) != 0; - collides = collides && (proxy1->m_collisionFilterGroup & proxy0->m_collisionFilterMask); - - return collides; - } - - // Add a pair and return the new pair. If the pair already exists, - // no new pair is created and the old one is returned. - virtual btBroadphasePair* addOverlappingPair(btBroadphaseProxy * proxy0, btBroadphaseProxy * proxy1) - { - if (!needsBroadphaseCollision(proxy0, proxy1)) - return 0; - - return internalAddPair(proxy0, proxy1); - } - - void cleanProxyFromPairs(btBroadphaseProxy * proxy, btDispatcher * dispatcher); - - virtual void processAllOverlappingPairs(btOverlapCallback*, btDispatcher * dispatcher); - - virtual void processAllOverlappingPairs(btOverlapCallback * callback, btDispatcher * dispatcher, const struct btDispatcherInfo& dispatchInfo); - - virtual btBroadphasePair* getOverlappingPairArrayPtr() - { - return &m_overlappingPairArray[0]; - } - - const btBroadphasePair* getOverlappingPairArrayPtr() const - { - return &m_overlappingPairArray[0]; - } - - btBroadphasePairArray& getOverlappingPairArray() - { - return m_overlappingPairArray; - } - - const btBroadphasePairArray& getOverlappingPairArray() const - { - return m_overlappingPairArray; - } - - void cleanOverlappingPair(btBroadphasePair & pair, btDispatcher * dispatcher); - - btBroadphasePair* findPair(btBroadphaseProxy * proxy0, btBroadphaseProxy * proxy1); - - int GetCount() const { return m_overlappingPairArray.size(); } - // btBroadphasePair* GetPairs() { return m_pairs; } - - btOverlapFilterCallback* getOverlapFilterCallback() - { - return m_overlapFilterCallback; - } - - void setOverlapFilterCallback(btOverlapFilterCallback * callback) - { - m_overlapFilterCallback = callback; - } - - int getNumOverlappingPairs() const - { - return m_overlappingPairArray.size(); - } - -private: - btBroadphasePair* internalAddPair(btBroadphaseProxy * proxy0, btBroadphaseProxy * proxy1); - - void growTables(); - - SIMD_FORCE_INLINE bool equalsPair(const btBroadphasePair& pair, int proxyId1, int proxyId2) - { - return pair.m_pProxy0->getUid() == proxyId1 && pair.m_pProxy1->getUid() == proxyId2; - } - - /* - // Thomas Wang's hash, see: http://www.concentric.net/~Ttwang/tech/inthash.htm - // This assumes proxyId1 and proxyId2 are 16-bit. - SIMD_FORCE_INLINE int getHash(int proxyId1, int proxyId2) - { - int key = (proxyId2 << 16) | proxyId1; - key = ~key + (key << 15); - key = key ^ (key >> 12); - key = key + (key << 2); - key = key ^ (key >> 4); - key = key * 2057; - key = key ^ (key >> 16); - return key; - } - */ - - SIMD_FORCE_INLINE unsigned int getHash(unsigned int proxyId1, unsigned int proxyId2) - { - unsigned int key = proxyId1 | (proxyId2 << 16); - // Thomas Wang's hash - - key += ~(key << 15); - key ^= (key >> 10); - key += (key << 3); - key ^= (key >> 6); - key += ~(key << 11); - key ^= (key >> 16); - return key; - } - - SIMD_FORCE_INLINE btBroadphasePair* internalFindPair(btBroadphaseProxy * proxy0, btBroadphaseProxy * proxy1, int hash) - { - int proxyId1 = proxy0->getUid(); - int proxyId2 = proxy1->getUid(); -#if 0 // wrong, 'equalsPair' use unsorted uids, copy-past devil striked again. Nat. - if (proxyId1 > proxyId2) - btSwap(proxyId1, proxyId2); -#endif - - int index = m_hashTable[hash]; - - while (index != BT_NULL_PAIR && equalsPair(m_overlappingPairArray[index], proxyId1, proxyId2) == false) - { - index = m_next[index]; - } - - if (index == BT_NULL_PAIR) - { - return NULL; - } - - btAssert(index < m_overlappingPairArray.size()); - - return &m_overlappingPairArray[index]; - } - - virtual bool hasDeferredRemoval() - { - return false; - } - - virtual void setInternalGhostPairCallback(btOverlappingPairCallback * ghostPairCallback) - { - m_ghostPairCallback = ghostPairCallback; - } - - virtual void sortOverlappingPairs(btDispatcher * dispatcher); -}; - -///btSortedOverlappingPairCache maintains the objects with overlapping AABB -///Typically managed by the Broadphase, Axis3Sweep or btSimpleBroadphase -class btSortedOverlappingPairCache : public btOverlappingPairCache -{ -protected: - //avoid brute-force finding all the time - btBroadphasePairArray m_overlappingPairArray; - - //during the dispatch, check that user doesn't destroy/create proxy - bool m_blockedForChanges; - - ///by default, do the removal during the pair traversal - bool m_hasDeferredRemoval; - - //if set, use the callback instead of the built in filter in needBroadphaseCollision - btOverlapFilterCallback* m_overlapFilterCallback; - - btOverlappingPairCallback* m_ghostPairCallback; - -public: - btSortedOverlappingPairCache(); - virtual ~btSortedOverlappingPairCache(); - - virtual void processAllOverlappingPairs(btOverlapCallback*, btDispatcher* dispatcher); - - void* removeOverlappingPair(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1, btDispatcher* dispatcher); - - void cleanOverlappingPair(btBroadphasePair& pair, btDispatcher* dispatcher); - - btBroadphasePair* addOverlappingPair(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1); - - btBroadphasePair* findPair(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1); - - void cleanProxyFromPairs(btBroadphaseProxy* proxy, btDispatcher* dispatcher); - - void removeOverlappingPairsContainingProxy(btBroadphaseProxy* proxy, btDispatcher* dispatcher); - - inline bool needsBroadphaseCollision(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1) const - { - if (m_overlapFilterCallback) - return m_overlapFilterCallback->needBroadphaseCollision(proxy0, proxy1); - - bool collides = (proxy0->m_collisionFilterGroup & proxy1->m_collisionFilterMask) != 0; - collides = collides && (proxy1->m_collisionFilterGroup & proxy0->m_collisionFilterMask); - - return collides; - } - - btBroadphasePairArray& getOverlappingPairArray() - { - return m_overlappingPairArray; - } - - const btBroadphasePairArray& getOverlappingPairArray() const - { - return m_overlappingPairArray; - } - - btBroadphasePair* getOverlappingPairArrayPtr() - { - return &m_overlappingPairArray[0]; - } - - const btBroadphasePair* getOverlappingPairArrayPtr() const - { - return &m_overlappingPairArray[0]; - } - - int getNumOverlappingPairs() const - { - return m_overlappingPairArray.size(); - } - - btOverlapFilterCallback* getOverlapFilterCallback() - { - return m_overlapFilterCallback; - } - - void setOverlapFilterCallback(btOverlapFilterCallback* callback) - { - m_overlapFilterCallback = callback; - } - - virtual bool hasDeferredRemoval() - { - return m_hasDeferredRemoval; - } - - virtual void setInternalGhostPairCallback(btOverlappingPairCallback* ghostPairCallback) - { - m_ghostPairCallback = ghostPairCallback; - } - - virtual void sortOverlappingPairs(btDispatcher* dispatcher); -}; - -///btNullPairCache skips add/removal of overlapping pairs. Userful for benchmarking and unit testing. -class btNullPairCache : public btOverlappingPairCache -{ - btBroadphasePairArray m_overlappingPairArray; - -public: - virtual btBroadphasePair* getOverlappingPairArrayPtr() - { - return &m_overlappingPairArray[0]; - } - const btBroadphasePair* getOverlappingPairArrayPtr() const - { - return &m_overlappingPairArray[0]; - } - btBroadphasePairArray& getOverlappingPairArray() - { - return m_overlappingPairArray; - } - - virtual void cleanOverlappingPair(btBroadphasePair& /*pair*/, btDispatcher* /*dispatcher*/) - { - } - - virtual int getNumOverlappingPairs() const - { - return 0; - } - - virtual void cleanProxyFromPairs(btBroadphaseProxy* /*proxy*/, btDispatcher* /*dispatcher*/) - { - } - - bool needsBroadphaseCollision(btBroadphaseProxy*, btBroadphaseProxy*) const - { - return true; - } - btOverlapFilterCallback* getOverlapFilterCallback() - { - return 0; - } - virtual void setOverlapFilterCallback(btOverlapFilterCallback* /*callback*/) - { - } - - virtual void processAllOverlappingPairs(btOverlapCallback*, btDispatcher* /*dispatcher*/) - { - } - - virtual btBroadphasePair* findPair(btBroadphaseProxy* /*proxy0*/, btBroadphaseProxy* /*proxy1*/) - { - return 0; - } - - virtual bool hasDeferredRemoval() - { - return true; - } - - virtual void setInternalGhostPairCallback(btOverlappingPairCallback* /* ghostPairCallback */) - { - } - - virtual btBroadphasePair* addOverlappingPair(btBroadphaseProxy* /*proxy0*/, btBroadphaseProxy* /*proxy1*/) - { - return 0; - } - - virtual void* removeOverlappingPair(btBroadphaseProxy* /*proxy0*/, btBroadphaseProxy* /*proxy1*/, btDispatcher* /*dispatcher*/) - { - return 0; - } - - virtual void removeOverlappingPairsContainingProxy(btBroadphaseProxy* /*proxy0*/, btDispatcher* /*dispatcher*/) - { - } - - virtual void sortOverlappingPairs(btDispatcher* dispatcher) - { - (void)dispatcher; - } -}; - -#endif //BT_OVERLAPPING_PAIR_CACHE_H diff --git a/engine/inc/bullet/BulletCollision/BroadphaseCollision/btOverlappingPairCallback.h b/engine/inc/bullet/BulletCollision/BroadphaseCollision/btOverlappingPairCallback.h deleted file mode 100644 index d16c7254..00000000 --- a/engine/inc/bullet/BulletCollision/BroadphaseCollision/btOverlappingPairCallback.h +++ /dev/null @@ -1,41 +0,0 @@ - -/* -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 OVERLAPPING_PAIR_CALLBACK_H -#define OVERLAPPING_PAIR_CALLBACK_H - -class btDispatcher; -struct btBroadphasePair; - -///The btOverlappingPairCallback class is an additional optional broadphase user callback for adding/removing overlapping pairs, similar interface to btOverlappingPairCache. -class btOverlappingPairCallback -{ -protected: - btOverlappingPairCallback() {} - -public: - virtual ~btOverlappingPairCallback() - { - } - - virtual btBroadphasePair* addOverlappingPair(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1) = 0; - - virtual void* removeOverlappingPair(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1, btDispatcher* dispatcher) = 0; - - virtual void removeOverlappingPairsContainingProxy(btBroadphaseProxy* proxy0, btDispatcher* dispatcher) = 0; -}; - -#endif //OVERLAPPING_PAIR_CALLBACK_H diff --git a/engine/inc/bullet/BulletCollision/BroadphaseCollision/btQuantizedBvh.h b/engine/inc/bullet/BulletCollision/BroadphaseCollision/btQuantizedBvh.h deleted file mode 100644 index 1c47b9cc..00000000 --- a/engine/inc/bullet/BulletCollision/BroadphaseCollision/btQuantizedBvh.h +++ /dev/null @@ -1,543 +0,0 @@ -/* -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_QUANTIZED_BVH_H -#define BT_QUANTIZED_BVH_H - -class btSerializer; - -//#define DEBUG_CHECK_DEQUANTIZATION 1 -#ifdef DEBUG_CHECK_DEQUANTIZATION -#ifdef __SPU__ -#define printf spu_printf -#endif //__SPU__ - -#include -#include -#endif //DEBUG_CHECK_DEQUANTIZATION - -#include "LinearMath/btVector3.h" -#include "LinearMath/btAlignedAllocator.h" - -#ifdef BT_USE_DOUBLE_PRECISION -#define btQuantizedBvhData btQuantizedBvhDoubleData -#define btOptimizedBvhNodeData btOptimizedBvhNodeDoubleData -#define btQuantizedBvhDataName "btQuantizedBvhDoubleData" -#else -#define btQuantizedBvhData btQuantizedBvhFloatData -#define btOptimizedBvhNodeData btOptimizedBvhNodeFloatData -#define btQuantizedBvhDataName "btQuantizedBvhFloatData" -#endif - -//http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/vclrf__m128.asp - -//Note: currently we have 16 bytes per quantized node -#define MAX_SUBTREE_SIZE_IN_BYTES 2048 - -// 10 gives the potential for 1024 parts, with at most 2^21 (2097152) (minus one -// actually) triangles each (since the sign bit is reserved -#define MAX_NUM_PARTS_IN_BITS 10 - -///btQuantizedBvhNode is a compressed aabb node, 16 bytes. -///Node can be used for leafnode or internal node. Leafnodes can point to 32-bit triangle index (non-negative range). -ATTRIBUTE_ALIGNED16(struct) -btQuantizedBvhNode -{ - BT_DECLARE_ALIGNED_ALLOCATOR(); - - //12 bytes - unsigned short int m_quantizedAabbMin[3]; - unsigned short int m_quantizedAabbMax[3]; - //4 bytes - int m_escapeIndexOrTriangleIndex; - - bool isLeafNode() const - { - //skipindex is negative (internal node), triangleindex >=0 (leafnode) - return (m_escapeIndexOrTriangleIndex >= 0); - } - int getEscapeIndex() const - { - btAssert(!isLeafNode()); - return -m_escapeIndexOrTriangleIndex; - } - int getTriangleIndex() const - { - btAssert(isLeafNode()); - unsigned int x = 0; - unsigned int y = (~(x & 0)) << (31 - MAX_NUM_PARTS_IN_BITS); - // Get only the lower bits where the triangle index is stored - return (m_escapeIndexOrTriangleIndex & ~(y)); - } - int getPartId() const - { - btAssert(isLeafNode()); - // Get only the highest bits where the part index is stored - return (m_escapeIndexOrTriangleIndex >> (31 - MAX_NUM_PARTS_IN_BITS)); - } -}; - -/// btOptimizedBvhNode contains both internal and leaf node information. -/// Total node size is 44 bytes / node. You can use the compressed version of 16 bytes. -ATTRIBUTE_ALIGNED16(struct) -btOptimizedBvhNode -{ - BT_DECLARE_ALIGNED_ALLOCATOR(); - - //32 bytes - btVector3 m_aabbMinOrg; - btVector3 m_aabbMaxOrg; - - //4 - int m_escapeIndex; - - //8 - //for child nodes - int m_subPart; - int m_triangleIndex; - - //pad the size to 64 bytes - char m_padding[20]; -}; - -///btBvhSubtreeInfo provides info to gather a subtree of limited size -ATTRIBUTE_ALIGNED16(class) -btBvhSubtreeInfo -{ -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - //12 bytes - unsigned short int m_quantizedAabbMin[3]; - unsigned short int m_quantizedAabbMax[3]; - //4 bytes, points to the root of the subtree - int m_rootNodeIndex; - //4 bytes - int m_subtreeSize; - int m_padding[3]; - - btBvhSubtreeInfo() - { - //memset(&m_padding[0], 0, sizeof(m_padding)); - } - - void setAabbFromQuantizeNode(const btQuantizedBvhNode& quantizedNode) - { - m_quantizedAabbMin[0] = quantizedNode.m_quantizedAabbMin[0]; - m_quantizedAabbMin[1] = quantizedNode.m_quantizedAabbMin[1]; - m_quantizedAabbMin[2] = quantizedNode.m_quantizedAabbMin[2]; - m_quantizedAabbMax[0] = quantizedNode.m_quantizedAabbMax[0]; - m_quantizedAabbMax[1] = quantizedNode.m_quantizedAabbMax[1]; - m_quantizedAabbMax[2] = quantizedNode.m_quantizedAabbMax[2]; - } -}; - -class btNodeOverlapCallback -{ -public: - virtual ~btNodeOverlapCallback(){}; - - virtual void processNode(int subPart, int triangleIndex) = 0; -}; - -#include "LinearMath/btAlignedAllocator.h" -#include "LinearMath/btAlignedObjectArray.h" - -///for code readability: -typedef btAlignedObjectArray NodeArray; -typedef btAlignedObjectArray QuantizedNodeArray; -typedef btAlignedObjectArray BvhSubtreeInfoArray; - -///The btQuantizedBvh class stores an AABB tree that can be quickly traversed on CPU and Cell SPU. -///It is used by the btBvhTriangleMeshShape as midphase. -///It is recommended to use quantization for better performance and lower memory requirements. -ATTRIBUTE_ALIGNED16(class) -btQuantizedBvh -{ -public: - enum btTraversalMode - { - TRAVERSAL_STACKLESS = 0, - TRAVERSAL_STACKLESS_CACHE_FRIENDLY, - TRAVERSAL_RECURSIVE - }; - -protected: - btVector3 m_bvhAabbMin; - btVector3 m_bvhAabbMax; - btVector3 m_bvhQuantization; - - int m_bulletVersion; //for serialization versioning. It could also be used to detect endianess. - - int m_curNodeIndex; - //quantization data - bool m_useQuantization; - - NodeArray m_leafNodes; - NodeArray m_contiguousNodes; - QuantizedNodeArray m_quantizedLeafNodes; - QuantizedNodeArray m_quantizedContiguousNodes; - - btTraversalMode m_traversalMode; - BvhSubtreeInfoArray m_SubtreeHeaders; - - //This is only used for serialization so we don't have to add serialization directly to btAlignedObjectArray - mutable int m_subtreeHeaderCount; - - ///two versions, one for quantized and normal nodes. This allows code-reuse while maintaining readability (no template/macro!) - ///this might be refactored into a virtual, it is usually not calculated at run-time - void setInternalNodeAabbMin(int nodeIndex, const btVector3& aabbMin) - { - if (m_useQuantization) - { - quantize(&m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMin[0], aabbMin, 0); - } - else - { - m_contiguousNodes[nodeIndex].m_aabbMinOrg = aabbMin; - } - } - void setInternalNodeAabbMax(int nodeIndex, const btVector3& aabbMax) - { - if (m_useQuantization) - { - quantize(&m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMax[0], aabbMax, 1); - } - else - { - m_contiguousNodes[nodeIndex].m_aabbMaxOrg = aabbMax; - } - } - - btVector3 getAabbMin(int nodeIndex) const - { - if (m_useQuantization) - { - return unQuantize(&m_quantizedLeafNodes[nodeIndex].m_quantizedAabbMin[0]); - } - //non-quantized - return m_leafNodes[nodeIndex].m_aabbMinOrg; - } - btVector3 getAabbMax(int nodeIndex) const - { - if (m_useQuantization) - { - return unQuantize(&m_quantizedLeafNodes[nodeIndex].m_quantizedAabbMax[0]); - } - //non-quantized - return m_leafNodes[nodeIndex].m_aabbMaxOrg; - } - - void setInternalNodeEscapeIndex(int nodeIndex, int escapeIndex) - { - if (m_useQuantization) - { - m_quantizedContiguousNodes[nodeIndex].m_escapeIndexOrTriangleIndex = -escapeIndex; - } - else - { - m_contiguousNodes[nodeIndex].m_escapeIndex = escapeIndex; - } - } - - void mergeInternalNodeAabb(int nodeIndex, const btVector3& newAabbMin, const btVector3& newAabbMax) - { - if (m_useQuantization) - { - unsigned short int quantizedAabbMin[3]; - unsigned short int quantizedAabbMax[3]; - quantize(quantizedAabbMin, newAabbMin, 0); - quantize(quantizedAabbMax, newAabbMax, 1); - for (int i = 0; i < 3; i++) - { - if (m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMin[i] > quantizedAabbMin[i]) - m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMin[i] = quantizedAabbMin[i]; - - if (m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMax[i] < quantizedAabbMax[i]) - m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMax[i] = quantizedAabbMax[i]; - } - } - else - { - //non-quantized - m_contiguousNodes[nodeIndex].m_aabbMinOrg.setMin(newAabbMin); - m_contiguousNodes[nodeIndex].m_aabbMaxOrg.setMax(newAabbMax); - } - } - - void swapLeafNodes(int firstIndex, int secondIndex); - - void assignInternalNodeFromLeafNode(int internalNode, int leafNodeIndex); - -protected: - void buildTree(int startIndex, int endIndex); - - int calcSplittingAxis(int startIndex, int endIndex); - - int sortAndCalcSplittingIndex(int startIndex, int endIndex, int splitAxis); - - void walkStacklessTree(btNodeOverlapCallback * nodeCallback, const btVector3& aabbMin, const btVector3& aabbMax) const; - - void walkStacklessQuantizedTreeAgainstRay(btNodeOverlapCallback * nodeCallback, const btVector3& raySource, const btVector3& rayTarget, const btVector3& aabbMin, const btVector3& aabbMax, int startNodeIndex, int endNodeIndex) const; - void walkStacklessQuantizedTree(btNodeOverlapCallback * nodeCallback, unsigned short int* quantizedQueryAabbMin, unsigned short int* quantizedQueryAabbMax, int startNodeIndex, int endNodeIndex) const; - void walkStacklessTreeAgainstRay(btNodeOverlapCallback * nodeCallback, const btVector3& raySource, const btVector3& rayTarget, const btVector3& aabbMin, const btVector3& aabbMax, int startNodeIndex, int endNodeIndex) const; - - ///tree traversal designed for small-memory processors like PS3 SPU - void walkStacklessQuantizedTreeCacheFriendly(btNodeOverlapCallback * nodeCallback, unsigned short int* quantizedQueryAabbMin, unsigned short int* quantizedQueryAabbMax) const; - - ///use the 16-byte stackless 'skipindex' node tree to do a recursive traversal - void walkRecursiveQuantizedTreeAgainstQueryAabb(const btQuantizedBvhNode* currentNode, btNodeOverlapCallback* nodeCallback, unsigned short int* quantizedQueryAabbMin, unsigned short int* quantizedQueryAabbMax) const; - - ///use the 16-byte stackless 'skipindex' node tree to do a recursive traversal - void walkRecursiveQuantizedTreeAgainstQuantizedTree(const btQuantizedBvhNode* treeNodeA, const btQuantizedBvhNode* treeNodeB, btNodeOverlapCallback* nodeCallback) const; - - void updateSubtreeHeaders(int leftChildNodexIndex, int rightChildNodexIndex); - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btQuantizedBvh(); - - virtual ~btQuantizedBvh(); - - ///***************************************** expert/internal use only ************************* - void setQuantizationValues(const btVector3& bvhAabbMin, const btVector3& bvhAabbMax, btScalar quantizationMargin = btScalar(1.0)); - QuantizedNodeArray& getLeafNodeArray() { return m_quantizedLeafNodes; } - ///buildInternal is expert use only: assumes that setQuantizationValues and LeafNodeArray are initialized - void buildInternal(); - ///***************************************** expert/internal use only ************************* - - void reportAabbOverlappingNodex(btNodeOverlapCallback * nodeCallback, const btVector3& aabbMin, const btVector3& aabbMax) const; - void reportRayOverlappingNodex(btNodeOverlapCallback * nodeCallback, const btVector3& raySource, const btVector3& rayTarget) const; - void reportBoxCastOverlappingNodex(btNodeOverlapCallback * nodeCallback, const btVector3& raySource, const btVector3& rayTarget, const btVector3& aabbMin, const btVector3& aabbMax) const; - - SIMD_FORCE_INLINE void quantize(unsigned short* out, const btVector3& point, int isMax) const - { - btAssert(m_useQuantization); - - btAssert(point.getX() <= m_bvhAabbMax.getX()); - btAssert(point.getY() <= m_bvhAabbMax.getY()); - btAssert(point.getZ() <= m_bvhAabbMax.getZ()); - - btAssert(point.getX() >= m_bvhAabbMin.getX()); - btAssert(point.getY() >= m_bvhAabbMin.getY()); - btAssert(point.getZ() >= m_bvhAabbMin.getZ()); - - btVector3 v = (point - m_bvhAabbMin) * m_bvhQuantization; - ///Make sure rounding is done in a way that unQuantize(quantizeWithClamp(...)) is conservative - ///end-points always set the first bit, so that they are sorted properly (so that neighbouring AABBs overlap properly) - ///@todo: double-check this - if (isMax) - { - out[0] = (unsigned short)(((unsigned short)(v.getX() + btScalar(1.)) | 1)); - out[1] = (unsigned short)(((unsigned short)(v.getY() + btScalar(1.)) | 1)); - out[2] = (unsigned short)(((unsigned short)(v.getZ() + btScalar(1.)) | 1)); - } - else - { - out[0] = (unsigned short)(((unsigned short)(v.getX()) & 0xfffe)); - out[1] = (unsigned short)(((unsigned short)(v.getY()) & 0xfffe)); - out[2] = (unsigned short)(((unsigned short)(v.getZ()) & 0xfffe)); - } - -#ifdef DEBUG_CHECK_DEQUANTIZATION - btVector3 newPoint = unQuantize(out); - if (isMax) - { - if (newPoint.getX() < point.getX()) - { - printf("unconservative X, diffX = %f, oldX=%f,newX=%f\n", newPoint.getX() - point.getX(), newPoint.getX(), point.getX()); - } - if (newPoint.getY() < point.getY()) - { - printf("unconservative Y, diffY = %f, oldY=%f,newY=%f\n", newPoint.getY() - point.getY(), newPoint.getY(), point.getY()); - } - if (newPoint.getZ() < point.getZ()) - { - printf("unconservative Z, diffZ = %f, oldZ=%f,newZ=%f\n", newPoint.getZ() - point.getZ(), newPoint.getZ(), point.getZ()); - } - } - else - { - if (newPoint.getX() > point.getX()) - { - printf("unconservative X, diffX = %f, oldX=%f,newX=%f\n", newPoint.getX() - point.getX(), newPoint.getX(), point.getX()); - } - if (newPoint.getY() > point.getY()) - { - printf("unconservative Y, diffY = %f, oldY=%f,newY=%f\n", newPoint.getY() - point.getY(), newPoint.getY(), point.getY()); - } - if (newPoint.getZ() > point.getZ()) - { - printf("unconservative Z, diffZ = %f, oldZ=%f,newZ=%f\n", newPoint.getZ() - point.getZ(), newPoint.getZ(), point.getZ()); - } - } -#endif //DEBUG_CHECK_DEQUANTIZATION - } - - SIMD_FORCE_INLINE void quantizeWithClamp(unsigned short* out, const btVector3& point2, int isMax) const - { - btAssert(m_useQuantization); - - btVector3 clampedPoint(point2); - clampedPoint.setMax(m_bvhAabbMin); - clampedPoint.setMin(m_bvhAabbMax); - - quantize(out, clampedPoint, isMax); - } - - SIMD_FORCE_INLINE btVector3 unQuantize(const unsigned short* vecIn) const - { - btVector3 vecOut; - vecOut.setValue( - (btScalar)(vecIn[0]) / (m_bvhQuantization.getX()), - (btScalar)(vecIn[1]) / (m_bvhQuantization.getY()), - (btScalar)(vecIn[2]) / (m_bvhQuantization.getZ())); - vecOut += m_bvhAabbMin; - return vecOut; - } - - ///setTraversalMode let's you choose between stackless, recursive or stackless cache friendly tree traversal. Note this is only implemented for quantized trees. - void setTraversalMode(btTraversalMode traversalMode) - { - m_traversalMode = traversalMode; - } - - SIMD_FORCE_INLINE QuantizedNodeArray& getQuantizedNodeArray() - { - return m_quantizedContiguousNodes; - } - - SIMD_FORCE_INLINE BvhSubtreeInfoArray& getSubtreeInfoArray() - { - return m_SubtreeHeaders; - } - - //////////////////////////////////////////////////////////////////// - - /////Calculate space needed to store BVH for serialization - unsigned calculateSerializeBufferSize() const; - - /// Data buffer MUST be 16 byte aligned - virtual bool serialize(void* o_alignedDataBuffer, unsigned i_dataBufferSize, bool i_swapEndian) const; - - ///deSerializeInPlace loads and initializes a BVH from a buffer in memory 'in place' - static btQuantizedBvh* deSerializeInPlace(void* i_alignedDataBuffer, unsigned int i_dataBufferSize, bool i_swapEndian); - - static unsigned int getAlignmentSerializationPadding(); - ////////////////////////////////////////////////////////////////////// - - virtual int calculateSerializeBufferSizeNew() const; - - ///fills the dataBuffer and returns the struct name (and 0 on failure) - virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const; - - virtual void deSerializeFloat(struct btQuantizedBvhFloatData & quantizedBvhFloatData); - - virtual void deSerializeDouble(struct btQuantizedBvhDoubleData & quantizedBvhDoubleData); - - //////////////////////////////////////////////////////////////////// - - SIMD_FORCE_INLINE bool isQuantized() - { - return m_useQuantization; - } - -private: - // Special "copy" constructor that allows for in-place deserialization - // Prevents btVector3's default constructor from being called, but doesn't inialize much else - // ownsMemory should most likely be false if deserializing, and if you are not, don't call this (it also changes the function signature, which we need) - btQuantizedBvh(btQuantizedBvh & other, bool ownsMemory); -}; - -// clang-format off -// parser needs * with the name -struct btBvhSubtreeInfoData -{ - int m_rootNodeIndex; - int m_subtreeSize; - unsigned short m_quantizedAabbMin[3]; - unsigned short m_quantizedAabbMax[3]; -}; - -struct btOptimizedBvhNodeFloatData -{ - btVector3FloatData m_aabbMinOrg; - btVector3FloatData m_aabbMaxOrg; - int m_escapeIndex; - int m_subPart; - int m_triangleIndex; - char m_pad[4]; -}; - -struct btOptimizedBvhNodeDoubleData -{ - btVector3DoubleData m_aabbMinOrg; - btVector3DoubleData m_aabbMaxOrg; - int m_escapeIndex; - int m_subPart; - int m_triangleIndex; - char m_pad[4]; -}; - - -struct btQuantizedBvhNodeData -{ - unsigned short m_quantizedAabbMin[3]; - unsigned short m_quantizedAabbMax[3]; - int m_escapeIndexOrTriangleIndex; -}; - -struct btQuantizedBvhFloatData -{ - btVector3FloatData m_bvhAabbMin; - btVector3FloatData m_bvhAabbMax; - btVector3FloatData m_bvhQuantization; - int m_curNodeIndex; - int m_useQuantization; - int m_numContiguousLeafNodes; - int m_numQuantizedContiguousNodes; - btOptimizedBvhNodeFloatData *m_contiguousNodesPtr; - btQuantizedBvhNodeData *m_quantizedContiguousNodesPtr; - btBvhSubtreeInfoData *m_subTreeInfoPtr; - int m_traversalMode; - int m_numSubtreeHeaders; - -}; - -struct btQuantizedBvhDoubleData -{ - btVector3DoubleData m_bvhAabbMin; - btVector3DoubleData m_bvhAabbMax; - btVector3DoubleData m_bvhQuantization; - int m_curNodeIndex; - int m_useQuantization; - int m_numContiguousLeafNodes; - int m_numQuantizedContiguousNodes; - btOptimizedBvhNodeDoubleData *m_contiguousNodesPtr; - btQuantizedBvhNodeData *m_quantizedContiguousNodesPtr; - - int m_traversalMode; - int m_numSubtreeHeaders; - btBvhSubtreeInfoData *m_subTreeInfoPtr; -}; -// clang-format on - -SIMD_FORCE_INLINE int btQuantizedBvh::calculateSerializeBufferSizeNew() const -{ - return sizeof(btQuantizedBvhData); -} - -#endif //BT_QUANTIZED_BVH_H diff --git a/engine/inc/bullet/BulletCollision/BroadphaseCollision/btSimpleBroadphase.h b/engine/inc/bullet/BulletCollision/BroadphaseCollision/btSimpleBroadphase.h deleted file mode 100644 index 3e02fdc0..00000000 --- a/engine/inc/bullet/BulletCollision/BroadphaseCollision/btSimpleBroadphase.h +++ /dev/null @@ -1,148 +0,0 @@ -/* -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_SIMPLE_BROADPHASE_H -#define BT_SIMPLE_BROADPHASE_H - -#include "btOverlappingPairCache.h" - -struct btSimpleBroadphaseProxy : public btBroadphaseProxy -{ - int m_nextFree; - - // int m_handleId; - - btSimpleBroadphaseProxy(){}; - - btSimpleBroadphaseProxy(const btVector3& minpt, const btVector3& maxpt, int shapeType, void* userPtr, int collisionFilterGroup, int collisionFilterMask) - : btBroadphaseProxy(minpt, maxpt, userPtr, collisionFilterGroup, collisionFilterMask) - { - (void)shapeType; - } - - SIMD_FORCE_INLINE void SetNextFree(int next) { m_nextFree = next; } - SIMD_FORCE_INLINE int GetNextFree() const { return m_nextFree; } -}; - -///The SimpleBroadphase is just a unit-test for btAxisSweep3, bt32BitAxisSweep3, or btDbvtBroadphase, so use those classes instead. -///It is a brute force aabb culling broadphase based on O(n^2) aabb checks -class btSimpleBroadphase : public btBroadphaseInterface -{ -protected: - int m_numHandles; // number of active handles - int m_maxHandles; // max number of handles - int m_LastHandleIndex; - - btSimpleBroadphaseProxy* m_pHandles; // handles pool - - void* m_pHandlesRawPtr; - int m_firstFreeHandle; // free handles list - - int allocHandle() - { - btAssert(m_numHandles < m_maxHandles); - int freeHandle = m_firstFreeHandle; - m_firstFreeHandle = m_pHandles[freeHandle].GetNextFree(); - m_numHandles++; - if (freeHandle > m_LastHandleIndex) - { - m_LastHandleIndex = freeHandle; - } - return freeHandle; - } - - void freeHandle(btSimpleBroadphaseProxy* proxy) - { - int handle = int(proxy - m_pHandles); - btAssert(handle >= 0 && handle < m_maxHandles); - if (handle == m_LastHandleIndex) - { - m_LastHandleIndex--; - } - proxy->SetNextFree(m_firstFreeHandle); - m_firstFreeHandle = handle; - - proxy->m_clientObject = 0; - - m_numHandles--; - } - - btOverlappingPairCache* m_pairCache; - bool m_ownsPairCache; - - int m_invalidPair; - - inline btSimpleBroadphaseProxy* getSimpleProxyFromProxy(btBroadphaseProxy* proxy) - { - btSimpleBroadphaseProxy* proxy0 = static_cast(proxy); - return proxy0; - } - - inline const btSimpleBroadphaseProxy* getSimpleProxyFromProxy(btBroadphaseProxy* proxy) const - { - const btSimpleBroadphaseProxy* proxy0 = static_cast(proxy); - return proxy0; - } - - ///reset broadphase internal structures, to ensure determinism/reproducability - virtual void resetPool(btDispatcher* dispatcher); - - void validate(); - -protected: -public: - btSimpleBroadphase(int maxProxies = 16384, btOverlappingPairCache* overlappingPairCache = 0); - virtual ~btSimpleBroadphase(); - - static bool aabbOverlap(btSimpleBroadphaseProxy* proxy0, btSimpleBroadphaseProxy* proxy1); - - virtual btBroadphaseProxy* createProxy(const btVector3& aabbMin, const btVector3& aabbMax, int shapeType, void* userPtr, int collisionFilterGroup, int collisionFilterMask, btDispatcher* dispatcher); - - virtual void calculateOverlappingPairs(btDispatcher* dispatcher); - - virtual void destroyProxy(btBroadphaseProxy* proxy, btDispatcher* dispatcher); - virtual void setAabb(btBroadphaseProxy* proxy, const btVector3& aabbMin, const btVector3& aabbMax, btDispatcher* dispatcher); - virtual void getAabb(btBroadphaseProxy* proxy, btVector3& aabbMin, btVector3& aabbMax) const; - - virtual void rayTest(const btVector3& rayFrom, const btVector3& rayTo, btBroadphaseRayCallback& rayCallback, const btVector3& aabbMin = btVector3(0, 0, 0), const btVector3& aabbMax = btVector3(0, 0, 0)); - virtual void aabbTest(const btVector3& aabbMin, const btVector3& aabbMax, btBroadphaseAabbCallback& callback); - - btOverlappingPairCache* getOverlappingPairCache() - { - return m_pairCache; - } - const btOverlappingPairCache* getOverlappingPairCache() const - { - return m_pairCache; - } - - bool testAabbOverlap(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1); - - ///getAabb returns the axis aligned bounding box in the 'global' coordinate frame - ///will add some transform later - virtual void getBroadphaseAabb(btVector3& aabbMin, btVector3& aabbMax) const - { - aabbMin.setValue(-BT_LARGE_FLOAT, -BT_LARGE_FLOAT, -BT_LARGE_FLOAT); - aabbMax.setValue(BT_LARGE_FLOAT, BT_LARGE_FLOAT, BT_LARGE_FLOAT); - } - - virtual void printStats() - { - // printf("btSimpleBroadphase.h\n"); - // printf("numHandles = %d, maxHandles = %d\n",m_numHandles,m_maxHandles); - } -}; - -#endif //BT_SIMPLE_BROADPHASE_H diff --git a/engine/inc/bullet/BulletCollision/CollisionDispatch/SphereTriangleDetector.h b/engine/inc/bullet/BulletCollision/CollisionDispatch/SphereTriangleDetector.h deleted file mode 100644 index d47e4753..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionDispatch/SphereTriangleDetector.h +++ /dev/null @@ -1,43 +0,0 @@ -/* -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_SPHERE_TRIANGLE_DETECTOR_H -#define BT_SPHERE_TRIANGLE_DETECTOR_H - -#include "BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h" - -class btSphereShape; -class btTriangleShape; - -/// sphere-triangle to match the btDiscreteCollisionDetectorInterface -struct SphereTriangleDetector : public btDiscreteCollisionDetectorInterface -{ - virtual void getClosestPoints(const ClosestPointInput& input, Result& output, class btIDebugDraw* debugDraw, bool swapResults = false); - - SphereTriangleDetector(btSphereShape* sphere, btTriangleShape* triangle, btScalar contactBreakingThreshold); - - virtual ~SphereTriangleDetector(){}; - - bool collide(const btVector3& sphereCenter, btVector3& point, btVector3& resultNormal, btScalar& depth, btScalar& timeOfImpact, btScalar contactBreakingThreshold); - -private: - bool pointInTriangle(const btVector3 vertices[], const btVector3& normal, btVector3* p); - bool facecontains(const btVector3& p, const btVector3* vertices, btVector3& normal); - - btSphereShape* m_sphere; - btTriangleShape* m_triangle; - btScalar m_contactBreakingThreshold; -}; -#endif //BT_SPHERE_TRIANGLE_DETECTOR_H diff --git a/engine/inc/bullet/BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.h b/engine/inc/bullet/BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.h deleted file mode 100644 index 86206057..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.h +++ /dev/null @@ -1,35 +0,0 @@ -/* -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. -*/ - -#ifndef __BT_ACTIVATING_COLLISION_ALGORITHM_H -#define __BT_ACTIVATING_COLLISION_ALGORITHM_H - -#include "BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h" - -///This class is not enabled yet (work-in-progress) to more aggressively activate objects. -class btActivatingCollisionAlgorithm : public btCollisionAlgorithm -{ - // btCollisionObject* m_colObj0; - // btCollisionObject* m_colObj1; - -protected: - btActivatingCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci); - - btActivatingCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap); - -public: - virtual ~btActivatingCollisionAlgorithm(); -}; -#endif //__BT_ACTIVATING_COLLISION_ALGORITHM_H diff --git a/engine/inc/bullet/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.h b/engine/inc/bullet/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.h deleted file mode 100644 index 3b66d1fd..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.h +++ /dev/null @@ -1,63 +0,0 @@ -/* -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_BOX_2D_BOX_2D__COLLISION_ALGORITHM_H -#define BT_BOX_2D_BOX_2D__COLLISION_ALGORITHM_H - -#include "BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" -#include "BulletCollision/BroadphaseCollision/btDispatcher.h" -#include "BulletCollision/CollisionDispatch/btCollisionCreateFunc.h" - -class btPersistentManifold; - -///box-box collision detection -class btBox2dBox2dCollisionAlgorithm : public btActivatingCollisionAlgorithm -{ - bool m_ownManifold; - btPersistentManifold* m_manifoldPtr; - -public: - btBox2dBox2dCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci) - : btActivatingCollisionAlgorithm(ci) {} - - virtual void processCollision(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut); - - virtual btScalar calculateTimeOfImpact(btCollisionObject* body0, btCollisionObject* body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut); - - btBox2dBox2dCollisionAlgorithm(btPersistentManifold* mf, const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap); - - virtual ~btBox2dBox2dCollisionAlgorithm(); - - virtual void getAllContactManifolds(btManifoldArray& manifoldArray) - { - if (m_manifoldPtr && m_ownManifold) - { - manifoldArray.push_back(m_manifoldPtr); - } - } - - struct CreateFunc : public btCollisionAlgorithmCreateFunc - { - virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap) - { - int bbsize = sizeof(btBox2dBox2dCollisionAlgorithm); - void* ptr = ci.m_dispatcher1->allocateCollisionAlgorithm(bbsize); - return new (ptr) btBox2dBox2dCollisionAlgorithm(0, ci, body0Wrap, body1Wrap); - } - }; -}; - -#endif //BT_BOX_2D_BOX_2D__COLLISION_ALGORITHM_H diff --git a/engine/inc/bullet/BulletCollision/CollisionDispatch/btBoxBoxCollisionAlgorithm.h b/engine/inc/bullet/BulletCollision/CollisionDispatch/btBoxBoxCollisionAlgorithm.h deleted file mode 100644 index eb210657..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionDispatch/btBoxBoxCollisionAlgorithm.h +++ /dev/null @@ -1,63 +0,0 @@ -/* -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_BOX_BOX__COLLISION_ALGORITHM_H -#define BT_BOX_BOX__COLLISION_ALGORITHM_H - -#include "btActivatingCollisionAlgorithm.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" -#include "BulletCollision/BroadphaseCollision/btDispatcher.h" -#include "BulletCollision/CollisionDispatch/btCollisionCreateFunc.h" - -class btPersistentManifold; - -///box-box collision detection -class btBoxBoxCollisionAlgorithm : public btActivatingCollisionAlgorithm -{ - bool m_ownManifold; - btPersistentManifold* m_manifoldPtr; - -public: - btBoxBoxCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci) - : btActivatingCollisionAlgorithm(ci) {} - - virtual void processCollision(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut); - - virtual btScalar calculateTimeOfImpact(btCollisionObject* body0, btCollisionObject* body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut); - - btBoxBoxCollisionAlgorithm(btPersistentManifold* mf, const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap); - - virtual ~btBoxBoxCollisionAlgorithm(); - - virtual void getAllContactManifolds(btManifoldArray& manifoldArray) - { - if (m_manifoldPtr && m_ownManifold) - { - manifoldArray.push_back(m_manifoldPtr); - } - } - - struct CreateFunc : public btCollisionAlgorithmCreateFunc - { - virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap) - { - int bbsize = sizeof(btBoxBoxCollisionAlgorithm); - void* ptr = ci.m_dispatcher1->allocateCollisionAlgorithm(bbsize); - return new (ptr) btBoxBoxCollisionAlgorithm(0, ci, body0Wrap, body1Wrap); - } - }; -}; - -#endif //BT_BOX_BOX__COLLISION_ALGORITHM_H diff --git a/engine/inc/bullet/BulletCollision/CollisionDispatch/btBoxBoxDetector.h b/engine/inc/bullet/BulletCollision/CollisionDispatch/btBoxBoxDetector.h deleted file mode 100644 index 9f7d988f..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionDispatch/btBoxBoxDetector.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Box-Box collision detection re-distributed under the ZLib license with permission from Russell L. Smith - * Original version is from Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. - * All rights reserved. Email: russ@q12.org Web: www.q12.org - -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_BOX_BOX_DETECTOR_H -#define BT_BOX_BOX_DETECTOR_H - -class btBoxShape; -#include "BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h" - -/// btBoxBoxDetector wraps the ODE box-box collision detector -/// re-distributed under the Zlib license with permission from Russell L. Smith -struct btBoxBoxDetector : public btDiscreteCollisionDetectorInterface -{ - const btBoxShape* m_box1; - const btBoxShape* m_box2; - -public: - btBoxBoxDetector(const btBoxShape* box1, const btBoxShape* box2); - - virtual ~btBoxBoxDetector(){}; - - virtual void getClosestPoints(const ClosestPointInput& input, Result& output, class btIDebugDraw* debugDraw, bool swapResults = false); -}; - -#endif //BT_BOX_BOX_DETECTOR_H diff --git a/engine/inc/bullet/BulletCollision/CollisionDispatch/btCollisionConfiguration.h b/engine/inc/bullet/BulletCollision/CollisionDispatch/btCollisionConfiguration.h deleted file mode 100644 index d6e15f55..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionDispatch/btCollisionConfiguration.h +++ /dev/null @@ -1,43 +0,0 @@ -/* -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_COLLISION_CONFIGURATION -#define BT_COLLISION_CONFIGURATION - -struct btCollisionAlgorithmCreateFunc; - -class btPoolAllocator; - -///btCollisionConfiguration allows to configure Bullet collision detection -///stack allocator size, default collision algorithms and persistent manifold pool size -///@todo: describe the meaning -class btCollisionConfiguration -{ -public: - virtual ~btCollisionConfiguration() - { - } - - ///memory pools - virtual btPoolAllocator* getPersistentManifoldPool() = 0; - - virtual btPoolAllocator* getCollisionAlgorithmPool() = 0; - - virtual btCollisionAlgorithmCreateFunc* getCollisionAlgorithmCreateFunc(int proxyType0, int proxyType1) = 0; - - virtual btCollisionAlgorithmCreateFunc* getClosestPointsAlgorithmCreateFunc(int proxyType0, int proxyType1) = 0; -}; - -#endif //BT_COLLISION_CONFIGURATION diff --git a/engine/inc/bullet/BulletCollision/CollisionDispatch/btCollisionCreateFunc.h b/engine/inc/bullet/BulletCollision/CollisionDispatch/btCollisionCreateFunc.h deleted file mode 100644 index bd812849..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionDispatch/btCollisionCreateFunc.h +++ /dev/null @@ -1,43 +0,0 @@ -/* -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_COLLISION_CREATE_FUNC -#define BT_COLLISION_CREATE_FUNC - -#include "LinearMath/btAlignedObjectArray.h" -class btCollisionAlgorithm; -class btCollisionObject; -struct btCollisionObjectWrapper; -struct btCollisionAlgorithmConstructionInfo; - -///Used by the btCollisionDispatcher to register and create instances for btCollisionAlgorithm -struct btCollisionAlgorithmCreateFunc -{ - bool m_swapped; - - btCollisionAlgorithmCreateFunc() - : m_swapped(false) - { - } - virtual ~btCollisionAlgorithmCreateFunc(){}; - - virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo&, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap) - { - (void)body0Wrap; - (void)body1Wrap; - return 0; - } -}; -#endif //BT_COLLISION_CREATE_FUNC diff --git a/engine/inc/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcher.h b/engine/inc/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcher.h deleted file mode 100644 index 04309670..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcher.h +++ /dev/null @@ -1,169 +0,0 @@ -/* -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_COLLISION__DISPATCHER_H -#define BT_COLLISION__DISPATCHER_H - -#include "BulletCollision/BroadphaseCollision/btDispatcher.h" -#include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h" - -#include "BulletCollision/CollisionDispatch/btManifoldResult.h" - -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" -#include "LinearMath/btAlignedObjectArray.h" - -class btIDebugDraw; -class btOverlappingPairCache; -class btPoolAllocator; -class btCollisionConfiguration; - -#include "btCollisionCreateFunc.h" - -#define USE_DISPATCH_REGISTRY_ARRAY 1 - -class btCollisionDispatcher; -///user can override this nearcallback for collision filtering and more finegrained control over collision detection -typedef void (*btNearCallback)(btBroadphasePair& collisionPair, btCollisionDispatcher& dispatcher, const btDispatcherInfo& dispatchInfo); - -///btCollisionDispatcher supports algorithms that handle ConvexConvex and ConvexConcave collision pairs. -///Time of Impact, Closest Points and Penetration Depth. -class btCollisionDispatcher : public btDispatcher -{ -protected: - int m_dispatcherFlags; - - btAlignedObjectArray m_manifoldsPtr; - - btNearCallback m_nearCallback; - - btPoolAllocator* m_collisionAlgorithmPoolAllocator; - - btPoolAllocator* m_persistentManifoldPoolAllocator; - - btCollisionAlgorithmCreateFunc* m_doubleDispatchContactPoints[MAX_BROADPHASE_COLLISION_TYPES][MAX_BROADPHASE_COLLISION_TYPES]; - - btCollisionAlgorithmCreateFunc* m_doubleDispatchClosestPoints[MAX_BROADPHASE_COLLISION_TYPES][MAX_BROADPHASE_COLLISION_TYPES]; - - btCollisionConfiguration* m_collisionConfiguration; - -public: - enum DispatcherFlags - { - CD_STATIC_STATIC_REPORTED = 1, - CD_USE_RELATIVE_CONTACT_BREAKING_THRESHOLD = 2, - CD_DISABLE_CONTACTPOOL_DYNAMIC_ALLOCATION = 4 - }; - - int getDispatcherFlags() const - { - return m_dispatcherFlags; - } - - void setDispatcherFlags(int flags) - { - m_dispatcherFlags = flags; - } - - ///registerCollisionCreateFunc allows registration of custom/alternative collision create functions - void registerCollisionCreateFunc(int proxyType0, int proxyType1, btCollisionAlgorithmCreateFunc* createFunc); - - void registerClosestPointsCreateFunc(int proxyType0, int proxyType1, btCollisionAlgorithmCreateFunc* createFunc); - - int getNumManifolds() const - { - return int(m_manifoldsPtr.size()); - } - - btPersistentManifold** getInternalManifoldPointer() - { - return m_manifoldsPtr.size() ? &m_manifoldsPtr[0] : 0; - } - - btPersistentManifold* getManifoldByIndexInternal(int index) - { - btAssert(index>=0); - btAssert(index=0); - btAssert(index > m_batchManifoldsPtr; - bool m_batchUpdating; - int m_grainSize; -}; - -#endif //BT_COLLISION_DISPATCHER_MT_H diff --git a/engine/inc/bullet/BulletCollision/CollisionDispatch/btCollisionObject.h b/engine/inc/bullet/BulletCollision/CollisionDispatch/btCollisionObject.h deleted file mode 100644 index e085c408..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionDispatch/btCollisionObject.h +++ /dev/null @@ -1,689 +0,0 @@ -/* -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_COLLISION_OBJECT_H -#define BT_COLLISION_OBJECT_H - -#include "LinearMath/btTransform.h" - -//island management, m_activationState1 -#define ACTIVE_TAG 1 -#define ISLAND_SLEEPING 2 -#define WANTS_DEACTIVATION 3 -#define DISABLE_DEACTIVATION 4 -#define DISABLE_SIMULATION 5 - -struct btBroadphaseProxy; -class btCollisionShape; -struct btCollisionShapeData; -#include "LinearMath/btMotionState.h" -#include "LinearMath/btAlignedAllocator.h" -#include "LinearMath/btAlignedObjectArray.h" - -typedef btAlignedObjectArray btCollisionObjectArray; - -#ifdef BT_USE_DOUBLE_PRECISION -#define btCollisionObjectData btCollisionObjectDoubleData -#define btCollisionObjectDataName "btCollisionObjectDoubleData" -#else -#define btCollisionObjectData btCollisionObjectFloatData -#define btCollisionObjectDataName "btCollisionObjectFloatData" -#endif - -/// btCollisionObject can be used to manage collision detection objects. -/// btCollisionObject maintains all information that is needed for a collision detection: Shape, Transform and AABB proxy. -/// They can be added to the btCollisionWorld. -ATTRIBUTE_ALIGNED16(class) -btCollisionObject -{ -protected: - btTransform m_worldTransform; - - ///m_interpolationWorldTransform is used for CCD and interpolation - ///it can be either previous or future (predicted) transform - btTransform m_interpolationWorldTransform; - //those two are experimental: just added for bullet time effect, so you can still apply impulses (directly modifying velocities) - //without destroying the continuous interpolated motion (which uses this interpolation velocities) - btVector3 m_interpolationLinearVelocity; - btVector3 m_interpolationAngularVelocity; - - btVector3 m_anisotropicFriction; - int m_hasAnisotropicFriction; - btScalar m_contactProcessingThreshold; - - btBroadphaseProxy* m_broadphaseHandle; - btCollisionShape* m_collisionShape; - ///m_extensionPointer is used by some internal low-level Bullet extensions. - void* m_extensionPointer; - - ///m_rootCollisionShape is temporarily used to store the original collision shape - ///The m_collisionShape might be temporarily replaced by a child collision shape during collision detection purposes - ///If it is NULL, the m_collisionShape is not temporarily replaced. - btCollisionShape* m_rootCollisionShape; - - int m_collisionFlags; - - int m_islandTag1; - int m_companionId; - int m_worldArrayIndex; // index of object in world's collisionObjects array - - mutable int m_activationState1; - mutable btScalar m_deactivationTime; - - btScalar m_friction; - btScalar m_restitution; - btScalar m_rollingFriction; //torsional friction orthogonal to contact normal (useful to stop spheres rolling forever) - btScalar m_spinningFriction; // torsional friction around the contact normal (useful for grasping) - btScalar m_contactDamping; - btScalar m_contactStiffness; - - ///m_internalType is reserved to distinguish Bullet's btCollisionObject, btRigidBody, btSoftBody, btGhostObject etc. - ///do not assign your own m_internalType unless you write a new dynamics object class. - int m_internalType; - - ///users can point to their objects, m_userPointer is not used by Bullet, see setUserPointer/getUserPointer - - void* m_userObjectPointer; - - int m_userIndex2; - - int m_userIndex; - - int m_userIndex3; - - ///time of impact calculation - btScalar m_hitFraction; - - ///Swept sphere radius (0.0 by default), see btConvexConvexAlgorithm:: - btScalar m_ccdSweptSphereRadius; - - /// Don't do continuous collision detection if the motion (in one step) is less then m_ccdMotionThreshold - btScalar m_ccdMotionThreshold; - - /// If some object should have elaborate collision filtering by sub-classes - int m_checkCollideWith; - - btAlignedObjectArray m_objectsWithoutCollisionCheck; - - ///internal update revision number. It will be increased when the object changes. This allows some subsystems to perform lazy evaluation. - int m_updateRevision; - - btVector3 m_customDebugColorRGB; - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - enum CollisionFlags - { - CF_DYNAMIC_OBJECT = 0, - CF_STATIC_OBJECT = 1, - CF_KINEMATIC_OBJECT = 2, - CF_NO_CONTACT_RESPONSE = 4, - CF_CUSTOM_MATERIAL_CALLBACK = 8, //this allows per-triangle material (friction/restitution) - CF_CHARACTER_OBJECT = 16, - CF_DISABLE_VISUALIZE_OBJECT = 32, //disable debug drawing - CF_DISABLE_SPU_COLLISION_PROCESSING = 64, //disable parallel/SPU processing - CF_HAS_CONTACT_STIFFNESS_DAMPING = 128, - CF_HAS_CUSTOM_DEBUG_RENDERING_COLOR = 256, - CF_HAS_FRICTION_ANCHOR = 512, - CF_HAS_COLLISION_SOUND_TRIGGER = 1024 - }; - - enum CollisionObjectTypes - { - CO_COLLISION_OBJECT = 1, - CO_RIGID_BODY = 2, - ///CO_GHOST_OBJECT keeps track of all objects overlapping its AABB and that pass its collision filter - ///It is useful for collision sensors, explosion objects, character controller etc. - CO_GHOST_OBJECT = 4, - CO_SOFT_BODY = 8, - CO_HF_FLUID = 16, - CO_USER_TYPE = 32, - CO_FEATHERSTONE_LINK = 64 - }; - - enum AnisotropicFrictionFlags - { - CF_ANISOTROPIC_FRICTION_DISABLED = 0, - CF_ANISOTROPIC_FRICTION = 1, - CF_ANISOTROPIC_ROLLING_FRICTION = 2 - }; - - SIMD_FORCE_INLINE bool mergesSimulationIslands() const - { - ///static objects, kinematic and object without contact response don't merge islands - return ((m_collisionFlags & (CF_STATIC_OBJECT | CF_KINEMATIC_OBJECT | CF_NO_CONTACT_RESPONSE)) == 0); - } - - const btVector3& getAnisotropicFriction() const - { - return m_anisotropicFriction; - } - void setAnisotropicFriction(const btVector3& anisotropicFriction, int frictionMode = CF_ANISOTROPIC_FRICTION) - { - m_anisotropicFriction = anisotropicFriction; - bool isUnity = (anisotropicFriction[0] != 1.f) || (anisotropicFriction[1] != 1.f) || (anisotropicFriction[2] != 1.f); - m_hasAnisotropicFriction = isUnity ? frictionMode : 0; - } - bool hasAnisotropicFriction(int frictionMode = CF_ANISOTROPIC_FRICTION) const - { - return (m_hasAnisotropicFriction & frictionMode) != 0; - } - - ///the constraint solver can discard solving contacts, if the distance is above this threshold. 0 by default. - ///Note that using contacts with positive distance can improve stability. It increases, however, the chance of colliding with degerate contacts, such as 'interior' triangle edges - void setContactProcessingThreshold(btScalar contactProcessingThreshold) - { - m_contactProcessingThreshold = contactProcessingThreshold; - } - btScalar getContactProcessingThreshold() const - { - return m_contactProcessingThreshold; - } - - SIMD_FORCE_INLINE bool isStaticObject() const - { - return (m_collisionFlags & CF_STATIC_OBJECT) != 0; - } - - SIMD_FORCE_INLINE bool isKinematicObject() const - { - return (m_collisionFlags & CF_KINEMATIC_OBJECT) != 0; - } - - SIMD_FORCE_INLINE bool isStaticOrKinematicObject() const - { - return (m_collisionFlags & (CF_KINEMATIC_OBJECT | CF_STATIC_OBJECT)) != 0; - } - - SIMD_FORCE_INLINE bool hasContactResponse() const - { - return (m_collisionFlags & CF_NO_CONTACT_RESPONSE) == 0; - } - - btCollisionObject(); - - virtual ~btCollisionObject(); - - virtual void setCollisionShape(btCollisionShape * collisionShape) - { - m_updateRevision++; - m_collisionShape = collisionShape; - m_rootCollisionShape = collisionShape; - } - - SIMD_FORCE_INLINE const btCollisionShape* getCollisionShape() const - { - return m_collisionShape; - } - - SIMD_FORCE_INLINE btCollisionShape* getCollisionShape() - { - return m_collisionShape; - } - - void setIgnoreCollisionCheck(const btCollisionObject* co, bool ignoreCollisionCheck) - { - if (ignoreCollisionCheck) - { - //We don't check for duplicates. Is it ok to leave that up to the user of this API? - //int index = m_objectsWithoutCollisionCheck.findLinearSearch(co); - //if (index == m_objectsWithoutCollisionCheck.size()) - //{ - m_objectsWithoutCollisionCheck.push_back(co); - //} - } - else - { - m_objectsWithoutCollisionCheck.remove(co); - } - m_checkCollideWith = m_objectsWithoutCollisionCheck.size() > 0; - } - - int getNumObjectsWithoutCollision() const - { - return m_objectsWithoutCollisionCheck.size(); - } - - const btCollisionObject* getObjectWithoutCollision(int index) - { - return m_objectsWithoutCollisionCheck[index]; - } - - virtual bool checkCollideWithOverride(const btCollisionObject* co) const - { - int index = m_objectsWithoutCollisionCheck.findLinearSearch(co); - if (index < m_objectsWithoutCollisionCheck.size()) - { - return false; - } - return true; - } - - ///Avoid using this internal API call, the extension pointer is used by some Bullet extensions. - ///If you need to store your own user pointer, use 'setUserPointer/getUserPointer' instead. - void* internalGetExtensionPointer() const - { - return m_extensionPointer; - } - ///Avoid using this internal API call, the extension pointer is used by some Bullet extensions - ///If you need to store your own user pointer, use 'setUserPointer/getUserPointer' instead. - void internalSetExtensionPointer(void* pointer) - { - m_extensionPointer = pointer; - } - - SIMD_FORCE_INLINE int getActivationState() const { return m_activationState1; } - - void setActivationState(int newState) const; - - void setDeactivationTime(btScalar time) - { - m_deactivationTime = time; - } - btScalar getDeactivationTime() const - { - return m_deactivationTime; - } - - void forceActivationState(int newState) const; - - void activate(bool forceActivation = false) const; - - SIMD_FORCE_INLINE bool isActive() const - { - return ((getActivationState() != ISLAND_SLEEPING) && (getActivationState() != DISABLE_SIMULATION)); - } - - void setRestitution(btScalar rest) - { - m_updateRevision++; - m_restitution = rest; - } - btScalar getRestitution() const - { - return m_restitution; - } - void setFriction(btScalar frict) - { - m_updateRevision++; - m_friction = frict; - } - btScalar getFriction() const - { - return m_friction; - } - - void setRollingFriction(btScalar frict) - { - m_updateRevision++; - m_rollingFriction = frict; - } - btScalar getRollingFriction() const - { - return m_rollingFriction; - } - void setSpinningFriction(btScalar frict) - { - m_updateRevision++; - m_spinningFriction = frict; - } - btScalar getSpinningFriction() const - { - return m_spinningFriction; - } - void setContactStiffnessAndDamping(btScalar stiffness, btScalar damping) - { - m_updateRevision++; - m_contactStiffness = stiffness; - m_contactDamping = damping; - - m_collisionFlags |= CF_HAS_CONTACT_STIFFNESS_DAMPING; - - //avoid divisions by zero... - if (m_contactStiffness < SIMD_EPSILON) - { - m_contactStiffness = SIMD_EPSILON; - } - } - - btScalar getContactStiffness() const - { - return m_contactStiffness; - } - - btScalar getContactDamping() const - { - return m_contactDamping; - } - - ///reserved for Bullet internal usage - int getInternalType() const - { - return m_internalType; - } - - btTransform& getWorldTransform() - { - return m_worldTransform; - } - - const btTransform& getWorldTransform() const - { - return m_worldTransform; - } - - void setWorldTransform(const btTransform& worldTrans) - { - m_updateRevision++; - m_worldTransform = worldTrans; - } - - SIMD_FORCE_INLINE btBroadphaseProxy* getBroadphaseHandle() - { - return m_broadphaseHandle; - } - - SIMD_FORCE_INLINE const btBroadphaseProxy* getBroadphaseHandle() const - { - return m_broadphaseHandle; - } - - void setBroadphaseHandle(btBroadphaseProxy * handle) - { - m_broadphaseHandle = handle; - } - - const btTransform& getInterpolationWorldTransform() const - { - return m_interpolationWorldTransform; - } - - btTransform& getInterpolationWorldTransform() - { - return m_interpolationWorldTransform; - } - - void setInterpolationWorldTransform(const btTransform& trans) - { - m_updateRevision++; - m_interpolationWorldTransform = trans; - } - - void setInterpolationLinearVelocity(const btVector3& linvel) - { - m_updateRevision++; - m_interpolationLinearVelocity = linvel; - } - - void setInterpolationAngularVelocity(const btVector3& angvel) - { - m_updateRevision++; - m_interpolationAngularVelocity = angvel; - } - - const btVector3& getInterpolationLinearVelocity() const - { - return m_interpolationLinearVelocity; - } - - const btVector3& getInterpolationAngularVelocity() const - { - return m_interpolationAngularVelocity; - } - - SIMD_FORCE_INLINE int getIslandTag() const - { - return m_islandTag1; - } - - void setIslandTag(int tag) - { - m_islandTag1 = tag; - } - - SIMD_FORCE_INLINE int getCompanionId() const - { - return m_companionId; - } - - void setCompanionId(int id) - { - m_companionId = id; - } - - SIMD_FORCE_INLINE int getWorldArrayIndex() const - { - return m_worldArrayIndex; - } - - // only should be called by CollisionWorld - void setWorldArrayIndex(int ix) - { - m_worldArrayIndex = ix; - } - - SIMD_FORCE_INLINE btScalar getHitFraction() const - { - return m_hitFraction; - } - - void setHitFraction(btScalar hitFraction) - { - m_hitFraction = hitFraction; - } - - SIMD_FORCE_INLINE int getCollisionFlags() const - { - return m_collisionFlags; - } - - void setCollisionFlags(int flags) - { - m_collisionFlags = flags; - } - - ///Swept sphere radius (0.0 by default), see btConvexConvexAlgorithm:: - btScalar getCcdSweptSphereRadius() const - { - return m_ccdSweptSphereRadius; - } - - ///Swept sphere radius (0.0 by default), see btConvexConvexAlgorithm:: - void setCcdSweptSphereRadius(btScalar radius) - { - m_ccdSweptSphereRadius = radius; - } - - btScalar getCcdMotionThreshold() const - { - return m_ccdMotionThreshold; - } - - btScalar getCcdSquareMotionThreshold() const - { - return m_ccdMotionThreshold * m_ccdMotionThreshold; - } - - /// Don't do continuous collision detection if the motion (in one step) is less then m_ccdMotionThreshold - void setCcdMotionThreshold(btScalar ccdMotionThreshold) - { - m_ccdMotionThreshold = ccdMotionThreshold; - } - - ///users can point to their objects, userPointer is not used by Bullet - void* getUserPointer() const - { - return m_userObjectPointer; - } - - int getUserIndex() const - { - return m_userIndex; - } - - int getUserIndex2() const - { - return m_userIndex2; - } - - int getUserIndex3() const - { - return m_userIndex3; - } - - ///users can point to their objects, userPointer is not used by Bullet - void setUserPointer(void* userPointer) - { - m_userObjectPointer = userPointer; - } - - ///users can point to their objects, userPointer is not used by Bullet - void setUserIndex(int index) - { - m_userIndex = index; - } - - void setUserIndex2(int index) - { - m_userIndex2 = index; - } - - void setUserIndex3(int index) - { - m_userIndex3 = index; - } - - int getUpdateRevisionInternal() const - { - return m_updateRevision; - } - - void setCustomDebugColor(const btVector3& colorRGB) - { - m_customDebugColorRGB = colorRGB; - m_collisionFlags |= CF_HAS_CUSTOM_DEBUG_RENDERING_COLOR; - } - - void removeCustomDebugColor() - { - m_collisionFlags &= ~CF_HAS_CUSTOM_DEBUG_RENDERING_COLOR; - } - - bool getCustomDebugColor(btVector3 & colorRGB) const - { - bool hasCustomColor = (0 != (m_collisionFlags & CF_HAS_CUSTOM_DEBUG_RENDERING_COLOR)); - if (hasCustomColor) - { - colorRGB = m_customDebugColorRGB; - } - return hasCustomColor; - } - - inline bool checkCollideWith(const btCollisionObject* co) const - { - if (m_checkCollideWith) - return checkCollideWithOverride(co); - - return true; - } - - virtual int calculateSerializeBufferSize() const; - - ///fills the dataBuffer and returns the struct name (and 0 on failure) - virtual const char* serialize(void* dataBuffer, class btSerializer* serializer) const; - - virtual void serializeSingleObject(class btSerializer * serializer) const; -}; - -// clang-format off - -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct btCollisionObjectDoubleData -{ - void *m_broadphaseHandle; - void *m_collisionShape; - btCollisionShapeData *m_rootCollisionShape; - char *m_name; - - btTransformDoubleData m_worldTransform; - btTransformDoubleData m_interpolationWorldTransform; - btVector3DoubleData m_interpolationLinearVelocity; - btVector3DoubleData m_interpolationAngularVelocity; - btVector3DoubleData m_anisotropicFriction; - double m_contactProcessingThreshold; - double m_deactivationTime; - double m_friction; - double m_rollingFriction; - double m_contactDamping; - double m_contactStiffness; - double m_restitution; - double m_hitFraction; - double m_ccdSweptSphereRadius; - double m_ccdMotionThreshold; - int m_hasAnisotropicFriction; - int m_collisionFlags; - int m_islandTag1; - int m_companionId; - int m_activationState1; - int m_internalType; - int m_checkCollideWith; - int m_collisionFilterGroup; - int m_collisionFilterMask; - int m_uniqueId;//m_uniqueId is introduced for paircache. could get rid of this, by calculating the address offset etc. -}; - -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct btCollisionObjectFloatData -{ - void *m_broadphaseHandle; - void *m_collisionShape; - btCollisionShapeData *m_rootCollisionShape; - char *m_name; - - btTransformFloatData m_worldTransform; - btTransformFloatData m_interpolationWorldTransform; - btVector3FloatData m_interpolationLinearVelocity; - btVector3FloatData m_interpolationAngularVelocity; - btVector3FloatData m_anisotropicFriction; - float m_contactProcessingThreshold; - float m_deactivationTime; - float m_friction; - float m_rollingFriction; - float m_contactDamping; - float m_contactStiffness; - float m_restitution; - float m_hitFraction; - float m_ccdSweptSphereRadius; - float m_ccdMotionThreshold; - int m_hasAnisotropicFriction; - int m_collisionFlags; - int m_islandTag1; - int m_companionId; - int m_activationState1; - int m_internalType; - int m_checkCollideWith; - int m_collisionFilterGroup; - int m_collisionFilterMask; - int m_uniqueId; -}; -// clang-format on - -SIMD_FORCE_INLINE int btCollisionObject::calculateSerializeBufferSize() const -{ - return sizeof(btCollisionObjectData); -} - -#endif //BT_COLLISION_OBJECT_H diff --git a/engine/inc/bullet/BulletCollision/CollisionDispatch/btCollisionObjectWrapper.h b/engine/inc/bullet/BulletCollision/CollisionDispatch/btCollisionObjectWrapper.h deleted file mode 100644 index 56341b7d..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionDispatch/btCollisionObjectWrapper.h +++ /dev/null @@ -1,49 +0,0 @@ -#ifndef BT_COLLISION_OBJECT_WRAPPER_H -#define BT_COLLISION_OBJECT_WRAPPER_H - -///btCollisionObjectWrapperis an internal data structure. -///Most users can ignore this and use btCollisionObject and btCollisionShape instead -class btCollisionShape; -class btCollisionObject; -class btTransform; -#include "LinearMath/btScalar.h" // for SIMD_FORCE_INLINE definition - -#define BT_DECLARE_STACK_ONLY_OBJECT \ -private: \ - void* operator new(size_t size); \ - void operator delete(void*); - -struct btCollisionObjectWrapper; -struct btCollisionObjectWrapper -{ - BT_DECLARE_STACK_ONLY_OBJECT - -private: - btCollisionObjectWrapper(const btCollisionObjectWrapper&); // not implemented. Not allowed. - btCollisionObjectWrapper* operator=(const btCollisionObjectWrapper&); - -public: - const btCollisionObjectWrapper* m_parent; - const btCollisionShape* m_shape; - const btCollisionObject* m_collisionObject; - const btTransform& m_worldTransform; - const btTransform* m_preTransform; - int m_partId; - int m_index; - - btCollisionObjectWrapper(const btCollisionObjectWrapper* parent, const btCollisionShape* shape, const btCollisionObject* collisionObject, const btTransform& worldTransform, int partId, int index) - : m_parent(parent), m_shape(shape), m_collisionObject(collisionObject), m_worldTransform(worldTransform), m_preTransform(NULL), m_partId(partId), m_index(index) - { - } - - btCollisionObjectWrapper(const btCollisionObjectWrapper* parent, const btCollisionShape* shape, const btCollisionObject* collisionObject, const btTransform& worldTransform, const btTransform& preTransform, int partId, int index) - : m_parent(parent), m_shape(shape), m_collisionObject(collisionObject), m_worldTransform(worldTransform), m_preTransform(&preTransform), m_partId(partId), m_index(index) - { - } - - SIMD_FORCE_INLINE const btTransform& getWorldTransform() const { return m_worldTransform; } - SIMD_FORCE_INLINE const btCollisionObject* getCollisionObject() const { return m_collisionObject; } - SIMD_FORCE_INLINE const btCollisionShape* getCollisionShape() const { return m_shape; } -}; - -#endif //BT_COLLISION_OBJECT_WRAPPER_H diff --git a/engine/inc/bullet/BulletCollision/CollisionDispatch/btCollisionWorld.h b/engine/inc/bullet/BulletCollision/CollisionDispatch/btCollisionWorld.h deleted file mode 100644 index fd0e5b9b..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionDispatch/btCollisionWorld.h +++ /dev/null @@ -1,513 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2013 Erwin Coumans http://bulletphysics.org - -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. -*/ - -/** - * @mainpage Bullet Documentation - * - * @section intro_sec Introduction - * Bullet is a Collision Detection and Rigid Body Dynamics Library. The Library is Open Source and free for commercial use, under the ZLib license ( http://opensource.org/licenses/zlib-license.php ). - * - * The main documentation is Bullet_User_Manual.pdf, included in the source code distribution. - * There is the Physics Forum for feedback and general Collision Detection and Physics discussions. - * Please visit http://www.bulletphysics.org - * - * @section install_sec Installation - * - * @subsection step1 Step 1: Download - * You can download the Bullet Physics Library from the github repository: https://github.com/bulletphysics/bullet3/releases - * - * @subsection step2 Step 2: Building - * Bullet has multiple build systems, including premake, cmake and autotools. Premake and cmake support all platforms. - * Premake is included in the Bullet/build folder for Windows, Mac OSX and Linux. - * Under Windows you can click on Bullet/build/vs2010.bat to create Microsoft Visual Studio projects. - * On Mac OSX and Linux you can open a terminal and generate Makefile, codeblocks or Xcode4 projects: - * cd Bullet/build - * ./premake4_osx gmake or ./premake4_linux gmake or ./premake4_linux64 gmake or (for Mac) ./premake4_osx xcode4 - * cd Bullet/build/gmake - * make - * - * An alternative to premake is cmake. You can download cmake from http://www.cmake.org - * cmake can autogenerate projectfiles for Microsoft Visual Studio, Apple Xcode, KDevelop and Unix Makefiles. - * The easiest is to run the CMake cmake-gui graphical user interface and choose the options and generate projectfiles. - * You can also use cmake in the command-line. Here are some examples for various platforms: - * cmake . -G "Visual Studio 9 2008" - * cmake . -G Xcode - * cmake . -G "Unix Makefiles" - * Although cmake is recommended, you can also use autotools for UNIX: ./autogen.sh ./configure to create a Makefile and then run make. - * - * @subsection step3 Step 3: Testing demos - * Try to run and experiment with BasicDemo executable as a starting point. - * Bullet can be used in several ways, as Full Rigid Body simulation, as Collision Detector Library or Low Level / Snippets like the GJK Closest Point calculation. - * The Dependencies can be seen in this documentation under Directories - * - * @subsection step4 Step 4: Integrating in your application, full Rigid Body and Soft Body simulation - * Check out BasicDemo how to create a btDynamicsWorld, btRigidBody and btCollisionShape, Stepping the simulation and synchronizing your graphics object transform. - * Check out SoftDemo how to use soft body dynamics, using btSoftRigidDynamicsWorld. - * @subsection step5 Step 5 : Integrate the Collision Detection Library (without Dynamics and other Extras) - * Bullet Collision Detection can also be used without the Dynamics/Extras. - * Check out btCollisionWorld and btCollisionObject, and the CollisionInterfaceDemo. - * @subsection step6 Step 6 : Use Snippets like the GJK Closest Point calculation. - * Bullet has been designed in a modular way keeping dependencies to a minimum. The ConvexHullDistance demo demonstrates direct use of btGjkPairDetector. - * - * @section copyright Copyright - * For up-to-data information and copyright and contributors list check out the Bullet_User_Manual.pdf - * - */ - -#ifndef BT_COLLISION_WORLD_H -#define BT_COLLISION_WORLD_H - -class btCollisionShape; -class btConvexShape; -class btBroadphaseInterface; -class btSerializer; - -#include "LinearMath/btVector3.h" -#include "LinearMath/btTransform.h" -#include "btCollisionObject.h" -#include "btCollisionDispatcher.h" -#include "BulletCollision/BroadphaseCollision/btOverlappingPairCache.h" -#include "LinearMath/btAlignedObjectArray.h" - -///CollisionWorld is interface and container for the collision detection -class btCollisionWorld -{ -protected: - btAlignedObjectArray m_collisionObjects; - - btDispatcher* m_dispatcher1; - - btDispatcherInfo m_dispatchInfo; - - btBroadphaseInterface* m_broadphasePairCache; - - btIDebugDraw* m_debugDrawer; - - ///m_forceUpdateAllAabbs can be set to false as an optimization to only update active object AABBs - ///it is true by default, because it is error-prone (setting the position of static objects wouldn't update their AABB) - bool m_forceUpdateAllAabbs; - - void serializeCollisionObjects(btSerializer* serializer); - - void serializeContactManifolds(btSerializer* serializer); - -public: - //this constructor doesn't own the dispatcher and paircache/broadphase - btCollisionWorld(btDispatcher* dispatcher, btBroadphaseInterface* broadphasePairCache, btCollisionConfiguration* collisionConfiguration); - - virtual ~btCollisionWorld(); - - void setBroadphase(btBroadphaseInterface* pairCache) - { - m_broadphasePairCache = pairCache; - } - - const btBroadphaseInterface* getBroadphase() const - { - return m_broadphasePairCache; - } - - btBroadphaseInterface* getBroadphase() - { - return m_broadphasePairCache; - } - - btOverlappingPairCache* getPairCache() - { - return m_broadphasePairCache->getOverlappingPairCache(); - } - - btDispatcher* getDispatcher() - { - return m_dispatcher1; - } - - const btDispatcher* getDispatcher() const - { - return m_dispatcher1; - } - - void updateSingleAabb(btCollisionObject* colObj); - - virtual void updateAabbs(); - - ///the computeOverlappingPairs is usually already called by performDiscreteCollisionDetection (or stepSimulation) - ///it can be useful to use if you perform ray tests without collision detection/simulation - virtual void computeOverlappingPairs(); - - virtual void setDebugDrawer(btIDebugDraw* debugDrawer) - { - m_debugDrawer = debugDrawer; - } - - virtual btIDebugDraw* getDebugDrawer() - { - return m_debugDrawer; - } - - virtual void debugDrawWorld(); - - virtual void debugDrawObject(const btTransform& worldTransform, const btCollisionShape* shape, const btVector3& color); - - ///LocalShapeInfo gives extra information for complex shapes - ///Currently, only btTriangleMeshShape is available, so it just contains triangleIndex and subpart - struct LocalShapeInfo - { - int m_shapePart; - int m_triangleIndex; - - //const btCollisionShape* m_shapeTemp; - //const btTransform* m_shapeLocalTransform; - }; - - struct LocalRayResult - { - LocalRayResult(const btCollisionObject* collisionObject, - LocalShapeInfo* localShapeInfo, - const btVector3& hitNormalLocal, - btScalar hitFraction) - : m_collisionObject(collisionObject), - m_localShapeInfo(localShapeInfo), - m_hitNormalLocal(hitNormalLocal), - m_hitFraction(hitFraction) - { - } - - const btCollisionObject* m_collisionObject; - LocalShapeInfo* m_localShapeInfo; - btVector3 m_hitNormalLocal; - btScalar m_hitFraction; - }; - - ///RayResultCallback is used to report new raycast results - struct RayResultCallback - { - btScalar m_closestHitFraction; - const btCollisionObject* m_collisionObject; - int m_collisionFilterGroup; - int m_collisionFilterMask; - //@BP Mod - Custom flags, currently used to enable backface culling on tri-meshes, see btRaycastCallback.h. Apply any of the EFlags defined there on m_flags here to invoke. - unsigned int m_flags; - - virtual ~RayResultCallback() - { - } - bool hasHit() const - { - return (m_collisionObject != 0); - } - - RayResultCallback() - : m_closestHitFraction(btScalar(1.)), - m_collisionObject(0), - m_collisionFilterGroup(btBroadphaseProxy::DefaultFilter), - m_collisionFilterMask(btBroadphaseProxy::AllFilter), - //@BP Mod - m_flags(0) - { - } - - virtual bool needsCollision(btBroadphaseProxy* proxy0) const - { - bool collides = (proxy0->m_collisionFilterGroup & m_collisionFilterMask) != 0; - collides = collides && (m_collisionFilterGroup & proxy0->m_collisionFilterMask); - return collides; - } - - virtual btScalar addSingleResult(LocalRayResult& rayResult, bool normalInWorldSpace) = 0; - }; - - struct ClosestRayResultCallback : public RayResultCallback - { - ClosestRayResultCallback(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(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 rayResult.m_hitFraction; - } - }; - - struct AllHitsRayResultCallback : public RayResultCallback - { - AllHitsRayResultCallback(const btVector3& rayFromWorld, const btVector3& rayToWorld) - : m_rayFromWorld(rayFromWorld), - m_rayToWorld(rayToWorld) - { - } - - btAlignedObjectArray m_collisionObjects; - - btVector3 m_rayFromWorld; //used to calculate hitPointWorld from hitFraction - btVector3 m_rayToWorld; - - btAlignedObjectArray m_hitNormalWorld; - btAlignedObjectArray m_hitPointWorld; - btAlignedObjectArray m_hitFractions; - - virtual btScalar addSingleResult(LocalRayResult& rayResult, bool normalInWorldSpace) - { - m_collisionObject = rayResult.m_collisionObject; - m_collisionObjects.push_back(rayResult.m_collisionObject); - btVector3 hitNormalWorld; - if (normalInWorldSpace) - { - hitNormalWorld = rayResult.m_hitNormalLocal; - } - else - { - ///need to transform normal into worldspace - hitNormalWorld = m_collisionObject->getWorldTransform().getBasis() * rayResult.m_hitNormalLocal; - } - m_hitNormalWorld.push_back(hitNormalWorld); - btVector3 hitPointWorld; - hitPointWorld.setInterpolate3(m_rayFromWorld, m_rayToWorld, rayResult.m_hitFraction); - m_hitPointWorld.push_back(hitPointWorld); - m_hitFractions.push_back(rayResult.m_hitFraction); - return m_closestHitFraction; - } - }; - - struct LocalConvexResult - { - LocalConvexResult(const btCollisionObject* hitCollisionObject, - LocalShapeInfo* localShapeInfo, - const btVector3& hitNormalLocal, - const btVector3& hitPointLocal, - btScalar hitFraction) - : m_hitCollisionObject(hitCollisionObject), - m_localShapeInfo(localShapeInfo), - m_hitNormalLocal(hitNormalLocal), - m_hitPointLocal(hitPointLocal), - m_hitFraction(hitFraction) - { - } - - const btCollisionObject* m_hitCollisionObject; - LocalShapeInfo* m_localShapeInfo; - btVector3 m_hitNormalLocal; - btVector3 m_hitPointLocal; - btScalar m_hitFraction; - }; - - ///RayResultCallback is used to report new raycast results - struct ConvexResultCallback - { - btScalar m_closestHitFraction; - int m_collisionFilterGroup; - int m_collisionFilterMask; - - ConvexResultCallback() - : m_closestHitFraction(btScalar(1.)), - m_collisionFilterGroup(btBroadphaseProxy::DefaultFilter), - m_collisionFilterMask(btBroadphaseProxy::AllFilter) - { - } - - virtual ~ConvexResultCallback() - { - } - - bool hasHit() const - { - return (m_closestHitFraction < btScalar(1.)); - } - - virtual bool needsCollision(btBroadphaseProxy* proxy0) const - { - bool collides = (proxy0->m_collisionFilterGroup & m_collisionFilterMask) != 0; - collides = collides && (m_collisionFilterGroup & proxy0->m_collisionFilterMask); - return collides; - } - - virtual btScalar addSingleResult(LocalConvexResult& convexResult, bool normalInWorldSpace) = 0; - }; - - struct ClosestConvexResultCallback : public ConvexResultCallback - { - ClosestConvexResultCallback(const btVector3& convexFromWorld, const btVector3& convexToWorld) - : m_convexFromWorld(convexFromWorld), - m_convexToWorld(convexToWorld), - m_hitCollisionObject(0) - { - } - - btVector3 m_convexFromWorld; //used to calculate hitPointWorld from hitFraction - btVector3 m_convexToWorld; - - btVector3 m_hitNormalWorld; - btVector3 m_hitPointWorld; - const btCollisionObject* m_hitCollisionObject; - - virtual btScalar addSingleResult(LocalConvexResult& convexResult, bool normalInWorldSpace) - { - //caller already does the filter on the m_closestHitFraction - btAssert(convexResult.m_hitFraction <= m_closestHitFraction); - - m_closestHitFraction = convexResult.m_hitFraction; - m_hitCollisionObject = convexResult.m_hitCollisionObject; - if (normalInWorldSpace) - { - m_hitNormalWorld = convexResult.m_hitNormalLocal; - } - else - { - ///need to transform normal into worldspace - m_hitNormalWorld = m_hitCollisionObject->getWorldTransform().getBasis() * convexResult.m_hitNormalLocal; - } - m_hitPointWorld = convexResult.m_hitPointLocal; - return convexResult.m_hitFraction; - } - }; - - ///ContactResultCallback is used to report contact points - struct ContactResultCallback - { - int m_collisionFilterGroup; - int m_collisionFilterMask; - btScalar m_closestDistanceThreshold; - - ContactResultCallback() - : m_collisionFilterGroup(btBroadphaseProxy::DefaultFilter), - m_collisionFilterMask(btBroadphaseProxy::AllFilter), - m_closestDistanceThreshold(0) - { - } - - virtual ~ContactResultCallback() - { - } - - virtual bool needsCollision(btBroadphaseProxy* proxy0) const - { - bool collides = (proxy0->m_collisionFilterGroup & m_collisionFilterMask) != 0; - collides = collides && (m_collisionFilterGroup & proxy0->m_collisionFilterMask); - return collides; - } - - virtual btScalar addSingleResult(btManifoldPoint& cp, const btCollisionObjectWrapper* colObj0Wrap, int partId0, int index0, const btCollisionObjectWrapper* colObj1Wrap, int partId1, int index1) = 0; - }; - - int getNumCollisionObjects() const - { - return int(m_collisionObjects.size()); - } - - /// rayTest performs a raycast on all objects in the btCollisionWorld, and calls the resultCallback - /// This allows for several queries: first hit, all hits, any hit, dependent on the value returned by the callback. - virtual void rayTest(const btVector3& rayFromWorld, const btVector3& rayToWorld, RayResultCallback& resultCallback) const; - - /// convexTest performs a swept convex cast on all objects in the btCollisionWorld, and calls the resultCallback - /// This allows for several queries: first hit, all hits, any hit, dependent on the value return by the callback. - void convexSweepTest(const btConvexShape* castShape, const btTransform& from, const btTransform& to, ConvexResultCallback& resultCallback, btScalar allowedCcdPenetration = btScalar(0.)) const; - - ///contactTest performs a discrete collision test between colObj against all objects in the btCollisionWorld, and calls the resultCallback. - ///it reports one or more contact points for every overlapping object (including the one with deepest penetration) - void contactTest(btCollisionObject* colObj, ContactResultCallback& resultCallback); - - ///contactTest performs a discrete collision test between two collision objects and calls the resultCallback if overlap if detected. - ///it reports one or more contact points (including the one with deepest penetration) - void contactPairTest(btCollisionObject* colObjA, btCollisionObject* colObjB, ContactResultCallback& resultCallback); - - /// rayTestSingle performs a raycast call and calls the resultCallback. It is used internally by rayTest. - /// In a future implementation, we consider moving the ray test as a virtual method in btCollisionShape. - /// This allows more customization. - static void rayTestSingle(const btTransform& rayFromTrans, const btTransform& rayToTrans, - btCollisionObject* collisionObject, - const btCollisionShape* collisionShape, - const btTransform& colObjWorldTransform, - RayResultCallback& resultCallback); - - static void rayTestSingleInternal(const btTransform& rayFromTrans, const btTransform& rayToTrans, - const btCollisionObjectWrapper* collisionObjectWrap, - RayResultCallback& resultCallback); - - /// objectQuerySingle performs a collision detection query and calls the resultCallback. It is used internally by rayTest. - static void objectQuerySingle(const btConvexShape* castShape, const btTransform& rayFromTrans, const btTransform& rayToTrans, - btCollisionObject* collisionObject, - const btCollisionShape* collisionShape, - const btTransform& colObjWorldTransform, - ConvexResultCallback& resultCallback, btScalar allowedPenetration); - - static void objectQuerySingleInternal(const btConvexShape* castShape, const btTransform& convexFromTrans, const btTransform& convexToTrans, - const btCollisionObjectWrapper* colObjWrap, - ConvexResultCallback& resultCallback, btScalar allowedPenetration); - - virtual void addCollisionObject(btCollisionObject* collisionObject, int collisionFilterGroup = btBroadphaseProxy::DefaultFilter, int collisionFilterMask = btBroadphaseProxy::AllFilter); - - virtual void refreshBroadphaseProxy(btCollisionObject* collisionObject); - - btCollisionObjectArray& getCollisionObjectArray() - { - return m_collisionObjects; - } - - const btCollisionObjectArray& getCollisionObjectArray() const - { - return m_collisionObjects; - } - - virtual void removeCollisionObject(btCollisionObject* collisionObject); - - virtual void performDiscreteCollisionDetection(); - - btDispatcherInfo& getDispatchInfo() - { - return m_dispatchInfo; - } - - const btDispatcherInfo& getDispatchInfo() const - { - return m_dispatchInfo; - } - - bool getForceUpdateAllAabbs() const - { - return m_forceUpdateAllAabbs; - } - void setForceUpdateAllAabbs(bool forceUpdateAllAabbs) - { - m_forceUpdateAllAabbs = forceUpdateAllAabbs; - } - - ///Preliminary serialization test for Bullet 2.76. Loading those files requires a separate parser (Bullet/Demos/SerializeDemo) - virtual void serialize(btSerializer* serializer); -}; - -#endif //BT_COLLISION_WORLD_H diff --git a/engine/inc/bullet/BulletCollision/CollisionDispatch/btCollisionWorldImporter.h b/engine/inc/bullet/BulletCollision/CollisionDispatch/btCollisionWorldImporter.h deleted file mode 100644 index 5e8bc953..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionDispatch/btCollisionWorldImporter.h +++ /dev/null @@ -1,169 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2014 Erwin Coumans http://bulletphysics.org - -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_COLLISION_WORLD_IMPORTER_H -#define BT_COLLISION_WORLD_IMPORTER_H - -#include "LinearMath/btTransform.h" -#include "LinearMath/btVector3.h" -#include "LinearMath/btAlignedObjectArray.h" -#include "LinearMath/btHashMap.h" - -class btCollisionShape; -class btCollisionObject; -struct btBulletSerializedArrays; - -struct ConstraintInput; -class btCollisionWorld; -struct btCollisionShapeData; -class btTriangleIndexVertexArray; -class btStridingMeshInterface; -struct btStridingMeshInterfaceData; -class btGImpactMeshShape; -class btOptimizedBvh; -struct btTriangleInfoMap; -class btBvhTriangleMeshShape; -class btPoint2PointConstraint; -class btHingeConstraint; -class btConeTwistConstraint; -class btGeneric6DofConstraint; -class btGeneric6DofSpringConstraint; -class btSliderConstraint; -class btGearConstraint; -struct btContactSolverInfo; - -class btCollisionWorldImporter -{ -protected: - btCollisionWorld* m_collisionWorld; - - int m_verboseMode; - - btAlignedObjectArray m_allocatedCollisionShapes; - btAlignedObjectArray m_allocatedRigidBodies; - - btAlignedObjectArray m_allocatedBvhs; - btAlignedObjectArray m_allocatedTriangleInfoMaps; - btAlignedObjectArray m_allocatedTriangleIndexArrays; - btAlignedObjectArray m_allocatedbtStridingMeshInterfaceDatas; - btAlignedObjectArray m_allocatedCollisionObjects; - - btAlignedObjectArray m_allocatedNames; - - btAlignedObjectArray m_indexArrays; - btAlignedObjectArray m_shortIndexArrays; - btAlignedObjectArray m_charIndexArrays; - - btAlignedObjectArray m_floatVertexArrays; - btAlignedObjectArray m_doubleVertexArrays; - - btHashMap m_bvhMap; - btHashMap m_timMap; - - btHashMap m_nameShapeMap; - btHashMap m_nameColObjMap; - - btHashMap m_objectNameMap; - - btHashMap m_shapeMap; - btHashMap m_bodyMap; - - //methods - - char* duplicateName(const char* name); - - btCollisionShape* convertCollisionShape(btCollisionShapeData* shapeData); - -public: - btCollisionWorldImporter(btCollisionWorld* world); - - virtual ~btCollisionWorldImporter(); - - bool convertAllObjects(btBulletSerializedArrays* arrays); - - ///delete all memory collision shapes, rigid bodies, constraints etc. allocated during the load. - ///make sure you don't use the dynamics world containing objects after you call this method - virtual void deleteAllData(); - - void setVerboseMode(int verboseMode) - { - m_verboseMode = verboseMode; - } - - int getVerboseMode() const - { - return m_verboseMode; - } - - // query for data - int getNumCollisionShapes() const; - btCollisionShape* getCollisionShapeByIndex(int index); - int getNumRigidBodies() const; - btCollisionObject* getRigidBodyByIndex(int index) const; - - int getNumBvhs() const; - btOptimizedBvh* getBvhByIndex(int index) const; - int getNumTriangleInfoMaps() const; - btTriangleInfoMap* getTriangleInfoMapByIndex(int index) const; - - // queris involving named objects - btCollisionShape* getCollisionShapeByName(const char* name); - btCollisionObject* getCollisionObjectByName(const char* name); - - const char* getNameForPointer(const void* ptr) const; - - ///those virtuals are called by load and can be overridden by the user - - //bodies - - virtual btCollisionObject* createCollisionObject(const btTransform& startTransform, btCollisionShape* shape, const char* bodyName); - - ///shapes - - virtual btCollisionShape* createPlaneShape(const btVector3& planeNormal, btScalar planeConstant); - virtual btCollisionShape* createBoxShape(const btVector3& halfExtents); - virtual btCollisionShape* createSphereShape(btScalar radius); - virtual btCollisionShape* createCapsuleShapeX(btScalar radius, btScalar height); - virtual btCollisionShape* createCapsuleShapeY(btScalar radius, btScalar height); - virtual btCollisionShape* createCapsuleShapeZ(btScalar radius, btScalar height); - - virtual btCollisionShape* createCylinderShapeX(btScalar radius, btScalar height); - virtual btCollisionShape* createCylinderShapeY(btScalar radius, btScalar height); - virtual btCollisionShape* createCylinderShapeZ(btScalar radius, btScalar height); - virtual btCollisionShape* createConeShapeX(btScalar radius, btScalar height); - virtual btCollisionShape* createConeShapeY(btScalar radius, btScalar height); - virtual btCollisionShape* createConeShapeZ(btScalar radius, btScalar height); - virtual class btTriangleIndexVertexArray* createTriangleMeshContainer(); - virtual btBvhTriangleMeshShape* createBvhTriangleMeshShape(btStridingMeshInterface* trimesh, btOptimizedBvh* bvh); - virtual btCollisionShape* createConvexTriangleMeshShape(btStridingMeshInterface* trimesh); -#ifdef SUPPORT_GIMPACT_SHAPE_IMPORT - virtual btGImpactMeshShape* createGimpactShape(btStridingMeshInterface* trimesh); -#endif //SUPPORT_GIMPACT_SHAPE_IMPORT - virtual btStridingMeshInterfaceData* createStridingMeshInterfaceData(btStridingMeshInterfaceData* interfaceData); - - virtual class btConvexHullShape* createConvexHullShape(); - virtual class btCompoundShape* createCompoundShape(); - virtual class btScaledBvhTriangleMeshShape* createScaledTrangleMeshShape(btBvhTriangleMeshShape* meshShape, const btVector3& localScalingbtBvhTriangleMeshShape); - - virtual class btMultiSphereShape* createMultiSphereShape(const btVector3* positions, const btScalar* radi, int numSpheres); - - virtual btTriangleIndexVertexArray* createMeshInterface(btStridingMeshInterfaceData& meshData); - - ///acceleration and connectivity structures - virtual btOptimizedBvh* createOptimizedBvh(); - virtual btTriangleInfoMap* createTriangleInfoMap(); -}; - -#endif //BT_WORLD_IMPORTER_H diff --git a/engine/inc/bullet/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.h b/engine/inc/bullet/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.h deleted file mode 100644 index 4ea5e771..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.h +++ /dev/null @@ -1,99 +0,0 @@ -/* -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_COMPOUND_COLLISION_ALGORITHM_H -#define BT_COMPOUND_COLLISION_ALGORITHM_H - -#include "btActivatingCollisionAlgorithm.h" -#include "BulletCollision/BroadphaseCollision/btDispatcher.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseInterface.h" - -#include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h" -class btDispatcher; -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" -#include "btCollisionCreateFunc.h" -#include "LinearMath/btAlignedObjectArray.h" -#include "BulletCollision/BroadphaseCollision/btDbvt.h" -class btDispatcher; -class btCollisionObject; - -class btCollisionShape; -typedef bool (*btShapePairCallback)(const btCollisionShape* pShape0, const btCollisionShape* pShape1); -extern btShapePairCallback gCompoundChildShapePairCallback; - -/// btCompoundCollisionAlgorithm supports collision between CompoundCollisionShapes and other collision shapes -class btCompoundCollisionAlgorithm : public btActivatingCollisionAlgorithm -{ - btNodeStack stack2; - btManifoldArray manifoldArray; - -protected: - btAlignedObjectArray m_childCollisionAlgorithms; - bool m_isSwapped; - - class btPersistentManifold* m_sharedManifold; - bool m_ownsManifold; - - int m_compoundShapeRevision; //to keep track of changes, so that childAlgorithm array can be updated - - void removeChildAlgorithms(); - - void preallocateChildAlgorithms(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap); - -public: - btCompoundCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, bool isSwapped); - - virtual ~btCompoundCollisionAlgorithm(); - - btCollisionAlgorithm* getChildAlgorithm(int n) const - { - return m_childCollisionAlgorithms[n]; - } - - virtual void processCollision(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut); - - btScalar calculateTimeOfImpact(btCollisionObject* body0, btCollisionObject* body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut); - - virtual void getAllContactManifolds(btManifoldArray& manifoldArray) - { - int i; - for (i = 0; i < m_childCollisionAlgorithms.size(); i++) - { - if (m_childCollisionAlgorithms[i]) - m_childCollisionAlgorithms[i]->getAllContactManifolds(manifoldArray); - } - } - - struct CreateFunc : public btCollisionAlgorithmCreateFunc - { - virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap) - { - void* mem = ci.m_dispatcher1->allocateCollisionAlgorithm(sizeof(btCompoundCollisionAlgorithm)); - return new (mem) btCompoundCollisionAlgorithm(ci, body0Wrap, body1Wrap, false); - } - }; - - struct SwappedCreateFunc : public btCollisionAlgorithmCreateFunc - { - virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap) - { - void* mem = ci.m_dispatcher1->allocateCollisionAlgorithm(sizeof(btCompoundCollisionAlgorithm)); - return new (mem) btCompoundCollisionAlgorithm(ci, body0Wrap, body1Wrap, true); - } - }; -}; - -#endif //BT_COMPOUND_COLLISION_ALGORITHM_H diff --git a/engine/inc/bullet/BulletCollision/CollisionDispatch/btCompoundCompoundCollisionAlgorithm.h b/engine/inc/bullet/BulletCollision/CollisionDispatch/btCompoundCompoundCollisionAlgorithm.h deleted file mode 100644 index a940d840..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionDispatch/btCompoundCompoundCollisionAlgorithm.h +++ /dev/null @@ -1,82 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2013 Erwin Coumans http://bulletphysics.org - -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_COMPOUND_COMPOUND_COLLISION_ALGORITHM_H -#define BT_COMPOUND_COMPOUND_COLLISION_ALGORITHM_H - -#include "btCompoundCollisionAlgorithm.h" - -#include "BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.h" -#include "BulletCollision/BroadphaseCollision/btDispatcher.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseInterface.h" - -#include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h" -class btDispatcher; -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" -#include "BulletCollision/CollisionDispatch/btCollisionCreateFunc.h" -#include "LinearMath/btAlignedObjectArray.h" -#include "BulletCollision/CollisionDispatch/btHashedSimplePairCache.h" -class btDispatcher; -class btCollisionObject; - -class btCollisionShape; - -extern btShapePairCallback gCompoundCompoundChildShapePairCallback; - -/// btCompoundCompoundCollisionAlgorithm supports collision between two btCompoundCollisionShape shapes -class btCompoundCompoundCollisionAlgorithm : public btCompoundCollisionAlgorithm -{ - class btHashedSimplePairCache* m_childCollisionAlgorithmCache; - btSimplePairArray m_removePairs; - - int m_compoundShapeRevision0; //to keep track of changes, so that childAlgorithm array can be updated - int m_compoundShapeRevision1; - - void removeChildAlgorithms(); - - // void preallocateChildAlgorithms(const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap); - -public: - btCompoundCompoundCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, bool isSwapped); - - virtual ~btCompoundCompoundCollisionAlgorithm(); - - virtual void processCollision(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut); - - btScalar calculateTimeOfImpact(btCollisionObject* body0, btCollisionObject* body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut); - - virtual void getAllContactManifolds(btManifoldArray& manifoldArray); - - struct CreateFunc : public btCollisionAlgorithmCreateFunc - { - virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap) - { - void* mem = ci.m_dispatcher1->allocateCollisionAlgorithm(sizeof(btCompoundCompoundCollisionAlgorithm)); - return new (mem) btCompoundCompoundCollisionAlgorithm(ci, body0Wrap, body1Wrap, false); - } - }; - - struct SwappedCreateFunc : public btCollisionAlgorithmCreateFunc - { - virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap) - { - void* mem = ci.m_dispatcher1->allocateCollisionAlgorithm(sizeof(btCompoundCompoundCollisionAlgorithm)); - return new (mem) btCompoundCompoundCollisionAlgorithm(ci, body0Wrap, body1Wrap, true); - } - }; -}; - -#endif //BT_COMPOUND_COMPOUND_COLLISION_ALGORITHM_H diff --git a/engine/inc/bullet/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.h b/engine/inc/bullet/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.h deleted file mode 100644 index 9fca463f..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.h +++ /dev/null @@ -1,83 +0,0 @@ -/* -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_CONVEX_2D_CONVEX_2D_ALGORITHM_H -#define BT_CONVEX_2D_CONVEX_2D_ALGORITHM_H - -#include "BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.h" -#include "BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h" -#include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" -#include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h" -#include "BulletCollision/CollisionDispatch/btCollisionCreateFunc.h" -#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" -#include "LinearMath/btTransformUtil.h" //for btConvexSeparatingDistanceUtil - -class btConvexPenetrationDepthSolver; - -///The convex2dConvex2dAlgorithm collision algorithm support 2d collision detection for btConvex2dShape -///Currently it requires the btMinkowskiPenetrationDepthSolver, it has support for 2d penetration depth computation -class btConvex2dConvex2dAlgorithm : public btActivatingCollisionAlgorithm -{ - btSimplexSolverInterface* m_simplexSolver; - btConvexPenetrationDepthSolver* m_pdSolver; - - bool m_ownManifold; - btPersistentManifold* m_manifoldPtr; - bool m_lowLevelOfDetail; - -public: - btConvex2dConvex2dAlgorithm(btPersistentManifold* mf, const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver, int numPerturbationIterations, int minimumPointsPerturbationThreshold); - - virtual ~btConvex2dConvex2dAlgorithm(); - - virtual void processCollision(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut); - - virtual btScalar calculateTimeOfImpact(btCollisionObject* body0, btCollisionObject* body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut); - - virtual void getAllContactManifolds(btManifoldArray& manifoldArray) - { - ///should we use m_ownManifold to avoid adding duplicates? - if (m_manifoldPtr && m_ownManifold) - manifoldArray.push_back(m_manifoldPtr); - } - - void setLowLevelOfDetail(bool useLowLevel); - - const btPersistentManifold* getManifold() - { - return m_manifoldPtr; - } - - struct CreateFunc : public btCollisionAlgorithmCreateFunc - { - btConvexPenetrationDepthSolver* m_pdSolver; - btSimplexSolverInterface* m_simplexSolver; - int m_numPerturbationIterations; - int m_minimumPointsPerturbationThreshold; - - CreateFunc(btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver); - - virtual ~CreateFunc(); - - virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap) - { - void* mem = ci.m_dispatcher1->allocateCollisionAlgorithm(sizeof(btConvex2dConvex2dAlgorithm)); - return new (mem) btConvex2dConvex2dAlgorithm(ci.m_manifold, ci, body0Wrap, body1Wrap, m_simplexSolver, m_pdSolver, m_numPerturbationIterations, m_minimumPointsPerturbationThreshold); - } - }; -}; - -#endif //BT_CONVEX_2D_CONVEX_2D_ALGORITHM_H diff --git a/engine/inc/bullet/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.h b/engine/inc/bullet/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.h deleted file mode 100644 index b72e4029..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.h +++ /dev/null @@ -1,117 +0,0 @@ -/* -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_CONVEX_CONCAVE_COLLISION_ALGORITHM_H -#define BT_CONVEX_CONCAVE_COLLISION_ALGORITHM_H - -#include "btActivatingCollisionAlgorithm.h" -#include "BulletCollision/BroadphaseCollision/btDispatcher.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseInterface.h" -#include "BulletCollision/CollisionShapes/btTriangleCallback.h" -#include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h" -class btDispatcher; -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" -#include "btCollisionCreateFunc.h" - -///For each triangle in the concave mesh that overlaps with the AABB of a convex (m_convexProxy), processTriangle is called. -ATTRIBUTE_ALIGNED16(class) -btConvexTriangleCallback : public btTriangleCallback -{ - btVector3 m_aabbMin; - btVector3 m_aabbMax; - - const btCollisionObjectWrapper* m_convexBodyWrap; - const btCollisionObjectWrapper* m_triBodyWrap; - - btManifoldResult* m_resultOut; - btDispatcher* m_dispatcher; - const btDispatcherInfo* m_dispatchInfoPtr; - btScalar m_collisionMarginTriangle; - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - int m_triangleCount; - - btPersistentManifold* m_manifoldPtr; - - btConvexTriangleCallback(btDispatcher * dispatcher, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, bool isSwapped); - - void setTimeStepAndCounters(btScalar collisionMarginTriangle, const btDispatcherInfo& dispatchInfo, const btCollisionObjectWrapper* convexBodyWrap, const btCollisionObjectWrapper* triBodyWrap, btManifoldResult* resultOut); - - void clearWrapperData() - { - m_convexBodyWrap = 0; - m_triBodyWrap = 0; - } - virtual ~btConvexTriangleCallback(); - - virtual void processTriangle(btVector3 * triangle, int partId, int triangleIndex); - - void clearCache(); - - SIMD_FORCE_INLINE const btVector3& getAabbMin() const - { - return m_aabbMin; - } - SIMD_FORCE_INLINE const btVector3& getAabbMax() const - { - return m_aabbMax; - } -}; - -/// btConvexConcaveCollisionAlgorithm supports collision between convex shapes and (concave) trianges meshes. -ATTRIBUTE_ALIGNED16(class) -btConvexConcaveCollisionAlgorithm : public btActivatingCollisionAlgorithm -{ - btConvexTriangleCallback m_btConvexTriangleCallback; - - bool m_isSwapped; - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btConvexConcaveCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, bool isSwapped); - - virtual ~btConvexConcaveCollisionAlgorithm(); - - virtual void processCollision(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut); - - btScalar calculateTimeOfImpact(btCollisionObject * body0, btCollisionObject * body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut); - - virtual void getAllContactManifolds(btManifoldArray & manifoldArray); - - void clearCache(); - - struct CreateFunc : public btCollisionAlgorithmCreateFunc - { - virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap) - { - void* mem = ci.m_dispatcher1->allocateCollisionAlgorithm(sizeof(btConvexConcaveCollisionAlgorithm)); - return new (mem) btConvexConcaveCollisionAlgorithm(ci, body0Wrap, body1Wrap, false); - } - }; - - struct SwappedCreateFunc : public btCollisionAlgorithmCreateFunc - { - virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap) - { - void* mem = ci.m_dispatcher1->allocateCollisionAlgorithm(sizeof(btConvexConcaveCollisionAlgorithm)); - return new (mem) btConvexConcaveCollisionAlgorithm(ci, body0Wrap, body1Wrap, true); - } - }; -}; - -#endif //BT_CONVEX_CONCAVE_COLLISION_ALGORITHM_H diff --git a/engine/inc/bullet/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h b/engine/inc/bullet/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h deleted file mode 100644 index eac5b4d8..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h +++ /dev/null @@ -1,101 +0,0 @@ -/* -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_CONVEX_CONVEX_ALGORITHM_H -#define BT_CONVEX_CONVEX_ALGORITHM_H - -#include "btActivatingCollisionAlgorithm.h" -#include "BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h" -#include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" -#include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h" -#include "btCollisionCreateFunc.h" -#include "btCollisionDispatcher.h" -#include "LinearMath/btTransformUtil.h" //for btConvexSeparatingDistanceUtil -#include "BulletCollision/NarrowPhaseCollision/btPolyhedralContactClipping.h" - -class btConvexPenetrationDepthSolver; - -///Enabling USE_SEPDISTANCE_UTIL2 requires 100% reliable distance computation. However, when using large size ratios GJK can be imprecise -///so the distance is not conservative. In that case, enabling this USE_SEPDISTANCE_UTIL2 would result in failing/missing collisions. -///Either improve GJK for large size ratios (testing a 100 units versus a 0.1 unit object) or only enable the util -///for certain pairs that have a small size ratio - -//#define USE_SEPDISTANCE_UTIL2 1 - -///The convexConvexAlgorithm collision algorithm implements time of impact, convex closest points and penetration depth calculations between two convex objects. -///Multiple contact points are calculated by perturbing the orientation of the smallest object orthogonal to the separating normal. -///This idea was described by Gino van den Bergen in this forum topic http://www.bulletphysics.com/Bullet/phpBB3/viewtopic.php?f=4&t=288&p=888#p888 -class btConvexConvexAlgorithm : public btActivatingCollisionAlgorithm -{ -#ifdef USE_SEPDISTANCE_UTIL2 - btConvexSeparatingDistanceUtil m_sepDistance; -#endif - btConvexPenetrationDepthSolver* m_pdSolver; - - btVertexArray worldVertsB1; - btVertexArray worldVertsB2; - - bool m_ownManifold; - btPersistentManifold* m_manifoldPtr; - bool m_lowLevelOfDetail; - - int m_numPerturbationIterations; - int m_minimumPointsPerturbationThreshold; - - ///cache separating vector to speedup collision detection - -public: - btConvexConvexAlgorithm(btPersistentManifold* mf, const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, btConvexPenetrationDepthSolver* pdSolver, int numPerturbationIterations, int minimumPointsPerturbationThreshold); - - virtual ~btConvexConvexAlgorithm(); - - virtual void processCollision(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut); - - virtual btScalar calculateTimeOfImpact(btCollisionObject* body0, btCollisionObject* body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut); - - virtual void getAllContactManifolds(btManifoldArray& manifoldArray) - { - ///should we use m_ownManifold to avoid adding duplicates? - if (m_manifoldPtr && m_ownManifold) - manifoldArray.push_back(m_manifoldPtr); - } - - void setLowLevelOfDetail(bool useLowLevel); - - const btPersistentManifold* getManifold() - { - return m_manifoldPtr; - } - - struct CreateFunc : public btCollisionAlgorithmCreateFunc - { - btConvexPenetrationDepthSolver* m_pdSolver; - int m_numPerturbationIterations; - int m_minimumPointsPerturbationThreshold; - - CreateFunc(btConvexPenetrationDepthSolver* pdSolver); - - virtual ~CreateFunc(); - - virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap) - { - void* mem = ci.m_dispatcher1->allocateCollisionAlgorithm(sizeof(btConvexConvexAlgorithm)); - return new (mem) btConvexConvexAlgorithm(ci.m_manifold, ci, body0Wrap, body1Wrap, m_pdSolver, m_numPerturbationIterations, m_minimumPointsPerturbationThreshold); - } - }; -}; - -#endif //BT_CONVEX_CONVEX_ALGORITHM_H diff --git a/engine/inc/bullet/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.h b/engine/inc/bullet/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.h deleted file mode 100644 index b693da11..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.h +++ /dev/null @@ -1,82 +0,0 @@ -/* -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_CONVEX_PLANE_COLLISION_ALGORITHM_H -#define BT_CONVEX_PLANE_COLLISION_ALGORITHM_H - -#include "BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" -#include "BulletCollision/CollisionDispatch/btCollisionCreateFunc.h" -class btPersistentManifold; -#include "btCollisionDispatcher.h" - -#include "LinearMath/btVector3.h" - -/// btSphereBoxCollisionAlgorithm provides sphere-box collision detection. -/// Other features are frame-coherency (persistent data) and collision response. -class btConvexPlaneCollisionAlgorithm : public btCollisionAlgorithm -{ - bool m_ownManifold; - btPersistentManifold* m_manifoldPtr; - bool m_isSwapped; - int m_numPerturbationIterations; - int m_minimumPointsPerturbationThreshold; - -public: - btConvexPlaneCollisionAlgorithm(btPersistentManifold* mf, const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, bool isSwapped, int numPerturbationIterations, int minimumPointsPerturbationThreshold); - - virtual ~btConvexPlaneCollisionAlgorithm(); - - virtual void processCollision(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut); - - void collideSingleContact(const btQuaternion& perturbeRot, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut); - - virtual btScalar calculateTimeOfImpact(btCollisionObject* body0, btCollisionObject* body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut); - - virtual void getAllContactManifolds(btManifoldArray& manifoldArray) - { - if (m_manifoldPtr && m_ownManifold) - { - manifoldArray.push_back(m_manifoldPtr); - } - } - - struct CreateFunc : public btCollisionAlgorithmCreateFunc - { - int m_numPerturbationIterations; - int m_minimumPointsPerturbationThreshold; - - CreateFunc() - : m_numPerturbationIterations(1), - m_minimumPointsPerturbationThreshold(0) - { - } - - virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap) - { - void* mem = ci.m_dispatcher1->allocateCollisionAlgorithm(sizeof(btConvexPlaneCollisionAlgorithm)); - if (!m_swapped) - { - return new (mem) btConvexPlaneCollisionAlgorithm(0, ci, body0Wrap, body1Wrap, false, m_numPerturbationIterations, m_minimumPointsPerturbationThreshold); - } - else - { - return new (mem) btConvexPlaneCollisionAlgorithm(0, ci, body0Wrap, body1Wrap, true, m_numPerturbationIterations, m_minimumPointsPerturbationThreshold); - } - } - }; -}; - -#endif //BT_CONVEX_PLANE_COLLISION_ALGORITHM_H diff --git a/engine/inc/bullet/BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.h b/engine/inc/bullet/BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.h deleted file mode 100644 index b39a3f41..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.h +++ /dev/null @@ -1,111 +0,0 @@ -/* -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_DEFAULT_COLLISION_CONFIGURATION -#define BT_DEFAULT_COLLISION_CONFIGURATION - -#include "btCollisionConfiguration.h" -class btVoronoiSimplexSolver; -class btConvexPenetrationDepthSolver; - -struct btDefaultCollisionConstructionInfo -{ - btPoolAllocator* m_persistentManifoldPool; - btPoolAllocator* m_collisionAlgorithmPool; - int m_defaultMaxPersistentManifoldPoolSize; - int m_defaultMaxCollisionAlgorithmPoolSize; - int m_customCollisionAlgorithmMaxElementSize; - int m_useEpaPenetrationAlgorithm; - - btDefaultCollisionConstructionInfo() - : m_persistentManifoldPool(0), - m_collisionAlgorithmPool(0), - m_defaultMaxPersistentManifoldPoolSize(4096), - m_defaultMaxCollisionAlgorithmPoolSize(4096), - m_customCollisionAlgorithmMaxElementSize(0), - m_useEpaPenetrationAlgorithm(true) - { - } -}; - -///btCollisionConfiguration allows to configure Bullet collision detection -///stack allocator, pool memory allocators -///@todo: describe the meaning -class btDefaultCollisionConfiguration : public btCollisionConfiguration -{ -protected: - int m_persistentManifoldPoolSize; - - btPoolAllocator* m_persistentManifoldPool; - bool m_ownsPersistentManifoldPool; - - btPoolAllocator* m_collisionAlgorithmPool; - bool m_ownsCollisionAlgorithmPool; - - //default penetration depth solver - btConvexPenetrationDepthSolver* m_pdSolver; - - //default CreationFunctions, filling the m_doubleDispatch table - btCollisionAlgorithmCreateFunc* m_convexConvexCreateFunc; - btCollisionAlgorithmCreateFunc* m_convexConcaveCreateFunc; - btCollisionAlgorithmCreateFunc* m_swappedConvexConcaveCreateFunc; - btCollisionAlgorithmCreateFunc* m_compoundCreateFunc; - btCollisionAlgorithmCreateFunc* m_compoundCompoundCreateFunc; - - btCollisionAlgorithmCreateFunc* m_swappedCompoundCreateFunc; - btCollisionAlgorithmCreateFunc* m_emptyCreateFunc; - btCollisionAlgorithmCreateFunc* m_sphereSphereCF; - btCollisionAlgorithmCreateFunc* m_sphereBoxCF; - btCollisionAlgorithmCreateFunc* m_boxSphereCF; - - btCollisionAlgorithmCreateFunc* m_boxBoxCF; - btCollisionAlgorithmCreateFunc* m_sphereTriangleCF; - btCollisionAlgorithmCreateFunc* m_triangleSphereCF; - btCollisionAlgorithmCreateFunc* m_planeConvexCF; - btCollisionAlgorithmCreateFunc* m_convexPlaneCF; - -public: - btDefaultCollisionConfiguration(const btDefaultCollisionConstructionInfo& constructionInfo = btDefaultCollisionConstructionInfo()); - - virtual ~btDefaultCollisionConfiguration(); - - ///memory pools - virtual btPoolAllocator* getPersistentManifoldPool() - { - return m_persistentManifoldPool; - } - - virtual btPoolAllocator* getCollisionAlgorithmPool() - { - return m_collisionAlgorithmPool; - } - - virtual btCollisionAlgorithmCreateFunc* getCollisionAlgorithmCreateFunc(int proxyType0, int proxyType1); - - virtual btCollisionAlgorithmCreateFunc* getClosestPointsAlgorithmCreateFunc(int proxyType0, int proxyType1); - - ///Use this method to allow to generate multiple contact points between at once, between two objects using the generic convex-convex algorithm. - ///By default, this feature is disabled for best performance. - ///@param numPerturbationIterations controls the number of collision queries. Set it to zero to disable the feature. - ///@param minimumPointsPerturbationThreshold is the minimum number of points in the contact cache, above which the feature is disabled - ///3 is a good value for both params, if you want to enable the feature. This is because the default contact cache contains a maximum of 4 points, and one collision query at the unperturbed orientation is performed first. - ///See Bullet/Demos/CollisionDemo for an example how this feature gathers multiple points. - ///@todo we could add a per-object setting of those parameters, for level-of-detail collision detection. - void setConvexConvexMultipointIterations(int numPerturbationIterations = 3, int minimumPointsPerturbationThreshold = 3); - - void setPlaneConvexMultipointIterations(int numPerturbationIterations = 3, int minimumPointsPerturbationThreshold = 3); -}; - -#endif //BT_DEFAULT_COLLISION_CONFIGURATION diff --git a/engine/inc/bullet/BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.h b/engine/inc/bullet/BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.h deleted file mode 100644 index 65ef83e0..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.h +++ /dev/null @@ -1,52 +0,0 @@ -/* -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_EMPTY_ALGORITH -#define BT_EMPTY_ALGORITH -#include "BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h" -#include "btCollisionCreateFunc.h" -#include "btCollisionDispatcher.h" - -#define ATTRIBUTE_ALIGNED(a) - -///EmptyAlgorithm is a stub for unsupported collision pairs. -///The dispatcher can dispatch a persistent btEmptyAlgorithm to avoid a search every frame. -class btEmptyAlgorithm : public btCollisionAlgorithm -{ -public: - btEmptyAlgorithm(const btCollisionAlgorithmConstructionInfo& ci); - - virtual void processCollision(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut); - - virtual btScalar calculateTimeOfImpact(btCollisionObject* body0, btCollisionObject* body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut); - - virtual void getAllContactManifolds(btManifoldArray& manifoldArray) - { - } - - struct CreateFunc : public btCollisionAlgorithmCreateFunc - { - virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap) - { - (void)body0Wrap; - (void)body1Wrap; - void* mem = ci.m_dispatcher1->allocateCollisionAlgorithm(sizeof(btEmptyAlgorithm)); - return new (mem) btEmptyAlgorithm(ci); - } - }; - -} ATTRIBUTE_ALIGNED(16); - -#endif //BT_EMPTY_ALGORITH diff --git a/engine/inc/bullet/BulletCollision/CollisionDispatch/btGhostObject.h b/engine/inc/bullet/BulletCollision/CollisionDispatch/btGhostObject.h deleted file mode 100644 index aa7f48d5..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionDispatch/btGhostObject.h +++ /dev/null @@ -1,162 +0,0 @@ -/* -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. -*/ - -#ifndef BT_GHOST_OBJECT_H -#define BT_GHOST_OBJECT_H - -#include "btCollisionObject.h" -#include "BulletCollision/BroadphaseCollision/btOverlappingPairCallback.h" -#include "LinearMath/btAlignedAllocator.h" -#include "BulletCollision/BroadphaseCollision/btOverlappingPairCache.h" -#include "btCollisionWorld.h" - -class btConvexShape; - -class btDispatcher; - -///The btGhostObject can keep track of all objects that are overlapping -///By default, this overlap is based on the AABB -///This is useful for creating a character controller, collision sensors/triggers, explosions etc. -///We plan on adding rayTest and other queries for the btGhostObject -ATTRIBUTE_ALIGNED16(class) -btGhostObject : public btCollisionObject -{ -protected: - btAlignedObjectArray m_overlappingObjects; - -public: - btGhostObject(); - - virtual ~btGhostObject(); - - void convexSweepTest(const class btConvexShape* castShape, const btTransform& convexFromWorld, const btTransform& convexToWorld, btCollisionWorld::ConvexResultCallback& resultCallback, btScalar allowedCcdPenetration = 0.f) const; - - void rayTest(const btVector3& rayFromWorld, const btVector3& rayToWorld, btCollisionWorld::RayResultCallback& resultCallback) const; - - ///this method is mainly for expert/internal use only. - virtual void addOverlappingObjectInternal(btBroadphaseProxy * otherProxy, btBroadphaseProxy* thisProxy = 0); - ///this method is mainly for expert/internal use only. - virtual void removeOverlappingObjectInternal(btBroadphaseProxy * otherProxy, btDispatcher * dispatcher, btBroadphaseProxy* thisProxy = 0); - - int getNumOverlappingObjects() const - { - return m_overlappingObjects.size(); - } - - btCollisionObject* getOverlappingObject(int index) - { - return m_overlappingObjects[index]; - } - - const btCollisionObject* getOverlappingObject(int index) const - { - return m_overlappingObjects[index]; - } - - btAlignedObjectArray& getOverlappingPairs() - { - return m_overlappingObjects; - } - - const btAlignedObjectArray getOverlappingPairs() const - { - return m_overlappingObjects; - } - - // - // internal cast - // - - static const btGhostObject* upcast(const btCollisionObject* colObj) - { - if (colObj->getInternalType() == CO_GHOST_OBJECT) - return (const btGhostObject*)colObj; - return 0; - } - static btGhostObject* upcast(btCollisionObject * colObj) - { - if (colObj->getInternalType() == CO_GHOST_OBJECT) - return (btGhostObject*)colObj; - return 0; - } -}; - -class btPairCachingGhostObject : public btGhostObject -{ - btHashedOverlappingPairCache* m_hashPairCache; - -public: - btPairCachingGhostObject(); - - virtual ~btPairCachingGhostObject(); - - ///this method is mainly for expert/internal use only. - virtual void addOverlappingObjectInternal(btBroadphaseProxy* otherProxy, btBroadphaseProxy* thisProxy = 0); - - virtual void removeOverlappingObjectInternal(btBroadphaseProxy* otherProxy, btDispatcher* dispatcher, btBroadphaseProxy* thisProxy = 0); - - btHashedOverlappingPairCache* getOverlappingPairCache() - { - return m_hashPairCache; - } -}; - -///The btGhostPairCallback interfaces and forwards adding and removal of overlapping pairs from the btBroadphaseInterface to btGhostObject. -class btGhostPairCallback : public btOverlappingPairCallback -{ -public: - btGhostPairCallback() - { - } - - virtual ~btGhostPairCallback() - { - } - - virtual btBroadphasePair* addOverlappingPair(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1) - { - btCollisionObject* colObj0 = (btCollisionObject*)proxy0->m_clientObject; - btCollisionObject* colObj1 = (btCollisionObject*)proxy1->m_clientObject; - btGhostObject* ghost0 = btGhostObject::upcast(colObj0); - btGhostObject* ghost1 = btGhostObject::upcast(colObj1); - if (ghost0) - ghost0->addOverlappingObjectInternal(proxy1, proxy0); - if (ghost1) - ghost1->addOverlappingObjectInternal(proxy0, proxy1); - return 0; - } - - virtual void* removeOverlappingPair(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1, btDispatcher* dispatcher) - { - btCollisionObject* colObj0 = (btCollisionObject*)proxy0->m_clientObject; - btCollisionObject* colObj1 = (btCollisionObject*)proxy1->m_clientObject; - btGhostObject* ghost0 = btGhostObject::upcast(colObj0); - btGhostObject* ghost1 = btGhostObject::upcast(colObj1); - if (ghost0) - ghost0->removeOverlappingObjectInternal(proxy1, dispatcher, proxy0); - if (ghost1) - ghost1->removeOverlappingObjectInternal(proxy0, dispatcher, proxy1); - return 0; - } - - virtual void removeOverlappingPairsContainingProxy(btBroadphaseProxy* /*proxy0*/, btDispatcher* /*dispatcher*/) - { - btAssert(0); - //need to keep track of all ghost objects and call them here - //m_hashPairCache->removeOverlappingPairsContainingProxy(proxy0,dispatcher); - } -}; - -#endif diff --git a/engine/inc/bullet/BulletCollision/CollisionDispatch/btHashedSimplePairCache.h b/engine/inc/bullet/BulletCollision/CollisionDispatch/btHashedSimplePairCache.h deleted file mode 100644 index fd38a4f0..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionDispatch/btHashedSimplePairCache.h +++ /dev/null @@ -1,149 +0,0 @@ -/* -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_HASHED_SIMPLE_PAIR_CACHE_H -#define BT_HASHED_SIMPLE_PAIR_CACHE_H - -#include "LinearMath/btAlignedObjectArray.h" - -const int BT_SIMPLE_NULL_PAIR = 0xffffffff; - -struct btSimplePair -{ - btSimplePair(int indexA, int indexB) - : m_indexA(indexA), - m_indexB(indexB), - m_userPointer(0) - { - } - - int m_indexA; - int m_indexB; - union { - void* m_userPointer; - int m_userValue; - }; -}; - -typedef btAlignedObjectArray btSimplePairArray; - -#ifdef BT_DEBUG_COLLISION_PAIRS -extern int gOverlappingSimplePairs; -extern int gRemoveSimplePairs; -extern int gAddedSimplePairs; -extern int gFindSimplePairs; -#endif //BT_DEBUG_COLLISION_PAIRS - -class btHashedSimplePairCache -{ - btSimplePairArray m_overlappingPairArray; - -protected: - btAlignedObjectArray m_hashTable; - btAlignedObjectArray m_next; - -public: - btHashedSimplePairCache(); - virtual ~btHashedSimplePairCache(); - - void removeAllPairs(); - - virtual void* removeOverlappingPair(int indexA, int indexB); - - // Add a pair and return the new pair. If the pair already exists, - // no new pair is created and the old one is returned. - virtual btSimplePair* addOverlappingPair(int indexA, int indexB) - { -#ifdef BT_DEBUG_COLLISION_PAIRS - gAddedSimplePairs++; -#endif - - return internalAddPair(indexA, indexB); - } - - virtual btSimplePair* getOverlappingPairArrayPtr() - { - return &m_overlappingPairArray[0]; - } - - const btSimplePair* getOverlappingPairArrayPtr() const - { - return &m_overlappingPairArray[0]; - } - - btSimplePairArray& getOverlappingPairArray() - { - return m_overlappingPairArray; - } - - const btSimplePairArray& getOverlappingPairArray() const - { - return m_overlappingPairArray; - } - - btSimplePair* findPair(int indexA, int indexB); - - int GetCount() const { return m_overlappingPairArray.size(); } - - int getNumOverlappingPairs() const - { - return m_overlappingPairArray.size(); - } - -private: - btSimplePair* internalAddPair(int indexA, int indexB); - - void growTables(); - - SIMD_FORCE_INLINE bool equalsPair(const btSimplePair& pair, int indexA, int indexB) - { - return pair.m_indexA == indexA && pair.m_indexB == indexB; - } - - SIMD_FORCE_INLINE unsigned int getHash(unsigned int indexA, unsigned int indexB) - { - unsigned int key = indexA | (indexB << 16); - // Thomas Wang's hash - - key += ~(key << 15); - key ^= (key >> 10); - key += (key << 3); - key ^= (key >> 6); - key += ~(key << 11); - key ^= (key >> 16); - return key; - } - - SIMD_FORCE_INLINE btSimplePair* internalFindPair(int proxyIdA, int proxyIdB, int hash) - { - int index = m_hashTable[hash]; - - while (index != BT_SIMPLE_NULL_PAIR && equalsPair(m_overlappingPairArray[index], proxyIdA, proxyIdB) == false) - { - index = m_next[index]; - } - - if (index == BT_SIMPLE_NULL_PAIR) - { - return NULL; - } - - btAssert(index < m_overlappingPairArray.size()); - - return &m_overlappingPairArray[index]; - } -}; - -#endif //BT_HASHED_SIMPLE_PAIR_CACHE_H diff --git a/engine/inc/bullet/BulletCollision/CollisionDispatch/btInternalEdgeUtility.h b/engine/inc/bullet/BulletCollision/CollisionDispatch/btInternalEdgeUtility.h deleted file mode 100644 index cc6d11c2..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionDispatch/btInternalEdgeUtility.h +++ /dev/null @@ -1,44 +0,0 @@ - -#ifndef BT_INTERNAL_EDGE_UTILITY_H -#define BT_INTERNAL_EDGE_UTILITY_H - -#include "LinearMath/btHashMap.h" -#include "LinearMath/btVector3.h" - -#include "BulletCollision/CollisionShapes/btTriangleInfoMap.h" - -///The btInternalEdgeUtility helps to avoid or reduce artifacts due to wrong collision normals caused by internal edges. -///See also http://code.google.com/p/bullet/issues/detail?id=27 - -class btBvhTriangleMeshShape; -class btCollisionObject; -struct btCollisionObjectWrapper; -class btManifoldPoint; -class btIDebugDraw; -class btHeightfieldTerrainShape; - -enum btInternalEdgeAdjustFlags -{ - BT_TRIANGLE_CONVEX_BACKFACE_MODE = 1, - BT_TRIANGLE_CONCAVE_DOUBLE_SIDED = 2, //double sided options are experimental, single sided is recommended - BT_TRIANGLE_CONVEX_DOUBLE_SIDED = 4 -}; - -///Call btGenerateInternalEdgeInfo to create triangle info, store in the shape 'userInfo' -void btGenerateInternalEdgeInfo(btBvhTriangleMeshShape* trimeshShape, btTriangleInfoMap* triangleInfoMap); - -void btGenerateInternalEdgeInfo(btHeightfieldTerrainShape* trimeshShape, btTriangleInfoMap* triangleInfoMap); - -///Call the btFixMeshNormal to adjust the collision normal, using the triangle info map (generated using btGenerateInternalEdgeInfo) -///If this info map is missing, or the triangle is not store in this map, nothing will be done -void btAdjustInternalEdgeContacts(btManifoldPoint& cp, const btCollisionObjectWrapper* trimeshColObj0Wrap, const btCollisionObjectWrapper* otherColObj1Wrap, int partId0, int index0, int normalAdjustFlags = 0); - -///Enable the BT_INTERNAL_EDGE_DEBUG_DRAW define and call btSetDebugDrawer, to get visual info to see if the internal edge utility works properly. -///If the utility doesn't work properly, you might have to adjust the threshold values in btTriangleInfoMap -//#define BT_INTERNAL_EDGE_DEBUG_DRAW - -#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW -void btSetDebugDrawer(btIDebugDraw* debugDrawer); -#endif //BT_INTERNAL_EDGE_DEBUG_DRAW - -#endif //BT_INTERNAL_EDGE_UTILITY_H diff --git a/engine/inc/bullet/BulletCollision/CollisionDispatch/btManifoldResult.h b/engine/inc/bullet/BulletCollision/CollisionDispatch/btManifoldResult.h deleted file mode 100644 index 6c0a2d9a..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionDispatch/btManifoldResult.h +++ /dev/null @@ -1,163 +0,0 @@ -/* -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_MANIFOLD_RESULT_H -#define BT_MANIFOLD_RESULT_H - -class btCollisionObject; -struct btCollisionObjectWrapper; - -#include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h" -class btManifoldPoint; - -#include "BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h" - -#include "LinearMath/btTransform.h" -#include "BulletCollision/CollisionDispatch/btCollisionObjectWrapper.h" -#include "BulletCollision/CollisionDispatch/btCollisionObject.h" - -typedef bool (*ContactAddedCallback)(btManifoldPoint& cp, const btCollisionObjectWrapper* colObj0Wrap, int partId0, int index0, const btCollisionObjectWrapper* colObj1Wrap, int partId1, int index1); -extern ContactAddedCallback gContactAddedCallback; - -//#define DEBUG_PART_INDEX 1 - -/// These callbacks are used to customize the algorith that combine restitution, friction, damping, Stiffness -typedef btScalar (*CalculateCombinedCallback)(const btCollisionObject* body0, const btCollisionObject* body1); - -extern CalculateCombinedCallback gCalculateCombinedRestitutionCallback; -extern CalculateCombinedCallback gCalculateCombinedFrictionCallback; -extern CalculateCombinedCallback gCalculateCombinedRollingFrictionCallback; -extern CalculateCombinedCallback gCalculateCombinedSpinningFrictionCallback; -extern CalculateCombinedCallback gCalculateCombinedContactDampingCallback; -extern CalculateCombinedCallback gCalculateCombinedContactStiffnessCallback; - -///btManifoldResult is a helper class to manage contact results. -class btManifoldResult : public btDiscreteCollisionDetectorInterface::Result -{ -protected: - btPersistentManifold* m_manifoldPtr; - - const btCollisionObjectWrapper* m_body0Wrap; - const btCollisionObjectWrapper* m_body1Wrap; - int m_partId0; - int m_partId1; - int m_index0; - int m_index1; - -public: - btManifoldResult() - : -#ifdef DEBUG_PART_INDEX - - m_partId0(-1), - m_partId1(-1), - m_index0(-1), - m_index1(-1) -#endif //DEBUG_PART_INDEX - m_closestPointDistanceThreshold(0) - { - } - - btManifoldResult(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap); - - virtual ~btManifoldResult(){}; - - void setPersistentManifold(btPersistentManifold* manifoldPtr) - { - m_manifoldPtr = manifoldPtr; - } - - const btPersistentManifold* getPersistentManifold() const - { - return m_manifoldPtr; - } - btPersistentManifold* getPersistentManifold() - { - return m_manifoldPtr; - } - - virtual void setShapeIdentifiersA(int partId0, int index0) - { - m_partId0 = partId0; - m_index0 = index0; - } - - virtual void setShapeIdentifiersB(int partId1, int index1) - { - m_partId1 = partId1; - m_index1 = index1; - } - - virtual void addContactPoint(const btVector3& normalOnBInWorld, const btVector3& pointInWorld, btScalar depth); - - SIMD_FORCE_INLINE void refreshContactPoints() - { - btAssert(m_manifoldPtr); - if (!m_manifoldPtr->getNumContacts()) - return; - - bool isSwapped = m_manifoldPtr->getBody0() != m_body0Wrap->getCollisionObject(); - - if (isSwapped) - { - m_manifoldPtr->refreshContactPoints(m_body1Wrap->getCollisionObject()->getWorldTransform(), m_body0Wrap->getCollisionObject()->getWorldTransform()); - } - else - { - m_manifoldPtr->refreshContactPoints(m_body0Wrap->getCollisionObject()->getWorldTransform(), m_body1Wrap->getCollisionObject()->getWorldTransform()); - } - } - - const btCollisionObjectWrapper* getBody0Wrap() const - { - return m_body0Wrap; - } - const btCollisionObjectWrapper* getBody1Wrap() const - { - return m_body1Wrap; - } - - void setBody0Wrap(const btCollisionObjectWrapper* obj0Wrap) - { - m_body0Wrap = obj0Wrap; - } - - void setBody1Wrap(const btCollisionObjectWrapper* obj1Wrap) - { - m_body1Wrap = obj1Wrap; - } - - const btCollisionObject* getBody0Internal() const - { - return m_body0Wrap->getCollisionObject(); - } - - const btCollisionObject* getBody1Internal() const - { - return m_body1Wrap->getCollisionObject(); - } - - btScalar m_closestPointDistanceThreshold; - - /// in the future we can let the user override the methods to combine restitution and friction - static btScalar calculateCombinedRestitution(const btCollisionObject* body0, const btCollisionObject* body1); - static btScalar calculateCombinedFriction(const btCollisionObject* body0, const btCollisionObject* body1); - static btScalar calculateCombinedRollingFriction(const btCollisionObject* body0, const btCollisionObject* body1); - static btScalar calculateCombinedSpinningFriction(const btCollisionObject* body0, const btCollisionObject* body1); - static btScalar calculateCombinedContactDamping(const btCollisionObject* body0, const btCollisionObject* body1); - static btScalar calculateCombinedContactStiffness(const btCollisionObject* body0, const btCollisionObject* body1); -}; - -#endif //BT_MANIFOLD_RESULT_H diff --git a/engine/inc/bullet/BulletCollision/CollisionDispatch/btSimulationIslandManager.h b/engine/inc/bullet/BulletCollision/CollisionDispatch/btSimulationIslandManager.h deleted file mode 100644 index 197bb457..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionDispatch/btSimulationIslandManager.h +++ /dev/null @@ -1,75 +0,0 @@ -/* -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_SIMULATION_ISLAND_MANAGER_H -#define BT_SIMULATION_ISLAND_MANAGER_H - -#include "BulletCollision/CollisionDispatch/btUnionFind.h" -#include "btCollisionCreateFunc.h" -#include "LinearMath/btAlignedObjectArray.h" -#include "btCollisionObject.h" - -class btCollisionObject; -class btCollisionWorld; -class btDispatcher; -class btPersistentManifold; - -///SimulationIslandManager creates and handles simulation islands, using btUnionFind -class btSimulationIslandManager -{ - btUnionFind m_unionFind; - - btAlignedObjectArray m_islandmanifold; - btAlignedObjectArray m_islandBodies; - - bool m_splitIslands; - -public: - btSimulationIslandManager(); - virtual ~btSimulationIslandManager(); - - void initUnionFind(int n); - - btUnionFind& getUnionFind() { return m_unionFind; } - - virtual void updateActivationState(btCollisionWorld* colWorld, btDispatcher* dispatcher); - virtual void storeIslandActivationState(btCollisionWorld* world); - - void findUnions(btDispatcher* dispatcher, btCollisionWorld* colWorld); - - struct IslandCallback - { - virtual ~IslandCallback(){}; - - virtual void processIsland(btCollisionObject** bodies, int numBodies, class btPersistentManifold** manifolds, int numManifolds, int islandId) = 0; - }; - - void buildAndProcessIslands(btDispatcher* dispatcher, btCollisionWorld* collisionWorld, IslandCallback* callback); - - void buildIslands(btDispatcher* dispatcher, btCollisionWorld* colWorld); - - void processIslands(btDispatcher* dispatcher, btCollisionWorld* collisionWorld, IslandCallback* callback); - - bool getSplitIslands() - { - return m_splitIslands; - } - void setSplitIslands(bool doSplitIslands) - { - m_splitIslands = doSplitIslands; - } -}; - -#endif //BT_SIMULATION_ISLAND_MANAGER_H diff --git a/engine/inc/bullet/BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.h b/engine/inc/bullet/BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.h deleted file mode 100644 index 3348bc89..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.h +++ /dev/null @@ -1,73 +0,0 @@ -/* -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_SPHERE_BOX_COLLISION_ALGORITHM_H -#define BT_SPHERE_BOX_COLLISION_ALGORITHM_H - -#include "btActivatingCollisionAlgorithm.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" -#include "BulletCollision/CollisionDispatch/btCollisionCreateFunc.h" -class btPersistentManifold; -#include "btCollisionDispatcher.h" - -#include "LinearMath/btVector3.h" - -/// btSphereBoxCollisionAlgorithm provides sphere-box collision detection. -/// Other features are frame-coherency (persistent data) and collision response. -class btSphereBoxCollisionAlgorithm : public btActivatingCollisionAlgorithm -{ - bool m_ownManifold; - btPersistentManifold* m_manifoldPtr; - bool m_isSwapped; - -public: - btSphereBoxCollisionAlgorithm(btPersistentManifold* mf, const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, bool isSwapped); - - virtual ~btSphereBoxCollisionAlgorithm(); - - virtual void processCollision(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut); - - virtual btScalar calculateTimeOfImpact(btCollisionObject* body0, btCollisionObject* body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut); - - virtual void getAllContactManifolds(btManifoldArray& manifoldArray) - { - if (m_manifoldPtr && m_ownManifold) - { - manifoldArray.push_back(m_manifoldPtr); - } - } - - bool getSphereDistance(const btCollisionObjectWrapper* boxObjWrap, btVector3& v3PointOnBox, btVector3& normal, btScalar& penetrationDepth, const btVector3& v3SphereCenter, btScalar fRadius, btScalar maxContactDistance); - - btScalar getSpherePenetration(btVector3 const& boxHalfExtent, btVector3 const& sphereRelPos, btVector3& closestPoint, btVector3& normal); - - struct CreateFunc : public btCollisionAlgorithmCreateFunc - { - virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap) - { - void* mem = ci.m_dispatcher1->allocateCollisionAlgorithm(sizeof(btSphereBoxCollisionAlgorithm)); - if (!m_swapped) - { - return new (mem) btSphereBoxCollisionAlgorithm(0, ci, body0Wrap, body1Wrap, false); - } - else - { - return new (mem) btSphereBoxCollisionAlgorithm(0, ci, body0Wrap, body1Wrap, true); - } - } - }; -}; - -#endif //BT_SPHERE_BOX_COLLISION_ALGORITHM_H diff --git a/engine/inc/bullet/BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.h b/engine/inc/bullet/BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.h deleted file mode 100644 index b08d0df7..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.h +++ /dev/null @@ -1,64 +0,0 @@ -/* -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_SPHERE_SPHERE_COLLISION_ALGORITHM_H -#define BT_SPHERE_SPHERE_COLLISION_ALGORITHM_H - -#include "btActivatingCollisionAlgorithm.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" -#include "BulletCollision/CollisionDispatch/btCollisionCreateFunc.h" -#include "btCollisionDispatcher.h" - -class btPersistentManifold; - -/// btSphereSphereCollisionAlgorithm provides sphere-sphere collision detection. -/// Other features are frame-coherency (persistent data) and collision response. -/// Also provides the most basic sample for custom/user btCollisionAlgorithm -class btSphereSphereCollisionAlgorithm : public btActivatingCollisionAlgorithm -{ - bool m_ownManifold; - btPersistentManifold* m_manifoldPtr; - -public: - btSphereSphereCollisionAlgorithm(btPersistentManifold* mf, const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* col0Wrap, const btCollisionObjectWrapper* col1Wrap); - - btSphereSphereCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci) - : btActivatingCollisionAlgorithm(ci) {} - - virtual void processCollision(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut); - - virtual btScalar calculateTimeOfImpact(btCollisionObject* body0, btCollisionObject* body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut); - - virtual void getAllContactManifolds(btManifoldArray& manifoldArray) - { - if (m_manifoldPtr && m_ownManifold) - { - manifoldArray.push_back(m_manifoldPtr); - } - } - - virtual ~btSphereSphereCollisionAlgorithm(); - - struct CreateFunc : public btCollisionAlgorithmCreateFunc - { - virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* col0Wrap, const btCollisionObjectWrapper* col1Wrap) - { - void* mem = ci.m_dispatcher1->allocateCollisionAlgorithm(sizeof(btSphereSphereCollisionAlgorithm)); - return new (mem) btSphereSphereCollisionAlgorithm(0, ci, col0Wrap, col1Wrap); - } - }; -}; - -#endif //BT_SPHERE_SPHERE_COLLISION_ALGORITHM_H diff --git a/engine/inc/bullet/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.h b/engine/inc/bullet/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.h deleted file mode 100644 index d660222f..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.h +++ /dev/null @@ -1,65 +0,0 @@ -/* -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_SPHERE_TRIANGLE_COLLISION_ALGORITHM_H -#define BT_SPHERE_TRIANGLE_COLLISION_ALGORITHM_H - -#include "btActivatingCollisionAlgorithm.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" -#include "BulletCollision/CollisionDispatch/btCollisionCreateFunc.h" -class btPersistentManifold; -#include "btCollisionDispatcher.h" - -/// btSphereSphereCollisionAlgorithm provides sphere-sphere collision detection. -/// Other features are frame-coherency (persistent data) and collision response. -/// Also provides the most basic sample for custom/user btCollisionAlgorithm -class btSphereTriangleCollisionAlgorithm : public btActivatingCollisionAlgorithm -{ - bool m_ownManifold; - btPersistentManifold* m_manifoldPtr; - bool m_swapped; - -public: - btSphereTriangleCollisionAlgorithm(btPersistentManifold* mf, const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, bool swapped); - - btSphereTriangleCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci) - : btActivatingCollisionAlgorithm(ci) {} - - virtual void processCollision(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut); - - virtual btScalar calculateTimeOfImpact(btCollisionObject* body0, btCollisionObject* body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut); - - virtual void getAllContactManifolds(btManifoldArray& manifoldArray) - { - if (m_manifoldPtr && m_ownManifold) - { - manifoldArray.push_back(m_manifoldPtr); - } - } - - virtual ~btSphereTriangleCollisionAlgorithm(); - - struct CreateFunc : public btCollisionAlgorithmCreateFunc - { - virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap) - { - void* mem = ci.m_dispatcher1->allocateCollisionAlgorithm(sizeof(btSphereTriangleCollisionAlgorithm)); - - return new (mem) btSphereTriangleCollisionAlgorithm(ci.m_manifold, ci, body0Wrap, body1Wrap, m_swapped); - } - }; -}; - -#endif //BT_SPHERE_TRIANGLE_COLLISION_ALGORITHM_H diff --git a/engine/inc/bullet/BulletCollision/CollisionDispatch/btUnionFind.h b/engine/inc/bullet/BulletCollision/CollisionDispatch/btUnionFind.h deleted file mode 100644 index d422ef55..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionDispatch/btUnionFind.h +++ /dev/null @@ -1,123 +0,0 @@ -/* -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_UNION_FIND_H -#define BT_UNION_FIND_H - -#include "LinearMath/btAlignedObjectArray.h" - -#define USE_PATH_COMPRESSION 1 - -///see for discussion of static island optimizations by Vroonsh here: http://code.google.com/p/bullet/issues/detail?id=406 -#define STATIC_SIMULATION_ISLAND_OPTIMIZATION 1 - -struct btElement -{ - int m_id; - int m_sz; -}; - -///UnionFind calculates connected subsets -// Implements weighted Quick Union with path compression -// optimization: could use short ints instead of ints (halving memory, would limit the number of rigid bodies to 64k, sounds reasonable) -class btUnionFind -{ -private: - btAlignedObjectArray m_elements; - -public: - btUnionFind(); - ~btUnionFind(); - - //this is a special operation, destroying the content of btUnionFind. - //it sorts the elements, based on island id, in order to make it easy to iterate over islands - void sortIslands(); - - void reset(int N); - - SIMD_FORCE_INLINE int getNumElements() const - { - return int(m_elements.size()); - } - SIMD_FORCE_INLINE bool isRoot(int x) const - { - return (x == m_elements[x].m_id); - } - - btElement& getElement(int index) - { - return m_elements[index]; - } - const btElement& getElement(int index) const - { - return m_elements[index]; - } - - void allocate(int N); - void Free(); - - int find(int p, int q) - { - return (find(p) == find(q)); - } - - void unite(int p, int q) - { - int i = find(p), j = find(q); - if (i == j) - return; - -#ifndef USE_PATH_COMPRESSION - //weighted quick union, this keeps the 'trees' balanced, and keeps performance of unite O( log(n) ) - if (m_elements[i].m_sz < m_elements[j].m_sz) - { - m_elements[i].m_id = j; - m_elements[j].m_sz += m_elements[i].m_sz; - } - else - { - m_elements[j].m_id = i; - m_elements[i].m_sz += m_elements[j].m_sz; - } -#else - m_elements[i].m_id = j; - m_elements[j].m_sz += m_elements[i].m_sz; -#endif //USE_PATH_COMPRESSION - } - - int find(int x) - { - //btAssert(x < m_N); - //btAssert(x >= 0); - - while (x != m_elements[x].m_id) - { - //not really a reason not to use path compression, and it flattens the trees/improves find performance dramatically - -#ifdef USE_PATH_COMPRESSION - const btElement* elementPtr = &m_elements[m_elements[x].m_id]; - m_elements[x].m_id = elementPtr->m_id; - x = elementPtr->m_id; -#else // - x = m_elements[x].m_id; -#endif - //btAssert(x < m_N); - //btAssert(x >= 0); - } - return x; - } -}; - -#endif //BT_UNION_FIND_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btBox2dShape.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btBox2dShape.h deleted file mode 100644 index 7e085f9e..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btBox2dShape.h +++ /dev/null @@ -1,339 +0,0 @@ -/* -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_OBB_BOX_2D_SHAPE_H -#define BT_OBB_BOX_2D_SHAPE_H - -#include "BulletCollision/CollisionShapes/btPolyhedralConvexShape.h" -#include "BulletCollision/CollisionShapes/btCollisionMargin.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" -#include "LinearMath/btVector3.h" -#include "LinearMath/btMinMax.h" - -///The btBox2dShape is a box primitive around the origin, its sides axis aligned with length specified by half extents, in local shape coordinates. When used as part of a btCollisionObject or btRigidBody it will be an oriented box in world space. -ATTRIBUTE_ALIGNED16(class) -btBox2dShape : public btPolyhedralConvexShape -{ - //btVector3 m_boxHalfExtents1; //use m_implicitShapeDimensions instead - - btVector3 m_centroid; - btVector3 m_vertices[4]; - btVector3 m_normals[4]; - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btVector3 getHalfExtentsWithMargin() const - { - btVector3 halfExtents = getHalfExtentsWithoutMargin(); - btVector3 margin(getMargin(), getMargin(), getMargin()); - halfExtents += margin; - return halfExtents; - } - - const btVector3& getHalfExtentsWithoutMargin() const - { - return m_implicitShapeDimensions; //changed in Bullet 2.63: assume the scaling and margin are included - } - - virtual btVector3 localGetSupportingVertex(const btVector3& vec) const - { - btVector3 halfExtents = getHalfExtentsWithoutMargin(); - btVector3 margin(getMargin(), getMargin(), getMargin()); - halfExtents += margin; - - return btVector3(btFsels(vec.x(), halfExtents.x(), -halfExtents.x()), - btFsels(vec.y(), halfExtents.y(), -halfExtents.y()), - btFsels(vec.z(), halfExtents.z(), -halfExtents.z())); - } - - SIMD_FORCE_INLINE btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec) const - { - const btVector3& halfExtents = getHalfExtentsWithoutMargin(); - - return btVector3(btFsels(vec.x(), halfExtents.x(), -halfExtents.x()), - btFsels(vec.y(), halfExtents.y(), -halfExtents.y()), - btFsels(vec.z(), halfExtents.z(), -halfExtents.z())); - } - - virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const - { - const btVector3& halfExtents = getHalfExtentsWithoutMargin(); - - for (int i = 0; i < numVectors; i++) - { - const btVector3& vec = vectors[i]; - supportVerticesOut[i].setValue(btFsels(vec.x(), halfExtents.x(), -halfExtents.x()), - btFsels(vec.y(), halfExtents.y(), -halfExtents.y()), - btFsels(vec.z(), halfExtents.z(), -halfExtents.z())); - } - } - - ///a btBox2dShape is a flat 2D box in the X-Y plane (Z extents are zero) - btBox2dShape(const btVector3& boxHalfExtents) - : btPolyhedralConvexShape(), - m_centroid(0, 0, 0) - { - m_vertices[0].setValue(-boxHalfExtents.getX(), -boxHalfExtents.getY(), 0); - m_vertices[1].setValue(boxHalfExtents.getX(), -boxHalfExtents.getY(), 0); - m_vertices[2].setValue(boxHalfExtents.getX(), boxHalfExtents.getY(), 0); - m_vertices[3].setValue(-boxHalfExtents.getX(), boxHalfExtents.getY(), 0); - - m_normals[0].setValue(0, -1, 0); - m_normals[1].setValue(1, 0, 0); - m_normals[2].setValue(0, 1, 0); - m_normals[3].setValue(-1, 0, 0); - - btScalar minDimension = boxHalfExtents.getX(); - if (minDimension > boxHalfExtents.getY()) - minDimension = boxHalfExtents.getY(); - - m_shapeType = BOX_2D_SHAPE_PROXYTYPE; - btVector3 margin(getMargin(), getMargin(), getMargin()); - m_implicitShapeDimensions = (boxHalfExtents * m_localScaling) - margin; - - setSafeMargin(minDimension); - }; - - virtual void setMargin(btScalar collisionMargin) - { - //correct the m_implicitShapeDimensions for the margin - btVector3 oldMargin(getMargin(), getMargin(), getMargin()); - btVector3 implicitShapeDimensionsWithMargin = m_implicitShapeDimensions + oldMargin; - - btConvexInternalShape::setMargin(collisionMargin); - btVector3 newMargin(getMargin(), getMargin(), getMargin()); - m_implicitShapeDimensions = implicitShapeDimensionsWithMargin - newMargin; - } - virtual void setLocalScaling(const btVector3& scaling) - { - btVector3 oldMargin(getMargin(), getMargin(), getMargin()); - btVector3 implicitShapeDimensionsWithMargin = m_implicitShapeDimensions + oldMargin; - btVector3 unScaledImplicitShapeDimensionsWithMargin = implicitShapeDimensionsWithMargin / m_localScaling; - - btConvexInternalShape::setLocalScaling(scaling); - - m_implicitShapeDimensions = (unScaledImplicitShapeDimensionsWithMargin * m_localScaling) - oldMargin; - } - - virtual void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const; - - virtual void calculateLocalInertia(btScalar mass, btVector3 & inertia) const; - - int getVertexCount() const - { - return 4; - } - - virtual int getNumVertices() const - { - return 4; - } - - const btVector3* getVertices() const - { - return &m_vertices[0]; - } - - const btVector3* getNormals() const - { - return &m_normals[0]; - } - - virtual void getPlane(btVector3 & planeNormal, btVector3 & planeSupport, int i) const - { - //this plane might not be aligned... - btVector4 plane; - getPlaneEquation(plane, i); - planeNormal = btVector3(plane.getX(), plane.getY(), plane.getZ()); - planeSupport = localGetSupportingVertex(-planeNormal); - } - - const btVector3& getCentroid() const - { - return m_centroid; - } - - virtual int getNumPlanes() const - { - return 6; - } - - virtual int getNumEdges() const - { - return 12; - } - - virtual void getVertex(int i, btVector3& vtx) const - { - btVector3 halfExtents = getHalfExtentsWithoutMargin(); - - vtx = btVector3( - halfExtents.x() * (1 - (i & 1)) - halfExtents.x() * (i & 1), - halfExtents.y() * (1 - ((i & 2) >> 1)) - halfExtents.y() * ((i & 2) >> 1), - halfExtents.z() * (1 - ((i & 4) >> 2)) - halfExtents.z() * ((i & 4) >> 2)); - } - - virtual void getPlaneEquation(btVector4 & plane, int i) const - { - btVector3 halfExtents = getHalfExtentsWithoutMargin(); - - switch (i) - { - case 0: - plane.setValue(btScalar(1.), btScalar(0.), btScalar(0.), -halfExtents.x()); - break; - case 1: - plane.setValue(btScalar(-1.), btScalar(0.), btScalar(0.), -halfExtents.x()); - break; - case 2: - plane.setValue(btScalar(0.), btScalar(1.), btScalar(0.), -halfExtents.y()); - break; - case 3: - plane.setValue(btScalar(0.), btScalar(-1.), btScalar(0.), -halfExtents.y()); - break; - case 4: - plane.setValue(btScalar(0.), btScalar(0.), btScalar(1.), -halfExtents.z()); - break; - case 5: - plane.setValue(btScalar(0.), btScalar(0.), btScalar(-1.), -halfExtents.z()); - break; - default: - btAssert(0); - } - } - - virtual void getEdge(int i, btVector3& pa, btVector3& pb) const - //virtual void getEdge(int i,Edge& edge) const - { - int edgeVert0 = 0; - int edgeVert1 = 0; - - switch (i) - { - case 0: - edgeVert0 = 0; - edgeVert1 = 1; - break; - case 1: - edgeVert0 = 0; - edgeVert1 = 2; - break; - case 2: - edgeVert0 = 1; - edgeVert1 = 3; - - break; - case 3: - edgeVert0 = 2; - edgeVert1 = 3; - break; - case 4: - edgeVert0 = 0; - edgeVert1 = 4; - break; - case 5: - edgeVert0 = 1; - edgeVert1 = 5; - - break; - case 6: - edgeVert0 = 2; - edgeVert1 = 6; - break; - case 7: - edgeVert0 = 3; - edgeVert1 = 7; - break; - case 8: - edgeVert0 = 4; - edgeVert1 = 5; - break; - case 9: - edgeVert0 = 4; - edgeVert1 = 6; - break; - case 10: - edgeVert0 = 5; - edgeVert1 = 7; - break; - case 11: - edgeVert0 = 6; - edgeVert1 = 7; - break; - default: - btAssert(0); - } - - getVertex(edgeVert0, pa); - getVertex(edgeVert1, pb); - } - - virtual bool isInside(const btVector3& pt, btScalar tolerance) const - { - btVector3 halfExtents = getHalfExtentsWithoutMargin(); - - //btScalar minDist = 2*tolerance; - - bool result = (pt.x() <= (halfExtents.x() + tolerance)) && - (pt.x() >= (-halfExtents.x() - tolerance)) && - (pt.y() <= (halfExtents.y() + tolerance)) && - (pt.y() >= (-halfExtents.y() - tolerance)) && - (pt.z() <= (halfExtents.z() + tolerance)) && - (pt.z() >= (-halfExtents.z() - tolerance)); - - return result; - } - - //debugging - virtual const char* getName() const - { - return "Box2d"; - } - - virtual int getNumPreferredPenetrationDirections() const - { - return 6; - } - - virtual void getPreferredPenetrationDirection(int index, btVector3& penetrationVector) const - { - switch (index) - { - case 0: - penetrationVector.setValue(btScalar(1.), btScalar(0.), btScalar(0.)); - break; - case 1: - penetrationVector.setValue(btScalar(-1.), btScalar(0.), btScalar(0.)); - break; - case 2: - penetrationVector.setValue(btScalar(0.), btScalar(1.), btScalar(0.)); - break; - case 3: - penetrationVector.setValue(btScalar(0.), btScalar(-1.), btScalar(0.)); - break; - case 4: - penetrationVector.setValue(btScalar(0.), btScalar(0.), btScalar(1.)); - break; - case 5: - penetrationVector.setValue(btScalar(0.), btScalar(0.), btScalar(-1.)); - break; - default: - btAssert(0); - } - } -}; - -#endif //BT_OBB_BOX_2D_SHAPE_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btBoxShape.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btBoxShape.h deleted file mode 100644 index 3c65505d..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btBoxShape.h +++ /dev/null @@ -1,291 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_OBB_BOX_MINKOWSKI_H -#define BT_OBB_BOX_MINKOWSKI_H - -#include "btPolyhedralConvexShape.h" -#include "btCollisionMargin.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" -#include "LinearMath/btVector3.h" -#include "LinearMath/btMinMax.h" - -///The btBoxShape is a box primitive around the origin, its sides axis aligned with length specified by half extents, in local shape coordinates. When used as part of a btCollisionObject or btRigidBody it will be an oriented box in world space. -ATTRIBUTE_ALIGNED16(class) -btBoxShape : public btPolyhedralConvexShape -{ - //btVector3 m_boxHalfExtents1; //use m_implicitShapeDimensions instead - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btVector3 getHalfExtentsWithMargin() const - { - btVector3 halfExtents = getHalfExtentsWithoutMargin(); - btVector3 margin(getMargin(), getMargin(), getMargin()); - halfExtents += margin; - return halfExtents; - } - - const btVector3& getHalfExtentsWithoutMargin() const - { - return m_implicitShapeDimensions; //scaling is included, margin is not - } - - virtual btVector3 localGetSupportingVertex(const btVector3& vec) const - { - btVector3 halfExtents = getHalfExtentsWithoutMargin(); - btVector3 margin(getMargin(), getMargin(), getMargin()); - halfExtents += margin; - - return btVector3(btFsels(vec.x(), halfExtents.x(), -halfExtents.x()), - btFsels(vec.y(), halfExtents.y(), -halfExtents.y()), - btFsels(vec.z(), halfExtents.z(), -halfExtents.z())); - } - - SIMD_FORCE_INLINE btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec) const - { - const btVector3& halfExtents = getHalfExtentsWithoutMargin(); - - return btVector3(btFsels(vec.x(), halfExtents.x(), -halfExtents.x()), - btFsels(vec.y(), halfExtents.y(), -halfExtents.y()), - btFsels(vec.z(), halfExtents.z(), -halfExtents.z())); - } - - virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const - { - const btVector3& halfExtents = getHalfExtentsWithoutMargin(); - - for (int i = 0; i < numVectors; i++) - { - const btVector3& vec = vectors[i]; - supportVerticesOut[i].setValue(btFsels(vec.x(), halfExtents.x(), -halfExtents.x()), - btFsels(vec.y(), halfExtents.y(), -halfExtents.y()), - btFsels(vec.z(), halfExtents.z(), -halfExtents.z())); - } - } - - btBoxShape(const btVector3& boxHalfExtents); - - virtual void setMargin(btScalar collisionMargin) - { - //correct the m_implicitShapeDimensions for the margin - btVector3 oldMargin(getMargin(), getMargin(), getMargin()); - btVector3 implicitShapeDimensionsWithMargin = m_implicitShapeDimensions + oldMargin; - - btConvexInternalShape::setMargin(collisionMargin); - btVector3 newMargin(getMargin(), getMargin(), getMargin()); - m_implicitShapeDimensions = implicitShapeDimensionsWithMargin - newMargin; - } - virtual void setLocalScaling(const btVector3& scaling) - { - btVector3 oldMargin(getMargin(), getMargin(), getMargin()); - btVector3 implicitShapeDimensionsWithMargin = m_implicitShapeDimensions + oldMargin; - btVector3 unScaledImplicitShapeDimensionsWithMargin = implicitShapeDimensionsWithMargin / m_localScaling; - - btConvexInternalShape::setLocalScaling(scaling); - - m_implicitShapeDimensions = (unScaledImplicitShapeDimensionsWithMargin * m_localScaling) - oldMargin; - } - - virtual void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const; - - virtual void calculateLocalInertia(btScalar mass, btVector3 & inertia) const; - - virtual void getPlane(btVector3 & planeNormal, btVector3 & planeSupport, int i) const - { - //this plane might not be aligned... - btVector4 plane; - getPlaneEquation(plane, i); - planeNormal = btVector3(plane.getX(), plane.getY(), plane.getZ()); - planeSupport = localGetSupportingVertex(-planeNormal); - } - - virtual int getNumPlanes() const - { - return 6; - } - - virtual int getNumVertices() const - { - return 8; - } - - virtual int getNumEdges() const - { - return 12; - } - - virtual void getVertex(int i, btVector3& vtx) const - { - btVector3 halfExtents = getHalfExtentsWithMargin(); - - vtx = btVector3( - halfExtents.x() * (1 - (i & 1)) - halfExtents.x() * (i & 1), - halfExtents.y() * (1 - ((i & 2) >> 1)) - halfExtents.y() * ((i & 2) >> 1), - halfExtents.z() * (1 - ((i & 4) >> 2)) - halfExtents.z() * ((i & 4) >> 2)); - } - - virtual void getPlaneEquation(btVector4 & plane, int i) const - { - btVector3 halfExtents = getHalfExtentsWithoutMargin(); - - switch (i) - { - case 0: - plane.setValue(btScalar(1.), btScalar(0.), btScalar(0.), -halfExtents.x()); - break; - case 1: - plane.setValue(btScalar(-1.), btScalar(0.), btScalar(0.), -halfExtents.x()); - break; - case 2: - plane.setValue(btScalar(0.), btScalar(1.), btScalar(0.), -halfExtents.y()); - break; - case 3: - plane.setValue(btScalar(0.), btScalar(-1.), btScalar(0.), -halfExtents.y()); - break; - case 4: - plane.setValue(btScalar(0.), btScalar(0.), btScalar(1.), -halfExtents.z()); - break; - case 5: - plane.setValue(btScalar(0.), btScalar(0.), btScalar(-1.), -halfExtents.z()); - break; - default: - btAssert(0); - } - } - - virtual void getEdge(int i, btVector3& pa, btVector3& pb) const - //virtual void getEdge(int i,Edge& edge) const - { - int edgeVert0 = 0; - int edgeVert1 = 0; - - switch (i) - { - case 0: - edgeVert0 = 0; - edgeVert1 = 1; - break; - case 1: - edgeVert0 = 0; - edgeVert1 = 2; - break; - case 2: - edgeVert0 = 1; - edgeVert1 = 3; - - break; - case 3: - edgeVert0 = 2; - edgeVert1 = 3; - break; - case 4: - edgeVert0 = 0; - edgeVert1 = 4; - break; - case 5: - edgeVert0 = 1; - edgeVert1 = 5; - - break; - case 6: - edgeVert0 = 2; - edgeVert1 = 6; - break; - case 7: - edgeVert0 = 3; - edgeVert1 = 7; - break; - case 8: - edgeVert0 = 4; - edgeVert1 = 5; - break; - case 9: - edgeVert0 = 4; - edgeVert1 = 6; - break; - case 10: - edgeVert0 = 5; - edgeVert1 = 7; - break; - case 11: - edgeVert0 = 6; - edgeVert1 = 7; - break; - default: - btAssert(0); - } - - getVertex(edgeVert0, pa); - getVertex(edgeVert1, pb); - } - - virtual bool isInside(const btVector3& pt, btScalar tolerance) const - { - btVector3 halfExtents = getHalfExtentsWithoutMargin(); - - //btScalar minDist = 2*tolerance; - - bool result = (pt.x() <= (halfExtents.x() + tolerance)) && - (pt.x() >= (-halfExtents.x() - tolerance)) && - (pt.y() <= (halfExtents.y() + tolerance)) && - (pt.y() >= (-halfExtents.y() - tolerance)) && - (pt.z() <= (halfExtents.z() + tolerance)) && - (pt.z() >= (-halfExtents.z() - tolerance)); - - return result; - } - - //debugging - virtual const char* getName() const - { - return "Box"; - } - - virtual int getNumPreferredPenetrationDirections() const - { - return 6; - } - - virtual void getPreferredPenetrationDirection(int index, btVector3& penetrationVector) const - { - switch (index) - { - case 0: - penetrationVector.setValue(btScalar(1.), btScalar(0.), btScalar(0.)); - break; - case 1: - penetrationVector.setValue(btScalar(-1.), btScalar(0.), btScalar(0.)); - break; - case 2: - penetrationVector.setValue(btScalar(0.), btScalar(1.), btScalar(0.)); - break; - case 3: - penetrationVector.setValue(btScalar(0.), btScalar(-1.), btScalar(0.)); - break; - case 4: - penetrationVector.setValue(btScalar(0.), btScalar(0.), btScalar(1.)); - break; - case 5: - penetrationVector.setValue(btScalar(0.), btScalar(0.), btScalar(-1.)); - break; - default: - btAssert(0); - } - } -}; - -#endif //BT_OBB_BOX_MINKOWSKI_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h deleted file mode 100644 index 8b2f2ee8..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h +++ /dev/null @@ -1,144 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_BVH_TRIANGLE_MESH_SHAPE_H -#define BT_BVH_TRIANGLE_MESH_SHAPE_H - -#include "btTriangleMeshShape.h" -#include "btOptimizedBvh.h" -#include "LinearMath/btAlignedAllocator.h" -#include "btTriangleInfoMap.h" - -///The btBvhTriangleMeshShape is a static-triangle mesh shape, it can only be used for fixed/non-moving objects. -///If you required moving concave triangle meshes, it is recommended to perform convex decomposition -///using HACD, see Bullet/Demos/ConvexDecompositionDemo. -///Alternatively, you can use btGimpactMeshShape for moving concave triangle meshes. -///btBvhTriangleMeshShape has several optimizations, such as bounding volume hierarchy and -///cache friendly traversal for PlayStation 3 Cell SPU. -///It is recommended to enable useQuantizedAabbCompression for better memory usage. -///It takes a triangle mesh as input, for example a btTriangleMesh or btTriangleIndexVertexArray. The btBvhTriangleMeshShape class allows for triangle mesh deformations by a refit or partialRefit method. -///Instead of building the bounding volume hierarchy acceleration structure, it is also possible to serialize (save) and deserialize (load) the structure from disk. -///See Demos\ConcaveDemo\ConcavePhysicsDemo.cpp for an example. -ATTRIBUTE_ALIGNED16(class) -btBvhTriangleMeshShape : public btTriangleMeshShape -{ - btOptimizedBvh* m_bvh; - btTriangleInfoMap* m_triangleInfoMap; - - bool m_useQuantizedAabbCompression; - bool m_ownsBvh; -#ifdef __clang__ - bool m_pad[11] __attribute__((unused)); ////need padding due to alignment -#else - bool m_pad[11]; ////need padding due to alignment -#endif - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btBvhTriangleMeshShape(btStridingMeshInterface * meshInterface, bool useQuantizedAabbCompression, bool buildBvh = true); - - ///optionally pass in a larger bvh aabb, used for quantization. This allows for deformations within this aabb - btBvhTriangleMeshShape(btStridingMeshInterface * meshInterface, bool useQuantizedAabbCompression, const btVector3& bvhAabbMin, const btVector3& bvhAabbMax, bool buildBvh = true); - - virtual ~btBvhTriangleMeshShape(); - - bool getOwnsBvh() const - { - return m_ownsBvh; - } - - void performRaycast(btTriangleCallback * callback, const btVector3& raySource, const btVector3& rayTarget); - void performConvexcast(btTriangleCallback * callback, const btVector3& boxSource, const btVector3& boxTarget, const btVector3& boxMin, const btVector3& boxMax); - - virtual void processAllTriangles(btTriangleCallback * callback, const btVector3& aabbMin, const btVector3& aabbMax) const; - - void refitTree(const btVector3& aabbMin, const btVector3& aabbMax); - - ///for a fast incremental refit of parts of the tree. Note: the entire AABB of the tree will become more conservative, it never shrinks - void partialRefitTree(const btVector3& aabbMin, const btVector3& aabbMax); - - //debugging - virtual const char* getName() const { return "BVHTRIANGLEMESH"; } - - virtual void setLocalScaling(const btVector3& scaling); - - btOptimizedBvh* getOptimizedBvh() - { - return m_bvh; - } - - void setOptimizedBvh(btOptimizedBvh * bvh, const btVector3& localScaling = btVector3(1, 1, 1)); - - void buildOptimizedBvh(); - - bool usesQuantizedAabbCompression() const - { - return m_useQuantizedAabbCompression; - } - - void setTriangleInfoMap(btTriangleInfoMap * triangleInfoMap) - { - m_triangleInfoMap = triangleInfoMap; - } - - const btTriangleInfoMap* getTriangleInfoMap() const - { - return m_triangleInfoMap; - } - - btTriangleInfoMap* getTriangleInfoMap() - { - return m_triangleInfoMap; - } - - virtual int calculateSerializeBufferSize() const; - - ///fills the dataBuffer and returns the struct name (and 0 on failure) - virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const; - - virtual void serializeSingleBvh(btSerializer * serializer) const; - - virtual void serializeSingleTriangleInfoMap(btSerializer * serializer) const; -}; - -// clang-format off - -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct btTriangleMeshShapeData -{ - btCollisionShapeData m_collisionShapeData; - - btStridingMeshInterfaceData m_meshInterface; - - btQuantizedBvhFloatData *m_quantizedFloatBvh; - btQuantizedBvhDoubleData *m_quantizedDoubleBvh; - - btTriangleInfoMapData *m_triangleInfoMap; - - float m_collisionMargin; - - char m_pad3[4]; - -}; - -// clang-format on - -SIMD_FORCE_INLINE int btBvhTriangleMeshShape::calculateSerializeBufferSize() const -{ - return sizeof(btTriangleMeshShapeData); -} - -#endif //BT_BVH_TRIANGLE_MESH_SHAPE_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btCapsuleShape.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btCapsuleShape.h deleted file mode 100644 index 138d0c0f..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btCapsuleShape.h +++ /dev/null @@ -1,182 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_CAPSULE_SHAPE_H -#define BT_CAPSULE_SHAPE_H - -#include "btConvexInternalShape.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types - -///The btCapsuleShape represents a capsule around the Y axis, there is also the btCapsuleShapeX aligned around the X axis and btCapsuleShapeZ around the Z axis. -///The total height is height+2*radius, so the height is just the height between the center of each 'sphere' of the capsule caps. -///The btCapsuleShape is a convex hull of two spheres. The btMultiSphereShape is a more general collision shape that takes the convex hull of multiple sphere, so it can also represent a capsule when just using two spheres. -ATTRIBUTE_ALIGNED16(class) -btCapsuleShape : public btConvexInternalShape -{ -protected: - int m_upAxis; - -protected: - ///only used for btCapsuleShapeZ and btCapsuleShapeX subclasses. - btCapsuleShape() : btConvexInternalShape() { m_shapeType = CAPSULE_SHAPE_PROXYTYPE; }; - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btCapsuleShape(btScalar radius, btScalar height); - - ///CollisionShape Interface - virtual void calculateLocalInertia(btScalar mass, btVector3 & inertia) const; - - /// btConvexShape Interface - virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec) const; - - virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const; - - virtual void setMargin(btScalar collisionMargin) - { - //don't override the margin for capsules, their entire radius == margin - (void)collisionMargin; - } - - virtual void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const - { - btVector3 halfExtents(getRadius(), getRadius(), getRadius()); - halfExtents[m_upAxis] = getRadius() + getHalfHeight(); - btMatrix3x3 abs_b = t.getBasis().absolute(); - btVector3 center = t.getOrigin(); - btVector3 extent = halfExtents.dot3(abs_b[0], abs_b[1], abs_b[2]); - - aabbMin = center - extent; - aabbMax = center + extent; - } - - virtual const char* getName() const - { - return "CapsuleShape"; - } - - int getUpAxis() const - { - return m_upAxis; - } - - btScalar getRadius() const - { - int radiusAxis = (m_upAxis + 2) % 3; - return m_implicitShapeDimensions[radiusAxis]; - } - - btScalar getHalfHeight() const - { - return m_implicitShapeDimensions[m_upAxis]; - } - - virtual void setLocalScaling(const btVector3& scaling) - { - btVector3 unScaledImplicitShapeDimensions = m_implicitShapeDimensions / m_localScaling; - btConvexInternalShape::setLocalScaling(scaling); - m_implicitShapeDimensions = (unScaledImplicitShapeDimensions * scaling); - //update m_collisionMargin, since entire radius==margin - int radiusAxis = (m_upAxis + 2) % 3; - m_collisionMargin = m_implicitShapeDimensions[radiusAxis]; - } - - virtual btVector3 getAnisotropicRollingFrictionDirection() const - { - btVector3 aniDir(0, 0, 0); - aniDir[getUpAxis()] = 1; - return aniDir; - } - - virtual int calculateSerializeBufferSize() const; - - ///fills the dataBuffer and returns the struct name (and 0 on failure) - virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const; - - SIMD_FORCE_INLINE void deSerializeFloat(struct btCapsuleShapeData * dataBuffer); -}; - -///btCapsuleShapeX represents a capsule around the Z axis -///the total height is height+2*radius, so the height is just the height between the center of each 'sphere' of the capsule caps. -class btCapsuleShapeX : public btCapsuleShape -{ -public: - btCapsuleShapeX(btScalar radius, btScalar height); - - //debugging - virtual const char* getName() const - { - return "CapsuleX"; - } -}; - -///btCapsuleShapeZ represents a capsule around the Z axis -///the total height is height+2*radius, so the height is just the height between the center of each 'sphere' of the capsule caps. -class btCapsuleShapeZ : public btCapsuleShape -{ -public: - btCapsuleShapeZ(btScalar radius, btScalar height); - - //debugging - virtual const char* getName() const - { - return "CapsuleZ"; - } -}; - -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct btCapsuleShapeData -{ - btConvexInternalShapeData m_convexInternalShapeData; - - int m_upAxis; - - char m_padding[4]; -}; - -SIMD_FORCE_INLINE int btCapsuleShape::calculateSerializeBufferSize() const -{ - return sizeof(btCapsuleShapeData); -} - -///fills the dataBuffer and returns the struct name (and 0 on failure) -SIMD_FORCE_INLINE const char* btCapsuleShape::serialize(void* dataBuffer, btSerializer* serializer) const -{ - btCapsuleShapeData* shapeData = (btCapsuleShapeData*)dataBuffer; - - btConvexInternalShape::serialize(&shapeData->m_convexInternalShapeData, serializer); - - shapeData->m_upAxis = m_upAxis; - - // Fill padding with zeros to appease msan. - shapeData->m_padding[0] = 0; - shapeData->m_padding[1] = 0; - shapeData->m_padding[2] = 0; - shapeData->m_padding[3] = 0; - - return "btCapsuleShapeData"; -} - -SIMD_FORCE_INLINE void btCapsuleShape::deSerializeFloat(btCapsuleShapeData* dataBuffer) -{ - m_implicitShapeDimensions.deSerializeFloat(dataBuffer->m_convexInternalShapeData.m_implicitShapeDimensions); - m_collisionMargin = dataBuffer->m_convexInternalShapeData.m_collisionMargin; - m_localScaling.deSerializeFloat(dataBuffer->m_convexInternalShapeData.m_localScaling); - //it is best to already pre-allocate the matching btCapsuleShape*(X/Z) version to match m_upAxis - m_upAxis = dataBuffer->m_upAxis; -} - -#endif //BT_CAPSULE_SHAPE_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btCollisionMargin.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btCollisionMargin.h deleted file mode 100644 index abd8ab3e..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btCollisionMargin.h +++ /dev/null @@ -1,24 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_COLLISION_MARGIN_H -#define BT_COLLISION_MARGIN_H - -///The CONVEX_DISTANCE_MARGIN is a default collision margin for convex collision shapes derived from btConvexInternalShape. -///This collision margin is used by Gjk and some other algorithms -///Note that when creating small objects, you need to make sure to set a smaller collision margin, using the 'setMargin' API -#define CONVEX_DISTANCE_MARGIN btScalar(0.04) // btScalar(0.1)//;//btScalar(0.01) - -#endif //BT_COLLISION_MARGIN_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btCollisionShape.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btCollisionShape.h deleted file mode 100644 index 16f9e0c7..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btCollisionShape.h +++ /dev/null @@ -1,174 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_COLLISION_SHAPE_H -#define BT_COLLISION_SHAPE_H - -#include "LinearMath/btTransform.h" -#include "LinearMath/btVector3.h" -#include "LinearMath/btMatrix3x3.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" //for the shape types -class btSerializer; - -///The btCollisionShape class provides an interface for collision shapes that can be shared among btCollisionObjects. -ATTRIBUTE_ALIGNED16(class) -btCollisionShape -{ -protected: - int m_shapeType; - void* m_userPointer; - int m_userIndex; - int m_userIndex2; - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btCollisionShape() : m_shapeType(INVALID_SHAPE_PROXYTYPE), m_userPointer(0), m_userIndex(-1), m_userIndex2(-1) - { - } - - virtual ~btCollisionShape() - { - } - - ///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 = 0; - - virtual void getBoundingSphere(btVector3 & center, btScalar & radius) const; - - ///getAngularMotionDisc returns the maximum radius needed for Conservative Advancement to handle time-of-impact with rotations. - virtual btScalar getAngularMotionDisc() const; - - virtual btScalar getContactBreakingThreshold(btScalar defaultContactThresholdFactor) const; - - ///calculateTemporalAabb calculates the enclosing aabb for the moving object over interval [0..timeStep) - ///result is conservative - void calculateTemporalAabb(const btTransform& curTrans, const btVector3& linvel, const btVector3& angvel, btScalar timeStep, btVector3& temporalAabbMin, btVector3& temporalAabbMax) const; - - SIMD_FORCE_INLINE bool isPolyhedral() const - { - return btBroadphaseProxy::isPolyhedral(getShapeType()); - } - - SIMD_FORCE_INLINE bool isConvex2d() const - { - return btBroadphaseProxy::isConvex2d(getShapeType()); - } - - SIMD_FORCE_INLINE bool isConvex() const - { - return btBroadphaseProxy::isConvex(getShapeType()); - } - SIMD_FORCE_INLINE bool isNonMoving() const - { - return btBroadphaseProxy::isNonMoving(getShapeType()); - } - SIMD_FORCE_INLINE bool isConcave() const - { - return btBroadphaseProxy::isConcave(getShapeType()); - } - SIMD_FORCE_INLINE bool isCompound() const - { - return btBroadphaseProxy::isCompound(getShapeType()); - } - - SIMD_FORCE_INLINE bool isSoftBody() const - { - return btBroadphaseProxy::isSoftBody(getShapeType()); - } - - ///isInfinite is used to catch simulation error (aabb check) - SIMD_FORCE_INLINE bool isInfinite() const - { - return btBroadphaseProxy::isInfinite(getShapeType()); - } - -#ifndef __SPU__ - virtual void setLocalScaling(const btVector3& scaling) = 0; - virtual const btVector3& getLocalScaling() const = 0; - virtual void calculateLocalInertia(btScalar mass, btVector3 & inertia) const = 0; - - //debugging support - virtual const char* getName() const = 0; -#endif //__SPU__ - - int getShapeType() const - { - return m_shapeType; - } - - ///the getAnisotropicRollingFrictionDirection can be used in combination with setAnisotropicFriction - ///See Bullet/Demos/RollingFrictionDemo for an example - virtual btVector3 getAnisotropicRollingFrictionDirection() const - { - return btVector3(1, 1, 1); - } - virtual void setMargin(btScalar margin) = 0; - virtual btScalar getMargin() const = 0; - - ///optional user data pointer - void setUserPointer(void* userPtr) - { - m_userPointer = userPtr; - } - - void* getUserPointer() const - { - return m_userPointer; - } - void setUserIndex(int index) - { - m_userIndex = index; - } - - int getUserIndex() const - { - return m_userIndex; - } - - void setUserIndex2(int index) - { - m_userIndex2 = index; - } - - int getUserIndex2() const - { - return m_userIndex2; - } - - virtual int calculateSerializeBufferSize() const; - - ///fills the dataBuffer and returns the struct name (and 0 on failure) - virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const; - - virtual void serializeSingleShape(btSerializer * serializer) const; -}; - -// clang-format off -// parser needs * with the name -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct btCollisionShapeData -{ - char *m_name; - int m_shapeType; - char m_padding[4]; -}; -// clang-format on -SIMD_FORCE_INLINE int btCollisionShape::calculateSerializeBufferSize() const -{ - return sizeof(btCollisionShapeData); -} - -#endif //BT_COLLISION_SHAPE_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btCompoundShape.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btCompoundShape.h deleted file mode 100644 index 7e2d0eb8..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btCompoundShape.h +++ /dev/null @@ -1,207 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_COMPOUND_SHAPE_H -#define BT_COMPOUND_SHAPE_H - -#include "btCollisionShape.h" - -#include "LinearMath/btVector3.h" -#include "LinearMath/btTransform.h" -#include "LinearMath/btMatrix3x3.h" -#include "btCollisionMargin.h" -#include "LinearMath/btAlignedObjectArray.h" - -//class btOptimizedBvh; -struct btDbvt; - -ATTRIBUTE_ALIGNED16(struct) -btCompoundShapeChild -{ - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btTransform m_transform; - btCollisionShape* m_childShape; - int m_childShapeType; - btScalar m_childMargin; - struct btDbvtNode* m_node; -}; - -SIMD_FORCE_INLINE bool operator==(const btCompoundShapeChild& c1, const btCompoundShapeChild& c2) -{ - return (c1.m_transform == c2.m_transform && - c1.m_childShape == c2.m_childShape && - c1.m_childShapeType == c2.m_childShapeType && - c1.m_childMargin == c2.m_childMargin); -} - -/// The btCompoundShape allows to store multiple other btCollisionShapes -/// This allows for moving concave collision objects. This is more general then the static concave btBvhTriangleMeshShape. -/// It has an (optional) dynamic aabb tree to accelerate early rejection tests. -/// @todo: This aabb tree can also be use to speed up ray tests on btCompoundShape, see http://code.google.com/p/bullet/issues/detail?id=25 -/// Currently, removal of child shapes is only supported when disabling the aabb tree (pass 'false' in the constructor of btCompoundShape) -ATTRIBUTE_ALIGNED16(class) -btCompoundShape : public btCollisionShape -{ -protected: - btAlignedObjectArray m_children; - btVector3 m_localAabbMin; - btVector3 m_localAabbMax; - - btDbvt* m_dynamicAabbTree; - - ///increment m_updateRevision when adding/removing/replacing child shapes, so that some caches can be updated - int m_updateRevision; - - btScalar m_collisionMargin; - - btVector3 m_localScaling; - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - explicit btCompoundShape(bool enableDynamicAabbTree = true, const int initialChildCapacity = 0); - - virtual ~btCompoundShape(); - - void addChildShape(const btTransform& localTransform, btCollisionShape* shape); - - /// Remove all children shapes that contain the specified shape - virtual void removeChildShape(btCollisionShape * shape); - - void removeChildShapeByIndex(int childShapeindex); - - int getNumChildShapes() const - { - return int(m_children.size()); - } - - btCollisionShape* getChildShape(int index) - { - return m_children[index].m_childShape; - } - const btCollisionShape* getChildShape(int index) const - { - return m_children[index].m_childShape; - } - - btTransform& getChildTransform(int index) - { - return m_children[index].m_transform; - } - const btTransform& getChildTransform(int index) const - { - return m_children[index].m_transform; - } - - ///set a new transform for a child, and update internal data structures (local aabb and dynamic tree) - void updateChildTransform(int childIndex, const btTransform& newChildTransform, bool shouldRecalculateLocalAabb = true); - - btCompoundShapeChild* getChildList() - { - return &m_children[0]; - } - - ///getAabb's default implementation is brute force, expected derived classes to implement a fast dedicated version - virtual void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const; - - /** Re-calculate the local Aabb. Is called at the end of removeChildShapes. - Use this yourself if you modify the children or their transforms. */ - virtual void recalculateLocalAabb(); - - virtual void setLocalScaling(const btVector3& scaling); - - virtual const btVector3& getLocalScaling() const - { - return m_localScaling; - } - - virtual void calculateLocalInertia(btScalar mass, btVector3 & inertia) const; - - virtual void setMargin(btScalar margin) - { - m_collisionMargin = margin; - } - virtual btScalar getMargin() const - { - return m_collisionMargin; - } - virtual const char* getName() const - { - return "Compound"; - } - - const btDbvt* getDynamicAabbTree() const - { - return m_dynamicAabbTree; - } - - btDbvt* getDynamicAabbTree() - { - return m_dynamicAabbTree; - } - - void createAabbTreeFromChildren(); - - ///computes the exact moment of inertia and the transform from the coordinate system defined by the principal axes of the moment of inertia - ///and the center of mass to the current coordinate system. "masses" points to an array of masses of the children. The resulting transform - ///"principal" has to be applied inversely to all children transforms in order for the local coordinate system of the compound - ///shape to be centered at the center of mass and to coincide with the principal axes. This also necessitates a correction of the world transform - ///of the collision object by the principal transform. - void calculatePrincipalAxisTransform(const btScalar* masses, btTransform& principal, btVector3& inertia) const; - - int getUpdateRevision() const - { - return m_updateRevision; - } - - virtual int calculateSerializeBufferSize() const; - - ///fills the dataBuffer and returns the struct name (and 0 on failure) - virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const; -}; - -// clang-format off - -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct btCompoundShapeChildData -{ - btTransformFloatData m_transform; - btCollisionShapeData *m_childShape; - int m_childShapeType; - float m_childMargin; -}; - -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct btCompoundShapeData -{ - btCollisionShapeData m_collisionShapeData; - - btCompoundShapeChildData *m_childShapePtr; - - int m_numChildShapes; - - float m_collisionMargin; - -}; - -// clang-format on - -SIMD_FORCE_INLINE int btCompoundShape::calculateSerializeBufferSize() const -{ - return sizeof(btCompoundShapeData); -} - -#endif //BT_COMPOUND_SHAPE_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btConcaveShape.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btConcaveShape.h deleted file mode 100644 index 716624e1..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btConcaveShape.h +++ /dev/null @@ -1,62 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_CONCAVE_SHAPE_H -#define BT_CONCAVE_SHAPE_H - -#include "btCollisionShape.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types -#include "btTriangleCallback.h" - -/// PHY_ScalarType enumerates possible scalar types. -/// See the btStridingMeshInterface or btHeightfieldTerrainShape for its use -typedef enum PHY_ScalarType -{ - PHY_FLOAT, - PHY_DOUBLE, - PHY_INTEGER, - PHY_SHORT, - PHY_FIXEDPOINT88, - PHY_UCHAR -} PHY_ScalarType; - -///The btConcaveShape class provides an interface for non-moving (static) concave shapes. -///It has been implemented by the btStaticPlaneShape, btBvhTriangleMeshShape and btHeightfieldTerrainShape. -ATTRIBUTE_ALIGNED16(class) -btConcaveShape : public btCollisionShape -{ -protected: - btScalar m_collisionMargin; - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btConcaveShape(); - - virtual ~btConcaveShape(); - - virtual void processAllTriangles(btTriangleCallback * callback, const btVector3& aabbMin, const btVector3& aabbMax) const = 0; - - virtual btScalar getMargin() const - { - return m_collisionMargin; - } - virtual void setMargin(btScalar collisionMargin) - { - m_collisionMargin = collisionMargin; - } -}; - -#endif //BT_CONCAVE_SHAPE_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btConeShape.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btConeShape.h deleted file mode 100644 index 49f26bc4..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btConeShape.h +++ /dev/null @@ -1,175 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_CONE_MINKOWSKI_H -#define BT_CONE_MINKOWSKI_H - -#include "btConvexInternalShape.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types - -///The btConeShape implements a cone shape primitive, centered around the origin and aligned with the Y axis. The btConeShapeX is aligned around the X axis and btConeShapeZ around the Z axis. -ATTRIBUTE_ALIGNED16(class) -btConeShape : public btConvexInternalShape - -{ - btScalar m_sinAngle; - btScalar m_radius; - btScalar m_height; - int m_coneIndices[3]; - btVector3 coneLocalSupport(const btVector3& v) const; - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btConeShape(btScalar radius, btScalar height); - - virtual btVector3 localGetSupportingVertex(const btVector3& vec) const; - virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec) const; - virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const; - - btScalar getRadius() const { return m_radius; } - btScalar getHeight() const { return m_height; } - - void setRadius(const btScalar radius) - { - m_radius = radius; - } - void setHeight(const btScalar height) - { - m_height = height; - } - - virtual void calculateLocalInertia(btScalar mass, btVector3 & inertia) const - { - btTransform identity; - identity.setIdentity(); - btVector3 aabbMin, aabbMax; - getAabb(identity, aabbMin, aabbMax); - - btVector3 halfExtents = (aabbMax - aabbMin) * btScalar(0.5); - - btScalar margin = getMargin(); - - btScalar lx = btScalar(2.) * (halfExtents.x() + margin); - btScalar ly = btScalar(2.) * (halfExtents.y() + margin); - btScalar lz = btScalar(2.) * (halfExtents.z() + margin); - const btScalar x2 = lx * lx; - const btScalar y2 = ly * ly; - const btScalar z2 = lz * lz; - const btScalar scaledmass = mass * btScalar(0.08333333); - - inertia = scaledmass * (btVector3(y2 + z2, x2 + z2, x2 + y2)); - - // inertia.x() = scaledmass * (y2+z2); - // inertia.y() = scaledmass * (x2+z2); - // inertia.z() = scaledmass * (x2+y2); - } - - virtual const char* getName() const - { - return "Cone"; - } - - ///choose upAxis index - void setConeUpIndex(int upIndex); - - int getConeUpIndex() const - { - return m_coneIndices[1]; - } - - virtual btVector3 getAnisotropicRollingFrictionDirection() const - { - return btVector3(0, 1, 0); - } - - virtual void setLocalScaling(const btVector3& scaling); - - virtual int calculateSerializeBufferSize() const; - - ///fills the dataBuffer and returns the struct name (and 0 on failure) - virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const; -}; - -///btConeShape implements a Cone shape, around the X axis -class btConeShapeX : public btConeShape -{ -public: - btConeShapeX(btScalar radius, btScalar height); - - virtual btVector3 getAnisotropicRollingFrictionDirection() const - { - return btVector3(1, 0, 0); - } - - //debugging - virtual const char* getName() const - { - return "ConeX"; - } -}; - -///btConeShapeZ implements a Cone shape, around the Z axis -class btConeShapeZ : public btConeShape -{ -public: - btConeShapeZ(btScalar radius, btScalar height); - - virtual btVector3 getAnisotropicRollingFrictionDirection() const - { - return btVector3(0, 0, 1); - } - - //debugging - virtual const char* getName() const - { - return "ConeZ"; - } -}; - -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct btConeShapeData -{ - btConvexInternalShapeData m_convexInternalShapeData; - - int m_upIndex; - - char m_padding[4]; -}; - -SIMD_FORCE_INLINE int btConeShape::calculateSerializeBufferSize() const -{ - return sizeof(btConeShapeData); -} - -///fills the dataBuffer and returns the struct name (and 0 on failure) -SIMD_FORCE_INLINE const char* btConeShape::serialize(void* dataBuffer, btSerializer* serializer) const -{ - btConeShapeData* shapeData = (btConeShapeData*)dataBuffer; - - btConvexInternalShape::serialize(&shapeData->m_convexInternalShapeData, serializer); - - shapeData->m_upIndex = m_coneIndices[1]; - - // Fill padding with zeros to appease msan. - shapeData->m_padding[0] = 0; - shapeData->m_padding[1] = 0; - shapeData->m_padding[2] = 0; - shapeData->m_padding[3] = 0; - - return "btConeShapeData"; -} - -#endif //BT_CONE_MINKOWSKI_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btConvex2dShape.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btConvex2dShape.h deleted file mode 100644 index cd4f1ef7..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btConvex2dShape.h +++ /dev/null @@ -1,77 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_CONVEX_2D_SHAPE_H -#define BT_CONVEX_2D_SHAPE_H - -#include "BulletCollision/CollisionShapes/btConvexShape.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types - -///The btConvex2dShape allows to use arbitrary convex shapes as 2d convex shapes, with the Z component assumed to be 0. -///For 2d boxes, the btBox2dShape is recommended. -ATTRIBUTE_ALIGNED16(class) -btConvex2dShape : public btConvexShape -{ - btConvexShape* m_childConvexShape; - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btConvex2dShape(btConvexShape * convexChildShape); - - virtual ~btConvex2dShape(); - - virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec) const; - - virtual btVector3 localGetSupportingVertex(const btVector3& vec) const; - - virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const; - - virtual void calculateLocalInertia(btScalar mass, btVector3 & inertia) const; - - btConvexShape* getChildShape() - { - return m_childConvexShape; - } - - const btConvexShape* getChildShape() const - { - return m_childConvexShape; - } - - virtual const char* getName() const - { - return "Convex2dShape"; - } - - /////////////////////////// - - ///getAabb's default implementation is brute force, expected derived classes to implement a fast dedicated version - void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const; - - virtual void getAabbSlow(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const; - - virtual void setLocalScaling(const btVector3& scaling); - virtual const btVector3& getLocalScaling() const; - - virtual void setMargin(btScalar margin); - virtual btScalar getMargin() const; - - virtual int getNumPreferredPenetrationDirections() const; - - virtual void getPreferredPenetrationDirection(int index, btVector3& penetrationVector) const; -}; - -#endif //BT_CONVEX_2D_SHAPE_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btConvexHullShape.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btConvexHullShape.h deleted file mode 100644 index 96136d7d..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btConvexHullShape.h +++ /dev/null @@ -1,116 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_CONVEX_HULL_SHAPE_H -#define BT_CONVEX_HULL_SHAPE_H - -#include "btPolyhedralConvexShape.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types -#include "LinearMath/btAlignedObjectArray.h" - -///The btConvexHullShape implements an implicit convex hull of an array of vertices. -///Bullet provides a general and fast collision detector for convex shapes based on GJK and EPA using localGetSupportingVertex. -ATTRIBUTE_ALIGNED16(class) -btConvexHullShape : public btPolyhedralConvexAabbCachingShape -{ - btAlignedObjectArray m_unscaledPoints; - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - ///this constructor optionally takes in a pointer to points. Each point is assumed to be 3 consecutive btScalar (x,y,z), the striding defines the number of bytes between each point, in memory. - ///It is easier to not pass any points in the constructor, and just add one point at a time, using addPoint. - ///btConvexHullShape make an internal copy of the points. - btConvexHullShape(const btScalar* points = 0, int numPoints = 0, int stride = sizeof(btVector3)); - - void addPoint(const btVector3& point, bool recalculateLocalAabb = true); - - btVector3* getUnscaledPoints() - { - return &m_unscaledPoints[0]; - } - - const btVector3* getUnscaledPoints() const - { - return &m_unscaledPoints[0]; - } - - ///getPoints is obsolete, please use getUnscaledPoints - const btVector3* getPoints() const - { - return getUnscaledPoints(); - } - - void optimizeConvexHull(); - - SIMD_FORCE_INLINE btVector3 getScaledPoint(int i) const - { - return m_unscaledPoints[i] * m_localScaling; - } - - SIMD_FORCE_INLINE int getNumPoints() const - { - return m_unscaledPoints.size(); - } - - virtual btVector3 localGetSupportingVertex(const btVector3& vec) const; - virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec) const; - virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const; - - virtual void project(const btTransform& trans, const btVector3& dir, btScalar& minProj, btScalar& maxProj, btVector3& witnesPtMin, btVector3& witnesPtMax) const; - - //debugging - virtual const char* getName() const { return "Convex"; } - - virtual int getNumVertices() const; - virtual int getNumEdges() const; - virtual void getEdge(int i, btVector3& pa, btVector3& pb) const; - virtual void getVertex(int i, btVector3& vtx) const; - virtual int getNumPlanes() const; - virtual void getPlane(btVector3 & planeNormal, btVector3 & planeSupport, int i) const; - virtual bool isInside(const btVector3& pt, btScalar tolerance) const; - - ///in case we receive negative scaling - virtual void setLocalScaling(const btVector3& scaling); - - virtual int calculateSerializeBufferSize() const; - - ///fills the dataBuffer and returns the struct name (and 0 on failure) - virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const; -}; - -// clang-format off - -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct btConvexHullShapeData -{ - btConvexInternalShapeData m_convexInternalShapeData; - - btVector3FloatData *m_unscaledPointsFloatPtr; - btVector3DoubleData *m_unscaledPointsDoublePtr; - - int m_numUnscaledPoints; - char m_padding3[4]; - -}; - -// clang-format on - -SIMD_FORCE_INLINE int btConvexHullShape::calculateSerializeBufferSize() const -{ - return sizeof(btConvexHullShapeData); -} - -#endif //BT_CONVEX_HULL_SHAPE_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btConvexInternalShape.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btConvexInternalShape.h deleted file mode 100644 index a28c57de..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btConvexInternalShape.h +++ /dev/null @@ -1,208 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_CONVEX_INTERNAL_SHAPE_H -#define BT_CONVEX_INTERNAL_SHAPE_H - -#include "btConvexShape.h" -#include "LinearMath/btAabbUtil2.h" - -///The btConvexInternalShape is an internal base class, shared by most convex shape implementations. -///The btConvexInternalShape uses a default collision margin set to CONVEX_DISTANCE_MARGIN. -///This collision margin used by Gjk and some other algorithms, see also btCollisionMargin.h -///Note that when creating small shapes (derived from btConvexInternalShape), -///you need to make sure to set a smaller collision margin, using the 'setMargin' API -///There is a automatic mechanism 'setSafeMargin' used by btBoxShape and btCylinderShape -ATTRIBUTE_ALIGNED16(class) -btConvexInternalShape : public btConvexShape -{ -protected: - //local scaling. collisionMargin is not scaled ! - btVector3 m_localScaling; - - btVector3 m_implicitShapeDimensions; - - btScalar m_collisionMargin; - - btScalar m_padding; - - btConvexInternalShape(); - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - virtual ~btConvexInternalShape() - { - } - - virtual btVector3 localGetSupportingVertex(const btVector3& vec) const; - - const btVector3& getImplicitShapeDimensions() const - { - return m_implicitShapeDimensions; - } - - ///warning: use setImplicitShapeDimensions with care - ///changing a collision shape while the body is in the world is not recommended, - ///it is best to remove the body from the world, then make the change, and re-add it - ///alternatively flush the contact points, see documentation for 'cleanProxyFromPairs' - void setImplicitShapeDimensions(const btVector3& dimensions) - { - m_implicitShapeDimensions = dimensions; - } - - void setSafeMargin(btScalar minDimension, btScalar defaultMarginMultiplier = 0.1f) - { - btScalar safeMargin = defaultMarginMultiplier * minDimension; - if (safeMargin < getMargin()) - { - setMargin(safeMargin); - } - } - void setSafeMargin(const btVector3& halfExtents, btScalar defaultMarginMultiplier = 0.1f) - { - //see http://code.google.com/p/bullet/issues/detail?id=349 - //this margin check could could be added to other collision shapes too, - //or add some assert/warning somewhere - btScalar minDimension = halfExtents[halfExtents.minAxis()]; - setSafeMargin(minDimension, defaultMarginMultiplier); - } - - ///getAabb's default implementation is brute force, expected derived classes to implement a fast dedicated version - void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const - { - getAabbSlow(t, aabbMin, aabbMax); - } - - virtual void getAabbSlow(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const; - - virtual void setLocalScaling(const btVector3& scaling); - virtual const btVector3& getLocalScaling() const - { - return m_localScaling; - } - - const btVector3& getLocalScalingNV() const - { - return m_localScaling; - } - - virtual void setMargin(btScalar margin) - { - m_collisionMargin = margin; - } - virtual btScalar getMargin() const - { - return m_collisionMargin; - } - - btScalar getMarginNV() const - { - return m_collisionMargin; - } - - virtual int getNumPreferredPenetrationDirections() const - { - return 0; - } - - virtual void getPreferredPenetrationDirection(int index, btVector3& penetrationVector) const - { - (void)penetrationVector; - (void)index; - btAssert(0); - } - - virtual int calculateSerializeBufferSize() const; - - ///fills the dataBuffer and returns the struct name (and 0 on failure) - virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const; -}; - -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct btConvexInternalShapeData -{ - btCollisionShapeData m_collisionShapeData; - - btVector3FloatData m_localScaling; - - btVector3FloatData m_implicitShapeDimensions; - - float m_collisionMargin; - - int m_padding; -}; - -SIMD_FORCE_INLINE int btConvexInternalShape::calculateSerializeBufferSize() const -{ - return sizeof(btConvexInternalShapeData); -} - -///fills the dataBuffer and returns the struct name (and 0 on failure) -SIMD_FORCE_INLINE const char* btConvexInternalShape::serialize(void* dataBuffer, btSerializer* serializer) const -{ - btConvexInternalShapeData* shapeData = (btConvexInternalShapeData*)dataBuffer; - btCollisionShape::serialize(&shapeData->m_collisionShapeData, serializer); - - m_implicitShapeDimensions.serializeFloat(shapeData->m_implicitShapeDimensions); - m_localScaling.serializeFloat(shapeData->m_localScaling); - shapeData->m_collisionMargin = float(m_collisionMargin); - - // Fill padding with zeros to appease msan. - shapeData->m_padding = 0; - - return "btConvexInternalShapeData"; -} - -///btConvexInternalAabbCachingShape adds local aabb caching for convex shapes, to avoid expensive bounding box calculations -class btConvexInternalAabbCachingShape : public btConvexInternalShape -{ - btVector3 m_localAabbMin; - btVector3 m_localAabbMax; - bool m_isLocalAabbValid; - -protected: - btConvexInternalAabbCachingShape(); - - void setCachedLocalAabb(const btVector3& aabbMin, const btVector3& aabbMax) - { - m_isLocalAabbValid = true; - m_localAabbMin = aabbMin; - m_localAabbMax = aabbMax; - } - - inline void getCachedLocalAabb(btVector3& aabbMin, btVector3& aabbMax) const - { - btAssert(m_isLocalAabbValid); - aabbMin = m_localAabbMin; - aabbMax = m_localAabbMax; - } - - inline void getNonvirtualAabb(const btTransform& trans, btVector3& aabbMin, btVector3& aabbMax, btScalar margin) const - { - //lazy evaluation of local aabb - btAssert(m_isLocalAabbValid); - btTransformAabb(m_localAabbMin, m_localAabbMax, margin, trans, aabbMin, aabbMax); - } - -public: - virtual void setLocalScaling(const btVector3& scaling); - - virtual void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const; - - void recalcLocalAabb(); -}; - -#endif //BT_CONVEX_INTERNAL_SHAPE_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btConvexPointCloudShape.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btConvexPointCloudShape.h deleted file mode 100644 index c7d554a4..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btConvexPointCloudShape.h +++ /dev/null @@ -1,103 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_CONVEX_POINT_CLOUD_SHAPE_H -#define BT_CONVEX_POINT_CLOUD_SHAPE_H - -#include "btPolyhedralConvexShape.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types -#include "LinearMath/btAlignedObjectArray.h" - -///The btConvexPointCloudShape implements an implicit convex hull of an array of vertices. -ATTRIBUTE_ALIGNED16(class) -btConvexPointCloudShape : public btPolyhedralConvexAabbCachingShape -{ - btVector3* m_unscaledPoints; - int m_numPoints; - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btConvexPointCloudShape() - { - m_localScaling.setValue(1.f, 1.f, 1.f); - m_shapeType = CONVEX_POINT_CLOUD_SHAPE_PROXYTYPE; - m_unscaledPoints = 0; - m_numPoints = 0; - } - - btConvexPointCloudShape(btVector3 * points, int numPoints, const btVector3& localScaling, bool computeAabb = true) - { - m_localScaling = localScaling; - m_shapeType = CONVEX_POINT_CLOUD_SHAPE_PROXYTYPE; - m_unscaledPoints = points; - m_numPoints = numPoints; - - if (computeAabb) - recalcLocalAabb(); - } - - void setPoints(btVector3 * points, int numPoints, bool computeAabb = true, const btVector3& localScaling = btVector3(1.f, 1.f, 1.f)) - { - m_unscaledPoints = points; - m_numPoints = numPoints; - m_localScaling = localScaling; - - if (computeAabb) - recalcLocalAabb(); - } - - SIMD_FORCE_INLINE btVector3* getUnscaledPoints() - { - return m_unscaledPoints; - } - - SIMD_FORCE_INLINE const btVector3* getUnscaledPoints() const - { - return m_unscaledPoints; - } - - SIMD_FORCE_INLINE int getNumPoints() const - { - return m_numPoints; - } - - SIMD_FORCE_INLINE btVector3 getScaledPoint(int index) const - { - return m_unscaledPoints[index] * m_localScaling; - } - -#ifndef __SPU__ - virtual btVector3 localGetSupportingVertex(const btVector3& vec) const; - virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec) const; - virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const; -#endif - - //debugging - virtual const char* getName() const { return "ConvexPointCloud"; } - - virtual int getNumVertices() const; - virtual int getNumEdges() const; - virtual void getEdge(int i, btVector3& pa, btVector3& pb) const; - virtual void getVertex(int i, btVector3& vtx) const; - virtual int getNumPlanes() const; - virtual void getPlane(btVector3 & planeNormal, btVector3 & planeSupport, int i) const; - virtual bool isInside(const btVector3& pt, btScalar tolerance) const; - - ///in case we receive negative scaling - virtual void setLocalScaling(const btVector3& scaling); -}; - -#endif //BT_CONVEX_POINT_CLOUD_SHAPE_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btConvexPolyhedron.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btConvexPolyhedron.h deleted file mode 100644 index 638aa9b3..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btConvexPolyhedron.h +++ /dev/null @@ -1,59 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2011 Advanced Micro Devices, Inc. http://bulletphysics.org - -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 file was written by Erwin Coumans - -#ifndef _BT_POLYHEDRAL_FEATURES_H -#define _BT_POLYHEDRAL_FEATURES_H - -#include "LinearMath/btTransform.h" -#include "LinearMath/btAlignedObjectArray.h" - -#define TEST_INTERNAL_OBJECTS 1 - -struct btFace -{ - btAlignedObjectArray m_indices; - // btAlignedObjectArray m_connectedFaces; - btScalar m_plane[4]; -}; - -ATTRIBUTE_ALIGNED16(class) -btConvexPolyhedron -{ -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btConvexPolyhedron(); - virtual ~btConvexPolyhedron(); - - btAlignedObjectArray m_vertices; - btAlignedObjectArray m_faces; - btAlignedObjectArray m_uniqueEdges; - - btVector3 m_localCenter; - btVector3 m_extents; - btScalar m_radius; - btVector3 mC; - btVector3 mE; - - void initialize(); - void initialize2(); - bool testContainment() const; - - void project(const btTransform& trans, const btVector3& dir, btScalar& minProj, btScalar& maxProj, btVector3& witnesPtMin, btVector3& witnesPtMax) const; -}; - -#endif //_BT_POLYHEDRAL_FEATURES_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btConvexShape.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btConvexShape.h deleted file mode 100644 index d3b3ed81..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btConvexShape.h +++ /dev/null @@ -1,75 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_CONVEX_SHAPE_INTERFACE1 -#define BT_CONVEX_SHAPE_INTERFACE1 - -#include "btCollisionShape.h" - -#include "LinearMath/btVector3.h" -#include "LinearMath/btTransform.h" -#include "LinearMath/btMatrix3x3.h" -#include "btCollisionMargin.h" -#include "LinearMath/btAlignedAllocator.h" - -#define MAX_PREFERRED_PENETRATION_DIRECTIONS 10 - -/// The btConvexShape is an abstract shape interface, implemented by all convex shapes such as btBoxShape, btConvexHullShape etc. -/// It describes general convex shapes using the localGetSupportingVertex interface, used by collision detectors such as btGjkPairDetector. -ATTRIBUTE_ALIGNED16(class) -btConvexShape : public btCollisionShape -{ -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btConvexShape(); - - virtual ~btConvexShape(); - - virtual btVector3 localGetSupportingVertex(const btVector3& vec) const = 0; - -//////// -#ifndef __SPU__ - virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec) const = 0; -#endif //#ifndef __SPU__ - - btVector3 localGetSupportVertexWithoutMarginNonVirtual(const btVector3& vec) const; - btVector3 localGetSupportVertexNonVirtual(const btVector3& vec) const; - btScalar getMarginNonVirtual() const; - void getAabbNonVirtual(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const; - - virtual void project(const btTransform& trans, const btVector3& dir, btScalar& minProj, btScalar& maxProj, btVector3& witnesPtMin, btVector3& witnesPtMax) const; - - //notice that the vectors should be unit length - virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const = 0; - - ///getAabb's default implementation is brute force, expected derived classes to implement a fast dedicated version - void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const = 0; - - virtual void getAabbSlow(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const = 0; - - virtual void setLocalScaling(const btVector3& scaling) = 0; - virtual const btVector3& getLocalScaling() const = 0; - - virtual void setMargin(btScalar margin) = 0; - - virtual btScalar getMargin() const = 0; - - virtual int getNumPreferredPenetrationDirections() const = 0; - - virtual void getPreferredPenetrationDirection(int index, btVector3& penetrationVector) const = 0; -}; - -#endif //BT_CONVEX_SHAPE_INTERFACE1 diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h deleted file mode 100644 index 6dac9fff..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h +++ /dev/null @@ -1,68 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_CONVEX_TRIANGLEMESH_SHAPE_H -#define BT_CONVEX_TRIANGLEMESH_SHAPE_H - -#include "btPolyhedralConvexShape.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types - -/// The btConvexTriangleMeshShape is a convex hull of a triangle mesh, but the performance is not as good as btConvexHullShape. -/// A small benefit of this class is that it uses the btStridingMeshInterface, so you can avoid the duplication of the triangle mesh data. Nevertheless, most users should use the much better performing btConvexHullShape instead. -ATTRIBUTE_ALIGNED16(class) -btConvexTriangleMeshShape : public btPolyhedralConvexAabbCachingShape -{ - class btStridingMeshInterface* m_stridingMesh; - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btConvexTriangleMeshShape(btStridingMeshInterface * meshInterface, bool calcAabb = true); - - class btStridingMeshInterface* getMeshInterface() - { - return m_stridingMesh; - } - const class btStridingMeshInterface* getMeshInterface() const - { - return m_stridingMesh; - } - - virtual btVector3 localGetSupportingVertex(const btVector3& vec) const; - virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec) const; - virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const; - - //debugging - virtual const char* getName() const { return "ConvexTrimesh"; } - - virtual int getNumVertices() const; - virtual int getNumEdges() const; - virtual void getEdge(int i, btVector3& pa, btVector3& pb) const; - virtual void getVertex(int i, btVector3& vtx) const; - virtual int getNumPlanes() const; - virtual void getPlane(btVector3 & planeNormal, btVector3 & planeSupport, int i) const; - virtual bool isInside(const btVector3& pt, btScalar tolerance) const; - - virtual void setLocalScaling(const btVector3& scaling); - virtual const btVector3& getLocalScaling() const; - - ///computes the exact moment of inertia and the transform from the coordinate system defined by the principal axes of the moment of inertia - ///and the center of mass to the current coordinate system. A mass of 1 is assumed, for other masses just multiply the computed "inertia" - ///by the mass. The resulting transform "principal" has to be applied inversely to the mesh in order for the local coordinate system of the - ///shape to be centered at the center of mass and to coincide with the principal axes. This also necessitates a correction of the world transform - ///of the collision object by the principal transform. This method also computes the volume of the convex mesh. - void calculatePrincipalAxisTransform(btTransform & principal, btVector3 & inertia, btScalar & volume) const; -}; - -#endif //BT_CONVEX_TRIANGLEMESH_SHAPE_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btCylinderShape.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btCylinderShape.h deleted file mode 100644 index d3f64508..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btCylinderShape.h +++ /dev/null @@ -1,206 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_CYLINDER_MINKOWSKI_H -#define BT_CYLINDER_MINKOWSKI_H - -#include "btBoxShape.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types -#include "LinearMath/btVector3.h" - -/// The btCylinderShape class implements a cylinder shape primitive, centered around the origin. Its central axis aligned with the Y axis. btCylinderShapeX is aligned with the X axis and btCylinderShapeZ around the Z axis. -ATTRIBUTE_ALIGNED16(class) -btCylinderShape : public btConvexInternalShape - -{ -protected: - int m_upAxis; - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btVector3 getHalfExtentsWithMargin() const - { - btVector3 halfExtents = getHalfExtentsWithoutMargin(); - btVector3 margin(getMargin(), getMargin(), getMargin()); - halfExtents += margin; - return halfExtents; - } - - const btVector3& getHalfExtentsWithoutMargin() const - { - return m_implicitShapeDimensions; //changed in Bullet 2.63: assume the scaling and margin are included - } - - btCylinderShape(const btVector3& halfExtents); - - void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const; - - virtual void calculateLocalInertia(btScalar mass, btVector3 & inertia) const; - - virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec) const; - - virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const; - - virtual void setMargin(btScalar collisionMargin) - { - //correct the m_implicitShapeDimensions for the margin - btVector3 oldMargin(getMargin(), getMargin(), getMargin()); - btVector3 implicitShapeDimensionsWithMargin = m_implicitShapeDimensions + oldMargin; - - btConvexInternalShape::setMargin(collisionMargin); - btVector3 newMargin(getMargin(), getMargin(), getMargin()); - m_implicitShapeDimensions = implicitShapeDimensionsWithMargin - newMargin; - } - - virtual btVector3 localGetSupportingVertex(const btVector3& vec) const - { - btVector3 supVertex; - supVertex = localGetSupportingVertexWithoutMargin(vec); - - if (getMargin() != btScalar(0.)) - { - btVector3 vecnorm = vec; - if (vecnorm.length2() < (SIMD_EPSILON * SIMD_EPSILON)) - { - vecnorm.setValue(btScalar(-1.), btScalar(-1.), btScalar(-1.)); - } - vecnorm.normalize(); - supVertex += getMargin() * vecnorm; - } - return supVertex; - } - - //use box inertia - // virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const; - - int getUpAxis() const - { - return m_upAxis; - } - - virtual btVector3 getAnisotropicRollingFrictionDirection() const - { - btVector3 aniDir(0, 0, 0); - aniDir[getUpAxis()] = 1; - return aniDir; - } - - virtual btScalar getRadius() const - { - return getHalfExtentsWithMargin().getX(); - } - - virtual void setLocalScaling(const btVector3& scaling) - { - btVector3 oldMargin(getMargin(), getMargin(), getMargin()); - btVector3 implicitShapeDimensionsWithMargin = m_implicitShapeDimensions + oldMargin; - btVector3 unScaledImplicitShapeDimensionsWithMargin = implicitShapeDimensionsWithMargin / m_localScaling; - - btConvexInternalShape::setLocalScaling(scaling); - - m_implicitShapeDimensions = (unScaledImplicitShapeDimensionsWithMargin * m_localScaling) - oldMargin; - } - - //debugging - virtual const char* getName() const - { - return "CylinderY"; - } - - virtual int calculateSerializeBufferSize() const; - - ///fills the dataBuffer and returns the struct name (and 0 on failure) - virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const; -}; - -class btCylinderShapeX : public btCylinderShape -{ -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btCylinderShapeX(const btVector3& halfExtents); - - virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec) const; - virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const; - - //debugging - virtual const char* getName() const - { - return "CylinderX"; - } - - virtual btScalar getRadius() const - { - return getHalfExtentsWithMargin().getY(); - } -}; - -class btCylinderShapeZ : public btCylinderShape -{ -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btCylinderShapeZ(const btVector3& halfExtents); - - virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec) const; - virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const; - - //debugging - virtual const char* getName() const - { - return "CylinderZ"; - } - - virtual btScalar getRadius() const - { - return getHalfExtentsWithMargin().getX(); - } -}; - -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct btCylinderShapeData -{ - btConvexInternalShapeData m_convexInternalShapeData; - - int m_upAxis; - - char m_padding[4]; -}; - -SIMD_FORCE_INLINE int btCylinderShape::calculateSerializeBufferSize() const -{ - return sizeof(btCylinderShapeData); -} - -///fills the dataBuffer and returns the struct name (and 0 on failure) -SIMD_FORCE_INLINE const char* btCylinderShape::serialize(void* dataBuffer, btSerializer* serializer) const -{ - btCylinderShapeData* shapeData = (btCylinderShapeData*)dataBuffer; - - btConvexInternalShape::serialize(&shapeData->m_convexInternalShapeData, serializer); - - shapeData->m_upAxis = m_upAxis; - - // Fill padding with zeros to appease msan. - shapeData->m_padding[0] = 0; - shapeData->m_padding[1] = 0; - shapeData->m_padding[2] = 0; - shapeData->m_padding[3] = 0; - - return "btCylinderShapeData"; -} - -#endif //BT_CYLINDER_MINKOWSKI_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btEmptyShape.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btEmptyShape.h deleted file mode 100644 index d2e21173..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btEmptyShape.h +++ /dev/null @@ -1,65 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_EMPTY_SHAPE_H -#define BT_EMPTY_SHAPE_H - -#include "btConcaveShape.h" - -#include "LinearMath/btVector3.h" -#include "LinearMath/btTransform.h" -#include "LinearMath/btMatrix3x3.h" -#include "btCollisionMargin.h" - -/// The btEmptyShape is a collision shape without actual collision detection shape, so most users should ignore this class. -/// It can be replaced by another shape during runtime, but the inertia tensor should be recomputed. -ATTRIBUTE_ALIGNED16(class) -btEmptyShape : public btConcaveShape -{ -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btEmptyShape(); - - virtual ~btEmptyShape(); - - ///getAabb's default implementation is brute force, expected derived classes to implement a fast dedicated version - void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const; - - virtual void setLocalScaling(const btVector3& scaling) - { - m_localScaling = scaling; - } - virtual const btVector3& getLocalScaling() const - { - return m_localScaling; - } - - virtual void calculateLocalInertia(btScalar mass, btVector3 & inertia) const; - - virtual const char* getName() const - { - return "Empty"; - } - - virtual void processAllTriangles(btTriangleCallback*, const btVector3&, const btVector3&) const - { - } - -protected: - btVector3 m_localScaling; -}; - -#endif //BT_EMPTY_SHAPE_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h deleted file mode 100644 index 2cf3c007..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h +++ /dev/null @@ -1,221 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_HEIGHTFIELD_TERRAIN_SHAPE_H -#define BT_HEIGHTFIELD_TERRAIN_SHAPE_H - -#include "btConcaveShape.h" -#include "LinearMath/btAlignedObjectArray.h" - -///btHeightfieldTerrainShape simulates a 2D heightfield terrain -/** - The caller is responsible for maintaining the heightfield array; this - class does not make a copy. - - The heightfield can be dynamic so long as the min/max height values - capture the extremes (heights must always be in that range). - - The local origin of the heightfield is assumed to be the exact - center (as determined by width and length and height, with each - axis multiplied by the localScaling). - - \b NOTE: be careful with coordinates. If you have a heightfield with a local - min height of -100m, and a max height of +500m, you may be tempted to place it - at the origin (0,0) and expect the heights in world coordinates to be - -100 to +500 meters. - Actually, the heights will be -300 to +300m, because bullet will re-center - the heightfield based on its AABB (which is determined by the min/max - heights). So keep in mind that once you create a btHeightfieldTerrainShape - object, the heights will be adjusted relative to the center of the AABB. This - is different to the behavior of many rendering engines, but is useful for - physics engines. - - Most (but not all) rendering and heightfield libraries assume upAxis = 1 - (that is, the y-axis is "up"). This class allows any of the 3 coordinates - to be "up". Make sure your choice of axis is consistent with your rendering - system. - - The heightfield heights are determined from the data type used for the - heightfieldData array. - - - PHY_UCHAR: height at a point is the uchar value at the - grid point, multipled by heightScale. uchar isn't recommended - because of its inability to deal with negative values, and - low resolution (8-bit). - - - PHY_SHORT: height at a point is the short int value at that grid - point, multipled by heightScale. - - - PHY_FLOAT: height at a point is the float value at that grid - point. heightScale is ignored when using the float heightfield - data type. - - Whatever the caller specifies as minHeight and maxHeight will be honored. - The class will not inspect the heightfield to discover the actual minimum - or maximum heights. These values are used to determine the heightfield's - axis-aligned bounding box, multiplied by localScaling. - - For usage and testing see the TerrainDemo. - */ -ATTRIBUTE_ALIGNED16(class) -btHeightfieldTerrainShape : public btConcaveShape -{ -public: - struct Range - { - btScalar min; - btScalar max; - }; - -protected: - btVector3 m_localAabbMin; - btVector3 m_localAabbMax; - btVector3 m_localOrigin; - - ///terrain data - int m_heightStickWidth; - int m_heightStickLength; - btScalar m_minHeight; - btScalar m_maxHeight; - btScalar m_width; - btScalar m_length; - btScalar m_heightScale; - union { - const unsigned char* m_heightfieldDataUnsignedChar; - const short* m_heightfieldDataShort; - const btScalar* m_heightfieldDataFloat; - const void* m_heightfieldDataUnknown; - }; - - PHY_ScalarType m_heightDataType; - bool m_flipQuadEdges; - bool m_useDiamondSubdivision; - bool m_useZigzagSubdivision; - bool m_flipTriangleWinding; - int m_upAxis; - - btVector3 m_localScaling; - - // Accelerator - btAlignedObjectArray m_vboundsGrid; - int m_vboundsGridWidth; - int m_vboundsGridLength; - int m_vboundsChunkSize; - - - btScalar m_userValue3; - - struct btTriangleInfoMap* m_triangleInfoMap; - - virtual btScalar getRawHeightFieldValue(int x, int y) const; - void quantizeWithClamp(int* out, const btVector3& point, int isMax) const; - - /// protected initialization - /** - Handles the work of constructors so that public constructors can be - backwards-compatible without a lot of copy/paste. - */ - void initialize(int heightStickWidth, int heightStickLength, - const void* heightfieldData, btScalar heightScale, - btScalar minHeight, btScalar maxHeight, int upAxis, - PHY_ScalarType heightDataType, bool flipQuadEdges); - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - /// preferred constructor - /** - This constructor supports a range of heightfield - data types, and allows for a non-zero minimum height value. - heightScale is needed for any integer-based heightfield data types. - */ - btHeightfieldTerrainShape(int heightStickWidth, int heightStickLength, - const void* heightfieldData, btScalar heightScale, - btScalar minHeight, btScalar maxHeight, - int upAxis, PHY_ScalarType heightDataType, - bool flipQuadEdges); - - /// legacy constructor - /** - The legacy constructor assumes the heightfield has a minimum height - of zero. Only unsigned char or floats are supported. For legacy - compatibility reasons, heightScale is calculated as maxHeight / 65535 - (and is only used when useFloatData = false). - */ - btHeightfieldTerrainShape(int heightStickWidth, int heightStickLength, const void* heightfieldData, btScalar maxHeight, int upAxis, bool useFloatData, bool flipQuadEdges); - - virtual ~btHeightfieldTerrainShape(); - - void setUseDiamondSubdivision(bool useDiamondSubdivision = true) { m_useDiamondSubdivision = useDiamondSubdivision; } - - ///could help compatibility with Ogre heightfields. See https://code.google.com/p/bullet/issues/detail?id=625 - void setUseZigzagSubdivision(bool useZigzagSubdivision = true) { m_useZigzagSubdivision = useZigzagSubdivision; } - - void setFlipTriangleWinding(bool flipTriangleWinding) - { - m_flipTriangleWinding = flipTriangleWinding; - } - virtual void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const; - - virtual void processAllTriangles(btTriangleCallback * callback, const btVector3& aabbMin, const btVector3& aabbMax) const; - - virtual void calculateLocalInertia(btScalar mass, btVector3 & inertia) const; - - virtual void setLocalScaling(const btVector3& scaling); - - virtual const btVector3& getLocalScaling() const; - - void getVertex(int x, int y, btVector3& vertex) const; - - void performRaycast(btTriangleCallback * callback, const btVector3& raySource, const btVector3& rayTarget) const; - - void buildAccelerator(int chunkSize = 16); - void clearAccelerator(); - - int getUpAxis() const - { - return m_upAxis; - } - //debugging - virtual const char* getName() const { return "HEIGHTFIELD"; } - - - void setUserValue3(btScalar value) - { - m_userValue3 = value; - } - btScalar getUserValue3() const - { - return m_userValue3; - } - const struct btTriangleInfoMap* getTriangleInfoMap() const - { - return m_triangleInfoMap; - } - struct btTriangleInfoMap* getTriangleInfoMap() - { - return m_triangleInfoMap; - } - void setTriangleInfoMap(btTriangleInfoMap* map) - { - m_triangleInfoMap = map; - } - const unsigned char* getHeightfieldRawData() const - { - return m_heightfieldDataUnsignedChar; - } -}; - -#endif //BT_HEIGHTFIELD_TERRAIN_SHAPE_H \ No newline at end of file diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btMaterial.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btMaterial.h deleted file mode 100644 index c9a436bf..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btMaterial.h +++ /dev/null @@ -1,38 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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 file was created by Alex Silverman - -#ifndef BT_MATERIAL_H -#define BT_MATERIAL_H - -// Material class to be used by btMultimaterialTriangleMeshShape to store triangle properties -class btMaterial -{ - // public members so that materials can change due to world events -public: - btScalar m_friction; - btScalar m_restitution; - int pad[2]; - - btMaterial() {} - btMaterial(btScalar fric, btScalar rest) - { - m_friction = fric; - m_restitution = rest; - } -}; - -#endif // BT_MATERIAL_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btMiniSDF.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btMiniSDF.h deleted file mode 100644 index b60fd102..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btMiniSDF.h +++ /dev/null @@ -1,127 +0,0 @@ -#ifndef MINISDF_H -#define MINISDF_H - -#include "LinearMath/btVector3.h" -#include "LinearMath/btAabbUtil2.h" -#include "LinearMath/btAlignedObjectArray.h" - -struct btMultiIndex -{ - unsigned int ijk[3]; -}; - -struct btAlignedBox3d -{ - btVector3 m_min; - btVector3 m_max; - - const btVector3& min() const - { - return m_min; - } - - const btVector3& max() const - { - return m_max; - } - - bool contains(const btVector3& x) const - { - return TestPointAgainstAabb2(m_min, m_max, x); - } - - btAlignedBox3d(const btVector3& mn, const btVector3& mx) - : m_min(mn), - m_max(mx) - { - } - - btAlignedBox3d() - { - } -}; - -struct btShapeMatrix -{ - double m_vec[32]; - - inline double& operator[](int i) - { - return m_vec[i]; - } - - inline const double& operator[](int i) const - { - return m_vec[i]; - } -}; - -struct btShapeGradients -{ - btVector3 m_vec[32]; - - void topRowsDivide(int row, double denom) - { - for (int i = 0; i < row; i++) - { - m_vec[i] /= denom; - } - } - - void bottomRowsMul(int row, double val) - { - for (int i = 32 - row; i < 32; i++) - { - m_vec[i] *= val; - } - } - - inline btScalar& operator()(int i, int j) - { - return m_vec[i][j]; - } -}; - -struct btCell32 -{ - unsigned int m_cells[32]; -}; - -struct btMiniSDF -{ - btAlignedBox3d m_domain; - unsigned int m_resolution[3]; - btVector3 m_cell_size; - btVector3 m_inv_cell_size; - std::size_t m_n_cells; - std::size_t m_n_fields; - bool m_isValid; - - btAlignedObjectArray > m_nodes; - btAlignedObjectArray > m_cells; - btAlignedObjectArray > m_cell_map; - - btMiniSDF() - : m_isValid(false) - { - } - bool load(const char* data, int size); - bool isValid() const - { - return m_isValid; - } - unsigned int multiToSingleIndex(btMultiIndex const& ijk) const; - - btAlignedBox3d subdomain(btMultiIndex const& ijk) const; - - btMultiIndex singleToMultiIndex(unsigned int l) const; - - btAlignedBox3d subdomain(unsigned int l) const; - - btShapeMatrix - shape_function_(btVector3 const& xi, btShapeGradients* gradient = 0) const; - - bool interpolate(unsigned int field_id, double& dist, btVector3 const& x, btVector3* gradient) const; -}; - -#endif //MINISDF_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btMinkowskiSumShape.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btMinkowskiSumShape.h deleted file mode 100644 index 3b5150f6..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btMinkowskiSumShape.h +++ /dev/null @@ -1,59 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_MINKOWSKI_SUM_SHAPE_H -#define BT_MINKOWSKI_SUM_SHAPE_H - -#include "btConvexInternalShape.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types - -/// The btMinkowskiSumShape is only for advanced users. This shape represents implicit based minkowski sum of two convex implicit shapes. -ATTRIBUTE_ALIGNED16(class) -btMinkowskiSumShape : public btConvexInternalShape -{ - btTransform m_transA; - btTransform m_transB; - const btConvexShape* m_shapeA; - const btConvexShape* m_shapeB; - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btMinkowskiSumShape(const btConvexShape* shapeA, const btConvexShape* shapeB); - - virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec) const; - - virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const; - - virtual void calculateLocalInertia(btScalar mass, btVector3 & inertia) const; - - void setTransformA(const btTransform& transA) { m_transA = transA; } - void setTransformB(const btTransform& transB) { m_transB = transB; } - - const btTransform& getTransformA() const { return m_transA; } - const btTransform& GetTransformB() const { return m_transB; } - - virtual btScalar getMargin() const; - - const btConvexShape* getShapeA() const { return m_shapeA; } - const btConvexShape* getShapeB() const { return m_shapeB; } - - virtual const char* getName() const - { - return "MinkowskiSum"; - } -}; - -#endif //BT_MINKOWSKI_SUM_SHAPE_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btMultiSphereShape.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btMultiSphereShape.h deleted file mode 100644 index 2d79c07c..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btMultiSphereShape.h +++ /dev/null @@ -1,95 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_MULTI_SPHERE_MINKOWSKI_H -#define BT_MULTI_SPHERE_MINKOWSKI_H - -#include "btConvexInternalShape.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types -#include "LinearMath/btAlignedObjectArray.h" -#include "LinearMath/btAabbUtil2.h" - -///The btMultiSphereShape represents the convex hull of a collection of spheres. You can create special capsules or other smooth volumes. -///It is possible to animate the spheres for deformation, but call 'recalcLocalAabb' after changing any sphere position/radius -ATTRIBUTE_ALIGNED16(class) -btMultiSphereShape : public btConvexInternalAabbCachingShape -{ - btAlignedObjectArray m_localPositionArray; - btAlignedObjectArray m_radiArray; - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btMultiSphereShape(const btVector3* positions, const btScalar* radi, int numSpheres); - - ///CollisionShape Interface - virtual void calculateLocalInertia(btScalar mass, btVector3 & inertia) const; - - /// btConvexShape Interface - virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec) const; - - virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const; - - int getSphereCount() const - { - return m_localPositionArray.size(); - } - - const btVector3& getSpherePosition(int index) const - { - return m_localPositionArray[index]; - } - - btScalar getSphereRadius(int index) const - { - return m_radiArray[index]; - } - - virtual const char* getName() const - { - return "MultiSphere"; - } - - virtual int calculateSerializeBufferSize() const; - - ///fills the dataBuffer and returns the struct name (and 0 on failure) - virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const; -}; - -struct btPositionAndRadius -{ - btVector3FloatData m_pos; - float m_radius; -}; - -// clang-format off - -struct btMultiSphereShapeData -{ - btConvexInternalShapeData m_convexInternalShapeData; - - btPositionAndRadius *m_localPositionArrayPtr; - int m_localPositionArraySize; - char m_padding[4]; -}; - -// clang-format on - -SIMD_FORCE_INLINE int btMultiSphereShape::calculateSerializeBufferSize() const -{ - return sizeof(btMultiSphereShapeData); -} - -#endif //BT_MULTI_SPHERE_MINKOWSKI_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btMultimaterialTriangleMeshShape.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btMultimaterialTriangleMeshShape.h deleted file mode 100644 index d1d42f8e..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btMultimaterialTriangleMeshShape.h +++ /dev/null @@ -1,115 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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 file was created by Alex Silverman - -#ifndef BT_BVH_TRIANGLE_MATERIAL_MESH_SHAPE_H -#define BT_BVH_TRIANGLE_MATERIAL_MESH_SHAPE_H - -#include "btBvhTriangleMeshShape.h" -#include "btMaterial.h" - -///The BvhTriangleMaterialMeshShape extends the btBvhTriangleMeshShape. Its main contribution is the interface into a material array, which allows per-triangle friction and restitution. -ATTRIBUTE_ALIGNED16(class) -btMultimaterialTriangleMeshShape : public btBvhTriangleMeshShape -{ - btAlignedObjectArray m_materialList; - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btMultimaterialTriangleMeshShape(btStridingMeshInterface * meshInterface, bool useQuantizedAabbCompression, bool buildBvh = true) : btBvhTriangleMeshShape(meshInterface, useQuantizedAabbCompression, buildBvh) - { - m_shapeType = MULTIMATERIAL_TRIANGLE_MESH_PROXYTYPE; - - const unsigned char *vertexbase; - int numverts; - PHY_ScalarType type; - int stride; - const unsigned char *indexbase; - int indexstride; - int numfaces; - PHY_ScalarType indicestype; - - //m_materialLookup = (int**)(btAlignedAlloc(sizeof(int*) * meshInterface->getNumSubParts(), 16)); - - for (int i = 0; i < meshInterface->getNumSubParts(); i++) - { - m_meshInterface->getLockedReadOnlyVertexIndexBase( - &vertexbase, - numverts, - type, - stride, - &indexbase, - indexstride, - numfaces, - indicestype, - i); - //m_materialLookup[i] = (int*)(btAlignedAlloc(sizeof(int) * numfaces, 16)); - } - } - - ///optionally pass in a larger bvh aabb, used for quantization. This allows for deformations within this aabb - btMultimaterialTriangleMeshShape(btStridingMeshInterface * meshInterface, bool useQuantizedAabbCompression, const btVector3 &bvhAabbMin, const btVector3 &bvhAabbMax, bool buildBvh = true) : btBvhTriangleMeshShape(meshInterface, useQuantizedAabbCompression, bvhAabbMin, bvhAabbMax, buildBvh) - { - m_shapeType = MULTIMATERIAL_TRIANGLE_MESH_PROXYTYPE; - - const unsigned char *vertexbase; - int numverts; - PHY_ScalarType type; - int stride; - const unsigned char *indexbase; - int indexstride; - int numfaces; - PHY_ScalarType indicestype; - - //m_materialLookup = (int**)(btAlignedAlloc(sizeof(int*) * meshInterface->getNumSubParts(), 16)); - - for (int i = 0; i < meshInterface->getNumSubParts(); i++) - { - m_meshInterface->getLockedReadOnlyVertexIndexBase( - &vertexbase, - numverts, - type, - stride, - &indexbase, - indexstride, - numfaces, - indicestype, - i); - //m_materialLookup[i] = (int*)(btAlignedAlloc(sizeof(int) * numfaces * 2, 16)); - } - } - - virtual ~btMultimaterialTriangleMeshShape() - { - /* - for(int i = 0; i < m_meshInterface->getNumSubParts(); i++) - { - btAlignedFree(m_materialValues[i]); - m_materialLookup[i] = NULL; - } - btAlignedFree(m_materialValues); - m_materialLookup = NULL; -*/ - } - //debugging - virtual const char *getName() const { return "MULTIMATERIALTRIANGLEMESH"; } - - ///Obtains the material for a specific triangle - const btMaterial *getMaterialProperties(int partID, int triIndex); -}; - -#endif //BT_BVH_TRIANGLE_MATERIAL_MESH_SHAPE_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btOptimizedBvh.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btOptimizedBvh.h deleted file mode 100644 index 22f131c8..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btOptimizedBvh.h +++ /dev/null @@ -1,56 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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 contributions from Disney Studio's - -#ifndef BT_OPTIMIZED_BVH_H -#define BT_OPTIMIZED_BVH_H - -#include "BulletCollision/BroadphaseCollision/btQuantizedBvh.h" - -class btStridingMeshInterface; - -///The btOptimizedBvh extends the btQuantizedBvh to create AABB tree for triangle meshes, through the btStridingMeshInterface. -ATTRIBUTE_ALIGNED16(class) -btOptimizedBvh : public btQuantizedBvh -{ -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - -protected: -public: - btOptimizedBvh(); - - virtual ~btOptimizedBvh(); - - void build(btStridingMeshInterface * triangles, bool useQuantizedAabbCompression, const btVector3& bvhAabbMin, const btVector3& bvhAabbMax); - - void refit(btStridingMeshInterface * triangles, const btVector3& aabbMin, const btVector3& aabbMax); - - void refitPartial(btStridingMeshInterface * triangles, const btVector3& aabbMin, const btVector3& aabbMax); - - void updateBvhNodes(btStridingMeshInterface * meshInterface, int firstNode, int endNode, int index); - - /// Data buffer MUST be 16 byte aligned - virtual bool serializeInPlace(void* o_alignedDataBuffer, unsigned i_dataBufferSize, bool i_swapEndian) const - { - return btQuantizedBvh::serialize(o_alignedDataBuffer, i_dataBufferSize, i_swapEndian); - } - - ///deSerializeInPlace loads and initializes a BVH from a buffer in memory 'in place' - static btOptimizedBvh* deSerializeInPlace(void* i_alignedDataBuffer, unsigned int i_dataBufferSize, bool i_swapEndian); -}; - -#endif //BT_OPTIMIZED_BVH_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btPolyhedralConvexShape.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btPolyhedralConvexShape.h deleted file mode 100644 index b3ffab7a..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btPolyhedralConvexShape.h +++ /dev/null @@ -1,106 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_POLYHEDRAL_CONVEX_SHAPE_H -#define BT_POLYHEDRAL_CONVEX_SHAPE_H - -#include "LinearMath/btMatrix3x3.h" -#include "btConvexInternalShape.h" -class btConvexPolyhedron; - -///The btPolyhedralConvexShape is an internal interface class for polyhedral convex shapes. -ATTRIBUTE_ALIGNED16(class) -btPolyhedralConvexShape : public btConvexInternalShape -{ -protected: - btConvexPolyhedron* m_polyhedron; - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btPolyhedralConvexShape(); - - virtual ~btPolyhedralConvexShape(); - - ///optional method mainly used to generate multiple contact points by clipping polyhedral features (faces/edges) - ///experimental/work-in-progress - virtual bool initializePolyhedralFeatures(int shiftVerticesByMargin = 0); - - virtual void setPolyhedralFeatures(btConvexPolyhedron & polyhedron); - - const btConvexPolyhedron* getConvexPolyhedron() const - { - return m_polyhedron; - } - - //brute force implementations - - virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec) const; - virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const; - - virtual void calculateLocalInertia(btScalar mass, btVector3 & inertia) const; - - virtual int getNumVertices() const = 0; - virtual int getNumEdges() const = 0; - virtual void getEdge(int i, btVector3& pa, btVector3& pb) const = 0; - virtual void getVertex(int i, btVector3& vtx) const = 0; - virtual int getNumPlanes() const = 0; - virtual void getPlane(btVector3 & planeNormal, btVector3 & planeSupport, int i) const = 0; - // virtual int getIndex(int i) const = 0 ; - - virtual bool isInside(const btVector3& pt, btScalar tolerance) const = 0; -}; - -///The btPolyhedralConvexAabbCachingShape adds aabb caching to the btPolyhedralConvexShape -class btPolyhedralConvexAabbCachingShape : public btPolyhedralConvexShape -{ - btVector3 m_localAabbMin; - btVector3 m_localAabbMax; - bool m_isLocalAabbValid; - -protected: - void setCachedLocalAabb(const btVector3& aabbMin, const btVector3& aabbMax) - { - m_isLocalAabbValid = true; - m_localAabbMin = aabbMin; - m_localAabbMax = aabbMax; - } - - inline void getCachedLocalAabb(btVector3& aabbMin, btVector3& aabbMax) const - { - btAssert(m_isLocalAabbValid); - aabbMin = m_localAabbMin; - aabbMax = m_localAabbMax; - } - -protected: - btPolyhedralConvexAabbCachingShape(); - -public: - inline void getNonvirtualAabb(const btTransform& trans, btVector3& aabbMin, btVector3& aabbMax, btScalar margin) const - { - //lazy evaluation of local aabb - btAssert(m_isLocalAabbValid); - btTransformAabb(m_localAabbMin, m_localAabbMax, margin, trans, aabbMin, aabbMax); - } - - virtual void setLocalScaling(const btVector3& scaling); - - virtual void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const; - - void recalcLocalAabb(); -}; - -#endif //BT_POLYHEDRAL_CONVEX_SHAPE_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h deleted file mode 100644 index 4d6feb61..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h +++ /dev/null @@ -1,86 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_SCALED_BVH_TRIANGLE_MESH_SHAPE_H -#define BT_SCALED_BVH_TRIANGLE_MESH_SHAPE_H - -#include "BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h" - -///The btScaledBvhTriangleMeshShape allows to instance a scaled version of an existing btBvhTriangleMeshShape. -///Note that each btBvhTriangleMeshShape still can have its own local scaling, independent from this btScaledBvhTriangleMeshShape 'localScaling' -ATTRIBUTE_ALIGNED16(class) -btScaledBvhTriangleMeshShape : public btConcaveShape -{ - btVector3 m_localScaling; - - btBvhTriangleMeshShape* m_bvhTriMeshShape; - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btScaledBvhTriangleMeshShape(btBvhTriangleMeshShape * childShape, const btVector3& localScaling); - - virtual ~btScaledBvhTriangleMeshShape(); - - virtual void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const; - virtual void setLocalScaling(const btVector3& scaling); - virtual const btVector3& getLocalScaling() const; - virtual void calculateLocalInertia(btScalar mass, btVector3 & inertia) const; - - virtual void processAllTriangles(btTriangleCallback * callback, const btVector3& aabbMin, const btVector3& aabbMax) const; - - btBvhTriangleMeshShape* getChildShape() - { - return m_bvhTriMeshShape; - } - - const btBvhTriangleMeshShape* getChildShape() const - { - return m_bvhTriMeshShape; - } - - //debugging - virtual const char* getName() const { return "SCALEDBVHTRIANGLEMESH"; } - - virtual int calculateSerializeBufferSize() const; - - ///fills the dataBuffer and returns the struct name (and 0 on failure) - virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const; -}; - -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct btScaledTriangleMeshShapeData -{ - btTriangleMeshShapeData m_trimeshShapeData; - - btVector3FloatData m_localScaling; -}; - -SIMD_FORCE_INLINE int btScaledBvhTriangleMeshShape::calculateSerializeBufferSize() const -{ - return sizeof(btScaledTriangleMeshShapeData); -} - -///fills the dataBuffer and returns the struct name (and 0 on failure) -SIMD_FORCE_INLINE const char* btScaledBvhTriangleMeshShape::serialize(void* dataBuffer, btSerializer* serializer) const -{ - btScaledTriangleMeshShapeData* scaledMeshData = (btScaledTriangleMeshShapeData*)dataBuffer; - m_bvhTriMeshShape->serialize(&scaledMeshData->m_trimeshShapeData, serializer); - scaledMeshData->m_trimeshShapeData.m_collisionShapeData.m_shapeType = SCALED_TRIANGLE_MESH_SHAPE_PROXYTYPE; - m_localScaling.serializeFloat(scaledMeshData->m_localScaling); - return "btScaledTriangleMeshShapeData"; -} - -#endif //BT_SCALED_BVH_TRIANGLE_MESH_SHAPE_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btSdfCollisionShape.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btSdfCollisionShape.h deleted file mode 100644 index 3989d624..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btSdfCollisionShape.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef BT_SDF_COLLISION_SHAPE_H -#define BT_SDF_COLLISION_SHAPE_H - -#include "btConcaveShape.h" - -class btSdfCollisionShape : public btConcaveShape -{ - struct btSdfCollisionShapeInternalData* m_data; - -public: - btSdfCollisionShape(); - virtual ~btSdfCollisionShape(); - - bool initializeSDF(const char* sdfData, int sizeInBytes); - - virtual void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) 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; - virtual void setMargin(btScalar margin); - virtual btScalar getMargin() const; - - virtual void processAllTriangles(btTriangleCallback* callback, const btVector3& aabbMin, const btVector3& aabbMax) const; - - bool queryPoint(const btVector3& ptInSDF, btScalar& distOut, btVector3& normal); -}; - -#endif //BT_SDF_COLLISION_SHAPE_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btShapeHull.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btShapeHull.h deleted file mode 100644 index 54439f9c..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btShapeHull.h +++ /dev/null @@ -1,60 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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. -*/ - -///btShapeHull implemented by John McCutchan. - -#ifndef BT_SHAPE_HULL_H -#define BT_SHAPE_HULL_H - -#include "LinearMath/btAlignedObjectArray.h" -#include "BulletCollision/CollisionShapes/btConvexShape.h" - -///The btShapeHull class takes a btConvexShape, builds a simplified convex hull using btConvexHull and provides triangle indices and vertices. -///It can be useful for to simplify a complex convex object and for visualization of a non-polyhedral convex object. -///It approximates the convex hull using the supporting vertex of 42 directions. -ATTRIBUTE_ALIGNED16(class) -btShapeHull -{ -protected: - btAlignedObjectArray m_vertices; - btAlignedObjectArray m_indices; - unsigned int m_numIndices; - const btConvexShape* m_shape; - - static btVector3* getUnitSpherePoints(int highres = 0); - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btShapeHull(const btConvexShape* shape); - ~btShapeHull(); - - bool buildHull(btScalar margin, int highres = 0); - - int numTriangles() const; - int numVertices() const; - int numIndices() const; - - const btVector3* getVertexPointer() const - { - return &m_vertices[0]; - } - const unsigned int* getIndexPointer() const - { - return &m_indices[0]; - } -}; - -#endif //BT_SHAPE_HULL_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btSphereShape.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btSphereShape.h deleted file mode 100644 index 75e4fd8e..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btSphereShape.h +++ /dev/null @@ -1,71 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_SPHERE_MINKOWSKI_H -#define BT_SPHERE_MINKOWSKI_H - -#include "btConvexInternalShape.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types - -///The btSphereShape implements an implicit sphere, centered around a local origin with radius. -ATTRIBUTE_ALIGNED16(class) -btSphereShape : public btConvexInternalShape - -{ -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btSphereShape(btScalar radius) : btConvexInternalShape() - { - m_shapeType = SPHERE_SHAPE_PROXYTYPE; - m_localScaling.setValue(1.0, 1.0, 1.0); - m_implicitShapeDimensions.setZero(); - m_implicitShapeDimensions.setX(radius); - m_collisionMargin = radius; - m_padding = 0; - } - - virtual btVector3 localGetSupportingVertex(const btVector3& vec) const; - virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec) const; - //notice that the vectors should be unit length - virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const; - - virtual void calculateLocalInertia(btScalar mass, btVector3 & inertia) const; - - virtual void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const; - - btScalar getRadius() const { return m_implicitShapeDimensions.getX() * m_localScaling.getX(); } - - void setUnscaledRadius(btScalar radius) - { - m_implicitShapeDimensions.setX(radius); - btConvexInternalShape::setMargin(radius); - } - - //debugging - virtual const char* getName() const { return "SPHERE"; } - - virtual void setMargin(btScalar margin) - { - btConvexInternalShape::setMargin(margin); - } - virtual btScalar getMargin() const - { - //to improve gjk behaviour, use radius+margin as the full margin, so never get into the penetration case - //this means, non-uniform scaling is not supported anymore - return getRadius(); - } -}; - -#endif //BT_SPHERE_MINKOWSKI_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btStaticPlaneShape.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btStaticPlaneShape.h deleted file mode 100644 index 1cda8bbc..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btStaticPlaneShape.h +++ /dev/null @@ -1,103 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_STATIC_PLANE_SHAPE_H -#define BT_STATIC_PLANE_SHAPE_H - -#include "btConcaveShape.h" - -///The btStaticPlaneShape simulates an infinite non-moving (static) collision plane. -ATTRIBUTE_ALIGNED16(class) -btStaticPlaneShape : public btConcaveShape -{ -protected: - btVector3 m_localAabbMin; - btVector3 m_localAabbMax; - - btVector3 m_planeNormal; - btScalar m_planeConstant; - btVector3 m_localScaling; - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btStaticPlaneShape(const btVector3& planeNormal, btScalar planeConstant); - - virtual ~btStaticPlaneShape(); - - virtual void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const; - - virtual void processAllTriangles(btTriangleCallback * callback, const btVector3& aabbMin, const btVector3& aabbMax) const; - - virtual void calculateLocalInertia(btScalar mass, btVector3 & inertia) const; - - virtual void setLocalScaling(const btVector3& scaling); - virtual const btVector3& getLocalScaling() const; - - const btVector3& getPlaneNormal() const - { - return m_planeNormal; - } - - const btScalar& getPlaneConstant() const - { - return m_planeConstant; - } - - //debugging - virtual const char* getName() const { return "STATICPLANE"; } - - virtual int calculateSerializeBufferSize() const; - - ///fills the dataBuffer and returns the struct name (and 0 on failure) - virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const; -}; - -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct btStaticPlaneShapeData -{ - btCollisionShapeData m_collisionShapeData; - - btVector3FloatData m_localScaling; - btVector3FloatData m_planeNormal; - float m_planeConstant; - char m_pad[4]; -}; - -SIMD_FORCE_INLINE int btStaticPlaneShape::calculateSerializeBufferSize() const -{ - return sizeof(btStaticPlaneShapeData); -} - -///fills the dataBuffer and returns the struct name (and 0 on failure) -SIMD_FORCE_INLINE const char* btStaticPlaneShape::serialize(void* dataBuffer, btSerializer* serializer) const -{ - btStaticPlaneShapeData* planeData = (btStaticPlaneShapeData*)dataBuffer; - btCollisionShape::serialize(&planeData->m_collisionShapeData, serializer); - - m_localScaling.serializeFloat(planeData->m_localScaling); - m_planeNormal.serializeFloat(planeData->m_planeNormal); - planeData->m_planeConstant = float(m_planeConstant); - - // Fill padding with zeros to appease msan. - planeData->m_pad[0] = 0; - planeData->m_pad[1] = 0; - planeData->m_pad[2] = 0; - planeData->m_pad[3] = 0; - - return "btStaticPlaneShapeData"; -} - -#endif //BT_STATIC_PLANE_SHAPE_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btStridingMeshInterface.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btStridingMeshInterface.h deleted file mode 100644 index 68a41dfb..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btStridingMeshInterface.h +++ /dev/null @@ -1,153 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_STRIDING_MESHINTERFACE_H -#define BT_STRIDING_MESHINTERFACE_H - -#include "LinearMath/btVector3.h" -#include "btTriangleCallback.h" -#include "btConcaveShape.h" - -/// The btStridingMeshInterface is the interface class for high performance generic access to triangle meshes, used in combination with btBvhTriangleMeshShape and some other collision shapes. -/// Using index striding of 3*sizeof(integer) it can use triangle arrays, using index striding of 1*sizeof(integer) it can handle triangle strips. -/// It allows for sharing graphics and collision meshes. Also it provides locking/unlocking of graphics meshes that are in gpu memory. -ATTRIBUTE_ALIGNED16(class) -btStridingMeshInterface -{ -protected: - btVector3 m_scaling; - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btStridingMeshInterface() : m_scaling(btScalar(1.), btScalar(1.), btScalar(1.)) - { - } - - virtual ~btStridingMeshInterface(); - - virtual void InternalProcessAllTriangles(btInternalTriangleIndexCallback * callback, const btVector3& aabbMin, const btVector3& aabbMax) const; - - ///brute force method to calculate aabb - void calculateAabbBruteForce(btVector3 & aabbMin, btVector3 & aabbMax); - - /// 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) = 0; - - 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 = 0; - - /// 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) = 0; - - virtual void unLockReadOnlyVertexBase(int subpart) const = 0; - - /// getNumSubParts returns the number of separate subparts - /// each subpart has a continuous array of vertices and indices - virtual int getNumSubParts() const = 0; - - virtual void preallocateVertices(int numverts) = 0; - virtual void preallocateIndices(int numindices) = 0; - - virtual bool hasPremadeAabb() const { return false; } - virtual void setPremadeAabb(const btVector3& aabbMin, const btVector3& aabbMax) const - { - (void)aabbMin; - (void)aabbMax; - } - virtual void getPremadeAabb(btVector3 * aabbMin, btVector3 * aabbMax) const - { - (void)aabbMin; - (void)aabbMax; - } - - const btVector3& getScaling() const - { - return m_scaling; - } - void setScaling(const btVector3& scaling) - { - m_scaling = scaling; - } - - virtual int calculateSerializeBufferSize() const; - - ///fills the dataBuffer and returns the struct name (and 0 on failure) - virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const; -}; - -struct btIntIndexData -{ - int m_value; -}; - -struct btShortIntIndexData -{ - short m_value; - char m_pad[2]; -}; - -struct btShortIntIndexTripletData -{ - short m_values[3]; - char m_pad[2]; -}; - -struct btCharIndexTripletData -{ - unsigned char m_values[3]; - char m_pad; -}; - -// clang-format off - -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct btMeshPartData -{ - btVector3FloatData *m_vertices3f; - btVector3DoubleData *m_vertices3d; - - btIntIndexData *m_indices32; - btShortIntIndexTripletData *m_3indices16; - btCharIndexTripletData *m_3indices8; - - btShortIntIndexData *m_indices16;//backwards compatibility - - int m_numTriangles;//length of m_indices = m_numTriangles - int m_numVertices; -}; - - -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct btStridingMeshInterfaceData -{ - btMeshPartData *m_meshPartsPtr; - btVector3FloatData m_scaling; - int m_numMeshParts; - char m_padding[4]; -}; - -// clang-format on - -SIMD_FORCE_INLINE int btStridingMeshInterface::calculateSerializeBufferSize() const -{ - return sizeof(btStridingMeshInterfaceData); -} - -#endif //BT_STRIDING_MESHINTERFACE_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btTetrahedronShape.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btTetrahedronShape.h deleted file mode 100644 index f5e2209e..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btTetrahedronShape.h +++ /dev/null @@ -1,71 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_SIMPLEX_1TO4_SHAPE -#define BT_SIMPLEX_1TO4_SHAPE - -#include "btPolyhedralConvexShape.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" - -///The btBU_Simplex1to4 implements tetrahedron, triangle, line, vertex collision shapes. In most cases it is better to use btConvexHullShape instead. -ATTRIBUTE_ALIGNED16(class) -btBU_Simplex1to4 : public btPolyhedralConvexAabbCachingShape -{ -protected: - int m_numVertices; - btVector3 m_vertices[4]; - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btBU_Simplex1to4(); - - btBU_Simplex1to4(const btVector3& pt0); - btBU_Simplex1to4(const btVector3& pt0, const btVector3& pt1); - btBU_Simplex1to4(const btVector3& pt0, const btVector3& pt1, const btVector3& pt2); - btBU_Simplex1to4(const btVector3& pt0, const btVector3& pt1, const btVector3& pt2, const btVector3& pt3); - - void reset() - { - m_numVertices = 0; - } - - virtual void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const; - - void addVertex(const btVector3& pt); - - //PolyhedralConvexShape interface - - virtual int getNumVertices() const; - - virtual int getNumEdges() const; - - virtual void getEdge(int i, btVector3& pa, btVector3& pb) const; - - virtual void getVertex(int i, btVector3& vtx) const; - - virtual int getNumPlanes() const; - - virtual void getPlane(btVector3 & planeNormal, btVector3 & planeSupport, int i) const; - - virtual int getIndex(int i) const; - - virtual bool isInside(const btVector3& pt, btScalar tolerance) const; - - ///getName is for debugging - virtual const char* getName() const { return "btBU_Simplex1to4"; } -}; - -#endif //BT_SIMPLEX_1TO4_SHAPE diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btTriangleBuffer.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btTriangleBuffer.h deleted file mode 100644 index a89b9cd8..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btTriangleBuffer.h +++ /dev/null @@ -1,63 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_TRIANGLE_BUFFER_H -#define BT_TRIANGLE_BUFFER_H - -#include "btTriangleCallback.h" -#include "LinearMath/btAlignedObjectArray.h" - -struct btTriangle -{ - btVector3 m_vertex0; - btVector3 m_vertex1; - btVector3 m_vertex2; - int m_partId; - int m_triangleIndex; -}; - -///The btTriangleBuffer callback can be useful to collect and store overlapping triangles between AABB and concave objects that support 'processAllTriangles' -///Example usage of this class: -/// btTriangleBuffer triBuf; -/// concaveShape->processAllTriangles(&triBuf,aabbMin, aabbMax); -/// for (int i=0;i m_triangleBuffer; - -public: - virtual void processTriangle(btVector3* triangle, int partId, int triangleIndex); - - int getNumTriangles() const - { - return int(m_triangleBuffer.size()); - } - - const btTriangle& getTriangle(int index) const - { - return m_triangleBuffer[index]; - } - - void clearBuffer() - { - m_triangleBuffer.clear(); - } -}; - -#endif //BT_TRIANGLE_BUFFER_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btTriangleCallback.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btTriangleCallback.h deleted file mode 100644 index d3644891..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btTriangleCallback.h +++ /dev/null @@ -1,37 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_TRIANGLE_CALLBACK_H -#define BT_TRIANGLE_CALLBACK_H - -#include "LinearMath/btVector3.h" - -///The btTriangleCallback provides a callback for each overlapping triangle when calling processAllTriangles. -///This callback is called by processAllTriangles for all btConcaveShape derived class, such as btBvhTriangleMeshShape, btStaticPlaneShape and btHeightfieldTerrainShape. -class btTriangleCallback -{ -public: - virtual ~btTriangleCallback(); - virtual void processTriangle(btVector3* triangle, int partId, int triangleIndex) = 0; -}; - -class btInternalTriangleIndexCallback -{ -public: - virtual ~btInternalTriangleIndexCallback(); - virtual void internalProcessTriangleIndex(btVector3* triangle, int partId, int triangleIndex) = 0; -}; - -#endif //BT_TRIANGLE_CALLBACK_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h deleted file mode 100644 index 556aa3fe..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h +++ /dev/null @@ -1,128 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_TRIANGLE_INDEX_VERTEX_ARRAY_H -#define BT_TRIANGLE_INDEX_VERTEX_ARRAY_H - -#include "btStridingMeshInterface.h" -#include "LinearMath/btAlignedObjectArray.h" -#include "LinearMath/btScalar.h" - -///The btIndexedMesh indexes a single vertex and index array. Multiple btIndexedMesh objects can be passed into a btTriangleIndexVertexArray using addIndexedMesh. -///Instead of the number of indices, we pass the number of triangles. -ATTRIBUTE_ALIGNED16(struct) -btIndexedMesh -{ - BT_DECLARE_ALIGNED_ALLOCATOR(); - - int m_numTriangles; - const unsigned char* m_triangleIndexBase; - // Size in byte of the indices for one triangle (3*sizeof(index_type) if the indices are tightly packed) - int m_triangleIndexStride; - int m_numVertices; - const unsigned char* m_vertexBase; - // Size of a vertex, in bytes - int m_vertexStride; - - // The index type is set when adding an indexed mesh to the - // btTriangleIndexVertexArray, do not set it manually - PHY_ScalarType m_indexType; - - // The vertex type has a default type similar to Bullet's precision mode (float or double) - // but can be set manually if you for example run Bullet with double precision but have - // mesh data in single precision.. - PHY_ScalarType m_vertexType; - - btIndexedMesh() - : m_indexType(PHY_INTEGER), -#ifdef BT_USE_DOUBLE_PRECISION - m_vertexType(PHY_DOUBLE) -#else // BT_USE_DOUBLE_PRECISION - m_vertexType(PHY_FLOAT) -#endif // BT_USE_DOUBLE_PRECISION - { - } -}; - -typedef btAlignedObjectArray IndexedMeshArray; - -///The btTriangleIndexVertexArray allows to access multiple triangle meshes, by indexing into existing triangle/index arrays. -///Additional meshes can be added using addIndexedMesh -///No duplicate is made of the vertex/index data, it only indexes into external vertex/index arrays. -///So keep those arrays around during the lifetime of this btTriangleIndexVertexArray. -ATTRIBUTE_ALIGNED16(class) -btTriangleIndexVertexArray : public btStridingMeshInterface -{ -protected: - IndexedMeshArray m_indexedMeshes; - int m_pad[2]; - mutable int m_hasAabb; // using int instead of bool to maintain alignment - mutable btVector3 m_aabbMin; - mutable btVector3 m_aabbMax; - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btTriangleIndexVertexArray() : m_hasAabb(0) - { - } - - virtual ~btTriangleIndexVertexArray(); - - //just to be backwards compatible - btTriangleIndexVertexArray(int numTriangles, int* triangleIndexBase, int triangleIndexStride, int numVertices, btScalar* vertexBase, int vertexStride); - - void addIndexedMesh(const btIndexedMesh& mesh, PHY_ScalarType indexType = PHY_INTEGER) - { - m_indexedMeshes.push_back(mesh); - m_indexedMeshes[m_indexedMeshes.size() - 1].m_indexType = indexType; - } - - virtual void getLockedVertexIndexBase(unsigned char** vertexbase, int& numverts, PHY_ScalarType& type, int& vertexStride, unsigned char** indexbase, int& indexstride, int& numfaces, PHY_ScalarType& indicestype, int subpart = 0); - - virtual void getLockedReadOnlyVertexIndexBase(const unsigned char** vertexbase, int& numverts, PHY_ScalarType& type, int& vertexStride, const unsigned char** indexbase, int& indexstride, int& numfaces, PHY_ScalarType& indicestype, int subpart = 0) const; - - /// 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) { (void)subpart; } - - virtual void unLockReadOnlyVertexBase(int subpart) const { (void)subpart; } - - /// getNumSubParts returns the number of separate subparts - /// each subpart has a continuous array of vertices and indices - virtual int getNumSubParts() const - { - return (int)m_indexedMeshes.size(); - } - - IndexedMeshArray& getIndexedMeshArray() - { - return m_indexedMeshes; - } - - const IndexedMeshArray& getIndexedMeshArray() const - { - return m_indexedMeshes; - } - - virtual void preallocateVertices(int numverts) { (void)numverts; } - virtual void preallocateIndices(int numindices) { (void)numindices; } - - virtual bool hasPremadeAabb() const; - virtual void setPremadeAabb(const btVector3& aabbMin, const btVector3& aabbMax) const; - virtual void getPremadeAabb(btVector3 * aabbMin, btVector3 * aabbMax) const; -}; - -#endif //BT_TRIANGLE_INDEX_VERTEX_ARRAY_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btTriangleIndexVertexMaterialArray.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btTriangleIndexVertexMaterialArray.h deleted file mode 100644 index 315b1e21..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btTriangleIndexVertexMaterialArray.h +++ /dev/null @@ -1,83 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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 file was created by Alex Silverman - -#ifndef BT_MULTIMATERIAL_TRIANGLE_INDEX_VERTEX_ARRAY_H -#define BT_MULTIMATERIAL_TRIANGLE_INDEX_VERTEX_ARRAY_H - -#include "btTriangleIndexVertexArray.h" - -ATTRIBUTE_ALIGNED16(struct) -btMaterialProperties -{ - ///m_materialBase ==========> 2 btScalar values make up one material, friction then restitution - int m_numMaterials; - const unsigned char* m_materialBase; - int m_materialStride; - PHY_ScalarType m_materialType; - ///m_numTriangles <=========== This exists in the btIndexedMesh object for the same subpart, but since we're - /// padding the structure, it can be reproduced at no real cost - ///m_triangleMaterials =====> 1 integer value makes up one entry - /// eg: m_triangleMaterials[1] = 5; // This will set triangle 2 to use material 5 - int m_numTriangles; - const unsigned char* m_triangleMaterialsBase; - int m_triangleMaterialStride; - ///m_triangleType <========== Automatically set in addMaterialProperties - PHY_ScalarType m_triangleType; -}; - -typedef btAlignedObjectArray MaterialArray; - -///Teh btTriangleIndexVertexMaterialArray is built on TriangleIndexVertexArray -///The addition of a material array allows for the utilization of the partID and -///triangleIndex that are returned in the ContactAddedCallback. As with -///TriangleIndexVertexArray, no duplicate is made of the material data, so it -///is the users responsibility to maintain the array during the lifetime of the -///TriangleIndexVertexMaterialArray. -ATTRIBUTE_ALIGNED16(class) -btTriangleIndexVertexMaterialArray : public btTriangleIndexVertexArray -{ -protected: - MaterialArray m_materials; - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btTriangleIndexVertexMaterialArray() - { - } - - btTriangleIndexVertexMaterialArray(int numTriangles, int* triangleIndexBase, int triangleIndexStride, - int numVertices, btScalar* vertexBase, int vertexStride, - int numMaterials, unsigned char* materialBase, int materialStride, - int* triangleMaterialsBase, int materialIndexStride); - - virtual ~btTriangleIndexVertexMaterialArray() {} - - void addMaterialProperties(const btMaterialProperties& mat, PHY_ScalarType triangleType = PHY_INTEGER) - { - m_materials.push_back(mat); - m_materials[m_materials.size() - 1].m_triangleType = triangleType; - } - - virtual void getLockedMaterialBase(unsigned char** materialBase, int& numMaterials, PHY_ScalarType& materialType, int& materialStride, - unsigned char** triangleMaterialBase, int& numTriangles, int& triangleMaterialStride, PHY_ScalarType& triangleType, int subpart = 0); - - virtual void getLockedReadOnlyMaterialBase(const unsigned char** materialBase, int& numMaterials, PHY_ScalarType& materialType, int& materialStride, - const unsigned char** triangleMaterialBase, int& numTriangles, int& triangleMaterialStride, PHY_ScalarType& triangleType, int subpart = 0); -}; - -#endif //BT_MULTIMATERIAL_TRIANGLE_INDEX_VERTEX_ARRAY_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btTriangleInfoMap.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btTriangleInfoMap.h deleted file mode 100644 index 8ee35ef5..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btTriangleInfoMap.h +++ /dev/null @@ -1,238 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2010 Erwin Coumans http://bulletphysics.org - -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_TRIANGLE_INFO_MAP_H -#define _BT_TRIANGLE_INFO_MAP_H - -#include "LinearMath/btHashMap.h" -#include "LinearMath/btSerializer.h" - -///for btTriangleInfo m_flags -#define TRI_INFO_V0V1_CONVEX 1 -#define TRI_INFO_V1V2_CONVEX 2 -#define TRI_INFO_V2V0_CONVEX 4 - -#define TRI_INFO_V0V1_SWAP_NORMALB 8 -#define TRI_INFO_V1V2_SWAP_NORMALB 16 -#define TRI_INFO_V2V0_SWAP_NORMALB 32 - -///The btTriangleInfo structure stores information to adjust collision normals to avoid collisions against internal edges -///it can be generated using -struct btTriangleInfo -{ - btTriangleInfo() - { - m_edgeV0V1Angle = SIMD_2_PI; - m_edgeV1V2Angle = SIMD_2_PI; - m_edgeV2V0Angle = SIMD_2_PI; - m_flags = 0; - } - - int m_flags; - - btScalar m_edgeV0V1Angle; - btScalar m_edgeV1V2Angle; - btScalar m_edgeV2V0Angle; -}; - -typedef btHashMap btInternalTriangleInfoMap; - -///The btTriangleInfoMap stores edge angle information for some triangles. You can compute this information yourself or using btGenerateInternalEdgeInfo. -struct btTriangleInfoMap : public btInternalTriangleInfoMap -{ - btScalar m_convexEpsilon; ///used to determine if an edge or contact normal is convex, using the dot product - btScalar m_planarEpsilon; ///used to determine if a triangle edge is planar with zero angle - btScalar m_equalVertexThreshold; ///used to compute connectivity: if the distance between two vertices is smaller than m_equalVertexThreshold, they are considered to be 'shared' - btScalar m_edgeDistanceThreshold; ///used to determine edge contacts: if the closest distance between a contact point and an edge is smaller than this distance threshold it is considered to "hit the edge" - btScalar m_maxEdgeAngleThreshold; //ignore edges that connect triangles at an angle larger than this m_maxEdgeAngleThreshold - btScalar m_zeroAreaThreshold; ///used to determine if a triangle is degenerate (length squared of cross product of 2 triangle edges < threshold) - - btTriangleInfoMap() - { - m_convexEpsilon = 0.00f; - m_planarEpsilon = 0.0001f; - m_equalVertexThreshold = btScalar(0.0001) * btScalar(0.0001); - m_edgeDistanceThreshold = btScalar(0.1); - m_zeroAreaThreshold = btScalar(0.0001) * btScalar(0.0001); - m_maxEdgeAngleThreshold = SIMD_2_PI; - } - virtual ~btTriangleInfoMap() {} - - virtual int calculateSerializeBufferSize() const; - - ///fills the dataBuffer and returns the struct name (and 0 on failure) - virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const; - - void deSerialize(struct btTriangleInfoMapData& data); -}; - -// clang-format off - -///those fields have to be float and not btScalar for the serialization to work properly -struct btTriangleInfoData -{ - int m_flags; - float m_edgeV0V1Angle; - float m_edgeV1V2Angle; - float m_edgeV2V0Angle; -}; - -struct btTriangleInfoMapData -{ - int *m_hashTablePtr; - int *m_nextPtr; - btTriangleInfoData *m_valueArrayPtr; - int *m_keyArrayPtr; - - float m_convexEpsilon; - float m_planarEpsilon; - float m_equalVertexThreshold; - float m_edgeDistanceThreshold; - float m_zeroAreaThreshold; - - int m_nextSize; - int m_hashTableSize; - int m_numValues; - int m_numKeys; - char m_padding[4]; -}; - -// clang-format on - -SIMD_FORCE_INLINE int btTriangleInfoMap::calculateSerializeBufferSize() const -{ - return sizeof(btTriangleInfoMapData); -} - -///fills the dataBuffer and returns the struct name (and 0 on failure) -SIMD_FORCE_INLINE const char* btTriangleInfoMap::serialize(void* dataBuffer, btSerializer* serializer) const -{ - btTriangleInfoMapData* tmapData = (btTriangleInfoMapData*)dataBuffer; - tmapData->m_convexEpsilon = (float)m_convexEpsilon; - tmapData->m_planarEpsilon = (float)m_planarEpsilon; - tmapData->m_equalVertexThreshold = (float)m_equalVertexThreshold; - tmapData->m_edgeDistanceThreshold = (float)m_edgeDistanceThreshold; - tmapData->m_zeroAreaThreshold = (float)m_zeroAreaThreshold; - - tmapData->m_hashTableSize = m_hashTable.size(); - - tmapData->m_hashTablePtr = tmapData->m_hashTableSize ? (int*)serializer->getUniquePointer((void*)&m_hashTable[0]) : 0; - if (tmapData->m_hashTablePtr) - { - //serialize an int buffer - int sz = sizeof(int); - int numElem = tmapData->m_hashTableSize; - btChunk* chunk = serializer->allocate(sz, numElem); - int* memPtr = (int*)chunk->m_oldPtr; - for (int i = 0; i < numElem; i++, memPtr++) - { - *memPtr = m_hashTable[i]; - } - serializer->finalizeChunk(chunk, "int", BT_ARRAY_CODE, (void*)&m_hashTable[0]); - } - - tmapData->m_nextSize = m_next.size(); - tmapData->m_nextPtr = tmapData->m_nextSize ? (int*)serializer->getUniquePointer((void*)&m_next[0]) : 0; - if (tmapData->m_nextPtr) - { - int sz = sizeof(int); - int numElem = tmapData->m_nextSize; - btChunk* chunk = serializer->allocate(sz, numElem); - int* memPtr = (int*)chunk->m_oldPtr; - for (int i = 0; i < numElem; i++, memPtr++) - { - *memPtr = m_next[i]; - } - serializer->finalizeChunk(chunk, "int", BT_ARRAY_CODE, (void*)&m_next[0]); - } - - tmapData->m_numValues = m_valueArray.size(); - tmapData->m_valueArrayPtr = tmapData->m_numValues ? (btTriangleInfoData*)serializer->getUniquePointer((void*)&m_valueArray[0]) : 0; - if (tmapData->m_valueArrayPtr) - { - int sz = sizeof(btTriangleInfoData); - int numElem = tmapData->m_numValues; - btChunk* chunk = serializer->allocate(sz, numElem); - btTriangleInfoData* memPtr = (btTriangleInfoData*)chunk->m_oldPtr; - for (int i = 0; i < numElem; i++, memPtr++) - { - memPtr->m_edgeV0V1Angle = (float)m_valueArray[i].m_edgeV0V1Angle; - memPtr->m_edgeV1V2Angle = (float)m_valueArray[i].m_edgeV1V2Angle; - memPtr->m_edgeV2V0Angle = (float)m_valueArray[i].m_edgeV2V0Angle; - memPtr->m_flags = m_valueArray[i].m_flags; - } - serializer->finalizeChunk(chunk, "btTriangleInfoData", BT_ARRAY_CODE, (void*)&m_valueArray[0]); - } - - tmapData->m_numKeys = m_keyArray.size(); - tmapData->m_keyArrayPtr = tmapData->m_numKeys ? (int*)serializer->getUniquePointer((void*)&m_keyArray[0]) : 0; - if (tmapData->m_keyArrayPtr) - { - int sz = sizeof(int); - int numElem = tmapData->m_numValues; - btChunk* chunk = serializer->allocate(sz, numElem); - int* memPtr = (int*)chunk->m_oldPtr; - for (int i = 0; i < numElem; i++, memPtr++) - { - *memPtr = m_keyArray[i].getUid1(); - } - serializer->finalizeChunk(chunk, "int", BT_ARRAY_CODE, (void*)&m_keyArray[0]); - } - - // Fill padding with zeros to appease msan. - tmapData->m_padding[0] = 0; - tmapData->m_padding[1] = 0; - tmapData->m_padding[2] = 0; - tmapData->m_padding[3] = 0; - - return "btTriangleInfoMapData"; -} - -///fills the dataBuffer and returns the struct name (and 0 on failure) -SIMD_FORCE_INLINE void btTriangleInfoMap::deSerialize(btTriangleInfoMapData& tmapData) -{ - m_convexEpsilon = tmapData.m_convexEpsilon; - m_planarEpsilon = tmapData.m_planarEpsilon; - m_equalVertexThreshold = tmapData.m_equalVertexThreshold; - m_edgeDistanceThreshold = tmapData.m_edgeDistanceThreshold; - m_zeroAreaThreshold = tmapData.m_zeroAreaThreshold; - m_hashTable.resize(tmapData.m_hashTableSize); - int i = 0; - for (i = 0; i < tmapData.m_hashTableSize; i++) - { - m_hashTable[i] = tmapData.m_hashTablePtr[i]; - } - m_next.resize(tmapData.m_nextSize); - for (i = 0; i < tmapData.m_nextSize; i++) - { - m_next[i] = tmapData.m_nextPtr[i]; - } - m_valueArray.resize(tmapData.m_numValues); - for (i = 0; i < tmapData.m_numValues; i++) - { - m_valueArray[i].m_edgeV0V1Angle = tmapData.m_valueArrayPtr[i].m_edgeV0V1Angle; - m_valueArray[i].m_edgeV1V2Angle = tmapData.m_valueArrayPtr[i].m_edgeV1V2Angle; - m_valueArray[i].m_edgeV2V0Angle = tmapData.m_valueArrayPtr[i].m_edgeV2V0Angle; - m_valueArray[i].m_flags = tmapData.m_valueArrayPtr[i].m_flags; - } - - m_keyArray.resize(tmapData.m_numKeys, btHashInt(0)); - for (i = 0; i < tmapData.m_numKeys; i++) - { - m_keyArray[i].setUid1(tmapData.m_keyArrayPtr[i]); - } -} - -#endif //_BT_TRIANGLE_INFO_MAP_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btTriangleMesh.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btTriangleMesh.h deleted file mode 100644 index a8a36235..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btTriangleMesh.h +++ /dev/null @@ -1,69 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_TRIANGLE_MESH_H -#define BT_TRIANGLE_MESH_H - -#include "btTriangleIndexVertexArray.h" -#include "LinearMath/btVector3.h" -#include "LinearMath/btAlignedObjectArray.h" - -///The btTriangleMesh class is a convenience class derived from btTriangleIndexVertexArray, that provides storage for a concave triangle mesh. It can be used as data for the btBvhTriangleMeshShape. -///It allows either 32bit or 16bit indices, and 4 (x-y-z-w) or 3 (x-y-z) component vertices. -///If you want to share triangle/index data between graphics mesh and collision mesh (btBvhTriangleMeshShape), you can directly use btTriangleIndexVertexArray or derive your own class from btStridingMeshInterface. -///Performance of btTriangleMesh and btTriangleIndexVertexArray used in a btBvhTriangleMeshShape is the same. -class btTriangleMesh : public btTriangleIndexVertexArray -{ - btAlignedObjectArray m_4componentVertices; - btAlignedObjectArray m_3componentVertices; - - btAlignedObjectArray m_32bitIndices; - btAlignedObjectArray m_16bitIndices; - bool m_use32bitIndices; - bool m_use4componentVertices; - -public: - btScalar m_weldingThreshold; - - btTriangleMesh(bool use32bitIndices = true, bool use4componentVertices = true); - - bool getUse32bitIndices() const - { - return m_use32bitIndices; - } - - bool getUse4componentVertices() const - { - return m_use4componentVertices; - } - ///By default addTriangle won't search for duplicate vertices, because the search is very slow for large triangle meshes. - ///In general it is better to directly use btTriangleIndexVertexArray instead. - void addTriangle(const btVector3& vertex0, const btVector3& vertex1, const btVector3& vertex2, bool removeDuplicateVertices = false); - - ///Add a triangle using its indices. Make sure the indices are pointing within the vertices array, so add the vertices first (and to be sure, avoid removal of duplicate vertices) - void addTriangleIndices(int index1, int index2, int index3); - - int getNumTriangles() const; - - virtual void preallocateVertices(int numverts); - virtual void preallocateIndices(int numindices); - - ///findOrAddVertex is an internal method, use addTriangle instead - int findOrAddVertex(const btVector3& vertex, bool removeDuplicateVertices); - ///addIndex is an internal method, use addTriangle instead - void addIndex(int index); -}; - -#endif //BT_TRIANGLE_MESH_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btTriangleMeshShape.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btTriangleMeshShape.h deleted file mode 100644 index 4a70e283..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btTriangleMeshShape.h +++ /dev/null @@ -1,82 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_TRIANGLE_MESH_SHAPE_H -#define BT_TRIANGLE_MESH_SHAPE_H - -#include "btConcaveShape.h" -#include "btStridingMeshInterface.h" - -///The btTriangleMeshShape is an internal concave triangle mesh interface. Don't use this class directly, use btBvhTriangleMeshShape instead. -ATTRIBUTE_ALIGNED16(class) -btTriangleMeshShape : public btConcaveShape -{ -protected: - btVector3 m_localAabbMin; - btVector3 m_localAabbMax; - btStridingMeshInterface* m_meshInterface; - - ///btTriangleMeshShape constructor has been disabled/protected, so that users will not mistakenly use this class. - ///Don't use btTriangleMeshShape but use btBvhTriangleMeshShape instead! - btTriangleMeshShape(btStridingMeshInterface * meshInterface); - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - virtual ~btTriangleMeshShape(); - - virtual btVector3 localGetSupportingVertex(const btVector3& vec) const; - - virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec) const - { - btAssert(0); - return localGetSupportingVertex(vec); - } - - void recalcLocalAabb(); - - virtual void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const; - - virtual void processAllTriangles(btTriangleCallback * callback, const btVector3& aabbMin, const btVector3& aabbMax) const; - - virtual void calculateLocalInertia(btScalar mass, btVector3 & inertia) const; - - virtual void setLocalScaling(const btVector3& scaling); - virtual const btVector3& getLocalScaling() const; - - btStridingMeshInterface* getMeshInterface() - { - return m_meshInterface; - } - - const btStridingMeshInterface* getMeshInterface() const - { - return m_meshInterface; - } - - const btVector3& getLocalAabbMin() const - { - return m_localAabbMin; - } - const btVector3& getLocalAabbMax() const - { - return m_localAabbMax; - } - - //debugging - virtual const char* getName() const { return "TRIANGLEMESH"; } -}; - -#endif //BT_TRIANGLE_MESH_SHAPE_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btTriangleShape.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btTriangleShape.h deleted file mode 100644 index 190cbdae..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btTriangleShape.h +++ /dev/null @@ -1,175 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_OBB_TRIANGLE_MINKOWSKI_H -#define BT_OBB_TRIANGLE_MINKOWSKI_H - -#include "btConvexShape.h" -#include "btBoxShape.h" - -ATTRIBUTE_ALIGNED16(class) -btTriangleShape : public btPolyhedralConvexShape -{ -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btVector3 m_vertices1[3]; - - virtual int getNumVertices() const - { - return 3; - } - - btVector3& getVertexPtr(int index) - { - return m_vertices1[index]; - } - - const btVector3& getVertexPtr(int index) const - { - return m_vertices1[index]; - } - virtual void getVertex(int index, btVector3& vert) const - { - vert = m_vertices1[index]; - } - - virtual int getNumEdges() const - { - return 3; - } - - virtual void getEdge(int i, btVector3& pa, btVector3& pb) const - { - getVertex(i, pa); - getVertex((i + 1) % 3, pb); - } - - virtual void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const - { - // btAssert(0); - getAabbSlow(t, aabbMin, aabbMax); - } - - btVector3 localGetSupportingVertexWithoutMargin(const btVector3& dir) const - { - btVector3 dots = dir.dot3(m_vertices1[0], m_vertices1[1], m_vertices1[2]); - return m_vertices1[dots.maxAxis()]; - } - - virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const - { - for (int i = 0; i < numVectors; i++) - { - const btVector3& dir = vectors[i]; - btVector3 dots = dir.dot3(m_vertices1[0], m_vertices1[1], m_vertices1[2]); - supportVerticesOut[i] = m_vertices1[dots.maxAxis()]; - } - } - - btTriangleShape() : btPolyhedralConvexShape() - { - m_shapeType = TRIANGLE_SHAPE_PROXYTYPE; - } - - btTriangleShape(const btVector3& p0, const btVector3& p1, const btVector3& p2) : btPolyhedralConvexShape() - { - m_shapeType = TRIANGLE_SHAPE_PROXYTYPE; - m_vertices1[0] = p0; - m_vertices1[1] = p1; - m_vertices1[2] = p2; - } - - virtual void getPlane(btVector3 & planeNormal, btVector3 & planeSupport, int i) const - { - getPlaneEquation(i, planeNormal, planeSupport); - } - - virtual int getNumPlanes() const - { - return 1; - } - - void calcNormal(btVector3 & normal) const - { - normal = (m_vertices1[1] - m_vertices1[0]).cross(m_vertices1[2] - m_vertices1[0]); - normal.normalize(); - } - - virtual void getPlaneEquation(int i, btVector3& planeNormal, btVector3& planeSupport) const - { - (void)i; - calcNormal(planeNormal); - planeSupport = m_vertices1[0]; - } - - virtual void calculateLocalInertia(btScalar mass, btVector3 & inertia) const - { - (void)mass; - btAssert(0); - inertia.setValue(btScalar(0.), btScalar(0.), btScalar(0.)); - } - - virtual bool isInside(const btVector3& pt, btScalar tolerance) const - { - btVector3 normal; - calcNormal(normal); - //distance to plane - btScalar dist = pt.dot(normal); - btScalar planeconst = m_vertices1[0].dot(normal); - dist -= planeconst; - if (dist >= -tolerance && dist <= tolerance) - { - //inside check on edge-planes - int i; - for (i = 0; i < 3; i++) - { - btVector3 pa, pb; - getEdge(i, pa, pb); - btVector3 edge = pb - pa; - btVector3 edgeNormal = edge.cross(normal); - edgeNormal.normalize(); - btScalar dist = pt.dot(edgeNormal); - btScalar edgeConst = pa.dot(edgeNormal); - dist -= edgeConst; - if (dist < -tolerance) - return false; - } - - return true; - } - - return false; - } - //debugging - virtual const char* getName() const - { - return "Triangle"; - } - - virtual int getNumPreferredPenetrationDirections() const - { - return 2; - } - - virtual void getPreferredPenetrationDirection(int index, btVector3& penetrationVector) const - { - calcNormal(penetrationVector); - if (index) - penetrationVector *= btScalar(-1.); - } -}; - -#endif //BT_OBB_TRIANGLE_MINKOWSKI_H diff --git a/engine/inc/bullet/BulletCollision/CollisionShapes/btUniformScalingShape.h b/engine/inc/bullet/BulletCollision/CollisionShapes/btUniformScalingShape.h deleted file mode 100644 index 4dfe34ef..00000000 --- a/engine/inc/bullet/BulletCollision/CollisionShapes/btUniformScalingShape.h +++ /dev/null @@ -1,84 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_UNIFORM_SCALING_SHAPE_H -#define BT_UNIFORM_SCALING_SHAPE_H - -#include "btConvexShape.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types - -///The btUniformScalingShape allows to re-use uniform scaled instances of btConvexShape in a memory efficient way. -///Istead of using btUniformScalingShape, it is better to use the non-uniform setLocalScaling method on convex shapes that implement it. -ATTRIBUTE_ALIGNED16(class) -btUniformScalingShape : public btConvexShape -{ - btConvexShape* m_childConvexShape; - - btScalar m_uniformScalingFactor; - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btUniformScalingShape(btConvexShape * convexChildShape, btScalar uniformScalingFactor); - - virtual ~btUniformScalingShape(); - - virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec) const; - - virtual btVector3 localGetSupportingVertex(const btVector3& vec) const; - - virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const; - - virtual void calculateLocalInertia(btScalar mass, btVector3 & inertia) const; - - btScalar getUniformScalingFactor() const - { - return m_uniformScalingFactor; - } - - btConvexShape* getChildShape() - { - return m_childConvexShape; - } - - const btConvexShape* getChildShape() const - { - return m_childConvexShape; - } - - virtual const char* getName() const - { - return "UniformScalingShape"; - } - - /////////////////////////// - - ///getAabb's default implementation is brute force, expected derived classes to implement a fast dedicated version - void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const; - - virtual void getAabbSlow(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const; - - virtual void setLocalScaling(const btVector3& scaling); - virtual const btVector3& getLocalScaling() const; - - virtual void setMargin(btScalar margin); - virtual btScalar getMargin() const; - - virtual int getNumPreferredPenetrationDirections() const; - - virtual void getPreferredPenetrationDirection(int index, btVector3& penetrationVector) const; -}; - -#endif //BT_UNIFORM_SCALING_SHAPE_H diff --git a/engine/inc/bullet/BulletCollision/Gimpact/btBoxCollision.h b/engine/inc/bullet/BulletCollision/Gimpact/btBoxCollision.h deleted file mode 100644 index 182835c3..00000000 --- a/engine/inc/bullet/BulletCollision/Gimpact/btBoxCollision.h +++ /dev/null @@ -1,620 +0,0 @@ -#ifndef BT_BOX_COLLISION_H_INCLUDED -#define BT_BOX_COLLISION_H_INCLUDED - -/*! \file gim_box_collision.h -\author Francisco Leon Najera -*/ -/* -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 "LinearMath/btTransform.h" - -///Swap numbers -#define BT_SWAP_NUMBERS(a, b) \ - { \ - a = a + b; \ - b = a - b; \ - a = a - b; \ - } - -#define BT_MAX(a, b) (a < b ? b : a) -#define BT_MIN(a, b) (a > b ? b : a) - -#define BT_GREATER(x, y) btFabs(x) > (y) - -#define BT_MAX3(a, b, c) BT_MAX(a, BT_MAX(b, c)) -#define BT_MIN3(a, b, c) BT_MIN(a, BT_MIN(b, c)) - -enum eBT_PLANE_INTERSECTION_TYPE -{ - BT_CONST_BACK_PLANE = 0, - BT_CONST_COLLIDE_PLANE, - BT_CONST_FRONT_PLANE -}; - -//SIMD_FORCE_INLINE bool test_cross_edge_box( -// const btVector3 & edge, -// const btVector3 & absolute_edge, -// const btVector3 & pointa, -// const btVector3 & pointb, const btVector3 & extend, -// int dir_index0, -// int dir_index1 -// int component_index0, -// int component_index1) -//{ -// // dir coords are -z and y -// -// const btScalar dir0 = -edge[dir_index0]; -// const btScalar dir1 = edge[dir_index1]; -// btScalar pmin = pointa[component_index0]*dir0 + pointa[component_index1]*dir1; -// btScalar pmax = pointb[component_index0]*dir0 + pointb[component_index1]*dir1; -// //find minmax -// if(pmin>pmax) -// { -// BT_SWAP_NUMBERS(pmin,pmax); -// } -// //find extends -// const btScalar rad = extend[component_index0] * absolute_edge[dir_index0] + -// extend[component_index1] * absolute_edge[dir_index1]; -// -// if(pmin>rad || -rad>pmax) return false; -// return true; -//} -// -//SIMD_FORCE_INLINE bool test_cross_edge_box_X_axis( -// const btVector3 & edge, -// const btVector3 & absolute_edge, -// const btVector3 & pointa, -// const btVector3 & pointb, btVector3 & extend) -//{ -// -// return test_cross_edge_box(edge,absolute_edge,pointa,pointb,extend,2,1,1,2); -//} -// -// -//SIMD_FORCE_INLINE bool test_cross_edge_box_Y_axis( -// const btVector3 & edge, -// const btVector3 & absolute_edge, -// const btVector3 & pointa, -// const btVector3 & pointb, btVector3 & extend) -//{ -// -// return test_cross_edge_box(edge,absolute_edge,pointa,pointb,extend,0,2,2,0); -//} -// -//SIMD_FORCE_INLINE bool test_cross_edge_box_Z_axis( -// const btVector3 & edge, -// const btVector3 & absolute_edge, -// const btVector3 & pointa, -// const btVector3 & pointb, btVector3 & extend) -//{ -// -// return test_cross_edge_box(edge,absolute_edge,pointa,pointb,extend,1,0,0,1); -//} - -#define TEST_CROSS_EDGE_BOX_MCR(edge, absolute_edge, pointa, pointb, _extend, i_dir_0, i_dir_1, i_comp_0, i_comp_1) \ - { \ - const btScalar dir0 = -edge[i_dir_0]; \ - const btScalar dir1 = edge[i_dir_1]; \ - btScalar pmin = pointa[i_comp_0] * dir0 + pointa[i_comp_1] * dir1; \ - btScalar pmax = pointb[i_comp_0] * dir0 + pointb[i_comp_1] * dir1; \ - if (pmin > pmax) \ - { \ - BT_SWAP_NUMBERS(pmin, pmax); \ - } \ - const btScalar abs_dir0 = absolute_edge[i_dir_0]; \ - const btScalar abs_dir1 = absolute_edge[i_dir_1]; \ - const btScalar rad = _extend[i_comp_0] * abs_dir0 + _extend[i_comp_1] * abs_dir1; \ - if (pmin > rad || -rad > pmax) return false; \ - } - -#define TEST_CROSS_EDGE_BOX_X_AXIS_MCR(edge, absolute_edge, pointa, pointb, _extend) \ - { \ - TEST_CROSS_EDGE_BOX_MCR(edge, absolute_edge, pointa, pointb, _extend, 2, 1, 1, 2); \ - } - -#define TEST_CROSS_EDGE_BOX_Y_AXIS_MCR(edge, absolute_edge, pointa, pointb, _extend) \ - { \ - TEST_CROSS_EDGE_BOX_MCR(edge, absolute_edge, pointa, pointb, _extend, 0, 2, 2, 0); \ - } - -#define TEST_CROSS_EDGE_BOX_Z_AXIS_MCR(edge, absolute_edge, pointa, pointb, _extend) \ - { \ - TEST_CROSS_EDGE_BOX_MCR(edge, absolute_edge, pointa, pointb, _extend, 1, 0, 0, 1); \ - } - -//! Returns the dot product between a vec3f and the col of a matrix -SIMD_FORCE_INLINE btScalar bt_mat3_dot_col( - const btMatrix3x3 &mat, const btVector3 &vec3, int colindex) -{ - return vec3[0] * mat[0][colindex] + vec3[1] * mat[1][colindex] + vec3[2] * mat[2][colindex]; -} - -//! Class for transforming a model1 to the space of model0 -ATTRIBUTE_ALIGNED16(class) -BT_BOX_BOX_TRANSFORM_CACHE -{ -public: - btVector3 m_T1to0; //!< Transforms translation of model1 to model 0 - btMatrix3x3 m_R1to0; //!< Transforms Rotation of model1 to model 0, equal to R0' * R1 - btMatrix3x3 m_AR; //!< Absolute value of m_R1to0 - - SIMD_FORCE_INLINE void calc_absolute_matrix() - { - // static const btVector3 vepsi(1e-6f,1e-6f,1e-6f); - // m_AR[0] = vepsi + m_R1to0[0].absolute(); - // m_AR[1] = vepsi + m_R1to0[1].absolute(); - // m_AR[2] = vepsi + m_R1to0[2].absolute(); - - int i, j; - - for (i = 0; i < 3; i++) - { - for (j = 0; j < 3; j++) - { - m_AR[i][j] = 1e-6f + btFabs(m_R1to0[i][j]); - } - } - } - - BT_BOX_BOX_TRANSFORM_CACHE() - { - } - - //! Calc the transformation relative 1 to 0. Inverts matrics by transposing - SIMD_FORCE_INLINE void calc_from_homogenic(const btTransform &trans0, const btTransform &trans1) - { - btTransform temp_trans = trans0.inverse(); - temp_trans = temp_trans * trans1; - - m_T1to0 = temp_trans.getOrigin(); - m_R1to0 = temp_trans.getBasis(); - - calc_absolute_matrix(); - } - - //! Calcs the full invertion of the matrices. Useful for scaling matrices - SIMD_FORCE_INLINE void calc_from_full_invert(const btTransform &trans0, const btTransform &trans1) - { - m_R1to0 = trans0.getBasis().inverse(); - m_T1to0 = m_R1to0 * (-trans0.getOrigin()); - - m_T1to0 += m_R1to0 * trans1.getOrigin(); - m_R1to0 *= trans1.getBasis(); - - calc_absolute_matrix(); - } - - SIMD_FORCE_INLINE btVector3 transform(const btVector3 &point) const - { - return point.dot3(m_R1to0[0], m_R1to0[1], m_R1to0[2]) + m_T1to0; - } -}; - -#define BOX_PLANE_EPSILON 0.000001f - -//! Axis aligned box -ATTRIBUTE_ALIGNED16(class) -btAABB -{ -public: - btVector3 m_min; - btVector3 m_max; - - btAABB() - { - } - - btAABB(const btVector3 &V1, - const btVector3 &V2, - const btVector3 &V3) - { - m_min[0] = BT_MIN3(V1[0], V2[0], V3[0]); - m_min[1] = BT_MIN3(V1[1], V2[1], V3[1]); - m_min[2] = BT_MIN3(V1[2], V2[2], V3[2]); - - m_max[0] = BT_MAX3(V1[0], V2[0], V3[0]); - m_max[1] = BT_MAX3(V1[1], V2[1], V3[1]); - m_max[2] = BT_MAX3(V1[2], V2[2], V3[2]); - } - - btAABB(const btVector3 &V1, - const btVector3 &V2, - const btVector3 &V3, - btScalar margin) - { - m_min[0] = BT_MIN3(V1[0], V2[0], V3[0]); - m_min[1] = BT_MIN3(V1[1], V2[1], V3[1]); - m_min[2] = BT_MIN3(V1[2], V2[2], V3[2]); - - m_max[0] = BT_MAX3(V1[0], V2[0], V3[0]); - m_max[1] = BT_MAX3(V1[1], V2[1], V3[1]); - m_max[2] = BT_MAX3(V1[2], V2[2], V3[2]); - - m_min[0] -= margin; - m_min[1] -= margin; - m_min[2] -= margin; - m_max[0] += margin; - m_max[1] += margin; - m_max[2] += margin; - } - - btAABB(const btAABB &other) : m_min(other.m_min), m_max(other.m_max) - { - } - - btAABB(const btAABB &other, btScalar margin) : m_min(other.m_min), m_max(other.m_max) - { - m_min[0] -= margin; - m_min[1] -= margin; - m_min[2] -= margin; - m_max[0] += margin; - m_max[1] += margin; - m_max[2] += margin; - } - - SIMD_FORCE_INLINE void invalidate() - { - m_min[0] = SIMD_INFINITY; - m_min[1] = SIMD_INFINITY; - m_min[2] = SIMD_INFINITY; - m_max[0] = -SIMD_INFINITY; - m_max[1] = -SIMD_INFINITY; - m_max[2] = -SIMD_INFINITY; - } - - SIMD_FORCE_INLINE void increment_margin(btScalar margin) - { - m_min[0] -= margin; - m_min[1] -= margin; - m_min[2] -= margin; - m_max[0] += margin; - m_max[1] += margin; - m_max[2] += margin; - } - - SIMD_FORCE_INLINE void copy_with_margin(const btAABB &other, btScalar margin) - { - m_min[0] = other.m_min[0] - margin; - m_min[1] = other.m_min[1] - margin; - m_min[2] = other.m_min[2] - margin; - - m_max[0] = other.m_max[0] + margin; - m_max[1] = other.m_max[1] + margin; - m_max[2] = other.m_max[2] + margin; - } - - template - SIMD_FORCE_INLINE void calc_from_triangle( - const CLASS_POINT &V1, - const CLASS_POINT &V2, - const CLASS_POINT &V3) - { - m_min[0] = BT_MIN3(V1[0], V2[0], V3[0]); - m_min[1] = BT_MIN3(V1[1], V2[1], V3[1]); - m_min[2] = BT_MIN3(V1[2], V2[2], V3[2]); - - m_max[0] = BT_MAX3(V1[0], V2[0], V3[0]); - m_max[1] = BT_MAX3(V1[1], V2[1], V3[1]); - m_max[2] = BT_MAX3(V1[2], V2[2], V3[2]); - } - - template - SIMD_FORCE_INLINE void calc_from_triangle_margin( - const CLASS_POINT &V1, - const CLASS_POINT &V2, - const CLASS_POINT &V3, btScalar margin) - { - m_min[0] = BT_MIN3(V1[0], V2[0], V3[0]); - m_min[1] = BT_MIN3(V1[1], V2[1], V3[1]); - m_min[2] = BT_MIN3(V1[2], V2[2], V3[2]); - - m_max[0] = BT_MAX3(V1[0], V2[0], V3[0]); - m_max[1] = BT_MAX3(V1[1], V2[1], V3[1]); - m_max[2] = BT_MAX3(V1[2], V2[2], V3[2]); - - m_min[0] -= margin; - m_min[1] -= margin; - m_min[2] -= margin; - m_max[0] += margin; - m_max[1] += margin; - m_max[2] += margin; - } - - //! Apply a transform to an AABB - SIMD_FORCE_INLINE void appy_transform(const btTransform &trans) - { - btVector3 center = (m_max + m_min) * 0.5f; - btVector3 extends = m_max - center; - // Compute new center - center = trans(center); - - btVector3 textends = extends.dot3(trans.getBasis().getRow(0).absolute(), - trans.getBasis().getRow(1).absolute(), - trans.getBasis().getRow(2).absolute()); - - m_min = center - textends; - m_max = center + textends; - } - - //! Apply a transform to an AABB - SIMD_FORCE_INLINE void appy_transform_trans_cache(const BT_BOX_BOX_TRANSFORM_CACHE &trans) - { - btVector3 center = (m_max + m_min) * 0.5f; - btVector3 extends = m_max - center; - // Compute new center - center = trans.transform(center); - - btVector3 textends = extends.dot3(trans.m_R1to0.getRow(0).absolute(), - trans.m_R1to0.getRow(1).absolute(), - trans.m_R1to0.getRow(2).absolute()); - - m_min = center - textends; - m_max = center + textends; - } - - //! Merges a Box - SIMD_FORCE_INLINE void merge(const btAABB &box) - { - m_min[0] = BT_MIN(m_min[0], box.m_min[0]); - m_min[1] = BT_MIN(m_min[1], box.m_min[1]); - m_min[2] = BT_MIN(m_min[2], box.m_min[2]); - - m_max[0] = BT_MAX(m_max[0], box.m_max[0]); - m_max[1] = BT_MAX(m_max[1], box.m_max[1]); - m_max[2] = BT_MAX(m_max[2], box.m_max[2]); - } - - //! Merges a point - template - SIMD_FORCE_INLINE void merge_point(const CLASS_POINT &point) - { - m_min[0] = BT_MIN(m_min[0], point[0]); - m_min[1] = BT_MIN(m_min[1], point[1]); - m_min[2] = BT_MIN(m_min[2], point[2]); - - m_max[0] = BT_MAX(m_max[0], point[0]); - m_max[1] = BT_MAX(m_max[1], point[1]); - m_max[2] = BT_MAX(m_max[2], point[2]); - } - - //! Gets the extend and center - SIMD_FORCE_INLINE void get_center_extend(btVector3 & center, btVector3 & extend) const - { - center = (m_max + m_min) * 0.5f; - extend = m_max - center; - } - - //! Finds the intersecting box between this box and the other. - SIMD_FORCE_INLINE void find_intersection(const btAABB &other, btAABB &intersection) const - { - intersection.m_min[0] = BT_MAX(other.m_min[0], m_min[0]); - intersection.m_min[1] = BT_MAX(other.m_min[1], m_min[1]); - intersection.m_min[2] = BT_MAX(other.m_min[2], m_min[2]); - - intersection.m_max[0] = BT_MIN(other.m_max[0], m_max[0]); - intersection.m_max[1] = BT_MIN(other.m_max[1], m_max[1]); - intersection.m_max[2] = BT_MIN(other.m_max[2], m_max[2]); - } - - SIMD_FORCE_INLINE bool has_collision(const btAABB &other) const - { - if (m_min[0] > other.m_max[0] || - m_max[0] < other.m_min[0] || - m_min[1] > other.m_max[1] || - m_max[1] < other.m_min[1] || - m_min[2] > other.m_max[2] || - m_max[2] < other.m_min[2]) - { - return false; - } - return true; - } - - /*! \brief Finds the Ray intersection parameter. - \param aabb Aligned box - \param vorigin A vec3f with the origin of the ray - \param vdir A vec3f with the direction of the ray - */ - SIMD_FORCE_INLINE bool collide_ray(const btVector3 &vorigin, const btVector3 &vdir) const - { - btVector3 extents, center; - this->get_center_extend(center, extents); - ; - - btScalar Dx = vorigin[0] - center[0]; - if (BT_GREATER(Dx, extents[0]) && Dx * vdir[0] >= 0.0f) return false; - btScalar Dy = vorigin[1] - center[1]; - if (BT_GREATER(Dy, extents[1]) && Dy * vdir[1] >= 0.0f) return false; - btScalar Dz = vorigin[2] - center[2]; - if (BT_GREATER(Dz, extents[2]) && Dz * vdir[2] >= 0.0f) return false; - - btScalar f = vdir[1] * Dz - vdir[2] * Dy; - if (btFabs(f) > extents[1] * btFabs(vdir[2]) + extents[2] * btFabs(vdir[1])) return false; - f = vdir[2] * Dx - vdir[0] * Dz; - if (btFabs(f) > extents[0] * btFabs(vdir[2]) + extents[2] * btFabs(vdir[0])) return false; - f = vdir[0] * Dy - vdir[1] * Dx; - if (btFabs(f) > extents[0] * btFabs(vdir[1]) + extents[1] * btFabs(vdir[0])) return false; - return true; - } - - SIMD_FORCE_INLINE void projection_interval(const btVector3 &direction, btScalar &vmin, btScalar &vmax) const - { - btVector3 center = (m_max + m_min) * 0.5f; - btVector3 extend = m_max - center; - - btScalar _fOrigin = direction.dot(center); - btScalar _fMaximumExtent = extend.dot(direction.absolute()); - vmin = _fOrigin - _fMaximumExtent; - vmax = _fOrigin + _fMaximumExtent; - } - - SIMD_FORCE_INLINE eBT_PLANE_INTERSECTION_TYPE plane_classify(const btVector4 &plane) const - { - btScalar _fmin, _fmax; - this->projection_interval(plane, _fmin, _fmax); - - if (plane[3] > _fmax + BOX_PLANE_EPSILON) - { - return BT_CONST_BACK_PLANE; // 0 - } - - if (plane[3] + BOX_PLANE_EPSILON >= _fmin) - { - return BT_CONST_COLLIDE_PLANE; //1 - } - return BT_CONST_FRONT_PLANE; //2 - } - - SIMD_FORCE_INLINE bool overlapping_trans_conservative(const btAABB &box, btTransform &trans1_to_0) const - { - btAABB tbox = box; - tbox.appy_transform(trans1_to_0); - return has_collision(tbox); - } - - SIMD_FORCE_INLINE bool overlapping_trans_conservative2(const btAABB &box, - const BT_BOX_BOX_TRANSFORM_CACHE &trans1_to_0) const - { - btAABB tbox = box; - tbox.appy_transform_trans_cache(trans1_to_0); - return has_collision(tbox); - } - - //! transcache is the transformation cache from box to this AABB - SIMD_FORCE_INLINE bool overlapping_trans_cache( - const btAABB &box, const BT_BOX_BOX_TRANSFORM_CACHE &transcache, bool fulltest) const - { - //Taken from OPCODE - btVector3 ea, eb; //extends - btVector3 ca, cb; //extends - get_center_extend(ca, ea); - box.get_center_extend(cb, eb); - - btVector3 T; - btScalar t, t2; - int i; - - // Class I : A's basis vectors - for (i = 0; i < 3; i++) - { - T[i] = transcache.m_R1to0[i].dot(cb) + transcache.m_T1to0[i] - ca[i]; - t = transcache.m_AR[i].dot(eb) + ea[i]; - if (BT_GREATER(T[i], t)) return false; - } - // Class II : B's basis vectors - for (i = 0; i < 3; i++) - { - t = bt_mat3_dot_col(transcache.m_R1to0, T, i); - t2 = bt_mat3_dot_col(transcache.m_AR, ea, i) + eb[i]; - if (BT_GREATER(t, t2)) return false; - } - // Class III : 9 cross products - if (fulltest) - { - int j, m, n, o, p, q, r; - for (i = 0; i < 3; i++) - { - m = (i + 1) % 3; - n = (i + 2) % 3; - o = i == 0 ? 1 : 0; - p = i == 2 ? 1 : 2; - for (j = 0; j < 3; j++) - { - q = j == 2 ? 1 : 2; - r = j == 0 ? 1 : 0; - t = T[n] * transcache.m_R1to0[m][j] - T[m] * transcache.m_R1to0[n][j]; - t2 = ea[o] * transcache.m_AR[p][j] + ea[p] * transcache.m_AR[o][j] + - eb[r] * transcache.m_AR[i][q] + eb[q] * transcache.m_AR[i][r]; - if (BT_GREATER(t, t2)) return false; - } - } - } - return true; - } - - //! Simple test for planes. - SIMD_FORCE_INLINE bool collide_plane( - const btVector4 &plane) const - { - eBT_PLANE_INTERSECTION_TYPE classify = plane_classify(plane); - return (classify == BT_CONST_COLLIDE_PLANE); - } - - //! test for a triangle, with edges - SIMD_FORCE_INLINE bool collide_triangle_exact( - const btVector3 &p1, - const btVector3 &p2, - const btVector3 &p3, - const btVector4 &triangle_plane) const - { - if (!collide_plane(triangle_plane)) return false; - - btVector3 center, extends; - this->get_center_extend(center, extends); - - const btVector3 v1(p1 - center); - const btVector3 v2(p2 - center); - const btVector3 v3(p3 - center); - - //First axis - btVector3 diff(v2 - v1); - btVector3 abs_diff = diff.absolute(); - //Test With X axis - TEST_CROSS_EDGE_BOX_X_AXIS_MCR(diff, abs_diff, v1, v3, extends); - //Test With Y axis - TEST_CROSS_EDGE_BOX_Y_AXIS_MCR(diff, abs_diff, v1, v3, extends); - //Test With Z axis - TEST_CROSS_EDGE_BOX_Z_AXIS_MCR(diff, abs_diff, v1, v3, extends); - - diff = v3 - v2; - abs_diff = diff.absolute(); - //Test With X axis - TEST_CROSS_EDGE_BOX_X_AXIS_MCR(diff, abs_diff, v2, v1, extends); - //Test With Y axis - TEST_CROSS_EDGE_BOX_Y_AXIS_MCR(diff, abs_diff, v2, v1, extends); - //Test With Z axis - TEST_CROSS_EDGE_BOX_Z_AXIS_MCR(diff, abs_diff, v2, v1, extends); - - diff = v1 - v3; - abs_diff = diff.absolute(); - //Test With X axis - TEST_CROSS_EDGE_BOX_X_AXIS_MCR(diff, abs_diff, v3, v2, extends); - //Test With Y axis - TEST_CROSS_EDGE_BOX_Y_AXIS_MCR(diff, abs_diff, v3, v2, extends); - //Test With Z axis - TEST_CROSS_EDGE_BOX_Z_AXIS_MCR(diff, abs_diff, v3, v2, extends); - - return true; - } -}; - -//! Compairison of transformation objects -SIMD_FORCE_INLINE bool btCompareTransformsEqual(const btTransform &t1, const btTransform &t2) -{ - if (!(t1.getOrigin() == t2.getOrigin())) return false; - - if (!(t1.getBasis().getRow(0) == t2.getBasis().getRow(0))) return false; - if (!(t1.getBasis().getRow(1) == t2.getBasis().getRow(1))) return false; - if (!(t1.getBasis().getRow(2) == t2.getBasis().getRow(2))) return false; - return true; -} - -#endif // GIM_BOX_COLLISION_H_INCLUDED diff --git a/engine/inc/bullet/BulletCollision/Gimpact/btClipPolygon.h b/engine/inc/bullet/BulletCollision/Gimpact/btClipPolygon.h deleted file mode 100644 index 38c23e22..00000000 --- a/engine/inc/bullet/BulletCollision/Gimpact/btClipPolygon.h +++ /dev/null @@ -1,173 +0,0 @@ -#ifndef BT_CLIP_POLYGON_H_INCLUDED -#define BT_CLIP_POLYGON_H_INCLUDED - -/*! \file btClipPolygon.h -\author Francisco Leon Najera -*/ -/* -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 "LinearMath/btTransform.h" -#include "LinearMath/btGeometryUtil.h" - -SIMD_FORCE_INLINE btScalar bt_distance_point_plane(const btVector4 &plane, const btVector3 &point) -{ - return point.dot(plane) - plane[3]; -} - -/*! Vector blending -Takes two vectors a, b, blends them together*/ -SIMD_FORCE_INLINE void bt_vec_blend(btVector3 &vr, const btVector3 &va, const btVector3 &vb, btScalar blend_factor) -{ - vr = (1 - blend_factor) * va + blend_factor * vb; -} - -//! This function calcs the distance from a 3D plane -SIMD_FORCE_INLINE void bt_plane_clip_polygon_collect( - const btVector3 &point0, - const btVector3 &point1, - btScalar dist0, - btScalar dist1, - btVector3 *clipped, - int &clipped_count) -{ - bool _prevclassif = (dist0 > SIMD_EPSILON); - bool _classif = (dist1 > SIMD_EPSILON); - if (_classif != _prevclassif) - { - btScalar blendfactor = -dist0 / (dist1 - dist0); - bt_vec_blend(clipped[clipped_count], point0, point1, blendfactor); - clipped_count++; - } - if (!_classif) - { - clipped[clipped_count] = point1; - clipped_count++; - } -} - -//! Clips a polygon by a plane -/*! -*\return The count of the clipped counts -*/ -SIMD_FORCE_INLINE int bt_plane_clip_polygon( - const btVector4 &plane, - const btVector3 *polygon_points, - int polygon_point_count, - btVector3 *clipped) -{ - int clipped_count = 0; - - //clip first point - btScalar firstdist = bt_distance_point_plane(plane, polygon_points[0]); - ; - if (!(firstdist > SIMD_EPSILON)) - { - clipped[clipped_count] = polygon_points[0]; - clipped_count++; - } - - btScalar olddist = firstdist; - for (int i = 1; i < polygon_point_count; i++) - { - btScalar dist = bt_distance_point_plane(plane, polygon_points[i]); - - bt_plane_clip_polygon_collect( - polygon_points[i - 1], polygon_points[i], - olddist, - dist, - clipped, - clipped_count); - - olddist = dist; - } - - //RETURN TO FIRST point - - bt_plane_clip_polygon_collect( - polygon_points[polygon_point_count - 1], polygon_points[0], - olddist, - firstdist, - clipped, - clipped_count); - - return clipped_count; -} - -//! Clips a polygon by a plane -/*! -*\param clipped must be an array of 16 points. -*\return The count of the clipped counts -*/ -SIMD_FORCE_INLINE int bt_plane_clip_triangle( - const btVector4 &plane, - const btVector3 &point0, - const btVector3 &point1, - const btVector3 &point2, - btVector3 *clipped // an allocated array of 16 points at least -) -{ - int clipped_count = 0; - - //clip first point0 - btScalar firstdist = bt_distance_point_plane(plane, point0); - ; - if (!(firstdist > SIMD_EPSILON)) - { - clipped[clipped_count] = point0; - clipped_count++; - } - - // point 1 - btScalar olddist = firstdist; - btScalar dist = bt_distance_point_plane(plane, point1); - - bt_plane_clip_polygon_collect( - point0, point1, - olddist, - dist, - clipped, - clipped_count); - - olddist = dist; - - // point 2 - dist = bt_distance_point_plane(plane, point2); - - bt_plane_clip_polygon_collect( - point1, point2, - olddist, - dist, - clipped, - clipped_count); - olddist = dist; - - //RETURN TO FIRST point0 - bt_plane_clip_polygon_collect( - point2, point0, - olddist, - firstdist, - clipped, - clipped_count); - - return clipped_count; -} - -#endif // GIM_TRI_COLLISION_H_INCLUDED diff --git a/engine/inc/bullet/BulletCollision/Gimpact/btCompoundFromGimpact.h b/engine/inc/bullet/BulletCollision/Gimpact/btCompoundFromGimpact.h deleted file mode 100644 index ede59e8a..00000000 --- a/engine/inc/bullet/BulletCollision/Gimpact/btCompoundFromGimpact.h +++ /dev/null @@ -1,105 +0,0 @@ -#ifndef BT_COMPOUND_FROM_GIMPACT -#define BT_COMPOUND_FROM_GIMPACT - -#include "BulletCollision/CollisionShapes/btCompoundShape.h" -#include "btGImpactShape.h" -#include "BulletCollision/NarrowPhaseCollision/btRaycastCallback.h" - -ATTRIBUTE_ALIGNED16(class) -btCompoundFromGimpactShape : public btCompoundShape -{ -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - virtual ~btCompoundFromGimpactShape() - { - /*delete all the btBU_Simplex1to4 ChildShapes*/ - for (int i = 0; i < m_children.size(); i++) - { - delete m_children[i].m_childShape; - } - } -}; - -struct MyCallback : public btTriangleRaycastCallback -{ - int m_ignorePart; - int m_ignoreTriangleIndex; - - MyCallback(const btVector3& from, const btVector3& to, int ignorePart, int ignoreTriangleIndex) - : btTriangleRaycastCallback(from, to), - m_ignorePart(ignorePart), - m_ignoreTriangleIndex(ignoreTriangleIndex) - { - } - virtual btScalar reportHit(const btVector3& hitNormalLocal, btScalar hitFraction, int partId, int triangleIndex) - { - if (partId != m_ignorePart || triangleIndex != m_ignoreTriangleIndex) - { - if (hitFraction < m_hitFraction) - return hitFraction; - } - - return m_hitFraction; - } -}; -struct MyInternalTriangleIndexCallback : public btInternalTriangleIndexCallback -{ - const btGImpactMeshShape* m_gimpactShape; - btCompoundShape* m_colShape; - btScalar m_depth; - - MyInternalTriangleIndexCallback(btCompoundShape* colShape, const btGImpactMeshShape* meshShape, btScalar depth) - : m_colShape(colShape), - m_gimpactShape(meshShape), - m_depth(depth) - { - } - - virtual void internalProcessTriangleIndex(btVector3* triangle, int partId, int triangleIndex) - { - btVector3 scale = m_gimpactShape->getLocalScaling(); - btVector3 v0 = triangle[0] * scale; - btVector3 v1 = triangle[1] * scale; - btVector3 v2 = triangle[2] * scale; - - btVector3 centroid = (v0 + v1 + v2) / 3; - btVector3 normal = (v1 - v0).cross(v2 - v0); - normal.normalize(); - btVector3 rayFrom = centroid; - btVector3 rayTo = centroid - normal * m_depth; - - MyCallback cb(rayFrom, rayTo, partId, triangleIndex); - - m_gimpactShape->processAllTrianglesRay(&cb, rayFrom, rayTo); - if (cb.m_hitFraction < 1) - { - rayTo.setInterpolate3(cb.m_from, cb.m_to, cb.m_hitFraction); - //rayTo = cb.m_from; - //rayTo = rayTo.lerp(cb.m_to,cb.m_hitFraction); - //gDebugDraw.drawLine(tr(centroid),tr(centroid+normal),btVector3(1,0,0)); - } - - btBU_Simplex1to4* tet = new btBU_Simplex1to4(v0, v1, v2, rayTo); - btTransform ident; - ident.setIdentity(); - m_colShape->addChildShape(ident, tet); - } -}; - -btCompoundShape* btCreateCompoundFromGimpactShape(const btGImpactMeshShape* gimpactMesh, btScalar depth) -{ - btCompoundShape* colShape = new btCompoundFromGimpactShape(); - - btTransform tr; - tr.setIdentity(); - - MyInternalTriangleIndexCallback cb(colShape, gimpactMesh, depth); - btVector3 aabbMin, aabbMax; - gimpactMesh->getAabb(tr, aabbMin, aabbMax); - gimpactMesh->getMeshInterface()->InternalProcessAllTriangles(&cb, aabbMin, aabbMax); - - return colShape; -} - -#endif //BT_COMPOUND_FROM_GIMPACT diff --git a/engine/inc/bullet/BulletCollision/Gimpact/btContactProcessing.h b/engine/inc/bullet/BulletCollision/Gimpact/btContactProcessing.h deleted file mode 100644 index 4ff09d7c..00000000 --- a/engine/inc/bullet/BulletCollision/Gimpact/btContactProcessing.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef BT_CONTACT_H_INCLUDED -#define BT_CONTACT_H_INCLUDED - -/*! \file gim_contact.h -\author Francisco Leon Najera -*/ -/* -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 "LinearMath/btTransform.h" -#include "LinearMath/btAlignedObjectArray.h" -#include "btTriangleShapeEx.h" -#include "btContactProcessingStructs.h" - -class btContactArray : public btAlignedObjectArray -{ -public: - btContactArray() - { - reserve(64); - } - - SIMD_FORCE_INLINE void push_contact( - const btVector3 &point, const btVector3 &normal, - btScalar depth, int feature1, int feature2) - { - push_back(GIM_CONTACT(point, normal, depth, feature1, feature2)); - } - - SIMD_FORCE_INLINE void push_triangle_contacts( - const GIM_TRIANGLE_CONTACT &tricontact, - int feature1, int feature2) - { - for (int i = 0; i < tricontact.m_point_count; i++) - { - push_contact( - tricontact.m_points[i], - tricontact.m_separating_normal, - tricontact.m_penetration_depth, feature1, feature2); - } - } - - void merge_contacts(const btContactArray &contacts, bool normal_contact_average = true); - - void merge_contacts_unique(const btContactArray &contacts); -}; - -#endif // GIM_CONTACT_H_INCLUDED diff --git a/engine/inc/bullet/BulletCollision/Gimpact/btContactProcessingStructs.h b/engine/inc/bullet/BulletCollision/Gimpact/btContactProcessingStructs.h deleted file mode 100644 index bc8a7092..00000000 --- a/engine/inc/bullet/BulletCollision/Gimpact/btContactProcessingStructs.h +++ /dev/null @@ -1,105 +0,0 @@ -#ifndef BT_CONTACT_H_STRUCTS_INCLUDED -#define BT_CONTACT_H_STRUCTS_INCLUDED - -/*! \file gim_contact.h -\author Francisco Leon Najera -*/ -/* -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 "LinearMath/btTransform.h" -#include "LinearMath/btAlignedObjectArray.h" -#include "btTriangleShapeEx.h" - -/** -Configuration var for applying interpolation of contact normals -*/ -#define NORMAL_CONTACT_AVERAGE 1 - -#define CONTACT_DIFF_EPSILON 0.00001f - -///The GIM_CONTACT is an internal GIMPACT structure, similar to btManifoldPoint. -///@todo: remove and replace GIM_CONTACT by btManifoldPoint. -class GIM_CONTACT -{ -public: - btVector3 m_point; - btVector3 m_normal; - btScalar m_depth; //Positive value indicates interpenetration - btScalar m_distance; //Padding not for use - int m_feature1; //Face number - int m_feature2; //Face number -public: - GIM_CONTACT() - { - } - - GIM_CONTACT(const GIM_CONTACT &contact) : m_point(contact.m_point), - m_normal(contact.m_normal), - m_depth(contact.m_depth), - m_feature1(contact.m_feature1), - m_feature2(contact.m_feature2) - { - } - - GIM_CONTACT(const btVector3 &point, const btVector3 &normal, - btScalar depth, int feature1, int feature2) : m_point(point), - m_normal(normal), - m_depth(depth), - m_feature1(feature1), - m_feature2(feature2) - { - } - - //! Calcs key for coord classification - SIMD_FORCE_INLINE unsigned int calc_key_contact() const - { - int _coords[] = { - (int)(m_point[0] * 1000.0f + 1.0f), - (int)(m_point[1] * 1333.0f), - (int)(m_point[2] * 2133.0f + 3.0f)}; - unsigned int _hash = 0; - unsigned int *_uitmp = (unsigned int *)(&_coords[0]); - _hash = *_uitmp; - _uitmp++; - _hash += (*_uitmp) << 4; - _uitmp++; - _hash += (*_uitmp) << 8; - return _hash; - } - - SIMD_FORCE_INLINE void interpolate_normals(btVector3 *normals, int normal_count) - { - btVector3 vec_sum(m_normal); - for (int i = 0; i < normal_count; i++) - { - vec_sum += normals[i]; - } - - btScalar vec_sum_len = vec_sum.length2(); - if (vec_sum_len < CONTACT_DIFF_EPSILON) return; - - //GIM_INV_SQRT(vec_sum_len,vec_sum_len); // 1/sqrt(vec_sum_len) - - m_normal = vec_sum / btSqrt(vec_sum_len); - } -}; - -#endif // BT_CONTACT_H_STRUCTS_INCLUDED diff --git a/engine/inc/bullet/BulletCollision/Gimpact/btGImpactBvh.h b/engine/inc/bullet/BulletCollision/Gimpact/btGImpactBvh.h deleted file mode 100644 index 3cd8fa24..00000000 --- a/engine/inc/bullet/BulletCollision/Gimpact/btGImpactBvh.h +++ /dev/null @@ -1,309 +0,0 @@ -#ifndef BT_GIMPACT_BVH_H_INCLUDED -#define BT_GIMPACT_BVH_H_INCLUDED - -/*! \file gim_box_set.h -\author Francisco Leon Najera -*/ -/* -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 "LinearMath/btAlignedObjectArray.h" - -#include "btBoxCollision.h" -#include "btTriangleShapeEx.h" -#include "btGImpactBvhStructs.h" - -//! A pairset array -class btPairSet : public btAlignedObjectArray -{ -public: - btPairSet() - { - reserve(32); - } - inline void push_pair(int index1, int index2) - { - push_back(GIM_PAIR(index1, index2)); - } - - inline void push_pair_inv(int index1, int index2) - { - push_back(GIM_PAIR(index2, index1)); - } -}; - -class GIM_BVH_DATA_ARRAY : public btAlignedObjectArray -{ -}; - -class GIM_BVH_TREE_NODE_ARRAY : public btAlignedObjectArray -{ -}; - -//! Basic Box tree structure -class btBvhTree -{ -protected: - int m_num_nodes; - GIM_BVH_TREE_NODE_ARRAY m_node_array; - -protected: - int _sort_and_calc_splitting_index( - GIM_BVH_DATA_ARRAY& primitive_boxes, - int startIndex, int endIndex, int splitAxis); - - int _calc_splitting_axis(GIM_BVH_DATA_ARRAY& primitive_boxes, int startIndex, int endIndex); - - void _build_sub_tree(GIM_BVH_DATA_ARRAY& primitive_boxes, int startIndex, int endIndex); - -public: - btBvhTree() - { - m_num_nodes = 0; - } - - //! prototype functions for box tree management - //!@{ - void build_tree(GIM_BVH_DATA_ARRAY& primitive_boxes); - - SIMD_FORCE_INLINE void clearNodes() - { - m_node_array.clear(); - m_num_nodes = 0; - } - - //! node count - SIMD_FORCE_INLINE int getNodeCount() const - { - return m_num_nodes; - } - - //! tells if the node is a leaf - SIMD_FORCE_INLINE bool isLeafNode(int nodeindex) const - { - return m_node_array[nodeindex].isLeafNode(); - } - - SIMD_FORCE_INLINE int getNodeData(int nodeindex) const - { - return m_node_array[nodeindex].getDataIndex(); - } - - SIMD_FORCE_INLINE void getNodeBound(int nodeindex, btAABB& bound) const - { - bound = m_node_array[nodeindex].m_bound; - } - - SIMD_FORCE_INLINE void setNodeBound(int nodeindex, const btAABB& bound) - { - m_node_array[nodeindex].m_bound = bound; - } - - SIMD_FORCE_INLINE int getLeftNode(int nodeindex) const - { - return nodeindex + 1; - } - - SIMD_FORCE_INLINE int getRightNode(int nodeindex) const - { - if (m_node_array[nodeindex + 1].isLeafNode()) return nodeindex + 2; - return nodeindex + 1 + m_node_array[nodeindex + 1].getEscapeIndex(); - } - - SIMD_FORCE_INLINE int getEscapeNodeIndex(int nodeindex) const - { - return m_node_array[nodeindex].getEscapeIndex(); - } - - SIMD_FORCE_INLINE const GIM_BVH_TREE_NODE* get_node_pointer(int index = 0) const - { - return &m_node_array[index]; - } - - //!@} -}; - -//! Prototype Base class for primitive classification -/*! -This class is a wrapper for primitive collections. -This tells relevant info for the Bounding Box set classes, which take care of space classification. -This class can manage Compound shapes and trimeshes, and if it is managing trimesh then the Hierarchy Bounding Box classes will take advantage of primitive Vs Box overlapping tests for getting optimal results and less Per Box compairisons. -*/ -class btPrimitiveManagerBase -{ -public: - virtual ~btPrimitiveManagerBase() {} - - //! determines if this manager consist on only triangles, which special case will be optimized - virtual bool is_trimesh() const = 0; - virtual int get_primitive_count() const = 0; - virtual void get_primitive_box(int prim_index, btAABB& primbox) const = 0; - //! retrieves only the points of the triangle, and the collision margin - virtual void get_primitive_triangle(int prim_index, btPrimitiveTriangle& triangle) const = 0; -}; - -//! Structure for containing Boxes -/*! -This class offers an structure for managing a box tree of primitives. -Requires a Primitive prototype (like btPrimitiveManagerBase ) -*/ -class btGImpactBvh -{ -protected: - btBvhTree m_box_tree; - btPrimitiveManagerBase* m_primitive_manager; - -protected: - //stackless refit - void refit(); - -public: - //! this constructor doesn't build the tree. you must call buildSet - btGImpactBvh() - { - m_primitive_manager = NULL; - } - - //! this constructor doesn't build the tree. you must call buildSet - btGImpactBvh(btPrimitiveManagerBase* primitive_manager) - { - m_primitive_manager = primitive_manager; - } - - SIMD_FORCE_INLINE btAABB getGlobalBox() const - { - btAABB totalbox; - getNodeBound(0, totalbox); - return totalbox; - } - - SIMD_FORCE_INLINE void setPrimitiveManager(btPrimitiveManagerBase* primitive_manager) - { - m_primitive_manager = primitive_manager; - } - - SIMD_FORCE_INLINE btPrimitiveManagerBase* getPrimitiveManager() const - { - return m_primitive_manager; - } - - //! node manager prototype functions - ///@{ - - //! this attemps to refit the box set. - SIMD_FORCE_INLINE void update() - { - refit(); - } - - //! this rebuild the entire set - void buildSet(); - - //! returns the indices of the primitives in the m_primitive_manager - bool boxQuery(const btAABB& box, btAlignedObjectArray& collided_results) const; - - //! returns the indices of the primitives in the m_primitive_manager - SIMD_FORCE_INLINE bool boxQueryTrans(const btAABB& box, - const btTransform& transform, btAlignedObjectArray& collided_results) const - { - btAABB transbox = box; - transbox.appy_transform(transform); - return boxQuery(transbox, collided_results); - } - - //! returns the indices of the primitives in the m_primitive_manager - bool rayQuery( - const btVector3& ray_dir, const btVector3& ray_origin, - btAlignedObjectArray& collided_results) const; - - //! tells if this set has hierarcht - SIMD_FORCE_INLINE bool hasHierarchy() const - { - return true; - } - - //! tells if this set is a trimesh - SIMD_FORCE_INLINE bool isTrimesh() const - { - return m_primitive_manager->is_trimesh(); - } - - //! node count - SIMD_FORCE_INLINE int getNodeCount() const - { - return m_box_tree.getNodeCount(); - } - - //! tells if the node is a leaf - SIMD_FORCE_INLINE bool isLeafNode(int nodeindex) const - { - return m_box_tree.isLeafNode(nodeindex); - } - - SIMD_FORCE_INLINE int getNodeData(int nodeindex) const - { - return m_box_tree.getNodeData(nodeindex); - } - - SIMD_FORCE_INLINE void getNodeBound(int nodeindex, btAABB& bound) const - { - m_box_tree.getNodeBound(nodeindex, bound); - } - - SIMD_FORCE_INLINE void setNodeBound(int nodeindex, const btAABB& bound) - { - m_box_tree.setNodeBound(nodeindex, bound); - } - - SIMD_FORCE_INLINE int getLeftNode(int nodeindex) const - { - return m_box_tree.getLeftNode(nodeindex); - } - - SIMD_FORCE_INLINE int getRightNode(int nodeindex) const - { - return m_box_tree.getRightNode(nodeindex); - } - - SIMD_FORCE_INLINE int getEscapeNodeIndex(int nodeindex) const - { - return m_box_tree.getEscapeNodeIndex(nodeindex); - } - - SIMD_FORCE_INLINE void getNodeTriangle(int nodeindex, btPrimitiveTriangle& triangle) const - { - m_primitive_manager->get_primitive_triangle(getNodeData(nodeindex), triangle); - } - - SIMD_FORCE_INLINE const GIM_BVH_TREE_NODE* get_node_pointer(int index = 0) const - { - return m_box_tree.get_node_pointer(index); - } - -#ifdef TRI_COLLISION_PROFILING - static float getAverageTreeCollisionTime(); -#endif //TRI_COLLISION_PROFILING - - static void find_collision(btGImpactBvh* boxset1, const btTransform& trans1, - btGImpactBvh* boxset2, const btTransform& trans2, - btPairSet& collision_pairs); -}; - -#endif // BT_GIMPACT_BVH_H_INCLUDED diff --git a/engine/inc/bullet/BulletCollision/Gimpact/btGImpactBvhStructs.h b/engine/inc/bullet/BulletCollision/Gimpact/btGImpactBvhStructs.h deleted file mode 100644 index 8f78c234..00000000 --- a/engine/inc/bullet/BulletCollision/Gimpact/btGImpactBvhStructs.h +++ /dev/null @@ -1,85 +0,0 @@ -#ifndef GIM_BOX_SET_STRUCT_H_INCLUDED -#define GIM_BOX_SET_STRUCT_H_INCLUDED - -/*! \file gim_box_set.h -\author Francisco Leon Najera -*/ -/* -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 "LinearMath/btAlignedObjectArray.h" - -#include "btBoxCollision.h" -#include "btTriangleShapeEx.h" -#include "gim_pair.h" //for GIM_PAIR - -///GIM_BVH_DATA is an internal GIMPACT collision structure to contain axis aligned bounding box -struct GIM_BVH_DATA -{ - btAABB m_bound; - int m_data; -}; - -//! Node Structure for trees -class GIM_BVH_TREE_NODE -{ -public: - btAABB m_bound; - -protected: - int m_escapeIndexOrDataIndex; - -public: - GIM_BVH_TREE_NODE() - { - m_escapeIndexOrDataIndex = 0; - } - - SIMD_FORCE_INLINE bool isLeafNode() const - { - //skipindex is negative (internal node), triangleindex >=0 (leafnode) - return (m_escapeIndexOrDataIndex >= 0); - } - - SIMD_FORCE_INLINE int getEscapeIndex() const - { - //btAssert(m_escapeIndexOrDataIndex < 0); - return -m_escapeIndexOrDataIndex; - } - - SIMD_FORCE_INLINE void setEscapeIndex(int index) - { - m_escapeIndexOrDataIndex = -index; - } - - SIMD_FORCE_INLINE int getDataIndex() const - { - //btAssert(m_escapeIndexOrDataIndex >= 0); - - return m_escapeIndexOrDataIndex; - } - - SIMD_FORCE_INLINE void setDataIndex(int index) - { - m_escapeIndexOrDataIndex = index; - } -}; - -#endif // GIM_BOXPRUNING_H_INCLUDED diff --git a/engine/inc/bullet/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.h b/engine/inc/bullet/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.h deleted file mode 100644 index a368c8a0..00000000 --- a/engine/inc/bullet/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.h +++ /dev/null @@ -1,288 +0,0 @@ -/*! \file btGImpactShape.h -\author Francisco Leon Najera -*/ -/* -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 BT_GIMPACT_BVH_CONCAVE_COLLISION_ALGORITHM_H -#define BT_GIMPACT_BVH_CONCAVE_COLLISION_ALGORITHM_H - -#include "BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.h" -#include "BulletCollision/BroadphaseCollision/btDispatcher.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseInterface.h" -#include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h" -class btDispatcher; -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" -#include "BulletCollision/CollisionDispatch/btCollisionCreateFunc.h" -#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" - -#include "LinearMath/btAlignedObjectArray.h" - -#include "btGImpactShape.h" -#include "BulletCollision/CollisionShapes/btStaticPlaneShape.h" -#include "BulletCollision/CollisionShapes/btCompoundShape.h" -#include "BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h" -#include "LinearMath/btIDebugDraw.h" -#include "BulletCollision/CollisionDispatch/btCollisionObjectWrapper.h" - -//! Collision Algorithm for GImpact Shapes -/*! -For register this algorithm in Bullet, proceed as following: - \code -btCollisionDispatcher * dispatcher = static_cast(m_dynamicsWorld ->getDispatcher()); -btGImpactCollisionAlgorithm::registerAlgorithm(dispatcher); - \endcode -*/ -class btGImpactCollisionAlgorithm : public btActivatingCollisionAlgorithm -{ -protected: - btCollisionAlgorithm* m_convex_algorithm; - btPersistentManifold* m_manifoldPtr; - btManifoldResult* m_resultOut; - const btDispatcherInfo* m_dispatchInfo; - int m_triface0; - int m_part0; - int m_triface1; - int m_part1; - - //! Creates a new contact point - SIMD_FORCE_INLINE btPersistentManifold* newContactManifold(const btCollisionObject* body0, const btCollisionObject* body1) - { - m_manifoldPtr = m_dispatcher->getNewManifold(body0, body1); - return m_manifoldPtr; - } - - SIMD_FORCE_INLINE void destroyConvexAlgorithm() - { - if (m_convex_algorithm) - { - m_convex_algorithm->~btCollisionAlgorithm(); - m_dispatcher->freeCollisionAlgorithm(m_convex_algorithm); - m_convex_algorithm = NULL; - } - } - - SIMD_FORCE_INLINE void destroyContactManifolds() - { - if (m_manifoldPtr == NULL) return; - m_dispatcher->releaseManifold(m_manifoldPtr); - m_manifoldPtr = NULL; - } - - SIMD_FORCE_INLINE void clearCache() - { - destroyContactManifolds(); - destroyConvexAlgorithm(); - - m_triface0 = -1; - m_part0 = -1; - m_triface1 = -1; - m_part1 = -1; - } - - SIMD_FORCE_INLINE btPersistentManifold* getLastManifold() - { - return m_manifoldPtr; - } - - // Call before process collision - SIMD_FORCE_INLINE void checkManifold(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap) - { - if (getLastManifold() == 0) - { - newContactManifold(body0Wrap->getCollisionObject(), body1Wrap->getCollisionObject()); - } - - m_resultOut->setPersistentManifold(getLastManifold()); - } - - // Call before process collision - SIMD_FORCE_INLINE btCollisionAlgorithm* newAlgorithm(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap) - { - checkManifold(body0Wrap, body1Wrap); - - btCollisionAlgorithm* convex_algorithm = m_dispatcher->findAlgorithm( - body0Wrap, body1Wrap, getLastManifold(), BT_CONTACT_POINT_ALGORITHMS); - return convex_algorithm; - } - - // Call before process collision - SIMD_FORCE_INLINE void checkConvexAlgorithm(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap) - { - if (m_convex_algorithm) return; - m_convex_algorithm = newAlgorithm(body0Wrap, body1Wrap); - } - - void addContactPoint(const btCollisionObjectWrapper* body0Wrap, - const btCollisionObjectWrapper* body1Wrap, - const btVector3& point, - const btVector3& normal, - btScalar distance); - - //! Collision routines - //!@{ - - void collide_gjk_triangles(const btCollisionObjectWrapper* body0Wrap, - const btCollisionObjectWrapper* body1Wrap, - const btGImpactMeshShapePart* shape0, - const btGImpactMeshShapePart* shape1, - const int* pairs, int pair_count); - - void collide_sat_triangles(const btCollisionObjectWrapper* body0Wrap, - const btCollisionObjectWrapper* body1Wrap, - const btGImpactMeshShapePart* shape0, - const btGImpactMeshShapePart* shape1, - const int* pairs, int pair_count); - - void shape_vs_shape_collision( - const btCollisionObjectWrapper* body0, - const btCollisionObjectWrapper* body1, - const btCollisionShape* shape0, - const btCollisionShape* shape1); - - void convex_vs_convex_collision(const btCollisionObjectWrapper* body0Wrap, - const btCollisionObjectWrapper* body1Wrap, - const btCollisionShape* shape0, - const btCollisionShape* shape1); - - void gimpact_vs_gimpact_find_pairs( - const btTransform& trans0, - const btTransform& trans1, - const btGImpactShapeInterface* shape0, - const btGImpactShapeInterface* shape1, btPairSet& pairset); - - void gimpact_vs_shape_find_pairs( - const btTransform& trans0, - const btTransform& trans1, - const btGImpactShapeInterface* shape0, - const btCollisionShape* shape1, - btAlignedObjectArray& collided_primitives); - - void gimpacttrimeshpart_vs_plane_collision( - const btCollisionObjectWrapper* body0Wrap, - const btCollisionObjectWrapper* body1Wrap, - const btGImpactMeshShapePart* shape0, - const btStaticPlaneShape* shape1, bool swapped); - -public: - btGImpactCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap); - - virtual ~btGImpactCollisionAlgorithm(); - - virtual void processCollision(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut); - - btScalar calculateTimeOfImpact(btCollisionObject* body0, btCollisionObject* body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut); - - virtual void getAllContactManifolds(btManifoldArray& manifoldArray) - { - if (m_manifoldPtr) - manifoldArray.push_back(m_manifoldPtr); - } - - btManifoldResult* internalGetResultOut() - { - return m_resultOut; - } - - struct CreateFunc : public btCollisionAlgorithmCreateFunc - { - virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap) - { - void* mem = ci.m_dispatcher1->allocateCollisionAlgorithm(sizeof(btGImpactCollisionAlgorithm)); - return new (mem) btGImpactCollisionAlgorithm(ci, body0Wrap, body1Wrap); - } - }; - - //! Use this function for register the algorithm externally - static void registerAlgorithm(btCollisionDispatcher* dispatcher); -#ifdef TRI_COLLISION_PROFILING - //! Gets the average time in miliseconds of tree collisions - static float getAverageTreeCollisionTime(); - - //! Gets the average time in miliseconds of triangle collisions - static float getAverageTriangleCollisionTime(); -#endif //TRI_COLLISION_PROFILING - - //! Collides two gimpact shapes - /*! - \pre shape0 and shape1 couldn't be btGImpactMeshShape objects - */ - - void gimpact_vs_gimpact(const btCollisionObjectWrapper* body0Wrap, - const btCollisionObjectWrapper* body1Wrap, - const btGImpactShapeInterface* shape0, - const btGImpactShapeInterface* shape1); - - void gimpact_vs_shape(const btCollisionObjectWrapper* body0Wrap, - const btCollisionObjectWrapper* body1Wrap, - const btGImpactShapeInterface* shape0, - const btCollisionShape* shape1, bool swapped); - - void gimpact_vs_compoundshape(const btCollisionObjectWrapper* body0Wrap, - const btCollisionObjectWrapper* body1Wrap, - const btGImpactShapeInterface* shape0, - const btCompoundShape* shape1, bool swapped); - - void gimpact_vs_concave( - const btCollisionObjectWrapper* body0Wrap, - const btCollisionObjectWrapper* body1Wrap, - const btGImpactShapeInterface* shape0, - const btConcaveShape* shape1, bool swapped); - - /// Accessor/Mutator pairs for Part and triangleID - void setFace0(int value) - { - m_triface0 = value; - } - int getFace0() - { - return m_triface0; - } - void setFace1(int value) - { - m_triface1 = value; - } - int getFace1() - { - return m_triface1; - } - void setPart0(int value) - { - m_part0 = value; - } - int getPart0() - { - return m_part0; - } - void setPart1(int value) - { - m_part1 = value; - } - int getPart1() - { - return m_part1; - } -}; - -//algorithm details -//#define BULLET_TRIANGLE_COLLISION 1 -#define GIMPACT_VS_PLANE_COLLISION 1 - -#endif //BT_GIMPACT_BVH_CONCAVE_COLLISION_ALGORITHM_H diff --git a/engine/inc/bullet/BulletCollision/Gimpact/btGImpactMassUtil.h b/engine/inc/bullet/BulletCollision/Gimpact/btGImpactMassUtil.h deleted file mode 100644 index 1cde46ed..00000000 --- a/engine/inc/bullet/BulletCollision/Gimpact/btGImpactMassUtil.h +++ /dev/null @@ -1,56 +0,0 @@ -/*! \file btGImpactMassUtil.h -\author Francisco Leon Najera -*/ -/* -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_MASS_UTIL_H -#define GIMPACT_MASS_UTIL_H - -#include "LinearMath/btTransform.h" - -SIMD_FORCE_INLINE btVector3 gim_inertia_add_transformed( - const btVector3& source_inertia, const btVector3& added_inertia, const btTransform& transform) -{ - btMatrix3x3 rotatedTensor = transform.getBasis().scaled(added_inertia) * transform.getBasis().transpose(); - - btScalar x2 = transform.getOrigin()[0]; - x2 *= x2; - btScalar y2 = transform.getOrigin()[1]; - y2 *= y2; - btScalar z2 = transform.getOrigin()[2]; - z2 *= z2; - - btScalar ix = rotatedTensor[0][0] * (y2 + z2); - btScalar iy = rotatedTensor[1][1] * (x2 + z2); - btScalar iz = rotatedTensor[2][2] * (x2 + y2); - - return btVector3(source_inertia[0] + ix, source_inertia[1] + iy, source_inertia[2] + iz); -} - -SIMD_FORCE_INLINE btVector3 gim_get_point_inertia(const btVector3& point, btScalar mass) -{ - btScalar x2 = point[0] * point[0]; - btScalar y2 = point[1] * point[1]; - btScalar z2 = point[2] * point[2]; - return btVector3(mass * (y2 + z2), mass * (x2 + z2), mass * (x2 + y2)); -} - -#endif //GIMPACT_MESH_SHAPE_H diff --git a/engine/inc/bullet/BulletCollision/Gimpact/btGImpactQuantizedBvh.h b/engine/inc/bullet/BulletCollision/Gimpact/btGImpactQuantizedBvh.h deleted file mode 100644 index b231c1e8..00000000 --- a/engine/inc/bullet/BulletCollision/Gimpact/btGImpactQuantizedBvh.h +++ /dev/null @@ -1,298 +0,0 @@ -#ifndef GIM_QUANTIZED_SET_H_INCLUDED -#define GIM_QUANTIZED_SET_H_INCLUDED - -/*! \file btGImpactQuantizedBvh.h -\author Francisco Leon Najera -*/ -/* -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 "btGImpactBvh.h" -#include "btQuantization.h" -#include "btGImpactQuantizedBvhStructs.h" - -class GIM_QUANTIZED_BVH_NODE_ARRAY : public btAlignedObjectArray -{ -}; - -//! Basic Box tree structure -class btQuantizedBvhTree -{ -protected: - int m_num_nodes; - GIM_QUANTIZED_BVH_NODE_ARRAY m_node_array; - btAABB m_global_bound; - btVector3 m_bvhQuantization; - -protected: - void calc_quantization(GIM_BVH_DATA_ARRAY& primitive_boxes, btScalar boundMargin = btScalar(1.0)); - - int _sort_and_calc_splitting_index( - GIM_BVH_DATA_ARRAY& primitive_boxes, - int startIndex, int endIndex, int splitAxis); - - int _calc_splitting_axis(GIM_BVH_DATA_ARRAY& primitive_boxes, int startIndex, int endIndex); - - void _build_sub_tree(GIM_BVH_DATA_ARRAY& primitive_boxes, int startIndex, int endIndex); - -public: - btQuantizedBvhTree() - { - m_num_nodes = 0; - } - - //! prototype functions for box tree management - //!@{ - void build_tree(GIM_BVH_DATA_ARRAY& primitive_boxes); - - SIMD_FORCE_INLINE void quantizePoint( - unsigned short* quantizedpoint, const btVector3& point) const - { - bt_quantize_clamp(quantizedpoint, point, m_global_bound.m_min, m_global_bound.m_max, m_bvhQuantization); - } - - SIMD_FORCE_INLINE bool testQuantizedBoxOverlapp( - int node_index, - unsigned short* quantizedMin, unsigned short* quantizedMax) const - { - return m_node_array[node_index].testQuantizedBoxOverlapp(quantizedMin, quantizedMax); - } - - SIMD_FORCE_INLINE void clearNodes() - { - m_node_array.clear(); - m_num_nodes = 0; - } - - //! node count - SIMD_FORCE_INLINE int getNodeCount() const - { - return m_num_nodes; - } - - //! tells if the node is a leaf - SIMD_FORCE_INLINE bool isLeafNode(int nodeindex) const - { - return m_node_array[nodeindex].isLeafNode(); - } - - SIMD_FORCE_INLINE int getNodeData(int nodeindex) const - { - return m_node_array[nodeindex].getDataIndex(); - } - - SIMD_FORCE_INLINE void getNodeBound(int nodeindex, btAABB& bound) const - { - bound.m_min = bt_unquantize( - m_node_array[nodeindex].m_quantizedAabbMin, - m_global_bound.m_min, m_bvhQuantization); - - bound.m_max = bt_unquantize( - m_node_array[nodeindex].m_quantizedAabbMax, - m_global_bound.m_min, m_bvhQuantization); - } - - SIMD_FORCE_INLINE void setNodeBound(int nodeindex, const btAABB& bound) - { - bt_quantize_clamp(m_node_array[nodeindex].m_quantizedAabbMin, - bound.m_min, - m_global_bound.m_min, - m_global_bound.m_max, - m_bvhQuantization); - - bt_quantize_clamp(m_node_array[nodeindex].m_quantizedAabbMax, - bound.m_max, - m_global_bound.m_min, - m_global_bound.m_max, - m_bvhQuantization); - } - - SIMD_FORCE_INLINE int getLeftNode(int nodeindex) const - { - return nodeindex + 1; - } - - SIMD_FORCE_INLINE int getRightNode(int nodeindex) const - { - if (m_node_array[nodeindex + 1].isLeafNode()) return nodeindex + 2; - return nodeindex + 1 + m_node_array[nodeindex + 1].getEscapeIndex(); - } - - SIMD_FORCE_INLINE int getEscapeNodeIndex(int nodeindex) const - { - return m_node_array[nodeindex].getEscapeIndex(); - } - - SIMD_FORCE_INLINE const BT_QUANTIZED_BVH_NODE* get_node_pointer(int index = 0) const - { - return &m_node_array[index]; - } - - //!@} -}; - -//! Structure for containing Boxes -/*! -This class offers an structure for managing a box tree of primitives. -Requires a Primitive prototype (like btPrimitiveManagerBase ) -*/ -class btGImpactQuantizedBvh -{ -protected: - btQuantizedBvhTree m_box_tree; - btPrimitiveManagerBase* m_primitive_manager; - -protected: - //stackless refit - void refit(); - -public: - //! this constructor doesn't build the tree. you must call buildSet - btGImpactQuantizedBvh() - { - m_primitive_manager = NULL; - } - - //! this constructor doesn't build the tree. you must call buildSet - btGImpactQuantizedBvh(btPrimitiveManagerBase* primitive_manager) - { - m_primitive_manager = primitive_manager; - } - - SIMD_FORCE_INLINE btAABB getGlobalBox() const - { - btAABB totalbox; - getNodeBound(0, totalbox); - return totalbox; - } - - SIMD_FORCE_INLINE void setPrimitiveManager(btPrimitiveManagerBase* primitive_manager) - { - m_primitive_manager = primitive_manager; - } - - SIMD_FORCE_INLINE btPrimitiveManagerBase* getPrimitiveManager() const - { - return m_primitive_manager; - } - - //! node manager prototype functions - ///@{ - - //! this attemps to refit the box set. - SIMD_FORCE_INLINE void update() - { - refit(); - } - - //! this rebuild the entire set - void buildSet(); - - //! returns the indices of the primitives in the m_primitive_manager - bool boxQuery(const btAABB& box, btAlignedObjectArray& collided_results) const; - - //! returns the indices of the primitives in the m_primitive_manager - SIMD_FORCE_INLINE bool boxQueryTrans(const btAABB& box, - const btTransform& transform, btAlignedObjectArray& collided_results) const - { - btAABB transbox = box; - transbox.appy_transform(transform); - return boxQuery(transbox, collided_results); - } - - //! returns the indices of the primitives in the m_primitive_manager - bool rayQuery( - const btVector3& ray_dir, const btVector3& ray_origin, - btAlignedObjectArray& collided_results) const; - - //! tells if this set has hierarcht - SIMD_FORCE_INLINE bool hasHierarchy() const - { - return true; - } - - //! tells if this set is a trimesh - SIMD_FORCE_INLINE bool isTrimesh() const - { - return m_primitive_manager->is_trimesh(); - } - - //! node count - SIMD_FORCE_INLINE int getNodeCount() const - { - return m_box_tree.getNodeCount(); - } - - //! tells if the node is a leaf - SIMD_FORCE_INLINE bool isLeafNode(int nodeindex) const - { - return m_box_tree.isLeafNode(nodeindex); - } - - SIMD_FORCE_INLINE int getNodeData(int nodeindex) const - { - return m_box_tree.getNodeData(nodeindex); - } - - SIMD_FORCE_INLINE void getNodeBound(int nodeindex, btAABB& bound) const - { - m_box_tree.getNodeBound(nodeindex, bound); - } - - SIMD_FORCE_INLINE void setNodeBound(int nodeindex, const btAABB& bound) - { - m_box_tree.setNodeBound(nodeindex, bound); - } - - SIMD_FORCE_INLINE int getLeftNode(int nodeindex) const - { - return m_box_tree.getLeftNode(nodeindex); - } - - SIMD_FORCE_INLINE int getRightNode(int nodeindex) const - { - return m_box_tree.getRightNode(nodeindex); - } - - SIMD_FORCE_INLINE int getEscapeNodeIndex(int nodeindex) const - { - return m_box_tree.getEscapeNodeIndex(nodeindex); - } - - SIMD_FORCE_INLINE void getNodeTriangle(int nodeindex, btPrimitiveTriangle& triangle) const - { - m_primitive_manager->get_primitive_triangle(getNodeData(nodeindex), triangle); - } - - SIMD_FORCE_INLINE const BT_QUANTIZED_BVH_NODE* get_node_pointer(int index = 0) const - { - return m_box_tree.get_node_pointer(index); - } - -#ifdef TRI_COLLISION_PROFILING - static float getAverageTreeCollisionTime(); -#endif //TRI_COLLISION_PROFILING - - static void find_collision(const btGImpactQuantizedBvh* boxset1, const btTransform& trans1, - const btGImpactQuantizedBvh* boxset2, const btTransform& trans2, - btPairSet& collision_pairs); -}; - -#endif // GIM_BOXPRUNING_H_INCLUDED diff --git a/engine/inc/bullet/BulletCollision/Gimpact/btGImpactQuantizedBvhStructs.h b/engine/inc/bullet/BulletCollision/Gimpact/btGImpactQuantizedBvhStructs.h deleted file mode 100644 index bd50cb5b..00000000 --- a/engine/inc/bullet/BulletCollision/Gimpact/btGImpactQuantizedBvhStructs.h +++ /dev/null @@ -1,91 +0,0 @@ -#ifndef GIM_QUANTIZED_SET_STRUCTS_H_INCLUDED -#define GIM_QUANTIZED_SET_STRUCTS_H_INCLUDED - -/*! \file btGImpactQuantizedBvh.h -\author Francisco Leon Najera -*/ -/* -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 "btGImpactBvh.h" -#include "btQuantization.h" - -///btQuantizedBvhNode is a compressed aabb node, 16 bytes. -///Node can be used for leafnode or internal node. Leafnodes can point to 32-bit triangle index (non-negative range). -ATTRIBUTE_ALIGNED16(struct) -BT_QUANTIZED_BVH_NODE -{ - //12 bytes - unsigned short int m_quantizedAabbMin[3]; - unsigned short int m_quantizedAabbMax[3]; - //4 bytes - int m_escapeIndexOrDataIndex; - - BT_QUANTIZED_BVH_NODE() - { - m_escapeIndexOrDataIndex = 0; - } - - SIMD_FORCE_INLINE bool isLeafNode() const - { - //skipindex is negative (internal node), triangleindex >=0 (leafnode) - return (m_escapeIndexOrDataIndex >= 0); - } - - SIMD_FORCE_INLINE int getEscapeIndex() const - { - //btAssert(m_escapeIndexOrDataIndex < 0); - return -m_escapeIndexOrDataIndex; - } - - SIMD_FORCE_INLINE void setEscapeIndex(int index) - { - m_escapeIndexOrDataIndex = -index; - } - - SIMD_FORCE_INLINE int getDataIndex() const - { - //btAssert(m_escapeIndexOrDataIndex >= 0); - - return m_escapeIndexOrDataIndex; - } - - SIMD_FORCE_INLINE void setDataIndex(int index) - { - m_escapeIndexOrDataIndex = index; - } - - SIMD_FORCE_INLINE bool testQuantizedBoxOverlapp( - unsigned short* quantizedMin, unsigned short* quantizedMax) const - { - if (m_quantizedAabbMin[0] > quantizedMax[0] || - m_quantizedAabbMax[0] < quantizedMin[0] || - m_quantizedAabbMin[1] > quantizedMax[1] || - m_quantizedAabbMax[1] < quantizedMin[1] || - m_quantizedAabbMin[2] > quantizedMax[2] || - m_quantizedAabbMax[2] < quantizedMin[2]) - { - return false; - } - return true; - } -}; - -#endif // GIM_QUANTIZED_SET_STRUCTS_H_INCLUDED diff --git a/engine/inc/bullet/BulletCollision/Gimpact/btGImpactShape.h b/engine/inc/bullet/BulletCollision/Gimpact/btGImpactShape.h deleted file mode 100644 index cc910795..00000000 --- a/engine/inc/bullet/BulletCollision/Gimpact/btGImpactShape.h +++ /dev/null @@ -1,1115 +0,0 @@ -/*! \file btGImpactShape.h -\author Francisco Len 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_SHAPE_H -#define GIMPACT_SHAPE_H - -#include "BulletCollision/CollisionShapes/btCollisionShape.h" -#include "BulletCollision/CollisionShapes/btTriangleShape.h" -#include "BulletCollision/CollisionShapes/btStridingMeshInterface.h" -#include "BulletCollision/CollisionShapes/btCollisionMargin.h" -#include "BulletCollision/CollisionDispatch/btCollisionWorld.h" -#include "BulletCollision/CollisionShapes/btConcaveShape.h" -#include "BulletCollision/CollisionShapes/btTetrahedronShape.h" -#include "LinearMath/btVector3.h" -#include "LinearMath/btTransform.h" -#include "LinearMath/btMatrix3x3.h" -#include "LinearMath/btAlignedObjectArray.h" - -#include "btGImpactQuantizedBvh.h" // box tree class - -//! declare Quantized trees, (you can change to float based trees) -typedef btGImpactQuantizedBvh btGImpactBoxSet; - -enum eGIMPACT_SHAPE_TYPE -{ - CONST_GIMPACT_COMPOUND_SHAPE = 0, - CONST_GIMPACT_TRIMESH_SHAPE_PART, - CONST_GIMPACT_TRIMESH_SHAPE -}; - -//! Helper class for tetrahedrons -class btTetrahedronShapeEx : public btBU_Simplex1to4 -{ -public: - btTetrahedronShapeEx() - { - m_numVertices = 4; - } - - SIMD_FORCE_INLINE void setVertices( - const btVector3& v0, const btVector3& v1, - const btVector3& v2, const btVector3& v3) - { - m_vertices[0] = v0; - m_vertices[1] = v1; - m_vertices[2] = v2; - m_vertices[3] = v3; - recalcLocalAabb(); - } -}; - -//! Base class for gimpact shapes -class btGImpactShapeInterface : public btConcaveShape -{ -protected: - btAABB m_localAABB; - bool m_needs_update; - btVector3 localScaling; - btGImpactBoxSet m_box_set; // optionally boxset - - //! use this function for perfofm refit in bounding boxes - //! use this function for perfofm refit in bounding boxes - virtual void calcLocalAABB() - { - lockChildShapes(); - if (m_box_set.getNodeCount() == 0) - { - m_box_set.buildSet(); - } - else - { - m_box_set.update(); - } - unlockChildShapes(); - - m_localAABB = m_box_set.getGlobalBox(); - } - -public: - btGImpactShapeInterface() - { - m_shapeType = GIMPACT_SHAPE_PROXYTYPE; - m_localAABB.invalidate(); - m_needs_update = true; - localScaling.setValue(1.f, 1.f, 1.f); - } - - //! performs refit operation - /*! - Updates the entire Box set of this shape. - \pre postUpdate() must be called for attemps to calculating the box set, else this function - will does nothing. - \post if m_needs_update == true, then it calls calcLocalAABB(); - */ - SIMD_FORCE_INLINE void updateBound() - { - if (!m_needs_update) return; - calcLocalAABB(); - m_needs_update = false; - } - - //! If the Bounding box is not updated, then this class attemps to calculate it. - /*! - \post Calls updateBound() for update the box set. - */ - void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const - { - btAABB transformedbox = m_localAABB; - transformedbox.appy_transform(t); - aabbMin = transformedbox.m_min; - aabbMax = transformedbox.m_max; - } - - //! Tells to this object that is needed to refit the box set - virtual void postUpdate() - { - m_needs_update = true; - } - - //! Obtains the local box, which is the global calculated box of the total of subshapes - SIMD_FORCE_INLINE const btAABB& getLocalBox() - { - return m_localAABB; - } - - virtual int getShapeType() const - { - return GIMPACT_SHAPE_PROXYTYPE; - } - - /*! - \post You must call updateBound() for update the box set. - */ - virtual void setLocalScaling(const btVector3& scaling) - { - localScaling = scaling; - postUpdate(); - } - - virtual const btVector3& getLocalScaling() const - { - return localScaling; - } - - virtual void setMargin(btScalar margin) - { - m_collisionMargin = margin; - int i = getNumChildShapes(); - while (i--) - { - btCollisionShape* child = getChildShape(i); - child->setMargin(margin); - } - - m_needs_update = true; - } - - //! Subshape member functions - //!@{ - - //! Base method for determinig which kind of GIMPACT shape we get - virtual eGIMPACT_SHAPE_TYPE getGImpactShapeType() const = 0; - - //! gets boxset - SIMD_FORCE_INLINE const btGImpactBoxSet* getBoxSet() const - { - return &m_box_set; - } - - //! Determines if this class has a hierarchy structure for sorting its primitives - SIMD_FORCE_INLINE bool hasBoxSet() const - { - if (m_box_set.getNodeCount() == 0) return false; - return true; - } - - //! Obtains the primitive manager - virtual const btPrimitiveManagerBase* getPrimitiveManager() const = 0; - - //! Gets the number of children - virtual int getNumChildShapes() const = 0; - - //! if true, then its children must get transforms. - virtual bool childrenHasTransform() const = 0; - - //! Determines if this shape has triangles - virtual bool needsRetrieveTriangles() const = 0; - - //! Determines if this shape has tetrahedrons - virtual bool needsRetrieveTetrahedrons() const = 0; - - virtual void getBulletTriangle(int prim_index, btTriangleShapeEx& triangle) const = 0; - - virtual void getBulletTetrahedron(int prim_index, btTetrahedronShapeEx& tetrahedron) const = 0; - - //! call when reading child shapes - virtual void lockChildShapes() const - { - } - - virtual void unlockChildShapes() const - { - } - - //! if this trimesh - SIMD_FORCE_INLINE void getPrimitiveTriangle(int index, btPrimitiveTriangle& triangle) const - { - getPrimitiveManager()->get_primitive_triangle(index, triangle); - } - - //! Retrieves the bound from a child - /*! - */ - virtual void getChildAabb(int child_index, const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const - { - btAABB child_aabb; - getPrimitiveManager()->get_primitive_box(child_index, child_aabb); - child_aabb.appy_transform(t); - aabbMin = child_aabb.m_min; - aabbMax = child_aabb.m_max; - } - - //! Gets the children - virtual btCollisionShape* getChildShape(int index) = 0; - - //! Gets the child - virtual const btCollisionShape* getChildShape(int index) const = 0; - - //! Gets the children transform - virtual btTransform getChildTransform(int index) const = 0; - - //! Sets the children transform - /*! - \post You must call updateBound() for update the box set. - */ - virtual void setChildTransform(int index, const btTransform& transform) = 0; - - //!@} - - //! virtual method for ray collision - virtual void rayTest(const btVector3& rayFrom, const btVector3& rayTo, btCollisionWorld::RayResultCallback& resultCallback) const - { - (void)rayFrom; - (void)rayTo; - (void)resultCallback; - } - - //! Function for retrieve triangles. - /*! - It gives the triangles in local space - */ - virtual void processAllTriangles(btTriangleCallback* callback, const btVector3& aabbMin, const btVector3& aabbMax) const - { - (void)callback; - (void)aabbMin; - (void)aabbMax; - } - - //! Function for retrieve triangles. - /*! - It gives the triangles in local space - */ - virtual void processAllTrianglesRay(btTriangleCallback* /*callback*/, const btVector3& /*rayFrom*/, const btVector3& /*rayTo*/) const - { - } - - //!@} -}; - -//! btGImpactCompoundShape allows to handle multiple btCollisionShape objects at once -/*! -This class only can manage Convex subshapes -*/ -class btGImpactCompoundShape : public btGImpactShapeInterface -{ -public: - //! compound primitive manager - class CompoundPrimitiveManager : public btPrimitiveManagerBase - { - public: - virtual ~CompoundPrimitiveManager() {} - btGImpactCompoundShape* m_compoundShape; - - CompoundPrimitiveManager(const CompoundPrimitiveManager& compound) - : btPrimitiveManagerBase() - { - m_compoundShape = compound.m_compoundShape; - } - - CompoundPrimitiveManager(btGImpactCompoundShape* compoundShape) - { - m_compoundShape = compoundShape; - } - - CompoundPrimitiveManager() - { - m_compoundShape = NULL; - } - - virtual bool is_trimesh() const - { - return false; - } - - virtual int get_primitive_count() const - { - return (int)m_compoundShape->getNumChildShapes(); - } - - virtual void get_primitive_box(int prim_index, btAABB& primbox) const - { - btTransform prim_trans; - if (m_compoundShape->childrenHasTransform()) - { - prim_trans = m_compoundShape->getChildTransform(prim_index); - } - else - { - prim_trans.setIdentity(); - } - const btCollisionShape* shape = m_compoundShape->getChildShape(prim_index); - shape->getAabb(prim_trans, primbox.m_min, primbox.m_max); - } - - virtual void get_primitive_triangle(int prim_index, btPrimitiveTriangle& triangle) const - { - btAssert(0); - (void)prim_index; - (void)triangle; - } - }; - -protected: - CompoundPrimitiveManager m_primitive_manager; - btAlignedObjectArray m_childTransforms; - btAlignedObjectArray m_childShapes; - -public: - btGImpactCompoundShape(bool children_has_transform = true) - { - (void)children_has_transform; - m_primitive_manager.m_compoundShape = this; - m_box_set.setPrimitiveManager(&m_primitive_manager); - } - - virtual ~btGImpactCompoundShape() - { - } - - //! if true, then its children must get transforms. - virtual bool childrenHasTransform() const - { - if (m_childTransforms.size() == 0) return false; - return true; - } - - //! Obtains the primitive manager - virtual const btPrimitiveManagerBase* getPrimitiveManager() const - { - return &m_primitive_manager; - } - - //! Obtains the compopund primitive manager - SIMD_FORCE_INLINE CompoundPrimitiveManager* getCompoundPrimitiveManager() - { - return &m_primitive_manager; - } - - //! Gets the number of children - virtual int getNumChildShapes() const - { - return m_childShapes.size(); - } - - //! Use this method for adding children. Only Convex shapes are allowed. - void addChildShape(const btTransform& localTransform, btCollisionShape* shape) - { - btAssert(shape->isConvex()); - m_childTransforms.push_back(localTransform); - m_childShapes.push_back(shape); - } - - //! Use this method for adding children. Only Convex shapes are allowed. - void addChildShape(btCollisionShape* shape) - { - btAssert(shape->isConvex()); - m_childShapes.push_back(shape); - } - - //! Gets the children - virtual btCollisionShape* getChildShape(int index) - { - return m_childShapes[index]; - } - - //! Gets the children - virtual const btCollisionShape* getChildShape(int index) const - { - return m_childShapes[index]; - } - - //! Retrieves the bound from a child - /*! - */ - virtual void getChildAabb(int child_index, const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const - { - if (childrenHasTransform()) - { - m_childShapes[child_index]->getAabb(t * m_childTransforms[child_index], aabbMin, aabbMax); - } - else - { - m_childShapes[child_index]->getAabb(t, aabbMin, aabbMax); - } - } - - //! Gets the children transform - virtual btTransform getChildTransform(int index) const - { - btAssert(m_childTransforms.size() == m_childShapes.size()); - return m_childTransforms[index]; - } - - //! Sets the children transform - /*! - \post You must call updateBound() for update the box set. - */ - virtual void setChildTransform(int index, const btTransform& transform) - { - btAssert(m_childTransforms.size() == m_childShapes.size()); - m_childTransforms[index] = transform; - postUpdate(); - } - - //! Determines if this shape has triangles - virtual bool needsRetrieveTriangles() const - { - return false; - } - - //! Determines if this shape has tetrahedrons - virtual bool needsRetrieveTetrahedrons() const - { - return false; - } - - virtual void getBulletTriangle(int prim_index, btTriangleShapeEx& triangle) const - { - (void)prim_index; - (void)triangle; - btAssert(0); - } - - virtual void getBulletTetrahedron(int prim_index, btTetrahedronShapeEx& tetrahedron) const - { - (void)prim_index; - (void)tetrahedron; - btAssert(0); - } - - //! Calculates the exact inertia tensor for this shape - virtual void calculateLocalInertia(btScalar mass, btVector3& inertia) const; - - virtual const char* getName() const - { - return "GImpactCompound"; - } - - virtual eGIMPACT_SHAPE_TYPE getGImpactShapeType() const - { - return CONST_GIMPACT_COMPOUND_SHAPE; - } -}; - -//! This class manages a sub part of a mesh supplied by the btStridingMeshInterface interface. -/*! -- Simply create this shape by passing the btStridingMeshInterface to the constructor btGImpactMeshShapePart, then you must call updateBound() after creating the mesh -- When making operations with this shape, you must call lock before accessing to the trimesh primitives, and then call unlock -- You can handle deformable meshes with this shape, by calling postUpdate() every time when changing the mesh vertices. - -*/ -class btGImpactMeshShapePart : public btGImpactShapeInterface -{ -public: - //! Trimesh primitive manager - /*! - Manages the info from btStridingMeshInterface object and controls the Lock/Unlock mechanism - */ - class TrimeshPrimitiveManager : public btPrimitiveManagerBase - { - public: - btScalar m_margin; - btStridingMeshInterface* m_meshInterface; - btVector3 m_scale; - int m_part; - int m_lock_count; - const unsigned char* vertexbase; - int numverts; - PHY_ScalarType type; - int stride; - const unsigned char* indexbase; - int indexstride; - int numfaces; - PHY_ScalarType indicestype; - - TrimeshPrimitiveManager() - { - m_meshInterface = NULL; - m_part = 0; - m_margin = 0.01f; - m_scale = btVector3(1.f, 1.f, 1.f); - m_lock_count = 0; - vertexbase = 0; - numverts = 0; - stride = 0; - indexbase = 0; - indexstride = 0; - numfaces = 0; - } - - TrimeshPrimitiveManager(const TrimeshPrimitiveManager& manager) - : btPrimitiveManagerBase() - { - m_meshInterface = manager.m_meshInterface; - m_part = manager.m_part; - m_margin = manager.m_margin; - m_scale = manager.m_scale; - m_lock_count = 0; - vertexbase = 0; - numverts = 0; - stride = 0; - indexbase = 0; - indexstride = 0; - numfaces = 0; - } - - TrimeshPrimitiveManager( - btStridingMeshInterface* meshInterface, int part) - { - m_meshInterface = meshInterface; - m_part = part; - m_scale = m_meshInterface->getScaling(); - m_margin = 0.1f; - m_lock_count = 0; - vertexbase = 0; - numverts = 0; - stride = 0; - indexbase = 0; - indexstride = 0; - numfaces = 0; - } - - virtual ~TrimeshPrimitiveManager() {} - - void lock() - { - if (m_lock_count > 0) - { - m_lock_count++; - return; - } - m_meshInterface->getLockedReadOnlyVertexIndexBase( - &vertexbase, numverts, - type, stride, &indexbase, indexstride, numfaces, indicestype, m_part); - - m_lock_count = 1; - } - - void unlock() - { - if (m_lock_count == 0) return; - if (m_lock_count > 1) - { - --m_lock_count; - return; - } - m_meshInterface->unLockReadOnlyVertexBase(m_part); - vertexbase = NULL; - m_lock_count = 0; - } - - virtual bool is_trimesh() const - { - return true; - } - - virtual int get_primitive_count() const - { - return (int)numfaces; - } - - SIMD_FORCE_INLINE int get_vertex_count() const - { - return (int)numverts; - } - - SIMD_FORCE_INLINE void get_indices(int face_index, unsigned int& i0, unsigned int& i1, unsigned int& i2) const - { - if (indicestype == PHY_SHORT) - { - unsigned short* s_indices = (unsigned short*)(indexbase + face_index * indexstride); - i0 = s_indices[0]; - i1 = s_indices[1]; - i2 = s_indices[2]; - } - else if (indicestype == PHY_INTEGER) - { - unsigned int* i_indices = (unsigned int*)(indexbase + face_index * indexstride); - i0 = i_indices[0]; - i1 = i_indices[1]; - i2 = i_indices[2]; - } - else - { - btAssert(indicestype == PHY_UCHAR); - unsigned char* i_indices = (unsigned char*)(indexbase + face_index * indexstride); - i0 = i_indices[0]; - i1 = i_indices[1]; - i2 = i_indices[2]; - } - } - - SIMD_FORCE_INLINE void get_vertex(unsigned int vertex_index, btVector3& vertex) const - { - if (type == PHY_DOUBLE) - { - double* dvertices = (double*)(vertexbase + vertex_index * stride); - vertex[0] = btScalar(dvertices[0] * m_scale[0]); - vertex[1] = btScalar(dvertices[1] * m_scale[1]); - vertex[2] = btScalar(dvertices[2] * m_scale[2]); - } - else - { - float* svertices = (float*)(vertexbase + vertex_index * stride); - vertex[0] = svertices[0] * m_scale[0]; - vertex[1] = svertices[1] * m_scale[1]; - vertex[2] = svertices[2] * m_scale[2]; - } - } - - virtual void get_primitive_box(int prim_index, btAABB& primbox) const - { - btPrimitiveTriangle triangle; - get_primitive_triangle(prim_index, triangle); - primbox.calc_from_triangle_margin( - triangle.m_vertices[0], - triangle.m_vertices[1], triangle.m_vertices[2], triangle.m_margin); - } - - virtual void get_primitive_triangle(int prim_index, btPrimitiveTriangle& triangle) const - { - unsigned int indices[3]; - get_indices(prim_index, indices[0], indices[1], indices[2]); - get_vertex(indices[0], triangle.m_vertices[0]); - get_vertex(indices[1], triangle.m_vertices[1]); - get_vertex(indices[2], triangle.m_vertices[2]); - triangle.m_margin = m_margin; - } - - SIMD_FORCE_INLINE void get_bullet_triangle(int prim_index, btTriangleShapeEx& triangle) const - { - unsigned int indices[3]; - get_indices(prim_index, indices[0], indices[1], indices[2]); - get_vertex(indices[0], triangle.m_vertices1[0]); - get_vertex(indices[1], triangle.m_vertices1[1]); - get_vertex(indices[2], triangle.m_vertices1[2]); - triangle.setMargin(m_margin); - } - }; - -protected: - TrimeshPrimitiveManager m_primitive_manager; - -public: - btGImpactMeshShapePart() - { - m_box_set.setPrimitiveManager(&m_primitive_manager); - } - - btGImpactMeshShapePart(btStridingMeshInterface* meshInterface, int part); - virtual ~btGImpactMeshShapePart(); - - //! if true, then its children must get transforms. - virtual bool childrenHasTransform() const - { - return false; - } - - //! call when reading child shapes - virtual void lockChildShapes() const; - virtual void unlockChildShapes() const; - - //! Gets the number of children - virtual int getNumChildShapes() const - { - return m_primitive_manager.get_primitive_count(); - } - - //! Gets the children - virtual btCollisionShape* getChildShape(int index) - { - (void)index; - btAssert(0); - return NULL; - } - - //! Gets the child - virtual const btCollisionShape* getChildShape(int index) const - { - (void)index; - btAssert(0); - return NULL; - } - - //! Gets the children transform - virtual btTransform getChildTransform(int index) const - { - (void)index; - btAssert(0); - return btTransform(); - } - - //! Sets the children transform - /*! - \post You must call updateBound() for update the box set. - */ - virtual void setChildTransform(int index, const btTransform& transform) - { - (void)index; - (void)transform; - btAssert(0); - } - - //! Obtains the primitive manager - virtual const btPrimitiveManagerBase* getPrimitiveManager() const - { - return &m_primitive_manager; - } - - SIMD_FORCE_INLINE TrimeshPrimitiveManager* getTrimeshPrimitiveManager() - { - return &m_primitive_manager; - } - - virtual void calculateLocalInertia(btScalar mass, btVector3& inertia) const; - - virtual const char* getName() const - { - return "GImpactMeshShapePart"; - } - - virtual eGIMPACT_SHAPE_TYPE getGImpactShapeType() const - { - return CONST_GIMPACT_TRIMESH_SHAPE_PART; - } - - //! Determines if this shape has triangles - virtual bool needsRetrieveTriangles() const - { - return true; - } - - //! Determines if this shape has tetrahedrons - virtual bool needsRetrieveTetrahedrons() const - { - return false; - } - - virtual void getBulletTriangle(int prim_index, btTriangleShapeEx& triangle) const - { - m_primitive_manager.get_bullet_triangle(prim_index, triangle); - } - - virtual void getBulletTetrahedron(int prim_index, btTetrahedronShapeEx& tetrahedron) const - { - (void)prim_index; - (void)tetrahedron; - btAssert(0); - } - - SIMD_FORCE_INLINE int getVertexCount() const - { - return m_primitive_manager.get_vertex_count(); - } - - SIMD_FORCE_INLINE void getVertex(int vertex_index, btVector3& vertex) const - { - m_primitive_manager.get_vertex(vertex_index, vertex); - } - - SIMD_FORCE_INLINE void setMargin(btScalar margin) - { - m_primitive_manager.m_margin = margin; - postUpdate(); - } - - SIMD_FORCE_INLINE btScalar getMargin() const - { - return m_primitive_manager.m_margin; - } - - virtual void setLocalScaling(const btVector3& scaling) - { - m_primitive_manager.m_scale = scaling; - postUpdate(); - } - - virtual const btVector3& getLocalScaling() const - { - return m_primitive_manager.m_scale; - } - - SIMD_FORCE_INLINE int getPart() const - { - return (int)m_primitive_manager.m_part; - } - - virtual void processAllTriangles(btTriangleCallback* callback, const btVector3& aabbMin, const btVector3& aabbMax) const; - virtual void processAllTrianglesRay(btTriangleCallback* callback, const btVector3& rayFrom, const btVector3& rayTo) const; -}; - -//! This class manages a mesh supplied by the btStridingMeshInterface interface. -/*! -Set of btGImpactMeshShapePart parts -- Simply create this shape by passing the btStridingMeshInterface to the constructor btGImpactMeshShape, then you must call updateBound() after creating the mesh - -- You can handle deformable meshes with this shape, by calling postUpdate() every time when changing the mesh vertices. - -*/ -class btGImpactMeshShape : public btGImpactShapeInterface -{ - btStridingMeshInterface* m_meshInterface; - -protected: - btAlignedObjectArray m_mesh_parts; - void buildMeshParts(btStridingMeshInterface* meshInterface) - { - for (int i = 0; i < meshInterface->getNumSubParts(); ++i) - { - btGImpactMeshShapePart* newpart = new btGImpactMeshShapePart(meshInterface, i); - m_mesh_parts.push_back(newpart); - } - } - - //! use this function for perfofm refit in bounding boxes - virtual void calcLocalAABB() - { - m_localAABB.invalidate(); - int i = m_mesh_parts.size(); - while (i--) - { - m_mesh_parts[i]->updateBound(); - m_localAABB.merge(m_mesh_parts[i]->getLocalBox()); - } - } - -public: - btGImpactMeshShape(btStridingMeshInterface* meshInterface) - { - m_meshInterface = meshInterface; - buildMeshParts(meshInterface); - } - - virtual ~btGImpactMeshShape() - { - int i = m_mesh_parts.size(); - while (i--) - { - btGImpactMeshShapePart* part = m_mesh_parts[i]; - delete part; - } - m_mesh_parts.clear(); - } - - btStridingMeshInterface* getMeshInterface() - { - return m_meshInterface; - } - - const btStridingMeshInterface* getMeshInterface() const - { - return m_meshInterface; - } - - int getMeshPartCount() const - { - return m_mesh_parts.size(); - } - - btGImpactMeshShapePart* getMeshPart(int index) - { - return m_mesh_parts[index]; - } - - const btGImpactMeshShapePart* getMeshPart(int index) const - { - return m_mesh_parts[index]; - } - - virtual void setLocalScaling(const btVector3& scaling) - { - localScaling = scaling; - - int i = m_mesh_parts.size(); - while (i--) - { - btGImpactMeshShapePart* part = m_mesh_parts[i]; - part->setLocalScaling(scaling); - } - - m_needs_update = true; - } - - virtual void setMargin(btScalar margin) - { - m_collisionMargin = margin; - - int i = m_mesh_parts.size(); - while (i--) - { - btGImpactMeshShapePart* part = m_mesh_parts[i]; - part->setMargin(margin); - } - - m_needs_update = true; - } - - //! Tells to this object that is needed to refit all the meshes - virtual void postUpdate() - { - int i = m_mesh_parts.size(); - while (i--) - { - btGImpactMeshShapePart* part = m_mesh_parts[i]; - part->postUpdate(); - } - - m_needs_update = true; - } - - virtual void calculateLocalInertia(btScalar mass, btVector3& inertia) const; - - //! Obtains the primitive manager - virtual const btPrimitiveManagerBase* getPrimitiveManager() const - { - btAssert(0); - return NULL; - } - - //! Gets the number of children - virtual int getNumChildShapes() const - { - btAssert(0); - return 0; - } - - //! if true, then its children must get transforms. - virtual bool childrenHasTransform() const - { - btAssert(0); - return false; - } - - //! Determines if this shape has triangles - virtual bool needsRetrieveTriangles() const - { - btAssert(0); - return false; - } - - //! Determines if this shape has tetrahedrons - virtual bool needsRetrieveTetrahedrons() const - { - btAssert(0); - return false; - } - - virtual void getBulletTriangle(int prim_index, btTriangleShapeEx& triangle) const - { - (void)prim_index; - (void)triangle; - btAssert(0); - } - - virtual void getBulletTetrahedron(int prim_index, btTetrahedronShapeEx& tetrahedron) const - { - (void)prim_index; - (void)tetrahedron; - btAssert(0); - } - - //! call when reading child shapes - virtual void lockChildShapes() const - { - btAssert(0); - } - - virtual void unlockChildShapes() const - { - btAssert(0); - } - - //! Retrieves the bound from a child - /*! - */ - virtual void getChildAabb(int child_index, const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const - { - (void)child_index; - (void)t; - (void)aabbMin; - (void)aabbMax; - btAssert(0); - } - - //! Gets the children - virtual btCollisionShape* getChildShape(int index) - { - (void)index; - btAssert(0); - return NULL; - } - - //! Gets the child - virtual const btCollisionShape* getChildShape(int index) const - { - (void)index; - btAssert(0); - return NULL; - } - - //! Gets the children transform - virtual btTransform getChildTransform(int index) const - { - (void)index; - btAssert(0); - return btTransform(); - } - - //! Sets the children transform - /*! - \post You must call updateBound() for update the box set. - */ - virtual void setChildTransform(int index, const btTransform& transform) - { - (void)index; - (void)transform; - btAssert(0); - } - - virtual eGIMPACT_SHAPE_TYPE getGImpactShapeType() const - { - return CONST_GIMPACT_TRIMESH_SHAPE; - } - - virtual const char* getName() const - { - return "GImpactMesh"; - } - - virtual void rayTest(const btVector3& rayFrom, const btVector3& rayTo, btCollisionWorld::RayResultCallback& resultCallback) const; - - //! Function for retrieve triangles. - /*! - It gives the triangles in local space - */ - virtual void processAllTriangles(btTriangleCallback* callback, const btVector3& aabbMin, const btVector3& aabbMax) const; - - virtual void processAllTrianglesRay(btTriangleCallback* callback, const btVector3& rayFrom, const btVector3& rayTo) const; - - virtual int calculateSerializeBufferSize() const; - - ///fills the dataBuffer and returns the struct name (and 0 on failure) - virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const; -}; - -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct btGImpactMeshShapeData -{ - btCollisionShapeData m_collisionShapeData; - - btStridingMeshInterfaceData m_meshInterface; - - btVector3FloatData m_localScaling; - - float m_collisionMargin; - - int m_gimpactSubType; -}; - -SIMD_FORCE_INLINE int btGImpactMeshShape::calculateSerializeBufferSize() const -{ - return sizeof(btGImpactMeshShapeData); -} - -#endif //GIMPACT_MESH_SHAPE_H diff --git a/engine/inc/bullet/BulletCollision/Gimpact/btGenericPoolAllocator.h b/engine/inc/bullet/BulletCollision/Gimpact/btGenericPoolAllocator.h deleted file mode 100644 index a535088e..00000000 --- a/engine/inc/bullet/BulletCollision/Gimpact/btGenericPoolAllocator.h +++ /dev/null @@ -1,153 +0,0 @@ -/*! \file btGenericPoolAllocator.h -\author Francisco Leon Najera. email projectileman@yahoo.com - -General purpose allocator class -*/ -/* -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_GENERIC_POOL_ALLOCATOR_H -#define BT_GENERIC_POOL_ALLOCATOR_H - -#include -#include -#include -#include "LinearMath/btAlignedAllocator.h" - -#define BT_UINT_MAX UINT_MAX -#define BT_DEFAULT_MAX_POOLS 16 - -//! Generic Pool class -class btGenericMemoryPool -{ -public: - unsigned char *m_pool; //[m_element_size*m_max_element_count]; - size_t *m_free_nodes; //[m_max_element_count];//! free nodes - size_t *m_allocated_sizes; //[m_max_element_count];//! Number of elements allocated per node - size_t m_allocated_count; - size_t m_free_nodes_count; - -protected: - size_t m_element_size; - size_t m_max_element_count; - - size_t allocate_from_free_nodes(size_t num_elements); - size_t allocate_from_pool(size_t num_elements); - -public: - void init_pool(size_t element_size, size_t element_count); - - void end_pool(); - - btGenericMemoryPool(size_t element_size, size_t element_count) - { - init_pool(element_size, element_count); - } - - ~btGenericMemoryPool() - { - end_pool(); - } - - inline size_t get_pool_capacity() - { - return m_element_size * m_max_element_count; - } - - inline size_t gem_element_size() - { - return m_element_size; - } - - inline size_t get_max_element_count() - { - return m_max_element_count; - } - - inline size_t get_allocated_count() - { - return m_allocated_count; - } - - inline size_t get_free_positions_count() - { - return m_free_nodes_count; - } - - inline void *get_element_data(size_t element_index) - { - return &m_pool[element_index * m_element_size]; - } - - //! Allocates memory in pool - /*! - \param size_bytes size in bytes of the buffer - */ - void *allocate(size_t size_bytes); - - bool freeMemory(void *pointer); -}; - -//! Generic Allocator with pools -/*! -General purpose Allocator which can create Memory Pools dynamiacally as needed. -*/ -class btGenericPoolAllocator -{ -protected: - size_t m_pool_element_size; - size_t m_pool_element_count; - -public: - btGenericMemoryPool *m_pools[BT_DEFAULT_MAX_POOLS]; - size_t m_pool_count; - - inline size_t get_pool_capacity() - { - return m_pool_element_size * m_pool_element_count; - } - -protected: - // creates a pool - btGenericMemoryPool *push_new_pool(); - - void *failback_alloc(size_t size_bytes); - - bool failback_free(void *pointer); - -public: - btGenericPoolAllocator(size_t pool_element_size, size_t pool_element_count) - { - m_pool_count = 0; - m_pool_element_size = pool_element_size; - m_pool_element_count = pool_element_count; - } - - virtual ~btGenericPoolAllocator(); - - //! Allocates memory in pool - /*! - \param size_bytes size in bytes of the buffer - */ - void *allocate(size_t size_bytes); - - bool freeMemory(void *pointer); -}; - -void *btPoolAlloc(size_t size); -void *btPoolRealloc(void *ptr, size_t oldsize, size_t newsize); -void btPoolFree(void *ptr); - -#endif diff --git a/engine/inc/bullet/BulletCollision/Gimpact/btGeometryOperations.h b/engine/inc/bullet/BulletCollision/Gimpact/btGeometryOperations.h deleted file mode 100644 index 6a1ee6dc..00000000 --- a/engine/inc/bullet/BulletCollision/Gimpact/btGeometryOperations.h +++ /dev/null @@ -1,198 +0,0 @@ -#ifndef BT_BASIC_GEOMETRY_OPERATIONS_H_INCLUDED -#define BT_BASIC_GEOMETRY_OPERATIONS_H_INCLUDED - -/*! \file btGeometryOperations.h -*\author Francisco Leon Najera - -*/ -/* -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 "btBoxCollision.h" - -#define PLANEDIREPSILON 0.0000001f -#define PARALELENORMALS 0.000001f - -#define BT_CLAMP(number, minval, maxval) (number < minval ? minval : (number > maxval ? maxval : number)) - -/// Calc a plane from a triangle edge an a normal. plane is a vec4f -SIMD_FORCE_INLINE void bt_edge_plane(const btVector3 &e1, const btVector3 &e2, const btVector3 &normal, btVector4 &plane) -{ - btVector3 planenormal = (e2 - e1).cross(normal); - planenormal.normalize(); - plane.setValue(planenormal[0], planenormal[1], planenormal[2], e2.dot(planenormal)); -} - -//***************** SEGMENT and LINE FUNCTIONS **********************************/// - -/*! Finds the closest point(cp) to (v) on a segment (e1,e2) - */ -SIMD_FORCE_INLINE void bt_closest_point_on_segment( - btVector3 &cp, const btVector3 &v, - const btVector3 &e1, const btVector3 &e2) -{ - btVector3 n = e2 - e1; - cp = v - e1; - btScalar _scalar = cp.dot(n) / n.dot(n); - if (_scalar < 0.0f) - { - cp = e1; - } - else if (_scalar > 1.0f) - { - cp = e2; - } - else - { - cp = _scalar * n + e1; - } -} - -//! line plane collision -/*! -*\return - -0 if the ray never intersects - -1 if the ray collides in front - -2 if the ray collides in back -*/ - -SIMD_FORCE_INLINE int bt_line_plane_collision( - const btVector4 &plane, - const btVector3 &vDir, - const btVector3 &vPoint, - btVector3 &pout, - btScalar &tparam, - btScalar tmin, btScalar tmax) -{ - btScalar _dotdir = vDir.dot(plane); - - if (btFabs(_dotdir) < PLANEDIREPSILON) - { - tparam = tmax; - return 0; - } - - btScalar _dis = bt_distance_point_plane(plane, vPoint); - char returnvalue = _dis < 0.0f ? 2 : 1; - tparam = -_dis / _dotdir; - - if (tparam < tmin) - { - returnvalue = 0; - tparam = tmin; - } - else if (tparam > tmax) - { - returnvalue = 0; - tparam = tmax; - } - pout = tparam * vDir + vPoint; - return returnvalue; -} - -//! Find closest points on segments -SIMD_FORCE_INLINE void bt_segment_collision( - const btVector3 &vA1, - const btVector3 &vA2, - const btVector3 &vB1, - const btVector3 &vB2, - btVector3 &vPointA, - btVector3 &vPointB) -{ - btVector3 AD = vA2 - vA1; - btVector3 BD = vB2 - vB1; - btVector3 N = AD.cross(BD); - btScalar tp = N.length2(); - - btVector4 _M; //plane - - if (tp < SIMD_EPSILON) //ARE PARALELE - { - //project B over A - bool invert_b_order = false; - _M[0] = vB1.dot(AD); - _M[1] = vB2.dot(AD); - - if (_M[0] > _M[1]) - { - invert_b_order = true; - BT_SWAP_NUMBERS(_M[0], _M[1]); - } - _M[2] = vA1.dot(AD); - _M[3] = vA2.dot(AD); - //mid points - N[0] = (_M[0] + _M[1]) * 0.5f; - N[1] = (_M[2] + _M[3]) * 0.5f; - - if (N[0] < N[1]) - { - if (_M[1] < _M[2]) - { - vPointB = invert_b_order ? vB1 : vB2; - vPointA = vA1; - } - else if (_M[1] < _M[3]) - { - vPointB = invert_b_order ? vB1 : vB2; - bt_closest_point_on_segment(vPointA, vPointB, vA1, vA2); - } - else - { - vPointA = vA2; - bt_closest_point_on_segment(vPointB, vPointA, vB1, vB2); - } - } - else - { - if (_M[3] < _M[0]) - { - vPointB = invert_b_order ? vB2 : vB1; - vPointA = vA2; - } - else if (_M[3] < _M[1]) - { - vPointA = vA2; - bt_closest_point_on_segment(vPointB, vPointA, vB1, vB2); - } - else - { - vPointB = invert_b_order ? vB1 : vB2; - bt_closest_point_on_segment(vPointA, vPointB, vA1, vA2); - } - } - return; - } - - N = N.cross(BD); - _M.setValue(N[0], N[1], N[2], vB1.dot(N)); - - // get point A as the plane collision point - bt_line_plane_collision(_M, AD, vA1, vPointA, tp, btScalar(0), btScalar(1)); - - /*Closest point on segment*/ - vPointB = vPointA - vB1; - tp = vPointB.dot(BD); - tp /= BD.dot(BD); - tp = BT_CLAMP(tp, 0.0f, 1.0f); - - vPointB = tp * BD + vB1; -} - -#endif // GIM_VECTOR_H_INCLUDED diff --git a/engine/inc/bullet/BulletCollision/Gimpact/btQuantization.h b/engine/inc/bullet/BulletCollision/Gimpact/btQuantization.h deleted file mode 100644 index 19a02a21..00000000 --- a/engine/inc/bullet/BulletCollision/Gimpact/btQuantization.h +++ /dev/null @@ -1,79 +0,0 @@ -#ifndef BT_GIMPACT_QUANTIZATION_H_INCLUDED -#define BT_GIMPACT_QUANTIZATION_H_INCLUDED - -/*! \file btQuantization.h -*\author Francisco Leon Najera - -*/ -/* -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 "LinearMath/btTransform.h" - -SIMD_FORCE_INLINE void bt_calc_quantization_parameters( - btVector3& outMinBound, - btVector3& outMaxBound, - btVector3& bvhQuantization, - const btVector3& srcMinBound, const btVector3& srcMaxBound, - btScalar quantizationMargin) -{ - //enlarge the AABB to avoid division by zero when initializing the quantization values - btVector3 clampValue(quantizationMargin, quantizationMargin, quantizationMargin); - outMinBound = srcMinBound - clampValue; - outMaxBound = srcMaxBound + clampValue; - btVector3 aabbSize = outMaxBound - outMinBound; - bvhQuantization = btVector3(btScalar(65535.0), - btScalar(65535.0), - btScalar(65535.0)) / - aabbSize; -} - -SIMD_FORCE_INLINE void bt_quantize_clamp( - unsigned short* out, - const btVector3& point, - const btVector3& min_bound, - const btVector3& max_bound, - const btVector3& bvhQuantization) -{ - btVector3 clampedPoint(point); - clampedPoint.setMax(min_bound); - clampedPoint.setMin(max_bound); - - btVector3 v = (clampedPoint - min_bound) * bvhQuantization; - out[0] = (unsigned short)(v.getX() + 0.5f); - out[1] = (unsigned short)(v.getY() + 0.5f); - out[2] = (unsigned short)(v.getZ() + 0.5f); -} - -SIMD_FORCE_INLINE btVector3 bt_unquantize( - const unsigned short* vecIn, - const btVector3& offset, - const btVector3& bvhQuantization) -{ - btVector3 vecOut; - vecOut.setValue( - (btScalar)(vecIn[0]) / (bvhQuantization.getX()), - (btScalar)(vecIn[1]) / (bvhQuantization.getY()), - (btScalar)(vecIn[2]) / (bvhQuantization.getZ())); - vecOut += offset; - return vecOut; -} - -#endif // BT_GIMPACT_QUANTIZATION_H_INCLUDED diff --git a/engine/inc/bullet/BulletCollision/Gimpact/btTriangleShapeEx.h b/engine/inc/bullet/BulletCollision/Gimpact/btTriangleShapeEx.h deleted file mode 100644 index 568a1ce8..00000000 --- a/engine/inc/bullet/BulletCollision/Gimpact/btTriangleShapeEx.h +++ /dev/null @@ -1,169 +0,0 @@ -/*! \file btGImpactShape.h -\author Francisco Leon Najera -*/ -/* -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_TRIANGLE_SHAPE_EX_H -#define GIMPACT_TRIANGLE_SHAPE_EX_H - -#include "BulletCollision/CollisionShapes/btCollisionShape.h" -#include "BulletCollision/CollisionShapes/btTriangleShape.h" -#include "btBoxCollision.h" -#include "btClipPolygon.h" -#include "btGeometryOperations.h" - -#define MAX_TRI_CLIPPING 16 - -//! Structure for collision -struct GIM_TRIANGLE_CONTACT -{ - btScalar m_penetration_depth; - int m_point_count; - btVector4 m_separating_normal; - btVector3 m_points[MAX_TRI_CLIPPING]; - - SIMD_FORCE_INLINE void copy_from(const GIM_TRIANGLE_CONTACT& other) - { - m_penetration_depth = other.m_penetration_depth; - m_separating_normal = other.m_separating_normal; - m_point_count = other.m_point_count; - int i = m_point_count; - while (i--) - { - m_points[i] = other.m_points[i]; - } - } - - GIM_TRIANGLE_CONTACT() - { - } - - GIM_TRIANGLE_CONTACT(const GIM_TRIANGLE_CONTACT& other) - { - copy_from(other); - } - - //! classify points that are closer - void merge_points(const btVector4& plane, - btScalar margin, const btVector3* points, int point_count); -}; - -class btPrimitiveTriangle -{ -public: - btVector3 m_vertices[3]; - btVector4 m_plane; - btScalar m_margin; - btScalar m_dummy; - btPrimitiveTriangle() : m_margin(0.01f) - { - } - - SIMD_FORCE_INLINE void buildTriPlane() - { - btVector3 normal = (m_vertices[1] - m_vertices[0]).cross(m_vertices[2] - m_vertices[0]); - normal.normalize(); - m_plane.setValue(normal[0], normal[1], normal[2], m_vertices[0].dot(normal)); - } - - //! Test if triangles could collide - bool overlap_test_conservative(const btPrimitiveTriangle& other); - - //! Calcs the plane which is paralele to the edge and perpendicular to the triangle plane - /*! - \pre this triangle must have its plane calculated. - */ - SIMD_FORCE_INLINE void get_edge_plane(int edge_index, btVector4& plane) const - { - const btVector3& e0 = m_vertices[edge_index]; - const btVector3& e1 = m_vertices[(edge_index + 1) % 3]; - bt_edge_plane(e0, e1, m_plane, plane); - } - - void applyTransform(const btTransform& t) - { - m_vertices[0] = t(m_vertices[0]); - m_vertices[1] = t(m_vertices[1]); - m_vertices[2] = t(m_vertices[2]); - } - - //! Clips the triangle against this - /*! - \pre clipped_points must have MAX_TRI_CLIPPING size, and this triangle must have its plane calculated. - \return the number of clipped points - */ - int clip_triangle(btPrimitiveTriangle& other, btVector3* clipped_points); - - //! Find collision using the clipping method - /*! - \pre this triangle and other must have their triangles calculated - */ - bool find_triangle_collision_clip_method(btPrimitiveTriangle& other, GIM_TRIANGLE_CONTACT& contacts); -}; - -//! Helper class for colliding Bullet Triangle Shapes -/*! -This class implements a better getAabb method than the previous btTriangleShape class -*/ -class btTriangleShapeEx : public btTriangleShape -{ -public: - btTriangleShapeEx() : btTriangleShape(btVector3(0, 0, 0), btVector3(0, 0, 0), btVector3(0, 0, 0)) - { - } - - btTriangleShapeEx(const btVector3& p0, const btVector3& p1, const btVector3& p2) : btTriangleShape(p0, p1, p2) - { - } - - btTriangleShapeEx(const btTriangleShapeEx& other) : btTriangleShape(other.m_vertices1[0], other.m_vertices1[1], other.m_vertices1[2]) - { - } - - virtual void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const - { - btVector3 tv0 = t(m_vertices1[0]); - btVector3 tv1 = t(m_vertices1[1]); - btVector3 tv2 = t(m_vertices1[2]); - - btAABB trianglebox(tv0, tv1, tv2, m_collisionMargin); - aabbMin = trianglebox.m_min; - aabbMax = trianglebox.m_max; - } - - void applyTransform(const btTransform& t) - { - m_vertices1[0] = t(m_vertices1[0]); - m_vertices1[1] = t(m_vertices1[1]); - m_vertices1[2] = t(m_vertices1[2]); - } - - SIMD_FORCE_INLINE void buildTriPlane(btVector4& plane) const - { - btVector3 normal = (m_vertices1[1] - m_vertices1[0]).cross(m_vertices1[2] - m_vertices1[0]); - normal.normalize(); - plane.setValue(normal[0], normal[1], normal[2], m_vertices1[0].dot(normal)); - } - - bool overlap_test_conservative(const btTriangleShapeEx& other); -}; - -#endif //GIMPACT_TRIANGLE_MESH_SHAPE_H diff --git a/engine/inc/bullet/BulletCollision/Gimpact/gim_array.h b/engine/inc/bullet/BulletCollision/Gimpact/gim_array.h deleted file mode 100644 index fc2dc38a..00000000 --- a/engine/inc/bullet/BulletCollision/Gimpact/gim_array.h +++ /dev/null @@ -1,318 +0,0 @@ -#ifndef GIM_ARRAY_H_INCLUDED -#define GIM_ARRAY_H_INCLUDED -/*! \file gim_array.h -\author Francisco Leon Najera -*/ -/* ------------------------------------------------------------------------------ -This source file is part of GIMPACT Library. - -For the latest info, see http://gimpact.sourceforge.net/ - -Copyright (c) 2006 Francisco Leon Najera. C.C. 80087371. -email: projectileman@yahoo.com - - This library is free software; you can redistribute it and/or - modify it under the terms of EITHER: - (1) The GNU Lesser General Public License as published by the Free - Software Foundation; either version 2.1 of the License, or (at - your option) any later version. The text of the GNU Lesser - General Public License is included with this library in the - file GIMPACT-LICENSE-LGPL.TXT. - (2) The BSD-style license that is included with this library in - the file GIMPACT-LICENSE-BSD.TXT. - (3) The zlib/libpng license that is included with this library in - the file GIMPACT-LICENSE-ZLIB.TXT. - - This library 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 files - GIMPACT-LICENSE-LGPL.TXT, GIMPACT-LICENSE-ZLIB.TXT and GIMPACT-LICENSE-BSD.TXT for more details. - ------------------------------------------------------------------------------ -*/ - -#include "gim_memory.h" - -#define GIM_ARRAY_GROW_INCREMENT 2 -#define GIM_ARRAY_GROW_FACTOR 2 - -//! Very simple array container with fast access and simd memory -template -class gim_array -{ -public: - //! properties - //!@{ - T* m_data; - GUINT m_size; - GUINT m_allocated_size; - //!@} - //! protected operations - //!@{ - - inline void destroyData() - { - m_allocated_size = 0; - if (m_data == NULL) return; - gim_free(m_data); - m_data = NULL; - } - - inline bool resizeData(GUINT newsize) - { - if (newsize == 0) - { - destroyData(); - return true; - } - - if (m_size > 0) - { - m_data = (T*)gim_realloc(m_data, m_size * sizeof(T), newsize * sizeof(T)); - } - else - { - m_data = (T*)gim_alloc(newsize * sizeof(T)); - } - m_allocated_size = newsize; - return true; - } - - inline bool growingCheck() - { - if (m_allocated_size <= m_size) - { - GUINT requestsize = m_size; - m_size = m_allocated_size; - if (resizeData((requestsize + GIM_ARRAY_GROW_INCREMENT) * GIM_ARRAY_GROW_FACTOR) == false) return false; - } - return true; - } - - //!@} - //! public operations - //!@{ - inline bool reserve(GUINT size) - { - if (m_allocated_size >= size) return false; - return resizeData(size); - } - - inline void clear_range(GUINT start_range) - { - while (m_size > start_range) - { - m_data[--m_size].~T(); - } - } - - inline void clear() - { - if (m_size == 0) return; - clear_range(0); - } - - inline void clear_memory() - { - clear(); - destroyData(); - } - - gim_array() - { - m_data = 0; - m_size = 0; - m_allocated_size = 0; - } - - gim_array(GUINT reservesize) - { - m_data = 0; - m_size = 0; - - m_allocated_size = 0; - reserve(reservesize); - } - - ~gim_array() - { - clear_memory(); - } - - inline GUINT size() const - { - return m_size; - } - - inline GUINT max_size() const - { - return m_allocated_size; - } - - inline T& operator[](size_t i) - { - return m_data[i]; - } - inline const T& operator[](size_t i) const - { - return m_data[i]; - } - - inline T* pointer() { return m_data; } - inline const T* pointer() const - { - return m_data; - } - - inline T* get_pointer_at(GUINT i) - { - return m_data + i; - } - - inline const T* get_pointer_at(GUINT i) const - { - return m_data + i; - } - - inline T& at(GUINT i) - { - return m_data[i]; - } - - inline const T& at(GUINT i) const - { - return m_data[i]; - } - - inline T& front() - { - return *m_data; - } - - inline const T& front() const - { - return *m_data; - } - - inline T& back() - { - return m_data[m_size - 1]; - } - - inline const T& back() const - { - return m_data[m_size - 1]; - } - - inline void swap(GUINT i, GUINT j) - { - gim_swap_elements(m_data, i, j); - } - - inline void push_back(const T& obj) - { - this->growingCheck(); - m_data[m_size] = obj; - m_size++; - } - - //!Simply increase the m_size, doesn't call the new element constructor - inline void push_back_mem() - { - this->growingCheck(); - m_size++; - } - - inline void push_back_memcpy(const T& obj) - { - this->growingCheck(); - gim_simd_memcpy(&m_data[m_size], &obj, sizeof(T)); - m_size++; - } - - inline void pop_back() - { - m_size--; - m_data[m_size].~T(); - } - - //!Simply decrease the m_size, doesn't call the deleted element destructor - inline void pop_back_mem() - { - m_size--; - } - - //! fast erase - inline void erase(GUINT index) - { - if (index < m_size - 1) - { - swap(index, m_size - 1); - } - pop_back(); - } - - inline void erase_sorted_mem(GUINT index) - { - m_size--; - for (GUINT i = index; i < m_size; i++) - { - gim_simd_memcpy(m_data + i, m_data + i + 1, sizeof(T)); - } - } - - inline void erase_sorted(GUINT index) - { - m_data[index].~T(); - erase_sorted_mem(index); - } - - inline void insert_mem(GUINT index) - { - this->growingCheck(); - for (GUINT i = m_size; i > index; i--) - { - gim_simd_memcpy(m_data + i, m_data + i - 1, sizeof(T)); - } - m_size++; - } - - inline void insert(const T& obj, GUINT index) - { - insert_mem(index); - m_data[index] = obj; - } - - inline void resize(GUINT size, bool call_constructor = true, const T& fillData = T()) - { - if (size > m_size) - { - reserve(size); - if (call_constructor) - { - while (m_size < size) - { - m_data[m_size] = fillData; - m_size++; - } - } - else - { - m_size = size; - } - } - else if (size < m_size) - { - if (call_constructor) clear_range(size); - m_size = size; - } - } - - inline void refit() - { - resizeData(m_size); - } -}; - -#endif // GIM_CONTAINERS_H_INCLUDED diff --git a/engine/inc/bullet/BulletCollision/Gimpact/gim_basic_geometry_operations.h b/engine/inc/bullet/BulletCollision/Gimpact/gim_basic_geometry_operations.h deleted file mode 100644 index 7ab78367..00000000 --- a/engine/inc/bullet/BulletCollision/Gimpact/gim_basic_geometry_operations.h +++ /dev/null @@ -1,536 +0,0 @@ -#ifndef GIM_BASIC_GEOMETRY_OPERATIONS_H_INCLUDED -#define GIM_BASIC_GEOMETRY_OPERATIONS_H_INCLUDED - -/*! \file gim_basic_geometry_operations.h -*\author Francisco Leon Najera -type independant geometry routines - -*/ -/* ------------------------------------------------------------------------------ -This source file is part of GIMPACT Library. - -For the latest info, see http://gimpact.sourceforge.net/ - -Copyright (c) 2006 Francisco Leon Najera. C.C. 80087371. -email: projectileman@yahoo.com - - This library is free software; you can redistribute it and/or - modify it under the terms of EITHER: - (1) The GNU Lesser General Public License as published by the Free - Software Foundation; either version 2.1 of the License, or (at - your option) any later version. The text of the GNU Lesser - General Public License is included with this library in the - file GIMPACT-LICENSE-LGPL.TXT. - (2) The BSD-style license that is included with this library in - the file GIMPACT-LICENSE-BSD.TXT. - (3) The zlib/libpng license that is included with this library in - the file GIMPACT-LICENSE-ZLIB.TXT. - - This library 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 files - GIMPACT-LICENSE-LGPL.TXT, GIMPACT-LICENSE-ZLIB.TXT and GIMPACT-LICENSE-BSD.TXT for more details. - ------------------------------------------------------------------------------ -*/ - -#include "gim_linear_math.h" - -#ifndef PLANEDIREPSILON -#define PLANEDIREPSILON 0.0000001f -#endif - -#ifndef PARALELENORMALS -#define PARALELENORMALS 0.000001f -#endif - -#define TRIANGLE_NORMAL(v1, v2, v3, n) \ - { \ - vec3f _dif1, _dif2; \ - VEC_DIFF(_dif1, v2, v1); \ - VEC_DIFF(_dif2, v3, v1); \ - VEC_CROSS(n, _dif1, _dif2); \ - VEC_NORMALIZE(n); \ - } - -#define TRIANGLE_NORMAL_FAST(v1, v2, v3, n) \ - { \ - vec3f _dif1, _dif2; \ - VEC_DIFF(_dif1, v2, v1); \ - VEC_DIFF(_dif2, v3, v1); \ - VEC_CROSS(n, _dif1, _dif2); \ - } - -/// plane is a vec4f -#define TRIANGLE_PLANE(v1, v2, v3, plane) \ - { \ - TRIANGLE_NORMAL(v1, v2, v3, plane); \ - plane[3] = VEC_DOT(v1, plane); \ - } - -/// plane is a vec4f -#define TRIANGLE_PLANE_FAST(v1, v2, v3, plane) \ - { \ - TRIANGLE_NORMAL_FAST(v1, v2, v3, plane); \ - plane[3] = VEC_DOT(v1, plane); \ - } - -/// Calc a plane from an edge an a normal. plane is a vec4f -#define EDGE_PLANE(e1, e2, n, plane) \ - { \ - vec3f _dif; \ - VEC_DIFF(_dif, e2, e1); \ - VEC_CROSS(plane, _dif, n); \ - VEC_NORMALIZE(plane); \ - plane[3] = VEC_DOT(e1, plane); \ - } - -#define DISTANCE_PLANE_POINT(plane, point) (VEC_DOT(plane, point) - plane[3]) - -#define PROJECT_POINT_PLANE(point, plane, projected) \ - { \ - GREAL _dis; \ - _dis = DISTANCE_PLANE_POINT(plane, point); \ - VEC_SCALE(projected, -_dis, plane); \ - VEC_SUM(projected, projected, point); \ - } - -//! Verifies if a point is in the plane hull -template -SIMD_FORCE_INLINE bool POINT_IN_HULL( - const CLASS_POINT &point, const CLASS_PLANE *planes, GUINT plane_count) -{ - GREAL _dis; - for (GUINT _i = 0; _i < plane_count; ++_i) - { - _dis = DISTANCE_PLANE_POINT(planes[_i], point); - if (_dis > 0.0f) return false; - } - return true; -} - -template -SIMD_FORCE_INLINE void PLANE_CLIP_SEGMENT( - const CLASS_POINT &s1, - const CLASS_POINT &s2, const CLASS_PLANE &plane, CLASS_POINT &clipped) -{ - GREAL _dis1, _dis2; - _dis1 = DISTANCE_PLANE_POINT(plane, s1); - VEC_DIFF(clipped, s2, s1); - _dis2 = VEC_DOT(clipped, plane); - VEC_SCALE(clipped, -_dis1 / _dis2, clipped); - VEC_SUM(clipped, clipped, s1); -} - -enum ePLANE_INTERSECTION_TYPE -{ - G_BACK_PLANE = 0, - G_COLLIDE_PLANE, - G_FRONT_PLANE -}; - -enum eLINE_PLANE_INTERSECTION_TYPE -{ - G_FRONT_PLANE_S1 = 0, - G_FRONT_PLANE_S2, - G_BACK_PLANE_S1, - G_BACK_PLANE_S2, - G_COLLIDE_PLANE_S1, - G_COLLIDE_PLANE_S2 -}; - -//! Confirms if the plane intersect the edge or nor -/*! -intersection type must have the following values -
    -
  • 0 : Segment in front of plane, s1 closest -
  • 1 : Segment in front of plane, s2 closest -
  • 2 : Segment in back of plane, s1 closest -
  • 3 : Segment in back of plane, s2 closest -
  • 4 : Segment collides plane, s1 in back -
  • 5 : Segment collides plane, s2 in back -
-*/ - -template -SIMD_FORCE_INLINE eLINE_PLANE_INTERSECTION_TYPE PLANE_CLIP_SEGMENT2( - const CLASS_POINT &s1, - const CLASS_POINT &s2, - const CLASS_PLANE &plane, CLASS_POINT &clipped) -{ - GREAL _dis1 = DISTANCE_PLANE_POINT(plane, s1); - GREAL _dis2 = DISTANCE_PLANE_POINT(plane, s2); - if (_dis1 > -G_EPSILON && _dis2 > -G_EPSILON) - { - if (_dis1 < _dis2) return G_FRONT_PLANE_S1; - return G_FRONT_PLANE_S2; - } - else if (_dis1 < G_EPSILON && _dis2 < G_EPSILON) - { - if (_dis1 > _dis2) return G_BACK_PLANE_S1; - return G_BACK_PLANE_S2; - } - - VEC_DIFF(clipped, s2, s1); - _dis2 = VEC_DOT(clipped, plane); - VEC_SCALE(clipped, -_dis1 / _dis2, clipped); - VEC_SUM(clipped, clipped, s1); - if (_dis1 < _dis2) return G_COLLIDE_PLANE_S1; - return G_COLLIDE_PLANE_S2; -} - -//! Confirms if the plane intersect the edge or not -/*! -clipped1 and clipped2 are the vertices behind the plane. -clipped1 is the closest - -intersection_type must have the following values -
    -
  • 0 : Segment in front of plane, s1 closest -
  • 1 : Segment in front of plane, s2 closest -
  • 2 : Segment in back of plane, s1 closest -
  • 3 : Segment in back of plane, s2 closest -
  • 4 : Segment collides plane, s1 in back -
  • 5 : Segment collides plane, s2 in back -
-*/ -template -SIMD_FORCE_INLINE eLINE_PLANE_INTERSECTION_TYPE PLANE_CLIP_SEGMENT_CLOSEST( - const CLASS_POINT &s1, - const CLASS_POINT &s2, - const CLASS_PLANE &plane, - CLASS_POINT &clipped1, CLASS_POINT &clipped2) -{ - eLINE_PLANE_INTERSECTION_TYPE intersection_type = PLANE_CLIP_SEGMENT2(s1, s2, plane, clipped1); - switch (intersection_type) - { - case G_FRONT_PLANE_S1: - VEC_COPY(clipped1, s1); - VEC_COPY(clipped2, s2); - break; - case G_FRONT_PLANE_S2: - VEC_COPY(clipped1, s2); - VEC_COPY(clipped2, s1); - break; - case G_BACK_PLANE_S1: - VEC_COPY(clipped1, s1); - VEC_COPY(clipped2, s2); - break; - case G_BACK_PLANE_S2: - VEC_COPY(clipped1, s2); - VEC_COPY(clipped2, s1); - break; - case G_COLLIDE_PLANE_S1: - VEC_COPY(clipped2, s1); - break; - case G_COLLIDE_PLANE_S2: - VEC_COPY(clipped2, s2); - break; - } - return intersection_type; -} - -//! Finds the 2 smallest cartesian coordinates of a plane normal -#define PLANE_MINOR_AXES(plane, i0, i1) VEC_MINOR_AXES(plane, i0, i1) - -//! Ray plane collision in one way -/*! -Intersects plane in one way only. The ray must face the plane (normals must be in opossite directions).
-It uses the PLANEDIREPSILON constant. -*/ -template -SIMD_FORCE_INLINE bool RAY_PLANE_COLLISION( - const CLASS_PLANE &plane, - const CLASS_POINT &vDir, - const CLASS_POINT &vPoint, - CLASS_POINT &pout, T &tparam) -{ - GREAL _dis, _dotdir; - _dotdir = VEC_DOT(plane, vDir); - if (_dotdir < PLANEDIREPSILON) - { - return false; - } - _dis = DISTANCE_PLANE_POINT(plane, vPoint); - tparam = -_dis / _dotdir; - VEC_SCALE(pout, tparam, vDir); - VEC_SUM(pout, vPoint, pout); - return true; -} - -//! line collision -/*! -*\return - -0 if the ray never intersects - -1 if the ray collides in front - -2 if the ray collides in back -*/ -template -SIMD_FORCE_INLINE GUINT LINE_PLANE_COLLISION( - const CLASS_PLANE &plane, - const CLASS_POINT &vDir, - const CLASS_POINT &vPoint, - CLASS_POINT &pout, - T &tparam, - T tmin, T tmax) -{ - GREAL _dis, _dotdir; - _dotdir = VEC_DOT(plane, vDir); - if (btFabs(_dotdir) < PLANEDIREPSILON) - { - tparam = tmax; - return 0; - } - _dis = DISTANCE_PLANE_POINT(plane, vPoint); - char returnvalue = _dis < 0.0f ? 2 : 1; - tparam = -_dis / _dotdir; - - if (tparam < tmin) - { - returnvalue = 0; - tparam = tmin; - } - else if (tparam > tmax) - { - returnvalue = 0; - tparam = tmax; - } - - VEC_SCALE(pout, tparam, vDir); - VEC_SUM(pout, vPoint, pout); - return returnvalue; -} - -/*! \brief Returns the Ray on which 2 planes intersect if they do. - Written by Rodrigo Hernandez on ODE convex collision - - \param p1 Plane 1 - \param p2 Plane 2 - \param p Contains the origin of the ray upon returning if planes intersect - \param d Contains the direction of the ray upon returning if planes intersect - \return true if the planes intersect, 0 if paralell. - -*/ -template -SIMD_FORCE_INLINE bool INTERSECT_PLANES( - const CLASS_PLANE &p1, - const CLASS_PLANE &p2, - CLASS_POINT &p, - CLASS_POINT &d) -{ - VEC_CROSS(d, p1, p2); - GREAL denom = VEC_DOT(d, d); - if (GIM_IS_ZERO(denom)) return false; - vec3f _n; - _n[0] = p1[3] * p2[0] - p2[3] * p1[0]; - _n[1] = p1[3] * p2[1] - p2[3] * p1[1]; - _n[2] = p1[3] * p2[2] - p2[3] * p1[2]; - VEC_CROSS(p, _n, d); - p[0] /= denom; - p[1] /= denom; - p[2] /= denom; - return true; -} - -//***************** SEGMENT and LINE FUNCTIONS **********************************/// - -/*! Finds the closest point(cp) to (v) on a segment (e1,e2) - */ -template -SIMD_FORCE_INLINE void CLOSEST_POINT_ON_SEGMENT( - CLASS_POINT &cp, const CLASS_POINT &v, - const CLASS_POINT &e1, const CLASS_POINT &e2) -{ - vec3f _n; - VEC_DIFF(_n, e2, e1); - VEC_DIFF(cp, v, e1); - GREAL _scalar = VEC_DOT(cp, _n); - _scalar /= VEC_DOT(_n, _n); - if (_scalar < 0.0f) - { - VEC_COPY(cp, e1); - } - else if (_scalar > 1.0f) - { - VEC_COPY(cp, e2); - } - else - { - VEC_SCALE(cp, _scalar, _n); - VEC_SUM(cp, cp, e1); - } -} - -/*! \brief Finds the line params where these lines intersect. - -\param dir1 Direction of line 1 -\param point1 Point of line 1 -\param dir2 Direction of line 2 -\param point2 Point of line 2 -\param t1 Result Parameter for line 1 -\param t2 Result Parameter for line 2 -\param dointersect 0 if the lines won't intersect, else 1 - -*/ -template -SIMD_FORCE_INLINE bool LINE_INTERSECTION_PARAMS( - const CLASS_POINT &dir1, - CLASS_POINT &point1, - const CLASS_POINT &dir2, - CLASS_POINT &point2, - T &t1, T &t2) -{ - GREAL det; - GREAL e1e1 = VEC_DOT(dir1, dir1); - GREAL e1e2 = VEC_DOT(dir1, dir2); - GREAL e2e2 = VEC_DOT(dir2, dir2); - vec3f p1p2; - VEC_DIFF(p1p2, point1, point2); - GREAL p1p2e1 = VEC_DOT(p1p2, dir1); - GREAL p1p2e2 = VEC_DOT(p1p2, dir2); - det = e1e2 * e1e2 - e1e1 * e2e2; - if (GIM_IS_ZERO(det)) return false; - t1 = (e1e2 * p1p2e2 - e2e2 * p1p2e1) / det; - t2 = (e1e1 * p1p2e2 - e1e2 * p1p2e1) / det; - return true; -} - -//! Find closest points on segments -template -SIMD_FORCE_INLINE void SEGMENT_COLLISION( - const CLASS_POINT &vA1, - const CLASS_POINT &vA2, - const CLASS_POINT &vB1, - const CLASS_POINT &vB2, - CLASS_POINT &vPointA, - CLASS_POINT &vPointB) -{ - CLASS_POINT _AD, _BD, n; - vec4f _M; //plane - VEC_DIFF(_AD, vA2, vA1); - VEC_DIFF(_BD, vB2, vB1); - VEC_CROSS(n, _AD, _BD); - GREAL _tp = VEC_DOT(n, n); - if (_tp < G_EPSILON) //ARE PARALELE - { - //project B over A - bool invert_b_order = false; - _M[0] = VEC_DOT(vB1, _AD); - _M[1] = VEC_DOT(vB2, _AD); - if (_M[0] > _M[1]) - { - invert_b_order = true; - GIM_SWAP_NUMBERS(_M[0], _M[1]); - } - _M[2] = VEC_DOT(vA1, _AD); - _M[3] = VEC_DOT(vA2, _AD); - //mid points - n[0] = (_M[0] + _M[1]) * 0.5f; - n[1] = (_M[2] + _M[3]) * 0.5f; - - if (n[0] < n[1]) - { - if (_M[1] < _M[2]) - { - vPointB = invert_b_order ? vB1 : vB2; - vPointA = vA1; - } - else if (_M[1] < _M[3]) - { - vPointB = invert_b_order ? vB1 : vB2; - CLOSEST_POINT_ON_SEGMENT(vPointA, vPointB, vA1, vA2); - } - else - { - vPointA = vA2; - CLOSEST_POINT_ON_SEGMENT(vPointB, vPointA, vB1, vB2); - } - } - else - { - if (_M[3] < _M[0]) - { - vPointB = invert_b_order ? vB2 : vB1; - vPointA = vA2; - } - else if (_M[3] < _M[1]) - { - vPointA = vA2; - CLOSEST_POINT_ON_SEGMENT(vPointB, vPointA, vB1, vB2); - } - else - { - vPointB = invert_b_order ? vB1 : vB2; - CLOSEST_POINT_ON_SEGMENT(vPointA, vPointB, vA1, vA2); - } - } - return; - } - - VEC_CROSS(_M, n, _BD); - _M[3] = VEC_DOT(_M, vB1); - - LINE_PLANE_COLLISION(_M, _AD, vA1, vPointA, _tp, btScalar(0), btScalar(1)); - /*Closest point on segment*/ - VEC_DIFF(vPointB, vPointA, vB1); - _tp = VEC_DOT(vPointB, _BD); - _tp /= VEC_DOT(_BD, _BD); - _tp = GIM_CLAMP(_tp, 0.0f, 1.0f); - VEC_SCALE(vPointB, _tp, _BD); - VEC_SUM(vPointB, vPointB, vB1); -} - -//! Line box intersection in one dimension -/*! - -*\param pos Position of the ray -*\param dir Projection of the Direction of the ray -*\param bmin Minimum bound of the box -*\param bmax Maximum bound of the box -*\param tfirst the minimum projection. Assign to 0 at first. -*\param tlast the maximum projection. Assign to INFINITY at first. -*\return true if there is an intersection. -*/ -template -SIMD_FORCE_INLINE bool BOX_AXIS_INTERSECT(T pos, T dir, T bmin, T bmax, T &tfirst, T &tlast) -{ - if (GIM_IS_ZERO(dir)) - { - return !(pos < bmin || pos > bmax); - } - GREAL a0 = (bmin - pos) / dir; - GREAL a1 = (bmax - pos) / dir; - if (a0 > a1) GIM_SWAP_NUMBERS(a0, a1); - tfirst = GIM_MAX(a0, tfirst); - tlast = GIM_MIN(a1, tlast); - if (tlast < tfirst) return false; - return true; -} - -//! Sorts 3 componets -template -SIMD_FORCE_INLINE void SORT_3_INDICES( - const T *values, - GUINT *order_indices) -{ - //get minimum - order_indices[0] = values[0] < values[1] ? (values[0] < values[2] ? 0 : 2) : (values[1] < values[2] ? 1 : 2); - - //get second and third - GUINT i0 = (order_indices[0] + 1) % 3; - GUINT i1 = (i0 + 1) % 3; - - if (values[i0] < values[i1]) - { - order_indices[1] = i0; - order_indices[2] = i1; - } - else - { - order_indices[1] = i1; - order_indices[2] = i0; - } -} - -#endif // GIM_VECTOR_H_INCLUDED diff --git a/engine/inc/bullet/BulletCollision/Gimpact/gim_bitset.h b/engine/inc/bullet/BulletCollision/Gimpact/gim_bitset.h deleted file mode 100644 index c1fb41a5..00000000 --- a/engine/inc/bullet/BulletCollision/Gimpact/gim_bitset.h +++ /dev/null @@ -1,117 +0,0 @@ -#ifndef GIM_BITSET_H_INCLUDED -#define GIM_BITSET_H_INCLUDED -/*! \file gim_bitset.h -\author Francisco Leon Najera -*/ -/* ------------------------------------------------------------------------------ -This source file is part of GIMPACT Library. - -For the latest info, see http://gimpact.sourceforge.net/ - -Copyright (c) 2006 Francisco Leon Najera. C.C. 80087371. -email: projectileman@yahoo.com - - This library is free software; you can redistribute it and/or - modify it under the terms of EITHER: - (1) The GNU Lesser General Public License as published by the Free - Software Foundation; either version 2.1 of the License, or (at - your option) any later version. The text of the GNU Lesser - General Public License is included with this library in the - file GIMPACT-LICENSE-LGPL.TXT. - (2) The BSD-style license that is included with this library in - the file GIMPACT-LICENSE-BSD.TXT. - (3) The zlib/libpng license that is included with this library in - the file GIMPACT-LICENSE-ZLIB.TXT. - - This library 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 files - GIMPACT-LICENSE-LGPL.TXT, GIMPACT-LICENSE-ZLIB.TXT and GIMPACT-LICENSE-BSD.TXT for more details. - ------------------------------------------------------------------------------ -*/ - -#include "gim_array.h" - -#define GUINT_BIT_COUNT 32 -#define GUINT_EXPONENT 5 - -class gim_bitset -{ -public: - gim_array m_container; - - gim_bitset() - { - } - - gim_bitset(GUINT bits_count) - { - resize(bits_count); - } - - ~gim_bitset() - { - } - - inline bool resize(GUINT newsize) - { - GUINT oldsize = m_container.size(); - m_container.resize(newsize / GUINT_BIT_COUNT + 1, false); - while (oldsize < m_container.size()) - { - m_container[oldsize] = 0; - } - return true; - } - - inline GUINT size() - { - return m_container.size() * GUINT_BIT_COUNT; - } - - inline void set_all() - { - for (GUINT i = 0; i < m_container.size(); ++i) - { - m_container[i] = 0xffffffff; - } - } - - inline void clear_all() - { - for (GUINT i = 0; i < m_container.size(); ++i) - { - m_container[i] = 0; - } - } - - inline void set(GUINT bit_index) - { - if (bit_index >= size()) - { - resize(bit_index); - } - m_container[bit_index >> GUINT_EXPONENT] |= (1 << (bit_index & (GUINT_BIT_COUNT - 1))); - } - - ///Return 0 or 1 - inline char get(GUINT bit_index) - { - if (bit_index >= size()) - { - return 0; - } - char value = m_container[bit_index >> GUINT_EXPONENT] & - (1 << (bit_index & (GUINT_BIT_COUNT - 1))); - return value; - } - - inline void clear(GUINT bit_index) - { - m_container[bit_index >> GUINT_EXPONENT] &= ~(1 << (bit_index & (GUINT_BIT_COUNT - 1))); - } -}; - -#endif // GIM_CONTAINERS_H_INCLUDED diff --git a/engine/inc/bullet/BulletCollision/Gimpact/gim_box_collision.h b/engine/inc/bullet/BulletCollision/Gimpact/gim_box_collision.h deleted file mode 100644 index 9f7cbe73..00000000 --- a/engine/inc/bullet/BulletCollision/Gimpact/gim_box_collision.h +++ /dev/null @@ -1,578 +0,0 @@ -#ifndef GIM_BOX_COLLISION_H_INCLUDED -#define GIM_BOX_COLLISION_H_INCLUDED - -/*! \file gim_box_collision.h -\author Francisco Leon Najera -*/ -/* ------------------------------------------------------------------------------ -This source file is part of GIMPACT Library. - -For the latest info, see http://gimpact.sourceforge.net/ - -Copyright (c) 2006 Francisco Leon Najera. C.C. 80087371. -email: projectileman@yahoo.com - - This library is free software; you can redistribute it and/or - modify it under the terms of EITHER: - (1) The GNU Lesser General Public License as published by the Free - Software Foundation; either version 2.1 of the License, or (at - your option) any later version. The text of the GNU Lesser - General Public License is included with this library in the - file GIMPACT-LICENSE-LGPL.TXT. - (2) The BSD-style license that is included with this library in - the file GIMPACT-LICENSE-BSD.TXT. - (3) The zlib/libpng license that is included with this library in - the file GIMPACT-LICENSE-ZLIB.TXT. - - This library 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 files - GIMPACT-LICENSE-LGPL.TXT, GIMPACT-LICENSE-ZLIB.TXT and GIMPACT-LICENSE-BSD.TXT for more details. - ------------------------------------------------------------------------------ -*/ -#include "gim_basic_geometry_operations.h" -#include "LinearMath/btTransform.h" - -//SIMD_FORCE_INLINE bool test_cross_edge_box( -// const btVector3 & edge, -// const btVector3 & absolute_edge, -// const btVector3 & pointa, -// const btVector3 & pointb, const btVector3 & extend, -// int dir_index0, -// int dir_index1 -// int component_index0, -// int component_index1) -//{ -// // dir coords are -z and y -// -// const btScalar dir0 = -edge[dir_index0]; -// const btScalar dir1 = edge[dir_index1]; -// btScalar pmin = pointa[component_index0]*dir0 + pointa[component_index1]*dir1; -// btScalar pmax = pointb[component_index0]*dir0 + pointb[component_index1]*dir1; -// //find minmax -// if(pmin>pmax) -// { -// GIM_SWAP_NUMBERS(pmin,pmax); -// } -// //find extends -// const btScalar rad = extend[component_index0] * absolute_edge[dir_index0] + -// extend[component_index1] * absolute_edge[dir_index1]; -// -// if(pmin>rad || -rad>pmax) return false; -// return true; -//} -// -//SIMD_FORCE_INLINE bool test_cross_edge_box_X_axis( -// const btVector3 & edge, -// const btVector3 & absolute_edge, -// const btVector3 & pointa, -// const btVector3 & pointb, btVector3 & extend) -//{ -// -// return test_cross_edge_box(edge,absolute_edge,pointa,pointb,extend,2,1,1,2); -//} -// -// -//SIMD_FORCE_INLINE bool test_cross_edge_box_Y_axis( -// const btVector3 & edge, -// const btVector3 & absolute_edge, -// const btVector3 & pointa, -// const btVector3 & pointb, btVector3 & extend) -//{ -// -// return test_cross_edge_box(edge,absolute_edge,pointa,pointb,extend,0,2,2,0); -//} -// -//SIMD_FORCE_INLINE bool test_cross_edge_box_Z_axis( -// const btVector3 & edge, -// const btVector3 & absolute_edge, -// const btVector3 & pointa, -// const btVector3 & pointb, btVector3 & extend) -//{ -// -// return test_cross_edge_box(edge,absolute_edge,pointa,pointb,extend,1,0,0,1); -//} - -#ifndef TEST_CROSS_EDGE_BOX_MCR - -#define TEST_CROSS_EDGE_BOX_MCR(edge, absolute_edge, pointa, pointb, _extend, i_dir_0, i_dir_1, i_comp_0, i_comp_1) \ - { \ - const btScalar dir0 = -edge[i_dir_0]; \ - const btScalar dir1 = edge[i_dir_1]; \ - btScalar pmin = pointa[i_comp_0] * dir0 + pointa[i_comp_1] * dir1; \ - btScalar pmax = pointb[i_comp_0] * dir0 + pointb[i_comp_1] * dir1; \ - if (pmin > pmax) \ - { \ - GIM_SWAP_NUMBERS(pmin, pmax); \ - } \ - const btScalar abs_dir0 = absolute_edge[i_dir_0]; \ - const btScalar abs_dir1 = absolute_edge[i_dir_1]; \ - const btScalar rad = _extend[i_comp_0] * abs_dir0 + _extend[i_comp_1] * abs_dir1; \ - if (pmin > rad || -rad > pmax) return false; \ - } - -#endif - -#define TEST_CROSS_EDGE_BOX_X_AXIS_MCR(edge, absolute_edge, pointa, pointb, _extend) \ - { \ - TEST_CROSS_EDGE_BOX_MCR(edge, absolute_edge, pointa, pointb, _extend, 2, 1, 1, 2); \ - } - -#define TEST_CROSS_EDGE_BOX_Y_AXIS_MCR(edge, absolute_edge, pointa, pointb, _extend) \ - { \ - TEST_CROSS_EDGE_BOX_MCR(edge, absolute_edge, pointa, pointb, _extend, 0, 2, 2, 0); \ - } - -#define TEST_CROSS_EDGE_BOX_Z_AXIS_MCR(edge, absolute_edge, pointa, pointb, _extend) \ - { \ - TEST_CROSS_EDGE_BOX_MCR(edge, absolute_edge, pointa, pointb, _extend, 1, 0, 0, 1); \ - } - -//! Class for transforming a model1 to the space of model0 -class GIM_BOX_BOX_TRANSFORM_CACHE -{ -public: - btVector3 m_T1to0; //!< Transforms translation of model1 to model 0 - btMatrix3x3 m_R1to0; //!< Transforms Rotation of model1 to model 0, equal to R0' * R1 - btMatrix3x3 m_AR; //!< Absolute value of m_R1to0 - - SIMD_FORCE_INLINE void calc_absolute_matrix() - { - static const btVector3 vepsi(1e-6f, 1e-6f, 1e-6f); - m_AR[0] = vepsi + m_R1to0[0].absolute(); - m_AR[1] = vepsi + m_R1to0[1].absolute(); - m_AR[2] = vepsi + m_R1to0[2].absolute(); - } - - GIM_BOX_BOX_TRANSFORM_CACHE() - { - } - - GIM_BOX_BOX_TRANSFORM_CACHE(mat4f trans1_to_0) - { - COPY_MATRIX_3X3(m_R1to0, trans1_to_0) - MAT_GET_TRANSLATION(trans1_to_0, m_T1to0) - calc_absolute_matrix(); - } - - //! Calc the transformation relative 1 to 0. Inverts matrics by transposing - SIMD_FORCE_INLINE void calc_from_homogenic(const btTransform &trans0, const btTransform &trans1) - { - m_R1to0 = trans0.getBasis().transpose(); - m_T1to0 = m_R1to0 * (-trans0.getOrigin()); - - m_T1to0 += m_R1to0 * trans1.getOrigin(); - m_R1to0 *= trans1.getBasis(); - - calc_absolute_matrix(); - } - - //! Calcs the full invertion of the matrices. Useful for scaling matrices - SIMD_FORCE_INLINE void calc_from_full_invert(const btTransform &trans0, const btTransform &trans1) - { - m_R1to0 = trans0.getBasis().inverse(); - m_T1to0 = m_R1to0 * (-trans0.getOrigin()); - - m_T1to0 += m_R1to0 * trans1.getOrigin(); - m_R1to0 *= trans1.getBasis(); - - calc_absolute_matrix(); - } - - SIMD_FORCE_INLINE btVector3 transform(const btVector3 &point) - { - return point.dot3(m_R1to0[0], m_R1to0[1], m_R1to0[2]) + m_T1to0; - } -}; - -#ifndef BOX_PLANE_EPSILON -#define BOX_PLANE_EPSILON 0.000001f -#endif - -//! Axis aligned box -class GIM_AABB -{ -public: - btVector3 m_min; - btVector3 m_max; - - GIM_AABB() - { - } - - GIM_AABB(const btVector3 &V1, - const btVector3 &V2, - const btVector3 &V3) - { - m_min[0] = GIM_MIN3(V1[0], V2[0], V3[0]); - m_min[1] = GIM_MIN3(V1[1], V2[1], V3[1]); - m_min[2] = GIM_MIN3(V1[2], V2[2], V3[2]); - - m_max[0] = GIM_MAX3(V1[0], V2[0], V3[0]); - m_max[1] = GIM_MAX3(V1[1], V2[1], V3[1]); - m_max[2] = GIM_MAX3(V1[2], V2[2], V3[2]); - } - - GIM_AABB(const btVector3 &V1, - const btVector3 &V2, - const btVector3 &V3, - GREAL margin) - { - m_min[0] = GIM_MIN3(V1[0], V2[0], V3[0]); - m_min[1] = GIM_MIN3(V1[1], V2[1], V3[1]); - m_min[2] = GIM_MIN3(V1[2], V2[2], V3[2]); - - m_max[0] = GIM_MAX3(V1[0], V2[0], V3[0]); - m_max[1] = GIM_MAX3(V1[1], V2[1], V3[1]); - m_max[2] = GIM_MAX3(V1[2], V2[2], V3[2]); - - m_min[0] -= margin; - m_min[1] -= margin; - m_min[2] -= margin; - m_max[0] += margin; - m_max[1] += margin; - m_max[2] += margin; - } - - GIM_AABB(const GIM_AABB &other) : m_min(other.m_min), m_max(other.m_max) - { - } - - GIM_AABB(const GIM_AABB &other, btScalar margin) : m_min(other.m_min), m_max(other.m_max) - { - m_min[0] -= margin; - m_min[1] -= margin; - m_min[2] -= margin; - m_max[0] += margin; - m_max[1] += margin; - m_max[2] += margin; - } - - SIMD_FORCE_INLINE void invalidate() - { - m_min[0] = G_REAL_INFINITY; - m_min[1] = G_REAL_INFINITY; - m_min[2] = G_REAL_INFINITY; - m_max[0] = -G_REAL_INFINITY; - m_max[1] = -G_REAL_INFINITY; - m_max[2] = -G_REAL_INFINITY; - } - - SIMD_FORCE_INLINE void increment_margin(btScalar margin) - { - m_min[0] -= margin; - m_min[1] -= margin; - m_min[2] -= margin; - m_max[0] += margin; - m_max[1] += margin; - m_max[2] += margin; - } - - SIMD_FORCE_INLINE void copy_with_margin(const GIM_AABB &other, btScalar margin) - { - m_min[0] = other.m_min[0] - margin; - m_min[1] = other.m_min[1] - margin; - m_min[2] = other.m_min[2] - margin; - - m_max[0] = other.m_max[0] + margin; - m_max[1] = other.m_max[1] + margin; - m_max[2] = other.m_max[2] + margin; - } - - template - SIMD_FORCE_INLINE void calc_from_triangle( - const CLASS_POINT &V1, - const CLASS_POINT &V2, - const CLASS_POINT &V3) - { - m_min[0] = GIM_MIN3(V1[0], V2[0], V3[0]); - m_min[1] = GIM_MIN3(V1[1], V2[1], V3[1]); - m_min[2] = GIM_MIN3(V1[2], V2[2], V3[2]); - - m_max[0] = GIM_MAX3(V1[0], V2[0], V3[0]); - m_max[1] = GIM_MAX3(V1[1], V2[1], V3[1]); - m_max[2] = GIM_MAX3(V1[2], V2[2], V3[2]); - } - - template - SIMD_FORCE_INLINE void calc_from_triangle_margin( - const CLASS_POINT &V1, - const CLASS_POINT &V2, - const CLASS_POINT &V3, btScalar margin) - { - m_min[0] = GIM_MIN3(V1[0], V2[0], V3[0]); - m_min[1] = GIM_MIN3(V1[1], V2[1], V3[1]); - m_min[2] = GIM_MIN3(V1[2], V2[2], V3[2]); - - m_max[0] = GIM_MAX3(V1[0], V2[0], V3[0]); - m_max[1] = GIM_MAX3(V1[1], V2[1], V3[1]); - m_max[2] = GIM_MAX3(V1[2], V2[2], V3[2]); - - m_min[0] -= margin; - m_min[1] -= margin; - m_min[2] -= margin; - m_max[0] += margin; - m_max[1] += margin; - m_max[2] += margin; - } - - //! Apply a transform to an AABB - SIMD_FORCE_INLINE void appy_transform(const btTransform &trans) - { - btVector3 center = (m_max + m_min) * 0.5f; - btVector3 extends = m_max - center; - // Compute new center - center = trans(center); - - btVector3 textends = extends.dot3(trans.getBasis().getRow(0).absolute(), - trans.getBasis().getRow(1).absolute(), - trans.getBasis().getRow(2).absolute()); - - m_min = center - textends; - m_max = center + textends; - } - - //! Merges a Box - SIMD_FORCE_INLINE void merge(const GIM_AABB &box) - { - m_min[0] = GIM_MIN(m_min[0], box.m_min[0]); - m_min[1] = GIM_MIN(m_min[1], box.m_min[1]); - m_min[2] = GIM_MIN(m_min[2], box.m_min[2]); - - m_max[0] = GIM_MAX(m_max[0], box.m_max[0]); - m_max[1] = GIM_MAX(m_max[1], box.m_max[1]); - m_max[2] = GIM_MAX(m_max[2], box.m_max[2]); - } - - //! Merges a point - template - SIMD_FORCE_INLINE void merge_point(const CLASS_POINT &point) - { - m_min[0] = GIM_MIN(m_min[0], point[0]); - m_min[1] = GIM_MIN(m_min[1], point[1]); - m_min[2] = GIM_MIN(m_min[2], point[2]); - - m_max[0] = GIM_MAX(m_max[0], point[0]); - m_max[1] = GIM_MAX(m_max[1], point[1]); - m_max[2] = GIM_MAX(m_max[2], point[2]); - } - - //! Gets the extend and center - SIMD_FORCE_INLINE void get_center_extend(btVector3 ¢er, btVector3 &extend) const - { - center = (m_max + m_min) * 0.5f; - extend = m_max - center; - } - - //! Finds the intersecting box between this box and the other. - SIMD_FORCE_INLINE void find_intersection(const GIM_AABB &other, GIM_AABB &intersection) const - { - intersection.m_min[0] = GIM_MAX(other.m_min[0], m_min[0]); - intersection.m_min[1] = GIM_MAX(other.m_min[1], m_min[1]); - intersection.m_min[2] = GIM_MAX(other.m_min[2], m_min[2]); - - intersection.m_max[0] = GIM_MIN(other.m_max[0], m_max[0]); - intersection.m_max[1] = GIM_MIN(other.m_max[1], m_max[1]); - intersection.m_max[2] = GIM_MIN(other.m_max[2], m_max[2]); - } - - SIMD_FORCE_INLINE bool has_collision(const GIM_AABB &other) const - { - if (m_min[0] > other.m_max[0] || - m_max[0] < other.m_min[0] || - m_min[1] > other.m_max[1] || - m_max[1] < other.m_min[1] || - m_min[2] > other.m_max[2] || - m_max[2] < other.m_min[2]) - { - return false; - } - return true; - } - - /*! \brief Finds the Ray intersection parameter. - \param aabb Aligned box - \param vorigin A vec3f with the origin of the ray - \param vdir A vec3f with the direction of the ray - */ - SIMD_FORCE_INLINE bool collide_ray(const btVector3 &vorigin, const btVector3 &vdir) - { - btVector3 extents, center; - this->get_center_extend(center, extents); - ; - - btScalar Dx = vorigin[0] - center[0]; - if (GIM_GREATER(Dx, extents[0]) && Dx * vdir[0] >= 0.0f) return false; - btScalar Dy = vorigin[1] - center[1]; - if (GIM_GREATER(Dy, extents[1]) && Dy * vdir[1] >= 0.0f) return false; - btScalar Dz = vorigin[2] - center[2]; - if (GIM_GREATER(Dz, extents[2]) && Dz * vdir[2] >= 0.0f) return false; - - btScalar f = vdir[1] * Dz - vdir[2] * Dy; - if (btFabs(f) > extents[1] * btFabs(vdir[2]) + extents[2] * btFabs(vdir[1])) return false; - f = vdir[2] * Dx - vdir[0] * Dz; - if (btFabs(f) > extents[0] * btFabs(vdir[2]) + extents[2] * btFabs(vdir[0])) return false; - f = vdir[0] * Dy - vdir[1] * Dx; - if (btFabs(f) > extents[0] * btFabs(vdir[1]) + extents[1] * btFabs(vdir[0])) return false; - return true; - } - - SIMD_FORCE_INLINE void projection_interval(const btVector3 &direction, btScalar &vmin, btScalar &vmax) const - { - btVector3 center = (m_max + m_min) * 0.5f; - btVector3 extend = m_max - center; - - btScalar _fOrigin = direction.dot(center); - btScalar _fMaximumExtent = extend.dot(direction.absolute()); - vmin = _fOrigin - _fMaximumExtent; - vmax = _fOrigin + _fMaximumExtent; - } - - SIMD_FORCE_INLINE ePLANE_INTERSECTION_TYPE plane_classify(const btVector4 &plane) const - { - btScalar _fmin, _fmax; - this->projection_interval(plane, _fmin, _fmax); - - if (plane[3] > _fmax + BOX_PLANE_EPSILON) - { - return G_BACK_PLANE; // 0 - } - - if (plane[3] + BOX_PLANE_EPSILON >= _fmin) - { - return G_COLLIDE_PLANE; //1 - } - return G_FRONT_PLANE; //2 - } - - SIMD_FORCE_INLINE bool overlapping_trans_conservative(const GIM_AABB &box, btTransform &trans1_to_0) - { - GIM_AABB tbox = box; - tbox.appy_transform(trans1_to_0); - return has_collision(tbox); - } - - //! transcache is the transformation cache from box to this AABB - SIMD_FORCE_INLINE bool overlapping_trans_cache( - const GIM_AABB &box, const GIM_BOX_BOX_TRANSFORM_CACHE &transcache, bool fulltest) - { - //Taken from OPCODE - btVector3 ea, eb; //extends - btVector3 ca, cb; //extends - get_center_extend(ca, ea); - box.get_center_extend(cb, eb); - - btVector3 T; - btScalar t, t2; - int i; - - // Class I : A's basis vectors - for (i = 0; i < 3; i++) - { - T[i] = transcache.m_R1to0[i].dot(cb) + transcache.m_T1to0[i] - ca[i]; - t = transcache.m_AR[i].dot(eb) + ea[i]; - if (GIM_GREATER(T[i], t)) return false; - } - // Class II : B's basis vectors - for (i = 0; i < 3; i++) - { - t = MAT_DOT_COL(transcache.m_R1to0, T, i); - t2 = MAT_DOT_COL(transcache.m_AR, ea, i) + eb[i]; - if (GIM_GREATER(t, t2)) return false; - } - // Class III : 9 cross products - if (fulltest) - { - int j, m, n, o, p, q, r; - for (i = 0; i < 3; i++) - { - m = (i + 1) % 3; - n = (i + 2) % 3; - o = i == 0 ? 1 : 0; - p = i == 2 ? 1 : 2; - for (j = 0; j < 3; j++) - { - q = j == 2 ? 1 : 2; - r = j == 0 ? 1 : 0; - t = T[n] * transcache.m_R1to0[m][j] - T[m] * transcache.m_R1to0[n][j]; - t2 = ea[o] * transcache.m_AR[p][j] + ea[p] * transcache.m_AR[o][j] + - eb[r] * transcache.m_AR[i][q] + eb[q] * transcache.m_AR[i][r]; - if (GIM_GREATER(t, t2)) return false; - } - } - } - return true; - } - - //! Simple test for planes. - SIMD_FORCE_INLINE bool collide_plane( - const btVector4 &plane) - { - ePLANE_INTERSECTION_TYPE classify = plane_classify(plane); - return (classify == G_COLLIDE_PLANE); - } - - //! test for a triangle, with edges - SIMD_FORCE_INLINE bool collide_triangle_exact( - const btVector3 &p1, - const btVector3 &p2, - const btVector3 &p3, - const btVector4 &triangle_plane) - { - if (!collide_plane(triangle_plane)) return false; - - btVector3 center, extends; - this->get_center_extend(center, extends); - - const btVector3 v1(p1 - center); - const btVector3 v2(p2 - center); - const btVector3 v3(p3 - center); - - //First axis - btVector3 diff(v2 - v1); - btVector3 abs_diff = diff.absolute(); - //Test With X axis - TEST_CROSS_EDGE_BOX_X_AXIS_MCR(diff, abs_diff, v1, v3, extends); - //Test With Y axis - TEST_CROSS_EDGE_BOX_Y_AXIS_MCR(diff, abs_diff, v1, v3, extends); - //Test With Z axis - TEST_CROSS_EDGE_BOX_Z_AXIS_MCR(diff, abs_diff, v1, v3, extends); - - diff = v3 - v2; - abs_diff = diff.absolute(); - //Test With X axis - TEST_CROSS_EDGE_BOX_X_AXIS_MCR(diff, abs_diff, v2, v1, extends); - //Test With Y axis - TEST_CROSS_EDGE_BOX_Y_AXIS_MCR(diff, abs_diff, v2, v1, extends); - //Test With Z axis - TEST_CROSS_EDGE_BOX_Z_AXIS_MCR(diff, abs_diff, v2, v1, extends); - - diff = v1 - v3; - abs_diff = diff.absolute(); - //Test With X axis - TEST_CROSS_EDGE_BOX_X_AXIS_MCR(diff, abs_diff, v3, v2, extends); - //Test With Y axis - TEST_CROSS_EDGE_BOX_Y_AXIS_MCR(diff, abs_diff, v3, v2, extends); - //Test With Z axis - TEST_CROSS_EDGE_BOX_Z_AXIS_MCR(diff, abs_diff, v3, v2, extends); - - return true; - } -}; - -#ifndef BT_BOX_COLLISION_H_INCLUDED -//! Compairison of transformation objects -SIMD_FORCE_INLINE bool btCompareTransformsEqual(const btTransform &t1, const btTransform &t2) -{ - if (!(t1.getOrigin() == t2.getOrigin())) return false; - - if (!(t1.getBasis().getRow(0) == t2.getBasis().getRow(0))) return false; - if (!(t1.getBasis().getRow(1) == t2.getBasis().getRow(1))) return false; - if (!(t1.getBasis().getRow(2) == t2.getBasis().getRow(2))) return false; - return true; -} -#endif - -#endif // GIM_BOX_COLLISION_H_INCLUDED diff --git a/engine/inc/bullet/BulletCollision/Gimpact/gim_box_set.h b/engine/inc/bullet/BulletCollision/Gimpact/gim_box_set.h deleted file mode 100644 index afc591da..00000000 --- a/engine/inc/bullet/BulletCollision/Gimpact/gim_box_set.h +++ /dev/null @@ -1,640 +0,0 @@ -#ifndef GIM_BOX_SET_H_INCLUDED -#define GIM_BOX_SET_H_INCLUDED - -/*! \file gim_box_set.h -\author Francisco Leon Najera -*/ -/* ------------------------------------------------------------------------------ -This source file is part of GIMPACT Library. - -For the latest info, see http://gimpact.sourceforge.net/ - -Copyright (c) 2006 Francisco Leon Najera. C.C. 80087371. -email: projectileman@yahoo.com - - This library is free software; you can redistribute it and/or - modify it under the terms of EITHER: - (1) The GNU Lesser General Public License as published by the Free - Software Foundation; either version 2.1 of the License, or (at - your option) any later version. The text of the GNU Lesser - General Public License is included with this library in the - file GIMPACT-LICENSE-LGPL.TXT. - (2) The BSD-style license that is included with this library in - the file GIMPACT-LICENSE-BSD.TXT. - (3) The zlib/libpng license that is included with this library in - the file GIMPACT-LICENSE-ZLIB.TXT. - - This library 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 files - GIMPACT-LICENSE-LGPL.TXT, GIMPACT-LICENSE-ZLIB.TXT and GIMPACT-LICENSE-BSD.TXT for more details. - ------------------------------------------------------------------------------ -*/ - -#include "gim_array.h" -#include "gim_radixsort.h" -#include "gim_box_collision.h" -#include "gim_tri_collision.h" -#include "gim_pair.h" - -//! A pairset array -class gim_pair_set : public gim_array -{ -public: - gim_pair_set() : gim_array(32) - { - } - inline void push_pair(GUINT index1, GUINT index2) - { - push_back(GIM_PAIR(index1, index2)); - } - - inline void push_pair_inv(GUINT index1, GUINT index2) - { - push_back(GIM_PAIR(index2, index1)); - } -}; - -//! Prototype Base class for primitive classification -/*! -This class is a wrapper for primitive collections. -This tells relevant info for the Bounding Box set classes, which take care of space classification. -This class can manage Compound shapes and trimeshes, and if it is managing trimesh then the Hierarchy Bounding Box classes will take advantage of primitive Vs Box overlapping tests for getting optimal results and less Per Box compairisons. -*/ -class GIM_PRIMITIVE_MANAGER_PROTOTYPE -{ -public: - virtual ~GIM_PRIMITIVE_MANAGER_PROTOTYPE() {} - //! determines if this manager consist on only triangles, which special case will be optimized - virtual bool is_trimesh() = 0; - virtual GUINT get_primitive_count() = 0; - virtual void get_primitive_box(GUINT prim_index, GIM_AABB& primbox) = 0; - virtual void get_primitive_triangle(GUINT prim_index, GIM_TRIANGLE& triangle) = 0; -}; - -struct GIM_AABB_DATA -{ - GIM_AABB m_bound; - GUINT m_data; -}; - -//! Node Structure for trees -struct GIM_BOX_TREE_NODE -{ - GIM_AABB m_bound; - GUINT m_left; //!< Left subtree - GUINT m_right; //!< Right subtree - GUINT m_escapeIndex; //!< Scape index for traversing - GUINT m_data; //!< primitive index if apply - - GIM_BOX_TREE_NODE() - { - m_left = 0; - m_right = 0; - m_escapeIndex = 0; - m_data = 0; - } - - SIMD_FORCE_INLINE bool is_leaf_node() const - { - return (!m_left && !m_right); - } -}; - -//! Basic Box tree structure -class GIM_BOX_TREE -{ -protected: - GUINT m_num_nodes; - gim_array m_node_array; - -protected: - GUINT _sort_and_calc_splitting_index( - gim_array& primitive_boxes, - GUINT startIndex, GUINT endIndex, GUINT splitAxis); - - GUINT _calc_splitting_axis(gim_array& primitive_boxes, GUINT startIndex, GUINT endIndex); - - void _build_sub_tree(gim_array& primitive_boxes, GUINT startIndex, GUINT endIndex); - -public: - GIM_BOX_TREE() - { - m_num_nodes = 0; - } - - //! prototype functions for box tree management - //!@{ - void build_tree(gim_array& primitive_boxes); - - SIMD_FORCE_INLINE void clearNodes() - { - m_node_array.clear(); - m_num_nodes = 0; - } - - //! node count - SIMD_FORCE_INLINE GUINT getNodeCount() const - { - return m_num_nodes; - } - - //! tells if the node is a leaf - SIMD_FORCE_INLINE bool isLeafNode(GUINT nodeindex) const - { - return m_node_array[nodeindex].is_leaf_node(); - } - - SIMD_FORCE_INLINE GUINT getNodeData(GUINT nodeindex) const - { - return m_node_array[nodeindex].m_data; - } - - SIMD_FORCE_INLINE void getNodeBound(GUINT nodeindex, GIM_AABB& bound) const - { - bound = m_node_array[nodeindex].m_bound; - } - - SIMD_FORCE_INLINE void setNodeBound(GUINT nodeindex, const GIM_AABB& bound) - { - m_node_array[nodeindex].m_bound = bound; - } - - SIMD_FORCE_INLINE GUINT getLeftNodeIndex(GUINT nodeindex) const - { - return m_node_array[nodeindex].m_left; - } - - SIMD_FORCE_INLINE GUINT getRightNodeIndex(GUINT nodeindex) const - { - return m_node_array[nodeindex].m_right; - } - - SIMD_FORCE_INLINE GUINT getScapeNodeIndex(GUINT nodeindex) const - { - return m_node_array[nodeindex].m_escapeIndex; - } - - //!@} -}; - -//! Generic Box Tree Template -/*! -This class offers an structure for managing a box tree of primitives. -Requires a Primitive prototype (like GIM_PRIMITIVE_MANAGER_PROTOTYPE ) and -a Box tree structure ( like GIM_BOX_TREE). -*/ -template -class GIM_BOX_TREE_TEMPLATE_SET -{ -protected: - _GIM_PRIMITIVE_MANAGER_PROTOTYPE m_primitive_manager; - _GIM_BOX_TREE_PROTOTYPE m_box_tree; - -protected: - //stackless refit - SIMD_FORCE_INLINE void refit() - { - GUINT nodecount = getNodeCount(); - while (nodecount--) - { - if (isLeafNode(nodecount)) - { - GIM_AABB leafbox; - m_primitive_manager.get_primitive_box(getNodeData(nodecount), leafbox); - setNodeBound(nodecount, leafbox); - } - else - { - //get left bound - GUINT childindex = getLeftNodeIndex(nodecount); - GIM_AABB bound; - getNodeBound(childindex, bound); - //get right bound - childindex = getRightNodeIndex(nodecount); - GIM_AABB bound2; - getNodeBound(childindex, bound2); - bound.merge(bound2); - - setNodeBound(nodecount, bound); - } - } - } - -public: - GIM_BOX_TREE_TEMPLATE_SET() - { - } - - SIMD_FORCE_INLINE GIM_AABB getGlobalBox() const - { - GIM_AABB totalbox; - getNodeBound(0, totalbox); - return totalbox; - } - - SIMD_FORCE_INLINE void setPrimitiveManager(const _GIM_PRIMITIVE_MANAGER_PROTOTYPE& primitive_manager) - { - m_primitive_manager = primitive_manager; - } - - const _GIM_PRIMITIVE_MANAGER_PROTOTYPE& getPrimitiveManager() const - { - return m_primitive_manager; - } - - _GIM_PRIMITIVE_MANAGER_PROTOTYPE& getPrimitiveManager() - { - return m_primitive_manager; - } - - //! node manager prototype functions - ///@{ - - //! this attemps to refit the box set. - SIMD_FORCE_INLINE void update() - { - refit(); - } - - //! this rebuild the entire set - SIMD_FORCE_INLINE void buildSet() - { - //obtain primitive boxes - gim_array primitive_boxes; - primitive_boxes.resize(m_primitive_manager.get_primitive_count(), false); - - for (GUINT i = 0; i < primitive_boxes.size(); i++) - { - m_primitive_manager.get_primitive_box(i, primitive_boxes[i].m_bound); - primitive_boxes[i].m_data = i; - } - - m_box_tree.build_tree(primitive_boxes); - } - - //! returns the indices of the primitives in the m_primitive_manager - SIMD_FORCE_INLINE bool boxQuery(const GIM_AABB& box, gim_array& collided_results) const - { - GUINT curIndex = 0; - GUINT numNodes = getNodeCount(); - - while (curIndex < numNodes) - { - GIM_AABB bound; - getNodeBound(curIndex, bound); - - //catch bugs in tree data - - bool aabbOverlap = bound.has_collision(box); - bool isleafnode = isLeafNode(curIndex); - - if (isleafnode && aabbOverlap) - { - collided_results.push_back(getNodeData(curIndex)); - } - - if (aabbOverlap || isleafnode) - { - //next subnode - curIndex++; - } - else - { - //skip node - curIndex += getScapeNodeIndex(curIndex); - } - } - if (collided_results.size() > 0) return true; - return false; - } - - //! returns the indices of the primitives in the m_primitive_manager - SIMD_FORCE_INLINE bool boxQueryTrans(const GIM_AABB& box, - const btTransform& transform, gim_array& collided_results) const - { - GIM_AABB transbox = box; - transbox.appy_transform(transform); - return boxQuery(transbox, collided_results); - } - - //! returns the indices of the primitives in the m_primitive_manager - SIMD_FORCE_INLINE bool rayQuery( - const btVector3& ray_dir, const btVector3& ray_origin, - gim_array& collided_results) const - { - GUINT curIndex = 0; - GUINT numNodes = getNodeCount(); - - while (curIndex < numNodes) - { - GIM_AABB bound; - getNodeBound(curIndex, bound); - - //catch bugs in tree data - - bool aabbOverlap = bound.collide_ray(ray_origin, ray_dir); - bool isleafnode = isLeafNode(curIndex); - - if (isleafnode && aabbOverlap) - { - collided_results.push_back(getNodeData(curIndex)); - } - - if (aabbOverlap || isleafnode) - { - //next subnode - curIndex++; - } - else - { - //skip node - curIndex += getScapeNodeIndex(curIndex); - } - } - if (collided_results.size() > 0) return true; - return false; - } - - //! tells if this set has hierarcht - SIMD_FORCE_INLINE bool hasHierarchy() const - { - return true; - } - - //! tells if this set is a trimesh - SIMD_FORCE_INLINE bool isTrimesh() const - { - return m_primitive_manager.is_trimesh(); - } - - //! node count - SIMD_FORCE_INLINE GUINT getNodeCount() const - { - return m_box_tree.getNodeCount(); - } - - //! tells if the node is a leaf - SIMD_FORCE_INLINE bool isLeafNode(GUINT nodeindex) const - { - return m_box_tree.isLeafNode(nodeindex); - } - - SIMD_FORCE_INLINE GUINT getNodeData(GUINT nodeindex) const - { - return m_box_tree.getNodeData(nodeindex); - } - - SIMD_FORCE_INLINE void getNodeBound(GUINT nodeindex, GIM_AABB& bound) const - { - m_box_tree.getNodeBound(nodeindex, bound); - } - - SIMD_FORCE_INLINE void setNodeBound(GUINT nodeindex, const GIM_AABB& bound) - { - m_box_tree.setNodeBound(nodeindex, bound); - } - - SIMD_FORCE_INLINE GUINT getLeftNodeIndex(GUINT nodeindex) const - { - return m_box_tree.getLeftNodeIndex(nodeindex); - } - - SIMD_FORCE_INLINE GUINT getRightNodeIndex(GUINT nodeindex) const - { - return m_box_tree.getRightNodeIndex(nodeindex); - } - - SIMD_FORCE_INLINE GUINT getScapeNodeIndex(GUINT nodeindex) const - { - return m_box_tree.getScapeNodeIndex(nodeindex); - } - - SIMD_FORCE_INLINE void getNodeTriangle(GUINT nodeindex, GIM_TRIANGLE& triangle) const - { - m_primitive_manager.get_primitive_triangle(getNodeData(nodeindex), triangle); - } -}; - -//! Class for Box Tree Sets -/*! -this has the GIM_BOX_TREE implementation for bounding boxes. -*/ -template -class GIM_BOX_TREE_SET : public GIM_BOX_TREE_TEMPLATE_SET<_GIM_PRIMITIVE_MANAGER_PROTOTYPE, GIM_BOX_TREE> -{ -public: -}; - -/// GIM_BOX_SET collision methods -template -class GIM_TREE_TREE_COLLIDER -{ -public: - gim_pair_set* m_collision_pairs; - BOX_SET_CLASS0* m_boxset0; - BOX_SET_CLASS1* m_boxset1; - GUINT current_node0; - GUINT current_node1; - bool node0_is_leaf; - bool node1_is_leaf; - bool t0_is_trimesh; - bool t1_is_trimesh; - bool node0_has_triangle; - bool node1_has_triangle; - GIM_AABB m_box0; - GIM_AABB m_box1; - GIM_BOX_BOX_TRANSFORM_CACHE trans_cache_1to0; - btTransform trans_cache_0to1; - GIM_TRIANGLE m_tri0; - btVector4 m_tri0_plane; - GIM_TRIANGLE m_tri1; - btVector4 m_tri1_plane; - -public: - GIM_TREE_TREE_COLLIDER() - { - current_node0 = G_UINT_INFINITY; - current_node1 = G_UINT_INFINITY; - } - -protected: - SIMD_FORCE_INLINE void retrieve_node0_triangle(GUINT node0) - { - if (node0_has_triangle) return; - m_boxset0->getNodeTriangle(node0, m_tri0); - //transform triangle - m_tri0.m_vertices[0] = trans_cache_0to1(m_tri0.m_vertices[0]); - m_tri0.m_vertices[1] = trans_cache_0to1(m_tri0.m_vertices[1]); - m_tri0.m_vertices[2] = trans_cache_0to1(m_tri0.m_vertices[2]); - m_tri0.get_plane(m_tri0_plane); - - node0_has_triangle = true; - } - - SIMD_FORCE_INLINE void retrieve_node1_triangle(GUINT node1) - { - if (node1_has_triangle) return; - m_boxset1->getNodeTriangle(node1, m_tri1); - //transform triangle - m_tri1.m_vertices[0] = trans_cache_1to0.transform(m_tri1.m_vertices[0]); - m_tri1.m_vertices[1] = trans_cache_1to0.transform(m_tri1.m_vertices[1]); - m_tri1.m_vertices[2] = trans_cache_1to0.transform(m_tri1.m_vertices[2]); - m_tri1.get_plane(m_tri1_plane); - - node1_has_triangle = true; - } - - SIMD_FORCE_INLINE void retrieve_node0_info(GUINT node0) - { - if (node0 == current_node0) return; - m_boxset0->getNodeBound(node0, m_box0); - node0_is_leaf = m_boxset0->isLeafNode(node0); - node0_has_triangle = false; - current_node0 = node0; - } - - SIMD_FORCE_INLINE void retrieve_node1_info(GUINT node1) - { - if (node1 == current_node1) return; - m_boxset1->getNodeBound(node1, m_box1); - node1_is_leaf = m_boxset1->isLeafNode(node1); - node1_has_triangle = false; - current_node1 = node1; - } - - SIMD_FORCE_INLINE bool node_collision(GUINT node0, GUINT node1) - { - retrieve_node0_info(node0); - retrieve_node1_info(node1); - bool result = m_box0.overlapping_trans_cache(m_box1, trans_cache_1to0, true); - if (!result) return false; - - if (t0_is_trimesh && node0_is_leaf) - { - //perform primitive vs box collision - retrieve_node0_triangle(node0); - //do triangle vs box collision - m_box1.increment_margin(m_tri0.m_margin); - - result = m_box1.collide_triangle_exact( - m_tri0.m_vertices[0], m_tri0.m_vertices[1], m_tri0.m_vertices[2], m_tri0_plane); - - m_box1.increment_margin(-m_tri0.m_margin); - - if (!result) return false; - return true; - } - else if (t1_is_trimesh && node1_is_leaf) - { - //perform primitive vs box collision - retrieve_node1_triangle(node1); - //do triangle vs box collision - m_box0.increment_margin(m_tri1.m_margin); - - result = m_box0.collide_triangle_exact( - m_tri1.m_vertices[0], m_tri1.m_vertices[1], m_tri1.m_vertices[2], m_tri1_plane); - - m_box0.increment_margin(-m_tri1.m_margin); - - if (!result) return false; - return true; - } - return true; - } - - //stackless collision routine - void find_collision_pairs() - { - gim_pair_set stack_collisions; - stack_collisions.reserve(32); - - //add the first pair - stack_collisions.push_pair(0, 0); - - while (stack_collisions.size()) - { - //retrieve the last pair and pop - GUINT node0 = stack_collisions.back().m_index1; - GUINT node1 = stack_collisions.back().m_index2; - stack_collisions.pop_back(); - if (node_collision(node0, node1)) // a collision is found - { - if (node0_is_leaf) - { - if (node1_is_leaf) - { - m_collision_pairs->push_pair(m_boxset0->getNodeData(node0), m_boxset1->getNodeData(node1)); - } - else - { - //collide left - stack_collisions.push_pair(node0, m_boxset1->getLeftNodeIndex(node1)); - - //collide right - stack_collisions.push_pair(node0, m_boxset1->getRightNodeIndex(node1)); - } - } - else - { - if (node1_is_leaf) - { - //collide left - stack_collisions.push_pair(m_boxset0->getLeftNodeIndex(node0), node1); - //collide right - stack_collisions.push_pair(m_boxset0->getRightNodeIndex(node0), node1); - } - else - { - GUINT left0 = m_boxset0->getLeftNodeIndex(node0); - GUINT right0 = m_boxset0->getRightNodeIndex(node0); - GUINT left1 = m_boxset1->getLeftNodeIndex(node1); - GUINT right1 = m_boxset1->getRightNodeIndex(node1); - //collide left - stack_collisions.push_pair(left0, left1); - //collide right - stack_collisions.push_pair(left0, right1); - //collide left - stack_collisions.push_pair(right0, left1); - //collide right - stack_collisions.push_pair(right0, right1); - - } // else if node1 is not a leaf - } // else if node0 is not a leaf - - } // if(node_collision(node0,node1)) - } //while(stack_collisions.size()) - } - -public: - void find_collision(BOX_SET_CLASS0* boxset1, const btTransform& trans1, - BOX_SET_CLASS1* boxset2, const btTransform& trans2, - gim_pair_set& collision_pairs, bool complete_primitive_tests = true) - { - m_collision_pairs = &collision_pairs; - m_boxset0 = boxset1; - m_boxset1 = boxset2; - - trans_cache_1to0.calc_from_homogenic(trans1, trans2); - - trans_cache_0to1 = trans2.inverse(); - trans_cache_0to1 *= trans1; - - if (complete_primitive_tests) - { - t0_is_trimesh = boxset1->getPrimitiveManager().is_trimesh(); - t1_is_trimesh = boxset2->getPrimitiveManager().is_trimesh(); - } - else - { - t0_is_trimesh = false; - t1_is_trimesh = false; - } - - find_collision_pairs(); - } -}; - -#endif // GIM_BOXPRUNING_H_INCLUDED diff --git a/engine/inc/bullet/BulletCollision/Gimpact/gim_clip_polygon.h b/engine/inc/bullet/BulletCollision/Gimpact/gim_clip_polygon.h deleted file mode 100644 index 57b9c5c9..00000000 --- a/engine/inc/bullet/BulletCollision/Gimpact/gim_clip_polygon.h +++ /dev/null @@ -1,199 +0,0 @@ -#ifndef GIM_CLIP_POLYGON_H_INCLUDED -#define GIM_CLIP_POLYGON_H_INCLUDED - -/*! \file gim_tri_collision.h -\author Francisco Leon Najera -*/ -/* ------------------------------------------------------------------------------ -This source file is part of GIMPACT Library. - -For the latest info, see http://gimpact.sourceforge.net/ - -Copyright (c) 2006 Francisco Leon Najera. C.C. 80087371. -email: projectileman@yahoo.com - - This library is free software; you can redistribute it and/or - modify it under the terms of EITHER: - (1) The GNU Lesser General Public License as published by the Free - Software Foundation; either version 2.1 of the License, or (at - your option) any later version. The text of the GNU Lesser - General Public License is included with this library in the - file GIMPACT-LICENSE-LGPL.TXT. - (2) The BSD-style license that is included with this library in - the file GIMPACT-LICENSE-BSD.TXT. - (3) The zlib/libpng license that is included with this library in - the file GIMPACT-LICENSE-ZLIB.TXT. - - This library 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 files - GIMPACT-LICENSE-LGPL.TXT, GIMPACT-LICENSE-ZLIB.TXT and GIMPACT-LICENSE-BSD.TXT for more details. - ------------------------------------------------------------------------------ -*/ - -//! This function calcs the distance from a 3D plane -class DISTANCE_PLANE_3D_FUNC -{ -public: - template - inline GREAL operator()(const CLASS_PLANE& plane, const CLASS_POINT& point) - { - return DISTANCE_PLANE_POINT(plane, point); - } -}; - -template -SIMD_FORCE_INLINE void PLANE_CLIP_POLYGON_COLLECT( - const CLASS_POINT& point0, - const CLASS_POINT& point1, - GREAL dist0, - GREAL dist1, - CLASS_POINT* clipped, - GUINT& clipped_count) -{ - GUINT _prevclassif = (dist0 > G_EPSILON); - GUINT _classif = (dist1 > G_EPSILON); - if (_classif != _prevclassif) - { - GREAL blendfactor = -dist0 / (dist1 - dist0); - VEC_BLEND(clipped[clipped_count], point0, point1, blendfactor); - clipped_count++; - } - if (!_classif) - { - VEC_COPY(clipped[clipped_count], point1); - clipped_count++; - } -} - -//! Clips a polygon by a plane -/*! -*\return The count of the clipped counts -*/ -template -SIMD_FORCE_INLINE GUINT PLANE_CLIP_POLYGON_GENERIC( - const CLASS_PLANE& plane, - const CLASS_POINT* polygon_points, - GUINT polygon_point_count, - CLASS_POINT* clipped, DISTANCE_PLANE_FUNC distance_func) -{ - GUINT clipped_count = 0; - - //clip first point - GREAL firstdist = distance_func(plane, polygon_points[0]); - ; - if (!(firstdist > G_EPSILON)) - { - VEC_COPY(clipped[clipped_count], polygon_points[0]); - clipped_count++; - } - - GREAL olddist = firstdist; - for (GUINT _i = 1; _i < polygon_point_count; _i++) - { - GREAL dist = distance_func(plane, polygon_points[_i]); - - PLANE_CLIP_POLYGON_COLLECT( - polygon_points[_i - 1], polygon_points[_i], - olddist, - dist, - clipped, - clipped_count); - - olddist = dist; - } - - //RETURN TO FIRST point - - PLANE_CLIP_POLYGON_COLLECT( - polygon_points[polygon_point_count - 1], polygon_points[0], - olddist, - firstdist, - clipped, - clipped_count); - - return clipped_count; -} - -//! Clips a polygon by a plane -/*! -*\return The count of the clipped counts -*/ -template -SIMD_FORCE_INLINE GUINT PLANE_CLIP_TRIANGLE_GENERIC( - const CLASS_PLANE& plane, - const CLASS_POINT& point0, - const CLASS_POINT& point1, - const CLASS_POINT& point2, - CLASS_POINT* clipped, DISTANCE_PLANE_FUNC distance_func) -{ - GUINT clipped_count = 0; - - //clip first point - GREAL firstdist = distance_func(plane, point0); - ; - if (!(firstdist > G_EPSILON)) - { - VEC_COPY(clipped[clipped_count], point0); - clipped_count++; - } - - // point 1 - GREAL olddist = firstdist; - GREAL dist = distance_func(plane, point1); - - PLANE_CLIP_POLYGON_COLLECT( - point0, point1, - olddist, - dist, - clipped, - clipped_count); - - olddist = dist; - - // point 2 - dist = distance_func(plane, point2); - - PLANE_CLIP_POLYGON_COLLECT( - point1, point2, - olddist, - dist, - clipped, - clipped_count); - olddist = dist; - - //RETURN TO FIRST point - PLANE_CLIP_POLYGON_COLLECT( - point2, point0, - olddist, - firstdist, - clipped, - clipped_count); - - return clipped_count; -} - -template -SIMD_FORCE_INLINE GUINT PLANE_CLIP_POLYGON3D( - const CLASS_PLANE& plane, - const CLASS_POINT* polygon_points, - GUINT polygon_point_count, - CLASS_POINT* clipped) -{ - return PLANE_CLIP_POLYGON_GENERIC(plane, polygon_points, polygon_point_count, clipped, DISTANCE_PLANE_3D_FUNC()); -} - -template -SIMD_FORCE_INLINE GUINT PLANE_CLIP_TRIANGLE3D( - const CLASS_PLANE& plane, - const CLASS_POINT& point0, - const CLASS_POINT& point1, - const CLASS_POINT& point2, - CLASS_POINT* clipped) -{ - return PLANE_CLIP_TRIANGLE_GENERIC(plane, point0, point1, point2, clipped, DISTANCE_PLANE_3D_FUNC()); -} - -#endif // GIM_TRI_COLLISION_H_INCLUDED diff --git a/engine/inc/bullet/BulletCollision/Gimpact/gim_contact.h b/engine/inc/bullet/BulletCollision/Gimpact/gim_contact.h deleted file mode 100644 index 9deb28a2..00000000 --- a/engine/inc/bullet/BulletCollision/Gimpact/gim_contact.h +++ /dev/null @@ -1,168 +0,0 @@ -#ifndef GIM_CONTACT_H_INCLUDED -#define GIM_CONTACT_H_INCLUDED - -/*! \file gim_contact.h -\author Francisco Leon Najera -*/ -/* ------------------------------------------------------------------------------ -This source file is part of GIMPACT Library. - -For the latest info, see http://gimpact.sourceforge.net/ - -Copyright (c) 2006 Francisco Leon Najera. C.C. 80087371. -email: projectileman@yahoo.com - - This library is free software; you can redistribute it and/or - modify it under the terms of EITHER: - (1) The GNU Lesser General Public License as published by the Free - Software Foundation; either version 2.1 of the License, or (at - your option) any later version. The text of the GNU Lesser - General Public License is included with this library in the - file GIMPACT-LICENSE-LGPL.TXT. - (2) The BSD-style license that is included with this library in - the file GIMPACT-LICENSE-BSD.TXT. - (3) The zlib/libpng license that is included with this library in - the file GIMPACT-LICENSE-ZLIB.TXT. - - This library 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 files - GIMPACT-LICENSE-LGPL.TXT, GIMPACT-LICENSE-ZLIB.TXT and GIMPACT-LICENSE-BSD.TXT for more details. - ------------------------------------------------------------------------------ -*/ -#include "gim_geometry.h" -#include "gim_radixsort.h" -#include "gim_array.h" - -/** -Configuration var for applying interpolation of contact normals -*/ -#ifndef NORMAL_CONTACT_AVERAGE -#define NORMAL_CONTACT_AVERAGE 1 -#endif - -#ifndef CONTACT_DIFF_EPSILON -#define CONTACT_DIFF_EPSILON 0.00001f -#endif - -#ifndef BT_CONTACT_H_STRUCTS_INCLUDED - -/// Structure for collision results -///Functions for managing and sorting contacts resulting from a collision query. -///Contact lists must be create by calling \ref GIM_CREATE_CONTACT_LIST -///After querys, contact lists must be destroy by calling \ref GIM_DYNARRAY_DESTROY -///Contacts can be merge for avoid duplicate results by calling \ref gim_merge_contacts -class GIM_CONTACT -{ -public: - btVector3 m_point; - btVector3 m_normal; - GREAL m_depth; //Positive value indicates interpenetration - GREAL m_distance; //Padding not for use - GUINT m_feature1; //Face number - GUINT m_feature2; //Face number -public: - GIM_CONTACT() - { - } - - GIM_CONTACT(const GIM_CONTACT &contact) : m_point(contact.m_point), - m_normal(contact.m_normal), - m_depth(contact.m_depth), - m_feature1(contact.m_feature1), - m_feature2(contact.m_feature2) - { - m_point = contact.m_point; - m_normal = contact.m_normal; - m_depth = contact.m_depth; - m_feature1 = contact.m_feature1; - m_feature2 = contact.m_feature2; - } - - GIM_CONTACT(const btVector3 &point, const btVector3 &normal, - GREAL depth, GUINT feature1, GUINT feature2) : m_point(point), - m_normal(normal), - m_depth(depth), - m_feature1(feature1), - m_feature2(feature2) - { - } - - //! Calcs key for coord classification - SIMD_FORCE_INLINE GUINT calc_key_contact() const - { - GINT _coords[] = { - (GINT)(m_point[0] * 1000.0f + 1.0f), - (GINT)(m_point[1] * 1333.0f), - (GINT)(m_point[2] * 2133.0f + 3.0f)}; - GUINT _hash = 0; - GUINT *_uitmp = (GUINT *)(&_coords[0]); - _hash = *_uitmp; - _uitmp++; - _hash += (*_uitmp) << 4; - _uitmp++; - _hash += (*_uitmp) << 8; - return _hash; - } - - SIMD_FORCE_INLINE void interpolate_normals(btVector3 *normals, GUINT normal_count) - { - btVector3 vec_sum(m_normal); - for (GUINT i = 0; i < normal_count; i++) - { - vec_sum += normals[i]; - } - - GREAL vec_sum_len = vec_sum.length2(); - if (vec_sum_len < CONTACT_DIFF_EPSILON) return; - - GIM_INV_SQRT(vec_sum_len, vec_sum_len); // 1/sqrt(vec_sum_len) - - m_normal = vec_sum * vec_sum_len; - } -}; - -#endif - -class gim_contact_array : public gim_array -{ -public: - gim_contact_array() : gim_array(64) - { - } - - SIMD_FORCE_INLINE void push_contact(const btVector3 &point, const btVector3 &normal, - GREAL depth, GUINT feature1, GUINT feature2) - { - push_back_mem(); - GIM_CONTACT &newele = back(); - newele.m_point = point; - newele.m_normal = normal; - newele.m_depth = depth; - newele.m_feature1 = feature1; - newele.m_feature2 = feature2; - } - - SIMD_FORCE_INLINE void push_triangle_contacts( - const GIM_TRIANGLE_CONTACT_DATA &tricontact, - GUINT feature1, GUINT feature2) - { - for (GUINT i = 0; i < tricontact.m_point_count; i++) - { - push_back_mem(); - GIM_CONTACT &newele = back(); - newele.m_point = tricontact.m_points[i]; - newele.m_normal = tricontact.m_separating_normal; - newele.m_depth = tricontact.m_penetration_depth; - newele.m_feature1 = feature1; - newele.m_feature2 = feature2; - } - } - - void merge_contacts(const gim_contact_array &contacts, bool normal_contact_average = true); - void merge_contacts_unique(const gim_contact_array &contacts); -}; - -#endif // GIM_CONTACT_H_INCLUDED diff --git a/engine/inc/bullet/BulletCollision/Gimpact/gim_geom_types.h b/engine/inc/bullet/BulletCollision/Gimpact/gim_geom_types.h deleted file mode 100644 index 9dc48f35..00000000 --- a/engine/inc/bullet/BulletCollision/Gimpact/gim_geom_types.h +++ /dev/null @@ -1,92 +0,0 @@ -#ifndef GIM_GEOM_TYPES_H_INCLUDED -#define GIM_GEOM_TYPES_H_INCLUDED - -/*! \file gim_geom_types.h -\author Francisco Leon Najera -*/ -/* ------------------------------------------------------------------------------ -This source file is part of GIMPACT Library. - -For the latest info, see http://gimpact.sourceforge.net/ - -Copyright (c) 2006 Francisco Leon Najera. C.C. 80087371. -email: projectileman@yahoo.com - - This library is free software; you can redistribute it and/or - modify it under the terms of EITHER: - (1) The GNU Lesser General Public License as published by the Free - Software Foundation; either version 2.1 of the License, or (at - your option) any later version. The text of the GNU Lesser - General Public License is included with this library in the - file GIMPACT-LICENSE-LGPL.TXT. - (2) The BSD-style license that is included with this library in - the file GIMPACT-LICENSE-BSD.TXT. - (3) The zlib/libpng license that is included with this library in - the file GIMPACT-LICENSE-ZLIB.TXT. - - This library 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 files - GIMPACT-LICENSE-LGPL.TXT, GIMPACT-LICENSE-ZLIB.TXT and GIMPACT-LICENSE-BSD.TXT for more details. - ------------------------------------------------------------------------------ -*/ - -#include "gim_math.h" - -//! Short Integer vector 2D -typedef GSHORT vec2s[2]; -//! Integer vector 3D -typedef GSHORT vec3s[3]; -//! Integer vector 4D -typedef GSHORT vec4s[4]; - -//! Short Integer vector 2D -typedef GUSHORT vec2us[2]; -//! Integer vector 3D -typedef GUSHORT vec3us[3]; -//! Integer vector 4D -typedef GUSHORT vec4us[4]; - -//! Integer vector 2D -typedef GINT vec2i[2]; -//! Integer vector 3D -typedef GINT vec3i[3]; -//! Integer vector 4D -typedef GINT vec4i[4]; - -//! Unsigned Integer vector 2D -typedef GUINT vec2ui[2]; -//! Unsigned Integer vector 3D -typedef GUINT vec3ui[3]; -//! Unsigned Integer vector 4D -typedef GUINT vec4ui[4]; - -//! Float vector 2D -typedef GREAL vec2f[2]; -//! Float vector 3D -typedef GREAL vec3f[3]; -//! Float vector 4D -typedef GREAL vec4f[4]; - -//! Double vector 2D -typedef GREAL2 vec2d[2]; -//! Float vector 3D -typedef GREAL2 vec3d[3]; -//! Float vector 4D -typedef GREAL2 vec4d[4]; - -//! Matrix 2D, row ordered -typedef GREAL mat2f[2][2]; -//! Matrix 3D, row ordered -typedef GREAL mat3f[3][3]; -//! Matrix 4D, row ordered -typedef GREAL mat4f[4][4]; - -//! Quaternion -typedef GREAL quatf[4]; - -//typedef struct _aabb3f aabb3f; - -#endif // GIM_GEOM_TYPES_H_INCLUDED diff --git a/engine/inc/bullet/BulletCollision/Gimpact/gim_geometry.h b/engine/inc/bullet/BulletCollision/Gimpact/gim_geometry.h deleted file mode 100644 index 4a7ac3c4..00000000 --- a/engine/inc/bullet/BulletCollision/Gimpact/gim_geometry.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef GIM_GEOMETRY_H_INCLUDED -#define GIM_GEOMETRY_H_INCLUDED - -/*! \file gim_geometry.h -\author Francisco Leon Najera -*/ -/* ------------------------------------------------------------------------------ -This source file is part of GIMPACT Library. - -For the latest info, see http://gimpact.sourceforge.net/ - -Copyright (c) 2006 Francisco Leon Najera. C.C. 80087371. -email: projectileman@yahoo.com - - This library is free software; you can redistribute it and/or - modify it under the terms of EITHER: - (1) The GNU Lesser General Public License as published by the Free - Software Foundation; either version 2.1 of the License, or (at - your option) any later version. The text of the GNU Lesser - General Public License is included with this library in the - file GIMPACT-LICENSE-LGPL.TXT. - (2) The BSD-style license that is included with this library in - the file GIMPACT-LICENSE-BSD.TXT. - (3) The zlib/libpng license that is included with this library in - the file GIMPACT-LICENSE-ZLIB.TXT. - - This library 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 files - GIMPACT-LICENSE-LGPL.TXT, GIMPACT-LICENSE-ZLIB.TXT and GIMPACT-LICENSE-BSD.TXT for more details. - ------------------------------------------------------------------------------ -*/ - -///Additional Headers for Collision -#include "gim_basic_geometry_operations.h" -#include "gim_clip_polygon.h" -#include "gim_box_collision.h" -#include "gim_tri_collision.h" - -#endif // GIM_VECTOR_H_INCLUDED diff --git a/engine/inc/bullet/BulletCollision/Gimpact/gim_hash_table.h b/engine/inc/bullet/BulletCollision/Gimpact/gim_hash_table.h deleted file mode 100644 index abf88d31..00000000 --- a/engine/inc/bullet/BulletCollision/Gimpact/gim_hash_table.h +++ /dev/null @@ -1,857 +0,0 @@ -#ifndef GIM_HASH_TABLE_H_INCLUDED -#define GIM_HASH_TABLE_H_INCLUDED -/*! \file gim_trimesh_data.h -\author Francisco Leon Najera -*/ -/* ------------------------------------------------------------------------------ -This source file is part of GIMPACT Library. - -For the latest info, see http://gimpact.sourceforge.net/ - -Copyright (c) 2006 Francisco Leon Najera. C.C. 80087371. -email: projectileman@yahoo.com - - This library is free software; you can redistribute it and/or - modify it under the terms of EITHER: - (1) The GNU Lesser General Public License as published by the Free - Software Foundation; either version 2.1 of the License, or (at - your option) any later version. The text of the GNU Lesser - General Public License is included with this library in the - file GIMPACT-LICENSE-LGPL.TXT. - (2) The BSD-style license that is included with this library in - the file GIMPACT-LICENSE-BSD.TXT. - (3) The zlib/libpng license that is included with this library in - the file GIMPACT-LICENSE-ZLIB.TXT. - - This library 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 files - GIMPACT-LICENSE-LGPL.TXT, GIMPACT-LICENSE-ZLIB.TXT and GIMPACT-LICENSE-BSD.TXT for more details. - ------------------------------------------------------------------------------ -*/ - -#include "gim_radixsort.h" - -#define GIM_INVALID_HASH 0xffffffff //!< A very very high value -#define GIM_DEFAULT_HASH_TABLE_SIZE 380 -#define GIM_DEFAULT_HASH_TABLE_NODE_SIZE 4 -#define GIM_HASH_TABLE_GROW_FACTOR 2 - -#define GIM_MIN_RADIX_SORT_SIZE 860 //!< calibrated on a PIII - -template -struct GIM_HASH_TABLE_NODE -{ - GUINT m_key; - T m_data; - GIM_HASH_TABLE_NODE() - { - } - - GIM_HASH_TABLE_NODE(const GIM_HASH_TABLE_NODE& value) - { - m_key = value.m_key; - m_data = value.m_data; - } - - GIM_HASH_TABLE_NODE(GUINT key, const T& data) - { - m_key = key; - m_data = data; - } - - bool operator<(const GIM_HASH_TABLE_NODE& other) const - { - ///inverse order, further objects are first - if (m_key < other.m_key) return true; - return false; - } - - bool operator>(const GIM_HASH_TABLE_NODE& other) const - { - ///inverse order, further objects are first - if (m_key > other.m_key) return true; - return false; - } - - bool operator==(const GIM_HASH_TABLE_NODE& other) const - { - ///inverse order, further objects are first - if (m_key == other.m_key) return true; - return false; - } -}; - -///Macro for getting the key -class GIM_HASH_NODE_GET_KEY -{ -public: - template - inline GUINT operator()(const T& a) - { - return a.m_key; - } -}; - -///Macro for comparing the key and the element -class GIM_HASH_NODE_CMP_KEY_MACRO -{ -public: - template - inline int operator()(const T& a, GUINT key) - { - return ((int)(a.m_key - key)); - } -}; - -///Macro for comparing Hash nodes -class GIM_HASH_NODE_CMP_MACRO -{ -public: - template - inline int operator()(const T& a, const T& b) - { - return ((int)(a.m_key - b.m_key)); - } -}; - -//! Sorting for hash table -/*! -switch automatically between quicksort and radixsort -*/ -template -void gim_sort_hash_node_array(T* array, GUINT array_count) -{ - if (array_count < GIM_MIN_RADIX_SORT_SIZE) - { - gim_heap_sort(array, array_count, GIM_HASH_NODE_CMP_MACRO()); - } - else - { - memcopy_elements_func cmpfunc; - gim_radix_sort(array, array_count, GIM_HASH_NODE_GET_KEY(), cmpfunc); - } -} - -// Note: assumes long is at least 32 bits. -#define GIM_NUM_PRIME 28 - -static const GUINT gim_prime_list[GIM_NUM_PRIME] = - { - 53ul, 97ul, 193ul, 389ul, 769ul, - 1543ul, 3079ul, 6151ul, 12289ul, 24593ul, - 49157ul, 98317ul, 196613ul, 393241ul, 786433ul, - 1572869ul, 3145739ul, 6291469ul, 12582917ul, 25165843ul, - 50331653ul, 100663319ul, 201326611ul, 402653189ul, 805306457ul, - 1610612741ul, 3221225473ul, 4294967291ul}; - -inline GUINT gim_next_prime(GUINT number) -{ - //Find nearest upper prime - GUINT result_ind = 0; - gim_binary_search(gim_prime_list, 0, (GIM_NUM_PRIME - 2), number, result_ind); - - // inv: result_ind < 28 - return gim_prime_list[result_ind]; -} - -//! A compact hash table implementation -/*! -A memory aligned compact hash table that coud be treated as an array. -It could be a simple sorted array without the overhead of the hash key bucked, or could -be a formely hash table with an array of keys. -You can use switch_to_hashtable() and switch_to_sorted_array for saving space or increase speed. -
- -
    -
  • if node_size = 0, then this container becomes a simple sorted array allocator. reserve_size is used for reserve memory in m_nodes. -When the array size reaches the size equivalent to 'min_hash_table_size', then it becomes a hash table by calling check_for_switching_to_hashtable. -
  • If node_size != 0, then this container becomes a hash table for ever -
- -*/ -template -class gim_hash_table -{ -protected: - typedef GIM_HASH_TABLE_NODE _node_type; - - //!The nodes - //array< _node_type, SuperAllocator<_node_type> > m_nodes; - gim_array<_node_type> m_nodes; - //SuperBufferedArray< _node_type > m_nodes; - bool m_sorted; - - ///Hash table data management. The hash table has the indices to the corresponding m_nodes array - GUINT* m_hash_table; //!< - GUINT m_table_size; //!< - GUINT m_node_size; //!< - GUINT m_min_hash_table_size; - - //! Returns the cell index - inline GUINT _find_cell(GUINT hashkey) - { - _node_type* nodesptr = m_nodes.pointer(); - GUINT start_index = (hashkey % m_table_size) * m_node_size; - GUINT end_index = start_index + m_node_size; - - while (start_index < end_index) - { - GUINT value = m_hash_table[start_index]; - if (value != GIM_INVALID_HASH) - { - if (nodesptr[value].m_key == hashkey) return start_index; - } - start_index++; - } - return GIM_INVALID_HASH; - } - - //! Find the avaliable cell for the hashkey, and return an existing cell if it has the same hash key - inline GUINT _find_avaliable_cell(GUINT hashkey) - { - _node_type* nodesptr = m_nodes.pointer(); - GUINT avaliable_index = GIM_INVALID_HASH; - GUINT start_index = (hashkey % m_table_size) * m_node_size; - GUINT end_index = start_index + m_node_size; - - while (start_index < end_index) - { - GUINT value = m_hash_table[start_index]; - if (value == GIM_INVALID_HASH) - { - if (avaliable_index == GIM_INVALID_HASH) - { - avaliable_index = start_index; - } - } - else if (nodesptr[value].m_key == hashkey) - { - return start_index; - } - start_index++; - } - return avaliable_index; - } - - //! reserves the memory for the hash table. - /*! - \pre hash table must be empty - \post reserves the memory for the hash table, an initializes all elements to GIM_INVALID_HASH. - */ - inline void _reserve_table_memory(GUINT newtablesize) - { - if (newtablesize == 0) return; - if (m_node_size == 0) return; - - //Get a Prime size - - m_table_size = gim_next_prime(newtablesize); - - GUINT datasize = m_table_size * m_node_size; - //Alloc the data buffer - m_hash_table = (GUINT*)gim_alloc(datasize * sizeof(GUINT)); - } - - inline void _invalidate_keys() - { - GUINT datasize = m_table_size * m_node_size; - for (GUINT i = 0; i < datasize; i++) - { - m_hash_table[i] = GIM_INVALID_HASH; // invalidate keys - } - } - - //! Clear all memory for the hash table - inline void _clear_table_memory() - { - if (m_hash_table == NULL) return; - gim_free(m_hash_table); - m_hash_table = NULL; - m_table_size = 0; - } - - //! Invalidates the keys (Assigning GIM_INVALID_HASH to all) Reorders the hash keys - inline void _rehash() - { - _invalidate_keys(); - - _node_type* nodesptr = m_nodes.pointer(); - for (GUINT i = 0; i < (GUINT)m_nodes.size(); i++) - { - GUINT nodekey = nodesptr[i].m_key; - if (nodekey != GIM_INVALID_HASH) - { - //Search for the avaliable cell in buffer - GUINT index = _find_avaliable_cell(nodekey); - - if (m_hash_table[index] != GIM_INVALID_HASH) - { //The new index is alreade used... discard this new incomming object, repeated key - btAssert(m_hash_table[index] == nodekey); - nodesptr[i].m_key = GIM_INVALID_HASH; - } - else - { - //; - //Assign the value for alloc - m_hash_table[index] = i; - } - } - } - } - - //! Resize hash table indices - inline void _resize_table(GUINT newsize) - { - //Clear memory - _clear_table_memory(); - //Alloc the data - _reserve_table_memory(newsize); - //Invalidate keys and rehash - _rehash(); - } - - //! Destroy hash table memory - inline void _destroy() - { - if (m_hash_table == NULL) return; - _clear_table_memory(); - } - - //! Finds an avaliable hash table cell, and resizes the table if there isn't space - inline GUINT _assign_hash_table_cell(GUINT hashkey) - { - GUINT cell_index = _find_avaliable_cell(hashkey); - - if (cell_index == GIM_INVALID_HASH) - { - //rehashing - _resize_table(m_table_size + 1); - GUINT cell_index = _find_avaliable_cell(hashkey); - btAssert(cell_index != GIM_INVALID_HASH); - } - return cell_index; - } - - //! erase by index in hash table - inline bool _erase_by_index_hash_table(GUINT index) - { - if (index >= m_nodes.size()) return false; - if (m_nodes[index].m_key != GIM_INVALID_HASH) - { - //Search for the avaliable cell in buffer - GUINT cell_index = _find_cell(m_nodes[index].m_key); - - btAssert(cell_index != GIM_INVALID_HASH); - btAssert(m_hash_table[cell_index] == index); - - m_hash_table[cell_index] = GIM_INVALID_HASH; - } - - return this->_erase_unsorted(index); - } - - //! erase by key in hash table - inline bool _erase_hash_table(GUINT hashkey) - { - if (hashkey == GIM_INVALID_HASH) return false; - - //Search for the avaliable cell in buffer - GUINT cell_index = _find_cell(hashkey); - if (cell_index == GIM_INVALID_HASH) return false; - - GUINT index = m_hash_table[cell_index]; - m_hash_table[cell_index] = GIM_INVALID_HASH; - - return this->_erase_unsorted(index); - } - - //! insert an element in hash table - /*! - If the element exists, this won't insert the element - \return the index in the array of the existing element,or GIM_INVALID_HASH if the element has been inserted - If so, the element has been inserted at the last position of the array. - */ - inline GUINT _insert_hash_table(GUINT hashkey, const T& value) - { - if (hashkey == GIM_INVALID_HASH) - { - //Insert anyway - _insert_unsorted(hashkey, value); - return GIM_INVALID_HASH; - } - - GUINT cell_index = _assign_hash_table_cell(hashkey); - - GUINT value_key = m_hash_table[cell_index]; - - if (value_key != GIM_INVALID_HASH) return value_key; // Not overrited - - m_hash_table[cell_index] = m_nodes.size(); - - _insert_unsorted(hashkey, value); - return GIM_INVALID_HASH; - } - - //! insert an element in hash table. - /*! - If the element exists, this replaces the element. - \return the index in the array of the existing element,or GIM_INVALID_HASH if the element has been inserted - If so, the element has been inserted at the last position of the array. - */ - inline GUINT _insert_hash_table_replace(GUINT hashkey, const T& value) - { - if (hashkey == GIM_INVALID_HASH) - { - //Insert anyway - _insert_unsorted(hashkey, value); - return GIM_INVALID_HASH; - } - - GUINT cell_index = _assign_hash_table_cell(hashkey); - - GUINT value_key = m_hash_table[cell_index]; - - if (value_key != GIM_INVALID_HASH) - { //replaces the existing - m_nodes[value_key] = _node_type(hashkey, value); - return value_key; // index of the replaced element - } - - m_hash_table[cell_index] = m_nodes.size(); - - _insert_unsorted(hashkey, value); - return GIM_INVALID_HASH; - } - - ///Sorted array data management. The hash table has the indices to the corresponding m_nodes array - inline bool _erase_sorted(GUINT index) - { - if (index >= (GUINT)m_nodes.size()) return false; - m_nodes.erase_sorted(index); - if (m_nodes.size() < 2) m_sorted = false; - return true; - } - - //! faster, but unsorted - inline bool _erase_unsorted(GUINT index) - { - if (index >= m_nodes.size()) return false; - - GUINT lastindex = m_nodes.size() - 1; - if (index < lastindex && m_hash_table != 0) - { - GUINT hashkey = m_nodes[lastindex].m_key; - if (hashkey != GIM_INVALID_HASH) - { - //update the new position of the last element - GUINT cell_index = _find_cell(hashkey); - btAssert(cell_index != GIM_INVALID_HASH); - //new position of the last element which will be swaped - m_hash_table[cell_index] = index; - } - } - m_nodes.erase(index); - m_sorted = false; - return true; - } - - //! Insert in position ordered - /*! - Also checks if it is needed to transform this container to a hash table, by calling check_for_switching_to_hashtable - */ - inline void _insert_in_pos(GUINT hashkey, const T& value, GUINT pos) - { - m_nodes.insert(_node_type(hashkey, value), pos); - this->check_for_switching_to_hashtable(); - } - - //! Insert an element in an ordered array - inline GUINT _insert_sorted(GUINT hashkey, const T& value) - { - if (hashkey == GIM_INVALID_HASH || size() == 0) - { - m_nodes.push_back(_node_type(hashkey, value)); - return GIM_INVALID_HASH; - } - //Insert at last position - //Sort element - - GUINT result_ind = 0; - GUINT last_index = m_nodes.size() - 1; - _node_type* ptr = m_nodes.pointer(); - - bool found = gim_binary_search_ex( - ptr, 0, last_index, result_ind, hashkey, GIM_HASH_NODE_CMP_KEY_MACRO()); - - //Insert before found index - if (found) - { - return result_ind; - } - else - { - _insert_in_pos(hashkey, value, result_ind); - } - return GIM_INVALID_HASH; - } - - inline GUINT _insert_sorted_replace(GUINT hashkey, const T& value) - { - if (hashkey == GIM_INVALID_HASH || size() == 0) - { - m_nodes.push_back(_node_type(hashkey, value)); - return GIM_INVALID_HASH; - } - //Insert at last position - //Sort element - GUINT result_ind; - GUINT last_index = m_nodes.size() - 1; - _node_type* ptr = m_nodes.pointer(); - - bool found = gim_binary_search_ex( - ptr, 0, last_index, result_ind, hashkey, GIM_HASH_NODE_CMP_KEY_MACRO()); - - //Insert before found index - if (found) - { - m_nodes[result_ind] = _node_type(hashkey, value); - } - else - { - _insert_in_pos(hashkey, value, result_ind); - } - return result_ind; - } - - //! Fast insertion in m_nodes array - inline GUINT _insert_unsorted(GUINT hashkey, const T& value) - { - m_nodes.push_back(_node_type(hashkey, value)); - m_sorted = false; - return GIM_INVALID_HASH; - } - -public: - /*! -
  • if node_size = 0, then this container becomes a simple sorted array allocator. reserve_size is used for reserve memory in m_nodes. - When the array size reaches the size equivalent to 'min_hash_table_size', then it becomes a hash table by calling check_for_switching_to_hashtable. -
  • If node_size != 0, then this container becomes a hash table for ever - - */ - gim_hash_table(GUINT reserve_size = GIM_DEFAULT_HASH_TABLE_SIZE, - GUINT node_size = GIM_DEFAULT_HASH_TABLE_NODE_SIZE, - GUINT min_hash_table_size = GIM_INVALID_HASH) - { - m_hash_table = NULL; - m_table_size = 0; - m_sorted = false; - m_node_size = node_size; - m_min_hash_table_size = min_hash_table_size; - - if (m_node_size != 0) - { - if (reserve_size != 0) - { - m_nodes.reserve(reserve_size); - _reserve_table_memory(reserve_size); - _invalidate_keys(); - } - else - { - m_nodes.reserve(GIM_DEFAULT_HASH_TABLE_SIZE); - _reserve_table_memory(GIM_DEFAULT_HASH_TABLE_SIZE); - _invalidate_keys(); - } - } - else if (reserve_size != 0) - { - m_nodes.reserve(reserve_size); - } - } - - ~gim_hash_table() - { - _destroy(); - } - - inline bool is_hash_table() - { - if (m_hash_table) return true; - return false; - } - - inline bool is_sorted() - { - if (size() < 2) return true; - return m_sorted; - } - - bool sort() - { - if (is_sorted()) return true; - if (m_nodes.size() < 2) return false; - - _node_type* ptr = m_nodes.pointer(); - GUINT siz = m_nodes.size(); - gim_sort_hash_node_array(ptr, siz); - m_sorted = true; - - if (m_hash_table) - { - _rehash(); - } - return true; - } - - bool switch_to_hashtable() - { - if (m_hash_table) return false; - if (m_node_size == 0) m_node_size = GIM_DEFAULT_HASH_TABLE_NODE_SIZE; - if (m_nodes.size() < GIM_DEFAULT_HASH_TABLE_SIZE) - { - _resize_table(GIM_DEFAULT_HASH_TABLE_SIZE); - } - else - { - _resize_table(m_nodes.size() + 1); - } - - return true; - } - - bool switch_to_sorted_array() - { - if (m_hash_table == NULL) return true; - _clear_table_memory(); - return sort(); - } - - //!If the container reaches the - bool check_for_switching_to_hashtable() - { - if (this->m_hash_table) return true; - - if (!(m_nodes.size() < m_min_hash_table_size)) - { - if (m_node_size == 0) - { - m_node_size = GIM_DEFAULT_HASH_TABLE_NODE_SIZE; - } - - _resize_table(m_nodes.size() + 1); - return true; - } - return false; - } - - inline void set_sorted(bool value) - { - m_sorted = value; - } - - //! Retrieves the amount of keys. - inline GUINT size() const - { - return m_nodes.size(); - } - - //! Retrieves the hash key. - inline GUINT get_key(GUINT index) const - { - return m_nodes[index].m_key; - } - - //! Retrieves the value by index - /*! - */ - inline T* get_value_by_index(GUINT index) - { - return &m_nodes[index].m_data; - } - - inline const T& operator[](GUINT index) const - { - return m_nodes[index].m_data; - } - - inline T& operator[](GUINT index) - { - return m_nodes[index].m_data; - } - - //! Finds the index of the element with the key - /*! - \return the index in the array of the existing element,or GIM_INVALID_HASH if the element has been inserted - If so, the element has been inserted at the last position of the array. - */ - inline GUINT find(GUINT hashkey) - { - if (m_hash_table) - { - GUINT cell_index = _find_cell(hashkey); - if (cell_index == GIM_INVALID_HASH) return GIM_INVALID_HASH; - return m_hash_table[cell_index]; - } - GUINT last_index = m_nodes.size(); - if (last_index < 2) - { - if (last_index == 0) return GIM_INVALID_HASH; - if (m_nodes[0].m_key == hashkey) return 0; - return GIM_INVALID_HASH; - } - else if (m_sorted) - { - //Binary search - GUINT result_ind = 0; - last_index--; - _node_type* ptr = m_nodes.pointer(); - - bool found = gim_binary_search_ex(ptr, 0, last_index, result_ind, hashkey, GIM_HASH_NODE_CMP_KEY_MACRO()); - - if (found) return result_ind; - } - return GIM_INVALID_HASH; - } - - //! Retrieves the value associated with the index - /*! - \return the found element, or null - */ - inline T* get_value(GUINT hashkey) - { - GUINT index = find(hashkey); - if (index == GIM_INVALID_HASH) return NULL; - return &m_nodes[index].m_data; - } - - /*! - */ - inline bool erase_by_index(GUINT index) - { - if (index > m_nodes.size()) return false; - - if (m_hash_table == NULL) - { - if (is_sorted()) - { - return this->_erase_sorted(index); - } - else - { - return this->_erase_unsorted(index); - } - } - else - { - return this->_erase_by_index_hash_table(index); - } - return false; - } - - inline bool erase_by_index_unsorted(GUINT index) - { - if (index > m_nodes.size()) return false; - - if (m_hash_table == NULL) - { - return this->_erase_unsorted(index); - } - else - { - return this->_erase_by_index_hash_table(index); - } - return false; - } - - /*! - - */ - inline bool erase_by_key(GUINT hashkey) - { - if (size() == 0) return false; - - if (m_hash_table) - { - return this->_erase_hash_table(hashkey); - } - //Binary search - - if (is_sorted() == false) return false; - - GUINT result_ind = find(hashkey); - if (result_ind != GIM_INVALID_HASH) - { - return this->_erase_sorted(result_ind); - } - return false; - } - - void clear() - { - m_nodes.clear(); - - if (m_hash_table == NULL) return; - GUINT datasize = m_table_size * m_node_size; - //Initialize the hashkeys. - GUINT i; - for (i = 0; i < datasize; i++) - { - m_hash_table[i] = GIM_INVALID_HASH; // invalidate keys - } - m_sorted = false; - } - - //! Insert an element into the hash - /*! - \return If GIM_INVALID_HASH, the object has been inserted succesfully. Else it returns the position - of the existing element. - */ - inline GUINT insert(GUINT hashkey, const T& element) - { - if (m_hash_table) - { - return this->_insert_hash_table(hashkey, element); - } - if (this->is_sorted()) - { - return this->_insert_sorted(hashkey, element); - } - return this->_insert_unsorted(hashkey, element); - } - - //! Insert an element into the hash, and could overrite an existing object with the same hash. - /*! - \return If GIM_INVALID_HASH, the object has been inserted succesfully. Else it returns the position - of the replaced element. - */ - inline GUINT insert_override(GUINT hashkey, const T& element) - { - if (m_hash_table) - { - return this->_insert_hash_table_replace(hashkey, element); - } - if (this->is_sorted()) - { - return this->_insert_sorted_replace(hashkey, element); - } - this->_insert_unsorted(hashkey, element); - return m_nodes.size(); - } - - //! Insert an element into the hash,But if this container is a sorted array, this inserts it unsorted - /*! - */ - inline GUINT insert_unsorted(GUINT hashkey, const T& element) - { - if (m_hash_table) - { - return this->_insert_hash_table(hashkey, element); - } - return this->_insert_unsorted(hashkey, element); - } -}; - -#endif // GIM_CONTAINERS_H_INCLUDED diff --git a/engine/inc/bullet/BulletCollision/Gimpact/gim_linear_math.h b/engine/inc/bullet/BulletCollision/Gimpact/gim_linear_math.h deleted file mode 100644 index 98401a40..00000000 --- a/engine/inc/bullet/BulletCollision/Gimpact/gim_linear_math.h +++ /dev/null @@ -1,1488 +0,0 @@ -#ifndef GIM_LINEAR_H_INCLUDED -#define GIM_LINEAR_H_INCLUDED - -/*! \file gim_linear_math.h -*\author Francisco Leon Najera -Type Independant Vector and matrix operations. -*/ -/* ------------------------------------------------------------------------------ -This source file is part of GIMPACT Library. - -For the latest info, see http://gimpact.sourceforge.net/ - -Copyright (c) 2006 Francisco Leon Najera. C.C. 80087371. -email: projectileman@yahoo.com - - This library is free software; you can redistribute it and/or - modify it under the terms of EITHER: - (1) The GNU Lesser General Public License as published by the Free - Software Foundation; either version 2.1 of the License, or (at - your option) any later version. The text of the GNU Lesser - General Public License is included with this library in the - file GIMPACT-LICENSE-LGPL.TXT. - (2) The BSD-style license that is included with this library in - the file GIMPACT-LICENSE-BSD.TXT. - (3) The zlib/libpng license that is included with this library in - the file GIMPACT-LICENSE-ZLIB.TXT. - - This library 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 files - GIMPACT-LICENSE-LGPL.TXT, GIMPACT-LICENSE-ZLIB.TXT and GIMPACT-LICENSE-BSD.TXT for more details. - ------------------------------------------------------------------------------ -*/ - -#include "gim_math.h" -#include "gim_geom_types.h" - -//! Zero out a 2D vector -#define VEC_ZERO_2(a) \ - { \ - (a)[0] = (a)[1] = 0.0f; \ - } - -//! Zero out a 3D vector -#define VEC_ZERO(a) \ - { \ - (a)[0] = (a)[1] = (a)[2] = 0.0f; \ - } - -/// Zero out a 4D vector -#define VEC_ZERO_4(a) \ - { \ - (a)[0] = (a)[1] = (a)[2] = (a)[3] = 0.0f; \ - } - -/// Vector copy -#define VEC_COPY_2(b, a) \ - { \ - (b)[0] = (a)[0]; \ - (b)[1] = (a)[1]; \ - } - -/// Copy 3D vector -#define VEC_COPY(b, a) \ - { \ - (b)[0] = (a)[0]; \ - (b)[1] = (a)[1]; \ - (b)[2] = (a)[2]; \ - } - -/// Copy 4D vector -#define VEC_COPY_4(b, a) \ - { \ - (b)[0] = (a)[0]; \ - (b)[1] = (a)[1]; \ - (b)[2] = (a)[2]; \ - (b)[3] = (a)[3]; \ - } - -/// VECTOR SWAP -#define VEC_SWAP(b, a) \ - { \ - GIM_SWAP_NUMBERS((b)[0], (a)[0]); \ - GIM_SWAP_NUMBERS((b)[1], (a)[1]); \ - GIM_SWAP_NUMBERS((b)[2], (a)[2]); \ - } - -/// Vector difference -#define VEC_DIFF_2(v21, v2, v1) \ - { \ - (v21)[0] = (v2)[0] - (v1)[0]; \ - (v21)[1] = (v2)[1] - (v1)[1]; \ - } - -/// Vector difference -#define VEC_DIFF(v21, v2, v1) \ - { \ - (v21)[0] = (v2)[0] - (v1)[0]; \ - (v21)[1] = (v2)[1] - (v1)[1]; \ - (v21)[2] = (v2)[2] - (v1)[2]; \ - } - -/// Vector difference -#define VEC_DIFF_4(v21, v2, v1) \ - { \ - (v21)[0] = (v2)[0] - (v1)[0]; \ - (v21)[1] = (v2)[1] - (v1)[1]; \ - (v21)[2] = (v2)[2] - (v1)[2]; \ - (v21)[3] = (v2)[3] - (v1)[3]; \ - } - -/// Vector sum -#define VEC_SUM_2(v21, v2, v1) \ - { \ - (v21)[0] = (v2)[0] + (v1)[0]; \ - (v21)[1] = (v2)[1] + (v1)[1]; \ - } - -/// Vector sum -#define VEC_SUM(v21, v2, v1) \ - { \ - (v21)[0] = (v2)[0] + (v1)[0]; \ - (v21)[1] = (v2)[1] + (v1)[1]; \ - (v21)[2] = (v2)[2] + (v1)[2]; \ - } - -/// Vector sum -#define VEC_SUM_4(v21, v2, v1) \ - { \ - (v21)[0] = (v2)[0] + (v1)[0]; \ - (v21)[1] = (v2)[1] + (v1)[1]; \ - (v21)[2] = (v2)[2] + (v1)[2]; \ - (v21)[3] = (v2)[3] + (v1)[3]; \ - } - -/// scalar times vector -#define VEC_SCALE_2(c, a, b) \ - { \ - (c)[0] = (a) * (b)[0]; \ - (c)[1] = (a) * (b)[1]; \ - } - -/// scalar times vector -#define VEC_SCALE(c, a, b) \ - { \ - (c)[0] = (a) * (b)[0]; \ - (c)[1] = (a) * (b)[1]; \ - (c)[2] = (a) * (b)[2]; \ - } - -/// scalar times vector -#define VEC_SCALE_4(c, a, b) \ - { \ - (c)[0] = (a) * (b)[0]; \ - (c)[1] = (a) * (b)[1]; \ - (c)[2] = (a) * (b)[2]; \ - (c)[3] = (a) * (b)[3]; \ - } - -/// accumulate scaled vector -#define VEC_ACCUM_2(c, a, b) \ - { \ - (c)[0] += (a) * (b)[0]; \ - (c)[1] += (a) * (b)[1]; \ - } - -/// accumulate scaled vector -#define VEC_ACCUM(c, a, b) \ - { \ - (c)[0] += (a) * (b)[0]; \ - (c)[1] += (a) * (b)[1]; \ - (c)[2] += (a) * (b)[2]; \ - } - -/// accumulate scaled vector -#define VEC_ACCUM_4(c, a, b) \ - { \ - (c)[0] += (a) * (b)[0]; \ - (c)[1] += (a) * (b)[1]; \ - (c)[2] += (a) * (b)[2]; \ - (c)[3] += (a) * (b)[3]; \ - } - -/// Vector dot product -#define VEC_DOT_2(a, b) ((a)[0] * (b)[0] + (a)[1] * (b)[1]) - -/// Vector dot product -#define VEC_DOT(a, b) ((a)[0] * (b)[0] + (a)[1] * (b)[1] + (a)[2] * (b)[2]) - -/// Vector dot product -#define VEC_DOT_4(a, b) ((a)[0] * (b)[0] + (a)[1] * (b)[1] + (a)[2] * (b)[2] + (a)[3] * (b)[3]) - -/// vector impact parameter (squared) -#define VEC_IMPACT_SQ(bsq, direction, position) \ - { \ - GREAL _llel_ = VEC_DOT(direction, position); \ - bsq = VEC_DOT(position, position) - _llel_ * _llel_; \ - } - -/// vector impact parameter -#define VEC_IMPACT(bsq, direction, position) \ - { \ - VEC_IMPACT_SQ(bsq, direction, position); \ - GIM_SQRT(bsq, bsq); \ - } - -/// Vector length -#define VEC_LENGTH_2(a, l) \ - { \ - GREAL _pp = VEC_DOT_2(a, a); \ - GIM_SQRT(_pp, l); \ - } - -/// Vector length -#define VEC_LENGTH(a, l) \ - { \ - GREAL _pp = VEC_DOT(a, a); \ - GIM_SQRT(_pp, l); \ - } - -/// Vector length -#define VEC_LENGTH_4(a, l) \ - { \ - GREAL _pp = VEC_DOT_4(a, a); \ - GIM_SQRT(_pp, l); \ - } - -/// Vector inv length -#define VEC_INV_LENGTH_2(a, l) \ - { \ - GREAL _pp = VEC_DOT_2(a, a); \ - GIM_INV_SQRT(_pp, l); \ - } - -/// Vector inv length -#define VEC_INV_LENGTH(a, l) \ - { \ - GREAL _pp = VEC_DOT(a, a); \ - GIM_INV_SQRT(_pp, l); \ - } - -/// Vector inv length -#define VEC_INV_LENGTH_4(a, l) \ - { \ - GREAL _pp = VEC_DOT_4(a, a); \ - GIM_INV_SQRT(_pp, l); \ - } - -/// distance between two points -#define VEC_DISTANCE(_len, _va, _vb) \ - { \ - vec3f _tmp_; \ - VEC_DIFF(_tmp_, _vb, _va); \ - VEC_LENGTH(_tmp_, _len); \ - } - -/// Vector length -#define VEC_CONJUGATE_LENGTH(a, l) \ - { \ - GREAL _pp = 1.0 - a[0] * a[0] - a[1] * a[1] - a[2] * a[2]; \ - GIM_SQRT(_pp, l); \ - } - -/// Vector length -#define VEC_NORMALIZE(a) \ - { \ - GREAL len; \ - VEC_INV_LENGTH(a, len); \ - if (len < G_REAL_INFINITY) \ - { \ - a[0] *= len; \ - a[1] *= len; \ - a[2] *= len; \ - } \ - } - -/// Set Vector size -#define VEC_RENORMALIZE(a, newlen) \ - { \ - GREAL len; \ - VEC_INV_LENGTH(a, len); \ - if (len < G_REAL_INFINITY) \ - { \ - len *= newlen; \ - a[0] *= len; \ - a[1] *= len; \ - a[2] *= len; \ - } \ - } - -/// Vector cross -#define VEC_CROSS(c, a, b) \ - { \ - c[0] = (a)[1] * (b)[2] - (a)[2] * (b)[1]; \ - c[1] = (a)[2] * (b)[0] - (a)[0] * (b)[2]; \ - c[2] = (a)[0] * (b)[1] - (a)[1] * (b)[0]; \ - } - -/*! Vector perp -- assumes that n is of unit length - * accepts vector v, subtracts out any component parallel to n */ -#define VEC_PERPENDICULAR(vp, v, n) \ - { \ - GREAL dot = VEC_DOT(v, n); \ - vp[0] = (v)[0] - dot * (n)[0]; \ - vp[1] = (v)[1] - dot * (n)[1]; \ - vp[2] = (v)[2] - dot * (n)[2]; \ - } - -/*! Vector parallel -- assumes that n is of unit length */ -#define VEC_PARALLEL(vp, v, n) \ - { \ - GREAL dot = VEC_DOT(v, n); \ - vp[0] = (dot) * (n)[0]; \ - vp[1] = (dot) * (n)[1]; \ - vp[2] = (dot) * (n)[2]; \ - } - -/*! Same as Vector parallel -- n can have any length - * accepts vector v, subtracts out any component perpendicular to n */ -#define VEC_PROJECT(vp, v, n) \ - { \ - GREAL scalar = VEC_DOT(v, n); \ - scalar /= VEC_DOT(n, n); \ - vp[0] = (scalar) * (n)[0]; \ - vp[1] = (scalar) * (n)[1]; \ - vp[2] = (scalar) * (n)[2]; \ - } - -/*! accepts vector v*/ -#define VEC_UNPROJECT(vp, v, n) \ - { \ - GREAL scalar = VEC_DOT(v, n); \ - scalar = VEC_DOT(n, n) / scalar; \ - vp[0] = (scalar) * (n)[0]; \ - vp[1] = (scalar) * (n)[1]; \ - vp[2] = (scalar) * (n)[2]; \ - } - -/*! Vector reflection -- assumes n is of unit length - Takes vector v, reflects it against reflector n, and returns vr */ -#define VEC_REFLECT(vr, v, n) \ - { \ - GREAL dot = VEC_DOT(v, n); \ - vr[0] = (v)[0] - 2.0 * (dot) * (n)[0]; \ - vr[1] = (v)[1] - 2.0 * (dot) * (n)[1]; \ - vr[2] = (v)[2] - 2.0 * (dot) * (n)[2]; \ - } - -/*! Vector blending -Takes two vectors a, b, blends them together with two scalars */ -#define VEC_BLEND_AB(vr, sa, a, sb, b) \ - { \ - vr[0] = (sa) * (a)[0] + (sb) * (b)[0]; \ - vr[1] = (sa) * (a)[1] + (sb) * (b)[1]; \ - vr[2] = (sa) * (a)[2] + (sb) * (b)[2]; \ - } - -/*! Vector blending -Takes two vectors a, b, blends them together with s <=1 */ -#define VEC_BLEND(vr, a, b, s) VEC_BLEND_AB(vr, (1 - s), a, s, b) - -#define VEC_SET3(a, b, op, c) \ - a[0] = b[0] op c[0]; \ - a[1] = b[1] op c[1]; \ - a[2] = b[2] op c[2]; - -//! Finds the bigger cartesian coordinate from a vector -#define VEC_MAYOR_COORD(vec, maxc) \ - { \ - GREAL A[] = {fabs(vec[0]), fabs(vec[1]), fabs(vec[2])}; \ - maxc = A[0] > A[1] ? (A[0] > A[2] ? 0 : 2) : (A[1] > A[2] ? 1 : 2); \ - } - -//! Finds the 2 smallest cartesian coordinates from a vector -#define VEC_MINOR_AXES(vec, i0, i1) \ - { \ - VEC_MAYOR_COORD(vec, i0); \ - i0 = (i0 + 1) % 3; \ - i1 = (i0 + 1) % 3; \ - } - -#define VEC_EQUAL(v1, v2) (v1[0] == v2[0] && v1[1] == v2[1] && v1[2] == v2[2]) - -#define VEC_NEAR_EQUAL(v1, v2) (GIM_NEAR_EQUAL(v1[0], v2[0]) && GIM_NEAR_EQUAL(v1[1], v2[1]) && GIM_NEAR_EQUAL(v1[2], v2[2])) - -/// Vector cross -#define X_AXIS_CROSS_VEC(dst, src) \ - { \ - dst[0] = 0.0f; \ - dst[1] = -src[2]; \ - dst[2] = src[1]; \ - } - -#define Y_AXIS_CROSS_VEC(dst, src) \ - { \ - dst[0] = src[2]; \ - dst[1] = 0.0f; \ - dst[2] = -src[0]; \ - } - -#define Z_AXIS_CROSS_VEC(dst, src) \ - { \ - dst[0] = -src[1]; \ - dst[1] = src[0]; \ - dst[2] = 0.0f; \ - } - -/// initialize matrix -#define IDENTIFY_MATRIX_3X3(m) \ - { \ - m[0][0] = 1.0; \ - m[0][1] = 0.0; \ - m[0][2] = 0.0; \ - \ - m[1][0] = 0.0; \ - m[1][1] = 1.0; \ - m[1][2] = 0.0; \ - \ - m[2][0] = 0.0; \ - m[2][1] = 0.0; \ - m[2][2] = 1.0; \ - } - -/*! initialize matrix */ -#define IDENTIFY_MATRIX_4X4(m) \ - { \ - m[0][0] = 1.0; \ - m[0][1] = 0.0; \ - m[0][2] = 0.0; \ - m[0][3] = 0.0; \ - \ - m[1][0] = 0.0; \ - m[1][1] = 1.0; \ - m[1][2] = 0.0; \ - m[1][3] = 0.0; \ - \ - m[2][0] = 0.0; \ - m[2][1] = 0.0; \ - m[2][2] = 1.0; \ - m[2][3] = 0.0; \ - \ - m[3][0] = 0.0; \ - m[3][1] = 0.0; \ - m[3][2] = 0.0; \ - m[3][3] = 1.0; \ - } - -/*! initialize matrix */ -#define ZERO_MATRIX_4X4(m) \ - { \ - m[0][0] = 0.0; \ - m[0][1] = 0.0; \ - m[0][2] = 0.0; \ - m[0][3] = 0.0; \ - \ - m[1][0] = 0.0; \ - m[1][1] = 0.0; \ - m[1][2] = 0.0; \ - m[1][3] = 0.0; \ - \ - m[2][0] = 0.0; \ - m[2][1] = 0.0; \ - m[2][2] = 0.0; \ - m[2][3] = 0.0; \ - \ - m[3][0] = 0.0; \ - m[3][1] = 0.0; \ - m[3][2] = 0.0; \ - m[3][3] = 0.0; \ - } - -/*! matrix rotation X */ -#define ROTX_CS(m, cosine, sine) \ - { \ - /* rotation about the x-axis */ \ - \ - m[0][0] = 1.0; \ - m[0][1] = 0.0; \ - m[0][2] = 0.0; \ - m[0][3] = 0.0; \ - \ - m[1][0] = 0.0; \ - m[1][1] = (cosine); \ - m[1][2] = (sine); \ - m[1][3] = 0.0; \ - \ - m[2][0] = 0.0; \ - m[2][1] = -(sine); \ - m[2][2] = (cosine); \ - m[2][3] = 0.0; \ - \ - m[3][0] = 0.0; \ - m[3][1] = 0.0; \ - m[3][2] = 0.0; \ - m[3][3] = 1.0; \ - } - -/*! matrix rotation Y */ -#define ROTY_CS(m, cosine, sine) \ - { \ - /* rotation about the y-axis */ \ - \ - m[0][0] = (cosine); \ - m[0][1] = 0.0; \ - m[0][2] = -(sine); \ - m[0][3] = 0.0; \ - \ - m[1][0] = 0.0; \ - m[1][1] = 1.0; \ - m[1][2] = 0.0; \ - m[1][3] = 0.0; \ - \ - m[2][0] = (sine); \ - m[2][1] = 0.0; \ - m[2][2] = (cosine); \ - m[2][3] = 0.0; \ - \ - m[3][0] = 0.0; \ - m[3][1] = 0.0; \ - m[3][2] = 0.0; \ - m[3][3] = 1.0; \ - } - -/*! matrix rotation Z */ -#define ROTZ_CS(m, cosine, sine) \ - { \ - /* rotation about the z-axis */ \ - \ - m[0][0] = (cosine); \ - m[0][1] = (sine); \ - m[0][2] = 0.0; \ - m[0][3] = 0.0; \ - \ - m[1][0] = -(sine); \ - m[1][1] = (cosine); \ - m[1][2] = 0.0; \ - m[1][3] = 0.0; \ - \ - m[2][0] = 0.0; \ - m[2][1] = 0.0; \ - m[2][2] = 1.0; \ - m[2][3] = 0.0; \ - \ - m[3][0] = 0.0; \ - m[3][1] = 0.0; \ - m[3][2] = 0.0; \ - m[3][3] = 1.0; \ - } - -/*! matrix copy */ -#define COPY_MATRIX_2X2(b, a) \ - { \ - b[0][0] = a[0][0]; \ - b[0][1] = a[0][1]; \ - \ - b[1][0] = a[1][0]; \ - b[1][1] = a[1][1]; \ - } - -/*! matrix copy */ -#define COPY_MATRIX_2X3(b, a) \ - { \ - b[0][0] = a[0][0]; \ - b[0][1] = a[0][1]; \ - b[0][2] = a[0][2]; \ - \ - b[1][0] = a[1][0]; \ - b[1][1] = a[1][1]; \ - b[1][2] = a[1][2]; \ - } - -/*! matrix copy */ -#define COPY_MATRIX_3X3(b, a) \ - { \ - b[0][0] = a[0][0]; \ - b[0][1] = a[0][1]; \ - b[0][2] = a[0][2]; \ - \ - b[1][0] = a[1][0]; \ - b[1][1] = a[1][1]; \ - b[1][2] = a[1][2]; \ - \ - b[2][0] = a[2][0]; \ - b[2][1] = a[2][1]; \ - b[2][2] = a[2][2]; \ - } - -/*! matrix copy */ -#define COPY_MATRIX_4X4(b, a) \ - { \ - b[0][0] = a[0][0]; \ - b[0][1] = a[0][1]; \ - b[0][2] = a[0][2]; \ - b[0][3] = a[0][3]; \ - \ - b[1][0] = a[1][0]; \ - b[1][1] = a[1][1]; \ - b[1][2] = a[1][2]; \ - b[1][3] = a[1][3]; \ - \ - b[2][0] = a[2][0]; \ - b[2][1] = a[2][1]; \ - b[2][2] = a[2][2]; \ - b[2][3] = a[2][3]; \ - \ - b[3][0] = a[3][0]; \ - b[3][1] = a[3][1]; \ - b[3][2] = a[3][2]; \ - b[3][3] = a[3][3]; \ - } - -/*! matrix transpose */ -#define TRANSPOSE_MATRIX_2X2(b, a) \ - { \ - b[0][0] = a[0][0]; \ - b[0][1] = a[1][0]; \ - \ - b[1][0] = a[0][1]; \ - b[1][1] = a[1][1]; \ - } - -/*! matrix transpose */ -#define TRANSPOSE_MATRIX_3X3(b, a) \ - { \ - b[0][0] = a[0][0]; \ - b[0][1] = a[1][0]; \ - b[0][2] = a[2][0]; \ - \ - b[1][0] = a[0][1]; \ - b[1][1] = a[1][1]; \ - b[1][2] = a[2][1]; \ - \ - b[2][0] = a[0][2]; \ - b[2][1] = a[1][2]; \ - b[2][2] = a[2][2]; \ - } - -/*! matrix transpose */ -#define TRANSPOSE_MATRIX_4X4(b, a) \ - { \ - b[0][0] = a[0][0]; \ - b[0][1] = a[1][0]; \ - b[0][2] = a[2][0]; \ - b[0][3] = a[3][0]; \ - \ - b[1][0] = a[0][1]; \ - b[1][1] = a[1][1]; \ - b[1][2] = a[2][1]; \ - b[1][3] = a[3][1]; \ - \ - b[2][0] = a[0][2]; \ - b[2][1] = a[1][2]; \ - b[2][2] = a[2][2]; \ - b[2][3] = a[3][2]; \ - \ - b[3][0] = a[0][3]; \ - b[3][1] = a[1][3]; \ - b[3][2] = a[2][3]; \ - b[3][3] = a[3][3]; \ - } - -/*! multiply matrix by scalar */ -#define SCALE_MATRIX_2X2(b, s, a) \ - { \ - b[0][0] = (s)*a[0][0]; \ - b[0][1] = (s)*a[0][1]; \ - \ - b[1][0] = (s)*a[1][0]; \ - b[1][1] = (s)*a[1][1]; \ - } - -/*! multiply matrix by scalar */ -#define SCALE_MATRIX_3X3(b, s, a) \ - { \ - b[0][0] = (s)*a[0][0]; \ - b[0][1] = (s)*a[0][1]; \ - b[0][2] = (s)*a[0][2]; \ - \ - b[1][0] = (s)*a[1][0]; \ - b[1][1] = (s)*a[1][1]; \ - b[1][2] = (s)*a[1][2]; \ - \ - b[2][0] = (s)*a[2][0]; \ - b[2][1] = (s)*a[2][1]; \ - b[2][2] = (s)*a[2][2]; \ - } - -/*! multiply matrix by scalar */ -#define SCALE_MATRIX_4X4(b, s, a) \ - { \ - b[0][0] = (s)*a[0][0]; \ - b[0][1] = (s)*a[0][1]; \ - b[0][2] = (s)*a[0][2]; \ - b[0][3] = (s)*a[0][3]; \ - \ - b[1][0] = (s)*a[1][0]; \ - b[1][1] = (s)*a[1][1]; \ - b[1][2] = (s)*a[1][2]; \ - b[1][3] = (s)*a[1][3]; \ - \ - b[2][0] = (s)*a[2][0]; \ - b[2][1] = (s)*a[2][1]; \ - b[2][2] = (s)*a[2][2]; \ - b[2][3] = (s)*a[2][3]; \ - \ - b[3][0] = s * a[3][0]; \ - b[3][1] = s * a[3][1]; \ - b[3][2] = s * a[3][2]; \ - b[3][3] = s * a[3][3]; \ - } - -/*! multiply matrix by scalar */ -#define SCALE_VEC_MATRIX_2X2(b, svec, a) \ - { \ - b[0][0] = svec[0] * a[0][0]; \ - b[1][0] = svec[0] * a[1][0]; \ - \ - b[0][1] = svec[1] * a[0][1]; \ - b[1][1] = svec[1] * a[1][1]; \ - } - -/*! multiply matrix by scalar. Each columns is scaled by each scalar vector component */ -#define SCALE_VEC_MATRIX_3X3(b, svec, a) \ - { \ - b[0][0] = svec[0] * a[0][0]; \ - b[1][0] = svec[0] * a[1][0]; \ - b[2][0] = svec[0] * a[2][0]; \ - \ - b[0][1] = svec[1] * a[0][1]; \ - b[1][1] = svec[1] * a[1][1]; \ - b[2][1] = svec[1] * a[2][1]; \ - \ - b[0][2] = svec[2] * a[0][2]; \ - b[1][2] = svec[2] * a[1][2]; \ - b[2][2] = svec[2] * a[2][2]; \ - } - -/*! multiply matrix by scalar */ -#define SCALE_VEC_MATRIX_4X4(b, svec, a) \ - { \ - b[0][0] = svec[0] * a[0][0]; \ - b[1][0] = svec[0] * a[1][0]; \ - b[2][0] = svec[0] * a[2][0]; \ - b[3][0] = svec[0] * a[3][0]; \ - \ - b[0][1] = svec[1] * a[0][1]; \ - b[1][1] = svec[1] * a[1][1]; \ - b[2][1] = svec[1] * a[2][1]; \ - b[3][1] = svec[1] * a[3][1]; \ - \ - b[0][2] = svec[2] * a[0][2]; \ - b[1][2] = svec[2] * a[1][2]; \ - b[2][2] = svec[2] * a[2][2]; \ - b[3][2] = svec[2] * a[3][2]; \ - \ - b[0][3] = svec[3] * a[0][3]; \ - b[1][3] = svec[3] * a[1][3]; \ - b[2][3] = svec[3] * a[2][3]; \ - b[3][3] = svec[3] * a[3][3]; \ - } - -/*! multiply matrix by scalar */ -#define ACCUM_SCALE_MATRIX_2X2(b, s, a) \ - { \ - b[0][0] += (s)*a[0][0]; \ - b[0][1] += (s)*a[0][1]; \ - \ - b[1][0] += (s)*a[1][0]; \ - b[1][1] += (s)*a[1][1]; \ - } - -/*! multiply matrix by scalar */ -#define ACCUM_SCALE_MATRIX_3X3(b, s, a) \ - { \ - b[0][0] += (s)*a[0][0]; \ - b[0][1] += (s)*a[0][1]; \ - b[0][2] += (s)*a[0][2]; \ - \ - b[1][0] += (s)*a[1][0]; \ - b[1][1] += (s)*a[1][1]; \ - b[1][2] += (s)*a[1][2]; \ - \ - b[2][0] += (s)*a[2][0]; \ - b[2][1] += (s)*a[2][1]; \ - b[2][2] += (s)*a[2][2]; \ - } - -/*! multiply matrix by scalar */ -#define ACCUM_SCALE_MATRIX_4X4(b, s, a) \ - { \ - b[0][0] += (s)*a[0][0]; \ - b[0][1] += (s)*a[0][1]; \ - b[0][2] += (s)*a[0][2]; \ - b[0][3] += (s)*a[0][3]; \ - \ - b[1][0] += (s)*a[1][0]; \ - b[1][1] += (s)*a[1][1]; \ - b[1][2] += (s)*a[1][2]; \ - b[1][3] += (s)*a[1][3]; \ - \ - b[2][0] += (s)*a[2][0]; \ - b[2][1] += (s)*a[2][1]; \ - b[2][2] += (s)*a[2][2]; \ - b[2][3] += (s)*a[2][3]; \ - \ - b[3][0] += (s)*a[3][0]; \ - b[3][1] += (s)*a[3][1]; \ - b[3][2] += (s)*a[3][2]; \ - b[3][3] += (s)*a[3][3]; \ - } - -/*! matrix product */ -/*! c[x][y] = a[x][0]*b[0][y]+a[x][1]*b[1][y]+a[x][2]*b[2][y]+a[x][3]*b[3][y];*/ -#define MATRIX_PRODUCT_2X2(c, a, b) \ - { \ - c[0][0] = a[0][0] * b[0][0] + a[0][1] * b[1][0]; \ - c[0][1] = a[0][0] * b[0][1] + a[0][1] * b[1][1]; \ - \ - c[1][0] = a[1][0] * b[0][0] + a[1][1] * b[1][0]; \ - c[1][1] = a[1][0] * b[0][1] + a[1][1] * b[1][1]; \ - } - -/*! matrix product */ -/*! c[x][y] = a[x][0]*b[0][y]+a[x][1]*b[1][y]+a[x][2]*b[2][y]+a[x][3]*b[3][y];*/ -#define MATRIX_PRODUCT_3X3(c, a, b) \ - { \ - c[0][0] = a[0][0] * b[0][0] + a[0][1] * b[1][0] + a[0][2] * b[2][0]; \ - c[0][1] = a[0][0] * b[0][1] + a[0][1] * b[1][1] + a[0][2] * b[2][1]; \ - c[0][2] = a[0][0] * b[0][2] + a[0][1] * b[1][2] + a[0][2] * b[2][2]; \ - \ - c[1][0] = a[1][0] * b[0][0] + a[1][1] * b[1][0] + a[1][2] * b[2][0]; \ - c[1][1] = a[1][0] * b[0][1] + a[1][1] * b[1][1] + a[1][2] * b[2][1]; \ - c[1][2] = a[1][0] * b[0][2] + a[1][1] * b[1][2] + a[1][2] * b[2][2]; \ - \ - c[2][0] = a[2][0] * b[0][0] + a[2][1] * b[1][0] + a[2][2] * b[2][0]; \ - c[2][1] = a[2][0] * b[0][1] + a[2][1] * b[1][1] + a[2][2] * b[2][1]; \ - c[2][2] = a[2][0] * b[0][2] + a[2][1] * b[1][2] + a[2][2] * b[2][2]; \ - } - -/*! matrix product */ -/*! c[x][y] = a[x][0]*b[0][y]+a[x][1]*b[1][y]+a[x][2]*b[2][y]+a[x][3]*b[3][y];*/ -#define MATRIX_PRODUCT_4X4(c, a, b) \ - { \ - c[0][0] = a[0][0] * b[0][0] + a[0][1] * b[1][0] + a[0][2] * b[2][0] + a[0][3] * b[3][0]; \ - c[0][1] = a[0][0] * b[0][1] + a[0][1] * b[1][1] + a[0][2] * b[2][1] + a[0][3] * b[3][1]; \ - c[0][2] = a[0][0] * b[0][2] + a[0][1] * b[1][2] + a[0][2] * b[2][2] + a[0][3] * b[3][2]; \ - c[0][3] = a[0][0] * b[0][3] + a[0][1] * b[1][3] + a[0][2] * b[2][3] + a[0][3] * b[3][3]; \ - \ - c[1][0] = a[1][0] * b[0][0] + a[1][1] * b[1][0] + a[1][2] * b[2][0] + a[1][3] * b[3][0]; \ - c[1][1] = a[1][0] * b[0][1] + a[1][1] * b[1][1] + a[1][2] * b[2][1] + a[1][3] * b[3][1]; \ - c[1][2] = a[1][0] * b[0][2] + a[1][1] * b[1][2] + a[1][2] * b[2][2] + a[1][3] * b[3][2]; \ - c[1][3] = a[1][0] * b[0][3] + a[1][1] * b[1][3] + a[1][2] * b[2][3] + a[1][3] * b[3][3]; \ - \ - c[2][0] = a[2][0] * b[0][0] + a[2][1] * b[1][0] + a[2][2] * b[2][0] + a[2][3] * b[3][0]; \ - c[2][1] = a[2][0] * b[0][1] + a[2][1] * b[1][1] + a[2][2] * b[2][1] + a[2][3] * b[3][1]; \ - c[2][2] = a[2][0] * b[0][2] + a[2][1] * b[1][2] + a[2][2] * b[2][2] + a[2][3] * b[3][2]; \ - c[2][3] = a[2][0] * b[0][3] + a[2][1] * b[1][3] + a[2][2] * b[2][3] + a[2][3] * b[3][3]; \ - \ - c[3][0] = a[3][0] * b[0][0] + a[3][1] * b[1][0] + a[3][2] * b[2][0] + a[3][3] * b[3][0]; \ - c[3][1] = a[3][0] * b[0][1] + a[3][1] * b[1][1] + a[3][2] * b[2][1] + a[3][3] * b[3][1]; \ - c[3][2] = a[3][0] * b[0][2] + a[3][1] * b[1][2] + a[3][2] * b[2][2] + a[3][3] * b[3][2]; \ - c[3][3] = a[3][0] * b[0][3] + a[3][1] * b[1][3] + a[3][2] * b[2][3] + a[3][3] * b[3][3]; \ - } - -/*! matrix times vector */ -#define MAT_DOT_VEC_2X2(p, m, v) \ - { \ - p[0] = m[0][0] * v[0] + m[0][1] * v[1]; \ - p[1] = m[1][0] * v[0] + m[1][1] * v[1]; \ - } - -/*! matrix times vector */ -#define MAT_DOT_VEC_3X3(p, m, v) \ - { \ - p[0] = m[0][0] * v[0] + m[0][1] * v[1] + m[0][2] * v[2]; \ - p[1] = m[1][0] * v[0] + m[1][1] * v[1] + m[1][2] * v[2]; \ - p[2] = m[2][0] * v[0] + m[2][1] * v[1] + m[2][2] * v[2]; \ - } - -/*! matrix times vector -v is a vec4f -*/ -#define MAT_DOT_VEC_4X4(p, m, v) \ - { \ - p[0] = m[0][0] * v[0] + m[0][1] * v[1] + m[0][2] * v[2] + m[0][3] * v[3]; \ - p[1] = m[1][0] * v[0] + m[1][1] * v[1] + m[1][2] * v[2] + m[1][3] * v[3]; \ - p[2] = m[2][0] * v[0] + m[2][1] * v[1] + m[2][2] * v[2] + m[2][3] * v[3]; \ - p[3] = m[3][0] * v[0] + m[3][1] * v[1] + m[3][2] * v[2] + m[3][3] * v[3]; \ - } - -/*! matrix times vector -v is a vec3f -and m is a mat4f
    -Last column is added as the position -*/ -#define MAT_DOT_VEC_3X4(p, m, v) \ - { \ - p[0] = m[0][0] * v[0] + m[0][1] * v[1] + m[0][2] * v[2] + m[0][3]; \ - p[1] = m[1][0] * v[0] + m[1][1] * v[1] + m[1][2] * v[2] + m[1][3]; \ - p[2] = m[2][0] * v[0] + m[2][1] * v[1] + m[2][2] * v[2] + m[2][3]; \ - } - -/*! vector transpose times matrix */ -/*! p[j] = v[0]*m[0][j] + v[1]*m[1][j] + v[2]*m[2][j]; */ -#define VEC_DOT_MAT_3X3(p, v, m) \ - { \ - p[0] = v[0] * m[0][0] + v[1] * m[1][0] + v[2] * m[2][0]; \ - p[1] = v[0] * m[0][1] + v[1] * m[1][1] + v[2] * m[2][1]; \ - p[2] = v[0] * m[0][2] + v[1] * m[1][2] + v[2] * m[2][2]; \ - } - -/*! affine matrix times vector */ -/** The matrix is assumed to be an affine matrix, with last two - * entries representing a translation */ -#define MAT_DOT_VEC_2X3(p, m, v) \ - { \ - p[0] = m[0][0] * v[0] + m[0][1] * v[1] + m[0][2]; \ - p[1] = m[1][0] * v[0] + m[1][1] * v[1] + m[1][2]; \ - } - -//! Transform a plane -#define MAT_TRANSFORM_PLANE_4X4(pout, m, plane) \ - { \ - pout[0] = m[0][0] * plane[0] + m[0][1] * plane[1] + m[0][2] * plane[2]; \ - pout[1] = m[1][0] * plane[0] + m[1][1] * plane[1] + m[1][2] * plane[2]; \ - pout[2] = m[2][0] * plane[0] + m[2][1] * plane[1] + m[2][2] * plane[2]; \ - pout[3] = m[0][3] * pout[0] + m[1][3] * pout[1] + m[2][3] * pout[2] + plane[3]; \ - } - -/** inverse transpose of matrix times vector - * - * This macro computes inverse transpose of matrix m, - * and multiplies vector v into it, to yeild vector p - * - * DANGER !!! Do Not use this on normal vectors!!! - * It will leave normals the wrong length !!! - * See macro below for use on normals. - */ -#define INV_TRANSP_MAT_DOT_VEC_2X2(p, m, v) \ - { \ - GREAL det; \ - \ - det = m[0][0] * m[1][1] - m[0][1] * m[1][0]; \ - p[0] = m[1][1] * v[0] - m[1][0] * v[1]; \ - p[1] = -m[0][1] * v[0] + m[0][0] * v[1]; \ - \ - /* if matrix not singular, and not orthonormal, then renormalize */ \ - if ((det != 1.0f) && (det != 0.0f)) \ - { \ - det = 1.0f / det; \ - p[0] *= det; \ - p[1] *= det; \ - } \ - } - -/** transform normal vector by inverse transpose of matrix - * and then renormalize the vector - * - * This macro computes inverse transpose of matrix m, - * and multiplies vector v into it, to yeild vector p - * Vector p is then normalized. - */ -#define NORM_XFORM_2X2(p, m, v) \ - { \ - GREAL len; \ - \ - /* do nothing if off-diagonals are zero and diagonals are \ - * equal */ \ - if ((m[0][1] != 0.0) || (m[1][0] != 0.0) || (m[0][0] != m[1][1])) \ - { \ - p[0] = m[1][1] * v[0] - m[1][0] * v[1]; \ - p[1] = -m[0][1] * v[0] + m[0][0] * v[1]; \ - \ - len = p[0] * p[0] + p[1] * p[1]; \ - GIM_INV_SQRT(len, len); \ - p[0] *= len; \ - p[1] *= len; \ - } \ - else \ - { \ - VEC_COPY_2(p, v); \ - } \ - } - -/** outer product of vector times vector transpose - * - * The outer product of vector v and vector transpose t yeilds - * dyadic matrix m. - */ -#define OUTER_PRODUCT_2X2(m, v, t) \ - { \ - m[0][0] = v[0] * t[0]; \ - m[0][1] = v[0] * t[1]; \ - \ - m[1][0] = v[1] * t[0]; \ - m[1][1] = v[1] * t[1]; \ - } - -/** outer product of vector times vector transpose - * - * The outer product of vector v and vector transpose t yeilds - * dyadic matrix m. - */ -#define OUTER_PRODUCT_3X3(m, v, t) \ - { \ - m[0][0] = v[0] * t[0]; \ - m[0][1] = v[0] * t[1]; \ - m[0][2] = v[0] * t[2]; \ - \ - m[1][0] = v[1] * t[0]; \ - m[1][1] = v[1] * t[1]; \ - m[1][2] = v[1] * t[2]; \ - \ - m[2][0] = v[2] * t[0]; \ - m[2][1] = v[2] * t[1]; \ - m[2][2] = v[2] * t[2]; \ - } - -/** outer product of vector times vector transpose - * - * The outer product of vector v and vector transpose t yeilds - * dyadic matrix m. - */ -#define OUTER_PRODUCT_4X4(m, v, t) \ - { \ - m[0][0] = v[0] * t[0]; \ - m[0][1] = v[0] * t[1]; \ - m[0][2] = v[0] * t[2]; \ - m[0][3] = v[0] * t[3]; \ - \ - m[1][0] = v[1] * t[0]; \ - m[1][1] = v[1] * t[1]; \ - m[1][2] = v[1] * t[2]; \ - m[1][3] = v[1] * t[3]; \ - \ - m[2][0] = v[2] * t[0]; \ - m[2][1] = v[2] * t[1]; \ - m[2][2] = v[2] * t[2]; \ - m[2][3] = v[2] * t[3]; \ - \ - m[3][0] = v[3] * t[0]; \ - m[3][1] = v[3] * t[1]; \ - m[3][2] = v[3] * t[2]; \ - m[3][3] = v[3] * t[3]; \ - } - -/** outer product of vector times vector transpose - * - * The outer product of vector v and vector transpose t yeilds - * dyadic matrix m. - */ -#define ACCUM_OUTER_PRODUCT_2X2(m, v, t) \ - { \ - m[0][0] += v[0] * t[0]; \ - m[0][1] += v[0] * t[1]; \ - \ - m[1][0] += v[1] * t[0]; \ - m[1][1] += v[1] * t[1]; \ - } - -/** outer product of vector times vector transpose - * - * The outer product of vector v and vector transpose t yeilds - * dyadic matrix m. - */ -#define ACCUM_OUTER_PRODUCT_3X3(m, v, t) \ - { \ - m[0][0] += v[0] * t[0]; \ - m[0][1] += v[0] * t[1]; \ - m[0][2] += v[0] * t[2]; \ - \ - m[1][0] += v[1] * t[0]; \ - m[1][1] += v[1] * t[1]; \ - m[1][2] += v[1] * t[2]; \ - \ - m[2][0] += v[2] * t[0]; \ - m[2][1] += v[2] * t[1]; \ - m[2][2] += v[2] * t[2]; \ - } - -/** outer product of vector times vector transpose - * - * The outer product of vector v and vector transpose t yeilds - * dyadic matrix m. - */ -#define ACCUM_OUTER_PRODUCT_4X4(m, v, t) \ - { \ - m[0][0] += v[0] * t[0]; \ - m[0][1] += v[0] * t[1]; \ - m[0][2] += v[0] * t[2]; \ - m[0][3] += v[0] * t[3]; \ - \ - m[1][0] += v[1] * t[0]; \ - m[1][1] += v[1] * t[1]; \ - m[1][2] += v[1] * t[2]; \ - m[1][3] += v[1] * t[3]; \ - \ - m[2][0] += v[2] * t[0]; \ - m[2][1] += v[2] * t[1]; \ - m[2][2] += v[2] * t[2]; \ - m[2][3] += v[2] * t[3]; \ - \ - m[3][0] += v[3] * t[0]; \ - m[3][1] += v[3] * t[1]; \ - m[3][2] += v[3] * t[2]; \ - m[3][3] += v[3] * t[3]; \ - } - -/** determinant of matrix - * - * Computes determinant of matrix m, returning d - */ -#define DETERMINANT_2X2(d, m) \ - { \ - d = m[0][0] * m[1][1] - m[0][1] * m[1][0]; \ - } - -/** determinant of matrix - * - * Computes determinant of matrix m, returning d - */ -#define DETERMINANT_3X3(d, m) \ - { \ - d = m[0][0] * (m[1][1] * m[2][2] - m[1][2] * m[2][1]); \ - d -= m[0][1] * (m[1][0] * m[2][2] - m[1][2] * m[2][0]); \ - d += m[0][2] * (m[1][0] * m[2][1] - m[1][1] * m[2][0]); \ - } - -/** i,j,th cofactor of a 4x4 matrix - * - */ -#define COFACTOR_4X4_IJ(fac, m, i, j) \ - { \ - GUINT __ii[4], __jj[4], __k; \ - \ - for (__k = 0; __k < i; __k++) __ii[__k] = __k; \ - for (__k = i; __k < 3; __k++) __ii[__k] = __k + 1; \ - for (__k = 0; __k < j; __k++) __jj[__k] = __k; \ - for (__k = j; __k < 3; __k++) __jj[__k] = __k + 1; \ - \ - (fac) = m[__ii[0]][__jj[0]] * (m[__ii[1]][__jj[1]] * m[__ii[2]][__jj[2]] - m[__ii[1]][__jj[2]] * m[__ii[2]][__jj[1]]); \ - (fac) -= m[__ii[0]][__jj[1]] * (m[__ii[1]][__jj[0]] * m[__ii[2]][__jj[2]] - m[__ii[1]][__jj[2]] * m[__ii[2]][__jj[0]]); \ - (fac) += m[__ii[0]][__jj[2]] * (m[__ii[1]][__jj[0]] * m[__ii[2]][__jj[1]] - m[__ii[1]][__jj[1]] * m[__ii[2]][__jj[0]]); \ - \ - __k = i + j; \ - if (__k != (__k / 2) * 2) \ - { \ - (fac) = -(fac); \ - } \ - } - -/** determinant of matrix - * - * Computes determinant of matrix m, returning d - */ -#define DETERMINANT_4X4(d, m) \ - { \ - GREAL cofac; \ - COFACTOR_4X4_IJ(cofac, m, 0, 0); \ - d = m[0][0] * cofac; \ - COFACTOR_4X4_IJ(cofac, m, 0, 1); \ - d += m[0][1] * cofac; \ - COFACTOR_4X4_IJ(cofac, m, 0, 2); \ - d += m[0][2] * cofac; \ - COFACTOR_4X4_IJ(cofac, m, 0, 3); \ - d += m[0][3] * cofac; \ - } - -/** cofactor of matrix - * - * Computes cofactor of matrix m, returning a - */ -#define COFACTOR_2X2(a, m) \ - { \ - a[0][0] = (m)[1][1]; \ - a[0][1] = -(m)[1][0]; \ - a[1][0] = -(m)[0][1]; \ - a[1][1] = (m)[0][0]; \ - } - -/** cofactor of matrix - * - * Computes cofactor of matrix m, returning a - */ -#define COFACTOR_3X3(a, m) \ - { \ - a[0][0] = m[1][1] * m[2][2] - m[1][2] * m[2][1]; \ - a[0][1] = -(m[1][0] * m[2][2] - m[2][0] * m[1][2]); \ - a[0][2] = m[1][0] * m[2][1] - m[1][1] * m[2][0]; \ - a[1][0] = -(m[0][1] * m[2][2] - m[0][2] * m[2][1]); \ - a[1][1] = m[0][0] * m[2][2] - m[0][2] * m[2][0]; \ - a[1][2] = -(m[0][0] * m[2][1] - m[0][1] * m[2][0]); \ - a[2][0] = m[0][1] * m[1][2] - m[0][2] * m[1][1]; \ - a[2][1] = -(m[0][0] * m[1][2] - m[0][2] * m[1][0]); \ - a[2][2] = m[0][0]*m[1][1] - m[0][1]*m[1][0]); \ - } - -/** cofactor of matrix - * - * Computes cofactor of matrix m, returning a - */ -#define COFACTOR_4X4(a, m) \ - { \ - int i, j; \ - \ - for (i = 0; i < 4; i++) \ - { \ - for (j = 0; j < 4; j++) \ - { \ - COFACTOR_4X4_IJ(a[i][j], m, i, j); \ - } \ - } \ - } - -/** adjoint of matrix - * - * Computes adjoint of matrix m, returning a - * (Note that adjoint is just the transpose of the cofactor matrix) - */ -#define ADJOINT_2X2(a, m) \ - { \ - a[0][0] = (m)[1][1]; \ - a[1][0] = -(m)[1][0]; \ - a[0][1] = -(m)[0][1]; \ - a[1][1] = (m)[0][0]; \ - } - -/** adjoint of matrix - * - * Computes adjoint of matrix m, returning a - * (Note that adjoint is just the transpose of the cofactor matrix) - */ -#define ADJOINT_3X3(a, m) \ - { \ - a[0][0] = m[1][1] * m[2][2] - m[1][2] * m[2][1]; \ - a[1][0] = -(m[1][0] * m[2][2] - m[2][0] * m[1][2]); \ - a[2][0] = m[1][0] * m[2][1] - m[1][1] * m[2][0]; \ - a[0][1] = -(m[0][1] * m[2][2] - m[0][2] * m[2][1]); \ - a[1][1] = m[0][0] * m[2][2] - m[0][2] * m[2][0]; \ - a[2][1] = -(m[0][0] * m[2][1] - m[0][1] * m[2][0]); \ - a[0][2] = m[0][1] * m[1][2] - m[0][2] * m[1][1]; \ - a[1][2] = -(m[0][0] * m[1][2] - m[0][2] * m[1][0]); \ - a[2][2] = m[0][0]*m[1][1] - m[0][1]*m[1][0]); \ - } - -/** adjoint of matrix - * - * Computes adjoint of matrix m, returning a - * (Note that adjoint is just the transpose of the cofactor matrix) - */ -#define ADJOINT_4X4(a, m) \ - { \ - char _i_, _j_; \ - \ - for (_i_ = 0; _i_ < 4; _i_++) \ - { \ - for (_j_ = 0; _j_ < 4; _j_++) \ - { \ - COFACTOR_4X4_IJ(a[_j_][_i_], m, _i_, _j_); \ - } \ - } \ - } - -/** compute adjoint of matrix and scale - * - * Computes adjoint of matrix m, scales it by s, returning a - */ -#define SCALE_ADJOINT_2X2(a, s, m) \ - { \ - a[0][0] = (s)*m[1][1]; \ - a[1][0] = -(s)*m[1][0]; \ - a[0][1] = -(s)*m[0][1]; \ - a[1][1] = (s)*m[0][0]; \ - } - -/** compute adjoint of matrix and scale - * - * Computes adjoint of matrix m, scales it by s, returning a - */ -#define SCALE_ADJOINT_3X3(a, s, m) \ - { \ - a[0][0] = (s) * (m[1][1] * m[2][2] - m[1][2] * m[2][1]); \ - a[1][0] = (s) * (m[1][2] * m[2][0] - m[1][0] * m[2][2]); \ - a[2][0] = (s) * (m[1][0] * m[2][1] - m[1][1] * m[2][0]); \ - \ - a[0][1] = (s) * (m[0][2] * m[2][1] - m[0][1] * m[2][2]); \ - a[1][1] = (s) * (m[0][0] * m[2][2] - m[0][2] * m[2][0]); \ - a[2][1] = (s) * (m[0][1] * m[2][0] - m[0][0] * m[2][1]); \ - \ - a[0][2] = (s) * (m[0][1] * m[1][2] - m[0][2] * m[1][1]); \ - a[1][2] = (s) * (m[0][2] * m[1][0] - m[0][0] * m[1][2]); \ - a[2][2] = (s) * (m[0][0] * m[1][1] - m[0][1] * m[1][0]); \ - } - -/** compute adjoint of matrix and scale - * - * Computes adjoint of matrix m, scales it by s, returning a - */ -#define SCALE_ADJOINT_4X4(a, s, m) \ - { \ - char _i_, _j_; \ - for (_i_ = 0; _i_ < 4; _i_++) \ - { \ - for (_j_ = 0; _j_ < 4; _j_++) \ - { \ - COFACTOR_4X4_IJ(a[_j_][_i_], m, _i_, _j_); \ - a[_j_][_i_] *= s; \ - } \ - } \ - } - -/** inverse of matrix - * - * Compute inverse of matrix a, returning determinant m and - * inverse b - */ -#define INVERT_2X2(b, det, a) \ - { \ - GREAL _tmp_; \ - DETERMINANT_2X2(det, a); \ - _tmp_ = 1.0 / (det); \ - SCALE_ADJOINT_2X2(b, _tmp_, a); \ - } - -/** inverse of matrix - * - * Compute inverse of matrix a, returning determinant m and - * inverse b - */ -#define INVERT_3X3(b, det, a) \ - { \ - GREAL _tmp_; \ - DETERMINANT_3X3(det, a); \ - _tmp_ = 1.0 / (det); \ - SCALE_ADJOINT_3X3(b, _tmp_, a); \ - } - -/** inverse of matrix - * - * Compute inverse of matrix a, returning determinant m and - * inverse b - */ -#define INVERT_4X4(b, det, a) \ - { \ - GREAL _tmp_; \ - DETERMINANT_4X4(det, a); \ - _tmp_ = 1.0 / (det); \ - SCALE_ADJOINT_4X4(b, _tmp_, a); \ - } - -//! Get the triple(3) row of a transform matrix -#define MAT_GET_ROW(mat, vec3, rowindex) \ - { \ - vec3[0] = mat[rowindex][0]; \ - vec3[1] = mat[rowindex][1]; \ - vec3[2] = mat[rowindex][2]; \ - } - -//! Get the tuple(2) row of a transform matrix -#define MAT_GET_ROW2(mat, vec2, rowindex) \ - { \ - vec2[0] = mat[rowindex][0]; \ - vec2[1] = mat[rowindex][1]; \ - } - -//! Get the quad (4) row of a transform matrix -#define MAT_GET_ROW4(mat, vec4, rowindex) \ - { \ - vec4[0] = mat[rowindex][0]; \ - vec4[1] = mat[rowindex][1]; \ - vec4[2] = mat[rowindex][2]; \ - vec4[3] = mat[rowindex][3]; \ - } - -//! Get the triple(3) col of a transform matrix -#define MAT_GET_COL(mat, vec3, colindex) \ - { \ - vec3[0] = mat[0][colindex]; \ - vec3[1] = mat[1][colindex]; \ - vec3[2] = mat[2][colindex]; \ - } - -//! Get the tuple(2) col of a transform matrix -#define MAT_GET_COL2(mat, vec2, colindex) \ - { \ - vec2[0] = mat[0][colindex]; \ - vec2[1] = mat[1][colindex]; \ - } - -//! Get the quad (4) col of a transform matrix -#define MAT_GET_COL4(mat, vec4, colindex) \ - { \ - vec4[0] = mat[0][colindex]; \ - vec4[1] = mat[1][colindex]; \ - vec4[2] = mat[2][colindex]; \ - vec4[3] = mat[3][colindex]; \ - } - -//! Get the triple(3) col of a transform matrix -#define MAT_GET_X(mat, vec3) \ - { \ - MAT_GET_COL(mat, vec3, 0); \ - } - -//! Get the triple(3) col of a transform matrix -#define MAT_GET_Y(mat, vec3) \ - { \ - MAT_GET_COL(mat, vec3, 1); \ - } - -//! Get the triple(3) col of a transform matrix -#define MAT_GET_Z(mat, vec3) \ - { \ - MAT_GET_COL(mat, vec3, 2); \ - } - -//! Get the triple(3) col of a transform matrix -#define MAT_SET_X(mat, vec3) \ - { \ - mat[0][0] = vec3[0]; \ - mat[1][0] = vec3[1]; \ - mat[2][0] = vec3[2]; \ - } - -//! Get the triple(3) col of a transform matrix -#define MAT_SET_Y(mat, vec3) \ - { \ - mat[0][1] = vec3[0]; \ - mat[1][1] = vec3[1]; \ - mat[2][1] = vec3[2]; \ - } - -//! Get the triple(3) col of a transform matrix -#define MAT_SET_Z(mat, vec3) \ - { \ - mat[0][2] = vec3[0]; \ - mat[1][2] = vec3[1]; \ - mat[2][2] = vec3[2]; \ - } - -//! Get the triple(3) col of a transform matrix -#define MAT_GET_TRANSLATION(mat, vec3) \ - { \ - vec3[0] = mat[0][3]; \ - vec3[1] = mat[1][3]; \ - vec3[2] = mat[2][3]; \ - } - -//! Set the triple(3) col of a transform matrix -#define MAT_SET_TRANSLATION(mat, vec3) \ - { \ - mat[0][3] = vec3[0]; \ - mat[1][3] = vec3[1]; \ - mat[2][3] = vec3[2]; \ - } - -//! Returns the dot product between a vec3f and the row of a matrix -#define MAT_DOT_ROW(mat, vec3, rowindex) (vec3[0] * mat[rowindex][0] + vec3[1] * mat[rowindex][1] + vec3[2] * mat[rowindex][2]) - -//! Returns the dot product between a vec2f and the row of a matrix -#define MAT_DOT_ROW2(mat, vec2, rowindex) (vec2[0] * mat[rowindex][0] + vec2[1] * mat[rowindex][1]) - -//! Returns the dot product between a vec4f and the row of a matrix -#define MAT_DOT_ROW4(mat, vec4, rowindex) (vec4[0] * mat[rowindex][0] + vec4[1] * mat[rowindex][1] + vec4[2] * mat[rowindex][2] + vec4[3] * mat[rowindex][3]) - -//! Returns the dot product between a vec3f and the col of a matrix -#define MAT_DOT_COL(mat, vec3, colindex) (vec3[0] * mat[0][colindex] + vec3[1] * mat[1][colindex] + vec3[2] * mat[2][colindex]) - -//! Returns the dot product between a vec2f and the col of a matrix -#define MAT_DOT_COL2(mat, vec2, colindex) (vec2[0] * mat[0][colindex] + vec2[1] * mat[1][colindex]) - -//! Returns the dot product between a vec4f and the col of a matrix -#define MAT_DOT_COL4(mat, vec4, colindex) (vec4[0] * mat[0][colindex] + vec4[1] * mat[1][colindex] + vec4[2] * mat[2][colindex] + vec4[3] * mat[3][colindex]) - -/*!Transpose matrix times vector -v is a vec3f -and m is a mat4f
    -*/ -#define INV_MAT_DOT_VEC_3X3(p, m, v) \ - { \ - p[0] = MAT_DOT_COL(m, v, 0); \ - p[1] = MAT_DOT_COL(m, v, 1); \ - p[2] = MAT_DOT_COL(m, v, 2); \ - } - -#endif // GIM_VECTOR_H_INCLUDED diff --git a/engine/inc/bullet/BulletCollision/Gimpact/gim_math.h b/engine/inc/bullet/BulletCollision/Gimpact/gim_math.h deleted file mode 100644 index 3c4f821a..00000000 --- a/engine/inc/bullet/BulletCollision/Gimpact/gim_math.h +++ /dev/null @@ -1,148 +0,0 @@ -#ifndef GIM_MATH_H_INCLUDED -#define GIM_MATH_H_INCLUDED -/*! \file gim_math.h -\author Francisco Leon Najera -*/ -/* ------------------------------------------------------------------------------ -This source file is part of GIMPACT Library. - -For the latest info, see http://gimpact.sourceforge.net/ - -Copyright (c) 2006 Francisco Leon Najera. C.C. 80087371. -email: projectileman@yahoo.com - - This library is free software; you can redistribute it and/or - modify it under the terms of EITHER: - (1) The GNU Lesser General Public License as published by the Free - Software Foundation; either version 2.1 of the License, or (at - your option) any later version. The text of the GNU Lesser - General Public License is included with this library in the - file GIMPACT-LICENSE-LGPL.TXT. - (2) The BSD-style license that is included with this library in - the file GIMPACT-LICENSE-BSD.TXT. - (3) The zlib/libpng license that is included with this library in - the file GIMPACT-LICENSE-ZLIB.TXT. - - This library 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 files - GIMPACT-LICENSE-LGPL.TXT, GIMPACT-LICENSE-ZLIB.TXT and GIMPACT-LICENSE-BSD.TXT for more details. - ------------------------------------------------------------------------------ -*/ - -#include "LinearMath/btScalar.h" - -#define GREAL btScalar -#define GREAL2 double -#define GINT int -#define GUINT unsigned int -#define GSHORT short -#define GUSHORT unsigned short -#define GINT64 long long -#define GUINT64 unsigned long long - -#define G_PI 3.14159265358979f -#define G_HALF_PI 1.5707963f -//267948966 -#define G_TWO_PI 6.28318530f -//71795864 -#define G_ROOT3 1.73205f -#define G_ROOT2 1.41421f -#define G_UINT_INFINITY 0xffffffff //!< A very very high value -#define G_REAL_INFINITY FLT_MAX -#define G_SIGN_BITMASK 0x80000000 -#define G_EPSILON SIMD_EPSILON - -enum GIM_SCALAR_TYPES -{ - G_STYPE_REAL = 0, - G_STYPE_REAL2, - G_STYPE_SHORT, - G_STYPE_USHORT, - G_STYPE_INT, - G_STYPE_UINT, - G_STYPE_INT64, - G_STYPE_UINT64 -}; - -#define G_DEGTORAD(X) ((X)*3.1415926f / 180.0f) -#define G_RADTODEG(X) ((X)*180.0f / 3.1415926f) - -//! Integer representation of a floating-point value. -#define GIM_IR(x) ((GUINT&)(x)) - -//! Signed integer representation of a floating-point value. -#define GIM_SIR(x) ((GINT&)(x)) - -//! Absolute integer representation of a floating-point value -#define GIM_AIR(x) (GIM_IR(x) & 0x7fffffff) - -//! Floating-point representation of an integer value. -#define GIM_FR(x) ((GREAL&)(x)) - -#define GIM_MAX(a, b) (a < b ? b : a) -#define GIM_MIN(a, b) (a > b ? b : a) - -#define GIM_MAX3(a, b, c) GIM_MAX(a, GIM_MAX(b, c)) -#define GIM_MIN3(a, b, c) GIM_MIN(a, GIM_MIN(b, c)) - -#define GIM_IS_ZERO(value) (value < G_EPSILON && value > -G_EPSILON) - -#define GIM_IS_NEGATIVE(value) (value <= -G_EPSILON) - -#define GIM_IS_POSISITVE(value) (value >= G_EPSILON) - -#define GIM_NEAR_EQUAL(v1, v2) GIM_IS_ZERO((v1 - v2)) - -///returns a clamped number -#define GIM_CLAMP(number, minval, maxval) (number < minval ? minval : (number > maxval ? maxval : number)) - -#define GIM_GREATER(x, y) btFabs(x) > (y) - -///Swap numbers -#define GIM_SWAP_NUMBERS(a, b) \ - { \ - a = a + b; \ - b = a - b; \ - a = a - b; \ - } - -#define GIM_INV_SQRT(va, isva) \ - { \ - if (va <= 0.0000001f) \ - { \ - isva = G_REAL_INFINITY; \ - } \ - else \ - { \ - GREAL _x = va * 0.5f; \ - GUINT _y = 0x5f3759df - (GIM_IR(va) >> 1); \ - isva = GIM_FR(_y); \ - isva = isva * (1.5f - (_x * isva * isva)); \ - } \ - } - -#define GIM_SQRT(va, sva) \ - { \ - GIM_INV_SQRT(va, sva); \ - sva = 1.0f / sva; \ - } - -//! Computes 1.0f / sqrtf(x). Comes from Quake3. See http://www.magic-software.com/3DGEDInvSqrt.html -inline GREAL gim_inv_sqrt(GREAL f) -{ - GREAL r; - GIM_INV_SQRT(f, r); - return r; -} - -inline GREAL gim_sqrt(GREAL f) -{ - GREAL r; - GIM_SQRT(f, r); - return r; -} - -#endif // GIM_MATH_H_INCLUDED diff --git a/engine/inc/bullet/BulletCollision/Gimpact/gim_memory.h b/engine/inc/bullet/BulletCollision/Gimpact/gim_memory.h deleted file mode 100644 index fffbfa23..00000000 --- a/engine/inc/bullet/BulletCollision/Gimpact/gim_memory.h +++ /dev/null @@ -1,177 +0,0 @@ -#ifndef GIM_MEMORY_H_INCLUDED -#define GIM_MEMORY_H_INCLUDED -/*! \file gim_memory.h -\author Francisco Leon Najera -*/ -/* ------------------------------------------------------------------------------ -This source file is part of GIMPACT Library. - -For the latest info, see http://gimpact.sourceforge.net/ - -Copyright (c) 2006 Francisco Leon Najera. C.C. 80087371. -email: projectileman@yahoo.com - - This library is free software; you can redistribute it and/or - modify it under the terms of EITHER: - (1) The GNU Lesser General Public License as published by the Free - Software Foundation; either version 2.1 of the License, or (at - your option) any later version. The text of the GNU Lesser - General Public License is included with this library in the - file GIMPACT-LICENSE-LGPL.TXT. - (2) The BSD-style license that is included with this library in - the file GIMPACT-LICENSE-BSD.TXT. - (3) The zlib/libpng license that is included with this library in - the file GIMPACT-LICENSE-ZLIB.TXT. - - This library 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 files - GIMPACT-LICENSE-LGPL.TXT, GIMPACT-LICENSE-ZLIB.TXT and GIMPACT-LICENSE-BSD.TXT for more details. - ------------------------------------------------------------------------------ -*/ - -#include "gim_math.h" -#include - -#ifdef PREFETCH -#include // for prefetch -#define pfval 64 -#define pfval2 128 -//! Prefetch 64 -#define pf(_x, _i) _mm_prefetch((void *)(_x + _i + pfval), 0) -//! Prefetch 128 -#define pf2(_x, _i) _mm_prefetch((void *)(_x + _i + pfval2), 0) -#else -//! Prefetch 64 -#define pf(_x, _i) -//! Prefetch 128 -#define pf2(_x, _i) -#endif - -///Functions for manip packed arrays of numbers -#define GIM_COPY_ARRAYS(dest_array, source_array, element_count) \ - { \ - for (GUINT _i_ = 0; _i_ < element_count; ++_i_) \ - { \ - dest_array[_i_] = source_array[_i_]; \ - } \ - } - -#define GIM_COPY_ARRAYS_1(dest_array, source_array, element_count, copy_macro) \ - { \ - for (GUINT _i_ = 0; _i_ < element_count; ++_i_) \ - { \ - copy_macro(dest_array[_i_], source_array[_i_]); \ - } \ - } - -#define GIM_ZERO_ARRAY(array, element_count) \ - { \ - for (GUINT _i_ = 0; _i_ < element_count; ++_i_) \ - { \ - array[_i_] = 0; \ - } \ - } - -#define GIM_CONSTANT_ARRAY(array, element_count, constant) \ - { \ - for (GUINT _i_ = 0; _i_ < element_count; ++_i_) \ - { \ - array[_i_] = constant; \ - } \ - } - -///Function prototypes to allocate and free memory. -typedef void *gim_alloc_function(size_t size); -typedef void *gim_alloca_function(size_t size); //Allocs on the heap -typedef void *gim_realloc_function(void *ptr, size_t oldsize, size_t newsize); -typedef void gim_free_function(void *ptr); - -///Memory Function Handlers -///set new memory management functions. if fn is 0, the default handlers are used. -void gim_set_alloc_handler(gim_alloc_function *fn); -void gim_set_alloca_handler(gim_alloca_function *fn); -void gim_set_realloc_handler(gim_realloc_function *fn); -void gim_set_free_handler(gim_free_function *fn); - -///get current memory management functions. -gim_alloc_function *gim_get_alloc_handler(void); -gim_alloca_function *gim_get_alloca_handler(void); -gim_realloc_function *gim_get_realloc_handler(void); -gim_free_function *gim_get_free_handler(void); - -///Standar Memory functions -void *gim_alloc(size_t size); -void *gim_alloca(size_t size); -void *gim_realloc(void *ptr, size_t oldsize, size_t newsize); -void gim_free(void *ptr); - -#if defined(_WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__) -#define GIM_SIMD_MEMORY 1 -#endif - -//! SIMD POINTER INTEGER -#define SIMD_T GUINT64 -//! SIMD INTEGER SIZE -#define SIMD_T_SIZE sizeof(SIMD_T) - -inline void gim_simd_memcpy(void *dst, const void *src, size_t copysize) -{ -#ifdef GIM_SIMD_MEMORY - /* -//'long long int' is incompatible with visual studio 6... - //copy words - SIMD_T * ui_src_ptr = (SIMD_T *)src; - SIMD_T * ui_dst_ptr = (SIMD_T *)dst; - while(copysize>=SIMD_T_SIZE) - { - *(ui_dst_ptr++) = *(ui_src_ptr++); - copysize-=SIMD_T_SIZE; - } - if(copysize==0) return; -*/ - - char *c_src_ptr = (char *)src; - char *c_dst_ptr = (char *)dst; - while (copysize > 0) - { - *(c_dst_ptr++) = *(c_src_ptr++); - copysize--; - } - return; -#else - memcpy(dst, src, copysize); -#endif -} - -template -inline void gim_swap_elements(T *_array, size_t _i, size_t _j) -{ - T _e_tmp_ = _array[_i]; - _array[_i] = _array[_j]; - _array[_j] = _e_tmp_; -} - -template -inline void gim_swap_elements_memcpy(T *_array, size_t _i, size_t _j) -{ - char _e_tmp_[sizeof(T)]; - gim_simd_memcpy(_e_tmp_, &_array[_i], sizeof(T)); - gim_simd_memcpy(&_array[_i], &_array[_j], sizeof(T)); - gim_simd_memcpy(&_array[_j], _e_tmp_, sizeof(T)); -} - -template -inline void gim_swap_elements_ptr(char *_array, size_t _i, size_t _j) -{ - char _e_tmp_[SIZE]; - _i *= SIZE; - _j *= SIZE; - gim_simd_memcpy(_e_tmp_, _array + _i, SIZE); - gim_simd_memcpy(_array + _i, _array + _j, SIZE); - gim_simd_memcpy(_array + _j, _e_tmp_, SIZE); -} - -#endif // GIM_MEMORY_H_INCLUDED diff --git a/engine/inc/bullet/BulletCollision/Gimpact/gim_pair.h b/engine/inc/bullet/BulletCollision/Gimpact/gim_pair.h deleted file mode 100644 index 56c185a5..00000000 --- a/engine/inc/bullet/BulletCollision/Gimpact/gim_pair.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef GIM_PAIR_H -#define GIM_PAIR_H - - -//! Overlapping pair -struct GIM_PAIR -{ - int m_index1; - int m_index2; - GIM_PAIR() - { - } - - GIM_PAIR(const GIM_PAIR& p) - { - m_index1 = p.m_index1; - m_index2 = p.m_index2; - } - - GIM_PAIR(int index1, int index2) - { - m_index1 = index1; - m_index2 = index2; - } -}; - -#endif //GIM_PAIR_H - diff --git a/engine/inc/bullet/BulletCollision/Gimpact/gim_radixsort.h b/engine/inc/bullet/BulletCollision/Gimpact/gim_radixsort.h deleted file mode 100644 index ff7907ad..00000000 --- a/engine/inc/bullet/BulletCollision/Gimpact/gim_radixsort.h +++ /dev/null @@ -1,386 +0,0 @@ -#ifndef GIM_RADIXSORT_H_INCLUDED -#define GIM_RADIXSORT_H_INCLUDED -/*! \file gim_radixsort.h -\author Francisco Leon Najera. -Based on the work of Michael Herf : "fast floating-point radix sort" -Avaliable on http://www.stereopsis.com/radix.html -*/ -/* ------------------------------------------------------------------------------ -This source file is part of GIMPACT Library. - -For the latest info, see http://gimpact.sourceforge.net/ - -Copyright (c) 2006 Francisco Leon Najera. C.C. 80087371. -email: projectileman@yahoo.com - - This library is free software; you can redistribute it and/or - modify it under the terms of EITHER: - (1) The GNU Lesser General Public License as published by the Free - Software Foundation; either version 2.1 of the License, or (at - your option) any later version. The text of the GNU Lesser - General Public License is included with this library in the - file GIMPACT-LICENSE-LGPL.TXT. - (2) The BSD-style license that is included with this library in - the file GIMPACT-LICENSE-BSD.TXT. - (3) The zlib/libpng license that is included with this library in - the file GIMPACT-LICENSE-ZLIB.TXT. - - This library 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 files - GIMPACT-LICENSE-LGPL.TXT, GIMPACT-LICENSE-ZLIB.TXT and GIMPACT-LICENSE-BSD.TXT for more details. - ------------------------------------------------------------------------------ -*/ - -#include "gim_memory.h" - -///Macros for sorting. -//! Prototype for comparators -class less_comparator -{ -public: - template - inline int operator()(const T& a, const Z& b) - { - return (a < b ? -1 : (a > b ? 1 : 0)); - } -}; - -//! Prototype for comparators -class integer_comparator -{ -public: - template - inline int operator()(const T& a, const T& b) - { - return (int)(a - b); - } -}; - -//!Prototype for getting the integer representation of an object -class uint_key_func -{ -public: - template - inline GUINT operator()(const T& a) - { - return (GUINT)a; - } -}; - -//!Prototype for copying elements -class copy_elements_func -{ -public: - template - inline void operator()(T& a, T& b) - { - a = b; - } -}; - -//!Prototype for copying elements -class memcopy_elements_func -{ -public: - template - inline void operator()(T& a, T& b) - { - gim_simd_memcpy(&a, &b, sizeof(T)); - } -}; - -//! @{ -struct GIM_RSORT_TOKEN -{ - GUINT m_key; - GUINT m_value; - GIM_RSORT_TOKEN() - { - } - GIM_RSORT_TOKEN(const GIM_RSORT_TOKEN& rtoken) - { - m_key = rtoken.m_key; - m_value = rtoken.m_value; - } - - inline bool operator<(const GIM_RSORT_TOKEN& other) const - { - return (m_key < other.m_key); - } - - inline bool operator>(const GIM_RSORT_TOKEN& other) const - { - return (m_key > other.m_key); - } -}; - -//! Prototype for comparators -class GIM_RSORT_TOKEN_COMPARATOR -{ -public: - inline int operator()(const GIM_RSORT_TOKEN& a, const GIM_RSORT_TOKEN& b) - { - return (int)((a.m_key) - (b.m_key)); - } -}; - -#define kHist 2048 -// ---- utils for accessing 11-bit quantities -#define D11_0(x) (x & 0x7FF) -#define D11_1(x) (x >> 11 & 0x7FF) -#define D11_2(x) (x >> 22) - -///Radix sort for unsigned integer keys -inline void gim_radix_sort_rtokens( - GIM_RSORT_TOKEN* array, - GIM_RSORT_TOKEN* sorted, GUINT element_count) -{ - GUINT i; - GUINT b0[kHist * 3]; - GUINT* b1 = b0 + kHist; - GUINT* b2 = b1 + kHist; - for (i = 0; i < kHist * 3; ++i) - { - b0[i] = 0; - } - GUINT fi; - GUINT pos; - for (i = 0; i < element_count; ++i) - { - fi = array[i].m_key; - b0[D11_0(fi)]++; - b1[D11_1(fi)]++; - b2[D11_2(fi)]++; - } - { - GUINT sum0 = 0, sum1 = 0, sum2 = 0; - GUINT tsum; - for (i = 0; i < kHist; ++i) - { - tsum = b0[i] + sum0; - b0[i] = sum0 - 1; - sum0 = tsum; - tsum = b1[i] + sum1; - b1[i] = sum1 - 1; - sum1 = tsum; - tsum = b2[i] + sum2; - b2[i] = sum2 - 1; - sum2 = tsum; - } - } - for (i = 0; i < element_count; ++i) - { - fi = array[i].m_key; - pos = D11_0(fi); - pos = ++b0[pos]; - sorted[pos].m_key = array[i].m_key; - sorted[pos].m_value = array[i].m_value; - } - for (i = 0; i < element_count; ++i) - { - fi = sorted[i].m_key; - pos = D11_1(fi); - pos = ++b1[pos]; - array[pos].m_key = sorted[i].m_key; - array[pos].m_value = sorted[i].m_value; - } - for (i = 0; i < element_count; ++i) - { - fi = array[i].m_key; - pos = D11_2(fi); - pos = ++b2[pos]; - sorted[pos].m_key = array[i].m_key; - sorted[pos].m_value = array[i].m_value; - } -} - -/// Get the sorted tokens from an array. For generic use. Tokens are IRR_RSORT_TOKEN -/*! -*\param array Array of elements to sort -*\param sorted_tokens Tokens of sorted elements -*\param element_count element count -*\param uintkey_macro Functor which retrieves the integer representation of an array element -*/ -template -void gim_radix_sort_array_tokens( - T* array, - GIM_RSORT_TOKEN* sorted_tokens, - GUINT element_count, GETKEY_CLASS uintkey_macro) -{ - GIM_RSORT_TOKEN* _unsorted = (GIM_RSORT_TOKEN*)gim_alloc(sizeof(GIM_RSORT_TOKEN) * element_count); - for (GUINT _i = 0; _i < element_count; ++_i) - { - _unsorted[_i].m_key = uintkey_macro(array[_i]); - _unsorted[_i].m_value = _i; - } - gim_radix_sort_rtokens(_unsorted, sorted_tokens, element_count); - gim_free(_unsorted); - gim_free(_unsorted); -} - -/// Sorts array in place. For generic use -/*! -\param type Type of the array -\param array -\param element_count -\param get_uintkey_macro Macro for extract the Integer value of the element. Similar to SIMPLE_GET_UINTKEY -\param copy_elements_macro Macro for copy elements, similar to SIMPLE_COPY_ELEMENTS -*/ -template -void gim_radix_sort( - T* array, GUINT element_count, - GETKEY_CLASS get_uintkey_macro, COPY_CLASS copy_elements_macro) -{ - GIM_RSORT_TOKEN* _sorted = (GIM_RSORT_TOKEN*)gim_alloc(sizeof(GIM_RSORT_TOKEN) * element_count); - gim_radix_sort_array_tokens(array, _sorted, element_count, get_uintkey_macro); - T* _original_array = (T*)gim_alloc(sizeof(T) * element_count); - gim_simd_memcpy(_original_array, array, sizeof(T) * element_count); - for (GUINT _i = 0; _i < element_count; ++_i) - { - copy_elements_macro(array[_i], _original_array[_sorted[_i].m_value]); - } - gim_free(_original_array); - gim_free(_sorted); -} - -//! Failsafe Iterative binary search, -/*! -If the element is not found, it returns the nearest upper element position, may be the further position after the last element. -\param _array -\param _start_i the beginning of the array -\param _end_i the ending index of the array -\param _search_key Value to find -\param _comp_macro macro for comparing elements -\param _found If true the value has found. Boolean -\param _result_index the index of the found element, or if not found then it will get the index of the closest bigger value -*/ -template -bool gim_binary_search_ex( - const T* _array, GUINT _start_i, - GUINT _end_i, GUINT& _result_index, - const KEYCLASS& _search_key, - COMP_CLASS _comp_macro) -{ - GUINT _k; - int _comp_result; - GUINT _i = _start_i; - GUINT _j = _end_i + 1; - while (_i < _j) - { - _k = (_j + _i - 1) / 2; - _comp_result = _comp_macro(_array[_k], _search_key); - if (_comp_result == 0) - { - _result_index = _k; - return true; - } - else if (_comp_result < 0) - { - _i = _k + 1; - } - else - { - _j = _k; - } - } - _result_index = _i; - return false; -} - -//! Failsafe Iterative binary search,Template version -/*! -If the element is not found, it returns the nearest upper element position, may be the further position after the last element. -\param _array -\param _start_i the beginning of the array -\param _end_i the ending index of the array -\param _search_key Value to find -\param _result_index the index of the found element, or if not found then it will get the index of the closest bigger value -\return true if found, else false -*/ -template -bool gim_binary_search( - const T* _array, GUINT _start_i, - GUINT _end_i, const T& _search_key, - GUINT& _result_index) -{ - GUINT _i = _start_i; - GUINT _j = _end_i + 1; - GUINT _k; - while (_i < _j) - { - _k = (_j + _i - 1) / 2; - if (_array[_k] == _search_key) - { - _result_index = _k; - return true; - } - else if (_array[_k] < _search_key) - { - _i = _k + 1; - } - else - { - _j = _k; - } - } - _result_index = _i; - return false; -} - -///heap sort from http://www.csse.monash.edu.au/~lloyd/tildeAlgDS/Sort/Heap/ -template -void gim_down_heap(T* pArr, GUINT k, GUINT n, COMP_CLASS CompareFunc) -{ - /* PRE: a[k+1..N] is a heap */ - /* POST: a[k..N] is a heap */ - - T temp = pArr[k - 1]; - /* k has child(s) */ - while (k <= n / 2) - { - int child = 2 * k; - - if ((child < (int)n) && CompareFunc(pArr[child - 1], pArr[child]) < 0) - { - child++; - } - /* pick larger child */ - if (CompareFunc(temp, pArr[child - 1]) < 0) - { - /* move child up */ - pArr[k - 1] = pArr[child - 1]; - k = child; - } - else - { - break; - } - } - pArr[k - 1] = temp; -} /*downHeap*/ - -template -void gim_heap_sort(T* pArr, GUINT element_count, COMP_CLASS CompareFunc) -{ - /* sort a[0..N-1], N.B. 0 to N-1 */ - GUINT k; - GUINT n = element_count; - for (k = n / 2; k > 0; k--) - { - gim_down_heap(pArr, k, n, CompareFunc); - } - - /* a[1..N] is now a heap */ - while (n >= 2) - { - gim_swap_elements(pArr, 0, n - 1); /* largest of a[0..n-1] */ - --n; - /* restore a[1..i-1] heap */ - gim_down_heap(pArr, 1, n, CompareFunc); - } -} - -#endif // GIM_RADIXSORT_H_INCLUDED diff --git a/engine/inc/bullet/BulletCollision/Gimpact/gim_tri_collision.h b/engine/inc/bullet/BulletCollision/Gimpact/gim_tri_collision.h deleted file mode 100644 index e6d4bf54..00000000 --- a/engine/inc/bullet/BulletCollision/Gimpact/gim_tri_collision.h +++ /dev/null @@ -1,368 +0,0 @@ -#ifndef GIM_TRI_COLLISION_H_INCLUDED -#define GIM_TRI_COLLISION_H_INCLUDED - -/*! \file gim_tri_collision.h -\author Francisco Leon Najera -*/ -/* ------------------------------------------------------------------------------ -This source file is part of GIMPACT Library. - -For the latest info, see http://gimpact.sourceforge.net/ - -Copyright (c) 2006 Francisco Leon Najera. C.C. 80087371. -email: projectileman@yahoo.com - - This library is free software; you can redistribute it and/or - modify it under the terms of EITHER: - (1) The GNU Lesser General Public License as published by the Free - Software Foundation; either version 2.1 of the License, or (at - your option) any later version. The text of the GNU Lesser - General Public License is included with this library in the - file GIMPACT-LICENSE-LGPL.TXT. - (2) The BSD-style license that is included with this library in - the file GIMPACT-LICENSE-BSD.TXT. - (3) The zlib/libpng license that is included with this library in - the file GIMPACT-LICENSE-ZLIB.TXT. - - This library 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 files - GIMPACT-LICENSE-LGPL.TXT, GIMPACT-LICENSE-ZLIB.TXT and GIMPACT-LICENSE-BSD.TXT for more details. - ------------------------------------------------------------------------------ -*/ - -#include "gim_box_collision.h" -#include "gim_clip_polygon.h" - -#ifndef MAX_TRI_CLIPPING -#define MAX_TRI_CLIPPING 16 -#endif - -//! Structure for collision -struct GIM_TRIANGLE_CONTACT_DATA -{ - GREAL m_penetration_depth; - GUINT m_point_count; - btVector4 m_separating_normal; - btVector3 m_points[MAX_TRI_CLIPPING]; - - SIMD_FORCE_INLINE void copy_from(const GIM_TRIANGLE_CONTACT_DATA &other) - { - m_penetration_depth = other.m_penetration_depth; - m_separating_normal = other.m_separating_normal; - m_point_count = other.m_point_count; - GUINT i = m_point_count; - while (i--) - { - m_points[i] = other.m_points[i]; - } - } - - GIM_TRIANGLE_CONTACT_DATA() - { - } - - GIM_TRIANGLE_CONTACT_DATA(const GIM_TRIANGLE_CONTACT_DATA &other) - { - copy_from(other); - } - - //! classify points that are closer - template - SIMD_FORCE_INLINE void mergepoints_generic(const CLASS_PLANE &plane, - GREAL margin, const btVector3 *points, GUINT point_count, DISTANCE_FUNC distance_func) - { - m_point_count = 0; - m_penetration_depth = -1000.0f; - - GUINT point_indices[MAX_TRI_CLIPPING]; - - GUINT _k; - - for (_k = 0; _k < point_count; _k++) - { - GREAL _dist = -distance_func(plane, points[_k]) + margin; - - if (_dist >= 0.0f) - { - if (_dist > m_penetration_depth) - { - m_penetration_depth = _dist; - point_indices[0] = _k; - m_point_count = 1; - } - else if ((_dist + G_EPSILON) >= m_penetration_depth) - { - point_indices[m_point_count] = _k; - m_point_count++; - } - } - } - - for (_k = 0; _k < m_point_count; _k++) - { - m_points[_k] = points[point_indices[_k]]; - } - } - - //! classify points that are closer - SIMD_FORCE_INLINE void merge_points(const btVector4 &plane, GREAL margin, - const btVector3 *points, GUINT point_count) - { - m_separating_normal = plane; - mergepoints_generic(plane, margin, points, point_count, DISTANCE_PLANE_3D_FUNC()); - } -}; - -//! Class for colliding triangles -class GIM_TRIANGLE -{ -public: - btScalar m_margin; - btVector3 m_vertices[3]; - - GIM_TRIANGLE() : m_margin(0.1f) - { - } - - SIMD_FORCE_INLINE GIM_AABB get_box() const - { - return GIM_AABB(m_vertices[0], m_vertices[1], m_vertices[2], m_margin); - } - - SIMD_FORCE_INLINE void get_normal(btVector3 &normal) const - { - TRIANGLE_NORMAL(m_vertices[0], m_vertices[1], m_vertices[2], normal); - } - - SIMD_FORCE_INLINE void get_plane(btVector4 &plane) const - { - TRIANGLE_PLANE(m_vertices[0], m_vertices[1], m_vertices[2], plane); - ; - } - - SIMD_FORCE_INLINE void apply_transform(const btTransform &trans) - { - m_vertices[0] = trans(m_vertices[0]); - m_vertices[1] = trans(m_vertices[1]); - m_vertices[2] = trans(m_vertices[2]); - } - - SIMD_FORCE_INLINE void get_edge_plane(GUINT edge_index, const btVector3 &triangle_normal, btVector4 &plane) const - { - const btVector3 &e0 = m_vertices[edge_index]; - const btVector3 &e1 = m_vertices[(edge_index + 1) % 3]; - EDGE_PLANE(e0, e1, triangle_normal, plane); - } - - //! Gets the relative transformation of this triangle - /*! - The transformation is oriented to the triangle normal , and aligned to the 1st edge of this triangle. The position corresponds to vertice 0: - - triangle normal corresponds to Z axis. - - 1st normalized edge corresponds to X axis, - - */ - SIMD_FORCE_INLINE void get_triangle_transform(btTransform &triangle_transform) const - { - btMatrix3x3 &matrix = triangle_transform.getBasis(); - - btVector3 zaxis; - get_normal(zaxis); - MAT_SET_Z(matrix, zaxis); - - btVector3 xaxis = m_vertices[1] - m_vertices[0]; - VEC_NORMALIZE(xaxis); - MAT_SET_X(matrix, xaxis); - - //y axis - xaxis = zaxis.cross(xaxis); - MAT_SET_Y(matrix, xaxis); - - triangle_transform.setOrigin(m_vertices[0]); - } - - //! Test triangles by finding separating axis - /*! - \param other Triangle for collide - \param contact_data Structure for holding contact points, normal and penetration depth; The normal is pointing toward this triangle from the other triangle - */ - bool collide_triangle_hard_test( - const GIM_TRIANGLE &other, - GIM_TRIANGLE_CONTACT_DATA &contact_data) const; - - //! Test boxes before doing hard test - /*! - \param other Triangle for collide - \param contact_data Structure for holding contact points, normal and penetration depth; The normal is pointing toward this triangle from the other triangle - \ - */ - SIMD_FORCE_INLINE bool collide_triangle( - const GIM_TRIANGLE &other, - GIM_TRIANGLE_CONTACT_DATA &contact_data) const - { - //test box collisioin - GIM_AABB boxu(m_vertices[0], m_vertices[1], m_vertices[2], m_margin); - GIM_AABB boxv(other.m_vertices[0], other.m_vertices[1], other.m_vertices[2], other.m_margin); - if (!boxu.has_collision(boxv)) return false; - - //do hard test - return collide_triangle_hard_test(other, contact_data); - } - - /*! - - Solve the System for u,v parameters: - - u*axe1[i1] + v*axe2[i1] = vecproj[i1] - u*axe1[i2] + v*axe2[i2] = vecproj[i2] - - sustitute: - v = (vecproj[i2] - u*axe1[i2])/axe2[i2] - - then the first equation in terms of 'u': - - --> u*axe1[i1] + ((vecproj[i2] - u*axe1[i2])/axe2[i2])*axe2[i1] = vecproj[i1] - - --> u*axe1[i1] + vecproj[i2]*axe2[i1]/axe2[i2] - u*axe1[i2]*axe2[i1]/axe2[i2] = vecproj[i1] - - --> u*(axe1[i1] - axe1[i2]*axe2[i1]/axe2[i2]) = vecproj[i1] - vecproj[i2]*axe2[i1]/axe2[i2] - - --> u*((axe1[i1]*axe2[i2] - axe1[i2]*axe2[i1])/axe2[i2]) = (vecproj[i1]*axe2[i2] - vecproj[i2]*axe2[i1])/axe2[i2] - - --> u*(axe1[i1]*axe2[i2] - axe1[i2]*axe2[i1]) = vecproj[i1]*axe2[i2] - vecproj[i2]*axe2[i1] - - --> u = (vecproj[i1]*axe2[i2] - vecproj[i2]*axe2[i1]) /(axe1[i1]*axe2[i2] - axe1[i2]*axe2[i1]) - -if 0.0<= u+v <=1.0 then they are inside of triangle - - \return false if the point is outside of triangle.This function doesn't take the margin - */ - SIMD_FORCE_INLINE bool get_uv_parameters( - const btVector3 &point, - const btVector3 &tri_plane, - GREAL &u, GREAL &v) const - { - btVector3 _axe1 = m_vertices[1] - m_vertices[0]; - btVector3 _axe2 = m_vertices[2] - m_vertices[0]; - btVector3 _vecproj = point - m_vertices[0]; - GUINT _i1 = (tri_plane.closestAxis() + 1) % 3; - GUINT _i2 = (_i1 + 1) % 3; - if (btFabs(_axe2[_i2]) < G_EPSILON) - { - u = (_vecproj[_i2] * _axe2[_i1] - _vecproj[_i1] * _axe2[_i2]) / (_axe1[_i2] * _axe2[_i1] - _axe1[_i1] * _axe2[_i2]); - v = (_vecproj[_i1] - u * _axe1[_i1]) / _axe2[_i1]; - } - else - { - u = (_vecproj[_i1] * _axe2[_i2] - _vecproj[_i2] * _axe2[_i1]) / (_axe1[_i1] * _axe2[_i2] - _axe1[_i2] * _axe2[_i1]); - v = (_vecproj[_i2] - u * _axe1[_i2]) / _axe2[_i2]; - } - - if (u < -G_EPSILON) - { - return false; - } - else if (v < -G_EPSILON) - { - return false; - } - else - { - btScalar sumuv; - sumuv = u + v; - if (sumuv < -G_EPSILON) - { - return false; - } - else if (sumuv - 1.0f > G_EPSILON) - { - return false; - } - } - return true; - } - - //! is point in triangle beam? - /*! - Test if point is in triangle, with m_margin tolerance - */ - SIMD_FORCE_INLINE bool is_point_inside(const btVector3 &point, const btVector3 &tri_normal) const - { - //Test with edge 0 - btVector4 edge_plane; - this->get_edge_plane(0, tri_normal, edge_plane); - GREAL dist = DISTANCE_PLANE_POINT(edge_plane, point); - if (dist - m_margin > 0.0f) return false; // outside plane - - this->get_edge_plane(1, tri_normal, edge_plane); - dist = DISTANCE_PLANE_POINT(edge_plane, point); - if (dist - m_margin > 0.0f) return false; // outside plane - - this->get_edge_plane(2, tri_normal, edge_plane); - dist = DISTANCE_PLANE_POINT(edge_plane, point); - if (dist - m_margin > 0.0f) return false; // outside plane - return true; - } - - //! Bidireccional ray collision - SIMD_FORCE_INLINE bool ray_collision( - const btVector3 &vPoint, - const btVector3 &vDir, btVector3 &pout, btVector3 &triangle_normal, - GREAL &tparam, GREAL tmax = G_REAL_INFINITY) - { - btVector4 faceplane; - { - btVector3 dif1 = m_vertices[1] - m_vertices[0]; - btVector3 dif2 = m_vertices[2] - m_vertices[0]; - VEC_CROSS(faceplane, dif1, dif2); - faceplane[3] = m_vertices[0].dot(faceplane); - } - - GUINT res = LINE_PLANE_COLLISION(faceplane, vDir, vPoint, pout, tparam, btScalar(0), tmax); - if (res == 0) return false; - if (!is_point_inside(pout, faceplane)) return false; - - if (res == 2) //invert normal - { - triangle_normal.setValue(-faceplane[0], -faceplane[1], -faceplane[2]); - } - else - { - triangle_normal.setValue(faceplane[0], faceplane[1], faceplane[2]); - } - - VEC_NORMALIZE(triangle_normal); - - return true; - } - - //! one direccion ray collision - SIMD_FORCE_INLINE bool ray_collision_front_side( - const btVector3 &vPoint, - const btVector3 &vDir, btVector3 &pout, btVector3 &triangle_normal, - GREAL &tparam, GREAL tmax = G_REAL_INFINITY) - { - btVector4 faceplane; - { - btVector3 dif1 = m_vertices[1] - m_vertices[0]; - btVector3 dif2 = m_vertices[2] - m_vertices[0]; - VEC_CROSS(faceplane, dif1, dif2); - faceplane[3] = m_vertices[0].dot(faceplane); - } - - GUINT res = LINE_PLANE_COLLISION(faceplane, vDir, vPoint, pout, tparam, btScalar(0), tmax); - if (res != 1) return false; - - if (!is_point_inside(pout, faceplane)) return false; - - triangle_normal.setValue(faceplane[0], faceplane[1], faceplane[2]); - - VEC_NORMALIZE(triangle_normal); - - return true; - } -}; - -#endif // GIM_TRI_COLLISION_H_INCLUDED diff --git a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btComputeGjkEpaPenetration.h b/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btComputeGjkEpaPenetration.h deleted file mode 100644 index 3c821330..00000000 --- a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btComputeGjkEpaPenetration.h +++ /dev/null @@ -1,354 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2014 Erwin Coumans http://bulletphysics.org - -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_GJK_EPA_PENETATION_CONVEX_COLLISION_H -#define BT_GJK_EPA_PENETATION_CONVEX_COLLISION_H - -#include "LinearMath/btTransform.h" // Note that btVector3 might be double precision... -#include "btGjkEpa3.h" -#include "btGjkCollisionDescription.h" -#include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h" - -template -bool btGjkEpaCalcPenDepth(const btConvexTemplate& a, const btConvexTemplate& b, - const btGjkCollisionDescription& colDesc, - btVector3& v, btVector3& wWitnessOnA, btVector3& wWitnessOnB) -{ - (void)v; - - // const btScalar radialmargin(btScalar(0.)); - - btVector3 guessVector(b.getWorldTransform().getOrigin() - a.getWorldTransform().getOrigin()); //?? why not use the GJK input? - - btGjkEpaSolver3::sResults results; - - if (btGjkEpaSolver3_Penetration(a, b, guessVector, results)) - - { - // debugDraw->drawLine(results.witnesses[1],results.witnesses[1]+results.normal,btVector3(255,0,0)); - //resultOut->addContactPoint(results.normal,results.witnesses[1],-results.depth); - wWitnessOnA = results.witnesses[0]; - wWitnessOnB = results.witnesses[1]; - v = results.normal; - return true; - } - else - { - if (btGjkEpaSolver3_Distance(a, b, guessVector, results)) - { - wWitnessOnA = results.witnesses[0]; - wWitnessOnB = results.witnesses[1]; - v = results.normal; - return false; - } - } - return false; -} - -template -int btComputeGjkEpaPenetration(const btConvexTemplate& a, const btConvexTemplate& b, const btGjkCollisionDescription& colDesc, btVoronoiSimplexSolver& simplexSolver, btGjkDistanceTemplate* distInfo) -{ - bool m_catchDegeneracies = true; - btScalar m_cachedSeparatingDistance = 0.f; - - btScalar distance = btScalar(0.); - btVector3 normalInB(btScalar(0.), btScalar(0.), btScalar(0.)); - - btVector3 pointOnA, pointOnB; - btTransform localTransA = a.getWorldTransform(); - btTransform localTransB = b.getWorldTransform(); - - btScalar marginA = a.getMargin(); - btScalar marginB = b.getMargin(); - - int m_curIter = 0; - int gGjkMaxIter = colDesc.m_maxGjkIterations; //this is to catch invalid input, perhaps check for #NaN? - btVector3 m_cachedSeparatingAxis = colDesc.m_firstDir; - - bool isValid = false; - bool checkSimplex = false; - bool checkPenetration = true; - int m_degenerateSimplex = 0; - - int m_lastUsedMethod = -1; - - { - btScalar squaredDistance = BT_LARGE_FLOAT; - btScalar delta = btScalar(0.); - - btScalar margin = marginA + marginB; - - simplexSolver.reset(); - - for (;;) - //while (true) - { - btVector3 separatingAxisInA = (-m_cachedSeparatingAxis) * localTransA.getBasis(); - btVector3 separatingAxisInB = m_cachedSeparatingAxis * localTransB.getBasis(); - - btVector3 pInA = a.getLocalSupportWithoutMargin(separatingAxisInA); - btVector3 qInB = b.getLocalSupportWithoutMargin(separatingAxisInB); - - btVector3 pWorld = localTransA(pInA); - btVector3 qWorld = localTransB(qInB); - - btVector3 w = pWorld - qWorld; - delta = m_cachedSeparatingAxis.dot(w); - - // potential exit, they don't overlap - if ((delta > btScalar(0.0)) && (delta * delta > squaredDistance * colDesc.m_maximumDistanceSquared)) - { - m_degenerateSimplex = 10; - checkSimplex = true; - //checkPenetration = false; - break; - } - - //exit 0: the new point is already in the simplex, or we didn't come any closer - if (simplexSolver.inSimplex(w)) - { - m_degenerateSimplex = 1; - checkSimplex = true; - break; - } - // are we getting any closer ? - btScalar f0 = squaredDistance - delta; - btScalar f1 = squaredDistance * colDesc.m_gjkRelError2; - - if (f0 <= f1) - { - if (f0 <= btScalar(0.)) - { - m_degenerateSimplex = 2; - } - else - { - m_degenerateSimplex = 11; - } - checkSimplex = true; - break; - } - - //add current vertex to simplex - simplexSolver.addVertex(w, pWorld, qWorld); - btVector3 newCachedSeparatingAxis; - - //calculate the closest point to the origin (update vector v) - if (!simplexSolver.closest(newCachedSeparatingAxis)) - { - m_degenerateSimplex = 3; - checkSimplex = true; - break; - } - - if (newCachedSeparatingAxis.length2() < colDesc.m_gjkRelError2) - { - m_cachedSeparatingAxis = newCachedSeparatingAxis; - m_degenerateSimplex = 6; - checkSimplex = true; - break; - } - - btScalar previousSquaredDistance = squaredDistance; - squaredDistance = newCachedSeparatingAxis.length2(); -#if 0 - ///warning: this termination condition leads to some problems in 2d test case see Bullet/Demos/Box2dDemo - if (squaredDistance>previousSquaredDistance) - { - m_degenerateSimplex = 7; - squaredDistance = previousSquaredDistance; - checkSimplex = false; - break; - } -#endif // - - //redundant m_simplexSolver->compute_points(pointOnA, pointOnB); - - //are we getting any closer ? - if (previousSquaredDistance - squaredDistance <= SIMD_EPSILON * previousSquaredDistance) - { - // m_simplexSolver->backup_closest(m_cachedSeparatingAxis); - checkSimplex = true; - m_degenerateSimplex = 12; - - break; - } - - m_cachedSeparatingAxis = newCachedSeparatingAxis; - - //degeneracy, this is typically due to invalid/uninitialized worldtransforms for a btCollisionObject - if (m_curIter++ > gGjkMaxIter) - { -#if defined(DEBUG) || defined(_DEBUG) - - printf("btGjkPairDetector maxIter exceeded:%i\n", m_curIter); - printf("sepAxis=(%f,%f,%f), squaredDistance = %f\n", - m_cachedSeparatingAxis.getX(), - m_cachedSeparatingAxis.getY(), - m_cachedSeparatingAxis.getZ(), - squaredDistance); -#endif - - break; - } - - bool check = (!simplexSolver.fullSimplex()); - //bool check = (!m_simplexSolver->fullSimplex() && squaredDistance > SIMD_EPSILON * m_simplexSolver->maxVertex()); - - if (!check) - { - //do we need this backup_closest here ? - // m_simplexSolver->backup_closest(m_cachedSeparatingAxis); - m_degenerateSimplex = 13; - break; - } - } - - if (checkSimplex) - { - simplexSolver.compute_points(pointOnA, pointOnB); - normalInB = m_cachedSeparatingAxis; - - btScalar lenSqr = m_cachedSeparatingAxis.length2(); - - //valid normal - if (lenSqr < 0.0001) - { - m_degenerateSimplex = 5; - } - if (lenSqr > SIMD_EPSILON * SIMD_EPSILON) - { - btScalar rlen = btScalar(1.) / btSqrt(lenSqr); - normalInB *= rlen; //normalize - - btScalar s = btSqrt(squaredDistance); - - btAssert(s > btScalar(0.0)); - pointOnA -= m_cachedSeparatingAxis * (marginA / s); - pointOnB += m_cachedSeparatingAxis * (marginB / s); - distance = ((btScalar(1.) / rlen) - margin); - isValid = true; - - m_lastUsedMethod = 1; - } - else - { - m_lastUsedMethod = 2; - } - } - - bool catchDegeneratePenetrationCase = - (m_catchDegeneracies && m_degenerateSimplex && ((distance + margin) < 0.01)); - - //if (checkPenetration && !isValid) - if (checkPenetration && (!isValid || catchDegeneratePenetrationCase)) - { - //penetration case - - //if there is no way to handle penetrations, bail out - - // Penetration depth case. - btVector3 tmpPointOnA, tmpPointOnB; - - m_cachedSeparatingAxis.setZero(); - - bool isValid2 = btGjkEpaCalcPenDepth(a, b, - colDesc, - m_cachedSeparatingAxis, tmpPointOnA, tmpPointOnB); - - if (isValid2) - { - btVector3 tmpNormalInB = tmpPointOnB - tmpPointOnA; - btScalar lenSqr = tmpNormalInB.length2(); - if (lenSqr <= (SIMD_EPSILON * SIMD_EPSILON)) - { - tmpNormalInB = m_cachedSeparatingAxis; - lenSqr = m_cachedSeparatingAxis.length2(); - } - - if (lenSqr > (SIMD_EPSILON * SIMD_EPSILON)) - { - tmpNormalInB /= btSqrt(lenSqr); - btScalar distance2 = -(tmpPointOnA - tmpPointOnB).length(); - //only replace valid penetrations when the result is deeper (check) - if (!isValid || (distance2 < distance)) - { - distance = distance2; - pointOnA = tmpPointOnA; - pointOnB = tmpPointOnB; - normalInB = tmpNormalInB; - - isValid = true; - m_lastUsedMethod = 3; - } - else - { - m_lastUsedMethod = 8; - } - } - else - { - m_lastUsedMethod = 9; - } - } - else - - { - ///this is another degenerate case, where the initial GJK calculation reports a degenerate case - ///EPA reports no penetration, and the second GJK (using the supporting vector without margin) - ///reports a valid positive distance. Use the results of the second GJK instead of failing. - ///thanks to Jacob.Langford for the reproduction case - ///http://code.google.com/p/bullet/issues/detail?id=250 - - if (m_cachedSeparatingAxis.length2() > btScalar(0.)) - { - btScalar distance2 = (tmpPointOnA - tmpPointOnB).length() - margin; - //only replace valid distances when the distance is less - if (!isValid || (distance2 < distance)) - { - distance = distance2; - pointOnA = tmpPointOnA; - pointOnB = tmpPointOnB; - pointOnA -= m_cachedSeparatingAxis * marginA; - pointOnB += m_cachedSeparatingAxis * marginB; - normalInB = m_cachedSeparatingAxis; - normalInB.normalize(); - - isValid = true; - m_lastUsedMethod = 6; - } - else - { - m_lastUsedMethod = 5; - } - } - } - } - } - - if (isValid && ((distance < 0) || (distance * distance < colDesc.m_maximumDistanceSquared))) - { - m_cachedSeparatingAxis = normalInB; - m_cachedSeparatingDistance = distance; - distInfo->m_distance = distance; - distInfo->m_normalBtoA = normalInB; - distInfo->m_pointOnB = pointOnB; - distInfo->m_pointOnA = pointOnB + normalInB * distance; - return 0; - } - return -m_lastUsedMethod; -} - -#endif //BT_GJK_EPA_PENETATION_CONVEX_COLLISION_H diff --git a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.h b/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.h deleted file mode 100644 index 67b2205c..00000000 --- a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.h +++ /dev/null @@ -1,53 +0,0 @@ -/* -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_CONTINUOUS_COLLISION_CONVEX_CAST_H -#define BT_CONTINUOUS_COLLISION_CONVEX_CAST_H - -#include "btConvexCast.h" -#include "btSimplexSolverInterface.h" -class btConvexPenetrationDepthSolver; -class btConvexShape; -class btStaticPlaneShape; - -/// btContinuousConvexCollision implements angular and linear time of impact for convex objects. -/// Based on Brian Mirtich's Conservative Advancement idea (PhD thesis). -/// Algorithm operates in worldspace, in order to keep in between motion globally consistent. -/// It uses GJK at the moment. Future improvement would use minkowski sum / supporting vertex, merging innerloops -class btContinuousConvexCollision : public btConvexCast -{ - btSimplexSolverInterface* m_simplexSolver; - btConvexPenetrationDepthSolver* m_penetrationDepthSolver; - const btConvexShape* m_convexA; - //second object is either a convex or a plane (code sharing) - const btConvexShape* m_convexB1; - const btStaticPlaneShape* m_planeShape; - - void computeClosestPoints(const btTransform& transA, const btTransform& transB, struct btPointCollector& pointCollector); - -public: - btContinuousConvexCollision(const btConvexShape* shapeA, const btConvexShape* shapeB, btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* penetrationDepthSolver); - - btContinuousConvexCollision(const btConvexShape* shapeA, const btStaticPlaneShape* plane); - - virtual bool calcTimeOfImpact( - const btTransform& fromA, - const btTransform& toA, - const btTransform& fromB, - const btTransform& toB, - CastResult& result); -}; - -#endif //BT_CONTINUOUS_COLLISION_CONVEX_CAST_H diff --git a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btConvexCast.h b/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btConvexCast.h deleted file mode 100644 index 77b19be5..00000000 --- a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btConvexCast.h +++ /dev/null @@ -1,90 +0,0 @@ -/* -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_CONVEX_CAST_H -#define BT_CONVEX_CAST_H - -#include "LinearMath/btTransform.h" -#include "LinearMath/btVector3.h" -#include "LinearMath/btScalar.h" -class btMinkowskiSumShape; -#include "LinearMath/btIDebugDraw.h" - -#ifdef BT_USE_DOUBLE_PRECISION -#define MAX_CONVEX_CAST_ITERATIONS 64 -#define MAX_CONVEX_CAST_EPSILON (SIMD_EPSILON * 10) -#else -#define MAX_CONVEX_CAST_ITERATIONS 32 -#define MAX_CONVEX_CAST_EPSILON btScalar(0.0001) -#endif -///Typically the conservative advancement reaches solution in a few iterations, clip it to 32 for degenerate cases. -///See discussion about this here http://continuousphysics.com/Bullet/phpBB2/viewtopic.php?t=565 -//will need to digg deeper to make the algorithm more robust -//since, a large epsilon can cause an early termination with false -//positive results (ray intersections that shouldn't be there) - -/// btConvexCast is an interface for Casting -class btConvexCast -{ -public: - virtual ~btConvexCast(); - - ///RayResult stores the closest result - /// alternatively, add a callback method to decide about closest/all results - struct CastResult - { - //virtual bool addRayResult(const btVector3& normal,btScalar fraction) = 0; - - virtual void DebugDraw(btScalar fraction) { (void)fraction; } - virtual void drawCoordSystem(const btTransform& trans) { (void)trans; } - virtual void reportFailure(int errNo, int numIterations) - { - (void)errNo; - (void)numIterations; - } - CastResult() - : m_fraction(btScalar(BT_LARGE_FLOAT)), - m_debugDrawer(0), - m_allowedPenetration(btScalar(0)), - m_subSimplexCastMaxIterations(MAX_CONVEX_CAST_ITERATIONS), - m_subSimplexCastEpsilon(MAX_CONVEX_CAST_EPSILON) - { - } - - virtual ~CastResult(){}; - - btTransform m_hitTransformA; - btTransform m_hitTransformB; - btVector3 m_normal; - btVector3 m_hitPoint; - btScalar m_fraction; //input and output - btIDebugDraw* m_debugDrawer; - btScalar m_allowedPenetration; - - int m_subSimplexCastMaxIterations; - btScalar m_subSimplexCastEpsilon; - - }; - - /// cast a convex against another convex object - virtual bool calcTimeOfImpact( - const btTransform& fromA, - const btTransform& toA, - const btTransform& fromB, - const btTransform& toB, - CastResult& result) = 0; -}; - -#endif //BT_CONVEX_CAST_H diff --git a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h b/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h deleted file mode 100644 index 65c9df93..00000000 --- a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h +++ /dev/null @@ -1,35 +0,0 @@ -/* -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_CONVEX_PENETRATION_DEPTH_H -#define BT_CONVEX_PENETRATION_DEPTH_H - -class btVector3; -#include "btSimplexSolverInterface.h" -class btConvexShape; -class btTransform; - -///ConvexPenetrationDepthSolver provides an interface for penetration depth calculation. -class btConvexPenetrationDepthSolver -{ -public: - virtual ~btConvexPenetrationDepthSolver(){}; - virtual bool calcPenDepth(btSimplexSolverInterface& simplexSolver, - const btConvexShape* convexA, const btConvexShape* convexB, - const btTransform& transA, const btTransform& transB, - btVector3& v, btVector3& pa, btVector3& pb, - class btIDebugDraw* debugDraw) = 0; -}; -#endif //BT_CONVEX_PENETRATION_DEPTH_H diff --git a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h b/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h deleted file mode 100644 index d1bbb1a4..00000000 --- a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h +++ /dev/null @@ -1,85 +0,0 @@ -/* -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_DISCRETE_COLLISION_DETECTOR1_INTERFACE_H -#define BT_DISCRETE_COLLISION_DETECTOR1_INTERFACE_H - -#include "LinearMath/btTransform.h" -#include "LinearMath/btVector3.h" - -/// This interface is made to be used by an iterative approach to do TimeOfImpact calculations -/// This interface allows to query for closest points and penetration depth between two (convex) objects -/// the closest point is on the second object (B), and the normal points from the surface on B towards A. -/// distance is between closest points on B and closest point on A. So you can calculate closest point on A -/// by taking closestPointInA = closestPointInB + m_distance * m_normalOnSurfaceB -struct btDiscreteCollisionDetectorInterface -{ - struct Result - { - virtual ~Result() {} - - ///setShapeIdentifiersA/B provides experimental support for per-triangle material / custom material combiner - virtual void setShapeIdentifiersA(int partId0, int index0) = 0; - virtual void setShapeIdentifiersB(int partId1, int index1) = 0; - virtual void addContactPoint(const btVector3& normalOnBInWorld, const btVector3& pointInWorld, btScalar depth) = 0; - }; - - struct ClosestPointInput - { - ClosestPointInput() - : m_maximumDistanceSquared(btScalar(BT_LARGE_FLOAT)) - { - } - - btTransform m_transformA; - btTransform m_transformB; - btScalar m_maximumDistanceSquared; - }; - - virtual ~btDiscreteCollisionDetectorInterface(){}; - - // - // give either closest points (distance > 0) or penetration (distance) - // the normal always points from B towards A - // - virtual void getClosestPoints(const ClosestPointInput& input, Result& output, class btIDebugDraw* debugDraw, bool swapResults = false) = 0; -}; - -struct btStorageResult : public btDiscreteCollisionDetectorInterface::Result -{ - btVector3 m_normalOnSurfaceB; - btVector3 m_closestPointInB; - btScalar m_distance; //negative means penetration ! - -protected: - btStorageResult() : m_distance(btScalar(BT_LARGE_FLOAT)) - { - } - -public: - virtual ~btStorageResult(){}; - - virtual void addContactPoint(const btVector3& normalOnBInWorld, const btVector3& pointInWorld, btScalar depth) - { - if (depth < m_distance) - { - m_normalOnSurfaceB = normalOnBInWorld; - m_closestPointInB = pointInWorld; - m_distance = depth; - } - } -}; - -#endif //BT_DISCRETE_COLLISION_DETECTOR1_INTERFACE_H diff --git a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btGjkCollisionDescription.h b/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btGjkCollisionDescription.h deleted file mode 100644 index c9fd84be..00000000 --- a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btGjkCollisionDescription.h +++ /dev/null @@ -1,39 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2014 Erwin Coumans http://bulletphysics.org - -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 GJK_COLLISION_DESCRIPTION_H -#define GJK_COLLISION_DESCRIPTION_H - -#include "LinearMath/btVector3.h" - -struct btGjkCollisionDescription -{ - btVector3 m_firstDir; - int m_maxGjkIterations; - btScalar m_maximumDistanceSquared; - btScalar m_gjkRelError2; - btGjkCollisionDescription() - : m_firstDir(0, 1, 0), - m_maxGjkIterations(1000), - m_maximumDistanceSquared(1e30f), - m_gjkRelError2(1.0e-6) - { - } - virtual ~btGjkCollisionDescription() - { - } -}; - -#endif //GJK_COLLISION_DESCRIPTION_H diff --git a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btGjkConvexCast.h b/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btGjkConvexCast.h deleted file mode 100644 index ef597917..00000000 --- a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btGjkConvexCast.h +++ /dev/null @@ -1,46 +0,0 @@ -/* -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_GJK_CONVEX_CAST_H -#define BT_GJK_CONVEX_CAST_H - -#include "BulletCollision/CollisionShapes/btCollisionMargin.h" - -#include "LinearMath/btVector3.h" -#include "btConvexCast.h" -class btConvexShape; -class btMinkowskiSumShape; -#include "btSimplexSolverInterface.h" - -///GjkConvexCast performs a raycast on a convex object using support mapping. -class btGjkConvexCast : public btConvexCast -{ - btSimplexSolverInterface* m_simplexSolver; - const btConvexShape* m_convexA; - const btConvexShape* m_convexB; - -public: - btGjkConvexCast(const btConvexShape* convexA, const btConvexShape* convexB, btSimplexSolverInterface* simplexSolver); - - /// cast a convex against another convex object - virtual bool calcTimeOfImpact( - const btTransform& fromA, - const btTransform& toA, - const btTransform& fromB, - const btTransform& toB, - CastResult& result); -}; - -#endif //BT_GJK_CONVEX_CAST_H diff --git a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpa2.h b/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpa2.h deleted file mode 100644 index 893daea3..00000000 --- a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpa2.h +++ /dev/null @@ -1,73 +0,0 @@ -/* -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. -*/ - -/* -GJK-EPA collision solver by Nathanael Presson, 2008 -*/ -#ifndef BT_GJK_EPA2_H -#define BT_GJK_EPA2_H - -#include "BulletCollision/CollisionShapes/btConvexShape.h" - -///btGjkEpaSolver contributed under zlib by Nathanael Presson -struct btGjkEpaSolver2 -{ - struct sResults - { - enum eStatus - { - Separated, /* Shapes doesnt penetrate */ - Penetrating, /* Shapes are penetrating */ - GJK_Failed, /* GJK phase fail, no big issue, shapes are probably just 'touching' */ - EPA_Failed /* EPA phase fail, bigger problem, need to save parameters, and debug */ - } status; - btVector3 witnesses[2]; - btVector3 normal; - btScalar distance; - }; - - static int StackSizeRequirement(); - - static bool Distance(const btConvexShape* shape0, const btTransform& wtrs0, - const btConvexShape* shape1, const btTransform& wtrs1, - const btVector3& guess, - sResults& results); - - static bool Penetration(const btConvexShape* shape0, const btTransform& wtrs0, - const btConvexShape* shape1, const btTransform& wtrs1, - const btVector3& guess, - sResults& results, - bool usemargins = true); -#ifndef __SPU__ - static btScalar SignedDistance(const btVector3& position, - btScalar margin, - const btConvexShape* shape, - const btTransform& wtrs, - sResults& results); - - static bool SignedDistance(const btConvexShape* shape0, const btTransform& wtrs0, - const btConvexShape* shape1, const btTransform& wtrs1, - const btVector3& guess, - sResults& results); -#endif //__SPU__ -}; - -#endif //BT_GJK_EPA2_H diff --git a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpa3.h b/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpa3.h deleted file mode 100644 index 6fedbbb3..00000000 --- a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpa3.h +++ /dev/null @@ -1,1063 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2014 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. -*/ - -/* -Initial GJK-EPA collision solver by Nathanael Presson, 2008 -Improvements and refactoring by Erwin Coumans, 2008-2014 -*/ -#ifndef BT_GJK_EPA3_H -#define BT_GJK_EPA3_H - -#include "LinearMath/btTransform.h" -#include "btGjkCollisionDescription.h" - -struct btGjkEpaSolver3 -{ - struct sResults - { - enum eStatus - { - Separated, /* Shapes doesnt penetrate */ - Penetrating, /* Shapes are penetrating */ - GJK_Failed, /* GJK phase fail, no big issue, shapes are probably just 'touching' */ - EPA_Failed /* EPA phase fail, bigger problem, need to save parameters, and debug */ - } status; - btVector3 witnesses[2]; - btVector3 normal; - btScalar distance; - }; -}; - -#if defined(DEBUG) || defined(_DEBUG) -#include //for debug printf -#ifdef __SPU__ -#include -#define printf spu_printf -#endif //__SPU__ -#endif - -// Config - -/* GJK */ -#define GJK_MAX_ITERATIONS 128 -#define GJK_ACCURARY ((btScalar)0.0001) -#define GJK_MIN_DISTANCE ((btScalar)0.0001) -#define GJK_DUPLICATED_EPS ((btScalar)0.0001) -#define GJK_SIMPLEX2_EPS ((btScalar)0.0) -#define GJK_SIMPLEX3_EPS ((btScalar)0.0) -#define GJK_SIMPLEX4_EPS ((btScalar)0.0) - -/* EPA */ -#define EPA_MAX_VERTICES 64 -#define EPA_MAX_FACES (EPA_MAX_VERTICES * 2) -#define EPA_MAX_ITERATIONS 255 -#define EPA_ACCURACY ((btScalar)0.0001) -#define EPA_FALLBACK (10 * EPA_ACCURACY) -#define EPA_PLANE_EPS ((btScalar)0.00001) -#define EPA_INSIDE_EPS ((btScalar)0.01) - -// Shorthands -typedef unsigned int U; -typedef unsigned char U1; - -// MinkowskiDiff -template -struct MinkowskiDiff -{ - const btConvexTemplate* m_convexAPtr; - const btConvexTemplate* m_convexBPtr; - - btMatrix3x3 m_toshape1; - btTransform m_toshape0; - - bool m_enableMargin; - - MinkowskiDiff(const btConvexTemplate& a, const btConvexTemplate& b) - : m_convexAPtr(&a), - m_convexBPtr(&b) - { - } - - void EnableMargin(bool enable) - { - m_enableMargin = enable; - } - inline btVector3 Support0(const btVector3& d) const - { - return m_convexAPtr->getLocalSupportWithMargin(d); - } - inline btVector3 Support1(const btVector3& d) const - { - return m_toshape0 * m_convexBPtr->getLocalSupportWithMargin(m_toshape1 * d); - } - - inline btVector3 Support(const btVector3& d) const - { - return (Support0(d) - Support1(-d)); - } - btVector3 Support(const btVector3& d, U index) const - { - if (index) - return (Support1(d)); - else - return (Support0(d)); - } -}; - -enum eGjkStatus -{ - eGjkValid, - eGjkInside, - eGjkFailed -}; - -// GJK -template -struct GJK -{ - /* Types */ - struct sSV - { - btVector3 d, w; - }; - struct sSimplex - { - sSV* c[4]; - btScalar p[4]; - U rank; - }; - - /* Fields */ - - MinkowskiDiff m_shape; - btVector3 m_ray; - btScalar m_distance; - sSimplex m_simplices[2]; - sSV m_store[4]; - sSV* m_free[4]; - U m_nfree; - U m_current; - sSimplex* m_simplex; - eGjkStatus m_status; - /* Methods */ - - GJK(const btConvexTemplate& a, const btConvexTemplate& b) - : m_shape(a, b) - { - Initialize(); - } - void Initialize() - { - m_ray = btVector3(0, 0, 0); - m_nfree = 0; - m_status = eGjkFailed; - m_current = 0; - m_distance = 0; - } - eGjkStatus Evaluate(const MinkowskiDiff& shapearg, const btVector3& guess) - { - U iterations = 0; - btScalar sqdist = 0; - btScalar alpha = 0; - btVector3 lastw[4]; - U clastw = 0; - /* Initialize solver */ - m_free[0] = &m_store[0]; - m_free[1] = &m_store[1]; - m_free[2] = &m_store[2]; - m_free[3] = &m_store[3]; - m_nfree = 4; - m_current = 0; - m_status = eGjkValid; - m_shape = shapearg; - m_distance = 0; - /* Initialize simplex */ - m_simplices[0].rank = 0; - m_ray = guess; - const btScalar sqrl = m_ray.length2(); - appendvertice(m_simplices[0], sqrl > 0 ? -m_ray : btVector3(1, 0, 0)); - m_simplices[0].p[0] = 1; - m_ray = m_simplices[0].c[0]->w; - sqdist = sqrl; - lastw[0] = - lastw[1] = - lastw[2] = - lastw[3] = m_ray; - /* Loop */ - do - { - const U next = 1 - m_current; - sSimplex& cs = m_simplices[m_current]; - sSimplex& ns = m_simplices[next]; - /* Check zero */ - const btScalar rl = m_ray.length(); - if (rl < GJK_MIN_DISTANCE) - { /* Touching or inside */ - m_status = eGjkInside; - break; - } - /* Append new vertice in -'v' direction */ - appendvertice(cs, -m_ray); - const btVector3& w = cs.c[cs.rank - 1]->w; - bool found = false; - for (U i = 0; i < 4; ++i) - { - if ((w - lastw[i]).length2() < GJK_DUPLICATED_EPS) - { - found = true; - break; - } - } - if (found) - { /* Return old simplex */ - removevertice(m_simplices[m_current]); - break; - } - else - { /* Update lastw */ - lastw[clastw = (clastw + 1) & 3] = w; - } - /* Check for termination */ - const btScalar omega = btDot(m_ray, w) / rl; - alpha = btMax(omega, alpha); - if (((rl - alpha) - (GJK_ACCURARY * rl)) <= 0) - { /* Return old simplex */ - removevertice(m_simplices[m_current]); - break; - } - /* Reduce simplex */ - btScalar weights[4]; - U mask = 0; - switch (cs.rank) - { - case 2: - sqdist = projectorigin(cs.c[0]->w, - cs.c[1]->w, - weights, mask); - break; - case 3: - sqdist = projectorigin(cs.c[0]->w, - cs.c[1]->w, - cs.c[2]->w, - weights, mask); - break; - case 4: - sqdist = projectorigin(cs.c[0]->w, - cs.c[1]->w, - cs.c[2]->w, - cs.c[3]->w, - weights, mask); - break; - } - if (sqdist >= 0) - { /* Valid */ - ns.rank = 0; - m_ray = btVector3(0, 0, 0); - m_current = next; - for (U i = 0, ni = cs.rank; i < ni; ++i) - { - if (mask & (1 << i)) - { - ns.c[ns.rank] = cs.c[i]; - ns.p[ns.rank++] = weights[i]; - m_ray += cs.c[i]->w * weights[i]; - } - else - { - m_free[m_nfree++] = cs.c[i]; - } - } - if (mask == 15) m_status = eGjkInside; - } - else - { /* Return old simplex */ - removevertice(m_simplices[m_current]); - break; - } - m_status = ((++iterations) < GJK_MAX_ITERATIONS) ? m_status : eGjkFailed; - } while (m_status == eGjkValid); - m_simplex = &m_simplices[m_current]; - switch (m_status) - { - case eGjkValid: - m_distance = m_ray.length(); - break; - case eGjkInside: - m_distance = 0; - break; - default: - { - } - } - return (m_status); - } - bool EncloseOrigin() - { - switch (m_simplex->rank) - { - case 1: - { - for (U i = 0; i < 3; ++i) - { - btVector3 axis = btVector3(0, 0, 0); - axis[i] = 1; - appendvertice(*m_simplex, axis); - if (EncloseOrigin()) return (true); - removevertice(*m_simplex); - appendvertice(*m_simplex, -axis); - if (EncloseOrigin()) return (true); - removevertice(*m_simplex); - } - } - break; - case 2: - { - const btVector3 d = m_simplex->c[1]->w - m_simplex->c[0]->w; - for (U i = 0; i < 3; ++i) - { - btVector3 axis = btVector3(0, 0, 0); - axis[i] = 1; - const btVector3 p = btCross(d, axis); - if (p.length2() > 0) - { - appendvertice(*m_simplex, p); - if (EncloseOrigin()) return (true); - removevertice(*m_simplex); - appendvertice(*m_simplex, -p); - if (EncloseOrigin()) return (true); - removevertice(*m_simplex); - } - } - } - break; - case 3: - { - const btVector3 n = btCross(m_simplex->c[1]->w - m_simplex->c[0]->w, - m_simplex->c[2]->w - m_simplex->c[0]->w); - if (n.length2() > 0) - { - appendvertice(*m_simplex, n); - if (EncloseOrigin()) return (true); - removevertice(*m_simplex); - appendvertice(*m_simplex, -n); - if (EncloseOrigin()) return (true); - removevertice(*m_simplex); - } - } - break; - case 4: - { - if (btFabs(det(m_simplex->c[0]->w - m_simplex->c[3]->w, - m_simplex->c[1]->w - m_simplex->c[3]->w, - m_simplex->c[2]->w - m_simplex->c[3]->w)) > 0) - return (true); - } - break; - } - return (false); - } - /* Internals */ - void getsupport(const btVector3& d, sSV& sv) const - { - sv.d = d / d.length(); - sv.w = m_shape.Support(sv.d); - } - void removevertice(sSimplex& simplex) - { - m_free[m_nfree++] = simplex.c[--simplex.rank]; - } - void appendvertice(sSimplex& simplex, const btVector3& v) - { - simplex.p[simplex.rank] = 0; - simplex.c[simplex.rank] = m_free[--m_nfree]; - getsupport(v, *simplex.c[simplex.rank++]); - } - static btScalar det(const btVector3& a, const btVector3& b, const btVector3& c) - { - return (a.y() * b.z() * c.x() + a.z() * b.x() * c.y() - - a.x() * b.z() * c.y() - a.y() * b.x() * c.z() + - a.x() * b.y() * c.z() - a.z() * b.y() * c.x()); - } - static btScalar projectorigin(const btVector3& a, - const btVector3& b, - btScalar* w, U& m) - { - const btVector3 d = b - a; - const btScalar l = d.length2(); - if (l > GJK_SIMPLEX2_EPS) - { - const btScalar t(l > 0 ? -btDot(a, d) / l : 0); - if (t >= 1) - { - w[0] = 0; - w[1] = 1; - m = 2; - return (b.length2()); - } - else if (t <= 0) - { - w[0] = 1; - w[1] = 0; - m = 1; - return (a.length2()); - } - else - { - w[0] = 1 - (w[1] = t); - m = 3; - return ((a + d * t).length2()); - } - } - return (-1); - } - static btScalar projectorigin(const btVector3& a, - const btVector3& b, - const btVector3& c, - btScalar* w, U& m) - { - static const U imd3[] = {1, 2, 0}; - const btVector3* vt[] = {&a, &b, &c}; - const btVector3 dl[] = {a - b, b - c, c - a}; - const btVector3 n = btCross(dl[0], dl[1]); - const btScalar l = n.length2(); - if (l > GJK_SIMPLEX3_EPS) - { - btScalar mindist = -1; - btScalar subw[2] = {0.f, 0.f}; - U subm(0); - for (U i = 0; i < 3; ++i) - { - if (btDot(*vt[i], btCross(dl[i], n)) > 0) - { - const U j = imd3[i]; - const btScalar subd(projectorigin(*vt[i], *vt[j], subw, subm)); - if ((mindist < 0) || (subd < mindist)) - { - mindist = subd; - m = static_cast(((subm & 1) ? 1 << i : 0) + ((subm & 2) ? 1 << j : 0)); - w[i] = subw[0]; - w[j] = subw[1]; - w[imd3[j]] = 0; - } - } - } - if (mindist < 0) - { - const btScalar d = btDot(a, n); - const btScalar s = btSqrt(l); - const btVector3 p = n * (d / l); - mindist = p.length2(); - m = 7; - w[0] = (btCross(dl[1], b - p)).length() / s; - w[1] = (btCross(dl[2], c - p)).length() / s; - w[2] = 1 - (w[0] + w[1]); - } - return (mindist); - } - return (-1); - } - static btScalar projectorigin(const btVector3& a, - const btVector3& b, - const btVector3& c, - const btVector3& d, - btScalar* w, U& m) - { - static const U imd3[] = {1, 2, 0}; - const btVector3* vt[] = {&a, &b, &c, &d}; - const btVector3 dl[] = {a - d, b - d, c - d}; - const btScalar vl = det(dl[0], dl[1], dl[2]); - const bool ng = (vl * btDot(a, btCross(b - c, a - b))) <= 0; - if (ng && (btFabs(vl) > GJK_SIMPLEX4_EPS)) - { - btScalar mindist = -1; - btScalar subw[3] = {0.f, 0.f, 0.f}; - U subm(0); - for (U i = 0; i < 3; ++i) - { - const U j = imd3[i]; - const btScalar s = vl * btDot(d, btCross(dl[i], dl[j])); - if (s > 0) - { - const btScalar subd = projectorigin(*vt[i], *vt[j], d, subw, subm); - if ((mindist < 0) || (subd < mindist)) - { - mindist = subd; - m = static_cast((subm & 1 ? 1 << i : 0) + - (subm & 2 ? 1 << j : 0) + - (subm & 4 ? 8 : 0)); - w[i] = subw[0]; - w[j] = subw[1]; - w[imd3[j]] = 0; - w[3] = subw[2]; - } - } - } - if (mindist < 0) - { - mindist = 0; - m = 15; - w[0] = det(c, b, d) / vl; - w[1] = det(a, c, d) / vl; - w[2] = det(b, a, d) / vl; - w[3] = 1 - (w[0] + w[1] + w[2]); - } - return (mindist); - } - return (-1); - } -}; - -enum eEpaStatus -{ - eEpaValid, - eEpaTouching, - eEpaDegenerated, - eEpaNonConvex, - eEpaInvalidHull, - eEpaOutOfFaces, - eEpaOutOfVertices, - eEpaAccuraryReached, - eEpaFallBack, - eEpaFailed -}; - -// EPA -template -struct EPA -{ - /* Types */ - - struct sFace - { - btVector3 n; - btScalar d; - typename GJK::sSV* c[3]; - sFace* f[3]; - sFace* l[2]; - U1 e[3]; - U1 pass; - }; - struct sList - { - sFace* root; - U count; - sList() : root(0), count(0) {} - }; - struct sHorizon - { - sFace* cf; - sFace* ff; - U nf; - sHorizon() : cf(0), ff(0), nf(0) {} - }; - - /* Fields */ - eEpaStatus m_status; - typename GJK::sSimplex m_result; - btVector3 m_normal; - btScalar m_depth; - typename GJK::sSV m_sv_store[EPA_MAX_VERTICES]; - sFace m_fc_store[EPA_MAX_FACES]; - U m_nextsv; - sList m_hull; - sList m_stock; - /* Methods */ - EPA() - { - Initialize(); - } - - static inline void bind(sFace* fa, U ea, sFace* fb, U eb) - { - fa->e[ea] = (U1)eb; - fa->f[ea] = fb; - fb->e[eb] = (U1)ea; - fb->f[eb] = fa; - } - static inline void append(sList& list, sFace* face) - { - face->l[0] = 0; - face->l[1] = list.root; - if (list.root) list.root->l[0] = face; - list.root = face; - ++list.count; - } - static inline void remove(sList& list, sFace* face) - { - if (face->l[1]) face->l[1]->l[0] = face->l[0]; - if (face->l[0]) face->l[0]->l[1] = face->l[1]; - if (face == list.root) list.root = face->l[1]; - --list.count; - } - - void Initialize() - { - m_status = eEpaFailed; - m_normal = btVector3(0, 0, 0); - m_depth = 0; - m_nextsv = 0; - for (U i = 0; i < EPA_MAX_FACES; ++i) - { - append(m_stock, &m_fc_store[EPA_MAX_FACES - i - 1]); - } - } - eEpaStatus Evaluate(GJK& gjk, const btVector3& guess) - { - typename GJK::sSimplex& simplex = *gjk.m_simplex; - if ((simplex.rank > 1) && gjk.EncloseOrigin()) - { - /* Clean up */ - while (m_hull.root) - { - sFace* f = m_hull.root; - remove(m_hull, f); - append(m_stock, f); - } - m_status = eEpaValid; - m_nextsv = 0; - /* Orient simplex */ - if (gjk.det(simplex.c[0]->w - simplex.c[3]->w, - simplex.c[1]->w - simplex.c[3]->w, - simplex.c[2]->w - simplex.c[3]->w) < 0) - { - btSwap(simplex.c[0], simplex.c[1]); - btSwap(simplex.p[0], simplex.p[1]); - } - /* Build initial hull */ - sFace* tetra[] = {newface(simplex.c[0], simplex.c[1], simplex.c[2], true), - newface(simplex.c[1], simplex.c[0], simplex.c[3], true), - newface(simplex.c[2], simplex.c[1], simplex.c[3], true), - newface(simplex.c[0], simplex.c[2], simplex.c[3], true)}; - if (m_hull.count == 4) - { - sFace* best = findbest(); - sFace outer = *best; - U pass = 0; - U iterations = 0; - bind(tetra[0], 0, tetra[1], 0); - bind(tetra[0], 1, tetra[2], 0); - bind(tetra[0], 2, tetra[3], 0); - bind(tetra[1], 1, tetra[3], 2); - bind(tetra[1], 2, tetra[2], 1); - bind(tetra[2], 2, tetra[3], 1); - m_status = eEpaValid; - for (; iterations < EPA_MAX_ITERATIONS; ++iterations) - { - if (m_nextsv < EPA_MAX_VERTICES) - { - sHorizon horizon; - typename GJK::sSV* w = &m_sv_store[m_nextsv++]; - bool valid = true; - best->pass = (U1)(++pass); - gjk.getsupport(best->n, *w); - const btScalar wdist = btDot(best->n, w->w) - best->d; - if (wdist > EPA_ACCURACY) - { - for (U j = 0; (j < 3) && valid; ++j) - { - valid &= expand(pass, w, - best->f[j], best->e[j], - horizon); - } - if (valid && (horizon.nf >= 3)) - { - bind(horizon.cf, 1, horizon.ff, 2); - remove(m_hull, best); - append(m_stock, best); - best = findbest(); - outer = *best; - } - else - { - m_status = eEpaInvalidHull; - break; - } - } - else - { - m_status = eEpaAccuraryReached; - break; - } - } - else - { - m_status = eEpaOutOfVertices; - break; - } - } - const btVector3 projection = outer.n * outer.d; - m_normal = outer.n; - m_depth = outer.d; - m_result.rank = 3; - m_result.c[0] = outer.c[0]; - m_result.c[1] = outer.c[1]; - m_result.c[2] = outer.c[2]; - m_result.p[0] = btCross(outer.c[1]->w - projection, - outer.c[2]->w - projection) - .length(); - m_result.p[1] = btCross(outer.c[2]->w - projection, - outer.c[0]->w - projection) - .length(); - m_result.p[2] = btCross(outer.c[0]->w - projection, - outer.c[1]->w - projection) - .length(); - const btScalar sum = m_result.p[0] + m_result.p[1] + m_result.p[2]; - m_result.p[0] /= sum; - m_result.p[1] /= sum; - m_result.p[2] /= sum; - return (m_status); - } - } - /* Fallback */ - m_status = eEpaFallBack; - m_normal = -guess; - const btScalar nl = m_normal.length(); - if (nl > 0) - m_normal = m_normal / nl; - else - m_normal = btVector3(1, 0, 0); - m_depth = 0; - m_result.rank = 1; - m_result.c[0] = simplex.c[0]; - m_result.p[0] = 1; - return (m_status); - } - bool getedgedist(sFace* face, typename GJK::sSV* a, typename GJK::sSV* b, btScalar& dist) - { - const btVector3 ba = b->w - a->w; - const btVector3 n_ab = btCross(ba, face->n); // Outward facing edge normal direction, on triangle plane - const btScalar a_dot_nab = btDot(a->w, n_ab); // Only care about the sign to determine inside/outside, so not normalization required - - if (a_dot_nab < 0) - { - // Outside of edge a->b - - const btScalar ba_l2 = ba.length2(); - const btScalar a_dot_ba = btDot(a->w, ba); - const btScalar b_dot_ba = btDot(b->w, ba); - - if (a_dot_ba > 0) - { - // Pick distance vertex a - dist = a->w.length(); - } - else if (b_dot_ba < 0) - { - // Pick distance vertex b - dist = b->w.length(); - } - else - { - // Pick distance to edge a->b - const btScalar a_dot_b = btDot(a->w, b->w); - dist = btSqrt(btMax((a->w.length2() * b->w.length2() - a_dot_b * a_dot_b) / ba_l2, (btScalar)0)); - } - - return true; - } - - return false; - } - sFace* newface(typename GJK::sSV* a, typename GJK::sSV* b, typename GJK::sSV* c, bool forced) - { - if (m_stock.root) - { - sFace* face = m_stock.root; - remove(m_stock, face); - append(m_hull, face); - face->pass = 0; - face->c[0] = a; - face->c[1] = b; - face->c[2] = c; - face->n = btCross(b->w - a->w, c->w - a->w); - const btScalar l = face->n.length(); - const bool v = l > EPA_ACCURACY; - - if (v) - { - if (!(getedgedist(face, a, b, face->d) || - getedgedist(face, b, c, face->d) || - getedgedist(face, c, a, face->d))) - { - // Origin projects to the interior of the triangle - // Use distance to triangle plane - face->d = btDot(a->w, face->n) / l; - } - - face->n /= l; - if (forced || (face->d >= -EPA_PLANE_EPS)) - { - return face; - } - else - m_status = eEpaNonConvex; - } - else - m_status = eEpaDegenerated; - - remove(m_hull, face); - append(m_stock, face); - return 0; - } - m_status = m_stock.root ? eEpaOutOfVertices : eEpaOutOfFaces; - return 0; - } - sFace* findbest() - { - sFace* minf = m_hull.root; - btScalar mind = minf->d * minf->d; - for (sFace* f = minf->l[1]; f; f = f->l[1]) - { - const btScalar sqd = f->d * f->d; - if (sqd < mind) - { - minf = f; - mind = sqd; - } - } - return (minf); - } - bool expand(U pass, typename GJK::sSV* w, sFace* f, U e, sHorizon& horizon) - { - static const U i1m3[] = {1, 2, 0}; - static const U i2m3[] = {2, 0, 1}; - if (f->pass != pass) - { - const U e1 = i1m3[e]; - if ((btDot(f->n, w->w) - f->d) < -EPA_PLANE_EPS) - { - sFace* nf = newface(f->c[e1], f->c[e], w, false); - if (nf) - { - bind(nf, 0, f, e); - if (horizon.cf) - bind(horizon.cf, 1, nf, 2); - else - horizon.ff = nf; - horizon.cf = nf; - ++horizon.nf; - return (true); - } - } - else - { - const U e2 = i2m3[e]; - f->pass = (U1)pass; - if (expand(pass, w, f->f[e1], f->e[e1], horizon) && - expand(pass, w, f->f[e2], f->e[e2], horizon)) - { - remove(m_hull, f); - append(m_stock, f); - return (true); - } - } - } - return (false); - } -}; - -template -static void Initialize(const btConvexTemplate& a, const btConvexTemplate& b, - btGjkEpaSolver3::sResults& results, - MinkowskiDiff& shape) -{ - /* Results */ - results.witnesses[0] = - results.witnesses[1] = btVector3(0, 0, 0); - results.status = btGjkEpaSolver3::sResults::Separated; - /* Shape */ - - shape.m_toshape1 = b.getWorldTransform().getBasis().transposeTimes(a.getWorldTransform().getBasis()); - shape.m_toshape0 = a.getWorldTransform().inverseTimes(b.getWorldTransform()); -} - -// -// Api -// - -// -template -bool btGjkEpaSolver3_Distance(const btConvexTemplate& a, const btConvexTemplate& b, - const btVector3& guess, - btGjkEpaSolver3::sResults& results) -{ - MinkowskiDiff shape(a, b); - Initialize(a, b, results, shape); - GJK gjk(a, b); - eGjkStatus gjk_status = gjk.Evaluate(shape, guess); - if (gjk_status == eGjkValid) - { - btVector3 w0 = btVector3(0, 0, 0); - btVector3 w1 = btVector3(0, 0, 0); - for (U i = 0; i < gjk.m_simplex->rank; ++i) - { - const btScalar p = gjk.m_simplex->p[i]; - w0 += shape.Support(gjk.m_simplex->c[i]->d, 0) * p; - w1 += shape.Support(-gjk.m_simplex->c[i]->d, 1) * p; - } - results.witnesses[0] = a.getWorldTransform() * w0; - results.witnesses[1] = a.getWorldTransform() * w1; - results.normal = w0 - w1; - results.distance = results.normal.length(); - results.normal /= results.distance > GJK_MIN_DISTANCE ? results.distance : 1; - return (true); - } - else - { - results.status = gjk_status == eGjkInside ? btGjkEpaSolver3::sResults::Penetrating : btGjkEpaSolver3::sResults::GJK_Failed; - return (false); - } -} - -template -bool btGjkEpaSolver3_Penetration(const btConvexTemplate& a, - const btConvexTemplate& b, - const btVector3& guess, - btGjkEpaSolver3::sResults& results) -{ - MinkowskiDiff shape(a, b); - Initialize(a, b, results, shape); - GJK gjk(a, b); - eGjkStatus gjk_status = gjk.Evaluate(shape, -guess); - switch (gjk_status) - { - case eGjkInside: - { - EPA epa; - eEpaStatus epa_status = epa.Evaluate(gjk, -guess); - if (epa_status != eEpaFailed) - { - btVector3 w0 = btVector3(0, 0, 0); - for (U i = 0; i < epa.m_result.rank; ++i) - { - w0 += shape.Support(epa.m_result.c[i]->d, 0) * epa.m_result.p[i]; - } - results.status = btGjkEpaSolver3::sResults::Penetrating; - results.witnesses[0] = a.getWorldTransform() * w0; - results.witnesses[1] = a.getWorldTransform() * (w0 - epa.m_normal * epa.m_depth); - results.normal = -epa.m_normal; - results.distance = -epa.m_depth; - return (true); - } - else - results.status = btGjkEpaSolver3::sResults::EPA_Failed; - } - break; - case eGjkFailed: - results.status = btGjkEpaSolver3::sResults::GJK_Failed; - break; - default: - { - } - } - return (false); -} - -#if 0 -int btComputeGjkEpaPenetration2(const btCollisionDescription& colDesc, btDistanceInfo* distInfo) -{ - btGjkEpaSolver3::sResults results; - btVector3 guess = colDesc.m_firstDir; - - bool res = btGjkEpaSolver3::Penetration(colDesc.m_objA,colDesc.m_objB, - colDesc.m_transformA,colDesc.m_transformB, - colDesc.m_localSupportFuncA,colDesc.m_localSupportFuncB, - guess, - results); - if (res) - { - if ((results.status==btGjkEpaSolver3::sResults::Penetrating) || results.status==GJK::eStatus::Inside) - { - //normal could be 'swapped' - - distInfo->m_distance = results.distance; - distInfo->m_normalBtoA = results.normal; - btVector3 tmpNormalInB = results.witnesses[1]-results.witnesses[0]; - btScalar lenSqr = tmpNormalInB.length2(); - if (lenSqr <= (SIMD_EPSILON*SIMD_EPSILON)) - { - tmpNormalInB = results.normal; - lenSqr = results.normal.length2(); - } - - if (lenSqr > (SIMD_EPSILON*SIMD_EPSILON)) - { - tmpNormalInB /= btSqrt(lenSqr); - btScalar distance2 = -(results.witnesses[0]-results.witnesses[1]).length(); - //only replace valid penetrations when the result is deeper (check) - //if ((distance2 < results.distance)) - { - distInfo->m_distance = distance2; - distInfo->m_pointOnA= results.witnesses[0]; - distInfo->m_pointOnB= results.witnesses[1]; - distInfo->m_normalBtoA= tmpNormalInB; - return 0; - } - } - } - - } - - return -1; -} -#endif - -template -int btComputeGjkDistance(const btConvexTemplate& a, const btConvexTemplate& b, - const btGjkCollisionDescription& colDesc, btDistanceInfoTemplate* distInfo) -{ - btGjkEpaSolver3::sResults results; - btVector3 guess = colDesc.m_firstDir; - - bool isSeparated = btGjkEpaSolver3_Distance(a, b, - guess, - results); - if (isSeparated) - { - distInfo->m_distance = results.distance; - distInfo->m_pointOnA = results.witnesses[0]; - distInfo->m_pointOnB = results.witnesses[1]; - distInfo->m_normalBtoA = results.normal; - return 0; - } - - return -1; -} - -/* Symbols cleanup */ - -#undef GJK_MAX_ITERATIONS -#undef GJK_ACCURARY -#undef GJK_MIN_DISTANCE -#undef GJK_DUPLICATED_EPS -#undef GJK_SIMPLEX2_EPS -#undef GJK_SIMPLEX3_EPS -#undef GJK_SIMPLEX4_EPS - -#undef EPA_MAX_VERTICES -#undef EPA_MAX_FACES -#undef EPA_MAX_ITERATIONS -#undef EPA_ACCURACY -#undef EPA_FALLBACK -#undef EPA_PLANE_EPS -#undef EPA_INSIDE_EPS - -#endif //BT_GJK_EPA3_H diff --git a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h b/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h deleted file mode 100644 index 92d6df17..00000000 --- a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h +++ /dev/null @@ -1,40 +0,0 @@ -/* -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 BT_GJP_EPA_PENETRATION_DEPTH_H -#define BT_GJP_EPA_PENETRATION_DEPTH_H - -#include "btConvexPenetrationDepthSolver.h" - -///EpaPenetrationDepthSolver uses the Expanding Polytope Algorithm to -///calculate the penetration depth between two convex shapes. -class btGjkEpaPenetrationDepthSolver : public btConvexPenetrationDepthSolver -{ -public: - btGjkEpaPenetrationDepthSolver() - { - } - - bool calcPenDepth(btSimplexSolverInterface& simplexSolver, - const btConvexShape* pConvexA, const btConvexShape* pConvexB, - const btTransform& transformA, const btTransform& transformB, - btVector3& v, btVector3& wWitnessOnA, btVector3& wWitnessOnB, - class btIDebugDraw* debugDraw); - -private: -}; - -#endif // BT_GJP_EPA_PENETRATION_DEPTH_H diff --git a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h b/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h deleted file mode 100644 index faa02287..00000000 --- a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h +++ /dev/null @@ -1,93 +0,0 @@ -/* -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_GJK_PAIR_DETECTOR_H -#define BT_GJK_PAIR_DETECTOR_H - -#include "btDiscreteCollisionDetectorInterface.h" -#include "BulletCollision/CollisionShapes/btCollisionMargin.h" - -class btConvexShape; -#include "btSimplexSolverInterface.h" -class btConvexPenetrationDepthSolver; - -/// btGjkPairDetector uses GJK to implement the btDiscreteCollisionDetectorInterface -class btGjkPairDetector : public btDiscreteCollisionDetectorInterface -{ - btVector3 m_cachedSeparatingAxis; - btConvexPenetrationDepthSolver* m_penetrationDepthSolver; - btSimplexSolverInterface* m_simplexSolver; - const btConvexShape* m_minkowskiA; - const btConvexShape* m_minkowskiB; - int m_shapeTypeA; - int m_shapeTypeB; - btScalar m_marginA; - btScalar m_marginB; - - bool m_ignoreMargin; - btScalar m_cachedSeparatingDistance; - -public: - //some debugging to fix degeneracy problems - int m_lastUsedMethod; - int m_curIter; - int m_degenerateSimplex; - int m_catchDegeneracies; - int m_fixContactNormalDirection; - - btGjkPairDetector(const btConvexShape* objectA, const btConvexShape* objectB, btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* penetrationDepthSolver); - btGjkPairDetector(const btConvexShape* objectA, const btConvexShape* objectB, int shapeTypeA, int shapeTypeB, btScalar marginA, btScalar marginB, btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* penetrationDepthSolver); - virtual ~btGjkPairDetector(){}; - - virtual void getClosestPoints(const ClosestPointInput& input, Result& output, class btIDebugDraw* debugDraw, bool swapResults = false); - - void getClosestPointsNonVirtual(const ClosestPointInput& input, Result& output, class btIDebugDraw* debugDraw); - - void setMinkowskiA(const btConvexShape* minkA) - { - m_minkowskiA = minkA; - } - - void setMinkowskiB(const btConvexShape* minkB) - { - m_minkowskiB = minkB; - } - void setCachedSeparatingAxis(const btVector3& separatingAxis) - { - m_cachedSeparatingAxis = separatingAxis; - } - - const btVector3& getCachedSeparatingAxis() const - { - return m_cachedSeparatingAxis; - } - btScalar getCachedSeparatingDistance() const - { - return m_cachedSeparatingDistance; - } - - void setPenetrationDepthSolver(btConvexPenetrationDepthSolver* penetrationDepthSolver) - { - m_penetrationDepthSolver = penetrationDepthSolver; - } - - ///don't use setIgnoreMargin, it's for Bullet's internal use - void setIgnoreMargin(bool ignoreMargin) - { - m_ignoreMargin = ignoreMargin; - } -}; - -#endif //BT_GJK_PAIR_DETECTOR_H diff --git a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btManifoldPoint.h b/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btManifoldPoint.h deleted file mode 100644 index 573fc86b..00000000 --- a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btManifoldPoint.h +++ /dev/null @@ -1,174 +0,0 @@ -/* -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_MANIFOLD_CONTACT_POINT_H -#define BT_MANIFOLD_CONTACT_POINT_H - -#include "LinearMath/btVector3.h" -#include "LinearMath/btTransformUtil.h" - -#ifdef PFX_USE_FREE_VECTORMATH -#include "physics_effects/base_level/solver/pfx_constraint_row.h" -typedef sce::PhysicsEffects::PfxConstraintRow btConstraintRow; -#else -// Don't change following order of parameters -ATTRIBUTE_ALIGNED16(struct) -btConstraintRow -{ - btScalar m_normal[3]; - btScalar m_rhs; - btScalar m_jacDiagInv; - btScalar m_lowerLimit; - btScalar m_upperLimit; - btScalar m_accumImpulse; -}; -typedef btConstraintRow PfxConstraintRow; -#endif //PFX_USE_FREE_VECTORMATH - -enum btContactPointFlags -{ - BT_CONTACT_FLAG_LATERAL_FRICTION_INITIALIZED = 1, - BT_CONTACT_FLAG_HAS_CONTACT_CFM = 2, - BT_CONTACT_FLAG_HAS_CONTACT_ERP = 4, - BT_CONTACT_FLAG_CONTACT_STIFFNESS_DAMPING = 8, - BT_CONTACT_FLAG_FRICTION_ANCHOR = 16, -}; - -/// ManifoldContactPoint collects and maintains persistent contactpoints. -/// used to improve stability and performance of rigidbody dynamics response. -class btManifoldPoint -{ -public: - btManifoldPoint() - : m_userPersistentData(0), - m_contactPointFlags(0), - m_appliedImpulse(0.f), - m_prevRHS(0.f), - m_appliedImpulseLateral1(0.f), - m_appliedImpulseLateral2(0.f), - m_contactMotion1(0.f), - m_contactMotion2(0.f), - m_contactCFM(0.f), - m_contactERP(0.f), - m_frictionCFM(0.f), - m_lifeTime(0) - { - } - - btManifoldPoint(const btVector3& pointA, const btVector3& pointB, - const btVector3& normal, - btScalar distance) : m_localPointA(pointA), - m_localPointB(pointB), - m_normalWorldOnB(normal), - m_distance1(distance), - m_combinedFriction(btScalar(0.)), - m_combinedRollingFriction(btScalar(0.)), - m_combinedSpinningFriction(btScalar(0.)), - m_combinedRestitution(btScalar(0.)), - m_userPersistentData(0), - m_contactPointFlags(0), - m_appliedImpulse(0.f), - m_prevRHS(0.f), - m_appliedImpulseLateral1(0.f), - m_appliedImpulseLateral2(0.f), - m_contactMotion1(0.f), - m_contactMotion2(0.f), - m_contactCFM(0.f), - m_contactERP(0.f), - m_frictionCFM(0.f), - m_lifeTime(0) - { - } - - btVector3 m_localPointA; - btVector3 m_localPointB; - btVector3 m_positionWorldOnB; - ///m_positionWorldOnA is redundant information, see getPositionWorldOnA(), but for clarity - btVector3 m_positionWorldOnA; - btVector3 m_normalWorldOnB; - - btScalar m_distance1; - btScalar m_combinedFriction; - btScalar m_combinedRollingFriction; //torsional friction orthogonal to contact normal, useful to make spheres stop rolling forever - btScalar m_combinedSpinningFriction; //torsional friction around contact normal, useful for grasping objects - btScalar m_combinedRestitution; - - //BP mod, store contact triangles. - int m_partId0; - int m_partId1; - int m_index0; - int m_index1; - - mutable void* m_userPersistentData; - //bool m_lateralFrictionInitialized; - int m_contactPointFlags; - - btScalar m_appliedImpulse; - btScalar m_prevRHS; - btScalar m_appliedImpulseLateral1; - btScalar m_appliedImpulseLateral2; - btScalar m_contactMotion1; - btScalar m_contactMotion2; - - union { - btScalar m_contactCFM; - btScalar m_combinedContactStiffness1; - }; - - union { - btScalar m_contactERP; - btScalar m_combinedContactDamping1; - }; - - btScalar m_frictionCFM; - - int m_lifeTime; //lifetime of the contactpoint in frames - - btVector3 m_lateralFrictionDir1; - btVector3 m_lateralFrictionDir2; - - btScalar getDistance() const - { - return m_distance1; - } - int getLifeTime() const - { - return m_lifeTime; - } - - const btVector3& getPositionWorldOnA() const - { - return m_positionWorldOnA; - // return m_positionWorldOnB + m_normalWorldOnB * m_distance1; - } - - const btVector3& getPositionWorldOnB() const - { - return m_positionWorldOnB; - } - - void setDistance(btScalar dist) - { - m_distance1 = dist; - } - - ///this returns the most recent applied impulse, to satisfy contact constraints by the constraint solver - btScalar getAppliedImpulse() const - { - return m_appliedImpulse; - } -}; - -#endif //BT_MANIFOLD_CONTACT_POINT_H diff --git a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.h b/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.h deleted file mode 100644 index 8e3e3932..00000000 --- a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.h +++ /dev/null @@ -1,36 +0,0 @@ -/* -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_MINKOWSKI_PENETRATION_DEPTH_SOLVER_H -#define BT_MINKOWSKI_PENETRATION_DEPTH_SOLVER_H - -#include "btConvexPenetrationDepthSolver.h" - -///MinkowskiPenetrationDepthSolver implements bruteforce penetration depth estimation. -///Implementation is based on sampling the depth using support mapping, and using GJK step to get the witness points. -class btMinkowskiPenetrationDepthSolver : public btConvexPenetrationDepthSolver -{ -protected: - static btVector3* getPenetrationDirections(); - -public: - virtual bool calcPenDepth(btSimplexSolverInterface& simplexSolver, - const btConvexShape* convexA, const btConvexShape* convexB, - const btTransform& transA, const btTransform& transB, - btVector3& v, btVector3& pa, btVector3& pb, - class btIDebugDraw* debugDraw); -}; - -#endif //BT_MINKOWSKI_PENETRATION_DEPTH_SOLVER_H diff --git a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btMprPenetration.h b/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btMprPenetration.h deleted file mode 100644 index 534a66d3..00000000 --- a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btMprPenetration.h +++ /dev/null @@ -1,884 +0,0 @@ - -/*** - * --------------------------------- - * Copyright (c)2012 Daniel Fiser - * - * This file was ported from mpr.c file, part of libccd. - * The Minkoski Portal Refinement implementation was ported - * to OpenCL by Erwin Coumans for the Bullet 3 Physics library. - * The original MPR idea and implementation is by Gary Snethen - * in XenoCollide, see http://github.com/erwincoumans/xenocollide - * - * Distributed under the OSI-approved BSD License (the "License"); - * see . - * This software is distributed WITHOUT ANY WARRANTY; without even the - * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the License for more information. - */ - -///2014 Oct, Erwin Coumans, Use templates to avoid void* casts - -#ifndef BT_MPR_PENETRATION_H -#define BT_MPR_PENETRATION_H - -#define BT_DEBUG_MPR1 - -#include "LinearMath/btTransform.h" -#include "LinearMath/btAlignedObjectArray.h" - -//#define MPR_AVERAGE_CONTACT_POSITIONS - -struct btMprCollisionDescription -{ - btVector3 m_firstDir; - int m_maxGjkIterations; - btScalar m_maximumDistanceSquared; - btScalar m_gjkRelError2; - - btMprCollisionDescription() - : m_firstDir(0, 1, 0), - m_maxGjkIterations(1000), - m_maximumDistanceSquared(1e30f), - m_gjkRelError2(1.0e-6) - { - } - virtual ~btMprCollisionDescription() - { - } -}; - -struct btMprDistanceInfo -{ - btVector3 m_pointOnA; - btVector3 m_pointOnB; - btVector3 m_normalBtoA; - btScalar m_distance; -}; - -#ifdef __cplusplus -#define BT_MPR_SQRT sqrtf -#else -#define BT_MPR_SQRT sqrt -#endif -#define BT_MPR_FMIN(x, y) ((x) < (y) ? (x) : (y)) -#define BT_MPR_FABS fabs - -#define BT_MPR_TOLERANCE 1E-6f -#define BT_MPR_MAX_ITERATIONS 1000 - -struct _btMprSupport_t -{ - btVector3 v; //!< Support point in minkowski sum - btVector3 v1; //!< Support point in obj1 - btVector3 v2; //!< Support point in obj2 -}; -typedef struct _btMprSupport_t btMprSupport_t; - -struct _btMprSimplex_t -{ - btMprSupport_t ps[4]; - int last; //!< index of last added point -}; -typedef struct _btMprSimplex_t btMprSimplex_t; - -inline btMprSupport_t *btMprSimplexPointW(btMprSimplex_t *s, int idx) -{ - return &s->ps[idx]; -} - -inline void btMprSimplexSetSize(btMprSimplex_t *s, int size) -{ - s->last = size - 1; -} - -#ifdef DEBUG_MPR -inline void btPrintPortalVertex(_btMprSimplex_t *portal, int index) -{ - printf("portal[%d].v = %f,%f,%f, v1=%f,%f,%f, v2=%f,%f,%f\n", index, portal->ps[index].v.x(), portal->ps[index].v.y(), portal->ps[index].v.z(), - portal->ps[index].v1.x(), portal->ps[index].v1.y(), portal->ps[index].v1.z(), - portal->ps[index].v2.x(), portal->ps[index].v2.y(), portal->ps[index].v2.z()); -} -#endif //DEBUG_MPR - -inline int btMprSimplexSize(const btMprSimplex_t *s) -{ - return s->last + 1; -} - -inline const btMprSupport_t *btMprSimplexPoint(const btMprSimplex_t *s, int idx) -{ - // here is no check on boundaries - return &s->ps[idx]; -} - -inline void btMprSupportCopy(btMprSupport_t *d, const btMprSupport_t *s) -{ - *d = *s; -} - -inline void btMprSimplexSet(btMprSimplex_t *s, size_t pos, const btMprSupport_t *a) -{ - btMprSupportCopy(s->ps + pos, a); -} - -inline void btMprSimplexSwap(btMprSimplex_t *s, size_t pos1, size_t pos2) -{ - btMprSupport_t supp; - - btMprSupportCopy(&supp, &s->ps[pos1]); - btMprSupportCopy(&s->ps[pos1], &s->ps[pos2]); - btMprSupportCopy(&s->ps[pos2], &supp); -} - -inline int btMprIsZero(float val) -{ - return BT_MPR_FABS(val) < FLT_EPSILON; -} - -inline int btMprEq(float _a, float _b) -{ - float ab; - float a, b; - - ab = BT_MPR_FABS(_a - _b); - if (BT_MPR_FABS(ab) < FLT_EPSILON) - return 1; - - a = BT_MPR_FABS(_a); - b = BT_MPR_FABS(_b); - if (b > a) - { - return ab < FLT_EPSILON * b; - } - else - { - return ab < FLT_EPSILON * a; - } -} - -inline int btMprVec3Eq(const btVector3 *a, const btVector3 *b) -{ - return btMprEq((*a).x(), (*b).x()) && btMprEq((*a).y(), (*b).y()) && btMprEq((*a).z(), (*b).z()); -} - -template -inline void btFindOrigin(const btConvexTemplate &a, const btConvexTemplate &b, const btMprCollisionDescription &colDesc, btMprSupport_t *center) -{ - center->v1 = a.getObjectCenterInWorld(); - center->v2 = b.getObjectCenterInWorld(); - center->v = center->v1 - center->v2; -} - -inline void btMprVec3Set(btVector3 *v, float x, float y, float z) -{ - v->setValue(x, y, z); -} - -inline void btMprVec3Add(btVector3 *v, const btVector3 *w) -{ - *v += *w; -} - -inline void btMprVec3Copy(btVector3 *v, const btVector3 *w) -{ - *v = *w; -} - -inline void btMprVec3Scale(btVector3 *d, float k) -{ - *d *= k; -} - -inline float btMprVec3Dot(const btVector3 *a, const btVector3 *b) -{ - float dot; - - dot = btDot(*a, *b); - return dot; -} - -inline float btMprVec3Len2(const btVector3 *v) -{ - return btMprVec3Dot(v, v); -} - -inline void btMprVec3Normalize(btVector3 *d) -{ - float k = 1.f / BT_MPR_SQRT(btMprVec3Len2(d)); - btMprVec3Scale(d, k); -} - -inline void btMprVec3Cross(btVector3 *d, const btVector3 *a, const btVector3 *b) -{ - *d = btCross(*a, *b); -} - -inline void btMprVec3Sub2(btVector3 *d, const btVector3 *v, const btVector3 *w) -{ - *d = *v - *w; -} - -inline void btPortalDir(const btMprSimplex_t *portal, btVector3 *dir) -{ - btVector3 v2v1, v3v1; - - btMprVec3Sub2(&v2v1, &btMprSimplexPoint(portal, 2)->v, - &btMprSimplexPoint(portal, 1)->v); - btMprVec3Sub2(&v3v1, &btMprSimplexPoint(portal, 3)->v, - &btMprSimplexPoint(portal, 1)->v); - btMprVec3Cross(dir, &v2v1, &v3v1); - btMprVec3Normalize(dir); -} - -inline int portalEncapsulesOrigin(const btMprSimplex_t *portal, - const btVector3 *dir) -{ - float dot; - dot = btMprVec3Dot(dir, &btMprSimplexPoint(portal, 1)->v); - return btMprIsZero(dot) || dot > 0.f; -} - -inline int portalReachTolerance(const btMprSimplex_t *portal, - const btMprSupport_t *v4, - const btVector3 *dir) -{ - float dv1, dv2, dv3, dv4; - float dot1, dot2, dot3; - - // find the smallest dot product of dir and {v1-v4, v2-v4, v3-v4} - - dv1 = btMprVec3Dot(&btMprSimplexPoint(portal, 1)->v, dir); - dv2 = btMprVec3Dot(&btMprSimplexPoint(portal, 2)->v, dir); - dv3 = btMprVec3Dot(&btMprSimplexPoint(portal, 3)->v, dir); - dv4 = btMprVec3Dot(&v4->v, dir); - - dot1 = dv4 - dv1; - dot2 = dv4 - dv2; - dot3 = dv4 - dv3; - - dot1 = BT_MPR_FMIN(dot1, dot2); - dot1 = BT_MPR_FMIN(dot1, dot3); - - return btMprEq(dot1, BT_MPR_TOLERANCE) || dot1 < BT_MPR_TOLERANCE; -} - -inline int portalCanEncapsuleOrigin(const btMprSimplex_t *portal, - const btMprSupport_t *v4, - const btVector3 *dir) -{ - float dot; - dot = btMprVec3Dot(&v4->v, dir); - return btMprIsZero(dot) || dot > 0.f; -} - -inline void btExpandPortal(btMprSimplex_t *portal, - const btMprSupport_t *v4) -{ - float dot; - btVector3 v4v0; - - btMprVec3Cross(&v4v0, &v4->v, &btMprSimplexPoint(portal, 0)->v); - dot = btMprVec3Dot(&btMprSimplexPoint(portal, 1)->v, &v4v0); - if (dot > 0.f) - { - dot = btMprVec3Dot(&btMprSimplexPoint(portal, 2)->v, &v4v0); - if (dot > 0.f) - { - btMprSimplexSet(portal, 1, v4); - } - else - { - btMprSimplexSet(portal, 3, v4); - } - } - else - { - dot = btMprVec3Dot(&btMprSimplexPoint(portal, 3)->v, &v4v0); - if (dot > 0.f) - { - btMprSimplexSet(portal, 2, v4); - } - else - { - btMprSimplexSet(portal, 1, v4); - } - } -} -template -inline void btMprSupport(const btConvexTemplate &a, const btConvexTemplate &b, - const btMprCollisionDescription &colDesc, - const btVector3 &dir, btMprSupport_t *supp) -{ - btVector3 separatingAxisInA = dir * a.getWorldTransform().getBasis(); - btVector3 separatingAxisInB = -dir * b.getWorldTransform().getBasis(); - - btVector3 pInA = a.getLocalSupportWithMargin(separatingAxisInA); - btVector3 qInB = b.getLocalSupportWithMargin(separatingAxisInB); - - supp->v1 = a.getWorldTransform()(pInA); - supp->v2 = b.getWorldTransform()(qInB); - supp->v = supp->v1 - supp->v2; -} - -template -static int btDiscoverPortal(const btConvexTemplate &a, const btConvexTemplate &b, - const btMprCollisionDescription &colDesc, - btMprSimplex_t *portal) -{ - btVector3 dir, va, vb; - float dot; - int cont; - - // vertex 0 is center of portal - btFindOrigin(a, b, colDesc, btMprSimplexPointW(portal, 0)); - - // vertex 0 is center of portal - btMprSimplexSetSize(portal, 1); - - btVector3 zero = btVector3(0, 0, 0); - btVector3 *org = &zero; - - if (btMprVec3Eq(&btMprSimplexPoint(portal, 0)->v, org)) - { - // Portal's center lies on origin (0,0,0) => we know that objects - // intersect but we would need to know penetration info. - // So move center little bit... - btMprVec3Set(&va, FLT_EPSILON * 10.f, 0.f, 0.f); - btMprVec3Add(&btMprSimplexPointW(portal, 0)->v, &va); - } - - // vertex 1 = support in direction of origin - btMprVec3Copy(&dir, &btMprSimplexPoint(portal, 0)->v); - btMprVec3Scale(&dir, -1.f); - btMprVec3Normalize(&dir); - - btMprSupport(a, b, colDesc, dir, btMprSimplexPointW(portal, 1)); - - btMprSimplexSetSize(portal, 2); - - // test if origin isn't outside of v1 - dot = btMprVec3Dot(&btMprSimplexPoint(portal, 1)->v, &dir); - - if (btMprIsZero(dot) || dot < 0.f) - return -1; - - // vertex 2 - btMprVec3Cross(&dir, &btMprSimplexPoint(portal, 0)->v, - &btMprSimplexPoint(portal, 1)->v); - if (btMprIsZero(btMprVec3Len2(&dir))) - { - if (btMprVec3Eq(&btMprSimplexPoint(portal, 1)->v, org)) - { - // origin lies on v1 - return 1; - } - else - { - // origin lies on v0-v1 segment - return 2; - } - } - - btMprVec3Normalize(&dir); - btMprSupport(a, b, colDesc, dir, btMprSimplexPointW(portal, 2)); - - dot = btMprVec3Dot(&btMprSimplexPoint(portal, 2)->v, &dir); - if (btMprIsZero(dot) || dot < 0.f) - return -1; - - btMprSimplexSetSize(portal, 3); - - // vertex 3 direction - btMprVec3Sub2(&va, &btMprSimplexPoint(portal, 1)->v, - &btMprSimplexPoint(portal, 0)->v); - btMprVec3Sub2(&vb, &btMprSimplexPoint(portal, 2)->v, - &btMprSimplexPoint(portal, 0)->v); - btMprVec3Cross(&dir, &va, &vb); - btMprVec3Normalize(&dir); - - // it is better to form portal faces to be oriented "outside" origin - dot = btMprVec3Dot(&dir, &btMprSimplexPoint(portal, 0)->v); - if (dot > 0.f) - { - btMprSimplexSwap(portal, 1, 2); - btMprVec3Scale(&dir, -1.f); - } - - while (btMprSimplexSize(portal) < 4) - { - btMprSupport(a, b, colDesc, dir, btMprSimplexPointW(portal, 3)); - - dot = btMprVec3Dot(&btMprSimplexPoint(portal, 3)->v, &dir); - if (btMprIsZero(dot) || dot < 0.f) - return -1; - - cont = 0; - - // test if origin is outside (v1, v0, v3) - set v2 as v3 and - // continue - btMprVec3Cross(&va, &btMprSimplexPoint(portal, 1)->v, - &btMprSimplexPoint(portal, 3)->v); - dot = btMprVec3Dot(&va, &btMprSimplexPoint(portal, 0)->v); - if (dot < 0.f && !btMprIsZero(dot)) - { - btMprSimplexSet(portal, 2, btMprSimplexPoint(portal, 3)); - cont = 1; - } - - if (!cont) - { - // test if origin is outside (v3, v0, v2) - set v1 as v3 and - // continue - btMprVec3Cross(&va, &btMprSimplexPoint(portal, 3)->v, - &btMprSimplexPoint(portal, 2)->v); - dot = btMprVec3Dot(&va, &btMprSimplexPoint(portal, 0)->v); - if (dot < 0.f && !btMprIsZero(dot)) - { - btMprSimplexSet(portal, 1, btMprSimplexPoint(portal, 3)); - cont = 1; - } - } - - if (cont) - { - btMprVec3Sub2(&va, &btMprSimplexPoint(portal, 1)->v, - &btMprSimplexPoint(portal, 0)->v); - btMprVec3Sub2(&vb, &btMprSimplexPoint(portal, 2)->v, - &btMprSimplexPoint(portal, 0)->v); - btMprVec3Cross(&dir, &va, &vb); - btMprVec3Normalize(&dir); - } - else - { - btMprSimplexSetSize(portal, 4); - } - } - - return 0; -} - -template -static int btRefinePortal(const btConvexTemplate &a, const btConvexTemplate &b, const btMprCollisionDescription &colDesc, - btMprSimplex_t *portal) -{ - btVector3 dir; - btMprSupport_t v4; - - for (int i = 0; i < BT_MPR_MAX_ITERATIONS; i++) - //while (1) - { - // compute direction outside the portal (from v0 through v1,v2,v3 - // face) - btPortalDir(portal, &dir); - - // test if origin is inside the portal - if (portalEncapsulesOrigin(portal, &dir)) - return 0; - - // get next support point - - btMprSupport(a, b, colDesc, dir, &v4); - - // test if v4 can expand portal to contain origin and if portal - // expanding doesn't reach given tolerance - if (!portalCanEncapsuleOrigin(portal, &v4, &dir) || portalReachTolerance(portal, &v4, &dir)) - { - return -1; - } - - // v1-v2-v3 triangle must be rearranged to face outside Minkowski - // difference (direction from v0). - btExpandPortal(portal, &v4); - } - - return -1; -} - -static void btFindPos(const btMprSimplex_t *portal, btVector3 *pos) -{ - btVector3 zero = btVector3(0, 0, 0); - btVector3 *origin = &zero; - - btVector3 dir; - size_t i; - float b[4], sum, inv; - btVector3 vec, p1, p2; - - btPortalDir(portal, &dir); - - // use barycentric coordinates of tetrahedron to find origin - btMprVec3Cross(&vec, &btMprSimplexPoint(portal, 1)->v, - &btMprSimplexPoint(portal, 2)->v); - b[0] = btMprVec3Dot(&vec, &btMprSimplexPoint(portal, 3)->v); - - btMprVec3Cross(&vec, &btMprSimplexPoint(portal, 3)->v, - &btMprSimplexPoint(portal, 2)->v); - b[1] = btMprVec3Dot(&vec, &btMprSimplexPoint(portal, 0)->v); - - btMprVec3Cross(&vec, &btMprSimplexPoint(portal, 0)->v, - &btMprSimplexPoint(portal, 1)->v); - b[2] = btMprVec3Dot(&vec, &btMprSimplexPoint(portal, 3)->v); - - btMprVec3Cross(&vec, &btMprSimplexPoint(portal, 2)->v, - &btMprSimplexPoint(portal, 1)->v); - b[3] = btMprVec3Dot(&vec, &btMprSimplexPoint(portal, 0)->v); - - sum = b[0] + b[1] + b[2] + b[3]; - - if (btMprIsZero(sum) || sum < 0.f) - { - b[0] = 0.f; - - btMprVec3Cross(&vec, &btMprSimplexPoint(portal, 2)->v, - &btMprSimplexPoint(portal, 3)->v); - b[1] = btMprVec3Dot(&vec, &dir); - btMprVec3Cross(&vec, &btMprSimplexPoint(portal, 3)->v, - &btMprSimplexPoint(portal, 1)->v); - b[2] = btMprVec3Dot(&vec, &dir); - btMprVec3Cross(&vec, &btMprSimplexPoint(portal, 1)->v, - &btMprSimplexPoint(portal, 2)->v); - b[3] = btMprVec3Dot(&vec, &dir); - - sum = b[1] + b[2] + b[3]; - } - - inv = 1.f / sum; - - btMprVec3Copy(&p1, origin); - btMprVec3Copy(&p2, origin); - for (i = 0; i < 4; i++) - { - btMprVec3Copy(&vec, &btMprSimplexPoint(portal, i)->v1); - btMprVec3Scale(&vec, b[i]); - btMprVec3Add(&p1, &vec); - - btMprVec3Copy(&vec, &btMprSimplexPoint(portal, i)->v2); - btMprVec3Scale(&vec, b[i]); - btMprVec3Add(&p2, &vec); - } - btMprVec3Scale(&p1, inv); - btMprVec3Scale(&p2, inv); -#ifdef MPR_AVERAGE_CONTACT_POSITIONS - btMprVec3Copy(pos, &p1); - btMprVec3Add(pos, &p2); - btMprVec3Scale(pos, 0.5); -#else - btMprVec3Copy(pos, &p2); -#endif //MPR_AVERAGE_CONTACT_POSITIONS -} - -inline float btMprVec3Dist2(const btVector3 *a, const btVector3 *b) -{ - btVector3 ab; - btMprVec3Sub2(&ab, a, b); - return btMprVec3Len2(&ab); -} - -inline float _btMprVec3PointSegmentDist2(const btVector3 *P, - const btVector3 *x0, - const btVector3 *b, - btVector3 *witness) -{ - // The computation comes from solving equation of segment: - // S(t) = x0 + t.d - // where - x0 is initial point of segment - // - d is direction of segment from x0 (|d| > 0) - // - t belongs to <0, 1> interval - // - // Than, distance from a segment to some point P can be expressed: - // D(t) = |x0 + t.d - P|^2 - // which is distance from any point on segment. Minimization - // of this function brings distance from P to segment. - // Minimization of D(t) leads to simple quadratic equation that's - // solving is straightforward. - // - // Bonus of this method is witness point for free. - - float dist, t; - btVector3 d, a; - - // direction of segment - btMprVec3Sub2(&d, b, x0); - - // precompute vector from P to x0 - btMprVec3Sub2(&a, x0, P); - - t = -1.f * btMprVec3Dot(&a, &d); - t /= btMprVec3Len2(&d); - - if (t < 0.f || btMprIsZero(t)) - { - dist = btMprVec3Dist2(x0, P); - if (witness) - btMprVec3Copy(witness, x0); - } - else if (t > 1.f || btMprEq(t, 1.f)) - { - dist = btMprVec3Dist2(b, P); - if (witness) - btMprVec3Copy(witness, b); - } - else - { - if (witness) - { - btMprVec3Copy(witness, &d); - btMprVec3Scale(witness, t); - btMprVec3Add(witness, x0); - dist = btMprVec3Dist2(witness, P); - } - else - { - // recycling variables - btMprVec3Scale(&d, t); - btMprVec3Add(&d, &a); - dist = btMprVec3Len2(&d); - } - } - - return dist; -} - -inline float btMprVec3PointTriDist2(const btVector3 *P, - const btVector3 *x0, const btVector3 *B, - const btVector3 *C, - btVector3 *witness) -{ - // Computation comes from analytic expression for triangle (x0, B, C) - // T(s, t) = x0 + s.d1 + t.d2, where d1 = B - x0 and d2 = C - x0 and - // Then equation for distance is: - // D(s, t) = | T(s, t) - P |^2 - // This leads to minimization of quadratic function of two variables. - // The solution from is taken only if s is between 0 and 1, t is - // between 0 and 1 and t + s < 1, otherwise distance from segment is - // computed. - - btVector3 d1, d2, a; - float u, v, w, p, q, r; - float s, t, dist, dist2; - btVector3 witness2; - - btMprVec3Sub2(&d1, B, x0); - btMprVec3Sub2(&d2, C, x0); - btMprVec3Sub2(&a, x0, P); - - u = btMprVec3Dot(&a, &a); - v = btMprVec3Dot(&d1, &d1); - w = btMprVec3Dot(&d2, &d2); - p = btMprVec3Dot(&a, &d1); - q = btMprVec3Dot(&a, &d2); - r = btMprVec3Dot(&d1, &d2); - - btScalar div = (w * v - r * r); - if (btMprIsZero(div)) - { - s = -1; - } - else - { - s = (q * r - w * p) / div; - t = (-s * r - q) / w; - } - - if ((btMprIsZero(s) || s > 0.f) && (btMprEq(s, 1.f) || s < 1.f) && (btMprIsZero(t) || t > 0.f) && (btMprEq(t, 1.f) || t < 1.f) && (btMprEq(t + s, 1.f) || t + s < 1.f)) - { - if (witness) - { - btMprVec3Scale(&d1, s); - btMprVec3Scale(&d2, t); - btMprVec3Copy(witness, x0); - btMprVec3Add(witness, &d1); - btMprVec3Add(witness, &d2); - - dist = btMprVec3Dist2(witness, P); - } - else - { - dist = s * s * v; - dist += t * t * w; - dist += 2.f * s * t * r; - dist += 2.f * s * p; - dist += 2.f * t * q; - dist += u; - } - } - else - { - dist = _btMprVec3PointSegmentDist2(P, x0, B, witness); - - dist2 = _btMprVec3PointSegmentDist2(P, x0, C, &witness2); - if (dist2 < dist) - { - dist = dist2; - if (witness) - btMprVec3Copy(witness, &witness2); - } - - dist2 = _btMprVec3PointSegmentDist2(P, B, C, &witness2); - if (dist2 < dist) - { - dist = dist2; - if (witness) - btMprVec3Copy(witness, &witness2); - } - } - - return dist; -} - -template -static void btFindPenetr(const btConvexTemplate &a, const btConvexTemplate &b, - const btMprCollisionDescription &colDesc, - btMprSimplex_t *portal, - float *depth, btVector3 *pdir, btVector3 *pos) -{ - btVector3 dir; - btMprSupport_t v4; - unsigned long iterations; - - btVector3 zero = btVector3(0, 0, 0); - btVector3 *origin = &zero; - - iterations = 1UL; - for (int i = 0; i < BT_MPR_MAX_ITERATIONS; i++) - //while (1) - { - // compute portal direction and obtain next support point - btPortalDir(portal, &dir); - - btMprSupport(a, b, colDesc, dir, &v4); - - // reached tolerance -> find penetration info - if (portalReachTolerance(portal, &v4, &dir) || iterations == BT_MPR_MAX_ITERATIONS) - { - *depth = btMprVec3PointTriDist2(origin, &btMprSimplexPoint(portal, 1)->v, &btMprSimplexPoint(portal, 2)->v, &btMprSimplexPoint(portal, 3)->v, pdir); - *depth = BT_MPR_SQRT(*depth); - - if (btMprIsZero((*pdir).x()) && btMprIsZero((*pdir).y()) && btMprIsZero((*pdir).z())) - { - *pdir = dir; - } - btMprVec3Normalize(pdir); - - // barycentric coordinates: - btFindPos(portal, pos); - - return; - } - - btExpandPortal(portal, &v4); - - iterations++; - } -} - -static void btFindPenetrTouch(btMprSimplex_t *portal, float *depth, btVector3 *dir, btVector3 *pos) -{ - // Touching contact on portal's v1 - so depth is zero and direction - // is unimportant and pos can be guessed - *depth = 0.f; - btVector3 zero = btVector3(0, 0, 0); - btVector3 *origin = &zero; - - btMprVec3Copy(dir, origin); -#ifdef MPR_AVERAGE_CONTACT_POSITIONS - btMprVec3Copy(pos, &btMprSimplexPoint(portal, 1)->v1); - btMprVec3Add(pos, &btMprSimplexPoint(portal, 1)->v2); - btMprVec3Scale(pos, 0.5); -#else - btMprVec3Copy(pos, &btMprSimplexPoint(portal, 1)->v2); -#endif -} - -static void btFindPenetrSegment(btMprSimplex_t *portal, - float *depth, btVector3 *dir, btVector3 *pos) -{ - // Origin lies on v0-v1 segment. - // Depth is distance to v1, direction also and position must be - // computed -#ifdef MPR_AVERAGE_CONTACT_POSITIONS - btMprVec3Copy(pos, &btMprSimplexPoint(portal, 1)->v1); - btMprVec3Add(pos, &btMprSimplexPoint(portal, 1)->v2); - btMprVec3Scale(pos, 0.5f); -#else - btMprVec3Copy(pos, &btMprSimplexPoint(portal, 1)->v2); -#endif //MPR_AVERAGE_CONTACT_POSITIONS - - btMprVec3Copy(dir, &btMprSimplexPoint(portal, 1)->v); - *depth = BT_MPR_SQRT(btMprVec3Len2(dir)); - btMprVec3Normalize(dir); -} - -template -inline int btMprPenetration(const btConvexTemplate &a, const btConvexTemplate &b, - const btMprCollisionDescription &colDesc, - float *depthOut, btVector3 *dirOut, btVector3 *posOut) -{ - btMprSimplex_t portal; - - // Phase 1: Portal discovery - int result = btDiscoverPortal(a, b, colDesc, &portal); - - //sepAxis[pairIndex] = *pdir;//or -dir? - - switch (result) - { - case 0: - { - // Phase 2: Portal refinement - - result = btRefinePortal(a, b, colDesc, &portal); - if (result < 0) - return -1; - - // Phase 3. Penetration info - btFindPenetr(a, b, colDesc, &portal, depthOut, dirOut, posOut); - - break; - } - case 1: - { - // Touching contact on portal's v1. - btFindPenetrTouch(&portal, depthOut, dirOut, posOut); - result = 0; - break; - } - case 2: - { - btFindPenetrSegment(&portal, depthOut, dirOut, posOut); - result = 0; - break; - } - default: - { - //if (res < 0) - //{ - // Origin isn't inside portal - no collision. - result = -1; - //} - } - }; - - return result; -}; - -template -inline int btComputeMprPenetration(const btConvexTemplate &a, const btConvexTemplate &b, const btMprCollisionDescription &colDesc, btMprDistanceTemplate *distInfo) -{ - btVector3 dir, pos; - float depth; - - int res = btMprPenetration(a, b, colDesc, &depth, &dir, &pos); - if (res == 0) - { - distInfo->m_distance = -depth; - distInfo->m_pointOnB = pos; - distInfo->m_normalBtoA = -dir; - distInfo->m_pointOnA = pos - distInfo->m_distance * dir; - return 0; - } - - return -1; -} - -#endif //BT_MPR_PENETRATION_H diff --git a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btPersistentManifold.h b/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btPersistentManifold.h deleted file mode 100644 index 0e26da0e..00000000 --- a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btPersistentManifold.h +++ /dev/null @@ -1,374 +0,0 @@ -/* -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_PERSISTENT_MANIFOLD_H -#define BT_PERSISTENT_MANIFOLD_H - -#include "LinearMath/btVector3.h" -#include "LinearMath/btTransform.h" -#include "btManifoldPoint.h" -class btCollisionObject; -#include "LinearMath/btAlignedAllocator.h" - -struct btCollisionResult; -struct btCollisionObjectDoubleData; -struct btCollisionObjectFloatData; - -///maximum contact breaking and merging threshold -extern btScalar gContactBreakingThreshold; - -#ifndef SWIG -class btPersistentManifold; - -typedef bool (*ContactDestroyedCallback)(void* userPersistentData); -typedef bool (*ContactProcessedCallback)(btManifoldPoint& cp, void* body0, void* body1); -typedef void (*ContactStartedCallback)(btPersistentManifold* const& manifold); -typedef void (*ContactEndedCallback)(btPersistentManifold* const& manifold); -extern ContactDestroyedCallback gContactDestroyedCallback; -extern ContactProcessedCallback gContactProcessedCallback; -extern ContactStartedCallback gContactStartedCallback; -extern ContactEndedCallback gContactEndedCallback; -#endif //SWIG - -//the enum starts at 1024 to avoid type conflicts with btTypedConstraint -enum btContactManifoldTypes -{ - MIN_CONTACT_MANIFOLD_TYPE = 1024, - BT_PERSISTENT_MANIFOLD_TYPE -}; - -#define MANIFOLD_CACHE_SIZE 4 - -///btPersistentManifold is a contact point cache, it stays persistent as long as objects are overlapping in the broadphase. -///Those contact points are created by the collision narrow phase. -///The cache can be empty, or hold 1,2,3 or 4 points. Some collision algorithms (GJK) might only add one point at a time. -///updates/refreshes old contact points, and throw them away if necessary (distance becomes too large) -///reduces the cache to 4 points, when more then 4 points are added, using following rules: -///the contact point with deepest penetration is always kept, and it tries to maximuze the area covered by the points -///note that some pairs of objects might have more then one contact manifold. - -//ATTRIBUTE_ALIGNED128( class) btPersistentManifold : public btTypedObject -ATTRIBUTE_ALIGNED16(class) -btPersistentManifold : public btTypedObject -{ - btManifoldPoint m_pointCache[MANIFOLD_CACHE_SIZE]; - - /// this two body pointers can point to the physics rigidbody class. - const btCollisionObject* m_body0; - const btCollisionObject* m_body1; - - int m_cachedPoints; - - btScalar m_contactBreakingThreshold; - btScalar m_contactProcessingThreshold; - - /// sort cached points so most isolated points come first - int sortCachedPoints(const btManifoldPoint& pt); - - int findContactPoint(const btManifoldPoint* unUsed, int numUnused, const btManifoldPoint& pt); - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - int m_companionIdA; - int m_companionIdB; - - int m_index1a; - - btPersistentManifold(); - - btPersistentManifold(const btCollisionObject* body0, const btCollisionObject* body1, int, btScalar contactBreakingThreshold, btScalar contactProcessingThreshold) - : btTypedObject(BT_PERSISTENT_MANIFOLD_TYPE), - m_body0(body0), - m_body1(body1), - m_cachedPoints(0), - m_contactBreakingThreshold(contactBreakingThreshold), - m_contactProcessingThreshold(contactProcessingThreshold), - m_companionIdA(0), - m_companionIdB(0), - m_index1a(0) - { - } - - SIMD_FORCE_INLINE const btCollisionObject* getBody0() const { return m_body0; } - SIMD_FORCE_INLINE const btCollisionObject* getBody1() const { return m_body1; } - - void setBodies(const btCollisionObject* body0, const btCollisionObject* body1) - { - m_body0 = body0; - m_body1 = body1; - } - - void clearUserCache(btManifoldPoint & pt); - -#ifdef DEBUG_PERSISTENCY - void DebugPersistency(); -#endif // - - SIMD_FORCE_INLINE int getNumContacts() const - { - return m_cachedPoints; - } - /// the setNumContacts API is usually not used, except when you gather/fill all contacts manually - void setNumContacts(int cachedPoints) - { - m_cachedPoints = cachedPoints; - } - - SIMD_FORCE_INLINE const btManifoldPoint& getContactPoint(int index) const - { - btAssert(index < m_cachedPoints); - return m_pointCache[index]; - } - - SIMD_FORCE_INLINE btManifoldPoint& getContactPoint(int index) - { - btAssert(index < m_cachedPoints); - return m_pointCache[index]; - } - - ///@todo: get this margin from the current physics / collision environment - btScalar getContactBreakingThreshold() const; - - btScalar getContactProcessingThreshold() const - { - return m_contactProcessingThreshold; - } - - void setContactBreakingThreshold(btScalar contactBreakingThreshold) - { - m_contactBreakingThreshold = contactBreakingThreshold; - } - - void setContactProcessingThreshold(btScalar contactProcessingThreshold) - { - m_contactProcessingThreshold = contactProcessingThreshold; - } - - int getCacheEntry(const btManifoldPoint& newPoint) const; - - int addManifoldPoint(const btManifoldPoint& newPoint, bool isPredictive = false); - - void removeContactPoint(int index) - { - clearUserCache(m_pointCache[index]); - - int lastUsedIndex = getNumContacts() - 1; - // m_pointCache[index] = m_pointCache[lastUsedIndex]; - if (index != lastUsedIndex) - { - m_pointCache[index] = m_pointCache[lastUsedIndex]; - //get rid of duplicated userPersistentData pointer - m_pointCache[lastUsedIndex].m_userPersistentData = 0; - m_pointCache[lastUsedIndex].m_appliedImpulse = 0.f; - m_pointCache[lastUsedIndex].m_prevRHS = 0.f; - m_pointCache[lastUsedIndex].m_contactPointFlags = 0; - m_pointCache[lastUsedIndex].m_appliedImpulseLateral1 = 0.f; - m_pointCache[lastUsedIndex].m_appliedImpulseLateral2 = 0.f; - m_pointCache[lastUsedIndex].m_lifeTime = 0; - } - - btAssert(m_pointCache[lastUsedIndex].m_userPersistentData == 0); - m_cachedPoints--; - - if (gContactEndedCallback && m_cachedPoints == 0) - { - gContactEndedCallback(this); - } - } - void replaceContactPoint(const btManifoldPoint& newPoint, int insertIndex) - { - btAssert(validContactDistance(newPoint)); - -#define MAINTAIN_PERSISTENCY 1 -#ifdef MAINTAIN_PERSISTENCY - int lifeTime = m_pointCache[insertIndex].getLifeTime(); - btScalar appliedImpulse = m_pointCache[insertIndex].m_appliedImpulse; - btScalar prevRHS = m_pointCache[insertIndex].m_prevRHS; - btScalar appliedLateralImpulse1 = m_pointCache[insertIndex].m_appliedImpulseLateral1; - btScalar appliedLateralImpulse2 = m_pointCache[insertIndex].m_appliedImpulseLateral2; - - bool replacePoint = true; - ///we keep existing contact points for friction anchors - ///if the friction force is within the Coulomb friction cone - if (newPoint.m_contactPointFlags & BT_CONTACT_FLAG_FRICTION_ANCHOR) - { - // printf("appliedImpulse=%f\n", appliedImpulse); - // printf("appliedLateralImpulse1=%f\n", appliedLateralImpulse1); - // printf("appliedLateralImpulse2=%f\n", appliedLateralImpulse2); - // printf("mu = %f\n", m_pointCache[insertIndex].m_combinedFriction); - btScalar mu = m_pointCache[insertIndex].m_combinedFriction; - btScalar eps = 0; //we could allow to enlarge or shrink the tolerance to check against the friction cone a bit, say 1e-7 - btScalar a = appliedLateralImpulse1 * appliedLateralImpulse1 + appliedLateralImpulse2 * appliedLateralImpulse2; - btScalar b = eps + mu * appliedImpulse; - b = b * b; - replacePoint = (a) > (b); - } - - if (replacePoint) - { - btAssert(lifeTime >= 0); - void* cache = m_pointCache[insertIndex].m_userPersistentData; - - m_pointCache[insertIndex] = newPoint; - m_pointCache[insertIndex].m_userPersistentData = cache; - m_pointCache[insertIndex].m_appliedImpulse = appliedImpulse; - m_pointCache[insertIndex].m_prevRHS = prevRHS; - m_pointCache[insertIndex].m_appliedImpulseLateral1 = appliedLateralImpulse1; - m_pointCache[insertIndex].m_appliedImpulseLateral2 = appliedLateralImpulse2; - } - - m_pointCache[insertIndex].m_lifeTime = lifeTime; -#else - clearUserCache(m_pointCache[insertIndex]); - m_pointCache[insertIndex] = newPoint; - -#endif - } - - bool validContactDistance(const btManifoldPoint& pt) const - { - return pt.m_distance1 <= getContactBreakingThreshold(); - } - /// calculated new worldspace coordinates and depth, and reject points that exceed the collision margin - void refreshContactPoints(const btTransform& trA, const btTransform& trB); - - SIMD_FORCE_INLINE void clearManifold() - { - int i; - for (i = 0; i < m_cachedPoints; i++) - { - clearUserCache(m_pointCache[i]); - } - - if (gContactEndedCallback && m_cachedPoints) - { - gContactEndedCallback(this); - } - m_cachedPoints = 0; - } - - int calculateSerializeBufferSize() const; - const char* serialize(const class btPersistentManifold* manifold, void* dataBuffer, class btSerializer* serializer) const; - void deSerialize(const struct btPersistentManifoldDoubleData* manifoldDataPtr); - void deSerialize(const struct btPersistentManifoldFloatData* manifoldDataPtr); -}; - -// clang-format off - -struct btPersistentManifoldDoubleData -{ - btVector3DoubleData m_pointCacheLocalPointA[4]; - btVector3DoubleData m_pointCacheLocalPointB[4]; - btVector3DoubleData m_pointCachePositionWorldOnA[4]; - btVector3DoubleData m_pointCachePositionWorldOnB[4]; - btVector3DoubleData m_pointCacheNormalWorldOnB[4]; - btVector3DoubleData m_pointCacheLateralFrictionDir1[4]; - btVector3DoubleData m_pointCacheLateralFrictionDir2[4]; - double m_pointCacheDistance[4]; - double m_pointCacheAppliedImpulse[4]; - double m_pointCachePrevRHS[4]; - double m_pointCacheCombinedFriction[4]; - double m_pointCacheCombinedRollingFriction[4]; - double m_pointCacheCombinedSpinningFriction[4]; - double m_pointCacheCombinedRestitution[4]; - int m_pointCachePartId0[4]; - int m_pointCachePartId1[4]; - int m_pointCacheIndex0[4]; - int m_pointCacheIndex1[4]; - int m_pointCacheContactPointFlags[4]; - double m_pointCacheAppliedImpulseLateral1[4]; - double m_pointCacheAppliedImpulseLateral2[4]; - double m_pointCacheContactMotion1[4]; - double m_pointCacheContactMotion2[4]; - double m_pointCacheContactCFM[4]; - double m_pointCacheCombinedContactStiffness1[4]; - double m_pointCacheContactERP[4]; - double m_pointCacheCombinedContactDamping1[4]; - double m_pointCacheFrictionCFM[4]; - int m_pointCacheLifeTime[4]; - - int m_numCachedPoints; - int m_companionIdA; - int m_companionIdB; - int m_index1a; - - int m_objectType; - double m_contactBreakingThreshold; - double m_contactProcessingThreshold; - int m_padding; - - btCollisionObjectDoubleData *m_body0; - btCollisionObjectDoubleData *m_body1; -}; - - -struct btPersistentManifoldFloatData -{ - btVector3FloatData m_pointCacheLocalPointA[4]; - btVector3FloatData m_pointCacheLocalPointB[4]; - btVector3FloatData m_pointCachePositionWorldOnA[4]; - btVector3FloatData m_pointCachePositionWorldOnB[4]; - btVector3FloatData m_pointCacheNormalWorldOnB[4]; - btVector3FloatData m_pointCacheLateralFrictionDir1[4]; - btVector3FloatData m_pointCacheLateralFrictionDir2[4]; - float m_pointCacheDistance[4]; - float m_pointCacheAppliedImpulse[4]; - float m_pointCachePrevRHS[4]; - float m_pointCacheCombinedFriction[4]; - float m_pointCacheCombinedRollingFriction[4]; - float m_pointCacheCombinedSpinningFriction[4]; - float m_pointCacheCombinedRestitution[4]; - int m_pointCachePartId0[4]; - int m_pointCachePartId1[4]; - int m_pointCacheIndex0[4]; - int m_pointCacheIndex1[4]; - int m_pointCacheContactPointFlags[4]; - float m_pointCacheAppliedImpulseLateral1[4]; - float m_pointCacheAppliedImpulseLateral2[4]; - float m_pointCacheContactMotion1[4]; - float m_pointCacheContactMotion2[4]; - float m_pointCacheContactCFM[4]; - float m_pointCacheCombinedContactStiffness1[4]; - float m_pointCacheContactERP[4]; - float m_pointCacheCombinedContactDamping1[4]; - float m_pointCacheFrictionCFM[4]; - int m_pointCacheLifeTime[4]; - - int m_numCachedPoints; - int m_companionIdA; - int m_companionIdB; - int m_index1a; - - int m_objectType; - float m_contactBreakingThreshold; - float m_contactProcessingThreshold; - int m_padding; - - btCollisionObjectFloatData *m_body0; - btCollisionObjectFloatData *m_body1; -}; - -// clang-format on - -#ifdef BT_USE_DOUBLE_PRECISION -#define btPersistentManifoldData btPersistentManifoldDoubleData -#define btPersistentManifoldDataName "btPersistentManifoldDoubleData" -#else -#define btPersistentManifoldData btPersistentManifoldFloatData -#define btPersistentManifoldDataName "btPersistentManifoldFloatData" -#endif //BT_USE_DOUBLE_PRECISION - -#endif //BT_PERSISTENT_MANIFOLD_H diff --git a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btPointCollector.h b/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btPointCollector.h deleted file mode 100644 index 0900eb6e..00000000 --- a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btPointCollector.h +++ /dev/null @@ -1,58 +0,0 @@ -/* -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_POINT_COLLECTOR_H -#define BT_POINT_COLLECTOR_H - -#include "btDiscreteCollisionDetectorInterface.h" - -struct btPointCollector : public btDiscreteCollisionDetectorInterface::Result -{ - btVector3 m_normalOnBInWorld; - btVector3 m_pointInWorld; - btScalar m_distance; //negative means penetration - - bool m_hasResult; - - btPointCollector() - : m_distance(btScalar(BT_LARGE_FLOAT)), m_hasResult(false) - { - } - - virtual void setShapeIdentifiersA(int partId0, int index0) - { - (void)partId0; - (void)index0; - } - virtual void setShapeIdentifiersB(int partId1, int index1) - { - (void)partId1; - (void)index1; - } - - virtual void addContactPoint(const btVector3& normalOnBInWorld, const btVector3& pointInWorld, btScalar depth) - { - if (depth < m_distance) - { - m_hasResult = true; - m_normalOnBInWorld = normalOnBInWorld; - m_pointInWorld = pointInWorld; - //negative means penetration - m_distance = depth; - } - } -}; - -#endif //BT_POINT_COLLECTOR_H diff --git a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btPolyhedralContactClipping.h b/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btPolyhedralContactClipping.h deleted file mode 100644 index 328f6424..00000000 --- a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btPolyhedralContactClipping.h +++ /dev/null @@ -1,42 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2011 Advanced Micro Devices, Inc. http://bulletphysics.org - -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 file was written by Erwin Coumans - -#ifndef BT_POLYHEDRAL_CONTACT_CLIPPING_H -#define BT_POLYHEDRAL_CONTACT_CLIPPING_H - -#include "LinearMath/btAlignedObjectArray.h" -#include "LinearMath/btTransform.h" -#include "btDiscreteCollisionDetectorInterface.h" - -class btConvexPolyhedron; - -typedef btAlignedObjectArray btVertexArray; - -// Clips a face to the back of a plane -struct btPolyhedralContactClipping -{ - static void clipHullAgainstHull(const btVector3& separatingNormal1, const btConvexPolyhedron& hullA, const btConvexPolyhedron& hullB, const btTransform& transA, const btTransform& transB, const btScalar minDist, btScalar maxDist, btVertexArray& worldVertsB1, btVertexArray& worldVertsB2, btDiscreteCollisionDetectorInterface::Result& resultOut); - - static void clipFaceAgainstHull(const btVector3& separatingNormal, const btConvexPolyhedron& hullA, const btTransform& transA, btVertexArray& worldVertsB1, btVertexArray& worldVertsB2, const btScalar minDist, btScalar maxDist, btDiscreteCollisionDetectorInterface::Result& resultOut); - - static bool findSeparatingAxis(const btConvexPolyhedron& hullA, const btConvexPolyhedron& hullB, const btTransform& transA, const btTransform& transB, btVector3& sep, btDiscreteCollisionDetectorInterface::Result& resultOut); - - ///the clipFace method is used internally - static void clipFace(const btVertexArray& pVtxIn, btVertexArray& ppVtxOut, const btVector3& planeNormalWS, btScalar planeEqWS); -}; - -#endif // BT_POLYHEDRAL_CONTACT_CLIPPING_H diff --git a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btRaycastCallback.h b/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btRaycastCallback.h deleted file mode 100644 index 2d0df718..00000000 --- a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btRaycastCallback.h +++ /dev/null @@ -1,72 +0,0 @@ -/* -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_RAYCAST_TRI_CALLBACK_H -#define BT_RAYCAST_TRI_CALLBACK_H - -#include "BulletCollision/CollisionShapes/btTriangleCallback.h" -#include "LinearMath/btTransform.h" -struct btBroadphaseProxy; -class btConvexShape; - -class btTriangleRaycastCallback : public btTriangleCallback -{ -public: - //input - btVector3 m_from; - btVector3 m_to; - - //@BP Mod - allow backface filtering and unflipped normals - enum EFlags - { - kF_None = 0, - kF_FilterBackfaces = 1 << 0, - kF_KeepUnflippedNormal = 1 << 1, // Prevents returned face normal getting flipped when a ray hits a back-facing triangle - ///SubSimplexConvexCastRaytest is the default, even if kF_None is set. - kF_UseSubSimplexConvexCastRaytest = 1 << 2, // Uses an approximate but faster ray versus convex intersection algorithm - kF_UseGjkConvexCastRaytest = 1 << 3, - kF_DisableHeightfieldAccelerator = 1 << 4, //don't use the heightfield raycast accelerator. See https://github.com/bulletphysics/bullet3/pull/2062 - kF_Terminator = 0xFFFFFFFF - }; - unsigned int m_flags; - - btScalar m_hitFraction; - - btTriangleRaycastCallback(const btVector3& from, const btVector3& to, unsigned int flags = 0); - - virtual void processTriangle(btVector3* triangle, int partId, int triangleIndex); - - virtual btScalar reportHit(const btVector3& hitNormalLocal, btScalar hitFraction, int partId, int triangleIndex) = 0; -}; - -class btTriangleConvexcastCallback : public btTriangleCallback -{ -public: - const btConvexShape* m_convexShape; - btTransform m_convexShapeFrom; - btTransform m_convexShapeTo; - btTransform m_triangleToWorld; - btScalar m_hitFraction; - btScalar m_triangleCollisionMargin; - btScalar m_allowedPenetration; - - btTriangleConvexcastCallback(const btConvexShape* convexShape, const btTransform& convexShapeFrom, const btTransform& convexShapeTo, const btTransform& triangleToWorld, const btScalar triangleCollisionMargin); - - virtual void processTriangle(btVector3* triangle, int partId, int triangleIndex); - - virtual btScalar reportHit(const btVector3& hitNormalLocal, const btVector3& hitPointLocal, btScalar hitFraction, int partId, int triangleIndex) = 0; -}; - -#endif //BT_RAYCAST_TRI_CALLBACK_H diff --git a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btSimplexSolverInterface.h b/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btSimplexSolverInterface.h deleted file mode 100644 index ccd22710..00000000 --- a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btSimplexSolverInterface.h +++ /dev/null @@ -1,58 +0,0 @@ -/* -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_SIMPLEX_SOLVER_INTERFACE_H -#define BT_SIMPLEX_SOLVER_INTERFACE_H - -#include "LinearMath/btVector3.h" - -#define NO_VIRTUAL_INTERFACE 1 -#ifdef NO_VIRTUAL_INTERFACE -#include "btVoronoiSimplexSolver.h" -#define btSimplexSolverInterface btVoronoiSimplexSolver -#else - -/// btSimplexSolverInterface can incrementally calculate distance between origin and up to 4 vertices -/// Used by GJK or Linear Casting. Can be implemented by the Johnson-algorithm or alternative approaches based on -/// voronoi regions or barycentric coordinates -class btSimplexSolverInterface -{ -public: - virtual ~btSimplexSolverInterface(){}; - - virtual void reset() = 0; - - virtual void addVertex(const btVector3& w, const btVector3& p, const btVector3& q) = 0; - - virtual bool closest(btVector3& v) = 0; - - virtual btScalar maxVertex() = 0; - - virtual bool fullSimplex() const = 0; - - virtual int getSimplex(btVector3* pBuf, btVector3* qBuf, btVector3* yBuf) const = 0; - - virtual bool inSimplex(const btVector3& w) = 0; - - virtual void backup_closest(btVector3& v) = 0; - - virtual bool emptySimplex() const = 0; - - virtual void compute_points(btVector3& p1, btVector3& p2) = 0; - - virtual int numVertices() const = 0; -}; -#endif -#endif //BT_SIMPLEX_SOLVER_INTERFACE_H diff --git a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.h b/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.h deleted file mode 100644 index 0638a30e..00000000 --- a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.h +++ /dev/null @@ -1,47 +0,0 @@ -/* -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_SUBSIMPLEX_CONVEX_CAST_H -#define BT_SUBSIMPLEX_CONVEX_CAST_H - -#include "btConvexCast.h" -#include "btSimplexSolverInterface.h" -class btConvexShape; - -/// btSubsimplexConvexCast implements Gino van den Bergens' paper -///"Ray Casting against bteral Convex Objects with Application to Continuous Collision Detection" -/// GJK based Ray Cast, optimized version -/// Objects should not start in overlap, otherwise results are not defined. -class btSubsimplexConvexCast : public btConvexCast -{ - btSimplexSolverInterface* m_simplexSolver; - const btConvexShape* m_convexA; - const btConvexShape* m_convexB; - -public: - btSubsimplexConvexCast(const btConvexShape* shapeA, const btConvexShape* shapeB, btSimplexSolverInterface* simplexSolver); - - //virtual ~btSubsimplexConvexCast(); - ///SimsimplexConvexCast calculateTimeOfImpact calculates the time of impact+normal for the linear cast (sweep) between two moving objects. - ///Precondition is that objects should not penetration/overlap at the start from the interval. Overlap can be tested using btGjkPairDetector. - virtual bool calcTimeOfImpact( - const btTransform& fromA, - const btTransform& toA, - const btTransform& fromB, - const btTransform& toB, - CastResult& result); -}; - -#endif //BT_SUBSIMPLEX_CONVEX_CAST_H diff --git a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h b/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h deleted file mode 100644 index 24a0a8f2..00000000 --- a/engine/inc/bullet/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h +++ /dev/null @@ -1,173 +0,0 @@ -/* -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_VORONOI_SIMPLEX_SOLVER_H -#define BT_VORONOI_SIMPLEX_SOLVER_H - -#include "btSimplexSolverInterface.h" - -#define VORONOI_SIMPLEX_MAX_VERTS 5 - -///disable next define, or use defaultCollisionConfiguration->getSimplexSolver()->setEqualVertexThreshold(0.f) to disable/configure -#define BT_USE_EQUAL_VERTEX_THRESHOLD - -#ifdef BT_USE_DOUBLE_PRECISION -#define VORONOI_DEFAULT_EQUAL_VERTEX_THRESHOLD 1e-12f -#else -#define VORONOI_DEFAULT_EQUAL_VERTEX_THRESHOLD 0.0001f -#endif //BT_USE_DOUBLE_PRECISION - -struct btUsageBitfield -{ - btUsageBitfield() - { - reset(); - } - - void reset() - { - usedVertexA = false; - usedVertexB = false; - usedVertexC = false; - usedVertexD = false; - } - unsigned short usedVertexA : 1; - unsigned short usedVertexB : 1; - unsigned short usedVertexC : 1; - unsigned short usedVertexD : 1; - unsigned short unused1 : 1; - unsigned short unused2 : 1; - unsigned short unused3 : 1; - unsigned short unused4 : 1; -}; - -struct btSubSimplexClosestResult -{ - btVector3 m_closestPointOnSimplex; - //MASK for m_usedVertices - //stores the simplex vertex-usage, using the MASK, - // if m_usedVertices & MASK then the related vertex is used - btUsageBitfield m_usedVertices; - btScalar m_barycentricCoords[4]; - bool m_degenerate; - - void reset() - { - m_degenerate = false; - setBarycentricCoordinates(); - m_usedVertices.reset(); - } - bool isValid() - { - bool valid = (m_barycentricCoords[0] >= btScalar(0.)) && - (m_barycentricCoords[1] >= btScalar(0.)) && - (m_barycentricCoords[2] >= btScalar(0.)) && - (m_barycentricCoords[3] >= btScalar(0.)); - - return valid; - } - void setBarycentricCoordinates(btScalar a = btScalar(0.), btScalar b = btScalar(0.), btScalar c = btScalar(0.), btScalar d = btScalar(0.)) - { - m_barycentricCoords[0] = a; - m_barycentricCoords[1] = b; - m_barycentricCoords[2] = c; - m_barycentricCoords[3] = d; - } -}; - -/// btVoronoiSimplexSolver is an implementation of the closest point distance algorithm from a 1-4 points simplex to the origin. -/// Can be used with GJK, as an alternative to Johnson distance algorithm. -#ifdef NO_VIRTUAL_INTERFACE -ATTRIBUTE_ALIGNED16(class) -btVoronoiSimplexSolver -#else -ATTRIBUTE_ALIGNED16(class) -btVoronoiSimplexSolver : public btSimplexSolverInterface -#endif -{ -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - int m_numVertices; - - btVector3 m_simplexVectorW[VORONOI_SIMPLEX_MAX_VERTS]; - btVector3 m_simplexPointsP[VORONOI_SIMPLEX_MAX_VERTS]; - btVector3 m_simplexPointsQ[VORONOI_SIMPLEX_MAX_VERTS]; - - btVector3 m_cachedP1; - btVector3 m_cachedP2; - btVector3 m_cachedV; - btVector3 m_lastW; - - btScalar m_equalVertexThreshold; - bool m_cachedValidClosest; - - btSubSimplexClosestResult m_cachedBC; - - bool m_needsUpdate; - - void removeVertex(int index); - void reduceVertices(const btUsageBitfield& usedVerts); - bool updateClosestVectorAndPoints(); - - bool closestPtPointTetrahedron(const btVector3& p, const btVector3& a, const btVector3& b, const btVector3& c, const btVector3& d, btSubSimplexClosestResult& finalResult); - int pointOutsideOfPlane(const btVector3& p, const btVector3& a, const btVector3& b, const btVector3& c, const btVector3& d); - bool closestPtPointTriangle(const btVector3& p, const btVector3& a, const btVector3& b, const btVector3& c, btSubSimplexClosestResult& result); - -public: - btVoronoiSimplexSolver() - : m_equalVertexThreshold(VORONOI_DEFAULT_EQUAL_VERTEX_THRESHOLD) - { - } - void reset(); - - void addVertex(const btVector3& w, const btVector3& p, const btVector3& q); - - void setEqualVertexThreshold(btScalar threshold) - { - m_equalVertexThreshold = threshold; - } - - btScalar getEqualVertexThreshold() const - { - return m_equalVertexThreshold; - } - - bool closest(btVector3 & v); - - btScalar maxVertex(); - - bool fullSimplex() const - { - return (m_numVertices == 4); - } - - int getSimplex(btVector3 * pBuf, btVector3 * qBuf, btVector3 * yBuf) const; - - bool inSimplex(const btVector3& w); - - void backup_closest(btVector3 & v); - - bool emptySimplex() const; - - void compute_points(btVector3 & p1, btVector3 & p2); - - int numVertices() const - { - return m_numVertices; - } -}; - -#endif //BT_VORONOI_SIMPLEX_SOLVER_H diff --git a/engine/inc/bullet/BulletCollision/btBulletCollisionCommon.h b/engine/inc/bullet/BulletCollision/btBulletCollisionCommon.h deleted file mode 100644 index 4f523756..00000000 --- a/engine/inc/bullet/BulletCollision/btBulletCollisionCommon.h +++ /dev/null @@ -1,65 +0,0 @@ -/* -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 BULLET_COLLISION_COMMON_H -#define BULLET_COLLISION_COMMON_H - -///Common headerfile includes for Bullet Collision Detection - -///Bullet's btCollisionWorld and btCollisionObject definitions -#include "BulletCollision/CollisionDispatch/btCollisionWorld.h" -#include "BulletCollision/CollisionDispatch/btCollisionObject.h" - -///Collision Shapes -#include "BulletCollision/CollisionShapes/btBoxShape.h" -#include "BulletCollision/CollisionShapes/btSphereShape.h" -#include "BulletCollision/CollisionShapes/btCapsuleShape.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/btBvhTriangleMeshShape.h" -#include "BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h" -#include "BulletCollision/CollisionShapes/btTriangleMeshShape.h" -#include "BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h" -#include "BulletCollision/CollisionShapes/btCompoundShape.h" -#include "BulletCollision/CollisionShapes/btTetrahedronShape.h" -#include "BulletCollision/CollisionShapes/btEmptyShape.h" -#include "BulletCollision/CollisionShapes/btMultiSphereShape.h" -#include "BulletCollision/CollisionShapes/btUniformScalingShape.h" - -///Narrowphase Collision Detector -#include "BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.h" - -//#include "BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.h" -#include "BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.h" - -///Dispatching and generation of collision pairs (broadphase) -#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" -#include "BulletCollision/BroadphaseCollision/btSimpleBroadphase.h" -#include "BulletCollision/BroadphaseCollision/btAxisSweep3.h" -#include "BulletCollision/BroadphaseCollision/btDbvtBroadphase.h" - -///Math library & Utils -#include "LinearMath/btQuaternion.h" -#include "LinearMath/btTransform.h" -#include "LinearMath/btDefaultMotionState.h" -#include "LinearMath/btQuickprof.h" -#include "LinearMath/btIDebugDraw.h" -#include "LinearMath/btSerializer.h" - -#endif //BULLET_COLLISION_COMMON_H diff --git a/engine/inc/bullet/BulletDynamics/Character/btCharacterControllerInterface.h b/engine/inc/bullet/BulletDynamics/Character/btCharacterControllerInterface.h deleted file mode 100644 index 2ccf317b..00000000 --- a/engine/inc/bullet/BulletDynamics/Character/btCharacterControllerInterface.h +++ /dev/null @@ -1,46 +0,0 @@ -/* -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. -*/ - -#ifndef BT_CHARACTER_CONTROLLER_INTERFACE_H -#define BT_CHARACTER_CONTROLLER_INTERFACE_H - -#include "LinearMath/btVector3.h" -#include "BulletDynamics/Dynamics/btActionInterface.h" - -class btCollisionShape; -class btRigidBody; -class btCollisionWorld; - -class btCharacterControllerInterface : public btActionInterface -{ -public: - btCharacterControllerInterface(){}; - virtual ~btCharacterControllerInterface(){}; - - virtual void setWalkDirection(const btVector3& walkDirection) = 0; - virtual void setVelocityForTimeInterval(const btVector3& velocity, btScalar timeInterval) = 0; - virtual void reset(btCollisionWorld* collisionWorld) = 0; - virtual void warp(const btVector3& origin) = 0; - - virtual void preStep(btCollisionWorld* collisionWorld) = 0; - virtual void playerStep(btCollisionWorld* collisionWorld, btScalar dt) = 0; - virtual bool canJump() const = 0; - virtual void jump(const btVector3& dir = btVector3(0, 0, 0)) = 0; - - virtual bool onGround() const = 0; - virtual void setUpInterpolate(bool value) = 0; -}; - -#endif //BT_CHARACTER_CONTROLLER_INTERFACE_H diff --git a/engine/inc/bullet/BulletDynamics/Character/btKinematicCharacterController.h b/engine/inc/bullet/BulletDynamics/Character/btKinematicCharacterController.h deleted file mode 100644 index ff34fc87..00000000 --- a/engine/inc/bullet/BulletDynamics/Character/btKinematicCharacterController.h +++ /dev/null @@ -1,200 +0,0 @@ -/* -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. -*/ - -#ifndef BT_KINEMATIC_CHARACTER_CONTROLLER_H -#define BT_KINEMATIC_CHARACTER_CONTROLLER_H - -#include "LinearMath/btVector3.h" - -#include "btCharacterControllerInterface.h" - -#include "BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h" - -class btCollisionShape; -class btConvexShape; -class btRigidBody; -class btCollisionWorld; -class btCollisionDispatcher; -class btPairCachingGhostObject; - -///btKinematicCharacterController is an object that supports a sliding motion in a world. -///It uses a ghost object and convex sweep test to test for upcoming collisions. This is combined with discrete collision detection to recover from penetrations. -///Interaction between btKinematicCharacterController and dynamic rigid bodies needs to be explicity implemented by the user. -ATTRIBUTE_ALIGNED16(class) -btKinematicCharacterController : public btCharacterControllerInterface -{ -protected: - btScalar m_halfHeight; - - btPairCachingGhostObject* m_ghostObject; - btConvexShape* m_convexShape; //is also in m_ghostObject, but it needs to be convex, so we store it here to avoid upcast - - btScalar m_maxPenetrationDepth; - btScalar m_verticalVelocity; - btScalar m_verticalOffset; - btScalar m_fallSpeed; - btScalar m_jumpSpeed; - btScalar m_SetjumpSpeed; - btScalar m_maxJumpHeight; - btScalar m_maxSlopeRadians; // Slope angle that is set (used for returning the exact value) - btScalar m_maxSlopeCosine; // Cosine equivalent of m_maxSlopeRadians (calculated once when set, for optimization) - btScalar m_gravity; - - btScalar m_turnAngle; - - btScalar m_stepHeight; - - btScalar m_addedMargin; //@todo: remove this and fix the code - - ///this is the desired walk direction, set by the user - btVector3 m_walkDirection; - btVector3 m_normalizedDirection; - btVector3 m_AngVel; - - btVector3 m_jumpPosition; - - //some internal variables - btVector3 m_currentPosition; - btScalar m_currentStepOffset; - btVector3 m_targetPosition; - - btQuaternion m_currentOrientation; - btQuaternion m_targetOrientation; - - ///keep track of the contact manifolds - btManifoldArray m_manifoldArray; - - bool m_touchingContact; - btVector3 m_touchingNormal; - - btScalar m_linearDamping; - btScalar m_angularDamping; - - bool m_wasOnGround; - bool m_wasJumping; - bool m_useGhostObjectSweepTest; - bool m_useWalkDirection; - btScalar m_velocityTimeInterval; - btVector3 m_up; - btVector3 m_jumpAxis; - - static btVector3* getUpAxisDirections(); - bool m_interpolateUp; - bool full_drop; - bool bounce_fix; - - btVector3 computeReflectionDirection(const btVector3& direction, const btVector3& normal); - btVector3 parallelComponent(const btVector3& direction, const btVector3& normal); - btVector3 perpindicularComponent(const btVector3& direction, const btVector3& normal); - - bool recoverFromPenetration(btCollisionWorld * collisionWorld); - void stepUp(btCollisionWorld * collisionWorld); - void updateTargetPositionBasedOnCollision(const btVector3& hit_normal, btScalar tangentMag = btScalar(0.0), btScalar normalMag = btScalar(1.0)); - void stepForwardAndStrafe(btCollisionWorld * collisionWorld, const btVector3& walkMove); - void stepDown(btCollisionWorld * collisionWorld, btScalar dt); - - virtual bool needsCollision(const btCollisionObject* body0, const btCollisionObject* body1); - - void setUpVector(const btVector3& up); - - btQuaternion getRotation(btVector3 & v0, btVector3 & v1) const; - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btKinematicCharacterController(btPairCachingGhostObject * ghostObject, btConvexShape * convexShape, btScalar stepHeight, const btVector3& up = btVector3(1.0, 0.0, 0.0)); - ~btKinematicCharacterController(); - - ///btActionInterface interface - virtual void updateAction(btCollisionWorld * collisionWorld, btScalar deltaTime) - { - preStep(collisionWorld); - playerStep(collisionWorld, deltaTime); - } - - ///btActionInterface interface - void debugDraw(btIDebugDraw * debugDrawer); - - void setUp(const btVector3& up); - - const btVector3& getUp() { return m_up; } - - /// This should probably be called setPositionIncrementPerSimulatorStep. - /// This is neither a direction nor a velocity, but the amount to - /// increment the position each simulation iteration, regardless - /// of dt. - /// This call will reset any velocity set by setVelocityForTimeInterval(). - virtual void setWalkDirection(const btVector3& walkDirection); - - /// Caller provides a velocity with which the character should move for - /// the given time period. After the time period, velocity is reset - /// to zero. - /// This call will reset any walk direction set by setWalkDirection(). - /// Negative time intervals will result in no motion. - virtual void setVelocityForTimeInterval(const btVector3& velocity, - btScalar timeInterval); - - virtual void setAngularVelocity(const btVector3& velocity); - virtual const btVector3& getAngularVelocity() const; - - virtual void setLinearVelocity(const btVector3& velocity); - virtual btVector3 getLinearVelocity() const; - - void setLinearDamping(btScalar d) { m_linearDamping = btClamped(d, (btScalar)btScalar(0.0), (btScalar)btScalar(1.0)); } - btScalar getLinearDamping() const { return m_linearDamping; } - void setAngularDamping(btScalar d) { m_angularDamping = btClamped(d, (btScalar)btScalar(0.0), (btScalar)btScalar(1.0)); } - btScalar getAngularDamping() const { return m_angularDamping; } - - void reset(btCollisionWorld * collisionWorld); - void warp(const btVector3& origin); - - void preStep(btCollisionWorld * collisionWorld); - void playerStep(btCollisionWorld * collisionWorld, btScalar dt); - - void setStepHeight(btScalar h); - btScalar getStepHeight() const { return m_stepHeight; } - void setFallSpeed(btScalar fallSpeed); - btScalar getFallSpeed() const { return m_fallSpeed; } - void setJumpSpeed(btScalar jumpSpeed); - btScalar getJumpSpeed() const { return m_jumpSpeed; } - void setMaxJumpHeight(btScalar maxJumpHeight); - bool canJump() const; - - void jump(const btVector3& v = btVector3(0, 0, 0)); - - void applyImpulse(const btVector3& v) { jump(v); } - - void setGravity(const btVector3& gravity); - btVector3 getGravity() const; - - /// The max slope determines the maximum angle that the controller can walk up. - /// The slope angle is measured in radians. - void setMaxSlope(btScalar slopeRadians); - btScalar getMaxSlope() const; - - void setMaxPenetrationDepth(btScalar d); - btScalar getMaxPenetrationDepth() const; - - btPairCachingGhostObject* getGhostObject(); - void setUseGhostSweepTest(bool useGhostObjectSweepTest) - { - m_useGhostObjectSweepTest = useGhostObjectSweepTest; - } - - bool onGround() const; - void setUpInterpolate(bool value); -}; - -#endif // BT_KINEMATIC_CHARACTER_CONTROLLER_H diff --git a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btBatchedConstraints.h b/engine/inc/bullet/BulletDynamics/ConstraintSolver/btBatchedConstraints.h deleted file mode 100644 index 5d982ca3..00000000 --- a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btBatchedConstraints.h +++ /dev/null @@ -1,62 +0,0 @@ -/* -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_BATCHED_CONSTRAINTS_H -#define BT_BATCHED_CONSTRAINTS_H - -#include "LinearMath/btThreads.h" -#include "LinearMath/btAlignedObjectArray.h" -#include "BulletDynamics/ConstraintSolver/btSolverBody.h" -#include "BulletDynamics/ConstraintSolver/btSolverConstraint.h" - -class btIDebugDraw; - -struct btBatchedConstraints -{ - enum BatchingMethod - { - BATCHING_METHOD_SPATIAL_GRID_2D, - BATCHING_METHOD_SPATIAL_GRID_3D, - BATCHING_METHOD_COUNT - }; - struct Range - { - int begin; - int end; - - Range() : begin(0), end(0) {} - Range(int _beg, int _end) : begin(_beg), end(_end) {} - }; - - btAlignedObjectArray m_constraintIndices; - btAlignedObjectArray m_batches; // each batch is a range of indices in the m_constraintIndices array - btAlignedObjectArray m_phases; // each phase is range of indices in the m_batches array - btAlignedObjectArray m_phaseGrainSize; // max grain size for each phase - btAlignedObjectArray m_phaseOrder; // phases can be done in any order, so we can randomize the order here - btIDebugDraw* m_debugDrawer; - - static bool s_debugDrawBatches; - - btBatchedConstraints() { m_debugDrawer = NULL; } - void setup(btConstraintArray* constraints, - const btAlignedObjectArray& bodies, - BatchingMethod batchingMethod, - int minBatchSize, - int maxBatchSize, - btAlignedObjectArray* scratchMemory); - bool validate(btConstraintArray* constraints, const btAlignedObjectArray& bodies) const; -}; - -#endif // BT_BATCHED_CONSTRAINTS_H diff --git a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btConeTwistConstraint.h b/engine/inc/bullet/BulletDynamics/ConstraintSolver/btConeTwistConstraint.h deleted file mode 100644 index 64f44df1..00000000 --- a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btConeTwistConstraint.h +++ /dev/null @@ -1,423 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -btConeTwistConstraint is 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: Marcus Hennix -*/ - -/* -Overview: - -btConeTwistConstraint can be used to simulate ragdoll joints (upper arm, leg etc). -It is a fixed translation, 3 degree-of-freedom (DOF) rotational "joint". -It divides the 3 rotational DOFs into swing (movement within a cone) and twist. -Swing is divided into swing1 and swing2 which can have different limits, giving an elliptical shape. -(Note: the cone's base isn't flat, so this ellipse is "embedded" on the surface of a sphere.) - -In the contraint's frame of reference: -twist is along the x-axis, -and swing 1 and 2 are along the z and y axes respectively. -*/ - -#ifndef BT_CONETWISTCONSTRAINT_H -#define BT_CONETWISTCONSTRAINT_H - -#include "LinearMath/btVector3.h" -#include "btJacobianEntry.h" -#include "btTypedConstraint.h" - -#ifdef BT_USE_DOUBLE_PRECISION -#define btConeTwistConstraintData2 btConeTwistConstraintDoubleData -#define btConeTwistConstraintDataName "btConeTwistConstraintDoubleData" -#else -#define btConeTwistConstraintData2 btConeTwistConstraintData -#define btConeTwistConstraintDataName "btConeTwistConstraintData" -#endif //BT_USE_DOUBLE_PRECISION - -class btRigidBody; - -enum btConeTwistFlags -{ - BT_CONETWIST_FLAGS_LIN_CFM = 1, - BT_CONETWIST_FLAGS_LIN_ERP = 2, - BT_CONETWIST_FLAGS_ANG_CFM = 4 -}; - -///btConeTwistConstraint can be used to simulate ragdoll joints (upper arm, leg etc) -ATTRIBUTE_ALIGNED16(class) -btConeTwistConstraint : public btTypedConstraint -{ -#ifdef IN_PARALLELL_SOLVER -public: -#endif - btJacobianEntry m_jac[3]; //3 orthogonal linear constraints - - btTransform m_rbAFrame; - btTransform m_rbBFrame; - - btScalar m_limitSoftness; - btScalar m_biasFactor; - btScalar m_relaxationFactor; - - btScalar m_damping; - - btScalar m_swingSpan1; - btScalar m_swingSpan2; - btScalar m_twistSpan; - - btScalar m_fixThresh; - - btVector3 m_swingAxis; - btVector3 m_twistAxis; - - btScalar m_kSwing; - btScalar m_kTwist; - - btScalar m_twistLimitSign; - btScalar m_swingCorrection; - btScalar m_twistCorrection; - - btScalar m_twistAngle; - - btScalar m_accSwingLimitImpulse; - btScalar m_accTwistLimitImpulse; - - bool m_angularOnly; - bool m_solveTwistLimit; - bool m_solveSwingLimit; - - bool m_useSolveConstraintObsolete; - - // not yet used... - btScalar m_swingLimitRatio; - btScalar m_twistLimitRatio; - btVector3 m_twistAxisA; - - // motor - bool m_bMotorEnabled; - bool m_bNormalizedMotorStrength; - btQuaternion m_qTarget; - btScalar m_maxMotorImpulse; - btVector3 m_accMotorImpulse; - - // parameters - int m_flags; - btScalar m_linCFM; - btScalar m_linERP; - btScalar m_angCFM; - -protected: - void init(); - - void computeConeLimitInfo(const btQuaternion& qCone, // in - btScalar& swingAngle, btVector3& vSwingAxis, btScalar& swingLimit); // all outs - - void computeTwistLimitInfo(const btQuaternion& qTwist, // in - btScalar& twistAngle, btVector3& vTwistAxis); // all outs - - void adjustSwingAxisToUseEllipseNormal(btVector3 & vSwingAxis) const; - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btConeTwistConstraint(btRigidBody & rbA, btRigidBody & rbB, const btTransform& rbAFrame, const btTransform& rbBFrame); - - btConeTwistConstraint(btRigidBody & rbA, const btTransform& rbAFrame); - - virtual void buildJacobian(); - - virtual void getInfo1(btConstraintInfo1 * info); - - void getInfo1NonVirtual(btConstraintInfo1 * info); - - virtual void getInfo2(btConstraintInfo2 * info); - - void getInfo2NonVirtual(btConstraintInfo2 * info, const btTransform& transA, const btTransform& transB, const btMatrix3x3& invInertiaWorldA, const btMatrix3x3& invInertiaWorldB); - - virtual void solveConstraintObsolete(btSolverBody & bodyA, btSolverBody & bodyB, btScalar timeStep); - - void updateRHS(btScalar timeStep); - - const btRigidBody& getRigidBodyA() const - { - return m_rbA; - } - const btRigidBody& getRigidBodyB() const - { - return m_rbB; - } - - void setAngularOnly(bool angularOnly) - { - m_angularOnly = angularOnly; - } - - bool getAngularOnly() const - { - return m_angularOnly; - } - - void setLimit(int limitIndex, btScalar limitValue) - { - switch (limitIndex) - { - case 3: - { - m_twistSpan = limitValue; - break; - } - case 4: - { - m_swingSpan2 = limitValue; - break; - } - case 5: - { - m_swingSpan1 = limitValue; - break; - } - default: - { - } - }; - } - - btScalar getLimit(int limitIndex) const - { - switch (limitIndex) - { - case 3: - { - return m_twistSpan; - break; - } - case 4: - { - return m_swingSpan2; - break; - } - case 5: - { - return m_swingSpan1; - break; - } - default: - { - btAssert(0 && "Invalid limitIndex specified for btConeTwistConstraint"); - return 0.0; - } - }; - } - - // setLimit(), a few notes: - // _softness: - // 0->1, recommend ~0.8->1. - // describes % of limits where movement is free. - // beyond this softness %, the limit is gradually enforced until the "hard" (1.0) limit is reached. - // _biasFactor: - // 0->1?, recommend 0.3 +/-0.3 or so. - // strength with which constraint resists zeroth order (angular, not angular velocity) limit violation. - // __relaxationFactor: - // 0->1, recommend to stay near 1. - // the lower the value, the less the constraint will fight velocities which violate the angular limits. - void setLimit(btScalar _swingSpan1, btScalar _swingSpan2, btScalar _twistSpan, btScalar _softness = 1.f, btScalar _biasFactor = 0.3f, btScalar _relaxationFactor = 1.0f) - { - m_swingSpan1 = _swingSpan1; - m_swingSpan2 = _swingSpan2; - m_twistSpan = _twistSpan; - - m_limitSoftness = _softness; - m_biasFactor = _biasFactor; - m_relaxationFactor = _relaxationFactor; - } - - const btTransform& getAFrame() const { return m_rbAFrame; }; - const btTransform& getBFrame() const { return m_rbBFrame; }; - - inline int getSolveTwistLimit() - { - return m_solveTwistLimit; - } - - inline int getSolveSwingLimit() - { - return m_solveSwingLimit; - } - - inline btScalar getTwistLimitSign() - { - return m_twistLimitSign; - } - - void calcAngleInfo(); - void calcAngleInfo2(const btTransform& transA, const btTransform& transB, const btMatrix3x3& invInertiaWorldA, const btMatrix3x3& invInertiaWorldB); - - inline btScalar getSwingSpan1() const - { - return m_swingSpan1; - } - inline btScalar getSwingSpan2() const - { - return m_swingSpan2; - } - inline btScalar getTwistSpan() const - { - return m_twistSpan; - } - inline btScalar getLimitSoftness() const - { - return m_limitSoftness; - } - inline btScalar getBiasFactor() const - { - return m_biasFactor; - } - inline btScalar getRelaxationFactor() const - { - return m_relaxationFactor; - } - inline btScalar getTwistAngle() const - { - return m_twistAngle; - } - bool isPastSwingLimit() { return m_solveSwingLimit; } - - btScalar getDamping() const { return m_damping; } - void setDamping(btScalar damping) { m_damping = damping; } - - void enableMotor(bool b) { m_bMotorEnabled = b; } - bool isMotorEnabled() const { return m_bMotorEnabled; } - btScalar getMaxMotorImpulse() const { return m_maxMotorImpulse; } - bool isMaxMotorImpulseNormalized() const { return m_bNormalizedMotorStrength; } - void setMaxMotorImpulse(btScalar maxMotorImpulse) - { - m_maxMotorImpulse = maxMotorImpulse; - m_bNormalizedMotorStrength = false; - } - void setMaxMotorImpulseNormalized(btScalar maxMotorImpulse) - { - m_maxMotorImpulse = maxMotorImpulse; - m_bNormalizedMotorStrength = true; - } - - btScalar getFixThresh() { return m_fixThresh; } - void setFixThresh(btScalar fixThresh) { m_fixThresh = fixThresh; } - - // setMotorTarget: - // q: the desired rotation of bodyA wrt bodyB. - // note: if q violates the joint limits, the internal target is clamped to avoid conflicting impulses (very bad for stability) - // note: don't forget to enableMotor() - void setMotorTarget(const btQuaternion& q); - const btQuaternion& getMotorTarget() const { return m_qTarget; } - - // same as above, but q is the desired rotation of frameA wrt frameB in constraint space - void setMotorTargetInConstraintSpace(const btQuaternion& q); - - btVector3 GetPointForAngle(btScalar fAngleInRadians, btScalar fLength) const; - - ///override the default global value of a parameter (such as ERP or CFM), optionally provide the axis (0..5). - ///If no axis is provided, it uses the default axis for this constraint. - virtual void setParam(int num, btScalar value, int axis = -1); - - virtual void setFrames(const btTransform& frameA, const btTransform& frameB); - - const btTransform& getFrameOffsetA() const - { - return m_rbAFrame; - } - - const btTransform& getFrameOffsetB() const - { - return m_rbBFrame; - } - - ///return the local value of parameter - virtual btScalar getParam(int num, int axis = -1) const; - - int getFlags() const - { - return m_flags; - } - - virtual int calculateSerializeBufferSize() const; - - ///fills the dataBuffer and returns the struct name (and 0 on failure) - virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const; -}; - -struct btConeTwistConstraintDoubleData -{ - btTypedConstraintDoubleData m_typeConstraintData; - btTransformDoubleData m_rbAFrame; - btTransformDoubleData m_rbBFrame; - - //limits - double m_swingSpan1; - double m_swingSpan2; - double m_twistSpan; - double m_limitSoftness; - double m_biasFactor; - double m_relaxationFactor; - - double m_damping; -}; - -#ifdef BT_BACKWARDS_COMPATIBLE_SERIALIZATION -///this structure is not used, except for loading pre-2.82 .bullet files -struct btConeTwistConstraintData -{ - btTypedConstraintData m_typeConstraintData; - btTransformFloatData m_rbAFrame; - btTransformFloatData m_rbBFrame; - - //limits - float m_swingSpan1; - float m_swingSpan2; - float m_twistSpan; - float m_limitSoftness; - float m_biasFactor; - float m_relaxationFactor; - - float m_damping; - - char m_pad[4]; -}; -#endif //BT_BACKWARDS_COMPATIBLE_SERIALIZATION -// - -SIMD_FORCE_INLINE int btConeTwistConstraint::calculateSerializeBufferSize() const -{ - return sizeof(btConeTwistConstraintData2); -} - -///fills the dataBuffer and returns the struct name (and 0 on failure) -SIMD_FORCE_INLINE const char* btConeTwistConstraint::serialize(void* dataBuffer, btSerializer* serializer) const -{ - btConeTwistConstraintData2* cone = (btConeTwistConstraintData2*)dataBuffer; - btTypedConstraint::serialize(&cone->m_typeConstraintData, serializer); - - m_rbAFrame.serialize(cone->m_rbAFrame); - m_rbBFrame.serialize(cone->m_rbBFrame); - - cone->m_swingSpan1 = m_swingSpan1; - cone->m_swingSpan2 = m_swingSpan2; - cone->m_twistSpan = m_twistSpan; - cone->m_limitSoftness = m_limitSoftness; - cone->m_biasFactor = m_biasFactor; - cone->m_relaxationFactor = m_relaxationFactor; - cone->m_damping = m_damping; - - return btConeTwistConstraintDataName; -} - -#endif //BT_CONETWISTCONSTRAINT_H diff --git a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btConstraintSolver.h b/engine/inc/bullet/BulletDynamics/ConstraintSolver/btConstraintSolver.h deleted file mode 100644 index 68a4a07a..00000000 --- a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btConstraintSolver.h +++ /dev/null @@ -1,59 +0,0 @@ -/* -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_CONSTRAINT_SOLVER_H -#define BT_CONSTRAINT_SOLVER_H - -#include "LinearMath/btScalar.h" - -class btPersistentManifold; -class btRigidBody; -class btCollisionObject; -class btTypedConstraint; -struct btContactSolverInfo; -struct btBroadphaseProxy; -class btIDebugDraw; -class btStackAlloc; -class btDispatcher; -/// btConstraintSolver provides solver interface - -enum btConstraintSolverType -{ - BT_SEQUENTIAL_IMPULSE_SOLVER = 1, - BT_MLCP_SOLVER = 2, - BT_NNCG_SOLVER = 4, - BT_MULTIBODY_SOLVER = 8, - BT_BLOCK_SOLVER = 16, -}; - -class btConstraintSolver -{ -public: - virtual ~btConstraintSolver() {} - - virtual void prepareSolve(int /* numBodies */, int /* numManifolds */) { ; } - - ///solve a group of constraints - virtual btScalar solveGroup(btCollisionObject** bodies, int numBodies, btPersistentManifold** manifold, int numManifolds, btTypedConstraint** constraints, int numConstraints, const btContactSolverInfo& info, class btIDebugDraw* debugDrawer, btDispatcher* dispatcher) = 0; - - virtual void allSolved(const btContactSolverInfo& /* info */, class btIDebugDraw* /* debugDrawer */) { ; } - - ///clear internal cached data and reset random seed - virtual void reset() = 0; - - virtual btConstraintSolverType getSolverType() const = 0; -}; - -#endif //BT_CONSTRAINT_SOLVER_H diff --git a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btContactConstraint.h b/engine/inc/bullet/BulletDynamics/ConstraintSolver/btContactConstraint.h deleted file mode 100644 index 255489be..00000000 --- a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btContactConstraint.h +++ /dev/null @@ -1,65 +0,0 @@ -/* -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_CONTACT_CONSTRAINT_H -#define BT_CONTACT_CONSTRAINT_H - -#include "LinearMath/btVector3.h" -#include "btJacobianEntry.h" -#include "btTypedConstraint.h" -#include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h" - -///btContactConstraint can be automatically created to solve contact constraints using the unified btTypedConstraint interface -ATTRIBUTE_ALIGNED16(class) -btContactConstraint : public btTypedConstraint -{ -protected: - btPersistentManifold m_contactManifold; - -protected: - btContactConstraint(btPersistentManifold * contactManifold, btRigidBody & rbA, btRigidBody & rbB); - -public: - void setContactManifold(btPersistentManifold * contactManifold); - - btPersistentManifold* getContactManifold() - { - return &m_contactManifold; - } - - const btPersistentManifold* getContactManifold() const - { - return &m_contactManifold; - } - - virtual ~btContactConstraint(); - - virtual void getInfo1(btConstraintInfo1 * info); - - virtual void getInfo2(btConstraintInfo2 * info); - - ///obsolete methods - virtual void buildJacobian(); -}; - -///very basic collision resolution without friction -btScalar resolveSingleCollision(btRigidBody* body1, class btCollisionObject* colObj2, const btVector3& contactPositionWorld, const btVector3& contactNormalOnB, const struct btContactSolverInfo& solverInfo, btScalar distance); - -///resolveSingleBilateral is an obsolete methods used for vehicle friction between two dynamic objects -void resolveSingleBilateral(btRigidBody& body1, const btVector3& pos1, - btRigidBody& body2, const btVector3& pos2, - btScalar distance, const btVector3& normal, btScalar& impulse, btScalar timeStep); - -#endif //BT_CONTACT_CONSTRAINT_H diff --git a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btContactSolverInfo.h b/engine/inc/bullet/BulletDynamics/ConstraintSolver/btContactSolverInfo.h deleted file mode 100644 index 3316403a..00000000 --- a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btContactSolverInfo.h +++ /dev/null @@ -1,177 +0,0 @@ -/* -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_CONTACT_SOLVER_INFO -#define BT_CONTACT_SOLVER_INFO - -#include "LinearMath/btScalar.h" - -enum btSolverMode -{ - SOLVER_RANDMIZE_ORDER = 1, - SOLVER_FRICTION_SEPARATE = 2, - SOLVER_USE_WARMSTARTING = 4, - SOLVER_USE_2_FRICTION_DIRECTIONS = 16, - SOLVER_ENABLE_FRICTION_DIRECTION_CACHING = 32, - SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION = 64, - SOLVER_CACHE_FRIENDLY = 128, - SOLVER_SIMD = 256, - SOLVER_INTERLEAVE_CONTACT_AND_FRICTION_CONSTRAINTS = 512, - SOLVER_ALLOW_ZERO_LENGTH_FRICTION_DIRECTIONS = 1024, - SOLVER_DISABLE_IMPLICIT_CONE_FRICTION = 2048, - SOLVER_USE_ARTICULATED_WARMSTARTING = 4096, -}; - -struct btContactSolverInfoData -{ - btScalar m_tau; - btScalar m_damping; //global non-contact constraint damping, can be locally overridden by constraints during 'getInfo2'. - btScalar m_friction; - btScalar m_timeStep; - btScalar m_restitution; - int m_numIterations; - btScalar m_maxErrorReduction; - btScalar m_sor; //successive over-relaxation term - btScalar m_erp; //error reduction for non-contact constraints - btScalar m_erp2; //error reduction for contact constraints - btScalar m_deformable_erp; //error reduction for deformable constraints - btScalar m_deformable_cfm; //constraint force mixing for deformable constraints - btScalar m_deformable_maxErrorReduction; // maxErrorReduction for deformable contact - btScalar m_globalCfm; //constraint force mixing for contacts and non-contacts - btScalar m_frictionERP; //error reduction for friction constraints - btScalar m_frictionCFM; //constraint force mixing for friction constraints - - int m_splitImpulse; - btScalar m_splitImpulsePenetrationThreshold; - btScalar m_splitImpulseTurnErp; - btScalar m_linearSlop; - btScalar m_warmstartingFactor; - btScalar m_articulatedWarmstartingFactor; - int m_solverMode; - int m_restingContactRestitutionThreshold; - int m_minimumSolverBatchSize; - btScalar m_maxGyroscopicForce; - btScalar m_singleAxisRollingFrictionThreshold; - btScalar m_leastSquaresResidualThreshold; - btScalar m_restitutionVelocityThreshold; - bool m_jointFeedbackInWorldSpace; - bool m_jointFeedbackInJointFrame; - int m_reportSolverAnalytics; - int m_numNonContactInnerIterations; -}; - -struct btContactSolverInfo : public btContactSolverInfoData -{ - inline btContactSolverInfo() - { - m_tau = btScalar(0.6); - m_damping = btScalar(1.0); - m_friction = btScalar(0.3); - m_timeStep = btScalar(1.f / 60.f); - m_restitution = btScalar(0.); - m_maxErrorReduction = btScalar(20.); - m_numIterations = 10; - m_erp = btScalar(0.2); - m_erp2 = btScalar(0.2); - m_deformable_erp = btScalar(0.06); - m_deformable_cfm = btScalar(0.01); - m_deformable_maxErrorReduction = btScalar(0.1); - m_globalCfm = btScalar(0.); - m_frictionERP = btScalar(0.2); //positional friction 'anchors' are disabled by default - m_frictionCFM = btScalar(0.); - m_sor = btScalar(1.); - m_splitImpulse = true; - m_splitImpulsePenetrationThreshold = -.04f; - m_splitImpulseTurnErp = 0.1f; - m_linearSlop = btScalar(0.0); - m_warmstartingFactor = btScalar(0.85); - m_articulatedWarmstartingFactor = btScalar(0.85); - //m_solverMode = SOLVER_USE_WARMSTARTING | SOLVER_SIMD | SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION|SOLVER_USE_2_FRICTION_DIRECTIONS|SOLVER_ENABLE_FRICTION_DIRECTION_CACHING;// | SOLVER_RANDMIZE_ORDER; - m_solverMode = SOLVER_USE_WARMSTARTING | SOLVER_SIMD; // | SOLVER_RANDMIZE_ORDER; - m_restingContactRestitutionThreshold = 2; //unused as of 2.81 - m_minimumSolverBatchSize = 128; //try to combine islands until the amount of constraints reaches this limit - m_maxGyroscopicForce = 100.f; ///it is only used for 'explicit' version of gyroscopic force - m_singleAxisRollingFrictionThreshold = 1e30f; ///if the velocity is above this threshold, it will use a single constraint row (axis), otherwise 3 rows. - m_leastSquaresResidualThreshold = 0.f; - m_restitutionVelocityThreshold = 0.2f; //if the relative velocity is below this threshold, there is zero restitution - m_jointFeedbackInWorldSpace = false; - m_jointFeedbackInJointFrame = false; - m_reportSolverAnalytics = 0; - m_numNonContactInnerIterations = 1; // the number of inner iterations for solving motor constraint in a single iteration of the constraint solve - } -}; - -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct btContactSolverInfoDoubleData -{ - double m_tau; - double m_damping; //global non-contact constraint damping, can be locally overridden by constraints during 'getInfo2'. - double m_friction; - double m_timeStep; - double m_restitution; - double m_maxErrorReduction; - double m_sor; - double m_erp; //used as Baumgarte factor - double m_erp2; //used in Split Impulse - double m_globalCfm; //constraint force mixing - double m_splitImpulsePenetrationThreshold; - double m_splitImpulseTurnErp; - double m_linearSlop; - double m_warmstartingFactor; - double m_articulatedWarmstartingFactor; - double m_maxGyroscopicForce; ///it is only used for 'explicit' version of gyroscopic force - double m_singleAxisRollingFrictionThreshold; - - int m_numIterations; - int m_solverMode; - int m_restingContactRestitutionThreshold; - int m_minimumSolverBatchSize; - int m_splitImpulse; - char m_padding[4]; -}; -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct btContactSolverInfoFloatData -{ - float m_tau; - float m_damping; //global non-contact constraint damping, can be locally overridden by constraints during 'getInfo2'. - float m_friction; - float m_timeStep; - - float m_restitution; - float m_maxErrorReduction; - float m_sor; - float m_erp; //used as Baumgarte factor - - float m_erp2; //used in Split Impulse - float m_globalCfm; //constraint force mixing - float m_splitImpulsePenetrationThreshold; - float m_splitImpulseTurnErp; - - float m_linearSlop; - float m_warmstartingFactor; - float m_articulatedWarmstartingFactor; - float m_maxGyroscopicForce; - - float m_singleAxisRollingFrictionThreshold; - int m_numIterations; - int m_solverMode; - int m_restingContactRestitutionThreshold; - - int m_minimumSolverBatchSize; - int m_splitImpulse; - -}; - -#endif //BT_CONTACT_SOLVER_INFO diff --git a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btFixedConstraint.h b/engine/inc/bullet/BulletDynamics/ConstraintSolver/btFixedConstraint.h deleted file mode 100644 index 6d474ea8..00000000 --- a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btFixedConstraint.h +++ /dev/null @@ -1,30 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2013 Erwin Coumans http://bulletphysics.org - -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_FIXED_CONSTRAINT_H -#define BT_FIXED_CONSTRAINT_H - -#include "btGeneric6DofSpring2Constraint.h" - -ATTRIBUTE_ALIGNED16(class) -btFixedConstraint : public btGeneric6DofSpring2Constraint -{ -public: - btFixedConstraint(btRigidBody & rbA, btRigidBody & rbB, const btTransform& frameInA, const btTransform& frameInB); - - virtual ~btFixedConstraint(); -}; - -#endif //BT_FIXED_CONSTRAINT_H diff --git a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btGearConstraint.h b/engine/inc/bullet/BulletDynamics/ConstraintSolver/btGearConstraint.h deleted file mode 100644 index 64b15dfb..00000000 --- a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btGearConstraint.h +++ /dev/null @@ -1,146 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2012 Advanced Micro Devices, Inc. http://bulletphysics.org - -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_GEAR_CONSTRAINT_H -#define BT_GEAR_CONSTRAINT_H - -#include "BulletDynamics/ConstraintSolver/btTypedConstraint.h" - -#ifdef BT_USE_DOUBLE_PRECISION -#define btGearConstraintData btGearConstraintDoubleData -#define btGearConstraintDataName "btGearConstraintDoubleData" -#else -#define btGearConstraintData btGearConstraintFloatData -#define btGearConstraintDataName "btGearConstraintFloatData" -#endif //BT_USE_DOUBLE_PRECISION - -///The btGeatConstraint will couple the angular velocity for two bodies around given local axis and ratio. -///See Bullet/Demos/ConstraintDemo for an example use. -class btGearConstraint : public btTypedConstraint -{ -protected: - btVector3 m_axisInA; - btVector3 m_axisInB; - bool m_useFrameA; - btScalar m_ratio; - -public: - btGearConstraint(btRigidBody& rbA, btRigidBody& rbB, const btVector3& axisInA, const btVector3& axisInB, btScalar ratio = 1.f); - virtual ~btGearConstraint(); - - ///internal method used by the constraint solver, don't use them directly - virtual void getInfo1(btConstraintInfo1* info); - - ///internal method used by the constraint solver, don't use them directly - virtual void getInfo2(btConstraintInfo2* info); - - void setAxisA(btVector3& axisA) - { - m_axisInA = axisA; - } - void setAxisB(btVector3& axisB) - { - m_axisInB = axisB; - } - void setRatio(btScalar ratio) - { - m_ratio = ratio; - } - const btVector3& getAxisA() const - { - return m_axisInA; - } - const btVector3& getAxisB() const - { - return m_axisInB; - } - btScalar getRatio() const - { - return m_ratio; - } - - virtual void setParam(int num, btScalar value, int axis = -1) - { - (void)num; - (void)value; - (void)axis; - btAssert(0); - } - - ///return the local value of parameter - virtual btScalar getParam(int num, int axis = -1) const - { - (void)num; - (void)axis; - btAssert(0); - return 0.f; - } - - virtual int calculateSerializeBufferSize() const; - - ///fills the dataBuffer and returns the struct name (and 0 on failure) - virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const; -}; - -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct btGearConstraintFloatData -{ - btTypedConstraintFloatData m_typeConstraintData; - - btVector3FloatData m_axisInA; - btVector3FloatData m_axisInB; - - float m_ratio; - char m_padding[4]; -}; - -struct btGearConstraintDoubleData -{ - btTypedConstraintDoubleData m_typeConstraintData; - - btVector3DoubleData m_axisInA; - btVector3DoubleData m_axisInB; - - double m_ratio; -}; - -SIMD_FORCE_INLINE int btGearConstraint::calculateSerializeBufferSize() const -{ - return sizeof(btGearConstraintData); -} - -///fills the dataBuffer and returns the struct name (and 0 on failure) -SIMD_FORCE_INLINE const char* btGearConstraint::serialize(void* dataBuffer, btSerializer* serializer) const -{ - btGearConstraintData* gear = (btGearConstraintData*)dataBuffer; - btTypedConstraint::serialize(&gear->m_typeConstraintData, serializer); - - m_axisInA.serialize(gear->m_axisInA); - m_axisInB.serialize(gear->m_axisInB); - - gear->m_ratio = m_ratio; - - // Fill padding with zeros to appease msan. -#ifndef BT_USE_DOUBLE_PRECISION - gear->m_padding[0] = 0; - gear->m_padding[1] = 0; - gear->m_padding[2] = 0; - gear->m_padding[3] = 0; -#endif - - return btGearConstraintDataName; -} - -#endif //BT_GEAR_CONSTRAINT_H diff --git a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h b/engine/inc/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h deleted file mode 100644 index b9e762e1..00000000 --- a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h +++ /dev/null @@ -1,615 +0,0 @@ -/* -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. -*/ - -/// 2009 March: btGeneric6DofConstraint refactored by Roman Ponomarev -/// Added support for generic constraint solver through getInfo1/getInfo2 methods - -/* -2007-09-09 -btGeneric6DofConstraint Refactored by Francisco Le?n -email: projectileman@yahoo.com -http://gimpact.sf.net -*/ - -#ifndef BT_GENERIC_6DOF_CONSTRAINT_H -#define BT_GENERIC_6DOF_CONSTRAINT_H - -#include "LinearMath/btVector3.h" -#include "btJacobianEntry.h" -#include "btTypedConstraint.h" - -class btRigidBody; - -#ifdef BT_USE_DOUBLE_PRECISION -#define btGeneric6DofConstraintData2 btGeneric6DofConstraintDoubleData2 -#define btGeneric6DofConstraintDataName "btGeneric6DofConstraintDoubleData2" -#else -#define btGeneric6DofConstraintData2 btGeneric6DofConstraintData -#define btGeneric6DofConstraintDataName "btGeneric6DofConstraintData" -#endif //BT_USE_DOUBLE_PRECISION - -//! Rotation Limit structure for generic joints -class btRotationalLimitMotor -{ -public: - //! limit_parameters - //!@{ - btScalar m_loLimit; //!< joint limit - btScalar m_hiLimit; //!< joint limit - btScalar m_targetVelocity; //!< target motor velocity - btScalar m_maxMotorForce; //!< max force on motor - btScalar m_maxLimitForce; //!< max force on limit - btScalar m_damping; //!< Damping. - btScalar m_limitSoftness; //! Relaxation factor - btScalar m_normalCFM; //!< Constraint force mixing factor - btScalar m_stopERP; //!< Error tolerance factor when joint is at limit - btScalar m_stopCFM; //!< Constraint force mixing factor when joint is at limit - btScalar m_bounce; //!< restitution factor - bool m_enableMotor; - - //!@} - - //! temp_variables - //!@{ - btScalar m_currentLimitError; //! How much is violated this limit - btScalar m_currentPosition; //! current value of angle - int m_currentLimit; //!< 0=free, 1=at lo limit, 2=at hi limit - btScalar m_accumulatedImpulse; - //!@} - - btRotationalLimitMotor() - { - m_accumulatedImpulse = 0.f; - m_targetVelocity = 0; - m_maxMotorForce = 6.0f; - m_maxLimitForce = 300.0f; - m_loLimit = 1.0f; - m_hiLimit = -1.0f; - m_normalCFM = 0.f; - m_stopERP = 0.2f; - m_stopCFM = 0.f; - m_bounce = 0.0f; - m_damping = 1.0f; - m_limitSoftness = 0.5f; - m_currentLimit = 0; - m_currentLimitError = 0; - m_enableMotor = false; - } - - btRotationalLimitMotor(const btRotationalLimitMotor& limot) - { - m_targetVelocity = limot.m_targetVelocity; - m_maxMotorForce = limot.m_maxMotorForce; - m_limitSoftness = limot.m_limitSoftness; - m_loLimit = limot.m_loLimit; - m_hiLimit = limot.m_hiLimit; - m_normalCFM = limot.m_normalCFM; - m_stopERP = limot.m_stopERP; - m_stopCFM = limot.m_stopCFM; - m_bounce = limot.m_bounce; - m_currentLimit = limot.m_currentLimit; - m_currentLimitError = limot.m_currentLimitError; - m_enableMotor = limot.m_enableMotor; - } - - //! Is limited - bool isLimited() const - { - if (m_loLimit > m_hiLimit) return false; - return true; - } - - //! Need apply correction - bool needApplyTorques() const - { - if (m_currentLimit == 0 && m_enableMotor == false) return false; - return true; - } - - //! calculates error - /*! - calculates m_currentLimit and m_currentLimitError. - */ - int testLimitValue(btScalar test_value); - - //! apply the correction impulses for two bodies - btScalar solveAngularLimits(btScalar timeStep, btVector3& axis, btScalar jacDiagABInv, btRigidBody* body0, btRigidBody* body1); -}; - -class btTranslationalLimitMotor -{ -public: - btVector3 m_lowerLimit; //!< the constraint lower limits - btVector3 m_upperLimit; //!< the constraint upper limits - btVector3 m_accumulatedImpulse; - //! Linear_Limit_parameters - //!@{ - btScalar m_limitSoftness; //!< Softness for linear limit - btScalar m_damping; //!< Damping for linear limit - btScalar m_restitution; //! Bounce parameter for linear limit - btVector3 m_normalCFM; //!< Constraint force mixing factor - btVector3 m_stopERP; //!< Error tolerance factor when joint is at limit - btVector3 m_stopCFM; //!< Constraint force mixing factor when joint is at limit - //!@} - bool m_enableMotor[3]; - btVector3 m_targetVelocity; //!< target motor velocity - btVector3 m_maxMotorForce; //!< max force on motor - btVector3 m_currentLimitError; //! How much is violated this limit - btVector3 m_currentLinearDiff; //! Current relative offset of constraint frames - int m_currentLimit[3]; //!< 0=free, 1=at lower limit, 2=at upper limit - - btTranslationalLimitMotor() - { - m_lowerLimit.setValue(0.f, 0.f, 0.f); - m_upperLimit.setValue(0.f, 0.f, 0.f); - m_accumulatedImpulse.setValue(0.f, 0.f, 0.f); - m_normalCFM.setValue(0.f, 0.f, 0.f); - m_stopERP.setValue(0.2f, 0.2f, 0.2f); - m_stopCFM.setValue(0.f, 0.f, 0.f); - - m_limitSoftness = 0.7f; - m_damping = btScalar(1.0f); - m_restitution = btScalar(0.5f); - for (int i = 0; i < 3; i++) - { - m_enableMotor[i] = false; - m_targetVelocity[i] = btScalar(0.f); - m_maxMotorForce[i] = btScalar(0.f); - } - } - - btTranslationalLimitMotor(const btTranslationalLimitMotor& other) - { - m_lowerLimit = other.m_lowerLimit; - m_upperLimit = other.m_upperLimit; - m_accumulatedImpulse = other.m_accumulatedImpulse; - - m_limitSoftness = other.m_limitSoftness; - m_damping = other.m_damping; - m_restitution = other.m_restitution; - m_normalCFM = other.m_normalCFM; - m_stopERP = other.m_stopERP; - m_stopCFM = other.m_stopCFM; - - for (int i = 0; i < 3; i++) - { - m_enableMotor[i] = other.m_enableMotor[i]; - m_targetVelocity[i] = other.m_targetVelocity[i]; - m_maxMotorForce[i] = other.m_maxMotorForce[i]; - } - } - - //! Test limit - /*! - - free means upper < lower, - - locked means upper == lower - - limited means upper > lower - - limitIndex: first 3 are linear, next 3 are angular - */ - inline bool isLimited(int limitIndex) const - { - return (m_upperLimit[limitIndex] >= m_lowerLimit[limitIndex]); - } - inline bool needApplyForce(int limitIndex) const - { - if (m_currentLimit[limitIndex] == 0 && m_enableMotor[limitIndex] == false) return false; - return true; - } - int testLimitValue(int limitIndex, btScalar test_value); - - btScalar solveLinearAxis( - btScalar timeStep, - btScalar jacDiagABInv, - btRigidBody& body1, const btVector3& pointInA, - btRigidBody& body2, const btVector3& pointInB, - int limit_index, - const btVector3& axis_normal_on_a, - const btVector3& anchorPos); -}; - -enum bt6DofFlags -{ - BT_6DOF_FLAGS_CFM_NORM = 1, - BT_6DOF_FLAGS_CFM_STOP = 2, - BT_6DOF_FLAGS_ERP_STOP = 4 -}; -#define BT_6DOF_FLAGS_AXIS_SHIFT 3 // bits per axis - -/// btGeneric6DofConstraint between two rigidbodies each with a pivotpoint that descibes the axis location in local space -/*! -btGeneric6DofConstraint can leave any of the 6 degree of freedom 'free' or 'locked'. -currently this limit supports rotational motors
    -
      -
    • For Linear limits, use btGeneric6DofConstraint.setLinearUpperLimit, btGeneric6DofConstraint.setLinearLowerLimit. You can set the parameters with the btTranslationalLimitMotor structure accsesible through the btGeneric6DofConstraint.getTranslationalLimitMotor method. -At this moment translational motors are not supported. May be in the future.
    • - -
    • For Angular limits, use the btRotationalLimitMotor structure for configuring the limit. -This is accessible through btGeneric6DofConstraint.getLimitMotor method, -This brings support for limit parameters and motors.
    • - -
    • Angulars limits have these possible ranges: - - - - - - - - - - - - - - - - - - -
      AXISMIN ANGLEMAX ANGLE
      X-PIPI
      Y-PI/2PI/2
      Z-PIPI
      -
    • -
    - -*/ -ATTRIBUTE_ALIGNED16(class) -btGeneric6DofConstraint : public btTypedConstraint -{ -protected: - //! relative_frames - //!@{ - btTransform m_frameInA; //!< the constraint space w.r.t body A - btTransform m_frameInB; //!< the constraint space w.r.t body B - //!@} - - //! Jacobians - //!@{ - btJacobianEntry m_jacLinear[3]; //!< 3 orthogonal linear constraints - btJacobianEntry m_jacAng[3]; //!< 3 orthogonal angular constraints - //!@} - - //! Linear_Limit_parameters - //!@{ - btTranslationalLimitMotor m_linearLimits; - //!@} - - //! hinge_parameters - //!@{ - btRotationalLimitMotor m_angularLimits[3]; - //!@} - -protected: - //! temporal variables - //!@{ - btScalar m_timeStep; - btTransform m_calculatedTransformA; - btTransform m_calculatedTransformB; - btVector3 m_calculatedAxisAngleDiff; - btVector3 m_calculatedAxis[3]; - btVector3 m_calculatedLinearDiff; - btScalar m_factA; - btScalar m_factB; - bool m_hasStaticBody; - - btVector3 m_AnchorPos; // point betwen pivots of bodies A and B to solve linear axes - - bool m_useLinearReferenceFrameA; - bool m_useOffsetForConstraintFrame; - - int m_flags; - - //!@} - - btGeneric6DofConstraint& operator=(btGeneric6DofConstraint& other) - { - btAssert(0); - (void)other; - return *this; - } - - int setAngularLimits(btConstraintInfo2 * info, int row_offset, const btTransform& transA, const btTransform& transB, const btVector3& linVelA, const btVector3& linVelB, const btVector3& angVelA, const btVector3& angVelB); - - int setLinearLimits(btConstraintInfo2 * info, int row, const btTransform& transA, const btTransform& transB, const btVector3& linVelA, const btVector3& linVelB, const btVector3& angVelA, const btVector3& angVelB); - - void buildLinearJacobian( - btJacobianEntry & jacLinear, const btVector3& normalWorld, - const btVector3& pivotAInW, const btVector3& pivotBInW); - - void buildAngularJacobian(btJacobianEntry & jacAngular, const btVector3& jointAxisW); - - // tests linear limits - void calculateLinearInfo(); - - //! calcs the euler angles between the two bodies. - void calculateAngleInfo(); - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - ///for backwards compatibility during the transition to 'getInfo/getInfo2' - bool m_useSolveConstraintObsolete; - - btGeneric6DofConstraint(btRigidBody & rbA, btRigidBody & rbB, const btTransform& frameInA, const btTransform& frameInB, bool useLinearReferenceFrameA); - btGeneric6DofConstraint(btRigidBody & rbB, const btTransform& frameInB, bool useLinearReferenceFrameB); - - //! Calcs global transform of the offsets - /*! - Calcs the global transform for the joint offset for body A an B, and also calcs the agle differences between the bodies. - \sa btGeneric6DofConstraint.getCalculatedTransformA , btGeneric6DofConstraint.getCalculatedTransformB, btGeneric6DofConstraint.calculateAngleInfo - */ - void calculateTransforms(const btTransform& transA, const btTransform& transB); - - void calculateTransforms(); - - //! Gets the global transform of the offset for body A - /*! - \sa btGeneric6DofConstraint.getFrameOffsetA, btGeneric6DofConstraint.getFrameOffsetB, btGeneric6DofConstraint.calculateAngleInfo. - */ - const btTransform& getCalculatedTransformA() const - { - return m_calculatedTransformA; - } - - //! Gets the global transform of the offset for body B - /*! - \sa btGeneric6DofConstraint.getFrameOffsetA, btGeneric6DofConstraint.getFrameOffsetB, btGeneric6DofConstraint.calculateAngleInfo. - */ - const btTransform& getCalculatedTransformB() const - { - return m_calculatedTransformB; - } - - const btTransform& getFrameOffsetA() const - { - return m_frameInA; - } - - const btTransform& getFrameOffsetB() const - { - return m_frameInB; - } - - btTransform& getFrameOffsetA() - { - return m_frameInA; - } - - btTransform& getFrameOffsetB() - { - return m_frameInB; - } - - //! performs Jacobian calculation, and also calculates angle differences and axis - virtual void buildJacobian(); - - virtual void getInfo1(btConstraintInfo1 * info); - - void getInfo1NonVirtual(btConstraintInfo1 * info); - - virtual void getInfo2(btConstraintInfo2 * info); - - void getInfo2NonVirtual(btConstraintInfo2 * info, const btTransform& transA, const btTransform& transB, const btVector3& linVelA, const btVector3& linVelB, const btVector3& angVelA, const btVector3& angVelB); - - void updateRHS(btScalar timeStep); - - //! Get the rotation axis in global coordinates - /*! - \pre btGeneric6DofConstraint.buildJacobian must be called previously. - */ - btVector3 getAxis(int axis_index) const; - - //! Get the relative Euler angle - /*! - \pre btGeneric6DofConstraint::calculateTransforms() must be called previously. - */ - btScalar getAngle(int axis_index) const; - - //! Get the relative position of the constraint pivot - /*! - \pre btGeneric6DofConstraint::calculateTransforms() must be called previously. - */ - btScalar getRelativePivotPosition(int axis_index) const; - - void setFrames(const btTransform& frameA, const btTransform& frameB); - - //! Test angular limit. - /*! - Calculates angular correction and returns true if limit needs to be corrected. - \pre btGeneric6DofConstraint::calculateTransforms() must be called previously. - */ - bool testAngularLimitMotor(int axis_index); - - void setLinearLowerLimit(const btVector3& linearLower) - { - m_linearLimits.m_lowerLimit = linearLower; - } - - void getLinearLowerLimit(btVector3 & linearLower) const - { - linearLower = m_linearLimits.m_lowerLimit; - } - - void setLinearUpperLimit(const btVector3& linearUpper) - { - m_linearLimits.m_upperLimit = linearUpper; - } - - void getLinearUpperLimit(btVector3 & linearUpper) const - { - linearUpper = m_linearLimits.m_upperLimit; - } - - void setAngularLowerLimit(const btVector3& angularLower) - { - for (int i = 0; i < 3; i++) - m_angularLimits[i].m_loLimit = btNormalizeAngle(angularLower[i]); - } - - void getAngularLowerLimit(btVector3 & angularLower) const - { - for (int i = 0; i < 3; i++) - angularLower[i] = m_angularLimits[i].m_loLimit; - } - - void setAngularUpperLimit(const btVector3& angularUpper) - { - for (int i = 0; i < 3; i++) - m_angularLimits[i].m_hiLimit = btNormalizeAngle(angularUpper[i]); - } - - void getAngularUpperLimit(btVector3 & angularUpper) const - { - for (int i = 0; i < 3; i++) - angularUpper[i] = m_angularLimits[i].m_hiLimit; - } - - //! Retrieves the angular limit informacion - btRotationalLimitMotor* getRotationalLimitMotor(int index) - { - return &m_angularLimits[index]; - } - - //! Retrieves the limit informacion - btTranslationalLimitMotor* getTranslationalLimitMotor() - { - return &m_linearLimits; - } - - //first 3 are linear, next 3 are angular - void setLimit(int axis, btScalar lo, btScalar hi) - { - if (axis < 3) - { - m_linearLimits.m_lowerLimit[axis] = lo; - m_linearLimits.m_upperLimit[axis] = hi; - } - else - { - lo = btNormalizeAngle(lo); - hi = btNormalizeAngle(hi); - m_angularLimits[axis - 3].m_loLimit = lo; - m_angularLimits[axis - 3].m_hiLimit = hi; - } - } - - //! Test limit - /*! - - free means upper < lower, - - locked means upper == lower - - limited means upper > lower - - limitIndex: first 3 are linear, next 3 are angular - */ - bool isLimited(int limitIndex) const - { - if (limitIndex < 3) - { - return m_linearLimits.isLimited(limitIndex); - } - return m_angularLimits[limitIndex - 3].isLimited(); - } - - virtual void calcAnchorPos(void); // overridable - - int get_limit_motor_info2(btRotationalLimitMotor * limot, - const btTransform& transA, const btTransform& transB, const btVector3& linVelA, const btVector3& linVelB, const btVector3& angVelA, const btVector3& angVelB, - btConstraintInfo2* info, int row, btVector3& ax1, int rotational, int rotAllowed = false); - - // access for UseFrameOffset - bool getUseFrameOffset() const { return m_useOffsetForConstraintFrame; } - void setUseFrameOffset(bool frameOffsetOnOff) { m_useOffsetForConstraintFrame = frameOffsetOnOff; } - - bool getUseLinearReferenceFrameA() const { return m_useLinearReferenceFrameA; } - void setUseLinearReferenceFrameA(bool linearReferenceFrameA) { m_useLinearReferenceFrameA = linearReferenceFrameA; } - - ///override the default global value of a parameter (such as ERP or CFM), optionally provide the axis (0..5). - ///If no axis is provided, it uses the default axis for this constraint. - virtual void setParam(int num, btScalar value, int axis = -1); - ///return the local value of parameter - virtual btScalar getParam(int num, int axis = -1) const; - - void setAxis(const btVector3& axis1, const btVector3& axis2); - - virtual int getFlags() const - { - return m_flags; - } - - virtual int calculateSerializeBufferSize() const; - - ///fills the dataBuffer and returns the struct name (and 0 on failure) - virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const; -}; - -struct btGeneric6DofConstraintData -{ - btTypedConstraintData m_typeConstraintData; - btTransformFloatData m_rbAFrame; // constraint axii. Assumes z is hinge axis. - btTransformFloatData m_rbBFrame; - - btVector3FloatData m_linearUpperLimit; - btVector3FloatData m_linearLowerLimit; - - btVector3FloatData m_angularUpperLimit; - btVector3FloatData m_angularLowerLimit; - - int m_useLinearReferenceFrameA; - int m_useOffsetForConstraintFrame; -}; - -struct btGeneric6DofConstraintDoubleData2 -{ - btTypedConstraintDoubleData m_typeConstraintData; - btTransformDoubleData m_rbAFrame; // constraint axii. Assumes z is hinge axis. - btTransformDoubleData m_rbBFrame; - - btVector3DoubleData m_linearUpperLimit; - btVector3DoubleData m_linearLowerLimit; - - btVector3DoubleData m_angularUpperLimit; - btVector3DoubleData m_angularLowerLimit; - - int m_useLinearReferenceFrameA; - int m_useOffsetForConstraintFrame; -}; - -SIMD_FORCE_INLINE int btGeneric6DofConstraint::calculateSerializeBufferSize() const -{ - return sizeof(btGeneric6DofConstraintData2); -} - -///fills the dataBuffer and returns the struct name (and 0 on failure) -SIMD_FORCE_INLINE const char* btGeneric6DofConstraint::serialize(void* dataBuffer, btSerializer* serializer) const -{ - btGeneric6DofConstraintData2* dof = (btGeneric6DofConstraintData2*)dataBuffer; - btTypedConstraint::serialize(&dof->m_typeConstraintData, serializer); - - m_frameInA.serialize(dof->m_rbAFrame); - m_frameInB.serialize(dof->m_rbBFrame); - - int i; - for (i = 0; i < 3; i++) - { - dof->m_angularLowerLimit.m_floats[i] = m_angularLimits[i].m_loLimit; - dof->m_angularUpperLimit.m_floats[i] = m_angularLimits[i].m_hiLimit; - dof->m_linearLowerLimit.m_floats[i] = m_linearLimits.m_lowerLimit[i]; - dof->m_linearUpperLimit.m_floats[i] = m_linearLimits.m_upperLimit[i]; - } - - dof->m_useLinearReferenceFrameA = m_useLinearReferenceFrameA ? 1 : 0; - dof->m_useOffsetForConstraintFrame = m_useOffsetForConstraintFrame ? 1 : 0; - - return btGeneric6DofConstraintDataName; -} - -#endif //BT_GENERIC_6DOF_CONSTRAINT_H diff --git a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofSpring2Constraint.h b/engine/inc/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofSpring2Constraint.h deleted file mode 100644 index c86dc373..00000000 --- a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofSpring2Constraint.h +++ /dev/null @@ -1,667 +0,0 @@ -/* -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. -*/ - -/* -2014 May: btGeneric6DofSpring2Constraint is created from the original (2.82.2712) btGeneric6DofConstraint by Gabor Puhr and Tamas Umenhoffer -Pros: -- Much more accurate and stable in a lot of situation. (Especially when a sleeping chain of RBs connected with 6dof2 is pulled) -- Stable and accurate spring with minimal energy loss that works with all of the solvers. (latter is not true for the original 6dof spring) -- Servo motor functionality -- Much more accurate bouncing. 0 really means zero bouncing (not true for the original 6odf) and there is only a minimal energy loss when the value is 1 (because of the solvers' precision) -- Rotation order for the Euler system can be set. (One axis' freedom is still limited to pi/2) - -Cons: -- It is slower than the original 6dof. There is no exact ratio, but half speed is a good estimation. -- At bouncing the correct velocity is calculated, but not the correct position. (it is because of the solver can correct position or velocity, but not both.) -*/ - -/// 2009 March: btGeneric6DofConstraint refactored by Roman Ponomarev -/// Added support for generic constraint solver through getInfo1/getInfo2 methods - -/* -2007-09-09 -btGeneric6DofConstraint Refactored by Francisco Le?n -email: projectileman@yahoo.com -http://gimpact.sf.net -*/ - -#ifndef BT_GENERIC_6DOF_CONSTRAINT2_H -#define BT_GENERIC_6DOF_CONSTRAINT2_H - -#include "LinearMath/btVector3.h" -#include "btJacobianEntry.h" -#include "btTypedConstraint.h" - -class btRigidBody; - -#ifdef BT_USE_DOUBLE_PRECISION -#define btGeneric6DofSpring2ConstraintData2 btGeneric6DofSpring2ConstraintDoubleData2 -#define btGeneric6DofSpring2ConstraintDataName "btGeneric6DofSpring2ConstraintDoubleData2" -#else -#define btGeneric6DofSpring2ConstraintData2 btGeneric6DofSpring2ConstraintData -#define btGeneric6DofSpring2ConstraintDataName "btGeneric6DofSpring2ConstraintData" -#endif //BT_USE_DOUBLE_PRECISION - -enum RotateOrder -{ - RO_XYZ = 0, - RO_XZY, - RO_YXZ, - RO_YZX, - RO_ZXY, - RO_ZYX -}; - -class btRotationalLimitMotor2 -{ -public: - // upper < lower means free - // upper == lower means locked - // upper > lower means limited - btScalar m_loLimit; - btScalar m_hiLimit; - btScalar m_bounce; - btScalar m_stopERP; - btScalar m_stopCFM; - btScalar m_motorERP; - btScalar m_motorCFM; - bool m_enableMotor; - btScalar m_targetVelocity; - btScalar m_maxMotorForce; - bool m_servoMotor; - btScalar m_servoTarget; - bool m_enableSpring; - btScalar m_springStiffness; - bool m_springStiffnessLimited; - btScalar m_springDamping; - bool m_springDampingLimited; - btScalar m_equilibriumPoint; - - btScalar m_currentLimitError; - btScalar m_currentLimitErrorHi; - btScalar m_currentPosition; - int m_currentLimit; - - btRotationalLimitMotor2() - { - m_loLimit = 1.0f; - m_hiLimit = -1.0f; - m_bounce = 0.0f; - m_stopERP = 0.2f; - m_stopCFM = 0.f; - m_motorERP = 0.9f; - m_motorCFM = 0.f; - m_enableMotor = false; - m_targetVelocity = 0; - m_maxMotorForce = 6.0f; - m_servoMotor = false; - m_servoTarget = 0; - m_enableSpring = false; - m_springStiffness = 0; - m_springStiffnessLimited = false; - m_springDamping = 0; - m_springDampingLimited = false; - m_equilibriumPoint = 0; - - m_currentLimitError = 0; - m_currentLimitErrorHi = 0; - m_currentPosition = 0; - m_currentLimit = 0; - } - - btRotationalLimitMotor2(const btRotationalLimitMotor2& limot) - { - m_loLimit = limot.m_loLimit; - m_hiLimit = limot.m_hiLimit; - m_bounce = limot.m_bounce; - m_stopERP = limot.m_stopERP; - m_stopCFM = limot.m_stopCFM; - m_motorERP = limot.m_motorERP; - m_motorCFM = limot.m_motorCFM; - m_enableMotor = limot.m_enableMotor; - m_targetVelocity = limot.m_targetVelocity; - m_maxMotorForce = limot.m_maxMotorForce; - m_servoMotor = limot.m_servoMotor; - m_servoTarget = limot.m_servoTarget; - m_enableSpring = limot.m_enableSpring; - m_springStiffness = limot.m_springStiffness; - m_springStiffnessLimited = limot.m_springStiffnessLimited; - m_springDamping = limot.m_springDamping; - m_springDampingLimited = limot.m_springDampingLimited; - m_equilibriumPoint = limot.m_equilibriumPoint; - - m_currentLimitError = limot.m_currentLimitError; - m_currentLimitErrorHi = limot.m_currentLimitErrorHi; - m_currentPosition = limot.m_currentPosition; - m_currentLimit = limot.m_currentLimit; - } - - bool isLimited() - { - if (m_loLimit > m_hiLimit) return false; - return true; - } - - void testLimitValue(btScalar test_value); -}; - -class btTranslationalLimitMotor2 -{ -public: - // upper < lower means free - // upper == lower means locked - // upper > lower means limited - btVector3 m_lowerLimit; - btVector3 m_upperLimit; - btVector3 m_bounce; - btVector3 m_stopERP; - btVector3 m_stopCFM; - btVector3 m_motorERP; - btVector3 m_motorCFM; - bool m_enableMotor[3]; - bool m_servoMotor[3]; - bool m_enableSpring[3]; - btVector3 m_servoTarget; - btVector3 m_springStiffness; - bool m_springStiffnessLimited[3]; - btVector3 m_springDamping; - bool m_springDampingLimited[3]; - btVector3 m_equilibriumPoint; - btVector3 m_targetVelocity; - btVector3 m_maxMotorForce; - - btVector3 m_currentLimitError; - btVector3 m_currentLimitErrorHi; - btVector3 m_currentLinearDiff; - int m_currentLimit[3]; - - btTranslationalLimitMotor2() - { - m_lowerLimit.setValue(0.f, 0.f, 0.f); - m_upperLimit.setValue(0.f, 0.f, 0.f); - m_bounce.setValue(0.f, 0.f, 0.f); - m_stopERP.setValue(0.2f, 0.2f, 0.2f); - m_stopCFM.setValue(0.f, 0.f, 0.f); - m_motorERP.setValue(0.9f, 0.9f, 0.9f); - m_motorCFM.setValue(0.f, 0.f, 0.f); - - m_currentLimitError.setValue(0.f, 0.f, 0.f); - m_currentLimitErrorHi.setValue(0.f, 0.f, 0.f); - m_currentLinearDiff.setValue(0.f, 0.f, 0.f); - - for (int i = 0; i < 3; i++) - { - m_enableMotor[i] = false; - m_servoMotor[i] = false; - m_enableSpring[i] = false; - m_servoTarget[i] = btScalar(0.f); - m_springStiffness[i] = btScalar(0.f); - m_springStiffnessLimited[i] = false; - m_springDamping[i] = btScalar(0.f); - m_springDampingLimited[i] = false; - m_equilibriumPoint[i] = btScalar(0.f); - m_targetVelocity[i] = btScalar(0.f); - m_maxMotorForce[i] = btScalar(0.f); - - m_currentLimit[i] = 0; - } - } - - btTranslationalLimitMotor2(const btTranslationalLimitMotor2& other) - { - m_lowerLimit = other.m_lowerLimit; - m_upperLimit = other.m_upperLimit; - m_bounce = other.m_bounce; - m_stopERP = other.m_stopERP; - m_stopCFM = other.m_stopCFM; - m_motorERP = other.m_motorERP; - m_motorCFM = other.m_motorCFM; - - m_currentLimitError = other.m_currentLimitError; - m_currentLimitErrorHi = other.m_currentLimitErrorHi; - m_currentLinearDiff = other.m_currentLinearDiff; - - for (int i = 0; i < 3; i++) - { - m_enableMotor[i] = other.m_enableMotor[i]; - m_servoMotor[i] = other.m_servoMotor[i]; - m_enableSpring[i] = other.m_enableSpring[i]; - m_servoTarget[i] = other.m_servoTarget[i]; - m_springStiffness[i] = other.m_springStiffness[i]; - m_springStiffnessLimited[i] = other.m_springStiffnessLimited[i]; - m_springDamping[i] = other.m_springDamping[i]; - m_springDampingLimited[i] = other.m_springDampingLimited[i]; - m_equilibriumPoint[i] = other.m_equilibriumPoint[i]; - m_targetVelocity[i] = other.m_targetVelocity[i]; - m_maxMotorForce[i] = other.m_maxMotorForce[i]; - - m_currentLimit[i] = other.m_currentLimit[i]; - } - } - - inline bool isLimited(int limitIndex) - { - return (m_upperLimit[limitIndex] >= m_lowerLimit[limitIndex]); - } - - void testLimitValue(int limitIndex, btScalar test_value); -}; - -enum bt6DofFlags2 -{ - BT_6DOF_FLAGS_CFM_STOP2 = 1, - BT_6DOF_FLAGS_ERP_STOP2 = 2, - BT_6DOF_FLAGS_CFM_MOTO2 = 4, - BT_6DOF_FLAGS_ERP_MOTO2 = 8, - BT_6DOF_FLAGS_USE_INFINITE_ERROR = (1<<16) -}; -#define BT_6DOF_FLAGS_AXIS_SHIFT2 4 // bits per axis - -ATTRIBUTE_ALIGNED16(class) -btGeneric6DofSpring2Constraint : public btTypedConstraint -{ -protected: - btTransform m_frameInA; - btTransform m_frameInB; - - btJacobianEntry m_jacLinear[3]; - btJacobianEntry m_jacAng[3]; - - btTranslationalLimitMotor2 m_linearLimits; - btRotationalLimitMotor2 m_angularLimits[3]; - - RotateOrder m_rotateOrder; - -protected: - btTransform m_calculatedTransformA; - btTransform m_calculatedTransformB; - btVector3 m_calculatedAxisAngleDiff; - btVector3 m_calculatedAxis[3]; - btVector3 m_calculatedLinearDiff; - btScalar m_factA; - btScalar m_factB; - bool m_hasStaticBody; - int m_flags; - - btGeneric6DofSpring2Constraint& operator=(const btGeneric6DofSpring2Constraint&) - { - btAssert(0); - return *this; - } - - int setAngularLimits(btConstraintInfo2 * info, int row_offset, const btTransform& transA, const btTransform& transB, const btVector3& linVelA, const btVector3& linVelB, const btVector3& angVelA, const btVector3& angVelB); - int setLinearLimits(btConstraintInfo2 * info, int row, const btTransform& transA, const btTransform& transB, const btVector3& linVelA, const btVector3& linVelB, const btVector3& angVelA, const btVector3& angVelB); - - void calculateLinearInfo(); - void calculateAngleInfo(); - void testAngularLimitMotor(int axis_index); - - void calculateJacobi(btRotationalLimitMotor2 * limot, const btTransform& transA, const btTransform& transB, btConstraintInfo2* info, int srow, btVector3& ax1, int rotational, int rotAllowed); - int get_limit_motor_info2(btRotationalLimitMotor2 * limot, - const btTransform& transA, const btTransform& transB, const btVector3& linVelA, const btVector3& linVelB, const btVector3& angVelA, const btVector3& angVelB, - btConstraintInfo2* info, int row, btVector3& ax1, int rotational, int rotAllowed = false); - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btGeneric6DofSpring2Constraint(btRigidBody & rbA, btRigidBody & rbB, const btTransform& frameInA, const btTransform& frameInB, RotateOrder rotOrder = RO_XYZ); - btGeneric6DofSpring2Constraint(btRigidBody & rbB, const btTransform& frameInB, RotateOrder rotOrder = RO_XYZ); - - virtual void buildJacobian() {} - virtual void getInfo1(btConstraintInfo1 * info); - virtual void getInfo2(btConstraintInfo2 * info); - virtual int calculateSerializeBufferSize() const; - virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const; - - btRotationalLimitMotor2* getRotationalLimitMotor(int index) { return &m_angularLimits[index]; } - btTranslationalLimitMotor2* getTranslationalLimitMotor() { return &m_linearLimits; } - - // Calculates the global transform for the joint offset for body A an B, and also calculates the angle differences between the bodies. - void calculateTransforms(const btTransform& transA, const btTransform& transB); - void calculateTransforms(); - - // Gets the global transform of the offset for body A - const btTransform& getCalculatedTransformA() const { return m_calculatedTransformA; } - // Gets the global transform of the offset for body B - const btTransform& getCalculatedTransformB() const { return m_calculatedTransformB; } - - const btTransform& getFrameOffsetA() const { return m_frameInA; } - const btTransform& getFrameOffsetB() const { return m_frameInB; } - - btTransform& getFrameOffsetA() { return m_frameInA; } - btTransform& getFrameOffsetB() { return m_frameInB; } - - // Get the rotation axis in global coordinates ( btGeneric6DofSpring2Constraint::calculateTransforms() must be called previously ) - btVector3 getAxis(int axis_index) const { return m_calculatedAxis[axis_index]; } - - // Get the relative Euler angle ( btGeneric6DofSpring2Constraint::calculateTransforms() must be called previously ) - btScalar getAngle(int axis_index) const { return m_calculatedAxisAngleDiff[axis_index]; } - - // Get the relative position of the constraint pivot ( btGeneric6DofSpring2Constraint::calculateTransforms() must be called previously ) - btScalar getRelativePivotPosition(int axis_index) const { return m_calculatedLinearDiff[axis_index]; } - - void setFrames(const btTransform& frameA, const btTransform& frameB); - - void setLinearLowerLimit(const btVector3& linearLower) { m_linearLimits.m_lowerLimit = linearLower; } - void getLinearLowerLimit(btVector3 & linearLower) { linearLower = m_linearLimits.m_lowerLimit; } - void setLinearUpperLimit(const btVector3& linearUpper) { m_linearLimits.m_upperLimit = linearUpper; } - void getLinearUpperLimit(btVector3 & linearUpper) { linearUpper = m_linearLimits.m_upperLimit; } - - void setAngularLowerLimit(const btVector3& angularLower) - { - for (int i = 0; i < 3; i++) - m_angularLimits[i].m_loLimit = btNormalizeAngle(angularLower[i]); - } - - void setAngularLowerLimitReversed(const btVector3& angularLower) - { - for (int i = 0; i < 3; i++) - m_angularLimits[i].m_hiLimit = btNormalizeAngle(-angularLower[i]); - } - - void getAngularLowerLimit(btVector3 & angularLower) - { - for (int i = 0; i < 3; i++) - angularLower[i] = m_angularLimits[i].m_loLimit; - } - - void getAngularLowerLimitReversed(btVector3 & angularLower) - { - for (int i = 0; i < 3; i++) - angularLower[i] = -m_angularLimits[i].m_hiLimit; - } - - void setAngularUpperLimit(const btVector3& angularUpper) - { - for (int i = 0; i < 3; i++) - m_angularLimits[i].m_hiLimit = btNormalizeAngle(angularUpper[i]); - } - - void setAngularUpperLimitReversed(const btVector3& angularUpper) - { - for (int i = 0; i < 3; i++) - m_angularLimits[i].m_loLimit = btNormalizeAngle(-angularUpper[i]); - } - - void getAngularUpperLimit(btVector3 & angularUpper) - { - for (int i = 0; i < 3; i++) - angularUpper[i] = m_angularLimits[i].m_hiLimit; - } - - void getAngularUpperLimitReversed(btVector3 & angularUpper) - { - for (int i = 0; i < 3; i++) - angularUpper[i] = -m_angularLimits[i].m_loLimit; - } - - //first 3 are linear, next 3 are angular - - void setLimit(int axis, btScalar lo, btScalar hi) - { - if (axis < 3) - { - m_linearLimits.m_lowerLimit[axis] = lo; - m_linearLimits.m_upperLimit[axis] = hi; - } - else - { - lo = btNormalizeAngle(lo); - hi = btNormalizeAngle(hi); - m_angularLimits[axis - 3].m_loLimit = lo; - m_angularLimits[axis - 3].m_hiLimit = hi; - } - } - - void setLimitReversed(int axis, btScalar lo, btScalar hi) - { - if (axis < 3) - { - m_linearLimits.m_lowerLimit[axis] = lo; - m_linearLimits.m_upperLimit[axis] = hi; - } - else - { - lo = btNormalizeAngle(lo); - hi = btNormalizeAngle(hi); - m_angularLimits[axis - 3].m_hiLimit = -lo; - m_angularLimits[axis - 3].m_loLimit = -hi; - } - } - - bool isLimited(int limitIndex) - { - if (limitIndex < 3) - { - return m_linearLimits.isLimited(limitIndex); - } - return m_angularLimits[limitIndex - 3].isLimited(); - } - - void setRotationOrder(RotateOrder order) { m_rotateOrder = order; } - RotateOrder getRotationOrder() { return m_rotateOrder; } - - void setAxis(const btVector3& axis1, const btVector3& axis2); - - void setBounce(int index, btScalar bounce); - - void enableMotor(int index, bool onOff); - void setServo(int index, bool onOff); // set the type of the motor (servo or not) (the motor has to be turned on for servo also) - void setTargetVelocity(int index, btScalar velocity); - void setServoTarget(int index, btScalar target); - void setMaxMotorForce(int index, btScalar force); - - void enableSpring(int index, bool onOff); - void setStiffness(int index, btScalar stiffness, bool limitIfNeeded = true); // if limitIfNeeded is true the system will automatically limit the stiffness in necessary situations where otherwise the spring would move unrealistically too widely - void setDamping(int index, btScalar damping, bool limitIfNeeded = true); // if limitIfNeeded is true the system will automatically limit the damping in necessary situations where otherwise the spring would blow up - void setEquilibriumPoint(); // set the current constraint position/orientation as an equilibrium point for all DOF - void setEquilibriumPoint(int index); // set the current constraint position/orientation as an equilibrium point for given DOF - void setEquilibriumPoint(int index, btScalar val); - - //override the default global value of a parameter (such as ERP or CFM), optionally provide the axis (0..5). - //If no axis is provided, it uses the default axis for this constraint. - virtual void setParam(int num, btScalar value, int axis = -1); - virtual btScalar getParam(int num, int axis = -1) const; - - static btScalar btGetMatrixElem(const btMatrix3x3& mat, int index); - static bool matrixToEulerXYZ(const btMatrix3x3& mat, btVector3& xyz); - static bool matrixToEulerXZY(const btMatrix3x3& mat, btVector3& xyz); - static bool matrixToEulerYXZ(const btMatrix3x3& mat, btVector3& xyz); - static bool matrixToEulerYZX(const btMatrix3x3& mat, btVector3& xyz); - static bool matrixToEulerZXY(const btMatrix3x3& mat, btVector3& xyz); - static bool matrixToEulerZYX(const btMatrix3x3& mat, btVector3& xyz); -}; - -struct btGeneric6DofSpring2ConstraintData -{ - btTypedConstraintData m_typeConstraintData; - btTransformFloatData m_rbAFrame; - btTransformFloatData m_rbBFrame; - - btVector3FloatData m_linearUpperLimit; - btVector3FloatData m_linearLowerLimit; - btVector3FloatData m_linearBounce; - btVector3FloatData m_linearStopERP; - btVector3FloatData m_linearStopCFM; - btVector3FloatData m_linearMotorERP; - btVector3FloatData m_linearMotorCFM; - btVector3FloatData m_linearTargetVelocity; - btVector3FloatData m_linearMaxMotorForce; - btVector3FloatData m_linearServoTarget; - btVector3FloatData m_linearSpringStiffness; - btVector3FloatData m_linearSpringDamping; - btVector3FloatData m_linearEquilibriumPoint; - char m_linearEnableMotor[4]; - char m_linearServoMotor[4]; - char m_linearEnableSpring[4]; - char m_linearSpringStiffnessLimited[4]; - char m_linearSpringDampingLimited[4]; - char m_padding1[4]; - - btVector3FloatData m_angularUpperLimit; - btVector3FloatData m_angularLowerLimit; - btVector3FloatData m_angularBounce; - btVector3FloatData m_angularStopERP; - btVector3FloatData m_angularStopCFM; - btVector3FloatData m_angularMotorERP; - btVector3FloatData m_angularMotorCFM; - btVector3FloatData m_angularTargetVelocity; - btVector3FloatData m_angularMaxMotorForce; - btVector3FloatData m_angularServoTarget; - btVector3FloatData m_angularSpringStiffness; - btVector3FloatData m_angularSpringDamping; - btVector3FloatData m_angularEquilibriumPoint; - char m_angularEnableMotor[4]; - char m_angularServoMotor[4]; - char m_angularEnableSpring[4]; - char m_angularSpringStiffnessLimited[4]; - char m_angularSpringDampingLimited[4]; - - int m_rotateOrder; -}; - -struct btGeneric6DofSpring2ConstraintDoubleData2 -{ - btTypedConstraintDoubleData m_typeConstraintData; - btTransformDoubleData m_rbAFrame; - btTransformDoubleData m_rbBFrame; - - btVector3DoubleData m_linearUpperLimit; - btVector3DoubleData m_linearLowerLimit; - btVector3DoubleData m_linearBounce; - btVector3DoubleData m_linearStopERP; - btVector3DoubleData m_linearStopCFM; - btVector3DoubleData m_linearMotorERP; - btVector3DoubleData m_linearMotorCFM; - btVector3DoubleData m_linearTargetVelocity; - btVector3DoubleData m_linearMaxMotorForce; - btVector3DoubleData m_linearServoTarget; - btVector3DoubleData m_linearSpringStiffness; - btVector3DoubleData m_linearSpringDamping; - btVector3DoubleData m_linearEquilibriumPoint; - char m_linearEnableMotor[4]; - char m_linearServoMotor[4]; - char m_linearEnableSpring[4]; - char m_linearSpringStiffnessLimited[4]; - char m_linearSpringDampingLimited[4]; - char m_padding1[4]; - - btVector3DoubleData m_angularUpperLimit; - btVector3DoubleData m_angularLowerLimit; - btVector3DoubleData m_angularBounce; - btVector3DoubleData m_angularStopERP; - btVector3DoubleData m_angularStopCFM; - btVector3DoubleData m_angularMotorERP; - btVector3DoubleData m_angularMotorCFM; - btVector3DoubleData m_angularTargetVelocity; - btVector3DoubleData m_angularMaxMotorForce; - btVector3DoubleData m_angularServoTarget; - btVector3DoubleData m_angularSpringStiffness; - btVector3DoubleData m_angularSpringDamping; - btVector3DoubleData m_angularEquilibriumPoint; - char m_angularEnableMotor[4]; - char m_angularServoMotor[4]; - char m_angularEnableSpring[4]; - char m_angularSpringStiffnessLimited[4]; - char m_angularSpringDampingLimited[4]; - - int m_rotateOrder; -}; - -SIMD_FORCE_INLINE int btGeneric6DofSpring2Constraint::calculateSerializeBufferSize() const -{ - return sizeof(btGeneric6DofSpring2ConstraintData2); -} - -SIMD_FORCE_INLINE const char* btGeneric6DofSpring2Constraint::serialize(void* dataBuffer, btSerializer* serializer) const -{ - btGeneric6DofSpring2ConstraintData2* dof = (btGeneric6DofSpring2ConstraintData2*)dataBuffer; - btTypedConstraint::serialize(&dof->m_typeConstraintData, serializer); - - m_frameInA.serialize(dof->m_rbAFrame); - m_frameInB.serialize(dof->m_rbBFrame); - - int i; - for (i = 0; i < 3; i++) - { - dof->m_angularLowerLimit.m_floats[i] = m_angularLimits[i].m_loLimit; - dof->m_angularUpperLimit.m_floats[i] = m_angularLimits[i].m_hiLimit; - dof->m_angularBounce.m_floats[i] = m_angularLimits[i].m_bounce; - dof->m_angularStopERP.m_floats[i] = m_angularLimits[i].m_stopERP; - dof->m_angularStopCFM.m_floats[i] = m_angularLimits[i].m_stopCFM; - dof->m_angularMotorERP.m_floats[i] = m_angularLimits[i].m_motorERP; - dof->m_angularMotorCFM.m_floats[i] = m_angularLimits[i].m_motorCFM; - dof->m_angularTargetVelocity.m_floats[i] = m_angularLimits[i].m_targetVelocity; - dof->m_angularMaxMotorForce.m_floats[i] = m_angularLimits[i].m_maxMotorForce; - dof->m_angularServoTarget.m_floats[i] = m_angularLimits[i].m_servoTarget; - dof->m_angularSpringStiffness.m_floats[i] = m_angularLimits[i].m_springStiffness; - dof->m_angularSpringDamping.m_floats[i] = m_angularLimits[i].m_springDamping; - dof->m_angularEquilibriumPoint.m_floats[i] = m_angularLimits[i].m_equilibriumPoint; - } - dof->m_angularLowerLimit.m_floats[3] = 0; - dof->m_angularUpperLimit.m_floats[3] = 0; - dof->m_angularBounce.m_floats[3] = 0; - dof->m_angularStopERP.m_floats[3] = 0; - dof->m_angularStopCFM.m_floats[3] = 0; - dof->m_angularMotorERP.m_floats[3] = 0; - dof->m_angularMotorCFM.m_floats[3] = 0; - dof->m_angularTargetVelocity.m_floats[3] = 0; - dof->m_angularMaxMotorForce.m_floats[3] = 0; - dof->m_angularServoTarget.m_floats[3] = 0; - dof->m_angularSpringStiffness.m_floats[3] = 0; - dof->m_angularSpringDamping.m_floats[3] = 0; - dof->m_angularEquilibriumPoint.m_floats[3] = 0; - for (i = 0; i < 4; i++) - { - dof->m_angularEnableMotor[i] = i < 3 ? (m_angularLimits[i].m_enableMotor ? 1 : 0) : 0; - dof->m_angularServoMotor[i] = i < 3 ? (m_angularLimits[i].m_servoMotor ? 1 : 0) : 0; - dof->m_angularEnableSpring[i] = i < 3 ? (m_angularLimits[i].m_enableSpring ? 1 : 0) : 0; - dof->m_angularSpringStiffnessLimited[i] = i < 3 ? (m_angularLimits[i].m_springStiffnessLimited ? 1 : 0) : 0; - dof->m_angularSpringDampingLimited[i] = i < 3 ? (m_angularLimits[i].m_springDampingLimited ? 1 : 0) : 0; - } - - m_linearLimits.m_lowerLimit.serialize(dof->m_linearLowerLimit); - m_linearLimits.m_upperLimit.serialize(dof->m_linearUpperLimit); - m_linearLimits.m_bounce.serialize(dof->m_linearBounce); - m_linearLimits.m_stopERP.serialize(dof->m_linearStopERP); - m_linearLimits.m_stopCFM.serialize(dof->m_linearStopCFM); - m_linearLimits.m_motorERP.serialize(dof->m_linearMotorERP); - m_linearLimits.m_motorCFM.serialize(dof->m_linearMotorCFM); - m_linearLimits.m_targetVelocity.serialize(dof->m_linearTargetVelocity); - m_linearLimits.m_maxMotorForce.serialize(dof->m_linearMaxMotorForce); - m_linearLimits.m_servoTarget.serialize(dof->m_linearServoTarget); - m_linearLimits.m_springStiffness.serialize(dof->m_linearSpringStiffness); - m_linearLimits.m_springDamping.serialize(dof->m_linearSpringDamping); - m_linearLimits.m_equilibriumPoint.serialize(dof->m_linearEquilibriumPoint); - for (i = 0; i < 4; i++) - { - dof->m_linearEnableMotor[i] = i < 3 ? (m_linearLimits.m_enableMotor[i] ? 1 : 0) : 0; - dof->m_linearServoMotor[i] = i < 3 ? (m_linearLimits.m_servoMotor[i] ? 1 : 0) : 0; - dof->m_linearEnableSpring[i] = i < 3 ? (m_linearLimits.m_enableSpring[i] ? 1 : 0) : 0; - dof->m_linearSpringStiffnessLimited[i] = i < 3 ? (m_linearLimits.m_springStiffnessLimited[i] ? 1 : 0) : 0; - dof->m_linearSpringDampingLimited[i] = i < 3 ? (m_linearLimits.m_springDampingLimited[i] ? 1 : 0) : 0; - } - - dof->m_rotateOrder = m_rotateOrder; - - dof->m_padding1[0] = 0; - dof->m_padding1[1] = 0; - dof->m_padding1[2] = 0; - dof->m_padding1[3] = 0; - - return btGeneric6DofSpring2ConstraintDataName; -} - -#endif //BT_GENERIC_6DOF_CONSTRAINT_H diff --git a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.h b/engine/inc/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.h deleted file mode 100644 index 02b9d4d0..00000000 --- a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.h +++ /dev/null @@ -1,135 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org -Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. - -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_GENERIC_6DOF_SPRING_CONSTRAINT_H -#define BT_GENERIC_6DOF_SPRING_CONSTRAINT_H - -#include "LinearMath/btVector3.h" -#include "btTypedConstraint.h" -#include "btGeneric6DofConstraint.h" - -#ifdef BT_USE_DOUBLE_PRECISION -#define btGeneric6DofSpringConstraintData2 btGeneric6DofSpringConstraintDoubleData2 -#define btGeneric6DofSpringConstraintDataName "btGeneric6DofSpringConstraintDoubleData2" -#else -#define btGeneric6DofSpringConstraintData2 btGeneric6DofSpringConstraintData -#define btGeneric6DofSpringConstraintDataName "btGeneric6DofSpringConstraintData" -#endif //BT_USE_DOUBLE_PRECISION - -/// Generic 6 DOF constraint that allows to set spring motors to any translational and rotational DOF - -/// DOF index used in enableSpring() and setStiffness() means: -/// 0 : translation X -/// 1 : translation Y -/// 2 : translation Z -/// 3 : rotation X (3rd Euler rotational around new position of X axis, range [-PI+epsilon, PI-epsilon] ) -/// 4 : rotation Y (2nd Euler rotational around new position of Y axis, range [-PI/2+epsilon, PI/2-epsilon] ) -/// 5 : rotation Z (1st Euler rotational around Z axis, range [-PI+epsilon, PI-epsilon] ) - -ATTRIBUTE_ALIGNED16(class) -btGeneric6DofSpringConstraint : public btGeneric6DofConstraint -{ -protected: - bool m_springEnabled[6]; - btScalar m_equilibriumPoint[6]; - btScalar m_springStiffness[6]; - btScalar m_springDamping[6]; // between 0 and 1 (1 == no damping) - void init(); - void internalUpdateSprings(btConstraintInfo2 * info); - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btGeneric6DofSpringConstraint(btRigidBody & rbA, btRigidBody & rbB, const btTransform& frameInA, const btTransform& frameInB, bool useLinearReferenceFrameA); - btGeneric6DofSpringConstraint(btRigidBody & rbB, const btTransform& frameInB, bool useLinearReferenceFrameB); - void enableSpring(int index, bool onOff); - void setStiffness(int index, btScalar stiffness); - void setDamping(int index, btScalar damping); - void setEquilibriumPoint(); // set the current constraint position/orientation as an equilibrium point for all DOF - void setEquilibriumPoint(int index); // set the current constraint position/orientation as an equilibrium point for given DOF - void setEquilibriumPoint(int index, btScalar val); - - bool isSpringEnabled(int index) const - { - return m_springEnabled[index]; - } - - btScalar getStiffness(int index) const - { - return m_springStiffness[index]; - } - - btScalar getDamping(int index) const - { - return m_springDamping[index]; - } - - btScalar getEquilibriumPoint(int index) const - { - return m_equilibriumPoint[index]; - } - - virtual void setAxis(const btVector3& axis1, const btVector3& axis2); - - virtual void getInfo2(btConstraintInfo2 * info); - - virtual int calculateSerializeBufferSize() const; - ///fills the dataBuffer and returns the struct name (and 0 on failure) - virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const; -}; - -struct btGeneric6DofSpringConstraintData -{ - btGeneric6DofConstraintData m_6dofData; - - int m_springEnabled[6]; - float m_equilibriumPoint[6]; - float m_springStiffness[6]; - float m_springDamping[6]; -}; - -struct btGeneric6DofSpringConstraintDoubleData2 -{ - btGeneric6DofConstraintDoubleData2 m_6dofData; - - int m_springEnabled[6]; - double m_equilibriumPoint[6]; - double m_springStiffness[6]; - double m_springDamping[6]; -}; - -SIMD_FORCE_INLINE int btGeneric6DofSpringConstraint::calculateSerializeBufferSize() const -{ - return sizeof(btGeneric6DofSpringConstraintData2); -} - -///fills the dataBuffer and returns the struct name (and 0 on failure) -SIMD_FORCE_INLINE const char* btGeneric6DofSpringConstraint::serialize(void* dataBuffer, btSerializer* serializer) const -{ - btGeneric6DofSpringConstraintData2* dof = (btGeneric6DofSpringConstraintData2*)dataBuffer; - btGeneric6DofConstraint::serialize(&dof->m_6dofData, serializer); - - int i; - for (i = 0; i < 6; i++) - { - dof->m_equilibriumPoint[i] = m_equilibriumPoint[i]; - dof->m_springDamping[i] = m_springDamping[i]; - dof->m_springEnabled[i] = m_springEnabled[i] ? 1 : 0; - dof->m_springStiffness[i] = m_springStiffness[i]; - } - return btGeneric6DofSpringConstraintDataName; -} - -#endif // BT_GENERIC_6DOF_SPRING_CONSTRAINT_H diff --git a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btHinge2Constraint.h b/engine/inc/bullet/BulletDynamics/ConstraintSolver/btHinge2Constraint.h deleted file mode 100644 index 95f604a8..00000000 --- a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btHinge2Constraint.h +++ /dev/null @@ -1,55 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org -Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. - -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_HINGE2_CONSTRAINT_H -#define BT_HINGE2_CONSTRAINT_H - -#include "LinearMath/btVector3.h" -#include "btTypedConstraint.h" -#include "btGeneric6DofSpring2Constraint.h" - -// Constraint similar to ODE Hinge2 Joint -// has 3 degrees of frredom: -// 2 rotational degrees of freedom, similar to Euler rotations around Z (axis 1) and X (axis 2) -// 1 translational (along axis Z) with suspension spring - -ATTRIBUTE_ALIGNED16(class) -btHinge2Constraint : public btGeneric6DofSpring2Constraint -{ -protected: - btVector3 m_anchor; - btVector3 m_axis1; - btVector3 m_axis2; - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - // constructor - // anchor, axis1 and axis2 are in world coordinate system - // axis1 must be orthogonal to axis2 - btHinge2Constraint(btRigidBody & rbA, btRigidBody & rbB, btVector3 & anchor, btVector3 & axis1, btVector3 & axis2); - // access - const btVector3& getAnchor() { return m_calculatedTransformA.getOrigin(); } - const btVector3& getAnchor2() { return m_calculatedTransformB.getOrigin(); } - const btVector3& getAxis1() { return m_axis1; } - const btVector3& getAxis2() { return m_axis2; } - btScalar getAngle1() { return getAngle(2); } - btScalar getAngle2() { return getAngle(0); } - // limits - void setUpperLimit(btScalar ang1max) { setAngularUpperLimit(btVector3(-1.f, 0.f, ang1max)); } - void setLowerLimit(btScalar ang1min) { setAngularLowerLimit(btVector3(1.f, 0.f, ang1min)); } -}; - -#endif // BT_HINGE2_CONSTRAINT_H diff --git a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btHingeConstraint.h b/engine/inc/bullet/BulletDynamics/ConstraintSolver/btHingeConstraint.h deleted file mode 100644 index c7509e30..00000000 --- a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btHingeConstraint.h +++ /dev/null @@ -1,480 +0,0 @@ -/* -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. -*/ - -/* Hinge Constraint by Dirk Gregorius. Limits added by Marcus Hennix at Starbreeze Studios */ - -#ifndef BT_HINGECONSTRAINT_H -#define BT_HINGECONSTRAINT_H - -#define _BT_USE_CENTER_LIMIT_ 1 - -#include "LinearMath/btVector3.h" -#include "btJacobianEntry.h" -#include "btTypedConstraint.h" - -class btRigidBody; - -#ifdef BT_USE_DOUBLE_PRECISION -#define btHingeConstraintData btHingeConstraintDoubleData2 //rename to 2 for backwards compatibility, so we can still load the 'btHingeConstraintDoubleData' version -#define btHingeConstraintDataName "btHingeConstraintDoubleData2" -#else -#define btHingeConstraintData btHingeConstraintFloatData -#define btHingeConstraintDataName "btHingeConstraintFloatData" -#endif //BT_USE_DOUBLE_PRECISION - -enum btHingeFlags -{ - BT_HINGE_FLAGS_CFM_STOP = 1, - BT_HINGE_FLAGS_ERP_STOP = 2, - BT_HINGE_FLAGS_CFM_NORM = 4, - BT_HINGE_FLAGS_ERP_NORM = 8 -}; - -/// hinge constraint between two rigidbodies each with a pivotpoint that descibes the axis location in local space -/// axis defines the orientation of the hinge axis -ATTRIBUTE_ALIGNED16(class) -btHingeConstraint : public btTypedConstraint -{ -#ifdef IN_PARALLELL_SOLVER -public: -#endif - btJacobianEntry m_jac[3]; //3 orthogonal linear constraints - btJacobianEntry m_jacAng[3]; //2 orthogonal angular constraints+ 1 for limit/motor - - btTransform m_rbAFrame; // constraint axii. Assumes z is hinge axis. - btTransform m_rbBFrame; - - btScalar m_motorTargetVelocity; - btScalar m_maxMotorImpulse; - -#ifdef _BT_USE_CENTER_LIMIT_ - btAngularLimit m_limit; -#else - btScalar m_lowerLimit; - btScalar m_upperLimit; - btScalar m_limitSign; - btScalar m_correction; - - btScalar m_limitSoftness; - btScalar m_biasFactor; - btScalar m_relaxationFactor; - - bool m_solveLimit; -#endif - - btScalar m_kHinge; - - btScalar m_accLimitImpulse; - btScalar m_hingeAngle; - btScalar m_referenceSign; - - bool m_angularOnly; - bool m_enableAngularMotor; - bool m_useSolveConstraintObsolete; - bool m_useOffsetForConstraintFrame; - bool m_useReferenceFrameA; - - btScalar m_accMotorImpulse; - - int m_flags; - btScalar m_normalCFM; - btScalar m_normalERP; - btScalar m_stopCFM; - btScalar m_stopERP; - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btHingeConstraint(btRigidBody & rbA, btRigidBody & rbB, const btVector3& pivotInA, const btVector3& pivotInB, const btVector3& axisInA, const btVector3& axisInB, bool useReferenceFrameA = false); - - btHingeConstraint(btRigidBody & rbA, const btVector3& pivotInA, const btVector3& axisInA, bool useReferenceFrameA = false); - - btHingeConstraint(btRigidBody & rbA, btRigidBody & rbB, const btTransform& rbAFrame, const btTransform& rbBFrame, bool useReferenceFrameA = false); - - btHingeConstraint(btRigidBody & rbA, const btTransform& rbAFrame, bool useReferenceFrameA = false); - - virtual void buildJacobian(); - - virtual void getInfo1(btConstraintInfo1 * info); - - void getInfo1NonVirtual(btConstraintInfo1 * info); - - virtual void getInfo2(btConstraintInfo2 * info); - - void getInfo2NonVirtual(btConstraintInfo2 * info, const btTransform& transA, const btTransform& transB, const btVector3& angVelA, const btVector3& angVelB); - - void getInfo2Internal(btConstraintInfo2 * info, const btTransform& transA, const btTransform& transB, const btVector3& angVelA, const btVector3& angVelB); - void getInfo2InternalUsingFrameOffset(btConstraintInfo2 * info, const btTransform& transA, const btTransform& transB, const btVector3& angVelA, const btVector3& angVelB); - - void updateRHS(btScalar timeStep); - - const btRigidBody& getRigidBodyA() const - { - return m_rbA; - } - const btRigidBody& getRigidBodyB() const - { - return m_rbB; - } - - btRigidBody& getRigidBodyA() - { - return m_rbA; - } - - btRigidBody& getRigidBodyB() - { - return m_rbB; - } - - btTransform& getFrameOffsetA() - { - return m_rbAFrame; - } - - btTransform& getFrameOffsetB() - { - return m_rbBFrame; - } - - void setFrames(const btTransform& frameA, const btTransform& frameB); - - void setAngularOnly(bool angularOnly) - { - m_angularOnly = angularOnly; - } - - void enableAngularMotor(bool enableMotor, btScalar targetVelocity, btScalar maxMotorImpulse) - { - m_enableAngularMotor = enableMotor; - m_motorTargetVelocity = targetVelocity; - m_maxMotorImpulse = maxMotorImpulse; - } - - // extra motor API, including ability to set a target rotation (as opposed to angular velocity) - // note: setMotorTarget sets angular velocity under the hood, so you must call it every tick to - // maintain a given angular target. - void enableMotor(bool enableMotor) { m_enableAngularMotor = enableMotor; } - void setMaxMotorImpulse(btScalar maxMotorImpulse) { m_maxMotorImpulse = maxMotorImpulse; } - void setMotorTargetVelocity(btScalar motorTargetVelocity) { m_motorTargetVelocity = motorTargetVelocity; } - void setMotorTarget(const btQuaternion& qAinB, btScalar dt); // qAinB is rotation of body A wrt body B. - void setMotorTarget(btScalar targetAngle, btScalar dt); - - void setLimit(btScalar low, btScalar high, btScalar _softness = 0.9f, btScalar _biasFactor = 0.3f, btScalar _relaxationFactor = 1.0f) - { -#ifdef _BT_USE_CENTER_LIMIT_ - m_limit.set(low, high, _softness, _biasFactor, _relaxationFactor); -#else - m_lowerLimit = btNormalizeAngle(low); - m_upperLimit = btNormalizeAngle(high); - m_limitSoftness = _softness; - m_biasFactor = _biasFactor; - m_relaxationFactor = _relaxationFactor; -#endif - } - - btScalar getLimitSoftness() const - { -#ifdef _BT_USE_CENTER_LIMIT_ - return m_limit.getSoftness(); -#else - return m_limitSoftness; -#endif - } - - btScalar getLimitBiasFactor() const - { -#ifdef _BT_USE_CENTER_LIMIT_ - return m_limit.getBiasFactor(); -#else - return m_biasFactor; -#endif - } - - btScalar getLimitRelaxationFactor() const - { -#ifdef _BT_USE_CENTER_LIMIT_ - return m_limit.getRelaxationFactor(); -#else - return m_relaxationFactor; -#endif - } - - void setAxis(btVector3 & axisInA) - { - btVector3 rbAxisA1, rbAxisA2; - btPlaneSpace1(axisInA, rbAxisA1, rbAxisA2); - btVector3 pivotInA = m_rbAFrame.getOrigin(); - // m_rbAFrame.getOrigin() = pivotInA; - m_rbAFrame.getBasis().setValue(rbAxisA1.getX(), rbAxisA2.getX(), axisInA.getX(), - rbAxisA1.getY(), rbAxisA2.getY(), axisInA.getY(), - rbAxisA1.getZ(), rbAxisA2.getZ(), axisInA.getZ()); - - btVector3 axisInB = m_rbA.getCenterOfMassTransform().getBasis() * axisInA; - - btQuaternion rotationArc = shortestArcQuat(axisInA, axisInB); - btVector3 rbAxisB1 = quatRotate(rotationArc, rbAxisA1); - btVector3 rbAxisB2 = axisInB.cross(rbAxisB1); - - m_rbBFrame.getOrigin() = m_rbB.getCenterOfMassTransform().inverse()(m_rbA.getCenterOfMassTransform()(pivotInA)); - - m_rbBFrame.getBasis().setValue(rbAxisB1.getX(), rbAxisB2.getX(), axisInB.getX(), - rbAxisB1.getY(), rbAxisB2.getY(), axisInB.getY(), - rbAxisB1.getZ(), rbAxisB2.getZ(), axisInB.getZ()); - m_rbBFrame.getBasis() = m_rbB.getCenterOfMassTransform().getBasis().inverse() * m_rbBFrame.getBasis(); - } - - bool hasLimit() const - { -#ifdef _BT_USE_CENTER_LIMIT_ - return m_limit.getHalfRange() > 0; -#else - return m_lowerLimit <= m_upperLimit; -#endif - } - - btScalar getLowerLimit() const - { -#ifdef _BT_USE_CENTER_LIMIT_ - return m_limit.getLow(); -#else - return m_lowerLimit; -#endif - } - - btScalar getUpperLimit() const - { -#ifdef _BT_USE_CENTER_LIMIT_ - return m_limit.getHigh(); -#else - return m_upperLimit; -#endif - } - - ///The getHingeAngle gives the hinge angle in range [-PI,PI] - btScalar getHingeAngle(); - - btScalar getHingeAngle(const btTransform& transA, const btTransform& transB); - - void testLimit(const btTransform& transA, const btTransform& transB); - - const btTransform& getAFrame() const { return m_rbAFrame; }; - const btTransform& getBFrame() const { return m_rbBFrame; }; - - btTransform& getAFrame() { return m_rbAFrame; }; - btTransform& getBFrame() { return m_rbBFrame; }; - - inline int getSolveLimit() - { -#ifdef _BT_USE_CENTER_LIMIT_ - return m_limit.isLimit(); -#else - return m_solveLimit; -#endif - } - - inline btScalar getLimitSign() - { -#ifdef _BT_USE_CENTER_LIMIT_ - return m_limit.getSign(); -#else - return m_limitSign; -#endif - } - - inline bool getAngularOnly() - { - return m_angularOnly; - } - inline bool getEnableAngularMotor() - { - return m_enableAngularMotor; - } - inline btScalar getMotorTargetVelocity() - { - return m_motorTargetVelocity; - } - inline btScalar getMaxMotorImpulse() - { - return m_maxMotorImpulse; - } - // access for UseFrameOffset - bool getUseFrameOffset() { return m_useOffsetForConstraintFrame; } - void setUseFrameOffset(bool frameOffsetOnOff) { m_useOffsetForConstraintFrame = frameOffsetOnOff; } - // access for UseReferenceFrameA - bool getUseReferenceFrameA() const { return m_useReferenceFrameA; } - void setUseReferenceFrameA(bool useReferenceFrameA) { m_useReferenceFrameA = useReferenceFrameA; } - - ///override the default global value of a parameter (such as ERP or CFM), optionally provide the axis (0..5). - ///If no axis is provided, it uses the default axis for this constraint. - virtual void setParam(int num, btScalar value, int axis = -1); - ///return the local value of parameter - virtual btScalar getParam(int num, int axis = -1) const; - - virtual int getFlags() const - { - return m_flags; - } - - virtual int calculateSerializeBufferSize() const; - - ///fills the dataBuffer and returns the struct name (and 0 on failure) - virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const; -}; - -//only for backward compatibility -#ifdef BT_BACKWARDS_COMPATIBLE_SERIALIZATION -///this structure is not used, except for loading pre-2.82 .bullet files -struct btHingeConstraintDoubleData -{ - btTypedConstraintData m_typeConstraintData; - btTransformDoubleData m_rbAFrame; // constraint axii. Assumes z is hinge axis. - btTransformDoubleData m_rbBFrame; - int m_useReferenceFrameA; - int m_angularOnly; - int m_enableAngularMotor; - float m_motorTargetVelocity; - float m_maxMotorImpulse; - - float m_lowerLimit; - float m_upperLimit; - float m_limitSoftness; - float m_biasFactor; - float m_relaxationFactor; -}; -#endif //BT_BACKWARDS_COMPATIBLE_SERIALIZATION - -///The getAccumulatedHingeAngle returns the accumulated hinge angle, taking rotation across the -PI/PI boundary into account -ATTRIBUTE_ALIGNED16(class) -btHingeAccumulatedAngleConstraint : public btHingeConstraint -{ -protected: - btScalar m_accumulatedAngle; - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btHingeAccumulatedAngleConstraint(btRigidBody & rbA, btRigidBody & rbB, const btVector3& pivotInA, const btVector3& pivotInB, const btVector3& axisInA, const btVector3& axisInB, bool useReferenceFrameA = false) - : btHingeConstraint(rbA, rbB, pivotInA, pivotInB, axisInA, axisInB, useReferenceFrameA) - { - m_accumulatedAngle = getHingeAngle(); - } - - btHingeAccumulatedAngleConstraint(btRigidBody & rbA, const btVector3& pivotInA, const btVector3& axisInA, bool useReferenceFrameA = false) - : btHingeConstraint(rbA, pivotInA, axisInA, useReferenceFrameA) - { - m_accumulatedAngle = getHingeAngle(); - } - - btHingeAccumulatedAngleConstraint(btRigidBody & rbA, btRigidBody & rbB, const btTransform& rbAFrame, const btTransform& rbBFrame, bool useReferenceFrameA = false) - : btHingeConstraint(rbA, rbB, rbAFrame, rbBFrame, useReferenceFrameA) - { - m_accumulatedAngle = getHingeAngle(); - } - - btHingeAccumulatedAngleConstraint(btRigidBody & rbA, const btTransform& rbAFrame, bool useReferenceFrameA = false) - : btHingeConstraint(rbA, rbAFrame, useReferenceFrameA) - { - m_accumulatedAngle = getHingeAngle(); - } - btScalar getAccumulatedHingeAngle(); - void setAccumulatedHingeAngle(btScalar accAngle); - virtual void getInfo1(btConstraintInfo1 * info); -}; - -struct btHingeConstraintFloatData -{ - btTypedConstraintData m_typeConstraintData; - btTransformFloatData m_rbAFrame; // constraint axii. Assumes z is hinge axis. - btTransformFloatData m_rbBFrame; - int m_useReferenceFrameA; - int m_angularOnly; - - int m_enableAngularMotor; - float m_motorTargetVelocity; - float m_maxMotorImpulse; - - float m_lowerLimit; - float m_upperLimit; - float m_limitSoftness; - float m_biasFactor; - float m_relaxationFactor; -}; - -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct btHingeConstraintDoubleData2 -{ - btTypedConstraintDoubleData m_typeConstraintData; - btTransformDoubleData m_rbAFrame; // constraint axii. Assumes z is hinge axis. - btTransformDoubleData m_rbBFrame; - int m_useReferenceFrameA; - int m_angularOnly; - int m_enableAngularMotor; - double m_motorTargetVelocity; - double m_maxMotorImpulse; - - double m_lowerLimit; - double m_upperLimit; - double m_limitSoftness; - double m_biasFactor; - double m_relaxationFactor; - char m_padding1[4]; -}; - -SIMD_FORCE_INLINE int btHingeConstraint::calculateSerializeBufferSize() const -{ - return sizeof(btHingeConstraintData); -} - -///fills the dataBuffer and returns the struct name (and 0 on failure) -SIMD_FORCE_INLINE const char* btHingeConstraint::serialize(void* dataBuffer, btSerializer* serializer) const -{ - btHingeConstraintData* hingeData = (btHingeConstraintData*)dataBuffer; - btTypedConstraint::serialize(&hingeData->m_typeConstraintData, serializer); - - m_rbAFrame.serialize(hingeData->m_rbAFrame); - m_rbBFrame.serialize(hingeData->m_rbBFrame); - - hingeData->m_angularOnly = m_angularOnly; - hingeData->m_enableAngularMotor = m_enableAngularMotor; - hingeData->m_maxMotorImpulse = float(m_maxMotorImpulse); - hingeData->m_motorTargetVelocity = float(m_motorTargetVelocity); - hingeData->m_useReferenceFrameA = m_useReferenceFrameA; -#ifdef _BT_USE_CENTER_LIMIT_ - hingeData->m_lowerLimit = float(m_limit.getLow()); - hingeData->m_upperLimit = float(m_limit.getHigh()); - hingeData->m_limitSoftness = float(m_limit.getSoftness()); - hingeData->m_biasFactor = float(m_limit.getBiasFactor()); - hingeData->m_relaxationFactor = float(m_limit.getRelaxationFactor()); -#else - hingeData->m_lowerLimit = float(m_lowerLimit); - hingeData->m_upperLimit = float(m_upperLimit); - hingeData->m_limitSoftness = float(m_limitSoftness); - hingeData->m_biasFactor = float(m_biasFactor); - hingeData->m_relaxationFactor = float(m_relaxationFactor); -#endif - - // Fill padding with zeros to appease msan. -#ifdef BT_USE_DOUBLE_PRECISION - hingeData->m_padding1[0] = 0; - hingeData->m_padding1[1] = 0; - hingeData->m_padding1[2] = 0; - hingeData->m_padding1[3] = 0; -#endif - - return btHingeConstraintDataName; -} - -#endif //BT_HINGECONSTRAINT_H diff --git a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btJacobianEntry.h b/engine/inc/bullet/BulletDynamics/ConstraintSolver/btJacobianEntry.h deleted file mode 100644 index 438456fe..00000000 --- a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btJacobianEntry.h +++ /dev/null @@ -1,150 +0,0 @@ -/* -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_JACOBIAN_ENTRY_H -#define BT_JACOBIAN_ENTRY_H - -#include "LinearMath/btMatrix3x3.h" - -//notes: -// Another memory optimization would be to store m_1MinvJt in the remaining 3 w components -// which makes the btJacobianEntry memory layout 16 bytes -// if you only are interested in angular part, just feed massInvA and massInvB zero - -/// Jacobian entry is an abstraction that allows to describe constraints -/// it can be used in combination with a constraint solver -/// Can be used to relate the effect of an impulse to the constraint error -ATTRIBUTE_ALIGNED16(class) -btJacobianEntry -{ -public: - btJacobianEntry(){}; - //constraint between two different rigidbodies - btJacobianEntry( - const btMatrix3x3& world2A, - const btMatrix3x3& world2B, - const btVector3& rel_pos1, const btVector3& rel_pos2, - const btVector3& jointAxis, - const btVector3& inertiaInvA, - const btScalar massInvA, - const btVector3& inertiaInvB, - const btScalar massInvB) - : m_linearJointAxis(jointAxis) - { - m_aJ = world2A * (rel_pos1.cross(m_linearJointAxis)); - m_bJ = world2B * (rel_pos2.cross(-m_linearJointAxis)); - m_0MinvJt = inertiaInvA * m_aJ; - m_1MinvJt = inertiaInvB * m_bJ; - m_Adiag = massInvA + m_0MinvJt.dot(m_aJ) + massInvB + m_1MinvJt.dot(m_bJ); - - btAssert(m_Adiag > btScalar(0.0)); - } - - //angular constraint between two different rigidbodies - btJacobianEntry(const btVector3& jointAxis, - const btMatrix3x3& world2A, - const btMatrix3x3& world2B, - const btVector3& inertiaInvA, - const btVector3& inertiaInvB) - : m_linearJointAxis(btVector3(btScalar(0.), btScalar(0.), btScalar(0.))) - { - m_aJ = world2A * jointAxis; - m_bJ = world2B * -jointAxis; - m_0MinvJt = inertiaInvA * m_aJ; - m_1MinvJt = inertiaInvB * m_bJ; - m_Adiag = m_0MinvJt.dot(m_aJ) + m_1MinvJt.dot(m_bJ); - - btAssert(m_Adiag > btScalar(0.0)); - } - - //angular constraint between two different rigidbodies - btJacobianEntry(const btVector3& axisInA, - const btVector3& axisInB, - const btVector3& inertiaInvA, - const btVector3& inertiaInvB) - : m_linearJointAxis(btVector3(btScalar(0.), btScalar(0.), btScalar(0.))), m_aJ(axisInA), m_bJ(-axisInB) - { - m_0MinvJt = inertiaInvA * m_aJ; - m_1MinvJt = inertiaInvB * m_bJ; - m_Adiag = m_0MinvJt.dot(m_aJ) + m_1MinvJt.dot(m_bJ); - - btAssert(m_Adiag > btScalar(0.0)); - } - - //constraint on one rigidbody - btJacobianEntry( - const btMatrix3x3& world2A, - const btVector3& rel_pos1, const btVector3& rel_pos2, - const btVector3& jointAxis, - const btVector3& inertiaInvA, - const btScalar massInvA) - : m_linearJointAxis(jointAxis) - { - m_aJ = world2A * (rel_pos1.cross(jointAxis)); - m_bJ = world2A * (rel_pos2.cross(-jointAxis)); - m_0MinvJt = inertiaInvA * m_aJ; - m_1MinvJt = btVector3(btScalar(0.), btScalar(0.), btScalar(0.)); - m_Adiag = massInvA + m_0MinvJt.dot(m_aJ); - - btAssert(m_Adiag > btScalar(0.0)); - } - - btScalar getDiagonal() const { return m_Adiag; } - - // for two constraints on the same rigidbody (for example vehicle friction) - btScalar getNonDiagonal(const btJacobianEntry& jacB, const btScalar massInvA) const - { - const btJacobianEntry& jacA = *this; - btScalar lin = massInvA * jacA.m_linearJointAxis.dot(jacB.m_linearJointAxis); - btScalar ang = jacA.m_0MinvJt.dot(jacB.m_aJ); - return lin + ang; - } - - // for two constraints on sharing two same rigidbodies (for example two contact points between two rigidbodies) - btScalar getNonDiagonal(const btJacobianEntry& jacB, const btScalar massInvA, const btScalar massInvB) const - { - const btJacobianEntry& jacA = *this; - btVector3 lin = jacA.m_linearJointAxis * jacB.m_linearJointAxis; - btVector3 ang0 = jacA.m_0MinvJt * jacB.m_aJ; - btVector3 ang1 = jacA.m_1MinvJt * jacB.m_bJ; - btVector3 lin0 = massInvA * lin; - btVector3 lin1 = massInvB * lin; - btVector3 sum = ang0 + ang1 + lin0 + lin1; - return sum[0] + sum[1] + sum[2]; - } - - btScalar getRelativeVelocity(const btVector3& linvelA, const btVector3& angvelA, const btVector3& linvelB, const btVector3& angvelB) - { - btVector3 linrel = linvelA - linvelB; - btVector3 angvela = angvelA * m_aJ; - btVector3 angvelb = angvelB * m_bJ; - linrel *= m_linearJointAxis; - angvela += angvelb; - angvela += linrel; - btScalar rel_vel2 = angvela[0] + angvela[1] + angvela[2]; - return rel_vel2 + SIMD_EPSILON; - } - //private: - - btVector3 m_linearJointAxis; - btVector3 m_aJ; - btVector3 m_bJ; - btVector3 m_0MinvJt; - btVector3 m_1MinvJt; - //Optimization: can be stored in the w/last component of one of the vectors - btScalar m_Adiag; -}; - -#endif //BT_JACOBIAN_ENTRY_H diff --git a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btNNCGConstraintSolver.h b/engine/inc/bullet/BulletDynamics/ConstraintSolver/btNNCGConstraintSolver.h deleted file mode 100644 index c84f274a..00000000 --- a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btNNCGConstraintSolver.h +++ /dev/null @@ -1,57 +0,0 @@ -/* -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_NNCG_CONSTRAINT_SOLVER_H -#define BT_NNCG_CONSTRAINT_SOLVER_H - -#include "btSequentialImpulseConstraintSolver.h" - -ATTRIBUTE_ALIGNED16(class) -btNNCGConstraintSolver : public btSequentialImpulseConstraintSolver -{ -protected: - btScalar m_deltafLengthSqrPrev; - - btAlignedObjectArray m_pNC; // p for None Contact constraints - btAlignedObjectArray m_pC; // p for Contact constraints - btAlignedObjectArray m_pCF; // p for ContactFriction constraints - btAlignedObjectArray m_pCRF; // p for ContactRollingFriction constraints - - //These are recalculated in every iterations. We just keep these to prevent reallocation in each iteration. - btAlignedObjectArray m_deltafNC; // deltaf for NoneContact constraints - btAlignedObjectArray m_deltafC; // deltaf for Contact constraints - btAlignedObjectArray m_deltafCF; // deltaf for ContactFriction constraints - btAlignedObjectArray m_deltafCRF; // deltaf for ContactRollingFriction constraints - -protected: - virtual btScalar solveGroupCacheFriendlyFinish(btCollisionObject * *bodies, int numBodies, const btContactSolverInfo& infoGlobal); - virtual btScalar solveSingleIteration(int iteration, btCollisionObject** bodies, int numBodies, btPersistentManifold** manifoldPtr, int numManifolds, btTypedConstraint** constraints, int numConstraints, const btContactSolverInfo& infoGlobal, btIDebugDraw* debugDrawer); - - virtual btScalar solveGroupCacheFriendlySetup(btCollisionObject * *bodies, int numBodies, btPersistentManifold** manifoldPtr, int numManifolds, btTypedConstraint** constraints, int numConstraints, const btContactSolverInfo& infoGlobal, btIDebugDraw* debugDrawer); - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btNNCGConstraintSolver() : btSequentialImpulseConstraintSolver(), m_onlyForNoneContact(false) {} - - virtual btConstraintSolverType getSolverType() const - { - return BT_NNCG_SOLVER; - } - - bool m_onlyForNoneContact; -}; - -#endif //BT_NNCG_CONSTRAINT_SOLVER_H diff --git a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h b/engine/inc/bullet/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h deleted file mode 100644 index 4717e198..00000000 --- a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h +++ /dev/null @@ -1,173 +0,0 @@ -/* -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_POINT2POINTCONSTRAINT_H -#define BT_POINT2POINTCONSTRAINT_H - -#include "LinearMath/btVector3.h" -#include "btJacobianEntry.h" -#include "btTypedConstraint.h" - -class btRigidBody; - -#ifdef BT_USE_DOUBLE_PRECISION -#define btPoint2PointConstraintData2 btPoint2PointConstraintDoubleData2 -#define btPoint2PointConstraintDataName "btPoint2PointConstraintDoubleData2" -#else -#define btPoint2PointConstraintData2 btPoint2PointConstraintFloatData -#define btPoint2PointConstraintDataName "btPoint2PointConstraintFloatData" -#endif //BT_USE_DOUBLE_PRECISION - -struct btConstraintSetting -{ - btConstraintSetting() : m_tau(btScalar(0.3)), - m_damping(btScalar(1.)), - m_impulseClamp(btScalar(0.)) - { - } - btScalar m_tau; - btScalar m_damping; - btScalar m_impulseClamp; -}; - -enum btPoint2PointFlags -{ - BT_P2P_FLAGS_ERP = 1, - BT_P2P_FLAGS_CFM = 2 -}; - -/// point to point constraint between two rigidbodies each with a pivotpoint that descibes the 'ballsocket' location in local space -ATTRIBUTE_ALIGNED16(class) -btPoint2PointConstraint : public btTypedConstraint -{ -#ifdef IN_PARALLELL_SOLVER -public: -#endif - btJacobianEntry m_jac[3]; //3 orthogonal linear constraints - - btVector3 m_pivotInA; - btVector3 m_pivotInB; - - int m_flags; - btScalar m_erp; - btScalar m_cfm; - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - ///for backwards compatibility during the transition to 'getInfo/getInfo2' - bool m_useSolveConstraintObsolete; - - btConstraintSetting m_setting; - - btPoint2PointConstraint(btRigidBody & rbA, btRigidBody & rbB, const btVector3& pivotInA, const btVector3& pivotInB); - - btPoint2PointConstraint(btRigidBody & rbA, const btVector3& pivotInA); - - virtual void buildJacobian(); - - virtual void getInfo1(btConstraintInfo1 * info); - - void getInfo1NonVirtual(btConstraintInfo1 * info); - - virtual void getInfo2(btConstraintInfo2 * info); - - void getInfo2NonVirtual(btConstraintInfo2 * info, const btTransform& body0_trans, const btTransform& body1_trans); - - void updateRHS(btScalar timeStep); - - void setPivotA(const btVector3& pivotA) - { - m_pivotInA = pivotA; - } - - void setPivotB(const btVector3& pivotB) - { - m_pivotInB = pivotB; - } - - const btVector3& getPivotInA() const - { - return m_pivotInA; - } - - const btVector3& getPivotInB() const - { - return m_pivotInB; - } - - ///override the default global value of a parameter (such as ERP or CFM), optionally provide the axis (0..5). - ///If no axis is provided, it uses the default axis for this constraint. - virtual void setParam(int num, btScalar value, int axis = -1); - ///return the local value of parameter - virtual btScalar getParam(int num, int axis = -1) const; - - virtual int getFlags() const - { - return m_flags; - } - - virtual int calculateSerializeBufferSize() const; - - ///fills the dataBuffer and returns the struct name (and 0 on failure) - virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const; -}; - -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct btPoint2PointConstraintFloatData -{ - btTypedConstraintData m_typeConstraintData; - btVector3FloatData m_pivotInA; - btVector3FloatData m_pivotInB; -}; - -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct btPoint2PointConstraintDoubleData2 -{ - btTypedConstraintDoubleData m_typeConstraintData; - btVector3DoubleData m_pivotInA; - btVector3DoubleData m_pivotInB; -}; - -#ifdef BT_BACKWARDS_COMPATIBLE_SERIALIZATION -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -///this structure is not used, except for loading pre-2.82 .bullet files -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct btPoint2PointConstraintDoubleData -{ - btTypedConstraintData m_typeConstraintData; - btVector3DoubleData m_pivotInA; - btVector3DoubleData m_pivotInB; -}; -#endif //BT_BACKWARDS_COMPATIBLE_SERIALIZATION - -SIMD_FORCE_INLINE int btPoint2PointConstraint::calculateSerializeBufferSize() const -{ - return sizeof(btPoint2PointConstraintData2); -} - -///fills the dataBuffer and returns the struct name (and 0 on failure) -SIMD_FORCE_INLINE const char* btPoint2PointConstraint::serialize(void* dataBuffer, btSerializer* serializer) const -{ - btPoint2PointConstraintData2* p2pData = (btPoint2PointConstraintData2*)dataBuffer; - - btTypedConstraint::serialize(&p2pData->m_typeConstraintData, serializer); - m_pivotInA.serialize(p2pData->m_pivotInA); - m_pivotInB.serialize(p2pData->m_pivotInB); - - return btPoint2PointConstraintDataName; -} - -#endif //BT_POINT2POINTCONSTRAINT_H diff --git a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h b/engine/inc/bullet/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h deleted file mode 100644 index f3ef02fc..00000000 --- a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h +++ /dev/null @@ -1,215 +0,0 @@ -/* -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_SEQUENTIAL_IMPULSE_CONSTRAINT_SOLVER_H -#define BT_SEQUENTIAL_IMPULSE_CONSTRAINT_SOLVER_H - -class btIDebugDraw; -class btPersistentManifold; -class btDispatcher; -class btCollisionObject; -#include "BulletDynamics/ConstraintSolver/btTypedConstraint.h" -#include "BulletDynamics/ConstraintSolver/btContactSolverInfo.h" -#include "BulletDynamics/ConstraintSolver/btSolverBody.h" -#include "BulletDynamics/ConstraintSolver/btSolverConstraint.h" -#include "BulletCollision/NarrowPhaseCollision/btManifoldPoint.h" -#include "BulletDynamics/ConstraintSolver/btConstraintSolver.h" - -typedef btScalar (*btSingleConstraintRowSolver)(btSolverBody&, btSolverBody&, const btSolverConstraint&); - -struct btSolverAnalyticsData -{ - btSolverAnalyticsData() - { - m_numSolverCalls = 0; - m_numIterationsUsed = -1; - m_remainingLeastSquaresResidual = -1; - m_islandId = -2; - } - int m_islandId; - int m_numBodies; - int m_numContactManifolds; - int m_numSolverCalls; - int m_numIterationsUsed; - double m_remainingLeastSquaresResidual; -}; - -///The btSequentialImpulseConstraintSolver is a fast SIMD implementation of the Projected Gauss Seidel (iterative LCP) method. -ATTRIBUTE_ALIGNED16(class) -btSequentialImpulseConstraintSolver : public btConstraintSolver -{ - - -protected: - btAlignedObjectArray m_tmpSolverBodyPool; - btConstraintArray m_tmpSolverContactConstraintPool; - btConstraintArray m_tmpSolverNonContactConstraintPool; - btConstraintArray m_tmpSolverContactFrictionConstraintPool; - btConstraintArray m_tmpSolverContactRollingFrictionConstraintPool; - - btAlignedObjectArray m_orderTmpConstraintPool; - btAlignedObjectArray m_orderNonContactConstraintPool; - btAlignedObjectArray m_orderFrictionConstraintPool; - btAlignedObjectArray m_tmpConstraintSizesPool; - int m_maxOverrideNumSolverIterations; - int m_fixedBodyId; - // When running solvers on multiple threads, a race condition exists for Kinematic objects that - // participate in more than one solver. - // The getOrInitSolverBody() function writes the companionId of each body (storing the index of the solver body - // for the current solver). For normal dynamic bodies it isn't an issue because they can only be in one island - // (and therefore one thread) at a time. But kinematic bodies can be in multiple islands at once. - // To avoid this race condition, this solver does not write the companionId, instead it stores the solver body - // index in this solver-local table, indexed by the uniqueId of the body. - btAlignedObjectArray m_kinematicBodyUniqueIdToSolverBodyTable; // only used for multithreading - - btSingleConstraintRowSolver m_resolveSingleConstraintRowGeneric; - btSingleConstraintRowSolver m_resolveSingleConstraintRowLowerLimit; - btSingleConstraintRowSolver m_resolveSplitPenetrationImpulse; - int m_cachedSolverMode; // used to check if SOLVER_SIMD flag has been changed - void setupSolverFunctions(bool useSimd); - - btScalar m_leastSquaresResidual; - - void setupFrictionConstraint(btSolverConstraint & solverConstraint, const btVector3& normalAxis, int solverBodyIdA, int solverBodyIdB, - btManifoldPoint& cp, const btVector3& rel_pos1, const btVector3& rel_pos2, - btCollisionObject* colObj0, btCollisionObject* colObj1, btScalar relaxation, - const btContactSolverInfo& infoGlobal, - btScalar desiredVelocity = 0., btScalar cfmSlip = 0.); - - void setupTorsionalFrictionConstraint(btSolverConstraint & solverConstraint, const btVector3& normalAxis, int solverBodyIdA, int solverBodyIdB, - btManifoldPoint& cp, btScalar combinedTorsionalFriction, const btVector3& rel_pos1, const btVector3& rel_pos2, - btCollisionObject* colObj0, btCollisionObject* colObj1, btScalar relaxation, - btScalar desiredVelocity = 0., btScalar cfmSlip = 0.); - - btSolverConstraint& addFrictionConstraint(const btVector3& normalAxis, int solverBodyIdA, int solverBodyIdB, int frictionIndex, btManifoldPoint& cp, const btVector3& rel_pos1, const btVector3& rel_pos2, btCollisionObject* colObj0, btCollisionObject* colObj1, btScalar relaxation, const btContactSolverInfo& infoGlobal, btScalar desiredVelocity = 0., btScalar cfmSlip = 0.); - btSolverConstraint& addTorsionalFrictionConstraint(const btVector3& normalAxis, int solverBodyIdA, int solverBodyIdB, int frictionIndex, btManifoldPoint& cp, btScalar torsionalFriction, const btVector3& rel_pos1, const btVector3& rel_pos2, btCollisionObject* colObj0, btCollisionObject* colObj1, btScalar relaxation, btScalar desiredVelocity = 0, btScalar cfmSlip = 0.f); - - void setupContactConstraint(btSolverConstraint & solverConstraint, int solverBodyIdA, int solverBodyIdB, btManifoldPoint& cp, - const btContactSolverInfo& infoGlobal, btScalar& relaxation, const btVector3& rel_pos1, const btVector3& rel_pos2); - - static void applyAnisotropicFriction(btCollisionObject * colObj, btVector3 & frictionDirection, int frictionMode); - - void setFrictionConstraintImpulse(btSolverConstraint & solverConstraint, int solverBodyIdA, int solverBodyIdB, - btManifoldPoint& cp, const btContactSolverInfo& infoGlobal); - - ///m_btSeed2 is used for re-arranging the constraint rows. improves convergence/quality of friction - unsigned long m_btSeed2; - - btScalar restitutionCurve(btScalar rel_vel, btScalar restitution, btScalar velocityThreshold); - - virtual void convertContacts(btPersistentManifold * *manifoldPtr, int numManifolds, const btContactSolverInfo& infoGlobal); - - void convertContact(btPersistentManifold * manifold, const btContactSolverInfo& infoGlobal); - - virtual void convertJoints(btTypedConstraint * *constraints, int numConstraints, const btContactSolverInfo& infoGlobal); - void convertJoint(btSolverConstraint * currentConstraintRow, btTypedConstraint * constraint, const btTypedConstraint::btConstraintInfo1& info1, int solverBodyIdA, int solverBodyIdB, const btContactSolverInfo& infoGlobal); - - virtual void convertBodies(btCollisionObject * *bodies, int numBodies, const btContactSolverInfo& infoGlobal); - - btScalar resolveSplitPenetrationSIMD(btSolverBody & bodyA, btSolverBody & bodyB, const btSolverConstraint& contactConstraint) - { - return m_resolveSplitPenetrationImpulse(bodyA, bodyB, contactConstraint); - } - - btScalar resolveSplitPenetrationImpulseCacheFriendly(btSolverBody & bodyA, btSolverBody & bodyB, const btSolverConstraint& contactConstraint) - { - return m_resolveSplitPenetrationImpulse(bodyA, bodyB, contactConstraint); - } - - //internal method - int getOrInitSolverBody(btCollisionObject & body, btScalar timeStep); - void initSolverBody(btSolverBody * solverBody, btCollisionObject * collisionObject, btScalar timeStep); - - btScalar resolveSingleConstraintRowGeneric(btSolverBody & bodyA, btSolverBody & bodyB, const btSolverConstraint& contactConstraint); - btScalar resolveSingleConstraintRowGenericSIMD(btSolverBody & bodyA, btSolverBody & bodyB, const btSolverConstraint& contactConstraint); - btScalar resolveSingleConstraintRowLowerLimit(btSolverBody & bodyA, btSolverBody & bodyB, const btSolverConstraint& contactConstraint); - btScalar resolveSingleConstraintRowLowerLimitSIMD(btSolverBody & bodyA, btSolverBody & bodyB, const btSolverConstraint& contactConstraint); - btScalar resolveSplitPenetrationImpulse(btSolverBody & bodyA, btSolverBody & bodyB, const btSolverConstraint& contactConstraint) - { - return m_resolveSplitPenetrationImpulse(bodyA, bodyB, contactConstraint); - } - -protected: - void writeBackContacts(int iBegin, int iEnd, const btContactSolverInfo& infoGlobal); - void writeBackJoints(int iBegin, int iEnd, const btContactSolverInfo& infoGlobal); - void writeBackBodies(int iBegin, int iEnd, const btContactSolverInfo& infoGlobal); - virtual void solveGroupCacheFriendlySplitImpulseIterations(btCollisionObject * *bodies, int numBodies, btPersistentManifold** manifoldPtr, int numManifolds, btTypedConstraint** constraints, int numConstraints, const btContactSolverInfo& infoGlobal, btIDebugDraw* debugDrawer); - virtual btScalar solveGroupCacheFriendlyFinish(btCollisionObject * *bodies, int numBodies, const btContactSolverInfo& infoGlobal); - virtual btScalar solveSingleIteration(int iteration, btCollisionObject** bodies, int numBodies, btPersistentManifold** manifoldPtr, int numManifolds, btTypedConstraint** constraints, int numConstraints, const btContactSolverInfo& infoGlobal, btIDebugDraw* debugDrawer); - - virtual btScalar solveGroupCacheFriendlySetup(btCollisionObject * *bodies, int numBodies, btPersistentManifold** manifoldPtr, int numManifolds, btTypedConstraint** constraints, int numConstraints, const btContactSolverInfo& infoGlobal, btIDebugDraw* debugDrawer); - virtual btScalar solveGroupCacheFriendlyIterations(btCollisionObject * *bodies, int numBodies, btPersistentManifold** manifoldPtr, int numManifolds, btTypedConstraint** constraints, int numConstraints, const btContactSolverInfo& infoGlobal, btIDebugDraw* debugDrawer); - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btSequentialImpulseConstraintSolver(); - virtual ~btSequentialImpulseConstraintSolver(); - - virtual btScalar solveGroup(btCollisionObject * *bodies, int numBodies, btPersistentManifold** manifold, int numManifolds, btTypedConstraint** constraints, int numConstraints, const btContactSolverInfo& info, btIDebugDraw* debugDrawer, btDispatcher* dispatcher); - - ///clear internal cached data and reset random seed - virtual void reset(); - - unsigned long btRand2(); - - int btRandInt2(int n); - - void setRandSeed(unsigned long seed) - { - m_btSeed2 = seed; - } - unsigned long getRandSeed() const - { - return m_btSeed2; - } - - virtual btConstraintSolverType getSolverType() const - { - return BT_SEQUENTIAL_IMPULSE_SOLVER; - } - - btSingleConstraintRowSolver getActiveConstraintRowSolverGeneric() - { - return m_resolveSingleConstraintRowGeneric; - } - void setConstraintRowSolverGeneric(btSingleConstraintRowSolver rowSolver) - { - m_resolveSingleConstraintRowGeneric = rowSolver; - } - btSingleConstraintRowSolver getActiveConstraintRowSolverLowerLimit() - { - return m_resolveSingleConstraintRowLowerLimit; - } - void setConstraintRowSolverLowerLimit(btSingleConstraintRowSolver rowSolver) - { - m_resolveSingleConstraintRowLowerLimit = rowSolver; - } - - - - ///Various implementations of solving a single constraint row using a generic equality constraint, using scalar reference, SSE2 or SSE4 - btSingleConstraintRowSolver getScalarConstraintRowSolverGeneric(); - btSingleConstraintRowSolver getSSE2ConstraintRowSolverGeneric(); - btSingleConstraintRowSolver getSSE4_1ConstraintRowSolverGeneric(); - - ///Various implementations of solving a single constraint row using an inequality (lower limit) constraint, using scalar reference, SSE2 or SSE4 - btSingleConstraintRowSolver getScalarConstraintRowSolverLowerLimit(); - btSingleConstraintRowSolver getSSE2ConstraintRowSolverLowerLimit(); - btSingleConstraintRowSolver getSSE4_1ConstraintRowSolverLowerLimit(); - btSolverAnalyticsData m_analyticsData; -}; - -#endif //BT_SEQUENTIAL_IMPULSE_CONSTRAINT_SOLVER_H diff --git a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolverMt.h b/engine/inc/bullet/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolverMt.h deleted file mode 100644 index 1861ddd7..00000000 --- a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolverMt.h +++ /dev/null @@ -1,150 +0,0 @@ -/* -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_SEQUENTIAL_IMPULSE_CONSTRAINT_SOLVER_MT_H -#define BT_SEQUENTIAL_IMPULSE_CONSTRAINT_SOLVER_MT_H - -#include "btSequentialImpulseConstraintSolver.h" -#include "btBatchedConstraints.h" -#include "LinearMath/btThreads.h" - -/// -/// btSequentialImpulseConstraintSolverMt -/// -/// A multithreaded variant of the sequential impulse constraint solver. The constraints to be solved are grouped into -/// batches and phases where each batch of constraints within a given phase can be solved in parallel with the rest. -/// Ideally we want as few phases as possible, and each phase should have many batches, and all of the batches should -/// have about the same number of constraints. -/// This method works best on a large island of many constraints. -/// -/// Supports all of the features of the normal sequential impulse solver such as: -/// - split penetration impulse -/// - rolling friction -/// - interleaving constraints -/// - warmstarting -/// - 2 friction directions -/// - randomized constraint ordering -/// - early termination when leastSquaresResidualThreshold is satisfied -/// -/// When the SOLVER_INTERLEAVE_CONTACT_AND_FRICTION_CONSTRAINTS flag is enabled, unlike the normal SequentialImpulse solver, -/// the rolling friction is interleaved as well. -/// Interleaving the contact penetration constraints with friction reduces the number of parallel loops that need to be done, -/// which reduces threading overhead so it can be a performance win, however, it does seem to produce a less stable simulation, -/// at least on stacks of blocks. -/// -/// When the SOLVER_RANDMIZE_ORDER flag is enabled, the ordering of phases, and the ordering of constraints within each batch -/// is randomized, however it does not swap constraints between batches. -/// This is to avoid regenerating the batches for each solver iteration which would be quite costly in performance. -/// -/// Note that a non-zero leastSquaresResidualThreshold could possibly affect the determinism of the simulation -/// if the task scheduler's parallelSum operation is non-deterministic. The parallelSum operation can be non-deterministic -/// because floating point addition is not associative due to rounding errors. -/// The task scheduler can and should ensure that the result of any parallelSum operation is deterministic. -/// -ATTRIBUTE_ALIGNED16(class) -btSequentialImpulseConstraintSolverMt : public btSequentialImpulseConstraintSolver -{ -public: - virtual void solveGroupCacheFriendlySplitImpulseIterations(btCollisionObject * *bodies, int numBodies, btPersistentManifold** manifoldPtr, int numManifolds, btTypedConstraint** constraints, int numConstraints, const btContactSolverInfo& infoGlobal, btIDebugDraw* debugDrawer) BT_OVERRIDE; - virtual btScalar solveSingleIteration(int iteration, btCollisionObject** bodies, int numBodies, btPersistentManifold** manifoldPtr, int numManifolds, btTypedConstraint** constraints, int numConstraints, const btContactSolverInfo& infoGlobal, btIDebugDraw* debugDrawer) BT_OVERRIDE; - virtual btScalar solveGroupCacheFriendlySetup(btCollisionObject * *bodies, int numBodies, btPersistentManifold** manifoldPtr, int numManifolds, btTypedConstraint** constraints, int numConstraints, const btContactSolverInfo& infoGlobal, btIDebugDraw* debugDrawer) BT_OVERRIDE; - virtual btScalar solveGroupCacheFriendlyFinish(btCollisionObject * *bodies, int numBodies, const btContactSolverInfo& infoGlobal) BT_OVERRIDE; - - // temp struct used to collect info from persistent manifolds into a cache-friendly struct using multiple threads - struct btContactManifoldCachedInfo - { - static const int MAX_NUM_CONTACT_POINTS = 4; - - int numTouchingContacts; - int solverBodyIds[2]; - int contactIndex; - int rollingFrictionIndex; - bool contactHasRollingFriction[MAX_NUM_CONTACT_POINTS]; - btManifoldPoint* contactPoints[MAX_NUM_CONTACT_POINTS]; - }; - // temp struct used for setting up joint constraints in parallel - struct JointParams - { - int m_solverConstraint; - int m_solverBodyA; - int m_solverBodyB; - }; - void internalInitMultipleJoints(btTypedConstraint * *constraints, int iBegin, int iEnd); - void internalConvertMultipleJoints(const btAlignedObjectArray& jointParamsArray, btTypedConstraint** constraints, int iBegin, int iEnd, const btContactSolverInfo& infoGlobal); - - // parameters to control batching - static bool s_allowNestedParallelForLoops; // whether to allow nested parallel operations - static int s_minimumContactManifoldsForBatching; // don't even try to batch if fewer manifolds than this - static btBatchedConstraints::BatchingMethod s_contactBatchingMethod; - static btBatchedConstraints::BatchingMethod s_jointBatchingMethod; - static int s_minBatchSize; // desired number of constraints per batch - static int s_maxBatchSize; - -protected: - static const int CACHE_LINE_SIZE = 64; - - btBatchedConstraints m_batchedContactConstraints; - btBatchedConstraints m_batchedJointConstraints; - int m_numFrictionDirections; - bool m_useBatching; - bool m_useObsoleteJointConstraints; - btAlignedObjectArray m_manifoldCachedInfoArray; - btAlignedObjectArray m_rollingFrictionIndexTable; // lookup table mapping contact index to rolling friction index - btSpinMutex m_bodySolverArrayMutex; - char m_antiFalseSharingPadding[CACHE_LINE_SIZE]; // padding to keep mutexes in separate cachelines - btSpinMutex m_kinematicBodyUniqueIdToSolverBodyTableMutex; - btAlignedObjectArray m_scratchMemory; - - virtual void randomizeConstraintOrdering(int iteration, int numIterations); - virtual btScalar resolveAllJointConstraints(int iteration); - virtual btScalar resolveAllContactConstraints(); - virtual btScalar resolveAllContactFrictionConstraints(); - virtual btScalar resolveAllContactConstraintsInterleaved(); - virtual btScalar resolveAllRollingFrictionConstraints(); - - virtual void setupBatchedContactConstraints(); - virtual void setupBatchedJointConstraints(); - virtual void convertJoints(btTypedConstraint * *constraints, int numConstraints, const btContactSolverInfo& infoGlobal) BT_OVERRIDE; - virtual void convertContacts(btPersistentManifold * *manifoldPtr, int numManifolds, const btContactSolverInfo& infoGlobal) BT_OVERRIDE; - virtual void convertBodies(btCollisionObject * *bodies, int numBodies, const btContactSolverInfo& infoGlobal) BT_OVERRIDE; - - int getOrInitSolverBodyThreadsafe(btCollisionObject & body, btScalar timeStep); - void allocAllContactConstraints(btPersistentManifold * *manifoldPtr, int numManifolds, const btContactSolverInfo& infoGlobal); - void setupAllContactConstraints(const btContactSolverInfo& infoGlobal); - void randomizeBatchedConstraintOrdering(btBatchedConstraints * batchedConstraints); - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btSequentialImpulseConstraintSolverMt(); - virtual ~btSequentialImpulseConstraintSolverMt(); - - btScalar resolveMultipleJointConstraints(const btAlignedObjectArray& consIndices, int batchBegin, int batchEnd, int iteration); - btScalar resolveMultipleContactConstraints(const btAlignedObjectArray& consIndices, int batchBegin, int batchEnd); - btScalar resolveMultipleContactSplitPenetrationImpulseConstraints(const btAlignedObjectArray& consIndices, int batchBegin, int batchEnd); - btScalar resolveMultipleContactFrictionConstraints(const btAlignedObjectArray& consIndices, int batchBegin, int batchEnd); - btScalar resolveMultipleContactRollingFrictionConstraints(const btAlignedObjectArray& consIndices, int batchBegin, int batchEnd); - btScalar resolveMultipleContactConstraintsInterleaved(const btAlignedObjectArray& contactIndices, int batchBegin, int batchEnd); - - void internalCollectContactManifoldCachedInfo(btContactManifoldCachedInfo * cachedInfoArray, btPersistentManifold * *manifoldPtr, int numManifolds, const btContactSolverInfo& infoGlobal); - void internalAllocContactConstraints(const btContactManifoldCachedInfo* cachedInfoArray, int numManifolds); - void internalSetupContactConstraints(int iContactConstraint, const btContactSolverInfo& infoGlobal); - void internalConvertBodies(btCollisionObject * *bodies, int iBegin, int iEnd, const btContactSolverInfo& infoGlobal); - void internalWriteBackContacts(int iBegin, int iEnd, const btContactSolverInfo& infoGlobal); - void internalWriteBackJoints(int iBegin, int iEnd, const btContactSolverInfo& infoGlobal); - void internalWriteBackBodies(int iBegin, int iEnd, const btContactSolverInfo& infoGlobal); -}; - -#endif //BT_SEQUENTIAL_IMPULSE_CONSTRAINT_SOLVER_MT_H diff --git a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btSliderConstraint.h b/engine/inc/bullet/BulletDynamics/ConstraintSolver/btSliderConstraint.h deleted file mode 100644 index 75ca34e9..00000000 --- a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btSliderConstraint.h +++ /dev/null @@ -1,349 +0,0 @@ -/* -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 - -TODO: - - add clamping od accumulated impulse to improve stability - - add conversion for ODE constraint solver -*/ - -#ifndef BT_SLIDER_CONSTRAINT_H -#define BT_SLIDER_CONSTRAINT_H - -#include "LinearMath/btScalar.h" //for BT_USE_DOUBLE_PRECISION - -#ifdef BT_USE_DOUBLE_PRECISION -#define btSliderConstraintData2 btSliderConstraintDoubleData -#define btSliderConstraintDataName "btSliderConstraintDoubleData" -#else -#define btSliderConstraintData2 btSliderConstraintData -#define btSliderConstraintDataName "btSliderConstraintData" -#endif //BT_USE_DOUBLE_PRECISION - -#include "LinearMath/btVector3.h" -#include "btJacobianEntry.h" -#include "btTypedConstraint.h" - -class btRigidBody; - -#define SLIDER_CONSTRAINT_DEF_SOFTNESS (btScalar(1.0)) -#define SLIDER_CONSTRAINT_DEF_DAMPING (btScalar(1.0)) -#define SLIDER_CONSTRAINT_DEF_RESTITUTION (btScalar(0.7)) -#define SLIDER_CONSTRAINT_DEF_CFM (btScalar(0.f)) - -enum btSliderFlags -{ - BT_SLIDER_FLAGS_CFM_DIRLIN = (1 << 0), - BT_SLIDER_FLAGS_ERP_DIRLIN = (1 << 1), - BT_SLIDER_FLAGS_CFM_DIRANG = (1 << 2), - BT_SLIDER_FLAGS_ERP_DIRANG = (1 << 3), - BT_SLIDER_FLAGS_CFM_ORTLIN = (1 << 4), - BT_SLIDER_FLAGS_ERP_ORTLIN = (1 << 5), - BT_SLIDER_FLAGS_CFM_ORTANG = (1 << 6), - BT_SLIDER_FLAGS_ERP_ORTANG = (1 << 7), - BT_SLIDER_FLAGS_CFM_LIMLIN = (1 << 8), - BT_SLIDER_FLAGS_ERP_LIMLIN = (1 << 9), - BT_SLIDER_FLAGS_CFM_LIMANG = (1 << 10), - BT_SLIDER_FLAGS_ERP_LIMANG = (1 << 11) -}; - -ATTRIBUTE_ALIGNED16(class) -btSliderConstraint : public btTypedConstraint -{ -protected: - ///for backwards compatibility during the transition to 'getInfo/getInfo2' - bool m_useSolveConstraintObsolete; - bool m_useOffsetForConstraintFrame; - btTransform m_frameInA; - btTransform m_frameInB; - // use frameA fo define limits, if true - bool m_useLinearReferenceFrameA; - // linear limits - btScalar m_lowerLinLimit; - btScalar m_upperLinLimit; - // angular limits - btScalar m_lowerAngLimit; - btScalar m_upperAngLimit; - // softness, restitution and damping for different cases - // DirLin - moving inside linear limits - // LimLin - hitting linear limit - // DirAng - moving inside angular limits - // LimAng - hitting angular limit - // OrthoLin, OrthoAng - against constraint axis - btScalar m_softnessDirLin; - btScalar m_restitutionDirLin; - btScalar m_dampingDirLin; - btScalar m_cfmDirLin; - - btScalar m_softnessDirAng; - btScalar m_restitutionDirAng; - btScalar m_dampingDirAng; - btScalar m_cfmDirAng; - - btScalar m_softnessLimLin; - btScalar m_restitutionLimLin; - btScalar m_dampingLimLin; - btScalar m_cfmLimLin; - - btScalar m_softnessLimAng; - btScalar m_restitutionLimAng; - btScalar m_dampingLimAng; - btScalar m_cfmLimAng; - - btScalar m_softnessOrthoLin; - btScalar m_restitutionOrthoLin; - btScalar m_dampingOrthoLin; - btScalar m_cfmOrthoLin; - - btScalar m_softnessOrthoAng; - btScalar m_restitutionOrthoAng; - btScalar m_dampingOrthoAng; - btScalar m_cfmOrthoAng; - - // for interlal use - bool m_solveLinLim; - bool m_solveAngLim; - - int m_flags; - - btJacobianEntry m_jacLin[3]; - btScalar m_jacLinDiagABInv[3]; - - btJacobianEntry m_jacAng[3]; - - btScalar m_timeStep; - btTransform m_calculatedTransformA; - btTransform m_calculatedTransformB; - - btVector3 m_sliderAxis; - btVector3 m_realPivotAInW; - btVector3 m_realPivotBInW; - btVector3 m_projPivotInW; - btVector3 m_delta; - btVector3 m_depth; - btVector3 m_relPosA; - btVector3 m_relPosB; - - btScalar m_linPos; - btScalar m_angPos; - - btScalar m_angDepth; - btScalar m_kAngle; - - bool m_poweredLinMotor; - btScalar m_targetLinMotorVelocity; - btScalar m_maxLinMotorForce; - btScalar m_accumulatedLinMotorImpulse; - - bool m_poweredAngMotor; - btScalar m_targetAngMotorVelocity; - btScalar m_maxAngMotorForce; - btScalar m_accumulatedAngMotorImpulse; - - //------------------------ - void initParams(); - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - // constructors - btSliderConstraint(btRigidBody & rbA, btRigidBody & rbB, const btTransform& frameInA, const btTransform& frameInB, bool useLinearReferenceFrameA); - btSliderConstraint(btRigidBody & rbB, const btTransform& frameInB, bool useLinearReferenceFrameA); - - // overrides - - virtual void getInfo1(btConstraintInfo1 * info); - - void getInfo1NonVirtual(btConstraintInfo1 * info); - - virtual void getInfo2(btConstraintInfo2 * info); - - void getInfo2NonVirtual(btConstraintInfo2 * info, const btTransform& transA, const btTransform& transB, const btVector3& linVelA, const btVector3& linVelB, btScalar rbAinvMass, btScalar rbBinvMass); - - // access - const btRigidBody& getRigidBodyA() const { return m_rbA; } - const btRigidBody& getRigidBodyB() const { return m_rbB; } - const btTransform& getCalculatedTransformA() const { return m_calculatedTransformA; } - const btTransform& getCalculatedTransformB() const { return m_calculatedTransformB; } - const btTransform& getFrameOffsetA() const { return m_frameInA; } - const btTransform& getFrameOffsetB() const { return m_frameInB; } - btTransform& getFrameOffsetA() { return m_frameInA; } - btTransform& getFrameOffsetB() { return m_frameInB; } - btScalar getLowerLinLimit() { return m_lowerLinLimit; } - void setLowerLinLimit(btScalar lowerLimit) { m_lowerLinLimit = lowerLimit; } - btScalar getUpperLinLimit() { return m_upperLinLimit; } - void setUpperLinLimit(btScalar upperLimit) { m_upperLinLimit = upperLimit; } - btScalar getLowerAngLimit() { return m_lowerAngLimit; } - void setLowerAngLimit(btScalar lowerLimit) { m_lowerAngLimit = btNormalizeAngle(lowerLimit); } - btScalar getUpperAngLimit() { return m_upperAngLimit; } - void setUpperAngLimit(btScalar upperLimit) { m_upperAngLimit = btNormalizeAngle(upperLimit); } - bool getUseLinearReferenceFrameA() { return m_useLinearReferenceFrameA; } - btScalar getSoftnessDirLin() { return m_softnessDirLin; } - btScalar getRestitutionDirLin() { return m_restitutionDirLin; } - btScalar getDampingDirLin() { return m_dampingDirLin; } - btScalar getSoftnessDirAng() { return m_softnessDirAng; } - btScalar getRestitutionDirAng() { return m_restitutionDirAng; } - btScalar getDampingDirAng() { return m_dampingDirAng; } - btScalar getSoftnessLimLin() { return m_softnessLimLin; } - btScalar getRestitutionLimLin() { return m_restitutionLimLin; } - btScalar getDampingLimLin() { return m_dampingLimLin; } - btScalar getSoftnessLimAng() { return m_softnessLimAng; } - btScalar getRestitutionLimAng() { return m_restitutionLimAng; } - btScalar getDampingLimAng() { return m_dampingLimAng; } - btScalar getSoftnessOrthoLin() { return m_softnessOrthoLin; } - btScalar getRestitutionOrthoLin() { return m_restitutionOrthoLin; } - btScalar getDampingOrthoLin() { return m_dampingOrthoLin; } - btScalar getSoftnessOrthoAng() { return m_softnessOrthoAng; } - btScalar getRestitutionOrthoAng() { return m_restitutionOrthoAng; } - btScalar getDampingOrthoAng() { return m_dampingOrthoAng; } - void setSoftnessDirLin(btScalar softnessDirLin) { m_softnessDirLin = softnessDirLin; } - void setRestitutionDirLin(btScalar restitutionDirLin) { m_restitutionDirLin = restitutionDirLin; } - void setDampingDirLin(btScalar dampingDirLin) { m_dampingDirLin = dampingDirLin; } - void setSoftnessDirAng(btScalar softnessDirAng) { m_softnessDirAng = softnessDirAng; } - void setRestitutionDirAng(btScalar restitutionDirAng) { m_restitutionDirAng = restitutionDirAng; } - void setDampingDirAng(btScalar dampingDirAng) { m_dampingDirAng = dampingDirAng; } - void setSoftnessLimLin(btScalar softnessLimLin) { m_softnessLimLin = softnessLimLin; } - void setRestitutionLimLin(btScalar restitutionLimLin) { m_restitutionLimLin = restitutionLimLin; } - void setDampingLimLin(btScalar dampingLimLin) { m_dampingLimLin = dampingLimLin; } - void setSoftnessLimAng(btScalar softnessLimAng) { m_softnessLimAng = softnessLimAng; } - void setRestitutionLimAng(btScalar restitutionLimAng) { m_restitutionLimAng = restitutionLimAng; } - void setDampingLimAng(btScalar dampingLimAng) { m_dampingLimAng = dampingLimAng; } - void setSoftnessOrthoLin(btScalar softnessOrthoLin) { m_softnessOrthoLin = softnessOrthoLin; } - void setRestitutionOrthoLin(btScalar restitutionOrthoLin) { m_restitutionOrthoLin = restitutionOrthoLin; } - void setDampingOrthoLin(btScalar dampingOrthoLin) { m_dampingOrthoLin = dampingOrthoLin; } - void setSoftnessOrthoAng(btScalar softnessOrthoAng) { m_softnessOrthoAng = softnessOrthoAng; } - void setRestitutionOrthoAng(btScalar restitutionOrthoAng) { m_restitutionOrthoAng = restitutionOrthoAng; } - void setDampingOrthoAng(btScalar dampingOrthoAng) { m_dampingOrthoAng = dampingOrthoAng; } - void setPoweredLinMotor(bool onOff) { m_poweredLinMotor = onOff; } - bool getPoweredLinMotor() { return m_poweredLinMotor; } - void setTargetLinMotorVelocity(btScalar targetLinMotorVelocity) { m_targetLinMotorVelocity = targetLinMotorVelocity; } - btScalar getTargetLinMotorVelocity() { return m_targetLinMotorVelocity; } - void setMaxLinMotorForce(btScalar maxLinMotorForce) { m_maxLinMotorForce = maxLinMotorForce; } - btScalar getMaxLinMotorForce() { return m_maxLinMotorForce; } - void setPoweredAngMotor(bool onOff) { m_poweredAngMotor = onOff; } - bool getPoweredAngMotor() { return m_poweredAngMotor; } - void setTargetAngMotorVelocity(btScalar targetAngMotorVelocity) { m_targetAngMotorVelocity = targetAngMotorVelocity; } - btScalar getTargetAngMotorVelocity() { return m_targetAngMotorVelocity; } - void setMaxAngMotorForce(btScalar maxAngMotorForce) { m_maxAngMotorForce = maxAngMotorForce; } - btScalar getMaxAngMotorForce() { return m_maxAngMotorForce; } - - btScalar getLinearPos() const { return m_linPos; } - btScalar getAngularPos() const { return m_angPos; } - - // access for ODE solver - bool getSolveLinLimit() { return m_solveLinLim; } - btScalar getLinDepth() { return m_depth[0]; } - bool getSolveAngLimit() { return m_solveAngLim; } - btScalar getAngDepth() { return m_angDepth; } - // shared code used by ODE solver - void calculateTransforms(const btTransform& transA, const btTransform& transB); - void testLinLimits(); - void testAngLimits(); - // access for PE Solver - btVector3 getAncorInA(); - btVector3 getAncorInB(); - // access for UseFrameOffset - bool getUseFrameOffset() { return m_useOffsetForConstraintFrame; } - void setUseFrameOffset(bool frameOffsetOnOff) { m_useOffsetForConstraintFrame = frameOffsetOnOff; } - - void setFrames(const btTransform& frameA, const btTransform& frameB) - { - m_frameInA = frameA; - m_frameInB = frameB; - calculateTransforms(m_rbA.getCenterOfMassTransform(), m_rbB.getCenterOfMassTransform()); - buildJacobian(); - } - - ///override the default global value of a parameter (such as ERP or CFM), optionally provide the axis (0..5). - ///If no axis is provided, it uses the default axis for this constraint. - virtual void setParam(int num, btScalar value, int axis = -1); - ///return the local value of parameter - virtual btScalar getParam(int num, int axis = -1) const; - - virtual int getFlags() const - { - return m_flags; - } - - virtual int calculateSerializeBufferSize() const; - - ///fills the dataBuffer and returns the struct name (and 0 on failure) - virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const; -}; - -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 - -struct btSliderConstraintData -{ - btTypedConstraintData m_typeConstraintData; - btTransformFloatData m_rbAFrame; // constraint axii. Assumes z is hinge axis. - btTransformFloatData m_rbBFrame; - - float m_linearUpperLimit; - float m_linearLowerLimit; - - float m_angularUpperLimit; - float m_angularLowerLimit; - - int m_useLinearReferenceFrameA; - int m_useOffsetForConstraintFrame; -}; - -struct btSliderConstraintDoubleData -{ - btTypedConstraintDoubleData m_typeConstraintData; - btTransformDoubleData m_rbAFrame; // constraint axii. Assumes z is hinge axis. - btTransformDoubleData m_rbBFrame; - - double m_linearUpperLimit; - double m_linearLowerLimit; - - double m_angularUpperLimit; - double m_angularLowerLimit; - - int m_useLinearReferenceFrameA; - int m_useOffsetForConstraintFrame; -}; - -SIMD_FORCE_INLINE int btSliderConstraint::calculateSerializeBufferSize() const -{ - return sizeof(btSliderConstraintData2); -} - -///fills the dataBuffer and returns the struct name (and 0 on failure) -SIMD_FORCE_INLINE const char* btSliderConstraint::serialize(void* dataBuffer, btSerializer* serializer) const -{ - btSliderConstraintData2* sliderData = (btSliderConstraintData2*)dataBuffer; - btTypedConstraint::serialize(&sliderData->m_typeConstraintData, serializer); - - m_frameInA.serialize(sliderData->m_rbAFrame); - m_frameInB.serialize(sliderData->m_rbBFrame); - - sliderData->m_linearUpperLimit = m_upperLinLimit; - sliderData->m_linearLowerLimit = m_lowerLinLimit; - - sliderData->m_angularUpperLimit = m_upperAngLimit; - sliderData->m_angularLowerLimit = m_lowerAngLimit; - - sliderData->m_useLinearReferenceFrameA = m_useLinearReferenceFrameA; - sliderData->m_useOffsetForConstraintFrame = m_useOffsetForConstraintFrame; - - return btSliderConstraintDataName; -} - -#endif //BT_SLIDER_CONSTRAINT_H diff --git a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btSolve2LinearConstraint.h b/engine/inc/bullet/BulletDynamics/ConstraintSolver/btSolve2LinearConstraint.h deleted file mode 100644 index fca8ecec..00000000 --- a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btSolve2LinearConstraint.h +++ /dev/null @@ -1,101 +0,0 @@ -/* -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_SOLVE_2LINEAR_CONSTRAINT_H -#define BT_SOLVE_2LINEAR_CONSTRAINT_H - -#include "LinearMath/btMatrix3x3.h" -#include "LinearMath/btVector3.h" - -class btRigidBody; - -/// constraint class used for lateral tyre friction. -class btSolve2LinearConstraint -{ - btScalar m_tau; - btScalar m_damping; - -public: - btSolve2LinearConstraint(btScalar tau, btScalar damping) - { - m_tau = tau; - m_damping = damping; - } - // - // solve unilateral constraint (equality, direct method) - // - void resolveUnilateralPairConstraint( - btRigidBody* body0, - btRigidBody* body1, - - const btMatrix3x3& world2A, - const btMatrix3x3& world2B, - - const btVector3& invInertiaADiag, - const btScalar invMassA, - const btVector3& linvelA, const btVector3& angvelA, - const btVector3& rel_posA1, - const btVector3& invInertiaBDiag, - const btScalar invMassB, - const btVector3& linvelB, const btVector3& angvelB, - const btVector3& rel_posA2, - - btScalar depthA, const btVector3& normalA, - const btVector3& rel_posB1, const btVector3& rel_posB2, - btScalar depthB, const btVector3& normalB, - btScalar& imp0, btScalar& imp1); - - // - // solving 2x2 lcp problem (inequality, direct solution ) - // - void resolveBilateralPairConstraint( - btRigidBody* body0, - btRigidBody* body1, - const btMatrix3x3& world2A, - const btMatrix3x3& world2B, - - const btVector3& invInertiaADiag, - const btScalar invMassA, - const btVector3& linvelA, const btVector3& angvelA, - const btVector3& rel_posA1, - const btVector3& invInertiaBDiag, - const btScalar invMassB, - const btVector3& linvelB, const btVector3& angvelB, - const btVector3& rel_posA2, - - btScalar depthA, const btVector3& normalA, - const btVector3& rel_posB1, const btVector3& rel_posB2, - btScalar depthB, const btVector3& normalB, - btScalar& imp0, btScalar& imp1); - - /* - void resolveAngularConstraint( const btMatrix3x3& invInertiaAWS, - const btScalar invMassA, - const btVector3& linvelA,const btVector3& angvelA, - const btVector3& rel_posA1, - const btMatrix3x3& invInertiaBWS, - const btScalar invMassB, - const btVector3& linvelB,const btVector3& angvelB, - const btVector3& rel_posA2, - - btScalar depthA, const btVector3& normalA, - const btVector3& rel_posB1,const btVector3& rel_posB2, - btScalar depthB, const btVector3& normalB, - btScalar& imp0,btScalar& imp1); - -*/ -}; - -#endif //BT_SOLVE_2LINEAR_CONSTRAINT_H diff --git a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btSolverBody.h b/engine/inc/bullet/BulletDynamics/ConstraintSolver/btSolverBody.h deleted file mode 100644 index 409aa8a0..00000000 --- a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btSolverBody.h +++ /dev/null @@ -1,285 +0,0 @@ -/* -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_SOLVER_BODY_H -#define BT_SOLVER_BODY_H - -class btRigidBody; -#include "LinearMath/btVector3.h" -#include "LinearMath/btMatrix3x3.h" - -#include "LinearMath/btAlignedAllocator.h" -#include "LinearMath/btTransformUtil.h" - -///Until we get other contributions, only use SIMD on Windows, when using Visual Studio 2008 or later, and not double precision -#ifdef BT_USE_SSE -#define USE_SIMD 1 -#endif // - -#ifdef USE_SIMD - -struct btSimdScalar -{ - SIMD_FORCE_INLINE btSimdScalar() - { - } - - SIMD_FORCE_INLINE btSimdScalar(float fl) - : m_vec128(_mm_set1_ps(fl)) - { - } - - SIMD_FORCE_INLINE btSimdScalar(__m128 v128) - : m_vec128(v128) - { - } - union { - __m128 m_vec128; - float m_floats[4]; - int m_ints[4]; - btScalar m_unusedPadding; - }; - SIMD_FORCE_INLINE __m128 get128() - { - return m_vec128; - } - - SIMD_FORCE_INLINE const __m128 get128() const - { - return m_vec128; - } - - SIMD_FORCE_INLINE void set128(__m128 v128) - { - m_vec128 = v128; - } - - SIMD_FORCE_INLINE operator __m128() - { - return m_vec128; - } - SIMD_FORCE_INLINE operator const __m128() const - { - return m_vec128; - } - - SIMD_FORCE_INLINE operator float() const - { - return m_floats[0]; - } -}; - -///@brief Return the elementwise product of two btSimdScalar -SIMD_FORCE_INLINE btSimdScalar -operator*(const btSimdScalar& v1, const btSimdScalar& v2) -{ - return btSimdScalar(_mm_mul_ps(v1.get128(), v2.get128())); -} - -///@brief Return the elementwise product of two btSimdScalar -SIMD_FORCE_INLINE btSimdScalar -operator+(const btSimdScalar& v1, const btSimdScalar& v2) -{ - return btSimdScalar(_mm_add_ps(v1.get128(), v2.get128())); -} - -#else -#define btSimdScalar btScalar -#endif - -///The btSolverBody is an internal datastructure for the constraint solver. Only necessary data is packed to increase cache coherence/performance. -ATTRIBUTE_ALIGNED16(struct) -btSolverBody -{ - BT_DECLARE_ALIGNED_ALLOCATOR(); - btTransform m_worldTransform; - btVector3 m_deltaLinearVelocity; - btVector3 m_deltaAngularVelocity; - btVector3 m_angularFactor; - btVector3 m_linearFactor; - btVector3 m_invMass; - btVector3 m_pushVelocity; - btVector3 m_turnVelocity; - btVector3 m_linearVelocity; - btVector3 m_angularVelocity; - btVector3 m_externalForceImpulse; - btVector3 m_externalTorqueImpulse; - - btRigidBody* m_originalBody; - void setWorldTransform(const btTransform& worldTransform) - { - m_worldTransform = worldTransform; - } - - const btTransform& getWorldTransform() const - { - return m_worldTransform; - } - - SIMD_FORCE_INLINE void getVelocityInLocalPointNoDelta(const btVector3& rel_pos, btVector3& velocity) const - { - if (m_originalBody) - velocity = m_linearVelocity + m_externalForceImpulse + (m_angularVelocity + m_externalTorqueImpulse).cross(rel_pos); - else - velocity.setValue(0, 0, 0); - } - - SIMD_FORCE_INLINE void getVelocityInLocalPointObsolete(const btVector3& rel_pos, btVector3& velocity) const - { - if (m_originalBody) - velocity = m_linearVelocity + m_deltaLinearVelocity + (m_angularVelocity + m_deltaAngularVelocity).cross(rel_pos); - else - velocity.setValue(0, 0, 0); - } - - SIMD_FORCE_INLINE void getAngularVelocity(btVector3 & angVel) const - { - if (m_originalBody) - angVel = m_angularVelocity + m_deltaAngularVelocity; - else - angVel.setValue(0, 0, 0); - } - - //Optimization for the iterative solver: avoid calculating constant terms involving inertia, normal, relative position - SIMD_FORCE_INLINE void applyImpulse(const btVector3& linearComponent, const btVector3& angularComponent, const btScalar impulseMagnitude) - { - if (m_originalBody) - { - m_deltaLinearVelocity += linearComponent * impulseMagnitude * m_linearFactor; - m_deltaAngularVelocity += angularComponent * (impulseMagnitude * m_angularFactor); - } - } - - SIMD_FORCE_INLINE void internalApplyPushImpulse(const btVector3& linearComponent, const btVector3& angularComponent, btScalar impulseMagnitude) - { - if (m_originalBody) - { - m_pushVelocity += linearComponent * impulseMagnitude * m_linearFactor; - m_turnVelocity += angularComponent * (impulseMagnitude * m_angularFactor); - } - } - - const btVector3& getDeltaLinearVelocity() const - { - return m_deltaLinearVelocity; - } - - const btVector3& getDeltaAngularVelocity() const - { - return m_deltaAngularVelocity; - } - - const btVector3& getPushVelocity() const - { - return m_pushVelocity; - } - - const btVector3& getTurnVelocity() const - { - return m_turnVelocity; - } - - //////////////////////////////////////////////// - ///some internal methods, don't use them - - btVector3& internalGetDeltaLinearVelocity() - { - return m_deltaLinearVelocity; - } - - btVector3& internalGetDeltaAngularVelocity() - { - return m_deltaAngularVelocity; - } - - const btVector3& internalGetAngularFactor() const - { - return m_angularFactor; - } - - const btVector3& internalGetInvMass() const - { - return m_invMass; - } - - void internalSetInvMass(const btVector3& invMass) - { - m_invMass = invMass; - } - - btVector3& internalGetPushVelocity() - { - return m_pushVelocity; - } - - btVector3& internalGetTurnVelocity() - { - return m_turnVelocity; - } - - SIMD_FORCE_INLINE void internalGetVelocityInLocalPointObsolete(const btVector3& rel_pos, btVector3& velocity) const - { - velocity = m_linearVelocity + m_deltaLinearVelocity + (m_angularVelocity + m_deltaAngularVelocity).cross(rel_pos); - } - - SIMD_FORCE_INLINE void internalGetAngularVelocity(btVector3 & angVel) const - { - angVel = m_angularVelocity + m_deltaAngularVelocity; - } - - //Optimization for the iterative solver: avoid calculating constant terms involving inertia, normal, relative position - SIMD_FORCE_INLINE void internalApplyImpulse(const btVector3& linearComponent, const btVector3& angularComponent, const btScalar impulseMagnitude) - { - if (m_originalBody) - { - m_deltaLinearVelocity += linearComponent * impulseMagnitude * m_linearFactor; - m_deltaAngularVelocity += angularComponent * (impulseMagnitude * m_angularFactor); - } - } - - void writebackVelocity() - { - if (m_originalBody) - { - m_linearVelocity += m_deltaLinearVelocity; - m_angularVelocity += m_deltaAngularVelocity; - - //m_originalBody->setCompanionId(-1); - } - } - - void writebackVelocityAndTransform(btScalar timeStep, btScalar splitImpulseTurnErp) - { - (void)timeStep; - if (m_originalBody) - { - m_linearVelocity += m_deltaLinearVelocity; - m_angularVelocity += m_deltaAngularVelocity; - - //correct the position/orientation based on push/turn recovery - btTransform newTransform; - if (m_pushVelocity[0] != 0.f || m_pushVelocity[1] != 0 || m_pushVelocity[2] != 0 || m_turnVelocity[0] != 0.f || m_turnVelocity[1] != 0 || m_turnVelocity[2] != 0) - { - // btQuaternion orn = m_worldTransform.getRotation(); - btTransformUtil::integrateTransform(m_worldTransform, m_pushVelocity, m_turnVelocity * splitImpulseTurnErp, timeStep, newTransform); - m_worldTransform = newTransform; - } - //m_worldTransform.setRotation(orn); - //m_originalBody->setCompanionId(-1); - } - } -}; - -#endif //BT_SOLVER_BODY_H diff --git a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btSolverConstraint.h b/engine/inc/bullet/BulletDynamics/ConstraintSolver/btSolverConstraint.h deleted file mode 100644 index c7938df8..00000000 --- a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btSolverConstraint.h +++ /dev/null @@ -1,74 +0,0 @@ -/* -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_SOLVER_CONSTRAINT_H -#define BT_SOLVER_CONSTRAINT_H - -class btRigidBody; -#include "LinearMath/btVector3.h" -#include "LinearMath/btMatrix3x3.h" -#include "btJacobianEntry.h" -#include "LinearMath/btAlignedObjectArray.h" - -//#define NO_FRICTION_TANGENTIALS 1 -#include "btSolverBody.h" - -///1D constraint along a normal axis between bodyA and bodyB. It can be combined to solve contact and friction constraints. -ATTRIBUTE_ALIGNED16(struct) -btSolverConstraint -{ - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btVector3 m_relpos1CrossNormal; - btVector3 m_contactNormal1; - - btVector3 m_relpos2CrossNormal; - btVector3 m_contactNormal2; //usually m_contactNormal2 == -m_contactNormal1, but not always - - btVector3 m_angularComponentA; - btVector3 m_angularComponentB; - - mutable btSimdScalar m_appliedPushImpulse; - mutable btSimdScalar m_appliedImpulse; - - btScalar m_friction; - btScalar m_jacDiagABInv; - btScalar m_rhs; - btScalar m_cfm; - - btScalar m_lowerLimit; - btScalar m_upperLimit; - btScalar m_rhsPenetration; - union { - void* m_originalContactPoint; - btScalar m_unusedPadding4; - int m_numRowsForNonContactConstraint; - }; - - int m_overrideNumSolverIterations; - int m_frictionIndex; - int m_solverBodyIdA; - int m_solverBodyIdB; - - enum btSolverConstraintType - { - BT_SOLVER_CONTACT_1D = 0, - BT_SOLVER_FRICTION_1D - }; -}; - -typedef btAlignedObjectArray btConstraintArray; - -#endif //BT_SOLVER_CONSTRAINT_H diff --git a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btTypedConstraint.h b/engine/inc/bullet/BulletDynamics/ConstraintSolver/btTypedConstraint.h deleted file mode 100644 index d30f3dee..00000000 --- a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btTypedConstraint.h +++ /dev/null @@ -1,532 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2010 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_TYPED_CONSTRAINT_H -#define BT_TYPED_CONSTRAINT_H - -#include "LinearMath/btScalar.h" -#include "btSolverConstraint.h" -#include "BulletDynamics/Dynamics/btRigidBody.h" - -#ifdef BT_USE_DOUBLE_PRECISION -#define btTypedConstraintData2 btTypedConstraintDoubleData -#define btTypedConstraintDataName "btTypedConstraintDoubleData" -#else -#define btTypedConstraintData2 btTypedConstraintFloatData -#define btTypedConstraintDataName "btTypedConstraintFloatData" -#endif //BT_USE_DOUBLE_PRECISION - -class btSerializer; - -//Don't change any of the existing enum values, so add enum types at the end for serialization compatibility -enum btTypedConstraintType -{ - POINT2POINT_CONSTRAINT_TYPE = 3, - HINGE_CONSTRAINT_TYPE, - CONETWIST_CONSTRAINT_TYPE, - D6_CONSTRAINT_TYPE, - SLIDER_CONSTRAINT_TYPE, - CONTACT_CONSTRAINT_TYPE, - D6_SPRING_CONSTRAINT_TYPE, - GEAR_CONSTRAINT_TYPE, - FIXED_CONSTRAINT_TYPE, - D6_SPRING_2_CONSTRAINT_TYPE, - MAX_CONSTRAINT_TYPE -}; - -enum btConstraintParams -{ - BT_CONSTRAINT_ERP = 1, - BT_CONSTRAINT_STOP_ERP, - BT_CONSTRAINT_CFM, - BT_CONSTRAINT_STOP_CFM -}; - -#if 1 -#define btAssertConstrParams(_par) btAssert(_par) -#else -#define btAssertConstrParams(_par) -#endif - -ATTRIBUTE_ALIGNED16(struct) -btJointFeedback -{ - BT_DECLARE_ALIGNED_ALLOCATOR(); - btVector3 m_appliedForceBodyA; - btVector3 m_appliedTorqueBodyA; - btVector3 m_appliedForceBodyB; - btVector3 m_appliedTorqueBodyB; -}; - -///TypedConstraint is the baseclass for Bullet constraints and vehicles -ATTRIBUTE_ALIGNED16(class) -btTypedConstraint : public btTypedObject -{ - int m_userConstraintType; - - union { - int m_userConstraintId; - void* m_userConstraintPtr; - }; - - btScalar m_breakingImpulseThreshold; - bool m_isEnabled; - bool m_needsFeedback; - int m_overrideNumSolverIterations; - - btTypedConstraint& operator=(btTypedConstraint& other) - { - btAssert(0); - (void)other; - return *this; - } - -protected: - btRigidBody& m_rbA; - btRigidBody& m_rbB; - btScalar m_appliedImpulse; - btScalar m_dbgDrawSize; - btJointFeedback* m_jointFeedback; - - ///internal method used by the constraint solver, don't use them directly - btScalar getMotorFactor(btScalar pos, btScalar lowLim, btScalar uppLim, btScalar vel, btScalar timeFact); - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - virtual ~btTypedConstraint(){}; - btTypedConstraint(btTypedConstraintType type, btRigidBody & rbA); - btTypedConstraint(btTypedConstraintType type, btRigidBody & rbA, btRigidBody & rbB); - - struct btConstraintInfo1 - { - int m_numConstraintRows, nub; - }; - - static btRigidBody& getFixedBody(); - - struct btConstraintInfo2 - { - // integrator parameters: frames per second (1/stepsize), default error - // reduction parameter (0..1). - btScalar fps, erp; - - // for the first and second body, pointers to two (linear and angular) - // n*3 jacobian sub matrices, stored by rows. these matrices will have - // been initialized to 0 on entry. if the second body is zero then the - // J2xx pointers may be 0. - btScalar *m_J1linearAxis, *m_J1angularAxis, *m_J2linearAxis, *m_J2angularAxis; - - // elements to jump from one row to the next in J's - int rowskip; - - // right hand sides of the equation J*v = c + cfm * lambda. cfm is the - // "constraint force mixing" vector. c is set to zero on entry, cfm is - // set to a constant value (typically very small or zero) value on entry. - btScalar *m_constraintError, *cfm; - - // lo and hi limits for variables (set to -/+ infinity on entry). - btScalar *m_lowerLimit, *m_upperLimit; - - // number of solver iterations - int m_numIterations; - - //damping of the velocity - btScalar m_damping; - }; - - int getOverrideNumSolverIterations() const - { - return m_overrideNumSolverIterations; - } - - ///override the number of constraint solver iterations used to solve this constraint - ///-1 will use the default number of iterations, as specified in SolverInfo.m_numIterations - void setOverrideNumSolverIterations(int overideNumIterations) - { - m_overrideNumSolverIterations = overideNumIterations; - } - - ///internal method used by the constraint solver, don't use them directly - virtual void buildJacobian(){}; - - ///internal method used by the constraint solver, don't use them directly - virtual void setupSolverConstraint(btConstraintArray & ca, int solverBodyA, int solverBodyB, btScalar timeStep) - { - (void)ca; - (void)solverBodyA; - (void)solverBodyB; - (void)timeStep; - } - - ///internal method used by the constraint solver, don't use them directly - virtual void getInfo1(btConstraintInfo1 * info) = 0; - - ///internal method used by the constraint solver, don't use them directly - virtual void getInfo2(btConstraintInfo2 * info) = 0; - - ///internal method used by the constraint solver, don't use them directly - void internalSetAppliedImpulse(btScalar appliedImpulse) - { - m_appliedImpulse = appliedImpulse; - } - ///internal method used by the constraint solver, don't use them directly - btScalar internalGetAppliedImpulse() - { - return m_appliedImpulse; - } - - btScalar getBreakingImpulseThreshold() const - { - return m_breakingImpulseThreshold; - } - - void setBreakingImpulseThreshold(btScalar threshold) - { - m_breakingImpulseThreshold = threshold; - } - - bool isEnabled() const - { - return m_isEnabled; - } - - void setEnabled(bool enabled) - { - m_isEnabled = enabled; - } - - ///internal method used by the constraint solver, don't use them directly - virtual void solveConstraintObsolete(btSolverBody& /*bodyA*/, btSolverBody& /*bodyB*/, btScalar /*timeStep*/){}; - - const btRigidBody& getRigidBodyA() const - { - return m_rbA; - } - const btRigidBody& getRigidBodyB() const - { - return m_rbB; - } - - btRigidBody& getRigidBodyA() - { - return m_rbA; - } - btRigidBody& getRigidBodyB() - { - return m_rbB; - } - - int getUserConstraintType() const - { - return m_userConstraintType; - } - - void setUserConstraintType(int userConstraintType) - { - m_userConstraintType = userConstraintType; - }; - - void setUserConstraintId(int uid) - { - m_userConstraintId = uid; - } - - int getUserConstraintId() const - { - return m_userConstraintId; - } - - void setUserConstraintPtr(void* ptr) - { - m_userConstraintPtr = ptr; - } - - void* getUserConstraintPtr() - { - return m_userConstraintPtr; - } - - void setJointFeedback(btJointFeedback * jointFeedback) - { - m_jointFeedback = jointFeedback; - } - - const btJointFeedback* getJointFeedback() const - { - return m_jointFeedback; - } - - btJointFeedback* getJointFeedback() - { - return m_jointFeedback; - } - - int getUid() const - { - return m_userConstraintId; - } - - bool needsFeedback() const - { - return m_needsFeedback; - } - - ///enableFeedback will allow to read the applied linear and angular impulse - ///use getAppliedImpulse, getAppliedLinearImpulse and getAppliedAngularImpulse to read feedback information - void enableFeedback(bool needsFeedback) - { - m_needsFeedback = needsFeedback; - } - - ///getAppliedImpulse is an estimated total applied impulse. - ///This feedback could be used to determine breaking constraints or playing sounds. - btScalar getAppliedImpulse() const - { - btAssert(m_needsFeedback); - return m_appliedImpulse; - } - - btTypedConstraintType getConstraintType() const - { - return btTypedConstraintType(m_objectType); - } - - void setDbgDrawSize(btScalar dbgDrawSize) - { - m_dbgDrawSize = dbgDrawSize; - } - btScalar getDbgDrawSize() - { - return m_dbgDrawSize; - } - - ///override the default global value of a parameter (such as ERP or CFM), optionally provide the axis (0..5). - ///If no axis is provided, it uses the default axis for this constraint. - virtual void setParam(int num, btScalar value, int axis = -1) = 0; - - ///return the local value of parameter - virtual btScalar getParam(int num, int axis = -1) const = 0; - - virtual int calculateSerializeBufferSize() const; - - ///fills the dataBuffer and returns the struct name (and 0 on failure) - virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const; -}; - -// returns angle in range [-SIMD_2_PI, SIMD_2_PI], closest to one of the limits -// all arguments should be normalized angles (i.e. in range [-SIMD_PI, SIMD_PI]) -SIMD_FORCE_INLINE btScalar btAdjustAngleToLimits(btScalar angleInRadians, btScalar angleLowerLimitInRadians, btScalar angleUpperLimitInRadians) -{ - if (angleLowerLimitInRadians >= angleUpperLimitInRadians) - { - return angleInRadians; - } - else if (angleInRadians < angleLowerLimitInRadians) - { - btScalar diffLo = btFabs(btNormalizeAngle(angleLowerLimitInRadians - angleInRadians)); - btScalar diffHi = btFabs(btNormalizeAngle(angleUpperLimitInRadians - angleInRadians)); - return (diffLo < diffHi) ? angleInRadians : (angleInRadians + SIMD_2_PI); - } - else if (angleInRadians > angleUpperLimitInRadians) - { - btScalar diffHi = btFabs(btNormalizeAngle(angleInRadians - angleUpperLimitInRadians)); - btScalar diffLo = btFabs(btNormalizeAngle(angleInRadians - angleLowerLimitInRadians)); - return (diffLo < diffHi) ? (angleInRadians - SIMD_2_PI) : angleInRadians; - } - else - { - return angleInRadians; - } -} - -// clang-format off - -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct btTypedConstraintFloatData -{ - btRigidBodyFloatData *m_rbA; - btRigidBodyFloatData *m_rbB; - char *m_name; - - int m_objectType; - int m_userConstraintType; - int m_userConstraintId; - int m_needsFeedback; - - float m_appliedImpulse; - float m_dbgDrawSize; - - int m_disableCollisionsBetweenLinkedBodies; - int m_overrideNumSolverIterations; - - float m_breakingImpulseThreshold; - int m_isEnabled; - -}; - - - -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 - -#define BT_BACKWARDS_COMPATIBLE_SERIALIZATION -#ifdef BT_BACKWARDS_COMPATIBLE_SERIALIZATION -///this structure is not used, except for loading pre-2.82 .bullet files -struct btTypedConstraintData -{ - btRigidBodyData *m_rbA; - btRigidBodyData *m_rbB; - char *m_name; - - int m_objectType; - int m_userConstraintType; - int m_userConstraintId; - int m_needsFeedback; - - float m_appliedImpulse; - float m_dbgDrawSize; - - int m_disableCollisionsBetweenLinkedBodies; - int m_overrideNumSolverIterations; - - float m_breakingImpulseThreshold; - int m_isEnabled; - -}; -#endif //BACKWARDS_COMPATIBLE - -struct btTypedConstraintDoubleData -{ - btRigidBodyDoubleData *m_rbA; - btRigidBodyDoubleData *m_rbB; - char *m_name; - - int m_objectType; - int m_userConstraintType; - int m_userConstraintId; - int m_needsFeedback; - - double m_appliedImpulse; - double m_dbgDrawSize; - - int m_disableCollisionsBetweenLinkedBodies; - int m_overrideNumSolverIterations; - - double m_breakingImpulseThreshold; - int m_isEnabled; - char padding[4]; - -}; - -// clang-format on - -SIMD_FORCE_INLINE int btTypedConstraint::calculateSerializeBufferSize() const -{ - return sizeof(btTypedConstraintData2); -} - -class btAngularLimit -{ -private: - btScalar - m_center, - m_halfRange, - m_softness, - m_biasFactor, - m_relaxationFactor, - m_correction, - m_sign; - - bool - m_solveLimit; - -public: - /// Default constructor initializes limit as inactive, allowing free constraint movement - btAngularLimit() - : m_center(0.0f), - m_halfRange(-1.0f), - m_softness(0.9f), - m_biasFactor(0.3f), - m_relaxationFactor(1.0f), - m_correction(0.0f), - m_sign(0.0f), - m_solveLimit(false) - { - } - - /// Sets all limit's parameters. - /// When low > high limit becomes inactive. - /// When high - low > 2PI limit is ineffective too becouse no angle can exceed the limit - void set(btScalar low, btScalar high, btScalar _softness = 0.9f, btScalar _biasFactor = 0.3f, btScalar _relaxationFactor = 1.0f); - - /// Checks conastaint angle against limit. If limit is active and the angle violates the limit - /// correction is calculated. - void test(const btScalar angle); - - /// Returns limit's softness - inline btScalar getSoftness() const - { - return m_softness; - } - - /// Returns limit's bias factor - inline btScalar getBiasFactor() const - { - return m_biasFactor; - } - - /// Returns limit's relaxation factor - inline btScalar getRelaxationFactor() const - { - return m_relaxationFactor; - } - - /// Returns correction value evaluated when test() was invoked - inline btScalar getCorrection() const - { - return m_correction; - } - - /// Returns sign value evaluated when test() was invoked - inline btScalar getSign() const - { - return m_sign; - } - - /// Gives half of the distance between min and max limit angle - inline btScalar getHalfRange() const - { - return m_halfRange; - } - - /// Returns true when the last test() invocation recognized limit violation - inline bool isLimit() const - { - return m_solveLimit; - } - - /// Checks given angle against limit. If limit is active and angle doesn't fit it, the angle - /// returned is modified so it equals to the limit closest to given angle. - void fit(btScalar& angle) const; - - /// Returns correction value multiplied by sign value - btScalar getError() const; - - btScalar getLow() const; - - btScalar getHigh() const; -}; - -#endif //BT_TYPED_CONSTRAINT_H diff --git a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btUniversalConstraint.h b/engine/inc/bullet/BulletDynamics/ConstraintSolver/btUniversalConstraint.h deleted file mode 100644 index 8c24d93a..00000000 --- a/engine/inc/bullet/BulletDynamics/ConstraintSolver/btUniversalConstraint.h +++ /dev/null @@ -1,59 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org -Copyright (C) 2006, 2007 Sony Computer Entertainment Inc. - -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_UNIVERSAL_CONSTRAINT_H -#define BT_UNIVERSAL_CONSTRAINT_H - -#include "LinearMath/btVector3.h" -#include "btTypedConstraint.h" -#include "btGeneric6DofConstraint.h" - -/// Constraint similar to ODE Universal Joint -/// has 2 rotatioonal degrees of freedom, similar to Euler rotations around Z (axis 1) -/// and Y (axis 2) -/// Description from ODE manual : -/// "Given axis 1 on body 1, and axis 2 on body 2 that is perpendicular to axis 1, it keeps them perpendicular. -/// In other words, rotation of the two bodies about the direction perpendicular to the two axes will be equal." - -ATTRIBUTE_ALIGNED16(class) -btUniversalConstraint : public btGeneric6DofConstraint -{ -protected: - btVector3 m_anchor; - btVector3 m_axis1; - btVector3 m_axis2; - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - // constructor - // anchor, axis1 and axis2 are in world coordinate system - // axis1 must be orthogonal to axis2 - btUniversalConstraint(btRigidBody & rbA, btRigidBody & rbB, const btVector3& anchor, const btVector3& axis1, const btVector3& axis2); - // access - const btVector3& getAnchor() { return m_calculatedTransformA.getOrigin(); } - const btVector3& getAnchor2() { return m_calculatedTransformB.getOrigin(); } - const btVector3& getAxis1() { return m_axis1; } - const btVector3& getAxis2() { return m_axis2; } - btScalar getAngle1() { return getAngle(2); } - btScalar getAngle2() { return getAngle(1); } - // limits - void setUpperLimit(btScalar ang1max, btScalar ang2max) { setAngularUpperLimit(btVector3(0.f, ang1max, ang2max)); } - void setLowerLimit(btScalar ang1min, btScalar ang2min) { setAngularLowerLimit(btVector3(0.f, ang1min, ang2min)); } - - void setAxis(const btVector3& axis1, const btVector3& axis2); -}; - -#endif // BT_UNIVERSAL_CONSTRAINT_H diff --git a/engine/inc/bullet/BulletDynamics/Dynamics/btActionInterface.h b/engine/inc/bullet/BulletDynamics/Dynamics/btActionInterface.h deleted file mode 100644 index b5cac56c..00000000 --- a/engine/inc/bullet/BulletDynamics/Dynamics/btActionInterface.h +++ /dev/null @@ -1,41 +0,0 @@ -/* -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_ACTION_INTERFACE_H -#define _BT_ACTION_INTERFACE_H - -class btIDebugDraw; -class btCollisionWorld; - -#include "LinearMath/btScalar.h" -#include "btRigidBody.h" - -///Basic interface to allow actions such as vehicles and characters to be updated inside a btDynamicsWorld -class btActionInterface -{ -protected: - static btRigidBody& getFixedBody(); - -public: - virtual ~btActionInterface() - { - } - - virtual void updateAction(btCollisionWorld* collisionWorld, btScalar deltaTimeStep) = 0; - - virtual void debugDraw(btIDebugDraw* debugDrawer) = 0; -}; - -#endif //_BT_ACTION_INTERFACE_H diff --git a/engine/inc/bullet/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h b/engine/inc/bullet/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h deleted file mode 100644 index 73607c61..00000000 --- a/engine/inc/bullet/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h +++ /dev/null @@ -1,244 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_DISCRETE_DYNAMICS_WORLD_H -#define BT_DISCRETE_DYNAMICS_WORLD_H - -#include "btDynamicsWorld.h" -class btDispatcher; -class btOverlappingPairCache; -class btConstraintSolver; -class btSimulationIslandManager; -class btTypedConstraint; -class btActionInterface; -class btPersistentManifold; -class btIDebugDraw; - -struct InplaceSolverIslandCallback; - -#include "LinearMath/btAlignedObjectArray.h" -#include "LinearMath/btThreads.h" - -///btDiscreteDynamicsWorld provides discrete rigid body simulation -///those classes replace the obsolete CcdPhysicsEnvironment/CcdPhysicsController -ATTRIBUTE_ALIGNED16(class) -btDiscreteDynamicsWorld : public btDynamicsWorld -{ -protected: - btAlignedObjectArray m_sortedConstraints; - InplaceSolverIslandCallback* m_solverIslandCallback; - - btConstraintSolver* m_constraintSolver; - - btSimulationIslandManager* m_islandManager; - - btAlignedObjectArray m_constraints; - - btAlignedObjectArray m_nonStaticRigidBodies; - - btVector3 m_gravity; - - //for variable timesteps - btScalar m_localTime; - btScalar m_fixedTimeStep; - //for variable timesteps - - bool m_ownsIslandManager; - bool m_ownsConstraintSolver; - bool m_synchronizeAllMotionStates; - bool m_applySpeculativeContactRestitution; - - btAlignedObjectArray m_actions; - - int m_profileTimings; - - bool m_latencyMotionStateInterpolation; - - btAlignedObjectArray m_predictiveManifolds; - btSpinMutex m_predictiveManifoldsMutex; // used to synchronize threads creating predictive contacts - - virtual void predictUnconstraintMotion(btScalar timeStep); - - void integrateTransformsInternal(btRigidBody * *bodies, int numBodies, btScalar timeStep); // can be called in parallel - virtual void integrateTransforms(btScalar timeStep); - - virtual void calculateSimulationIslands(); - - - - virtual void updateActivationState(btScalar timeStep); - - void updateActions(btScalar timeStep); - - void startProfiling(btScalar timeStep); - - virtual void internalSingleStepSimulation(btScalar timeStep); - - void releasePredictiveContacts(); - void createPredictiveContactsInternal(btRigidBody * *bodies, int numBodies, btScalar timeStep); // can be called in parallel - virtual void createPredictiveContacts(btScalar timeStep); - - virtual void saveKinematicState(btScalar timeStep); - - void serializeRigidBodies(btSerializer * serializer); - - void serializeDynamicsWorldInfo(btSerializer * serializer); - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - ///this btDiscreteDynamicsWorld constructor gets created objects from the user, and will not delete those - btDiscreteDynamicsWorld(btDispatcher * dispatcher, btBroadphaseInterface * pairCache, btConstraintSolver * constraintSolver, btCollisionConfiguration * collisionConfiguration); - - virtual ~btDiscreteDynamicsWorld(); - - ///if maxSubSteps > 0, it will interpolate motion between fixedTimeStep's - virtual int stepSimulation(btScalar timeStep, int maxSubSteps = 1, btScalar fixedTimeStep = btScalar(1.) / btScalar(60.)); - - virtual void solveConstraints(btContactSolverInfo & solverInfo); - - virtual void synchronizeMotionStates(); - - ///this can be useful to synchronize a single rigid body -> graphics object - void synchronizeSingleMotionState(btRigidBody * body); - - virtual void addConstraint(btTypedConstraint * constraint, bool disableCollisionsBetweenLinkedBodies = false); - - virtual void removeConstraint(btTypedConstraint * constraint); - - virtual void addAction(btActionInterface*); - - virtual void removeAction(btActionInterface*); - - btSimulationIslandManager* getSimulationIslandManager() - { - return m_islandManager; - } - - const btSimulationIslandManager* getSimulationIslandManager() const - { - return m_islandManager; - } - - btCollisionWorld* getCollisionWorld() - { - return this; - } - - virtual void setGravity(const btVector3& gravity); - - virtual btVector3 getGravity() const; - - virtual void addCollisionObject(btCollisionObject * collisionObject, int collisionFilterGroup = btBroadphaseProxy::StaticFilter, int collisionFilterMask = btBroadphaseProxy::AllFilter ^ btBroadphaseProxy::StaticFilter); - - virtual void addRigidBody(btRigidBody * body); - - virtual void addRigidBody(btRigidBody * body, int group, int mask); - - virtual void removeRigidBody(btRigidBody * body); - - ///removeCollisionObject will first check if it is a rigid body, if so call removeRigidBody otherwise call btCollisionWorld::removeCollisionObject - virtual void removeCollisionObject(btCollisionObject * collisionObject); - - virtual void debugDrawConstraint(btTypedConstraint * constraint); - - virtual void debugDrawWorld(); - - virtual void setConstraintSolver(btConstraintSolver * solver); - - virtual btConstraintSolver* getConstraintSolver(); - - virtual int getNumConstraints() const; - - virtual btTypedConstraint* getConstraint(int index); - - virtual const btTypedConstraint* getConstraint(int index) const; - - virtual btDynamicsWorldType getWorldType() const - { - return BT_DISCRETE_DYNAMICS_WORLD; - } - - ///the forces on each rigidbody is accumulating together with gravity. clear this after each timestep. - virtual void clearForces(); - - ///apply gravity, call this once per timestep - virtual void applyGravity(); - - virtual void setNumTasks(int numTasks) - { - (void)numTasks; - } - - ///obsolete, use updateActions instead - virtual void updateVehicles(btScalar timeStep) - { - updateActions(timeStep); - } - - ///obsolete, use addAction instead - virtual void addVehicle(btActionInterface * vehicle); - ///obsolete, use removeAction instead - virtual void removeVehicle(btActionInterface * vehicle); - ///obsolete, use addAction instead - virtual void addCharacter(btActionInterface * character); - ///obsolete, use removeAction instead - virtual void removeCharacter(btActionInterface * character); - - void setSynchronizeAllMotionStates(bool synchronizeAll) - { - m_synchronizeAllMotionStates = synchronizeAll; - } - bool getSynchronizeAllMotionStates() const - { - return m_synchronizeAllMotionStates; - } - - void setApplySpeculativeContactRestitution(bool enable) - { - m_applySpeculativeContactRestitution = enable; - } - - bool getApplySpeculativeContactRestitution() const - { - return m_applySpeculativeContactRestitution; - } - - ///Preliminary serialization test for Bullet 2.76. Loading those files requires a separate parser (see Bullet/Demos/SerializeDemo) - virtual void serialize(btSerializer * serializer); - - ///Interpolate motion state between previous and current transform, instead of current and next transform. - ///This can relieve discontinuities in the rendering, due to penetrations - void setLatencyMotionStateInterpolation(bool latencyInterpolation) - { - m_latencyMotionStateInterpolation = latencyInterpolation; - } - bool getLatencyMotionStateInterpolation() const - { - return m_latencyMotionStateInterpolation; - } - - btAlignedObjectArray& getNonStaticRigidBodies() - { - return m_nonStaticRigidBodies; - } - - const btAlignedObjectArray& getNonStaticRigidBodies() const - { - return m_nonStaticRigidBodies; - } -}; - -#endif //BT_DISCRETE_DYNAMICS_WORLD_H diff --git a/engine/inc/bullet/BulletDynamics/Dynamics/btDiscreteDynamicsWorldMt.h b/engine/inc/bullet/BulletDynamics/Dynamics/btDiscreteDynamicsWorldMt.h deleted file mode 100644 index dccf35d7..00000000 --- a/engine/inc/bullet/BulletDynamics/Dynamics/btDiscreteDynamicsWorldMt.h +++ /dev/null @@ -1,131 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_DISCRETE_DYNAMICS_WORLD_MT_H -#define BT_DISCRETE_DYNAMICS_WORLD_MT_H - -#include "btDiscreteDynamicsWorld.h" -#include "btSimulationIslandManagerMt.h" -#include "BulletDynamics/ConstraintSolver/btConstraintSolver.h" - -/// -/// btConstraintSolverPoolMt - masquerades as a constraint solver, but really it is a threadsafe pool of them. -/// -/// Each solver in the pool is protected by a mutex. When solveGroup is called from a thread, -/// the pool looks for a solver that isn't being used by another thread, locks it, and dispatches the -/// call to the solver. -/// So long as there are at least as many solvers as there are hardware threads, it should never need to -/// spin wait. -/// -class btConstraintSolverPoolMt : public btConstraintSolver -{ -public: - // create the solvers for me - explicit btConstraintSolverPoolMt(int numSolvers); - - // pass in fully constructed solvers (destructor will delete them) - btConstraintSolverPoolMt(btConstraintSolver** solvers, int numSolvers); - - virtual ~btConstraintSolverPoolMt(); - - ///solve a group of constraints - virtual btScalar solveGroup(btCollisionObject** bodies, - int numBodies, - btPersistentManifold** manifolds, - int numManifolds, - btTypedConstraint** constraints, - int numConstraints, - const btContactSolverInfo& info, - btIDebugDraw* debugDrawer, - btDispatcher* dispatcher) BT_OVERRIDE; - - virtual void reset() BT_OVERRIDE; - virtual btConstraintSolverType getSolverType() const BT_OVERRIDE { return m_solverType; } - -private: - const static size_t kCacheLineSize = 128; - struct ThreadSolver - { - btConstraintSolver* solver; - btSpinMutex mutex; - char _cachelinePadding[kCacheLineSize - sizeof(btSpinMutex) - sizeof(void*)]; // keep mutexes from sharing a cache line - }; - btAlignedObjectArray m_solvers; - btConstraintSolverType m_solverType; - - ThreadSolver* getAndLockThreadSolver(); - void init(btConstraintSolver** solvers, int numSolvers); -}; - -/// -/// btDiscreteDynamicsWorldMt -- a version of DiscreteDynamicsWorld with some minor changes to support -/// solving simulation islands on multiple threads. -/// -/// Should function exactly like btDiscreteDynamicsWorld. -/// Also 3 methods that iterate over all of the rigidbodies can run in parallel: -/// - predictUnconstraintMotion -/// - integrateTransforms -/// - createPredictiveContacts -/// -ATTRIBUTE_ALIGNED16(class) -btDiscreteDynamicsWorldMt : public btDiscreteDynamicsWorld -{ -protected: - btConstraintSolver* m_constraintSolverMt; - - virtual void solveConstraints(btContactSolverInfo & solverInfo) BT_OVERRIDE; - - virtual void predictUnconstraintMotion(btScalar timeStep) BT_OVERRIDE; - - struct UpdaterCreatePredictiveContacts : public btIParallelForBody - { - btScalar timeStep; - btRigidBody** rigidBodies; - btDiscreteDynamicsWorldMt* world; - - void forLoop(int iBegin, int iEnd) const BT_OVERRIDE - { - world->createPredictiveContactsInternal(&rigidBodies[iBegin], iEnd - iBegin, timeStep); - } - }; - virtual void createPredictiveContacts(btScalar timeStep) BT_OVERRIDE; - - struct UpdaterIntegrateTransforms : public btIParallelForBody - { - btScalar timeStep; - btRigidBody** rigidBodies; - btDiscreteDynamicsWorldMt* world; - - void forLoop(int iBegin, int iEnd) const BT_OVERRIDE - { - world->integrateTransformsInternal(&rigidBodies[iBegin], iEnd - iBegin, timeStep); - } - }; - virtual void integrateTransforms(btScalar timeStep) BT_OVERRIDE; - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btDiscreteDynamicsWorldMt(btDispatcher * dispatcher, - btBroadphaseInterface * pairCache, - btConstraintSolverPoolMt * solverPool, // Note this should be a solver-pool for multi-threading - btConstraintSolver * constraintSolverMt, // single multi-threaded solver for large islands (or NULL) - btCollisionConfiguration * collisionConfiguration); - virtual ~btDiscreteDynamicsWorldMt(); - - virtual int stepSimulation(btScalar timeStep, int maxSubSteps, btScalar fixedTimeStep) BT_OVERRIDE; -}; - -#endif //BT_DISCRETE_DYNAMICS_WORLD_H diff --git a/engine/inc/bullet/BulletDynamics/Dynamics/btDynamicsWorld.h b/engine/inc/bullet/BulletDynamics/Dynamics/btDynamicsWorld.h deleted file mode 100644 index 3c55234a..00000000 --- a/engine/inc/bullet/BulletDynamics/Dynamics/btDynamicsWorld.h +++ /dev/null @@ -1,174 +0,0 @@ -/* -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_DYNAMICS_WORLD_H -#define BT_DYNAMICS_WORLD_H - -#include "BulletCollision/CollisionDispatch/btCollisionWorld.h" -#include "BulletDynamics/ConstraintSolver/btContactSolverInfo.h" - -class btTypedConstraint; -class btActionInterface; -class btConstraintSolver; -class btDynamicsWorld; - -/// Type for the callback for each tick -typedef void (*btInternalTickCallback)(btDynamicsWorld* world, btScalar timeStep); - -enum btDynamicsWorldType -{ - BT_SIMPLE_DYNAMICS_WORLD = 1, - BT_DISCRETE_DYNAMICS_WORLD = 2, - BT_CONTINUOUS_DYNAMICS_WORLD = 3, - BT_SOFT_RIGID_DYNAMICS_WORLD = 4, - BT_GPU_DYNAMICS_WORLD = 5, - BT_SOFT_MULTIBODY_DYNAMICS_WORLD = 6, - BT_DEFORMABLE_MULTIBODY_DYNAMICS_WORLD = 7 -}; - -///The btDynamicsWorld is the interface class for several dynamics implementation, basic, discrete, parallel, and continuous etc. -class btDynamicsWorld : public btCollisionWorld -{ -protected: - btInternalTickCallback m_internalTickCallback; - btInternalTickCallback m_internalPreTickCallback; - void* m_worldUserInfo; - - btContactSolverInfo m_solverInfo; - -public: - btDynamicsWorld(btDispatcher* dispatcher, btBroadphaseInterface* broadphase, btCollisionConfiguration* collisionConfiguration) - : btCollisionWorld(dispatcher, broadphase, collisionConfiguration), m_internalTickCallback(0), m_internalPreTickCallback(0), m_worldUserInfo(0) - { - } - - virtual ~btDynamicsWorld() - { - } - - ///stepSimulation proceeds the simulation over 'timeStep', units in preferably in seconds. - ///By default, Bullet will subdivide the timestep in constant substeps of each 'fixedTimeStep'. - ///in order to keep the simulation real-time, the maximum number of substeps can be clamped to 'maxSubSteps'. - ///You can disable subdividing the timestep/substepping by passing maxSubSteps=0 as second argument to stepSimulation, but in that case you have to keep the timeStep constant. - virtual int stepSimulation(btScalar timeStep, int maxSubSteps = 1, btScalar fixedTimeStep = btScalar(1.) / btScalar(60.)) = 0; - - virtual void debugDrawWorld() = 0; - - virtual void addConstraint(btTypedConstraint* constraint, bool disableCollisionsBetweenLinkedBodies = false) - { - (void)constraint; - (void)disableCollisionsBetweenLinkedBodies; - } - - virtual void removeConstraint(btTypedConstraint* constraint) { (void)constraint; } - - virtual void addAction(btActionInterface* action) = 0; - - virtual void removeAction(btActionInterface* action) = 0; - - //once a rigidbody is added to the dynamics world, it will get this gravity assigned - //existing rigidbodies in the world get gravity assigned too, during this method - virtual void setGravity(const btVector3& gravity) = 0; - virtual btVector3 getGravity() const = 0; - - virtual void synchronizeMotionStates() = 0; - - virtual void addRigidBody(btRigidBody* body) = 0; - - virtual void addRigidBody(btRigidBody* body, int group, int mask) = 0; - - virtual void removeRigidBody(btRigidBody* body) = 0; - - virtual void setConstraintSolver(btConstraintSolver* solver) = 0; - - virtual btConstraintSolver* getConstraintSolver() = 0; - - virtual int getNumConstraints() const { return 0; } - - virtual btTypedConstraint* getConstraint(int index) - { - (void)index; - return 0; - } - - virtual const btTypedConstraint* getConstraint(int index) const - { - (void)index; - return 0; - } - - virtual btDynamicsWorldType getWorldType() const = 0; - - virtual void clearForces() = 0; - - /// Set the callback for when an internal tick (simulation substep) happens, optional user info - void setInternalTickCallback(btInternalTickCallback cb, void* worldUserInfo = 0, bool isPreTick = false) - { - if (isPreTick) - { - m_internalPreTickCallback = cb; - } - else - { - m_internalTickCallback = cb; - } - m_worldUserInfo = worldUserInfo; - } - - void setWorldUserInfo(void* worldUserInfo) - { - m_worldUserInfo = worldUserInfo; - } - - void* getWorldUserInfo() const - { - return m_worldUserInfo; - } - - btContactSolverInfo& getSolverInfo() - { - return m_solverInfo; - } - - const btContactSolverInfo& getSolverInfo() const - { - return m_solverInfo; - } - - ///obsolete, use addAction instead. - virtual void addVehicle(btActionInterface* vehicle) { (void)vehicle; } - ///obsolete, use removeAction instead - virtual void removeVehicle(btActionInterface* vehicle) { (void)vehicle; } - ///obsolete, use addAction instead. - virtual void addCharacter(btActionInterface* character) { (void)character; } - ///obsolete, use removeAction instead - virtual void removeCharacter(btActionInterface* character) { (void)character; } -}; - -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct btDynamicsWorldDoubleData -{ - btContactSolverInfoDoubleData m_solverInfo; - btVector3DoubleData m_gravity; -}; - -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct btDynamicsWorldFloatData -{ - btContactSolverInfoFloatData m_solverInfo; - btVector3FloatData m_gravity; -}; - -#endif //BT_DYNAMICS_WORLD_H diff --git a/engine/inc/bullet/BulletDynamics/Dynamics/btRigidBody.h b/engine/inc/bullet/BulletDynamics/Dynamics/btRigidBody.h deleted file mode 100644 index 7442dd1e..00000000 --- a/engine/inc/bullet/BulletDynamics/Dynamics/btRigidBody.h +++ /dev/null @@ -1,687 +0,0 @@ -/* -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_RIGIDBODY_H -#define BT_RIGIDBODY_H - -#include "LinearMath/btAlignedObjectArray.h" -#include "LinearMath/btTransform.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" -#include "BulletCollision/CollisionDispatch/btCollisionObject.h" - -class btCollisionShape; -class btMotionState; -class btTypedConstraint; - -extern btScalar gDeactivationTime; -extern bool gDisableDeactivation; - -#ifdef BT_USE_DOUBLE_PRECISION -#define btRigidBodyData btRigidBodyDoubleData -#define btRigidBodyDataName "btRigidBodyDoubleData" -#else -#define btRigidBodyData btRigidBodyFloatData -#define btRigidBodyDataName "btRigidBodyFloatData" -#endif //BT_USE_DOUBLE_PRECISION - -enum btRigidBodyFlags -{ - BT_DISABLE_WORLD_GRAVITY = 1, - ///BT_ENABLE_GYROPSCOPIC_FORCE flags is enabled by default in Bullet 2.83 and onwards. - ///and it BT_ENABLE_GYROPSCOPIC_FORCE becomes equivalent to BT_ENABLE_GYROSCOPIC_FORCE_IMPLICIT_BODY - ///See Demos/GyroscopicDemo and computeGyroscopicImpulseImplicit - BT_ENABLE_GYROSCOPIC_FORCE_EXPLICIT = 2, - BT_ENABLE_GYROSCOPIC_FORCE_IMPLICIT_WORLD = 4, - BT_ENABLE_GYROSCOPIC_FORCE_IMPLICIT_BODY = 8, - BT_ENABLE_GYROPSCOPIC_FORCE = BT_ENABLE_GYROSCOPIC_FORCE_IMPLICIT_BODY, -}; - -///The btRigidBody is the main class for rigid body objects. It is derived from btCollisionObject, so it keeps a pointer to a btCollisionShape. -///It is recommended for performance and memory use to share btCollisionShape objects whenever possible. -///There are 3 types of rigid bodies: -///- A) Dynamic rigid bodies, with positive mass. Motion is controlled by rigid body dynamics. -///- B) Fixed objects with zero mass. They are not moving (basically collision objects) -///- C) Kinematic objects, which are objects without mass, but the user can move them. There is one-way interaction, and Bullet calculates a velocity based on the timestep and previous and current world transform. -///Bullet automatically deactivates dynamic rigid bodies, when the velocity is below a threshold for a given time. -///Deactivated (sleeping) rigid bodies don't take any processing time, except a minor broadphase collision detection impact (to allow active objects to activate/wake up sleeping objects) -class btRigidBody : public btCollisionObject -{ - btMatrix3x3 m_invInertiaTensorWorld; - btVector3 m_linearVelocity; - btVector3 m_angularVelocity; - btScalar m_inverseMass; - btVector3 m_linearFactor; - - btVector3 m_gravity; - btVector3 m_gravity_acceleration; - btVector3 m_invInertiaLocal; - btVector3 m_totalForce; - btVector3 m_totalTorque; - - btScalar m_linearDamping; - btScalar m_angularDamping; - - bool m_additionalDamping; - btScalar m_additionalDampingFactor; - btScalar m_additionalLinearDampingThresholdSqr; - btScalar m_additionalAngularDampingThresholdSqr; - btScalar m_additionalAngularDampingFactor; - - btScalar m_linearSleepingThreshold; - btScalar m_angularSleepingThreshold; - - //m_optionalMotionState allows to automatic synchronize the world transform for active objects - btMotionState* m_optionalMotionState; - - //keep track of typed constraints referencing this rigid body, to disable collision between linked bodies - btAlignedObjectArray m_constraintRefs; - - int m_rigidbodyFlags; - - int m_debugBodyId; - -protected: - ATTRIBUTE_ALIGNED16(btVector3 m_deltaLinearVelocity); - btVector3 m_deltaAngularVelocity; - btVector3 m_angularFactor; - btVector3 m_invMass; - btVector3 m_pushVelocity; - btVector3 m_turnVelocity; - -public: - ///The btRigidBodyConstructionInfo structure provides information to create a rigid body. Setting mass to zero creates a fixed (non-dynamic) rigid body. - ///For dynamic objects, you can use the collision shape to approximate the local inertia tensor, otherwise use the zero vector (default argument) - ///You can use the motion state to synchronize the world transform between physics and graphics objects. - ///And if the motion state is provided, the rigid body will initialize its initial world transform from the motion state, - ///m_startWorldTransform is only used when you don't provide a motion state. - struct btRigidBodyConstructionInfo - { - btScalar 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. - btMotionState* m_motionState; - btTransform m_startWorldTransform; - - btCollisionShape* m_collisionShape; - btVector3 m_localInertia; - btScalar m_linearDamping; - btScalar m_angularDamping; - - ///best simulation results when friction is non-zero - btScalar m_friction; - ///the m_rollingFriction prevents rounded shapes, such as spheres, cylinders and capsules from rolling forever. - ///See Bullet/Demos/RollingFrictionDemo for usage - btScalar m_rollingFriction; - btScalar m_spinningFriction; //torsional friction around contact normal - - ///best simulation results using zero restitution. - btScalar m_restitution; - - btScalar m_linearSleepingThreshold; - btScalar 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 - bool m_additionalDamping; - btScalar m_additionalDampingFactor; - btScalar m_additionalLinearDampingThresholdSqr; - btScalar m_additionalAngularDampingThresholdSqr; - btScalar m_additionalAngularDampingFactor; - - btRigidBodyConstructionInfo(btScalar mass, btMotionState* motionState, btCollisionShape* collisionShape, const btVector3& localInertia = btVector3(0, 0, 0)) : m_mass(mass), - m_motionState(motionState), - m_collisionShape(collisionShape), - m_localInertia(localInertia), - m_linearDamping(btScalar(0.)), - m_angularDamping(btScalar(0.)), - m_friction(btScalar(0.5)), - m_rollingFriction(btScalar(0)), - m_spinningFriction(btScalar(0)), - m_restitution(btScalar(0.)), - m_linearSleepingThreshold(btScalar(0.8)), - m_angularSleepingThreshold(btScalar(1.f)), - m_additionalDamping(false), - m_additionalDampingFactor(btScalar(0.005)), - m_additionalLinearDampingThresholdSqr(btScalar(0.01)), - m_additionalAngularDampingThresholdSqr(btScalar(0.01)), - m_additionalAngularDampingFactor(btScalar(0.01)) - { - m_startWorldTransform.setIdentity(); - } - }; - - ///btRigidBody constructor using construction info - btRigidBody(const btRigidBodyConstructionInfo& constructionInfo); - - ///btRigidBody constructor for backwards compatibility. - ///To specify friction (etc) during rigid body construction, please use the other constructor (using btRigidBodyConstructionInfo) - btRigidBody(btScalar mass, btMotionState* motionState, btCollisionShape* collisionShape, const btVector3& localInertia = btVector3(0, 0, 0)); - - virtual ~btRigidBody() - { - //No constraints should point to this rigidbody - //Remove constraints from the dynamics world before you delete the related rigidbodies. - btAssert(m_constraintRefs.size() == 0); - } - -protected: - ///setupRigidBody is only used internally by the constructor - void setupRigidBody(const btRigidBodyConstructionInfo& constructionInfo); - -public: - void proceedToTransform(const btTransform& newTrans); - - ///to keep collision detection and dynamics separate we don't store a rigidbody pointer - ///but a rigidbody is derived from btCollisionObject, so we can safely perform an upcast - static const btRigidBody* upcast(const btCollisionObject* colObj) - { - if (colObj->getInternalType() & btCollisionObject::CO_RIGID_BODY) - return (const btRigidBody*)colObj; - return 0; - } - static btRigidBody* upcast(btCollisionObject* colObj) - { - if (colObj->getInternalType() & btCollisionObject::CO_RIGID_BODY) - return (btRigidBody*)colObj; - return 0; - } - - /// continuous collision detection needs prediction - void predictIntegratedTransform(btScalar step, btTransform& predictedTransform); - - void saveKinematicState(btScalar step); - - void applyGravity(); - - void clearGravity(); - - void setGravity(const btVector3& acceleration); - - const btVector3& getGravity() const - { - return m_gravity_acceleration; - } - - void setDamping(btScalar lin_damping, btScalar ang_damping); - - btScalar getLinearDamping() const - { - return m_linearDamping; - } - - btScalar getAngularDamping() const - { - return m_angularDamping; - } - - btScalar getLinearSleepingThreshold() const - { - return m_linearSleepingThreshold; - } - - btScalar getAngularSleepingThreshold() const - { - return m_angularSleepingThreshold; - } - - void applyDamping(btScalar timeStep); - - SIMD_FORCE_INLINE const btCollisionShape* getCollisionShape() const - { - return m_collisionShape; - } - - SIMD_FORCE_INLINE btCollisionShape* getCollisionShape() - { - return m_collisionShape; - } - - void setMassProps(btScalar mass, const btVector3& inertia); - - const btVector3& getLinearFactor() const - { - return m_linearFactor; - } - void setLinearFactor(const btVector3& linearFactor) - { - m_linearFactor = linearFactor; - m_invMass = m_linearFactor * m_inverseMass; - } - btScalar getInvMass() const { return m_inverseMass; } - btScalar getMass() const { return m_inverseMass == btScalar(0.) ? btScalar(0.) : btScalar(1.0) / m_inverseMass; } - const btMatrix3x3& getInvInertiaTensorWorld() const - { - return m_invInertiaTensorWorld; - } - - void integrateVelocities(btScalar step); - - void setCenterOfMassTransform(const btTransform& xform); - - void applyCentralForce(const btVector3& force) - { - m_totalForce += force * m_linearFactor; - } - - const btVector3& getTotalForce() const - { - return m_totalForce; - }; - - const btVector3& getTotalTorque() const - { - return m_totalTorque; - }; - - const btVector3& getInvInertiaDiagLocal() const - { - return m_invInertiaLocal; - }; - - void setInvInertiaDiagLocal(const btVector3& diagInvInertia) - { - m_invInertiaLocal = diagInvInertia; - } - - void setSleepingThresholds(btScalar linear, btScalar angular) - { - m_linearSleepingThreshold = linear; - m_angularSleepingThreshold = angular; - } - - void applyTorque(const btVector3& torque) - { - m_totalTorque += torque * m_angularFactor; - #if defined(BT_CLAMP_VELOCITY_TO) && BT_CLAMP_VELOCITY_TO > 0 - clampVelocity(m_totalTorque); - #endif - } - - void applyForce(const btVector3& force, const btVector3& rel_pos) - { - applyCentralForce(force); - applyTorque(rel_pos.cross(force * m_linearFactor)); - } - - void applyCentralImpulse(const btVector3& impulse) - { - m_linearVelocity += impulse * m_linearFactor * m_inverseMass; - #if defined(BT_CLAMP_VELOCITY_TO) && BT_CLAMP_VELOCITY_TO > 0 - clampVelocity(m_linearVelocity); - #endif - } - - void applyTorqueImpulse(const btVector3& torque) - { - m_angularVelocity += m_invInertiaTensorWorld * torque * m_angularFactor; - #if defined(BT_CLAMP_VELOCITY_TO) && BT_CLAMP_VELOCITY_TO > 0 - clampVelocity(m_angularVelocity); - #endif - } - - void applyImpulse(const btVector3& impulse, const btVector3& rel_pos) - { - if (m_inverseMass != btScalar(0.)) - { - applyCentralImpulse(impulse); - if (m_angularFactor) - { - applyTorqueImpulse(rel_pos.cross(impulse * m_linearFactor)); - } - } - } - - void applyPushImpulse(const btVector3& impulse, const btVector3& rel_pos) - { - if (m_inverseMass != btScalar(0.)) - { - applyCentralPushImpulse(impulse); - if (m_angularFactor) - { - applyTorqueTurnImpulse(rel_pos.cross(impulse * m_linearFactor)); - } - } - } - - btVector3 getPushVelocity() const - { - return m_pushVelocity; - } - - btVector3 getTurnVelocity() const - { - return m_turnVelocity; - } - - void setPushVelocity(const btVector3& v) - { - m_pushVelocity = v; - } - - #if defined(BT_CLAMP_VELOCITY_TO) && BT_CLAMP_VELOCITY_TO > 0 - void clampVelocity(btVector3& v) const { - v.setX( - fmax(-BT_CLAMP_VELOCITY_TO, - fmin(BT_CLAMP_VELOCITY_TO, v.getX())) - ); - v.setY( - fmax(-BT_CLAMP_VELOCITY_TO, - fmin(BT_CLAMP_VELOCITY_TO, v.getY())) - ); - v.setZ( - fmax(-BT_CLAMP_VELOCITY_TO, - fmin(BT_CLAMP_VELOCITY_TO, v.getZ())) - ); - } - #endif - - void setTurnVelocity(const btVector3& v) - { - m_turnVelocity = v; - #if defined(BT_CLAMP_VELOCITY_TO) && BT_CLAMP_VELOCITY_TO > 0 - clampVelocity(m_turnVelocity); - #endif - } - - void applyCentralPushImpulse(const btVector3& impulse) - { - m_pushVelocity += impulse * m_linearFactor * m_inverseMass; - #if defined(BT_CLAMP_VELOCITY_TO) && BT_CLAMP_VELOCITY_TO > 0 - clampVelocity(m_pushVelocity); - #endif - } - - void applyTorqueTurnImpulse(const btVector3& torque) - { - m_turnVelocity += m_invInertiaTensorWorld * torque * m_angularFactor; - #if defined(BT_CLAMP_VELOCITY_TO) && BT_CLAMP_VELOCITY_TO > 0 - clampVelocity(m_turnVelocity); - #endif - } - - void clearForces() - { - m_totalForce.setValue(btScalar(0.0), btScalar(0.0), btScalar(0.0)); - m_totalTorque.setValue(btScalar(0.0), btScalar(0.0), btScalar(0.0)); - } - - void updateInertiaTensor(); - - const btVector3& getCenterOfMassPosition() const - { - return m_worldTransform.getOrigin(); - } - btQuaternion getOrientation() const; - - const btTransform& getCenterOfMassTransform() const - { - return m_worldTransform; - } - const btVector3& getLinearVelocity() const - { - return m_linearVelocity; - } - const btVector3& getAngularVelocity() const - { - return m_angularVelocity; - } - - inline void setLinearVelocity(const btVector3& lin_vel) - { - m_updateRevision++; - m_linearVelocity = lin_vel; - #if defined(BT_CLAMP_VELOCITY_TO) && BT_CLAMP_VELOCITY_TO > 0 - clampVelocity(m_linearVelocity); - #endif - } - - inline void setAngularVelocity(const btVector3& ang_vel) - { - m_updateRevision++; - m_angularVelocity = ang_vel; - #if defined(BT_CLAMP_VELOCITY_TO) && BT_CLAMP_VELOCITY_TO > 0 - clampVelocity(m_angularVelocity); - #endif - } - - btVector3 getVelocityInLocalPoint(const btVector3& rel_pos) const - { - //we also calculate lin/ang velocity for kinematic objects - return m_linearVelocity + m_angularVelocity.cross(rel_pos); - - //for kinematic objects, we could also use use: - // return (m_worldTransform(rel_pos) - m_interpolationWorldTransform(rel_pos)) / m_kinematicTimeStep; - } - - btVector3 getPushVelocityInLocalPoint(const btVector3& rel_pos) const - { - //we also calculate lin/ang velocity for kinematic objects - return m_pushVelocity + m_turnVelocity.cross(rel_pos); - } - - void translate(const btVector3& v) - { - m_worldTransform.getOrigin() += v; - } - - void getAabb(btVector3& aabbMin, btVector3& aabbMax) const; - - SIMD_FORCE_INLINE btScalar computeImpulseDenominator(const btVector3& pos, const btVector3& normal) const - { - btVector3 r0 = pos - getCenterOfMassPosition(); - - btVector3 c0 = (r0).cross(normal); - - btVector3 vec = (c0 * getInvInertiaTensorWorld()).cross(r0); - - return m_inverseMass + normal.dot(vec); - } - - SIMD_FORCE_INLINE btScalar computeAngularImpulseDenominator(const btVector3& axis) const - { - btVector3 vec = axis * getInvInertiaTensorWorld(); - return axis.dot(vec); - } - - SIMD_FORCE_INLINE void updateDeactivation(btScalar timeStep) - { - if ((getActivationState() == ISLAND_SLEEPING) || (getActivationState() == DISABLE_DEACTIVATION)) - return; - - if ((getLinearVelocity().length2() < m_linearSleepingThreshold * m_linearSleepingThreshold) && - (getAngularVelocity().length2() < m_angularSleepingThreshold * m_angularSleepingThreshold)) - { - m_deactivationTime += timeStep; - } - else - { - m_deactivationTime = btScalar(0.); - setActivationState(0); - } - } - - SIMD_FORCE_INLINE bool wantsSleeping() - { - if (getActivationState() == DISABLE_DEACTIVATION) - return false; - - //disable deactivation - if (gDisableDeactivation || (gDeactivationTime == btScalar(0.))) - return false; - - if ((getActivationState() == ISLAND_SLEEPING) || (getActivationState() == WANTS_DEACTIVATION)) - return true; - - if (m_deactivationTime > gDeactivationTime) - { - return true; - } - return false; - } - - const btBroadphaseProxy* getBroadphaseProxy() const - { - return m_broadphaseHandle; - } - btBroadphaseProxy* getBroadphaseProxy() - { - return m_broadphaseHandle; - } - void setNewBroadphaseProxy(btBroadphaseProxy* broadphaseProxy) - { - m_broadphaseHandle = broadphaseProxy; - } - - //btMotionState allows to automatic synchronize the world transform for active objects - btMotionState* getMotionState() - { - return m_optionalMotionState; - } - const btMotionState* getMotionState() const - { - return m_optionalMotionState; - } - void setMotionState(btMotionState* motionState) - { - m_optionalMotionState = motionState; - if (m_optionalMotionState) - motionState->getWorldTransform(m_worldTransform); - } - - //for experimental overriding of friction/contact solver func - int m_contactSolverType; - int m_frictionSolverType; - - void setAngularFactor(const btVector3& angFac) - { - m_updateRevision++; - m_angularFactor = angFac; - } - - void setAngularFactor(btScalar angFac) - { - m_updateRevision++; - m_angularFactor.setValue(angFac, angFac, angFac); - } - const btVector3& getAngularFactor() const - { - return m_angularFactor; - } - - //is this rigidbody added to a btCollisionWorld/btDynamicsWorld/btBroadphase? - bool isInWorld() const - { - return (getBroadphaseProxy() != 0); - } - - void addConstraintRef(btTypedConstraint* c); - void removeConstraintRef(btTypedConstraint* c); - - btTypedConstraint* getConstraintRef(int index) - { - return m_constraintRefs[index]; - } - - int getNumConstraintRefs() const - { - return m_constraintRefs.size(); - } - - void setFlags(int flags) - { - m_rigidbodyFlags = flags; - } - - int getFlags() const - { - return m_rigidbodyFlags; - } - - ///perform implicit force computation in world space - btVector3 computeGyroscopicImpulseImplicit_World(btScalar dt) const; - - ///perform implicit force computation in body space (inertial frame) - btVector3 computeGyroscopicImpulseImplicit_Body(btScalar step) const; - - ///explicit version is best avoided, it gains energy - btVector3 computeGyroscopicForceExplicit(btScalar maxGyroscopicForce) const; - btVector3 getLocalInertia() const; - - /////////////////////////////////////////////// - - virtual int calculateSerializeBufferSize() const; - - ///fills the dataBuffer and returns the struct name (and 0 on failure) - virtual const char* serialize(void* dataBuffer, class btSerializer* serializer) const; - - virtual void serializeSingleObject(class btSerializer* serializer) const; -}; - -//@todo add m_optionalMotionState and m_constraintRefs to btRigidBodyData -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct btRigidBodyFloatData -{ - btCollisionObjectFloatData m_collisionObjectData; - btMatrix3x3FloatData m_invInertiaTensorWorld; - btVector3FloatData m_linearVelocity; - btVector3FloatData m_angularVelocity; - btVector3FloatData m_angularFactor; - btVector3FloatData m_linearFactor; - btVector3FloatData m_gravity; - btVector3FloatData m_gravity_acceleration; - btVector3FloatData m_invInertiaLocal; - btVector3FloatData m_totalForce; - btVector3FloatData m_totalTorque; - float m_inverseMass; - float m_linearDamping; - float m_angularDamping; - float m_additionalDampingFactor; - float m_additionalLinearDampingThresholdSqr; - float m_additionalAngularDampingThresholdSqr; - float m_additionalAngularDampingFactor; - float m_linearSleepingThreshold; - float m_angularSleepingThreshold; - int m_additionalDamping; -}; - -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct btRigidBodyDoubleData -{ - btCollisionObjectDoubleData m_collisionObjectData; - btMatrix3x3DoubleData m_invInertiaTensorWorld; - btVector3DoubleData m_linearVelocity; - btVector3DoubleData m_angularVelocity; - btVector3DoubleData m_angularFactor; - btVector3DoubleData m_linearFactor; - btVector3DoubleData m_gravity; - btVector3DoubleData m_gravity_acceleration; - btVector3DoubleData m_invInertiaLocal; - btVector3DoubleData m_totalForce; - btVector3DoubleData m_totalTorque; - double m_inverseMass; - double m_linearDamping; - double m_angularDamping; - double m_additionalDampingFactor; - double m_additionalLinearDampingThresholdSqr; - double m_additionalAngularDampingThresholdSqr; - double m_additionalAngularDampingFactor; - double m_linearSleepingThreshold; - double m_angularSleepingThreshold; - int m_additionalDamping; - char m_padding[4]; -}; - -#endif //BT_RIGIDBODY_H diff --git a/engine/inc/bullet/BulletDynamics/Dynamics/btSimpleDynamicsWorld.h b/engine/inc/bullet/BulletDynamics/Dynamics/btSimpleDynamicsWorld.h deleted file mode 100644 index 12be231c..00000000 --- a/engine/inc/bullet/BulletDynamics/Dynamics/btSimpleDynamicsWorld.h +++ /dev/null @@ -1,84 +0,0 @@ -/* -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_SIMPLE_DYNAMICS_WORLD_H -#define BT_SIMPLE_DYNAMICS_WORLD_H - -#include "btDynamicsWorld.h" - -class btDispatcher; -class btOverlappingPairCache; -class btConstraintSolver; - -///The btSimpleDynamicsWorld serves as unit-test and to verify more complicated and optimized dynamics worlds. -///Please use btDiscreteDynamicsWorld instead -class btSimpleDynamicsWorld : public btDynamicsWorld -{ -protected: - btConstraintSolver* m_constraintSolver; - - bool m_ownsConstraintSolver; - - void predictUnconstraintMotion(btScalar timeStep); - - void integrateTransforms(btScalar timeStep); - - btVector3 m_gravity; - -public: - ///this btSimpleDynamicsWorld constructor creates dispatcher, broadphase pairCache and constraintSolver - btSimpleDynamicsWorld(btDispatcher* dispatcher, btBroadphaseInterface* pairCache, btConstraintSolver* constraintSolver, btCollisionConfiguration* collisionConfiguration); - - virtual ~btSimpleDynamicsWorld(); - - ///maxSubSteps/fixedTimeStep for interpolation is currently ignored for btSimpleDynamicsWorld, use btDiscreteDynamicsWorld instead - virtual int stepSimulation(btScalar timeStep, int maxSubSteps = 1, btScalar fixedTimeStep = btScalar(1.) / btScalar(60.)); - - virtual void setGravity(const btVector3& gravity); - - virtual btVector3 getGravity() const; - - virtual void addRigidBody(btRigidBody* body); - - virtual void addRigidBody(btRigidBody* body, int group, int mask); - - virtual void removeRigidBody(btRigidBody* body); - - virtual void debugDrawWorld(); - - virtual void addAction(btActionInterface* action); - - virtual void removeAction(btActionInterface* action); - - ///removeCollisionObject will first check if it is a rigid body, if so call removeRigidBody otherwise call btCollisionWorld::removeCollisionObject - virtual void removeCollisionObject(btCollisionObject* collisionObject); - - virtual void updateAabbs(); - - virtual void synchronizeMotionStates(); - - virtual void setConstraintSolver(btConstraintSolver* solver); - - virtual btConstraintSolver* getConstraintSolver(); - - virtual btDynamicsWorldType getWorldType() const - { - return BT_SIMPLE_DYNAMICS_WORLD; - } - - virtual void clearForces(); -}; - -#endif //BT_SIMPLE_DYNAMICS_WORLD_H diff --git a/engine/inc/bullet/BulletDynamics/Dynamics/btSimulationIslandManagerMt.h b/engine/inc/bullet/BulletDynamics/Dynamics/btSimulationIslandManagerMt.h deleted file mode 100644 index ab73a899..00000000 --- a/engine/inc/bullet/BulletDynamics/Dynamics/btSimulationIslandManagerMt.h +++ /dev/null @@ -1,112 +0,0 @@ -/* -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_SIMULATION_ISLAND_MANAGER_MT_H -#define BT_SIMULATION_ISLAND_MANAGER_MT_H - -#include "BulletCollision/CollisionDispatch/btSimulationIslandManager.h" - -class btTypedConstraint; -class btConstraintSolver; -struct btContactSolverInfo; -class btIDebugDraw; - -/// -/// SimulationIslandManagerMt -- Multithread capable version of SimulationIslandManager -/// Splits the world up into islands which can be solved in parallel. -/// In order to solve islands in parallel, an IslandDispatch function -/// must be provided which will dispatch calls to multiple threads. -/// The amount of parallelism that can be achieved depends on the number -/// of islands. If only a single island exists, then no parallelism is -/// possible. -/// -class btSimulationIslandManagerMt : public btSimulationIslandManager -{ -public: - struct Island - { - // a simulation island consisting of bodies, manifolds and constraints, - // to be passed into a constraint solver. - btAlignedObjectArray bodyArray; - btAlignedObjectArray manifoldArray; - btAlignedObjectArray constraintArray; - int id; // island id - bool isSleeping; - - void append(const Island& other); // add bodies, manifolds, constraints to my own - }; - struct SolverParams - { - btConstraintSolver* m_solverPool; - btConstraintSolver* m_solverMt; - btContactSolverInfo* m_solverInfo; - btIDebugDraw* m_debugDrawer; - btDispatcher* m_dispatcher; - }; - static void solveIsland(btConstraintSolver* solver, Island& island, const SolverParams& solverParams); - - typedef void (*IslandDispatchFunc)(btAlignedObjectArray* islands, const SolverParams& solverParams); - static void serialIslandDispatch(btAlignedObjectArray* islandsPtr, const SolverParams& solverParams); - static void parallelIslandDispatch(btAlignedObjectArray* islandsPtr, const SolverParams& solverParams); - -protected: - btAlignedObjectArray m_allocatedIslands; // owner of all Islands - btAlignedObjectArray m_activeIslands; // islands actively in use - btAlignedObjectArray m_freeIslands; // islands ready to be reused - btAlignedObjectArray m_lookupIslandFromId; // big lookup table to map islandId to Island pointer - Island* m_batchIsland; - int m_minimumSolverBatchSize; - int m_batchIslandMinBodyCount; - IslandDispatchFunc m_islandDispatch; - - Island* getIsland(int id); - virtual Island* allocateIsland(int id, int numBodies); - virtual void initIslandPools(); - virtual void addBodiesToIslands(btCollisionWorld* collisionWorld); - virtual void addManifoldsToIslands(btDispatcher* dispatcher); - virtual void addConstraintsToIslands(btAlignedObjectArray& constraints); - virtual void mergeIslands(); - -public: - btSimulationIslandManagerMt(); - virtual ~btSimulationIslandManagerMt(); - - virtual void buildAndProcessIslands(btDispatcher* dispatcher, - btCollisionWorld* collisionWorld, - btAlignedObjectArray& constraints, - const SolverParams& solverParams); - - virtual void buildIslands(btDispatcher* dispatcher, btCollisionWorld* colWorld); - - int getMinimumSolverBatchSize() const - { - return m_minimumSolverBatchSize; - } - void setMinimumSolverBatchSize(int sz) - { - m_minimumSolverBatchSize = sz; - } - IslandDispatchFunc getIslandDispatchFunction() const - { - return m_islandDispatch; - } - // allow users to set their own dispatch function for multithreaded dispatch - void setIslandDispatchFunction(IslandDispatchFunc func) - { - m_islandDispatch = func; - } -}; - -#endif //BT_SIMULATION_ISLAND_MANAGER_H diff --git a/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBody.h b/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBody.h deleted file mode 100644 index 25112a68..00000000 --- a/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBody.h +++ /dev/null @@ -1,934 +0,0 @@ -/* - * PURPOSE: - * Class representing an articulated rigid body. Stores the body's - * current state, allows forces and torques to be set, handles - * timestepping and implements Featherstone's algorithm. - * - * COPYRIGHT: - * Copyright (C) Stephen Thompson, , 2011-2013 - * Portions written By Erwin Coumans: connection to LCP solver, various multibody constraints, replacing Eigen math library by Bullet LinearMath and a dedicated 6x6 matrix inverse (solveImatrix) - * Portions written By Jakub Stepien: support for multi-DOF constraints, introduction of spatial algebra and several other improvements - - 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_MULTIBODY_H -#define BT_MULTIBODY_H - -#include "LinearMath/btScalar.h" -#include "LinearMath/btVector3.h" -#include "LinearMath/btQuaternion.h" -#include "LinearMath/btMatrix3x3.h" -#include "LinearMath/btAlignedObjectArray.h" - -///serialization data, don't change them if you are not familiar with the details of the serialization mechanisms -#ifdef BT_USE_DOUBLE_PRECISION -#define btMultiBodyData btMultiBodyDoubleData -#define btMultiBodyDataName "btMultiBodyDoubleData" -#define btMultiBodyLinkData btMultiBodyLinkDoubleData -#define btMultiBodyLinkDataName "btMultiBodyLinkDoubleData" -#else -#define btMultiBodyData btMultiBodyFloatData -#define btMultiBodyDataName "btMultiBodyFloatData" -#define btMultiBodyLinkData btMultiBodyLinkFloatData -#define btMultiBodyLinkDataName "btMultiBodyLinkFloatData" -#endif //BT_USE_DOUBLE_PRECISION - -#include "btMultiBodyLink.h" -class btMultiBodyLinkCollider; - -ATTRIBUTE_ALIGNED16(class) -btMultiBody -{ -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - // - // initialization - // - - btMultiBody(int n_links, // NOT including the base - btScalar mass, // mass of base - const btVector3 &inertia, // inertia of base, in base frame; assumed diagonal - bool fixedBase, // whether the base is fixed (true) or can move (false) - bool canSleep, bool deprecatedMultiDof = true); - - virtual ~btMultiBody(); - - //note: fixed link collision with parent is always disabled - void setupFixed(int i, //linkIndex - btScalar mass, - const btVector3 &inertia, - int parent, - const btQuaternion &rotParentToThis, - const btVector3 &parentComToThisPivotOffset, - const btVector3 &thisPivotToThisComOffset, bool deprecatedDisableParentCollision = true); - - void setupPrismatic(int i, - btScalar mass, - const btVector3 &inertia, - int parent, - const btQuaternion &rotParentToThis, - const btVector3 &jointAxis, - const btVector3 &parentComToThisPivotOffset, - const btVector3 &thisPivotToThisComOffset, - bool disableParentCollision); - - void setupRevolute(int i, // 0 to num_links-1 - btScalar mass, - const btVector3 &inertia, - int parentIndex, - const btQuaternion &rotParentToThis, // rotate points in parent frame to this frame, when q = 0 - const btVector3 &jointAxis, // in my frame - const btVector3 &parentComToThisPivotOffset, // vector from parent COM to joint axis, in PARENT frame - const btVector3 &thisPivotToThisComOffset, // vector from joint axis to my COM, in MY frame - bool disableParentCollision = false); - - void setupSpherical(int i, // linkIndex, 0 to num_links-1 - btScalar mass, - const btVector3 &inertia, - int parent, - const btQuaternion &rotParentToThis, // rotate points in parent frame to this frame, when q = 0 - const btVector3 &parentComToThisPivotOffset, // vector from parent COM to joint axis, in PARENT frame - const btVector3 &thisPivotToThisComOffset, // vector from joint axis to my COM, in MY frame - bool disableParentCollision = false); - - void setupPlanar(int i, // 0 to num_links-1 - btScalar mass, - const btVector3 &inertia, - int parent, - const btQuaternion &rotParentToThis, // rotate points in parent frame to this frame, when q = 0 - const btVector3 &rotationAxis, - const btVector3 &parentComToThisComOffset, // vector from parent COM to this COM, in PARENT frame - bool disableParentCollision = false); - - const btMultibodyLink &getLink(int index) const - { - return m_links[index]; - } - - btMultibodyLink &getLink(int index) - { - return m_links[index]; - } - - void setBaseCollider(btMultiBodyLinkCollider * collider) //collider can be NULL to disable collision for the base - { - m_baseCollider = collider; - } - const btMultiBodyLinkCollider *getBaseCollider() const - { - return m_baseCollider; - } - btMultiBodyLinkCollider *getBaseCollider() - { - return m_baseCollider; - } - - const btMultiBodyLinkCollider *getLinkCollider(int index) const - { - if (index >= 0 && index < getNumLinks()) - { - return getLink(index).m_collider; - } - return 0; - } - - btMultiBodyLinkCollider *getLinkCollider(int index) - { - if (index >= 0 && index < getNumLinks()) - { - return getLink(index).m_collider; - } - return 0; - } - - // - // get parent - // input: link num from 0 to num_links-1 - // output: link num from 0 to num_links-1, OR -1 to mean the base. - // - int getParent(int link_num) const; - - // - // get number of m_links, masses, moments of inertia - // - - int getNumLinks() const { return m_links.size(); } - int getNumDofs() const { return m_dofCount; } - int getNumPosVars() const { return m_posVarCnt; } - btScalar getBaseMass() const { return m_baseMass; } - const btVector3 &getBaseInertia() const { return m_baseInertia; } - btScalar getLinkMass(int i) const; - const btVector3 &getLinkInertia(int i) const; - - // - // change mass (incomplete: can only change base mass and inertia at present) - // - - void setBaseMass(btScalar mass) { m_baseMass = mass; } - void setBaseInertia(const btVector3 &inertia) { m_baseInertia = inertia; } - - // - // get/set pos/vel/rot/omega for the base link - // - - const btVector3 &getBasePos() const - { - return m_basePos; - } // in world frame - const btVector3 getBaseVel() const - { - return btVector3(m_realBuf[3], m_realBuf[4], m_realBuf[5]); - } // in world frame - const btQuaternion &getWorldToBaseRot() const - { - return m_baseQuat; - } - - const btVector3 &getInterpolateBasePos() const - { - return m_basePos_interpolate; - } // in world frame - const btQuaternion &getInterpolateWorldToBaseRot() const - { - return m_baseQuat_interpolate; - } - - // rotates world vectors into base frame - btVector3 getBaseOmega() const { return btVector3(m_realBuf[0], m_realBuf[1], m_realBuf[2]); } // in world frame - - void setBasePos(const btVector3 &pos) - { - m_basePos = pos; - if(!isBaseKinematic()) - m_basePos_interpolate = pos; - } - - void setInterpolateBasePos(const btVector3 &pos) - { - m_basePos_interpolate = pos; - } - - void setBaseWorldTransform(const btTransform &tr) - { - setBasePos(tr.getOrigin()); - setWorldToBaseRot(tr.getRotation().inverse()); - } - - btTransform getBaseWorldTransform() const - { - btTransform tr; - tr.setOrigin(getBasePos()); - tr.setRotation(getWorldToBaseRot().inverse()); - return tr; - } - - void setInterpolateBaseWorldTransform(const btTransform &tr) - { - setInterpolateBasePos(tr.getOrigin()); - setInterpolateWorldToBaseRot(tr.getRotation().inverse()); - } - - btTransform getInterpolateBaseWorldTransform() const - { - btTransform tr; - tr.setOrigin(getInterpolateBasePos()); - tr.setRotation(getInterpolateWorldToBaseRot().inverse()); - return tr; - } - - void setBaseVel(const btVector3 &vel) - { - m_realBuf[3] = vel[0]; - m_realBuf[4] = vel[1]; - m_realBuf[5] = vel[2]; - } - - void setWorldToBaseRot(const btQuaternion &rot) - { - m_baseQuat = rot; //m_baseQuat asumed to ba alias!? - if(!isBaseKinematic()) - m_baseQuat_interpolate = rot; - } - - void setInterpolateWorldToBaseRot(const btQuaternion &rot) - { - m_baseQuat_interpolate = rot; - } - - void setBaseOmega(const btVector3 &omega) - { - m_realBuf[0] = omega[0]; - m_realBuf[1] = omega[1]; - m_realBuf[2] = omega[2]; - } - - void saveKinematicState(btScalar timeStep); - - // - // get/set pos/vel for child m_links (i = 0 to num_links-1) - // - - btScalar getJointPos(int i) const; - btScalar getJointVel(int i) const; - - btScalar *getJointVelMultiDof(int i); - btScalar *getJointPosMultiDof(int i); - - const btScalar *getJointVelMultiDof(int i) const; - const btScalar *getJointPosMultiDof(int i) const; - - void setJointPos(int i, btScalar q); - void setJointVel(int i, btScalar qdot); - void setJointPosMultiDof(int i, const double *q); - void setJointVelMultiDof(int i, const double *qdot); - void setJointPosMultiDof(int i, const float *q); - void setJointVelMultiDof(int i, const float *qdot); - - // - // direct access to velocities as a vector of 6 + num_links elements. - // (omega first, then v, then joint velocities.) - // - const btScalar *getVelocityVector() const - { - return &m_realBuf[0]; - } - - const btScalar *getDeltaVelocityVector() const - { - return &m_deltaV[0]; - } - - const btScalar *getSplitVelocityVector() const - { - return &m_splitV[0]; - } - /* btScalar * getVelocityVector() - { - return &real_buf[0]; - } - */ - - // - // get the frames of reference (positions and orientations) of the child m_links - // (i = 0 to num_links-1) - // - - const btVector3 &getRVector(int i) const; // vector from COM(parent(i)) to COM(i), in frame i's coords - const btQuaternion &getParentToLocalRot(int i) const; // rotates vectors in frame parent(i) to vectors in frame i. - const btVector3 &getInterpolateRVector(int i) const; // vector from COM(parent(i)) to COM(i), in frame i's coords - const btQuaternion &getInterpolateParentToLocalRot(int i) const; // rotates vectors in frame parent(i) to vectors in frame i. - - // - // transform vectors in local frame of link i to world frame (or vice versa) - // - btVector3 localPosToWorld(int i, const btVector3 &local_pos) const; - btVector3 localDirToWorld(int i, const btVector3 &local_dir) const; - btVector3 worldPosToLocal(int i, const btVector3 &world_pos) const; - btVector3 worldDirToLocal(int i, const btVector3 &world_dir) const; - - // - // transform a frame in local coordinate to a frame in world coordinate - // - btMatrix3x3 localFrameToWorld(int i, const btMatrix3x3 &local_frame) const; - - - // - // set external forces and torques. Note all external forces/torques are given in the WORLD frame. - // - - void clearForcesAndTorques(); - void clearConstraintForces(); - - void clearVelocities(); - - void addBaseForce(const btVector3 &f) - { - m_baseForce += f; - } - void addBaseTorque(const btVector3 &t) { m_baseTorque += t; } - void addLinkForce(int i, const btVector3 &f); - void addLinkTorque(int i, const btVector3 &t); - - void addBaseConstraintForce(const btVector3 &f) - { - m_baseConstraintForce += f; - } - void addBaseConstraintTorque(const btVector3 &t) { m_baseConstraintTorque += t; } - void addLinkConstraintForce(int i, const btVector3 &f); - void addLinkConstraintTorque(int i, const btVector3 &t); - - void addJointTorque(int i, btScalar Q); - void addJointTorqueMultiDof(int i, int dof, btScalar Q); - void addJointTorqueMultiDof(int i, const btScalar *Q); - - const btVector3 &getBaseForce() const { return m_baseForce; } - const btVector3 &getBaseTorque() const { return m_baseTorque; } - const btVector3 &getLinkForce(int i) const; - const btVector3 &getLinkTorque(int i) const; - btScalar getJointTorque(int i) const; - btScalar *getJointTorqueMultiDof(int i); - - // - // dynamics routines. - // - - // timestep the velocities (given the external forces/torques set using addBaseForce etc). - // also sets up caches for calcAccelerationDeltas. - // - // Note: the caller must provide three vectors which are used as - // temporary scratch space. The idea here is to reduce dynamic - // memory allocation: the same scratch vectors can be re-used - // again and again for different Multibodies, instead of each - // btMultiBody allocating (and then deallocating) their own - // individual scratch buffers. This gives a considerable speed - // improvement, at least on Windows (where dynamic memory - // allocation appears to be fairly slow). - // - - void computeAccelerationsArticulatedBodyAlgorithmMultiDof(btScalar dt, - btAlignedObjectArray & scratch_r, - btAlignedObjectArray & scratch_v, - btAlignedObjectArray & scratch_m, - bool isConstraintPass, - bool jointFeedbackInWorldSpace, - bool jointFeedbackInJointFrame - ); - - ///stepVelocitiesMultiDof is deprecated, use computeAccelerationsArticulatedBodyAlgorithmMultiDof instead - //void stepVelocitiesMultiDof(btScalar dt, - // btAlignedObjectArray & scratch_r, - // btAlignedObjectArray & scratch_v, - // btAlignedObjectArray & scratch_m, - // bool isConstraintPass = false) - //{ - // computeAccelerationsArticulatedBodyAlgorithmMultiDof(dt, scratch_r, scratch_v, scratch_m, isConstraintPass, false, false); - //} - - // calcAccelerationDeltasMultiDof - // input: force vector (in same format as jacobian, i.e.: - // 3 torque values, 3 force values, num_links joint torque values) - // output: 3 omegadot values, 3 vdot values, num_links q_double_dot values - // (existing contents of output array are replaced) - // calcAccelerationDeltasMultiDof must have been called first. - void calcAccelerationDeltasMultiDof(const btScalar *force, btScalar *output, - btAlignedObjectArray &scratch_r, - btAlignedObjectArray &scratch_v) const; - - void applyDeltaVeeMultiDof2(const btScalar *delta_vee, btScalar multiplier) - { - for (int dof = 0; dof < 6 + getNumDofs(); ++dof) - { - m_deltaV[dof] += delta_vee[dof] * multiplier; - } - } - void applyDeltaSplitVeeMultiDof(const btScalar *delta_vee, btScalar multiplier) - { - for (int dof = 0; dof < 6 + getNumDofs(); ++dof) - { - m_splitV[dof] += delta_vee[dof] * multiplier; - } - } - void addSplitV() - { - applyDeltaVeeMultiDof(&m_splitV[0], 1); - } - void substractSplitV() - { - applyDeltaVeeMultiDof(&m_splitV[0], -1); - - for (int dof = 0; dof < 6 + getNumDofs(); ++dof) - { - m_splitV[dof] = 0.f; - } - } - void processDeltaVeeMultiDof2() - { - applyDeltaVeeMultiDof(&m_deltaV[0], 1); - - for (int dof = 0; dof < 6 + getNumDofs(); ++dof) - { - m_deltaV[dof] = 0.f; - } - } - - void applyDeltaVeeMultiDof(const btScalar *delta_vee, btScalar multiplier) - { - //for (int dof = 0; dof < 6 + getNumDofs(); ++dof) - // printf("%.4f ", delta_vee[dof]*multiplier); - //printf("\n"); - - //btScalar sum = 0; - //for (int dof = 0; dof < 6 + getNumDofs(); ++dof) - //{ - // sum += delta_vee[dof]*multiplier*delta_vee[dof]*multiplier; - //} - //btScalar l = btSqrt(sum); - - //if (l>m_maxAppliedImpulse) - //{ - // multiplier *= m_maxAppliedImpulse/l; - //} - - for (int dof = 0; dof < 6 + getNumDofs(); ++dof) - { - m_realBuf[dof] += delta_vee[dof] * multiplier; - btClamp(m_realBuf[dof], -m_maxCoordinateVelocity, m_maxCoordinateVelocity); - } - } - - // timestep the positions (given current velocities). - void stepPositionsMultiDof(btScalar dt, btScalar *pq = 0, btScalar *pqd = 0); - - // predict the positions - void predictPositionsMultiDof(btScalar dt); - - // - // contacts - // - - // This routine fills out a contact constraint jacobian for this body. - // the 'normal' supplied must be -n for body1 or +n for body2 of the contact. - // 'normal' & 'contact_point' are both given in world coordinates. - - void fillContactJacobianMultiDof(int link, - const btVector3 &contact_point, - const btVector3 &normal, - btScalar *jac, - btAlignedObjectArray &scratch_r, - btAlignedObjectArray &scratch_v, - btAlignedObjectArray &scratch_m) const { fillConstraintJacobianMultiDof(link, contact_point, btVector3(0, 0, 0), normal, jac, scratch_r, scratch_v, scratch_m); } - - //a more general version of fillContactJacobianMultiDof which does not assume.. - //.. that the constraint in question is contact or, to be more precise, constrains linear velocity only - void fillConstraintJacobianMultiDof(int link, - const btVector3 &contact_point, - const btVector3 &normal_ang, - const btVector3 &normal_lin, - btScalar *jac, - btAlignedObjectArray &scratch_r, - btAlignedObjectArray &scratch_v, - btAlignedObjectArray &scratch_m) const; - - // - // sleeping - // - void setCanSleep(bool canSleep) - { - if (m_canWakeup) - { - m_canSleep = canSleep; - } - } - - bool getCanSleep() const - { - return m_canSleep; - } - - bool getCanWakeup() const - { - return m_canWakeup; - } - - void setCanWakeup(bool canWakeup) - { - m_canWakeup = canWakeup; - } - bool isAwake() const { return m_awake; } - void wakeUp(); - void goToSleep(); - void checkMotionAndSleepIfRequired(btScalar timestep); - - bool hasFixedBase() const; - - bool isBaseKinematic() const; - - bool isBaseStaticOrKinematic() const; - - // set the dynamic type in the base's collision flags. - void setBaseDynamicType(int dynamicType); - - void setFixedBase(bool fixedBase) - { - m_fixedBase = fixedBase; - if(m_fixedBase) - setBaseDynamicType(btCollisionObject::CF_STATIC_OBJECT); - else - setBaseDynamicType(btCollisionObject::CF_DYNAMIC_OBJECT); - } - - int getCompanionId() const - { - return m_companionId; - } - void setCompanionId(int id) - { - //printf("for %p setCompanionId(%d)\n",this, id); - m_companionId = id; - } - - void setNumLinks(int numLinks) //careful: when changing the number of m_links, make sure to re-initialize or update existing m_links - { - m_links.resize(numLinks); - } - - btScalar getLinearDamping() const - { - return m_linearDamping; - } - void setLinearDamping(btScalar damp) - { - m_linearDamping = damp; - } - btScalar getAngularDamping() const - { - return m_angularDamping; - } - void setAngularDamping(btScalar damp) - { - m_angularDamping = damp; - } - - bool getUseGyroTerm() const - { - return m_useGyroTerm; - } - void setUseGyroTerm(bool useGyro) - { - m_useGyroTerm = useGyro; - } - btScalar getMaxCoordinateVelocity() const - { - return m_maxCoordinateVelocity; - } - void setMaxCoordinateVelocity(btScalar maxVel) - { - m_maxCoordinateVelocity = maxVel; - } - - btScalar getMaxAppliedImpulse() const - { - return m_maxAppliedImpulse; - } - void setMaxAppliedImpulse(btScalar maxImp) - { - m_maxAppliedImpulse = maxImp; - } - void setHasSelfCollision(bool hasSelfCollision) - { - m_hasSelfCollision = hasSelfCollision; - } - bool hasSelfCollision() const - { - return m_hasSelfCollision; - } - - void finalizeMultiDof(); - - void useRK4Integration(bool use) { m_useRK4 = use; } - bool isUsingRK4Integration() const { return m_useRK4; } - void useGlobalVelocities(bool use) { m_useGlobalVelocities = use; } - bool isUsingGlobalVelocities() const { return m_useGlobalVelocities; } - - bool isPosUpdated() const - { - return __posUpdated; - } - void setPosUpdated(bool updated) - { - __posUpdated = updated; - } - - //internalNeedsJointFeedback is for internal use only - bool internalNeedsJointFeedback() const - { - return m_internalNeedsJointFeedback; - } - void forwardKinematics(btAlignedObjectArray& world_to_local, btAlignedObjectArray & local_origin); - - void compTreeLinkVelocities(btVector3 * omega, btVector3 * vel) const; - - void updateCollisionObjectWorldTransforms(btAlignedObjectArray & world_to_local, btAlignedObjectArray & local_origin); - void updateCollisionObjectInterpolationWorldTransforms(btAlignedObjectArray & world_to_local, btAlignedObjectArray & local_origin); - - virtual int calculateSerializeBufferSize() const; - - ///fills the dataBuffer and returns the struct name (and 0 on failure) - virtual const char *serialize(void *dataBuffer, class btSerializer *serializer) const; - - const char *getBaseName() const - { - return m_baseName; - } - ///memory of setBaseName needs to be manager by user - void setBaseName(const char *name) - { - m_baseName = name; - } - - ///users can point to their objects, userPointer is not used by Bullet - void *getUserPointer() const - { - return m_userObjectPointer; - } - - int getUserIndex() const - { - return m_userIndex; - } - - int getUserIndex2() const - { - return m_userIndex2; - } - ///users can point to their objects, userPointer is not used by Bullet - void setUserPointer(void *userPointer) - { - m_userObjectPointer = userPointer; - } - - ///users can point to their objects, userPointer is not used by Bullet - void setUserIndex(int index) - { - m_userIndex = index; - } - - void setUserIndex2(int index) - { - m_userIndex2 = index; - } - - static void spatialTransform(const btMatrix3x3 &rotation_matrix, // rotates vectors in 'from' frame to vectors in 'to' frame - const btVector3 &displacement, // vector from origin of 'from' frame to origin of 'to' frame, in 'to' coordinates - const btVector3 &top_in, // top part of input vector - const btVector3 &bottom_in, // bottom part of input vector - btVector3 &top_out, // top part of output vector - btVector3 &bottom_out); // bottom part of output vector - - void setLinkDynamicType(const int i, int type); - - bool isLinkStaticOrKinematic(const int i) const; - - bool isLinkKinematic(const int i) const; - - bool isLinkAndAllAncestorsStaticOrKinematic(const int i) const; - - bool isLinkAndAllAncestorsKinematic(const int i) const; - -private: - btMultiBody(const btMultiBody &); // not implemented - void operator=(const btMultiBody &); // not implemented - - void solveImatrix(const btVector3 &rhs_top, const btVector3 &rhs_bot, btScalar result[6]) const; - void solveImatrix(const btSpatialForceVector &rhs, btSpatialMotionVector &result) const; - - void updateLinksDofOffsets() - { - int dofOffset = 0, cfgOffset = 0; - for (int bidx = 0; bidx < m_links.size(); ++bidx) - { - m_links[bidx].m_dofOffset = dofOffset; - m_links[bidx].m_cfgOffset = cfgOffset; - dofOffset += m_links[bidx].m_dofCount; - cfgOffset += m_links[bidx].m_posVarCount; - } - } - - void mulMatrix(btScalar * pA, btScalar * pB, int rowsA, int colsA, int rowsB, int colsB, btScalar *pC) const; - -private: - btMultiBodyLinkCollider *m_baseCollider; //can be NULL - const char *m_baseName; //memory needs to be manager by user! - - btVector3 m_basePos; // position of COM of base (world frame) - btVector3 m_basePos_interpolate; // position of interpolated COM of base (world frame) - btQuaternion m_baseQuat; // rotates world points into base frame - btQuaternion m_baseQuat_interpolate; - - btScalar m_baseMass; // mass of the base - btVector3 m_baseInertia; // inertia of the base (in local frame; diagonal) - - btVector3 m_baseForce; // external force applied to base. World frame. - btVector3 m_baseTorque; // external torque applied to base. World frame. - - btVector3 m_baseConstraintForce; // external force applied to base. World frame. - btVector3 m_baseConstraintTorque; // external torque applied to base. World frame. - - btAlignedObjectArray m_links; // array of m_links, excluding the base. index from 0 to num_links-1. - - // - // realBuf: - // offset size array - // 0 6 + num_links v (base_omega; base_vel; joint_vels) MULTIDOF [sysdof x sysdof for D matrices (TOO MUCH!) + pos_delta which is sys-cfg sized] - // 6+num_links num_links D - // - // vectorBuf: - // offset size array - // 0 num_links h_top - // num_links num_links h_bottom - // - // matrixBuf: - // offset size array - // 0 num_links+1 rot_from_parent - // - btAlignedObjectArray m_splitV; - btAlignedObjectArray m_deltaV; - btAlignedObjectArray m_realBuf; - btAlignedObjectArray m_vectorBuf; - btAlignedObjectArray m_matrixBuf; - - btMatrix3x3 m_cachedInertiaTopLeft; - btMatrix3x3 m_cachedInertiaTopRight; - btMatrix3x3 m_cachedInertiaLowerLeft; - btMatrix3x3 m_cachedInertiaLowerRight; - bool m_cachedInertiaValid; - - bool m_fixedBase; - - // Sleep parameters. - bool m_awake; - bool m_canSleep; - bool m_canWakeup; - btScalar m_sleepTimer; - - void *m_userObjectPointer; - int m_userIndex2; - int m_userIndex; - - int m_companionId; - btScalar m_linearDamping; - btScalar m_angularDamping; - bool m_useGyroTerm; - btScalar m_maxAppliedImpulse; - btScalar m_maxCoordinateVelocity; - bool m_hasSelfCollision; - - bool __posUpdated; - int m_dofCount, m_posVarCnt; - - bool m_useRK4, m_useGlobalVelocities; - //for global velocities, see 8.3.2B Proposed resolution in Jakub Stepien PhD Thesis - //https://drive.google.com/file/d/0Bz3vEa19XOYGNWdZWGpMdUdqVmZ5ZVBOaEh4ZnpNaUxxZFNV/view?usp=sharing - - ///the m_needsJointFeedback gets updated/computed during the stepVelocitiesMultiDof and it for internal usage only - bool m_internalNeedsJointFeedback; -}; - -struct btMultiBodyLinkDoubleData -{ - btQuaternionDoubleData m_zeroRotParentToThis; - btVector3DoubleData m_parentComToThisPivotOffset; - btVector3DoubleData m_thisPivotToThisComOffset; - btVector3DoubleData m_jointAxisTop[6]; - btVector3DoubleData m_jointAxisBottom[6]; - - btVector3DoubleData m_linkInertia; // inertia of the base (in local frame; diagonal) - btVector3DoubleData m_absFrameTotVelocityTop; - btVector3DoubleData m_absFrameTotVelocityBottom; - btVector3DoubleData m_absFrameLocVelocityTop; - btVector3DoubleData m_absFrameLocVelocityBottom; - - double m_linkMass; - int m_parentIndex; - int m_jointType; - - int m_dofCount; - int m_posVarCount; - double m_jointPos[7]; - double m_jointVel[6]; - double m_jointTorque[6]; - - double m_jointDamping; - double m_jointFriction; - double m_jointLowerLimit; - double m_jointUpperLimit; - double m_jointMaxForce; - double m_jointMaxVelocity; - - char *m_linkName; - char *m_jointName; - btCollisionObjectDoubleData *m_linkCollider; - char *m_paddingPtr; -}; - -struct btMultiBodyLinkFloatData -{ - btQuaternionFloatData m_zeroRotParentToThis; - btVector3FloatData m_parentComToThisPivotOffset; - btVector3FloatData m_thisPivotToThisComOffset; - btVector3FloatData m_jointAxisTop[6]; - btVector3FloatData m_jointAxisBottom[6]; - btVector3FloatData m_linkInertia; // inertia of the base (in local frame; diagonal) - btVector3FloatData m_absFrameTotVelocityTop; - btVector3FloatData m_absFrameTotVelocityBottom; - btVector3FloatData m_absFrameLocVelocityTop; - btVector3FloatData m_absFrameLocVelocityBottom; - - int m_dofCount; - float m_linkMass; - int m_parentIndex; - int m_jointType; - - float m_jointPos[7]; - float m_jointVel[6]; - float m_jointTorque[6]; - int m_posVarCount; - float m_jointDamping; - float m_jointFriction; - float m_jointLowerLimit; - float m_jointUpperLimit; - float m_jointMaxForce; - float m_jointMaxVelocity; - - char *m_linkName; - char *m_jointName; - btCollisionObjectFloatData *m_linkCollider; - char *m_paddingPtr; -}; - -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct btMultiBodyDoubleData -{ - btVector3DoubleData m_baseWorldPosition; - btQuaternionDoubleData m_baseWorldOrientation; - btVector3DoubleData m_baseLinearVelocity; - btVector3DoubleData m_baseAngularVelocity; - btVector3DoubleData m_baseInertia; // inertia of the base (in local frame; diagonal) - double m_baseMass; - int m_numLinks; - char m_padding[4]; - - char *m_baseName; - btMultiBodyLinkDoubleData *m_links; - btCollisionObjectDoubleData *m_baseCollider; -}; - -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct btMultiBodyFloatData -{ - btVector3FloatData m_baseWorldPosition; - btQuaternionFloatData m_baseWorldOrientation; - btVector3FloatData m_baseLinearVelocity; - btVector3FloatData m_baseAngularVelocity; - - btVector3FloatData m_baseInertia; // inertia of the base (in local frame; diagonal) - float m_baseMass; - int m_numLinks; - - char *m_baseName; - btMultiBodyLinkFloatData *m_links; - btCollisionObjectFloatData *m_baseCollider; -}; - -#endif diff --git a/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyConstraint.h b/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyConstraint.h deleted file mode 100644 index 4a6007ee..00000000 --- a/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyConstraint.h +++ /dev/null @@ -1,215 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2013 Erwin Coumans http://bulletphysics.org - -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_MULTIBODY_CONSTRAINT_H -#define BT_MULTIBODY_CONSTRAINT_H - -#include "LinearMath/btScalar.h" -#include "LinearMath/btAlignedObjectArray.h" -#include "btMultiBody.h" - - -//Don't change any of the existing enum values, so add enum types at the end for serialization compatibility -enum btTypedMultiBodyConstraintType -{ - MULTIBODY_CONSTRAINT_LIMIT=3, - MULTIBODY_CONSTRAINT_1DOF_JOINT_MOTOR, - MULTIBODY_CONSTRAINT_GEAR, - MULTIBODY_CONSTRAINT_POINT_TO_POINT, - MULTIBODY_CONSTRAINT_SLIDER, - MULTIBODY_CONSTRAINT_SPHERICAL_MOTOR, - MULTIBODY_CONSTRAINT_FIXED, - - MAX_MULTIBODY_CONSTRAINT_TYPE, -}; - -class btMultiBody; -struct btSolverInfo; - -#include "btMultiBodySolverConstraint.h" - -struct btMultiBodyJacobianData -{ - btAlignedObjectArray m_jacobians; - btAlignedObjectArray m_deltaVelocitiesUnitImpulse; //holds the joint-space response of the corresp. tree to the test impulse in each constraint space dimension - btAlignedObjectArray m_deltaVelocities; //holds joint-space vectors of all the constrained trees accumulating the effect of corrective impulses applied in SI - btAlignedObjectArray scratch_r; - btAlignedObjectArray scratch_v; - btAlignedObjectArray scratch_m; - btAlignedObjectArray* m_solverBodyPool; - int m_fixedBodyId; -}; - -ATTRIBUTE_ALIGNED16(class) -btMultiBodyConstraint -{ -protected: - btMultiBody* m_bodyA; - btMultiBody* m_bodyB; - int m_linkA; - int m_linkB; - - int m_type; //btTypedMultiBodyConstraintType - - int m_numRows; - int m_jacSizeA; - int m_jacSizeBoth; - int m_posOffset; - - bool m_isUnilateral; - int m_numDofsFinalized; - btScalar m_maxAppliedImpulse; - - // warning: the data block lay out is not consistent for all constraints - // data block laid out as follows: - // cached impulses. (one per row.) - // jacobians. (interleaved, row1 body1 then row1 body2 then row2 body 1 etc) - // positions. (one per row.) - btAlignedObjectArray m_data; - - void applyDeltaVee(btMultiBodyJacobianData & data, btScalar * delta_vee, btScalar impulse, int velocityIndex, int ndof); - - btScalar fillMultiBodyConstraint(btMultiBodySolverConstraint & solverConstraint, - btMultiBodyJacobianData & data, - btScalar * jacOrgA, btScalar * jacOrgB, - const btVector3& constraintNormalAng, - - const btVector3& constraintNormalLin, - const btVector3& posAworld, const btVector3& posBworld, - btScalar posError, - const btContactSolverInfo& infoGlobal, - btScalar lowerLimit, btScalar upperLimit, - bool angConstraint = false, - - btScalar relaxation = 1.f, - bool isFriction = false, btScalar desiredVelocity = 0, btScalar cfmSlip = 0); - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btMultiBodyConstraint(btMultiBody * bodyA, btMultiBody * bodyB, int linkA, int linkB, int numRows, bool isUnilateral, int type); - virtual ~btMultiBodyConstraint(); - - void updateJacobianSizes(); - void allocateJacobiansMultiDof(); - - int getConstraintType() const - { - return m_type; - } - //many constraints have setFrameInB/setPivotInB. Will use 'getConstraintType' later. - virtual void setFrameInB(const btMatrix3x3& frameInB) {} - virtual void setPivotInB(const btVector3& pivotInB) {} - - virtual void finalizeMultiDof() = 0; - - virtual int getIslandIdA() const = 0; - virtual int getIslandIdB() const = 0; - - virtual void createConstraintRows(btMultiBodyConstraintArray & constraintRows, - btMultiBodyJacobianData & data, - const btContactSolverInfo& infoGlobal) = 0; - - int getNumRows() const - { - return m_numRows; - } - - btMultiBody* getMultiBodyA() - { - return m_bodyA; - } - btMultiBody* getMultiBodyB() - { - return m_bodyB; - } - - int getLinkA() const - { - return m_linkA; - } - int getLinkB() const - { - return m_linkB; - } - void internalSetAppliedImpulse(int dof, btScalar appliedImpulse) - { - btAssert(dof >= 0); - btAssert(dof < getNumRows()); - m_data[dof] = appliedImpulse; - } - - btScalar getAppliedImpulse(int dof) - { - btAssert(dof >= 0); - btAssert(dof < getNumRows()); - return m_data[dof]; - } - // current constraint position - // constraint is pos >= 0 for unilateral, or pos = 0 for bilateral - // NOTE: ignored position for friction rows. - btScalar getPosition(int row) const - { - return m_data[m_posOffset + row]; - } - - void setPosition(int row, btScalar pos) - { - m_data[m_posOffset + row] = pos; - } - - bool isUnilateral() const - { - return m_isUnilateral; - } - - // jacobian blocks. - // each of size 6 + num_links. (jacobian2 is null if no body2.) - // format: 3 'omega' coefficients, 3 'v' coefficients, then the 'qdot' coefficients. - btScalar* jacobianA(int row) - { - return &m_data[m_numRows + row * m_jacSizeBoth]; - } - const btScalar* jacobianA(int row) const - { - return &m_data[m_numRows + (row * m_jacSizeBoth)]; - } - btScalar* jacobianB(int row) - { - return &m_data[m_numRows + (row * m_jacSizeBoth) + m_jacSizeA]; - } - const btScalar* jacobianB(int row) const - { - return &m_data[m_numRows + (row * m_jacSizeBoth) + m_jacSizeA]; - } - - btScalar getMaxAppliedImpulse() const - { - return m_maxAppliedImpulse; - } - void setMaxAppliedImpulse(btScalar maxImp) - { - m_maxAppliedImpulse = maxImp; - } - - virtual void debugDraw(class btIDebugDraw * drawer) = 0; - - virtual void setGearRatio(btScalar ratio) {} - virtual void setGearAuxLink(int gearAuxLink) {} - virtual void setRelativePositionTarget(btScalar relPosTarget) {} - virtual void setErp(btScalar erp) {} -}; - -#endif //BT_MULTIBODY_CONSTRAINT_H diff --git a/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyConstraintSolver.h b/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyConstraintSolver.h deleted file mode 100644 index f584360e..00000000 --- a/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyConstraintSolver.h +++ /dev/null @@ -1,101 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2013 Erwin Coumans http://bulletphysics.org - -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_MULTIBODY_CONSTRAINT_SOLVER_H -#define BT_MULTIBODY_CONSTRAINT_SOLVER_H - -#include "BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h" -#include "btMultiBodySolverConstraint.h" - -#define DIRECTLY_UPDATE_VELOCITY_DURING_SOLVER_ITERATIONS - -class btMultiBody; - -#include "btMultiBodyConstraint.h" - -ATTRIBUTE_ALIGNED16(class) -btMultiBodyConstraintSolver : public btSequentialImpulseConstraintSolver -{ -protected: - btMultiBodyConstraintArray m_multiBodyNonContactConstraints; - - btMultiBodyConstraintArray m_multiBodyNormalContactConstraints; - btMultiBodyConstraintArray m_multiBodyFrictionContactConstraints; - btMultiBodyConstraintArray m_multiBodyTorsionalFrictionContactConstraints; - btMultiBodyConstraintArray m_multiBodySpinningFrictionContactConstraints; - - btMultiBodyJacobianData m_data; - - //temp storage for multi body constraints for a specific island/group called by 'solveGroup' - btMultiBodyConstraint** m_tmpMultiBodyConstraints; - int m_tmpNumMultiBodyConstraints; - - btScalar resolveSingleConstraintRowGeneric(const btMultiBodySolverConstraint& c); - - //solve 2 friction directions and clamp against the implicit friction cone - btScalar resolveConeFrictionConstraintRows(const btMultiBodySolverConstraint& cA1, const btMultiBodySolverConstraint& cB); - - void convertContacts(btPersistentManifold * *manifoldPtr, int numManifolds, const btContactSolverInfo& infoGlobal); - - btMultiBodySolverConstraint& addMultiBodyFrictionConstraint(const btVector3& normalAxis, const btScalar& appliedImpulse, btPersistentManifold* manifold, int frictionIndex, btManifoldPoint& cp, btCollisionObject* colObj0, btCollisionObject* colObj1, btScalar relaxation, const btContactSolverInfo& infoGlobal, btScalar desiredVelocity = 0, btScalar cfmSlip = 0); - - btMultiBodySolverConstraint& addMultiBodyTorsionalFrictionConstraint(const btVector3& normalAxis, btPersistentManifold* manifold, int frictionIndex, btManifoldPoint& cp, - btScalar combinedTorsionalFriction, - btCollisionObject* colObj0, btCollisionObject* colObj1, btScalar relaxation, const btContactSolverInfo& infoGlobal, btScalar desiredVelocity = 0, btScalar cfmSlip = 0); - - btMultiBodySolverConstraint& addMultiBodySpinningFrictionConstraint(const btVector3& normalAxis, btPersistentManifold* manifold, int frictionIndex, btManifoldPoint& cp, - btScalar combinedTorsionalFriction, - btCollisionObject* colObj0, btCollisionObject* colObj1, btScalar relaxation, const btContactSolverInfo& infoGlobal, btScalar desiredVelocity = 0, btScalar cfmSlip = 0); - - void setupMultiBodyJointLimitConstraint(btMultiBodySolverConstraint & constraintRow, - btScalar * jacA, btScalar * jacB, - btScalar penetration, btScalar combinedFrictionCoeff, btScalar combinedRestitutionCoeff, - const btContactSolverInfo& infoGlobal); - - void setupMultiBodyContactConstraint(btMultiBodySolverConstraint & solverConstraint, - const btVector3& contactNormal, - const btScalar& appliedImpulse, - btManifoldPoint& cp, - const btContactSolverInfo& infoGlobal, - btScalar& relaxation, - bool isFriction, btScalar desiredVelocity = 0, btScalar cfmSlip = 0); - - //either rolling or spinning friction - void setupMultiBodyTorsionalFrictionConstraint(btMultiBodySolverConstraint & solverConstraint, - const btVector3& contactNormal, - btManifoldPoint& cp, - btScalar combinedTorsionalFriction, - const btContactSolverInfo& infoGlobal, - btScalar& relaxation, - bool isFriction, btScalar desiredVelocity = 0, btScalar cfmSlip = 0); - - void convertMultiBodyContact(btPersistentManifold * manifold, const btContactSolverInfo& infoGlobal); - virtual btScalar solveGroupCacheFriendlySetup(btCollisionObject * *bodies, int numBodies, btPersistentManifold** manifoldPtr, int numManifolds, btTypedConstraint** constraints, int numConstraints, const btContactSolverInfo& infoGlobal, btIDebugDraw* debugDrawer); - // virtual btScalar solveGroupCacheFriendlyIterations(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer); - virtual btScalar solveSingleIteration(int iteration, btCollisionObject** bodies, int numBodies, btPersistentManifold** manifoldPtr, int numManifolds, btTypedConstraint** constraints, int numConstraints, const btContactSolverInfo& infoGlobal, btIDebugDraw* debugDrawer); - void applyDeltaVee(btScalar * deltaV, btScalar impulse, int velocityIndex, int ndof); - void writeBackSolverBodyToMultiBody(btMultiBodySolverConstraint & constraint, btScalar deltaTime); - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - ///this method should not be called, it was just used during porting/integration of Featherstone btMultiBody, providing backwards compatibility but no support for btMultiBodyConstraint (only contact constraints) - virtual btScalar solveGroup(btCollisionObject * *bodies, int numBodies, btPersistentManifold** manifold, int numManifolds, btTypedConstraint** constraints, int numConstraints, const btContactSolverInfo& info, btIDebugDraw* debugDrawer, btDispatcher* dispatcher); - virtual btScalar solveGroupCacheFriendlyFinish(btCollisionObject * *bodies, int numBodies, const btContactSolverInfo& infoGlobal); - - virtual void solveMultiBodyGroup(btCollisionObject * *bodies, int numBodies, btPersistentManifold** manifold, int numManifolds, btTypedConstraint** constraints, int numConstraints, btMultiBodyConstraint** multiBodyConstraints, int numMultiBodyConstraints, const btContactSolverInfo& info, btIDebugDraw* debugDrawer, btDispatcher* dispatcher); -}; - -#endif //BT_MULTIBODY_CONSTRAINT_SOLVER_H diff --git a/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyDynamicsWorld.h b/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyDynamicsWorld.h deleted file mode 100644 index d2d76c8b..00000000 --- a/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyDynamicsWorld.h +++ /dev/null @@ -1,126 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2013 Erwin Coumans http://bulletphysics.org - -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_MULTIBODY_DYNAMICS_WORLD_H -#define BT_MULTIBODY_DYNAMICS_WORLD_H - -#include "BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h" -#include "BulletDynamics/Featherstone/btMultiBodyInplaceSolverIslandCallback.h" - -#define BT_USE_VIRTUAL_CLEARFORCES_AND_GRAVITY - -class btMultiBody; -class btMultiBodyConstraint; -class btMultiBodyConstraintSolver; -struct MultiBodyInplaceSolverIslandCallback; - -///The btMultiBodyDynamicsWorld adds Featherstone multi body dynamics to Bullet -///This implementation is still preliminary/experimental. -class btMultiBodyDynamicsWorld : public btDiscreteDynamicsWorld -{ -protected: - btAlignedObjectArray m_multiBodies; - btAlignedObjectArray m_multiBodyConstraints; - btAlignedObjectArray m_sortedMultiBodyConstraints; - btMultiBodyConstraintSolver* m_multiBodyConstraintSolver; - MultiBodyInplaceSolverIslandCallback* m_solverMultiBodyIslandCallback; - - //cached data to avoid memory allocations - btAlignedObjectArray m_scratch_world_to_local; - btAlignedObjectArray m_scratch_local_origin; - btAlignedObjectArray m_scratch_world_to_local1; - btAlignedObjectArray m_scratch_local_origin1; - btAlignedObjectArray m_scratch_r; - btAlignedObjectArray m_scratch_v; - btAlignedObjectArray m_scratch_m; - - virtual void calculateSimulationIslands(); - virtual void updateActivationState(btScalar timeStep); - - - virtual void serializeMultiBodies(btSerializer* serializer); - -public: - btMultiBodyDynamicsWorld(btDispatcher* dispatcher, btBroadphaseInterface* pairCache, btMultiBodyConstraintSolver* constraintSolver, btCollisionConfiguration* collisionConfiguration); - - virtual ~btMultiBodyDynamicsWorld(); - - virtual void solveConstraints(btContactSolverInfo& solverInfo); - - virtual void addMultiBody(btMultiBody* body, int group = btBroadphaseProxy::DefaultFilter, int mask = btBroadphaseProxy::AllFilter); - - virtual void removeMultiBody(btMultiBody* body); - - virtual int getNumMultibodies() const - { - return m_multiBodies.size(); - } - - btMultiBody* getMultiBody(int mbIndex) - { - return m_multiBodies[mbIndex]; - } - - const btMultiBody* getMultiBody(int mbIndex) const - { - return m_multiBodies[mbIndex]; - } - - virtual void addMultiBodyConstraint(btMultiBodyConstraint* constraint); - - virtual int getNumMultiBodyConstraints() const - { - return m_multiBodyConstraints.size(); - } - - virtual btMultiBodyConstraint* getMultiBodyConstraint(int constraintIndex) - { - return m_multiBodyConstraints[constraintIndex]; - } - - virtual const btMultiBodyConstraint* getMultiBodyConstraint(int constraintIndex) const - { - return m_multiBodyConstraints[constraintIndex]; - } - - virtual void removeMultiBodyConstraint(btMultiBodyConstraint* constraint); - - virtual void integrateTransforms(btScalar timeStep); - void integrateMultiBodyTransforms(btScalar timeStep); - void predictMultiBodyTransforms(btScalar timeStep); - - virtual void predictUnconstraintMotion(btScalar timeStep); - virtual void debugDrawWorld(); - - virtual void debugDrawMultiBodyConstraint(btMultiBodyConstraint* constraint); - - void forwardKinematics(); - virtual void clearForces(); - virtual void clearMultiBodyConstraintForces(); - virtual void clearMultiBodyForces(); - virtual void applyGravity(); - - virtual void serialize(btSerializer* serializer); - virtual void setMultiBodyConstraintSolver(btMultiBodyConstraintSolver* solver); - virtual void setConstraintSolver(btConstraintSolver* solver); - virtual void getAnalyticsData(btAlignedObjectArray& m_islandAnalyticsData) const; - - virtual void solveExternalForces(btContactSolverInfo& solverInfo); - virtual void solveInternalConstraints(btContactSolverInfo& solverInfo); - void buildIslands(); - - virtual void saveKinematicState(btScalar timeStep); -}; -#endif //BT_MULTIBODY_DYNAMICS_WORLD_H diff --git a/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyFixedConstraint.h b/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyFixedConstraint.h deleted file mode 100644 index adb1cb47..00000000 --- a/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyFixedConstraint.h +++ /dev/null @@ -1,91 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2013 Erwin Coumans http://bulletphysics.org - -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 file was written by Erwin Coumans - -#ifndef BT_MULTIBODY_FIXED_CONSTRAINT_H -#define BT_MULTIBODY_FIXED_CONSTRAINT_H - -#include "btMultiBodyConstraint.h" - -class btMultiBodyFixedConstraint : public btMultiBodyConstraint -{ -protected: - btRigidBody* m_rigidBodyA; - btRigidBody* m_rigidBodyB; - btVector3 m_pivotInA; - btVector3 m_pivotInB; - btMatrix3x3 m_frameInA; - btMatrix3x3 m_frameInB; - -public: - btMultiBodyFixedConstraint(btMultiBody* body, int link, btRigidBody* bodyB, const btVector3& pivotInA, const btVector3& pivotInB, const btMatrix3x3& frameInA, const btMatrix3x3& frameInB); - btMultiBodyFixedConstraint(btMultiBody* bodyA, int linkA, btMultiBody* bodyB, int linkB, const btVector3& pivotInA, const btVector3& pivotInB, const btMatrix3x3& frameInA, const btMatrix3x3& frameInB); - - virtual ~btMultiBodyFixedConstraint(); - - virtual void finalizeMultiDof(); - - virtual int getIslandIdA() const; - virtual int getIslandIdB() const; - - virtual void createConstraintRows(btMultiBodyConstraintArray& constraintRows, - btMultiBodyJacobianData& data, - const btContactSolverInfo& infoGlobal); - - const btVector3& getPivotInA() const - { - return m_pivotInA; - } - - void setPivotInA(const btVector3& pivotInA) - { - m_pivotInA = pivotInA; - } - - const btVector3& getPivotInB() const - { - return m_pivotInB; - } - - virtual void setPivotInB(const btVector3& pivotInB) - { - m_pivotInB = pivotInB; - } - - const btMatrix3x3& getFrameInA() const - { - return m_frameInA; - } - - void setFrameInA(const btMatrix3x3& frameInA) - { - m_frameInA = frameInA; - } - - const btMatrix3x3& getFrameInB() const - { - return m_frameInB; - } - - virtual void setFrameInB(const btMatrix3x3& frameInB) - { - m_frameInB = frameInB; - } - - virtual void debugDraw(class btIDebugDraw* drawer); -}; - -#endif //BT_MULTIBODY_FIXED_CONSTRAINT_H diff --git a/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyGearConstraint.h b/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyGearConstraint.h deleted file mode 100644 index 31888fbc..00000000 --- a/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyGearConstraint.h +++ /dev/null @@ -1,115 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2013 Erwin Coumans http://bulletphysics.org - -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 file was written by Erwin Coumans - -#ifndef BT_MULTIBODY_GEAR_CONSTRAINT_H -#define BT_MULTIBODY_GEAR_CONSTRAINT_H - -#include "btMultiBodyConstraint.h" - -class btMultiBodyGearConstraint : public btMultiBodyConstraint -{ -protected: - btRigidBody* m_rigidBodyA; - btRigidBody* m_rigidBodyB; - btVector3 m_pivotInA; - btVector3 m_pivotInB; - btMatrix3x3 m_frameInA; - btMatrix3x3 m_frameInB; - btScalar m_gearRatio; - int m_gearAuxLink; - btScalar m_erp; - btScalar m_relativePositionTarget; - -public: - //btMultiBodyGearConstraint(btMultiBody* body, int link, btRigidBody* bodyB, const btVector3& pivotInA, const btVector3& pivotInB, const btMatrix3x3& frameInA, const btMatrix3x3& frameInB); - btMultiBodyGearConstraint(btMultiBody* bodyA, int linkA, btMultiBody* bodyB, int linkB, const btVector3& pivotInA, const btVector3& pivotInB, const btMatrix3x3& frameInA, const btMatrix3x3& frameInB); - - virtual ~btMultiBodyGearConstraint(); - - virtual void finalizeMultiDof(); - - virtual int getIslandIdA() const; - virtual int getIslandIdB() const; - - virtual void createConstraintRows(btMultiBodyConstraintArray& constraintRows, - btMultiBodyJacobianData& data, - const btContactSolverInfo& infoGlobal); - - const btVector3& getPivotInA() const - { - return m_pivotInA; - } - - void setPivotInA(const btVector3& pivotInA) - { - m_pivotInA = pivotInA; - } - - const btVector3& getPivotInB() const - { - return m_pivotInB; - } - - virtual void setPivotInB(const btVector3& pivotInB) - { - m_pivotInB = pivotInB; - } - - const btMatrix3x3& getFrameInA() const - { - return m_frameInA; - } - - void setFrameInA(const btMatrix3x3& frameInA) - { - m_frameInA = frameInA; - } - - const btMatrix3x3& getFrameInB() const - { - return m_frameInB; - } - - virtual void setFrameInB(const btMatrix3x3& frameInB) - { - m_frameInB = frameInB; - } - - virtual void debugDraw(class btIDebugDraw* drawer) - { - //todo(erwincoumans) - } - - virtual void setGearRatio(btScalar gearRatio) - { - m_gearRatio = gearRatio; - } - virtual void setGearAuxLink(int gearAuxLink) - { - m_gearAuxLink = gearAuxLink; - } - virtual void setRelativePositionTarget(btScalar relPosTarget) - { - m_relativePositionTarget = relPosTarget; - } - virtual void setErp(btScalar erp) - { - m_erp = erp; - } -}; - -#endif //BT_MULTIBODY_GEAR_CONSTRAINT_H diff --git a/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyInplaceSolverIslandCallback.h b/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyInplaceSolverIslandCallback.h deleted file mode 100644 index 3169b86e..00000000 --- a/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyInplaceSolverIslandCallback.h +++ /dev/null @@ -1,247 +0,0 @@ -/* - Bullet Continuous Collision Detection and Physics Library - Copyright (c) 2019 Google Inc. http://bulletphysics.org - 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_MULTIBODY_INPLACE_SOLVER_ISLAND_CALLBACK_H -#define BT_MULTIBODY_INPLACE_SOLVER_ISLAND_CALLBACK_H - -#include "BulletDynamics/Featherstone/btMultiBodyConstraintSolver.h" -#include "BulletCollision/CollisionDispatch/btSimulationIslandManager.h" -#include "BulletDynamics/Featherstone/btMultiBodyDynamicsWorld.h" -#include "btMultiBodyConstraintSolver.h" - -SIMD_FORCE_INLINE int btGetConstraintIslandId2(const btTypedConstraint* lhs) -{ - int islandId; - - const btCollisionObject& rcolObj0 = lhs->getRigidBodyA(); - const btCollisionObject& rcolObj1 = lhs->getRigidBodyB(); - islandId = rcolObj0.getIslandTag() >= 0 ? rcolObj0.getIslandTag() : rcolObj1.getIslandTag(); - return islandId; -} -class btSortConstraintOnIslandPredicate2 -{ -public: - bool operator()(const btTypedConstraint* lhs, const btTypedConstraint* rhs) const - { - int rIslandId0, lIslandId0; - rIslandId0 = btGetConstraintIslandId2(rhs); - lIslandId0 = btGetConstraintIslandId2(lhs); - return lIslandId0 < rIslandId0; - } -}; - -SIMD_FORCE_INLINE int btGetMultiBodyConstraintIslandId(const btMultiBodyConstraint* lhs) -{ - int islandId; - - int islandTagA = lhs->getIslandIdA(); - int islandTagB = lhs->getIslandIdB(); - islandId = islandTagA >= 0 ? islandTagA : islandTagB; - return islandId; -} - -class btSortMultiBodyConstraintOnIslandPredicate -{ -public: - bool operator()(const btMultiBodyConstraint* lhs, const btMultiBodyConstraint* rhs) const - { - int rIslandId0, lIslandId0; - rIslandId0 = btGetMultiBodyConstraintIslandId(rhs); - lIslandId0 = btGetMultiBodyConstraintIslandId(lhs); - return lIslandId0 < rIslandId0; - } -}; - -struct MultiBodyInplaceSolverIslandCallback : public btSimulationIslandManager::IslandCallback -{ - - btContactSolverInfo* m_solverInfo; - btMultiBodyConstraintSolver* m_solver; - btMultiBodyConstraint** m_multiBodySortedConstraints; - int m_numMultiBodyConstraints; - - btTypedConstraint** m_sortedConstraints; - int m_numConstraints; - btIDebugDraw* m_debugDrawer; - btDispatcher* m_dispatcher; - - btAlignedObjectArray m_bodies; - btAlignedObjectArray m_softBodies; - btAlignedObjectArray m_manifolds; - btAlignedObjectArray m_constraints; - btAlignedObjectArray m_multiBodyConstraints; - - btAlignedObjectArray m_islandAnalyticsData; - - MultiBodyInplaceSolverIslandCallback(btMultiBodyConstraintSolver* solver, - btDispatcher* dispatcher) - : m_solverInfo(NULL), - m_solver(solver), - m_multiBodySortedConstraints(NULL), - m_numConstraints(0), - m_debugDrawer(NULL), - m_dispatcher(dispatcher) - { - } - - MultiBodyInplaceSolverIslandCallback& operator=(const MultiBodyInplaceSolverIslandCallback& other) - { - btAssert(0); - (void)other; - return *this; - } - - SIMD_FORCE_INLINE virtual void setup(btContactSolverInfo* solverInfo, btTypedConstraint** sortedConstraints, int numConstraints, btMultiBodyConstraint** sortedMultiBodyConstraints, int numMultiBodyConstraints, btIDebugDraw* debugDrawer) - { - m_islandAnalyticsData.clear(); - btAssert(solverInfo); - m_solverInfo = solverInfo; - - m_multiBodySortedConstraints = sortedMultiBodyConstraints; - m_numMultiBodyConstraints = numMultiBodyConstraints; - m_sortedConstraints = sortedConstraints; - m_numConstraints = numConstraints; - - m_debugDrawer = debugDrawer; - m_bodies.resize(0); - m_manifolds.resize(0); - m_constraints.resize(0); - m_multiBodyConstraints.resize(0); - } - - void setMultiBodyConstraintSolver(btMultiBodyConstraintSolver* solver) - { - m_solver = solver; - } - - virtual void processIsland(btCollisionObject** bodies, int numBodies, btPersistentManifold** manifolds, int numManifolds, int islandId) - { - if (islandId < 0) - { - ///we don't split islands, so all constraints/contact manifolds/bodies are passed into the solver regardless the island id - m_solver->solveMultiBodyGroup(bodies, numBodies, manifolds, numManifolds, m_sortedConstraints, m_numConstraints, &m_multiBodySortedConstraints[0], m_numConstraints, *m_solverInfo, m_debugDrawer, m_dispatcher); - if (m_solverInfo->m_reportSolverAnalytics&1) - { - m_solver->m_analyticsData.m_islandId = islandId; - m_islandAnalyticsData.push_back(m_solver->m_analyticsData); - } - } - else - { - //also add all non-contact constraints/joints for this island - btTypedConstraint** startConstraint = 0; - btMultiBodyConstraint** startMultiBodyConstraint = 0; - - int numCurConstraints = 0; - int numCurMultiBodyConstraints = 0; - - int i; - - //find the first constraint for this island - - for (i = 0; i < m_numConstraints; i++) - { - if (btGetConstraintIslandId2(m_sortedConstraints[i]) == islandId) - { - startConstraint = &m_sortedConstraints[i]; - break; - } - } - //count the number of constraints in this island - for (; i < m_numConstraints; i++) - { - if (btGetConstraintIslandId2(m_sortedConstraints[i]) == islandId) - { - numCurConstraints++; - } - } - - for (i = 0; i < m_numMultiBodyConstraints; i++) - { - if (btGetMultiBodyConstraintIslandId(m_multiBodySortedConstraints[i]) == islandId) - { - startMultiBodyConstraint = &m_multiBodySortedConstraints[i]; - break; - } - } - //count the number of multi body constraints in this island - for (; i < m_numMultiBodyConstraints; i++) - { - if (btGetMultiBodyConstraintIslandId(m_multiBodySortedConstraints[i]) == islandId) - { - numCurMultiBodyConstraints++; - } - } - - //if (m_solverInfo->m_minimumSolverBatchSize<=1) - //{ - // m_solver->solveGroup( bodies,numBodies,manifolds, numManifolds,startConstraint,numCurConstraints,*m_solverInfo,m_debugDrawer,m_dispatcher); - //} else - { - for (i = 0; i < numBodies; i++) - { - bool isSoftBodyType = (bodies[i]->getInternalType() & btCollisionObject::CO_SOFT_BODY); - if (!isSoftBodyType) - { - m_bodies.push_back(bodies[i]); - } - else - { - m_softBodies.push_back(bodies[i]); - } - } - for (i = 0; i < numManifolds; i++) - m_manifolds.push_back(manifolds[i]); - for (i = 0; i < numCurConstraints; i++) - m_constraints.push_back(startConstraint[i]); - - for (i = 0; i < numCurMultiBodyConstraints; i++) - m_multiBodyConstraints.push_back(startMultiBodyConstraint[i]); - - if ((m_multiBodyConstraints.size() + m_constraints.size() + m_manifolds.size()) > m_solverInfo->m_minimumSolverBatchSize) - { - processConstraints(islandId); - } - else - { - //printf("deferred\n"); - } - } - } - } - - virtual void processConstraints(int islandId=-1) - { - btCollisionObject** bodies = m_bodies.size() ? &m_bodies[0] : 0; - btPersistentManifold** manifold = m_manifolds.size() ? &m_manifolds[0] : 0; - btTypedConstraint** constraints = m_constraints.size() ? &m_constraints[0] : 0; - btMultiBodyConstraint** multiBodyConstraints = m_multiBodyConstraints.size() ? &m_multiBodyConstraints[0] : 0; - - //printf("mb contacts = %d, mb constraints = %d\n", mbContacts, m_multiBodyConstraints.size()); - - m_solver->solveMultiBodyGroup(bodies, m_bodies.size(), manifold, m_manifolds.size(), constraints, m_constraints.size(), multiBodyConstraints, m_multiBodyConstraints.size(), *m_solverInfo, m_debugDrawer, m_dispatcher); - if (m_bodies.size() && (m_solverInfo->m_reportSolverAnalytics&1)) - { - m_solver->m_analyticsData.m_islandId = islandId; - m_islandAnalyticsData.push_back(m_solver->m_analyticsData); - } - m_bodies.resize(0); - m_softBodies.resize(0); - m_manifolds.resize(0); - m_constraints.resize(0); - m_multiBodyConstraints.resize(0); - } -}; - - -#endif /*BT_MULTIBODY_INPLACE_SOLVER_ISLAND_CALLBACK_H */ diff --git a/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyJointFeedback.h b/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyJointFeedback.h deleted file mode 100644 index d943019e..00000000 --- a/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyJointFeedback.h +++ /dev/null @@ -1,25 +0,0 @@ -/* -Copyright (c) 2015 Google Inc. - -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_MULTIBODY_JOINT_FEEDBACK_H -#define BT_MULTIBODY_JOINT_FEEDBACK_H - -#include "LinearMath/btSpatialAlgebra.h" - -struct btMultiBodyJointFeedback -{ - btSpatialForceVector m_reactionForces; -}; - -#endif //BT_MULTIBODY_JOINT_FEEDBACK_H diff --git a/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyJointLimitConstraint.h b/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyJointLimitConstraint.h deleted file mode 100644 index b810692b..00000000 --- a/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyJointLimitConstraint.h +++ /dev/null @@ -1,63 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2013 Erwin Coumans http://bulletphysics.org - -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_MULTIBODY_JOINT_LIMIT_CONSTRAINT_H -#define BT_MULTIBODY_JOINT_LIMIT_CONSTRAINT_H - -#include "btMultiBodyConstraint.h" -struct btSolverInfo; - -class btMultiBodyJointLimitConstraint : public btMultiBodyConstraint -{ -protected: - btScalar m_lowerBound; - btScalar m_upperBound; - -public: - btMultiBodyJointLimitConstraint(btMultiBody* body, int link, btScalar lower, btScalar upper); - virtual ~btMultiBodyJointLimitConstraint(); - - virtual void finalizeMultiDof(); - - virtual int getIslandIdA() const; - virtual int getIslandIdB() const; - - virtual void createConstraintRows(btMultiBodyConstraintArray& constraintRows, - btMultiBodyJacobianData& data, - const btContactSolverInfo& infoGlobal); - - virtual void debugDraw(class btIDebugDraw* drawer) - { - //todo(erwincoumans) - } - btScalar getLowerBound() const - { - return m_lowerBound; - } - btScalar getUpperBound() const - { - return m_upperBound; - } - void setLowerBound(btScalar lower) - { - m_lowerBound = lower; - } - void setUpperBound(btScalar upper) - { - m_upperBound = upper; - } -}; - -#endif //BT_MULTIBODY_JOINT_LIMIT_CONSTRAINT_H diff --git a/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyJointMotor.h b/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyJointMotor.h deleted file mode 100644 index 1aca3635..00000000 --- a/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyJointMotor.h +++ /dev/null @@ -1,77 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2013 Erwin Coumans http://bulletphysics.org - -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 file was written by Erwin Coumans - -#ifndef BT_MULTIBODY_JOINT_MOTOR_H -#define BT_MULTIBODY_JOINT_MOTOR_H - -#include "btMultiBodyConstraint.h" -struct btSolverInfo; - -class btMultiBodyJointMotor : public btMultiBodyConstraint -{ -protected: - btScalar m_desiredVelocity; - btScalar m_desiredPosition; - btScalar m_kd; - btScalar m_kp; - btScalar m_erp; - btScalar m_rhsClamp; //maximum error - -public: - btMultiBodyJointMotor(btMultiBody* body, int link, btScalar desiredVelocity, btScalar maxMotorImpulse); - btMultiBodyJointMotor(btMultiBody* body, int link, int linkDoF, btScalar desiredVelocity, btScalar maxMotorImpulse); - virtual ~btMultiBodyJointMotor(); - virtual void finalizeMultiDof(); - - virtual int getIslandIdA() const; - virtual int getIslandIdB() const; - - virtual void createConstraintRows(btMultiBodyConstraintArray& constraintRows, - btMultiBodyJacobianData& data, - const btContactSolverInfo& infoGlobal); - - virtual void setVelocityTarget(btScalar velTarget, btScalar kd = 1.f) - { - m_desiredVelocity = velTarget; - m_kd = kd; - } - - virtual void setPositionTarget(btScalar posTarget, btScalar kp = 1.f) - { - m_desiredPosition = posTarget; - m_kp = kp; - } - - virtual void setErp(btScalar erp) - { - m_erp = erp; - } - virtual btScalar getErp() const - { - return m_erp; - } - virtual void setRhsClamp(btScalar rhsClamp) - { - m_rhsClamp = rhsClamp; - } - virtual void debugDraw(class btIDebugDraw* drawer) - { - //todo(erwincoumans) - } -}; - -#endif //BT_MULTIBODY_JOINT_MOTOR_H diff --git a/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyLink.h b/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyLink.h deleted file mode 100644 index 5a142934..00000000 --- a/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyLink.h +++ /dev/null @@ -1,303 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2013 Erwin Coumans http://bulletphysics.org - -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_MULTIBODY_LINK_H -#define BT_MULTIBODY_LINK_H - -#include "LinearMath/btQuaternion.h" -#include "LinearMath/btVector3.h" -#include "BulletCollision/CollisionDispatch/btCollisionObject.h" - -enum btMultiBodyLinkFlags -{ - BT_MULTIBODYLINKFLAGS_DISABLE_PARENT_COLLISION = 1, - BT_MULTIBODYLINKFLAGS_DISABLE_ALL_PARENT_COLLISION = 2, -}; - -//both defines are now permanently enabled -#define BT_MULTIBODYLINK_INCLUDE_PLANAR_JOINTS -#define TEST_SPATIAL_ALGEBRA_LAYER - -// -// Various spatial helper functions -// - -//namespace { - -#include "LinearMath/btSpatialAlgebra.h" - -//} - -// -// Link struct -// - -struct btMultibodyLink -{ - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btScalar m_mass; // mass of link - btVector3 m_inertiaLocal; // inertia of link (local frame; diagonal) - - int m_parent; // index of the parent link (assumed to be < index of this link), or -1 if parent is the base link. - - btQuaternion m_zeroRotParentToThis; // rotates vectors in parent-frame to vectors in local-frame (when q=0). constant. - - btVector3 m_dVector; // vector from the inboard joint pos to this link's COM. (local frame.) constant. - //this is set to zero for planar joint (see also m_eVector comment) - - // m_eVector is constant, but depends on the joint type: - // revolute, fixed, prismatic, spherical: vector from parent's COM to the pivot point, in PARENT's frame. - // planar: vector from COM of parent to COM of this link, WHEN Q = 0. (local frame.) - // todo: fix the planar so it is consistent with the other joints - - btVector3 m_eVector; - - btSpatialMotionVector m_absFrameTotVelocity, m_absFrameLocVelocity; - - enum eFeatherstoneJointType - { - eRevolute = 0, - ePrismatic = 1, - eSpherical = 2, - ePlanar = 3, - eFixed = 4, - eInvalid - }; - - // "axis" = spatial joint axis (Mirtich Defn 9 p104). (expressed in local frame.) constant. - // for prismatic: m_axesTop[0] = zero; - // m_axesBottom[0] = unit vector along the joint axis. - // for revolute: m_axesTop[0] = unit vector along the rotation axis (u); - // m_axesBottom[0] = u cross m_dVector (i.e. COM linear motion due to the rotation at the joint) - // - // for spherical: m_axesTop[0][1][2] (u1,u2,u3) form a 3x3 identity matrix (3 rotation axes) - // m_axesBottom[0][1][2] cross u1,u2,u3 (i.e. COM linear motion due to the rotation at the joint) - // - // for planar: m_axesTop[0] = unit vector along the rotation axis (u); defines the plane of motion - // m_axesTop[1][2] = zero - // m_axesBottom[0] = zero - // m_axesBottom[1][2] = unit vectors along the translational axes on that plane - btSpatialMotionVector m_axes[6]; - void setAxisTop(int dof, const btVector3 &axis) { m_axes[dof].m_topVec = axis; } - void setAxisBottom(int dof, const btVector3 &axis) - { - m_axes[dof].m_bottomVec = axis; - } - void setAxisTop(int dof, const btScalar &x, const btScalar &y, const btScalar &z) - { - m_axes[dof].m_topVec.setValue(x, y, z); - } - void setAxisBottom(int dof, const btScalar &x, const btScalar &y, const btScalar &z) - { - m_axes[dof].m_bottomVec.setValue(x, y, z); - } - const btVector3 &getAxisTop(int dof) const { return m_axes[dof].m_topVec; } - const btVector3 &getAxisBottom(int dof) const { return m_axes[dof].m_bottomVec; } - - int m_dofOffset, m_cfgOffset; - - btQuaternion m_cachedRotParentToThis; // rotates vectors in parent frame to vectors in local frame - btVector3 m_cachedRVector; // vector from COM of parent to COM of this link, in local frame. - - // predicted verstion - btQuaternion m_cachedRotParentToThis_interpolate; // rotates vectors in parent frame to vectors in local frame - btVector3 m_cachedRVector_interpolate; // vector from COM of parent to COM of this link, in local frame. - - btVector3 m_appliedForce; // In WORLD frame - btVector3 m_appliedTorque; // In WORLD frame - - btVector3 m_appliedConstraintForce; // In WORLD frame - btVector3 m_appliedConstraintTorque; // In WORLD frame - - btScalar m_jointPos[7]; - btScalar m_jointPos_interpolate[7]; - - //m_jointTorque is the joint torque applied by the user using 'addJointTorque'. - //It gets set to zero after each internal stepSimulation call - btScalar m_jointTorque[6]; - - class btMultiBodyLinkCollider *m_collider; - int m_flags; - - int m_dofCount, m_posVarCount; //redundant but handy - - eFeatherstoneJointType m_jointType; - - struct btMultiBodyJointFeedback *m_jointFeedback; - - btTransform m_cachedWorldTransform; //this cache is updated when calling btMultiBody::forwardKinematics - - const char *m_linkName; //m_linkName memory needs to be managed by the developer/user! - const char *m_jointName; //m_jointName memory needs to be managed by the developer/user! - const void *m_userPtr; //m_userPtr ptr needs to be managed by the developer/user! - - btScalar m_jointDamping; //todo: implement this internally. It is unused for now, it is set by a URDF loader. User can apply manual damping. - btScalar m_jointFriction; //todo: implement this internally. It is unused for now, it is set by a URDF loader. User can apply manual friction using a velocity motor. - btScalar m_jointLowerLimit; //todo: implement this internally. It is unused for now, it is set by a URDF loader. - btScalar m_jointUpperLimit; //todo: implement this internally. It is unused for now, it is set by a URDF loader. - btScalar m_jointMaxForce; //todo: implement this internally. It is unused for now, it is set by a URDF loader. - btScalar m_jointMaxVelocity; //todo: implement this internally. It is unused for now, it is set by a URDF loader. - - // ctor: set some sensible defaults - btMultibodyLink() - : m_mass(1), - m_parent(-1), - m_zeroRotParentToThis(0, 0, 0, 1), - m_cachedRotParentToThis(0, 0, 0, 1), - m_cachedRotParentToThis_interpolate(0, 0, 0, 1), - m_collider(0), - m_flags(0), - m_dofCount(0), - m_posVarCount(0), - m_jointType(btMultibodyLink::eInvalid), - m_jointFeedback(0), - m_linkName(0), - m_jointName(0), - m_userPtr(0), - m_jointDamping(0), - m_jointFriction(0), - m_jointLowerLimit(0), - m_jointUpperLimit(0), - m_jointMaxForce(0), - m_jointMaxVelocity(0) - { - m_inertiaLocal.setValue(1, 1, 1); - setAxisTop(0, 0., 0., 0.); - setAxisBottom(0, 1., 0., 0.); - m_dVector.setValue(0, 0, 0); - m_eVector.setValue(0, 0, 0); - m_cachedRVector.setValue(0, 0, 0); - m_cachedRVector_interpolate.setValue(0, 0, 0); - m_appliedForce.setValue(0, 0, 0); - m_appliedTorque.setValue(0, 0, 0); - m_appliedConstraintForce.setValue(0, 0, 0); - m_appliedConstraintTorque.setValue(0, 0, 0); - // - m_jointPos[0] = m_jointPos[1] = m_jointPos[2] = m_jointPos[4] = m_jointPos[5] = m_jointPos[6] = 0.f; - m_jointPos[3] = 1.f; //"quat.w" - m_jointTorque[0] = m_jointTorque[1] = m_jointTorque[2] = m_jointTorque[3] = m_jointTorque[4] = m_jointTorque[5] = 0.f; - m_cachedWorldTransform.setIdentity(); - } - - // routine to update m_cachedRotParentToThis and m_cachedRVector - void updateCacheMultiDof(btScalar *pq = 0) - { - btScalar *pJointPos = (pq ? pq : &m_jointPos[0]); - btQuaternion& cachedRot = m_cachedRotParentToThis; - btVector3& cachedVector = m_cachedRVector; - switch (m_jointType) - { - case eRevolute: - { - cachedRot = btQuaternion(getAxisTop(0), -pJointPos[0]) * m_zeroRotParentToThis; - cachedVector = m_dVector + quatRotate(m_cachedRotParentToThis, m_eVector); - - break; - } - case ePrismatic: - { - // m_cachedRotParentToThis never changes, so no need to update - cachedVector = m_dVector + quatRotate(m_cachedRotParentToThis, m_eVector) + pJointPos[0] * getAxisBottom(0); - - break; - } - case eSpherical: - { - cachedRot = btQuaternion(pJointPos[0], pJointPos[1], pJointPos[2], -pJointPos[3]) * m_zeroRotParentToThis; - cachedVector = m_dVector + quatRotate(cachedRot, m_eVector); - - break; - } - case ePlanar: - { - cachedRot = btQuaternion(getAxisTop(0), -pJointPos[0]) * m_zeroRotParentToThis; - cachedVector = quatRotate(btQuaternion(getAxisTop(0), -pJointPos[0]), pJointPos[1] * getAxisBottom(1) + pJointPos[2] * getAxisBottom(2)) + quatRotate(cachedRot, m_eVector); - - break; - } - case eFixed: - { - cachedRot = m_zeroRotParentToThis; - cachedVector = m_dVector + quatRotate(cachedRot, m_eVector); - - break; - } - default: - { - //invalid type - btAssert(0); - } - } - m_cachedRotParentToThis_interpolate = m_cachedRotParentToThis; - m_cachedRVector_interpolate = m_cachedRVector; - } - - void updateInterpolationCacheMultiDof() - { - btScalar *pJointPos = &m_jointPos_interpolate[0]; - - btQuaternion& cachedRot = m_cachedRotParentToThis_interpolate; - btVector3& cachedVector = m_cachedRVector_interpolate; - switch (m_jointType) - { - case eRevolute: - { - cachedRot = btQuaternion(getAxisTop(0), -pJointPos[0]) * m_zeroRotParentToThis; - cachedVector = m_dVector + quatRotate(m_cachedRotParentToThis, m_eVector); - - break; - } - case ePrismatic: - { - // m_cachedRotParentToThis never changes, so no need to update - cachedVector = m_dVector + quatRotate(m_cachedRotParentToThis, m_eVector) + pJointPos[0] * getAxisBottom(0); - - break; - } - case eSpherical: - { - cachedRot = btQuaternion(pJointPos[0], pJointPos[1], pJointPos[2], -pJointPos[3]) * m_zeroRotParentToThis; - cachedVector = m_dVector + quatRotate(cachedRot, m_eVector); - - break; - } - case ePlanar: - { - cachedRot = btQuaternion(getAxisTop(0), -pJointPos[0]) * m_zeroRotParentToThis; - cachedVector = quatRotate(btQuaternion(getAxisTop(0), -pJointPos[0]), pJointPos[1] * getAxisBottom(1) + pJointPos[2] * getAxisBottom(2)) + quatRotate(cachedRot, m_eVector); - - break; - } - case eFixed: - { - cachedRot = m_zeroRotParentToThis; - cachedVector = m_dVector + quatRotate(cachedRot, m_eVector); - - break; - } - default: - { - //invalid type - btAssert(0); - } - } - } - - - -}; - -#endif //BT_MULTIBODY_LINK_H diff --git a/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyLinkCollider.h b/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyLinkCollider.h deleted file mode 100644 index 3dc35a58..00000000 --- a/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyLinkCollider.h +++ /dev/null @@ -1,195 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2013 Erwin Coumans http://bulletphysics.org - -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_FEATHERSTONE_LINK_COLLIDER_H -#define BT_FEATHERSTONE_LINK_COLLIDER_H - -#include "BulletCollision/CollisionDispatch/btCollisionObject.h" - -#include "btMultiBody.h" -#include "LinearMath/btSerializer.h" - -#ifdef BT_USE_DOUBLE_PRECISION -#define btMultiBodyLinkColliderData btMultiBodyLinkColliderDoubleData -#define btMultiBodyLinkColliderDataName "btMultiBodyLinkColliderDoubleData" -#else -#define btMultiBodyLinkColliderData btMultiBodyLinkColliderFloatData -#define btMultiBodyLinkColliderDataName "btMultiBodyLinkColliderFloatData" -#endif - -class btMultiBodyLinkCollider : public btCollisionObject -{ - //protected: -public: - btMultiBody* m_multiBody; - int m_link; - - virtual ~btMultiBodyLinkCollider() - { - - } - btMultiBodyLinkCollider(btMultiBody* multiBody, int link) - : m_multiBody(multiBody), - m_link(link) - { - m_checkCollideWith = true; - //we need to remove the 'CF_STATIC_OBJECT' flag, otherwise links/base doesn't merge islands - //this means that some constraints might point to bodies that are not in the islands, causing crashes - //if (link>=0 || (multiBody && !multiBody->hasFixedBase())) - { - m_collisionFlags &= (~btCollisionObject::CF_STATIC_OBJECT); - } - // else - //{ - // m_collisionFlags |= (btCollisionObject::CF_STATIC_OBJECT); - //} - - m_internalType = CO_FEATHERSTONE_LINK; - } - static btMultiBodyLinkCollider* upcast(btCollisionObject* colObj) - { - if (colObj->getInternalType() & btCollisionObject::CO_FEATHERSTONE_LINK) - return (btMultiBodyLinkCollider*)colObj; - return 0; - } - static const btMultiBodyLinkCollider* upcast(const btCollisionObject* colObj) - { - if (colObj->getInternalType() & btCollisionObject::CO_FEATHERSTONE_LINK) - return (btMultiBodyLinkCollider*)colObj; - return 0; - } - - virtual bool checkCollideWithOverride(const btCollisionObject* co) const - { - const btMultiBodyLinkCollider* other = btMultiBodyLinkCollider::upcast(co); - if (!other) - return true; - if (other->m_multiBody != this->m_multiBody) - return true; - if (!m_multiBody->hasSelfCollision()) - return false; - - //check if 'link' has collision disabled - if (m_link >= 0) - { - const btMultibodyLink& link = m_multiBody->getLink(this->m_link); - if (link.m_flags & BT_MULTIBODYLINKFLAGS_DISABLE_ALL_PARENT_COLLISION) - { - int parent_of_this = m_link; - while (1) - { - if (parent_of_this == -1) - break; - parent_of_this = m_multiBody->getLink(parent_of_this).m_parent; - if (parent_of_this == other->m_link) - { - return false; - } - } - } - else if (link.m_flags & BT_MULTIBODYLINKFLAGS_DISABLE_PARENT_COLLISION) - { - if (link.m_parent == other->m_link) - return false; - } - } - - if (other->m_link >= 0) - { - const btMultibodyLink& otherLink = other->m_multiBody->getLink(other->m_link); - if (otherLink.m_flags & BT_MULTIBODYLINKFLAGS_DISABLE_ALL_PARENT_COLLISION) - { - int parent_of_other = other->m_link; - while (1) - { - if (parent_of_other == -1) - break; - parent_of_other = m_multiBody->getLink(parent_of_other).m_parent; - if (parent_of_other == this->m_link) - return false; - } - } - else if (otherLink.m_flags & BT_MULTIBODYLINKFLAGS_DISABLE_PARENT_COLLISION) - { - if (otherLink.m_parent == this->m_link) - return false; - } - } - return true; - } - - bool isStaticOrKinematic() const - { - return isStaticOrKinematicObject(); - } - - bool isKinematic() const - { - return isKinematicObject(); - } - - void setDynamicType(int dynamicType) - { - int oldFlags = getCollisionFlags(); - oldFlags &= ~(btCollisionObject::CF_STATIC_OBJECT | btCollisionObject::CF_KINEMATIC_OBJECT); - setCollisionFlags(oldFlags | dynamicType); - } - - virtual int calculateSerializeBufferSize() const; - - ///fills the dataBuffer and returns the struct name (and 0 on failure) - virtual const char* serialize(void* dataBuffer, class btSerializer* serializer) const; -}; - -// clang-format off - -struct btMultiBodyLinkColliderFloatData -{ - btCollisionObjectFloatData m_colObjData; - btMultiBodyFloatData *m_multiBody; - int m_link; - char m_padding[4]; -}; - -struct btMultiBodyLinkColliderDoubleData -{ - btCollisionObjectDoubleData m_colObjData; - btMultiBodyDoubleData *m_multiBody; - int m_link; - char m_padding[4]; -}; - -// clang-format on - -SIMD_FORCE_INLINE int btMultiBodyLinkCollider::calculateSerializeBufferSize() const -{ - return sizeof(btMultiBodyLinkColliderData); -} - -SIMD_FORCE_INLINE const char* btMultiBodyLinkCollider::serialize(void* dataBuffer, class btSerializer* serializer) const -{ - btMultiBodyLinkColliderData* dataOut = (btMultiBodyLinkColliderData*)dataBuffer; - btCollisionObject::serialize(&dataOut->m_colObjData, serializer); - - dataOut->m_link = this->m_link; - dataOut->m_multiBody = (btMultiBodyData*)serializer->getUniquePointer(m_multiBody); - - // Fill padding with zeros to appease msan. - memset(dataOut->m_padding, 0, sizeof(dataOut->m_padding)); - - return btMultiBodyLinkColliderDataName; -} - -#endif //BT_FEATHERSTONE_LINK_COLLIDER_H diff --git a/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyMLCPConstraintSolver.h b/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyMLCPConstraintSolver.h deleted file mode 100644 index 77fdb86b..00000000 --- a/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyMLCPConstraintSolver.h +++ /dev/null @@ -1,187 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2018 Google Inc. http://bulletphysics.org - -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_MULTIBODY_MLCP_CONSTRAINT_SOLVER_H -#define BT_MULTIBODY_MLCP_CONSTRAINT_SOLVER_H - -#include "LinearMath/btMatrixX.h" -#include "LinearMath/btThreads.h" -#include "BulletDynamics/Featherstone/btMultiBodyConstraintSolver.h" - -class btMLCPSolverInterface; -class btMultiBody; - -class btMultiBodyMLCPConstraintSolver : public btMultiBodyConstraintSolver -{ -protected: - /// \name MLCP Formulation for Rigid Bodies - /// \{ - - /// A matrix in the MLCP formulation - btMatrixXu m_A; - - /// b vector in the MLCP formulation. - btVectorXu m_b; - - /// Constraint impulse, which is an output of MLCP solving. - btVectorXu m_x; - - /// Lower bound of constraint impulse, \c m_x. - btVectorXu m_lo; - - /// Upper bound of constraint impulse, \c m_x. - btVectorXu m_hi; - - /// \} - - /// \name Cache Variables for Split Impulse for Rigid Bodies - /// When using 'split impulse' we solve two separate (M)LCPs - /// \{ - - /// Split impulse Cache vector corresponding to \c m_b. - btVectorXu m_bSplit; - - /// Split impulse cache vector corresponding to \c m_x. - btVectorXu m_xSplit; - - /// \} - - /// \name MLCP Formulation for Multibodies - /// \{ - - /// A matrix in the MLCP formulation - btMatrixXu m_multiBodyA; - - /// b vector in the MLCP formulation. - btVectorXu m_multiBodyB; - - /// Constraint impulse, which is an output of MLCP solving. - btVectorXu m_multiBodyX; - - /// Lower bound of constraint impulse, \c m_x. - btVectorXu m_multiBodyLo; - - /// Upper bound of constraint impulse, \c m_x. - btVectorXu m_multiBodyHi; - - /// \} - - /// Indices of normal contact constraint associated with frictional contact constraint for rigid bodies. - /// - /// This is used by the MLCP solver to update the upper bounds of frictional contact impulse given intermediate - /// normal contact impulse. For example, i-th element represents the index of a normal constraint that is - /// accosiated with i-th frictional contact constraint if i-th constraint is a frictional contact constraint. - /// Otherwise, -1. - btAlignedObjectArray m_limitDependencies; - - /// Indices of normal contact constraint associated with frictional contact constraint for multibodies. - /// - /// This is used by the MLCP solver to update the upper bounds of frictional contact impulse given intermediate - /// normal contact impulse. For example, i-th element represents the index of a normal constraint that is - /// accosiated with i-th frictional contact constraint if i-th constraint is a frictional contact constraint. - /// Otherwise, -1. - btAlignedObjectArray m_multiBodyLimitDependencies; - - /// Array of all the rigid body constraints - btAlignedObjectArray m_allConstraintPtrArray; - - /// Array of all the multibody constraints - btAlignedObjectArray m_multiBodyAllConstraintPtrArray; - - /// MLCP solver - btMLCPSolverInterface* m_solver; - - /// Count of fallbacks of using btSequentialImpulseConstraintSolver, which happens when the MLCP solver fails. - int m_fallback; - - /// \name MLCP Scratch Variables - /// The following scratch variables are not stateful -- contents are cleared prior to each use. - /// They are only cached here to avoid extra memory allocations and deallocations and to ensure - /// that multiple instances of the solver can be run in parallel. - /// - /// \{ - - /// Cache variable for constraint Jacobian matrix. - btMatrixXu m_scratchJ3; - - /// Cache variable for constraint Jacobian times inverse mass matrix. - btMatrixXu m_scratchJInvM3; - - /// Cache variable for offsets. - btAlignedObjectArray m_scratchOfs; - - /// \} - - /// Constructs MLCP terms, which are \c m_A, \c m_b, \c m_lo, and \c m_hi. - virtual void createMLCPFast(const btContactSolverInfo& infoGlobal); - - /// Constructs MLCP terms for constraints of two rigid bodies - void createMLCPFastRigidBody(const btContactSolverInfo& infoGlobal); - - /// Constructs MLCP terms for constraints of two multi-bodies or one rigid body and one multibody - void createMLCPFastMultiBody(const btContactSolverInfo& infoGlobal); - - /// Solves MLCP and returns the success - virtual bool solveMLCP(const btContactSolverInfo& infoGlobal); - - // Documentation inherited - btScalar solveGroupCacheFriendlySetup( - btCollisionObject** bodies, - int numBodies, - btPersistentManifold** manifoldPtr, - int numManifolds, - btTypedConstraint** constraints, - int numConstraints, - const btContactSolverInfo& infoGlobal, - btIDebugDraw* debugDrawer) BT_OVERRIDE; - - // Documentation inherited - btScalar solveGroupCacheFriendlyIterations( - btCollisionObject** bodies, - int numBodies, - btPersistentManifold** manifoldPtr, - int numManifolds, - btTypedConstraint** constraints, - int numConstraints, - const btContactSolverInfo& infoGlobal, - btIDebugDraw* debugDrawer) ; - -public: - BT_DECLARE_ALIGNED_ALLOCATOR() - - /// Constructor - /// - /// \param[in] solver MLCP solver. Assumed it's not null. - /// \param[in] maxLCPSize Maximum size of LCP to solve using MLCP solver. If the MLCP size exceeds this number, sequaltial impulse method will be used. - explicit btMultiBodyMLCPConstraintSolver(btMLCPSolverInterface* solver); - - /// Destructor - virtual ~btMultiBodyMLCPConstraintSolver(); - - /// Sets MLCP solver. Assumed it's not null. - void setMLCPSolver(btMLCPSolverInterface* solver); - - /// Returns the number of fallbacks of using btSequentialImpulseConstraintSolver, which happens when the MLCP - /// solver fails. - int getNumFallbacks() const; - - /// Sets the number of fallbacks. This function may be used to reset the number to zero. - void setNumFallbacks(int num); - - /// Returns the constraint solver type. - virtual btConstraintSolverType getSolverType() const; -}; - -#endif // BT_MULTIBODY_MLCP_CONSTRAINT_SOLVER_H diff --git a/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyPoint2Point.h b/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyPoint2Point.h deleted file mode 100644 index ef03a557..00000000 --- a/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodyPoint2Point.h +++ /dev/null @@ -1,64 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2013 Erwin Coumans http://bulletphysics.org - -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 file was written by Erwin Coumans - -#ifndef BT_MULTIBODY_POINT2POINT_H -#define BT_MULTIBODY_POINT2POINT_H - -#include "btMultiBodyConstraint.h" - -//#define BTMBP2PCONSTRAINT_BLOCK_ANGULAR_MOTION_TEST - -ATTRIBUTE_ALIGNED16(class) -btMultiBodyPoint2Point : public btMultiBodyConstraint -{ -protected: - btRigidBody* m_rigidBodyA; - btRigidBody* m_rigidBodyB; - btVector3 m_pivotInA; - btVector3 m_pivotInB; - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btMultiBodyPoint2Point(btMultiBody * body, int link, btRigidBody* bodyB, const btVector3& pivotInA, const btVector3& pivotInB); - btMultiBodyPoint2Point(btMultiBody * bodyA, int linkA, btMultiBody* bodyB, int linkB, const btVector3& pivotInA, const btVector3& pivotInB); - - virtual ~btMultiBodyPoint2Point(); - - virtual void finalizeMultiDof(); - - virtual int getIslandIdA() const; - virtual int getIslandIdB() const; - - virtual void createConstraintRows(btMultiBodyConstraintArray & constraintRows, - btMultiBodyJacobianData & data, - const btContactSolverInfo& infoGlobal); - - const btVector3& getPivotInB() const - { - return m_pivotInB; - } - - virtual void setPivotInB(const btVector3& pivotInB) - { - m_pivotInB = pivotInB; - } - - virtual void debugDraw(class btIDebugDraw * drawer); -}; - -#endif //BT_MULTIBODY_POINT2POINT_H diff --git a/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodySliderConstraint.h b/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodySliderConstraint.h deleted file mode 100644 index b192b6f8..00000000 --- a/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodySliderConstraint.h +++ /dev/null @@ -1,102 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2013 Erwin Coumans http://bulletphysics.org - -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 file was written by Erwin Coumans - -#ifndef BT_MULTIBODY_SLIDER_CONSTRAINT_H -#define BT_MULTIBODY_SLIDER_CONSTRAINT_H - -#include "btMultiBodyConstraint.h" - -class btMultiBodySliderConstraint : public btMultiBodyConstraint -{ -protected: - btRigidBody* m_rigidBodyA; - btRigidBody* m_rigidBodyB; - btVector3 m_pivotInA; - btVector3 m_pivotInB; - btMatrix3x3 m_frameInA; - btMatrix3x3 m_frameInB; - btVector3 m_jointAxis; - -public: - btMultiBodySliderConstraint(btMultiBody* body, int link, btRigidBody* bodyB, const btVector3& pivotInA, const btVector3& pivotInB, const btMatrix3x3& frameInA, const btMatrix3x3& frameInB, const btVector3& jointAxis); - btMultiBodySliderConstraint(btMultiBody* bodyA, int linkA, btMultiBody* bodyB, int linkB, const btVector3& pivotInA, const btVector3& pivotInB, const btMatrix3x3& frameInA, const btMatrix3x3& frameInB, const btVector3& jointAxis); - - virtual ~btMultiBodySliderConstraint(); - - virtual void finalizeMultiDof(); - - virtual int getIslandIdA() const; - virtual int getIslandIdB() const; - - virtual void createConstraintRows(btMultiBodyConstraintArray& constraintRows, - btMultiBodyJacobianData& data, - const btContactSolverInfo& infoGlobal); - - const btVector3& getPivotInA() const - { - return m_pivotInA; - } - - void setPivotInA(const btVector3& pivotInA) - { - m_pivotInA = pivotInA; - } - - const btVector3& getPivotInB() const - { - return m_pivotInB; - } - - virtual void setPivotInB(const btVector3& pivotInB) - { - m_pivotInB = pivotInB; - } - - const btMatrix3x3& getFrameInA() const - { - return m_frameInA; - } - - void setFrameInA(const btMatrix3x3& frameInA) - { - m_frameInA = frameInA; - } - - const btMatrix3x3& getFrameInB() const - { - return m_frameInB; - } - - virtual void setFrameInB(const btMatrix3x3& frameInB) - { - m_frameInB = frameInB; - } - - const btVector3& getJointAxis() const - { - return m_jointAxis; - } - - void setJointAxis(const btVector3& jointAxis) - { - m_jointAxis = jointAxis; - } - - virtual void debugDraw(class btIDebugDraw* drawer); -}; - -#endif //BT_MULTIBODY_SLIDER_CONSTRAINT_H diff --git a/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodySolverConstraint.h b/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodySolverConstraint.h deleted file mode 100644 index deed3e2a..00000000 --- a/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodySolverConstraint.h +++ /dev/null @@ -1,90 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2013 Erwin Coumans http://bulletphysics.org - -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_MULTIBODY_SOLVER_CONSTRAINT_H -#define BT_MULTIBODY_SOLVER_CONSTRAINT_H - -#include "LinearMath/btVector3.h" -#include "LinearMath/btAlignedObjectArray.h" - -class btMultiBody; -class btMultiBodyConstraint; -#include "BulletDynamics/ConstraintSolver/btSolverBody.h" -#include "BulletDynamics/ConstraintSolver/btContactSolverInfo.h" - -///1D constraint along a normal axis between bodyA and bodyB. It can be combined to solve contact and friction constraints. -ATTRIBUTE_ALIGNED16(struct) -btMultiBodySolverConstraint -{ - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btMultiBodySolverConstraint() : m_solverBodyIdA(-1), m_multiBodyA(0), m_linkA(-1), m_solverBodyIdB(-1), m_multiBodyB(0), m_linkB(-1), m_orgConstraint(0), m_orgDofIndex(-1) - { - } - - int m_deltaVelAindex; //more generic version of m_relpos1CrossNormal/m_contactNormal1 - int m_jacAindex; - int m_deltaVelBindex; - int m_jacBindex; - - btVector3 m_relpos1CrossNormal; - btVector3 m_contactNormal1; - btVector3 m_relpos2CrossNormal; - btVector3 m_contactNormal2; //usually m_contactNormal2 == -m_contactNormal1, but not always - - btVector3 m_angularComponentA; - btVector3 m_angularComponentB; - - mutable btSimdScalar m_appliedPushImpulse; - mutable btSimdScalar m_appliedImpulse; - - btScalar m_friction; - btScalar m_jacDiagABInv; - btScalar m_rhs; - btScalar m_cfm; - - btScalar m_lowerLimit; - btScalar m_upperLimit; - btScalar m_rhsPenetration; - union { - void* m_originalContactPoint; - btScalar m_unusedPadding4; - }; - - int m_overrideNumSolverIterations; - int m_frictionIndex; - - int m_solverBodyIdA; - btMultiBody* m_multiBodyA; - int m_linkA; - - int m_solverBodyIdB; - btMultiBody* m_multiBodyB; - int m_linkB; - - //for writing back applied impulses - btMultiBodyConstraint* m_orgConstraint; - int m_orgDofIndex; - - enum btSolverConstraintType - { - BT_SOLVER_CONTACT_1D = 0, - BT_SOLVER_FRICTION_1D - }; -}; - -typedef btAlignedObjectArray btMultiBodyConstraintArray; - -#endif //BT_MULTIBODY_SOLVER_CONSTRAINT_H diff --git a/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodySphericalJointMotor.h b/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodySphericalJointMotor.h deleted file mode 100644 index 621beab5..00000000 --- a/engine/inc/bullet/BulletDynamics/Featherstone/btMultiBodySphericalJointMotor.h +++ /dev/null @@ -1,77 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2018 Erwin Coumans http://bulletphysics.org - -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 file was written by Erwin Coumans - -#ifndef BT_MULTIBODY_SPHERICAL_JOINT_MOTOR_H -#define BT_MULTIBODY_SPHERICAL_JOINT_MOTOR_H - -#include "btMultiBodyConstraint.h" -struct btSolverInfo; - -class btMultiBodySphericalJointMotor : public btMultiBodyConstraint -{ -protected: - btVector3 m_desiredVelocity; - btQuaternion m_desiredPosition; - btScalar m_kd; - btScalar m_kp; - btScalar m_erp; - btScalar m_rhsClamp; //maximum error - -public: - btMultiBodySphericalJointMotor(btMultiBody* body, int link, btScalar maxMotorImpulse); - - virtual ~btMultiBodySphericalJointMotor(); - virtual void finalizeMultiDof(); - - virtual int getIslandIdA() const; - virtual int getIslandIdB() const; - - virtual void createConstraintRows(btMultiBodyConstraintArray& constraintRows, - btMultiBodyJacobianData& data, - const btContactSolverInfo& infoGlobal); - - virtual void setVelocityTarget(const btVector3& velTarget, btScalar kd = 1.f) - { - m_desiredVelocity = velTarget; - m_kd = kd; - } - - virtual void setPositionTarget(const btQuaternion& posTarget, btScalar kp = 1.f) - { - m_desiredPosition = posTarget; - m_kp = kp; - } - - virtual void setErp(btScalar erp) - { - m_erp = erp; - } - virtual btScalar getErp() const - { - return m_erp; - } - virtual void setRhsClamp(btScalar rhsClamp) - { - m_rhsClamp = rhsClamp; - } - virtual void debugDraw(class btIDebugDraw* drawer) - { - //todo(erwincoumans) - } -}; - -#endif //BT_MULTIBODY_SPHERICAL_JOINT_MOTOR_H diff --git a/engine/inc/bullet/BulletDynamics/MLCPSolvers/btDantzigLCP.h b/engine/inc/bullet/BulletDynamics/MLCPSolvers/btDantzigLCP.h deleted file mode 100644 index 8d9b2a13..00000000 --- a/engine/inc/bullet/BulletDynamics/MLCPSolvers/btDantzigLCP.h +++ /dev/null @@ -1,73 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of * - * The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -/* - -given (A,b,lo,hi), solve the LCP problem: A*x = b+w, where each x(i),w(i) -satisfies one of - (1) x = lo, w >= 0 - (2) x = hi, w <= 0 - (3) lo < x < hi, w = 0 -A is a matrix of dimension n*n, everything else is a vector of size n*1. -lo and hi can be +/- dInfinity as needed. the first `nub' variables are -unbounded, i.e. hi and lo are assumed to be +/- dInfinity. - -we restrict lo(i) <= 0 and hi(i) >= 0. - -the original data (A,b) may be modified by this function. - -if the `findex' (friction index) parameter is nonzero, it points to an array -of index values. in this case constraints that have findex[i] >= 0 are -special. all non-special constraints are solved for, then the lo and hi values -for the special constraints are set: - hi[i] = abs( hi[i] * x[findex[i]] ) - lo[i] = -hi[i] -and the solution continues. this mechanism allows a friction approximation -to be implemented. the first `nub' variables are assumed to have findex < 0. - -*/ - -#ifndef _BT_LCP_H_ -#define _BT_LCP_H_ - -#include -#include -#include - -#include "LinearMath/btScalar.h" -#include "LinearMath/btAlignedObjectArray.h" - -struct btDantzigScratchMemory -{ - btAlignedObjectArray m_scratch; - btAlignedObjectArray L; - btAlignedObjectArray d; - btAlignedObjectArray delta_w; - btAlignedObjectArray delta_x; - btAlignedObjectArray Dell; - btAlignedObjectArray ell; - btAlignedObjectArray Arows; - btAlignedObjectArray p; - btAlignedObjectArray C; - btAlignedObjectArray state; -}; - -//return false if solving failed -bool btSolveDantzigLCP(int n, btScalar *A, btScalar *x, btScalar *b, btScalar *w, - int nub, btScalar *lo, btScalar *hi, int *findex, btDantzigScratchMemory &scratch); - -#endif //_BT_LCP_H_ diff --git a/engine/inc/bullet/BulletDynamics/MLCPSolvers/btDantzigSolver.h b/engine/inc/bullet/BulletDynamics/MLCPSolvers/btDantzigSolver.h deleted file mode 100644 index 1f669751..00000000 --- a/engine/inc/bullet/BulletDynamics/MLCPSolvers/btDantzigSolver.h +++ /dev/null @@ -1,106 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2013 Erwin Coumans http://bulletphysics.org - -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. -*/ -///original version written by Erwin Coumans, October 2013 - -#ifndef BT_DANTZIG_SOLVER_H -#define BT_DANTZIG_SOLVER_H - -#include "btMLCPSolverInterface.h" -#include "btDantzigLCP.h" - -class btDantzigSolver : public btMLCPSolverInterface -{ -protected: - btScalar m_acceptableUpperLimitSolution; - - btAlignedObjectArray m_tempBuffer; - - btAlignedObjectArray m_A; - btAlignedObjectArray m_b; - btAlignedObjectArray m_x; - btAlignedObjectArray m_lo; - btAlignedObjectArray m_hi; - btAlignedObjectArray m_dependencies; - btDantzigScratchMemory m_scratchMemory; - -public: - btDantzigSolver() - : m_acceptableUpperLimitSolution(btScalar(1000)) - { - } - - virtual bool solveMLCP(const btMatrixXu& A, const btVectorXu& b, btVectorXu& x, const btVectorXu& lo, const btVectorXu& hi, const btAlignedObjectArray& limitDependency, int numIterations, bool useSparsity = true) - { - bool result = true; - int n = b.rows(); - if (n) - { - int nub = 0; - btAlignedObjectArray ww; - ww.resize(n); - - const btScalar* Aptr = A.getBufferPointer(); - m_A.resize(n * n); - for (int i = 0; i < n * n; i++) - { - m_A[i] = Aptr[i]; - } - - m_b.resize(n); - m_x.resize(n); - m_lo.resize(n); - m_hi.resize(n); - m_dependencies.resize(n); - for (int i = 0; i < n; i++) - { - m_lo[i] = lo[i]; - m_hi[i] = hi[i]; - m_b[i] = b[i]; - m_x[i] = x[i]; - m_dependencies[i] = limitDependency[i]; - } - - result = btSolveDantzigLCP(n, &m_A[0], &m_x[0], &m_b[0], &ww[0], nub, &m_lo[0], &m_hi[0], &m_dependencies[0], m_scratchMemory); - if (!result) - return result; - - // printf("numAllocas = %d\n",numAllocas); - for (int i = 0; i < n; i++) - { - volatile btScalar xx = m_x[i]; - if (xx != m_x[i]) - return false; - if (x[i] >= m_acceptableUpperLimitSolution) - { - return false; - } - - if (x[i] <= -m_acceptableUpperLimitSolution) - { - return false; - } - } - - for (int i = 0; i < n; i++) - { - x[i] = m_x[i]; - } - } - - return result; - } -}; - -#endif //BT_DANTZIG_SOLVER_H diff --git a/engine/inc/bullet/BulletDynamics/MLCPSolvers/btLemkeAlgorithm.h b/engine/inc/bullet/BulletDynamics/MLCPSolvers/btLemkeAlgorithm.h deleted file mode 100644 index 3c6bf72a..00000000 --- a/engine/inc/bullet/BulletDynamics/MLCPSolvers/btLemkeAlgorithm.h +++ /dev/null @@ -1,102 +0,0 @@ -/* Copyright (C) 2004-2013 MBSim Development Team - -Code was converted for the Bullet Continuous Collision Detection and Physics Library - -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. -*/ - -//The original version is here -//https://code.google.com/p/mbsim-env/source/browse/trunk/kernel/mbsim/numerics/linear_complementarity_problem/lemke_algorithm.cc -//This file is re-distributed under the ZLib license, with permission of the original author (Kilian Grundl) -//Math library was replaced from fmatvec to a the file src/LinearMath/btMatrixX.h -//STL/std::vector replaced by btAlignedObjectArray - -#ifndef BT_NUMERICS_LEMKE_ALGORITHM_H_ -#define BT_NUMERICS_LEMKE_ALGORITHM_H_ - -#include "LinearMath/btMatrixX.h" - -#include //todo: replace by btAlignedObjectArray - -class btLemkeAlgorithm -{ -public: - btLemkeAlgorithm(const btMatrixXu& M_, const btVectorXu& q_, const int& DEBUGLEVEL_ = 0) : DEBUGLEVEL(DEBUGLEVEL_) - { - setSystem(M_, q_); - } - - /* GETTER / SETTER */ - /** - * \brief return info of solution process - */ - int getInfo() - { - return info; - } - - /** - * \brief get the number of steps until the solution was found - */ - int getSteps(void) - { - return steps; - } - - /** - * \brief set system with Matrix M and vector q - */ - void setSystem(const btMatrixXu& M_, const btVectorXu& q_) - { - m_M = M_; - m_q = q_; - } - /***************************************************/ - - /** - * \brief solve algorithm adapted from : Fast Implementation of Lemke’s Algorithm for Rigid Body Contact Simulation (John E. Lloyd) - */ - btVectorXu solve(unsigned int maxloops = 0); - - virtual ~btLemkeAlgorithm() - { - } - -protected: - int findLexicographicMinimum(const btMatrixXu& A, const int& pivotColIndex); - bool LexicographicPositive(const btVectorXu& v); - void GaussJordanEliminationStep(btMatrixXu& A, int pivotRowIndex, int pivotColumnIndex, const btAlignedObjectArray& basis); - bool greaterZero(const btVectorXu& vector); - bool validBasis(const btAlignedObjectArray& basis); - - btMatrixXu m_M; - btVectorXu m_q; - - /** - * \brief number of steps until the Lemke algorithm found a solution - */ - unsigned int steps; - - /** - * \brief define level of debug output - */ - int DEBUGLEVEL; - - /** - * \brief did the algorithm find a solution - * - * -1 : not successful - * 0 : successful - */ - int info; -}; - -#endif /* BT_NUMERICS_LEMKE_ALGORITHM_H_ */ diff --git a/engine/inc/bullet/BulletDynamics/MLCPSolvers/btLemkeSolver.h b/engine/inc/bullet/BulletDynamics/MLCPSolvers/btLemkeSolver.h deleted file mode 100644 index f18c4ea4..00000000 --- a/engine/inc/bullet/BulletDynamics/MLCPSolvers/btLemkeSolver.h +++ /dev/null @@ -1,338 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2013 Erwin Coumans http://bulletphysics.org - -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. -*/ -///original version written by Erwin Coumans, October 2013 - -#ifndef BT_LEMKE_SOLVER_H -#define BT_LEMKE_SOLVER_H - -#include "btMLCPSolverInterface.h" -#include "btLemkeAlgorithm.h" - -///The btLemkeSolver is based on "Fast Implementation of Lemke’s Algorithm for Rigid Body Contact Simulation (John E. Lloyd) " -///It is a slower but more accurate solver. Increase the m_maxLoops for better convergence, at the cost of more CPU time. -///The original implementation of the btLemkeAlgorithm was done by Kilian Grundl from the MBSim team -class btLemkeSolver : public btMLCPSolverInterface -{ -protected: -public: - btScalar m_maxValue; - int m_debugLevel; - int m_maxLoops; - bool m_useLoHighBounds; - - btLemkeSolver() - : m_maxValue(100000), - m_debugLevel(0), - m_maxLoops(1000), - m_useLoHighBounds(true) - { - } - virtual bool solveMLCP(const btMatrixXu& A, const btVectorXu& b, btVectorXu& x, const btVectorXu& lo, const btVectorXu& hi, const btAlignedObjectArray& limitDependency, int numIterations, bool useSparsity = true) - { - if (m_useLoHighBounds) - { - BT_PROFILE("btLemkeSolver::solveMLCP"); - int n = A.rows(); - if (0 == n) - return true; - - bool fail = false; - - btVectorXu solution(n); - btVectorXu q1; - q1.resize(n); - for (int row = 0; row < n; row++) - { - q1[row] = -b[row]; - } - - // cout << "A" << endl; - // cout << A << endl; - - ///////////////////////////////////// - - //slow matrix inversion, replace with LU decomposition - btMatrixXu A1; - btMatrixXu B(n, n); - { - //BT_PROFILE("inverse(slow)"); - A1.resize(A.rows(), A.cols()); - for (int row = 0; row < A.rows(); row++) - { - for (int col = 0; col < A.cols(); col++) - { - A1.setElem(row, col, A(row, col)); - } - } - - btMatrixXu matrix; - matrix.resize(n, 2 * n); - for (int row = 0; row < n; row++) - { - for (int col = 0; col < n; col++) - { - matrix.setElem(row, col, A1(row, col)); - } - } - - btScalar ratio, a; - int i, j, k; - for (i = 0; i < n; i++) - { - for (j = n; j < 2 * n; j++) - { - if (i == (j - n)) - matrix.setElem(i, j, 1.0); - else - matrix.setElem(i, j, 0.0); - } - } - for (i = 0; i < n; i++) - { - for (j = 0; j < n; j++) - { - if (i != j) - { - btScalar v = matrix(i, i); - if (btFuzzyZero(v)) - { - a = 0.000001f; - } - ratio = matrix(j, i) / matrix(i, i); - for (k = 0; k < 2 * n; k++) - { - matrix.addElem(j, k, -ratio * matrix(i, k)); - } - } - } - } - for (i = 0; i < n; i++) - { - a = matrix(i, i); - if (btFuzzyZero(a)) - { - a = 0.000001f; - } - btScalar invA = 1.f / a; - for (j = 0; j < 2 * n; j++) - { - matrix.mulElem(i, j, invA); - } - } - - for (int row = 0; row < n; row++) - { - for (int col = 0; col < n; col++) - { - B.setElem(row, col, matrix(row, n + col)); - } - } - } - - btMatrixXu b1(n, 1); - - btMatrixXu M(n * 2, n * 2); - for (int row = 0; row < n; row++) - { - b1.setElem(row, 0, -b[row]); - for (int col = 0; col < n; col++) - { - btScalar v = B(row, col); - M.setElem(row, col, v); - M.setElem(n + row, n + col, v); - M.setElem(n + row, col, -v); - M.setElem(row, n + col, -v); - } - } - - btMatrixXu Bb1 = B * b1; - // q = [ (-B*b1 - lo)' (hi + B*b1)' ]' - - btVectorXu qq; - qq.resize(n * 2); - for (int row = 0; row < n; row++) - { - qq[row] = -Bb1(row, 0) - lo[row]; - qq[n + row] = Bb1(row, 0) + hi[row]; - } - - btVectorXu z1; - - btMatrixXu y1; - y1.resize(n, 1); - btLemkeAlgorithm lemke(M, qq, m_debugLevel); - { - //BT_PROFILE("lemke.solve"); - lemke.setSystem(M, qq); - z1 = lemke.solve(m_maxLoops); - } - for (int row = 0; row < n; row++) - { - y1.setElem(row, 0, z1[2 * n + row] - z1[3 * n + row]); - } - btMatrixXu y1_b1(n, 1); - for (int i = 0; i < n; i++) - { - y1_b1.setElem(i, 0, y1(i, 0) - b1(i, 0)); - } - - btMatrixXu x1; - - x1 = B * (y1_b1); - - for (int row = 0; row < n; row++) - { - solution[row] = x1(row, 0); //n]; - } - - int errorIndexMax = -1; - int errorIndexMin = -1; - float errorValueMax = -1e30; - float errorValueMin = 1e30; - - for (int i = 0; i < n; i++) - { - x[i] = solution[i]; - volatile btScalar check = x[i]; - if (x[i] != check) - { - //printf("Lemke result is #NAN\n"); - x.setZero(); - return false; - } - - //this is some hack/safety mechanism, to discard invalid solutions from the Lemke solver - //we need to figure out why it happens, and fix it, or detect it properly) - if (x[i] > m_maxValue) - { - if (x[i] > errorValueMax) - { - fail = true; - errorIndexMax = i; - errorValueMax = x[i]; - } - ////printf("x[i] = %f,",x[i]); - } - if (x[i] < -m_maxValue) - { - if (x[i] < errorValueMin) - { - errorIndexMin = i; - errorValueMin = x[i]; - fail = true; - //printf("x[i] = %f,",x[i]); - } - } - } - if (fail) - { - int m_errorCountTimes = 0; - if (errorIndexMin < 0) - errorValueMin = 0.f; - if (errorIndexMax < 0) - errorValueMax = 0.f; - m_errorCountTimes++; - // printf("Error (x[%d] = %f, x[%d] = %f), resetting %d times\n", errorIndexMin,errorValueMin, errorIndexMax, errorValueMax, errorCountTimes++); - for (int i = 0; i < n; i++) - { - x[i] = 0.f; - } - } - return !fail; - } - else - - { - int dimension = A.rows(); - if (0 == dimension) - return true; - - // printf("================ solving using Lemke/Newton/Fixpoint\n"); - - btVectorXu q; - q.resize(dimension); - for (int row = 0; row < dimension; row++) - { - q[row] = -b[row]; - } - - btLemkeAlgorithm lemke(A, q, m_debugLevel); - - lemke.setSystem(A, q); - - btVectorXu solution = lemke.solve(m_maxLoops); - - //check solution - - bool fail = false; - int errorIndexMax = -1; - int errorIndexMin = -1; - float errorValueMax = -1e30; - float errorValueMin = 1e30; - - for (int i = 0; i < dimension; i++) - { - x[i] = solution[i + dimension]; - volatile btScalar check = x[i]; - if (x[i] != check) - { - x.setZero(); - return false; - } - - //this is some hack/safety mechanism, to discard invalid solutions from the Lemke solver - //we need to figure out why it happens, and fix it, or detect it properly) - if (x[i] > m_maxValue) - { - if (x[i] > errorValueMax) - { - fail = true; - errorIndexMax = i; - errorValueMax = x[i]; - } - ////printf("x[i] = %f,",x[i]); - } - if (x[i] < -m_maxValue) - { - if (x[i] < errorValueMin) - { - errorIndexMin = i; - errorValueMin = x[i]; - fail = true; - //printf("x[i] = %f,",x[i]); - } - } - } - if (fail) - { - static int errorCountTimes = 0; - if (errorIndexMin < 0) - errorValueMin = 0.f; - if (errorIndexMax < 0) - errorValueMax = 0.f; - printf("Error (x[%d] = %f, x[%d] = %f), resetting %d times\n", errorIndexMin, errorValueMin, errorIndexMax, errorValueMax, errorCountTimes++); - for (int i = 0; i < dimension; i++) - { - x[i] = 0.f; - } - } - - return !fail; - } - return true; - } -}; - -#endif //BT_LEMKE_SOLVER_H diff --git a/engine/inc/bullet/BulletDynamics/MLCPSolvers/btMLCPSolver.h b/engine/inc/bullet/BulletDynamics/MLCPSolvers/btMLCPSolver.h deleted file mode 100644 index 510ae59e..00000000 --- a/engine/inc/bullet/BulletDynamics/MLCPSolvers/btMLCPSolver.h +++ /dev/null @@ -1,88 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2013 Erwin Coumans http://bulletphysics.org - -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. -*/ -///original version written by Erwin Coumans, October 2013 - -#ifndef BT_MLCP_SOLVER_H -#define BT_MLCP_SOLVER_H - -#include "BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h" -#include "LinearMath/btMatrixX.h" -#include "BulletDynamics/MLCPSolvers/btMLCPSolverInterface.h" - -class btMLCPSolver : public btSequentialImpulseConstraintSolver -{ -protected: - btMatrixXu m_A; - btVectorXu m_b; - btVectorXu m_x; - btVectorXu m_lo; - btVectorXu m_hi; - - ///when using 'split impulse' we solve two separate (M)LCPs - btVectorXu m_bSplit; - btVectorXu m_xSplit; - btVectorXu m_bSplit1; - btVectorXu m_xSplit2; - - btAlignedObjectArray m_limitDependencies; - btAlignedObjectArray m_allConstraintPtrArray; - btMLCPSolverInterface* m_solver; - int m_fallback; - - /// The following scratch variables are not stateful -- contents are cleared prior to each use. - /// They are only cached here to avoid extra memory allocations and deallocations and to ensure - /// that multiple instances of the solver can be run in parallel. - btMatrixXu m_scratchJ3; - btMatrixXu m_scratchJInvM3; - btAlignedObjectArray m_scratchOfs; - btMatrixXu m_scratchMInv; - btMatrixXu m_scratchJ; - btMatrixXu m_scratchJTranspose; - btMatrixXu m_scratchTmp; - - virtual btScalar solveGroupCacheFriendlySetup(btCollisionObject** bodies, int numBodies, btPersistentManifold** manifoldPtr, int numManifolds, btTypedConstraint** constraints, int numConstraints, const btContactSolverInfo& infoGlobal, btIDebugDraw* debugDrawer); - virtual btScalar solveGroupCacheFriendlyIterations(btCollisionObject** bodies, int numBodies, btPersistentManifold** manifoldPtr, int numManifolds, btTypedConstraint** constraints, int numConstraints, const btContactSolverInfo& infoGlobal, btIDebugDraw* debugDrawer); - - virtual void createMLCP(const btContactSolverInfo& infoGlobal); - virtual void createMLCPFast(const btContactSolverInfo& infoGlobal); - - //return true is it solves the problem successfully - virtual bool solveMLCP(const btContactSolverInfo& infoGlobal); - -public: - btMLCPSolver(btMLCPSolverInterface* solver); - virtual ~btMLCPSolver(); - - void setMLCPSolver(btMLCPSolverInterface* solver) - { - m_solver = solver; - } - - int getNumFallbacks() const - { - return m_fallback; - } - void setNumFallbacks(int num) - { - m_fallback = num; - } - - virtual btConstraintSolverType getSolverType() const - { - return BT_MLCP_SOLVER; - } -}; - -#endif //BT_MLCP_SOLVER_H diff --git a/engine/inc/bullet/BulletDynamics/MLCPSolvers/btMLCPSolverInterface.h b/engine/inc/bullet/BulletDynamics/MLCPSolvers/btMLCPSolverInterface.h deleted file mode 100644 index 6b0465b8..00000000 --- a/engine/inc/bullet/BulletDynamics/MLCPSolvers/btMLCPSolverInterface.h +++ /dev/null @@ -1,33 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2013 Erwin Coumans http://bulletphysics.org - -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. -*/ -///original version written by Erwin Coumans, October 2013 - -#ifndef BT_MLCP_SOLVER_INTERFACE_H -#define BT_MLCP_SOLVER_INTERFACE_H - -#include "LinearMath/btMatrixX.h" - -class btMLCPSolverInterface -{ -public: - virtual ~btMLCPSolverInterface() - { - } - - //return true is it solves the problem successfully - virtual bool solveMLCP(const btMatrixXu& A, const btVectorXu& b, btVectorXu& x, const btVectorXu& lo, const btVectorXu& hi, const btAlignedObjectArray& limitDependency, int numIterations, bool useSparsity = true) = 0; -}; - -#endif //BT_MLCP_SOLVER_INTERFACE_H diff --git a/engine/inc/bullet/BulletDynamics/MLCPSolvers/btPATHSolver.h b/engine/inc/bullet/BulletDynamics/MLCPSolvers/btPATHSolver.h deleted file mode 100644 index 7f8eec3f..00000000 --- a/engine/inc/bullet/BulletDynamics/MLCPSolvers/btPATHSolver.h +++ /dev/null @@ -1,142 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2013 Erwin Coumans http://bulletphysics.org - -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. -*/ -///original version written by Erwin Coumans, October 2013 - -#ifndef BT_PATH_SOLVER_H -#define BT_PATH_SOLVER_H - -//#define BT_USE_PATH -#ifdef BT_USE_PATH - -extern "C" -{ -#include "PATH/SimpleLCP.h" -#include "PATH/License.h" -#include "PATH/Error_Interface.h" -}; -void __stdcall MyError(Void *data, Char *msg) -{ - printf("Path Error: %s\n", msg); -} -void __stdcall MyWarning(Void *data, Char *msg) -{ - printf("Path Warning: %s\n", msg); -} - -Error_Interface e; - -#include "btMLCPSolverInterface.h" -#include "Dantzig/lcp.h" - -class btPathSolver : public btMLCPSolverInterface -{ -public: - btPathSolver() - { - License_SetString("2069810742&Courtesy_License&&&USR&2013&14_12_2011&1000&PATH&GEN&31_12_2013&0_0_0&0&0_0"); - e.error_data = 0; - e.warning = MyWarning; - e.error = MyError; - Error_SetInterface(&e); - } - - virtual bool solveMLCP(const btMatrixXu &A, const btVectorXu &b, btVectorXu &x, const btVectorXu &lo, const btVectorXu &hi, const btAlignedObjectArray &limitDependency, int numIterations, bool useSparsity = true) - { - MCP_Termination status; - - int numVariables = b.rows(); - if (0 == numVariables) - return true; - - /* - variables - the number of variables in the problem - - m_nnz - the number of nonzeros in the M matrix - - m_i - a vector of size m_nnz containing the row indices for M - - m_j - a vector of size m_nnz containing the column indices for M - - m_ij - a vector of size m_nnz containing the data for M - - q - a vector of size variables - - lb - a vector of size variables containing the lower bounds on x - - ub - a vector of size variables containing the upper bounds on x - */ - btAlignedObjectArray values; - btAlignedObjectArray rowIndices; - btAlignedObjectArray colIndices; - - for (int i = 0; i < A.rows(); i++) - { - for (int j = 0; j < A.cols(); j++) - { - if (A(i, j) != 0.f) - { - //add 1, because Path starts at 1, instead of 0 - rowIndices.push_back(i + 1); - colIndices.push_back(j + 1); - values.push_back(A(i, j)); - } - } - } - int numNonZero = rowIndices.size(); - btAlignedObjectArray zResult; - zResult.resize(numVariables); - btAlignedObjectArray rhs; - btAlignedObjectArray upperBounds; - btAlignedObjectArray lowerBounds; - for (int i = 0; i < numVariables; i++) - { - upperBounds.push_back(hi[i]); - lowerBounds.push_back(lo[i]); - rhs.push_back(-b[i]); - } - - SimpleLCP(numVariables, numNonZero, &rowIndices[0], &colIndices[0], &values[0], &rhs[0], &lowerBounds[0], &upperBounds[0], &status, &zResult[0]); - - if (status != MCP_Solved) - { - static const char *gReturnMsgs[] = { - "Invalid return", - "MCP_Solved: The problem was solved", - "MCP_NoProgress: A stationary point was found", - "MCP_MajorIterationLimit: Major iteration limit met", - "MCP_MinorIterationLimit: Cumulative minor iteration limit met", - "MCP_TimeLimit: Ran out of time", - "MCP_UserInterrupt: Control-C, typically", - "MCP_BoundError: Problem has a bound error", - "MCP_DomainError: Could not find starting point", - "MCP_Infeasible: Problem has no solution", - "MCP_Error: An error occurred within the code", - "MCP_LicenseError: License could not be found", - "MCP_OK"}; - - printf("ERROR: The PATH MCP solver failed: %s\n", gReturnMsgs[(unsigned int)status]); // << std::endl; - printf("using Projected Gauss Seidel fallback\n"); - - return false; - } - else - { - for (int i = 0; i < numVariables; i++) - { - x[i] = zResult[i]; - //check for #NAN - if (x[i] != zResult[i]) - return false; - } - return true; - } - } -}; - -#endif //BT_USE_PATH - -#endif //BT_PATH_SOLVER_H diff --git a/engine/inc/bullet/BulletDynamics/MLCPSolvers/btSolveProjectedGaussSeidel.h b/engine/inc/bullet/BulletDynamics/MLCPSolvers/btSolveProjectedGaussSeidel.h deleted file mode 100644 index c3f4ec39..00000000 --- a/engine/inc/bullet/BulletDynamics/MLCPSolvers/btSolveProjectedGaussSeidel.h +++ /dev/null @@ -1,107 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2013 Erwin Coumans http://bulletphysics.org - -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. -*/ -///original version written by Erwin Coumans, October 2013 - -#ifndef BT_SOLVE_PROJECTED_GAUSS_SEIDEL_H -#define BT_SOLVE_PROJECTED_GAUSS_SEIDEL_H - -#include "btMLCPSolverInterface.h" - -///This solver is mainly for debug/learning purposes: it is functionally equivalent to the btSequentialImpulseConstraintSolver solver, but much slower (it builds the full LCP matrix) -class btSolveProjectedGaussSeidel : public btMLCPSolverInterface -{ -public: - btScalar m_leastSquaresResidualThreshold; - btScalar m_leastSquaresResidual; - - btSolveProjectedGaussSeidel() - : m_leastSquaresResidualThreshold(0), - m_leastSquaresResidual(0) - { - } - - virtual bool solveMLCP(const btMatrixXu& A, const btVectorXu& b, btVectorXu& x, const btVectorXu& lo, const btVectorXu& hi, const btAlignedObjectArray& limitDependency, int numIterations, bool useSparsity = true) - { - if (!A.rows()) - return true; - //the A matrix is sparse, so compute the non-zero elements - A.rowComputeNonZeroElements(); - - //A is a m-n matrix, m rows, n columns - btAssert(A.rows() == b.rows()); - - int i, j, numRows = A.rows(); - - btScalar delta; - - for (int k = 0; k < numIterations; k++) - { - m_leastSquaresResidual = 0.f; - for (i = 0; i < numRows; i++) - { - delta = 0.0f; - if (useSparsity) - { - for (int h = 0; h < A.m_rowNonZeroElements1[i].size(); h++) - { - j = A.m_rowNonZeroElements1[i][h]; - if (j != i) //skip main diagonal - { - delta += A(i, j) * x[j]; - } - } - } - else - { - for (j = 0; j < i; j++) - delta += A(i, j) * x[j]; - for (j = i + 1; j < numRows; j++) - delta += A(i, j) * x[j]; - } - - btScalar aDiag = A(i, i); - btScalar xOld = x[i]; - x[i] = (b[i] - delta) / aDiag; - btScalar s = 1.f; - - if (limitDependency[i] >= 0) - { - s = x[limitDependency[i]]; - if (s < 0) - s = 1; - } - - if (x[i] < lo[i] * s) - x[i] = lo[i] * s; - if (x[i] > hi[i] * s) - x[i] = hi[i] * s; - btScalar diff = x[i] - xOld; - m_leastSquaresResidual += diff * diff; - } - - btScalar eps = m_leastSquaresResidualThreshold; - if ((m_leastSquaresResidual < eps) || (k >= (numIterations - 1))) - { -#ifdef VERBOSE_PRINTF_RESIDUAL - printf("totalLenSqr = %f at iteration #%d\n", m_leastSquaresResidual, k); -#endif - break; - } - } - return true; - } -}; - -#endif //BT_SOLVE_PROJECTED_GAUSS_SEIDEL_H diff --git a/engine/inc/bullet/BulletDynamics/Vehicle/btRaycastVehicle.h b/engine/inc/bullet/BulletDynamics/Vehicle/btRaycastVehicle.h deleted file mode 100644 index 99d6894e..00000000 --- a/engine/inc/bullet/BulletDynamics/Vehicle/btRaycastVehicle.h +++ /dev/null @@ -1,218 +0,0 @@ -/* - * 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. -*/ -#ifndef BT_RAYCASTVEHICLE_H -#define BT_RAYCASTVEHICLE_H - -#include "BulletDynamics/Dynamics/btRigidBody.h" -#include "BulletDynamics/ConstraintSolver/btTypedConstraint.h" -#include "btVehicleRaycaster.h" -class btDynamicsWorld; -#include "LinearMath/btAlignedObjectArray.h" -#include "btWheelInfo.h" -#include "BulletDynamics/Dynamics/btActionInterface.h" - -//class btVehicleTuning; - -///rayCast vehicle, very special constraint that turn a rigidbody into a vehicle. -class btRaycastVehicle : public btActionInterface -{ - btAlignedObjectArray m_forwardWS; - btAlignedObjectArray m_axle; - btAlignedObjectArray m_forwardImpulse; - btAlignedObjectArray m_sideImpulse; - - ///backwards compatibility - int m_userConstraintType; - int m_userConstraintId; - -public: - class btVehicleTuning - { - public: - btVehicleTuning() - : m_suspensionStiffness(btScalar(5.88)), - m_suspensionCompression(btScalar(0.83)), - m_suspensionDamping(btScalar(0.88)), - m_maxSuspensionTravelCm(btScalar(500.)), - m_frictionSlip(btScalar(10.5)), - m_maxSuspensionForce(btScalar(6000.)) - { - } - btScalar m_suspensionStiffness; - btScalar m_suspensionCompression; - btScalar m_suspensionDamping; - btScalar m_maxSuspensionTravelCm; - btScalar m_frictionSlip; - btScalar m_maxSuspensionForce; - }; - -private: - btVehicleRaycaster* m_vehicleRaycaster; - btScalar m_pitchControl; - btScalar m_steeringValue; - btScalar m_currentVehicleSpeedKmHour; - - btRigidBody* m_chassisBody; - - int m_indexRightAxis; - int m_indexUpAxis; - int m_indexForwardAxis; - - void defaultInit(const btVehicleTuning& tuning); - -public: - //constructor to create a car from an existing rigidbody - btRaycastVehicle(const btVehicleTuning& tuning, btRigidBody* chassis, btVehicleRaycaster* raycaster); - - virtual ~btRaycastVehicle(); - - ///btActionInterface interface - virtual void updateAction(btCollisionWorld* collisionWorld, btScalar step) - { - (void)collisionWorld; - updateVehicle(step); - } - - ///btActionInterface interface - void debugDraw(btIDebugDraw* debugDrawer); - - const btTransform& getChassisWorldTransform() const; - - btScalar rayCast(btWheelInfo& wheel); - - virtual void updateVehicle(btScalar step); - - void resetSuspension(); - - btScalar getSteeringValue(int wheel) const; - - void setSteeringValue(btScalar steering, int wheel); - - void applyEngineForce(btScalar force, int wheel); - - const btTransform& getWheelTransformWS(int wheelIndex) const; - - void updateWheelTransform(int wheelIndex, bool interpolatedTransform = true); - - // void setRaycastWheelInfo( int wheelIndex , bool isInContact, const btVector3& hitPoint, const btVector3& hitNormal,btScalar depth); - - btWheelInfo& addWheel(const btVector3& connectionPointCS0, const btVector3& wheelDirectionCS0, const btVector3& wheelAxleCS, btScalar suspensionRestLength, btScalar wheelRadius, const btVehicleTuning& tuning, bool isFrontWheel); - - inline int getNumWheels() const - { - return int(m_wheelInfo.size()); - } - - btAlignedObjectArray m_wheelInfo; - - const btWheelInfo& getWheelInfo(int index) const; - - btWheelInfo& getWheelInfo(int index); - - void updateWheelTransformsWS(btWheelInfo& wheel, bool interpolatedTransform = true); - - void setBrake(btScalar brake, int wheelIndex); - - void setPitchControl(btScalar pitch) - { - m_pitchControl = pitch; - } - - void updateSuspension(btScalar deltaTime); - - virtual void updateFriction(btScalar timeStep); - - inline btRigidBody* getRigidBody() - { - return m_chassisBody; - } - - const btRigidBody* getRigidBody() const - { - return m_chassisBody; - } - - inline int getRightAxis() const - { - return m_indexRightAxis; - } - inline int getUpAxis() const - { - return m_indexUpAxis; - } - - inline int getForwardAxis() const - { - return m_indexForwardAxis; - } - - ///Worldspace forward vector - btVector3 getForwardVector() const - { - const btTransform& chassisTrans = getChassisWorldTransform(); - - btVector3 forwardW( - chassisTrans.getBasis()[0][m_indexForwardAxis], - chassisTrans.getBasis()[1][m_indexForwardAxis], - chassisTrans.getBasis()[2][m_indexForwardAxis]); - - return forwardW; - } - - ///Velocity of vehicle (positive if velocity vector has same direction as foward vector) - btScalar getCurrentSpeedKmHour() const - { - return m_currentVehicleSpeedKmHour; - } - - virtual void setCoordinateSystem(int rightIndex, int upIndex, int forwardIndex) - { - m_indexRightAxis = rightIndex; - m_indexUpAxis = upIndex; - m_indexForwardAxis = forwardIndex; - } - - ///backwards compatibility - int getUserConstraintType() const - { - return m_userConstraintType; - } - - void setUserConstraintType(int userConstraintType) - { - m_userConstraintType = userConstraintType; - }; - - void setUserConstraintId(int uid) - { - m_userConstraintId = uid; - } - - int getUserConstraintId() const - { - return m_userConstraintId; - } -}; - -class btDefaultVehicleRaycaster : public btVehicleRaycaster -{ - btDynamicsWorld* m_dynamicsWorld; - -public: - btDefaultVehicleRaycaster(btDynamicsWorld* world) - : m_dynamicsWorld(world) - { - } - - virtual void* castRay(const btVector3& from, const btVector3& to, btVehicleRaycasterResult& result); -}; - -#endif //BT_RAYCASTVEHICLE_H diff --git a/engine/inc/bullet/BulletDynamics/Vehicle/btVehicleRaycaster.h b/engine/inc/bullet/BulletDynamics/Vehicle/btVehicleRaycaster.h deleted file mode 100644 index 2c44ce54..00000000 --- a/engine/inc/bullet/BulletDynamics/Vehicle/btVehicleRaycaster.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2005 Erwin Coumans http://bulletphysics.org - * - * 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. -*/ -#ifndef BT_VEHICLE_RAYCASTER_H -#define BT_VEHICLE_RAYCASTER_H - -#include "LinearMath/btVector3.h" - -/// btVehicleRaycaster is provides interface for between vehicle simulation and raycasting -struct btVehicleRaycaster -{ - virtual ~btVehicleRaycaster() - { - } - struct btVehicleRaycasterResult - { - btVehicleRaycasterResult() : m_distFraction(btScalar(-1.)){}; - btVector3 m_hitPointInWorld; - btVector3 m_hitNormalInWorld; - btScalar m_distFraction; - }; - - virtual void* castRay(const btVector3& from, const btVector3& to, btVehicleRaycasterResult& result) = 0; -}; - -#endif //BT_VEHICLE_RAYCASTER_H diff --git a/engine/inc/bullet/BulletDynamics/Vehicle/btWheelInfo.h b/engine/inc/bullet/BulletDynamics/Vehicle/btWheelInfo.h deleted file mode 100644 index af88b8ff..00000000 --- a/engine/inc/bullet/BulletDynamics/Vehicle/btWheelInfo.h +++ /dev/null @@ -1,116 +0,0 @@ -/* - * 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. -*/ -#ifndef BT_WHEEL_INFO_H -#define BT_WHEEL_INFO_H - -#include "LinearMath/btVector3.h" -#include "LinearMath/btTransform.h" - -class btRigidBody; - -struct btWheelInfoConstructionInfo -{ - btVector3 m_chassisConnectionCS; - btVector3 m_wheelDirectionCS; - btVector3 m_wheelAxleCS; - btScalar m_suspensionRestLength; - btScalar m_maxSuspensionTravelCm; - btScalar m_wheelRadius; - - btScalar m_suspensionStiffness; - btScalar m_wheelsDampingCompression; - btScalar m_wheelsDampingRelaxation; - btScalar m_frictionSlip; - btScalar m_maxSuspensionForce; - bool m_bIsFrontWheel; -}; - -/// btWheelInfo contains information per wheel about friction and suspension. -struct btWheelInfo -{ - struct RaycastInfo - { - //set by raycaster - btVector3 m_contactNormalWS; //contactnormal - btVector3 m_contactPointWS; //raycast hitpoint - btScalar m_suspensionLength; - btVector3 m_hardPointWS; //raycast starting point - btVector3 m_wheelDirectionWS; //direction in worldspace - btVector3 m_wheelAxleWS; // axle in worldspace - bool m_isInContact; - void* m_groundObject; //could be general void* ptr - }; - - RaycastInfo m_raycastInfo; - - btTransform m_worldTransform; - - btVector3 m_chassisConnectionPointCS; //const - btVector3 m_wheelDirectionCS; //const - btVector3 m_wheelAxleCS; // const or modified by steering - btScalar m_suspensionRestLength1; //const - btScalar m_maxSuspensionTravelCm; - btScalar getSuspensionRestLength() const; - btScalar m_wheelsRadius; //const - btScalar m_suspensionStiffness; //const - btScalar m_wheelsDampingCompression; //const - btScalar m_wheelsDampingRelaxation; //const - btScalar m_frictionSlip; - btScalar m_steering; - btScalar m_rotation; - btScalar m_deltaRotation; - btScalar m_rollInfluence; - btScalar m_maxSuspensionForce; - - btScalar m_engineForce; - - btScalar m_brake; - - bool m_bIsFrontWheel; - - void* m_clientInfo; //can be used to store pointer to sync transforms... - - btWheelInfo() {} - - btWheelInfo(btWheelInfoConstructionInfo& ci) - - { - m_suspensionRestLength1 = ci.m_suspensionRestLength; - m_maxSuspensionTravelCm = ci.m_maxSuspensionTravelCm; - - m_wheelsRadius = ci.m_wheelRadius; - m_suspensionStiffness = ci.m_suspensionStiffness; - m_wheelsDampingCompression = ci.m_wheelsDampingCompression; - m_wheelsDampingRelaxation = ci.m_wheelsDampingRelaxation; - m_chassisConnectionPointCS = ci.m_chassisConnectionCS; - m_wheelDirectionCS = ci.m_wheelDirectionCS; - m_wheelAxleCS = ci.m_wheelAxleCS; - m_frictionSlip = ci.m_frictionSlip; - m_steering = btScalar(0.); - m_engineForce = btScalar(0.); - m_rotation = btScalar(0.); - m_deltaRotation = btScalar(0.); - m_brake = btScalar(0.); - m_rollInfluence = btScalar(0.1); - m_bIsFrontWheel = ci.m_bIsFrontWheel; - m_maxSuspensionForce = ci.m_maxSuspensionForce; - } - - void updateWheel(const btRigidBody& chassis, RaycastInfo& raycastInfo); - - btScalar m_clippedInvContactDotSuspension; - btScalar m_suspensionRelativeVelocity; - //calculated by suspension - btScalar m_wheelsSuspensionForce; - btScalar m_skidInfo; -}; - -#endif //BT_WHEEL_INFO_H diff --git a/engine/inc/bullet/BulletDynamics/btBulletDynamicsCommon.h b/engine/inc/bullet/BulletDynamics/btBulletDynamicsCommon.h deleted file mode 100644 index a421fa44..00000000 --- a/engine/inc/bullet/BulletDynamics/btBulletDynamicsCommon.h +++ /dev/null @@ -1,43 +0,0 @@ -/* -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 BULLET_DYNAMICS_COMMON_H -#define BULLET_DYNAMICS_COMMON_H - -///Common headerfile includes for Bullet Dynamics, including Collision Detection -#include "btBulletCollisionCommon.h" - -#include "BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h" - -#include "BulletDynamics/Dynamics/btSimpleDynamicsWorld.h" -#include "BulletDynamics/Dynamics/btRigidBody.h" - -#include "BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h" -#include "BulletDynamics/ConstraintSolver/btHingeConstraint.h" -#include "BulletDynamics/ConstraintSolver/btConeTwistConstraint.h" -#include "BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h" -#include "BulletDynamics/ConstraintSolver/btSliderConstraint.h" -#include "BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.h" -#include "BulletDynamics/ConstraintSolver/btUniversalConstraint.h" -#include "BulletDynamics/ConstraintSolver/btHinge2Constraint.h" -#include "BulletDynamics/ConstraintSolver/btGearConstraint.h" -#include "BulletDynamics/ConstraintSolver/btFixedConstraint.h" - -#include "BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h" - -///Vehicle simulation, with wheel contact simulated by raycasts -#include "BulletDynamics/Vehicle/btRaycastVehicle.h" - -#endif //BULLET_DYNAMICS_COMMON_H diff --git a/engine/inc/bullet/BulletFileLoader/autogenerated/bullet.h b/engine/inc/bullet/BulletFileLoader/autogenerated/bullet.h deleted file mode 100644 index bfec77bb..00000000 --- a/engine/inc/bullet/BulletFileLoader/autogenerated/bullet.h +++ /dev/null @@ -1,1580 +0,0 @@ -/* Copyright (C) 2011 Erwin Coumans & Charlie C -* -* 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. -*/ -// Auto generated from Bullet/Extras/HeaderGenerator/bulletGenerate.py -#ifndef __BULLET_H__ -#define __BULLET_H__ -namespace Bullet { - -// put an empty struct in the case -typedef struct bInvalidHandle { - int unused; -}bInvalidHandle; - - class PointerArray; - class btPhysicsSystem; - class ListBase; - class btVector3FloatData; - class btVector3DoubleData; - class btQuaternionFloatData; - class btQuaternionDoubleData; - class btMatrix3x3FloatData; - class btMatrix3x3DoubleData; - class btTransformFloatData; - class btTransformDoubleData; - class btBvhSubtreeInfoData; - class btOptimizedBvhNodeFloatData; - class btOptimizedBvhNodeDoubleData; - class btQuantizedBvhNodeData; - class btQuantizedBvhFloatData; - class btQuantizedBvhDoubleData; - class btCollisionShapeData; - class btStaticPlaneShapeData; - class btConvexInternalShapeData; - class btPositionAndRadius; - class btMultiSphereShapeData; - class btIntIndexData; - class btShortIntIndexData; - class btShortIntIndexTripletData; - class btCharIndexTripletData; - class btMeshPartData; - class btStridingMeshInterfaceData; - class btTriangleMeshShapeData; - class btScaledTriangleMeshShapeData; - class btCompoundShapeChildData; - class btCompoundShapeData; - class btCylinderShapeData; - class btConeShapeData; - class btCapsuleShapeData; - class btTriangleInfoData; - class btTriangleInfoMapData; - class btPersistentManifoldDoubleData; - class btPersistentManifoldFloatData; - class btGImpactMeshShapeData; - class btConvexHullShapeData; - class btCollisionObjectDoubleData; - class btCollisionObjectFloatData; - class btContactSolverInfoDoubleData; - class btContactSolverInfoFloatData; - class btDynamicsWorldDoubleData; - class btDynamicsWorldFloatData; - class btRigidBodyFloatData; - class btRigidBodyDoubleData; - class btConstraintInfo1; - class btTypedConstraintFloatData; - class btTypedConstraintData; - class btTypedConstraintDoubleData; - class btPoint2PointConstraintFloatData; - class btPoint2PointConstraintDoubleData2; - class btPoint2PointConstraintDoubleData; - class btHingeConstraintDoubleData; - class btHingeConstraintFloatData; - class btHingeConstraintDoubleData2; - class btConeTwistConstraintDoubleData; - class btConeTwistConstraintData; - class btGeneric6DofConstraintData; - class btGeneric6DofConstraintDoubleData2; - class btGeneric6DofSpringConstraintData; - class btGeneric6DofSpringConstraintDoubleData2; - class btGeneric6DofSpring2ConstraintData; - class btGeneric6DofSpring2ConstraintDoubleData2; - class btSliderConstraintData; - class btSliderConstraintDoubleData; - class btGearConstraintFloatData; - class btGearConstraintDoubleData; - class SoftBodyMaterialData; - class SoftBodyNodeData; - class SoftBodyLinkData; - class SoftBodyFaceData; - class SoftBodyTetraData; - class SoftRigidAnchorData; - class SoftBodyConfigData; - class SoftBodyPoseData; - class SoftBodyClusterData; - class btSoftBodyJointData; - class btSoftBodyFloatData; - class btMultiBodyLinkDoubleData; - class btMultiBodyLinkFloatData; - class btMultiBodyDoubleData; - class btMultiBodyFloatData; - class btMultiBodyLinkColliderFloatData; - class btMultiBodyLinkColliderDoubleData; -// -------------------------------------------------- // - class PointerArray - { - public: - int m_size; - int m_capacity; - void *m_data; - }; - - -// -------------------------------------------------- // - class btPhysicsSystem - { - public: - PointerArray m_collisionShapes; - PointerArray m_collisionObjects; - PointerArray m_constraints; - }; - - -// -------------------------------------------------- // - class ListBase - { - public: - void *first; - void *last; - }; - - -// -------------------------------------------------- // - class btVector3FloatData - { - public: - float m_floats[4]; - }; - - -// -------------------------------------------------- // - class btVector3DoubleData - { - public: - double m_floats[4]; - }; - - -// -------------------------------------------------- // - class btQuaternionFloatData - { - public: - float m_floats[4]; - }; - - -// -------------------------------------------------- // - class btQuaternionDoubleData - { - public: - double m_floats[4]; - }; - - -// -------------------------------------------------- // - class btMatrix3x3FloatData - { - public: - btVector3FloatData m_el[3]; - }; - - -// -------------------------------------------------- // - class btMatrix3x3DoubleData - { - public: - btVector3DoubleData m_el[3]; - }; - - -// -------------------------------------------------- // - class btTransformFloatData - { - public: - btMatrix3x3FloatData m_basis; - btVector3FloatData m_origin; - }; - - -// -------------------------------------------------- // - class btTransformDoubleData - { - public: - btMatrix3x3DoubleData m_basis; - btVector3DoubleData m_origin; - }; - - -// -------------------------------------------------- // - class btBvhSubtreeInfoData - { - public: - int m_rootNodeIndex; - int m_subtreeSize; - short m_quantizedAabbMin[3]; - short m_quantizedAabbMax[3]; - }; - - -// -------------------------------------------------- // - class btOptimizedBvhNodeFloatData - { - public: - btVector3FloatData m_aabbMinOrg; - btVector3FloatData m_aabbMaxOrg; - int m_escapeIndex; - int m_subPart; - int m_triangleIndex; - char m_pad[4]; - }; - - -// -------------------------------------------------- // - class btOptimizedBvhNodeDoubleData - { - public: - btVector3DoubleData m_aabbMinOrg; - btVector3DoubleData m_aabbMaxOrg; - int m_escapeIndex; - int m_subPart; - int m_triangleIndex; - char m_pad[4]; - }; - - -// -------------------------------------------------- // - class btQuantizedBvhNodeData - { - public: - short m_quantizedAabbMin[3]; - short m_quantizedAabbMax[3]; - int m_escapeIndexOrTriangleIndex; - }; - - -// -------------------------------------------------- // - class btQuantizedBvhFloatData - { - public: - btVector3FloatData m_bvhAabbMin; - btVector3FloatData m_bvhAabbMax; - btVector3FloatData m_bvhQuantization; - int m_curNodeIndex; - int m_useQuantization; - int m_numContiguousLeafNodes; - int m_numQuantizedContiguousNodes; - btOptimizedBvhNodeFloatData *m_contiguousNodesPtr; - btQuantizedBvhNodeData *m_quantizedContiguousNodesPtr; - btBvhSubtreeInfoData *m_subTreeInfoPtr; - int m_traversalMode; - int m_numSubtreeHeaders; - }; - - -// -------------------------------------------------- // - class btQuantizedBvhDoubleData - { - public: - btVector3DoubleData m_bvhAabbMin; - btVector3DoubleData m_bvhAabbMax; - btVector3DoubleData m_bvhQuantization; - int m_curNodeIndex; - int m_useQuantization; - int m_numContiguousLeafNodes; - int m_numQuantizedContiguousNodes; - btOptimizedBvhNodeDoubleData *m_contiguousNodesPtr; - btQuantizedBvhNodeData *m_quantizedContiguousNodesPtr; - int m_traversalMode; - int m_numSubtreeHeaders; - btBvhSubtreeInfoData *m_subTreeInfoPtr; - }; - - -// -------------------------------------------------- // - class btCollisionShapeData - { - public: - char *m_name; - int m_shapeType; - char m_padding[4]; - }; - - -// -------------------------------------------------- // - class btStaticPlaneShapeData - { - public: - btCollisionShapeData m_collisionShapeData; - btVector3FloatData m_localScaling; - btVector3FloatData m_planeNormal; - float m_planeConstant; - char m_pad[4]; - }; - - -// -------------------------------------------------- // - class btConvexInternalShapeData - { - public: - btCollisionShapeData m_collisionShapeData; - btVector3FloatData m_localScaling; - btVector3FloatData m_implicitShapeDimensions; - float m_collisionMargin; - int m_padding; - }; - - -// -------------------------------------------------- // - class btPositionAndRadius - { - public: - btVector3FloatData m_pos; - float m_radius; - }; - - -// -------------------------------------------------- // - class btMultiSphereShapeData - { - public: - btConvexInternalShapeData m_convexInternalShapeData; - btPositionAndRadius *m_localPositionArrayPtr; - int m_localPositionArraySize; - char m_padding[4]; - }; - - -// -------------------------------------------------- // - class btIntIndexData - { - public: - int m_value; - }; - - -// -------------------------------------------------- // - class btShortIntIndexData - { - public: - short m_value; - char m_pad[2]; - }; - - -// -------------------------------------------------- // - class btShortIntIndexTripletData - { - public: - short m_values[3]; - char m_pad[2]; - }; - - -// -------------------------------------------------- // - class btCharIndexTripletData - { - public: - char m_values[3]; - char m_pad; - }; - - -// -------------------------------------------------- // - class btMeshPartData - { - public: - btVector3FloatData *m_vertices3f; - btVector3DoubleData *m_vertices3d; - btIntIndexData *m_indices32; - btShortIntIndexTripletData *m_3indices16; - btCharIndexTripletData *m_3indices8; - btShortIntIndexData *m_indices16; - int m_numTriangles; - int m_numVertices; - }; - - -// -------------------------------------------------- // - class btStridingMeshInterfaceData - { - public: - btMeshPartData *m_meshPartsPtr; - btVector3FloatData m_scaling; - int m_numMeshParts; - char m_padding[4]; - }; - - -// -------------------------------------------------- // - class btTriangleMeshShapeData - { - public: - btCollisionShapeData m_collisionShapeData; - btStridingMeshInterfaceData m_meshInterface; - btQuantizedBvhFloatData *m_quantizedFloatBvh; - btQuantizedBvhDoubleData *m_quantizedDoubleBvh; - btTriangleInfoMapData *m_triangleInfoMap; - float m_collisionMargin; - char m_pad3[4]; - }; - - -// -------------------------------------------------- // - class btScaledTriangleMeshShapeData - { - public: - btTriangleMeshShapeData m_trimeshShapeData; - btVector3FloatData m_localScaling; - }; - - -// -------------------------------------------------- // - class btCompoundShapeChildData - { - public: - btTransformFloatData m_transform; - btCollisionShapeData *m_childShape; - int m_childShapeType; - float m_childMargin; - }; - - -// -------------------------------------------------- // - class btCompoundShapeData - { - public: - btCollisionShapeData m_collisionShapeData; - btCompoundShapeChildData *m_childShapePtr; - int m_numChildShapes; - float m_collisionMargin; - }; - - -// -------------------------------------------------- // - class btCylinderShapeData - { - public: - btConvexInternalShapeData m_convexInternalShapeData; - int m_upAxis; - char m_padding[4]; - }; - - -// -------------------------------------------------- // - class btConeShapeData - { - public: - btConvexInternalShapeData m_convexInternalShapeData; - int m_upIndex; - char m_padding[4]; - }; - - -// -------------------------------------------------- // - class btCapsuleShapeData - { - public: - btConvexInternalShapeData m_convexInternalShapeData; - int m_upAxis; - char m_padding[4]; - }; - - -// -------------------------------------------------- // - class btTriangleInfoData - { - public: - int m_flags; - float m_edgeV0V1Angle; - float m_edgeV1V2Angle; - float m_edgeV2V0Angle; - }; - - -// -------------------------------------------------- // - class btTriangleInfoMapData - { - public: - int *m_hashTablePtr; - int *m_nextPtr; - btTriangleInfoData *m_valueArrayPtr; - int *m_keyArrayPtr; - float m_convexEpsilon; - float m_planarEpsilon; - float m_equalVertexThreshold; - float m_edgeDistanceThreshold; - float m_zeroAreaThreshold; - int m_nextSize; - int m_hashTableSize; - int m_numValues; - int m_numKeys; - char m_padding[4]; - }; - - -// -------------------------------------------------- // - class btPersistentManifoldDoubleData - { - public: - btVector3DoubleData m_pointCacheLocalPointA[4]; - btVector3DoubleData m_pointCacheLocalPointB[4]; - btVector3DoubleData m_pointCachePositionWorldOnA[4]; - btVector3DoubleData m_pointCachePositionWorldOnB[4]; - btVector3DoubleData m_pointCacheNormalWorldOnB[4]; - btVector3DoubleData m_pointCacheLateralFrictionDir1[4]; - btVector3DoubleData m_pointCacheLateralFrictionDir2[4]; - double m_pointCacheDistance[4]; - double m_pointCacheAppliedImpulse[4]; - double m_pointCachePrevRHS[4]; - double m_pointCacheCombinedFriction[4]; - double m_pointCacheCombinedRollingFriction[4]; - double m_pointCacheCombinedSpinningFriction[4]; - double m_pointCacheCombinedRestitution[4]; - int m_pointCachePartId0[4]; - int m_pointCachePartId1[4]; - int m_pointCacheIndex0[4]; - int m_pointCacheIndex1[4]; - int m_pointCacheContactPointFlags[4]; - double m_pointCacheAppliedImpulseLateral1[4]; - double m_pointCacheAppliedImpulseLateral2[4]; - double m_pointCacheContactMotion1[4]; - double m_pointCacheContactMotion2[4]; - double m_pointCacheContactCFM[4]; - double m_pointCacheCombinedContactStiffness1[4]; - double m_pointCacheContactERP[4]; - double m_pointCacheCombinedContactDamping1[4]; - double m_pointCacheFrictionCFM[4]; - int m_pointCacheLifeTime[4]; - int m_numCachedPoints; - int m_companionIdA; - int m_companionIdB; - int m_index1a; - int m_objectType; - double m_contactBreakingThreshold; - double m_contactProcessingThreshold; - int m_padding; - btCollisionObjectDoubleData *m_body0; - btCollisionObjectDoubleData *m_body1; - }; - - -// -------------------------------------------------- // - class btPersistentManifoldFloatData - { - public: - btVector3FloatData m_pointCacheLocalPointA[4]; - btVector3FloatData m_pointCacheLocalPointB[4]; - btVector3FloatData m_pointCachePositionWorldOnA[4]; - btVector3FloatData m_pointCachePositionWorldOnB[4]; - btVector3FloatData m_pointCacheNormalWorldOnB[4]; - btVector3FloatData m_pointCacheLateralFrictionDir1[4]; - btVector3FloatData m_pointCacheLateralFrictionDir2[4]; - float m_pointCacheDistance[4]; - float m_pointCacheAppliedImpulse[4]; - float m_pointCachePrevRHS[4]; - float m_pointCacheCombinedFriction[4]; - float m_pointCacheCombinedRollingFriction[4]; - float m_pointCacheCombinedSpinningFriction[4]; - float m_pointCacheCombinedRestitution[4]; - int m_pointCachePartId0[4]; - int m_pointCachePartId1[4]; - int m_pointCacheIndex0[4]; - int m_pointCacheIndex1[4]; - int m_pointCacheContactPointFlags[4]; - float m_pointCacheAppliedImpulseLateral1[4]; - float m_pointCacheAppliedImpulseLateral2[4]; - float m_pointCacheContactMotion1[4]; - float m_pointCacheContactMotion2[4]; - float m_pointCacheContactCFM[4]; - float m_pointCacheCombinedContactStiffness1[4]; - float m_pointCacheContactERP[4]; - float m_pointCacheCombinedContactDamping1[4]; - float m_pointCacheFrictionCFM[4]; - int m_pointCacheLifeTime[4]; - int m_numCachedPoints; - int m_companionIdA; - int m_companionIdB; - int m_index1a; - int m_objectType; - float m_contactBreakingThreshold; - float m_contactProcessingThreshold; - int m_padding; - btCollisionObjectFloatData *m_body0; - btCollisionObjectFloatData *m_body1; - }; - - -// -------------------------------------------------- // - class btGImpactMeshShapeData - { - public: - btCollisionShapeData m_collisionShapeData; - btStridingMeshInterfaceData m_meshInterface; - btVector3FloatData m_localScaling; - float m_collisionMargin; - int m_gimpactSubType; - }; - - -// -------------------------------------------------- // - class btConvexHullShapeData - { - public: - btConvexInternalShapeData m_convexInternalShapeData; - btVector3FloatData *m_unscaledPointsFloatPtr; - btVector3DoubleData *m_unscaledPointsDoublePtr; - int m_numUnscaledPoints; - char m_padding3[4]; - }; - - -// -------------------------------------------------- // - class btCollisionObjectDoubleData - { - public: - void *m_broadphaseHandle; - void *m_collisionShape; - btCollisionShapeData *m_rootCollisionShape; - char *m_name; - btTransformDoubleData m_worldTransform; - btTransformDoubleData m_interpolationWorldTransform; - btVector3DoubleData m_interpolationLinearVelocity; - btVector3DoubleData m_interpolationAngularVelocity; - btVector3DoubleData m_anisotropicFriction; - double m_contactProcessingThreshold; - double m_deactivationTime; - double m_friction; - double m_rollingFriction; - double m_contactDamping; - double m_contactStiffness; - double m_restitution; - double m_hitFraction; - double m_ccdSweptSphereRadius; - double m_ccdMotionThreshold; - int m_hasAnisotropicFriction; - int m_collisionFlags; - int m_islandTag1; - int m_companionId; - int m_activationState1; - int m_internalType; - int m_checkCollideWith; - int m_collisionFilterGroup; - int m_collisionFilterMask; - int m_uniqueId; - }; - - -// -------------------------------------------------- // - class btCollisionObjectFloatData - { - public: - void *m_broadphaseHandle; - void *m_collisionShape; - btCollisionShapeData *m_rootCollisionShape; - char *m_name; - btTransformFloatData m_worldTransform; - btTransformFloatData m_interpolationWorldTransform; - btVector3FloatData m_interpolationLinearVelocity; - btVector3FloatData m_interpolationAngularVelocity; - btVector3FloatData m_anisotropicFriction; - float m_contactProcessingThreshold; - float m_deactivationTime; - float m_friction; - float m_rollingFriction; - float m_contactDamping; - float m_contactStiffness; - float m_restitution; - float m_hitFraction; - float m_ccdSweptSphereRadius; - float m_ccdMotionThreshold; - int m_hasAnisotropicFriction; - int m_collisionFlags; - int m_islandTag1; - int m_companionId; - int m_activationState1; - int m_internalType; - int m_checkCollideWith; - int m_collisionFilterGroup; - int m_collisionFilterMask; - int m_uniqueId; - }; - - -// -------------------------------------------------- // - class btContactSolverInfoDoubleData - { - public: - double m_tau; - double m_damping; - double m_friction; - double m_timeStep; - double m_restitution; - double m_maxErrorReduction; - double m_sor; - double m_erp; - double m_erp2; - double m_globalCfm; - double m_splitImpulsePenetrationThreshold; - double m_splitImpulseTurnErp; - double m_linearSlop; - double m_warmstartingFactor; - double m_articulatedWarmstartingFactor; - double m_maxGyroscopicForce; - double m_singleAxisRollingFrictionThreshold; - int m_numIterations; - int m_solverMode; - int m_restingContactRestitutionThreshold; - int m_minimumSolverBatchSize; - int m_splitImpulse; - char m_padding[4]; - }; - - -// -------------------------------------------------- // - class btContactSolverInfoFloatData - { - public: - float m_tau; - float m_damping; - float m_friction; - float m_timeStep; - float m_restitution; - float m_maxErrorReduction; - float m_sor; - float m_erp; - float m_erp2; - float m_globalCfm; - float m_splitImpulsePenetrationThreshold; - float m_splitImpulseTurnErp; - float m_linearSlop; - float m_warmstartingFactor; - float m_articulatedWarmstartingFactor; - float m_maxGyroscopicForce; - float m_singleAxisRollingFrictionThreshold; - int m_numIterations; - int m_solverMode; - int m_restingContactRestitutionThreshold; - int m_minimumSolverBatchSize; - int m_splitImpulse; - }; - - -// -------------------------------------------------- // - class btDynamicsWorldDoubleData - { - public: - btContactSolverInfoDoubleData m_solverInfo; - btVector3DoubleData m_gravity; - }; - - -// -------------------------------------------------- // - class btDynamicsWorldFloatData - { - public: - btContactSolverInfoFloatData m_solverInfo; - btVector3FloatData m_gravity; - }; - - -// -------------------------------------------------- // - class btRigidBodyFloatData - { - public: - btCollisionObjectFloatData m_collisionObjectData; - btMatrix3x3FloatData m_invInertiaTensorWorld; - btVector3FloatData m_linearVelocity; - btVector3FloatData m_angularVelocity; - btVector3FloatData m_angularFactor; - btVector3FloatData m_linearFactor; - btVector3FloatData m_gravity; - btVector3FloatData m_gravity_acceleration; - btVector3FloatData m_invInertiaLocal; - btVector3FloatData m_totalForce; - btVector3FloatData m_totalTorque; - float m_inverseMass; - float m_linearDamping; - float m_angularDamping; - float m_additionalDampingFactor; - float m_additionalLinearDampingThresholdSqr; - float m_additionalAngularDampingThresholdSqr; - float m_additionalAngularDampingFactor; - float m_linearSleepingThreshold; - float m_angularSleepingThreshold; - int m_additionalDamping; - }; - - -// -------------------------------------------------- // - class btRigidBodyDoubleData - { - public: - btCollisionObjectDoubleData m_collisionObjectData; - btMatrix3x3DoubleData m_invInertiaTensorWorld; - btVector3DoubleData m_linearVelocity; - btVector3DoubleData m_angularVelocity; - btVector3DoubleData m_angularFactor; - btVector3DoubleData m_linearFactor; - btVector3DoubleData m_gravity; - btVector3DoubleData m_gravity_acceleration; - btVector3DoubleData m_invInertiaLocal; - btVector3DoubleData m_totalForce; - btVector3DoubleData m_totalTorque; - double m_inverseMass; - double m_linearDamping; - double m_angularDamping; - double m_additionalDampingFactor; - double m_additionalLinearDampingThresholdSqr; - double m_additionalAngularDampingThresholdSqr; - double m_additionalAngularDampingFactor; - double m_linearSleepingThreshold; - double m_angularSleepingThreshold; - int m_additionalDamping; - char m_padding[4]; - }; - - -// -------------------------------------------------- // - class btConstraintInfo1 - { - public: - int m_numConstraintRows; - int nub; - }; - - -// -------------------------------------------------- // - class btTypedConstraintFloatData - { - public: - btRigidBodyFloatData *m_rbA; - btRigidBodyFloatData *m_rbB; - char *m_name; - int m_objectType; - int m_userConstraintType; - int m_userConstraintId; - int m_needsFeedback; - float m_appliedImpulse; - float m_dbgDrawSize; - int m_disableCollisionsBetweenLinkedBodies; - int m_overrideNumSolverIterations; - float m_breakingImpulseThreshold; - int m_isEnabled; - }; - - -// -------------------------------------------------- // - class btTypedConstraintData - { - public: - bInvalidHandle *m_rbA; - bInvalidHandle *m_rbB; - char *m_name; - int m_objectType; - int m_userConstraintType; - int m_userConstraintId; - int m_needsFeedback; - float m_appliedImpulse; - float m_dbgDrawSize; - int m_disableCollisionsBetweenLinkedBodies; - int m_overrideNumSolverIterations; - float m_breakingImpulseThreshold; - int m_isEnabled; - }; - - -// -------------------------------------------------- // - class btTypedConstraintDoubleData - { - public: - btRigidBodyDoubleData *m_rbA; - btRigidBodyDoubleData *m_rbB; - char *m_name; - int m_objectType; - int m_userConstraintType; - int m_userConstraintId; - int m_needsFeedback; - double m_appliedImpulse; - double m_dbgDrawSize; - int m_disableCollisionsBetweenLinkedBodies; - int m_overrideNumSolverIterations; - double m_breakingImpulseThreshold; - int m_isEnabled; - char padding[4]; - }; - - -// -------------------------------------------------- // - class btPoint2PointConstraintFloatData - { - public: - btTypedConstraintData m_typeConstraintData; - btVector3FloatData m_pivotInA; - btVector3FloatData m_pivotInB; - }; - - -// -------------------------------------------------- // - class btPoint2PointConstraintDoubleData2 - { - public: - btTypedConstraintDoubleData m_typeConstraintData; - btVector3DoubleData m_pivotInA; - btVector3DoubleData m_pivotInB; - }; - - -// -------------------------------------------------- // - class btPoint2PointConstraintDoubleData - { - public: - btTypedConstraintData m_typeConstraintData; - btVector3DoubleData m_pivotInA; - btVector3DoubleData m_pivotInB; - }; - - -// -------------------------------------------------- // - class btHingeConstraintDoubleData - { - public: - btTypedConstraintData m_typeConstraintData; - btTransformDoubleData m_rbAFrame; - btTransformDoubleData m_rbBFrame; - int m_useReferenceFrameA; - int m_angularOnly; - int m_enableAngularMotor; - float m_motorTargetVelocity; - float m_maxMotorImpulse; - float m_lowerLimit; - float m_upperLimit; - float m_limitSoftness; - float m_biasFactor; - float m_relaxationFactor; - }; - - -// -------------------------------------------------- // - class btHingeConstraintFloatData - { - public: - btTypedConstraintData m_typeConstraintData; - btTransformFloatData m_rbAFrame; - btTransformFloatData m_rbBFrame; - int m_useReferenceFrameA; - int m_angularOnly; - int m_enableAngularMotor; - float m_motorTargetVelocity; - float m_maxMotorImpulse; - float m_lowerLimit; - float m_upperLimit; - float m_limitSoftness; - float m_biasFactor; - float m_relaxationFactor; - }; - - -// -------------------------------------------------- // - class btHingeConstraintDoubleData2 - { - public: - btTypedConstraintDoubleData m_typeConstraintData; - btTransformDoubleData m_rbAFrame; - btTransformDoubleData m_rbBFrame; - int m_useReferenceFrameA; - int m_angularOnly; - int m_enableAngularMotor; - double m_motorTargetVelocity; - double m_maxMotorImpulse; - double m_lowerLimit; - double m_upperLimit; - double m_limitSoftness; - double m_biasFactor; - double m_relaxationFactor; - char m_padding1[4]; - }; - - -// -------------------------------------------------- // - class btConeTwistConstraintDoubleData - { - public: - btTypedConstraintDoubleData m_typeConstraintData; - btTransformDoubleData m_rbAFrame; - btTransformDoubleData m_rbBFrame; - double m_swingSpan1; - double m_swingSpan2; - double m_twistSpan; - double m_limitSoftness; - double m_biasFactor; - double m_relaxationFactor; - double m_damping; - }; - - -// -------------------------------------------------- // - class btConeTwistConstraintData - { - public: - btTypedConstraintData m_typeConstraintData; - btTransformFloatData m_rbAFrame; - btTransformFloatData m_rbBFrame; - float m_swingSpan1; - float m_swingSpan2; - float m_twistSpan; - float m_limitSoftness; - float m_biasFactor; - float m_relaxationFactor; - float m_damping; - char m_pad[4]; - }; - - -// -------------------------------------------------- // - class btGeneric6DofConstraintData - { - public: - btTypedConstraintData m_typeConstraintData; - btTransformFloatData m_rbAFrame; - btTransformFloatData m_rbBFrame; - btVector3FloatData m_linearUpperLimit; - btVector3FloatData m_linearLowerLimit; - btVector3FloatData m_angularUpperLimit; - btVector3FloatData m_angularLowerLimit; - int m_useLinearReferenceFrameA; - int m_useOffsetForConstraintFrame; - }; - - -// -------------------------------------------------- // - class btGeneric6DofConstraintDoubleData2 - { - public: - btTypedConstraintDoubleData m_typeConstraintData; - btTransformDoubleData m_rbAFrame; - btTransformDoubleData m_rbBFrame; - btVector3DoubleData m_linearUpperLimit; - btVector3DoubleData m_linearLowerLimit; - btVector3DoubleData m_angularUpperLimit; - btVector3DoubleData m_angularLowerLimit; - int m_useLinearReferenceFrameA; - int m_useOffsetForConstraintFrame; - }; - - -// -------------------------------------------------- // - class btGeneric6DofSpringConstraintData - { - public: - btGeneric6DofConstraintData m_6dofData; - int m_springEnabled[6]; - float m_equilibriumPoint[6]; - float m_springStiffness[6]; - float m_springDamping[6]; - }; - - -// -------------------------------------------------- // - class btGeneric6DofSpringConstraintDoubleData2 - { - public: - btGeneric6DofConstraintDoubleData2 m_6dofData; - int m_springEnabled[6]; - double m_equilibriumPoint[6]; - double m_springStiffness[6]; - double m_springDamping[6]; - }; - - -// -------------------------------------------------- // - class btGeneric6DofSpring2ConstraintData - { - public: - btTypedConstraintData m_typeConstraintData; - btTransformFloatData m_rbAFrame; - btTransformFloatData m_rbBFrame; - btVector3FloatData m_linearUpperLimit; - btVector3FloatData m_linearLowerLimit; - btVector3FloatData m_linearBounce; - btVector3FloatData m_linearStopERP; - btVector3FloatData m_linearStopCFM; - btVector3FloatData m_linearMotorERP; - btVector3FloatData m_linearMotorCFM; - btVector3FloatData m_linearTargetVelocity; - btVector3FloatData m_linearMaxMotorForce; - btVector3FloatData m_linearServoTarget; - btVector3FloatData m_linearSpringStiffness; - btVector3FloatData m_linearSpringDamping; - btVector3FloatData m_linearEquilibriumPoint; - char m_linearEnableMotor[4]; - char m_linearServoMotor[4]; - char m_linearEnableSpring[4]; - char m_linearSpringStiffnessLimited[4]; - char m_linearSpringDampingLimited[4]; - char m_padding1[4]; - btVector3FloatData m_angularUpperLimit; - btVector3FloatData m_angularLowerLimit; - btVector3FloatData m_angularBounce; - btVector3FloatData m_angularStopERP; - btVector3FloatData m_angularStopCFM; - btVector3FloatData m_angularMotorERP; - btVector3FloatData m_angularMotorCFM; - btVector3FloatData m_angularTargetVelocity; - btVector3FloatData m_angularMaxMotorForce; - btVector3FloatData m_angularServoTarget; - btVector3FloatData m_angularSpringStiffness; - btVector3FloatData m_angularSpringDamping; - btVector3FloatData m_angularEquilibriumPoint; - char m_angularEnableMotor[4]; - char m_angularServoMotor[4]; - char m_angularEnableSpring[4]; - char m_angularSpringStiffnessLimited[4]; - char m_angularSpringDampingLimited[4]; - int m_rotateOrder; - }; - - -// -------------------------------------------------- // - class btGeneric6DofSpring2ConstraintDoubleData2 - { - public: - btTypedConstraintDoubleData m_typeConstraintData; - btTransformDoubleData m_rbAFrame; - btTransformDoubleData m_rbBFrame; - btVector3DoubleData m_linearUpperLimit; - btVector3DoubleData m_linearLowerLimit; - btVector3DoubleData m_linearBounce; - btVector3DoubleData m_linearStopERP; - btVector3DoubleData m_linearStopCFM; - btVector3DoubleData m_linearMotorERP; - btVector3DoubleData m_linearMotorCFM; - btVector3DoubleData m_linearTargetVelocity; - btVector3DoubleData m_linearMaxMotorForce; - btVector3DoubleData m_linearServoTarget; - btVector3DoubleData m_linearSpringStiffness; - btVector3DoubleData m_linearSpringDamping; - btVector3DoubleData m_linearEquilibriumPoint; - char m_linearEnableMotor[4]; - char m_linearServoMotor[4]; - char m_linearEnableSpring[4]; - char m_linearSpringStiffnessLimited[4]; - char m_linearSpringDampingLimited[4]; - char m_padding1[4]; - btVector3DoubleData m_angularUpperLimit; - btVector3DoubleData m_angularLowerLimit; - btVector3DoubleData m_angularBounce; - btVector3DoubleData m_angularStopERP; - btVector3DoubleData m_angularStopCFM; - btVector3DoubleData m_angularMotorERP; - btVector3DoubleData m_angularMotorCFM; - btVector3DoubleData m_angularTargetVelocity; - btVector3DoubleData m_angularMaxMotorForce; - btVector3DoubleData m_angularServoTarget; - btVector3DoubleData m_angularSpringStiffness; - btVector3DoubleData m_angularSpringDamping; - btVector3DoubleData m_angularEquilibriumPoint; - char m_angularEnableMotor[4]; - char m_angularServoMotor[4]; - char m_angularEnableSpring[4]; - char m_angularSpringStiffnessLimited[4]; - char m_angularSpringDampingLimited[4]; - int m_rotateOrder; - }; - - -// -------------------------------------------------- // - class btSliderConstraintData - { - public: - btTypedConstraintData m_typeConstraintData; - btTransformFloatData m_rbAFrame; - btTransformFloatData m_rbBFrame; - float m_linearUpperLimit; - float m_linearLowerLimit; - float m_angularUpperLimit; - float m_angularLowerLimit; - int m_useLinearReferenceFrameA; - int m_useOffsetForConstraintFrame; - }; - - -// -------------------------------------------------- // - class btSliderConstraintDoubleData - { - public: - btTypedConstraintDoubleData m_typeConstraintData; - btTransformDoubleData m_rbAFrame; - btTransformDoubleData m_rbBFrame; - double m_linearUpperLimit; - double m_linearLowerLimit; - double m_angularUpperLimit; - double m_angularLowerLimit; - int m_useLinearReferenceFrameA; - int m_useOffsetForConstraintFrame; - }; - - -// -------------------------------------------------- // - class btGearConstraintFloatData - { - public: - btTypedConstraintFloatData m_typeConstraintData; - btVector3FloatData m_axisInA; - btVector3FloatData m_axisInB; - float m_ratio; - char m_padding[4]; - }; - - -// -------------------------------------------------- // - class btGearConstraintDoubleData - { - public: - btTypedConstraintDoubleData m_typeConstraintData; - btVector3DoubleData m_axisInA; - btVector3DoubleData m_axisInB; - double m_ratio; - }; - - -// -------------------------------------------------- // - class SoftBodyMaterialData - { - public: - float m_linearStiffness; - float m_angularStiffness; - float m_volumeStiffness; - int m_flags; - }; - - -// -------------------------------------------------- // - class SoftBodyNodeData - { - public: - SoftBodyMaterialData *m_material; - btVector3FloatData m_position; - btVector3FloatData m_previousPosition; - btVector3FloatData m_velocity; - btVector3FloatData m_accumulatedForce; - btVector3FloatData m_normal; - float m_inverseMass; - float m_area; - int m_attach; - int m_pad; - }; - - -// -------------------------------------------------- // - class SoftBodyLinkData - { - public: - SoftBodyMaterialData *m_material; - int m_nodeIndices[2]; - float m_restLength; - int m_bbending; - }; - - -// -------------------------------------------------- // - class SoftBodyFaceData - { - public: - btVector3FloatData m_normal; - SoftBodyMaterialData *m_material; - int m_nodeIndices[3]; - float m_restArea; - }; - - -// -------------------------------------------------- // - class SoftBodyTetraData - { - public: - btVector3FloatData m_c0[4]; - SoftBodyMaterialData *m_material; - int m_nodeIndices[4]; - float m_restVolume; - float m_c1; - float m_c2; - int m_pad; - }; - - -// -------------------------------------------------- // - class SoftRigidAnchorData - { - public: - btMatrix3x3FloatData m_c0; - btVector3FloatData m_c1; - btVector3FloatData m_localFrame; - bInvalidHandle *m_rigidBody; - int m_nodeIndex; - float m_c2; - }; - - -// -------------------------------------------------- // - class SoftBodyConfigData - { - public: - int m_aeroModel; - float m_baumgarte; - float m_damping; - float m_drag; - float m_lift; - float m_pressure; - float m_volume; - float m_dynamicFriction; - float m_poseMatch; - float m_rigidContactHardness; - float m_kineticContactHardness; - float m_softContactHardness; - float m_anchorHardness; - float m_softRigidClusterHardness; - float m_softKineticClusterHardness; - float m_softSoftClusterHardness; - float m_softRigidClusterImpulseSplit; - float m_softKineticClusterImpulseSplit; - float m_softSoftClusterImpulseSplit; - float m_maxVolume; - float m_timeScale; - int m_velocityIterations; - int m_positionIterations; - int m_driftIterations; - int m_clusterIterations; - int m_collisionFlags; - }; - - -// -------------------------------------------------- // - class SoftBodyPoseData - { - public: - btMatrix3x3FloatData m_rot; - btMatrix3x3FloatData m_scale; - btMatrix3x3FloatData m_aqq; - btVector3FloatData m_com; - btVector3FloatData *m_positions; - float *m_weights; - int m_numPositions; - int m_numWeigts; - int m_bvolume; - int m_bframe; - float m_restVolume; - int m_pad; - }; - - -// -------------------------------------------------- // - class SoftBodyClusterData - { - public: - btTransformFloatData m_framexform; - btMatrix3x3FloatData m_locii; - btMatrix3x3FloatData m_invwi; - btVector3FloatData m_com; - btVector3FloatData m_vimpulses[2]; - btVector3FloatData m_dimpulses[2]; - btVector3FloatData m_lv; - btVector3FloatData m_av; - btVector3FloatData *m_framerefs; - int *m_nodeIndices; - float *m_masses; - int m_numFrameRefs; - int m_numNodes; - int m_numMasses; - float m_idmass; - float m_imass; - int m_nvimpulses; - int m_ndimpulses; - float m_ndamping; - float m_ldamping; - float m_adamping; - float m_matching; - float m_maxSelfCollisionImpulse; - float m_selfCollisionImpulseFactor; - int m_containsAnchor; - int m_collide; - int m_clusterIndex; - }; - - -// -------------------------------------------------- // - class btSoftBodyJointData - { - public: - void *m_bodyA; - void *m_bodyB; - btVector3FloatData m_refs[2]; - float m_cfm; - float m_erp; - float m_split; - int m_delete; - btVector3FloatData m_relPosition[2]; - int m_bodyAtype; - int m_bodyBtype; - int m_jointType; - int m_pad; - }; - - -// -------------------------------------------------- // - class btSoftBodyFloatData - { - public: - btCollisionObjectFloatData m_collisionObjectData; - SoftBodyPoseData *m_pose; - SoftBodyMaterialData **m_materials; - SoftBodyNodeData *m_nodes; - SoftBodyLinkData *m_links; - SoftBodyFaceData *m_faces; - SoftBodyTetraData *m_tetrahedra; - SoftRigidAnchorData *m_anchors; - SoftBodyClusterData *m_clusters; - btSoftBodyJointData *m_joints; - int m_numMaterials; - int m_numNodes; - int m_numLinks; - int m_numFaces; - int m_numTetrahedra; - int m_numAnchors; - int m_numClusters; - int m_numJoints; - SoftBodyConfigData m_config; - }; - - -// -------------------------------------------------- // - class btMultiBodyLinkDoubleData - { - public: - btQuaternionDoubleData m_zeroRotParentToThis; - btVector3DoubleData m_parentComToThisPivotOffset; - btVector3DoubleData m_thisPivotToThisComOffset; - btVector3DoubleData m_jointAxisTop[6]; - btVector3DoubleData m_jointAxisBottom[6]; - btVector3DoubleData m_linkInertia; - btVector3DoubleData m_absFrameTotVelocityTop; - btVector3DoubleData m_absFrameTotVelocityBottom; - btVector3DoubleData m_absFrameLocVelocityTop; - btVector3DoubleData m_absFrameLocVelocityBottom; - double m_linkMass; - int m_parentIndex; - int m_jointType; - int m_dofCount; - int m_posVarCount; - double m_jointPos[7]; - double m_jointVel[6]; - double m_jointTorque[6]; - double m_jointDamping; - double m_jointFriction; - double m_jointLowerLimit; - double m_jointUpperLimit; - double m_jointMaxForce; - double m_jointMaxVelocity; - char *m_linkName; - char *m_jointName; - btCollisionObjectDoubleData *m_linkCollider; - char *m_paddingPtr; - }; - - -// -------------------------------------------------- // - class btMultiBodyLinkFloatData - { - public: - btQuaternionFloatData m_zeroRotParentToThis; - btVector3FloatData m_parentComToThisPivotOffset; - btVector3FloatData m_thisPivotToThisComOffset; - btVector3FloatData m_jointAxisTop[6]; - btVector3FloatData m_jointAxisBottom[6]; - btVector3FloatData m_linkInertia; - btVector3FloatData m_absFrameTotVelocityTop; - btVector3FloatData m_absFrameTotVelocityBottom; - btVector3FloatData m_absFrameLocVelocityTop; - btVector3FloatData m_absFrameLocVelocityBottom; - int m_dofCount; - float m_linkMass; - int m_parentIndex; - int m_jointType; - float m_jointPos[7]; - float m_jointVel[6]; - float m_jointTorque[6]; - int m_posVarCount; - float m_jointDamping; - float m_jointFriction; - float m_jointLowerLimit; - float m_jointUpperLimit; - float m_jointMaxForce; - float m_jointMaxVelocity; - char *m_linkName; - char *m_jointName; - btCollisionObjectFloatData *m_linkCollider; - char *m_paddingPtr; - }; - - -// -------------------------------------------------- // - class btMultiBodyDoubleData - { - public: - btVector3DoubleData m_baseWorldPosition; - btQuaternionDoubleData m_baseWorldOrientation; - btVector3DoubleData m_baseLinearVelocity; - btVector3DoubleData m_baseAngularVelocity; - btVector3DoubleData m_baseInertia; - double m_baseMass; - int m_numLinks; - char m_padding[4]; - char *m_baseName; - btMultiBodyLinkDoubleData *m_links; - btCollisionObjectDoubleData *m_baseCollider; - }; - - -// -------------------------------------------------- // - class btMultiBodyFloatData - { - public: - btVector3FloatData m_baseWorldPosition; - btQuaternionFloatData m_baseWorldOrientation; - btVector3FloatData m_baseLinearVelocity; - btVector3FloatData m_baseAngularVelocity; - btVector3FloatData m_baseInertia; - float m_baseMass; - int m_numLinks; - char *m_baseName; - btMultiBodyLinkFloatData *m_links; - btCollisionObjectFloatData *m_baseCollider; - }; - - -// -------------------------------------------------- // - class btMultiBodyLinkColliderFloatData - { - public: - btCollisionObjectFloatData m_colObjData; - btMultiBodyFloatData *m_multiBody; - int m_link; - char m_padding[4]; - }; - - -// -------------------------------------------------- // - class btMultiBodyLinkColliderDoubleData - { - public: - btCollisionObjectDoubleData m_colObjData; - btMultiBodyDoubleData *m_multiBody; - int m_link; - char m_padding[4]; - }; - - -} -#endif//__BULLET_H__ \ No newline at end of file diff --git a/engine/inc/bullet/BulletFileLoader/bChunk.h b/engine/inc/bullet/BulletFileLoader/bChunk.h deleted file mode 100644 index 514a35a3..00000000 --- a/engine/inc/bullet/BulletFileLoader/bChunk.h +++ /dev/null @@ -1,84 +0,0 @@ -/* -bParse -Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.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 __BCHUNK_H__ -#define __BCHUNK_H__ - -#if defined(_WIN32) && !defined(__MINGW32__) -#define long64 __int64 -#elif defined(__MINGW32__) -#include -#define long64 int64_t -#else -#define long64 long long -#endif - -namespace bParse -{ -// ----------------------------------------------------- // -class bChunkPtr4 -{ -public: - bChunkPtr4() {} - int code; - int len; - union { - int m_uniqueInt; - }; - int dna_nr; - int nr; -}; - -// ----------------------------------------------------- // -class bChunkPtr8 -{ -public: - bChunkPtr8() {} - int code, len; - union { - long64 oldPrev; - int m_uniqueInts[2]; - }; - int dna_nr, nr; -}; - -// ----------------------------------------------------- // -class bChunkInd -{ -public: - bChunkInd() {} - int code, len; - void *oldPtr; - int dna_nr, nr; -}; - -// ----------------------------------------------------- // -class ChunkUtils -{ -public: - // file chunk offset - static int getOffset(int flags); - - // endian utils - static short swapShort(short sht); - static int swapInt(int inte); - static long64 swapLong64(long64 lng); -}; - -const int CHUNK_HEADER_LEN = ((sizeof(bChunkInd))); -const bool VOID_IS_8 = ((sizeof(void *) == 8)); -} // namespace bParse - -#endif //__BCHUNK_H__ diff --git a/engine/inc/bullet/BulletFileLoader/bCommon.h b/engine/inc/bullet/BulletFileLoader/bCommon.h deleted file mode 100644 index a3f599f8..00000000 --- a/engine/inc/bullet/BulletFileLoader/bCommon.h +++ /dev/null @@ -1,40 +0,0 @@ -/* -bParse -Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.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 __BCOMMON_H__ -#define __BCOMMON_H__ - -#include -//#include "bLog.h" -#include "LinearMath/btAlignedObjectArray.h" -#include "LinearMath/btHashMap.h" - -namespace bParse -{ -class bMain; -class bFileData; -class bFile; -class bDNA; - -// delete void* undefined -typedef struct bStructHandle -{ - int unused; -} bStructHandle; -typedef btAlignedObjectArray bListBasePtr; -typedef btHashMap bPtrMap; -} // namespace bParse - -#endif //__BCOMMON_H__ diff --git a/engine/inc/bullet/BulletFileLoader/bDNA.h b/engine/inc/bullet/BulletFileLoader/bDNA.h deleted file mode 100644 index 4b1c530f..00000000 --- a/engine/inc/bullet/BulletFileLoader/bDNA.h +++ /dev/null @@ -1,101 +0,0 @@ -/* -bParse -Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.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 __BDNA_H__ -#define __BDNA_H__ - -#include "bCommon.h" - -namespace bParse -{ -struct bNameInfo -{ - char *m_name; - bool m_isPointer; - int m_dim0; - int m_dim1; -}; - -class bDNA -{ -public: - bDNA(); - ~bDNA(); - - void init(char *data, int len, bool swap = false); - - int getArraySize(char *str); - int getArraySizeNew(short name) - { - const bNameInfo &nameInfo = m_Names[name]; - return nameInfo.m_dim0 * nameInfo.m_dim1; - } - int getElementSize(short type, short name) - { - const bNameInfo &nameInfo = m_Names[name]; - int size = nameInfo.m_isPointer ? mPtrLen * nameInfo.m_dim0 * nameInfo.m_dim1 : mTlens[type] * nameInfo.m_dim0 * nameInfo.m_dim1; - return size; - } - - int getNumNames() const - { - return m_Names.size(); - } - - char *getName(int ind); - char *getType(int ind); - short *getStruct(int ind); - short getLength(int ind); - int getReverseType(short type); - int getReverseType(const char *type); - - int getNumStructs(); - - // - bool lessThan(bDNA *other); - - void initCmpFlags(bDNA *memDNA); - bool flagNotEqual(int dna_nr); - bool flagEqual(int dna_nr); - bool flagNone(int dna_nr); - - int getPointerSize(); - - void dumpTypeDefinitions(); - -private: - enum FileDNAFlags - { - FDF_NONE = 0, - FDF_STRUCT_NEQU, - FDF_STRUCT_EQU - }; - - void initRecurseCmpFlags(int i); - - btAlignedObjectArray mCMPFlags; - - btAlignedObjectArray m_Names; - btAlignedObjectArray mTypes; - btAlignedObjectArray mStructs; - btAlignedObjectArray mTlens; - btHashMap mStructReverse; - btHashMap mTypeLookup; - - int mPtrLen; -}; -} // namespace bParse - -#endif //__BDNA_H__ diff --git a/engine/inc/bullet/BulletFileLoader/bDefines.h b/engine/inc/bullet/BulletFileLoader/bDefines.h deleted file mode 100644 index c5ad20ac..00000000 --- a/engine/inc/bullet/BulletFileLoader/bDefines.h +++ /dev/null @@ -1,152 +0,0 @@ -/* Copyright (C) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.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 __B_DEFINES_H__ -#define __B_DEFINES_H__ - -// MISC defines, see BKE_global.h, BKE_utildefines.h -#define SIZEOFBLENDERHEADER 12 - -// ------------------------------------------------------------ -#if defined(__sgi) || defined(__sparc) || defined(__sparc__) || defined(__PPC__) || defined(__ppc__) || defined(__BIG_ENDIAN__) -#define MAKE_ID(a, b, c, d) ((int)(a) << 24 | (int)(b) << 16 | (c) << 8 | (d)) -#else -#define MAKE_ID(a, b, c, d) ((int)(d) << 24 | (int)(c) << 16 | (b) << 8 | (a)) -#endif - -// ------------------------------------------------------------ -#if defined(__sgi) || defined(__sparc) || defined(__sparc__) || defined(__PPC__) || defined(__ppc__) || defined(__BIG_ENDIAN__) -#define MAKE_ID2(c, d) ((c) << 8 | (d)) -#define MOST_SIG_BYTE 0 -#define BBIG_ENDIAN -#else -#define MAKE_ID2(c, d) ((d) << 8 | (c)) -#define MOST_SIG_BYTE 1 -#define BLITTLE_ENDIAN -#endif - -// ------------------------------------------------------------ -#define ID_SCE MAKE_ID2('S', 'C') -#define ID_LI MAKE_ID2('L', 'I') -#define ID_OB MAKE_ID2('O', 'B') -#define ID_ME MAKE_ID2('M', 'E') -#define ID_CU MAKE_ID2('C', 'U') -#define ID_MB MAKE_ID2('M', 'B') -#define ID_MA MAKE_ID2('M', 'A') -#define ID_TE MAKE_ID2('T', 'E') -#define ID_IM MAKE_ID2('I', 'M') -#define ID_IK MAKE_ID2('I', 'K') -#define ID_WV MAKE_ID2('W', 'V') -#define ID_LT MAKE_ID2('L', 'T') -#define ID_SE MAKE_ID2('S', 'E') -#define ID_LF MAKE_ID2('L', 'F') -#define ID_LA MAKE_ID2('L', 'A') -#define ID_CA MAKE_ID2('C', 'A') -#define ID_IP MAKE_ID2('I', 'P') -#define ID_KE MAKE_ID2('K', 'E') -#define ID_WO MAKE_ID2('W', 'O') -#define ID_SCR MAKE_ID2('S', 'R') -#define ID_VF MAKE_ID2('V', 'F') -#define ID_TXT MAKE_ID2('T', 'X') -#define ID_SO MAKE_ID2('S', 'O') -#define ID_SAMPLE MAKE_ID2('S', 'A') -#define ID_GR MAKE_ID2('G', 'R') -#define ID_ID MAKE_ID2('I', 'D') -#define ID_AR MAKE_ID2('A', 'R') -#define ID_AC MAKE_ID2('A', 'C') -#define ID_SCRIPT MAKE_ID2('P', 'Y') -#define ID_FLUIDSIM MAKE_ID2('F', 'S') -#define ID_NT MAKE_ID2('N', 'T') -#define ID_BR MAKE_ID2('B', 'R') - -#define ID_SEQ MAKE_ID2('S', 'Q') -#define ID_CO MAKE_ID2('C', 'O') -#define ID_PO MAKE_ID2('A', 'C') -#define ID_NLA MAKE_ID2('N', 'L') - -#define ID_VS MAKE_ID2('V', 'S') -#define ID_VN MAKE_ID2('V', 'N') - -// ------------------------------------------------------------ -#define FORM MAKE_ID('F', 'O', 'R', 'M') -#define DDG1 MAKE_ID('3', 'D', 'G', '1') -#define DDG2 MAKE_ID('3', 'D', 'G', '2') -#define DDG3 MAKE_ID('3', 'D', 'G', '3') -#define DDG4 MAKE_ID('3', 'D', 'G', '4') -#define GOUR MAKE_ID('G', 'O', 'U', 'R') -#define BLEN MAKE_ID('B', 'L', 'E', 'N') -#define DER_ MAKE_ID('D', 'E', 'R', '_') -#define V100 MAKE_ID('V', '1', '0', '0') -#define DATA MAKE_ID('D', 'A', 'T', 'A') -#define GLOB MAKE_ID('G', 'L', 'O', 'B') -#define IMAG MAKE_ID('I', 'M', 'A', 'G') -#define USER MAKE_ID('U', 'S', 'E', 'R') - -// ------------------------------------------------------------ -#define DNA1 MAKE_ID('D', 'N', 'A', '1') -#define REND MAKE_ID('R', 'E', 'N', 'D') -#define ENDB MAKE_ID('E', 'N', 'D', 'B') -#define NAME MAKE_ID('N', 'A', 'M', 'E') -#define SDNA MAKE_ID('S', 'D', 'N', 'A') -#define TYPE MAKE_ID('T', 'Y', 'P', 'E') -#define TLEN MAKE_ID('T', 'L', 'E', 'N') -#define STRC MAKE_ID('S', 'T', 'R', 'C') - -// ------------------------------------------------------------ -#define SWITCH_INT(a) \ - { \ - char s_i, *p_i; \ - p_i = (char *)&(a); \ - s_i = p_i[0]; \ - p_i[0] = p_i[3]; \ - p_i[3] = s_i; \ - s_i = p_i[1]; \ - p_i[1] = p_i[2]; \ - p_i[2] = s_i; \ - } - -// ------------------------------------------------------------ -#define SWITCH_SHORT(a) \ - { \ - char s_i, *p_i; \ - p_i = (char *)&(a); \ - s_i = p_i[0]; \ - p_i[0] = p_i[1]; \ - p_i[1] = s_i; \ - } - -// ------------------------------------------------------------ -#define SWITCH_LONGINT(a) \ - { \ - char s_i, *p_i; \ - p_i = (char *)&(a); \ - s_i = p_i[0]; \ - p_i[0] = p_i[7]; \ - p_i[7] = s_i; \ - s_i = p_i[1]; \ - p_i[1] = p_i[6]; \ - p_i[6] = s_i; \ - s_i = p_i[2]; \ - p_i[2] = p_i[5]; \ - p_i[5] = s_i; \ - s_i = p_i[3]; \ - p_i[3] = p_i[4]; \ - p_i[4] = s_i; \ - } - -#endif //__B_DEFINES_H__ diff --git a/engine/inc/bullet/BulletFileLoader/bFile.h b/engine/inc/bullet/BulletFileLoader/bFile.h deleted file mode 100644 index f6fae97e..00000000 --- a/engine/inc/bullet/BulletFileLoader/bFile.h +++ /dev/null @@ -1,166 +0,0 @@ -/* -bParse -Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.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 __BFILE_H__ -#define __BFILE_H__ - -#include "bCommon.h" -#include "bChunk.h" -#include - -namespace bParse -{ -// ----------------------------------------------------- // -enum bFileFlags -{ - FD_INVALID = 0, - FD_OK = 1, - FD_VOID_IS_8 = 2, - FD_ENDIAN_SWAP = 4, - FD_FILE_64 = 8, - FD_BITS_VARIES = 16, - FD_VERSION_VARIES = 32, - FD_DOUBLE_PRECISION = 64, - FD_BROKEN_DNA = 128, - FD_FILEDNA_IS_MEMDNA = 256 -}; - -enum bFileVerboseMode -{ - FD_VERBOSE_EXPORT_XML = 1, - FD_VERBOSE_DUMP_DNA_TYPE_DEFINITIONS = 2, - FD_VERBOSE_DUMP_CHUNKS = 4, - FD_VERBOSE_DUMP_FILE_INFO = 8, -}; -// ----------------------------------------------------- // -class bFile -{ -protected: - char m_headerString[7]; - - bool mOwnsBuffer; - char* mFileBuffer; - int mFileLen; - int mVersion; - - bPtrMap mLibPointers; - - int mDataStart; - bDNA* mFileDNA; - bDNA* mMemoryDNA; - - btAlignedObjectArray m_pointerFixupArray; - btAlignedObjectArray m_pointerPtrFixupArray; - - btAlignedObjectArray m_chunks; - btHashMap m_chunkPtrPtrMap; - - // - - bPtrMap mDataPointers; - - int mFlags; - - // //////////////////////////////////////////////////////////////////////////// - - // buffer offset util - int getNextBlock(bChunkInd* dataChunk, const char* dataPtr, const int flags); - void safeSwapPtr(char* dst, const char* src); - - virtual void parseHeader(); - - virtual void parseData() = 0; - - void resolvePointersMismatch(); - void resolvePointersChunk(const bChunkInd& dataChunk, int verboseMode); - - int resolvePointersStructRecursive(char* strcPtr, int old_dna, int verboseMode, int recursion); - //void swapPtr(char *dst, char *src); - - void parseStruct(char* strcPtr, char* dtPtr, int old_dna, int new_dna, bool fixupPointers); - void getMatchingFileDNA(short* old, const char* lookupName, const char* lookupType, char* strcData, char* data, bool fixupPointers); - char* getFileElement(short* firstStruct, char* lookupName, char* lookupType, char* data, short** foundPos); - - void swap(char* head, class bChunkInd& ch, bool ignoreEndianFlag); - void swapData(char* data, short type, int arraySize, bool ignoreEndianFlag); - void swapStruct(int dna_nr, char* data, bool ignoreEndianFlag); - void swapLen(char* dataPtr); - void swapDNA(char* ptr); - - char* readStruct(char* head, class bChunkInd& chunk); - char* getAsString(int code); - - virtual void parseInternal(int verboseMode, char* memDna, int memDnaLength); - -public: - bFile(const char* filename, const char headerString[7]); - - //todo: make memoryBuffer const char - //bFile( const char *memoryBuffer, int len); - bFile(char* memoryBuffer, int len, const char headerString[7]); - virtual ~bFile(); - - bDNA* getFileDNA() - { - return mFileDNA; - } - - virtual void addDataBlock(char* dataBlock) = 0; - - int getFlags() const - { - return mFlags; - } - - void setFileDNAisMemoryDNA() - { - mFlags |= FD_FILEDNA_IS_MEMDNA; - } - - bPtrMap& getLibPointers() - { - return mLibPointers; - } - - void* findLibPointer(void* ptr); - - bool ok(); - - virtual void parse(int verboseMode) = 0; - - virtual int write(const char* fileName, bool fixupPointers = false) = 0; - - virtual void writeChunks(FILE* fp, bool fixupPointers); - - virtual void writeDNA(FILE* fp) = 0; - - void updateOldPointers(); - void resolvePointers(int verboseMode); - - void dumpChunks(bDNA* dna); - - virtual void setFileDNA(int verboseMode, char* buffer, int len); - - int getVersion() const - { - return mVersion; - } - //pre-swap the endianness, so that data loaded on a target with different endianness doesn't need to be swapped - void preSwap(); - void writeFile(const char* fileName); -}; -} // namespace bParse - -#endif //__BFILE_H__ diff --git a/engine/inc/bullet/BulletFileLoader/btBulletFile.h b/engine/inc/bullet/BulletFileLoader/btBulletFile.h deleted file mode 100644 index d7c1cb7e..00000000 --- a/engine/inc/bullet/BulletFileLoader/btBulletFile.h +++ /dev/null @@ -1,80 +0,0 @@ -/* -bParse -Copyright (c) 2006-2010 Charlie C & Erwin Coumans http://gamekit.googlecode.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 BT_BULLET_FILE_H -#define BT_BULLET_FILE_H - -#include "bFile.h" -#include "LinearMath/btAlignedObjectArray.h" -#include "bDefines.h" - -#include "LinearMath/btSerializer.h" - -namespace bParse -{ -// ----------------------------------------------------- // -class btBulletFile : public bFile -{ -protected: - char* m_DnaCopy; - -public: - btAlignedObjectArray m_multiBodies; - - btAlignedObjectArray m_multiBodyLinkColliders; - - btAlignedObjectArray m_softBodies; - - btAlignedObjectArray m_rigidBodies; - - btAlignedObjectArray m_collisionObjects; - - btAlignedObjectArray m_collisionShapes; - - btAlignedObjectArray m_constraints; - - btAlignedObjectArray m_bvhs; - - btAlignedObjectArray m_triangleInfoMaps; - - btAlignedObjectArray m_dynamicsWorldInfo; - - btAlignedObjectArray m_contactManifolds; - - btAlignedObjectArray m_dataBlocks; - btBulletFile(); - - btBulletFile(const char* fileName); - - btBulletFile(char* memoryBuffer, int len); - - virtual ~btBulletFile(); - - virtual void addDataBlock(char* dataBlock); - - // experimental - virtual int write(const char* fileName, bool fixupPointers = false); - - virtual void parse(int verboseMode); - - virtual void parseData(); - - virtual void writeDNA(FILE* fp); - - void addStruct(const char* structType, void* data, int len, void* oldPtr, int code); -}; -}; // namespace bParse - -#endif //BT_BULLET_FILE_H diff --git a/engine/inc/bullet/BulletInverseDynamics/btBulletCollisionCommon.h b/engine/inc/bullet/BulletInverseDynamics/btBulletCollisionCommon.h deleted file mode 100644 index 4f523756..00000000 --- a/engine/inc/bullet/BulletInverseDynamics/btBulletCollisionCommon.h +++ /dev/null @@ -1,65 +0,0 @@ -/* -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 BULLET_COLLISION_COMMON_H -#define BULLET_COLLISION_COMMON_H - -///Common headerfile includes for Bullet Collision Detection - -///Bullet's btCollisionWorld and btCollisionObject definitions -#include "BulletCollision/CollisionDispatch/btCollisionWorld.h" -#include "BulletCollision/CollisionDispatch/btCollisionObject.h" - -///Collision Shapes -#include "BulletCollision/CollisionShapes/btBoxShape.h" -#include "BulletCollision/CollisionShapes/btSphereShape.h" -#include "BulletCollision/CollisionShapes/btCapsuleShape.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/btBvhTriangleMeshShape.h" -#include "BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h" -#include "BulletCollision/CollisionShapes/btTriangleMeshShape.h" -#include "BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h" -#include "BulletCollision/CollisionShapes/btCompoundShape.h" -#include "BulletCollision/CollisionShapes/btTetrahedronShape.h" -#include "BulletCollision/CollisionShapes/btEmptyShape.h" -#include "BulletCollision/CollisionShapes/btMultiSphereShape.h" -#include "BulletCollision/CollisionShapes/btUniformScalingShape.h" - -///Narrowphase Collision Detector -#include "BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.h" - -//#include "BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.h" -#include "BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.h" - -///Dispatching and generation of collision pairs (broadphase) -#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" -#include "BulletCollision/BroadphaseCollision/btSimpleBroadphase.h" -#include "BulletCollision/BroadphaseCollision/btAxisSweep3.h" -#include "BulletCollision/BroadphaseCollision/btDbvtBroadphase.h" - -///Math library & Utils -#include "LinearMath/btQuaternion.h" -#include "LinearMath/btTransform.h" -#include "LinearMath/btDefaultMotionState.h" -#include "LinearMath/btQuickprof.h" -#include "LinearMath/btIDebugDraw.h" -#include "LinearMath/btSerializer.h" - -#endif //BULLET_COLLISION_COMMON_H diff --git a/engine/inc/bullet/BulletRobotics/BoxStack.h b/engine/inc/bullet/BulletRobotics/BoxStack.h deleted file mode 100644 index 289b4b03..00000000 --- a/engine/inc/bullet/BulletRobotics/BoxStack.h +++ /dev/null @@ -1,21 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2016 Google Inc. http://bulletphysics.org - -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 BOX_STACK_EXAMPLE_H -#define BOX_STACK_EXAMPLE_H - -class CommonExampleInterface* BoxStackExampleCreateFunc(struct CommonExampleOptions& options); - -#endif //BOX_STACK_EXAMPLE_H diff --git a/engine/inc/bullet/BulletRobotics/FixJointBoxes.h b/engine/inc/bullet/BulletRobotics/FixJointBoxes.h deleted file mode 100644 index c8a305df..00000000 --- a/engine/inc/bullet/BulletRobotics/FixJointBoxes.h +++ /dev/null @@ -1,21 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2016 Google Inc. http://bulletphysics.org - -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 FIX_JOINT_BOXES_H -#define FIX_JOINT_BOXES_H - -class CommonExampleInterface* FixJointBoxesCreateFunc(struct CommonExampleOptions& options); - -#endif //FIX_JOINT_BOXES_H diff --git a/engine/inc/bullet/BulletRobotics/JointLimit.h b/engine/inc/bullet/BulletRobotics/JointLimit.h deleted file mode 100644 index c8a125e5..00000000 --- a/engine/inc/bullet/BulletRobotics/JointLimit.h +++ /dev/null @@ -1,21 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2016 Google Inc. http://bulletphysics.org - -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 JOINT_LIMIT_EXAMPLE_H -#define JOINT_LIMIT_EXAMPLE_H - -class CommonExampleInterface* JointLimitCreateFunc(struct CommonExampleOptions& options); - -#endif //JOINT_LIMIT_EXAMPLE_H diff --git a/engine/inc/bullet/BulletSoftBody/DeformableBodyInplaceSolverIslandCallback.h b/engine/inc/bullet/BulletSoftBody/DeformableBodyInplaceSolverIslandCallback.h deleted file mode 100644 index 01c7e93a..00000000 --- a/engine/inc/bullet/BulletSoftBody/DeformableBodyInplaceSolverIslandCallback.h +++ /dev/null @@ -1,45 +0,0 @@ -// -// DeformableBodyInplaceSolverIslandCallback.h -// BulletSoftBody -// -// Created by Xuchen Han on 12/16/19. -// - -#ifndef DeformableBodyInplaceSolverIslandCallback_h -#define DeformableBodyInplaceSolverIslandCallback_h - -struct DeformableBodyInplaceSolverIslandCallback : public MultiBodyInplaceSolverIslandCallback -{ - btDeformableMultiBodyConstraintSolver* m_deformableSolver; - - DeformableBodyInplaceSolverIslandCallback(btDeformableMultiBodyConstraintSolver* solver, - btDispatcher* dispatcher) - : MultiBodyInplaceSolverIslandCallback(solver, dispatcher), m_deformableSolver(solver) - { - } - - virtual void processConstraints(int islandId = -1) - { - btCollisionObject** bodies = m_bodies.size() ? &m_bodies[0] : 0; - btCollisionObject** softBodies = m_softBodies.size() ? &m_softBodies[0] : 0; - btPersistentManifold** manifold = m_manifolds.size() ? &m_manifolds[0] : 0; - btTypedConstraint** constraints = m_constraints.size() ? &m_constraints[0] : 0; - btMultiBodyConstraint** multiBodyConstraints = m_multiBodyConstraints.size() ? &m_multiBodyConstraints[0] : 0; - - //printf("mb contacts = %d, mb constraints = %d\n", mbContacts, m_multiBodyConstraints.size()); - - m_deformableSolver->solveDeformableBodyGroup(bodies, m_bodies.size(), softBodies, m_softBodies.size(), manifold, m_manifolds.size(), constraints, m_constraints.size(), multiBodyConstraints, m_multiBodyConstraints.size(), *m_solverInfo, m_debugDrawer, m_dispatcher); - if (m_bodies.size() && (m_solverInfo->m_reportSolverAnalytics & 1)) - { - m_deformableSolver->m_analyticsData.m_islandId = islandId; - m_islandAnalyticsData.push_back(m_solver->m_analyticsData); - } - m_bodies.resize(0); - m_softBodies.resize(0); - m_manifolds.resize(0); - m_constraints.resize(0); - m_multiBodyConstraints.resize(0); - } -}; - -#endif /* DeformableBodyInplaceSolverIslandCallback_h */ diff --git a/engine/inc/bullet/BulletSoftBody/btCGProjection.h b/engine/inc/bullet/BulletSoftBody/btCGProjection.h deleted file mode 100644 index e0597066..00000000 --- a/engine/inc/bullet/BulletSoftBody/btCGProjection.h +++ /dev/null @@ -1,104 +0,0 @@ -/* - Written by Xuchen Han - - Bullet Continuous Collision Detection and Physics Library - Copyright (c) 2019 Google Inc. http://bulletphysics.org - 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_CG_PROJECTION_H -#define BT_CG_PROJECTION_H - -#include "btSoftBody.h" -#include "BulletDynamics/Featherstone/btMultiBodyLinkCollider.h" -#include "BulletDynamics/Featherstone/btMultiBodyConstraint.h" - -struct DeformableContactConstraint -{ - const btSoftBody::Node* m_node; - btAlignedObjectArray m_contact; - btAlignedObjectArray m_total_normal_dv; - btAlignedObjectArray m_total_tangent_dv; - btAlignedObjectArray m_static; - btAlignedObjectArray m_can_be_dynamic; - - DeformableContactConstraint(const btSoftBody::RContact& rcontact) : m_node(rcontact.m_node) - { - append(rcontact); - } - - DeformableContactConstraint() : m_node(NULL) - { - m_contact.push_back(NULL); - } - - void append(const btSoftBody::RContact& rcontact) - { - m_contact.push_back(&rcontact); - m_total_normal_dv.push_back(btVector3(0, 0, 0)); - m_total_tangent_dv.push_back(btVector3(0, 0, 0)); - m_static.push_back(false); - m_can_be_dynamic.push_back(true); - } - - void replace(const btSoftBody::RContact& rcontact) - { - m_contact.clear(); - m_total_normal_dv.clear(); - m_total_tangent_dv.clear(); - m_static.clear(); - m_can_be_dynamic.clear(); - append(rcontact); - } - - ~DeformableContactConstraint() - { - } -}; - -class btCGProjection -{ -public: - typedef btAlignedObjectArray TVStack; - typedef btAlignedObjectArray > TVArrayStack; - typedef btAlignedObjectArray > TArrayStack; - btAlignedObjectArray& m_softBodies; - const btScalar& m_dt; - // map from node indices to node pointers - const btAlignedObjectArray* m_nodes; - - btCGProjection(btAlignedObjectArray& softBodies, const btScalar& dt) - : m_softBodies(softBodies), m_dt(dt) - { - } - - virtual ~btCGProjection() - { - } - - // apply the constraints - virtual void project(TVStack& x) = 0; - - virtual void setConstraints() = 0; - - // update the constraints - virtual btScalar update() = 0; - - virtual void reinitialize(bool nodeUpdated) - { - } - - virtual void setIndices(const btAlignedObjectArray* nodes) - { - m_nodes = nodes; - } -}; - -#endif /* btCGProjection_h */ diff --git a/engine/inc/bullet/BulletSoftBody/btConjugateGradient.h b/engine/inc/bullet/BulletSoftBody/btConjugateGradient.h deleted file mode 100644 index bcd5e6b5..00000000 --- a/engine/inc/bullet/BulletSoftBody/btConjugateGradient.h +++ /dev/null @@ -1,117 +0,0 @@ -/* - Written by Xuchen Han - - Bullet Continuous Collision Detection and Physics Library - Copyright (c) 2019 Google Inc. http://bulletphysics.org - 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_CONJUGATE_GRADIENT_H -#define BT_CONJUGATE_GRADIENT_H -#include "btKrylovSolver.h" -template -class btConjugateGradient : public btKrylovSolver -{ - typedef btAlignedObjectArray TVStack; - typedef btKrylovSolver Base; - TVStack r, p, z, temp; - -public: - btConjugateGradient(const int max_it_in) - : btKrylovSolver(max_it_in, SIMD_EPSILON) - { - } - - virtual ~btConjugateGradient() {} - - // return the number of iterations taken - int solve(MatrixX& A, TVStack& x, const TVStack& b, bool verbose = false) - { - BT_PROFILE("CGSolve"); - btAssert(x.size() == b.size()); - reinitialize(b); - temp = b; - A.project(temp); - p = temp; - A.precondition(p, z); - btScalar d0 = this->dot(z, temp); - d0 = btMin(btScalar(1), d0); - // r = b - A * x --with assigned dof zeroed out - A.multiply(x, temp); - r = this->sub(b, temp); - A.project(r); - // z = M^(-1) * r - A.precondition(r, z); - A.project(z); - btScalar r_dot_z = this->dot(z, r); - if (r_dot_z <= Base::m_tolerance * d0) - { - if (verbose) - { - std::cout << "Iteration = 0" << std::endl; - std::cout << "Two norm of the residual = " << r_dot_z << std::endl; - } - return 0; - } - p = z; - btScalar r_dot_z_new = r_dot_z; - for (int k = 1; k <= Base::m_maxIterations; k++) - { - // temp = A*p - A.multiply(p, temp); - A.project(temp); - if (this->dot(p, temp) < 0) - { - if (verbose) - std::cout << "Encountered negative direction in CG!" << std::endl; - if (k == 1) - { - x = b; - } - return k; - } - // alpha = r^T * z / (p^T * A * p) - btScalar alpha = r_dot_z_new / this->dot(p, temp); - // x += alpha * p; - this->multAndAddTo(alpha, p, x); - // r -= alpha * temp; - this->multAndAddTo(-alpha, temp, r); - // z = M^(-1) * r - A.precondition(r, z); - r_dot_z = r_dot_z_new; - r_dot_z_new = this->dot(r, z); - if (r_dot_z_new < Base::m_tolerance * d0) - { - if (verbose) - { - std::cout << "ConjugateGradient iterations " << k << " residual = " << r_dot_z_new << std::endl; - } - return k; - } - - btScalar beta = r_dot_z_new / r_dot_z; - p = this->multAndAdd(beta, p, z); - } - if (verbose) - { - std::cout << "ConjugateGradient max iterations reached " << Base::m_maxIterations << " error = " << r_dot_z_new << std::endl; - } - return Base::m_maxIterations; - } - - void reinitialize(const TVStack& b) - { - r.resize(b.size()); - p.resize(b.size()); - z.resize(b.size()); - temp.resize(b.size()); - } -}; -#endif /* btConjugateGradient_h */ diff --git a/engine/inc/bullet/BulletSoftBody/btConjugateResidual.h b/engine/inc/bullet/BulletSoftBody/btConjugateResidual.h deleted file mode 100644 index 61461203..00000000 --- a/engine/inc/bullet/BulletSoftBody/btConjugateResidual.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - Written by Xuchen Han - - Bullet Continuous Collision Detection and Physics Library - Copyright (c) 2019 Google Inc. http://bulletphysics.org - 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_CONJUGATE_RESIDUAL_H -#define BT_CONJUGATE_RESIDUAL_H -#include "btKrylovSolver.h" - -template -class btConjugateResidual : public btKrylovSolver -{ - typedef btAlignedObjectArray TVStack; - typedef btKrylovSolver Base; - TVStack r, p, z, temp_p, temp_r, best_x; - // temp_r = A*r - // temp_p = A*p - // z = M^(-1) * temp_p = M^(-1) * A * p - btScalar best_r; - -public: - btConjugateResidual(const int max_it_in) - : Base(max_it_in, 1e-8) - { - } - - virtual ~btConjugateResidual() {} - - // return the number of iterations taken - int solve(MatrixX& A, TVStack& x, const TVStack& b, bool verbose = false) - { - BT_PROFILE("CRSolve"); - btAssert(x.size() == b.size()); - reinitialize(b); - // r = b - A * x --with assigned dof zeroed out - A.multiply(x, temp_r); // borrow temp_r here to store A*x - r = this->sub(b, temp_r); - // z = M^(-1) * r - A.precondition(r, z); // borrow z to store preconditioned r - r = z; - btScalar residual_norm = this->norm(r); - if (residual_norm <= Base::m_tolerance) - { - return 0; - } - p = r; - btScalar r_dot_Ar, r_dot_Ar_new; - // temp_p = A*p - A.multiply(p, temp_p); - // temp_r = A*r - temp_r = temp_p; - r_dot_Ar = this->dot(r, temp_r); - for (int k = 1; k <= Base::m_maxIterations; k++) - { - // z = M^(-1) * Ap - A.precondition(temp_p, z); - // alpha = r^T * A * r / (Ap)^T * M^-1 * Ap) - btScalar alpha = r_dot_Ar / this->dot(temp_p, z); - // x += alpha * p; - this->multAndAddTo(alpha, p, x); - // r -= alpha * z; - this->multAndAddTo(-alpha, z, r); - btScalar norm_r = this->norm(r); - if (norm_r < best_r) - { - best_x = x; - best_r = norm_r; - if (norm_r < Base::m_tolerance) - { - return k; - } - } - // temp_r = A * r; - A.multiply(r, temp_r); - r_dot_Ar_new = this->dot(r, temp_r); - btScalar beta = r_dot_Ar_new / r_dot_Ar; - r_dot_Ar = r_dot_Ar_new; - // p = beta*p + r; - p = this->multAndAdd(beta, p, r); - // temp_p = beta*temp_p + temp_r; - temp_p = this->multAndAdd(beta, temp_p, temp_r); - } - if (verbose) - { - std::cout << "ConjugateResidual max iterations reached, residual = " << best_r << std::endl; - } - x = best_x; - return Base::m_maxIterations; - } - - void reinitialize(const TVStack& b) - { - r.resize(b.size()); - p.resize(b.size()); - z.resize(b.size()); - temp_p.resize(b.size()); - temp_r.resize(b.size()); - best_x.resize(b.size()); - best_r = SIMD_INFINITY; - } -}; -#endif /* btConjugateResidual_h */ diff --git a/engine/inc/bullet/BulletSoftBody/btDefaultSoftBodySolver.h b/engine/inc/bullet/BulletSoftBody/btDefaultSoftBodySolver.h deleted file mode 100644 index 3965b07c..00000000 --- a/engine/inc/bullet/BulletSoftBody/btDefaultSoftBodySolver.h +++ /dev/null @@ -1,60 +0,0 @@ -/* -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_SOFT_BODY_DEFAULT_SOLVER_H -#define BT_SOFT_BODY_DEFAULT_SOLVER_H - -#include "BulletSoftBody/btSoftBodySolvers.h" -#include "btSoftBodySolverVertexBuffer.h" -struct btCollisionObjectWrapper; - -class btDefaultSoftBodySolver : public btSoftBodySolver -{ -protected: - /** Variable to define whether we need to update solver constants on the next iteration */ - bool m_updateSolverConstants; - - btAlignedObjectArray m_softBodySet; - -public: - btDefaultSoftBodySolver(); - - virtual ~btDefaultSoftBodySolver(); - - virtual SolverTypes getSolverType() const - { - return DEFAULT_SOLVER; - } - - virtual bool checkInitialized(); - - virtual void updateSoftBodies(); - - virtual void optimize(btAlignedObjectArray &softBodies, bool forceUpdate = false); - - virtual void copyBackToSoftBodies(bool bMove = true); - - virtual void solveConstraints(btScalar solverdt); - - virtual void predictMotion(btScalar solverdt); - - virtual void copySoftBodyToVertexBuffer(const btSoftBody *const softBody, btVertexBufferDescriptor *vertexBuffer); - - virtual void processCollision(btSoftBody *, const btCollisionObjectWrapper *); - - virtual void processCollision(btSoftBody *, btSoftBody *); -}; - -#endif // #ifndef BT_ACCELERATED_SOFT_BODY_CPU_SOLVER_H diff --git a/engine/inc/bullet/BulletSoftBody/btDeformableBackwardEulerObjective.h b/engine/inc/bullet/BulletSoftBody/btDeformableBackwardEulerObjective.h deleted file mode 100644 index eb05b9f0..00000000 --- a/engine/inc/bullet/BulletSoftBody/btDeformableBackwardEulerObjective.h +++ /dev/null @@ -1,198 +0,0 @@ -/* - Written by Xuchen Han - - Bullet Continuous Collision Detection and Physics Library - Copyright (c) 2019 Google Inc. http://bulletphysics.org - 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_BACKWARD_EULER_OBJECTIVE_H -#define BT_BACKWARD_EULER_OBJECTIVE_H -//#include "btConjugateGradient.h" -#include "btDeformableLagrangianForce.h" -#include "btDeformableMassSpringForce.h" -#include "btDeformableGravityForce.h" -#include "btDeformableCorotatedForce.h" -#include "btDeformableMousePickingForce.h" -#include "btDeformableLinearElasticityForce.h" -#include "btDeformableNeoHookeanForce.h" -#include "btDeformableContactProjection.h" -#include "btPreconditioner.h" -#include "btDeformableMultiBodyDynamicsWorld.h" -#include "LinearMath/btQuickprof.h" - -class btDeformableBackwardEulerObjective -{ -public: - typedef btAlignedObjectArray TVStack; - btScalar m_dt; - btAlignedObjectArray m_lf; - btAlignedObjectArray& m_softBodies; - Preconditioner* m_preconditioner; - btDeformableContactProjection m_projection; - const TVStack& m_backupVelocity; - btAlignedObjectArray m_nodes; - bool m_implicit; - MassPreconditioner* m_massPreconditioner; - KKTPreconditioner* m_KKTPreconditioner; - - btDeformableBackwardEulerObjective(btAlignedObjectArray& softBodies, const TVStack& backup_v); - - virtual ~btDeformableBackwardEulerObjective(); - - void initialize() {} - - // compute the rhs for CG solve, i.e, add the dt scaled implicit force to residual - void computeResidual(btScalar dt, TVStack& residual); - - // add explicit force to the velocity - void applyExplicitForce(TVStack& force); - - // apply force to velocity and optionally reset the force to zero - void applyForce(TVStack& force, bool setZero); - - // compute the norm of the residual - btScalar computeNorm(const TVStack& residual) const; - - // compute one step of the solve (there is only one solve if the system is linear) - void computeStep(TVStack& dv, const TVStack& residual, const btScalar& dt); - - // perform A*x = b - void multiply(const TVStack& x, TVStack& b) const; - - // set initial guess for CG solve - void initialGuess(TVStack& dv, const TVStack& residual); - - // reset data structure and reset dt - void reinitialize(bool nodeUpdated, btScalar dt); - - void setDt(btScalar dt); - - // add friction force to residual - void applyDynamicFriction(TVStack& r); - - // add dv to velocity - void updateVelocity(const TVStack& dv); - - //set constraints as projections - void setConstraints(const btContactSolverInfo& infoGlobal); - - // update the projections and project the residual - void project(TVStack& r) - { - BT_PROFILE("project"); - m_projection.project(r); - } - - // perform precondition M^(-1) x = b - void precondition(const TVStack& x, TVStack& b) - { - m_preconditioner->operator()(x, b); - } - - // reindex all the vertices - virtual void updateId() - { - size_t node_id = 0; - size_t face_id = 0; - m_nodes.clear(); - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - for (int j = 0; j < psb->m_nodes.size(); ++j) - { - psb->m_nodes[j].index = node_id; - m_nodes.push_back(&psb->m_nodes[j]); - ++node_id; - } - for (int j = 0; j < psb->m_faces.size(); ++j) - { - psb->m_faces[j].m_index = face_id; - ++face_id; - } - } - } - - const btAlignedObjectArray* getIndices() const - { - return &m_nodes; - } - - void setImplicit(bool implicit) - { - m_implicit = implicit; - } - - // Calculate the total potential energy in the system - btScalar totalEnergy(btScalar dt); - - void addLagrangeMultiplier(const TVStack& vec, TVStack& extended_vec) - { - extended_vec.resize(vec.size() + m_projection.m_lagrangeMultipliers.size()); - for (int i = 0; i < vec.size(); ++i) - { - extended_vec[i] = vec[i]; - } - int offset = vec.size(); - for (int i = 0; i < m_projection.m_lagrangeMultipliers.size(); ++i) - { - extended_vec[offset + i].setZero(); - } - } - - void addLagrangeMultiplierRHS(const TVStack& residual, const TVStack& m_dv, TVStack& extended_residual) - { - extended_residual.resize(residual.size() + m_projection.m_lagrangeMultipliers.size()); - for (int i = 0; i < residual.size(); ++i) - { - extended_residual[i] = residual[i]; - } - int offset = residual.size(); - for (int i = 0; i < m_projection.m_lagrangeMultipliers.size(); ++i) - { - const LagrangeMultiplier& lm = m_projection.m_lagrangeMultipliers[i]; - extended_residual[offset + i].setZero(); - for (int d = 0; d < lm.m_num_constraints; ++d) - { - for (int n = 0; n < lm.m_num_nodes; ++n) - { - extended_residual[offset + i][d] += lm.m_weights[n] * m_dv[lm.m_indices[n]].dot(lm.m_dirs[d]); - } - } - } - } - - void calculateContactForce(const TVStack& dv, const TVStack& rhs, TVStack& f) - { - size_t counter = 0; - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - for (int j = 0; j < psb->m_nodes.size(); ++j) - { - const btSoftBody::Node& node = psb->m_nodes[j]; - f[counter] = (node.m_im == 0) ? btVector3(0, 0, 0) : dv[counter] / node.m_im; - ++counter; - } - } - for (int i = 0; i < m_lf.size(); ++i) - { - // add damping matrix - m_lf[i]->addScaledDampingForceDifferential(-m_dt, dv, f); - } - counter = 0; - for (; counter < f.size(); ++counter) - { - f[counter] = rhs[counter] - f[counter]; - } - } -}; - -#endif /* btBackwardEulerObjective_h */ diff --git a/engine/inc/bullet/BulletSoftBody/btDeformableBodySolver.h b/engine/inc/bullet/BulletSoftBody/btDeformableBodySolver.h deleted file mode 100644 index ae674d6e..00000000 --- a/engine/inc/bullet/BulletSoftBody/btDeformableBodySolver.h +++ /dev/null @@ -1,160 +0,0 @@ -/* - Written by Xuchen Han - - Bullet Continuous Collision Detection and Physics Library - Copyright (c) 2019 Google Inc. http://bulletphysics.org - 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_DEFORMABLE_BODY_SOLVERS_H -#define BT_DEFORMABLE_BODY_SOLVERS_H - -#include "btSoftBodySolvers.h" -#include "btDeformableBackwardEulerObjective.h" -#include "btDeformableMultiBodyDynamicsWorld.h" -#include "BulletDynamics/Featherstone/btMultiBodyLinkCollider.h" -#include "BulletDynamics/Featherstone/btMultiBodyConstraint.h" -#include "btConjugateResidual.h" -#include "btConjugateGradient.h" -struct btCollisionObjectWrapper; -class btDeformableBackwardEulerObjective; -class btDeformableMultiBodyDynamicsWorld; - -class btDeformableBodySolver : public btSoftBodySolver -{ - typedef btAlignedObjectArray TVStack; - -protected: - int m_numNodes; // total number of deformable body nodes - TVStack m_dv; // v_{n+1} - v_n - TVStack m_backup_dv; // backed up dv - TVStack m_ddv; // incremental dv - TVStack m_residual; // rhs of the linear solve - btAlignedObjectArray m_softBodies; // all deformable bodies - TVStack m_backupVelocity; // backed up v, equals v_n for implicit, equals v_{n+1}^* for explicit - btScalar m_dt; // dt - btConjugateGradient m_cg; // CG solver - btConjugateResidual m_cr; // CR solver - bool m_implicit; // use implicit scheme if true, explicit scheme if false - int m_maxNewtonIterations; // max number of newton iterations - btScalar m_newtonTolerance; // stop newton iterations if f(x) < m_newtonTolerance - bool m_lineSearch; // If true, use newton's method with line search under implicit scheme -public: - // handles data related to objective function - btDeformableBackwardEulerObjective* m_objective; - bool m_useProjection; - - btDeformableBodySolver(); - - virtual ~btDeformableBodySolver(); - - virtual SolverTypes getSolverType() const - { - return DEFORMABLE_SOLVER; - } - - // update soft body normals - virtual void updateSoftBodies(); - - virtual btScalar solveContactConstraints(btCollisionObject** deformableBodies, int numDeformableBodies, const btContactSolverInfo& infoGlobal); - - // solve the momentum equation - virtual void solveDeformableConstraints(btScalar solverdt); - - // resize/clear data structures - void reinitialize(const btAlignedObjectArray& softBodies, btScalar dt); - - // set up contact constraints - void setConstraints(const btContactSolverInfo& infoGlobal); - - // add in elastic forces and gravity to obtain v_{n+1}^* and calls predictDeformableMotion - virtual void predictMotion(btScalar solverdt); - - // move to temporary position x_{n+1}^* = x_n + dt * v_{n+1}^* - // x_{n+1}^* is stored in m_q - void predictDeformableMotion(btSoftBody* psb, btScalar dt); - - // save the current velocity to m_backupVelocity - void backupVelocity(); - - // set m_dv and m_backupVelocity to desired value to prepare for momentum solve - void setupDeformableSolve(bool implicit); - - // set the current velocity to that backed up in m_backupVelocity - void revertVelocity(); - - // set velocity to m_dv + m_backupVelocity - void updateVelocity(); - - // update the node count - bool updateNodes(); - - // calculate the change in dv resulting from the momentum solve - void computeStep(TVStack& ddv, const TVStack& residual); - - // calculate the change in dv resulting from the momentum solve when line search is turned on - btScalar computeDescentStep(TVStack& ddv, const TVStack& residual, bool verbose = false); - - virtual void copySoftBodyToVertexBuffer(const btSoftBody* const softBody, btVertexBufferDescriptor* vertexBuffer) {} - - // process collision between deformable and rigid - virtual void processCollision(btSoftBody* softBody, const btCollisionObjectWrapper* collisionObjectWrap) - { - softBody->defaultCollisionHandler(collisionObjectWrap); - } - - // process collision between deformable and deformable - virtual void processCollision(btSoftBody* softBody, btSoftBody* otherSoftBody) - { - softBody->defaultCollisionHandler(otherSoftBody); - } - - // If true, implicit time stepping scheme is used. - // Otherwise, explicit time stepping scheme is used - void setImplicit(bool implicit); - - // If true, newton's method with line search is used when implicit time stepping scheme is turned on - void setLineSearch(bool lineSearch); - - // set temporary position x^* = x_n + dt * v - // update the deformation gradient at position x^* - void updateState(); - - // set dv = dv + scale * ddv - void updateDv(btScalar scale = 1); - - // set temporary position x^* = x_n + dt * v^* - void updateTempPosition(); - - // save the current dv to m_backup_dv; - void backupDv(); - - // set dv to the backed-up value - void revertDv(); - - // set dv = dv + scale * ddv - // set v^* = v_n + dv - // set temporary position x^* = x_n + dt * v^* - // update the deformation gradient at position x^* - void updateEnergy(btScalar scale); - - // calculates the appropriately scaled kinetic energy in the system, which is - // 1/2 * dv^T * M * dv - // used in line search - btScalar kineticEnergy(); - - // unused functions - virtual void optimize(btAlignedObjectArray& softBodies, bool forceUpdate = false) {} - virtual void solveConstraints(btScalar dt) {} - virtual bool checkInitialized() { return true; } - virtual void copyBackToSoftBodies(bool bMove = true) {} -}; - -#endif /* btDeformableBodySolver_h */ diff --git a/engine/inc/bullet/BulletSoftBody/btDeformableContactConstraint.h b/engine/inc/bullet/BulletSoftBody/btDeformableContactConstraint.h deleted file mode 100644 index 1e2c9f5b..00000000 --- a/engine/inc/bullet/BulletSoftBody/btDeformableContactConstraint.h +++ /dev/null @@ -1,284 +0,0 @@ -/* - Written by Xuchen Han - - Bullet Continuous Collision Detection and Physics Library - Copyright (c) 2019 Google Inc. http://bulletphysics.org - 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_DEFORMABLE_CONTACT_CONSTRAINT_H -#define BT_DEFORMABLE_CONTACT_CONSTRAINT_H -#include "btSoftBody.h" - -// btDeformableContactConstraint is an abstract class specifying the method that each type of contact constraint needs to implement -class btDeformableContactConstraint -{ -public: - // True if the friction is static - // False if the friction is dynamic - bool m_static; - const btContactSolverInfo* m_infoGlobal; - - // normal of the contact - btVector3 m_normal; - - btDeformableContactConstraint(const btVector3& normal, const btContactSolverInfo& infoGlobal) : m_static(false), m_normal(normal), m_infoGlobal(&infoGlobal) - { - } - - btDeformableContactConstraint(bool isStatic, const btVector3& normal, const btContactSolverInfo& infoGlobal) : m_static(isStatic), m_normal(normal), m_infoGlobal(&infoGlobal) - { - } - - btDeformableContactConstraint() {} - - btDeformableContactConstraint(const btDeformableContactConstraint& other) - : m_static(other.m_static), m_normal(other.m_normal), m_infoGlobal(other.m_infoGlobal) - { - } - - virtual ~btDeformableContactConstraint() {} - - // solve the constraint with inelastic impulse and return the error, which is the square of normal component of velocity diffrerence - // the constraint is solved by calculating the impulse between object A and B in the contact and apply the impulse to both objects involved in the contact - virtual btScalar solveConstraint(const btContactSolverInfo& infoGlobal) = 0; - - // get the velocity of the object A in the contact - virtual btVector3 getVa() const = 0; - - // get the velocity of the object B in the contact - virtual btVector3 getVb() const = 0; - - // get the velocity change of the soft body node in the constraint - virtual btVector3 getDv(const btSoftBody::Node*) const = 0; - - // apply impulse to the soft body node and/or face involved - virtual void applyImpulse(const btVector3& impulse) = 0; - - // scale the penetration depth by erp - virtual void setPenetrationScale(btScalar scale) = 0; -}; - -// -// Constraint that a certain node in the deformable objects cannot move -class btDeformableStaticConstraint : public btDeformableContactConstraint -{ -public: - btSoftBody::Node* m_node; - - btDeformableStaticConstraint(btSoftBody::Node* node, const btContactSolverInfo& infoGlobal) : m_node(node), btDeformableContactConstraint(false, btVector3(0, 0, 0), infoGlobal) - { - } - btDeformableStaticConstraint() {} - btDeformableStaticConstraint(const btDeformableStaticConstraint& other) - : m_node(other.m_node), btDeformableContactConstraint(other) - { - } - - virtual ~btDeformableStaticConstraint() {} - - virtual btScalar solveConstraint(const btContactSolverInfo& infoGlobal) - { - return 0; - } - - virtual btVector3 getVa() const - { - return btVector3(0, 0, 0); - } - - virtual btVector3 getVb() const - { - return btVector3(0, 0, 0); - } - - virtual btVector3 getDv(const btSoftBody::Node* n) const - { - return btVector3(0, 0, 0); - } - - virtual void applyImpulse(const btVector3& impulse) {} - virtual void setPenetrationScale(btScalar scale) {} -}; - -// -// Anchor Constraint between rigid and deformable node -class btDeformableNodeAnchorConstraint : public btDeformableContactConstraint -{ -public: - const btSoftBody::DeformableNodeRigidAnchor* m_anchor; - - btDeformableNodeAnchorConstraint(const btSoftBody::DeformableNodeRigidAnchor& c, const btContactSolverInfo& infoGlobal); - btDeformableNodeAnchorConstraint(const btDeformableNodeAnchorConstraint& other); - btDeformableNodeAnchorConstraint() {} - virtual ~btDeformableNodeAnchorConstraint() - { - } - virtual btScalar solveConstraint(const btContactSolverInfo& infoGlobal); - - // object A is the rigid/multi body, and object B is the deformable node/face - virtual btVector3 getVa() const; - // get the velocity of the deformable node in contact - virtual btVector3 getVb() const; - virtual btVector3 getDv(const btSoftBody::Node* n) const - { - return btVector3(0, 0, 0); - } - virtual void applyImpulse(const btVector3& impulse); - - virtual void setPenetrationScale(btScalar scale) {} -}; - -// -// Constraint between rigid/multi body and deformable objects -class btDeformableRigidContactConstraint : public btDeformableContactConstraint -{ -public: - btVector3 m_total_normal_dv; - btVector3 m_total_tangent_dv; - btScalar m_penetration; - btScalar m_total_split_impulse; - bool m_binding; - const btSoftBody::DeformableRigidContact* m_contact; - - btDeformableRigidContactConstraint(const btSoftBody::DeformableRigidContact& c, const btContactSolverInfo& infoGlobal); - btDeformableRigidContactConstraint(const btDeformableRigidContactConstraint& other); - btDeformableRigidContactConstraint() {} - virtual ~btDeformableRigidContactConstraint() - { - } - - // object A is the rigid/multi body, and object B is the deformable node/face - virtual btVector3 getVa() const; - - // get the split impulse velocity of the deformable face at the contact point - virtual btVector3 getSplitVb() const = 0; - - // get the split impulse velocity of the rigid/multibdoy at the contaft - virtual btVector3 getSplitVa() const; - - virtual btScalar solveConstraint(const btContactSolverInfo& infoGlobal); - - virtual void setPenetrationScale(btScalar scale) - { - m_penetration *= scale; - } - - btScalar solveSplitImpulse(const btContactSolverInfo& infoGlobal); - - virtual void applySplitImpulse(const btVector3& impulse) = 0; -}; - -// -// Constraint between rigid/multi body and deformable objects nodes -class btDeformableNodeRigidContactConstraint : public btDeformableRigidContactConstraint -{ -public: - // the deformable node in contact - btSoftBody::Node* m_node; - - btDeformableNodeRigidContactConstraint(const btSoftBody::DeformableNodeRigidContact& contact, const btContactSolverInfo& infoGlobal); - btDeformableNodeRigidContactConstraint(const btDeformableNodeRigidContactConstraint& other); - btDeformableNodeRigidContactConstraint() {} - virtual ~btDeformableNodeRigidContactConstraint() - { - } - - // get the velocity of the deformable node in contact - virtual btVector3 getVb() const; - - // get the split impulse velocity of the deformable face at the contact point - virtual btVector3 getSplitVb() const; - - // get the velocity change of the input soft body node in the constraint - virtual btVector3 getDv(const btSoftBody::Node*) const; - - // cast the contact to the desired type - const btSoftBody::DeformableNodeRigidContact* getContact() const - { - return static_cast(m_contact); - } - - virtual void applyImpulse(const btVector3& impulse); - - virtual void applySplitImpulse(const btVector3& impulse); -}; - -// -// Constraint between rigid/multi body and deformable objects faces -class btDeformableFaceRigidContactConstraint : public btDeformableRigidContactConstraint -{ -public: - btSoftBody::Face* m_face; - bool m_useStrainLimiting; - btDeformableFaceRigidContactConstraint(const btSoftBody::DeformableFaceRigidContact& contact, const btContactSolverInfo& infoGlobal, bool useStrainLimiting); - btDeformableFaceRigidContactConstraint(const btDeformableFaceRigidContactConstraint& other); - btDeformableFaceRigidContactConstraint() : m_useStrainLimiting(false) {} - virtual ~btDeformableFaceRigidContactConstraint() - { - } - - // get the velocity of the deformable face at the contact point - virtual btVector3 getVb() const; - - // get the split impulse velocity of the deformable face at the contact point - virtual btVector3 getSplitVb() const; - - // get the velocity change of the input soft body node in the constraint - virtual btVector3 getDv(const btSoftBody::Node*) const; - - // cast the contact to the desired type - const btSoftBody::DeformableFaceRigidContact* getContact() const - { - return static_cast(m_contact); - } - - virtual void applyImpulse(const btVector3& impulse); - - virtual void applySplitImpulse(const btVector3& impulse); -}; - -// -// Constraint between deformable objects faces and deformable objects nodes -class btDeformableFaceNodeContactConstraint : public btDeformableContactConstraint -{ -public: - btSoftBody::Node* m_node; - btSoftBody::Face* m_face; - const btSoftBody::DeformableFaceNodeContact* m_contact; - btVector3 m_total_normal_dv; - btVector3 m_total_tangent_dv; - - btDeformableFaceNodeContactConstraint(const btSoftBody::DeformableFaceNodeContact& contact, const btContactSolverInfo& infoGlobal); - btDeformableFaceNodeContactConstraint() {} - virtual ~btDeformableFaceNodeContactConstraint() {} - - virtual btScalar solveConstraint(const btContactSolverInfo& infoGlobal); - - // get the velocity of the object A in the contact - virtual btVector3 getVa() const; - - // get the velocity of the object B in the contact - virtual btVector3 getVb() const; - - // get the velocity change of the input soft body node in the constraint - virtual btVector3 getDv(const btSoftBody::Node*) const; - - // cast the contact to the desired type - const btSoftBody::DeformableFaceNodeContact* getContact() const - { - return static_cast(m_contact); - } - - virtual void applyImpulse(const btVector3& impulse); - - virtual void setPenetrationScale(btScalar scale) {} -}; -#endif /* BT_DEFORMABLE_CONTACT_CONSTRAINT_H */ diff --git a/engine/inc/bullet/BulletSoftBody/btDeformableContactProjection.h b/engine/inc/bullet/BulletSoftBody/btDeformableContactProjection.h deleted file mode 100644 index 4964eaf9..00000000 --- a/engine/inc/bullet/BulletSoftBody/btDeformableContactProjection.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - Written by Xuchen Han - - Bullet Continuous Collision Detection and Physics Library - Copyright (c) 2019 Google Inc. http://bulletphysics.org - 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_CONTACT_PROJECTION_H -#define BT_CONTACT_PROJECTION_H -#include "btCGProjection.h" -#include "btSoftBody.h" -#include "BulletDynamics/Featherstone/btMultiBodyLinkCollider.h" -#include "BulletDynamics/Featherstone/btMultiBodyConstraint.h" -#include "btDeformableContactConstraint.h" -#include "LinearMath/btHashMap.h" -#include "LinearMath/btReducedVector.h" -#include "LinearMath/btModifiedGramSchmidt.h" -#include - -struct LagrangeMultiplier -{ - int m_num_constraints; // Number of constraints - int m_num_nodes; // Number of nodes in these constraints - btScalar m_weights[3]; // weights of the nodes involved, same size as m_num_nodes - btVector3 m_dirs[3]; // Constraint directions, same size of m_num_constraints; - int m_indices[3]; // indices of the nodes involved, same size as m_num_nodes; -}; - -class btDeformableContactProjection -{ -public: - typedef btAlignedObjectArray TVStack; - btAlignedObjectArray& m_softBodies; - - // all constraints involving face - btAlignedObjectArray m_allFaceConstraints; -#ifndef USE_MGS - // map from node index to projection directions - btHashMap > m_projectionsDict; -#else - btAlignedObjectArray m_projections; -#endif - - btAlignedObjectArray m_lagrangeMultipliers; - - // map from node index to static constraint - btAlignedObjectArray > m_staticConstraints; - // map from node index to node rigid constraint - btAlignedObjectArray > m_nodeRigidConstraints; - // map from node index to face rigid constraint - btAlignedObjectArray > m_faceRigidConstraints; - // map from node index to deformable constraint - btAlignedObjectArray > m_deformableConstraints; - // map from node index to node anchor constraint - btAlignedObjectArray > m_nodeAnchorConstraints; - - bool m_useStrainLimiting; - - btDeformableContactProjection(btAlignedObjectArray& softBodies) - : m_softBodies(softBodies) - { - } - - virtual ~btDeformableContactProjection() - { - } - - // apply the constraints to the rhs of the linear solve - virtual void project(TVStack& x); - - // add friction force to the rhs of the linear solve - virtual void applyDynamicFriction(TVStack& f); - - // update and solve the constraints - virtual btScalar update(btCollisionObject** deformableBodies, int numDeformableBodies, const btContactSolverInfo& infoGlobal); - - // Add constraints to m_constraints. In addition, the constraints that each vertex own are recorded in m_constraintsDict. - virtual void setConstraints(const btContactSolverInfo& infoGlobal); - - // Set up projections for each vertex by adding the projection direction to - virtual void setProjection(); - - virtual void reinitialize(bool nodeUpdated); - - btScalar solveSplitImpulse(btCollisionObject** deformableBodies, int numDeformableBodies, const btContactSolverInfo& infoGlobal); - - virtual void setLagrangeMultiplier(); - - void checkConstraints(const TVStack& x); -}; -#endif /* btDeformableContactProjection_h */ diff --git a/engine/inc/bullet/BulletSoftBody/btDeformableCorotatedForce.h b/engine/inc/bullet/BulletSoftBody/btDeformableCorotatedForce.h deleted file mode 100644 index dfd85523..00000000 --- a/engine/inc/bullet/BulletSoftBody/btDeformableCorotatedForce.h +++ /dev/null @@ -1,124 +0,0 @@ -/* - Written by Xuchen Han - - Bullet Continuous Collision Detection and Physics Library - Copyright (c) 2019 Google Inc. http://bulletphysics.org - 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_COROTATED_H -#define BT_COROTATED_H - -#include "btDeformableLagrangianForce.h" -#include "LinearMath/btPolarDecomposition.h" - -static inline int PolarDecomposition(const btMatrix3x3& m, btMatrix3x3& q, btMatrix3x3& s) -{ - static const btPolarDecomposition polar; - return polar.decompose(m, q, s); -} - -class btDeformableCorotatedForce : public btDeformableLagrangianForce -{ -public: - typedef btAlignedObjectArray TVStack; - btScalar m_mu, m_lambda; - btDeformableCorotatedForce() : m_mu(1), m_lambda(1) - { - } - - btDeformableCorotatedForce(btScalar mu, btScalar lambda) : m_mu(mu), m_lambda(lambda) - { - } - - virtual void addScaledForces(btScalar scale, TVStack& force) - { - addScaledElasticForce(scale, force); - } - - virtual void addScaledExplicitForce(btScalar scale, TVStack& force) - { - addScaledElasticForce(scale, force); - } - - virtual void addScaledDampingForce(btScalar scale, TVStack& force) - { - } - - virtual void addScaledElasticForce(btScalar scale, TVStack& force) - { - int numNodes = getNumNodes(); - btAssert(numNodes <= force.size()); - btVector3 grad_N_hat_1st_col = btVector3(-1, -1, -1); - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - for (int j = 0; j < psb->m_tetras.size(); ++j) - { - btSoftBody::Tetra& tetra = psb->m_tetras[j]; - btMatrix3x3 P; - firstPiola(tetra.m_F, P); - btVector3 force_on_node0 = P * (tetra.m_Dm_inverse.transpose() * grad_N_hat_1st_col); - btMatrix3x3 force_on_node123 = P * tetra.m_Dm_inverse.transpose(); - - btSoftBody::Node* node0 = tetra.m_n[0]; - btSoftBody::Node* node1 = tetra.m_n[1]; - btSoftBody::Node* node2 = tetra.m_n[2]; - btSoftBody::Node* node3 = tetra.m_n[3]; - size_t id0 = node0->index; - size_t id1 = node1->index; - size_t id2 = node2->index; - size_t id3 = node3->index; - - // elastic force - // explicit elastic force - btScalar scale1 = scale * tetra.m_element_measure; - force[id0] -= scale1 * force_on_node0; - force[id1] -= scale1 * force_on_node123.getColumn(0); - force[id2] -= scale1 * force_on_node123.getColumn(1); - force[id3] -= scale1 * force_on_node123.getColumn(2); - } - } - } - - void firstPiola(const btMatrix3x3& F, btMatrix3x3& P) - { - // btMatrix3x3 JFinvT = F.adjoint(); - btScalar J = F.determinant(); - P = F.adjoint().transpose() * (m_lambda * (J - 1)); - if (m_mu > SIMD_EPSILON) - { - btMatrix3x3 R, S; - if (J < 1024 * SIMD_EPSILON) - R.setIdentity(); - else - PolarDecomposition(F, R, S); // this QR is not robust, consider using implicit shift svd - /*https://fuchuyuan.github.io/research/svd/paper.pdf*/ - P += (F - R) * 2 * m_mu; - } - } - - virtual void addScaledElasticForceDifferential(btScalar scale, const TVStack& dx, TVStack& df) - { - } - - virtual void addScaledDampingForceDifferential(btScalar scale, const TVStack& dv, TVStack& df) - { - } - - virtual void buildDampingForceDifferentialDiagonal(btScalar scale, TVStack& diagA) {} - - virtual btDeformableLagrangianForceType getForceType() - { - return BT_COROTATED_FORCE; - } -}; - -#endif /* btCorotated_h */ diff --git a/engine/inc/bullet/BulletSoftBody/btDeformableGravityForce.h b/engine/inc/bullet/BulletSoftBody/btDeformableGravityForce.h deleted file mode 100644 index d91867f4..00000000 --- a/engine/inc/bullet/BulletSoftBody/btDeformableGravityForce.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - Written by Xuchen Han - - Bullet Continuous Collision Detection and Physics Library - Copyright (c) 2019 Google Inc. http://bulletphysics.org - 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_DEFORMABLE_GRAVITY_FORCE_H -#define BT_DEFORMABLE_GRAVITY_FORCE_H - -#include "btDeformableLagrangianForce.h" - -class btDeformableGravityForce : public btDeformableLagrangianForce -{ -public: - typedef btAlignedObjectArray TVStack; - btVector3 m_gravity; - - btDeformableGravityForce(const btVector3& g) : m_gravity(g) - { - } - - virtual void addScaledForces(btScalar scale, TVStack& force) - { - addScaledGravityForce(scale, force); - } - - virtual void addScaledExplicitForce(btScalar scale, TVStack& force) - { - addScaledGravityForce(scale, force); - } - - virtual void addScaledDampingForce(btScalar scale, TVStack& force) - { - } - - virtual void addScaledElasticForceDifferential(btScalar scale, const TVStack& dx, TVStack& df) - { - } - - virtual void addScaledDampingForceDifferential(btScalar scale, const TVStack& dv, TVStack& df) - { - } - - virtual void buildDampingForceDifferentialDiagonal(btScalar scale, TVStack& diagA) {} - - virtual void addScaledGravityForce(btScalar scale, TVStack& force) - { - int numNodes = getNumNodes(); - btAssert(numNodes <= force.size()); - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - if (!psb->isActive()) - { - continue; - } - for (int j = 0; j < psb->m_nodes.size(); ++j) - { - btSoftBody::Node& n = psb->m_nodes[j]; - size_t id = n.index; - btScalar mass = (n.m_im == 0) ? 0 : 1. / n.m_im; - btVector3 scaled_force = scale * m_gravity * mass * m_softBodies[i]->m_gravityFactor; - force[id] += scaled_force; - } - } - } - - virtual btDeformableLagrangianForceType getForceType() - { - return BT_GRAVITY_FORCE; - } - - // the gravitational potential energy - virtual double totalEnergy(btScalar dt) - { - double e = 0; - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - if (!psb->isActive()) - { - continue; - } - for (int j = 0; j < psb->m_nodes.size(); ++j) - { - const btSoftBody::Node& node = psb->m_nodes[j]; - if (node.m_im > 0) - { - e -= m_gravity.dot(node.m_q) / node.m_im; - } - } - } - return e; - } -}; -#endif /* BT_DEFORMABLE_GRAVITY_FORCE_H */ diff --git a/engine/inc/bullet/BulletSoftBody/btDeformableLagrangianForce.h b/engine/inc/bullet/BulletSoftBody/btDeformableLagrangianForce.h deleted file mode 100644 index d58d825d..00000000 --- a/engine/inc/bullet/BulletSoftBody/btDeformableLagrangianForce.h +++ /dev/null @@ -1,372 +0,0 @@ -/* - Written by Xuchen Han - - Bullet Continuous Collision Detection and Physics Library - Copyright (c) 2019 Google Inc. http://bulletphysics.org - 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_DEFORMABLE_LAGRANGIAN_FORCE_H -#define BT_DEFORMABLE_LAGRANGIAN_FORCE_H - -#include "btSoftBody.h" -#include -#include - -enum btDeformableLagrangianForceType -{ - BT_GRAVITY_FORCE = 1, - BT_MASSSPRING_FORCE = 2, - BT_COROTATED_FORCE = 3, - BT_NEOHOOKEAN_FORCE = 4, - BT_LINEAR_ELASTICITY_FORCE = 5, - BT_MOUSE_PICKING_FORCE = 6 -}; - -static inline double randomDouble(double low, double high) -{ - return low + static_cast(rand()) / RAND_MAX * (high - low); -} - -class btDeformableLagrangianForce -{ -public: - typedef btAlignedObjectArray TVStack; - btAlignedObjectArray m_softBodies; - const btAlignedObjectArray* m_nodes; - - btDeformableLagrangianForce() - { - } - - virtual ~btDeformableLagrangianForce() {} - - // add all forces - virtual void addScaledForces(btScalar scale, TVStack& force) = 0; - - // add damping df - virtual void addScaledDampingForceDifferential(btScalar scale, const TVStack& dv, TVStack& df) = 0; - - // build diagonal of A matrix - virtual void buildDampingForceDifferentialDiagonal(btScalar scale, TVStack& diagA) = 0; - - // add elastic df - virtual void addScaledElasticForceDifferential(btScalar scale, const TVStack& dx, TVStack& df) = 0; - - // add all forces that are explicit in explicit solve - virtual void addScaledExplicitForce(btScalar scale, TVStack& force) = 0; - - // add all damping forces - virtual void addScaledDampingForce(btScalar scale, TVStack& force) = 0; - - virtual void addScaledHessian(btScalar scale) {} - - virtual btDeformableLagrangianForceType getForceType() = 0; - - virtual void reinitialize(bool nodeUpdated) - { - } - - // get number of nodes that have the force - virtual int getNumNodes() - { - int numNodes = 0; - for (int i = 0; i < m_softBodies.size(); ++i) - { - numNodes += m_softBodies[i]->m_nodes.size(); - } - return numNodes; - } - - // add a soft body to be affected by the particular lagrangian force - virtual void addSoftBody(btSoftBody* psb) - { - m_softBodies.push_back(psb); - } - - virtual void removeSoftBody(btSoftBody* psb) - { - m_softBodies.remove(psb); - } - - virtual void setIndices(const btAlignedObjectArray* nodes) - { - m_nodes = nodes; - } - - // Calculate the incremental deformable generated from the input dx - virtual btMatrix3x3 Ds(int id0, int id1, int id2, int id3, const TVStack& dx) - { - btVector3 c1 = dx[id1] - dx[id0]; - btVector3 c2 = dx[id2] - dx[id0]; - btVector3 c3 = dx[id3] - dx[id0]; - return btMatrix3x3(c1, c2, c3).transpose(); - } - - // Calculate the incremental deformable generated from the current velocity - virtual btMatrix3x3 DsFromVelocity(const btSoftBody::Node* n0, const btSoftBody::Node* n1, const btSoftBody::Node* n2, const btSoftBody::Node* n3) - { - btVector3 c1 = n1->m_v - n0->m_v; - btVector3 c2 = n2->m_v - n0->m_v; - btVector3 c3 = n3->m_v - n0->m_v; - return btMatrix3x3(c1, c2, c3).transpose(); - } - - // test for addScaledElasticForce function - virtual void testDerivative() - { - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - for (int j = 0; j < psb->m_nodes.size(); ++j) - { - psb->m_nodes[j].m_q += btVector3(randomDouble(-.1, .1), randomDouble(-.1, .1), randomDouble(-.1, .1)); - } - psb->updateDeformation(); - } - - TVStack dx; - dx.resize(getNumNodes()); - TVStack dphi_dx; - dphi_dx.resize(dx.size()); - for (int i = 0; i < dphi_dx.size(); ++i) - { - dphi_dx[i].setZero(); - } - addScaledForces(-1, dphi_dx); - - // write down the current position - TVStack x; - x.resize(dx.size()); - int counter = 0; - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - for (int j = 0; j < psb->m_nodes.size(); ++j) - { - x[counter] = psb->m_nodes[j].m_q; - counter++; - } - } - counter = 0; - - // populate dx with random vectors - for (int i = 0; i < dx.size(); ++i) - { - dx[i].setX(randomDouble(-1, 1)); - dx[i].setY(randomDouble(-1, 1)); - dx[i].setZ(randomDouble(-1, 1)); - } - - btAlignedObjectArray errors; - for (int it = 0; it < 10; ++it) - { - for (int i = 0; i < dx.size(); ++i) - { - dx[i] *= 0.5; - } - - // get dphi/dx * dx - double dphi = 0; - for (int i = 0; i < dx.size(); ++i) - { - dphi += dphi_dx[i].dot(dx[i]); - } - - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - for (int j = 0; j < psb->m_nodes.size(); ++j) - { - psb->m_nodes[j].m_q = x[counter] + dx[counter]; - counter++; - } - psb->updateDeformation(); - } - counter = 0; - double f1 = totalElasticEnergy(0); - - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - for (int j = 0; j < psb->m_nodes.size(); ++j) - { - psb->m_nodes[j].m_q = x[counter] - dx[counter]; - counter++; - } - psb->updateDeformation(); - } - counter = 0; - - double f2 = totalElasticEnergy(0); - - //restore m_q - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - for (int j = 0; j < psb->m_nodes.size(); ++j) - { - psb->m_nodes[j].m_q = x[counter]; - counter++; - } - psb->updateDeformation(); - } - counter = 0; - double error = f1 - f2 - 2 * dphi; - errors.push_back(error); - std::cout << "Iteration = " << it << ", f1 = " << f1 << ", f2 = " << f2 << ", error = " << error << std::endl; - } - for (int i = 1; i < errors.size(); ++i) - { - std::cout << "Iteration = " << i << ", ratio = " << errors[i - 1] / errors[i] << std::endl; - } - } - - // test for addScaledElasticForce function - virtual void testHessian() - { - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - for (int j = 0; j < psb->m_nodes.size(); ++j) - { - psb->m_nodes[j].m_q += btVector3(randomDouble(-.1, .1), randomDouble(-.1, .1), randomDouble(-.1, .1)); - } - psb->updateDeformation(); - } - - TVStack dx; - dx.resize(getNumNodes()); - TVStack df; - df.resize(dx.size()); - TVStack f1; - f1.resize(dx.size()); - TVStack f2; - f2.resize(dx.size()); - - // write down the current position - TVStack x; - x.resize(dx.size()); - int counter = 0; - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - for (int j = 0; j < psb->m_nodes.size(); ++j) - { - x[counter] = psb->m_nodes[j].m_q; - counter++; - } - } - counter = 0; - - // populate dx with random vectors - for (int i = 0; i < dx.size(); ++i) - { - dx[i].setX(randomDouble(-1, 1)); - dx[i].setY(randomDouble(-1, 1)); - dx[i].setZ(randomDouble(-1, 1)); - } - - btAlignedObjectArray errors; - for (int it = 0; it < 10; ++it) - { - for (int i = 0; i < dx.size(); ++i) - { - dx[i] *= 0.5; - } - - // get df - for (int i = 0; i < df.size(); ++i) - { - df[i].setZero(); - f1[i].setZero(); - f2[i].setZero(); - } - - //set df - addScaledElasticForceDifferential(-1, dx, df); - - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - for (int j = 0; j < psb->m_nodes.size(); ++j) - { - psb->m_nodes[j].m_q = x[counter] + dx[counter]; - counter++; - } - psb->updateDeformation(); - } - counter = 0; - - //set f1 - addScaledForces(-1, f1); - - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - for (int j = 0; j < psb->m_nodes.size(); ++j) - { - psb->m_nodes[j].m_q = x[counter] - dx[counter]; - counter++; - } - psb->updateDeformation(); - } - counter = 0; - - //set f2 - addScaledForces(-1, f2); - - //restore m_q - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - for (int j = 0; j < psb->m_nodes.size(); ++j) - { - psb->m_nodes[j].m_q = x[counter]; - counter++; - } - psb->updateDeformation(); - } - counter = 0; - double error = 0; - for (int i = 0; i < df.size(); ++i) - { - btVector3 error_vector = f1[i] - f2[i] - 2 * df[i]; - error += error_vector.length2(); - } - error = btSqrt(error); - errors.push_back(error); - std::cout << "Iteration = " << it << ", error = " << error << std::endl; - } - for (int i = 1; i < errors.size(); ++i) - { - std::cout << "Iteration = " << i << ", ratio = " << errors[i - 1] / errors[i] << std::endl; - } - } - - // - virtual double totalElasticEnergy(btScalar dt) - { - return 0; - } - - // - virtual double totalDampingEnergy(btScalar dt) - { - return 0; - } - - // total Energy takes dt as input because certain energies depend on dt - virtual double totalEnergy(btScalar dt) - { - return totalElasticEnergy(dt) + totalDampingEnergy(dt); - } -}; -#endif /* BT_DEFORMABLE_LAGRANGIAN_FORCE */ diff --git a/engine/inc/bullet/BulletSoftBody/btDeformableLinearElasticityForce.h b/engine/inc/bullet/BulletSoftBody/btDeformableLinearElasticityForce.h deleted file mode 100644 index 97119205..00000000 --- a/engine/inc/bullet/BulletSoftBody/btDeformableLinearElasticityForce.h +++ /dev/null @@ -1,462 +0,0 @@ -/* - Written by Xuchen Han - - Bullet Continuous Collision Detection and Physics Library - Copyright (c) 2019 Google Inc. http://bulletphysics.org - 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_LINEAR_ELASTICITY_H -#define BT_LINEAR_ELASTICITY_H - -#include "btDeformableLagrangianForce.h" -#include "LinearMath/btQuickprof.h" -#include "btSoftBodyInternals.h" -#define TETRA_FLAT_THRESHOLD 0.01 -class btDeformableLinearElasticityForce : public btDeformableLagrangianForce -{ -public: - typedef btAlignedObjectArray TVStack; - btScalar m_mu, m_lambda; - btScalar m_E, m_nu; // Young's modulus and Poisson ratio - btScalar m_damping_alpha, m_damping_beta; - btDeformableLinearElasticityForce() : m_mu(1), m_lambda(1), m_damping_alpha(0.01), m_damping_beta(0.01) - { - updateYoungsModulusAndPoissonRatio(); - } - - btDeformableLinearElasticityForce(btScalar mu, btScalar lambda, btScalar damping_alpha = 0.01, btScalar damping_beta = 0.01) : m_mu(mu), m_lambda(lambda), m_damping_alpha(damping_alpha), m_damping_beta(damping_beta) - { - updateYoungsModulusAndPoissonRatio(); - } - - void updateYoungsModulusAndPoissonRatio() - { - // conversion from Lame Parameters to Young's modulus and Poisson ratio - // https://en.wikipedia.org/wiki/Lam%C3%A9_parameters - m_E = m_mu * (3 * m_lambda + 2 * m_mu) / (m_lambda + m_mu); - m_nu = m_lambda * 0.5 / (m_mu + m_lambda); - } - - void updateLameParameters() - { - // conversion from Young's modulus and Poisson ratio to Lame Parameters - // https://en.wikipedia.org/wiki/Lam%C3%A9_parameters - m_mu = m_E * 0.5 / (1 + m_nu); - m_lambda = m_E * m_nu / ((1 + m_nu) * (1 - 2 * m_nu)); - } - - void setYoungsModulus(btScalar E) - { - m_E = E; - updateLameParameters(); - } - - void setPoissonRatio(btScalar nu) - { - m_nu = nu; - updateLameParameters(); - } - - void setDamping(btScalar damping_alpha, btScalar damping_beta) - { - m_damping_alpha = damping_alpha; - m_damping_beta = damping_beta; - } - - void setLameParameters(btScalar mu, btScalar lambda) - { - m_mu = mu; - m_lambda = lambda; - updateYoungsModulusAndPoissonRatio(); - } - - virtual void addScaledForces(btScalar scale, TVStack& force) - { - addScaledDampingForce(scale, force); - addScaledElasticForce(scale, force); - } - - virtual void addScaledExplicitForce(btScalar scale, TVStack& force) - { - addScaledElasticForce(scale, force); - } - - // The damping matrix is calculated using the time n state as described in https://www.math.ucla.edu/~jteran/papers/GSSJT15.pdf to allow line search - virtual void addScaledDampingForce(btScalar scale, TVStack& force) - { - if (m_damping_alpha == 0 && m_damping_beta == 0) - return; - btScalar mu_damp = m_damping_beta * m_mu; - btScalar lambda_damp = m_damping_beta * m_lambda; - int numNodes = getNumNodes(); - btAssert(numNodes <= force.size()); - btVector3 grad_N_hat_1st_col = btVector3(-1, -1, -1); - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - if (!psb->isActive()) - { - continue; - } - for (int j = 0; j < psb->m_tetras.size(); ++j) - { - bool close_to_flat = (psb->m_tetraScratches[j].m_J < TETRA_FLAT_THRESHOLD); - btSoftBody::Tetra& tetra = psb->m_tetras[j]; - btSoftBody::Node* node0 = tetra.m_n[0]; - btSoftBody::Node* node1 = tetra.m_n[1]; - btSoftBody::Node* node2 = tetra.m_n[2]; - btSoftBody::Node* node3 = tetra.m_n[3]; - size_t id0 = node0->index; - size_t id1 = node1->index; - size_t id2 = node2->index; - size_t id3 = node3->index; - btMatrix3x3 dF = DsFromVelocity(node0, node1, node2, node3) * tetra.m_Dm_inverse; - if (!close_to_flat) - { - dF = psb->m_tetraScratches[j].m_corotation.transpose() * dF; - } - btMatrix3x3 I; - I.setIdentity(); - btMatrix3x3 dP = (dF + dF.transpose()) * mu_damp + I * ((dF[0][0] + dF[1][1] + dF[2][2]) * lambda_damp); - btMatrix3x3 df_on_node123 = dP * tetra.m_Dm_inverse.transpose(); - if (!close_to_flat) - { - df_on_node123 = psb->m_tetraScratches[j].m_corotation * df_on_node123; - } - btVector3 df_on_node0 = df_on_node123 * grad_N_hat_1st_col; - // damping force differential - btScalar scale1 = scale * tetra.m_element_measure; - force[id0] -= scale1 * df_on_node0; - force[id1] -= scale1 * df_on_node123.getColumn(0); - force[id2] -= scale1 * df_on_node123.getColumn(1); - force[id3] -= scale1 * df_on_node123.getColumn(2); - } - for (int j = 0; j < psb->m_nodes.size(); ++j) - { - const btSoftBody::Node& node = psb->m_nodes[j]; - size_t id = node.index; - if (node.m_im > 0) - { - force[id] -= scale * node.m_v / node.m_im * m_damping_alpha; - } - } - } - } - - virtual double totalElasticEnergy(btScalar dt) - { - double energy = 0; - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - if (!psb->isActive()) - { - continue; - } - for (int j = 0; j < psb->m_tetraScratches.size(); ++j) - { - btSoftBody::Tetra& tetra = psb->m_tetras[j]; - btSoftBody::TetraScratch& s = psb->m_tetraScratches[j]; - energy += tetra.m_element_measure * elasticEnergyDensity(s); - } - } - return energy; - } - - // The damping energy is formulated as in https://www.math.ucla.edu/~jteran/papers/GSSJT15.pdf to allow line search - virtual double totalDampingEnergy(btScalar dt) - { - double energy = 0; - int sz = 0; - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - if (!psb->isActive()) - { - continue; - } - for (int j = 0; j < psb->m_nodes.size(); ++j) - { - sz = btMax(sz, psb->m_nodes[j].index); - } - } - TVStack dampingForce; - dampingForce.resize(sz + 1); - for (int i = 0; i < dampingForce.size(); ++i) - dampingForce[i].setZero(); - addScaledDampingForce(0.5, dampingForce); - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - for (int j = 0; j < psb->m_nodes.size(); ++j) - { - const btSoftBody::Node& node = psb->m_nodes[j]; - energy -= dampingForce[node.index].dot(node.m_v) / dt; - } - } - return energy; - } - - double elasticEnergyDensity(const btSoftBody::TetraScratch& s) - { - double density = 0; - btMatrix3x3 epsilon = (s.m_F + s.m_F.transpose()) * 0.5 - btMatrix3x3::getIdentity(); - btScalar trace = epsilon[0][0] + epsilon[1][1] + epsilon[2][2]; - density += m_mu * (epsilon[0].length2() + epsilon[1].length2() + epsilon[2].length2()); - density += m_lambda * trace * trace * 0.5; - return density; - } - - virtual void addScaledElasticForce(btScalar scale, TVStack& force) - { - int numNodes = getNumNodes(); - btAssert(numNodes <= force.size()); - btVector3 grad_N_hat_1st_col = btVector3(-1, -1, -1); - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - if (!psb->isActive()) - { - continue; - } - btScalar max_p = psb->m_cfg.m_maxStress; - for (int j = 0; j < psb->m_tetras.size(); ++j) - { - btSoftBody::Tetra& tetra = psb->m_tetras[j]; - btMatrix3x3 P; - firstPiola(psb->m_tetraScratches[j], P); -#if USE_SVD - if (max_p > 0) - { - // since we want to clamp the principal stress to max_p, we only need to - // calculate SVD when sigma_0^2 + sigma_1^2 + sigma_2^2 > max_p * max_p - btScalar trPTP = (P[0].length2() + P[1].length2() + P[2].length2()); - if (trPTP > max_p * max_p) - { - btMatrix3x3 U, V; - btVector3 sigma; - singularValueDecomposition(P, U, sigma, V); - sigma[0] = btMin(sigma[0], max_p); - sigma[1] = btMin(sigma[1], max_p); - sigma[2] = btMin(sigma[2], max_p); - sigma[0] = btMax(sigma[0], -max_p); - sigma[1] = btMax(sigma[1], -max_p); - sigma[2] = btMax(sigma[2], -max_p); - btMatrix3x3 Sigma; - Sigma.setIdentity(); - Sigma[0][0] = sigma[0]; - Sigma[1][1] = sigma[1]; - Sigma[2][2] = sigma[2]; - P = U * Sigma * V.transpose(); - } - } -#endif - // btVector3 force_on_node0 = P * (tetra.m_Dm_inverse.transpose()*grad_N_hat_1st_col); - btMatrix3x3 force_on_node123 = psb->m_tetraScratches[j].m_corotation * P * tetra.m_Dm_inverse.transpose(); - btVector3 force_on_node0 = force_on_node123 * grad_N_hat_1st_col; - - btSoftBody::Node* node0 = tetra.m_n[0]; - btSoftBody::Node* node1 = tetra.m_n[1]; - btSoftBody::Node* node2 = tetra.m_n[2]; - btSoftBody::Node* node3 = tetra.m_n[3]; - size_t id0 = node0->index; - size_t id1 = node1->index; - size_t id2 = node2->index; - size_t id3 = node3->index; - - // elastic force - btScalar scale1 = scale * tetra.m_element_measure; - force[id0] -= scale1 * force_on_node0; - force[id1] -= scale1 * force_on_node123.getColumn(0); - force[id2] -= scale1 * force_on_node123.getColumn(1); - force[id3] -= scale1 * force_on_node123.getColumn(2); - } - } - } - - virtual void buildDampingForceDifferentialDiagonal(btScalar scale, TVStack& diagA) {} - - // The damping matrix is calculated using the time n state as described in https://www.math.ucla.edu/~jteran/papers/GSSJT15.pdf to allow line search - virtual void addScaledDampingForceDifferential(btScalar scale, const TVStack& dv, TVStack& df) - { - if (m_damping_alpha == 0 && m_damping_beta == 0) - return; - btScalar mu_damp = m_damping_beta * m_mu; - btScalar lambda_damp = m_damping_beta * m_lambda; - int numNodes = getNumNodes(); - btAssert(numNodes <= df.size()); - btVector3 grad_N_hat_1st_col = btVector3(-1, -1, -1); - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - if (!psb->isActive()) - { - continue; - } - for (int j = 0; j < psb->m_tetras.size(); ++j) - { - bool close_to_flat = (psb->m_tetraScratches[j].m_J < TETRA_FLAT_THRESHOLD); - btSoftBody::Tetra& tetra = psb->m_tetras[j]; - btSoftBody::Node* node0 = tetra.m_n[0]; - btSoftBody::Node* node1 = tetra.m_n[1]; - btSoftBody::Node* node2 = tetra.m_n[2]; - btSoftBody::Node* node3 = tetra.m_n[3]; - size_t id0 = node0->index; - size_t id1 = node1->index; - size_t id2 = node2->index; - size_t id3 = node3->index; - btMatrix3x3 dF = Ds(id0, id1, id2, id3, dv) * tetra.m_Dm_inverse; - if (!close_to_flat) - { - dF = psb->m_tetraScratches[j].m_corotation.transpose() * dF; - } - btMatrix3x3 I; - I.setIdentity(); - btMatrix3x3 dP = (dF + dF.transpose()) * mu_damp + I * ((dF[0][0] + dF[1][1] + dF[2][2]) * lambda_damp); - btMatrix3x3 df_on_node123 = dP * tetra.m_Dm_inverse.transpose(); - if (!close_to_flat) - { - df_on_node123 = psb->m_tetraScratches[j].m_corotation * df_on_node123; - } - btVector3 df_on_node0 = df_on_node123 * grad_N_hat_1st_col; - - // damping force differential - btScalar scale1 = scale * tetra.m_element_measure; - df[id0] -= scale1 * df_on_node0; - df[id1] -= scale1 * df_on_node123.getColumn(0); - df[id2] -= scale1 * df_on_node123.getColumn(1); - df[id3] -= scale1 * df_on_node123.getColumn(2); - } - for (int j = 0; j < psb->m_nodes.size(); ++j) - { - const btSoftBody::Node& node = psb->m_nodes[j]; - size_t id = node.index; - if (node.m_im > 0) - { - df[id] -= scale * dv[id] / node.m_im * m_damping_alpha; - } - } - } - } - - virtual void addScaledElasticForceDifferential(btScalar scale, const TVStack& dx, TVStack& df) - { - int numNodes = getNumNodes(); - btAssert(numNodes <= df.size()); - btVector3 grad_N_hat_1st_col = btVector3(-1, -1, -1); - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - if (!psb->isActive()) - { - continue; - } - for (int j = 0; j < psb->m_tetras.size(); ++j) - { - btSoftBody::Tetra& tetra = psb->m_tetras[j]; - btSoftBody::Node* node0 = tetra.m_n[0]; - btSoftBody::Node* node1 = tetra.m_n[1]; - btSoftBody::Node* node2 = tetra.m_n[2]; - btSoftBody::Node* node3 = tetra.m_n[3]; - size_t id0 = node0->index; - size_t id1 = node1->index; - size_t id2 = node2->index; - size_t id3 = node3->index; - btMatrix3x3 dF = psb->m_tetraScratches[j].m_corotation.transpose() * Ds(id0, id1, id2, id3, dx) * tetra.m_Dm_inverse; - btMatrix3x3 dP; - firstPiolaDifferential(psb->m_tetraScratches[j], dF, dP); - // btVector3 df_on_node0 = dP * (tetra.m_Dm_inverse.transpose()*grad_N_hat_1st_col); - btMatrix3x3 df_on_node123 = psb->m_tetraScratches[j].m_corotation * dP * tetra.m_Dm_inverse.transpose(); - btVector3 df_on_node0 = df_on_node123 * grad_N_hat_1st_col; - - // elastic force differential - btScalar scale1 = scale * tetra.m_element_measure; - df[id0] -= scale1 * df_on_node0; - df[id1] -= scale1 * df_on_node123.getColumn(0); - df[id2] -= scale1 * df_on_node123.getColumn(1); - df[id3] -= scale1 * df_on_node123.getColumn(2); - } - } - } - - void firstPiola(const btSoftBody::TetraScratch& s, btMatrix3x3& P) - { - btMatrix3x3 corotated_F = s.m_corotation.transpose() * s.m_F; - - btMatrix3x3 epsilon = (corotated_F + corotated_F.transpose()) * 0.5 - btMatrix3x3::getIdentity(); - btScalar trace = epsilon[0][0] + epsilon[1][1] + epsilon[2][2]; - P = epsilon * btScalar(2) * m_mu + btMatrix3x3::getIdentity() * m_lambda * trace; - } - - // Let P be the first piola stress. - // This function calculates the dP = dP/dF * dF - void firstPiolaDifferential(const btSoftBody::TetraScratch& s, const btMatrix3x3& dF, btMatrix3x3& dP) - { - btScalar trace = (dF[0][0] + dF[1][1] + dF[2][2]); - dP = (dF + dF.transpose()) * m_mu + btMatrix3x3::getIdentity() * m_lambda * trace; - } - - // Let Q be the damping stress. - // This function calculates the dP = dQ/dF * dF - void firstPiolaDampingDifferential(const btSoftBody::TetraScratch& s, const btMatrix3x3& dF, btMatrix3x3& dP) - { - btScalar mu_damp = m_damping_beta * m_mu; - btScalar lambda_damp = m_damping_beta * m_lambda; - btScalar trace = (dF[0][0] + dF[1][1] + dF[2][2]); - dP = (dF + dF.transpose()) * mu_damp + btMatrix3x3::getIdentity() * lambda_damp * trace; - } - - virtual void addScaledHessian(btScalar scale) - { - btVector3 grad_N_hat_1st_col = btVector3(-1, -1, -1); - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - if (!psb->isActive()) - { - continue; - } - for (int j = 0; j < psb->m_tetras.size(); ++j) - { - btSoftBody::Tetra& tetra = psb->m_tetras[j]; - btMatrix3x3 P; - firstPiola(psb->m_tetraScratches[j], P); // make sure scratch is evaluated at x_n + dt * vn - btMatrix3x3 force_on_node123 = psb->m_tetraScratches[j].m_corotation * P * tetra.m_Dm_inverse.transpose(); - btVector3 force_on_node0 = force_on_node123 * grad_N_hat_1st_col; - btSoftBody::Node* node0 = tetra.m_n[0]; - btSoftBody::Node* node1 = tetra.m_n[1]; - btSoftBody::Node* node2 = tetra.m_n[2]; - btSoftBody::Node* node3 = tetra.m_n[3]; - btScalar scale1 = scale * (scale + m_damping_beta) * tetra.m_element_measure; // stiff and stiffness-damping terms; - node0->m_effectiveMass += OuterProduct(force_on_node0, force_on_node0) * scale1; - node1->m_effectiveMass += OuterProduct(force_on_node123.getColumn(0), force_on_node123.getColumn(0)) * scale1; - node2->m_effectiveMass += OuterProduct(force_on_node123.getColumn(1), force_on_node123.getColumn(1)) * scale1; - node3->m_effectiveMass += OuterProduct(force_on_node123.getColumn(2), force_on_node123.getColumn(2)) * scale1; - } - for (int j = 0; j < psb->m_nodes.size(); ++j) - { - btSoftBody::Node& node = psb->m_nodes[j]; - if (node.m_im > 0) - { - btMatrix3x3 I; - I.setIdentity(); - node.m_effectiveMass += I * (scale * (1.0 / node.m_im) * m_damping_alpha); - } - } - } - } - - virtual btDeformableLagrangianForceType getForceType() - { - return BT_LINEAR_ELASTICITY_FORCE; - } -}; -#endif /* BT_LINEAR_ELASTICITY_H */ diff --git a/engine/inc/bullet/BulletSoftBody/btDeformableMassSpringForce.h b/engine/inc/bullet/BulletSoftBody/btDeformableMassSpringForce.h deleted file mode 100644 index 8c97bd1b..00000000 --- a/engine/inc/bullet/BulletSoftBody/btDeformableMassSpringForce.h +++ /dev/null @@ -1,301 +0,0 @@ -/* - Written by Xuchen Han - - Bullet Continuous Collision Detection and Physics Library - Copyright (c) 2019 Google Inc. http://bulletphysics.org - 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_MASS_SPRING_H -#define BT_MASS_SPRING_H - -#include "btDeformableLagrangianForce.h" - -class btDeformableMassSpringForce : public btDeformableLagrangianForce -{ - // If true, the damping force will be in the direction of the spring - // If false, the damping force will be in the direction of the velocity - bool m_momentum_conserving; - btScalar m_elasticStiffness, m_dampingStiffness, m_bendingStiffness; - -public: - typedef btAlignedObjectArray TVStack; - btDeformableMassSpringForce() : m_momentum_conserving(false), m_elasticStiffness(1), m_dampingStiffness(0.05) - { - } - btDeformableMassSpringForce(btScalar k, btScalar d, bool conserve_angular = true, double bending_k = -1) : m_momentum_conserving(conserve_angular), m_elasticStiffness(k), m_dampingStiffness(d), m_bendingStiffness(bending_k) - { - if (m_bendingStiffness < btScalar(0)) - { - m_bendingStiffness = m_elasticStiffness; - } - } - - virtual void addScaledForces(btScalar scale, TVStack& force) - { - addScaledDampingForce(scale, force); - addScaledElasticForce(scale, force); - } - - virtual void addScaledExplicitForce(btScalar scale, TVStack& force) - { - addScaledElasticForce(scale, force); - } - - virtual void addScaledDampingForce(btScalar scale, TVStack& force) - { - int numNodes = getNumNodes(); - btAssert(numNodes <= force.size()); - for (int i = 0; i < m_softBodies.size(); ++i) - { - const btSoftBody* psb = m_softBodies[i]; - if (!psb->isActive()) - { - continue; - } - for (int j = 0; j < psb->m_links.size(); ++j) - { - const btSoftBody::Link& link = psb->m_links[j]; - btSoftBody::Node* node1 = link.m_n[0]; - btSoftBody::Node* node2 = link.m_n[1]; - size_t id1 = node1->index; - size_t id2 = node2->index; - - // damping force - btVector3 v_diff = (node2->m_v - node1->m_v); - btVector3 scaled_force = scale * m_dampingStiffness * v_diff; - if (m_momentum_conserving) - { - if ((node2->m_x - node1->m_x).norm() > SIMD_EPSILON) - { - btVector3 dir = (node2->m_x - node1->m_x).normalized(); - scaled_force = scale * m_dampingStiffness * v_diff.dot(dir) * dir; - } - } - force[id1] += scaled_force; - force[id2] -= scaled_force; - } - } - } - - virtual void addScaledElasticForce(btScalar scale, TVStack& force) - { - int numNodes = getNumNodes(); - btAssert(numNodes <= force.size()); - for (int i = 0; i < m_softBodies.size(); ++i) - { - const btSoftBody* psb = m_softBodies[i]; - if (!psb->isActive()) - { - continue; - } - for (int j = 0; j < psb->m_links.size(); ++j) - { - const btSoftBody::Link& link = psb->m_links[j]; - btSoftBody::Node* node1 = link.m_n[0]; - btSoftBody::Node* node2 = link.m_n[1]; - btScalar r = link.m_rl; - size_t id1 = node1->index; - size_t id2 = node2->index; - - // elastic force - btVector3 dir = (node2->m_q - node1->m_q); - btVector3 dir_normalized = (dir.norm() > SIMD_EPSILON) ? dir.normalized() : btVector3(0, 0, 0); - btScalar scaled_stiffness = scale * (link.m_bbending ? m_bendingStiffness : m_elasticStiffness); - btVector3 scaled_force = scaled_stiffness * (dir - dir_normalized * r); - force[id1] += scaled_force; - force[id2] -= scaled_force; - } - } - } - - virtual void addScaledDampingForceDifferential(btScalar scale, const TVStack& dv, TVStack& df) - { - // implicit damping force differential - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - if (!psb->isActive()) - { - continue; - } - btScalar scaled_k_damp = m_dampingStiffness * scale; - for (int j = 0; j < psb->m_links.size(); ++j) - { - const btSoftBody::Link& link = psb->m_links[j]; - btSoftBody::Node* node1 = link.m_n[0]; - btSoftBody::Node* node2 = link.m_n[1]; - size_t id1 = node1->index; - size_t id2 = node2->index; - - btVector3 local_scaled_df = scaled_k_damp * (dv[id2] - dv[id1]); - if (m_momentum_conserving) - { - if ((node2->m_x - node1->m_x).norm() > SIMD_EPSILON) - { - btVector3 dir = (node2->m_x - node1->m_x).normalized(); - local_scaled_df = scaled_k_damp * (dv[id2] - dv[id1]).dot(dir) * dir; - } - } - df[id1] += local_scaled_df; - df[id2] -= local_scaled_df; - } - } - } - - virtual void buildDampingForceDifferentialDiagonal(btScalar scale, TVStack& diagA) - { - // implicit damping force differential - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - if (!psb->isActive()) - { - continue; - } - btScalar scaled_k_damp = m_dampingStiffness * scale; - for (int j = 0; j < psb->m_links.size(); ++j) - { - const btSoftBody::Link& link = psb->m_links[j]; - btSoftBody::Node* node1 = link.m_n[0]; - btSoftBody::Node* node2 = link.m_n[1]; - size_t id1 = node1->index; - size_t id2 = node2->index; - if (m_momentum_conserving) - { - if ((node2->m_x - node1->m_x).norm() > SIMD_EPSILON) - { - btVector3 dir = (node2->m_x - node1->m_x).normalized(); - for (int d = 0; d < 3; ++d) - { - if (node1->m_im > 0) - diagA[id1][d] -= scaled_k_damp * dir[d] * dir[d]; - if (node2->m_im > 0) - diagA[id2][d] -= scaled_k_damp * dir[d] * dir[d]; - } - } - } - else - { - for (int d = 0; d < 3; ++d) - { - if (node1->m_im > 0) - diagA[id1][d] -= scaled_k_damp; - if (node2->m_im > 0) - diagA[id2][d] -= scaled_k_damp; - } - } - } - } - } - - virtual double totalElasticEnergy(btScalar dt) - { - double energy = 0; - for (int i = 0; i < m_softBodies.size(); ++i) - { - const btSoftBody* psb = m_softBodies[i]; - if (!psb->isActive()) - { - continue; - } - for (int j = 0; j < psb->m_links.size(); ++j) - { - const btSoftBody::Link& link = psb->m_links[j]; - btSoftBody::Node* node1 = link.m_n[0]; - btSoftBody::Node* node2 = link.m_n[1]; - btScalar r = link.m_rl; - - // elastic force - btVector3 dir = (node2->m_q - node1->m_q); - energy += 0.5 * m_elasticStiffness * (dir.norm() - r) * (dir.norm() - r); - } - } - return energy; - } - - virtual double totalDampingEnergy(btScalar dt) - { - double energy = 0; - int sz = 0; - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - if (!psb->isActive()) - { - continue; - } - for (int j = 0; j < psb->m_nodes.size(); ++j) - { - sz = btMax(sz, psb->m_nodes[j].index); - } - } - TVStack dampingForce; - dampingForce.resize(sz + 1); - for (int i = 0; i < dampingForce.size(); ++i) - dampingForce[i].setZero(); - addScaledDampingForce(0.5, dampingForce); - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - for (int j = 0; j < psb->m_nodes.size(); ++j) - { - const btSoftBody::Node& node = psb->m_nodes[j]; - energy -= dampingForce[node.index].dot(node.m_v) / dt; - } - } - return energy; - } - - virtual void addScaledElasticForceDifferential(btScalar scale, const TVStack& dx, TVStack& df) - { - // implicit damping force differential - for (int i = 0; i < m_softBodies.size(); ++i) - { - const btSoftBody* psb = m_softBodies[i]; - if (!psb->isActive()) - { - continue; - } - for (int j = 0; j < psb->m_links.size(); ++j) - { - const btSoftBody::Link& link = psb->m_links[j]; - btSoftBody::Node* node1 = link.m_n[0]; - btSoftBody::Node* node2 = link.m_n[1]; - size_t id1 = node1->index; - size_t id2 = node2->index; - btScalar r = link.m_rl; - - btVector3 dir = (node1->m_q - node2->m_q); - btScalar dir_norm = dir.norm(); - btVector3 dir_normalized = (dir_norm > SIMD_EPSILON) ? dir.normalized() : btVector3(0, 0, 0); - btVector3 dx_diff = dx[id1] - dx[id2]; - btVector3 scaled_df = btVector3(0, 0, 0); - btScalar scaled_k = scale * (link.m_bbending ? m_bendingStiffness : m_elasticStiffness); - if (dir_norm > SIMD_EPSILON) - { - scaled_df -= scaled_k * dir_normalized.dot(dx_diff) * dir_normalized; - scaled_df += scaled_k * dir_normalized.dot(dx_diff) * ((dir_norm - r) / dir_norm) * dir_normalized; - scaled_df -= scaled_k * ((dir_norm - r) / dir_norm) * dx_diff; - } - - df[id1] += scaled_df; - df[id2] -= scaled_df; - } - } - } - - virtual btDeformableLagrangianForceType getForceType() - { - return BT_MASSSPRING_FORCE; - } -}; - -#endif /* btMassSpring_h */ diff --git a/engine/inc/bullet/BulletSoftBody/btDeformableMousePickingForce.h b/engine/inc/bullet/BulletSoftBody/btDeformableMousePickingForce.h deleted file mode 100644 index d218d962..00000000 --- a/engine/inc/bullet/BulletSoftBody/btDeformableMousePickingForce.h +++ /dev/null @@ -1,162 +0,0 @@ -/* - Written by Xuchen Han - - Bullet Continuous Collision Detection and Physics Library - Copyright (c) 2019 Google Inc. http://bulletphysics.org - 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_MOUSE_PICKING_FORCE_H -#define BT_MOUSE_PICKING_FORCE_H - -#include "btDeformableLagrangianForce.h" - -class btDeformableMousePickingForce : public btDeformableLagrangianForce -{ - // If true, the damping force will be in the direction of the spring - // If false, the damping force will be in the direction of the velocity - btScalar m_elasticStiffness, m_dampingStiffness; - const btSoftBody::Face& m_face; - btVector3 m_mouse_pos; - btScalar m_maxForce; - -public: - typedef btAlignedObjectArray TVStack; - btDeformableMousePickingForce(btScalar k, btScalar d, const btSoftBody::Face& face, btVector3 mouse_pos, btScalar maxForce = 0.3) : m_elasticStiffness(k), m_dampingStiffness(d), m_face(face), m_mouse_pos(mouse_pos), m_maxForce(maxForce) - { - } - - virtual void addScaledForces(btScalar scale, TVStack& force) - { - addScaledDampingForce(scale, force); - addScaledElasticForce(scale, force); - } - - virtual void addScaledExplicitForce(btScalar scale, TVStack& force) - { - addScaledElasticForce(scale, force); - } - - virtual void addScaledDampingForce(btScalar scale, TVStack& force) - { - for (int i = 0; i < 3; ++i) - { - btVector3 v_diff = m_face.m_n[i]->m_v; - btVector3 scaled_force = scale * m_dampingStiffness * v_diff; - if ((m_face.m_n[i]->m_x - m_mouse_pos).norm() > SIMD_EPSILON) - { - btVector3 dir = (m_face.m_n[i]->m_x - m_mouse_pos).normalized(); - scaled_force = scale * m_dampingStiffness * v_diff.dot(dir) * dir; - } - force[m_face.m_n[i]->index] -= scaled_force; - } - } - - virtual void addScaledElasticForce(btScalar scale, TVStack& force) - { - btScalar scaled_stiffness = scale * m_elasticStiffness; - for (int i = 0; i < 3; ++i) - { - btVector3 dir = (m_face.m_n[i]->m_q - m_mouse_pos); - btVector3 scaled_force = scaled_stiffness * dir; - if (scaled_force.safeNorm() > m_maxForce) - { - scaled_force.safeNormalize(); - scaled_force *= m_maxForce; - } - force[m_face.m_n[i]->index] -= scaled_force; - } - } - - virtual void addScaledDampingForceDifferential(btScalar scale, const TVStack& dv, TVStack& df) - { - btScalar scaled_k_damp = m_dampingStiffness * scale; - for (int i = 0; i < 3; ++i) - { - btVector3 local_scaled_df = scaled_k_damp * dv[m_face.m_n[i]->index]; - if ((m_face.m_n[i]->m_x - m_mouse_pos).norm() > SIMD_EPSILON) - { - btVector3 dir = (m_face.m_n[i]->m_x - m_mouse_pos).normalized(); - local_scaled_df = scaled_k_damp * dv[m_face.m_n[i]->index].dot(dir) * dir; - } - df[m_face.m_n[i]->index] -= local_scaled_df; - } - } - - virtual void buildDampingForceDifferentialDiagonal(btScalar scale, TVStack& diagA) {} - - virtual double totalElasticEnergy(btScalar dt) - { - double energy = 0; - for (int i = 0; i < 3; ++i) - { - btVector3 dir = (m_face.m_n[i]->m_q - m_mouse_pos); - btVector3 scaled_force = m_elasticStiffness * dir; - if (scaled_force.safeNorm() > m_maxForce) - { - scaled_force.safeNormalize(); - scaled_force *= m_maxForce; - } - energy += 0.5 * scaled_force.dot(dir); - } - return energy; - } - - virtual double totalDampingEnergy(btScalar dt) - { - double energy = 0; - for (int i = 0; i < 3; ++i) - { - btVector3 v_diff = m_face.m_n[i]->m_v; - btVector3 scaled_force = m_dampingStiffness * v_diff; - if ((m_face.m_n[i]->m_x - m_mouse_pos).norm() > SIMD_EPSILON) - { - btVector3 dir = (m_face.m_n[i]->m_x - m_mouse_pos).normalized(); - scaled_force = m_dampingStiffness * v_diff.dot(dir) * dir; - } - energy -= scaled_force.dot(m_face.m_n[i]->m_v) / dt; - } - return energy; - } - - virtual void addScaledElasticForceDifferential(btScalar scale, const TVStack& dx, TVStack& df) - { - btScalar scaled_stiffness = scale * m_elasticStiffness; - for (int i = 0; i < 3; ++i) - { - btVector3 dir = (m_face.m_n[i]->m_q - m_mouse_pos); - btScalar dir_norm = dir.norm(); - btVector3 dir_normalized = (dir_norm > SIMD_EPSILON) ? dir.normalized() : btVector3(0, 0, 0); - int id = m_face.m_n[i]->index; - btVector3 dx_diff = dx[id]; - btScalar r = 0; // rest length is 0 for picking spring - btVector3 scaled_df = btVector3(0, 0, 0); - if (dir_norm > SIMD_EPSILON) - { - scaled_df -= scaled_stiffness * dir_normalized.dot(dx_diff) * dir_normalized; - scaled_df += scaled_stiffness * dir_normalized.dot(dx_diff) * ((dir_norm - r) / dir_norm) * dir_normalized; - scaled_df -= scaled_stiffness * ((dir_norm - r) / dir_norm) * dx_diff; - } - df[id] += scaled_df; - } - } - - void setMousePos(const btVector3& p) - { - m_mouse_pos = p; - } - - virtual btDeformableLagrangianForceType getForceType() - { - return BT_MOUSE_PICKING_FORCE; - } -}; - -#endif /* btMassSpring_h */ diff --git a/engine/inc/bullet/BulletSoftBody/btDeformableMultiBodyConstraintSolver.h b/engine/inc/bullet/BulletSoftBody/btDeformableMultiBodyConstraintSolver.h deleted file mode 100644 index 94aabce8..00000000 --- a/engine/inc/bullet/BulletSoftBody/btDeformableMultiBodyConstraintSolver.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - Written by Xuchen Han - - Bullet Continuous Collision Detection and Physics Library - Copyright (c) 2019 Google Inc. http://bulletphysics.org - 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_DEFORMABLE_MULTIBODY_CONSTRAINT_SOLVER_H -#define BT_DEFORMABLE_MULTIBODY_CONSTRAINT_SOLVER_H - -#include "btDeformableBodySolver.h" -#include "BulletDynamics/Featherstone/btMultiBodyConstraintSolver.h" - -class btDeformableBodySolver; - -// btDeformableMultiBodyConstraintSolver extendsn btMultiBodyConstraintSolver to solve for the contact among rigid/multibody and deformable bodies. Notice that the following constraints -// 1. rigid/multibody against rigid/multibody -// 2. rigid/multibody against deforamble -// 3. deformable against deformable -// 4. deformable self collision -// 5. joint constraints -// are all coupled in this solve. -ATTRIBUTE_ALIGNED16(class) -btDeformableMultiBodyConstraintSolver : public btMultiBodyConstraintSolver -{ - btDeformableBodySolver* m_deformableSolver; - -protected: - // override the iterations method to include deformable/multibody contact - // virtual btScalar solveGroupCacheFriendlyIterations(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer); - - // write the velocity of the the solver body to the underlying rigid body - void solverBodyWriteBack(const btContactSolverInfo& infoGlobal); - - // write the velocity of the underlying rigid body to the the the solver body - void writeToSolverBody(btCollisionObject * *bodies, int numBodies, const btContactSolverInfo& infoGlobal); - - virtual void solveGroupCacheFriendlySplitImpulseIterations(btCollisionObject * *bodies, int numBodies, btCollisionObject** deformableBodies, int numDeformableBodies, btPersistentManifold** manifoldPtr, int numManifolds, btTypedConstraint** constraints, int numConstraints, const btContactSolverInfo& infoGlobal, btIDebugDraw* debugDrawer); - - virtual btScalar solveDeformableGroupIterations(btCollisionObject * *bodies, int numBodies, btCollisionObject** deformableBodies, int numDeformableBodies, btPersistentManifold** manifoldPtr, int numManifolds, btTypedConstraint** constraints, int numConstraints, const btContactSolverInfo& infoGlobal, btIDebugDraw* debugDrawer); - -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - - void setDeformableSolver(btDeformableBodySolver * deformableSolver) - { - m_deformableSolver = deformableSolver; - } - - virtual void solveDeformableBodyGroup(btCollisionObject * *bodies, int numBodies, btCollisionObject** deformableBodies, int numDeformableBodies, btPersistentManifold** manifold, int numManifolds, btTypedConstraint** constraints, int numConstraints, btMultiBodyConstraint** multiBodyConstraints, int numMultiBodyConstraints, const btContactSolverInfo& info, btIDebugDraw* debugDrawer, btDispatcher* dispatcher); -}; - -#endif /* BT_DEFORMABLE_MULTIBODY_CONSTRAINT_SOLVER_H */ diff --git a/engine/inc/bullet/BulletSoftBody/btDeformableMultiBodyDynamicsWorld.h b/engine/inc/bullet/BulletSoftBody/btDeformableMultiBodyDynamicsWorld.h deleted file mode 100644 index 4b7069aa..00000000 --- a/engine/inc/bullet/BulletSoftBody/btDeformableMultiBodyDynamicsWorld.h +++ /dev/null @@ -1,316 +0,0 @@ -/* - Written by Xuchen Han - - Bullet Continuous Collision Detection and Physics Library - Copyright (c) 2019 Google Inc. http://bulletphysics.org - 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_DEFORMABLE_MULTIBODY_DYNAMICS_WORLD_H -#define BT_DEFORMABLE_MULTIBODY_DYNAMICS_WORLD_H - -#include "btSoftMultiBodyDynamicsWorld.h" -#include "btDeformableLagrangianForce.h" -#include "btDeformableMassSpringForce.h" -#include "btDeformableBodySolver.h" -#include "btDeformableMultiBodyConstraintSolver.h" -#include "btSoftBodyHelpers.h" -#include "BulletCollision/CollisionDispatch/btSimulationIslandManager.h" -#include -typedef btAlignedObjectArray btSoftBodyArray; - -class btDeformableBodySolver; -class btDeformableLagrangianForce; -struct MultiBodyInplaceSolverIslandCallback; -struct DeformableBodyInplaceSolverIslandCallback; -class btDeformableMultiBodyConstraintSolver; - -typedef btAlignedObjectArray btSoftBodyArray; - -class btDeformableMultiBodyDynamicsWorld : public btMultiBodyDynamicsWorld -{ - typedef btAlignedObjectArray TVStack; - ///Solver classes that encapsulate multiple deformable bodies for solving - btDeformableBodySolver* m_deformableBodySolver; - btSoftBodyArray m_softBodies; - int m_drawFlags; - bool m_drawNodeTree; - bool m_drawFaceTree; - bool m_drawClusterTree; - btSoftBodyWorldInfo m_sbi; - btScalar m_internalTime; - int m_ccdIterations; - bool m_implicit; - bool m_lineSearch; - bool m_useProjection; - DeformableBodyInplaceSolverIslandCallback* m_solverDeformableBodyIslandCallback; - - typedef void (*btSolverCallback)(btScalar time, btDeformableMultiBodyDynamicsWorld* world); - btSolverCallback m_solverCallback; - -protected: - virtual void internalSingleStepSimulation(btScalar timeStep); - - virtual void integrateTransforms(btScalar timeStep); - - void positionCorrection(btScalar timeStep); - - void solveConstraints(btScalar timeStep); - - void updateActivationState(btScalar timeStep); - - void clearGravity(); - -public: - btDeformableMultiBodyDynamicsWorld(btDispatcher* dispatcher, btBroadphaseInterface* pairCache, btDeformableMultiBodyConstraintSolver* constraintSolver, btCollisionConfiguration* collisionConfiguration, btDeformableBodySolver* deformableBodySolver = 0); - - virtual int stepSimulation(btScalar timeStep, int maxSubSteps = 1, btScalar fixedTimeStep = btScalar(1.) / btScalar(60.)); - - virtual void debugDrawWorld(); - - void setSolverCallback(btSolverCallback cb) - { - m_solverCallback = cb; - } - - virtual ~btDeformableMultiBodyDynamicsWorld(); - - virtual btMultiBodyDynamicsWorld* getMultiBodyDynamicsWorld() - { - return (btMultiBodyDynamicsWorld*)(this); - } - - virtual const btMultiBodyDynamicsWorld* getMultiBodyDynamicsWorld() const - { - return (const btMultiBodyDynamicsWorld*)(this); - } - - virtual btDynamicsWorldType getWorldType() const - { - return BT_DEFORMABLE_MULTIBODY_DYNAMICS_WORLD; - } - - virtual void predictUnconstraintMotion(btScalar timeStep); - - virtual void addSoftBody(btSoftBody* body, int collisionFilterGroup = btBroadphaseProxy::DefaultFilter, int collisionFilterMask = btBroadphaseProxy::AllFilter); - - btSoftBodyArray& getSoftBodyArray() - { - return m_softBodies; - } - - const btSoftBodyArray& getSoftBodyArray() const - { - return m_softBodies; - } - - btSoftBodyWorldInfo& getWorldInfo() - { - return m_sbi; - } - - const btSoftBodyWorldInfo& getWorldInfo() const - { - return m_sbi; - } - - void reinitialize(btScalar timeStep); - - void applyRigidBodyGravity(btScalar timeStep); - - void beforeSolverCallbacks(btScalar timeStep); - - void afterSolverCallbacks(btScalar timeStep); - - void addForce(btSoftBody* psb, btDeformableLagrangianForce* force); - - void removeForce(btSoftBody* psb, btDeformableLagrangianForce* force); - - void removeSoftBodyForce(btSoftBody* psb); - - void removeSoftBody(btSoftBody* body); - - void removeCollisionObject(btCollisionObject* collisionObject); - - int getDrawFlags() const { return (m_drawFlags); } - void setDrawFlags(int f) { m_drawFlags = f; } - - void setupConstraints(); - - void performDeformableCollisionDetection(); - - void solveMultiBodyConstraints(); - - void solveContactConstraints(); - - void sortConstraints(); - - void softBodySelfCollision(); - - void setImplicit(bool implicit) - { - m_implicit = implicit; - } - - void setLineSearch(bool lineSearch) - { - m_lineSearch = lineSearch; - } - - void setUseProjection(bool useProjection) - { - m_useProjection = useProjection; - } - - void applyRepulsionForce(btScalar timeStep); - - void performGeometricCollisions(btScalar timeStep); - - struct btDeformableSingleRayCallback : public btBroadphaseRayCallback - { - btVector3 m_rayFromWorld; - btVector3 m_rayToWorld; - btTransform m_rayFromTrans; - btTransform m_rayToTrans; - btVector3 m_hitNormal; - - const btDeformableMultiBodyDynamicsWorld* m_world; - btCollisionWorld::RayResultCallback& m_resultCallback; - - btDeformableSingleRayCallback(const btVector3& rayFromWorld, const btVector3& rayToWorld, const btDeformableMultiBodyDynamicsWorld* world, btCollisionWorld::RayResultCallback& resultCallback) - : m_rayFromWorld(rayFromWorld), - m_rayToWorld(rayToWorld), - m_world(world), - m_resultCallback(resultCallback) - { - m_rayFromTrans.setIdentity(); - m_rayFromTrans.setOrigin(m_rayFromWorld); - m_rayToTrans.setIdentity(); - m_rayToTrans.setOrigin(m_rayToWorld); - - btVector3 rayDir = (rayToWorld - rayFromWorld); - - rayDir.normalize(); - ///what about division by zero? --> just set rayDirection[i] to INF/1e30 - m_rayDirectionInverse[0] = rayDir[0] == btScalar(0.0) ? btScalar(1e30) : btScalar(1.0) / rayDir[0]; - m_rayDirectionInverse[1] = rayDir[1] == btScalar(0.0) ? btScalar(1e30) : btScalar(1.0) / rayDir[1]; - m_rayDirectionInverse[2] = rayDir[2] == btScalar(0.0) ? btScalar(1e30) : btScalar(1.0) / rayDir[2]; - m_signs[0] = m_rayDirectionInverse[0] < 0.0; - m_signs[1] = m_rayDirectionInverse[1] < 0.0; - m_signs[2] = m_rayDirectionInverse[2] < 0.0; - - m_lambda_max = rayDir.dot(m_rayToWorld - m_rayFromWorld); - } - - virtual bool process(const btBroadphaseProxy* proxy) - { - ///terminate further ray tests, once the closestHitFraction reached zero - if (m_resultCallback.m_closestHitFraction == btScalar(0.f)) - return false; - - btCollisionObject* collisionObject = (btCollisionObject*)proxy->m_clientObject; - - //only perform raycast if filterMask matches - if (m_resultCallback.needsCollision(collisionObject->getBroadphaseHandle())) - { - //RigidcollisionObject* collisionObject = ctrl->GetRigidcollisionObject(); - //btVector3 collisionObjectAabbMin,collisionObjectAabbMax; -#if 0 -#ifdef RECALCULATE_AABB - btVector3 collisionObjectAabbMin,collisionObjectAabbMax; - collisionObject->getCollisionShape()->getAabb(collisionObject->getWorldTransform(),collisionObjectAabbMin,collisionObjectAabbMax); -#else - //getBroadphase()->getAabb(collisionObject->getBroadphaseHandle(),collisionObjectAabbMin,collisionObjectAabbMax); - const btVector3& collisionObjectAabbMin = collisionObject->getBroadphaseHandle()->m_aabbMin; - const btVector3& collisionObjectAabbMax = collisionObject->getBroadphaseHandle()->m_aabbMax; -#endif -#endif - //btScalar hitLambda = m_resultCallback.m_closestHitFraction; - //culling already done by broadphase - //if (btRayAabb(m_rayFromWorld,m_rayToWorld,collisionObjectAabbMin,collisionObjectAabbMax,hitLambda,m_hitNormal)) - { - m_world->rayTestSingle(m_rayFromTrans, m_rayToTrans, - collisionObject, - collisionObject->getCollisionShape(), - collisionObject->getWorldTransform(), - m_resultCallback); - } - } - return true; - } - }; - - void rayTest(const btVector3& rayFromWorld, const btVector3& rayToWorld, RayResultCallback& resultCallback) const - { - BT_PROFILE("rayTest"); - /// use the broadphase to accelerate the search for objects, based on their aabb - /// and for each object with ray-aabb overlap, perform an exact ray test - btDeformableSingleRayCallback rayCB(rayFromWorld, rayToWorld, this, resultCallback); - -#ifndef USE_BRUTEFORCE_RAYBROADPHASE - m_broadphasePairCache->rayTest(rayFromWorld, rayToWorld, rayCB); -#else - for (int i = 0; i < this->getNumCollisionObjects(); i++) - { - rayCB.process(m_collisionObjects[i]->getBroadphaseHandle()); - } -#endif //USE_BRUTEFORCE_RAYBROADPHASE - } - - void rayTestSingle(const btTransform& rayFromTrans, const btTransform& rayToTrans, - btCollisionObject* collisionObject, - const btCollisionShape* collisionShape, - const btTransform& colObjWorldTransform, - RayResultCallback& resultCallback) const - { - if (collisionShape->isSoftBody()) - { - btSoftBody* softBody = btSoftBody::upcast(collisionObject); - if (softBody) - { - btSoftBody::sRayCast softResult; - if (softBody->rayFaceTest(rayFromTrans.getOrigin(), rayToTrans.getOrigin(), softResult)) - { - if (softResult.fraction <= resultCallback.m_closestHitFraction) - { - btCollisionWorld::LocalShapeInfo shapeInfo; - shapeInfo.m_shapePart = 0; - shapeInfo.m_triangleIndex = softResult.index; - // get the normal - btVector3 rayDir = rayToTrans.getOrigin() - rayFromTrans.getOrigin(); - btVector3 normal = -rayDir; - normal.normalize(); - { - normal = softBody->m_faces[softResult.index].m_normal; - if (normal.dot(rayDir) > 0) - { - // normal always point toward origin of the ray - normal = -normal; - } - } - - btCollisionWorld::LocalRayResult rayResult(collisionObject, - &shapeInfo, - normal, - softResult.fraction); - bool normalInWorldSpace = true; - resultCallback.addSingleResult(rayResult, normalInWorldSpace); - } - } - } - } - else - { - btCollisionWorld::rayTestSingle(rayFromTrans, rayToTrans, collisionObject, collisionShape, colObjWorldTransform, resultCallback); - } - } -}; - -#endif //BT_DEFORMABLE_MULTIBODY_DYNAMICS_WORLD_H diff --git a/engine/inc/bullet/BulletSoftBody/btDeformableNeoHookeanForce.h b/engine/inc/bullet/BulletSoftBody/btDeformableNeoHookeanForce.h deleted file mode 100644 index 60798c5b..00000000 --- a/engine/inc/bullet/BulletSoftBody/btDeformableNeoHookeanForce.h +++ /dev/null @@ -1,420 +0,0 @@ -/* -Written by Xuchen Han - -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2019 Google Inc. http://bulletphysics.org -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_NEOHOOKEAN_H -#define BT_NEOHOOKEAN_H - -#include "btDeformableLagrangianForce.h" -#include "LinearMath/btQuickprof.h" -#include "LinearMath/btImplicitQRSVD.h" -// This energy is as described in https://graphics.pixar.com/library/StableElasticity/paper.pdf -class btDeformableNeoHookeanForce : public btDeformableLagrangianForce -{ -public: - typedef btAlignedObjectArray TVStack; - btScalar m_mu, m_lambda; // Lame Parameters - btScalar m_E, m_nu; // Young's modulus and Poisson ratio - btScalar m_mu_damp, m_lambda_damp; - btDeformableNeoHookeanForce() : m_mu(1), m_lambda(1) - { - btScalar damping = 0.05; - m_mu_damp = damping * m_mu; - m_lambda_damp = damping * m_lambda; - updateYoungsModulusAndPoissonRatio(); - } - - btDeformableNeoHookeanForce(btScalar mu, btScalar lambda, btScalar damping = 0.05) : m_mu(mu), m_lambda(lambda) - { - m_mu_damp = damping * m_mu; - m_lambda_damp = damping * m_lambda; - updateYoungsModulusAndPoissonRatio(); - } - - void updateYoungsModulusAndPoissonRatio() - { - // conversion from Lame Parameters to Young's modulus and Poisson ratio - // https://en.wikipedia.org/wiki/Lam%C3%A9_parameters - m_E = m_mu * (3 * m_lambda + 2 * m_mu) / (m_lambda + m_mu); - m_nu = m_lambda * 0.5 / (m_mu + m_lambda); - } - - void updateLameParameters() - { - // conversion from Young's modulus and Poisson ratio to Lame Parameters - // https://en.wikipedia.org/wiki/Lam%C3%A9_parameters - m_mu = m_E * 0.5 / (1 + m_nu); - m_lambda = m_E * m_nu / ((1 + m_nu) * (1 - 2 * m_nu)); - } - - void setYoungsModulus(btScalar E) - { - m_E = E; - updateLameParameters(); - } - - void setPoissonRatio(btScalar nu) - { - m_nu = nu; - updateLameParameters(); - } - - void setDamping(btScalar damping) - { - m_mu_damp = damping * m_mu; - m_lambda_damp = damping * m_lambda; - } - - void setLameParameters(btScalar mu, btScalar lambda) - { - m_mu = mu; - m_lambda = lambda; - updateYoungsModulusAndPoissonRatio(); - } - - virtual void addScaledForces(btScalar scale, TVStack& force) - { - addScaledDampingForce(scale, force); - addScaledElasticForce(scale, force); - } - - virtual void addScaledExplicitForce(btScalar scale, TVStack& force) - { - addScaledElasticForce(scale, force); - } - - // The damping matrix is calculated using the time n state as described in https://www.math.ucla.edu/~jteran/papers/GSSJT15.pdf to allow line search - virtual void addScaledDampingForce(btScalar scale, TVStack& force) - { - if (m_mu_damp == 0 && m_lambda_damp == 0) - return; - int numNodes = getNumNodes(); - btAssert(numNodes <= force.size()); - btVector3 grad_N_hat_1st_col = btVector3(-1, -1, -1); - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - if (!psb->isActive()) - { - continue; - } - for (int j = 0; j < psb->m_tetras.size(); ++j) - { - btSoftBody::Tetra& tetra = psb->m_tetras[j]; - btSoftBody::Node* node0 = tetra.m_n[0]; - btSoftBody::Node* node1 = tetra.m_n[1]; - btSoftBody::Node* node2 = tetra.m_n[2]; - btSoftBody::Node* node3 = tetra.m_n[3]; - size_t id0 = node0->index; - size_t id1 = node1->index; - size_t id2 = node2->index; - size_t id3 = node3->index; - btMatrix3x3 dF = DsFromVelocity(node0, node1, node2, node3) * tetra.m_Dm_inverse; - btMatrix3x3 I; - I.setIdentity(); - btMatrix3x3 dP = (dF + dF.transpose()) * m_mu_damp + I * (dF[0][0] + dF[1][1] + dF[2][2]) * m_lambda_damp; - // firstPiolaDampingDifferential(psb->m_tetraScratchesTn[j], dF, dP); - btVector3 df_on_node0 = dP * (tetra.m_Dm_inverse.transpose() * grad_N_hat_1st_col); - btMatrix3x3 df_on_node123 = dP * tetra.m_Dm_inverse.transpose(); - - // damping force differential - btScalar scale1 = scale * tetra.m_element_measure; - force[id0] -= scale1 * df_on_node0; - force[id1] -= scale1 * df_on_node123.getColumn(0); - force[id2] -= scale1 * df_on_node123.getColumn(1); - force[id3] -= scale1 * df_on_node123.getColumn(2); - } - } - } - - virtual double totalElasticEnergy(btScalar dt) - { - double energy = 0; - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - if (!psb->isActive()) - { - continue; - } - for (int j = 0; j < psb->m_tetraScratches.size(); ++j) - { - btSoftBody::Tetra& tetra = psb->m_tetras[j]; - btSoftBody::TetraScratch& s = psb->m_tetraScratches[j]; - energy += tetra.m_element_measure * elasticEnergyDensity(s); - } - } - return energy; - } - - // The damping energy is formulated as in https://www.math.ucla.edu/~jteran/papers/GSSJT15.pdf to allow line search - virtual double totalDampingEnergy(btScalar dt) - { - double energy = 0; - int sz = 0; - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - if (!psb->isActive()) - { - continue; - } - for (int j = 0; j < psb->m_nodes.size(); ++j) - { - sz = btMax(sz, psb->m_nodes[j].index); - } - } - TVStack dampingForce; - dampingForce.resize(sz + 1); - for (int i = 0; i < dampingForce.size(); ++i) - dampingForce[i].setZero(); - addScaledDampingForce(0.5, dampingForce); - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - for (int j = 0; j < psb->m_nodes.size(); ++j) - { - const btSoftBody::Node& node = psb->m_nodes[j]; - energy -= dampingForce[node.index].dot(node.m_v) / dt; - } - } - return energy; - } - - double elasticEnergyDensity(const btSoftBody::TetraScratch& s) - { - double density = 0; - density += m_mu * 0.5 * (s.m_trace - 3.); - density += m_lambda * 0.5 * (s.m_J - 1. - 0.75 * m_mu / m_lambda) * (s.m_J - 1. - 0.75 * m_mu / m_lambda); - density -= m_mu * 0.5 * log(s.m_trace + 1); - return density; - } - - virtual void addScaledElasticForce(btScalar scale, TVStack& force) - { - int numNodes = getNumNodes(); - btAssert(numNodes <= force.size()); - btVector3 grad_N_hat_1st_col = btVector3(-1, -1, -1); - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - if (!psb->isActive()) - { - continue; - } - btScalar max_p = psb->m_cfg.m_maxStress; - for (int j = 0; j < psb->m_tetras.size(); ++j) - { - btSoftBody::Tetra& tetra = psb->m_tetras[j]; - btMatrix3x3 P; - firstPiola(psb->m_tetraScratches[j], P); -#ifdef USE_SVD - if (max_p > 0) - { - // since we want to clamp the principal stress to max_p, we only need to - // calculate SVD when sigma_0^2 + sigma_1^2 + sigma_2^2 > max_p * max_p - btScalar trPTP = (P[0].length2() + P[1].length2() + P[2].length2()); - if (trPTP > max_p * max_p) - { - btMatrix3x3 U, V; - btVector3 sigma; - singularValueDecomposition(P, U, sigma, V); - sigma[0] = btMin(sigma[0], max_p); - sigma[1] = btMin(sigma[1], max_p); - sigma[2] = btMin(sigma[2], max_p); - sigma[0] = btMax(sigma[0], -max_p); - sigma[1] = btMax(sigma[1], -max_p); - sigma[2] = btMax(sigma[2], -max_p); - btMatrix3x3 Sigma; - Sigma.setIdentity(); - Sigma[0][0] = sigma[0]; - Sigma[1][1] = sigma[1]; - Sigma[2][2] = sigma[2]; - P = U * Sigma * V.transpose(); - } - } -#endif - // btVector3 force_on_node0 = P * (tetra.m_Dm_inverse.transpose()*grad_N_hat_1st_col); - btMatrix3x3 force_on_node123 = P * tetra.m_Dm_inverse.transpose(); - btVector3 force_on_node0 = force_on_node123 * grad_N_hat_1st_col; - - btSoftBody::Node* node0 = tetra.m_n[0]; - btSoftBody::Node* node1 = tetra.m_n[1]; - btSoftBody::Node* node2 = tetra.m_n[2]; - btSoftBody::Node* node3 = tetra.m_n[3]; - size_t id0 = node0->index; - size_t id1 = node1->index; - size_t id2 = node2->index; - size_t id3 = node3->index; - - // elastic force - btScalar scale1 = scale * tetra.m_element_measure; - force[id0] -= scale1 * force_on_node0; - force[id1] -= scale1 * force_on_node123.getColumn(0); - force[id2] -= scale1 * force_on_node123.getColumn(1); - force[id3] -= scale1 * force_on_node123.getColumn(2); - } - } - } - - // The damping matrix is calculated using the time n state as described in https://www.math.ucla.edu/~jteran/papers/GSSJT15.pdf to allow line search - virtual void addScaledDampingForceDifferential(btScalar scale, const TVStack& dv, TVStack& df) - { - if (m_mu_damp == 0 && m_lambda_damp == 0) - return; - int numNodes = getNumNodes(); - btAssert(numNodes <= df.size()); - btVector3 grad_N_hat_1st_col = btVector3(-1, -1, -1); - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - if (!psb->isActive()) - { - continue; - } - for (int j = 0; j < psb->m_tetras.size(); ++j) - { - btSoftBody::Tetra& tetra = psb->m_tetras[j]; - btSoftBody::Node* node0 = tetra.m_n[0]; - btSoftBody::Node* node1 = tetra.m_n[1]; - btSoftBody::Node* node2 = tetra.m_n[2]; - btSoftBody::Node* node3 = tetra.m_n[3]; - size_t id0 = node0->index; - size_t id1 = node1->index; - size_t id2 = node2->index; - size_t id3 = node3->index; - btMatrix3x3 dF = Ds(id0, id1, id2, id3, dv) * tetra.m_Dm_inverse; - btMatrix3x3 I; - I.setIdentity(); - btMatrix3x3 dP = (dF + dF.transpose()) * m_mu_damp + I * (dF[0][0] + dF[1][1] + dF[2][2]) * m_lambda_damp; - // firstPiolaDampingDifferential(psb->m_tetraScratchesTn[j], dF, dP); - // btVector3 df_on_node0 = dP * (tetra.m_Dm_inverse.transpose()*grad_N_hat_1st_col); - btMatrix3x3 df_on_node123 = dP * tetra.m_Dm_inverse.transpose(); - btVector3 df_on_node0 = df_on_node123 * grad_N_hat_1st_col; - - // damping force differential - btScalar scale1 = scale * tetra.m_element_measure; - df[id0] -= scale1 * df_on_node0; - df[id1] -= scale1 * df_on_node123.getColumn(0); - df[id2] -= scale1 * df_on_node123.getColumn(1); - df[id3] -= scale1 * df_on_node123.getColumn(2); - } - } - } - - virtual void buildDampingForceDifferentialDiagonal(btScalar scale, TVStack& diagA) {} - - virtual void addScaledElasticForceDifferential(btScalar scale, const TVStack& dx, TVStack& df) - { - int numNodes = getNumNodes(); - btAssert(numNodes <= df.size()); - btVector3 grad_N_hat_1st_col = btVector3(-1, -1, -1); - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - if (!psb->isActive()) - { - continue; - } - for (int j = 0; j < psb->m_tetras.size(); ++j) - { - btSoftBody::Tetra& tetra = psb->m_tetras[j]; - btSoftBody::Node* node0 = tetra.m_n[0]; - btSoftBody::Node* node1 = tetra.m_n[1]; - btSoftBody::Node* node2 = tetra.m_n[2]; - btSoftBody::Node* node3 = tetra.m_n[3]; - size_t id0 = node0->index; - size_t id1 = node1->index; - size_t id2 = node2->index; - size_t id3 = node3->index; - btMatrix3x3 dF = Ds(id0, id1, id2, id3, dx) * tetra.m_Dm_inverse; - btMatrix3x3 dP; - firstPiolaDifferential(psb->m_tetraScratches[j], dF, dP); - // btVector3 df_on_node0 = dP * (tetra.m_Dm_inverse.transpose()*grad_N_hat_1st_col); - btMatrix3x3 df_on_node123 = dP * tetra.m_Dm_inverse.transpose(); - btVector3 df_on_node0 = df_on_node123 * grad_N_hat_1st_col; - - // elastic force differential - btScalar scale1 = scale * tetra.m_element_measure; - df[id0] -= scale1 * df_on_node0; - df[id1] -= scale1 * df_on_node123.getColumn(0); - df[id2] -= scale1 * df_on_node123.getColumn(1); - df[id3] -= scale1 * df_on_node123.getColumn(2); - } - } - } - - void firstPiola(const btSoftBody::TetraScratch& s, btMatrix3x3& P) - { - btScalar c1 = (m_mu * (1. - 1. / (s.m_trace + 1.))); - btScalar c2 = (m_lambda * (s.m_J - 1.) - 0.75 * m_mu); - P = s.m_F * c1 + s.m_cofF * c2; - } - - // Let P be the first piola stress. - // This function calculates the dP = dP/dF * dF - void firstPiolaDifferential(const btSoftBody::TetraScratch& s, const btMatrix3x3& dF, btMatrix3x3& dP) - { - btScalar c1 = m_mu * (1. - 1. / (s.m_trace + 1.)); - btScalar c2 = (2. * m_mu) * DotProduct(s.m_F, dF) * (1. / ((1. + s.m_trace) * (1. + s.m_trace))); - btScalar c3 = (m_lambda * DotProduct(s.m_cofF, dF)); - dP = dF * c1 + s.m_F * c2; - addScaledCofactorMatrixDifferential(s.m_F, dF, m_lambda * (s.m_J - 1.) - 0.75 * m_mu, dP); - dP += s.m_cofF * c3; - } - - // Let Q be the damping stress. - // This function calculates the dP = dQ/dF * dF - void firstPiolaDampingDifferential(const btSoftBody::TetraScratch& s, const btMatrix3x3& dF, btMatrix3x3& dP) - { - btScalar c1 = (m_mu_damp * (1. - 1. / (s.m_trace + 1.))); - btScalar c2 = ((2. * m_mu_damp) * DotProduct(s.m_F, dF) * (1. / ((1. + s.m_trace) * (1. + s.m_trace)))); - btScalar c3 = (m_lambda_damp * DotProduct(s.m_cofF, dF)); - dP = dF * c1 + s.m_F * c2; - addScaledCofactorMatrixDifferential(s.m_F, dF, m_lambda_damp * (s.m_J - 1.) - 0.75 * m_mu_damp, dP); - dP += s.m_cofF * c3; - } - - btScalar DotProduct(const btMatrix3x3& A, const btMatrix3x3& B) - { - btScalar ans = 0; - for (int i = 0; i < 3; ++i) - { - ans += A[i].dot(B[i]); - } - return ans; - } - - // Let C(A) be the cofactor of the matrix A - // Let H = the derivative of C(A) with respect to A evaluated at F = A - // This function calculates H*dF - void addScaledCofactorMatrixDifferential(const btMatrix3x3& F, const btMatrix3x3& dF, btScalar scale, btMatrix3x3& M) - { - M[0][0] += scale * (dF[1][1] * F[2][2] + F[1][1] * dF[2][2] - dF[2][1] * F[1][2] - F[2][1] * dF[1][2]); - M[1][0] += scale * (dF[2][1] * F[0][2] + F[2][1] * dF[0][2] - dF[0][1] * F[2][2] - F[0][1] * dF[2][2]); - M[2][0] += scale * (dF[0][1] * F[1][2] + F[0][1] * dF[1][2] - dF[1][1] * F[0][2] - F[1][1] * dF[0][2]); - M[0][1] += scale * (dF[2][0] * F[1][2] + F[2][0] * dF[1][2] - dF[1][0] * F[2][2] - F[1][0] * dF[2][2]); - M[1][1] += scale * (dF[0][0] * F[2][2] + F[0][0] * dF[2][2] - dF[2][0] * F[0][2] - F[2][0] * dF[0][2]); - M[2][1] += scale * (dF[1][0] * F[0][2] + F[1][0] * dF[0][2] - dF[0][0] * F[1][2] - F[0][0] * dF[1][2]); - M[0][2] += scale * (dF[1][0] * F[2][1] + F[1][0] * dF[2][1] - dF[2][0] * F[1][1] - F[2][0] * dF[1][1]); - M[1][2] += scale * (dF[2][0] * F[0][1] + F[2][0] * dF[0][1] - dF[0][0] * F[2][1] - F[0][0] * dF[2][1]); - M[2][2] += scale * (dF[0][0] * F[1][1] + F[0][0] * dF[1][1] - dF[1][0] * F[0][1] - F[1][0] * dF[0][1]); - } - - virtual btDeformableLagrangianForceType getForceType() - { - return BT_NEOHOOKEAN_FORCE; - } -}; -#endif /* BT_NEOHOOKEAN_H */ diff --git a/engine/inc/bullet/BulletSoftBody/btKrylovSolver.h b/engine/inc/bullet/BulletSoftBody/btKrylovSolver.h deleted file mode 100644 index 59126b47..00000000 --- a/engine/inc/bullet/BulletSoftBody/btKrylovSolver.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - Written by Xuchen Han - - Bullet Continuous Collision Detection and Physics Library - Copyright (c) 2019 Google Inc. http://bulletphysics.org - 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_KRYLOV_SOLVER_H -#define BT_KRYLOV_SOLVER_H -#include -#include -#include -#include -#include -#include -#include "LinearMath/btQuickprof.h" - -template -class btKrylovSolver -{ - typedef btAlignedObjectArray TVStack; - -public: - int m_maxIterations; - btScalar m_tolerance; - btKrylovSolver(int maxIterations, btScalar tolerance) - : m_maxIterations(maxIterations), m_tolerance(tolerance) - { - } - - virtual ~btKrylovSolver() {} - - virtual int solve(MatrixX& A, TVStack& x, const TVStack& b, bool verbose = false) = 0; - - virtual void reinitialize(const TVStack& b) = 0; - - virtual SIMD_FORCE_INLINE TVStack sub(const TVStack& a, const TVStack& b) - { - // c = a-b - btAssert(a.size() == b.size()); - TVStack c; - c.resize(a.size()); - for (int i = 0; i < a.size(); ++i) - { - c[i] = a[i] - b[i]; - } - return c; - } - - virtual SIMD_FORCE_INLINE btScalar squaredNorm(const TVStack& a) - { - return dot(a, a); - } - - virtual SIMD_FORCE_INLINE btScalar norm(const TVStack& a) - { - btScalar ret = 0; - for (int i = 0; i < a.size(); ++i) - { - for (int d = 0; d < 3; ++d) - { - ret = btMax(ret, btFabs(a[i][d])); - } - } - return ret; - } - - virtual SIMD_FORCE_INLINE btScalar dot(const TVStack& a, const TVStack& b) - { - btScalar ans(0); - for (int i = 0; i < a.size(); ++i) - ans += a[i].dot(b[i]); - return ans; - } - - virtual SIMD_FORCE_INLINE void multAndAddTo(btScalar s, const TVStack& a, TVStack& result) - { - // result += s*a - btAssert(a.size() == result.size()); - for (int i = 0; i < a.size(); ++i) - result[i] += s * a[i]; - } - - virtual SIMD_FORCE_INLINE TVStack multAndAdd(btScalar s, const TVStack& a, const TVStack& b) - { - // result = a*s + b - TVStack result; - result.resize(a.size()); - for (int i = 0; i < a.size(); ++i) - result[i] = s * a[i] + b[i]; - return result; - } - - virtual SIMD_FORCE_INLINE void setTolerance(btScalar tolerance) - { - m_tolerance = tolerance; - } -}; -#endif /* BT_KRYLOV_SOLVER_H */ diff --git a/engine/inc/bullet/BulletSoftBody/btPreconditioner.h b/engine/inc/bullet/BulletSoftBody/btPreconditioner.h deleted file mode 100644 index 21c1106a..00000000 --- a/engine/inc/bullet/BulletSoftBody/btPreconditioner.h +++ /dev/null @@ -1,285 +0,0 @@ -/* - Written by Xuchen Han - - Bullet Continuous Collision Detection and Physics Library - Copyright (c) 2019 Google Inc. http://bulletphysics.org - 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_PRECONDITIONER_H -#define BT_PRECONDITIONER_H - -class Preconditioner -{ -public: - typedef btAlignedObjectArray TVStack; - virtual void operator()(const TVStack& x, TVStack& b) = 0; - virtual void reinitialize(bool nodeUpdated) = 0; - virtual ~Preconditioner() {} -}; - -class DefaultPreconditioner : public Preconditioner -{ -public: - virtual void operator()(const TVStack& x, TVStack& b) - { - btAssert(b.size() == x.size()); - for (int i = 0; i < b.size(); ++i) - b[i] = x[i]; - } - virtual void reinitialize(bool nodeUpdated) - { - } - - virtual ~DefaultPreconditioner() {} -}; - -class MassPreconditioner : public Preconditioner -{ - btAlignedObjectArray m_inv_mass; - const btAlignedObjectArray& m_softBodies; - -public: - MassPreconditioner(const btAlignedObjectArray& softBodies) - : m_softBodies(softBodies) - { - } - - virtual void reinitialize(bool nodeUpdated) - { - if (nodeUpdated) - { - m_inv_mass.clear(); - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - for (int j = 0; j < psb->m_nodes.size(); ++j) - m_inv_mass.push_back(psb->m_nodes[j].m_im); - } - } - } - - virtual void operator()(const TVStack& x, TVStack& b) - { - btAssert(b.size() == x.size()); - btAssert(m_inv_mass.size() <= x.size()); - for (int i = 0; i < m_inv_mass.size(); ++i) - { - b[i] = x[i] * m_inv_mass[i]; - } - for (int i = m_inv_mass.size(); i < b.size(); ++i) - { - b[i] = x[i]; - } - } -}; - -class KKTPreconditioner : public Preconditioner -{ - const btAlignedObjectArray& m_softBodies; - const btDeformableContactProjection& m_projections; - const btAlignedObjectArray& m_lf; - TVStack m_inv_A, m_inv_S; - const btScalar& m_dt; - const bool& m_implicit; - -public: - KKTPreconditioner(const btAlignedObjectArray& softBodies, const btDeformableContactProjection& projections, const btAlignedObjectArray& lf, const btScalar& dt, const bool& implicit) - : m_softBodies(softBodies), m_projections(projections), m_lf(lf), m_dt(dt), m_implicit(implicit) - { - } - - virtual void reinitialize(bool nodeUpdated) - { - if (nodeUpdated) - { - int num_nodes = 0; - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - num_nodes += psb->m_nodes.size(); - } - m_inv_A.resize(num_nodes); - } - buildDiagonalA(m_inv_A); - for (int i = 0; i < m_inv_A.size(); ++i) - { - // printf("A[%d] = %f, %f, %f \n", i, m_inv_A[i][0], m_inv_A[i][1], m_inv_A[i][2]); - for (int d = 0; d < 3; ++d) - { - m_inv_A[i][d] = (m_inv_A[i][d] == 0) ? 0.0 : 1.0 / m_inv_A[i][d]; - } - } - m_inv_S.resize(m_projections.m_lagrangeMultipliers.size()); - // printf("S.size() = %d \n", m_inv_S.size()); - buildDiagonalS(m_inv_A, m_inv_S); - for (int i = 0; i < m_inv_S.size(); ++i) - { - // printf("S[%d] = %f, %f, %f \n", i, m_inv_S[i][0], m_inv_S[i][1], m_inv_S[i][2]); - for (int d = 0; d < 3; ++d) - { - m_inv_S[i][d] = (m_inv_S[i][d] == 0) ? 0.0 : 1.0 / m_inv_S[i][d]; - } - } - } - - void buildDiagonalA(TVStack& diagA) const - { - size_t counter = 0; - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - for (int j = 0; j < psb->m_nodes.size(); ++j) - { - const btSoftBody::Node& node = psb->m_nodes[j]; - diagA[counter] = (node.m_im == 0) ? btVector3(0, 0, 0) : btVector3(1.0 / node.m_im, 1.0 / node.m_im, 1.0 / node.m_im); - ++counter; - } - } - if (m_implicit) - { - printf("implicit not implemented\n"); - btAssert(false); - } - for (int i = 0; i < m_lf.size(); ++i) - { - // add damping matrix - m_lf[i]->buildDampingForceDifferentialDiagonal(-m_dt, diagA); - } - } - - void buildDiagonalS(const TVStack& inv_A, TVStack& diagS) - { - for (int c = 0; c < m_projections.m_lagrangeMultipliers.size(); ++c) - { - // S[k,k] = e_k^T * C A_d^-1 C^T * e_k - const LagrangeMultiplier& lm = m_projections.m_lagrangeMultipliers[c]; - btVector3& t = diagS[c]; - t.setZero(); - for (int j = 0; j < lm.m_num_constraints; ++j) - { - for (int i = 0; i < lm.m_num_nodes; ++i) - { - for (int d = 0; d < 3; ++d) - { - t[j] += inv_A[lm.m_indices[i]][d] * lm.m_dirs[j][d] * lm.m_dirs[j][d] * lm.m_weights[i] * lm.m_weights[i]; - } - } - } - } - } -//#define USE_FULL_PRECONDITIONER -#ifndef USE_FULL_PRECONDITIONER - virtual void operator()(const TVStack& x, TVStack& b) - { - btAssert(b.size() == x.size()); - for (int i = 0; i < m_inv_A.size(); ++i) - { - b[i] = x[i] * m_inv_A[i]; - } - int offset = m_inv_A.size(); - for (int i = 0; i < m_inv_S.size(); ++i) - { - b[i + offset] = x[i + offset] * m_inv_S[i]; - } - } -#else - virtual void operator()(const TVStack& x, TVStack& b) - { - btAssert(b.size() == x.size()); - int offset = m_inv_A.size(); - - for (int i = 0; i < m_inv_A.size(); ++i) - { - b[i] = x[i] * m_inv_A[i]; - } - - for (int i = 0; i < m_inv_S.size(); ++i) - { - b[i + offset].setZero(); - } - - for (int c = 0; c < m_projections.m_lagrangeMultipliers.size(); ++c) - { - const LagrangeMultiplier& lm = m_projections.m_lagrangeMultipliers[c]; - // C * x - for (int d = 0; d < lm.m_num_constraints; ++d) - { - for (int i = 0; i < lm.m_num_nodes; ++i) - { - b[offset + c][d] += lm.m_weights[i] * b[lm.m_indices[i]].dot(lm.m_dirs[d]); - } - } - } - - for (int i = 0; i < m_inv_S.size(); ++i) - { - b[i + offset] = b[i + offset] * m_inv_S[i]; - } - - for (int i = 0; i < m_inv_A.size(); ++i) - { - b[i].setZero(); - } - - for (int c = 0; c < m_projections.m_lagrangeMultipliers.size(); ++c) - { - // C^T * lambda - const LagrangeMultiplier& lm = m_projections.m_lagrangeMultipliers[c]; - for (int i = 0; i < lm.m_num_nodes; ++i) - { - for (int j = 0; j < lm.m_num_constraints; ++j) - { - b[lm.m_indices[i]] += b[offset + c][j] * lm.m_weights[i] * lm.m_dirs[j]; - } - } - } - - for (int i = 0; i < m_inv_A.size(); ++i) - { - b[i] = (x[i] - b[i]) * m_inv_A[i]; - } - - TVStack t; - t.resize(b.size()); - for (int i = 0; i < m_inv_S.size(); ++i) - { - t[i + offset] = x[i + offset] * m_inv_S[i]; - } - for (int i = 0; i < m_inv_A.size(); ++i) - { - t[i].setZero(); - } - for (int c = 0; c < m_projections.m_lagrangeMultipliers.size(); ++c) - { - // C^T * lambda - const LagrangeMultiplier& lm = m_projections.m_lagrangeMultipliers[c]; - for (int i = 0; i < lm.m_num_nodes; ++i) - { - for (int j = 0; j < lm.m_num_constraints; ++j) - { - t[lm.m_indices[i]] += t[offset + c][j] * lm.m_weights[i] * lm.m_dirs[j]; - } - } - } - for (int i = 0; i < m_inv_A.size(); ++i) - { - b[i] += t[i] * m_inv_A[i]; - } - - for (int i = 0; i < m_inv_S.size(); ++i) - { - b[i + offset] -= x[i + offset] * m_inv_S[i]; - } - } -#endif -}; - -#endif /* BT_PRECONDITIONER_H */ diff --git a/engine/inc/bullet/BulletSoftBody/btSoftBody.h b/engine/inc/bullet/BulletSoftBody/btSoftBody.h deleted file mode 100644 index f578487b..00000000 --- a/engine/inc/bullet/BulletSoftBody/btSoftBody.h +++ /dev/null @@ -1,1394 +0,0 @@ -/* -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 - -#ifndef _BT_SOFT_BODY_H -#define _BT_SOFT_BODY_H - -#include "LinearMath/btAlignedObjectArray.h" -#include "LinearMath/btTransform.h" -#include "LinearMath/btIDebugDraw.h" -#include "LinearMath/btVector3.h" -#include "BulletDynamics/Dynamics/btRigidBody.h" - -#include "BulletCollision/CollisionShapes/btConcaveShape.h" -#include "BulletCollision/CollisionDispatch/btCollisionCreateFunc.h" -#include "btSparseSDF.h" -#include "BulletCollision/BroadphaseCollision/btDbvt.h" -#include "BulletDynamics/Featherstone/btMultiBodyLinkCollider.h" -#include "BulletDynamics/Featherstone/btMultiBodyConstraint.h" -//#ifdef BT_USE_DOUBLE_PRECISION -//#define btRigidBodyData btRigidBodyDoubleData -//#define btRigidBodyDataName "btRigidBodyDoubleData" -//#else -#define btSoftBodyData btSoftBodyFloatData -#define btSoftBodyDataName "btSoftBodyFloatData" -static const btScalar OVERLAP_REDUCTION_FACTOR = 0.1; -static unsigned long seed = 243703; -//#endif //BT_USE_DOUBLE_PRECISION - -class btBroadphaseInterface; -class btDispatcher; -class btSoftBodySolver; - -/* btSoftBodyWorldInfo */ -struct btSoftBodyWorldInfo -{ - btScalar air_density; - btScalar water_density; - btScalar water_offset; - btScalar m_maxDisplacement; - btVector3 water_normal; - btBroadphaseInterface* m_broadphase; - btDispatcher* m_dispatcher; - btVector3 m_gravity; - btSparseSdf<3> m_sparsesdf; - - btSoftBodyWorldInfo() - : air_density((btScalar)1.2), - water_density(0), - water_offset(0), - m_maxDisplacement(1000.f), //avoid soft body from 'exploding' so use some upper threshold of maximum motion that a node can travel per frame - water_normal(0, 0, 0), - m_broadphase(0), - m_dispatcher(0), - m_gravity(0, -10, 0) - { - } -}; - -///The btSoftBody is an class to simulate cloth and volumetric soft bodies. -///There is two-way interaction between btSoftBody and btRigidBody/btCollisionObject. -class btSoftBody : public btCollisionObject -{ -public: - btAlignedObjectArray m_collisionDisabledObjects; - - // The solver object that handles this soft body - btSoftBodySolver* m_softBodySolver; - - // - // Enumerations - // - - ///eAeroModel - struct eAeroModel - { - enum _ - { - V_Point, ///Vertex normals are oriented toward velocity - V_TwoSided, ///Vertex normals are flipped to match velocity - V_TwoSidedLiftDrag, ///Vertex normals are flipped to match velocity and lift and drag forces are applied - V_OneSided, ///Vertex normals are taken as it is - F_TwoSided, ///Face normals are flipped to match velocity - F_TwoSidedLiftDrag, ///Face normals are flipped to match velocity and lift and drag forces are applied - F_OneSided, ///Face normals are taken as it is - END - }; - }; - - ///eVSolver : velocities solvers - struct eVSolver - { - enum _ - { - Linear, ///Linear solver - END - }; - }; - - ///ePSolver : positions solvers - struct ePSolver - { - enum _ - { - Linear, ///Linear solver - Anchors, ///Anchor solver - RContacts, ///Rigid contacts solver - SContacts, ///Soft contacts solver - END - }; - }; - - ///eSolverPresets - struct eSolverPresets - { - enum _ - { - Positions, - Velocities, - Default = Positions, - END - }; - }; - - ///eFeature - struct eFeature - { - enum _ - { - None, - Node, - Link, - Face, - Tetra, - END - }; - }; - - typedef btAlignedObjectArray tVSolverArray; - typedef btAlignedObjectArray tPSolverArray; - - // - // Flags - // - - ///fCollision - struct fCollision - { - enum _ - { - RVSmask = 0x000f, ///Rigid versus soft mask - SDF_RS = 0x0001, ///SDF based rigid vs soft - CL_RS = 0x0002, ///Cluster vs convex rigid vs soft - SDF_RD = 0x0004, ///rigid vs deformable - - SVSmask = 0x00f0, ///Rigid versus soft mask - VF_SS = 0x0010, ///Vertex vs face soft vs soft handling - CL_SS = 0x0020, ///Cluster vs cluster soft vs soft handling - CL_SELF = 0x0040, ///Cluster soft body self collision - VF_DD = 0x0080, ///Vertex vs face soft vs soft handling - - RVDFmask = 0x0f00, /// Rigid versus deformable face mask - SDF_RDF = 0x0100, /// GJK based Rigid vs. deformable face - SDF_MDF = 0x0200, /// GJK based Multibody vs. deformable face - SDF_RDN = 0x0400, /// SDF based Rigid vs. deformable node - /* presets */ - Default = SDF_RS, - END - }; - }; - - ///fMaterial - struct fMaterial - { - enum _ - { - DebugDraw = 0x0001, /// Enable debug draw - /* presets */ - Default = DebugDraw, - END - }; - }; - - // - // API Types - // - - /* sRayCast */ - struct sRayCast - { - btSoftBody* body; /// soft body - eFeature::_ feature; /// feature type - int index; /// feature index - btScalar fraction; /// time of impact fraction (rayorg+(rayto-rayfrom)*fraction) - }; - - /* ImplicitFn */ - struct ImplicitFn - { - virtual ~ImplicitFn() {} - virtual btScalar Eval(const btVector3& x) = 0; - }; - - // - // Internal types - // - - typedef btAlignedObjectArray tScalarArray; - typedef btAlignedObjectArray tVector3Array; - - /* sCti is Softbody contact info */ - struct sCti - { - const btCollisionObject* m_colObj; /* Rigid body */ - btVector3 m_normal; /* Outward normal */ - btScalar m_offset; /* Offset from origin */ - btVector3 m_bary; /* Barycentric weights for faces */ - }; - - /* sMedium */ - struct sMedium - { - btVector3 m_velocity; /* Velocity */ - btScalar m_pressure; /* Pressure */ - btScalar m_density; /* Density */ - }; - - /* Base type */ - struct Element - { - void* m_tag; // User data - Element() : m_tag(0) {} - }; - /* Material */ - struct Material : Element - { - btScalar m_kLST; // Linear stiffness coefficient [0,1] - btScalar m_kAST; // Area/Angular stiffness coefficient [0,1] - btScalar m_kVST; // Volume stiffness coefficient [0,1] - int m_flags; // Flags - }; - - /* Feature */ - struct Feature : Element - { - Material* m_material; // Material - }; - /* Node */ - struct RenderNode - { - btVector3 m_x; - btVector3 m_uv1; - btVector3 m_normal; - }; - struct Node : Feature - { - btVector3 m_x; // Position - btVector3 m_q; // Previous step position/Test position - btVector3 m_v; // Velocity - btVector3 m_vn; // Previous step velocity - btVector3 m_f; // Force accumulator - btVector3 m_n; // Normal - btScalar m_im; // 1/mass - btScalar m_area; // Area - btDbvtNode* m_leaf; // Leaf data - int m_constrained; // depth of penetration - int m_battach : 1; // Attached - int index; - btVector3 m_splitv; // velocity associated with split impulse - btMatrix3x3 m_effectiveMass; // effective mass in contact - btMatrix3x3 m_effectiveMass_inv; // inverse of effective mass - }; - /* Link */ - ATTRIBUTE_ALIGNED16(struct) - Link : Feature - { - btVector3 m_c3; // gradient - Node* m_n[2]; // Node pointers - btScalar m_rl; // Rest length - int m_bbending : 1; // Bending link - btScalar m_c0; // (ima+imb)*kLST - btScalar m_c1; // rl^2 - btScalar m_c2; // |gradient|^2/c0 - - BT_DECLARE_ALIGNED_ALLOCATOR(); - }; - struct RenderFace - { - RenderNode* m_n[3]; // Node pointers - }; - - /* Face */ - struct Face : Feature - { - Node* m_n[3]; // Node pointers - btVector3 m_normal; // Normal - btScalar m_ra; // Rest area - btDbvtNode* m_leaf; // Leaf data - btVector4 m_pcontact; // barycentric weights of the persistent contact - btVector3 m_n0, m_n1, m_vn; - int m_index; - }; - /* Tetra */ - struct Tetra : Feature - { - Node* m_n[4]; // Node pointers - btScalar m_rv; // Rest volume - btDbvtNode* m_leaf; // Leaf data - btVector3 m_c0[4]; // gradients - btScalar m_c1; // (4*kVST)/(im0+im1+im2+im3) - btScalar m_c2; // m_c1/sum(|g0..3|^2) - btMatrix3x3 m_Dm_inverse; // rest Dm^-1 - btMatrix3x3 m_F; - btScalar m_element_measure; - btVector4 m_P_inv[3]; // first three columns of P_inv matrix - }; - - /* TetraScratch */ - struct TetraScratch - { - btMatrix3x3 m_F; // deformation gradient F - btScalar m_trace; // trace of F^T * F - btScalar m_J; // det(F) - btMatrix3x3 m_cofF; // cofactor of F - btMatrix3x3 m_corotation; // corotatio of the tetra - }; - - /* RContact */ - struct RContact - { - sCti m_cti; // Contact infos - Node* m_node; // Owner node - btMatrix3x3 m_c0; // Impulse matrix - btVector3 m_c1; // Relative anchor - btScalar m_c2; // ima*dt - btScalar m_c3; // Friction - btScalar m_c4; // Hardness - - // jacobians and unit impulse responses for multibody - btMultiBodyJacobianData jacobianData_normal; - btMultiBodyJacobianData jacobianData_t1; - btMultiBodyJacobianData jacobianData_t2; - btVector3 t1; - btVector3 t2; - }; - - class DeformableRigidContact - { - public: - sCti m_cti; // Contact infos - btMatrix3x3 m_c0; // Impulse matrix - btVector3 m_c1; // Relative anchor - btScalar m_c2; // inverse mass of node/face - btScalar m_c3; // Friction - btScalar m_c4; // Hardness - btMatrix3x3 m_c5; // inverse effective mass - - // jacobians and unit impulse responses for multibody - btMultiBodyJacobianData jacobianData_normal; - btMultiBodyJacobianData jacobianData_t1; - btMultiBodyJacobianData jacobianData_t2; - btVector3 t1; - btVector3 t2; - }; - - class DeformableNodeRigidContact : public DeformableRigidContact - { - public: - Node* m_node; // Owner node - }; - - class DeformableNodeRigidAnchor : public DeformableNodeRigidContact - { - public: - btVector3 m_local; // Anchor position in body space - }; - - class DeformableFaceRigidContact : public DeformableRigidContact - { - public: - Face* m_face; // Owner face - btVector3 m_contactPoint; // Contact point - btVector3 m_bary; // Barycentric weights - btVector3 m_weights; // v_contactPoint * m_weights[i] = m_face->m_node[i]->m_v; - }; - - struct DeformableFaceNodeContact - { - Node* m_node; // Node - Face* m_face; // Face - btVector3 m_bary; // Barycentric weights - btVector3 m_weights; // v_contactPoint * m_weights[i] = m_face->m_node[i]->m_v; - btVector3 m_normal; // Normal - btScalar m_margin; // Margin - btScalar m_friction; // Friction - btScalar m_imf; // inverse mass of the face at contact point - btScalar m_c0; // scale of the impulse matrix; - }; - - /* SContact */ - struct SContact - { - Node* m_node; // Node - Face* m_face; // Face - btVector3 m_weights; // Weigths - btVector3 m_normal; // Normal - btScalar m_margin; // Margin - btScalar m_friction; // Friction - btScalar m_cfm[2]; // Constraint force mixing - }; - /* Anchor */ - struct Anchor - { - Node* m_node; // Node pointer - btVector3 m_local; // Anchor position in body space - btRigidBody* m_body; // Body - btScalar m_influence; - btMatrix3x3 m_c0; // Impulse matrix - btVector3 m_c1; // Relative anchor - btScalar m_c2; // ima*dt - }; - /* Note */ - struct Note : Element - { - const char* m_text; // Text - btVector3 m_offset; // Offset - int m_rank; // Rank - Node* m_nodes[4]; // Nodes - btScalar m_coords[4]; // Coordinates - }; - /* Pose */ - struct Pose - { - bool m_bvolume; // Is valid - bool m_bframe; // Is frame - btScalar m_volume; // Rest volume - tVector3Array m_pos; // Reference positions - tScalarArray m_wgh; // Weights - btVector3 m_com; // COM - btMatrix3x3 m_rot; // Rotation - btMatrix3x3 m_scl; // Scale - btMatrix3x3 m_aqq; // Base scaling - }; - /* Cluster */ - struct Cluster - { - tScalarArray m_masses; - btAlignedObjectArray m_nodes; - tVector3Array m_framerefs; - btTransform m_framexform; - btScalar m_idmass; - btScalar m_imass; - btMatrix3x3 m_locii; - btMatrix3x3 m_invwi; - btVector3 m_com; - btVector3 m_vimpulses[2]; - btVector3 m_dimpulses[2]; - int m_nvimpulses; - int m_ndimpulses; - btVector3 m_lv; - btVector3 m_av; - btDbvtNode* m_leaf; - btScalar m_ndamping; /* Node damping */ - btScalar m_ldamping; /* Linear damping */ - btScalar m_adamping; /* Angular damping */ - btScalar m_matching; - btScalar m_maxSelfCollisionImpulse; - btScalar m_selfCollisionImpulseFactor; - bool m_containsAnchor; - bool m_collide; - int m_clusterIndex; - Cluster() : m_leaf(0), m_ndamping(0), m_ldamping(0), m_adamping(0), m_matching(0), m_maxSelfCollisionImpulse(100.f), m_selfCollisionImpulseFactor(0.01f), m_containsAnchor(false) - { - } - }; - /* Impulse */ - struct Impulse - { - btVector3 m_velocity; - btVector3 m_drift; - int m_asVelocity : 1; - int m_asDrift : 1; - Impulse() : m_velocity(0, 0, 0), m_drift(0, 0, 0), m_asVelocity(0), m_asDrift(0) {} - Impulse operator-() const - { - Impulse i = *this; - i.m_velocity = -i.m_velocity; - i.m_drift = -i.m_drift; - return (i); - } - Impulse operator*(btScalar x) const - { - Impulse i = *this; - i.m_velocity *= x; - i.m_drift *= x; - return (i); - } - }; - /* Body */ - struct Body - { - Cluster* m_soft; - btRigidBody* m_rigid; - const btCollisionObject* m_collisionObject; - - Body() : m_soft(0), m_rigid(0), m_collisionObject(0) {} - Body(Cluster* p) : m_soft(p), m_rigid(0), m_collisionObject(0) {} - Body(const btCollisionObject* colObj) : m_soft(0), m_collisionObject(colObj) - { - m_rigid = (btRigidBody*)btRigidBody::upcast(m_collisionObject); - } - - void activate() const - { - if (m_rigid) - m_rigid->activate(); - if (m_collisionObject) - m_collisionObject->activate(); - } - const btMatrix3x3& invWorldInertia() const - { - static const btMatrix3x3 iwi(0, 0, 0, 0, 0, 0, 0, 0, 0); - if (m_rigid) return (m_rigid->getInvInertiaTensorWorld()); - if (m_soft) return (m_soft->m_invwi); - return (iwi); - } - btScalar invMass() const - { - if (m_rigid) return (m_rigid->getInvMass()); - if (m_soft) return (m_soft->m_imass); - return (0); - } - const btTransform& xform() const - { - static const btTransform identity = btTransform::getIdentity(); - if (m_collisionObject) return (m_collisionObject->getWorldTransform()); - if (m_soft) return (m_soft->m_framexform); - return (identity); - } - btVector3 linearVelocity() const - { - if (m_rigid) return (m_rigid->getLinearVelocity()); - if (m_soft) return (m_soft->m_lv); - return (btVector3(0, 0, 0)); - } - btVector3 angularVelocity(const btVector3& rpos) const - { - if (m_rigid) return (btCross(m_rigid->getAngularVelocity(), rpos)); - if (m_soft) return (btCross(m_soft->m_av, rpos)); - return (btVector3(0, 0, 0)); - } - btVector3 angularVelocity() const - { - if (m_rigid) return (m_rigid->getAngularVelocity()); - if (m_soft) return (m_soft->m_av); - return (btVector3(0, 0, 0)); - } - btVector3 velocity(const btVector3& rpos) const - { - return (linearVelocity() + angularVelocity(rpos)); - } - void applyVImpulse(const btVector3& impulse, const btVector3& rpos) const - { - if (m_rigid) m_rigid->applyImpulse(impulse, rpos); - if (m_soft) btSoftBody::clusterVImpulse(m_soft, rpos, impulse); - } - void applyDImpulse(const btVector3& impulse, const btVector3& rpos) const - { - if (m_rigid) m_rigid->applyImpulse(impulse, rpos); - if (m_soft) btSoftBody::clusterDImpulse(m_soft, rpos, impulse); - } - void applyImpulse(const Impulse& impulse, const btVector3& rpos) const - { - if (impulse.m_asVelocity) - { - // printf("impulse.m_velocity = %f,%f,%f\n",impulse.m_velocity.getX(),impulse.m_velocity.getY(),impulse.m_velocity.getZ()); - applyVImpulse(impulse.m_velocity, rpos); - } - if (impulse.m_asDrift) - { - // printf("impulse.m_drift = %f,%f,%f\n",impulse.m_drift.getX(),impulse.m_drift.getY(),impulse.m_drift.getZ()); - applyDImpulse(impulse.m_drift, rpos); - } - } - void applyVAImpulse(const btVector3& impulse) const - { - if (m_rigid) m_rigid->applyTorqueImpulse(impulse); - if (m_soft) btSoftBody::clusterVAImpulse(m_soft, impulse); - } - void applyDAImpulse(const btVector3& impulse) const - { - if (m_rigid) m_rigid->applyTorqueImpulse(impulse); - if (m_soft) btSoftBody::clusterDAImpulse(m_soft, impulse); - } - void applyAImpulse(const Impulse& impulse) const - { - if (impulse.m_asVelocity) applyVAImpulse(impulse.m_velocity); - if (impulse.m_asDrift) applyDAImpulse(impulse.m_drift); - } - void applyDCImpulse(const btVector3& impulse) const - { - if (m_rigid) m_rigid->applyCentralImpulse(impulse); - if (m_soft) btSoftBody::clusterDCImpulse(m_soft, impulse); - } - }; - /* Joint */ - struct Joint - { - struct eType - { - enum _ - { - Linear = 0, - Angular, - Contact - }; - }; - struct Specs - { - Specs() : erp(1), cfm(1), split(1) {} - btScalar erp; - btScalar cfm; - btScalar split; - }; - Body m_bodies[2]; - btVector3 m_refs[2]; - btScalar m_cfm; - btScalar m_erp; - btScalar m_split; - btVector3 m_drift; - btVector3 m_sdrift; - btMatrix3x3 m_massmatrix; - bool m_delete; - virtual ~Joint() {} - Joint() : m_delete(false) {} - virtual void Prepare(btScalar dt, int iterations); - virtual void Solve(btScalar dt, btScalar sor) = 0; - virtual void Terminate(btScalar dt) = 0; - virtual eType::_ Type() const = 0; - }; - /* LJoint */ - struct LJoint : Joint - { - struct Specs : Joint::Specs - { - btVector3 position; - }; - btVector3 m_rpos[2]; - void Prepare(btScalar dt, int iterations); - void Solve(btScalar dt, btScalar sor); - void Terminate(btScalar dt); - eType::_ Type() const { return (eType::Linear); } - }; - /* AJoint */ - struct AJoint : Joint - { - struct IControl - { - virtual ~IControl() {} - virtual void Prepare(AJoint*) {} - virtual btScalar Speed(AJoint*, btScalar current) { return (current); } - static IControl* Default() - { - static IControl def; - return (&def); - } - }; - struct Specs : Joint::Specs - { - Specs() : icontrol(IControl::Default()) {} - btVector3 axis; - IControl* icontrol; - }; - btVector3 m_axis[2]; - IControl* m_icontrol; - void Prepare(btScalar dt, int iterations); - void Solve(btScalar dt, btScalar sor); - void Terminate(btScalar dt); - eType::_ Type() const { return (eType::Angular); } - }; - /* CJoint */ - struct CJoint : Joint - { - int m_life; - int m_maxlife; - btVector3 m_rpos[2]; - btVector3 m_normal; - btScalar m_friction; - void Prepare(btScalar dt, int iterations); - void Solve(btScalar dt, btScalar sor); - void Terminate(btScalar dt); - eType::_ Type() const { return (eType::Contact); } - }; - /* Config */ - struct Config - { - eAeroModel::_ aeromodel; // Aerodynamic model (default: V_Point) - btScalar kVCF; // Velocities correction factor (Baumgarte) - btScalar kDP; // Damping coefficient [0,1] - btScalar kDG; // Drag coefficient [0,+inf] - btScalar kLF; // Lift coefficient [0,+inf] - btScalar kPR; // Pressure coefficient [-inf,+inf] - btScalar kVC; // Volume conversation coefficient [0,+inf] - btScalar kDF; // Dynamic friction coefficient [0,1] - btScalar kMT; // Pose matching coefficient [0,1] - btScalar kCHR; // Rigid contacts hardness [0,1] - btScalar kKHR; // Kinetic contacts hardness [0,1] - btScalar kSHR; // Soft contacts hardness [0,1] - btScalar kAHR; // Anchors hardness [0,1] - btScalar kSRHR_CL; // Soft vs rigid hardness [0,1] (cluster only) - btScalar kSKHR_CL; // Soft vs kinetic hardness [0,1] (cluster only) - btScalar kSSHR_CL; // Soft vs soft hardness [0,1] (cluster only) - btScalar kSR_SPLT_CL; // Soft vs rigid impulse split [0,1] (cluster only) - btScalar kSK_SPLT_CL; // Soft vs rigid impulse split [0,1] (cluster only) - btScalar kSS_SPLT_CL; // Soft vs rigid impulse split [0,1] (cluster only) - btScalar maxvolume; // Maximum volume ratio for pose - btScalar timescale; // Time scale - int viterations; // Velocities solver iterations - int piterations; // Positions solver iterations - int diterations; // Drift solver iterations - int citerations; // Cluster solver iterations - int collisions; // Collisions flags - tVSolverArray m_vsequence; // Velocity solvers sequence - tPSolverArray m_psequence; // Position solvers sequence - tPSolverArray m_dsequence; // Drift solvers sequence - btScalar drag; // deformable air drag - btScalar m_maxStress; // Maximum principle first Piola stress - }; - /* SolverState */ - struct SolverState - { - //if you add new variables, always initialize them! - SolverState() - : sdt(0), - isdt(0), - velmrg(0), - radmrg(0), - updmrg(0) - { - } - btScalar sdt; // dt*timescale - btScalar isdt; // 1/sdt - btScalar velmrg; // velocity margin - btScalar radmrg; // radial margin - btScalar updmrg; // Update margin - }; - /// RayFromToCaster takes a ray from, ray to (instead of direction!) - struct RayFromToCaster : btDbvt::ICollide - { - btVector3 m_rayFrom; - btVector3 m_rayTo; - btVector3 m_rayNormalizedDirection; - btScalar m_mint; - Face* m_face; - int m_tests; - RayFromToCaster(const btVector3& rayFrom, const btVector3& rayTo, btScalar mxt); - void Process(const btDbvtNode* leaf); - - static /*inline*/ btScalar rayFromToTriangle(const btVector3& rayFrom, - const btVector3& rayTo, - const btVector3& rayNormalizedDirection, - const btVector3& a, - const btVector3& b, - const btVector3& c, - btScalar maxt = SIMD_INFINITY); - }; - - // - // Typedefs - // - - typedef void (*psolver_t)(btSoftBody*, btScalar, btScalar); - typedef void (*vsolver_t)(btSoftBody*, btScalar); - typedef btAlignedObjectArray tClusterArray; - typedef btAlignedObjectArray tNoteArray; - typedef btAlignedObjectArray tNodeArray; - typedef btAlignedObjectArray< RenderNode> tRenderNodeArray; - typedef btAlignedObjectArray tLeafArray; - typedef btAlignedObjectArray tLinkArray; - typedef btAlignedObjectArray tFaceArray; - typedef btAlignedObjectArray tRenderFaceArray; - typedef btAlignedObjectArray tTetraArray; - typedef btAlignedObjectArray tAnchorArray; - typedef btAlignedObjectArray tRContactArray; - typedef btAlignedObjectArray tSContactArray; - typedef btAlignedObjectArray tMaterialArray; - typedef btAlignedObjectArray tJointArray; - typedef btAlignedObjectArray tSoftBodyArray; - - // - // Fields - // - - Config m_cfg; // Configuration - SolverState m_sst; // Solver state - Pose m_pose; // Pose - void* m_tag; // User data - btSoftBodyWorldInfo* m_worldInfo; // World info - tNoteArray m_notes; // Notes - tNodeArray m_nodes; // Nodes - tRenderNodeArray m_renderNodes; // Render Nodes - tLinkArray m_links; // Links - tFaceArray m_faces; // Faces - tRenderFaceArray m_renderFaces; // Faces - tTetraArray m_tetras; // Tetras - btAlignedObjectArray m_tetraScratches; - btAlignedObjectArray m_tetraScratchesTn; - tAnchorArray m_anchors; // Anchors - btAlignedObjectArray m_deformableAnchors; - tRContactArray m_rcontacts; // Rigid contacts - btAlignedObjectArray m_nodeRigidContacts; - btAlignedObjectArray m_faceNodeContacts; - btAlignedObjectArray m_faceRigidContacts; - tSContactArray m_scontacts; // Soft contacts - tJointArray m_joints; // Joints - tMaterialArray m_materials; // Materials - btScalar m_timeacc; // Time accumulator - btVector3 m_bounds[2]; // Spatial bounds - bool m_bUpdateRtCst; // Update runtime constants - btDbvt m_ndbvt; // Nodes tree - btDbvt m_fdbvt; // Faces tree - btDbvntNode* m_fdbvnt; // Faces tree with normals - btDbvt m_cdbvt; // Clusters tree - tClusterArray m_clusters; // Clusters - btScalar m_dampingCoefficient; // Damping Coefficient - btScalar m_sleepingThreshold; - btScalar m_maxSpeedSquared; - btAlignedObjectArray m_quads; // quadrature points for collision detection - btScalar m_repulsionStiffness; - btScalar m_gravityFactor; - bool m_cacheBarycenter; - btAlignedObjectArray m_X; // initial positions - - btAlignedObjectArray m_renderNodesInterpolationWeights; - btAlignedObjectArray > m_renderNodesParents; - btAlignedObjectArray m_z; // vertical distance used in extrapolation - bool m_useSelfCollision; - bool m_softSoftCollision; - - btAlignedObjectArray m_clusterConnectivity; //cluster connectivity, for self-collision - - btVector3 m_windVelocity; - - btScalar m_restLengthScale; - - // - // Api - // - - /* ctor */ - btSoftBody(btSoftBodyWorldInfo* worldInfo, int node_count, const btVector3* x, const btScalar* m); - - /* ctor */ - btSoftBody(btSoftBodyWorldInfo* worldInfo); - - void initDefaults(); - - /* dtor */ - virtual ~btSoftBody(); - /* Check for existing link */ - - btAlignedObjectArray m_userIndexMapping; - - btSoftBodyWorldInfo* getWorldInfo() - { - return m_worldInfo; - } - - void setDampingCoefficient(btScalar damping_coeff) - { - m_dampingCoefficient = damping_coeff; - } - - ///@todo: avoid internal softbody shape hack and move collision code to collision library - virtual void setCollisionShape(btCollisionShape* collisionShape) - { - } - - bool checkLink(int node0, - int node1) const; - bool checkLink(const Node* node0, - const Node* node1) const; - /* Check for existring face */ - bool checkFace(int node0, - int node1, - int node2) const; - /* Append material */ - Material* appendMaterial(); - /* Append note */ - void appendNote(const char* text, - const btVector3& o, - const btVector4& c = btVector4(1, 0, 0, 0), - Node* n0 = 0, - Node* n1 = 0, - Node* n2 = 0, - Node* n3 = 0); - void appendNote(const char* text, - const btVector3& o, - Node* feature); - void appendNote(const char* text, - const btVector3& o, - Link* feature); - void appendNote(const char* text, - const btVector3& o, - Face* feature); - /* Append node */ - void appendNode(const btVector3& x, btScalar m); - /* Append link */ - void appendLink(int model = -1, Material* mat = 0); - void appendLink(int node0, - int node1, - Material* mat = 0, - bool bcheckexist = false); - void appendLink(Node* node0, - Node* node1, - Material* mat = 0, - bool bcheckexist = false); - /* Append face */ - void appendFace(int model = -1, Material* mat = 0); - void appendFace(int node0, - int node1, - int node2, - Material* mat = 0); - void appendTetra(int model, Material* mat); - // - void appendTetra(int node0, - int node1, - int node2, - int node3, - Material* mat = 0); - - /* Append anchor */ - void appendDeformableAnchor(int node, btRigidBody* body); - void appendDeformableAnchor(int node, btMultiBodyLinkCollider* link); - void appendAnchor(int node, - btRigidBody* body, bool disableCollisionBetweenLinkedBodies = false, btScalar influence = 1); - void appendAnchor(int node, btRigidBody* body, const btVector3& localPivot, bool disableCollisionBetweenLinkedBodies = false, btScalar influence = 1); - void removeAnchor(int node); - /* Append linear joint */ - void appendLinearJoint(const LJoint::Specs& specs, Cluster* body0, Body body1); - void appendLinearJoint(const LJoint::Specs& specs, Body body = Body()); - void appendLinearJoint(const LJoint::Specs& specs, btSoftBody* body); - /* Append linear joint */ - void appendAngularJoint(const AJoint::Specs& specs, Cluster* body0, Body body1); - void appendAngularJoint(const AJoint::Specs& specs, Body body = Body()); - void appendAngularJoint(const AJoint::Specs& specs, btSoftBody* body); - /* Add force (or gravity) to the entire body */ - void addForce(const btVector3& force); - /* Add force (or gravity) to a node of the body */ - void addForce(const btVector3& force, - int node); - /* Add aero force to a node of the body */ - void addAeroForceToNode(const btVector3& windVelocity, int nodeIndex); - - /* Add aero force to a face of the body */ - void addAeroForceToFace(const btVector3& windVelocity, int faceIndex); - - /* Add velocity to the entire body */ - void addVelocity(const btVector3& velocity); - - /* Set velocity for the entire body */ - void setVelocity(const btVector3& velocity); - - /* Add velocity to a node of the body */ - void addVelocity(const btVector3& velocity, - int node); - /* Set mass */ - void setMass(int node, - btScalar mass); - /* Get mass */ - btScalar getMass(int node) const; - /* Get total mass */ - btScalar getTotalMass() const; - /* Set total mass (weighted by previous masses) */ - void setTotalMass(btScalar mass, - bool fromfaces = false); - /* Set total density */ - void setTotalDensity(btScalar density); - /* Set volume mass (using tetrahedrons) */ - void setVolumeMass(btScalar mass); - /* Set volume density (using tetrahedrons) */ - void setVolumeDensity(btScalar density); - /* Get the linear velocity of the center of mass */ - btVector3 getLinearVelocity(); - /* Set the linear velocity of the center of mass */ - void setLinearVelocity(const btVector3& linVel); - /* Set the angular velocity of the center of mass */ - void setAngularVelocity(const btVector3& angVel); - /* Get best fit rigid transform */ - btTransform getRigidTransform(); - /* Transform to given pose */ - void transformTo(const btTransform& trs); - /* Transform */ - void transform(const btTransform& trs); - /* Translate */ - void translate(const btVector3& trs); - /* Rotate */ - void rotate(const btQuaternion& rot); - /* Scale */ - void scale(const btVector3& scl); - /* Get link resting lengths scale */ - btScalar getRestLengthScale(); - /* Scale resting length of all springs */ - void setRestLengthScale(btScalar restLength); - /* Set current state as pose */ - void setPose(bool bvolume, - bool bframe); - /* Set current link lengths as resting lengths */ - void resetLinkRestLengths(); - /* Return the volume */ - btScalar getVolume() const; - /* Cluster count */ - btVector3 getCenterOfMass() const - { - btVector3 com(0, 0, 0); - for (int i = 0; i < m_nodes.size(); i++) - { - com += (m_nodes[i].m_x * this->getMass(i)); - } - com /= this->getTotalMass(); - return com; - } - int clusterCount() const; - /* Cluster center of mass */ - static btVector3 clusterCom(const Cluster* cluster); - btVector3 clusterCom(int cluster) const; - /* Cluster velocity at rpos */ - static btVector3 clusterVelocity(const Cluster* cluster, const btVector3& rpos); - /* Cluster impulse */ - static void clusterVImpulse(Cluster* cluster, const btVector3& rpos, const btVector3& impulse); - static void clusterDImpulse(Cluster* cluster, const btVector3& rpos, const btVector3& impulse); - static void clusterImpulse(Cluster* cluster, const btVector3& rpos, const Impulse& impulse); - static void clusterVAImpulse(Cluster* cluster, const btVector3& impulse); - static void clusterDAImpulse(Cluster* cluster, const btVector3& impulse); - static void clusterAImpulse(Cluster* cluster, const Impulse& impulse); - static void clusterDCImpulse(Cluster* cluster, const btVector3& impulse); - /* Generate bending constraints based on distance in the adjency graph */ - int generateBendingConstraints(int distance, - Material* mat = 0); - /* Randomize constraints to reduce solver bias */ - void randomizeConstraints(); - /* Release clusters */ - void releaseCluster(int index); - void releaseClusters(); - /* Generate clusters (K-mean) */ - ///generateClusters with k=0 will create a convex cluster for each tetrahedron or triangle - ///otherwise an approximation will be used (better performance) - int generateClusters(int k, int maxiterations = 8192); - /* Refine */ - void refine(ImplicitFn* ifn, btScalar accurary, bool cut); - /* CutLink */ - bool cutLink(int node0, int node1, btScalar position); - bool cutLink(const Node* node0, const Node* node1, btScalar position); - - ///Ray casting using rayFrom and rayTo in worldspace, (not direction!) - bool rayTest(const btVector3& rayFrom, - const btVector3& rayTo, - sRayCast& results); - bool rayFaceTest(const btVector3& rayFrom, - const btVector3& rayTo, - sRayCast& results); - int rayFaceTest(const btVector3& rayFrom, const btVector3& rayTo, - btScalar& mint, int& index) const; - /* Solver presets */ - void setSolver(eSolverPresets::_ preset); - /* predictMotion */ - void predictMotion(btScalar dt); - /* solveConstraints */ - void solveConstraints(); - /* staticSolve */ - void staticSolve(int iterations); - /* solveCommonConstraints */ - static void solveCommonConstraints(btSoftBody** bodies, int count, int iterations); - /* solveClusters */ - static void solveClusters(const btAlignedObjectArray& bodies); - /* integrateMotion */ - void integrateMotion(); - /* defaultCollisionHandlers */ - void defaultCollisionHandler(const btCollisionObjectWrapper* pcoWrap); - void defaultCollisionHandler(btSoftBody* psb); - void setSelfCollision(bool useSelfCollision); - bool useSelfCollision(); - void updateDeactivation(btScalar timeStep); - void setZeroVelocity(); - bool wantsSleeping(); - - // - // Functionality to deal with new accelerated solvers. - // - - /** - * Set a wind velocity for interaction with the air. - */ - void setWindVelocity(const btVector3& velocity); - - /** - * Return the wind velocity for interaction with the air. - */ - const btVector3& getWindVelocity(); - - // - // Set the solver that handles this soft body - // Should not be allowed to get out of sync with reality - // Currently called internally on addition to the world - void setSoftBodySolver(btSoftBodySolver* softBodySolver) - { - m_softBodySolver = softBodySolver; - } - - // - // Return the solver that handles this soft body - // - btSoftBodySolver* getSoftBodySolver() - { - return m_softBodySolver; - } - - // - // Return the solver that handles this soft body - // - btSoftBodySolver* getSoftBodySolver() const - { - return m_softBodySolver; - } - - // - // Cast - // - - static const btSoftBody* upcast(const btCollisionObject* colObj) - { - if (colObj->getInternalType() == CO_SOFT_BODY) - return (const btSoftBody*)colObj; - return 0; - } - static btSoftBody* upcast(btCollisionObject* colObj) - { - if (colObj->getInternalType() == CO_SOFT_BODY) - return (btSoftBody*)colObj; - return 0; - } - - // - // ::btCollisionObject - // - - virtual void getAabb(btVector3& aabbMin, btVector3& aabbMax) const - { - aabbMin = m_bounds[0]; - aabbMax = m_bounds[1]; - } - // - // Private - // - void pointersToIndices(); - void indicesToPointers(const int* map = 0); - - int rayTest(const btVector3& rayFrom, const btVector3& rayTo, - btScalar& mint, eFeature::_& feature, int& index, bool bcountonly) const; - void initializeFaceTree(); - void rebuildNodeTree(); - btVector3 evaluateCom() const; - bool checkDeformableContact(const btCollisionObjectWrapper* colObjWrap, const btVector3& x, btScalar margin, btSoftBody::sCti& cti, bool predict = false) const; - bool checkDeformableFaceContact(const btCollisionObjectWrapper* colObjWrap, Face& f, btVector3& contact_point, btVector3& bary, btScalar margin, btSoftBody::sCti& cti, bool predict = false) const; - bool checkContact(const btCollisionObjectWrapper* colObjWrap, const btVector3& x, btScalar margin, btSoftBody::sCti& cti) const; - void updateNormals(); - void updateBounds(); - void updatePose(); - void updateConstants(); - void updateLinkConstants(); - void updateArea(bool averageArea = true); - void initializeClusters(); - void updateClusters(); - void cleanupClusters(); - void prepareClusters(int iterations); - void solveClusters(btScalar sor); - void applyClusters(bool drift); - void dampClusters(); - void setSpringStiffness(btScalar k); - void setGravityFactor(btScalar gravFactor); - void setCacheBarycenter(bool cacheBarycenter); - void initializeDmInverse(); - void updateDeformation(); - void advanceDeformation(); - void applyForces(); - void setMaxStress(btScalar maxStress); - void interpolateRenderMesh(); - void setCollisionQuadrature(int N); - static void PSolve_Anchors(btSoftBody* psb, btScalar kst, btScalar ti); - static void PSolve_RContacts(btSoftBody* psb, btScalar kst, btScalar ti); - static void PSolve_SContacts(btSoftBody* psb, btScalar, btScalar ti); - static void PSolve_Links(btSoftBody* psb, btScalar kst, btScalar ti); - static void VSolve_Links(btSoftBody* psb, btScalar kst); - static psolver_t getSolver(ePSolver::_ solver); - static vsolver_t getSolver(eVSolver::_ solver); - void geometricCollisionHandler(btSoftBody* psb); -#define SAFE_EPSILON SIMD_EPSILON * 100.0 - void updateNode(btDbvtNode* node, bool use_velocity, bool margin) - { - if (node->isleaf()) - { - btSoftBody::Node* n = (btSoftBody::Node*)(node->data); - ATTRIBUTE_ALIGNED16(btDbvtVolume) - vol; - btScalar pad = margin ? m_sst.radmrg : SAFE_EPSILON; // use user defined margin or margin for floating point precision - if (use_velocity) - { - btVector3 points[2] = {n->m_x, n->m_x + m_sst.sdt * n->m_v}; - vol = btDbvtVolume::FromPoints(points, 2); - vol.Expand(btVector3(pad, pad, pad)); - } - else - { - vol = btDbvtVolume::FromCR(n->m_x, pad); - } - node->volume = vol; - return; - } - else - { - updateNode(node->childs[0], use_velocity, margin); - updateNode(node->childs[1], use_velocity, margin); - ATTRIBUTE_ALIGNED16(btDbvtVolume) - vol; - Merge(node->childs[0]->volume, node->childs[1]->volume, vol); - node->volume = vol; - } - } - - void updateNodeTree(bool use_velocity, bool margin) - { - if (m_ndbvt.m_root) - updateNode(m_ndbvt.m_root, use_velocity, margin); - } - - template // btDbvtNode or btDbvntNode - void updateFace(DBVTNODE* node, bool use_velocity, bool margin) - { - if (node->isleaf()) - { - btSoftBody::Face* f = (btSoftBody::Face*)(node->data); - btScalar pad = margin ? m_sst.radmrg : SAFE_EPSILON; // use user defined margin or margin for floating point precision - ATTRIBUTE_ALIGNED16(btDbvtVolume) - vol; - if (use_velocity) - { - btVector3 points[6] = {f->m_n[0]->m_x, f->m_n[0]->m_x + m_sst.sdt * f->m_n[0]->m_v, - f->m_n[1]->m_x, f->m_n[1]->m_x + m_sst.sdt * f->m_n[1]->m_v, - f->m_n[2]->m_x, f->m_n[2]->m_x + m_sst.sdt * f->m_n[2]->m_v}; - vol = btDbvtVolume::FromPoints(points, 6); - } - else - { - btVector3 points[3] = {f->m_n[0]->m_x, - f->m_n[1]->m_x, - f->m_n[2]->m_x}; - vol = btDbvtVolume::FromPoints(points, 3); - } - vol.Expand(btVector3(pad, pad, pad)); - node->volume = vol; - return; - } - else - { - updateFace(node->childs[0], use_velocity, margin); - updateFace(node->childs[1], use_velocity, margin); - ATTRIBUTE_ALIGNED16(btDbvtVolume) - vol; - Merge(node->childs[0]->volume, node->childs[1]->volume, vol); - node->volume = vol; - } - } - void updateFaceTree(bool use_velocity, bool margin) - { - if (m_fdbvt.m_root) - updateFace(m_fdbvt.m_root, use_velocity, margin); - if (m_fdbvnt) - updateFace(m_fdbvnt, use_velocity, margin); - } - - template - static inline T BaryEval(const T& a, - const T& b, - const T& c, - const btVector3& coord) - { - return (a * coord.x() + b * coord.y() + c * coord.z()); - } - - void applyRepulsionForce(btScalar timeStep, bool applySpringForce) - { - btAlignedObjectArray indices; - { - // randomize the order of repulsive force - indices.resize(m_faceNodeContacts.size()); - for (int i = 0; i < m_faceNodeContacts.size(); ++i) - indices[i] = i; -#define NEXTRAND (seed = (1664525L * seed + 1013904223L) & 0xffffffff) - int i, ni; - - for (i = 0, ni = indices.size(); i < ni; ++i) - { - btSwap(indices[i], indices[NEXTRAND % ni]); - } - } - for (int k = 0; k < m_faceNodeContacts.size(); ++k) - { - int i = indices[k]; - btSoftBody::DeformableFaceNodeContact& c = m_faceNodeContacts[i]; - btSoftBody::Node* node = c.m_node; - btSoftBody::Face* face = c.m_face; - const btVector3& w = c.m_bary; - const btVector3& n = c.m_normal; - btVector3 l = node->m_x - BaryEval(face->m_n[0]->m_x, face->m_n[1]->m_x, face->m_n[2]->m_x, w); - btScalar d = c.m_margin - n.dot(l); - d = btMax(btScalar(0), d); - - const btVector3& va = node->m_v; - btVector3 vb = BaryEval(face->m_n[0]->m_v, face->m_n[1]->m_v, face->m_n[2]->m_v, w); - btVector3 vr = va - vb; - const btScalar vn = btDot(vr, n); // dn < 0 <==> opposing - if (vn > OVERLAP_REDUCTION_FACTOR * d / timeStep) - continue; - btVector3 vt = vr - vn * n; - btScalar I = 0; - btScalar mass = node->m_im == 0 ? 0 : btScalar(1) / node->m_im; - if (applySpringForce) - I = -btMin(m_repulsionStiffness * timeStep * d, mass * (OVERLAP_REDUCTION_FACTOR * d / timeStep - vn)); - if (vn < 0) - I += 0.5 * mass * vn; - int face_penetration = 0, node_penetration = node->m_constrained; - for (int i = 0; i < 3; ++i) - face_penetration |= face->m_n[i]->m_constrained; - btScalar I_tilde = 2.0 * I / (1.0 + w.length2()); - - // double the impulse if node or face is constrained. - if (face_penetration > 0 || node_penetration > 0) - { - I_tilde *= 2.0; - } - if (face_penetration <= 0) - { - for (int j = 0; j < 3; ++j) - face->m_n[j]->m_v += w[j] * n * I_tilde * node->m_im; - } - if (node_penetration <= 0) - { - node->m_v -= I_tilde * node->m_im * n; - } - - // apply frictional impulse - btScalar vt_norm = vt.safeNorm(); - if (vt_norm > SIMD_EPSILON) - { - btScalar delta_vn = -2 * I * node->m_im; - btScalar mu = c.m_friction; - btScalar vt_new = btMax(btScalar(1) - mu * delta_vn / (vt_norm + SIMD_EPSILON), btScalar(0)) * vt_norm; - I = 0.5 * mass * (vt_norm - vt_new); - vt.safeNormalize(); - I_tilde = 2.0 * I / (1.0 + w.length2()); - // double the impulse if node or face is constrained. - if (face_penetration > 0 || node_penetration > 0) - I_tilde *= 2.0; - if (face_penetration <= 0) - { - for (int j = 0; j < 3; ++j) - face->m_n[j]->m_v += w[j] * vt * I_tilde * (face->m_n[j])->m_im; - } - if (node_penetration <= 0) - { - node->m_v -= I_tilde * node->m_im * vt; - } - } - } - } - virtual int calculateSerializeBufferSize() const; - - ///fills the dataBuffer and returns the struct name (and 0 on failure) - virtual const char* serialize(void* dataBuffer, class btSerializer* serializer) const; -}; - -#endif //_BT_SOFT_BODY_H diff --git a/engine/inc/bullet/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.h b/engine/inc/bullet/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.h deleted file mode 100644 index 3adedbd8..00000000 --- a/engine/inc/bullet/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.h +++ /dev/null @@ -1,147 +0,0 @@ -/* -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_SOFT_BODY_CONCAVE_COLLISION_ALGORITHM_H -#define BT_SOFT_BODY_CONCAVE_COLLISION_ALGORITHM_H - -#include "BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h" -#include "BulletCollision/BroadphaseCollision/btDispatcher.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseInterface.h" -#include "BulletCollision/CollisionShapes/btTriangleCallback.h" -#include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h" -class btDispatcher; -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" -#include "BulletCollision/CollisionDispatch/btCollisionCreateFunc.h" -class btSoftBody; -class btCollisionShape; - -#include "LinearMath/btHashMap.h" - -#include "BulletCollision/BroadphaseCollision/btQuantizedBvh.h" //for definition of MAX_NUM_PARTS_IN_BITS - -struct btTriIndex -{ - int m_PartIdTriangleIndex; - class btCollisionShape* m_childShape; - - btTriIndex(int partId, int triangleIndex, btCollisionShape* shape) - { - m_PartIdTriangleIndex = (partId << (31 - MAX_NUM_PARTS_IN_BITS)) | triangleIndex; - m_childShape = shape; - } - - int getTriangleIndex() const - { - // Get only the lower bits where the triangle index is stored - unsigned int x = 0; - unsigned int y = (~(x & 0)) << (31 - MAX_NUM_PARTS_IN_BITS); - return (m_PartIdTriangleIndex & ~(y)); - } - int getPartId() const - { - // Get only the highest bits where the part index is stored - return (m_PartIdTriangleIndex >> (31 - MAX_NUM_PARTS_IN_BITS)); - } - int getUid() const - { - return m_PartIdTriangleIndex; - } -}; - -///For each triangle in the concave mesh that overlaps with the AABB of a soft body (m_softBody), processTriangle is called. -class btSoftBodyTriangleCallback : public btTriangleCallback -{ - btSoftBody* m_softBody; - const btCollisionObject* m_triBody; - - btVector3 m_aabbMin; - btVector3 m_aabbMax; - - btManifoldResult* m_resultOut; - - btDispatcher* m_dispatcher; - const btDispatcherInfo* m_dispatchInfoPtr; - btScalar m_collisionMarginTriangle; - - btHashMap, btTriIndex> m_shapeCache; - -public: - int m_triangleCount; - - // btPersistentManifold* m_manifoldPtr; - - btSoftBodyTriangleCallback(btDispatcher* dispatcher, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, bool isSwapped); - - void setTimeStepAndCounters(btScalar collisionMarginTriangle, const btCollisionObjectWrapper* triObjWrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut); - - virtual ~btSoftBodyTriangleCallback(); - - virtual void processTriangle(btVector3* triangle, int partId, int triangleIndex); - - void clearCache(); - - SIMD_FORCE_INLINE const btVector3& getAabbMin() const - { - return m_aabbMin; - } - SIMD_FORCE_INLINE const btVector3& getAabbMax() const - { - return m_aabbMax; - } -}; - -/// btSoftBodyConcaveCollisionAlgorithm supports collision between soft body shapes and (concave) trianges meshes. -class btSoftBodyConcaveCollisionAlgorithm : public btCollisionAlgorithm -{ - bool m_isSwapped; - - btSoftBodyTriangleCallback m_btSoftBodyTriangleCallback; - -public: - btSoftBodyConcaveCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, bool isSwapped); - - virtual ~btSoftBodyConcaveCollisionAlgorithm(); - - virtual void processCollision(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut); - - btScalar calculateTimeOfImpact(btCollisionObject* body0, btCollisionObject* body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut); - - virtual void getAllContactManifolds(btManifoldArray& manifoldArray) - { - //we don't add any manifolds - } - - void clearCache(); - - struct CreateFunc : public btCollisionAlgorithmCreateFunc - { - virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap) - { - void* mem = ci.m_dispatcher1->allocateCollisionAlgorithm(sizeof(btSoftBodyConcaveCollisionAlgorithm)); - return new (mem) btSoftBodyConcaveCollisionAlgorithm(ci, body0Wrap, body1Wrap, false); - } - }; - - struct SwappedCreateFunc : public btCollisionAlgorithmCreateFunc - { - virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap) - { - void* mem = ci.m_dispatcher1->allocateCollisionAlgorithm(sizeof(btSoftBodyConcaveCollisionAlgorithm)); - return new (mem) btSoftBodyConcaveCollisionAlgorithm(ci, body0Wrap, body1Wrap, true); - } - }; -}; - -#endif //BT_SOFT_BODY_CONCAVE_COLLISION_ALGORITHM_H diff --git a/engine/inc/bullet/BulletSoftBody/btSoftBodyData.h b/engine/inc/bullet/BulletSoftBody/btSoftBodyData.h deleted file mode 100644 index cec6f401..00000000 --- a/engine/inc/bullet/BulletSoftBody/btSoftBodyData.h +++ /dev/null @@ -1,212 +0,0 @@ -/* -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_SOFTBODY_FLOAT_DATA -#define BT_SOFTBODY_FLOAT_DATA - -#include "BulletCollision/CollisionDispatch/btCollisionObject.h" -#include "BulletDynamics/Dynamics/btRigidBody.h" - -struct SoftBodyMaterialData -{ - float m_linearStiffness; - float m_angularStiffness; - float m_volumeStiffness; - int m_flags; -}; - -struct SoftBodyNodeData -{ - SoftBodyMaterialData *m_material; - btVector3FloatData m_position; - btVector3FloatData m_previousPosition; - btVector3FloatData m_velocity; - btVector3FloatData m_accumulatedForce; - btVector3FloatData m_normal; - float m_inverseMass; - float m_area; - int m_attach; - int m_pad; -}; - -struct SoftBodyLinkData -{ - SoftBodyMaterialData *m_material; - int m_nodeIndices[2]; // Node pointers - float m_restLength; // Rest length - int m_bbending; // Bending link -}; - -struct SoftBodyFaceData -{ - btVector3FloatData m_normal; // Normal - SoftBodyMaterialData *m_material; - int m_nodeIndices[3]; // Node pointers - float m_restArea; // Rest area -}; - -struct SoftBodyTetraData -{ - btVector3FloatData m_c0[4]; // gradients - SoftBodyMaterialData *m_material; - int m_nodeIndices[4]; // Node pointers - float m_restVolume; // Rest volume - float m_c1; // (4*kVST)/(im0+im1+im2+im3) - float m_c2; // m_c1/sum(|g0..3|^2) - int m_pad; -}; - -struct SoftRigidAnchorData -{ - btMatrix3x3FloatData m_c0; // Impulse matrix - btVector3FloatData m_c1; // Relative anchor - btVector3FloatData m_localFrame; // Anchor position in body space - btRigidBodyData *m_rigidBody; - int m_nodeIndex; // Node pointer - float m_c2; // ima*dt -}; - -struct SoftBodyConfigData -{ - int m_aeroModel; // Aerodynamic model (default: V_Point) - float m_baumgarte; // Velocities correction factor (Baumgarte) - float m_damping; // Damping coefficient [0,1] - float m_drag; // Drag coefficient [0,+inf] - float m_lift; // Lift coefficient [0,+inf] - float m_pressure; // Pressure coefficient [-inf,+inf] - float m_volume; // Volume conversation coefficient [0,+inf] - float m_dynamicFriction; // Dynamic friction coefficient [0,1] - float m_poseMatch; // Pose matching coefficient [0,1] - float m_rigidContactHardness; // Rigid contacts hardness [0,1] - float m_kineticContactHardness; // Kinetic contacts hardness [0,1] - float m_softContactHardness; // Soft contacts hardness [0,1] - float m_anchorHardness; // Anchors hardness [0,1] - float m_softRigidClusterHardness; // Soft vs rigid hardness [0,1] (cluster only) - float m_softKineticClusterHardness; // Soft vs kinetic hardness [0,1] (cluster only) - float m_softSoftClusterHardness; // Soft vs soft hardness [0,1] (cluster only) - float m_softRigidClusterImpulseSplit; // Soft vs rigid impulse split [0,1] (cluster only) - float m_softKineticClusterImpulseSplit; // Soft vs rigid impulse split [0,1] (cluster only) - float m_softSoftClusterImpulseSplit; // Soft vs rigid impulse split [0,1] (cluster only) - float m_maxVolume; // Maximum volume ratio for pose - float m_timeScale; // Time scale - int m_velocityIterations; // Velocities solver iterations - int m_positionIterations; // Positions solver iterations - int m_driftIterations; // Drift solver iterations - int m_clusterIterations; // Cluster solver iterations - int m_collisionFlags; // Collisions flags -}; - -struct SoftBodyPoseData -{ - btMatrix3x3FloatData m_rot; // Rotation - btMatrix3x3FloatData m_scale; // Scale - btMatrix3x3FloatData m_aqq; // Base scaling - btVector3FloatData m_com; // COM - - btVector3FloatData *m_positions; // Reference positions - float *m_weights; // Weights - int m_numPositions; - int m_numWeigts; - - int m_bvolume; // Is valid - int m_bframe; // Is frame - float m_restVolume; // Rest volume - int m_pad; -}; - -struct SoftBodyClusterData -{ - btTransformFloatData m_framexform; - btMatrix3x3FloatData m_locii; - btMatrix3x3FloatData m_invwi; - btVector3FloatData m_com; - btVector3FloatData m_vimpulses[2]; - btVector3FloatData m_dimpulses[2]; - btVector3FloatData m_lv; - btVector3FloatData m_av; - - btVector3FloatData *m_framerefs; - int *m_nodeIndices; - float *m_masses; - - int m_numFrameRefs; - int m_numNodes; - int m_numMasses; - - float m_idmass; - float m_imass; - int m_nvimpulses; - int m_ndimpulses; - float m_ndamping; - float m_ldamping; - float m_adamping; - float m_matching; - float m_maxSelfCollisionImpulse; - float m_selfCollisionImpulseFactor; - int m_containsAnchor; - int m_collide; - int m_clusterIndex; -}; - -enum btSoftJointBodyType -{ - BT_JOINT_SOFT_BODY_CLUSTER = 1, - BT_JOINT_RIGID_BODY, - BT_JOINT_COLLISION_OBJECT -}; - -struct btSoftBodyJointData -{ - void *m_bodyA; - void *m_bodyB; - btVector3FloatData m_refs[2]; - float m_cfm; - float m_erp; - float m_split; - int m_delete; - btVector3FloatData m_relPosition[2]; //linear - int m_bodyAtype; - int m_bodyBtype; - int m_jointType; - int m_pad; -}; - -///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 -struct btSoftBodyFloatData -{ - btCollisionObjectFloatData m_collisionObjectData; - - SoftBodyPoseData *m_pose; - SoftBodyMaterialData **m_materials; - SoftBodyNodeData *m_nodes; - SoftBodyLinkData *m_links; - SoftBodyFaceData *m_faces; - SoftBodyTetraData *m_tetrahedra; - SoftRigidAnchorData *m_anchors; - SoftBodyClusterData *m_clusters; - btSoftBodyJointData *m_joints; - - int m_numMaterials; - int m_numNodes; - int m_numLinks; - int m_numFaces; - int m_numTetrahedra; - int m_numAnchors; - int m_numClusters; - int m_numJoints; - SoftBodyConfigData m_config; -}; - -#endif //BT_SOFTBODY_FLOAT_DATA diff --git a/engine/inc/bullet/BulletSoftBody/btSoftBodyHelpers.h b/engine/inc/bullet/BulletSoftBody/btSoftBodyHelpers.h deleted file mode 100644 index 237d2976..00000000 --- a/engine/inc/bullet/BulletSoftBody/btSoftBodyHelpers.h +++ /dev/null @@ -1,167 +0,0 @@ -/* -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 BT_SOFT_BODY_HELPERS_H -#define BT_SOFT_BODY_HELPERS_H - -#include "btSoftBody.h" -#include -#include -// -// Helpers -// - -/* fDrawFlags */ -struct fDrawFlags -{ - enum _ - { - Nodes = 0x0001, - Links = 0x0002, - Faces = 0x0004, - Tetras = 0x0008, - Normals = 0x0010, - Contacts = 0x0020, - Anchors = 0x0040, - Notes = 0x0080, - Clusters = 0x0100, - NodeTree = 0x0200, - FaceTree = 0x0400, - ClusterTree = 0x0800, - Joints = 0x1000, - /* presets */ - Std = Links + Faces + Tetras + Anchors + Notes + Joints, - StdTetra = Std - Faces + Tetras - }; -}; - -struct btSoftBodyHelpers -{ - /* Draw body */ - static void Draw(btSoftBody* psb, - btIDebugDraw* idraw, - int drawflags = fDrawFlags::Std); - /* Draw body infos */ - static void DrawInfos(btSoftBody* psb, - btIDebugDraw* idraw, - bool masses, - bool areas, - bool stress); - /* Draw node tree */ - static void DrawNodeTree(btSoftBody* psb, - btIDebugDraw* idraw, - int mindepth = 0, - int maxdepth = -1); - /* Draw face tree */ - static void DrawFaceTree(btSoftBody* psb, - btIDebugDraw* idraw, - int mindepth = 0, - int maxdepth = -1); - /* Draw cluster tree */ - static void DrawClusterTree(btSoftBody* psb, - btIDebugDraw* idraw, - int mindepth = 0, - int maxdepth = -1); - /* Draw rigid frame */ - static void DrawFrame(btSoftBody* psb, - btIDebugDraw* idraw); - /* Create a rope */ - static btSoftBody* CreateRope(btSoftBodyWorldInfo& worldInfo, - const btVector3& from, - const btVector3& to, - int res, - int fixeds); - /* Create a patch */ - static btSoftBody* CreatePatch(btSoftBodyWorldInfo& worldInfo, - const btVector3& corner00, - const btVector3& corner10, - const btVector3& corner01, - const btVector3& corner11, - int resx, - int resy, - int fixeds, - bool gendiags, - btScalar perturbation = 0.); - /* Create a patch with UV Texture Coordinates */ - static btSoftBody* CreatePatchUV(btSoftBodyWorldInfo& worldInfo, - const btVector3& corner00, - const btVector3& corner10, - const btVector3& corner01, - const btVector3& corner11, - int resx, - int resy, - int fixeds, - bool gendiags, - float* tex_coords = 0); - static float CalculateUV(int resx, int resy, int ix, int iy, int id); - /* Create an ellipsoid */ - static btSoftBody* CreateEllipsoid(btSoftBodyWorldInfo& worldInfo, - const btVector3& center, - const btVector3& radius, - int res); - /* Create from trimesh */ - static btSoftBody* CreateFromTriMesh(btSoftBodyWorldInfo& worldInfo, - const btScalar* vertices, - const int* triangles, - int ntriangles, - bool randomizeConstraints = true); - /* Create from convex-hull */ - static btSoftBody* CreateFromConvexHull(btSoftBodyWorldInfo& worldInfo, - const btVector3* vertices, - int nvertices, - bool randomizeConstraints = true); - - /* Export TetGen compatible .smesh file */ - // static void ExportAsSMeshFile( btSoftBody* psb, - // const char* filename); - /* Create from TetGen .ele, .face, .node files */ - // static btSoftBody* CreateFromTetGenFile( btSoftBodyWorldInfo& worldInfo, - // const char* ele, - // const char* face, - // const char* node, - // bool bfacelinks, - // bool btetralinks, - // bool bfacesfromtetras); - /* Create from TetGen .ele, .face, .node data */ - static btSoftBody* CreateFromTetGenData(btSoftBodyWorldInfo& worldInfo, - const char* ele, - const char* face, - const char* node, - bool bfacelinks, - bool btetralinks, - bool bfacesfromtetras); - static btSoftBody* CreateFromVtkFile(btSoftBodyWorldInfo& worldInfo, const char* vtk_file); - - static void writeObj(const char* file, const btSoftBody* psb); - - static void getBarycentricWeights(const btVector3& a, const btVector3& b, const btVector3& c, const btVector3& d, const btVector3& p, btVector4& bary); - - static void getBarycentricWeights(const btVector3& a, const btVector3& b, const btVector3& c, const btVector3& p, btVector4& bary); - - static void interpolateBarycentricWeights(btSoftBody* psb); - - static void extrapolateBarycentricWeights(btSoftBody* psb); - - static void generateBoundaryFaces(btSoftBody* psb); - - static void duplicateFaces(const char* filename, const btSoftBody* psb); - /// Sort the list of links to move link calculations that are dependent upon earlier - /// ones as far as possible away from the calculation of those values - /// This tends to make adjacent loop iterations not dependent upon one another, - /// so out-of-order processors can execute instructions from multiple iterations at once - static void ReoptimizeLinkOrder(btSoftBody* psb); -}; - -#endif //BT_SOFT_BODY_HELPERS_H diff --git a/engine/inc/bullet/BulletSoftBody/btSoftBodyInternals.h b/engine/inc/bullet/BulletSoftBody/btSoftBodyInternals.h deleted file mode 100644 index c17bbb5c..00000000 --- a/engine/inc/bullet/BulletSoftBody/btSoftBodyInternals.h +++ /dev/null @@ -1,2108 +0,0 @@ -/* -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 - -#ifndef _BT_SOFT_BODY_INTERNALS_H -#define _BT_SOFT_BODY_INTERNALS_H - -#include "btSoftBody.h" -#include "LinearMath/btQuickprof.h" -#include "LinearMath/btPolarDecomposition.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseInterface.h" -#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" -#include "BulletCollision/CollisionShapes/btConvexInternalShape.h" -#include "BulletCollision/NarrowPhaseCollision/btGjkEpa2.h" -#include "BulletDynamics/Featherstone/btMultiBodyLinkCollider.h" -#include "BulletDynamics/Featherstone/btMultiBodyConstraint.h" -#include //for memset -#include -#include "poly34.h" - -// Given a multibody link, a contact point and a contact direction, fill in the jacobian data needed to calculate the velocity change given an impulse in the contact direction -static SIMD_FORCE_INLINE void findJacobian(const btMultiBodyLinkCollider* multibodyLinkCol, - btMultiBodyJacobianData& jacobianData, - const btVector3& contact_point, - const btVector3& dir) -{ - const int ndof = multibodyLinkCol->m_multiBody->getNumDofs() + 6; - jacobianData.m_jacobians.resize(ndof); - jacobianData.m_deltaVelocitiesUnitImpulse.resize(ndof); - btScalar* jac = &jacobianData.m_jacobians[0]; - - multibodyLinkCol->m_multiBody->fillContactJacobianMultiDof(multibodyLinkCol->m_link, contact_point, dir, jac, jacobianData.scratch_r, jacobianData.scratch_v, jacobianData.scratch_m); - multibodyLinkCol->m_multiBody->calcAccelerationDeltasMultiDof(&jacobianData.m_jacobians[0], &jacobianData.m_deltaVelocitiesUnitImpulse[0], jacobianData.scratch_r, jacobianData.scratch_v); -} -static SIMD_FORCE_INLINE btVector3 generateUnitOrthogonalVector(const btVector3& u) -{ - btScalar ux = u.getX(); - btScalar uy = u.getY(); - btScalar uz = u.getZ(); - btScalar ax = std::abs(ux); - btScalar ay = std::abs(uy); - btScalar az = std::abs(uz); - btVector3 v; - if (ax <= ay && ax <= az) - v = btVector3(0, -uz, uy); - else if (ay <= ax && ay <= az) - v = btVector3(-uz, 0, ux); - else - v = btVector3(-uy, ux, 0); - v.normalize(); - return v; -} - -static SIMD_FORCE_INLINE bool proximityTest(const btVector3& x1, const btVector3& x2, const btVector3& x3, const btVector3& x4, const btVector3& normal, const btScalar& mrg, btVector3& bary) -{ - btVector3 x43 = x4 - x3; - if (std::abs(x43.dot(normal)) > mrg) - return false; - btVector3 x13 = x1 - x3; - btVector3 x23 = x2 - x3; - btScalar a11 = x13.length2(); - btScalar a22 = x23.length2(); - btScalar a12 = x13.dot(x23); - btScalar b1 = x13.dot(x43); - btScalar b2 = x23.dot(x43); - btScalar det = a11 * a22 - a12 * a12; - if (det < SIMD_EPSILON) - return false; - btScalar w1 = (b1 * a22 - b2 * a12) / det; - btScalar w2 = (b2 * a11 - b1 * a12) / det; - btScalar w3 = 1 - w1 - w2; - btScalar delta = mrg / std::sqrt(0.5 * std::abs(x13.cross(x23).safeNorm())); - bary = btVector3(w1, w2, w3); - for (int i = 0; i < 3; ++i) - { - if (bary[i] < -delta || bary[i] > 1 + delta) - return false; - } - return true; -} -static const int KDOP_COUNT = 13; -static btVector3 dop[KDOP_COUNT] = {btVector3(1, 0, 0), - btVector3(0, 1, 0), - btVector3(0, 0, 1), - btVector3(1, 1, 0), - btVector3(1, 0, 1), - btVector3(0, 1, 1), - btVector3(1, -1, 0), - btVector3(1, 0, -1), - btVector3(0, 1, -1), - btVector3(1, 1, 1), - btVector3(1, -1, 1), - btVector3(1, 1, -1), - btVector3(1, -1, -1)}; - -static inline int getSign(const btVector3& n, const btVector3& x) -{ - btScalar d = n.dot(x); - if (d > SIMD_EPSILON) - return 1; - if (d < -SIMD_EPSILON) - return -1; - return 0; -} - -static SIMD_FORCE_INLINE bool hasSeparatingPlane(const btSoftBody::Face* face, const btSoftBody::Node* node, const btScalar& dt) -{ - btVector3 hex[6] = {face->m_n[0]->m_x - node->m_x, - face->m_n[1]->m_x - node->m_x, - face->m_n[2]->m_x - node->m_x, - face->m_n[0]->m_x + dt * face->m_n[0]->m_v - node->m_x, - face->m_n[1]->m_x + dt * face->m_n[1]->m_v - node->m_x, - face->m_n[2]->m_x + dt * face->m_n[2]->m_v - node->m_x}; - btVector3 segment = dt * node->m_v; - for (int i = 0; i < KDOP_COUNT; ++i) - { - int s = getSign(dop[i], segment); - int j = 0; - for (; j < 6; ++j) - { - if (getSign(dop[i], hex[j]) == s) - break; - } - if (j == 6) - return true; - } - return false; -} - -static SIMD_FORCE_INLINE bool nearZero(const btScalar& a) -{ - return (a > -SAFE_EPSILON && a < SAFE_EPSILON); -} -static SIMD_FORCE_INLINE bool sameSign(const btScalar& a, const btScalar& b) -{ - return (nearZero(a) || nearZero(b) || (a > SAFE_EPSILON && b > SAFE_EPSILON) || (a < -SAFE_EPSILON && b < -SAFE_EPSILON)); -} -static SIMD_FORCE_INLINE bool diffSign(const btScalar& a, const btScalar& b) -{ - return !sameSign(a, b); -} -inline btScalar evaluateBezier2(const btScalar& p0, const btScalar& p1, const btScalar& p2, const btScalar& t, const btScalar& s) -{ - btScalar s2 = s * s; - btScalar t2 = t * t; - - return p0 * s2 + p1 * btScalar(2.0) * s * t + p2 * t2; -} -inline btScalar evaluateBezier(const btScalar& p0, const btScalar& p1, const btScalar& p2, const btScalar& p3, const btScalar& t, const btScalar& s) -{ - btScalar s2 = s * s; - btScalar s3 = s2 * s; - btScalar t2 = t * t; - btScalar t3 = t2 * t; - - return p0 * s3 + p1 * btScalar(3.0) * s2 * t + p2 * btScalar(3.0) * s * t2 + p3 * t3; -} -static SIMD_FORCE_INLINE bool getSigns(bool type_c, const btScalar& k0, const btScalar& k1, const btScalar& k2, const btScalar& k3, const btScalar& t0, const btScalar& t1, btScalar& lt0, btScalar& lt1) -{ - if (sameSign(t0, t1)) - { - lt0 = t0; - lt1 = t0; - return true; - } - - if (type_c || diffSign(k0, k3)) - { - btScalar ft = evaluateBezier(k0, k1, k2, k3, t0, -t1); - if (t0 < -0) - ft = -ft; - - if (sameSign(ft, k0)) - { - lt0 = t1; - lt1 = t1; - } - else - { - lt0 = t0; - lt1 = t0; - } - return true; - } - - if (!type_c) - { - btScalar ft = evaluateBezier(k0, k1, k2, k3, t0, -t1); - if (t0 < -0) - ft = -ft; - - if (diffSign(ft, k0)) - { - lt0 = t0; - lt1 = t1; - return true; - } - - btScalar fk = evaluateBezier2(k1 - k0, k2 - k1, k3 - k2, t0, -t1); - - if (sameSign(fk, k1 - k0)) - lt0 = lt1 = t1; - else - lt0 = lt1 = t0; - - return true; - } - return false; -} - -static SIMD_FORCE_INLINE void getBernsteinCoeff(const btSoftBody::Face* face, const btSoftBody::Node* node, const btScalar& dt, btScalar& k0, btScalar& k1, btScalar& k2, btScalar& k3) -{ - const btVector3& n0 = face->m_n0; - const btVector3& n1 = face->m_n1; - btVector3 n_hat = n0 + n1 - face->m_vn; - btVector3 p0ma0 = node->m_x - face->m_n[0]->m_x; - btVector3 p1ma1 = node->m_q - face->m_n[0]->m_q; - k0 = (p0ma0).dot(n0) * 3.0; - k1 = (p0ma0).dot(n_hat) + (p1ma1).dot(n0); - k2 = (p1ma1).dot(n_hat) + (p0ma0).dot(n1); - k3 = (p1ma1).dot(n1) * 3.0; -} - -static SIMD_FORCE_INLINE void polyDecomposition(const btScalar& k0, const btScalar& k1, const btScalar& k2, const btScalar& k3, const btScalar& j0, const btScalar& j1, const btScalar& j2, btScalar& u0, btScalar& u1, btScalar& v0, btScalar& v1) -{ - btScalar denom = 4.0 * (j1 - j2) * (j1 - j0) + (j2 - j0) * (j2 - j0); - u0 = (2.0 * (j1 - j2) * (3.0 * k1 - 2.0 * k0 - k3) - (j0 - j2) * (3.0 * k2 - 2.0 * k3 - k0)) / denom; - u1 = (2.0 * (j1 - j0) * (3.0 * k2 - 2.0 * k3 - k0) - (j2 - j0) * (3.0 * k1 - 2.0 * k0 - k3)) / denom; - v0 = k0 - u0 * j0; - v1 = k3 - u1 * j2; -} - -static SIMD_FORCE_INLINE bool rootFindingLemma(const btScalar& k0, const btScalar& k1, const btScalar& k2, const btScalar& k3) -{ - btScalar u0, u1, v0, v1; - btScalar j0 = 3.0 * (k1 - k0); - btScalar j1 = 3.0 * (k2 - k1); - btScalar j2 = 3.0 * (k3 - k2); - polyDecomposition(k0, k1, k2, k3, j0, j1, j2, u0, u1, v0, v1); - if (sameSign(v0, v1)) - { - btScalar Ypa = j0 * (1.0 - v0) * (1.0 - v0) + 2.0 * j1 * v0 * (1.0 - v0) + j2 * v0 * v0; // Y'(v0) - if (sameSign(Ypa, j0)) - { - return (diffSign(k0, v1)); - } - } - return diffSign(k0, v0); -} - -static SIMD_FORCE_INLINE void getJs(const btScalar& k0, const btScalar& k1, const btScalar& k2, const btScalar& k3, const btSoftBody::Node* a, const btSoftBody::Node* b, const btSoftBody::Node* c, const btSoftBody::Node* p, const btScalar& dt, btScalar& j0, btScalar& j1, btScalar& j2) -{ - const btVector3& a0 = a->m_x; - const btVector3& b0 = b->m_x; - const btVector3& c0 = c->m_x; - const btVector3& va = a->m_v; - const btVector3& vb = b->m_v; - const btVector3& vc = c->m_v; - const btVector3 a1 = a0 + dt * va; - const btVector3 b1 = b0 + dt * vb; - const btVector3 c1 = c0 + dt * vc; - btVector3 n0 = (b0 - a0).cross(c0 - a0); - btVector3 n1 = (b1 - a1).cross(c1 - a1); - btVector3 n_hat = n0 + n1 - dt * dt * (vb - va).cross(vc - va); - const btVector3& p0 = p->m_x; - const btVector3& vp = p->m_v; - btVector3 p1 = p0 + dt * vp; - btVector3 m0 = (b0 - p0).cross(c0 - p0); - btVector3 m1 = (b1 - p1).cross(c1 - p1); - btVector3 m_hat = m0 + m1 - dt * dt * (vb - vp).cross(vc - vp); - btScalar l0 = m0.dot(n0); - btScalar l1 = 0.25 * (m0.dot(n_hat) + m_hat.dot(n0)); - btScalar l2 = btScalar(1) / btScalar(6) * (m0.dot(n1) + m_hat.dot(n_hat) + m1.dot(n0)); - btScalar l3 = 0.25 * (m_hat.dot(n1) + m1.dot(n_hat)); - btScalar l4 = m1.dot(n1); - - btScalar k1p = 0.25 * k0 + 0.75 * k1; - btScalar k2p = 0.5 * k1 + 0.5 * k2; - btScalar k3p = 0.75 * k2 + 0.25 * k3; - - btScalar s0 = (l1 * k0 - l0 * k1p) * 4.0; - btScalar s1 = (l2 * k0 - l0 * k2p) * 2.0; - btScalar s2 = (l3 * k0 - l0 * k3p) * btScalar(4) / btScalar(3); - btScalar s3 = l4 * k0 - l0 * k3; - - j0 = (s1 * k0 - s0 * k1) * 3.0; - j1 = (s2 * k0 - s0 * k2) * 1.5; - j2 = (s3 * k0 - s0 * k3); -} - -static SIMD_FORCE_INLINE bool signDetermination1Internal(const btScalar& k0, const btScalar& k1, const btScalar& k2, const btScalar& k3, const btScalar& u0, const btScalar& u1, const btScalar& v0, const btScalar& v1) -{ - btScalar Yu0 = k0 * (1.0 - u0) * (1.0 - u0) * (1.0 - u0) + 3.0 * k1 * u0 * (1.0 - u0) * (1.0 - u0) + 3.0 * k2 * u0 * u0 * (1.0 - u0) + k3 * u0 * u0 * u0; // Y(u0) - btScalar Yv0 = k0 * (1.0 - v0) * (1.0 - v0) * (1.0 - v0) + 3.0 * k1 * v0 * (1.0 - v0) * (1.0 - v0) + 3.0 * k2 * v0 * v0 * (1.0 - v0) + k3 * v0 * v0 * v0; // Y(v0) - - btScalar sign_Ytp = (u0 > u1) ? Yu0 : -Yu0; - btScalar L = sameSign(sign_Ytp, k0) ? u1 : u0; - sign_Ytp = (v0 > v1) ? Yv0 : -Yv0; - btScalar K = (sameSign(sign_Ytp, k0)) ? v1 : v0; - return diffSign(L, K); -} - -static SIMD_FORCE_INLINE bool signDetermination2Internal(const btScalar& k0, const btScalar& k1, const btScalar& k2, const btScalar& k3, const btScalar& j0, const btScalar& j1, const btScalar& j2, const btScalar& u0, const btScalar& u1, const btScalar& v0, const btScalar& v1) -{ - btScalar Yu0 = k0 * (1.0 - u0) * (1.0 - u0) * (1.0 - u0) + 3.0 * k1 * u0 * (1.0 - u0) * (1.0 - u0) + 3.0 * k2 * u0 * u0 * (1.0 - u0) + k3 * u0 * u0 * u0; // Y(u0) - btScalar sign_Ytp = (u0 > u1) ? Yu0 : -Yu0, L1, L2; - if (diffSign(sign_Ytp, k0)) - { - L1 = u0; - L2 = u1; - } - else - { - btScalar Yp_u0 = j0 * (1.0 - u0) * (1.0 - u0) + 2.0 * j1 * (1.0 - u0) * u0 + j2 * u0 * u0; - if (sameSign(Yp_u0, j0)) - { - L1 = u1; - L2 = u1; - } - else - { - L1 = u0; - L2 = u0; - } - } - btScalar Yv0 = k0 * (1.0 - v0) * (1.0 - v0) * (1.0 - v0) + 3.0 * k1 * v0 * (1.0 - v0) * (1.0 - v0) + 3.0 * k2 * v0 * v0 * (1.0 - v0) + k3 * v0 * v0 * v0; // Y(uv0) - sign_Ytp = (v0 > v1) ? Yv0 : -Yv0; - btScalar K1, K2; - if (diffSign(sign_Ytp, k0)) - { - K1 = v0; - K2 = v1; - } - else - { - btScalar Yp_v0 = j0 * (1.0 - v0) * (1.0 - v0) + 2.0 * j1 * (1.0 - v0) * v0 + j2 * v0 * v0; - if (sameSign(Yp_v0, j0)) - { - K1 = v1; - K2 = v1; - } - else - { - K1 = v0; - K2 = v0; - } - } - return (diffSign(K1, L1) || diffSign(L2, K2)); -} - -static SIMD_FORCE_INLINE bool signDetermination1(const btScalar& k0, const btScalar& k1, const btScalar& k2, const btScalar& k3, const btSoftBody::Face* face, const btSoftBody::Node* node, const btScalar& dt) -{ - btScalar j0, j1, j2, u0, u1, v0, v1; - // p1 - getJs(k0, k1, k2, k3, face->m_n[0], face->m_n[1], face->m_n[2], node, dt, j0, j1, j2); - if (nearZero(j0 + j2 - j1 * 2.0)) - { - btScalar lt0, lt1; - getSigns(true, k0, k1, k2, k3, j0, j2, lt0, lt1); - if (lt0 < -SAFE_EPSILON) - return false; - } - else - { - polyDecomposition(k0, k1, k2, k3, j0, j1, j2, u0, u1, v0, v1); - if (!signDetermination1Internal(k0, k1, k2, k3, u0, u1, v0, v1)) - return false; - } - // p2 - getJs(k0, k1, k2, k3, face->m_n[1], face->m_n[2], face->m_n[0], node, dt, j0, j1, j2); - if (nearZero(j0 + j2 - j1 * 2.0)) - { - btScalar lt0, lt1; - getSigns(true, k0, k1, k2, k3, j0, j2, lt0, lt1); - if (lt0 < -SAFE_EPSILON) - return false; - } - else - { - polyDecomposition(k0, k1, k2, k3, j0, j1, j2, u0, u1, v0, v1); - if (!signDetermination1Internal(k0, k1, k2, k3, u0, u1, v0, v1)) - return false; - } - // p3 - getJs(k0, k1, k2, k3, face->m_n[2], face->m_n[0], face->m_n[1], node, dt, j0, j1, j2); - if (nearZero(j0 + j2 - j1 * 2.0)) - { - btScalar lt0, lt1; - getSigns(true, k0, k1, k2, k3, j0, j2, lt0, lt1); - if (lt0 < -SAFE_EPSILON) - return false; - } - else - { - polyDecomposition(k0, k1, k2, k3, j0, j1, j2, u0, u1, v0, v1); - if (!signDetermination1Internal(k0, k1, k2, k3, u0, u1, v0, v1)) - return false; - } - return true; -} - -static SIMD_FORCE_INLINE bool signDetermination2(const btScalar& k0, const btScalar& k1, const btScalar& k2, const btScalar& k3, const btSoftBody::Face* face, const btSoftBody::Node* node, const btScalar& dt) -{ - btScalar j0, j1, j2, u0, u1, v0, v1; - // p1 - getJs(k0, k1, k2, k3, face->m_n[0], face->m_n[1], face->m_n[2], node, dt, j0, j1, j2); - if (nearZero(j0 + j2 - j1 * 2.0)) - { - btScalar lt0, lt1; - bool bt0 = true, bt1 = true; - getSigns(false, k0, k1, k2, k3, j0, j2, lt0, lt1); - if (lt0 < -SAFE_EPSILON) - bt0 = false; - if (lt1 < -SAFE_EPSILON) - bt1 = false; - if (!bt0 && !bt1) - return false; - } - else - { - polyDecomposition(k0, k1, k2, k3, j0, j1, j2, u0, u1, v0, v1); - if (!signDetermination2Internal(k0, k1, k2, k3, j0, j1, j2, u0, u1, v0, v1)) - return false; - } - // p2 - getJs(k0, k1, k2, k3, face->m_n[1], face->m_n[2], face->m_n[0], node, dt, j0, j1, j2); - if (nearZero(j0 + j2 - j1 * 2.0)) - { - btScalar lt0, lt1; - bool bt0 = true, bt1 = true; - getSigns(false, k0, k1, k2, k3, j0, j2, lt0, lt1); - if (lt0 < -SAFE_EPSILON) - bt0 = false; - if (lt1 < -SAFE_EPSILON) - bt1 = false; - if (!bt0 && !bt1) - return false; - } - else - { - polyDecomposition(k0, k1, k2, k3, j0, j1, j2, u0, u1, v0, v1); - if (!signDetermination2Internal(k0, k1, k2, k3, j0, j1, j2, u0, u1, v0, v1)) - return false; - } - // p3 - getJs(k0, k1, k2, k3, face->m_n[2], face->m_n[0], face->m_n[1], node, dt, j0, j1, j2); - if (nearZero(j0 + j2 - j1 * 2.0)) - { - btScalar lt0, lt1; - bool bt0 = true, bt1 = true; - getSigns(false, k0, k1, k2, k3, j0, j2, lt0, lt1); - if (lt0 < -SAFE_EPSILON) - bt0 = false; - if (lt1 < -SAFE_EPSILON) - bt1 = false; - if (!bt0 && !bt1) - return false; - } - else - { - polyDecomposition(k0, k1, k2, k3, j0, j1, j2, u0, u1, v0, v1); - if (!signDetermination2Internal(k0, k1, k2, k3, j0, j1, j2, u0, u1, v0, v1)) - return false; - } - return true; -} - -static SIMD_FORCE_INLINE bool coplanarAndInsideTest(const btScalar& k0, const btScalar& k1, const btScalar& k2, const btScalar& k3, const btSoftBody::Face* face, const btSoftBody::Node* node, const btScalar& dt) -{ - // Coplanar test - if (diffSign(k1 - k0, k3 - k2)) - { - // Case b: - if (sameSign(k0, k3) && !rootFindingLemma(k0, k1, k2, k3)) - return false; - // inside test - return signDetermination2(k0, k1, k2, k3, face, node, dt); - } - else - { - // Case c: - if (sameSign(k0, k3)) - return false; - // inside test - return signDetermination1(k0, k1, k2, k3, face, node, dt); - } - return false; -} -static SIMD_FORCE_INLINE bool conservativeCulling(const btScalar& k0, const btScalar& k1, const btScalar& k2, const btScalar& k3, const btScalar& mrg) -{ - if (k0 > mrg && k1 > mrg && k2 > mrg && k3 > mrg) - return true; - if (k0 < -mrg && k1 < -mrg && k2 < -mrg && k3 < -mrg) - return true; - return false; -} - -static SIMD_FORCE_INLINE bool bernsteinVFTest(const btScalar& k0, const btScalar& k1, const btScalar& k2, const btScalar& k3, const btScalar& mrg, const btSoftBody::Face* face, const btSoftBody::Node* node, const btScalar& dt) -{ - if (conservativeCulling(k0, k1, k2, k3, mrg)) - return false; - return coplanarAndInsideTest(k0, k1, k2, k3, face, node, dt); -} - -static SIMD_FORCE_INLINE void deCasteljau(const btScalar& k0, const btScalar& k1, const btScalar& k2, const btScalar& k3, const btScalar& t0, btScalar& k10, btScalar& k20, btScalar& k30, btScalar& k21, btScalar& k12) -{ - k10 = k0 * (1.0 - t0) + k1 * t0; - btScalar k11 = k1 * (1.0 - t0) + k2 * t0; - k12 = k2 * (1.0 - t0) + k3 * t0; - k20 = k10 * (1.0 - t0) + k11 * t0; - k21 = k11 * (1.0 - t0) + k12 * t0; - k30 = k20 * (1.0 - t0) + k21 * t0; -} -static SIMD_FORCE_INLINE bool bernsteinVFTest(const btSoftBody::Face* face, const btSoftBody::Node* node, const btScalar& dt, const btScalar& mrg) -{ - btScalar k0, k1, k2, k3; - getBernsteinCoeff(face, node, dt, k0, k1, k2, k3); - if (conservativeCulling(k0, k1, k2, k3, mrg)) - return false; - return true; - if (diffSign(k2 - 2.0 * k1 + k0, k3 - 2.0 * k2 + k1)) - { - btScalar k10, k20, k30, k21, k12; - btScalar t0 = (k2 - 2.0 * k1 + k0) / (k0 - 3.0 * k1 + 3.0 * k2 - k3); - deCasteljau(k0, k1, k2, k3, t0, k10, k20, k30, k21, k12); - return bernsteinVFTest(k0, k10, k20, k30, mrg, face, node, dt) || bernsteinVFTest(k30, k21, k12, k3, mrg, face, node, dt); - } - return coplanarAndInsideTest(k0, k1, k2, k3, face, node, dt); -} - -static SIMD_FORCE_INLINE bool continuousCollisionDetection(const btSoftBody::Face* face, const btSoftBody::Node* node, const btScalar& dt, const btScalar& mrg, btVector3& bary) -{ - if (hasSeparatingPlane(face, node, dt)) - return false; - btVector3 x21 = face->m_n[1]->m_x - face->m_n[0]->m_x; - btVector3 x31 = face->m_n[2]->m_x - face->m_n[0]->m_x; - btVector3 x41 = node->m_x - face->m_n[0]->m_x; - btVector3 v21 = face->m_n[1]->m_v - face->m_n[0]->m_v; - btVector3 v31 = face->m_n[2]->m_v - face->m_n[0]->m_v; - btVector3 v41 = node->m_v - face->m_n[0]->m_v; - btVector3 a = x21.cross(x31); - btVector3 b = x21.cross(v31) + v21.cross(x31); - btVector3 c = v21.cross(v31); - btVector3 d = x41; - btVector3 e = v41; - btScalar a0 = a.dot(d); - btScalar a1 = a.dot(e) + b.dot(d); - btScalar a2 = c.dot(d) + b.dot(e); - btScalar a3 = c.dot(e); - btScalar eps = SAFE_EPSILON; - int num_roots = 0; - btScalar roots[3]; - if (std::abs(a3) < eps) - { - // cubic term is zero - if (std::abs(a2) < eps) - { - if (std::abs(a1) < eps) - { - if (std::abs(a0) < eps) - { - num_roots = 2; - roots[0] = 0; - roots[1] = dt; - } - } - else - { - num_roots = 1; - roots[0] = -a0 / a1; - } - } - else - { - num_roots = SolveP2(roots, a1 / a2, a0 / a2); - } - } - else - { - num_roots = SolveP3(roots, a2 / a3, a1 / a3, a0 / a3); - } - // std::sort(roots, roots+num_roots); - if (num_roots > 1) - { - if (roots[0] > roots[1]) - btSwap(roots[0], roots[1]); - } - if (num_roots > 2) - { - if (roots[0] > roots[2]) - btSwap(roots[0], roots[2]); - if (roots[1] > roots[2]) - btSwap(roots[1], roots[2]); - } - for (int r = 0; r < num_roots; ++r) - { - double root = roots[r]; - if (root <= 0) - continue; - if (root > dt + SIMD_EPSILON) - return false; - btVector3 x1 = face->m_n[0]->m_x + root * face->m_n[0]->m_v; - btVector3 x2 = face->m_n[1]->m_x + root * face->m_n[1]->m_v; - btVector3 x3 = face->m_n[2]->m_x + root * face->m_n[2]->m_v; - btVector3 x4 = node->m_x + root * node->m_v; - btVector3 normal = (x2 - x1).cross(x3 - x1); - normal.safeNormalize(); - if (proximityTest(x1, x2, x3, x4, normal, mrg, bary)) - return true; - } - return false; -} -static SIMD_FORCE_INLINE bool bernsteinCCD(const btSoftBody::Face* face, const btSoftBody::Node* node, const btScalar& dt, const btScalar& mrg, btVector3& bary) -{ - if (!bernsteinVFTest(face, node, dt, mrg)) - return false; - if (!continuousCollisionDetection(face, node, dt, 1e-6, bary)) - return false; - return true; -} - -// -// btSymMatrix -// -template -struct btSymMatrix -{ - btSymMatrix() : dim(0) {} - btSymMatrix(int n, const T& init = T()) { resize(n, init); } - void resize(int n, const T& init = T()) - { - dim = n; - store.resize((n * (n + 1)) / 2, init); - } - int index(int c, int r) const - { - if (c > r) btSwap(c, r); - btAssert(r < dim); - return ((r * (r + 1)) / 2 + c); - } - T& operator()(int c, int r) { return (store[index(c, r)]); } - const T& operator()(int c, int r) const { return (store[index(c, r)]); } - btAlignedObjectArray store; - int dim; -}; - -// -// btSoftBodyCollisionShape -// -class btSoftBodyCollisionShape : public btConcaveShape -{ -public: - btSoftBody* m_body; - - btSoftBodyCollisionShape(btSoftBody* backptr) - { - m_shapeType = SOFTBODY_SHAPE_PROXYTYPE; - m_body = backptr; - } - - virtual ~btSoftBodyCollisionShape() - { - } - - 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 is usually identity, except when colliding against btCompoundShape. See Issue 512 */ - const btVector3 mins = m_body->m_bounds[0]; - const btVector3 maxs = m_body->m_bounds[1]; - 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 - } - 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 "SoftBody"; - } -}; - -// -// btSoftClusterCollisionShape -// -class btSoftClusterCollisionShape : public btConvexInternalShape -{ -public: - const btSoftBody::Cluster* m_cluster; - - btSoftClusterCollisionShape(const btSoftBody::Cluster* cluster) : m_cluster(cluster) { setMargin(0); } - - virtual btVector3 localGetSupportingVertex(const btVector3& vec) const - { - btSoftBody::Node* const* n = &m_cluster->m_nodes[0]; - btScalar d = btDot(vec, n[0]->m_x); - int j = 0; - for (int i = 1, ni = m_cluster->m_nodes.size(); i < ni; ++i) - { - const btScalar k = btDot(vec, n[i]->m_x); - if (k > d) - { - d = k; - j = i; - } - } - return (n[j]->m_x); - } - virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec) const - { - return (localGetSupportingVertex(vec)); - } - //notice that the vectors should be unit length - virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const - { - } - - virtual void calculateLocalInertia(btScalar mass, btVector3& inertia) const - { - } - - virtual void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const - { - } - - virtual int getShapeType() const { return SOFTBODY_SHAPE_PROXYTYPE; } - - //debugging - virtual const char* getName() const { return "SOFTCLUSTER"; } - - virtual void setMargin(btScalar margin) - { - btConvexInternalShape::setMargin(margin); - } - virtual btScalar getMargin() const - { - return btConvexInternalShape::getMargin(); - } -}; - -// -// Inline's -// - -// -template -static inline void ZeroInitialize(T& value) -{ - memset(&value, 0, sizeof(T)); -} -// -template -static inline bool CompLess(const T& a, const T& b) -{ - return (a < b); -} -// -template -static inline bool CompGreater(const T& a, const T& b) -{ - return (a > b); -} -// -template -static inline T Lerp(const T& a, const T& b, btScalar t) -{ - return (a + (b - a) * t); -} -// -template -static inline T InvLerp(const T& a, const T& b, btScalar t) -{ - return ((b + a * t - b * t) / (a * b)); -} -// -static inline btMatrix3x3 Lerp(const btMatrix3x3& a, - const btMatrix3x3& b, - btScalar t) -{ - btMatrix3x3 r; - r[0] = Lerp(a[0], b[0], t); - r[1] = Lerp(a[1], b[1], t); - r[2] = Lerp(a[2], b[2], t); - return (r); -} -// -static inline btVector3 Clamp(const btVector3& v, btScalar maxlength) -{ - const btScalar sql = v.length2(); - if (sql > (maxlength * maxlength)) - return ((v * maxlength) / btSqrt(sql)); - else - return (v); -} -// -template -static inline T Clamp(const T& x, const T& l, const T& h) -{ - return (x < l ? l : x > h ? h : x); -} -// -template -static inline T Sq(const T& x) -{ - return (x * x); -} -// -template -static inline T Cube(const T& x) -{ - return (x * x * x); -} -// -template -static inline T Sign(const T& x) -{ - return ((T)(x < 0 ? -1 : +1)); -} -// -template -static inline bool SameSign(const T& x, const T& y) -{ - return ((x * y) > 0); -} -// -static inline btScalar ClusterMetric(const btVector3& x, const btVector3& y) -{ - const btVector3 d = x - y; - return (btFabs(d[0]) + btFabs(d[1]) + btFabs(d[2])); -} -// -static inline btMatrix3x3 ScaleAlongAxis(const btVector3& a, btScalar s) -{ - const btScalar xx = a.x() * a.x(); - const btScalar yy = a.y() * a.y(); - const btScalar zz = a.z() * a.z(); - const btScalar xy = a.x() * a.y(); - const btScalar yz = a.y() * a.z(); - const btScalar zx = a.z() * a.x(); - btMatrix3x3 m; - m[0] = btVector3(1 - xx + xx * s, xy * s - xy, zx * s - zx); - m[1] = btVector3(xy * s - xy, 1 - yy + yy * s, yz * s - yz); - m[2] = btVector3(zx * s - zx, yz * s - yz, 1 - zz + zz * s); - return (m); -} -// -static inline btMatrix3x3 Cross(const btVector3& v) -{ - btMatrix3x3 m; - m[0] = btVector3(0, -v.z(), +v.y()); - m[1] = btVector3(+v.z(), 0, -v.x()); - m[2] = btVector3(-v.y(), +v.x(), 0); - return (m); -} -// -static inline btMatrix3x3 Diagonal(btScalar x) -{ - btMatrix3x3 m; - m[0] = btVector3(x, 0, 0); - m[1] = btVector3(0, x, 0); - m[2] = btVector3(0, 0, x); - return (m); -} - -static inline btMatrix3x3 Diagonal(const btVector3& v) -{ - btMatrix3x3 m; - m[0] = btVector3(v.getX(), 0, 0); - m[1] = btVector3(0, v.getY(), 0); - m[2] = btVector3(0, 0, v.getZ()); - return (m); -} - -static inline btScalar Dot(const btScalar* a, const btScalar* b, int ndof) -{ - btScalar result = 0; - for (int i = 0; i < ndof; ++i) - result += a[i] * b[i]; - return result; -} - -static inline btMatrix3x3 OuterProduct(const btScalar* v1, const btScalar* v2, const btScalar* v3, - const btScalar* u1, const btScalar* u2, const btScalar* u3, int ndof) -{ - btMatrix3x3 m; - btScalar a11 = Dot(v1, u1, ndof); - btScalar a12 = Dot(v1, u2, ndof); - btScalar a13 = Dot(v1, u3, ndof); - - btScalar a21 = Dot(v2, u1, ndof); - btScalar a22 = Dot(v2, u2, ndof); - btScalar a23 = Dot(v2, u3, ndof); - - btScalar a31 = Dot(v3, u1, ndof); - btScalar a32 = Dot(v3, u2, ndof); - btScalar a33 = Dot(v3, u3, ndof); - m[0] = btVector3(a11, a12, a13); - m[1] = btVector3(a21, a22, a23); - m[2] = btVector3(a31, a32, a33); - return (m); -} - -static inline btMatrix3x3 OuterProduct(const btVector3& v1, const btVector3& v2) -{ - btMatrix3x3 m; - btScalar a11 = v1[0] * v2[0]; - btScalar a12 = v1[0] * v2[1]; - btScalar a13 = v1[0] * v2[2]; - - btScalar a21 = v1[1] * v2[0]; - btScalar a22 = v1[1] * v2[1]; - btScalar a23 = v1[1] * v2[2]; - - btScalar a31 = v1[2] * v2[0]; - btScalar a32 = v1[2] * v2[1]; - btScalar a33 = v1[2] * v2[2]; - m[0] = btVector3(a11, a12, a13); - m[1] = btVector3(a21, a22, a23); - m[2] = btVector3(a31, a32, a33); - return (m); -} - -// -static inline btMatrix3x3 Add(const btMatrix3x3& a, - const btMatrix3x3& b) -{ - btMatrix3x3 r; - for (int i = 0; i < 3; ++i) r[i] = a[i] + b[i]; - return (r); -} -// -static inline btMatrix3x3 Sub(const btMatrix3x3& a, - const btMatrix3x3& b) -{ - btMatrix3x3 r; - for (int i = 0; i < 3; ++i) r[i] = a[i] - b[i]; - return (r); -} -// -static inline btMatrix3x3 Mul(const btMatrix3x3& a, - btScalar b) -{ - btMatrix3x3 r; - for (int i = 0; i < 3; ++i) r[i] = a[i] * b; - return (r); -} -// -static inline void Orthogonalize(btMatrix3x3& m) -{ - m[2] = btCross(m[0], m[1]).normalized(); - m[1] = btCross(m[2], m[0]).normalized(); - m[0] = btCross(m[1], m[2]).normalized(); -} -// -static inline btMatrix3x3 MassMatrix(btScalar im, const btMatrix3x3& iwi, const btVector3& r) -{ - const btMatrix3x3 cr = Cross(r); - return (Sub(Diagonal(im), cr * iwi * cr)); -} - -// -static inline btMatrix3x3 ImpulseMatrix(btScalar dt, - btScalar ima, - btScalar imb, - const btMatrix3x3& iwi, - const btVector3& r) -{ - return (Diagonal(1 / dt) * Add(Diagonal(ima), MassMatrix(imb, iwi, r)).inverse()); -} - -// -static inline btMatrix3x3 ImpulseMatrix(btScalar dt, - const btMatrix3x3& effective_mass_inv, - btScalar imb, - const btMatrix3x3& iwi, - const btVector3& r) -{ - return (Diagonal(1 / dt) * Add(effective_mass_inv, MassMatrix(imb, iwi, r)).inverse()); - // btMatrix3x3 iimb = MassMatrix(imb, iwi, r); - // if (iimb.determinant() == 0) - // return effective_mass_inv.inverse(); - // return effective_mass_inv.inverse() * Add(effective_mass_inv.inverse(), iimb.inverse()).inverse() * iimb.inverse(); -} - -// -static inline btMatrix3x3 ImpulseMatrix(btScalar ima, const btMatrix3x3& iia, const btVector3& ra, - btScalar imb, const btMatrix3x3& iib, const btVector3& rb) -{ - return (Add(MassMatrix(ima, iia, ra), MassMatrix(imb, iib, rb)).inverse()); -} - -// -static inline btMatrix3x3 AngularImpulseMatrix(const btMatrix3x3& iia, - const btMatrix3x3& iib) -{ - return (Add(iia, iib).inverse()); -} - -// -static inline btVector3 ProjectOnAxis(const btVector3& v, - const btVector3& a) -{ - return (a * btDot(v, a)); -} -// -static inline btVector3 ProjectOnPlane(const btVector3& v, - const btVector3& a) -{ - return (v - ProjectOnAxis(v, a)); -} - -// -static inline void ProjectOrigin(const btVector3& a, - const btVector3& b, - btVector3& prj, - btScalar& sqd) -{ - const btVector3 d = b - a; - const btScalar m2 = d.length2(); - if (m2 > SIMD_EPSILON) - { - const btScalar t = Clamp(-btDot(a, d) / m2, 0, 1); - const btVector3 p = a + d * t; - const btScalar l2 = p.length2(); - if (l2 < sqd) - { - prj = p; - sqd = l2; - } - } -} -// -static inline void ProjectOrigin(const btVector3& a, - const btVector3& b, - const btVector3& c, - btVector3& prj, - btScalar& sqd) -{ - const btVector3& q = btCross(b - a, c - a); - const btScalar m2 = q.length2(); - if (m2 > SIMD_EPSILON) - { - const btVector3 n = q / btSqrt(m2); - const btScalar k = btDot(a, n); - const btScalar k2 = k * k; - if (k2 < sqd) - { - const btVector3 p = n * k; - if ((btDot(btCross(a - p, b - p), q) > 0) && - (btDot(btCross(b - p, c - p), q) > 0) && - (btDot(btCross(c - p, a - p), q) > 0)) - { - prj = p; - sqd = k2; - } - else - { - ProjectOrigin(a, b, prj, sqd); - ProjectOrigin(b, c, prj, sqd); - ProjectOrigin(c, a, prj, sqd); - } - } - } -} - -// -static inline bool rayIntersectsTriangle(const btVector3& origin, const btVector3& dir, const btVector3& v0, const btVector3& v1, const btVector3& v2, btScalar& t) -{ - btScalar a, f, u, v; - - btVector3 e1 = v1 - v0; - btVector3 e2 = v2 - v0; - btVector3 h = dir.cross(e2); - a = e1.dot(h); - - if (a > -0.00001 && a < 0.00001) - return (false); - - f = btScalar(1) / a; - btVector3 s = origin - v0; - u = f * s.dot(h); - - if (u < 0.0 || u > 1.0) - return (false); - - btVector3 q = s.cross(e1); - v = f * dir.dot(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 * e2.dot(q); - if (t > 0) // ray intersection - return (true); - else // this means that there is a line intersection - // but not a ray intersection - return (false); -} - -static inline bool lineIntersectsTriangle(const btVector3& rayStart, const btVector3& rayEnd, const btVector3& p1, const btVector3& p2, const btVector3& p3, btVector3& sect, btVector3& normal) -{ - btVector3 dir = rayEnd - rayStart; - btScalar dir_norm = dir.norm(); - if (dir_norm < SIMD_EPSILON) - return false; - dir.normalize(); - btScalar t; - bool ret = rayIntersectsTriangle(rayStart, dir, p1, p2, p3, t); - - if (ret) - { - if (t <= dir_norm) - { - sect = rayStart + dir * t; - } - else - { - ret = false; - } - } - - if (ret) - { - btVector3 n = (p3 - p1).cross(p2 - p1); - n.safeNormalize(); - if (n.dot(dir) < 0) - normal = n; - else - normal = -n; - } - return ret; -} - -// -template -static inline T BaryEval(const T& a, - const T& b, - const T& c, - const btVector3& coord) -{ - return (a * coord.x() + b * coord.y() + c * coord.z()); -} -// -static inline btVector3 BaryCoord(const btVector3& a, - const btVector3& b, - const btVector3& c, - const btVector3& p) -{ - const btScalar w[] = {btCross(a - p, b - p).length(), - btCross(b - p, c - p).length(), - btCross(c - p, a - p).length()}; - const btScalar isum = 1 / (w[0] + w[1] + w[2]); - return (btVector3(w[1] * isum, w[2] * isum, w[0] * isum)); -} - -// -inline static btScalar ImplicitSolve(btSoftBody::ImplicitFn* fn, - const btVector3& a, - const btVector3& b, - const btScalar accuracy, - const int maxiterations = 256) -{ - btScalar span[2] = {0, 1}; - btScalar values[2] = {fn->Eval(a), fn->Eval(b)}; - if (values[0] > values[1]) - { - btSwap(span[0], span[1]); - btSwap(values[0], values[1]); - } - if (values[0] > -accuracy) return (-1); - if (values[1] < +accuracy) return (-1); - for (int i = 0; i < maxiterations; ++i) - { - const btScalar t = Lerp(span[0], span[1], values[0] / (values[0] - values[1])); - const btScalar v = fn->Eval(Lerp(a, b, t)); - if ((t <= 0) || (t >= 1)) break; - if (btFabs(v) < accuracy) return (t); - if (v < 0) - { - span[0] = t; - values[0] = v; - } - else - { - span[1] = t; - values[1] = v; - } - } - return (-1); -} - -inline static void EvaluateMedium(const btSoftBodyWorldInfo* wfi, - const btVector3& x, - btSoftBody::sMedium& medium) -{ - medium.m_velocity = btVector3(0, 0, 0); - medium.m_pressure = 0; - medium.m_density = wfi->air_density; - if (wfi->water_density > 0) - { - const btScalar depth = -(btDot(x, wfi->water_normal) + wfi->water_offset); - if (depth > 0) - { - medium.m_density = wfi->water_density; - medium.m_pressure = depth * wfi->water_density * wfi->m_gravity.length(); - } - } -} - -// -static inline btVector3 NormalizeAny(const btVector3& v) -{ - const btScalar l = v.length(); - if (l > SIMD_EPSILON) - return (v / l); - else - return (btVector3(0, 0, 0)); -} - -// -static inline btDbvtVolume VolumeOf(const btSoftBody::Face& f, - btScalar margin) -{ - const btVector3* pts[] = {&f.m_n[0]->m_x, - &f.m_n[1]->m_x, - &f.m_n[2]->m_x}; - btDbvtVolume vol = btDbvtVolume::FromPoints(pts, 3); - vol.Expand(btVector3(margin, margin, margin)); - return (vol); -} - -// -static inline btVector3 CenterOf(const btSoftBody::Face& f) -{ - return ((f.m_n[0]->m_x + f.m_n[1]->m_x + f.m_n[2]->m_x) / 3); -} - -// -static inline btScalar AreaOf(const btVector3& x0, - const btVector3& x1, - const btVector3& x2) -{ - const btVector3 a = x1 - x0; - const btVector3 b = x2 - x0; - const btVector3 cr = btCross(a, b); - const btScalar area = cr.length(); - return (area); -} - -// -static inline btScalar VolumeOf(const btVector3& x0, - const btVector3& x1, - const btVector3& x2, - const btVector3& x3) -{ - const btVector3 a = x1 - x0; - const btVector3 b = x2 - x0; - const btVector3 c = x3 - x0; - return (btDot(a, btCross(b, c))); -} - -// - -// -static inline void ApplyClampedForce(btSoftBody::Node& n, - const btVector3& f, - btScalar dt) -{ - const btScalar dtim = dt * n.m_im; - if ((f * dtim).length2() > n.m_v.length2()) - { /* Clamp */ - n.m_f -= ProjectOnAxis(n.m_v, f.normalized()) / dtim; - } - else - { /* Apply */ - n.m_f += f; - } -} - -// -static inline int MatchEdge(const btSoftBody::Node* a, - const btSoftBody::Node* b, - const btSoftBody::Node* ma, - const btSoftBody::Node* mb) -{ - if ((a == ma) && (b == mb)) return (0); - if ((a == mb) && (b == ma)) return (1); - return (-1); -} - -// -// btEigen : Extract eigen system, -// straitforward implementation of http://math.fullerton.edu/mathews/n2003/JacobiMethodMod.html -// outputs are NOT sorted. -// -struct btEigen -{ - static int system(btMatrix3x3& a, btMatrix3x3* vectors, btVector3* values = 0) - { - static const int maxiterations = 16; - static const btScalar accuracy = (btScalar)0.0001; - btMatrix3x3& v = *vectors; - int iterations = 0; - vectors->setIdentity(); - do - { - int p = 0, q = 1; - if (btFabs(a[p][q]) < btFabs(a[0][2])) - { - p = 0; - q = 2; - } - if (btFabs(a[p][q]) < btFabs(a[1][2])) - { - p = 1; - q = 2; - } - if (btFabs(a[p][q]) > accuracy) - { - const btScalar w = (a[q][q] - a[p][p]) / (2 * a[p][q]); - const btScalar z = btFabs(w); - const btScalar t = w / (z * (btSqrt(1 + w * w) + z)); - if (t == t) /* [WARNING] let hope that one does not get thrown aways by some compilers... */ - { - const btScalar c = 1 / btSqrt(t * t + 1); - const btScalar s = c * t; - mulPQ(a, c, s, p, q); - mulTPQ(a, c, s, p, q); - mulPQ(v, c, s, p, q); - } - else - break; - } - else - break; - } while ((++iterations) < maxiterations); - if (values) - { - *values = btVector3(a[0][0], a[1][1], a[2][2]); - } - return (iterations); - } - -private: - static inline void mulTPQ(btMatrix3x3& a, btScalar c, btScalar s, int p, int q) - { - const btScalar m[2][3] = {{a[p][0], a[p][1], a[p][2]}, - {a[q][0], a[q][1], a[q][2]}}; - int i; - - for (i = 0; i < 3; ++i) a[p][i] = c * m[0][i] - s * m[1][i]; - for (i = 0; i < 3; ++i) a[q][i] = c * m[1][i] + s * m[0][i]; - } - static inline void mulPQ(btMatrix3x3& a, btScalar c, btScalar s, int p, int q) - { - const btScalar m[2][3] = {{a[0][p], a[1][p], a[2][p]}, - {a[0][q], a[1][q], a[2][q]}}; - int i; - - for (i = 0; i < 3; ++i) a[i][p] = c * m[0][i] - s * m[1][i]; - for (i = 0; i < 3; ++i) a[i][q] = c * m[1][i] + s * m[0][i]; - } -}; - -// -// Polar decomposition, -// "Computing the Polar Decomposition with Applications", Nicholas J. Higham, 1986. -// -static inline int PolarDecompose(const btMatrix3x3& m, btMatrix3x3& q, btMatrix3x3& s) -{ - static const btPolarDecomposition polar; - return polar.decompose(m, q, s); -} - -// -// btSoftColliders -// -struct btSoftColliders -{ - // - // ClusterBase - // - struct ClusterBase : btDbvt::ICollide - { - btScalar erp; - btScalar idt; - btScalar m_margin; - btScalar friction; - btScalar threshold; - ClusterBase() - { - erp = (btScalar)1; - idt = 0; - m_margin = 0; - friction = 0; - threshold = (btScalar)0; - } - bool SolveContact(const btGjkEpaSolver2::sResults& res, - btSoftBody::Body ba, const btSoftBody::Body bb, - btSoftBody::CJoint& joint) - { - if (res.distance < m_margin) - { - btVector3 norm = res.normal; - norm.normalize(); //is it necessary? - - const btVector3 ra = res.witnesses[0] - ba.xform().getOrigin(); - const btVector3 rb = res.witnesses[1] - bb.xform().getOrigin(); - const btVector3 va = ba.velocity(ra); - const btVector3 vb = bb.velocity(rb); - const btVector3 vrel = va - vb; - const btScalar rvac = btDot(vrel, norm); - btScalar depth = res.distance - m_margin; - - // printf("depth=%f\n",depth); - const btVector3 iv = norm * rvac; - const btVector3 fv = vrel - iv; - joint.m_bodies[0] = ba; - joint.m_bodies[1] = bb; - joint.m_refs[0] = ra * ba.xform().getBasis(); - joint.m_refs[1] = rb * bb.xform().getBasis(); - joint.m_rpos[0] = ra; - joint.m_rpos[1] = rb; - joint.m_cfm = 1; - joint.m_erp = 1; - joint.m_life = 0; - joint.m_maxlife = 0; - joint.m_split = 1; - - joint.m_drift = depth * norm; - - joint.m_normal = norm; - // printf("normal=%f,%f,%f\n",res.normal.getX(),res.normal.getY(),res.normal.getZ()); - joint.m_delete = false; - joint.m_friction = fv.length2() < (rvac * friction * rvac * friction) ? 1 : friction; - joint.m_massmatrix = ImpulseMatrix(ba.invMass(), ba.invWorldInertia(), joint.m_rpos[0], - bb.invMass(), bb.invWorldInertia(), joint.m_rpos[1]); - - return (true); - } - return (false); - } - }; - // - // CollideCL_RS - // - struct CollideCL_RS : ClusterBase - { - btSoftBody* psb; - const btCollisionObjectWrapper* m_colObjWrap; - - void Process(const btDbvtNode* leaf) - { - btSoftBody::Cluster* cluster = (btSoftBody::Cluster*)leaf->data; - btSoftClusterCollisionShape cshape(cluster); - - const btConvexShape* rshape = (const btConvexShape*)m_colObjWrap->getCollisionShape(); - - ///don't collide an anchored cluster with a static/kinematic object - if (m_colObjWrap->getCollisionObject()->isStaticOrKinematicObject() && cluster->m_containsAnchor) - return; - - btGjkEpaSolver2::sResults res; - if (btGjkEpaSolver2::SignedDistance(&cshape, btTransform::getIdentity(), - rshape, m_colObjWrap->getWorldTransform(), - btVector3(1, 0, 0), res)) - { - btSoftBody::CJoint joint; - if (SolveContact(res, cluster, m_colObjWrap->getCollisionObject(), joint)) //prb,joint)) - { - btSoftBody::CJoint* pj = new (btAlignedAlloc(sizeof(btSoftBody::CJoint), 16)) btSoftBody::CJoint(); - *pj = joint; - psb->m_joints.push_back(pj); - if (m_colObjWrap->getCollisionObject()->isStaticOrKinematicObject()) - { - pj->m_erp *= psb->m_cfg.kSKHR_CL; - pj->m_split *= psb->m_cfg.kSK_SPLT_CL; - } - else - { - pj->m_erp *= psb->m_cfg.kSRHR_CL; - pj->m_split *= psb->m_cfg.kSR_SPLT_CL; - } - } - } - } - void ProcessColObj(btSoftBody* ps, const btCollisionObjectWrapper* colObWrap) - { - psb = ps; - m_colObjWrap = colObWrap; - idt = ps->m_sst.isdt; - m_margin = m_colObjWrap->getCollisionShape()->getMargin() + psb->getCollisionShape()->getMargin(); - ///Bullet rigid body uses multiply instead of minimum to determine combined friction. Some customization would be useful. - friction = btMin(psb->m_cfg.kDF, m_colObjWrap->getCollisionObject()->getFriction()); - btVector3 mins; - btVector3 maxs; - - ATTRIBUTE_ALIGNED16(btDbvtVolume) - volume; - colObWrap->getCollisionShape()->getAabb(colObWrap->getWorldTransform(), mins, maxs); - volume = btDbvtVolume::FromMM(mins, maxs); - volume.Expand(btVector3(1, 1, 1) * m_margin); - ps->m_cdbvt.collideTV(ps->m_cdbvt.m_root, volume, *this); - } - }; - // - // CollideCL_SS - // - struct CollideCL_SS : ClusterBase - { - btSoftBody* bodies[2]; - void Process(const btDbvtNode* la, const btDbvtNode* lb) - { - btSoftBody::Cluster* cla = (btSoftBody::Cluster*)la->data; - btSoftBody::Cluster* clb = (btSoftBody::Cluster*)lb->data; - - bool connected = false; - if ((bodies[0] == bodies[1]) && (bodies[0]->m_clusterConnectivity.size())) - { - connected = bodies[0]->m_clusterConnectivity[cla->m_clusterIndex + bodies[0]->m_clusters.size() * clb->m_clusterIndex]; - } - - if (!connected) - { - btSoftClusterCollisionShape csa(cla); - btSoftClusterCollisionShape csb(clb); - btGjkEpaSolver2::sResults res; - if (btGjkEpaSolver2::SignedDistance(&csa, btTransform::getIdentity(), - &csb, btTransform::getIdentity(), - cla->m_com - clb->m_com, res)) - { - btSoftBody::CJoint joint; - if (SolveContact(res, cla, clb, joint)) - { - btSoftBody::CJoint* pj = new (btAlignedAlloc(sizeof(btSoftBody::CJoint), 16)) btSoftBody::CJoint(); - *pj = joint; - bodies[0]->m_joints.push_back(pj); - pj->m_erp *= btMax(bodies[0]->m_cfg.kSSHR_CL, bodies[1]->m_cfg.kSSHR_CL); - pj->m_split *= (bodies[0]->m_cfg.kSS_SPLT_CL + bodies[1]->m_cfg.kSS_SPLT_CL) / 2; - } - } - } - else - { - static int count = 0; - count++; - //printf("count=%d\n",count); - } - } - void ProcessSoftSoft(btSoftBody* psa, btSoftBody* psb) - { - idt = psa->m_sst.isdt; - //m_margin = (psa->getCollisionShape()->getMargin()+psb->getCollisionShape()->getMargin())/2; - m_margin = (psa->getCollisionShape()->getMargin() + psb->getCollisionShape()->getMargin()); - friction = btMin(psa->m_cfg.kDF, psb->m_cfg.kDF); - bodies[0] = psa; - bodies[1] = psb; - psa->m_cdbvt.collideTT(psa->m_cdbvt.m_root, psb->m_cdbvt.m_root, *this); - } - }; - // - // CollideSDF_RS - // - struct CollideSDF_RS : btDbvt::ICollide - { - void Process(const btDbvtNode* leaf) - { - btSoftBody::Node* node = (btSoftBody::Node*)leaf->data; - DoNode(*node); - } - void DoNode(btSoftBody::Node& n) const - { - const btScalar m = n.m_im > 0 ? dynmargin : stamargin; - btSoftBody::RContact c; - - if ((!n.m_battach) && - psb->checkContact(m_colObj1Wrap, n.m_x, m, c.m_cti)) - { - const btScalar ima = n.m_im; - const btScalar imb = m_rigidBody ? m_rigidBody->getInvMass() : 0.f; - const btScalar ms = ima + imb; - if (ms > 0) - { - const btTransform& wtr = m_rigidBody ? m_rigidBody->getWorldTransform() : m_colObj1Wrap->getCollisionObject()->getWorldTransform(); - static const btMatrix3x3 iwiStatic(0, 0, 0, 0, 0, 0, 0, 0, 0); - const btMatrix3x3& iwi = m_rigidBody ? m_rigidBody->getInvInertiaTensorWorld() : iwiStatic; - const btVector3 ra = n.m_x - wtr.getOrigin(); - const btVector3 va = m_rigidBody ? m_rigidBody->getVelocityInLocalPoint(ra) * psb->m_sst.sdt : btVector3(0, 0, 0); - const btVector3 vb = n.m_x - n.m_q; - const btVector3 vr = vb - va; - const btScalar dn = btDot(vr, c.m_cti.m_normal); - const btVector3 fv = vr - c.m_cti.m_normal * dn; - const btScalar fc = psb->m_cfg.kDF * m_colObj1Wrap->getCollisionObject()->getFriction(); - c.m_node = &n; - c.m_c0 = ImpulseMatrix(psb->m_sst.sdt, ima, imb, iwi, ra); - c.m_c1 = ra; - c.m_c2 = ima * psb->m_sst.sdt; - c.m_c3 = fv.length2() < (dn * fc * dn * fc) ? 0 : 1 - fc; - c.m_c4 = m_colObj1Wrap->getCollisionObject()->isStaticOrKinematicObject() ? psb->m_cfg.kKHR : psb->m_cfg.kCHR; - psb->m_rcontacts.push_back(c); - if (m_rigidBody) - m_rigidBody->activate(); - } - } - } - btSoftBody* psb; - const btCollisionObjectWrapper* m_colObj1Wrap; - btRigidBody* m_rigidBody; - btScalar dynmargin; - btScalar stamargin; - }; - - // - // CollideSDF_RD - // - struct CollideSDF_RD : btDbvt::ICollide - { - void Process(const btDbvtNode* leaf) - { - btSoftBody::Node* node = (btSoftBody::Node*)leaf->data; - DoNode(*node); - } - void DoNode(btSoftBody::Node& n) const - { - const btScalar m = n.m_im > 0 ? dynmargin : stamargin; - btSoftBody::DeformableNodeRigidContact c; - - if (!n.m_battach) - { - // check for collision at x_{n+1}^* - if (psb->checkDeformableContact(m_colObj1Wrap, n.m_q, m, c.m_cti, /*predict = */ true)) - { - const btScalar ima = n.m_im; - // todo: collision between multibody and fixed deformable node will be missed. - const btScalar imb = m_rigidBody ? m_rigidBody->getInvMass() : 0.f; - const btScalar ms = ima + imb; - if (ms > 0) - { - // resolve contact at x_n - psb->checkDeformableContact(m_colObj1Wrap, n.m_x, m, c.m_cti, /*predict = */ false); - btSoftBody::sCti& cti = c.m_cti; - c.m_node = &n; - const btScalar fc = psb->m_cfg.kDF * m_colObj1Wrap->getCollisionObject()->getFriction(); - c.m_c2 = ima; - c.m_c3 = fc; - c.m_c4 = m_colObj1Wrap->getCollisionObject()->isStaticOrKinematicObject() ? psb->m_cfg.kKHR : psb->m_cfg.kCHR; - c.m_c5 = n.m_effectiveMass_inv; - - if (cti.m_colObj->getInternalType() == btCollisionObject::CO_RIGID_BODY) - { - const btTransform& wtr = m_rigidBody ? m_rigidBody->getWorldTransform() : m_colObj1Wrap->getCollisionObject()->getWorldTransform(); - static const btMatrix3x3 iwiStatic(0, 0, 0, 0, 0, 0, 0, 0, 0); - const btMatrix3x3& iwi = m_rigidBody ? m_rigidBody->getInvInertiaTensorWorld() : iwiStatic; - const btVector3 ra = n.m_x - wtr.getOrigin(); - - c.m_c0 = ImpulseMatrix(1, n.m_effectiveMass_inv, imb, iwi, ra); - // c.m_c0 = ImpulseMatrix(1, ima, imb, iwi, ra); - c.m_c1 = ra; - } - else if (cti.m_colObj->getInternalType() == btCollisionObject::CO_FEATHERSTONE_LINK) - { - btMultiBodyLinkCollider* multibodyLinkCol = (btMultiBodyLinkCollider*)btMultiBodyLinkCollider::upcast(cti.m_colObj); - if (multibodyLinkCol) - { - btVector3 normal = cti.m_normal; - btVector3 t1 = generateUnitOrthogonalVector(normal); - btVector3 t2 = btCross(normal, t1); - btMultiBodyJacobianData jacobianData_normal, jacobianData_t1, jacobianData_t2; - findJacobian(multibodyLinkCol, jacobianData_normal, c.m_node->m_x, normal); - findJacobian(multibodyLinkCol, jacobianData_t1, c.m_node->m_x, t1); - findJacobian(multibodyLinkCol, jacobianData_t2, c.m_node->m_x, t2); - - btScalar* J_n = &jacobianData_normal.m_jacobians[0]; - btScalar* J_t1 = &jacobianData_t1.m_jacobians[0]; - btScalar* J_t2 = &jacobianData_t2.m_jacobians[0]; - - btScalar* u_n = &jacobianData_normal.m_deltaVelocitiesUnitImpulse[0]; - btScalar* u_t1 = &jacobianData_t1.m_deltaVelocitiesUnitImpulse[0]; - btScalar* u_t2 = &jacobianData_t2.m_deltaVelocitiesUnitImpulse[0]; - - btMatrix3x3 rot(normal.getX(), normal.getY(), normal.getZ(), - t1.getX(), t1.getY(), t1.getZ(), - t2.getX(), t2.getY(), t2.getZ()); // world frame to local frame - const int ndof = multibodyLinkCol->m_multiBody->getNumDofs() + 6; - btMatrix3x3 local_impulse_matrix = (n.m_effectiveMass_inv + OuterProduct(J_n, J_t1, J_t2, u_n, u_t1, u_t2, ndof)).inverse(); - c.m_c0 = rot.transpose() * local_impulse_matrix * rot; - c.jacobianData_normal = jacobianData_normal; - c.jacobianData_t1 = jacobianData_t1; - c.jacobianData_t2 = jacobianData_t2; - c.t1 = t1; - c.t2 = t2; - } - } - psb->m_nodeRigidContacts.push_back(c); - } - } - } - } - btSoftBody* psb; - const btCollisionObjectWrapper* m_colObj1Wrap; - btRigidBody* m_rigidBody; - btScalar dynmargin; - btScalar stamargin; - }; - - // - // CollideSDF_RDF - // - struct CollideSDF_RDF : btDbvt::ICollide - { - void Process(const btDbvtNode* leaf) - { - btSoftBody::Face* face = (btSoftBody::Face*)leaf->data; - DoNode(*face); - } - void DoNode(btSoftBody::Face& f) const - { - btSoftBody::Node* n0 = f.m_n[0]; - btSoftBody::Node* n1 = f.m_n[1]; - btSoftBody::Node* n2 = f.m_n[2]; - const btScalar m = (n0->m_im > 0 && n1->m_im > 0 && n2->m_im > 0) ? dynmargin : stamargin; - btSoftBody::DeformableFaceRigidContact c; - btVector3 contact_point; - btVector3 bary; - if (psb->checkDeformableFaceContact(m_colObj1Wrap, f, contact_point, bary, m, c.m_cti, true)) - { - btScalar ima = n0->m_im + n1->m_im + n2->m_im; - const btScalar imb = m_rigidBody ? m_rigidBody->getInvMass() : 0.f; - // todo: collision between multibody and fixed deformable face will be missed. - const btScalar ms = ima + imb; - if (ms > 0) - { - // resolve contact at x_n - // psb->checkDeformableFaceContact(m_colObj1Wrap, f, contact_point, bary, m, c.m_cti, /*predict = */ false); - btSoftBody::sCti& cti = c.m_cti; - c.m_contactPoint = contact_point; - c.m_bary = bary; - // todo xuchenhan@: this is assuming mass of all vertices are the same. Need to modify if mass are different for distinct vertices - c.m_weights = btScalar(2) / (btScalar(1) + bary.length2()) * bary; - c.m_face = &f; - // friction is handled by the nodes to prevent sticking - // const btScalar fc = 0; - const btScalar fc = psb->m_cfg.kDF * m_colObj1Wrap->getCollisionObject()->getFriction(); - - // the effective inverse mass of the face as in https://graphics.stanford.edu/papers/cloth-sig02/cloth.pdf - ima = bary.getX() * c.m_weights.getX() * n0->m_im + bary.getY() * c.m_weights.getY() * n1->m_im + bary.getZ() * c.m_weights.getZ() * n2->m_im; - c.m_c2 = ima; - c.m_c3 = fc; - c.m_c4 = m_colObj1Wrap->getCollisionObject()->isStaticOrKinematicObject() ? psb->m_cfg.kKHR : psb->m_cfg.kCHR; - c.m_c5 = Diagonal(ima); - if (cti.m_colObj->getInternalType() == btCollisionObject::CO_RIGID_BODY) - { - const btTransform& wtr = m_rigidBody ? m_rigidBody->getWorldTransform() : m_colObj1Wrap->getCollisionObject()->getWorldTransform(); - static const btMatrix3x3 iwiStatic(0, 0, 0, 0, 0, 0, 0, 0, 0); - const btMatrix3x3& iwi = m_rigidBody ? m_rigidBody->getInvInertiaTensorWorld() : iwiStatic; - const btVector3 ra = contact_point - wtr.getOrigin(); - - // we do not scale the impulse matrix by dt - c.m_c0 = ImpulseMatrix(1, ima, imb, iwi, ra); - c.m_c1 = ra; - } - else if (cti.m_colObj->getInternalType() == btCollisionObject::CO_FEATHERSTONE_LINK) - { - btMultiBodyLinkCollider* multibodyLinkCol = (btMultiBodyLinkCollider*)btMultiBodyLinkCollider::upcast(cti.m_colObj); - if (multibodyLinkCol) - { - btVector3 normal = cti.m_normal; - btVector3 t1 = generateUnitOrthogonalVector(normal); - btVector3 t2 = btCross(normal, t1); - btMultiBodyJacobianData jacobianData_normal, jacobianData_t1, jacobianData_t2; - findJacobian(multibodyLinkCol, jacobianData_normal, contact_point, normal); - findJacobian(multibodyLinkCol, jacobianData_t1, contact_point, t1); - findJacobian(multibodyLinkCol, jacobianData_t2, contact_point, t2); - - btScalar* J_n = &jacobianData_normal.m_jacobians[0]; - btScalar* J_t1 = &jacobianData_t1.m_jacobians[0]; - btScalar* J_t2 = &jacobianData_t2.m_jacobians[0]; - - btScalar* u_n = &jacobianData_normal.m_deltaVelocitiesUnitImpulse[0]; - btScalar* u_t1 = &jacobianData_t1.m_deltaVelocitiesUnitImpulse[0]; - btScalar* u_t2 = &jacobianData_t2.m_deltaVelocitiesUnitImpulse[0]; - - btMatrix3x3 rot(normal.getX(), normal.getY(), normal.getZ(), - t1.getX(), t1.getY(), t1.getZ(), - t2.getX(), t2.getY(), t2.getZ()); // world frame to local frame - const int ndof = multibodyLinkCol->m_multiBody->getNumDofs() + 6; - btMatrix3x3 local_impulse_matrix = (Diagonal(ima) + OuterProduct(J_n, J_t1, J_t2, u_n, u_t1, u_t2, ndof)).inverse(); - c.m_c0 = rot.transpose() * local_impulse_matrix * rot; - c.jacobianData_normal = jacobianData_normal; - c.jacobianData_t1 = jacobianData_t1; - c.jacobianData_t2 = jacobianData_t2; - c.t1 = t1; - c.t2 = t2; - } - } - psb->m_faceRigidContacts.push_back(c); - } - } - // Set caching barycenters to be false after collision detection. - // Only turn on when contact is static. - f.m_pcontact[3] = 0; - } - btSoftBody* psb; - const btCollisionObjectWrapper* m_colObj1Wrap; - btRigidBody* m_rigidBody; - btScalar dynmargin; - btScalar stamargin; - }; - - // - // CollideVF_SS - // - struct CollideVF_SS : btDbvt::ICollide - { - void Process(const btDbvtNode* lnode, - const btDbvtNode* lface) - { - btSoftBody::Node* node = (btSoftBody::Node*)lnode->data; - btSoftBody::Face* face = (btSoftBody::Face*)lface->data; - for (int i = 0; i < 3; ++i) - { - if (face->m_n[i] == node) - continue; - } - - btVector3 o = node->m_x; - btVector3 p; - btScalar d = SIMD_INFINITY; - ProjectOrigin(face->m_n[0]->m_x - o, - face->m_n[1]->m_x - o, - face->m_n[2]->m_x - o, - p, d); - const btScalar m = mrg + (o - node->m_q).length() * 2; - if (d < (m * m)) - { - const btSoftBody::Node* n[] = {face->m_n[0], face->m_n[1], face->m_n[2]}; - const btVector3 w = BaryCoord(n[0]->m_x, n[1]->m_x, n[2]->m_x, p + o); - const btScalar ma = node->m_im; - btScalar mb = BaryEval(n[0]->m_im, n[1]->m_im, n[2]->m_im, w); - if ((n[0]->m_im <= 0) || - (n[1]->m_im <= 0) || - (n[2]->m_im <= 0)) - { - mb = 0; - } - const btScalar ms = ma + mb; - if (ms > 0) - { - btSoftBody::SContact c; - c.m_normal = p / -btSqrt(d); - c.m_margin = m; - c.m_node = node; - c.m_face = face; - c.m_weights = w; - c.m_friction = btMax(psb[0]->m_cfg.kDF, psb[1]->m_cfg.kDF); - c.m_cfm[0] = ma / ms * psb[0]->m_cfg.kSHR; - c.m_cfm[1] = mb / ms * psb[1]->m_cfg.kSHR; - psb[0]->m_scontacts.push_back(c); - } - } - } - btSoftBody* psb[2]; - btScalar mrg; - }; - - // - // CollideVF_DD - // - struct CollideVF_DD : btDbvt::ICollide - { - void Process(const btDbvtNode* lnode, - const btDbvtNode* lface) - { - btSoftBody::Node* node = (btSoftBody::Node*)lnode->data; - btSoftBody::Face* face = (btSoftBody::Face*)lface->data; - btVector3 bary; - if (proximityTest(face->m_n[0]->m_x, face->m_n[1]->m_x, face->m_n[2]->m_x, node->m_x, face->m_normal, mrg, bary)) - { - const btSoftBody::Node* n[] = {face->m_n[0], face->m_n[1], face->m_n[2]}; - const btVector3 w = bary; - const btScalar ma = node->m_im; - btScalar mb = BaryEval(n[0]->m_im, n[1]->m_im, n[2]->m_im, w); - if ((n[0]->m_im <= 0) || - (n[1]->m_im <= 0) || - (n[2]->m_im <= 0)) - { - mb = 0; - } - const btScalar ms = ma + mb; - if (ms > 0) - { - btSoftBody::DeformableFaceNodeContact c; - c.m_normal = face->m_normal; - if (!useFaceNormal && c.m_normal.dot(node->m_x - face->m_n[2]->m_x) < 0) - c.m_normal = -face->m_normal; - c.m_margin = mrg; - c.m_node = node; - c.m_face = face; - c.m_bary = w; - c.m_friction = psb[0]->m_cfg.kDF * psb[1]->m_cfg.kDF; - psb[0]->m_faceNodeContacts.push_back(c); - } - } - } - btSoftBody* psb[2]; - btScalar mrg; - bool useFaceNormal; - }; - - // - // CollideFF_DD - // - struct CollideFF_DD : btDbvt::ICollide - { - void Process(const btDbvntNode* lface1, - const btDbvntNode* lface2) - { - btSoftBody::Face* f1 = (btSoftBody::Face*)lface1->data; - btSoftBody::Face* f2 = (btSoftBody::Face*)lface2->data; - if (f1 != f2) - { - Repel(f1, f2); - Repel(f2, f1); - } - } - void Repel(btSoftBody::Face* f1, btSoftBody::Face* f2) - { - //#define REPEL_NEIGHBOR 1 -#ifndef REPEL_NEIGHBOR - for (int node_id = 0; node_id < 3; ++node_id) - { - btSoftBody::Node* node = f1->m_n[node_id]; - for (int i = 0; i < 3; ++i) - { - if (f2->m_n[i] == node) - return; - } - } -#endif - bool skip = false; - for (int node_id = 0; node_id < 3; ++node_id) - { - btSoftBody::Node* node = f1->m_n[node_id]; -#ifdef REPEL_NEIGHBOR - for (int i = 0; i < 3; ++i) - { - if (f2->m_n[i] == node) - { - skip = true; - break; - } - } - if (skip) - { - skip = false; - continue; - } -#endif - btSoftBody::Face* face = f2; - btVector3 bary; - if (!proximityTest(face->m_n[0]->m_x, face->m_n[1]->m_x, face->m_n[2]->m_x, node->m_x, face->m_normal, mrg, bary)) - continue; - btSoftBody::DeformableFaceNodeContact c; - c.m_normal = face->m_normal; - if (!useFaceNormal && c.m_normal.dot(node->m_x - face->m_n[2]->m_x) < 0) - c.m_normal = -face->m_normal; - c.m_margin = mrg; - c.m_node = node; - c.m_face = face; - c.m_bary = bary; - c.m_friction = psb[0]->m_cfg.kDF * psb[1]->m_cfg.kDF; - psb[0]->m_faceNodeContacts.push_back(c); - } - } - btSoftBody* psb[2]; - btScalar mrg; - bool useFaceNormal; - }; - - struct CollideCCD : btDbvt::ICollide - { - void Process(const btDbvtNode* lnode, - const btDbvtNode* lface) - { - btSoftBody::Node* node = (btSoftBody::Node*)lnode->data; - btSoftBody::Face* face = (btSoftBody::Face*)lface->data; - btVector3 bary; - if (bernsteinCCD(face, node, dt, SAFE_EPSILON, bary)) - { - btSoftBody::DeformableFaceNodeContact c; - c.m_normal = face->m_normal; - if (!useFaceNormal && c.m_normal.dot(node->m_x - face->m_n[2]->m_x) < 0) - c.m_normal = -face->m_normal; - c.m_node = node; - c.m_face = face; - c.m_bary = bary; - c.m_friction = psb[0]->m_cfg.kDF * psb[1]->m_cfg.kDF; - psb[0]->m_faceNodeContacts.push_back(c); - } - } - void Process(const btDbvntNode* lface1, - const btDbvntNode* lface2) - { - btSoftBody::Face* f1 = (btSoftBody::Face*)lface1->data; - btSoftBody::Face* f2 = (btSoftBody::Face*)lface2->data; - if (f1 != f2) - { - Repel(f1, f2); - Repel(f2, f1); - } - } - void Repel(btSoftBody::Face* f1, btSoftBody::Face* f2) - { - //#define REPEL_NEIGHBOR 1 -#ifndef REPEL_NEIGHBOR - for (int node_id = 0; node_id < 3; ++node_id) - { - btSoftBody::Node* node = f1->m_n[node_id]; - for (int i = 0; i < 3; ++i) - { - if (f2->m_n[i] == node) - return; - } - } -#endif - bool skip = false; - for (int node_id = 0; node_id < 3; ++node_id) - { - btSoftBody::Node* node = f1->m_n[node_id]; -#ifdef REPEL_NEIGHBOR - for (int i = 0; i < 3; ++i) - { - if (f2->m_n[i] == node) - { - skip = true; - break; - } - } - if (skip) - { - skip = false; - continue; - } -#endif - btSoftBody::Face* face = f2; - btVector3 bary; - if (bernsteinCCD(face, node, dt, SAFE_EPSILON, bary)) - { - btSoftBody::DeformableFaceNodeContact c; - c.m_normal = face->m_normal; - if (!useFaceNormal && c.m_normal.dot(node->m_x - face->m_n[2]->m_x) < 0) - c.m_normal = -face->m_normal; - c.m_node = node; - c.m_face = face; - c.m_bary = bary; - c.m_friction = psb[0]->m_cfg.kDF * psb[1]->m_cfg.kDF; - psb[0]->m_faceNodeContacts.push_back(c); - } - } - } - btSoftBody* psb[2]; - btScalar dt, mrg; - bool useFaceNormal; - }; -}; -#endif //_BT_SOFT_BODY_INTERNALS_H diff --git a/engine/inc/bullet/BulletSoftBody/btSoftBodyRigidBodyCollisionConfiguration.h b/engine/inc/bullet/BulletSoftBody/btSoftBodyRigidBodyCollisionConfiguration.h deleted file mode 100644 index 0396a52d..00000000 --- a/engine/inc/bullet/BulletSoftBody/btSoftBodyRigidBodyCollisionConfiguration.h +++ /dev/null @@ -1,43 +0,0 @@ -/* -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_SOFTBODY_RIGIDBODY_COLLISION_CONFIGURATION -#define BT_SOFTBODY_RIGIDBODY_COLLISION_CONFIGURATION - -#include "BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.h" - -class btVoronoiSimplexSolver; -class btGjkEpaPenetrationDepthSolver; - -///btSoftBodyRigidBodyCollisionConfiguration add softbody interaction on top of btDefaultCollisionConfiguration -class btSoftBodyRigidBodyCollisionConfiguration : public btDefaultCollisionConfiguration -{ - //default CreationFunctions, filling the m_doubleDispatch table - btCollisionAlgorithmCreateFunc* m_softSoftCreateFunc; - btCollisionAlgorithmCreateFunc* m_softRigidConvexCreateFunc; - btCollisionAlgorithmCreateFunc* m_swappedSoftRigidConvexCreateFunc; - btCollisionAlgorithmCreateFunc* m_softRigidConcaveCreateFunc; - btCollisionAlgorithmCreateFunc* m_swappedSoftRigidConcaveCreateFunc; - -public: - btSoftBodyRigidBodyCollisionConfiguration(const btDefaultCollisionConstructionInfo& constructionInfo = btDefaultCollisionConstructionInfo()); - - virtual ~btSoftBodyRigidBodyCollisionConfiguration(); - - ///creation of soft-soft and soft-rigid, and otherwise fallback to base class implementation - virtual btCollisionAlgorithmCreateFunc* getCollisionAlgorithmCreateFunc(int proxyType0, int proxyType1); -}; - -#endif //BT_SOFTBODY_RIGIDBODY_COLLISION_CONFIGURATION diff --git a/engine/inc/bullet/BulletSoftBody/btSoftBodySolverVertexBuffer.h b/engine/inc/bullet/BulletSoftBody/btSoftBodySolverVertexBuffer.h deleted file mode 100644 index bc538db4..00000000 --- a/engine/inc/bullet/BulletSoftBody/btSoftBodySolverVertexBuffer.h +++ /dev/null @@ -1,160 +0,0 @@ -/* -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_SOFT_BODY_SOLVER_VERTEX_BUFFER_H -#define BT_SOFT_BODY_SOLVER_VERTEX_BUFFER_H - -class btVertexBufferDescriptor -{ -public: - enum BufferTypes - { - CPU_BUFFER, - DX11_BUFFER, - OPENGL_BUFFER - }; - -protected: - bool m_hasVertexPositions; - bool m_hasNormals; - - int m_vertexOffset; - int m_vertexStride; - - int m_normalOffset; - int m_normalStride; - -public: - btVertexBufferDescriptor() - { - m_hasVertexPositions = false; - m_hasNormals = false; - m_vertexOffset = 0; - m_vertexStride = 0; - m_normalOffset = 0; - m_normalStride = 0; - } - - virtual ~btVertexBufferDescriptor() - { - } - - virtual bool hasVertexPositions() const - { - return m_hasVertexPositions; - } - - virtual bool hasNormals() const - { - return m_hasNormals; - } - - /** - * Return the type of the vertex buffer descriptor. - */ - virtual BufferTypes getBufferType() const = 0; - - /** - * Return the vertex offset in floats from the base pointer. - */ - virtual int getVertexOffset() const - { - return m_vertexOffset; - } - - /** - * Return the vertex stride in number of floats between vertices. - */ - virtual int getVertexStride() const - { - return m_vertexStride; - } - - /** - * Return the vertex offset in floats from the base pointer. - */ - virtual int getNormalOffset() const - { - return m_normalOffset; - } - - /** - * Return the vertex stride in number of floats between vertices. - */ - virtual int getNormalStride() const - { - return m_normalStride; - } -}; - -class btCPUVertexBufferDescriptor : public btVertexBufferDescriptor -{ -protected: - float *m_basePointer; - -public: - /** - * vertexBasePointer is pointer to beginning of the buffer. - * vertexOffset is the offset in floats to the first vertex. - * vertexStride is the stride in floats between vertices. - */ - btCPUVertexBufferDescriptor(float *basePointer, int vertexOffset, int vertexStride) - { - m_basePointer = basePointer; - m_vertexOffset = vertexOffset; - m_vertexStride = vertexStride; - m_hasVertexPositions = true; - } - - /** - * vertexBasePointer is pointer to beginning of the buffer. - * vertexOffset is the offset in floats to the first vertex. - * vertexStride is the stride in floats between vertices. - */ - btCPUVertexBufferDescriptor(float *basePointer, int vertexOffset, int vertexStride, int normalOffset, int normalStride) - { - m_basePointer = basePointer; - - m_vertexOffset = vertexOffset; - m_vertexStride = vertexStride; - m_hasVertexPositions = true; - - m_normalOffset = normalOffset; - m_normalStride = normalStride; - m_hasNormals = true; - } - - virtual ~btCPUVertexBufferDescriptor() - { - } - - /** - * Return the type of the vertex buffer descriptor. - */ - virtual BufferTypes getBufferType() const - { - return CPU_BUFFER; - } - - /** - * Return the base pointer in memory to the first vertex. - */ - virtual float *getBasePointer() const - { - return m_basePointer; - } -}; - -#endif // #ifndef BT_SOFT_BODY_SOLVER_VERTEX_BUFFER_H diff --git a/engine/inc/bullet/BulletSoftBody/btSoftBodySolvers.h b/engine/inc/bullet/BulletSoftBody/btSoftBodySolvers.h deleted file mode 100644 index dbb2624e..00000000 --- a/engine/inc/bullet/BulletSoftBody/btSoftBodySolvers.h +++ /dev/null @@ -1,147 +0,0 @@ -/* -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_SOFT_BODY_SOLVERS_H -#define BT_SOFT_BODY_SOLVERS_H - -#include "BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h" - -class btSoftBodyTriangleData; -class btSoftBodyLinkData; -class btSoftBodyVertexData; -class btVertexBufferDescriptor; -class btCollisionObject; -class btSoftBody; - -class btSoftBodySolver -{ -public: - enum SolverTypes - { - DEFAULT_SOLVER, - CPU_SOLVER, - CL_SOLVER, - CL_SIMD_SOLVER, - DX_SOLVER, - DX_SIMD_SOLVER, - DEFORMABLE_SOLVER - }; - -protected: - int m_numberOfPositionIterations; - int m_numberOfVelocityIterations; - // Simulation timescale - float m_timeScale; - -public: - btSoftBodySolver() : m_numberOfPositionIterations(10), - m_timeScale(1) - { - m_numberOfVelocityIterations = 0; - m_numberOfPositionIterations = 5; - } - - virtual ~btSoftBodySolver() - { - } - - /** - * Return the type of the solver. - */ - virtual SolverTypes getSolverType() const = 0; - - /** Ensure that this solver is initialized. */ - virtual bool checkInitialized() = 0; - - /** Optimize soft bodies in this solver. */ - virtual void optimize(btAlignedObjectArray &softBodies, bool forceUpdate = false) = 0; - - /** Copy necessary data back to the original soft body source objects. */ - virtual void copyBackToSoftBodies(bool bMove = true) = 0; - - /** Predict motion of soft bodies into next timestep */ - virtual void predictMotion(btScalar solverdt) = 0; - - /** Solve constraints for a set of soft bodies */ - virtual void solveConstraints(btScalar solverdt) = 0; - - /** Perform necessary per-step updates of soft bodies such as recomputing normals and bounding boxes */ - virtual void updateSoftBodies() = 0; - - /** Process a collision between one of the world's soft bodies and another collision object */ - virtual void processCollision(btSoftBody *, const struct btCollisionObjectWrapper *) = 0; - - /** Process a collision between two soft bodies */ - virtual void processCollision(btSoftBody *, btSoftBody *) = 0; - - /** Set the number of velocity constraint solver iterations this solver uses. */ - virtual void setNumberOfPositionIterations(int iterations) - { - m_numberOfPositionIterations = iterations; - } - - /** Get the number of velocity constraint solver iterations this solver uses. */ - virtual int getNumberOfPositionIterations() - { - return m_numberOfPositionIterations; - } - - /** Set the number of velocity constraint solver iterations this solver uses. */ - virtual void setNumberOfVelocityIterations(int iterations) - { - m_numberOfVelocityIterations = iterations; - } - - /** Get the number of velocity constraint solver iterations this solver uses. */ - virtual int getNumberOfVelocityIterations() - { - return m_numberOfVelocityIterations; - } - - /** Return the timescale that the simulation is using */ - float getTimeScale() - { - return m_timeScale; - } - -#if 0 - /** - * Add a collision object to be used by the indicated softbody. - */ - virtual void addCollisionObjectForSoftBody( int clothIdentifier, btCollisionObject *collisionObject ) = 0; -#endif -}; - -/** - * Class to manage movement of data from a solver to a given target. - * This version is abstract. Subclasses will have custom pairings for different combinations. - */ -class btSoftBodySolverOutput -{ -protected: -public: - btSoftBodySolverOutput() - { - } - - virtual ~btSoftBodySolverOutput() - { - } - - /** Output current computed vertex data to the vertex buffers for all cloths in the solver. */ - virtual void copySoftBodyToVertexBuffer(const btSoftBody *const softBody, btVertexBufferDescriptor *vertexBuffer) = 0; -}; - -#endif // #ifndef BT_SOFT_BODY_SOLVERS_H diff --git a/engine/inc/bullet/BulletSoftBody/btSoftMultiBodyDynamicsWorld.h b/engine/inc/bullet/BulletSoftBody/btSoftMultiBodyDynamicsWorld.h deleted file mode 100644 index f295945a..00000000 --- a/engine/inc/bullet/BulletSoftBody/btSoftMultiBodyDynamicsWorld.h +++ /dev/null @@ -1,105 +0,0 @@ -/* -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_SOFT_MULTIBODY_DYNAMICS_WORLD_H -#define BT_SOFT_MULTIBODY_DYNAMICS_WORLD_H - -#include "BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h" -#include "BulletDynamics/Featherstone/btMultiBodyDynamicsWorld.h" -#include "BulletSoftBody/btSoftBody.h" - -#ifndef BT_SOFT_RIGID_DYNAMICS_WORLD_H -typedef btAlignedObjectArray btSoftBodyArray; -#endif - -class btSoftBodySolver; - -class btSoftMultiBodyDynamicsWorld : public btMultiBodyDynamicsWorld -{ - btSoftBodyArray m_softBodies; - int m_drawFlags; - bool m_drawNodeTree; - bool m_drawFaceTree; - bool m_drawClusterTree; - btSoftBodyWorldInfo m_sbi; - ///Solver classes that encapsulate multiple soft bodies for solving - btSoftBodySolver* m_softBodySolver; - bool m_ownsSolver; - -protected: - virtual void predictUnconstraintMotion(btScalar timeStep); - - virtual void internalSingleStepSimulation(btScalar timeStep); - - void solveSoftBodiesConstraints(btScalar timeStep); - - void serializeSoftBodies(btSerializer* serializer); - -public: - btSoftMultiBodyDynamicsWorld(btDispatcher* dispatcher, btBroadphaseInterface* pairCache, btMultiBodyConstraintSolver* constraintSolver, btCollisionConfiguration* collisionConfiguration, btSoftBodySolver* softBodySolver = 0); - - virtual ~btSoftMultiBodyDynamicsWorld(); - - virtual void debugDrawWorld(); - - void addSoftBody(btSoftBody* body, int collisionFilterGroup = btBroadphaseProxy::DefaultFilter, int collisionFilterMask = btBroadphaseProxy::AllFilter); - - void removeSoftBody(btSoftBody* body); - - ///removeCollisionObject will first check if it is a rigid body, if so call removeRigidBody otherwise call btDiscreteDynamicsWorld::removeCollisionObject - virtual void removeCollisionObject(btCollisionObject* collisionObject); - - int getDrawFlags() const { return (m_drawFlags); } - void setDrawFlags(int f) { m_drawFlags = f; } - - btSoftBodyWorldInfo& getWorldInfo() - { - return m_sbi; - } - const btSoftBodyWorldInfo& getWorldInfo() const - { - return m_sbi; - } - - virtual btDynamicsWorldType getWorldType() const - { - return BT_SOFT_MULTIBODY_DYNAMICS_WORLD; - } - - btSoftBodyArray& getSoftBodyArray() - { - return m_softBodies; - } - - const btSoftBodyArray& getSoftBodyArray() const - { - return m_softBodies; - } - - virtual void rayTest(const btVector3& rayFromWorld, const btVector3& rayToWorld, RayResultCallback& resultCallback) const; - - /// rayTestSingle performs a raycast call and calls the resultCallback. It is used internally by rayTest. - /// In a future implementation, we consider moving the ray test as a virtual method in btCollisionShape. - /// This allows more customization. - static void rayTestSingle(const btTransform& rayFromTrans, const btTransform& rayToTrans, - btCollisionObject* collisionObject, - const btCollisionShape* collisionShape, - const btTransform& colObjWorldTransform, - RayResultCallback& resultCallback); - - virtual void serialize(btSerializer* serializer); -}; - -#endif //BT_SOFT_MULTIBODY_DYNAMICS_WORLD_H diff --git a/engine/inc/bullet/BulletSoftBody/btSoftRigidCollisionAlgorithm.h b/engine/inc/bullet/BulletSoftBody/btSoftRigidCollisionAlgorithm.h deleted file mode 100644 index 9773af19..00000000 --- a/engine/inc/bullet/BulletSoftBody/btSoftRigidCollisionAlgorithm.h +++ /dev/null @@ -1,71 +0,0 @@ -/* -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_SOFT_RIGID_COLLISION_ALGORITHM_H -#define BT_SOFT_RIGID_COLLISION_ALGORITHM_H - -#include "BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" -#include "BulletCollision/CollisionDispatch/btCollisionCreateFunc.h" -class btPersistentManifold; -#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" - -#include "LinearMath/btVector3.h" -class btSoftBody; - -/// btSoftRigidCollisionAlgorithm provides collision detection between btSoftBody and btRigidBody -class btSoftRigidCollisionAlgorithm : public btCollisionAlgorithm -{ - // bool m_ownManifold; - // btPersistentManifold* m_manifoldPtr; - - //btSoftBody* m_softBody; - //btCollisionObject* m_rigidCollisionObject; - - ///for rigid versus soft (instead of soft versus rigid), we use this swapped boolean - bool m_isSwapped; - -public: - btSoftRigidCollisionAlgorithm(btPersistentManifold* mf, const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* col0, const btCollisionObjectWrapper* col1Wrap, bool isSwapped); - - virtual ~btSoftRigidCollisionAlgorithm(); - - virtual void processCollision(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut); - - virtual btScalar calculateTimeOfImpact(btCollisionObject* body0, btCollisionObject* body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut); - - virtual void getAllContactManifolds(btManifoldArray& manifoldArray) - { - //we don't add any manifolds - } - - struct CreateFunc : public btCollisionAlgorithmCreateFunc - { - virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap) - { - void* mem = ci.m_dispatcher1->allocateCollisionAlgorithm(sizeof(btSoftRigidCollisionAlgorithm)); - if (!m_swapped) - { - return new (mem) btSoftRigidCollisionAlgorithm(0, ci, body0Wrap, body1Wrap, false); - } - else - { - return new (mem) btSoftRigidCollisionAlgorithm(0, ci, body0Wrap, body1Wrap, true); - } - } - }; -}; - -#endif //BT_SOFT_RIGID_COLLISION_ALGORITHM_H diff --git a/engine/inc/bullet/BulletSoftBody/btSoftRigidDynamicsWorld.h b/engine/inc/bullet/BulletSoftBody/btSoftRigidDynamicsWorld.h deleted file mode 100644 index be49c444..00000000 --- a/engine/inc/bullet/BulletSoftBody/btSoftRigidDynamicsWorld.h +++ /dev/null @@ -1,102 +0,0 @@ -/* -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_SOFT_RIGID_DYNAMICS_WORLD_H -#define BT_SOFT_RIGID_DYNAMICS_WORLD_H - -#include "BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h" -#include "btSoftBody.h" - -typedef btAlignedObjectArray btSoftBodyArray; - -class btSoftBodySolver; - -class btSoftRigidDynamicsWorld : public btDiscreteDynamicsWorld -{ - btSoftBodyArray m_softBodies; - int m_drawFlags; - bool m_drawNodeTree; - bool m_drawFaceTree; - bool m_drawClusterTree; - btSoftBodyWorldInfo m_sbi; - ///Solver classes that encapsulate multiple soft bodies for solving - btSoftBodySolver* m_softBodySolver; - bool m_ownsSolver; - -protected: - virtual void predictUnconstraintMotion(btScalar timeStep); - - virtual void internalSingleStepSimulation(btScalar timeStep); - - void solveSoftBodiesConstraints(btScalar timeStep); - - void serializeSoftBodies(btSerializer* serializer); - -public: - btSoftRigidDynamicsWorld(btDispatcher* dispatcher, btBroadphaseInterface* pairCache, btConstraintSolver* constraintSolver, btCollisionConfiguration* collisionConfiguration, btSoftBodySolver* softBodySolver = 0); - - virtual ~btSoftRigidDynamicsWorld(); - - virtual void debugDrawWorld(); - - void addSoftBody(btSoftBody* body, int collisionFilterGroup = btBroadphaseProxy::DefaultFilter, int collisionFilterMask = btBroadphaseProxy::AllFilter); - - void removeSoftBody(btSoftBody* body); - - ///removeCollisionObject will first check if it is a rigid body, if so call removeRigidBody otherwise call btDiscreteDynamicsWorld::removeCollisionObject - virtual void removeCollisionObject(btCollisionObject* collisionObject); - - int getDrawFlags() const { return (m_drawFlags); } - void setDrawFlags(int f) { m_drawFlags = f; } - - btSoftBodyWorldInfo& getWorldInfo() - { - return m_sbi; - } - const btSoftBodyWorldInfo& getWorldInfo() const - { - return m_sbi; - } - - virtual btDynamicsWorldType getWorldType() const - { - return BT_SOFT_RIGID_DYNAMICS_WORLD; - } - - btSoftBodyArray& getSoftBodyArray() - { - return m_softBodies; - } - - const btSoftBodyArray& getSoftBodyArray() const - { - return m_softBodies; - } - - virtual void rayTest(const btVector3& rayFromWorld, const btVector3& rayToWorld, RayResultCallback& resultCallback) const; - - /// rayTestSingle performs a raycast call and calls the resultCallback. It is used internally by rayTest. - /// In a future implementation, we consider moving the ray test as a virtual method in btCollisionShape. - /// This allows more customization. - static void rayTestSingle(const btTransform& rayFromTrans, const btTransform& rayToTrans, - btCollisionObject* collisionObject, - const btCollisionShape* collisionShape, - const btTransform& colObjWorldTransform, - RayResultCallback& resultCallback); - - virtual void serialize(btSerializer* serializer); -}; - -#endif //BT_SOFT_RIGID_DYNAMICS_WORLD_H diff --git a/engine/inc/bullet/BulletSoftBody/btSoftSoftCollisionAlgorithm.h b/engine/inc/bullet/BulletSoftBody/btSoftSoftCollisionAlgorithm.h deleted file mode 100644 index 6f871f5b..00000000 --- a/engine/inc/bullet/BulletSoftBody/btSoftSoftCollisionAlgorithm.h +++ /dev/null @@ -1,65 +0,0 @@ -/* -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_SOFT_SOFT_COLLISION_ALGORITHM_H -#define BT_SOFT_SOFT_COLLISION_ALGORITHM_H - -#include "BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" -#include "BulletCollision/BroadphaseCollision/btDispatcher.h" -#include "BulletCollision/CollisionDispatch/btCollisionCreateFunc.h" - -class btPersistentManifold; -class btSoftBody; - -///collision detection between two btSoftBody shapes -class btSoftSoftCollisionAlgorithm : public btCollisionAlgorithm -{ - bool m_ownManifold; - btPersistentManifold* m_manifoldPtr; - - // btSoftBody* m_softBody0; - // btSoftBody* m_softBody1; - -public: - btSoftSoftCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci) - : btCollisionAlgorithm(ci) {} - - virtual void processCollision(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut); - - virtual btScalar calculateTimeOfImpact(btCollisionObject* body0, btCollisionObject* body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut); - - virtual void getAllContactManifolds(btManifoldArray& manifoldArray) - { - if (m_manifoldPtr && m_ownManifold) - manifoldArray.push_back(m_manifoldPtr); - } - - btSoftSoftCollisionAlgorithm(btPersistentManifold* mf, const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap); - - virtual ~btSoftSoftCollisionAlgorithm(); - - struct CreateFunc : public btCollisionAlgorithmCreateFunc - { - virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap) - { - int bbsize = sizeof(btSoftSoftCollisionAlgorithm); - void* ptr = ci.m_dispatcher1->allocateCollisionAlgorithm(bbsize); - return new (ptr) btSoftSoftCollisionAlgorithm(0, ci, body0Wrap, body1Wrap); - } - }; -}; - -#endif //BT_SOFT_SOFT_COLLISION_ALGORITHM_H diff --git a/engine/inc/bullet/BulletSoftBody/btSparseSDF.h b/engine/inc/bullet/BulletSoftBody/btSparseSDF.h deleted file mode 100644 index d611726b..00000000 --- a/engine/inc/bullet/BulletSoftBody/btSparseSDF.h +++ /dev/null @@ -1,372 +0,0 @@ -/* -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. -*/ -///btSparseSdf implementation by Nathanael Presson - -#ifndef BT_SPARSE_SDF_H -#define BT_SPARSE_SDF_H - -#include "BulletCollision/CollisionDispatch/btCollisionObject.h" -#include "BulletCollision/NarrowPhaseCollision/btGjkEpa2.h" - -// Fast Hash - -#if !defined(get16bits) -#define get16bits(d) ((((unsigned int)(((const unsigned char*)(d))[1])) << 8) + (unsigned int)(((const unsigned char*)(d))[0])) -#endif -// -// super hash function by Paul Hsieh -// -inline unsigned int HsiehHash(const char* data, int len) -{ - unsigned int hash = len, tmp; - len >>= 2; - - /* Main loop */ - for (; len > 0; len--) - { - hash += get16bits(data); - tmp = (get16bits(data + 2) << 11) ^ hash; - hash = (hash << 16) ^ tmp; - data += 2 * sizeof(unsigned short); - hash += hash >> 11; - } - - /* Force "avalanching" of final 127 bits */ - hash ^= hash << 3; - hash += hash >> 5; - hash ^= hash << 4; - hash += hash >> 17; - hash ^= hash << 25; - hash += hash >> 6; - - return hash; -} - -template -struct btSparseSdf -{ - // - // Inner types - // - struct IntFrac - { - int b; - int i; - btScalar f; - }; - struct Cell - { - btScalar d[CELLSIZE + 1][CELLSIZE + 1][CELLSIZE + 1]; - int c[3]; - int puid; - unsigned hash; - const btCollisionShape* pclient; - Cell* next; - }; - // - // Fields - // - - btAlignedObjectArray cells; - btScalar voxelsz; - btScalar m_defaultVoxelsz; - int puid; - int ncells; - int m_clampCells; - int nprobes; - int nqueries; - - ~btSparseSdf() - { - Reset(); - } - // - // Methods - // - - // - void Initialize(int hashsize = 2383, int clampCells = 256 * 1024) - { - //avoid a crash due to running out of memory, so clamp the maximum number of cells allocated - //if this limit is reached, the SDF is reset (at the cost of some performance during the reset) - m_clampCells = clampCells; - cells.resize(hashsize, 0); - m_defaultVoxelsz = 0.25; - Reset(); - } - // - - void setDefaultVoxelsz(btScalar sz) - { - m_defaultVoxelsz = sz; - } - - void Reset() - { - for (int i = 0, ni = cells.size(); i < ni; ++i) - { - Cell* pc = cells[i]; - cells[i] = 0; - while (pc) - { - Cell* pn = pc->next; - delete pc; - pc = pn; - } - } - voxelsz = m_defaultVoxelsz; - puid = 0; - ncells = 0; - nprobes = 1; - nqueries = 1; - } - // - void GarbageCollect(int lifetime = 256) - { - const int life = puid - lifetime; - for (int i = 0; i < cells.size(); ++i) - { - Cell*& root = cells[i]; - Cell* pp = 0; - Cell* pc = root; - while (pc) - { - Cell* pn = pc->next; - if (pc->puid < life) - { - if (pp) - pp->next = pn; - else - root = pn; - delete pc; - pc = pp; - --ncells; - } - pp = pc; - pc = pn; - } - } - //printf("GC[%d]: %d cells, PpQ: %f\r\n",puid,ncells,nprobes/(btScalar)nqueries); - nqueries = 1; - nprobes = 1; - ++puid; ///@todo: Reset puid's when int range limit is reached */ - /* else setup a priority list... */ - } - // - int RemoveReferences(btCollisionShape* pcs) - { - int refcount = 0; - for (int i = 0; i < cells.size(); ++i) - { - Cell*& root = cells[i]; - Cell* pp = 0; - Cell* pc = root; - while (pc) - { - Cell* pn = pc->next; - if (pc->pclient == pcs) - { - if (pp) - pp->next = pn; - else - root = pn; - delete pc; - pc = pp; - ++refcount; - } - pp = pc; - pc = pn; - } - } - return (refcount); - } - // - btScalar Evaluate(const btVector3& x, - const btCollisionShape* shape, - btVector3& normal, - btScalar margin) - { - /* Lookup cell */ - const btVector3 scx = x / voxelsz; - const IntFrac ix = Decompose(scx.x()); - const IntFrac iy = Decompose(scx.y()); - const IntFrac iz = Decompose(scx.z()); - const unsigned h = Hash(ix.b, iy.b, iz.b, shape); - Cell*& root = cells[static_cast(h % cells.size())]; - Cell* c = root; - ++nqueries; - while (c) - { - ++nprobes; - if ((c->hash == h) && - (c->c[0] == ix.b) && - (c->c[1] == iy.b) && - (c->c[2] == iz.b) && - (c->pclient == shape)) - { - break; - } - else - { - // printf("c->hash/c[0][1][2]=%d,%d,%d,%d\n", c->hash, c->c[0], c->c[1],c->c[2]); - //printf("h,ixb,iyb,izb=%d,%d,%d,%d\n", h,ix.b, iy.b, iz.b); - - c = c->next; - } - } - if (!c) - { - ++nprobes; - ++ncells; - //int sz = sizeof(Cell); - if (ncells > m_clampCells) - { - static int numResets = 0; - numResets++; - // printf("numResets=%d\n",numResets); - Reset(); - } - - c = new Cell(); - c->next = root; - root = c; - c->pclient = shape; - c->hash = h; - c->c[0] = ix.b; - c->c[1] = iy.b; - c->c[2] = iz.b; - BuildCell(*c); - } - c->puid = puid; - /* Extract infos */ - const int o[] = {ix.i, iy.i, iz.i}; - const btScalar d[] = {c->d[o[0] + 0][o[1] + 0][o[2] + 0], - c->d[o[0] + 1][o[1] + 0][o[2] + 0], - c->d[o[0] + 1][o[1] + 1][o[2] + 0], - c->d[o[0] + 0][o[1] + 1][o[2] + 0], - c->d[o[0] + 0][o[1] + 0][o[2] + 1], - c->d[o[0] + 1][o[1] + 0][o[2] + 1], - c->d[o[0] + 1][o[1] + 1][o[2] + 1], - c->d[o[0] + 0][o[1] + 1][o[2] + 1]}; - /* Normal */ -#if 1 - const btScalar gx[] = {d[1] - d[0], d[2] - d[3], - d[5] - d[4], d[6] - d[7]}; - const btScalar gy[] = {d[3] - d[0], d[2] - d[1], - d[7] - d[4], d[6] - d[5]}; - const btScalar gz[] = {d[4] - d[0], d[5] - d[1], - d[7] - d[3], d[6] - d[2]}; - normal.setX(Lerp(Lerp(gx[0], gx[1], iy.f), - Lerp(gx[2], gx[3], iy.f), iz.f)); - normal.setY(Lerp(Lerp(gy[0], gy[1], ix.f), - Lerp(gy[2], gy[3], ix.f), iz.f)); - normal.setZ(Lerp(Lerp(gz[0], gz[1], ix.f), - Lerp(gz[2], gz[3], ix.f), iy.f)); - normal.safeNormalize(); -#else - normal = btVector3(d[1] - d[0], d[3] - d[0], d[4] - d[0]).normalized(); -#endif - /* Distance */ - const btScalar d0 = Lerp(Lerp(d[0], d[1], ix.f), - Lerp(d[3], d[2], ix.f), iy.f); - const btScalar d1 = Lerp(Lerp(d[4], d[5], ix.f), - Lerp(d[7], d[6], ix.f), iy.f); - return (Lerp(d0, d1, iz.f) - margin); - } - // - void BuildCell(Cell& c) - { - const btVector3 org = btVector3((btScalar)c.c[0], - (btScalar)c.c[1], - (btScalar)c.c[2]) * - CELLSIZE * voxelsz; - for (int k = 0; k <= CELLSIZE; ++k) - { - const btScalar z = voxelsz * k + org.z(); - for (int j = 0; j <= CELLSIZE; ++j) - { - const btScalar y = voxelsz * j + org.y(); - for (int i = 0; i <= CELLSIZE; ++i) - { - const btScalar x = voxelsz * i + org.x(); - c.d[i][j][k] = DistanceToShape(btVector3(x, y, z), - c.pclient); - } - } - } - } - // - static inline btScalar DistanceToShape(const btVector3& x, - const btCollisionShape* shape) - { - btTransform unit; - unit.setIdentity(); - if (shape->isConvex()) - { - btGjkEpaSolver2::sResults res; - const btConvexShape* csh = static_cast(shape); - return (btGjkEpaSolver2::SignedDistance(x, 0, csh, unit, res)); - } - return (0); - } - // - static inline IntFrac Decompose(btScalar x) - { - /* That one need a lot of improvements... */ - /* Remove test, faster floor... */ - IntFrac r; - x /= CELLSIZE; - const int o = x < 0 ? (int)(-x + 1) : 0; - x += o; - r.b = (int)x; - const btScalar k = (x - r.b) * CELLSIZE; - r.i = (int)k; - r.f = k - r.i; - r.b -= o; - return (r); - } - // - static inline btScalar Lerp(btScalar a, btScalar b, btScalar t) - { - return (a + (b - a) * t); - } - - // - static inline unsigned int Hash(int x, int y, int z, const btCollisionShape* shape) - { - struct btS - { - int x, y, z, w; - void* p; - }; - - btS myset; - //memset may be needed in case of additional (uninitialized) padding! - //memset(&myset, 0, sizeof(btS)); - - myset.x = x; - myset.y = y; - myset.z = z; - myset.w = 0; - myset.p = (void*)shape; - const char* ptr = (const char*)&myset; - - unsigned int result = HsiehHash(ptr, sizeof(btS)); - - return result; - } -}; - -#endif //BT_SPARSE_SDF_H diff --git a/engine/inc/bullet/BulletSoftBody/poly34.h b/engine/inc/bullet/BulletSoftBody/poly34.h deleted file mode 100644 index 35a52c5f..00000000 --- a/engine/inc/bullet/BulletSoftBody/poly34.h +++ /dev/null @@ -1,38 +0,0 @@ -// poly34.h : solution of cubic and quartic equation -// (c) Khashin S.I. http://math.ivanovo.ac.ru/dalgebra/Khashin/index.html -// khash2 (at) gmail.com - -#ifndef POLY_34 -#define POLY_34 -#include "LinearMath/btScalar.h" -// x - array of size 2 -// return 2: 2 real roots x[0], x[1] -// return 0: pair of complex roots: x[0]i*x[1] -int SolveP2(btScalar* x, btScalar a, btScalar b); // solve equation x^2 + a*x + b = 0 - -// x - array of size 3 -// return 3: 3 real roots x[0], x[1], x[2] -// return 1: 1 real root x[0] and pair of complex roots: x[1]i*x[2] -int SolveP3(btScalar* x, btScalar a, btScalar b, btScalar c); // solve cubic equation x^3 + a*x^2 + b*x + c = 0 - -// x - array of size 4 -// return 4: 4 real roots x[0], x[1], x[2], x[3], possible multiple roots -// return 2: 2 real roots x[0], x[1] and complex x[2]i*x[3], -// return 0: two pair of complex roots: x[0]i*x[1], x[2]i*x[3], -int SolveP4(btScalar* x, btScalar a, btScalar b, btScalar c, btScalar d); // solve equation x^4 + a*x^3 + b*x^2 + c*x + d = 0 by Dekart-Euler method - -// x - array of size 5 -// return 5: 5 real roots x[0], x[1], x[2], x[3], x[4], possible multiple roots -// return 3: 3 real roots x[0], x[1], x[2] and complex x[3]i*x[4], -// return 1: 1 real root x[0] and two pair of complex roots: x[1]i*x[2], x[3]i*x[4], -int SolveP5(btScalar* x, btScalar a, btScalar b, btScalar c, btScalar d, btScalar e); // solve equation x^5 + a*x^4 + b*x^3 + c*x^2 + d*x + e = 0 - -//----------------------------------------------------------------------------- -// And some additional functions for internal use. -// Your may remove this definitions from here -int SolveP4Bi(btScalar* x, btScalar b, btScalar d); // solve equation x^4 + b*x^2 + d = 0 -int SolveP4De(btScalar* x, btScalar b, btScalar c, btScalar d); // solve equation x^4 + b*x^2 + c*x + d = 0 -void CSqrt(btScalar x, btScalar y, btScalar& a, btScalar& b); // returns as a+i*s, sqrt(x+i*y) -btScalar N4Step(btScalar x, btScalar a, btScalar b, btScalar c, btScalar d); // one Newton step for x^4 + a*x^3 + b*x^2 + c*x + d -btScalar SolveP5_1(btScalar a, btScalar b, btScalar c, btScalar d, btScalar e); // return real root of x^5 + a*x^4 + b*x^3 + c*x^2 + d*x + e = 0 -#endif diff --git a/engine/inc/bullet/BulletWorldImporter/btBulletWorldImporter.h b/engine/inc/bullet/BulletWorldImporter/btBulletWorldImporter.h deleted file mode 100644 index 0a856bc3..00000000 --- a/engine/inc/bullet/BulletWorldImporter/btBulletWorldImporter.h +++ /dev/null @@ -1,52 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2012 Erwin Coumans http://bulletphysics.org - -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_WORLD_IMPORTER_H -#define BULLET_WORLD_IMPORTER_H - -#include "btWorldImporter.h" - -class btBulletFile; - -namespace bParse -{ -class btBulletFile; - -}; - -///The btBulletWorldImporter is a starting point to import .bullet files. -///note that not all data is converted yet. You are expected to override or modify this class. -///See Bullet/Demos/SerializeDemo for a derived class that extract btSoftBody objects too. -class btBulletWorldImporter : public btWorldImporter -{ -public: - btBulletWorldImporter(btDynamicsWorld* world = 0); - - virtual ~btBulletWorldImporter(); - - ///if you pass a valid preSwapFilenameOut, it will save a new file with a different endianness - ///this pre-swapped file can be loaded without swapping on a target platform of different endianness - bool loadFile(const char* fileName, const char* preSwapFilenameOut = 0); - - ///the memoryBuffer might be modified (for example if endian swaps are necessary) - bool loadFileFromMemory(char* memoryBuffer, int len); - - bool loadFileFromMemory(bParse::btBulletFile* file); - - //call make sure bulletFile2 has been parsed, either using btBulletFile::parse or btBulletWorldImporter::loadFileFromMemory - virtual bool convertAllObjects(bParse::btBulletFile* file); -}; - -#endif //BULLET_WORLD_IMPORTER_H diff --git a/engine/inc/bullet/BulletWorldImporter/btMultiBodyWorldImporter.h b/engine/inc/bullet/BulletWorldImporter/btMultiBodyWorldImporter.h deleted file mode 100644 index 46dd3ce2..00000000 --- a/engine/inc/bullet/BulletWorldImporter/btMultiBodyWorldImporter.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef BT_MULTIBODY_WORLD_IMPORTER_H -#define BT_MULTIBODY_WORLD_IMPORTER_H - -#include "btBulletWorldImporter.h" - -class btMultiBodyWorldImporter : public btBulletWorldImporter -{ - struct btMultiBodyWorldImporterInternalData* m_data; - -public: - btMultiBodyWorldImporter(class btMultiBodyDynamicsWorld* world); - virtual ~btMultiBodyWorldImporter(); - - virtual bool convertAllObjects(bParse::btBulletFile* bulletFile2); - - virtual void deleteAllData(); -}; - -#endif //BT_MULTIBODY_WORLD_IMPORTER_H diff --git a/engine/inc/bullet/BulletWorldImporter/btWorldImporter.h b/engine/inc/bullet/BulletWorldImporter/btWorldImporter.h deleted file mode 100644 index ba087fba..00000000 --- a/engine/inc/bullet/BulletWorldImporter/btWorldImporter.h +++ /dev/null @@ -1,227 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2012 Erwin Coumans http://bulletphysics.org - -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_WORLD_IMPORTER_H -#define BT_WORLD_IMPORTER_H - -#include "LinearMath/btTransform.h" -#include "LinearMath/btVector3.h" -#include "LinearMath/btAlignedObjectArray.h" -#include "LinearMath/btHashMap.h" - -class btCollisionShape; -class btCollisionObject; -class btRigidBody; -class btTypedConstraint; -class btDynamicsWorld; -struct ConstraintInput; -class btRigidBodyColladaInfo; -struct btCollisionShapeData; -class btTriangleIndexVertexArray; -class btStridingMeshInterface; -struct btStridingMeshInterfaceData; -class btGImpactMeshShape; -class btOptimizedBvh; -struct btTriangleInfoMap; -class btBvhTriangleMeshShape; -class btPoint2PointConstraint; -class btHingeConstraint; -class btConeTwistConstraint; -class btGeneric6DofConstraint; -class btGeneric6DofSpringConstraint; -class btGeneric6DofSpring2Constraint; -class btSliderConstraint; -class btGearConstraint; -struct btContactSolverInfo; -struct btTypedConstraintData; -struct btTypedConstraintFloatData; -struct btTypedConstraintDoubleData; - -struct btRigidBodyDoubleData; -struct btRigidBodyFloatData; - -#ifdef BT_USE_DOUBLE_PRECISION -#define btRigidBodyData btRigidBodyDoubleData -#else -#define btRigidBodyData btRigidBodyFloatData -#endif //BT_USE_DOUBLE_PRECISION - -enum btWorldImporterFlags -{ - eRESTORE_EXISTING_OBJECTS = 1, //don't create new objects -}; - -class btWorldImporter -{ -protected: - btDynamicsWorld* m_dynamicsWorld; - - int m_verboseMode; - int m_importerFlags; - - btAlignedObjectArray m_allocatedCollisionShapes; - btAlignedObjectArray m_allocatedRigidBodies; - btAlignedObjectArray m_allocatedConstraints; - btAlignedObjectArray m_allocatedBvhs; - btAlignedObjectArray m_allocatedTriangleInfoMaps; - btAlignedObjectArray m_allocatedTriangleIndexArrays; - btAlignedObjectArray m_allocatedbtStridingMeshInterfaceDatas; - - btAlignedObjectArray m_allocatedNames; - - btAlignedObjectArray m_indexArrays; - btAlignedObjectArray m_shortIndexArrays; - btAlignedObjectArray m_charIndexArrays; - - btAlignedObjectArray m_floatVertexArrays; - btAlignedObjectArray m_doubleVertexArrays; - - btHashMap m_bvhMap; - btHashMap m_timMap; - - btHashMap m_nameShapeMap; - btHashMap m_nameBodyMap; - btHashMap m_nameConstraintMap; - btHashMap m_objectNameMap; - - btHashMap m_shapeMap; - btHashMap m_bodyMap; - - //methods - - static btRigidBody& getFixedBody(); - - char* duplicateName(const char* name); - - btCollisionShape* convertCollisionShape(btCollisionShapeData* shapeData); - - void convertConstraintBackwardsCompatible281(btTypedConstraintData* constraintData, btRigidBody* rbA, btRigidBody* rbB, int fileVersion); - void convertConstraintFloat(btTypedConstraintFloatData* constraintData, btRigidBody* rbA, btRigidBody* rbB, int fileVersion); - void convertConstraintDouble(btTypedConstraintDoubleData* constraintData, btRigidBody* rbA, btRigidBody* rbB, int fileVersion); - void convertRigidBodyFloat(btRigidBodyFloatData* colObjData); - void convertRigidBodyDouble(btRigidBodyDoubleData* colObjData); - -public: - btWorldImporter(btDynamicsWorld* world); - - virtual ~btWorldImporter(); - - ///delete all memory collision shapes, rigid bodies, constraints etc. allocated during the load. - ///make sure you don't use the dynamics world containing objects after you call this method - virtual void deleteAllData(); - - void setVerboseMode(int verboseMode) - { - m_verboseMode = verboseMode; - } - - int getVerboseMode() const - { - return m_verboseMode; - } - - void setImporterFlags(int importerFlags) - { - m_importerFlags = importerFlags; - } - - int getImporterFlags() const - { - return m_importerFlags; - } - - // query for data - int getNumCollisionShapes() const; - btCollisionShape* getCollisionShapeByIndex(int index); - int getNumRigidBodies() const; - btCollisionObject* getRigidBodyByIndex(int index) const; - int getNumConstraints() const; - btTypedConstraint* getConstraintByIndex(int index) const; - int getNumBvhs() const; - btOptimizedBvh* getBvhByIndex(int index) const; - int getNumTriangleInfoMaps() const; - btTriangleInfoMap* getTriangleInfoMapByIndex(int index) const; - - // queris involving named objects - btCollisionShape* getCollisionShapeByName(const char* name); - btRigidBody* getRigidBodyByName(const char* name); - btTypedConstraint* getConstraintByName(const char* name); - const char* getNameForPointer(const void* ptr) const; - - ///those virtuals are called by load and can be overridden by the user - - virtual void setDynamicsWorldInfo(const btVector3& gravity, const btContactSolverInfo& solverInfo); - - //bodies - virtual btRigidBody* createRigidBody(bool isDynamic, btScalar mass, const btTransform& startTransform, btCollisionShape* shape, const char* bodyName); - virtual btCollisionObject* createCollisionObject(const btTransform& startTransform, btCollisionShape* shape, const char* bodyName); - - ///shapes - - virtual btCollisionShape* createPlaneShape(const btVector3& planeNormal, btScalar planeConstant); - virtual btCollisionShape* createBoxShape(const btVector3& halfExtents); - virtual btCollisionShape* createSphereShape(btScalar radius); - virtual btCollisionShape* createCapsuleShapeX(btScalar radius, btScalar height); - virtual btCollisionShape* createCapsuleShapeY(btScalar radius, btScalar height); - virtual btCollisionShape* createCapsuleShapeZ(btScalar radius, btScalar height); - - virtual btCollisionShape* createCylinderShapeX(btScalar radius, btScalar height); - virtual btCollisionShape* createCylinderShapeY(btScalar radius, btScalar height); - virtual btCollisionShape* createCylinderShapeZ(btScalar radius, btScalar height); - virtual btCollisionShape* createConeShapeX(btScalar radius, btScalar height); - virtual btCollisionShape* createConeShapeY(btScalar radius, btScalar height); - virtual btCollisionShape* createConeShapeZ(btScalar radius, btScalar height); - virtual class btTriangleIndexVertexArray* createTriangleMeshContainer(); - virtual btBvhTriangleMeshShape* createBvhTriangleMeshShape(btStridingMeshInterface* trimesh, btOptimizedBvh* bvh); - virtual btCollisionShape* createConvexTriangleMeshShape(btStridingMeshInterface* trimesh); - virtual btGImpactMeshShape* createGimpactShape(btStridingMeshInterface* trimesh); - virtual btStridingMeshInterfaceData* createStridingMeshInterfaceData(btStridingMeshInterfaceData* interfaceData); - - virtual class btConvexHullShape* createConvexHullShape(); - virtual class btCompoundShape* createCompoundShape(); - virtual class btScaledBvhTriangleMeshShape* createScaledTrangleMeshShape(btBvhTriangleMeshShape* meshShape, const btVector3& localScalingbtBvhTriangleMeshShape); - - virtual class btMultiSphereShape* createMultiSphereShape(const btVector3* positions, const btScalar* radi, int numSpheres); - - virtual btTriangleIndexVertexArray* createMeshInterface(btStridingMeshInterfaceData& meshData); - - virtual class btHeightfieldTerrainShape* createHeightfieldShape(int heightStickWidth, int heightStickLength, - const void* heightfieldData, btScalar heightScale, - btScalar minHeight, btScalar maxHeight, - int upAxis, int heightDataType, - bool flipQuadEdges); - - ///acceleration and connectivity structures - virtual btOptimizedBvh* createOptimizedBvh(); - virtual btTriangleInfoMap* createTriangleInfoMap(); - - ///constraints - virtual btPoint2PointConstraint* createPoint2PointConstraint(btRigidBody& rbA, btRigidBody& rbB, const btVector3& pivotInA, const btVector3& pivotInB); - virtual btPoint2PointConstraint* createPoint2PointConstraint(btRigidBody& rbA, const btVector3& pivotInA); - virtual btHingeConstraint* createHingeConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& rbAFrame, const btTransform& rbBFrame, bool useReferenceFrameA = false); - virtual btHingeConstraint* createHingeConstraint(btRigidBody& rbA, const btTransform& rbAFrame, bool useReferenceFrameA = false); - virtual btConeTwistConstraint* createConeTwistConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& rbAFrame, const btTransform& rbBFrame); - virtual btConeTwistConstraint* createConeTwistConstraint(btRigidBody& rbA, const btTransform& rbAFrame); - virtual btGeneric6DofConstraint* createGeneric6DofConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB, bool useLinearReferenceFrameA); - virtual btGeneric6DofConstraint* createGeneric6DofConstraint(btRigidBody& rbB, const btTransform& frameInB, bool useLinearReferenceFrameB); - virtual btGeneric6DofSpringConstraint* createGeneric6DofSpringConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB, bool useLinearReferenceFrameA); - virtual btGeneric6DofSpring2Constraint* createGeneric6DofSpring2Constraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB, int rotateOrder); - - virtual btSliderConstraint* createSliderConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB, bool useLinearReferenceFrameA); - virtual btSliderConstraint* createSliderConstraint(btRigidBody& rbB, const btTransform& frameInB, bool useLinearReferenceFrameA); - virtual btGearConstraint* createGearConstraint(btRigidBody& rbA, btRigidBody& rbB, const btVector3& axisInA, const btVector3& axisInB, btScalar ratio); -}; - -#endif //BT_WORLD_IMPORTER_H \ No newline at end of file diff --git a/engine/inc/bullet/BulletXmlWorldImporter/btBulletXmlWorldImporter.h b/engine/inc/bullet/BulletXmlWorldImporter/btBulletXmlWorldImporter.h deleted file mode 100644 index aa88c088..00000000 --- a/engine/inc/bullet/BulletXmlWorldImporter/btBulletXmlWorldImporter.h +++ /dev/null @@ -1,89 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2012 Erwin Coumans http://bulletphysics.org - -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_BULLET_XML_WORLD_IMPORTER_H -#define BT_BULLET_XML_WORLD_IMPORTER_H - -#include "LinearMath/btScalar.h" - -class btDynamicsWorld; - -namespace tinyxml2 -{ -class XMLNode; -}; - -struct btConvexInternalShapeData; -struct btCollisionShapeData; -#ifdef BT_USE_DOUBLE_PRECISION -struct btRigidBodyDoubleData; -struct btTypedConstraintDoubleData; -#define btRigidBodyData btRigidBodyDoubleData -#define btTypedConstraintData2 btTypedConstraintDoubleData -#else -struct btRigidBodyFloatData; -struct btTypedConstraintFloatData; -#define btTypedConstraintData2 btTypedConstraintFloatData -#define btRigidBodyData btRigidBodyFloatData -#endif //BT_USE_DOUBLE_PRECISION - -struct btCompoundShapeChildData; - -#include "LinearMath/btAlignedObjectArray.h" -#include "btWorldImporter.h" - -class btBulletXmlWorldImporter : public btWorldImporter -{ -protected: - btAlignedObjectArray m_collisionShapeData; - btAlignedObjectArray*> m_compoundShapeChildDataArrays; - btAlignedObjectArray m_rigidBodyData; - btAlignedObjectArray m_constraintData; - btHashMap m_pointerLookup; - int m_fileVersion; - bool m_fileOk; - - void auto_serialize_root_level_children(tinyxml2::XMLNode* pParent); - void auto_serialize(tinyxml2::XMLNode* pParent); - - void deSerializeVector3FloatData(tinyxml2::XMLNode* pParent, btAlignedObjectArray& vectors); - - void fixupCollisionDataPointers(btCollisionShapeData* shapeData); - void fixupConstraintData(btTypedConstraintData2* tcd); - - //collision shapes data - void deSerializeCollisionShapeData(tinyxml2::XMLNode* pParent, btCollisionShapeData* colShapeData); - void deSerializeConvexInternalShapeData(tinyxml2::XMLNode* pParent); - void deSerializeStaticPlaneShapeData(tinyxml2::XMLNode* pParent); - void deSerializeCompoundShapeData(tinyxml2::XMLNode* pParent); - void deSerializeCompoundShapeChildData(tinyxml2::XMLNode* pParent); - void deSerializeConvexHullShapeData(tinyxml2::XMLNode* pParent); - void deSerializeDynamicsWorldData(tinyxml2::XMLNode* parent); - - ///bodies - void deSerializeRigidBodyFloatData(tinyxml2::XMLNode* pParent); - - ///constraints - void deSerializeGeneric6DofConstraintData(tinyxml2::XMLNode* pParent); - -public: - btBulletXmlWorldImporter(btDynamicsWorld* world); - - virtual ~btBulletXmlWorldImporter(); - - bool loadFile(const char* fileName); -}; - -#endif //BT_BULLET_XML_WORLD_IMPORTER_H diff --git a/engine/inc/bullet/BulletXmlWorldImporter/string_split.h b/engine/inc/bullet/BulletXmlWorldImporter/string_split.h deleted file mode 100644 index 16d629d6..00000000 --- a/engine/inc/bullet/BulletXmlWorldImporter/string_split.h +++ /dev/null @@ -1,46 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2012 Erwin Coumans http://bulletphysics.org - -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. -*/ - -///The string split C code is by Lars Wirzenius -///See http://stackoverflow.com/questions/2531605/how-to-split-a-string-with-a-delimiter-larger-than-one-single-char - -#ifndef STRING_SPLIT_H -#define STRING_SPLIT_H - -#include -#include "LinearMath/btAlignedObjectArray.h" - -#include - -namespace bullet_utils -{ -void split(btAlignedObjectArray& pieces, const std::string& vector_str, const std::string& separator); -}; - -///The string split C code is by Lars Wirzenius -///See http://stackoverflow.com/questions/2531605/how-to-split-a-string-with-a-delimiter-larger-than-one-single-char - -/* Split a string into substrings. Return dynamic array of dynamically - allocated substrings, or NULL if there was an error. Caller is - expected to free the memory, for example with str_array_free. */ -char** str_split(const char* input, const char* sep); - -/* Free a dynamic array of dynamic strings. */ -void str_array_free(char** array); - -/* Return length of a NULL-delimited array of strings. */ -size_t str_array_len(char** array); - -#endif //STRING_SPLIT_H diff --git a/engine/inc/bullet/Collision/CollisionSdkC_Api.h b/engine/inc/bullet/Collision/CollisionSdkC_Api.h deleted file mode 100644 index afbe453f..00000000 --- a/engine/inc/bullet/Collision/CollisionSdkC_Api.h +++ /dev/null @@ -1,104 +0,0 @@ -#ifndef LW_COLLISION_C_API_H -#define LW_COLLISION_C_API_H - -#define PL_DECLARE_HANDLE(name) \ - typedef struct name##__ \ - { \ - int unused; \ - } * name - -#ifdef BT_USE_DOUBLE_PRECISION -typedef double plReal; -#else -typedef float plReal; -#endif - -typedef plReal plVector3[3]; -typedef plReal plQuaternion[4]; - -#ifdef __cplusplus -extern "C" -{ -#endif - - /** Particular collision SDK (C-API) */ - PL_DECLARE_HANDLE(plCollisionSdkHandle); - - /** Collision world, belonging to some collision SDK (C-API)*/ - PL_DECLARE_HANDLE(plCollisionWorldHandle); - - /** Collision object that can be part of a collision World (C-API)*/ - PL_DECLARE_HANDLE(plCollisionObjectHandle); - - /** Collision Shape/Geometry, property of a collision object (C-API)*/ - PL_DECLARE_HANDLE(plCollisionShapeHandle); - - /* Collision SDK */ - - extern plCollisionSdkHandle plCreateBullet2CollisionSdk(); - -#ifndef DISABLE_REAL_TIME_BULLET3_COLLISION_SDK - extern plCollisionSdkHandle plCreateRealTimeBullet3CollisionSdk(); -#endif //DISABLE_REAL_TIME_BULLET3_COLLISION_SDK - - // extern plCollisionSdkHandle plCreateCustomCollisionSdk(); - - extern void plDeleteCollisionSdk(plCollisionSdkHandle collisionSdkHandle); - - //extern int plGetSdkWorldCreationIntParameter(); - //extern int plSetSdkWorldCreationIntParameter(int newValue); - - /* Collision World */ - - extern plCollisionWorldHandle plCreateCollisionWorld(plCollisionSdkHandle collisionSdkHandle, int maxNumObjsCapacity, int maxNumShapesCapacity, int maxNumPairsCapacity); - extern void plDeleteCollisionWorld(plCollisionSdkHandle sdkHandle, plCollisionWorldHandle world); - - extern void plAddCollisionObject(plCollisionSdkHandle sdkHandle, plCollisionWorldHandle world, plCollisionObjectHandle object); - extern void plRemoveCollisionObject(plCollisionSdkHandle sdkHandle, plCollisionWorldHandle world, plCollisionObjectHandle object); - - /* Collision Object */ - - extern plCollisionObjectHandle plCreateCollisionObject(plCollisionSdkHandle sdkHandle, plCollisionWorldHandle worldHandle, void* userPointer, int userIndex, plCollisionShapeHandle cshape, plVector3 startPosition, plQuaternion startOrientation); - extern void plDeleteCollisionObject(plCollisionSdkHandle sdkHandle, plCollisionWorldHandle worldHandle, plCollisionObjectHandle body); - extern void plSetCollisionObjectTransform(plCollisionSdkHandle sdkHandle, plCollisionWorldHandle worldHandle, plCollisionObjectHandle objHandle, plVector3 startPosition, plQuaternion startOrientation); - - /* Collision Shape definition */ - - extern plCollisionShapeHandle plCreateSphereShape(plCollisionSdkHandle sdk, plCollisionWorldHandle worldHandle, plReal radius); - extern plCollisionShapeHandle plCreateCapsuleShape(plCollisionSdkHandle sdk, plCollisionWorldHandle worldHandle, plReal radius, plReal height, int capsuleAxis); - extern plCollisionShapeHandle plCreatePlaneShape(plCollisionSdkHandle sdk, plCollisionWorldHandle worldHandle, - plReal planeNormalX, - plReal planeNormalY, - plReal planeNormalZ, - plReal planeConstant); - extern plCollisionShapeHandle plCreateCompoundShape(plCollisionSdkHandle sdk, plCollisionWorldHandle worldHandle); - extern void plAddChildShape(plCollisionSdkHandle collisionSdkHandle, plCollisionWorldHandle worldHandle, plCollisionShapeHandle compoundShape, plCollisionShapeHandle childShape, plVector3 childPos, plQuaternion childOrn); - - extern void plDeleteShape(plCollisionSdkHandle collisionSdkHandle, plCollisionWorldHandle worldHandle, plCollisionShapeHandle shape); - - /* Contact Results */ - - struct lwContactPoint - { - plVector3 m_ptOnAWorld; - plVector3 m_ptOnBWorld; - plVector3 m_normalOnB; - plReal m_distance; - }; - - /* Collision Filtering */ - typedef void (*plNearCallback)(plCollisionSdkHandle sdkHandle, plCollisionWorldHandle worldHandle, void* userData, - plCollisionObjectHandle objA, plCollisionObjectHandle objB); - - /* Collision Queries */ - extern int plCollide(plCollisionSdkHandle sdkHandle, plCollisionWorldHandle worldHandle, plCollisionObjectHandle colA, plCollisionObjectHandle colB, - lwContactPoint* pointsOut, int pointCapacity); - - extern void plWorldCollide(plCollisionSdkHandle sdkHandle, plCollisionWorldHandle world, - plNearCallback filter, void* userData); - -#ifdef __cplusplus -} -#endif - -#endif //LW_COLLISION_C_API_H diff --git a/engine/inc/bullet/Collision/CollisionTutorialBullet2.h b/engine/inc/bullet/Collision/CollisionTutorialBullet2.h deleted file mode 100644 index 6ed76f24..00000000 --- a/engine/inc/bullet/Collision/CollisionTutorialBullet2.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef COLLISION_TUTORIAL_H -#define COLLISION_TUTORIAL_H - -enum EnumCollisionTutorialTypes -{ - TUT_SPHERE_PLANE_BULLET2 = 0, - TUT_SPHERE_PLANE_RTB3, -}; - -class CommonExampleInterface* CollisionTutorialBullet2CreateFunc(struct CommonExampleOptions& options); - -#endif //COLLISION_TUTORIAL_H diff --git a/engine/inc/bullet/Collision/Internal/Bullet2CollisionSdk.h b/engine/inc/bullet/Collision/Internal/Bullet2CollisionSdk.h deleted file mode 100644 index ce46b0ba..00000000 --- a/engine/inc/bullet/Collision/Internal/Bullet2CollisionSdk.h +++ /dev/null @@ -1,55 +0,0 @@ -#ifndef BULLET2_COLLISION_SDK_H -#define BULLET2_COLLISION_SDK_H - -#include "CollisionSdkInterface.h" - -class Bullet2CollisionSdk : public CollisionSdkInterface -{ - struct Bullet2CollisionSdkInternalData* m_internalData; - -public: - Bullet2CollisionSdk(); - - virtual ~Bullet2CollisionSdk(); - - virtual plCollisionWorldHandle createCollisionWorld(int maxNumObjsCapacity, int maxNumShapesCapacity, int maxNumPairsCapacity); - - virtual void deleteCollisionWorld(plCollisionWorldHandle worldHandle); - - virtual plCollisionShapeHandle createSphereShape(plCollisionWorldHandle worldHandle, plReal radius); - - virtual plCollisionShapeHandle createPlaneShape(plCollisionWorldHandle worldHandle, - plReal planeNormalX, - plReal planeNormalY, - plReal planeNormalZ, - plReal planeConstant); - - virtual plCollisionShapeHandle createCapsuleShape(plCollisionWorldHandle worldHandle, - plReal radius, - plReal height, - int capsuleAxis); - - virtual plCollisionShapeHandle createCompoundShape(plCollisionWorldHandle worldHandle); - virtual void addChildShape(plCollisionWorldHandle worldHandle, plCollisionShapeHandle compoundShape, plCollisionShapeHandle childShape, plVector3 childPos, plQuaternion childOrn); - - virtual void deleteShape(plCollisionWorldHandle worldHandle, plCollisionShapeHandle shape); - - virtual void addCollisionObject(plCollisionWorldHandle world, plCollisionObjectHandle object); - virtual void removeCollisionObject(plCollisionWorldHandle world, plCollisionObjectHandle object); - - virtual plCollisionObjectHandle createCollisionObject(plCollisionWorldHandle worldHandle, void* userPointer, int userIndex, plCollisionShapeHandle cshape, - plVector3 startPosition, plQuaternion startOrientation); - virtual void deleteCollisionObject(plCollisionObjectHandle body); - virtual void setCollisionObjectTransform(plCollisionWorldHandle world, plCollisionObjectHandle body, - plVector3 position, plQuaternion orientation); - - virtual int collide(plCollisionWorldHandle world, plCollisionObjectHandle colA, plCollisionObjectHandle colB, - lwContactPoint* pointsOut, int pointCapacity); - - virtual void collideWorld(plCollisionWorldHandle world, - plNearCallback filter, void* userData); - - static plCollisionSdkHandle createBullet2SdkHandle(); -}; - -#endif //BULLET2_COLLISION_SDK_H diff --git a/engine/inc/bullet/Collision/Internal/CollisionSdkInterface.h b/engine/inc/bullet/Collision/Internal/CollisionSdkInterface.h deleted file mode 100644 index 88c1d8af..00000000 --- a/engine/inc/bullet/Collision/Internal/CollisionSdkInterface.h +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef COLLISION_SDK_INTERFACE_H -#define COLLISION_SDK_INTERFACE_H - -#include "../CollisionSdkC_Api.h" - -class CollisionSdkInterface -{ -public: - virtual ~CollisionSdkInterface() - { - } - - virtual plCollisionWorldHandle createCollisionWorld(int maxNumObjsCapacity, int maxNumShapesCapacity, int maxNumPairsCapacity) = 0; - - virtual void deleteCollisionWorld(plCollisionWorldHandle worldHandle) = 0; - - virtual plCollisionShapeHandle createSphereShape(plCollisionWorldHandle worldHandle, plReal radius) = 0; - - virtual plCollisionShapeHandle createPlaneShape(plCollisionWorldHandle worldHandle, - plReal planeNormalX, - plReal planeNormalY, - plReal planeNormalZ, - plReal planeConstant) = 0; - - virtual plCollisionShapeHandle createCapsuleShape(plCollisionWorldHandle worldHandle, - plReal radius, - plReal height, - int capsuleAxis) = 0; - - virtual plCollisionShapeHandle createCompoundShape(plCollisionWorldHandle worldHandle) = 0; - virtual void addChildShape(plCollisionWorldHandle worldHandle, plCollisionShapeHandle compoundShape, plCollisionShapeHandle childShape, plVector3 childPos, plQuaternion childOrn) = 0; - - virtual void deleteShape(plCollisionWorldHandle worldHandle, plCollisionShapeHandle shape) = 0; - - virtual void addCollisionObject(plCollisionWorldHandle world, plCollisionObjectHandle object) = 0; - virtual void removeCollisionObject(plCollisionWorldHandle world, plCollisionObjectHandle object) = 0; - - virtual plCollisionObjectHandle createCollisionObject(plCollisionWorldHandle worldHandle, void* userPointer, int userIndex, plCollisionShapeHandle cshape, - plVector3 startPosition, plQuaternion startOrientation) = 0; - virtual void deleteCollisionObject(plCollisionObjectHandle body) = 0; - virtual void setCollisionObjectTransform(plCollisionWorldHandle world, plCollisionObjectHandle body, - plVector3 position, plQuaternion orientation) = 0; - - virtual int collide(plCollisionWorldHandle world, plCollisionObjectHandle colA, plCollisionObjectHandle colB, - lwContactPoint* pointsOut, int pointCapacity) = 0; - - virtual void collideWorld(plCollisionWorldHandle world, - plNearCallback filter, void* userData) = 0; -}; - -#endif //COLLISION_SDK_INTERFACE_H diff --git a/engine/inc/bullet/Collision/Internal/RealTimeBullet3CollisionSdk.h b/engine/inc/bullet/Collision/Internal/RealTimeBullet3CollisionSdk.h deleted file mode 100644 index 76b4042e..00000000 --- a/engine/inc/bullet/Collision/Internal/RealTimeBullet3CollisionSdk.h +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef REAL_TIME_COLLISION_SDK_H -#define REAL_TIME_COLLISION_SDK_H - -#include "CollisionSdkInterface.h" - -class RealTimeBullet3CollisionSdk : public CollisionSdkInterface -{ - struct RealTimeBullet3CollisionSdkInternalData* m_internalData; - -public: - RealTimeBullet3CollisionSdk(); - - virtual ~RealTimeBullet3CollisionSdk(); - - virtual plCollisionWorldHandle createCollisionWorld(int maxNumObjsCapacity, int maxNumShapesCapacity, int maxNumPairsCapacity); - - virtual void deleteCollisionWorld(plCollisionWorldHandle worldHandle); - - virtual plCollisionShapeHandle createSphereShape(plCollisionWorldHandle worldHandle, plReal radius); - virtual plCollisionShapeHandle createPlaneShape(plCollisionWorldHandle worldHandle, - plReal planeNormalX, - plReal planeNormalY, - plReal planeNormalZ, - plReal planeConstant); - virtual plCollisionShapeHandle createCapsuleShape(plCollisionWorldHandle worldHandle, - plReal radius, - plReal height, - int capsuleAxis); - - virtual plCollisionShapeHandle createCompoundShape(plCollisionWorldHandle worldHandle); - virtual void addChildShape(plCollisionWorldHandle worldHandle, plCollisionShapeHandle compoundShape, plCollisionShapeHandle childShape, plVector3 childPos, plQuaternion childOrn); - - virtual void deleteShape(plCollisionWorldHandle worldHandle, plCollisionShapeHandle shape); - - virtual void addCollisionObject(plCollisionWorldHandle world, plCollisionObjectHandle object); - virtual void removeCollisionObject(plCollisionWorldHandle world, plCollisionObjectHandle object); - - virtual plCollisionObjectHandle createCollisionObject(plCollisionWorldHandle worldHandle, void* userPointer, int userIndex, plCollisionShapeHandle cshape, - plVector3 startPosition, plQuaternion startOrientation); - virtual void deleteCollisionObject(plCollisionObjectHandle body); - virtual void setCollisionObjectTransform(plCollisionWorldHandle world, plCollisionObjectHandle body, - plVector3 position, plQuaternion orientation); - - virtual int collide(plCollisionWorldHandle world, plCollisionObjectHandle colA, plCollisionObjectHandle colB, - lwContactPoint* pointsOut, int pointCapacity); - - virtual void collideWorld(plCollisionWorldHandle world, - plNearCallback filter, void* userData); - - static plCollisionSdkHandle createRealTimeBullet3CollisionSdkHandle(); -}; - -#endif //REAL_TIME_COLLISION_SDK_H diff --git a/engine/inc/bullet/CommonInterfaces/Common2dCanvasInterface.h b/engine/inc/bullet/CommonInterfaces/Common2dCanvasInterface.h deleted file mode 100644 index 7d1e7f37..00000000 --- a/engine/inc/bullet/CommonInterfaces/Common2dCanvasInterface.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef COMMON_2D_CANVAS_INTERFACE_H -#define COMMON_2D_CANVAS_INTERFACE_H - -struct Common2dCanvasInterface -{ - virtual ~Common2dCanvasInterface() {} - virtual int createCanvas(const char* canvasName, int width, int height, int xPos, int yPos) = 0; - virtual void destroyCanvas(int canvasId) = 0; - virtual void setPixel(int canvasId, int x, int y, unsigned char red, unsigned char green, unsigned char blue, unsigned char alpha) = 0; - virtual void getPixel(int canvasId, int x, int y, unsigned char& red, unsigned char& green, unsigned char& blue, unsigned char& alpha) = 0; - - virtual void refreshImageData(int canvasId) = 0; -}; - -#endif //COMMON_2D_CANVAS_INTERFACE_H diff --git a/engine/inc/bullet/CommonInterfaces/CommonCallbacks.h b/engine/inc/bullet/CommonInterfaces/CommonCallbacks.h deleted file mode 100644 index 3047d143..00000000 --- a/engine/inc/bullet/CommonInterfaces/CommonCallbacks.h +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef COMMON_CALLBACKS_H -#define COMMON_CALLBACKS_H - -typedef void (*b3WheelCallback)(float deltax, float deltay); -typedef void (*b3ResizeCallback)(float width, float height); -typedef void (*b3MouseMoveCallback)(float x, float y); -typedef void (*b3MouseButtonCallback)(int button, int state, float x, float y); -typedef void (*b3KeyboardCallback)(int keycode, int state); -typedef void (*b3RenderCallback)(); - -enum -{ - B3G_ESCAPE = 27, - B3G_SPACE = 32, - B3G_F1 = 0xff00, - B3G_F2, - B3G_F3, - B3G_F4, - B3G_F5, - B3G_F6, - B3G_F7, - B3G_F8, - B3G_F9, - B3G_F10, - B3G_F11, - B3G_F12, - B3G_F13, - B3G_F14, - B3G_F15, - B3G_LEFT_ARROW, - B3G_RIGHT_ARROW, - B3G_UP_ARROW, - B3G_DOWN_ARROW, - B3G_PAGE_UP, - B3G_PAGE_DOWN, - B3G_END, - B3G_HOME, - B3G_INSERT, - B3G_DELETE, - B3G_BACKSPACE, - B3G_SHIFT, - B3G_CONTROL, - B3G_ALT, - B3G_RETURN, - -}; - -#endif diff --git a/engine/inc/bullet/CommonInterfaces/CommonCameraInterface.h b/engine/inc/bullet/CommonInterfaces/CommonCameraInterface.h deleted file mode 100644 index e0cfaa28..00000000 --- a/engine/inc/bullet/CommonInterfaces/CommonCameraInterface.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef COMMON_CAMERA_INTERFACE_H -#define COMMON_CAMERA_INTERFACE_H - -struct CommonCameraInterface -{ - virtual ~CommonCameraInterface() {} - virtual void getCameraProjectionMatrix(float m[16]) const = 0; - virtual void getCameraViewMatrix(float m[16]) const = 0; - - virtual void setVRCamera(const float viewMat[16], const float projectionMatrix[16]) = 0; - virtual void disableVRCamera() = 0; - virtual bool isVRCamera() const = 0; - virtual void setVRCameraOffsetTransform(const float offset[16]) = 0; - - virtual void getCameraTargetPosition(float pos[3]) const = 0; - virtual void getCameraPosition(float pos[3]) const = 0; - - virtual void getCameraTargetPosition(double pos[3]) const = 0; - virtual void getCameraPosition(double pos[3]) const = 0; - - virtual void setCameraTargetPosition(float x, float y, float z) = 0; - virtual void setCameraDistance(float dist) = 0; - virtual float getCameraDistance() const = 0; - - virtual void setCameraUpVector(float x, float y, float z) = 0; - virtual void getCameraUpVector(float up[3]) const = 0; - virtual void getCameraForwardVector(float fwd[3]) const = 0; - - ///the setCameraUpAxis will call the 'setCameraUpVector' and 'setCameraForwardVector' - virtual void setCameraUpAxis(int axis) = 0; - virtual int getCameraUpAxis() const = 0; - - virtual void setCameraYaw(float yaw) = 0; - virtual float getCameraYaw() const = 0; - - virtual void setCameraPitch(float pitch) = 0; - virtual float getCameraPitch() const = 0; - - virtual void setAspectRatio(float ratio) = 0; - virtual float getAspectRatio() const = 0; - - virtual float getCameraFrustumFar() const = 0; - virtual float getCameraFrustumNear() const = 0; -}; - -#endif //COMMON_CAMERA_INTERFACE_H diff --git a/engine/inc/bullet/CommonInterfaces/CommonDeformableBodyBase.h b/engine/inc/bullet/CommonInterfaces/CommonDeformableBodyBase.h deleted file mode 100644 index 90dbf8f0..00000000 --- a/engine/inc/bullet/CommonInterfaces/CommonDeformableBodyBase.h +++ /dev/null @@ -1,221 +0,0 @@ - -#ifndef COMMON_DEFORMABLE_BODY_SETUP_H -#define COMMON_DEFORMABLE_BODY_SETUP_H -#include "btBulletDynamicsCommon.h" -#include "BulletDynamics/Featherstone/btMultiBodyDynamicsWorld.h" -#include "BulletDynamics/Featherstone/btMultiBodyConstraintSolver.h" -#include "BulletDynamics/Featherstone/btMultiBodyPoint2Point.h" -#include "BulletDynamics/Featherstone/btMultiBodyLinkCollider.h" -#include "btBulletDynamicsCommon.h" -#include "CommonExampleInterface.h" -#include "CommonGUIHelperInterface.h" -#include "CommonRenderInterface.h" -#include "CommonGraphicsAppInterface.h" -#include "CommonWindowInterface.h" -#include "CommonCameraInterface.h" -#include "CommonMultiBodyBase.h" -#include "BulletSoftBody/btSoftBody.h" - -struct CommonDeformableBodyBase : public CommonMultiBodyBase -{ - btAlignedObjectArray m_forces; - btSoftBody* m_pickedSoftBody; - btDeformableMousePickingForce* m_mouseForce; - btScalar m_pickingForceElasticStiffness, m_pickingForceDampingStiffness, m_maxPickingForce; - CommonDeformableBodyBase(GUIHelperInterface* helper) - : CommonMultiBodyBase(helper), - m_pickedSoftBody(0), - m_mouseForce(0), - m_pickingForceElasticStiffness(100), - m_pickingForceDampingStiffness(0.0), - m_maxPickingForce(0.3) - { - } - - virtual btDeformableMultiBodyDynamicsWorld* getDeformableDynamicsWorld() - { - return (btDeformableMultiBodyDynamicsWorld*)m_dynamicsWorld; - } - - virtual const btDeformableMultiBodyDynamicsWorld* getDeformableDynamicsWorld() const - { - return (btDeformableMultiBodyDynamicsWorld*)m_dynamicsWorld; - } - - struct ClosestRayResultCallbackWithInfo : public btCollisionWorld::ClosestRayResultCallback - { - ClosestRayResultCallbackWithInfo(const btVector3& rayFromWorld, const btVector3& rayToWorld) - : ClosestRayResultCallback(rayFromWorld, rayToWorld) - { - } - int m_faceId; - - 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 (rayResult.m_localShapeInfo) - { - m_faceId = rayResult.m_localShapeInfo->m_triangleIndex; - } - else - { - m_faceId = -1; - } - 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 rayResult.m_hitFraction; - } - }; - - virtual bool pickBody(const btVector3& rayFromWorld, const btVector3& rayToWorld) - { - if (getDeformableDynamicsWorld() == 0) - return false; - ClosestRayResultCallbackWithInfo rayCallback(rayFromWorld, rayToWorld); - getDeformableDynamicsWorld()->rayTest(rayFromWorld, rayToWorld, rayCallback); - if (rayCallback.hasHit()) - { - btVector3 pickPos = rayCallback.m_hitPointWorld; - btRigidBody* body = (btRigidBody*)btRigidBody::upcast(rayCallback.m_collisionObject); - btSoftBody* psb = (btSoftBody*)btSoftBody::upcast(rayCallback.m_collisionObject); - m_oldPickingPos = rayToWorld; - m_hitPos = pickPos; - m_oldPickingDist = (pickPos - rayFromWorld).length(); - if (body) - { - if (!(body->isStaticObject() || body->isKinematicObject())) - { - m_pickedBody = body; - m_pickedBody->setActivationState(DISABLE_DEACTIVATION); - btVector3 localPivot = body->getCenterOfMassTransform().inverse() * pickPos; - btPoint2PointConstraint* p2p = new btPoint2PointConstraint(*body, localPivot); - m_dynamicsWorld->addConstraint(p2p, true); - m_pickedConstraint = p2p; - btScalar mousePickClamping = 30.f; - p2p->m_setting.m_impulseClamp = mousePickClamping; - //very weak constraint for picking - p2p->m_setting.m_tau = 0.001f; - } - } - else if (psb) - { - int face_id = rayCallback.m_faceId; - if (face_id >= 0 && face_id < psb->m_faces.size()) - { - m_pickedSoftBody = psb; - psb->setActivationState(DISABLE_DEACTIVATION); - const btSoftBody::Face& f = psb->m_faces[face_id]; - btDeformableMousePickingForce* mouse_force = new btDeformableMousePickingForce(m_pickingForceElasticStiffness, m_pickingForceDampingStiffness, f, m_hitPos, m_maxPickingForce); - m_mouseForce = mouse_force; - getDeformableDynamicsWorld()->addForce(psb, mouse_force); - } - } - else - { - btMultiBodyLinkCollider* multiCol = (btMultiBodyLinkCollider*)btMultiBodyLinkCollider::upcast(rayCallback.m_collisionObject); - if (multiCol && multiCol->m_multiBody) - { - m_prevCanSleep = multiCol->m_multiBody->getCanSleep(); - multiCol->m_multiBody->setCanSleep(false); - - btVector3 pivotInA = multiCol->m_multiBody->worldPosToLocal(multiCol->m_link, pickPos); - - btMultiBodyPoint2Point* p2p = new btMultiBodyPoint2Point(multiCol->m_multiBody, multiCol->m_link, 0, pivotInA, pickPos); - //if you add too much energy to the system, causing high angular velocities, simulation 'explodes' - //see also http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?f=4&t=949 - //so we try to avoid it by clamping the maximum impulse (force) that the mouse pick can apply - //it is not satisfying, hopefully we find a better solution (higher order integrator, using joint friction using a zero-velocity target motor with limited force etc?) - btScalar scaling = 1; - p2p->setMaxAppliedImpulse(2 * scaling); - btMultiBodyDynamicsWorld* world = (btMultiBodyDynamicsWorld*)m_dynamicsWorld; - world->addMultiBodyConstraint(p2p); - m_pickingMultiBodyPoint2Point = p2p; - } - } - } - return false; - } - - virtual bool movePickedBody(const btVector3& rayFromWorld, const btVector3& rayToWorld) - { - if (m_pickedBody && m_pickedConstraint) - { - btPoint2PointConstraint* pickCon = static_cast(m_pickedConstraint); - if (pickCon) - { - //keep it at the same picking distance - btVector3 newPivotB; - btVector3 dir = rayToWorld - rayFromWorld; - dir.normalize(); - dir *= m_oldPickingDist; - newPivotB = rayFromWorld + dir; - pickCon->setPivotB(newPivotB); - return true; - } - } - if (m_pickingMultiBodyPoint2Point) - { - //keep it at the same picking distance - btVector3 dir = rayToWorld - rayFromWorld; - dir.normalize(); - dir *= m_oldPickingDist; - btVector3 newPivotB = rayFromWorld + dir; - m_pickingMultiBodyPoint2Point->setPivotInB(newPivotB); - } - if (m_pickedSoftBody && m_mouseForce) - { - btVector3 newPivot; - btVector3 dir = rayToWorld - rayFromWorld; - dir.normalize(); - dir *= m_oldPickingDist; - newPivot = rayFromWorld + dir; - m_mouseForce->setMousePos(newPivot); - } - return false; - } - - virtual void removePickingConstraint() - { - if (m_pickedConstraint) - { - m_dynamicsWorld->removeConstraint(m_pickedConstraint); - - if (m_pickedBody) - { - m_pickedBody->forceActivationState(ACTIVE_TAG); - m_pickedBody->activate(true); - } - delete m_pickedConstraint; - m_pickedConstraint = 0; - m_pickedBody = 0; - } - if (m_pickingMultiBodyPoint2Point) - { - m_pickingMultiBodyPoint2Point->getMultiBodyA()->setCanSleep(m_prevCanSleep); - btMultiBodyDynamicsWorld* world = (btMultiBodyDynamicsWorld*)m_dynamicsWorld; - world->removeMultiBodyConstraint(m_pickingMultiBodyPoint2Point); - delete m_pickingMultiBodyPoint2Point; - m_pickingMultiBodyPoint2Point = 0; - } - if (m_pickedSoftBody) - { - getDeformableDynamicsWorld()->removeForce(m_pickedSoftBody, m_mouseForce); - delete m_mouseForce; - m_mouseForce = 0; - m_pickedSoftBody = 0; - } - } -}; -#endif //COMMON_MULTI_BODY_SETUP_H diff --git a/engine/inc/bullet/CommonInterfaces/CommonExampleInterface.h b/engine/inc/bullet/CommonInterfaces/CommonExampleInterface.h deleted file mode 100644 index fc4e05ce..00000000 --- a/engine/inc/bullet/CommonInterfaces/CommonExampleInterface.h +++ /dev/null @@ -1,96 +0,0 @@ - - -#ifndef COMMON_EXAMPLE_INTERFACE_H -#define COMMON_EXAMPLE_INTERFACE_H - -struct CommandProcessorCreationInterface -{ - virtual ~CommandProcessorCreationInterface() {} - virtual class CommandProcessorInterface* createCommandProcessor() = 0; - virtual void deleteCommandProcessor(CommandProcessorInterface*) = 0; -}; - -struct CommonExampleOptions -{ - struct GUIHelperInterface* m_guiHelper; - - //Those are optional, some examples will use them others don't. Each example should work with them being 0. - int m_option; - const char* m_fileName; - class SharedMemoryInterface* m_sharedMem; - CommandProcessorCreationInterface* m_commandProcessorCreation; - bool m_skipGraphicsUpdate; - - CommonExampleOptions(struct GUIHelperInterface* helper, int option = 0) - : m_guiHelper(helper), - m_option(option), - m_fileName(0), - m_sharedMem(0), - m_commandProcessorCreation(0), - m_skipGraphicsUpdate(false) - { - } -}; - -class CommonExampleInterface -{ -public: - typedef class CommonExampleInterface*(CreateFunc)(CommonExampleOptions& options); - - virtual ~CommonExampleInterface() - { - } - - virtual void initPhysics() = 0; - virtual void exitPhysics() = 0; - virtual void updateGraphics() {} - virtual void stepSimulation(float deltaTime) = 0; - virtual void renderScene() = 0; - virtual void physicsDebugDraw(int debugFlags) = 0; //for now we reuse the flags in Bullet/src/LinearMath/btIDebugDraw.h - //reset camera is only called when switching demo. this way you can restart (initPhysics) and watch in a specific location easier - virtual void resetCamera(){}; - virtual bool mouseMoveCallback(float x, float y) = 0; - virtual bool mouseButtonCallback(int button, int state, float x, float y) = 0; - virtual bool keyboardCallback(int key, int state) = 0; - - virtual void vrControllerMoveCallback(int controllerId, float pos[4], float orientation[4], float analogAxis, float auxAnalogAxes[10]) {} - virtual void vrControllerButtonCallback(int controllerId, int button, int state, float pos[4], float orientation[4]) {} - virtual void vrHMDMoveCallback(int controllerId, float pos[4], float orientation[4]) {} - virtual void vrGenericTrackerMoveCallback(int controllerId, float pos[4], float orientation[4]) {} - - virtual void processCommandLineArgs(int argc, char* argv[]){}; -}; - -class ExampleEntries -{ -public: - virtual ~ExampleEntries() {} - - virtual void initExampleEntries() = 0; - - virtual void initOpenCLExampleEntries() = 0; - - virtual int getNumRegisteredExamples() = 0; - - virtual CommonExampleInterface::CreateFunc* getExampleCreateFunc(int index) = 0; - - virtual const char* getExampleName(int index) = 0; - - virtual const char* getExampleDescription(int index) = 0; - - virtual int getExampleOption(int index) = 0; -}; - -CommonExampleInterface* StandaloneExampleCreateFunc(CommonExampleOptions& options); - -#ifdef B3_USE_STANDALONE_EXAMPLE -#define B3_STANDALONE_EXAMPLE(ExampleFunc) \ - CommonExampleInterface* StandaloneExampleCreateFunc(CommonExampleOptions& options) \ - { \ - return ExampleFunc(options); \ - } -#else //B3_USE_STANDALONE_EXAMPLE -#define B3_STANDALONE_EXAMPLE(ExampleFunc) -#endif //B3_USE_STANDALONE_EXAMPLE - -#endif //COMMON_EXAMPLE_INTERFACE_H diff --git a/engine/inc/bullet/CommonInterfaces/CommonFileIOInterface.h b/engine/inc/bullet/CommonInterfaces/CommonFileIOInterface.h deleted file mode 100644 index beb25edd..00000000 --- a/engine/inc/bullet/CommonInterfaces/CommonFileIOInterface.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef COMMON_FILE_IO_INTERFACE_H -#define COMMON_FILE_IO_INTERFACE_H - -struct CommonFileIOInterface -{ - int m_fileIOType; - const char* m_pathPrefix; - - CommonFileIOInterface(int fileIOType, const char* pathPrefix) - :m_fileIOType(fileIOType), - m_pathPrefix(pathPrefix) - { - } - - virtual ~CommonFileIOInterface() - { - } - virtual int fileOpen(const char* fileName, const char* mode)=0; - virtual int fileRead(int fileHandle, char* destBuffer, int numBytes)=0; - virtual int fileWrite(int fileHandle,const char* sourceBuffer, int numBytes)=0; - virtual void fileClose(int fileHandle)=0; - virtual bool findResourcePath(const char* fileName, char* resourcePathOut, int resourcePathMaxNumBytes)=0; - virtual char* readLine(int fileHandle, char* destBuffer, int numBytes)=0; - virtual int getFileSize(int fileHandle)=0; - virtual void enableFileCaching(bool enable) = 0; -}; - -#endif //COMMON_FILE_IO_INTERFACE_H \ No newline at end of file diff --git a/engine/inc/bullet/CommonInterfaces/CommonGUIHelperInterface.h b/engine/inc/bullet/CommonInterfaces/CommonGUIHelperInterface.h deleted file mode 100644 index 4ba413ef..00000000 --- a/engine/inc/bullet/CommonInterfaces/CommonGUIHelperInterface.h +++ /dev/null @@ -1,227 +0,0 @@ -#ifndef GUI_HELPER_INTERFACE_H -#define GUI_HELPER_INTERFACE_H -class btRigidBody; -class btVector3; -class btCollisionObject; -class btDiscreteDynamicsWorld; -class btCollisionShape; -struct Common2dCanvasInterface; -struct CommonParameterInterface; -struct CommonRenderInterface; -struct CommonGraphicsApp; - -struct GUISyncPosition -{ - int m_graphicsInstanceId; - float m_pos[4]; - float m_orn[4]; -}; - -typedef void (*VisualizerFlagCallback)(int flag, bool enable); - -///The Bullet 2 GraphicsPhysicsBridge let's the graphics engine create graphics representation and synchronize -struct GUIHelperInterface -{ - virtual ~GUIHelperInterface() {} - - virtual void createRigidBodyGraphicsObject(btRigidBody* body, const btVector3& color) = 0; - - virtual void createCollisionObjectGraphicsObject(btCollisionObject* obj, const btVector3& color) = 0; - - virtual void createCollisionShapeGraphicsObject(btCollisionShape* collisionShape) = 0; - - virtual void syncPhysicsToGraphics(const btDiscreteDynamicsWorld* rbWorld) = 0; - virtual void syncPhysicsToGraphics2(const btDiscreteDynamicsWorld* rbWorld) {} - virtual void syncPhysicsToGraphics2(const GUISyncPosition* positions, int numPositions) {} - - virtual void render(const btDiscreteDynamicsWorld* rbWorld) = 0; - - virtual void createPhysicsDebugDrawer(btDiscreteDynamicsWorld* rbWorld) = 0; - - virtual int registerTexture(const unsigned char* texels, int width, int height) = 0; - virtual int registerGraphicsShape(const float* vertices, int numvertices, const int* indices, int numIndices, int primitiveType, int textureId) = 0; - virtual int registerGraphicsInstance(int shapeIndex, const float* position, const float* quaternion, const float* color, const float* scaling) = 0; - virtual void removeAllGraphicsInstances() = 0; - virtual void removeGraphicsInstance(int graphicsUid) {} - virtual void changeInstanceFlags(int instanceUid, int flags) {} - virtual void changeRGBAColor(int instanceUid, const double rgbaColor[4]) {} - virtual void changeScaling(int instanceUid, const double scaling[3]) {} - virtual void changeSpecularColor(int instanceUid, const double specularColor[3]) {} - virtual void changeTexture(int textureUniqueId, const unsigned char* rgbTexels, int width, int height) {} - virtual void updateShape(int shapeIndex, float* vertices, int numVertices) {} - virtual int getShapeIndexFromInstance(int instanceUid) { return -1; } - virtual void replaceTexture(int shapeIndex, int textureUid) {} - virtual void removeTexture(int textureUid) {} - - virtual Common2dCanvasInterface* get2dCanvasInterface() = 0; - - virtual CommonParameterInterface* getParameterInterface() = 0; - - virtual CommonRenderInterface* getRenderInterface() = 0; - - virtual const CommonRenderInterface* getRenderInterface() const - { - return 0; - } - - virtual CommonGraphicsApp* getAppInterface() = 0; - - virtual void setUpAxis(int axis) = 0; - - virtual void resetCamera(float camDist, float yaw, float pitch, float camPosX, float camPosY, float camPosZ) = 0; - - virtual bool getCameraInfo(int* width, int* height, float viewMatrix[16], float projectionMatrix[16], float camUp[3], float camForward[3], float hor[3], float vert[3], float* yaw, float* pitch, float* camDist, float camTarget[3]) const - { - return false; - } - - virtual void setVisualizerFlag(int flag, int enable){}; - - virtual void copyCameraImageData(const float viewMatrix[16], const float projectionMatrix[16], - unsigned char* pixelsRGBA, int rgbaBufferSizeInPixels, - float* depthBuffer, int depthBufferSizeInPixels, - int startPixelIndex, int destinationWidth, int destinationHeight, int* numPixelsCopied) - { - copyCameraImageData(viewMatrix, projectionMatrix, pixelsRGBA, rgbaBufferSizeInPixels, - depthBuffer, depthBufferSizeInPixels, - 0, 0, - startPixelIndex, destinationWidth, - destinationHeight, numPixelsCopied); - } - - virtual void copyCameraImageData(const float viewMatrix[16], const float projectionMatrix[16], - unsigned char* pixelsRGBA, int rgbaBufferSizeInPixels, - float* depthBuffer, int depthBufferSizeInPixels, - int* segmentationMaskBuffer, int segmentationMaskBufferSizeInPixels, - int startPixelIndex, int destinationWidth, int destinationHeight, int* numPixelsCopied) = 0; - virtual void debugDisplayCameraImageData(const float viewMatrix[16], const float projectionMatrix[16], - unsigned char* pixelsRGBA, int rgbaBufferSizeInPixels, - float* depthBuffer, int depthBufferSizeInPixels, - int* segmentationMaskBuffer, int segmentationMaskBufferSizeInPixels, - int startPixelIndex, int destinationWidth, int destinationHeight, int* numPixelsCopied) {} - - virtual void setProjectiveTextureMatrices(const float viewMatrix[16], const float projectionMatrix[16]) {} - virtual void setProjectiveTexture(bool useProjectiveTexture) {} - - virtual void autogenerateGraphicsObjects(btDiscreteDynamicsWorld* rbWorld) = 0; - - virtual void drawText3D(const char* txt, float posX, float posY, float posZ, float size) {} - virtual void drawText3D(const char* txt, float position[3], float orientation[4], float color[4], float size, int optionFlag) {} - - virtual int addUserDebugText3D(const char* txt, const double positionXYZ[3], const double orientation[4], const double textColorRGB[3], double size, double lifeTime, int trackingVisualShapeIndex, int optionFlags, int replaceItemUid) { return -1; } - virtual int addUserDebugLine(const double debugLineFromXYZ[3], const double debugLineToXYZ[3], const double debugLineColorRGB[3], double lineWidth, double lifeTime, int trackingVisualShapeIndex, int replaceItemUid) { return -1; }; - virtual int addUserDebugParameter(const char* txt, double rangeMin, double rangeMax, double startValue) { return -1; }; - virtual int readUserDebugParameter(int itemUniqueId, double* value) { return 0; } - - virtual void removeUserDebugItem(int debugItemUniqueId){}; - virtual void removeAllUserDebugItems(){}; - virtual void removeAllUserParameters() {}; - - virtual void setVisualizerFlagCallback(VisualizerFlagCallback callback) {} - - //empty name stops dumping video - virtual void dumpFramesToVideo(const char* mp4FileName){}; - virtual void drawDebugDrawerLines(){} - virtual void clearLines(){} -}; - -///the DummyGUIHelper does nothing, so we can test the examples without GUI/graphics (in 'console mode') -struct DummyGUIHelper : public GUIHelperInterface -{ - DummyGUIHelper() - { - - } - virtual ~DummyGUIHelper() {} - - virtual void createRigidBodyGraphicsObject(btRigidBody* body, const btVector3& color) {} - - virtual void createCollisionObjectGraphicsObject(btCollisionObject* obj, const btVector3& color) {} - - virtual void createCollisionShapeGraphicsObject(btCollisionShape* collisionShape) {} - - virtual void syncPhysicsToGraphics(const btDiscreteDynamicsWorld* rbWorld) {} - - virtual void render(const btDiscreteDynamicsWorld* rbWorld) {} - - virtual void createPhysicsDebugDrawer(btDiscreteDynamicsWorld* rbWorld) {} - - virtual int registerTexture(const unsigned char* texels, int width, int height) { return -1; } - virtual int registerGraphicsShape(const float* vertices, int numvertices, const int* indices, int numIndices, int primitiveType, int textureId) { return -1; } - virtual int registerGraphicsInstance(int shapeIndex, const float* position, const float* quaternion, const float* color, const float* scaling) { return -1; } - virtual void removeAllGraphicsInstances() {} - virtual void removeGraphicsInstance(int graphicsUid) {} - virtual void changeRGBAColor(int instanceUid, const double rgbaColor[4]) {} - virtual void changeScaling(int instanceUid, const double scaling[3]) {} - - virtual Common2dCanvasInterface* get2dCanvasInterface() - { - return 0; - } - - virtual CommonParameterInterface* getParameterInterface() - { - return 0; - } - - virtual CommonRenderInterface* getRenderInterface() - { - return 0; - } - - virtual CommonGraphicsApp* getAppInterface() - { - return 0; - } - - virtual void setUpAxis(int axis) - { - } - virtual void resetCamera(float camDist, float yaw, float pitch, float camPosX, float camPosY, float camPosZ) - { - } - - virtual void copyCameraImageData(const float viewMatrix[16], const float projectionMatrix[16], - unsigned char* pixelsRGBA, int rgbaBufferSizeInPixels, - float* depthBuffer, int depthBufferSizeInPixels, - int* segmentationMaskBuffer, int segmentationMaskBufferSizeInPixels, - int startPixelIndex, int width, int height, int* numPixelsCopied) - - { - if (numPixelsCopied) - *numPixelsCopied = 0; - } - - virtual void setProjectiveTextureMatrices(const float viewMatrix[16], const float projectionMatrix[16]) - { - } - - virtual void setProjectiveTexture(bool useProjectiveTexture) - { - } - - virtual void autogenerateGraphicsObjects(btDiscreteDynamicsWorld* rbWorld) - { - } - - virtual void drawText3D(const char* txt, float posX, float posZY, float posZ, float size) - { - } - - virtual void drawText3D(const char* txt, float position[3], float orientation[4], float color[4], float size, int optionFlag) - { - } - - virtual int addUserDebugLine(const double debugLineFromXYZ[3], const double debugLineToXYZ[3], const double debugLineColorRGB[3], double lineWidth, double lifeTime, int trackingVisualShapeIndex, int replaceItemUid) - { - return -1; - } - virtual void removeUserDebugItem(int debugItemUniqueId) - { - } - virtual void removeAllUserDebugItems() - { - } -}; - -#endif //GUI_HELPER_INTERFACE_H diff --git a/engine/inc/bullet/CommonInterfaces/CommonGraphicsAppInterface.h b/engine/inc/bullet/CommonInterfaces/CommonGraphicsAppInterface.h deleted file mode 100644 index a3d9d3ea..00000000 --- a/engine/inc/bullet/CommonInterfaces/CommonGraphicsAppInterface.h +++ /dev/null @@ -1,287 +0,0 @@ -#ifndef COMMON_GRAPHICS_APP_H -#define COMMON_GRAPHICS_APP_H - -#include "Bullet3Common/b3Vector3.h" -#include "CommonRenderInterface.h" -#include "CommonWindowInterface.h" -#include "CommonCameraInterface.h" - -struct DrawGridData -{ - int gridSize; - float upOffset; - int upAxis; - float gridColor[4]; - - DrawGridData(int upAx = 1) - : gridSize(10), - upOffset(0.001f), - upAxis(upAx) - { - gridColor[0] = 0.6f; - gridColor[1] = 0.6f; - gridColor[2] = 0.6f; - gridColor[3] = 1.f; - } -}; - -enum EnumSphereLevelOfDetail -{ - SPHERE_LOD_POINT_SPRITE = 0, - SPHERE_LOD_LOW, - SPHERE_LOD_MEDIUM, - SPHERE_LOD_HIGH, - -}; -struct CommonGraphicsApp -{ - enum drawText3DOption - { - eDrawText3D_OrtogonalFaceCamera = 1, - eDrawText3D_TrueType = 2, - eDrawText3D_TrackObject = 4, - }; - class CommonWindowInterface* m_window; - struct CommonRenderInterface* m_renderer; - struct CommonParameterInterface* m_parameterInterface; - struct Common2dCanvasInterface* m_2dCanvasInterface; - - bool m_leftMouseButton; - bool m_middleMouseButton; - bool m_rightMouseButton; - float m_wheelMultiplier; - float m_mouseMoveMultiplier; - float m_mouseXpos; - float m_mouseYpos; - bool m_mouseInitialized; - float m_backgroundColorRGB[3]; - - CommonGraphicsApp() - : m_window(0), - m_renderer(0), - m_parameterInterface(0), - m_2dCanvasInterface(0), - m_leftMouseButton(false), - m_middleMouseButton(false), - m_rightMouseButton(false), - m_wheelMultiplier(0.01f), - m_mouseMoveMultiplier(0.4f), - m_mouseXpos(0.f), - m_mouseYpos(0.f), - m_mouseInitialized(false) - { - m_backgroundColorRGB[0] = 0.7; - m_backgroundColorRGB[1] = 0.7; - m_backgroundColorRGB[2] = 0.8; - } - virtual ~CommonGraphicsApp() - { - } - - virtual void dumpNextFrameToPng(const char* pngFilename) {} - virtual void dumpFramesToVideo(const char* mp4Filename) {} - - virtual void getScreenPixels(unsigned char* rgbaBuffer, int bufferSizeInBytes, float* depthBuffer, int depthBufferSizeInBytes) {} - virtual void setViewport(int width, int height) {} - - virtual void getBackgroundColor(float* red, float* green, float* blue) const - { - if (red) - *red = m_backgroundColorRGB[0]; - if (green) - *green = m_backgroundColorRGB[1]; - if (blue) - *blue = m_backgroundColorRGB[2]; - } - virtual void setMp4Fps(int fps) {} - virtual void setBackgroundColor(float red, float green, float blue) - { - m_backgroundColorRGB[0] = red; - m_backgroundColorRGB[1] = green; - m_backgroundColorRGB[2] = blue; - } - virtual void setMouseWheelMultiplier(float mult) - { - m_wheelMultiplier = mult; - } - virtual float getMouseWheelMultiplier() const - { - return m_wheelMultiplier; - } - - virtual void setMouseMoveMultiplier(float mult) - { - m_mouseMoveMultiplier = mult; - } - - virtual float getMouseMoveMultiplier() const - { - return m_mouseMoveMultiplier; - } - - virtual void drawGrid(DrawGridData data = DrawGridData()) = 0; - virtual void setUpAxis(int axis) = 0; - virtual int getUpAxis() const = 0; - - virtual void swapBuffer() = 0; - virtual void drawText(const char* txt, int posX, int posY) - { - float size = 1; - float colorRGBA[4] = { 0, 0, 0, 1 }; - drawText(txt, posX, posY, size, colorRGBA); - } - - virtual void drawText(const char* txt, int posX, int posY, float size) - { - float colorRGBA[4] = { 0, 0, 0, 1 }; - drawText(txt, posX, posY, size, colorRGBA); - } - virtual void drawText(const char* txt, int posX, int posY, float size, float colorRGBA[4]) = 0; - virtual void drawText3D(const char* txt, float posX, float posY, float posZ, float size) = 0; - virtual void drawText3D(const char* txt, float position[3], float orientation[4], float color[4], float size, int optionFlag) = 0; - virtual void drawTexturedRect(float x0, float y0, float x1, float y1, float color[4], float u0, float v0, float u1, float v1, int useRGBA) = 0; - virtual int registerCubeShape(float halfExtentsX, float halfExtentsY, float halfExtentsZ, int textureIndex = -1, float textureScaling = 1) = 0; - virtual int registerGraphicsUnitSphereShape(EnumSphereLevelOfDetail lod, int textureId = -1) = 0; - - virtual void registerGrid(int xres, int yres, float color0[4], float color1[4]) = 0; - - void defaultMouseButtonCallback(int button, int state, float x, float y) - { - if (button == 0) - m_leftMouseButton = (state == 1); - if (button == 1) - m_middleMouseButton = (state == 1); - - if (button == 2) - m_rightMouseButton = (state == 1); - - m_mouseXpos = x; - m_mouseYpos = y; - m_mouseInitialized = true; - } - void defaultMouseMoveCallback(float x, float y) - { - if (m_window && m_renderer) - { - CommonCameraInterface* camera = m_renderer->getActiveCamera(); - - bool isAltPressed = m_window->isModifierKeyPressed(B3G_ALT); - bool isControlPressed = m_window->isModifierKeyPressed(B3G_CONTROL); - - if (isAltPressed || isControlPressed) - { - float xDelta = x - m_mouseXpos; - float yDelta = y - m_mouseYpos; - float cameraDistance = camera->getCameraDistance(); - float pitch = camera->getCameraPitch(); - float yaw = camera->getCameraYaw(); - - float targPos[3]; - float camPos[3]; - - camera->getCameraTargetPosition(targPos); - camera->getCameraPosition(camPos); - - b3Vector3 cameraPosition = b3MakeVector3(b3Scalar(camPos[0]), - b3Scalar(camPos[1]), - b3Scalar(camPos[2])); - - b3Vector3 cameraTargetPosition = b3MakeVector3(b3Scalar(targPos[0]), - b3Scalar(targPos[1]), - b3Scalar(targPos[2])); - b3Vector3 cameraUp = b3MakeVector3(0, 0, 0); - cameraUp[camera->getCameraUpAxis()] = 1.f; - - if (m_leftMouseButton) - { - // if (b3Fabs(xDelta)>b3Fabs(yDelta)) - // { - pitch -= yDelta * m_mouseMoveMultiplier; - // } else - // { - yaw -= xDelta * m_mouseMoveMultiplier; - // } - } - - if (m_middleMouseButton) - { - cameraTargetPosition += cameraUp * yDelta *m_mouseMoveMultiplier* 0.01; - - b3Vector3 fwd = cameraTargetPosition - cameraPosition; - b3Vector3 side = cameraUp.cross(fwd); - side.normalize(); - cameraTargetPosition += side * xDelta *m_mouseMoveMultiplier* 0.01; - } - if (m_rightMouseButton) - { - cameraDistance -= xDelta * m_mouseMoveMultiplier*0.01f; - cameraDistance -= yDelta * m_mouseMoveMultiplier*0.01f; - if (cameraDistance < 1) - cameraDistance = 1; - if (cameraDistance > 1000) - cameraDistance = 1000; - } - camera->setCameraDistance(cameraDistance); - camera->setCameraPitch(pitch); - camera->setCameraYaw(yaw); - camera->setCameraTargetPosition(cameraTargetPosition[0], cameraTargetPosition[1], cameraTargetPosition[2]); - } - - } //m_window && m_renderer - - m_mouseXpos = x; - m_mouseYpos = y; - m_mouseInitialized = true; - } - // void defaultKeyboardCallback(int key, int state) - // { - // } - void defaultWheelCallback(float deltax, float deltay) - { - if (m_renderer) - { - b3Vector3 cameraTargetPosition, cameraPosition, cameraUp = b3MakeVector3(0, 0, 0); - cameraUp[getUpAxis()] = 1; - CommonCameraInterface* camera = m_renderer->getActiveCamera(); - - camera->getCameraPosition(cameraPosition); - camera->getCameraTargetPosition(cameraTargetPosition); - - if (!m_leftMouseButton) - { - float cameraDistance = camera->getCameraDistance(); - if (deltay < 0 || cameraDistance > 1) - { - cameraDistance -= deltay*m_wheelMultiplier; - if (cameraDistance < 1) - cameraDistance = 1; - camera->setCameraDistance(cameraDistance); - } - else - { - b3Vector3 fwd = cameraTargetPosition - cameraPosition; - fwd.normalize(); - cameraTargetPosition += fwd * deltay * m_wheelMultiplier; //todo: expose it in the GUI? - } - } - else - { - if (b3Fabs(deltax) > b3Fabs(deltay)) - { - b3Vector3 fwd = cameraTargetPosition - cameraPosition; - b3Vector3 side = cameraUp.cross(fwd); - side.normalize(); - cameraTargetPosition += side * deltax * m_wheelMultiplier; - } - else - { - cameraTargetPosition -= cameraUp * deltay * m_wheelMultiplier; - } - } - - camera->setCameraTargetPosition(cameraTargetPosition[0], cameraTargetPosition[1], cameraTargetPosition[2]); - } - } -}; - -#endif //COMMON_GRAPHICS_APP_H diff --git a/engine/inc/bullet/CommonInterfaces/CommonMultiBodyBase.h b/engine/inc/bullet/CommonInterfaces/CommonMultiBodyBase.h deleted file mode 100644 index ad6c2a4c..00000000 --- a/engine/inc/bullet/CommonInterfaces/CommonMultiBodyBase.h +++ /dev/null @@ -1,524 +0,0 @@ - -#ifndef COMMON_MULTI_BODY_SETUP_H -#define COMMON_MULTI_BODY_SETUP_H - -#include "btBulletDynamicsCommon.h" - -#include "BulletDynamics/Featherstone/btMultiBodyDynamicsWorld.h" -#include "BulletDynamics/Featherstone/btMultiBodyConstraintSolver.h" -#include "BulletDynamics/Featherstone/btMultiBodyPoint2Point.h" -#include "BulletDynamics/Featherstone/btMultiBodyLinkCollider.h" - -#include "btBulletDynamicsCommon.h" -#include "CommonExampleInterface.h" -#include "CommonGUIHelperInterface.h" -#include "CommonRenderInterface.h" -#include "CommonGraphicsAppInterface.h" -#include "CommonWindowInterface.h" -#include "CommonCameraInterface.h" - -enum MyFilterModes -{ - FILTER_GROUPAMASKB_AND_GROUPBMASKA2 = 0, - FILTER_GROUPAMASKB_OR_GROUPBMASKA2 -}; - -struct MyOverlapFilterCallback2 : public btOverlapFilterCallback -{ - int m_filterMode; - - MyOverlapFilterCallback2() - : m_filterMode(FILTER_GROUPAMASKB_AND_GROUPBMASKA2) - { - } - - virtual ~MyOverlapFilterCallback2() - { - } - // return true when pairs need collision - virtual bool needBroadphaseCollision(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1) const - { - if (m_filterMode == FILTER_GROUPAMASKB_AND_GROUPBMASKA2) - { - bool collides = (proxy0->m_collisionFilterGroup & proxy1->m_collisionFilterMask) != 0; - collides = collides && (proxy1->m_collisionFilterGroup & proxy0->m_collisionFilterMask); - return collides; - } - - if (m_filterMode == FILTER_GROUPAMASKB_OR_GROUPBMASKA2) - { - bool collides = (proxy0->m_collisionFilterGroup & proxy1->m_collisionFilterMask) != 0; - collides = collides || (proxy1->m_collisionFilterGroup & proxy0->m_collisionFilterMask); - return collides; - } - return false; - } -}; - -struct CommonMultiBodyBase : public CommonExampleInterface -{ - //keep the collision shapes, for deletion/cleanup - btAlignedObjectArray m_collisionShapes; - MyOverlapFilterCallback2* m_filterCallback; - btOverlappingPairCache* m_pairCache; - btBroadphaseInterface* m_broadphase; - btCollisionDispatcher* m_dispatcher; - btMultiBodyConstraintSolver* m_solver; - btDefaultCollisionConfiguration* m_collisionConfiguration; - btMultiBodyDynamicsWorld* m_dynamicsWorld; - - //data for picking objects - class btRigidBody* m_pickedBody; - class btTypedConstraint* m_pickedConstraint; - class btMultiBodyPoint2Point* m_pickingMultiBodyPoint2Point; - - btVector3 m_oldPickingPos; - btVector3 m_hitPos; - btScalar m_oldPickingDist; - bool m_prevCanSleep; - - struct GUIHelperInterface* m_guiHelper; - - CommonMultiBodyBase(GUIHelperInterface* helper) - : m_filterCallback(0), - m_pairCache(0), - m_broadphase(0), - m_dispatcher(0), - m_solver(0), - m_collisionConfiguration(0), - m_dynamicsWorld(0), - m_pickedBody(0), - m_pickedConstraint(0), - m_pickingMultiBodyPoint2Point(0), - m_prevCanSleep(false), - m_guiHelper(helper) - { - } - - virtual void createEmptyDynamicsWorld() - { - ///collision configuration contains default setup for memory, collision setup - m_collisionConfiguration = new btDefaultCollisionConfiguration(); - //m_collisionConfiguration->setConvexConvexMultipointIterations(); - m_filterCallback = new MyOverlapFilterCallback2(); - - ///use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded) - m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); - - m_pairCache = new btHashedOverlappingPairCache(); - - m_pairCache->setOverlapFilterCallback(m_filterCallback); - - m_broadphase = new btDbvtBroadphase(m_pairCache); //btSimpleBroadphase(); - - m_solver = new btMultiBodyConstraintSolver; - - m_dynamicsWorld = new btMultiBodyDynamicsWorld(m_dispatcher, m_broadphase, m_solver, m_collisionConfiguration); - - m_dynamicsWorld->setGravity(btVector3(0, -10, 0)); - } - - virtual void stepSimulation(float deltaTime) - { - if (m_dynamicsWorld) - { - m_dynamicsWorld->stepSimulation(deltaTime); - } - } - - virtual void exitPhysics() - { - removePickingConstraint(); - //cleanup in the reverse order of creation/initialization - - //remove the rigidbodies from the dynamics world and delete them - - if (m_dynamicsWorld) - { - int i; - for (i = m_dynamicsWorld->getNumConstraints() - 1; i >= 0; i--) - { - m_dynamicsWorld->removeConstraint(m_dynamicsWorld->getConstraint(i)); - } - - for (i = m_dynamicsWorld->getNumMultiBodyConstraints() - 1; i >= 0; i--) - { - btMultiBodyConstraint* mbc = m_dynamicsWorld->getMultiBodyConstraint(i); - m_dynamicsWorld->removeMultiBodyConstraint(mbc); - delete mbc; - } - - for (i = m_dynamicsWorld->getNumMultibodies() - 1; i >= 0; i--) - { - btMultiBody* mb = m_dynamicsWorld->getMultiBody(i); - m_dynamicsWorld->removeMultiBody(mb); - delete mb; - } - 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.size(); j++) - { - btCollisionShape* shape = m_collisionShapes[j]; - delete shape; - } - m_collisionShapes.clear(); - - delete m_dynamicsWorld; - m_dynamicsWorld = 0; - - delete m_solver; - m_solver = 0; - - delete m_broadphase; - m_broadphase = 0; - - delete m_dispatcher; - m_dispatcher = 0; - - delete m_pairCache; - m_pairCache = 0; - - delete m_filterCallback; - m_filterCallback = 0; - - delete m_collisionConfiguration; - m_collisionConfiguration = 0; - } - - virtual void syncPhysicsToGraphics() - { - if (m_dynamicsWorld) - { - m_guiHelper->syncPhysicsToGraphics(m_dynamicsWorld); - } - } - - virtual void renderScene() - { - if (m_dynamicsWorld) - { - m_guiHelper->syncPhysicsToGraphics(m_dynamicsWorld); - - m_guiHelper->render(m_dynamicsWorld); - } - } - - virtual void physicsDebugDraw(int debugDrawFlags) - { - if (m_dynamicsWorld) - { - if (m_dynamicsWorld->getDebugDrawer()) - { - m_dynamicsWorld->getDebugDrawer()->setDebugMode(debugDrawFlags); - } - m_dynamicsWorld->debugDrawWorld(); - } - } - - virtual bool keyboardCallback(int key, int state) - { - if ((key == B3G_F3) && state && m_dynamicsWorld) - { - btDefaultSerializer* serializer = new btDefaultSerializer(); - m_dynamicsWorld->serialize(serializer); - - FILE* file = fopen("testFile.bullet", "wb"); - fwrite(serializer->getBufferPointer(), serializer->getCurrentBufferSize(), 1, file); - fclose(file); - //b3Printf("btDefaultSerializer wrote testFile.bullet"); - delete serializer; - return true; - } - return false; //don't handle this key - } - - btVector3 getRayTo(int x, int y) - { - CommonRenderInterface* renderer = m_guiHelper->getRenderInterface(); - - if (!renderer) - { - btAssert(0); - return btVector3(0, 0, 0); - } - - float top = 1.f; - float bottom = -1.f; - float nearPlane = 1.f; - float tanFov = (top - bottom) * 0.5f / nearPlane; - float fov = btScalar(2.0) * btAtan(tanFov); - - btVector3 camPos, camTarget; - renderer->getActiveCamera()->getCameraPosition(camPos); - renderer->getActiveCamera()->getCameraTargetPosition(camTarget); - - btVector3 rayFrom = camPos; - btVector3 rayForward = (camTarget - camPos); - rayForward.normalize(); - float farPlane = 10000.f; - rayForward *= farPlane; - - btVector3 rightOffset; - btVector3 cameraUp = btVector3(0, 0, 0); - cameraUp[m_guiHelper->getAppInterface()->getUpAxis()] = 1; - - btVector3 vertical = cameraUp; - - btVector3 hor; - hor = rayForward.cross(vertical); - hor.normalize(); - vertical = hor.cross(rayForward); - vertical.normalize(); - - float tanfov = tanf(0.5f * fov); - - hor *= 2.f * farPlane * tanfov; - vertical *= 2.f * farPlane * tanfov; - - btScalar aspect; - float width = float(renderer->getScreenWidth()); - float height = float(renderer->getScreenHeight()); - - aspect = width / height; - - hor *= aspect; - - btVector3 rayToCenter = rayFrom + rayForward; - btVector3 dHor = hor * 1.f / width; - btVector3 dVert = vertical * 1.f / height; - - btVector3 rayTo = rayToCenter - 0.5f * hor + 0.5f * vertical; - rayTo += btScalar(x) * dHor; - rayTo -= btScalar(y) * dVert; - return rayTo; - } - - virtual bool mouseMoveCallback(float x, float y) - { - CommonRenderInterface* renderer = m_guiHelper->getRenderInterface(); - - if (!renderer) - { - btAssert(0); - return false; - } - - btVector3 rayTo = getRayTo(int(x), int(y)); - btVector3 rayFrom; - renderer->getActiveCamera()->getCameraPosition(rayFrom); - movePickedBody(rayFrom, rayTo); - - return false; - } - - virtual bool mouseButtonCallback(int button, int state, float x, float y) - { - CommonRenderInterface* renderer = m_guiHelper->getRenderInterface(); - - if (!renderer) - { - btAssert(0); - return false; - } - - CommonWindowInterface* window = m_guiHelper->getAppInterface()->m_window; - - if (state == 1) - { - if (button == 0 && (!window->isModifierKeyPressed(B3G_ALT) && !window->isModifierKeyPressed(B3G_CONTROL))) - { - btVector3 camPos; - renderer->getActiveCamera()->getCameraPosition(camPos); - - btVector3 rayFrom = camPos; - btVector3 rayTo = getRayTo(int(x), int(y)); - - pickBody(rayFrom, rayTo); - } - } - else - { - if (button == 0) - { - removePickingConstraint(); - //remove p2p - } - } - - //printf("button=%d, state=%d\n",button,state); - return false; - } - - virtual bool pickBody(const btVector3& rayFromWorld, const btVector3& rayToWorld) - { - if (m_dynamicsWorld == 0) - return false; - - btCollisionWorld::ClosestRayResultCallback rayCallback(rayFromWorld, rayToWorld); - - m_dynamicsWorld->rayTest(rayFromWorld, rayToWorld, rayCallback); - if (rayCallback.hasHit()) - { - btVector3 pickPos = rayCallback.m_hitPointWorld; - btRigidBody* body = (btRigidBody*)btRigidBody::upcast(rayCallback.m_collisionObject); - if (body) - { - //other exclusions? - if (!(body->isStaticObject() || body->isKinematicObject())) - { - m_pickedBody = body; - m_pickedBody->setActivationState(DISABLE_DEACTIVATION); - //printf("pickPos=%f,%f,%f\n",pickPos.getX(),pickPos.getY(),pickPos.getZ()); - btVector3 localPivot = body->getCenterOfMassTransform().inverse() * pickPos; - btPoint2PointConstraint* p2p = new btPoint2PointConstraint(*body, localPivot); - m_dynamicsWorld->addConstraint(p2p, true); - m_pickedConstraint = p2p; - btScalar mousePickClamping = 30.f; - p2p->m_setting.m_impulseClamp = mousePickClamping; - //very weak constraint for picking - p2p->m_setting.m_tau = 0.001f; - } - } - else - { - btMultiBodyLinkCollider* multiCol = (btMultiBodyLinkCollider*)btMultiBodyLinkCollider::upcast(rayCallback.m_collisionObject); - if (multiCol && multiCol->m_multiBody) - { - m_prevCanSleep = multiCol->m_multiBody->getCanSleep(); - multiCol->m_multiBody->setCanSleep(false); - - btVector3 pivotInA = multiCol->m_multiBody->worldPosToLocal(multiCol->m_link, pickPos); - - btMultiBodyPoint2Point* p2p = new btMultiBodyPoint2Point(multiCol->m_multiBody, multiCol->m_link, 0, pivotInA, pickPos); - //if you add too much energy to the system, causing high angular velocities, simulation 'explodes' - //see also http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?f=4&t=949 - //so we try to avoid it by clamping the maximum impulse (force) that the mouse pick can apply - //it is not satisfying, hopefully we find a better solution (higher order integrator, using joint friction using a zero-velocity target motor with limited force etc?) - btScalar scaling = 1; - p2p->setMaxAppliedImpulse(2 * scaling); - - btMultiBodyDynamicsWorld* world = (btMultiBodyDynamicsWorld*)m_dynamicsWorld; - world->addMultiBodyConstraint(p2p); - m_pickingMultiBodyPoint2Point = p2p; - } - } - - // pickObject(pickPos, rayCallback.m_collisionObject); - m_oldPickingPos = rayToWorld; - m_hitPos = pickPos; - m_oldPickingDist = (pickPos - rayFromWorld).length(); - // printf("hit !\n"); - //add p2p - } - return false; - } - virtual bool movePickedBody(const btVector3& rayFromWorld, const btVector3& rayToWorld) - { - if (m_pickedBody && m_pickedConstraint) - { - btPoint2PointConstraint* pickCon = static_cast(m_pickedConstraint); - if (pickCon) - { - //keep it at the same picking distance - - btVector3 dir = rayToWorld - rayFromWorld; - dir.normalize(); - dir *= m_oldPickingDist; - - btVector3 newPivotB = rayFromWorld + dir; - pickCon->setPivotB(newPivotB); - } - } - - if (m_pickingMultiBodyPoint2Point) - { - //keep it at the same picking distance - - btVector3 dir = rayToWorld - rayFromWorld; - dir.normalize(); - dir *= m_oldPickingDist; - - btVector3 newPivotB = rayFromWorld + dir; - - m_pickingMultiBodyPoint2Point->setPivotInB(newPivotB); - } - - return false; - } - - virtual void removePickingConstraint() - { - if (m_pickedConstraint) - { - m_dynamicsWorld->removeConstraint(m_pickedConstraint); - - if (m_pickedBody) - { - m_pickedBody->forceActivationState(ACTIVE_TAG); - m_pickedBody->activate(true); - } - delete m_pickedConstraint; - m_pickedConstraint = 0; - m_pickedBody = 0; - } - if (m_pickingMultiBodyPoint2Point) - { - m_pickingMultiBodyPoint2Point->getMultiBodyA()->setCanSleep(m_prevCanSleep); - btMultiBodyDynamicsWorld* world = (btMultiBodyDynamicsWorld*)m_dynamicsWorld; - world->removeMultiBodyConstraint(m_pickingMultiBodyPoint2Point); - delete m_pickingMultiBodyPoint2Point; - m_pickingMultiBodyPoint2Point = 0; - } - } - - btBoxShape* createBoxShape(const btVector3& halfExtents) - { - btBoxShape* box = new btBoxShape(halfExtents); - return box; - } - - btRigidBody* createRigidBody(float mass, const btTransform& startTransform, btCollisionShape* shape, const btVector4& color = btVector4(1, 0, 0, 1)) - { - 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); - //body->setContactProcessingThreshold(m_defaultContactProcessingThreshold); - -#else - btRigidBody* body = new btRigidBody(mass, 0, shape, localInertia); - body->setWorldTransform(startTransform); -#endif // - - body->setUserIndex(-1); - m_dynamicsWorld->addRigidBody(body); - return body; - } -}; - -#endif //COMMON_MULTI_BODY_SETUP_H diff --git a/engine/inc/bullet/CommonInterfaces/CommonParameterInterface.h b/engine/inc/bullet/CommonInterfaces/CommonParameterInterface.h deleted file mode 100644 index 93edee89..00000000 --- a/engine/inc/bullet/CommonInterfaces/CommonParameterInterface.h +++ /dev/null @@ -1,91 +0,0 @@ - -#ifndef PARAM_INTERFACE_H -#define PARAM_INTERFACE_H - -#pragma once - -typedef void (*SliderParamChangedCallback)(float newVal, void* userPointer); -#include "LinearMath/btScalar.h" - -struct SliderParams -{ - const char* m_name; - float m_minVal; - float m_maxVal; - SliderParamChangedCallback m_callback; - btScalar* m_paramValuePointer; - void* m_userPointer; - bool m_clampToNotches; - bool m_clampToIntegers; - bool m_showValues; - - SliderParams(const char* name, btScalar* targetValuePointer) - : m_name(name), - m_minVal(-100), - m_maxVal(100), - m_callback(0), - m_paramValuePointer(targetValuePointer), - m_userPointer(0), - m_clampToNotches(false), - m_clampToIntegers(false), - m_showValues(true) - { - } -}; - -typedef void (*ButtonParamChangedCallback)(int buttonId, bool buttonState, void* userPointer); -typedef void (*ComboBoxCallback)(int combobox, const char* item, void* userPointer); - -struct ButtonParams -{ - const char* m_name; - int m_buttonId; - void* m_userPointer; - bool m_isTrigger; - bool m_initialState; - - ButtonParamChangedCallback m_callback; - ButtonParams(const char* name, int buttonId, bool isTrigger) - : m_name(name), - m_buttonId(buttonId), - m_userPointer(0), - m_isTrigger(isTrigger), - m_initialState(false), - m_callback(0) - { - } -}; - -struct ComboBoxParams -{ - int m_comboboxId; - int m_numItems; - const char** m_items; - int m_startItem; - ComboBoxCallback m_callback; - void* m_userPointer; - - ComboBoxParams() - : m_comboboxId(-1), - m_numItems(0), - m_items(0), - m_startItem(0), - m_callback(0), - m_userPointer(0) - { - } -}; - -struct CommonParameterInterface -{ - virtual ~CommonParameterInterface() {} - virtual void registerSliderFloatParameter(SliderParams& params) = 0; - virtual void registerButtonParameter(ButtonParams& params) = 0; - virtual void registerComboBox(ComboBoxParams& params) = 0; - - virtual void syncParameters() = 0; - virtual void removeAllParameters() = 0; - virtual void setSliderValue(int sliderIndex, double sliderValue) = 0; -}; - -#endif //PARAM_INTERFACE_H diff --git a/engine/inc/bullet/CommonInterfaces/CommonRenderInterface.h b/engine/inc/bullet/CommonInterfaces/CommonRenderInterface.h deleted file mode 100644 index 25bf8285..00000000 --- a/engine/inc/bullet/CommonInterfaces/CommonRenderInterface.h +++ /dev/null @@ -1,167 +0,0 @@ -#ifndef COMMON_RENDER_INTERFACE_H -#define COMMON_RENDER_INTERFACE_H - -struct CommonCameraInterface; - -enum -{ - B3_GL_TRIANGLES = 1, - B3_GL_POINTS -}; - -enum -{ - B3_INSTANCE_TRANSPARANCY = 1, - B3_INSTANCE_TEXTURE = 2, - B3_INSTANCE_DOUBLE_SIDED = 4, -}; - -enum -{ - B3_DEFAULT_RENDERMODE = 1, - //B3_WIREFRAME_RENDERMODE, - B3_CREATE_SHADOWMAP_RENDERMODE, - B3_USE_SHADOWMAP_RENDERMODE, - B3_USE_SHADOWMAP_RENDERMODE_REFLECTION, - B3_USE_SHADOWMAP_RENDERMODE_REFLECTION_PLANE, - B3_USE_PROJECTIVE_TEXTURE_RENDERMODE, - B3_SEGMENTATION_MASK_RENDERMODE, -}; - -struct GfxVertexFormat0 -{ - float x, y, z, w; - float unused0, unused1, unused2, unused3; - float u, v; -}; - -struct GfxVertexFormat1 -{ - float x, y, z, w; - float nx, ny, nz; - float u, v; -}; - -struct CommonRenderInterface -{ - virtual ~CommonRenderInterface() {} - virtual void init() = 0; - virtual void updateCamera(int upAxis) = 0; - virtual void removeAllInstances() = 0; - virtual void removeGraphicsInstance(int instanceUid) = 0; - - virtual const CommonCameraInterface* getActiveCamera() const = 0; - virtual CommonCameraInterface* getActiveCamera() = 0; - virtual void setActiveCamera(CommonCameraInterface* cam) = 0; - - virtual void setLightPosition(const float lightPos[3]) = 0; - virtual void setLightPosition(const double lightPos[3]) = 0; - virtual void setShadowMapResolution(int shadowMapResolution) = 0; - virtual void setShadowMapIntensity(double shadowMapIntensity) = 0; - - virtual void setShadowMapWorldSize(float worldSize) = 0; - - virtual void setProjectiveTextureMatrices(const float viewMatrix[16], const float projectionMatrix[16]){}; - virtual void setProjectiveTexture(bool useProjectiveTexture){}; - - virtual void renderScene() = 0; - virtual void renderSceneInternal(int renderMode = B3_DEFAULT_RENDERMODE){}; - virtual int getScreenWidth() = 0; - virtual int getScreenHeight() = 0; - - virtual void resize(int width, int height) = 0; - - virtual int registerGraphicsInstance(int shapeIndex, const float* position, const float* quaternion, const float* color, const float* scaling) = 0; - virtual int registerGraphicsInstance(int shapeIndex, const double* position, const double* quaternion, const double* color, const double* scaling) = 0; - virtual void drawLines(const float* positions, const float color[4], int numPoints, int pointStrideInBytes, const unsigned int* indices, int numIndices, float pointDrawSize) = 0; - virtual void drawLine(const float from[4], const float to[4], const float color[4], float lineWidth) = 0; - virtual void drawLine(const double from[4], const double to[4], const double color[4], double lineWidth) = 0; - virtual void drawPoint(const float* position, const float color[4], float pointDrawSize) = 0; - virtual void drawPoint(const double* position, const double color[4], double pointDrawSize) = 0; - virtual void drawTexturedTriangleMesh(float worldPosition[3], float worldOrientation[4], const float* vertices, int numvertices, const unsigned int* indices, int numIndices, float color[4], int textureIndex = -1, int vertexLayout = 0) = 0; - - virtual int registerShape(const float* vertices, int numvertices, const int* indices, int numIndices, int primitiveType = B3_GL_TRIANGLES, int textureIndex = -1) = 0; - virtual void updateShape(int shapeIndex, const float* vertices, int numVertices) = 0; - - virtual int registerTexture(const unsigned char* texels, int width, int height, bool flipPixelsY = true) = 0; - virtual void updateTexture(int textureIndex, const unsigned char* texels, bool flipPixelsY = true) = 0; - virtual void activateTexture(int textureIndex) = 0; - virtual void replaceTexture(int shapeIndex, int textureIndex){}; - virtual void removeTexture(int textureIndex) = 0; - - virtual void setPlaneReflectionShapeIndex(int index) {} - - virtual int getShapeIndexFromInstance(int srcIndex) { return -1; } - - virtual bool readSingleInstanceTransformToCPU(float* position, float* orientation, int srcIndex) = 0; - - virtual void writeSingleInstanceTransformToCPU(const float* position, const float* orientation, int srcIndex) = 0; - virtual void writeSingleInstanceTransformToCPU(const double* position, const double* orientation, int srcIndex) = 0; - virtual void writeSingleInstanceColorToCPU(const float* color, int srcIndex) = 0; - virtual void writeSingleInstanceColorToCPU(const double* color, int srcIndex) = 0; - virtual void writeSingleInstanceScaleToCPU(const float* scale, int srcIndex) = 0; - virtual void writeSingleInstanceScaleToCPU(const double* scale, int srcIndex) = 0; - virtual void writeSingleInstanceSpecularColorToCPU(const double* specular, int srcIndex) = 0; - virtual void writeSingleInstanceSpecularColorToCPU(const float* specular, int srcIndex) = 0; - virtual void writeSingleInstanceFlagsToCPU(int flags, int srcIndex) = 0; - - virtual int getTotalNumInstances() const = 0; - - virtual void writeTransforms() = 0; - - virtual void clearZBuffer() = 0; - - //This is internal access to OpenGL3+ features, mainly used for OpenCL-OpenGL interop - //Only the GLInstancingRenderer supports it, just return 0 otherwise. - virtual struct GLInstanceRendererInternalData* getInternalData() = 0; -}; - -template -inline int projectWorldCoordToScreen(T objx, T objy, T objz, - const T modelMatrix[16], - const T projMatrix[16], - const int viewport[4], - T* winx, T* winy, T* winz) -{ - int i; - T in2[4]; - T tmp[4]; - - in2[0] = objx; - in2[1] = objy; - in2[2] = objz; - in2[3] = T(1.0); - - for (i = 0; i < 4; i++) - { - tmp[i] = in2[0] * modelMatrix[0 * 4 + i] + in2[1] * modelMatrix[1 * 4 + i] + - in2[2] * modelMatrix[2 * 4 + i] + in2[3] * modelMatrix[3 * 4 + i]; - } - - T out[4]; - for (i = 0; i < 4; i++) - { - out[i] = tmp[0] * projMatrix[0 * 4 + i] + tmp[1] * projMatrix[1 * 4 + i] + tmp[2] * projMatrix[2 * 4 + i] + tmp[3] * projMatrix[3 * 4 + i]; - } - - if (out[3] == T(0.0)) - return 0; - out[0] /= out[3]; - out[1] /= out[3]; - out[2] /= out[3]; - /* Map x, y and z to range 0-1 */ - out[0] = out[0] * T(0.5) + T(0.5); - out[1] = out[1] * T(0.5) + T(0.5); - out[2] = out[2] * T(0.5) + T(0.5); - - /* Map x,y to viewport */ - out[0] = out[0] * viewport[2] + viewport[0]; - out[1] = out[1] * viewport[3] + viewport[1]; - - *winx = out[0]; - *winy = out[1]; - *winz = out[2]; - return 1; -} - -#endif //COMMON_RENDER_INTERFACE_H diff --git a/engine/inc/bullet/CommonInterfaces/CommonRigidBodyBase.h b/engine/inc/bullet/CommonInterfaces/CommonRigidBodyBase.h deleted file mode 100644 index 98352bcd..00000000 --- a/engine/inc/bullet/CommonInterfaces/CommonRigidBodyBase.h +++ /dev/null @@ -1,454 +0,0 @@ - -#ifndef COMMON_RIGID_BODY_BASE_H -#define COMMON_RIGID_BODY_BASE_H - -#include "btBulletDynamicsCommon.h" -#include "CommonExampleInterface.h" -#include "CommonGUIHelperInterface.h" -#include "CommonRenderInterface.h" -#include "CommonCameraInterface.h" -#include "CommonGraphicsAppInterface.h" -#include "CommonWindowInterface.h" -#include "BulletCollision/NarrowPhaseCollision/btRaycastCallback.h" - -struct CommonRigidBodyBase : public CommonExampleInterface -{ - //keep the collision shapes, for deletion/cleanup - btAlignedObjectArray m_collisionShapes; - btBroadphaseInterface* m_broadphase; - btCollisionDispatcher* m_dispatcher; - btConstraintSolver* m_solver; - btDefaultCollisionConfiguration* m_collisionConfiguration; - btDiscreteDynamicsWorld* m_dynamicsWorld; - - //data for picking objects - class btRigidBody* m_pickedBody; - class btTypedConstraint* m_pickedConstraint; - int m_savedState; - btVector3 m_oldPickingPos; - btVector3 m_hitPos; - btScalar m_oldPickingDist; - struct GUIHelperInterface* m_guiHelper; - - CommonRigidBodyBase(struct GUIHelperInterface* helper) - : m_broadphase(0), - m_dispatcher(0), - m_solver(0), - m_collisionConfiguration(0), - m_dynamicsWorld(0), - m_pickedBody(0), - m_pickedConstraint(0), - m_guiHelper(helper) - { - } - virtual ~CommonRigidBodyBase() - { - } - - btDiscreteDynamicsWorld* getDynamicsWorld() - { - return m_dynamicsWorld; - } - - virtual void createEmptyDynamicsWorld() - { - ///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)); - } - - virtual void stepSimulation(float deltaTime) - { - if (m_dynamicsWorld) - { - m_dynamicsWorld->stepSimulation(deltaTime); - } - } - - virtual void physicsDebugDraw(int debugFlags) - { - if (m_dynamicsWorld && m_dynamicsWorld->getDebugDrawer()) - { - m_dynamicsWorld->getDebugDrawer()->setDebugMode(debugFlags); - m_dynamicsWorld->debugDrawWorld(); - } - } - - virtual void exitPhysics() - { - removePickingConstraint(); - //cleanup in the reverse order of creation/initialization - - //remove the rigidbodies from the dynamics world and delete them - - if (m_dynamicsWorld) - { - int i; - for (i = m_dynamicsWorld->getNumConstraints() - 1; i >= 0; i--) - { - m_dynamicsWorld->removeConstraint(m_dynamicsWorld->getConstraint(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.size(); j++) - { - btCollisionShape* shape = m_collisionShapes[j]; - delete shape; - } - m_collisionShapes.clear(); - - delete m_dynamicsWorld; - m_dynamicsWorld = 0; - - delete m_solver; - m_solver = 0; - - delete m_broadphase; - m_broadphase = 0; - - delete m_dispatcher; - m_dispatcher = 0; - - delete m_collisionConfiguration; - m_collisionConfiguration = 0; - } - - virtual void debugDraw(int debugDrawFlags) - { - if (m_dynamicsWorld) - { - if (m_dynamicsWorld->getDebugDrawer()) - { - m_dynamicsWorld->getDebugDrawer()->setDebugMode(debugDrawFlags); - } - m_dynamicsWorld->debugDrawWorld(); - } - } - - virtual bool keyboardCallback(int key, int state) - { - if ((key == B3G_F3) && state && m_dynamicsWorld) - { - btDefaultSerializer* serializer = new btDefaultSerializer(); - m_dynamicsWorld->serialize(serializer); - - FILE* file = fopen("testFile.bullet", "wb"); - fwrite(serializer->getBufferPointer(), serializer->getCurrentBufferSize(), 1, file); - fclose(file); - //b3Printf("btDefaultSerializer wrote testFile.bullet"); - delete serializer; - return true; - } - return false; //don't handle this key - } - - btVector3 getRayTo(int x, int y) - { - CommonRenderInterface* renderer = m_guiHelper->getRenderInterface(); - - if (!renderer) - { - btAssert(0); - return btVector3(0, 0, 0); - } - - float top = 1.f; - float bottom = -1.f; - float nearPlane = 1.f; - float tanFov = (top - bottom) * 0.5f / nearPlane; - float fov = btScalar(2.0) * btAtan(tanFov); - - btVector3 camPos, camTarget; - - renderer->getActiveCamera()->getCameraPosition(camPos); - renderer->getActiveCamera()->getCameraTargetPosition(camTarget); - - btVector3 rayFrom = camPos; - btVector3 rayForward = (camTarget - camPos); - rayForward.normalize(); - float farPlane = 10000.f; - rayForward *= farPlane; - - btVector3 rightOffset; - btVector3 cameraUp = btVector3(0, 0, 0); - cameraUp[m_guiHelper->getAppInterface()->getUpAxis()] = 1; - - btVector3 vertical = cameraUp; - - btVector3 hor; - hor = rayForward.cross(vertical); - hor.safeNormalize(); - vertical = hor.cross(rayForward); - vertical.safeNormalize(); - - float tanfov = tanf(0.5f * fov); - - hor *= 2.f * farPlane * tanfov; - vertical *= 2.f * farPlane * tanfov; - - btScalar aspect; - float width = float(renderer->getScreenWidth()); - float height = float(renderer->getScreenHeight()); - - aspect = width / height; - - hor *= aspect; - - btVector3 rayToCenter = rayFrom + rayForward; - btVector3 dHor = hor * 1.f / width; - btVector3 dVert = vertical * 1.f / height; - - btVector3 rayTo = rayToCenter - 0.5f * hor + 0.5f * vertical; - rayTo += btScalar(x) * dHor; - rayTo -= btScalar(y) * dVert; - return rayTo; - } - - virtual bool mouseMoveCallback(float x, float y) - { - CommonRenderInterface* renderer = m_guiHelper->getRenderInterface(); - - if (!renderer) - { - btAssert(0); - return false; - } - - btVector3 rayTo = getRayTo(int(x), int(y)); - btVector3 rayFrom; - renderer->getActiveCamera()->getCameraPosition(rayFrom); - movePickedBody(rayFrom, rayTo); - - return false; - } - - virtual bool mouseButtonCallback(int button, int state, float x, float y) - { - CommonRenderInterface* renderer = m_guiHelper->getRenderInterface(); - - if (!renderer) - { - btAssert(0); - return false; - } - - CommonWindowInterface* window = m_guiHelper->getAppInterface()->m_window; - -#if 0 - if (window->isModifierKeyPressed(B3G_ALT)) - { - printf("ALT pressed\n"); - } else - { - printf("NO ALT pressed\n"); - } - - if (window->isModifierKeyPressed(B3G_SHIFT)) - { - printf("SHIFT pressed\n"); - } else - { - printf("NO SHIFT pressed\n"); - } - - if (window->isModifierKeyPressed(B3G_CONTROL)) - { - printf("CONTROL pressed\n"); - } else - { - printf("NO CONTROL pressed\n"); - } -#endif - - if (state == 1) - { - if (button == 0 && (!window->isModifierKeyPressed(B3G_ALT) && !window->isModifierKeyPressed(B3G_CONTROL))) - { - btVector3 camPos; - renderer->getActiveCamera()->getCameraPosition(camPos); - - btVector3 rayFrom = camPos; - btVector3 rayTo = getRayTo(int(x), int(y)); - - pickBody(rayFrom, rayTo); - } - } - else - { - if (button == 0) - { - removePickingConstraint(); - //remove p2p - } - } - - //printf("button=%d, state=%d\n",button,state); - return false; - } - - virtual bool pickBody(const btVector3& rayFromWorld, const btVector3& rayToWorld) - { - if (m_dynamicsWorld == 0) - return false; - - btCollisionWorld::ClosestRayResultCallback rayCallback(rayFromWorld, rayToWorld); - - rayCallback.m_flags |= btTriangleRaycastCallback::kF_UseGjkConvexCastRaytest; - m_dynamicsWorld->rayTest(rayFromWorld, rayToWorld, rayCallback); - if (rayCallback.hasHit()) - { - btVector3 pickPos = rayCallback.m_hitPointWorld; - btRigidBody* body = (btRigidBody*)btRigidBody::upcast(rayCallback.m_collisionObject); - if (body) - { - //other exclusions? - if (!(body->isStaticObject() || body->isKinematicObject())) - { - m_pickedBody = body; - m_savedState = m_pickedBody->getActivationState(); - m_pickedBody->setActivationState(DISABLE_DEACTIVATION); - //printf("pickPos=%f,%f,%f\n",pickPos.getX(),pickPos.getY(),pickPos.getZ()); - btVector3 localPivot = body->getCenterOfMassTransform().inverse() * pickPos; - btPoint2PointConstraint* p2p = new btPoint2PointConstraint(*body, localPivot); - m_dynamicsWorld->addConstraint(p2p, true); - m_pickedConstraint = p2p; - btScalar mousePickClamping = 30.f; - p2p->m_setting.m_impulseClamp = mousePickClamping; - //very weak constraint for picking - p2p->m_setting.m_tau = 0.001f; - } - } - - // pickObject(pickPos, rayCallback.m_collisionObject); - m_oldPickingPos = rayToWorld; - m_hitPos = pickPos; - m_oldPickingDist = (pickPos - rayFromWorld).length(); - // printf("hit !\n"); - //add p2p - } - return false; - } - virtual bool movePickedBody(const btVector3& rayFromWorld, const btVector3& rayToWorld) - { - if (m_pickedBody && m_pickedConstraint) - { - btPoint2PointConstraint* pickCon = static_cast(m_pickedConstraint); - if (pickCon) - { - //keep it at the same picking distance - - btVector3 newPivotB; - - btVector3 dir = rayToWorld - rayFromWorld; - dir.normalize(); - dir *= m_oldPickingDist; - - newPivotB = rayFromWorld + dir; - pickCon->setPivotB(newPivotB); - return true; - } - } - return false; - } - virtual void removePickingConstraint() - { - if (m_pickedConstraint) - { - m_pickedBody->forceActivationState(m_savedState); - m_pickedBody->activate(); - m_dynamicsWorld->removeConstraint(m_pickedConstraint); - delete m_pickedConstraint; - m_pickedConstraint = 0; - m_pickedBody = 0; - } - } - - btBoxShape* createBoxShape(const btVector3& halfExtents) - { - btBoxShape* box = new btBoxShape(halfExtents); - return box; - } - - void deleteRigidBody(btRigidBody* body) - { - int graphicsUid = body->getUserIndex(); - m_guiHelper->removeGraphicsInstance(graphicsUid); - - m_dynamicsWorld->removeRigidBody(body); - btMotionState* ms = body->getMotionState(); - delete body; - delete ms; - } - - btRigidBody* createRigidBody(float mass, const btTransform& startTransform, btCollisionShape* shape, const btVector4& color = btVector4(1, 0, 0, 1)) - { - 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); - //body->setContactProcessingThreshold(m_defaultContactProcessingThreshold); - -#else - btRigidBody* body = new btRigidBody(mass, 0, shape, localInertia); - body->setWorldTransform(startTransform); -#endif // - - body->setUserIndex(-1); - m_dynamicsWorld->addRigidBody(body); - return body; - } - - virtual void renderScene() - { - if (m_dynamicsWorld) - { - { - m_guiHelper->syncPhysicsToGraphics(m_dynamicsWorld); - } - - { - m_guiHelper->render(m_dynamicsWorld); - } - } - } -}; - -#endif //COMMON_RIGID_BODY_SETUP_H diff --git a/engine/inc/bullet/CommonInterfaces/CommonWindowInterface.h b/engine/inc/bullet/CommonInterfaces/CommonWindowInterface.h deleted file mode 100644 index ce212f64..00000000 --- a/engine/inc/bullet/CommonInterfaces/CommonWindowInterface.h +++ /dev/null @@ -1,88 +0,0 @@ -#ifndef B3G_WINDOW_INTERFACE_H -#define B3G_WINDOW_INTERFACE_H - -#include "CommonCallbacks.h" - -struct b3gWindowConstructionInfo -{ - int m_width; - int m_height; - bool m_fullscreen; - int m_colorBitsPerPixel; - void* m_windowHandle; - const char* m_title; - int m_openglVersion; - int m_renderDevice; - - b3gWindowConstructionInfo(int width = 1024, int height = 768) - : m_width(width), - m_height(height), - m_fullscreen(false), - m_colorBitsPerPixel(32), - m_windowHandle(0), - m_title("title"), - m_openglVersion(3), - m_renderDevice(-1) - { - } -}; - -class CommonWindowInterface -{ -public: - virtual ~CommonWindowInterface() - { - } - - virtual void createDefaultWindow(int width, int height, const char* title) - { - b3gWindowConstructionInfo ci(width, height); - ci.m_title = title; - createWindow(ci); - } - - virtual void createWindow(const b3gWindowConstructionInfo& ci) = 0; - - virtual void closeWindow() = 0; - - virtual void runMainLoop() = 0; - virtual float getTimeInSeconds() = 0; - - virtual bool requestedExit() const = 0; - virtual void setRequestExit() = 0; - - virtual void startRendering() = 0; - - virtual void endRendering() = 0; - - virtual bool isModifierKeyPressed(int key) = 0; - - virtual void setMouseMoveCallback(b3MouseMoveCallback mouseCallback) = 0; - virtual b3MouseMoveCallback getMouseMoveCallback() = 0; - - virtual void setMouseButtonCallback(b3MouseButtonCallback mouseCallback) = 0; - virtual b3MouseButtonCallback getMouseButtonCallback() = 0; - - virtual void setResizeCallback(b3ResizeCallback resizeCallback) = 0; - virtual b3ResizeCallback getResizeCallback() = 0; - - virtual void setWheelCallback(b3WheelCallback wheelCallback) = 0; - virtual b3WheelCallback getWheelCallback() = 0; - - virtual void setKeyboardCallback(b3KeyboardCallback keyboardCallback) = 0; - virtual b3KeyboardCallback getKeyboardCallback() = 0; - - virtual void setRenderCallback(b3RenderCallback renderCallback) = 0; - - virtual void setWindowTitle(const char* title) = 0; - - virtual float getRetinaScale() const = 0; - virtual void setAllowRetina(bool allow) = 0; - - virtual int getWidth() const = 0; - virtual int getHeight() const = 0; - - virtual int fileOpenDialog(char* fileName, int maxFileNameLength) = 0; -}; - -#endif //B3G_WINDOW_INTERFACE_H diff --git a/engine/inc/bullet/Constraints/ConstraintDemo.h b/engine/inc/bullet/Constraints/ConstraintDemo.h deleted file mode 100644 index de0061ba..00000000 --- a/engine/inc/bullet/Constraints/ConstraintDemo.h +++ /dev/null @@ -1,20 +0,0 @@ -/* -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 ALL_CONSTRAINT_DEMO_H -#define ALL_CONSTRAINT_DEMO_H - -class CommonExampleInterface* AllConstraintCreateFunc(struct CommonExampleOptions& options); - -#endif //ALL_CONSTRAINT_DEMO_H diff --git a/engine/inc/bullet/Constraints/ConstraintPhysicsSetup.h b/engine/inc/bullet/Constraints/ConstraintPhysicsSetup.h deleted file mode 100644 index 0c032ea9..00000000 --- a/engine/inc/bullet/Constraints/ConstraintPhysicsSetup.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef CONSTAINT_PHYSICS_SETUP_H -#define CONSTAINT_PHYSICS_SETUP_H - -class CommonExampleInterface* ConstraintCreateFunc(struct CommonExampleOptions& options); - -#endif //CONSTAINT_PHYSICS_SETUP_H diff --git a/engine/inc/bullet/Constraints/Dof6Spring2Setup.h b/engine/inc/bullet/Constraints/Dof6Spring2Setup.h deleted file mode 100644 index 66bda387..00000000 --- a/engine/inc/bullet/Constraints/Dof6Spring2Setup.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef GENERIC_6DOF_SPRING2_CONSTRAINT_DEMO_H -#define GENERIC_6DOF_SPRING2_CONSTRAINT_DEMO_H - -class CommonExampleInterface* Dof6Spring2CreateFunc(struct CommonExampleOptions& options); - -#endif //GENERIC_6DOF_SPRING2_CONSTRAINT_DEMO_H diff --git a/engine/inc/bullet/Constraints/TestHingeTorque.h b/engine/inc/bullet/Constraints/TestHingeTorque.h deleted file mode 100644 index 7d264840..00000000 --- a/engine/inc/bullet/Constraints/TestHingeTorque.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef TEST_HINGE_TORQUE_H -#define TEST_HINGE_TORQUE_H - -class CommonExampleInterface* TestHingeTorqueCreateFunc(struct CommonExampleOptions& options); - -#endif //TEST_HINGE_TORQUE_H diff --git a/engine/inc/bullet/ConvexDecomposition/ConvexBuilder.h b/engine/inc/bullet/ConvexDecomposition/ConvexBuilder.h deleted file mode 100644 index 238dfda0..00000000 --- a/engine/inc/bullet/ConvexDecomposition/ConvexBuilder.h +++ /dev/null @@ -1,103 +0,0 @@ -#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" - -class CHull -{ -public: - CHull(const ConvexDecomposition::ConvexResult &result); - - ~CHull(void); - - bool overlap(const CHull &h) const; - - float mMin[3]; - float mMax[3]; - float mVolume; - float mDiagonal; // long edge.. - ConvexDecomposition::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 CHullVector; - -class ConvexBuilder : public ConvexDecomposition::ConvexDecompInterface -{ -public: - ConvexBuilder(ConvexDecomposition::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 ConvexDecomposition::ConvexResult &cr, VertexLookup vc, UintVector &indices); - - CHull *canMerge(CHull *a, CHull *b); - - bool combineHulls(void); - - unsigned int process(const ConvexDecomposition::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(ConvexDecomposition::ConvexResult &result); - - void sortChulls(CHullVector &hulls); - - CHullVector mChulls; - ConvexDecompInterface *mCallback; -}; - -#endif //CONVEX_BUILDER_H diff --git a/engine/inc/bullet/ConvexDecomposition/ConvexDecomposition.h b/engine/inc/bullet/ConvexDecomposition/ConvexDecomposition.h deleted file mode 100644 index ad5c1f96..00000000 --- a/engine/inc/bullet/ConvexDecomposition/ConvexDecomposition.h +++ /dev/null @@ -1,202 +0,0 @@ -#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 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); - -} // namespace ConvexDecomposition - -#endif diff --git a/engine/inc/bullet/ConvexDecomposition/bestfit.h b/engine/inc/bullet/ConvexDecomposition/bestfit.h deleted file mode 100644 index 433f0966..00000000 --- a/engine/inc/bullet/ConvexDecomposition/bestfit.h +++ /dev/null @@ -1,63 +0,0 @@ -#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/engine/inc/bullet/ConvexDecomposition/bestfitobb.h b/engine/inc/bullet/ConvexDecomposition/bestfitobb.h deleted file mode 100644 index 4536c1cd..00000000 --- a/engine/inc/bullet/ConvexDecomposition/bestfitobb.h +++ /dev/null @@ -1,41 +0,0 @@ -#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/engine/inc/bullet/ConvexDecomposition/cd_hull.h b/engine/inc/bullet/ConvexDecomposition/cd_hull.h deleted file mode 100644 index 212815f8..00000000 --- a/engine/inc/bullet/ConvexDecomposition/cd_hull.h +++ /dev/null @@ -1,148 +0,0 @@ -#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); -}; - -} // namespace ConvexDecomposition - -#endif diff --git a/engine/inc/bullet/ConvexDecomposition/cd_vector.h b/engine/inc/bullet/ConvexDecomposition/cd_vector.h deleted file mode 100644 index 6d46b2f3..00000000 --- a/engine/inc/bullet/ConvexDecomposition/cd_vector.h +++ /dev/null @@ -1,1192 +0,0 @@ -#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(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(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(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 - { - 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 Vector3dVector; -typedef std::vector 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); -} - -} // namespace ConvexDecomposition - -#endif diff --git a/engine/inc/bullet/ConvexDecomposition/cd_wavefront.h b/engine/inc/bullet/ConvexDecomposition/cd_wavefront.h deleted file mode 100644 index e50a5853..00000000 --- a/engine/inc/bullet/ConvexDecomposition/cd_wavefront.h +++ /dev/null @@ -1,57 +0,0 @@ -#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; -}; - -} // namespace ConvexDecomposition - -#endif diff --git a/engine/inc/bullet/ConvexDecomposition/concavity.h b/engine/inc/bullet/ConvexDecomposition/concavity.h deleted file mode 100644 index be5e7580..00000000 --- a/engine/inc/bullet/ConvexDecomposition/concavity.h +++ /dev/null @@ -1,55 +0,0 @@ -#ifndef COMPUTE_CONCAVITY_H - -#define COMPUTE_CONCAVITY_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 ConvexDecompInterface; - -// compute's how 'concave' this object is and returns the total volume of the -// convex hull as well as the volume of the 'concavity' which was found. -float computeConcavity(unsigned int vcount, - const float *vertices, - unsigned int tcount, - const unsigned int *indices, - ConvexDecompInterface *callback, - float *plane, - float &volume); - -} // namespace ConvexDecomposition - -#endif diff --git a/engine/inc/bullet/ConvexDecomposition/fitsphere.h b/engine/inc/bullet/ConvexDecomposition/fitsphere.h deleted file mode 100644 index 41d20dbd..00000000 --- a/engine/inc/bullet/ConvexDecomposition/fitsphere.h +++ /dev/null @@ -1,41 +0,0 @@ -#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/engine/inc/bullet/ConvexDecomposition/float_math.h b/engine/inc/bullet/ConvexDecomposition/float_math.h deleted file mode 100644 index b2328001..00000000 --- a/engine/inc/bullet/ConvexDecomposition/float_math.h +++ /dev/null @@ -1,71 +0,0 @@ -#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/engine/inc/bullet/ConvexDecomposition/meshvolume.h b/engine/inc/bullet/ConvexDecomposition/meshvolume.h deleted file mode 100644 index 73477e0c..00000000 --- a/engine/inc/bullet/ConvexDecomposition/meshvolume.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef MESH_VOLUME_H - -#define MESH_VOLUME_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 computeMeshVolume(const float *vertices, unsigned int tcount, const unsigned int *indices); -float computeMeshVolume2(const float *vertices, unsigned int tcount, const unsigned int *indices); - -#endif diff --git a/engine/inc/bullet/ConvexDecomposition/planetri.h b/engine/inc/bullet/ConvexDecomposition/planetri.h deleted file mode 100644 index 1ae2ab21..00000000 --- a/engine/inc/bullet/ConvexDecomposition/planetri.h +++ /dev/null @@ -1,55 +0,0 @@ -#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/engine/inc/bullet/ConvexDecomposition/raytri.h b/engine/inc/bullet/ConvexDecomposition/raytri.h deleted file mode 100644 index 19932f8c..00000000 --- a/engine/inc/bullet/ConvexDecomposition/raytri.h +++ /dev/null @@ -1,43 +0,0 @@ -#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/engine/inc/bullet/ConvexDecomposition/splitplane.h b/engine/inc/bullet/ConvexDecomposition/splitplane.h deleted file mode 100644 index 12bc06a3..00000000 --- a/engine/inc/bullet/ConvexDecomposition/splitplane.h +++ /dev/null @@ -1,55 +0,0 @@ -#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); - -} // namespace ConvexDecomposition - -#endif diff --git a/engine/inc/bullet/ConvexDecomposition/vlookup.h b/engine/inc/bullet/ConvexDecomposition/vlookup.h deleted file mode 100644 index 8120def4..00000000 --- a/engine/inc/bullet/ConvexDecomposition/vlookup.h +++ /dev/null @@ -1,115 +0,0 @@ -#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/engine/inc/bullet/DeformableDemo/ClothFriction.h b/engine/inc/bullet/DeformableDemo/ClothFriction.h deleted file mode 100644 index 228ec659..00000000 --- a/engine/inc/bullet/DeformableDemo/ClothFriction.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - Bullet Continuous Collision Detection and Physics Library - Copyright (c) 2019 Google Inc. http://bulletphysics.org - 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 CLOTH_FRICTION_H -#define CLOTH_FRICTION_H - -class CommonExampleInterface* ClothFrictionCreateFunc(struct CommonExampleOptions& options); - -#endif //CLOTH_FRICTION_H diff --git a/engine/inc/bullet/DeformableDemo/Collide.h b/engine/inc/bullet/DeformableDemo/Collide.h deleted file mode 100644 index 97a432e5..00000000 --- a/engine/inc/bullet/DeformableDemo/Collide.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - Bullet Continuous Collision Detection and Physics Library - Copyright (c) 2019 Google Inc. http://bulletphysics.org - 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 _COLLIDE_H -#define _COLLIDE_H - -class CommonExampleInterface* CollideCreateFunc(struct CommonExampleOptions& options); - -#endif //_COLLIDE_H diff --git a/engine/inc/bullet/DeformableDemo/DeformableClothAnchor.h b/engine/inc/bullet/DeformableDemo/DeformableClothAnchor.h deleted file mode 100644 index 4e838864..00000000 --- a/engine/inc/bullet/DeformableDemo/DeformableClothAnchor.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - Bullet Continuous Collision Detection and Physics Library - Copyright (c) 2019 Google Inc. http://bulletphysics.org - 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 DEFORMABLE_CLOTH_ANCHOR_H -#define DEFORMABLE_CLOTH_ANCHOR_H - -class CommonExampleInterface* DeformableClothAnchorCreateFunc(struct CommonExampleOptions& options); - -#endif //DEFORMABLE_CLOTH_ANCHOR_H diff --git a/engine/inc/bullet/DeformableDemo/DeformableContact.h b/engine/inc/bullet/DeformableDemo/DeformableContact.h deleted file mode 100644 index 1e1fe567..00000000 --- a/engine/inc/bullet/DeformableDemo/DeformableContact.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - Bullet Continuous Collision Detection and Physics Library - Copyright (c) 2019 Google Inc. http://bulletphysics.org - 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 DEFORMABLE_CONTACT_H -#define DEFORMABLE_CONTACT_H - -class CommonExampleInterface* DeformableContactCreateFunc(struct CommonExampleOptions& options); - -#endif //_DEFORMABLE_CONTACT_H diff --git a/engine/inc/bullet/DeformableDemo/DeformableMultibody.h b/engine/inc/bullet/DeformableDemo/DeformableMultibody.h deleted file mode 100644 index acd9d421..00000000 --- a/engine/inc/bullet/DeformableDemo/DeformableMultibody.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - Bullet Continuous Collision Detection and Physics Library - Copyright (c) 2019 Google Inc. http://bulletphysics.org - 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 _DEFORMABLE_MULTIBODY_H -#define _DEFORMABLE_MULTIBODY_H - -class CommonExampleInterface* DeformableMultibodyCreateFunc(struct CommonExampleOptions& options); - -#endif //_DEFORMABLE_MULTIBODY_H diff --git a/engine/inc/bullet/DeformableDemo/DeformableRigid.h b/engine/inc/bullet/DeformableDemo/DeformableRigid.h deleted file mode 100644 index 0d0e0dc5..00000000 --- a/engine/inc/bullet/DeformableDemo/DeformableRigid.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - Bullet Continuous Collision Detection and Physics Library - Copyright (c) 2019 Google Inc. http://bulletphysics.org - 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 _DEFORMABLE_RIGID_H -#define _DEFORMABLE_RIGID_H - -class CommonExampleInterface* DeformableRigidCreateFunc(struct CommonExampleOptions& options); - -#endif //_DEFORMABLE_RIGID_H diff --git a/engine/inc/bullet/DeformableDemo/DeformableSelfCollision.h b/engine/inc/bullet/DeformableDemo/DeformableSelfCollision.h deleted file mode 100644 index 36359c0d..00000000 --- a/engine/inc/bullet/DeformableDemo/DeformableSelfCollision.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - Bullet Continuous Collision Detection and Physics Library - Copyright (c) 2019 Google Inc. http://bulletphysics.org - 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 DEFORMABLE_SELF_COLLISION_H -#define DEFORMABLE_SELF_COLLISION_H - -class CommonExampleInterface* DeformableSelfCollisionCreateFunc(struct CommonExampleOptions& options); - -#endif //_DEFORMABLE_SELF_COLLISION_H diff --git a/engine/inc/bullet/DeformableDemo/GraspDeformable.h b/engine/inc/bullet/DeformableDemo/GraspDeformable.h deleted file mode 100644 index 1ce2230d..00000000 --- a/engine/inc/bullet/DeformableDemo/GraspDeformable.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - Bullet Continuous Collision Detection and Physics Library - Copyright (c) 2019 Google Inc. http://bulletphysics.org - 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 _GRASP_DEFORMABLE_H -#define _GRASP_DEFORMABLE_H - -class CommonExampleInterface* GraspDeformableCreateFunc(struct CommonExampleOptions& options); - -#endif //_GRASP_DEFORMABLE_H diff --git a/engine/inc/bullet/DeformableDemo/LargeDeformation.h b/engine/inc/bullet/DeformableDemo/LargeDeformation.h deleted file mode 100644 index bb68082f..00000000 --- a/engine/inc/bullet/DeformableDemo/LargeDeformation.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - Bullet Continuous Collision Detection and Physics Library - Copyright (c) 2019 Google Inc. http://bulletphysics.org - 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 _LARGE_DEFORMATION_H -#define _LARGE_DEFORMATION_H - -class CommonExampleInterface* LargeDeformationCreateFunc(struct CommonExampleOptions& options); - -#endif //_LARGE_DEFORMATION_H diff --git a/engine/inc/bullet/DeformableDemo/MultibodyClothAnchor.h b/engine/inc/bullet/DeformableDemo/MultibodyClothAnchor.h deleted file mode 100644 index 818e043c..00000000 --- a/engine/inc/bullet/DeformableDemo/MultibodyClothAnchor.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - Bullet Continuous Collision Detection and Physics Library - Copyright (c) 2019 Google Inc. http://bulletphysics.org - 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 MULTIBODY_CLOTH_ANCHOR_H -#define MULTIBODY_CLOTH_ANCHOR_H - -class CommonExampleInterface* MultibodyClothAnchorCreateFunc(struct CommonExampleOptions& options); - -#endif //MULTIBODY_CLOTH_ANCHOR_H diff --git a/engine/inc/bullet/DeformableDemo/Pinch.h b/engine/inc/bullet/DeformableDemo/Pinch.h deleted file mode 100644 index 1616ec39..00000000 --- a/engine/inc/bullet/DeformableDemo/Pinch.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - Bullet Continuous Collision Detection and Physics Library - Copyright (c) 2019 Google Inc. http://bulletphysics.org - 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 _PINCH_H -#define _PINCH_H - -class CommonExampleInterface* PinchCreateFunc(struct CommonExampleOptions& options); - -#endif //_PINCH_H diff --git a/engine/inc/bullet/DeformableDemo/PinchFriction.h b/engine/inc/bullet/DeformableDemo/PinchFriction.h deleted file mode 100644 index b397ba34..00000000 --- a/engine/inc/bullet/DeformableDemo/PinchFriction.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - Bullet Continuous Collision Detection and Physics Library - Copyright (c) 2019 Google Inc. http://bulletphysics.org - 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 _PINCH_FRICTION_H -#define _PINCH_FRICTION_H - -class CommonExampleInterface* PinchFrictionCreateFunc(struct CommonExampleOptions& options); - -#endif //_PINCH_FRICTION_H diff --git a/engine/inc/bullet/DeformableDemo/SplitImpulse.h b/engine/inc/bullet/DeformableDemo/SplitImpulse.h deleted file mode 100644 index 441f9106..00000000 --- a/engine/inc/bullet/DeformableDemo/SplitImpulse.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - Bullet Continuous Collision Detection and Physics Library - Copyright (c) 2019 Google Inc. http://bulletphysics.org - 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 _SPLIT_IMPULSE_H -#define _SPLIT_IMPULSE_H - -class CommonExampleInterface* SplitImpulseCreateFunc(struct CommonExampleOptions& options); - -#endif //_SPLIT_IMPULSE_H diff --git a/engine/inc/bullet/DeformableDemo/VolumetricDeformable.h b/engine/inc/bullet/DeformableDemo/VolumetricDeformable.h deleted file mode 100644 index fe5d326a..00000000 --- a/engine/inc/bullet/DeformableDemo/VolumetricDeformable.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - Bullet Continuous Collision Detection and Physics Library - Copyright (c) 2019 Google Inc. http://bulletphysics.org - 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 _VOLUMETRIC_DEFORMABLE_H -#define _VOLUMETRIC_DEFORMABLE_H - -class CommonExampleInterface* VolumetricDeformableCreateFunc(struct CommonExampleOptions& options); - -#endif //_VOLUMETRIC_DEFORMABLE__H diff --git a/engine/inc/bullet/DynamicControlDemo/MotorDemo.h b/engine/inc/bullet/DynamicControlDemo/MotorDemo.h deleted file mode 100644 index 1389224c..00000000 --- a/engine/inc/bullet/DynamicControlDemo/MotorDemo.h +++ /dev/null @@ -1,21 +0,0 @@ -/* -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. -*/ - -#ifndef MOTORDEMO_H -#define MOTORDEMO_H - -class CommonExampleInterface* MotorControlCreateFunc(struct CommonExampleOptions& options); - -#endif diff --git a/engine/inc/bullet/Evolution/NN3DWalkers.h b/engine/inc/bullet/Evolution/NN3DWalkers.h deleted file mode 100644 index 26a7bf81..00000000 --- a/engine/inc/bullet/Evolution/NN3DWalkers.h +++ /dev/null @@ -1,21 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2015 Google Inc. http://bulletphysics.org - -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 ET_NN_3D_WALKERS_EXAMPLE_H -#define ET_NN_3D_WALKERS_EXAMPLE_H - -class CommonExampleInterface* ET_NN3DWalkersCreateFunc(struct CommonExampleOptions& options); - -#endif //ET_NN_3D_WALKERS_EXAMPLE_H diff --git a/engine/inc/bullet/Evolution/NN3DWalkersTimeWarpBase.h b/engine/inc/bullet/Evolution/NN3DWalkersTimeWarpBase.h deleted file mode 100644 index deef1147..00000000 --- a/engine/inc/bullet/Evolution/NN3DWalkersTimeWarpBase.h +++ /dev/null @@ -1,950 +0,0 @@ -/* - Bullet Continuous Collision Detection and Physics Library - Copyright (c) 2015 Google Inc. http://bulletphysics.org - - 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 NN3D_WALKERS_TIME_WARP_BASE_H -#define NN3D_WALKERS_TIME_WARP_BASE_H - -#include "btBulletDynamicsCommon.h" -#include "LinearMath/btVector3.h" -#include "LinearMath/btAlignedObjectArray.h" -#include "LinearMath/btQuickprof.h" // Use your own timer, this timer is only used as we lack another timer - -#include "../CommonInterfaces/CommonRigidBodyBase.h" -#include "../CommonInterfaces/CommonParameterInterface.h" - -//Solvers -#include "BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h" -#include "BulletDynamics/ConstraintSolver/btNNCGConstraintSolver.h" -#include "BulletDynamics/Featherstone/btMultiBodyConstraintSolver.h" -#include "BulletDynamics/Featherstone/btMultiBodyDynamicsWorld.h" -#include "BulletDynamics/MLCPSolvers/btDantzigSolver.h" -#include "BulletDynamics/MLCPSolvers/btSolveProjectedGaussSeidel.h" -#include "BulletDynamics/MLCPSolvers/btLemkeSolver.h" -#include "BulletDynamics/MLCPSolvers/btMLCPSolver.h" - -#include "../Utils/b3ERPCFMHelper.hpp" // ERP/CFM setting utils - -static btScalar gSimulationSpeed = 1; // default simulation speed at startup - -// the current simulation speeds to choose from (the slider will snap to those using a custom form of snapping) -namespace SimulationSpeeds -{ -static double /*0*/ PAUSE = 0; -static double /*1*/ QUARTER_SPEED = 0.25; -static double /*2*/ HALF_SPEED = 0.5; -static double /*3*/ NORMAL_SPEED = 1; -static double /*4*/ DOUBLE_SPEED = 2; -static double /*5*/ QUADRUPLE_SPEED = 4; -static double /*6*/ DECUPLE_SPEED = 10; -static double /*7*/ CENTUPLE_SPEED = 100; -static double /*8*/ QUINCENTUPLE_SPEED = 500; -static double /*9*/ MILLITUPLE_SPEED = 1000; -static double /*0*/ MAX_SPEED = MILLITUPLE_SPEED; -static double /**/ NUM_SPEEDS = 10; -}; // namespace SimulationSpeeds - -// add speeds from the namespace here -static double speeds[] = { - SimulationSpeeds::PAUSE, - SimulationSpeeds::QUARTER_SPEED, SimulationSpeeds::HALF_SPEED, - SimulationSpeeds::NORMAL_SPEED, SimulationSpeeds::DOUBLE_SPEED, - SimulationSpeeds::QUADRUPLE_SPEED, SimulationSpeeds::DECUPLE_SPEED, - SimulationSpeeds::CENTUPLE_SPEED, SimulationSpeeds::QUINCENTUPLE_SPEED, - SimulationSpeeds::MILLITUPLE_SPEED}; - -static btScalar gSolverIterations = 10; // default number of solver iterations for the iterative solvers - -static bool gIsHeadless = false; // demo runs with graphics by default - -static bool gChangeErpCfm = false; // flag to make recalculation of ERP/CFM - -static int gMinSpeed = SimulationSpeeds::PAUSE; // the minimum simulation speed - -static int gMaxSpeed = SimulationSpeeds::MAX_SPEED; // the maximum simulation speed - -static bool gMaximumSpeed = false; // the demo does not try to achieve maximum stepping speed by default - -static bool gInterpolate = false; // the demo does not use any bullet interpolated physics substeps - -static bool useSplitImpulse = true; // split impulse fixes issues with restitution in Baumgarte stabilization -// http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?f=9&t=7117&p=24631&hilit=Baumgarte#p24631 -// disabling continuous collision detection can also fix issues with restitution, though CCD is disabled by default an only kicks in at higher speeds -// set CCD speed threshold and testing sphere radius per rigidbody (rb->setCCDSpeedThreshold()) - -// all supported solvers by bullet -enum SolverEnumType -{ - SEQUENTIALIMPULSESOLVER = 0, - GAUSSSEIDELSOLVER = 1, - NNCGSOLVER = 2, - DANZIGSOLVER = 3, - LEMKESOLVER = 4, - - NUM_SOLVERS = 6 -}; - -// solvers can be changed by drop down menu -namespace SolverType -{ -static char SEQUENTIALIMPULSESOLVER[] = "Sequential Impulse Solver"; -static char GAUSSSEIDELSOLVER[] = "Gauss-Seidel Solver"; -static char NNCGSOLVER[] = "NNCG Solver"; -static char DANZIGSOLVER[] = "Danzig Solver"; -static char LEMKESOLVER[] = "Lemke Solver"; - -}; // namespace SolverType - -static const char* solverTypes[NUM_SOLVERS]; - -static SolverEnumType SOLVER_TYPE = SEQUENTIALIMPULSESOLVER; // You can switch the solver here - -//TODO:s=== -//TODO: Give specific explanations about solver values - -/** - * Step size of the bullet physics simulator (solverAccuracy). Accuracy versus speed. - */ -// Choose an appropriate number of steps per second for your needs -static btScalar gPhysicsStepsPerSecond = 60.0f; // Default number of steps -//static btScalar gPhysicsStepsPerSecond = 120.0f; // Double steps for more accuracy -//static btScalar gPhysicsStepsPerSecond = 240.0f; // For high accuracy -//static btScalar gPhysicsStepsPerSecond = 1000.0f; // Very high accuracy - -// appropriate inverses for seconds and milliseconds -static double fixedPhysicsStepSizeSec = 1.0f / gPhysicsStepsPerSecond; // steps size in seconds -static double fixedPhysicsStepSizeMilli = 1000.0f / gPhysicsStepsPerSecond; // step size in milliseconds - -static btScalar gApplicationFrequency = 60.0f; // number of internal application ticks per second -static int gApplicationTick = 1000.0f / gApplicationFrequency; //ms - -static btScalar gFramesPerSecond = 30.0f; // number of frames per second - -static btScalar gERPSpringK = 10; -static btScalar gERPDamperC = 1; - -static btScalar gCFMSpringK = 10; -static btScalar gCFMDamperC = 1; -static btScalar gCFMSingularityAvoidance = 0; - -//GUI related parameter changing helpers - -inline void twxChangePhysicsStepsPerSecond(float physicsStepsPerSecond, void*) -{ // function to change simulation physics steps per second - gPhysicsStepsPerSecond = physicsStepsPerSecond; -} - -inline void twxChangeFPS(float framesPerSecond, void*) -{ - gFramesPerSecond = framesPerSecond; -} - -inline void twxChangeERPCFM(float notUsed, void*) -{ // function to change ERP/CFM appropriately - gChangeErpCfm = true; -} - -inline void changeSolver(int comboboxId, const char* item, void* userPointer) -{ // function to change the solver - for (int i = 0; i < NUM_SOLVERS; i++) - { - if (strcmp(solverTypes[i], item) == 0) - { // if the strings are equal - SOLVER_TYPE = ((SolverEnumType)i); - b3Printf("=%s=\n Reset the simulation by double clicking it in the menu list.", item); - return; - } - } - b3Printf("No Change"); -} - -inline void twxChangeSolverIterations(float notUsed, void* userPtr) -{ // change the solver iterations -} - -inline void clampToCustomSpeedNotches(float speed, void*) -{ // function to clamp to custom speed notches - double minSpeed = 0; - double minSpeedDist = SimulationSpeeds::MAX_SPEED; - for (int i = 0; i < SimulationSpeeds::NUM_SPEEDS; i++) - { - double speedDist = (speeds[i] - speed >= 0) ? speeds[i] - speed : speed - speeds[i]; // float absolute - - if (minSpeedDist > speedDist) - { - minSpeedDist = speedDist; - minSpeed = speeds[i]; - } - } - gSimulationSpeed = minSpeed; -} - -inline void switchInterpolated(int buttonId, bool buttonState, void* userPointer) -{ // toggle if interpolation steps are taken - gInterpolate = !gInterpolate; - // b3Printf("Interpolate substeps %s", gInterpolate?"on":"off"); -} - -inline void switchHeadless(int buttonId, bool buttonState, void* userPointer) -{ // toggle if the demo should run headless - gIsHeadless = !gIsHeadless; - // b3Printf("Run headless %s", gIsHeadless?"on":"off"); -} - -inline void switchMaximumSpeed(int buttonId, bool buttonState, void* userPointer) -{ // toggle it the demo should run as fast as possible - // b3Printf("Run maximum speed %s", gMaximumSpeed?"on":"off"); -} - -inline void setApplicationTick(float frequency, void*) -{ // set internal application tick - gApplicationTick = 1000.0f / frequency; -} - -/** - * @link: Gaffer on Games - Fix your timestep: http://gafferongames.com/game-physics/fix-your-timestep/ - */ -struct NN3DWalkersTimeWarpBase : public CommonRigidBodyBase -{ - NN3DWalkersTimeWarpBase(struct GUIHelperInterface* helper) : CommonRigidBodyBase(helper), - mPhysicsStepsPerSecondUpdated(false), - mFramesPerSecondUpdated(false), - mSolverIterationsUpdated(false) - { - // main frame timer initialization - mApplicationStart = mLoopTimer.getTimeMilliseconds(); /**!< Initialize when the application started running */ - mInputClock = mApplicationStart; /**!< Initialize the last time the input was updated */ - mPreviousModelIteration = mApplicationStart; - mThisModelIteration = mApplicationStart; - mApplicationRuntime = mThisModelIteration - mApplicationStart; /**!< Initialize the application runtime */ - - // sub frame time initializations - mGraphicsStart = mApplicationStart; /** !< Initialize the last graphics start */ - mModelStart = mApplicationStart; /** !< Initialize the last model start */ - mInputStart = mApplicationStart; /** !< Initialize the last input start */ - - mPhysicsStepStart = mApplicationStart; /**!< Initialize the physics step start */ - mPhysicsStepEnd = mApplicationStart; /**!< Initialize the physics step end */ - - //durations - mLastGraphicsTick = 0; - mLastModelTick = 0; - mLastInputTick = 0; - mPhysicsTick = 0; - - mInputDt = 0; - mModelAccumulator = 0; - mFrameTime = 0; - - fpsTimeStamp = mLoopTimer.getTimeMilliseconds(); // to time the fps - fpsStep = 1000.0f / gFramesPerSecond; - - // performance measurements for this demo - performanceTimestamp = 0; - performedTime = 0; // time the physics steps consumed - speedUpPrintTimeStamp = mLoopTimer.getTimeSeconds(); // timer to print the speed up periodically - mLoopTimer.reset(); - } - - ~NN3DWalkersTimeWarpBase() - { - } - - void initPhysics() - { // initialize the demo - - setupBasicParamInterface(); // setup adjustable sliders and buttons for parameters - - m_guiHelper->setUpAxis(1); // Set Y axis as Up axis - - createEmptyDynamicsWorld(); // create an empty dynamic world - - m_guiHelper->autogenerateGraphicsObjects(m_dynamicsWorld); - } - - void setupBasicParamInterface() - { // setup the adjustable sliders and button for parameters - - { // create a slider to adjust the simulation speed - // Force increase the simulation speed to run the simulation with the same accuracy but a higher speed - SliderParams slider("Simulation speed", - &gSimulationSpeed); - slider.m_minVal = gMinSpeed; - slider.m_maxVal = gMaxSpeed; - slider.m_callback = clampToCustomSpeedNotches; - slider.m_clampToNotches = false; - if (m_guiHelper->getParameterInterface()) - m_guiHelper->getParameterInterface()->registerSliderFloatParameter( - slider); - } - - { // create a button to switch to headless simulation - // This turns off the graphics update and therefore results in more time for the model update - ButtonParams button("Run headless", 0, true); - button.m_callback = switchHeadless; - if (m_guiHelper->getParameterInterface()) - m_guiHelper->getParameterInterface()->registerButtonParameter( - button); - } - - { // create a button to switch to maximum speed simulation (fully deterministic) - // Interesting to test the maximal achievable speed on this hardware - ButtonParams button("Run maximum speed", 0, true); - button.m_callback = switchMaximumSpeed; - if (m_guiHelper->getParameterInterface()) - m_guiHelper->getParameterInterface()->registerButtonParameter( - button); - } - - { // create a button to switch bullet to perform interpolated substeps to speed up simulation - // generally, interpolated steps are a good speed-up and should only be avoided if higher accuracy is needed (research purposes etc.) - ButtonParams button("Perform interpolated substeps", 0, true); - button.m_callback = switchInterpolated; - if (m_guiHelper->getParameterInterface()) - m_guiHelper->getParameterInterface()->registerButtonParameter( - button); - } - } - - void setupAdvancedParamInterface() - { - solverTypes[0] = SolverType::SEQUENTIALIMPULSESOLVER; - solverTypes[1] = SolverType::GAUSSSEIDELSOLVER; - solverTypes[2] = SolverType::NNCGSOLVER; - solverTypes[3] = SolverType::DANZIGSOLVER; - solverTypes[4] = SolverType::LEMKESOLVER; - - - { - ComboBoxParams comboParams; - comboParams.m_comboboxId = 0; - comboParams.m_numItems = NUM_SOLVERS; - comboParams.m_startItem = SOLVER_TYPE; - comboParams.m_callback = changeSolver; - - comboParams.m_items = solverTypes; - m_guiHelper->getParameterInterface()->registerComboBox(comboParams); - } - - { // create a slider to adjust the number of internal application ticks - // The set application tick should contain enough time to perform a full cycle of model update (physics and input) - // and view update (graphics) with average application load. The graphics and input update determine the remaining time - // for the physics update - SliderParams slider("Application Ticks", - &gApplicationFrequency); - slider.m_minVal = gMinSpeed; - slider.m_maxVal = gMaxSpeed; - slider.m_callback = setApplicationTick; - slider.m_clampToNotches = false; - if (m_guiHelper->getParameterInterface()) - m_guiHelper->getParameterInterface()->registerSliderFloatParameter( - slider); - } - - { // create a slider to adjust the number of physics steps per second - // The default number of steps is at 60, which is appropriate for most general simulations - // For simulations with higher complexity or if you experience undesired behavior, try increasing the number of steps per second - // Alternatively, try increasing the number of solver iterations if you experience jittering constraints due to non-converging solutions - SliderParams slider("Physics steps per second", &gPhysicsStepsPerSecond); - slider.m_minVal = 0; - slider.m_maxVal = 1000; - slider.m_callback = twxChangePhysicsStepsPerSecond; - slider.m_clampToNotches = false; - if (m_guiHelper->getParameterInterface()) - m_guiHelper->getParameterInterface()->registerSliderFloatParameter( - slider); - } - - { // create a slider to adjust the number of frames per second - SliderParams slider("Frames per second", &gFramesPerSecond); - slider.m_minVal = 0; - slider.m_maxVal = 200; - slider.m_callback = twxChangeFPS; - slider.m_clampToNotches = false; - if (m_guiHelper->getParameterInterface()) - m_guiHelper->getParameterInterface()->registerSliderFloatParameter( - slider); - } - - { // create a slider to adjust the number of solver iterations to converge to a solution - // more complex simulations might need a higher number of iterations to converge, it also - // depends on the type of solver. - SliderParams slider( - "Solver interations", - &gSolverIterations); - slider.m_minVal = 0; - slider.m_maxVal = 1000; - slider.m_callback = twxChangePhysicsStepsPerSecond; - slider.m_clampToIntegers = true; - m_guiHelper->getParameterInterface()->registerSliderFloatParameter( - slider); - } - - // ERP/CFM sliders - // Advanced users: Check descriptions of ERP/CFM in BulletUtils.cpp - - { // create a slider to adjust ERP Spring k constant - SliderParams slider("Global ERP Spring k (F=k*x)", &gERPSpringK); - slider.m_minVal = 0; - slider.m_maxVal = 10; - slider.m_callback = twxChangeERPCFM; - slider.m_clampToNotches = false; - if (m_guiHelper->getParameterInterface()) - m_guiHelper->getParameterInterface()->registerSliderFloatParameter( - slider); - } - - { // create a slider to adjust ERP damper c constant - SliderParams slider("Global ERP damper c (F=c*xdot)", &gERPDamperC); - slider.m_minVal = 0; - slider.m_maxVal = 10; - slider.m_callback = twxChangeERPCFM; - slider.m_clampToNotches = false; - if (m_guiHelper->getParameterInterface()) - m_guiHelper->getParameterInterface()->registerSliderFloatParameter( - slider); - } - - { // create a slider to adjust CFM Spring k constant - SliderParams slider("Global CFM Spring k (F=k*x)", &gCFMSpringK); - slider.m_minVal = 0; - slider.m_maxVal = 10; - slider.m_callback = twxChangeERPCFM; - slider.m_clampToNotches = false; - if (m_guiHelper->getParameterInterface()) - m_guiHelper->getParameterInterface()->registerSliderFloatParameter( - slider); - } - - { // create a slider to adjust CFM damper c constant - SliderParams slider("Global CFM damper c (F=c*xdot)", &gCFMDamperC); - slider.m_minVal = 0; - slider.m_maxVal = 10; - slider.m_callback = twxChangeERPCFM; - slider.m_clampToNotches = false; - if (m_guiHelper->getParameterInterface()) - m_guiHelper->getParameterInterface()->registerSliderFloatParameter( - slider); - } - - { // create a slider to adjust CFM damper c constant - SliderParams slider("Global CFM singularity avoidance", &gCFMSingularityAvoidance); - slider.m_minVal = 0; - slider.m_maxVal = 10; - slider.m_callback = twxChangeERPCFM; - slider.m_clampToNotches = false; - if (m_guiHelper->getParameterInterface()) - m_guiHelper->getParameterInterface()->registerSliderFloatParameter( - slider); - } - } - - void createEmptyDynamicsWorld() - { // create an empty dynamics worlds according to the chosen settings via statics (top section of code) - - ///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); - - // default broadphase - m_broadphase = new btDbvtBroadphase(); - - // different solvers require different settings - switch (SOLVER_TYPE) - { - case SEQUENTIALIMPULSESOLVER: - { - // b3Printf("=%s=",SolverType::SEQUENTIALIMPULSESOLVER); - m_solver = new btSequentialImpulseConstraintSolver(); - break; - } - case NNCGSOLVER: - { - // b3Printf("=%s=",SolverType::NNCGSOLVER); - m_solver = new btNNCGConstraintSolver(); - break; - } - case DANZIGSOLVER: - { - // b3Printf("=%s=",SolverType::DANZIGSOLVER); - btDantzigSolver* mlcp = new btDantzigSolver(); - m_solver = new btMLCPSolver(mlcp); - break; - } - case GAUSSSEIDELSOLVER: - { - // b3Printf("=%s=",SolverType::GAUSSSEIDELSOLVER); - btSolveProjectedGaussSeidel* mlcp = new btSolveProjectedGaussSeidel(); - m_solver = new btMLCPSolver(mlcp); - break; - } - case LEMKESOLVER: - { - // b3Printf("=%s=",SolverType::LEMKESOLVER); - btLemkeSolver* mlcp = new btLemkeSolver(); - m_solver = new btMLCPSolver(mlcp); - break; - } - - default: - break; - } - - if (1) - { - //TODO: Set parameters for other solvers - - m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher, - m_broadphase, m_solver, m_collisionConfiguration); - - if (SOLVER_TYPE == DANZIGSOLVER || SOLVER_TYPE == GAUSSSEIDELSOLVER) - { - m_dynamicsWorld->getSolverInfo().m_minimumSolverBatchSize = 1; //for mlcp solver it is better to have a small A matrix - } - else - { - m_dynamicsWorld->getSolverInfo().m_minimumSolverBatchSize = 128; //for direct solver, it is better to solve multiple objects together, small batches have high overhead - } - - m_dynamicsWorld->getDispatchInfo().m_useContinuous = true; // set continuous collision - } - else - { - //use btMultiBodyDynamicsWorld for Featherstone btMultiBody support - m_dynamicsWorld = new btMultiBodyDynamicsWorld(m_dispatcher, - m_broadphase, (btMultiBodyConstraintSolver*)m_solver, - m_collisionConfiguration); - } - - changeERPCFM(); // set appropriate ERP/CFM values according to the string and damper properties of the constraint - - if (useSplitImpulse) - { // If you experience strong repulsion forces in your constraints, it might help to enable the split impulse feature - m_dynamicsWorld->getSolverInfo().m_splitImpulse = 1; //enable split impulse feature - // m_dynamicsWorld->getSolverInfo().m_splitImpulsePenetrationThreshold = - // -0.02; - // m_dynamicsWorld->getSolverInfo().m_erp2 = BulletUtils::getERP( - // fixedPhysicsStepSizeSec, 10, 1); - // m_dynamicsWorld->getSolverInfo().m_splitImpulseTurnErp = - // BulletUtils::getERP(fixedPhysicsStepSizeSec, 10, 1); - // b3Printf("Using split impulse feature with ERP/TurnERP: (%f,%f)", - // m_dynamicsWorld->getSolverInfo().m_erp2, - // m_dynamicsWorld->getSolverInfo().m_splitImpulseTurnErp); - } - - m_dynamicsWorld->getSolverInfo().m_numIterations = gSolverIterations; // set the number of solver iterations for iteration based solvers - - m_dynamicsWorld->setGravity(btVector3(0, -9.81f, 0)); // set gravity to -9.81 - } - - btScalar calculatePerformedSpeedup() - { // calculate performed speedup - // we calculate the performed speed up - btScalar speedUp = ((double)performedTime * 1000.0) / ((double)(mLoopTimer.getTimeMilliseconds() - performanceTimestamp)); - // b3Printf("Avg Effective speedup: %f",speedUp); - performedTime = 0; - performanceTimestamp = mLoopTimer.getTimeMilliseconds(); - return speedUp; - } - - void timeWarpSimulation(float deltaTime) // Override this - { - } - - void stepSimulation(float deltaTime) - { // customly step the simulation - do - { - // // settings - if (mPhysicsStepsPerSecondUpdated) - { - changePhysicsStepsPerSecond(gPhysicsStepsPerSecond); - mPhysicsStepsPerSecondUpdated = false; - } - - if (mFramesPerSecondUpdated) - { - changeFPS(gFramesPerSecond); - mFramesPerSecondUpdated = false; - } - - if (gChangeErpCfm) - { - changeERPCFM(); - gChangeErpCfm = false; - } - - if (mSolverIterationsUpdated) - { - changeSolverIterations(gSolverIterations); - mSolverIterationsUpdated = false; - } - - // structure according to the canonical game loop - // http://www.bulletphysics.org/mediawiki-1.5.8/index.php/Canonical_Game_Loop - - //############## - // breaking conditions - if the loop should stop, then check it here - - //############# - // model update - here you perform updates of your model, be it the physics model, the game or simulation state or anything not related to graphics and input - - timeWarpSimulation(deltaTime); - if (mLoopTimer.getTimeSeconds() - speedUpPrintTimeStamp > 1) - { - // on reset, we calculate the performed speed up - //double speedUp = ((double)performedTime*1000.0)/((double)(mLoopTimer.getTimeMilliseconds()-performanceTimestamp)); - // b3Printf("Avg Effective speedup: %f",speedUp); - performedTime = 0; - performanceTimestamp = mLoopTimer.getTimeMilliseconds(); - speedUpPrintTimeStamp = mLoopTimer.getTimeSeconds(); - } - - // update timers - mThisModelIteration = mLoopTimer.getTimeMilliseconds(); - mFrameTime = mThisModelIteration - mPreviousModelIteration; /**!< Calculate the frame time (in Milliseconds) */ - mPreviousModelIteration = mThisModelIteration; - - // b3Printf("Current Frame time: % u", mFrameTime); - - mApplicationRuntime = mThisModelIteration - mApplicationStart; /**!< Update main frame timer (in Milliseconds) */ - - mModelStart = mLoopTimer.getTimeMilliseconds(); /**!< Begin with the model update (in Milliseconds)*/ - mLastGraphicsTick = mModelStart - mGraphicsStart; /**!< Update graphics timer (in Milliseconds) */ - - if (gMaximumSpeed /** If maximum speed is enabled*/) - { - performMaxStep(); - } - else - { /**!< This mode tries to progress as much time as it is expected from the game loop*/ - performSpeedStep(); - } - - mInputStart = mLoopTimer.getTimeMilliseconds(); /**!< Start the input update */ - mLastModelTick = mInputStart - mModelStart; /**!< Calculate the time the model update took */ - - //############# - // Input update - Game Clock part of the loop - /** This runs once every gApplicationTick milliseconds on average */ - mInputDt = mThisModelIteration - mInputClock; - if (mInputDt >= gApplicationTick) - { - mInputClock = mThisModelIteration; - // mInputHandler.injectInput(); /**!< Inject input into handlers */ - // mInputHandler.update(mInputClock); /**!< update elements that work on the current input state */ - } - - mGraphicsStart = mLoopTimer.getTimeMilliseconds(); /**!< Start the graphics update */ - mLastInputTick = mGraphicsStart - mInputStart; /**!< Calculate the time the input injection took */ - - //############# - // Graphics update - Here you perform the representation of your model, meaning graphics rendering according to what your game or simulation model describes - // In the example browser, there is a separate method called renderScene() for this - - // Uncomment this for some detailed output about the application ticks - // b3Printf( - // "Physics time: %u milliseconds / Graphics time: %u milliseconds / Input time: %u milliseconds / Total time passed: %u milliseconds", - // mLastModelTick, mLastGraphicsTick, mLastInputTick, mApplicationRuntime); - - } while (mLoopTimer.getTimeMilliseconds() - fpsTimeStamp < fpsStep); // escape the loop if it is time to render - // Unfortunately, the input is not included in the loop, therefore the input update frequency is equal to the fps - - fpsTimeStamp = mLoopTimer.getTimeMilliseconds(); - } - - virtual bool keyboardCallback(int key, int state) - { - switch (key) - { - case '1': - { - gSimulationSpeed = SimulationSpeeds::QUARTER_SPEED; - gMaximumSpeed = false; - return true; - } - case '2': - { - gSimulationSpeed = SimulationSpeeds::HALF_SPEED; - gMaximumSpeed = false; - return true; - } - case '3': - { - gSimulationSpeed = SimulationSpeeds::NORMAL_SPEED; - gMaximumSpeed = false; - return true; - } - case '4': - { - gSimulationSpeed = SimulationSpeeds::DOUBLE_SPEED; - gMaximumSpeed = false; - return true; - } - case '5': - { - gSimulationSpeed = SimulationSpeeds::QUADRUPLE_SPEED; - gMaximumSpeed = false; - return true; - } - case '6': - { - gSimulationSpeed = SimulationSpeeds::DECUPLE_SPEED; - gMaximumSpeed = false; - return true; - } - case '7': - { - gSimulationSpeed = SimulationSpeeds::CENTUPLE_SPEED; - gMaximumSpeed = false; - return true; - } - case '8': - { - gSimulationSpeed = SimulationSpeeds::QUINCENTUPLE_SPEED; - gMaximumSpeed = false; - return true; - } - case '9': - { - gSimulationSpeed = SimulationSpeeds::MILLITUPLE_SPEED; - gMaximumSpeed = false; - return true; - } - case '0': - { - gSimulationSpeed = SimulationSpeeds::MAX_SPEED; - gMaximumSpeed = true; - return true; - } - } - return CommonRigidBodyBase::keyboardCallback(key, state); - } - - void changePhysicsStepsPerSecond(float physicsStepsPerSecond) - { // change the simulation accuracy - if (m_dynamicsWorld && physicsStepsPerSecond) - { - fixedPhysicsStepSizeSec = 1.0f / physicsStepsPerSecond; - fixedPhysicsStepSizeMilli = 1000.0f / physicsStepsPerSecond; - - changeERPCFM(); - } - } - - void changeERPCFM() - { // Change ERP/CFM appropriately to the timestep and the ERP/CFM parameters above - if (m_dynamicsWorld) - { - m_dynamicsWorld->getSolverInfo().m_erp = b3ERPCFMHelper::getERP( // set the error reduction parameter - fixedPhysicsStepSizeSec, // step size per second - gERPSpringK, // k of a spring in the equation F = k * x (x:position) - gERPDamperC); // k of a damper in the equation F = k * v (v:velocity) - - m_dynamicsWorld->getSolverInfo().m_globalCfm = b3ERPCFMHelper::getCFM( // set the constraint force mixing according to the time step - gCFMSingularityAvoidance, // singularity avoidance (if you experience unsolvable constraints, increase this value - fixedPhysicsStepSizeSec, // steps size per second - gCFMSpringK, // k of a spring in the equation F = k * x (x:position) - gCFMDamperC); // k of a damper in the equation F = k * v (v:velocity) - - // b3Printf("Bullet DynamicsWorld ERP: %f", - // m_dynamicsWorld->getSolverInfo().m_erp); - - // b3Printf("Bullet DynamicsWorld CFM: %f", - // m_dynamicsWorld->getSolverInfo().m_globalCfm); - } - } - - void changeSolverIterations(int iterations) - { // change the number of iterations - m_dynamicsWorld->getSolverInfo().m_numIterations = iterations; - } - - void changeFPS(float framesPerSecond) - { // change the frames per second - fpsStep = 1000.0f / gFramesPerSecond; - } - - void performTrueSteps(btScalar timeStep) - { // physics stepping without interpolated substeps - int subSteps = floor((timeStep / fixedPhysicsStepSizeSec) + 0.5); /**!< Calculate the number of full normal time steps we can take */ - - for (int i = 0; i < subSteps; i++) - { /**!< Perform the number of substeps to reach the timestep*/ - if (timeStep && m_dynamicsWorld) - { - // since we want to perform all proper steps, we perform no interpolated substeps - int subSteps = 1; - - m_dynamicsWorld->stepSimulation(btScalar(timeStep), - btScalar(subSteps), btScalar(fixedPhysicsStepSizeSec)); - } - } - } - - void performInterpolatedSteps(btScalar timeStep) - { // physics stepping with interpolated substeps - int subSteps = 1 + floor((timeStep / fixedPhysicsStepSizeSec) + 0.5); /**!< Calculate the number of full normal time steps we can take, plus 1 for safety of not losing time */ - if (timeStep && m_dynamicsWorld) - { - m_dynamicsWorld->stepSimulation(btScalar(timeStep), btScalar(subSteps), - btScalar(fixedPhysicsStepSizeSec)); /**!< Perform the number of substeps to reach the timestep*/ - } - } - - void performMaxStep() - { // perform as many steps as possible - if (gApplicationTick >= mLastGraphicsTick + mLastInputTick) - { // if the remaining time for graphics is going to be positive - mPhysicsTick = gApplicationTick /**!< calculate the remaining time for physics (in Milliseconds) */ - - mLastGraphicsTick - mLastInputTick; - } - else - { - mPhysicsTick = 0; // no time for physics left / The internal application step is too high - } - - // b3Printf("Application tick: %u",gApplicationTick); - // b3Printf("Graphics tick: %u",mLastGraphicsTick); - // b3Printf("Input tick: %u",mLastInputTick); - // b3Printf("Physics tick: %u",mPhysicsTick); - - if (mPhysicsTick > 0) - { // with positive physics tick we perform as many update steps until the time for it is used up - - mPhysicsStepStart = mLoopTimer.getTimeMilliseconds(); /**!< The physics updates start (in Milliseconds)*/ - mPhysicsStepEnd = mPhysicsStepStart; - - while (mPhysicsTick > mPhysicsStepEnd - mPhysicsStepStart) - { /**!< Update the physics until we run out of time (in Milliseconds) */ - // b3Printf("Physics passed: %u", mPhysicsStepEnd - mPhysicsStepStart); - double timeStep = fixedPhysicsStepSizeSec; /**!< update the world (in Seconds) */ - - if (gInterpolate) - { - performInterpolatedSteps(timeStep); - } - else - { - performTrueSteps(timeStep); - } - performedTime += timeStep; - mPhysicsStepEnd = mLoopTimer.getTimeMilliseconds(); /**!< Update the last physics step end to stop updating in time (in Milliseconds) */ - } - } - } - - void performSpeedStep() - { // force-perform the number of steps needed to achieve a certain speed (safe to too high speeds, meaning the application will lose time, not the physics) - if (mFrameTime > gApplicationTick) - { /** cap frametime to make the application lose time, not the physics (in Milliseconds) */ - mFrameTime = gApplicationTick; // This prevents the physics time accumulator to sum up too much time - } // The simulation therefore gets slower, but still performs all requested physics steps - - mModelAccumulator += mFrameTime; /**!< Accumulate the time the physics simulation has to perform in order to stay in real-time (in Milliseconds) */ - // b3Printf("Model time accumulator: %u", mModelAccumulator); - - int steps = floor(mModelAccumulator / fixedPhysicsStepSizeMilli); /**!< Calculate the number of time steps we can take */ - // b3Printf("Next steps: %i", steps); - - if (steps > 0) - { /**!< Update if we can take at least one step */ - - double timeStep = gSimulationSpeed * steps * fixedPhysicsStepSizeSec; /**!< update the universe (in Seconds) */ - - if (gInterpolate) - { - performInterpolatedSteps(timeStep); // perform interpolated steps - } - else - { - performTrueSteps(timeStep); // perform full steps - } - performedTime += timeStep; // sum up the performed time for measuring the speed up - mModelAccumulator -= steps * fixedPhysicsStepSizeMilli; /**!< Remove the time performed by the physics simulation from the accumulator, the remaining time carries over to the next cycle (in Milliseconds) */ - } - } - - void renderScene() - { // render the scene - if (!gIsHeadless) - { // while the simulation is not running headlessly, render to screen - CommonRigidBodyBase::renderScene(); - - if (m_dynamicsWorld->getDebugDrawer()) - { - debugDraw(m_dynamicsWorld->getDebugDrawer()->getDebugMode()); - } - } - mIsHeadless = gIsHeadless; - } - void resetCamera() - { // reset the camera to its original position - float dist = 41; - float pitch = 52; - float yaw = 35; - float targetPos[3] = {0, 0.46, 0}; - m_guiHelper->resetCamera(dist, pitch, yaw, targetPos[0], targetPos[1], - targetPos[2]); - } - - // loop timing components ################### - //# loop timestamps - btClock mLoopTimer; /**!< The loop timer to time the loop correctly */ - unsigned long int mApplicationStart; /**!< The time the application was started (absolute, in Milliseconds) */ - unsigned long int mPreviousModelIteration; /**!< The previous model iteration timestamp (absolute, in Milliseconds) */ - unsigned long int mThisModelIteration; /**!< This model iteration timestamp (absolute, in Milliseconds) */ - - //# loop durations - long int mModelAccumulator; /**!< The time to forward the model in this loop iteration (relative, in Milliseconds) */ - unsigned long int mFrameTime; /**!< The time to render a frame (relative, in Milliseconds) */ - unsigned long int mApplicationRuntime; /**!< The total application runtime (relative, in Milliseconds) */ - - long int mInputDt; /**!< The time difference of input that has to be fed in */ - unsigned long int mInputClock; - - long int mLastGraphicsTick; /*!< The time it took the graphics rendering last time (relative, in Milliseconds) */ - unsigned long int mGraphicsStart; - - long int mLastInputTick; /**!< The time it took the input to process last time (relative, in Milliseconds) */ - unsigned long int mInputStart; - - long int mLastModelTick; /**!< The time it took the model to update last time - This includes the bullet physics update */ - unsigned long int mModelStart; /**!< The timestamp the model started updating last (absolute, in Milliseconds)*/ - - long int mPhysicsTick; /**!< The time remaining in the loop to update the physics (relative, in Milliseconds)*/ - unsigned long int mPhysicsStepStart; /**!< The physics start timestamp (absolute, in Milliseconds) */ - unsigned long int mPhysicsStepEnd; /**!< The last physics step end (absolute, in Milliseconds) */ - - // to measure the performance of the demo - double performedTime; - unsigned long int performanceTimestamp; - - unsigned long int speedUpPrintTimeStamp; - - unsigned long int fpsTimeStamp; /**!< FPS timing variables */ - double fpsStep; - - //store old values - bool mPhysicsStepsPerSecondUpdated; - bool mFramesPerSecondUpdated; - bool mSolverIterationsUpdated; - bool mIsHeadless; -}; - -#endif //NN3D_WALKERS_TIME_WARP_BASE_H diff --git a/engine/inc/bullet/ExampleBrowser/CollisionShape2TriangleMesh.h b/engine/inc/bullet/ExampleBrowser/CollisionShape2TriangleMesh.h deleted file mode 100644 index b4aafbb0..00000000 --- a/engine/inc/bullet/ExampleBrowser/CollisionShape2TriangleMesh.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef COLLISION_SHAPE_2_GRAPHICS_H -#define COLLISION_SHAPE_2_GRAPHICS_H - -#include "LinearMath/btAlignedObjectArray.h" -#include "LinearMath/btTransform.h" -class btCollisionShape; - -void CollisionShape2TriangleMesh(btCollisionShape* collisionShape, const btTransform& parentTransform, btAlignedObjectArray& vertexPositions, btAlignedObjectArray& vertexNormals, btAlignedObjectArray& indicesOut); - -#endif //COLLISION_SHAPE_2_GRAPHICS_H diff --git a/engine/inc/bullet/ExampleBrowser/EmptyBrowser.h b/engine/inc/bullet/ExampleBrowser/EmptyBrowser.h deleted file mode 100644 index b3dd3a80..00000000 --- a/engine/inc/bullet/ExampleBrowser/EmptyBrowser.h +++ /dev/null @@ -1,45 +0,0 @@ -#ifndef EMPTY_BROWSER -#define EMPTY_BROWSER - -#include "ExampleBrowserInterface.h" -#include "EmptyExample.h" - -class EmptyBrowser : public ExampleBrowserInterface -{ -public: - EmptyExample m_emptyExample; - - virtual CommonExampleInterface* getCurrentExample() - { - return &m_emptyExample; - } - - EmptyBrowser(class ExampleEntries* examples) - { - } - - virtual bool init(int /*argc*/, char* argv[]) - { - return true; - } - - virtual void update(float deltaTime) - { - m_emptyExample.stepSimulation(deltaTime); - } - - virtual void updateGraphics() - { - } - - virtual bool requestedExit() - { - return false; - } - - virtual void setSharedMemoryInterface(class SharedMemoryInterface* sharedMem) - { - } -}; - -#endif //EMPTY_BROWSER diff --git a/engine/inc/bullet/ExampleBrowser/EmptyExample.h b/engine/inc/bullet/ExampleBrowser/EmptyExample.h deleted file mode 100644 index 95ba27ff..00000000 --- a/engine/inc/bullet/ExampleBrowser/EmptyExample.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef EMPTY_EXAMPLE_H -#define EMPTY_EXAMPLE_H - -#include "../CommonInterfaces/CommonExampleInterface.h" - -class EmptyExample : public CommonExampleInterface -{ -public: - EmptyExample() {} - virtual ~EmptyExample() {} - - static CommonExampleInterface* CreateFunc(struct CommonExampleOptions& /* unusedOptions*/) - { - return new EmptyExample; - } - - virtual void initPhysics() {} - virtual void exitPhysics() {} - virtual void stepSimulation(float deltaTime) {} - virtual void renderScene() {} - virtual void physicsDebugDraw(int debugFlags) {} - virtual bool mouseMoveCallback(float x, float y) { return false; } - virtual bool mouseButtonCallback(int button, int state, float x, float y) { return false; } - virtual bool keyboardCallback(int key, int state) { return false; } -}; - -#endif //EMPTY_EXAMPLE_H diff --git a/engine/inc/bullet/ExampleBrowser/ExampleBrowserInterface.h b/engine/inc/bullet/ExampleBrowser/ExampleBrowserInterface.h deleted file mode 100644 index f4867987..00000000 --- a/engine/inc/bullet/ExampleBrowser/ExampleBrowserInterface.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef EXAMPLE_BROWSER_GUI_H -#define EXAMPLE_BROWSER_GUI_H - -#include "../CommonInterfaces/CommonExampleInterface.h" - -class ExampleBrowserInterface -{ -public: - virtual ~ExampleBrowserInterface() {} - - virtual CommonExampleInterface* getCurrentExample() = 0; - - virtual bool init(int argc, char* argv[]) = 0; - - virtual void update(float deltaTime) = 0; - - virtual void updateGraphics() = 0; - - virtual bool requestedExit() = 0; - - virtual void setSharedMemoryInterface(class SharedMemoryInterface* sharedMem) = 0; -}; - -#endif //EXAMPLE_BROWSER_GUI_H \ No newline at end of file diff --git a/engine/inc/bullet/ExampleBrowser/ExampleEntries.h b/engine/inc/bullet/ExampleBrowser/ExampleEntries.h deleted file mode 100644 index d4b4119c..00000000 --- a/engine/inc/bullet/ExampleBrowser/ExampleEntries.h +++ /dev/null @@ -1,32 +0,0 @@ - -#ifndef EXAMPLE_ENTRIES_H -#define EXAMPLE_ENTRIES_H - -#include "../CommonInterfaces/CommonExampleInterface.h" - -class ExampleEntriesAll : public ExampleEntries -{ - struct ExampleEntriesInternalData* m_data; - -public: - ExampleEntriesAll(); - virtual ~ExampleEntriesAll(); - - static void registerExampleEntry(int menuLevel, const char* name, const char* description, CommonExampleInterface::CreateFunc* createFunc, int option = 0); - - virtual void initExampleEntries(); - - virtual void initOpenCLExampleEntries(); - - virtual int getNumRegisteredExamples(); - - virtual CommonExampleInterface::CreateFunc* getExampleCreateFunc(int index); - - virtual const char* getExampleName(int index); - - virtual const char* getExampleDescription(int index); - - virtual int getExampleOption(int index); -}; - -#endif //EXAMPLE_ENTRIES_H diff --git a/engine/inc/bullet/ExampleBrowser/GL_ShapeDrawer.h b/engine/inc/bullet/ExampleBrowser/GL_ShapeDrawer.h deleted file mode 100644 index 9eb13bfd..00000000 --- a/engine/inc/bullet/ExampleBrowser/GL_ShapeDrawer.h +++ /dev/null @@ -1,81 +0,0 @@ -/* -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; -class btDiscreteDynamicsWorld; - -#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*); - - virtual void drawSceneInternal(const btDiscreteDynamicsWorld* world, int pass, int cameraUpAxis); - -public: - GL_ShapeDrawer(); - - virtual ~GL_ShapeDrawer(); - - virtual void drawScene(const btDiscreteDynamicsWorld* world, bool useShadows, int cameraUpAxis); - - ///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; - } - - void drawSphere(btScalar r, int lats, int longs); - static void drawCoordSystem(); -}; - -void OGL_displaylist_register_shape(btCollisionShape* shape); -void OGL_displaylist_clean(); - -#endif //GL_SHAPE_DRAWER_H diff --git a/engine/inc/bullet/ExampleBrowser/GwenGUISupport/GraphingTexture.h b/engine/inc/bullet/ExampleBrowser/GwenGUISupport/GraphingTexture.h deleted file mode 100644 index 27d52e71..00000000 --- a/engine/inc/bullet/ExampleBrowser/GwenGUISupport/GraphingTexture.h +++ /dev/null @@ -1,45 +0,0 @@ -#ifndef GRAPHING_TEXTURE_H -#define GRAPHING_TEXTURE_H -#include "LinearMath/btAlignedObjectArray.h" - -struct GraphingTexture -{ - int m_textureId; - //assume rgba (8 bit per component, total of 32bit per pixel, for m_width*m_height pixels) - btAlignedObjectArray m_imageData; - int m_width; - int m_height; - - GraphingTexture(); - virtual ~GraphingTexture(); - - bool create(int texWidth, int texHeight); - void destroy(); - - void setPixel(int x, int y, unsigned char red, unsigned char green, unsigned char blue, unsigned char alpha) - { - if (y >= 0 && y < m_height && x >= 0 && x < m_width) - { - m_imageData[x * 4 + y * 4 * m_width + 0] = red; - m_imageData[x * 4 + y * 4 * m_width + 1] = green; - m_imageData[x * 4 + y * 4 * m_width + 2] = blue; - m_imageData[x * 4 + y * 4 * m_width + 3] = alpha; - } - } - - void getPixel(int x, int y, unsigned char& red, unsigned char& green, unsigned char& blue, unsigned char& alpha) - { - red = m_imageData[x * 4 + y * 4 * m_width + 0]; - green = m_imageData[x * 4 + y * 4 * m_width + 1]; - blue = m_imageData[x * 4 + y * 4 * m_width + 2]; - alpha = m_imageData[x * 4 + y * 4 * m_width + 3]; - } - void uploadImageData(); - - int getTextureId() - { - return m_textureId; - } -}; - -#endif //GRAPHING_TEXTURE_H diff --git a/engine/inc/bullet/ExampleBrowser/GwenGUISupport/GwenParameterInterface.h b/engine/inc/bullet/ExampleBrowser/GwenGUISupport/GwenParameterInterface.h deleted file mode 100644 index 819090b4..00000000 --- a/engine/inc/bullet/ExampleBrowser/GwenGUISupport/GwenParameterInterface.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef GWEN_PARAMETER_INTERFACE_H -#define GWEN_PARAMETER_INTERFACE_H - -#include "../CommonInterfaces/CommonParameterInterface.h" - -struct GwenParameterInterface : public CommonParameterInterface -{ - struct GwenInternalData* m_gwenInternalData; - - struct GwenParameters* m_paramInternalData; - - GwenParameterInterface(struct GwenInternalData* gwenInternalData); - virtual ~GwenParameterInterface(); - virtual void registerSliderFloatParameter(SliderParams& params); - virtual void registerButtonParameter(ButtonParams& params); - virtual void registerComboBox(ComboBoxParams& params); - - virtual void setSliderValue(int sliderIndex, double sliderValue); - virtual void syncParameters(); - virtual void removeAllParameters(); -}; - -#endif //GWEN_PARAMETER_INTERFACE_H diff --git a/engine/inc/bullet/ExampleBrowser/GwenGUISupport/GwenProfileWindow.h b/engine/inc/bullet/ExampleBrowser/GwenGUISupport/GwenProfileWindow.h deleted file mode 100644 index fbe69e81..00000000 --- a/engine/inc/bullet/ExampleBrowser/GwenGUISupport/GwenProfileWindow.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef GWEN_PROFILE_WINDOW_H -#define GWEN_PROFILE_WINDOW_H - -class MyProfileWindow* setupProfileWindow(struct GwenInternalData* data); -void processProfileData(MyProfileWindow* window, bool idle); -void profileWindowSetVisible(MyProfileWindow* window, bool visible); -bool isProfileWindowVisible(MyProfileWindow* window); - -void destroyProfileWindow(MyProfileWindow* window); - -#endif //GWEN_PROFILE_WINDOW_H diff --git a/engine/inc/bullet/ExampleBrowser/GwenGUISupport/GwenTextureWindow.h b/engine/inc/bullet/ExampleBrowser/GwenGUISupport/GwenTextureWindow.h deleted file mode 100644 index 85866b1d..00000000 --- a/engine/inc/bullet/ExampleBrowser/GwenGUISupport/GwenTextureWindow.h +++ /dev/null @@ -1,31 +0,0 @@ - - -#ifndef GWEN_TEXTURE_WINDOW_H -#define GWEN_TEXTURE_WINDOW_H - -struct MyGraphInput -{ - struct GwenInternalData* m_data; - int m_xPos; - int m_yPos; - int m_width; - int m_height; - int m_borderWidth; - const char* m_name; - const char* m_texName; - MyGraphInput(struct GwenInternalData* data) - : m_data(data), - m_xPos(0), - m_yPos(0), - m_width(400), - m_height(400), - m_borderWidth(0), - m_name("GraphWindow"), - m_texName(0) - { - } -}; -class MyGraphWindow* setupTextureWindow(const MyGraphInput& input); -void destroyTextureWindow(MyGraphWindow* window); - -#endif //GWEN_TEXTURE_WINDOW_H diff --git a/engine/inc/bullet/ExampleBrowser/GwenGUISupport/gwenInternalData.h b/engine/inc/bullet/ExampleBrowser/GwenGUISupport/gwenInternalData.h deleted file mode 100644 index 6ce62fc1..00000000 --- a/engine/inc/bullet/ExampleBrowser/GwenGUISupport/gwenInternalData.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef GWEN_INTERNAL_DATA_H -#define GWEN_INTERNAL_DATA_H - -#include "../OpenGLWindow/GwenOpenGL3CoreRenderer.h" -#include "../OpenGLWindow/GLPrimitiveRenderer.h" -#include "Gwen/Platform.h" -#include "Gwen/Controls/TreeControl.h" -#include "Gwen/Controls/RadioButtonController.h" -#include "Gwen/Controls/VerticalSlider.h" -#include "Gwen/Controls/HorizontalSlider.h" -#include "Gwen/Controls/GroupBox.h" -#include "Gwen/Controls/CheckBox.h" -#include "Gwen/Controls/StatusBar.h" -#include "Gwen/Controls/Button.h" -#include "Gwen/Controls/ComboBox.h" -#include "Gwen/Controls/MenuStrip.h" -#include "Gwen/Controls/Slider.h" -#include "Gwen/Controls/Property/Text.h" -#include "Gwen/Controls/SplitterBar.h" -#include "Bullet3Common/b3AlignedObjectArray.h" -#include "Gwen/Gwen.h" -#include "Gwen/Align.h" -#include "Gwen/Utility.h" -#include "Gwen/Controls/WindowControl.h" -#include "Gwen/Controls/TabControl.h" -#include "Gwen/Controls/ListBox.h" -#include "Gwen/Skins/Simple.h" -//#include "Gwen/Skins/TexturedBase.h" -#include "gwenUserInterface.h" - -struct GwenInternalData -{ - //struct sth_stash; - //class GwenOpenGL3CoreRenderer* pRenderer; - Gwen::Renderer::Base* pRenderer; - Gwen::Skin::Simple skin; - Gwen::Controls::Canvas* pCanvas; - //GLPrimitiveRenderer* m_primRenderer; - Gwen::Controls::TabButton* m_demoPage; - Gwen::Controls::TabButton* m_explorerPage; - Gwen::Controls::TreeControl* m_explorerTreeCtrl; - Gwen::Controls::MenuItem* m_viewMenu; - class MyMenuItems* m_menuItems; - Gwen::Controls::ListBox* m_TextOutput; - Gwen::Controls::Label* m_exampleInfoGroupBox; - Gwen::Controls::ListBox* m_exampleInfoTextOutput; - struct MyTestMenuBar* m_menubar; - Gwen::Controls::StatusBar* m_bar; - Gwen::Controls::ScrollControl* m_windowRight; - Gwen::Controls::TabControl* m_tab; - - int m_curYposition; - - Gwen::Controls::Label* m_rightStatusBar; - Gwen::Controls::Label* m_leftStatusBar; - b3AlignedObjectArray m_handlers; - b3ToggleButtonCallback m_toggleButtonCallback; - b3ComboBoxCallback m_comboBoxCallback; -}; - -#endif //GWEN_INTERNAL_DATA_H diff --git a/engine/inc/bullet/ExampleBrowser/GwenGUISupport/gwenUserInterface.h b/engine/inc/bullet/ExampleBrowser/GwenGUISupport/gwenUserInterface.h deleted file mode 100644 index 5f246180..00000000 --- a/engine/inc/bullet/ExampleBrowser/GwenGUISupport/gwenUserInterface.h +++ /dev/null @@ -1,63 +0,0 @@ -#ifndef _GWEN_USER_INTERFACE_H -#define _GWEN_USER_INTERFACE_H - -struct GwenInternalData; - -typedef void (*b3ComboBoxCallback)(int combobox, const char* item); -typedef void (*b3ToggleButtonCallback)(int button, int state); -typedef void (*b3FileOpenCallback)(); -typedef void (*b3QuitCallback)(); - -namespace Gwen -{ -namespace Renderer -{ -class Base; -}; -}; // namespace Gwen -class GwenUserInterface -{ - GwenInternalData* m_data; - -public: - GwenUserInterface(); - - virtual ~GwenUserInterface(); - - void init(int width, int height, Gwen::Renderer::Base* gwenRenderer, float retinaScale); - void exit(); - void setFocus(); - void forceUpdateScrollBars(); - - void draw(int width, int height); - - void resize(int width, int height); - - bool mouseMoveCallback(float x, float y); - bool mouseButtonCallback(int button, int state, float x, float y); - bool keyboardCallback(int key, int state); - - void setToggleButtonCallback(b3ToggleButtonCallback callback); - b3ToggleButtonCallback getToggleButtonCallback(); - - void registerToggleButton2(int buttonId, const char* name); - - void setComboBoxCallback(b3ComboBoxCallback callback); - b3ComboBoxCallback getComboBoxCallback(); - void registerComboBox2(int buttonId, int numItems, const char** items, int startItem = 0); - - void setStatusBarMessage(const char* message, bool isLeft = true); - - void textOutput(const char* msg); - void setExampleDescription(const char* msg); - - void registerFileOpenCallback(b3FileOpenCallback callback); - void registerQuitCallback(b3QuitCallback callback); - - GwenInternalData* getInternalData() - { - return m_data; - } -}; - -#endif //_GWEN_USER_INTERFACE_H diff --git a/engine/inc/bullet/ExampleBrowser/InProcessExampleBrowser.h b/engine/inc/bullet/ExampleBrowser/InProcessExampleBrowser.h deleted file mode 100644 index f231091e..00000000 --- a/engine/inc/bullet/ExampleBrowser/InProcessExampleBrowser.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef IN_PROCESS_EXAMPLE_BROWSER_H -#define IN_PROCESS_EXAMPLE_BROWSER_H - -struct btInProcessExampleBrowserInternalData; - -btInProcessExampleBrowserInternalData* btCreateInProcessExampleBrowser(int argc, char** argv2, bool useInProcessMemory); - -bool btIsExampleBrowserTerminated(btInProcessExampleBrowserInternalData* data); - -void btShutDownExampleBrowser(btInProcessExampleBrowserInternalData* data); - -class SharedMemoryInterface* btGetSharedMemoryInterface(btInProcessExampleBrowserInternalData* data); - -/////////////////////// - -struct btInProcessExampleBrowserMainThreadInternalData; - -btInProcessExampleBrowserMainThreadInternalData* btCreateInProcessExampleBrowserMainThread(int argc, char** argv, bool useInProcessMemory); - -bool btIsExampleBrowserMainThreadTerminated(btInProcessExampleBrowserMainThreadInternalData* data); - -void btUpdateInProcessExampleBrowserMainThread(btInProcessExampleBrowserMainThreadInternalData* data); - -void btShutDownExampleBrowserMainThread(btInProcessExampleBrowserMainThreadInternalData* data); - -class SharedMemoryInterface* btGetSharedMemoryInterfaceMainThread(btInProcessExampleBrowserMainThreadInternalData* data); - -////////////////////// - -#endif //IN_PROCESS_EXAMPLE_BROWSER_H diff --git a/engine/inc/bullet/ExampleBrowser/OpenGLExampleBrowser.h b/engine/inc/bullet/ExampleBrowser/OpenGLExampleBrowser.h deleted file mode 100644 index df26f9e4..00000000 --- a/engine/inc/bullet/ExampleBrowser/OpenGLExampleBrowser.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef OPENGL_BROWSER_GUI_H -#define OPENGL_BROWSER_GUI_H - -#include "ExampleBrowserInterface.h" - -class OpenGLExampleBrowser : public ExampleBrowserInterface -{ - struct OpenGLExampleBrowserInternalData* m_internalData; - -public: - OpenGLExampleBrowser(class ExampleEntries* examples); - virtual ~OpenGLExampleBrowser(); - - virtual CommonExampleInterface* getCurrentExample(); - - virtual bool init(int argc, char* argv[]); - - virtual void update(float deltaTime); - - virtual void updateGraphics(); - - virtual bool requestedExit(); - - virtual void setSharedMemoryInterface(class SharedMemoryInterface* sharedMem); - - static void registerFileImporter(const char* extension, CommonExampleInterface::CreateFunc* createFunc); -}; - -#endif //OPENGL_BROWSER_GUI_H diff --git a/engine/inc/bullet/ExampleBrowser/OpenGLGuiHelper.h b/engine/inc/bullet/ExampleBrowser/OpenGLGuiHelper.h deleted file mode 100644 index abeaa9af..00000000 --- a/engine/inc/bullet/ExampleBrowser/OpenGLGuiHelper.h +++ /dev/null @@ -1,113 +0,0 @@ -#ifndef OPENGL_GUI_HELPER_H -#define OPENGL_GUI_HELPER_H -#include "../CommonInterfaces/CommonGUIHelperInterface.h" - -class btCollisionShape; -class btTransform; -#include "LinearMath/btAlignedObjectArray.h" -#include "../OpenGLWindow/GLInstanceGraphicsShape.h" - -struct OpenGLGuiHelper : public GUIHelperInterface -{ - struct OpenGLGuiHelperInternalData* m_data; - - OpenGLGuiHelper(struct CommonGraphicsApp* glApp, bool useOpenGL2); - - virtual ~OpenGLGuiHelper(); - - virtual struct CommonRenderInterface* getRenderInterface(); - virtual const struct CommonRenderInterface* getRenderInterface() const; - - virtual void createRigidBodyGraphicsObject(btRigidBody* body, const btVector3& color); - - virtual void createCollisionObjectGraphicsObject(btCollisionObject* body, const btVector3& color); - - virtual int registerTexture(const unsigned char* texels, int width, int height); - virtual int registerGraphicsShape(const float* vertices, int numvertices, const int* indices, int numIndices, int primitiveType, int textureId); - virtual int registerGraphicsInstance(int shapeIndex, const float* position, const float* quaternion, const float* color, const float* scaling); - virtual void removeAllGraphicsInstances(); - virtual void removeGraphicsInstance(int graphicsUid); - virtual void changeInstanceFlags(int instanceUid, int flags); - virtual void changeRGBAColor(int instanceUid, const double rgbaColor[4]); - virtual void changeScaling(int instanceUid, const double scaling[3]); - virtual void changeSpecularColor(int instanceUid, const double specularColor[3]); - virtual void changeTexture(int textureUniqueId, const unsigned char* rgbTexels, int width, int height); - virtual void removeTexture(int textureUid); - virtual int getShapeIndexFromInstance(int instanceUid); - virtual void replaceTexture(int shapeIndex, int textureUid); - virtual void updateShape(int shapeIndex, float* vertices, int numVertices); - - virtual void createCollisionShapeGraphicsObject(btCollisionShape* collisionShape); - - virtual void syncPhysicsToGraphics(const btDiscreteDynamicsWorld* rbWorld); - - virtual void render(const btDiscreteDynamicsWorld* rbWorld); - - virtual void createPhysicsDebugDrawer(btDiscreteDynamicsWorld* rbWorld); - - virtual struct Common2dCanvasInterface* get2dCanvasInterface(); - - virtual CommonParameterInterface* getParameterInterface(); - - virtual struct CommonGraphicsApp* getAppInterface(); - - virtual void setUpAxis(int axis); - - virtual void resetCamera(float camDist, float yaw, float pitch, float camPosX, float camPosY, float camPosZ); - virtual bool getCameraInfo(int* width, int* height, float viewMatrix[16], float projectionMatrix[16], float camUp[3], float camForward[3], float hor[3], float vert[3], float* yaw, float* pitch, float* camDist, float cameraTarget[3]) const; - - virtual void copyCameraImageData(const float viewMatrix[16], const float projectionMatrix[16], - unsigned char* pixelsRGBA, int rgbaBufferSizeInPixels, - float* depthBuffer, int depthBufferSizeInPixels, - int* segmentationMaskBuffer, int segmentationMaskBufferSizeInPixels, - int startPixelIndex, int destinationWidth, - int destinationHeight, int* numPixelsCopied); - - virtual void setProjectiveTextureMatrices(const float viewMatrix[16], const float projectionMatrix[16]); - virtual void setProjectiveTexture(bool useProjectiveTexture); - - virtual void autogenerateGraphicsObjects(btDiscreteDynamicsWorld* rbWorld); - - virtual void drawText3D(const char* txt, float position[3], float orientation[4], float color[4], float size, int optionFlag); - - virtual void drawText3D(const char* txt, float posX, float posY, float posZ, float size); - - virtual int addUserDebugText3D(const char* txt, const double positionXYZ[3], const double textColorRGB[3], double size, double lifeTime) - { - return -1; - } - - virtual int addUserDebugLine(const double debugLineFromXYZ[3], const double debugLineToXYZ[3], const double debugLineColorRGB[3], double lineWidth, double lifeTime, int trackingVisualShapeIndex, int replaceItemUid) - { - return -1; - } - virtual int addUserDebugParameter(const char* txt, double rangeMin, double rangeMax, double startValue) - { - return -1; - } - - virtual void removeUserDebugItem(int debugItemUniqueId) - { - } - virtual void removeAllUserDebugItems() - { - } - - void renderInternalGl2(int pass, const btDiscreteDynamicsWorld* dynamicsWorld); - - void setVRMode(bool vrMode); - - void setVisualizerFlag(int flag, int enable); - - virtual void setVisualizerFlagCallback(VisualizerFlagCallback callback); - - virtual void dumpFramesToVideo(const char* mp4FileName); - - int createCheckeredTexture(int r, int g, int b); - - void computeSoftBodyVertices(btCollisionShape* collisionShape, - btAlignedObjectArray& gfxVertices, - btAlignedObjectArray& indices); -}; - -#endif //OPENGL_GUI_HELPER_H diff --git a/engine/inc/bullet/Experiments/ImplicitCloth/ImplicitClothExample.h b/engine/inc/bullet/Experiments/ImplicitCloth/ImplicitClothExample.h deleted file mode 100644 index 07849e19..00000000 --- a/engine/inc/bullet/Experiments/ImplicitCloth/ImplicitClothExample.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef IMPLICIT_CLOTH_EXAMPLE_H -#define IMPLICIT_CLOTH_EXAMPLE_H - -class CommonExampleInterface* ImplicitClothCreateFunc(struct CommonExampleOptions& options); - -#endif //IMPLICIT_CLOTH_EXAMPLE_H diff --git a/engine/inc/bullet/Experiments/ImplicitCloth/stan/Cloth.h b/engine/inc/bullet/Experiments/ImplicitCloth/stan/Cloth.h deleted file mode 100644 index 79c334e2..00000000 --- a/engine/inc/bullet/Experiments/ImplicitCloth/stan/Cloth.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef STAN_CLOTH_H -#define STAN_CLOTH_H - -#include "SpringNetwork.h" - -class Cloth : public SpringNetwork -{ -public: - int w, h; - - float3 color; // for debug rendering - Cloth(const char* _name, int _n); - ~Cloth(); -}; - -Cloth* ClothCreate(int w, int h, float size); - -#endif //STAN_CLOTH_H diff --git a/engine/inc/bullet/Experiments/ImplicitCloth/stan/SpringNetwork.h b/engine/inc/bullet/Experiments/ImplicitCloth/stan/SpringNetwork.h deleted file mode 100644 index a59c3d07..00000000 --- a/engine/inc/bullet/Experiments/ImplicitCloth/stan/SpringNetwork.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef STAN_SPRING_NETWORK_H -#define STAN_SPRING_NETWORK_H - -#include "vec3n.h" - -#define SPRING_STRUCT (0) -#define SPRING_SHEAR (1) -#define SPRING_BEND (2) - -class SpringNetwork -{ -public: - class Spring - { - public: - int type; // index into coefficients spring_k[] - float restlen; - int a, b; // spring endpoints vector indices - int iab, iba; // indices into off-diagonal blocks of sparse matrix - Spring() {} - Spring(int _type, int _a, int _b, float _restlen) : type(_type), a(_a), b(_b), restlen(_restlen) { iab = iba = -1; } - }; - Array springs; - float3N X; // positions of all points - float3N V; // velocities - float3N F; // force on each point - float3N dV; // change in velocity - float3Nx3N A; // big matrix we solve system with - float3Nx3N dFdX; // big matrix of derivative of force wrt position - float3Nx3N dFdV; // big matrix of derivative of force wrt velocity - float3Nx3N S; // used for our constraints - contains only some diagonal blocks as needed S[i,i] - int awake; - float3 bmin, bmax; - union { - struct - { - float spring_struct; - float spring_shear; - float spring_bend; - }; - float spring_k[3]; - }; - float spring_damp; - float spring_air; - float cloth_step; // delta time for cloth - float3 cloth_gravity; - float cloth_sleepthreshold; - int cloth_sleepcount; - - SpringNetwork(int _n); - Spring &AddBlocks(Spring &s); - Spring &CreateSpring(int type, int a, int b, float restlen) { return AddBlocks(springs.Add(Spring(type, a, b, restlen))); } - Spring &CreateSpring(int type, int a, int b) { return CreateSpring(type, a, b, magnitude(X[b] - X[a])); } - void UpdateLimits() { BoxLimits(X.element, X.count, bmin, bmax); } - void Wake() { awake = cloth_sleepcount; } - void Simulate(float dt); - void PreSolveSpring(const Spring &s); - void CalcForces(); -}; - -#endif //STAN_SPRING_NETWORK_H diff --git a/engine/inc/bullet/Experiments/ImplicitCloth/stan/array.h b/engine/inc/bullet/Experiments/ImplicitCloth/stan/array.h deleted file mode 100644 index e422c509..00000000 --- a/engine/inc/bullet/Experiments/ImplicitCloth/stan/array.h +++ /dev/null @@ -1,307 +0,0 @@ -// -// Typical template dynamic array container class. -// By S Melax 1998 -// -// anyone is free to use, inspect, learn from, or ignore -// the code here as they see fit. -// -// A very simple template array class. -// Its easiest to understand this array -// class by seeing how it is used in code. -// -// For example: -// for(i=0;i -#include - -template -class Array -{ -public: - Array(int s = 0); - Array(Array &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 &DelIndexWithLast(int i); - Type *element; - int count; - int array_size; - const Type &operator[](int i) const - { - assert(i >= 0 && i < count); - return element[i]; - } - Type &operator[](int i) - { - assert(i >= 0 && i < count); - return element[i]; - } - Type &Pop() - { - assert(count); - count--; - return element[count]; - } - Array ©(const Array &array); - Array &operator=(Array &array); -}; - -template -Array::Array(int s) -{ - if (s == -1) return; - count = 0; - array_size = 0; - element = NULL; - if (s) - { - allocate(s); - } -} - -template -Array::Array(Array &array) -{ - count = 0; - array_size = 0; - element = NULL; - *this = array; -} - -template -Array &Array::copy(const Array &array) -{ - assert(array.array_size >= 0); - count = 0; - for (int i = 0; i < array.count; i++) - { - Add(array[i]); - } - return *this; -} -template -Array &Array::operator=(Array &array) -{ - if (array.array_size < 0) // negative number means steal the data buffer instead of copying - { - delete[] element; - element = array.element; - array_size = -array.array_size; - count = array.count; - array.count = array.array_size = 0; - array.element = NULL; - return *this; - } - count = 0; - for (int i = 0; i < array.count; i++) - { - Add(array[i]); - } - return *this; -} - -template -Array::~Array() -{ - if (element != NULL && array_size != 0) - { - delete[] element; - } - count = 0; - array_size = 0; - element = NULL; -} - -template -void Array::allocate(int s) -{ - assert(s > 0); - assert(s >= count); - if (s == array_size) return; - Type *old = element; - array_size = s; - element = new Type[array_size]; - assert(element); - for (int i = 0; i < count; i++) - { - element[i] = old[i]; - } - if (old) delete[] old; -} - -template -void Array::SetSize(int s) -{ - if (s == 0) - { - if (element) - { - delete[] 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); - } - //int i; - //for(i=0;i -int Array::Contains(Type t) -{ - int i; - int found = 0; - for (i = 0; i < count; i++) - { - if (element[i] == t) found++; - } - return found; -} - -template -void Array::AddUnique(Type t) -{ - if (!Contains(t)) Add(t); -} - -template -void Array::DelIndex(int i) -{ - assert(i < count); - count--; - while (i < count) - { - element[i] = element[i + 1]; - i++; - } -} - -template -Type &Array::DelIndexWithLast(int i) -{ - assert(i < count); - count--; - if (i < count) - { - Type r = element[i]; - element[i] = element[count]; - element[count] = r; - } - return element[count]; -} - -template -void Array::Remove(Type t) -{ - int i; - for (i = 0; i < count; i++) - { - if (element[i] == t) - { - break; - } - } - assert(i < count); // assert object t is in the array. - DelIndex(i); - for (i = 0; i < count; i++) - { - assert(element[i] != t); - } -} - -template -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 < count; i++) - { - if (element[i] == t) - { - return i; - } - } - assert(0); - return -1; -} - -#endif diff --git a/engine/inc/bullet/Experiments/ImplicitCloth/stan/vec3n.h b/engine/inc/bullet/Experiments/ImplicitCloth/stan/vec3n.h deleted file mode 100644 index c4db53d6..00000000 --- a/engine/inc/bullet/Experiments/ImplicitCloth/stan/vec3n.h +++ /dev/null @@ -1,435 +0,0 @@ -// -// Big Vector and Sparse Matrix Classes -// -// (c) S Melax 2006 -// -// The focus is on 3D applications, so -// the big vector is an array of float3s -// and the matrix class uses 3x3 blocks. -// -// This file includes both: -// - basic non-optimized version -// - an expression optimized version -// -// Optimized Expressions -// -// We want to write sweet looking code such as V=As+Bt with big vectors. -// However, we dont want the extra overheads with allocating memory for temps and excessing copying. -// Instead of a full Template Metaprogramming approach, we explicitly write -// classes to specifically handle all the expressions we are likely to use. -// Most applicable lines of code will be of the same handful of basic forms, -// but with different parameters for the operands. -// In the future, if we ever need a longer expression with more operands, -// then we will just add whatever additional building blocks that are necessary - not a big deal. -// This approach is much simpler to develop, debug and optimize (restrict keyword, simd etc) -// than template metaprogramming is. We do not rely on the implementation -// of a particular compiler to be able to expand extensive nested inline codes. -// Additionally, we reliably get our optimizations even within a debug build. -// Therefore we believe that our Optimized Expressions -// are a good compromise that give us the best of both worlds. -// The code within those important algorithms, which use this library, -// can now remain clean and readable yet still execute quickly. -// - -#ifndef SM_VEC3N_H -#define SM_VEC3N_H - -#include "vecmath.h" -#include "array.h" - -//#include -//template void * vec4::operator new[](size_t n){ return _mm_malloc(n,64); } -//template void vec4::operator delete[](void *a) { _mm_free(a); } - -struct HalfConstraint -{ - float3 n; - int vi; - float s, t; - HalfConstraint(const float3 &_n, int _vi, float _t) : n(_n), vi(_vi), s(0), t(_t) {} - HalfConstraint() : vi(-1) {} -}; - -class float3Nx3N -{ -public: - class Block - { - public: - float3x3 m; - int r, c; - float unused[16]; - - Block() {} - Block(short _r, short _c) : r(_r), c(_c) { m.x = m.y = m.z = float3(0, 0, 0); } - }; - Array blocks; // the first n blocks use as the diagonal. - int n; - void Zero(); - void InitDiagonal(float d); - void Identity() { InitDiagonal(1.0f); } - float3Nx3N() : n(0) {} - float3Nx3N(int _n) : n(_n) - { - for (int i = 0; i < n; i++) blocks.Add(Block((short)i, (short)i)); - } - template - float3Nx3N &operator=(const E &expression) - { - expression.evalequals(*this); - return *this; - } - template - float3Nx3N &operator+=(const E &expression) - { - expression.evalpluseq(*this); - return *this; - } - template - float3Nx3N &operator-=(const E &expression) - { - expression.evalmnuseq(*this); - return *this; - } -}; - -class float3N : public Array -{ -public: - float3N(int _count = 0) - { - SetSize(_count); - } - void Zero(); - void Init(const float3 &v); // sets each subvector to v - template - float3N &operator=(const E &expression) - { - expression.evalequals(*this); - return *this; - } - template - float3N &operator+=(const E &expression) - { - expression.evalpluseq(*this); - return *this; - } - template - float3N &operator-=(const E &expression) - { - expression.evalmnuseq(*this); - return *this; - } - float3N &operator=(const float3N &V) - { - this->copy(V); - return *this; - } -}; - -int ConjGradient(float3N &X, float3Nx3N &A, float3N &B); -int ConjGradientFiltered(float3N &X, const float3Nx3N &A, const float3N &B, const float3Nx3N &S, Array &H); -int ConjGradientFiltered(float3N &X, const float3Nx3N &A, const float3N &B, const float3Nx3N &S); - -inline float3N &Mul(float3N &r, const float3Nx3N &m, const float3N &v) -{ - int i; - for (i = 0; i < r.count; i++) r[i] = float3(0, 0, 0); - for (i = 0; i < m.blocks.count; i++) - { - r[m.blocks[i].r] += m.blocks[i].m * v[m.blocks[i].c]; - } - return r; -} - -inline float dot(const float3N &a, const float3N &b) -{ - float d = 0; - for (int i = 0; i < a.count; i++) - { - d += dot(a[i], b[i]); - } - return d; -} - -inline void float3Nx3N::Zero() -{ - for (int i = 0; i < blocks.count; i++) - { - blocks[i].m = float3x3(0, 0, 0, 0, 0, 0, 0, 0, 0); - } -} - -inline void float3Nx3N::InitDiagonal(float d) -{ - for (int i = 0; i < blocks.count; i++) - { - blocks[i].m = (blocks[i].c == blocks[i].r) ? float3x3(d, 0, 0, 0, d, 0, 0, 0, d) : float3x3(0, 0, 0, 0, 0, 0, 0, 0, 0); - } -} - -inline void float3N::Zero() -{ - for (int i = 0; i < count; i++) - { - element[i] = float3(0, 0, 0); - } -} - -inline void float3N::Init(const float3 &v) -{ - for (int i = 0; i < count; i++) - { - element[i] = v; - } -} - -#ifdef WE_LIKE_SLOW_CODE - -// Unoptimized Slow Basic Version of big vector operators. -// Uses typical implmentation for operators +/-*= -// These operators cause lots of unnecessary construction, memory allocation, and copying. - -inline float3N operator+(const float3N &a, const float3N &b) -{ - float3N r(a.count); - for (int i = 0; i < a.count; i++) r[i] = a[i] + b[i]; - return r; -} - -inline float3N operator*(const float3N &a, const float &s) -{ - float3N r(a.count); - for (int i = 0; i < a.count; i++) r[i] = a[i] * s; - return r; -} -inline float3N operator/(const float3N &a, const float &s) -{ - float3N r(a.count); - return Mul(r, a, 1.0f / s); -} -inline float3N operator-(const float3N &a, const float3N &b) -{ - float3N r(a.count); - for (int i = 0; i < a.count; i++) r[i] = a[i] - b[i]; - return r; -} -inline float3N operator-(const float3N &a) -{ - float3N r(a.count); - for (int i = 0; i < a.count; i++) r[i] = -a[i]; - return r; -} - -inline float3N operator*(const float3Nx3N &m, const float3N &v) -{ - float3N r(v.count); - return Mul(r, m, v); -} -inline float3N &operator-=(float3N &A, const float3N &B) -{ - assert(A.count == B.count); - for (int i = 0; i < A.count; i++) A[i] -= B[i]; - return A; -} -inline float3N &operator+=(float3N &A, const float3N &B) -{ - assert(A.count == B.count); - for (int i = 0; i < A.count; i++) A[i] += B[i]; - return A; -} - -#else - -// Optimized Expressions - -class exVneg -{ -public: - const float3N &v; - exVneg(const float3N &_v) : v(_v) {} - void evalequals(float3N &r) const - { - for (int i = 0; i < v.count; i++) r[i] = -v[i]; - } - void evalpluseq(float3N &r) const - { - for (int i = 0; i < v.count; i++) r[i] += -v[i]; - } - void evalmnuseq(float3N &r) const - { - for (int i = 0; i < v.count; i++) r[i] -= -v[i]; - } -}; - -class exVaddV -{ -public: - const float3N &a; - const float3N &b; - exVaddV(const float3N &_a, const float3N &_b) : a(_a), b(_b) {} - void evalequals(float3N &r) const - { - for (int i = 0; i < a.count; i++) r[i] = a[i] + b[i]; - } - void evalpluseq(float3N &r) const - { - for (int i = 0; i < a.count; i++) r[i] += a[i] + b[i]; - } - void evalmnuseq(float3N &r) const - { - for (int i = 0; i < a.count; i++) r[i] -= a[i] + b[i]; - } -}; - -class exVsubV -{ -public: - const float3N &a; - const float3N &b; - exVsubV(const float3N &_a, const float3N &_b) : a(_a), b(_b) {} - void evalequals(float3N &r) const - { - for (int i = 0; i < a.count; i++) r[i] = a[i] - b[i]; - } - void evalpluseq(float3N &r) const - { - for (int i = 0; i < a.count; i++) r[i] += a[i] - b[i]; - } - void evalmnuseq(float3N &r) const - { - for (int i = 0; i < a.count; i++) r[i] -= a[i] - b[i]; - } -}; - -class exVs -{ -public: - const float3N &v; - const float s; - exVs(const float3N &_v, const float &_s) : v(_v), s(_s) {} - void evalequals(float3N &r) const - { - for (int i = 0; i < v.count; i++) r[i] = v[i] * s; - } - void evalpluseq(float3N &r) const - { - for (int i = 0; i < v.count; i++) r[i] += v[i] * s; - } - void evalmnuseq(float3N &r) const - { - for (int i = 0; i < v.count; i++) r[i] -= v[i] * s; - } -}; -class exAsaddB -{ -public: - const float3N &a; - const float3N &b; - const float s; - exAsaddB(const float3N &_a, const float &_s, const float3N &_b) : a(_a), s(_s), b(_b) {} - void evalequals(float3N &r) const - { - for (int i = 0; i < a.count; i++) r[i] = a[i] * s + b[i]; - } - void evalpluseq(float3N &r) const - { - for (int i = 0; i < a.count; i++) r[i] += a[i] * s + b[i]; - } - void evalmnuseq(float3N &r) const - { - for (int i = 0; i < a.count; i++) r[i] -= a[i] * s + b[i]; - } -}; -class exAsaddBt -{ -public: - const float3N &a; - const float3N &b; - const float s; - const float t; - exAsaddBt(const float3N &_a, const float &_s, const float3N &_b, const float &_t) : a(_a), s(_s), b(_b), t(_t) {} - void evalequals(float3N &r) const - { - for (int i = 0; i < a.count; i++) r[i] = a[i] * s + b[i] * t; - } - void evalpluseq(float3N &r) const - { - for (int i = 0; i < a.count; i++) r[i] += a[i] * s + b[i] * t; - } - void evalmnuseq(float3N &r) const - { - for (int i = 0; i < a.count; i++) r[i] -= a[i] * s + b[i] * t; - } -}; - -class exMv -{ -public: - const float3Nx3N &m; - const float3N &v; - exMv(const float3Nx3N &_m, const float3N &_v) : m(_m), v(_v) {} - void evalequals(float3N &r) const { Mul(r, m, v); } -}; - -class exMs -{ -public: - const float3Nx3N &m; - const float s; - exMs(const float3Nx3N &_m, const float &_s) : m(_m), s(_s) {} - void evalequals(float3Nx3N &r) const - { - for (int i = 0; i < r.blocks.count; i++) r.blocks[i].m = m.blocks[i].m * s; - } - void evalpluseq(float3Nx3N &r) const - { - for (int i = 0; i < r.blocks.count; i++) r.blocks[i].m += m.blocks[i].m * s; - } - void evalmnuseq(float3Nx3N &r) const - { - for (int i = 0; i < r.blocks.count; i++) r.blocks[i].m -= m.blocks[i].m * s; - } -}; - -class exMAsMBt -{ -public: - const float3Nx3N &a; - const float s; - const float3Nx3N &b; - const float t; - exMAsMBt(const float3Nx3N &_a, const float &_s, const float3Nx3N &_b, const float &_t) : a(_a), s(_s), b(_b), t(_t) {} - void evalequals(float3Nx3N &r) const - { - for (int i = 0; i < r.blocks.count; i++) r.blocks[i].m = a.blocks[i].m * s + b.blocks[i].m * t; - } - void evalpluseq(float3Nx3N &r) const - { - for (int i = 0; i < r.blocks.count; i++) r.blocks[i].m += a.blocks[i].m * s + b.blocks[i].m * t; - } - void evalmnuseq(float3Nx3N &r) const - { - for (int i = 0; i < r.blocks.count; i++) r.blocks[i].m -= a.blocks[i].m * s + b.blocks[i].m * t; - } -}; - -inline exVaddV operator+(const float3N &a, const float3N &b) { return exVaddV(a, b); } -inline exVsubV operator+(const exVneg &E, const float3N &b) { return exVsubV(b, E.v); } -inline exVsubV operator-(const float3N &a, const float3N &b) { return exVsubV(a, b); } -inline exVs operator*(const float3N &V, const float &s) { return exVs(V, s); } -inline exVs operator*(const exVs &E, const float &s) { return exVs(E.v, E.s * s); } -inline exAsaddB operator+(const exVs &E, const float3N &b) { return exAsaddB(E.v, E.s, b); } -inline exAsaddB operator+(const float3N &b, const exVs &E) { return exAsaddB(E.v, E.s, b); } -inline exAsaddB operator-(const float3N &b, const exVs &E) { return exAsaddB(E.v, -E.s, b); } -inline exAsaddBt operator+(const exVs &Ea, const exVs &Eb) { return exAsaddBt(Ea.v, Ea.s, Eb.v, Eb.s); } -inline exAsaddBt operator-(const exVs &Ea, const exVs &Eb) { return exAsaddBt(Ea.v, Ea.s, Eb.v, -Eb.s); } -inline exMv operator*(const float3Nx3N &m, const float3N &v) { return exMv(m, v); } -inline exMs operator*(const exMs &E, const float &s) { return exMs(E.m, E.s * s); } -inline exMs operator*(const float3Nx3N &m, const float &s) { return exMs(m, s); } -inline exMAsMBt operator+(const exMs &Ea, const exMs &Eb) { return exMAsMBt(Ea.m, Ea.s, Eb.m, Eb.s); } -inline exMAsMBt operator-(const exMs &Ea, const exMs &Eb) { return exMAsMBt(Ea.m, Ea.s, Eb.m, -Eb.s); } - -#endif - -#endif diff --git a/engine/inc/bullet/Experiments/ImplicitCloth/stan/vecmath.h b/engine/inc/bullet/Experiments/ImplicitCloth/stan/vecmath.h deleted file mode 100644 index c219eb13..00000000 --- a/engine/inc/bullet/Experiments/ImplicitCloth/stan/vecmath.h +++ /dev/null @@ -1,723 +0,0 @@ -// -// -// Typical 3d vector math code. -// By S Melax 1998-2008 -// -// - -#ifndef SM_VEC_MATH_H -#define SM_VEC_MATH_H - -#include -#include -#include -#include - -#define M_PIf (3.1415926535897932384626433832795f) - -inline float DegToRad(float angle_degrees) { return angle_degrees * M_PIf / 180.0f; } // returns Radians. -inline float RadToDeg(float angle_radians) { return angle_radians * 180.0f / M_PIf; } // returns Degrees. - -#define OFFSET(Class, Member) (((char *)(&(((Class *)NULL)->Member))) - ((char *)NULL)) - -int argmin(const float a[], int n); -int argmax(const float a[], int n); -float squared(float a); -float clamp(float a, const float minval = 0.0f, const float maxval = 1.0f); -int clamp(int a, const int minval, const int maxval); -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 < b) ? a : b; -} - -//for template normalize functions: -inline float squareroot(float a) { return sqrtf(a); } -inline double squareroot(double a) { return sqrt(a); } - -//---------------------------------- - -//-------- 2D -------- - -template -class vec2 -{ -public: - T x, y; - inline vec2() - { - x = 0; - y = 0; - } - inline vec2(const T &_x, const T &_y) - { - x = _x; - y = _y; - } - inline T &operator[](int i) { return ((T *)this)[i]; } - inline const T &operator[](int i) const { return ((T *)this)[i]; } -}; - -typedef vec2 int2; -typedef vec2 float2; - -template -inline int operator==(const vec2 &a, const vec2 &b) -{ - return (a.x == b.x && a.y == b.y); -} -template -inline vec2 operator-(const vec2 &a, const vec2 &b) -{ - return vec2(a.x - b.x, a.y - b.y); -} -template -inline vec2 operator+(const vec2 &a, const vec2 &b) -{ - return float2(a.x + b.x, a.y + b.y); -} - -//--------- 3D --------- - -template -class vec3 -{ -public: - T x, y, z; - inline vec3() - { - x = 0; - y = 0; - z = 0; - }; - inline vec3(const T &_x, const T &_y, const T &_z) - { - x = _x; - y = _y; - z = _z; - }; - inline T &operator[](int i) { return ((T *)this)[i]; } - inline const T &operator[](int i) const { return ((T *)this)[i]; } -}; - -typedef vec3 int3; -typedef vec3 short3; -typedef vec3 float3; - -// due to ambiguity there is no overloaded operators for v3*v3 use dot,cross,outerprod,cmul -template -inline int operator==(const vec3 &a, const vec3 &b) -{ - return (a.x == b.x && a.y == b.y && a.z == b.z); -} -template -inline int operator!=(const vec3 &a, const vec3 &b) -{ - return !(a == b); -} -template -inline vec3 operator+(const vec3 &a, const vec3 &b) -{ - return vec3(a.x + b.x, a.y + b.y, a.z + b.z); -} -template -inline vec3 operator-(const vec3 &a, const vec3 &b) -{ - return vec3(a.x - b.x, a.y - b.y, a.z - b.z); -} -template -inline vec3 operator-(const vec3 &v) -{ - return vec3(-v.x, -v.y, -v.z); -} -template -inline vec3 operator*(const vec3 &v, const T &s) -{ - return vec3(v.x * s, v.y * s, v.z * s); -} -template -inline vec3 operator*(T s, const vec3 &v) -{ - return v * s; -} -template -inline vec3 operator/(const vec3 &v, T s) -{ - return vec3(v.x / s, v.y / s, v.z / s); -} -template -inline T dot(const vec3 &a, const vec3 &b) -{ - return a.x * b.x + a.y * b.y + a.z * b.z; -} -template -inline vec3 cmul(const vec3 &a, const vec3 &b) -{ - return vec3(a.x * b.x, a.y * b.y, a.z * b.z); -} -template -inline vec3 cross(const vec3 &a, const vec3 &b) -{ - return vec3(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x); -} -template -inline T magnitude(const vec3 &v) -{ - return squareroot(dot(v, v)); -} -template -inline vec3 normalize(const vec3 &v) -{ - return v / magnitude(v); -} -template -inline vec3 &operator+=(vec3 &a, const vec3 &b) -{ - a.x += b.x; - a.y += b.y; - a.z += b.z; - return a; -} -template -inline vec3 &operator-=(vec3 &a, const vec3 &b) -{ - a.x -= b.x; - a.y -= b.y; - a.z -= b.z; - return a; -} -template -inline vec3 &operator*=(vec3 &v, T s) -{ - v.x *= s; - v.y *= s; - v.z *= s; - return v; -} -template -inline vec3 &operator/=(vec3 &v, T s) -{ - v.x /= s; - v.y /= s; - v.z /= s; - return v; -} - -float3 safenormalize(const float3 &v); -float3 vabs(const float3 &v); -float3 Interpolate(const float3 &v0, const float3 &v1, float alpha); -float3 Round(const float3 &a, float precision); -template -inline vec3 VectorMin(const vec3 &a, const vec3 &b) -{ - return vec3(Min(a.x, b.x), Min(a.y, b.y), Min(a.z, b.z)); -} -template -inline vec3 VectorMax(const vec3 &a, const vec3 &b) -{ - return vec3(Max(a.x, b.x), Max(a.y, b.y), Max(a.z, b.z)); -} -int overlap(const float3 &bmina, const float3 &bmaxa, const float3 &bminb, const float3 &bmaxb); - -template -class mat3x3 -{ -public: - vec3 x, y, z; // the 3 rows of the Matrix - inline mat3x3() {} - inline mat3x3(const T &xx, const T &xy, const T &xz, const T &yx, const T &yy, const T &yz, const T &zx, const T &zy, const T &zz) : x(xx, xy, xz), y(yx, yy, yz), z(zx, zy, zz) {} - inline mat3x3(const vec3 &_x, const vec3 &_y, const vec3 &_z) : x(_x), y(_y), z(_z) {} - inline vec3 &operator[](int i) { return (&x)[i]; } - inline const vec3 &operator[](int i) const { return (&x)[i]; } - inline T &operator()(int r, int c) { return ((&x)[r])[c]; } - inline const T &operator()(int r, int c) const { return ((&x)[r])[c]; } -}; -typedef mat3x3 float3x3; - -float3x3 Transpose(const float3x3 &m); -template -vec3 operator*(const vec3 &v, const mat3x3 &m) -{ - return vec3((m.x.x * v.x + m.y.x * v.y + m.z.x * v.z), - (m.x.y * v.x + m.y.y * v.y + m.z.y * v.z), - (m.x.z * v.x + m.y.z * v.y + m.z.z * v.z)); -} - -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 -float3x3 outerprod(const float3 &a, const float3 &b); - -//-------- 4D Math -------- - -template -class vec4 -{ -public: - T x, y, z, w; - inline vec4() - { - x = 0; - y = 0; - z = 0; - w = 0; - }; - inline vec4(const T &_x, const T &_y, const T &_z, const T &_w) - { - x = _x; - y = _y; - z = _z; - w = _w; - } - inline vec4(const vec3 &v, const T &_w) - { - x = v.x; - y = v.y; - z = v.z; - w = _w; - } - //operator float *() { return &x;}; - T &operator[](int i) { return ((T *)this)[i]; } - const T &operator[](int i) const { return ((T *)this)[i]; } - inline const vec3 &xyz() const { return *((vec3 *)this); } - inline vec3 &xyz() { return *((vec3 *)this); } -}; - -typedef vec4 float4; -typedef vec4 int4; -typedef vec4 byte4; - -template -inline int operator==(const vec4 &a, const vec4 &b) -{ - return (a.x == b.x && a.y == b.y && a.z == b.z && a.w == b.w); -} -template -inline int operator!=(const vec4 &a, const vec4 &b) -{ - return !(a == b); -} -template -inline vec4 operator+(const vec4 &a, const vec4 &b) -{ - return vec4(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w); -} -template -inline vec4 operator-(const vec4 &a, const vec4 &b) -{ - return vec4(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w); -} -template -inline vec4 operator-(const vec4 &v) -{ - return vec4(-v.x, -v.y, -v.z, -v.w); -} -template -inline vec4 operator*(const vec4 &v, const T &s) -{ - return vec4(v.x * s, v.y * s, v.z * s, v.w * s); -} -template -inline vec4 operator*(T s, const vec4 &v) -{ - return v * s; -} -template -inline vec4 operator/(const vec4 &v, T s) -{ - return vec4(v.x / s, v.y / s, v.z / s, v.w / s); -} -template -inline T dot(const vec4 &a, const vec4 &b) -{ - return a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w; -} -template -inline vec4 cmul(const vec4 &a, const vec4 &b) -{ - return vec4(a.x * b.x, a.y * b.y, a.z * b.z, a.w * b.w); -} -template -inline vec4 &operator+=(vec4 &a, const vec4 &b) -{ - a.x += b.x; - a.y += b.y; - a.z += b.z; - a.w += b.w; - return a; -} -template -inline vec4 &operator-=(vec4 &a, const vec4 &b) -{ - a.x -= b.x; - a.y -= b.y; - a.z -= b.z; - a.w -= b.w; - return a; -} -template -inline vec4 &operator*=(vec4 &v, T s) -{ - v.x *= s; - v.y *= s; - v.z *= s; - v.w *= s; - return v; -} -template -inline vec4 &operator/=(vec4 &v, T s) -{ - v.x /= s; - v.y /= s; - v.z /= s; - v.w /= s; - return v; -} -template -inline T magnitude(const vec4 &v) -{ - return squareroot(dot(v, v)); -} -template -inline vec4 normalize(const vec4 &v) -{ - return v / magnitude(v); -} - -struct D3DXMATRIX; - -template -class mat4x4 -{ -public: - vec4 x, y, z, w; // the 4 rows - inline mat4x4() {} - inline mat4x4(const vec4 &_x, const vec4 &_y, const vec4 &_z, const vec4 &_w) : x(_x), y(_y), z(_z), w(_w) {} - inline mat4x4(const T &m00, const T &m01, const T &m02, const T &m03, - const T &m10, const T &m11, const T &m12, const T &m13, - const T &m20, const T &m21, const T &m22, const T &m23, - const T &m30, const T &m31, const T &m32, const T &m33) - : x(m00, m01, m02, m03), y(m10, m11, m12, m13), z(m20, m21, m22, m23), w(m30, m31, m32, m33) {} - inline vec4 &operator[](int i) - { - assert(i >= 0 && i < 4); - return (&x)[i]; - } - inline const vec4 &operator[](int i) const - { - assert(i >= 0 && i < 4); - return (&x)[i]; - } - inline T &operator()(int r, int c) - { - assert(r >= 0 && r < 4 && c >= 0 && c < 4); - return ((&x)[r])[c]; - } - inline const T &operator()(int r, int c) const - { - assert(r >= 0 && r < 4 && c >= 0 && c < 4); - return ((&x)[r])[c]; - } - inline operator T *() { return &x.x; } - inline operator const T *() const { return &x.x; } - operator struct D3DXMATRIX *() { return (struct D3DXMATRIX *)this; } - operator const struct D3DXMATRIX *() const { return (struct D3DXMATRIX *)this; } -}; - -typedef mat4x4 float4x4; - -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 ------------ - -template -class quaternion : public vec4 -{ -public: - inline quaternion() - { - this->x = this->y = this->z = 0.0f; - this->w = 1.0f; - } - inline quaternion(const T &_x, const T &_y, const T &_z, const T &_w) - { - this->x = _x; - this->y = _y; - this->z = _z; - this->w = _w; - } - inline explicit quaternion(const vec4 &v) : vec4(v) {} - T angle() const { return acosf(this->w) * 2.0f; } - vec3 axis() const - { - vec3 a(this->x, this->y, this->z); - if (fabsf(angle()) < 0.0000001f) return vec3(1, 0, 0); - return a * (1 / sinf(angle() / 2.0f)); - } - inline vec3 xdir() const { return vec3(1 - 2 * (this->y * this->y + this->z * this->z), 2 * (this->x * this->y + this->w * this->z), - 2 * (this->x * this->z - this->w * this->y)); } - inline vec3 ydir() const { return vec3(2 * (this->x * this->y - this->w * this->z), 1 - 2 * (this->x * this->x + this->z * this->z), 2 * (this->y * this->z + this->w * this->x)); } - inline vec3 zdir() const { return vec3(2 * (this->x * this->z + this->w * this->y), - 2 * (this->y * this->z - this->w * this->x), 1 - 2 * (this->x * this->x + this->y * this->y)); } - inline mat3x3 getmatrix() const { return mat3x3(xdir(), ydir(), zdir()); } - //operator float3x3() { return getmatrix(); } - void Normalize(); -}; - -template -inline quaternion quatfrommat(const mat3x3 &m) -{ - T magw = m[0][0] + m[1][1] + m[2][2]; - T magxy; - T magzw; - vec3 pre; - vec3 prexy; - vec3 prezw; - quaternion postxy; - quaternion postzw; - quaternion post; - int wvsz = (magw > m[2][2]); - magzw = (wvsz) ? magw : m[2][2]; - prezw = (wvsz) ? vec3(1.0f, 1.0f, 1.0f) : vec3(-1.0f, -1.0f, 1.0f); - postzw = (wvsz) ? quaternion(0.0f, 0.0f, 0.0f, 1.0f) : quaternion(0.0f, 0.0f, 1.0f, 0.0f); - int xvsy = (m[0][0] > m[1][1]); - magxy = (xvsy) ? m[0][0] : m[1][1]; - prexy = (xvsy) ? vec3(1.0f, -1.0f, -1.0f) : vec3(-1.0f, 1.0f, -1.0f); - postxy = (xvsy) ? quaternion(1.0f, 0.0f, 0.0f, 0.0f) : quaternion(0.0f, 1.0f, 0.0f, 0.0f); - int zwvsxy = (magzw > magxy); - pre = (zwvsxy) ? prezw : prexy; - post = (zwvsxy) ? postzw : postxy; - - T t = pre.x * m[0][0] + pre.y * m[1][1] + pre.z * m[2][2] + 1.0f; - T s = 1 / sqrt(t) * 0.5f; - quaternion qp; - qp.x = (pre.y * m[1][2] - pre.z * m[2][1]) * s; - qp.y = (pre.z * m[2][0] - pre.x * m[0][2]) * s; - qp.z = (pre.x * m[0][1] - pre.y * m[1][0]) * s; - qp.w = t * s; - return qp * post; -} - -typedef quaternion Quaternion; - -inline Quaternion QuatFromAxisAngle(const float3 &_v, float angle_radians) -{ - float3 v = normalize(_v) * sinf(angle_radians / 2.0f); - return Quaternion(v.x, v.y, v.z, cosf(angle_radians / 2.0f)); -} - -template -inline quaternion Conjugate(const quaternion &q) -{ - return quaternion(-q.x, -q.y, -q.z, q.w); -} -template -inline quaternion Inverse(const quaternion &q) -{ - return Conjugate(q); -} -template -inline quaternion normalize(const quaternion &a) -{ - return quaternion(normalize((vec4 &)a)); -} -template -inline quaternion &operator*=(quaternion &a, T s) -{ - return (quaternion &)((vec4 &)a *= s); -} -template -inline quaternion operator*(const quaternion &a, float s) -{ - return quaternion((vec4 &)a * s); -} -template -inline quaternion operator+(const quaternion &a, const quaternion &b) -{ - return quaternion((vec4 &)a + (vec4 &)b); -} -template -inline quaternion operator-(const quaternion &a, const quaternion &b) -{ - return quaternion((vec4 &)a - (vec4 &)b); -} -template -inline quaternion operator-(const quaternion &b) -{ - return quaternion(-(vec4 &)b); -} -template -inline quaternion operator*(const quaternion &a, const quaternion &b) -{ - return quaternion( - a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y, //x - a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x, //y - a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w, //z - a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z); //w -} - -float3 rotate(const Quaternion &q, const float3 &v); -//float3 operator*( const Quaternion& q, const float3& v ); -//float3 operator*( const float3& v, const Quaternion& q ); - -Quaternion slerp(const Quaternion &a, const Quaternion &b, float t); -Quaternion Interpolate(const Quaternion &q0, const Quaternion &q1, float t); -Quaternion RotationArc(float3 v0, float3 v1); // returns quat q where q*v0*q^-1=v1 -float4x4 MatrixFromQuatVec(const Quaternion &q, const float3 &v); - -inline Quaternion QuatFromMat(const float3 &t, const float3 &b, const float3 &n) -{ - return normalize(quatfrommat(float3x3(t, b, n))); -} - -//---------------- Pose ------------------ - -class Pose -{ -public: - float3 position; - Quaternion orientation; - Pose() {} - Pose(const float3 &p, const Quaternion &q) : position(p), orientation(q) {} - Pose &pose() { return *this; } - const Pose &pose() const { return *this; } -}; - -inline float3 operator*(const Pose &a, const float3 &v) -{ - return a.position + rotate(a.orientation, v); -} - -inline Pose operator*(const Pose &a, const Pose &b) -{ - return Pose(a.position + rotate(a.orientation, b.position), a.orientation * b.orientation); -} - -inline Pose Inverse(const Pose &a) -{ - Quaternion q = Inverse(a.orientation); - return Pose(rotate(q, -a.position), q); -} - -inline Pose slerp(const Pose &p0, const Pose &p1, float t) -{ - return Pose(p0.position * (1.0f - t) + p1.position * t, slerp(p0.orientation, p1.orientation, t)); -} - -inline float4x4 MatrixFromPose(const Pose &pose) -{ - return MatrixFromQuatVec(pose.orientation, pose.position); -} - -//------ Euler Angle ----- - -Quaternion YawPitchRoll(float yaw, float pitch, float roll); -float Yaw(const Quaternion &q); -float Pitch(const Quaternion &q); -float Roll(const Quaternion &q); -float Yaw(const float3 &v); -float Pitch(const float3 &v); - -//------- Plane ---------- -class Plane : public float4 -{ -public: - float3 &normal() { return xyz(); } - const float3 &normal() const { return xyz(); } - float &dist() { return w; } // distance below origin - the D from plane equasion Ax+By+Cz+D=0 - const float &dist() const { return w; } // distance below origin - the D from plane equasion Ax+By+Cz+D=0 - Plane(const float3 &n, float d) : float4(n, d) {} - Plane() { dist() = 0; } - explicit Plane(const float4 &v) : float4(v) {} -}; - -Plane Transform(const Plane &p, const float3 &translation, const Quaternion &rotation); - -inline Plane PlaneFlip(const Plane &p) { return Plane(-p.normal(), -p.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)); } - -float3 PlaneLineIntersection(const Plane &plane, const float3 &p0, const float3 &p1); -float3 PlaneProject(const Plane &plane, const float3 &point); -float3 PlanesIntersection(const Plane &p0, const Plane &p1, const Plane &p2); -float3 PlanesIntersection(const Plane *planes, int planes_count, const float3 &seed = float3(0, 0, 0)); - -int Clip(const Plane &p, const float3 *verts_in, int count, float *verts_out); // verts_out must be preallocated with sufficient size >= count+1 or more if concave -int ClipPolyPoly(const float3 &normal, const float3 *clipper, int clipper_count, const float3 *verts_in, int in_count, float3 *scratch); //scratch must be preallocated - -//--------- Utility Functions ------ - -float3 PlaneLineIntersection(const float3 &normal, const float dist, const float3 &p0, const float3 &p1); -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); -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); -int Clip(const float3 &plane_normal, float plane_dist, const float3 *verts_in, int count, float *verts_out); // verts_out must be preallocated with sufficient size >= count+1 or more if concave -int ClipPolyPoly(const float3 &normal, const float3 *clipper, int clipper_count, const float3 *verts_in, int in_count, float3 *scratch); //scratch must be preallocated -float3 Diagonal(const float3x3 &M); -Quaternion Diagonalizer(const float3x3 &A); -float3 Orth(const float3 &v); -int SolveQuadratic(float a, float b, float c, float *ta, float *tb); // if true returns roots ta,tb where ta<=tb -int HitCheckPoly(const float3 *vert, const int n, const float3 &v0, const float3 &v1, float3 *impact = NULL, float3 *normal = NULL); -int HitCheckRaySphere(const float3 &sphereposition, float radius, const float3 &_v0, const float3 &_v1, float3 *impact, float3 *normal); -int HitCheckRayCylinder(const float3 &p0, const float3 &p1, float radius, const float3 &_v0, const float3 &_v1, float3 *impact, float3 *normal); -int HitCheckSweptSphereTri(const float3 &p0, const float3 &p1, const float3 &p2, float radius, const float3 &v0, const float3 &_v1, float3 *impact, float3 *normal); -void BoxLimits(const float3 *verts, int verts_count, float3 &bmin_out, float3 &bmax_out); -void BoxLimits(const float4 *verts, int verts_count, float3 &bmin_out, float3 &bmax_out); - -template -inline int maxdir(const T *p, int count, const T &dir) -{ - assert(count); - int m = 0; - for (int i = 1; i < count; i++) - { - if (dot(p[i], dir) > dot(p[m], dir)) m = i; - } - return m; -} - -float3 CenterOfMass(const float3 *vertices, const int3 *tris, const int count); -float3x3 Inertia(const float3 *vertices, const int3 *tris, const int count, const float3 &com = float3(0, 0, 0)); -float Volume(const float3 *vertices, const int3 *tris, const int count); -int calchull(float3 *verts, int verts_count, int3 *&tris_out, int &tris_count, int vlimit); // computes convex hull see hull.cpp - -#endif // VEC_MATH_H diff --git a/engine/inc/bullet/ExtendedTutorials/Bridge.h b/engine/inc/bullet/ExtendedTutorials/Bridge.h deleted file mode 100644 index 5848e2fe..00000000 --- a/engine/inc/bullet/ExtendedTutorials/Bridge.h +++ /dev/null @@ -1,21 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2015 Google Inc. http://bulletphysics.org - -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 ET_BRIDGE_EXAMPLE_H -#define ET_BRIDGE_EXAMPLE_H - -class CommonExampleInterface* ET_BridgeCreateFunc(struct CommonExampleOptions& options); - -#endif //ET_BRIDGE_EXAMPLE_H diff --git a/engine/inc/bullet/ExtendedTutorials/Chain.h b/engine/inc/bullet/ExtendedTutorials/Chain.h deleted file mode 100644 index 5def1db9..00000000 --- a/engine/inc/bullet/ExtendedTutorials/Chain.h +++ /dev/null @@ -1,21 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2015 Google Inc. http://bulletphysics.org - -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 ET_CHAIN_EXAMPLE_H -#define ET_CHAIN_EXAMPLE_H - -class CommonExampleInterface* ET_ChainCreateFunc(struct CommonExampleOptions& options); - -#endif //ET_CHAIN_EXAMPLE_H diff --git a/engine/inc/bullet/ExtendedTutorials/CompoundBoxes.h b/engine/inc/bullet/ExtendedTutorials/CompoundBoxes.h deleted file mode 100644 index 02a7eb08..00000000 --- a/engine/inc/bullet/ExtendedTutorials/CompoundBoxes.h +++ /dev/null @@ -1,21 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2015 Google Inc. http://bulletphysics.org - -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 ET_COMPOUND_BOXES_EXAMPLE_H -#define ET_COMPOUND_BOXES_EXAMPLE_H - -class CommonExampleInterface* ET_CompoundBoxesCreateFunc(struct CommonExampleOptions& options); - -#endif //ET_COMPOUND_BOXES_EXAMPLE_H diff --git a/engine/inc/bullet/ExtendedTutorials/InclinedPlane.h b/engine/inc/bullet/ExtendedTutorials/InclinedPlane.h deleted file mode 100644 index 0a7c2d37..00000000 --- a/engine/inc/bullet/ExtendedTutorials/InclinedPlane.h +++ /dev/null @@ -1,21 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2015 Google Inc. http://bulletphysics.org - -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 ET_INCLINED_PLANE_EXAMPLE_H -#define ET_INCLINED_PLANE_EXAMPLE_H - -class CommonExampleInterface* ET_InclinedPlaneCreateFunc(struct CommonExampleOptions& options); - -#endif //ET_INCLINED_PLANE_EXAMPLE_H diff --git a/engine/inc/bullet/ExtendedTutorials/MultiPendulum.h b/engine/inc/bullet/ExtendedTutorials/MultiPendulum.h deleted file mode 100644 index d65a295f..00000000 --- a/engine/inc/bullet/ExtendedTutorials/MultiPendulum.h +++ /dev/null @@ -1,21 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2015 Google Inc. http://bulletphysics.org - -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 ET_MULTI_PENDULUM_EXAMPLE_H -#define ET_MULTI_PENDULUM_EXAMPLE_H - -class CommonExampleInterface* ET_MultiPendulumCreateFunc(struct CommonExampleOptions& options); - -#endif //ET_MULTI_PENDULUM_EXAMPLE_H diff --git a/engine/inc/bullet/ExtendedTutorials/MultipleBoxes.h b/engine/inc/bullet/ExtendedTutorials/MultipleBoxes.h deleted file mode 100644 index 5f34c585..00000000 --- a/engine/inc/bullet/ExtendedTutorials/MultipleBoxes.h +++ /dev/null @@ -1,21 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2015 Google Inc. http://bulletphysics.org - -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 ET_MULTIPLE_BOXES_EXAMPLE_H -#define ET_MULTIPLE_BOXES_EXAMPLE_H - -class CommonExampleInterface* ET_MultipleBoxesCreateFunc(struct CommonExampleOptions& options); - -#endif //ET_MULTIPLE_BOXES_EXAMPLE_H diff --git a/engine/inc/bullet/ExtendedTutorials/NewtonsCradle.h b/engine/inc/bullet/ExtendedTutorials/NewtonsCradle.h deleted file mode 100644 index 439003d3..00000000 --- a/engine/inc/bullet/ExtendedTutorials/NewtonsCradle.h +++ /dev/null @@ -1,21 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2015 Google Inc. http://bulletphysics.org - -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 ET_NEWTONS_CRADLE_EXAMPLE_H -#define ET_NEWTONS_CRADLE_EXAMPLE_H - -class CommonExampleInterface* ET_NewtonsCradleCreateFunc(struct CommonExampleOptions& options); - -#endif //ET_NEWTONS_CRADLE_EXAMPLE_H diff --git a/engine/inc/bullet/ExtendedTutorials/NewtonsRopeCradle.h b/engine/inc/bullet/ExtendedTutorials/NewtonsRopeCradle.h deleted file mode 100644 index e7ddcf2d..00000000 --- a/engine/inc/bullet/ExtendedTutorials/NewtonsRopeCradle.h +++ /dev/null @@ -1,21 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2015 Google Inc. http://bulletphysics.org - -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 ET_NEWTONS_ROPE_CRADLE_EXAMPLE_H -#define ET_NEWTONS_ROPE_CRADLE_EXAMPLE_H - -class CommonExampleInterface* ET_NewtonsRopeCradleCreateFunc(struct CommonExampleOptions& options); - -#endif //ET_NEWTONS_ROPE_CRADLE_EXAMPLE_H diff --git a/engine/inc/bullet/ExtendedTutorials/RigidBodyFromObj.h b/engine/inc/bullet/ExtendedTutorials/RigidBodyFromObj.h deleted file mode 100644 index cd133a33..00000000 --- a/engine/inc/bullet/ExtendedTutorials/RigidBodyFromObj.h +++ /dev/null @@ -1,27 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2015 Google Inc. http://bulletphysics.org - -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 ET_RIGIDBODYFROMOBJ_EXAMPLE_H -#define ET_RIGIDBODYFROMOBJ_EXAMPLE_H - -enum ObjToRigidBodyOptionsEnum -{ - ObjUseConvexHullForRendering = 1, - OptimizeConvexObj = 2, - ComputePolyhedralFeatures = 4, -}; -class CommonExampleInterface* ET_RigidBodyFromObjCreateFunc(struct CommonExampleOptions& options); - -#endif //ET_RIGIDBODYFROMOBJ_EXAMPLE_H diff --git a/engine/inc/bullet/ExtendedTutorials/SimpleBox.h b/engine/inc/bullet/ExtendedTutorials/SimpleBox.h deleted file mode 100644 index 03c2e637..00000000 --- a/engine/inc/bullet/ExtendedTutorials/SimpleBox.h +++ /dev/null @@ -1,21 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2015 Google Inc. http://bulletphysics.org - -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 ET_SIMPLE_BOX_EXAMPLE_H -#define ET_SIMPLE_BOX_EXAMPLE_H - -class CommonExampleInterface* ET_SimpleBoxCreateFunc(struct CommonExampleOptions& options); - -#endif //ET_SIMPLE_BOX_EXAMPLE_H diff --git a/engine/inc/bullet/ExtendedTutorials/SimpleCloth.h b/engine/inc/bullet/ExtendedTutorials/SimpleCloth.h deleted file mode 100644 index d8269b01..00000000 --- a/engine/inc/bullet/ExtendedTutorials/SimpleCloth.h +++ /dev/null @@ -1,21 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2015 Google Inc. http://bulletphysics.org - -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 ET_SIMPLE_CLOTH_EXAMPLE_H -#define ET_SIMPLE_CLOTH_EXAMPLE_H - -class CommonExampleInterface* ET_SimpleClothCreateFunc(struct CommonExampleOptions& options); - -#endif //ET_SIMPLE_CLOTH_EXAMPLE_H diff --git a/engine/inc/bullet/ExtendedTutorials/SimpleJoint.h b/engine/inc/bullet/ExtendedTutorials/SimpleJoint.h deleted file mode 100644 index 7097c8d5..00000000 --- a/engine/inc/bullet/ExtendedTutorials/SimpleJoint.h +++ /dev/null @@ -1,21 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2015 Google Inc. http://bulletphysics.org - -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 ET_SIMPLE_JOINT_EXAMPLE_H -#define ET_SIMPLE_JOINT_EXAMPLE_H - -class CommonExampleInterface* ET_SimpleJointCreateFunc(struct CommonExampleOptions& options); - -#endif //ET_SIMPLE_JOINT_EXAMPLE_H diff --git a/engine/inc/bullet/ForkLift/ForkLiftDemo.h b/engine/inc/bullet/ForkLift/ForkLiftDemo.h deleted file mode 100644 index 497c2d4c..00000000 --- a/engine/inc/bullet/ForkLift/ForkLiftDemo.h +++ /dev/null @@ -1,20 +0,0 @@ -/* -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 CommonExampleInterface* ForkLiftCreateFunc(struct CommonExampleOptions& options); - -#endif // FORKLIFT_DEMO_H diff --git a/engine/inc/bullet/FractureDemo/FractureDemo.h b/engine/inc/bullet/FractureDemo/FractureDemo.h deleted file mode 100644 index 3108d250..00000000 --- a/engine/inc/bullet/FractureDemo/FractureDemo.h +++ /dev/null @@ -1,20 +0,0 @@ -/* -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 FRACTURE_DEMO_H -#define FRACTURE_DEMO_H - -class CommonExampleInterface* FractureDemoCreateFunc(struct CommonExampleOptions& options); - -#endif //FRACTURE_DEMO_H diff --git a/engine/inc/bullet/FractureDemo/btFractureBody.h b/engine/inc/bullet/FractureDemo/btFractureBody.h deleted file mode 100644 index 746babde..00000000 --- a/engine/inc/bullet/FractureDemo/btFractureBody.h +++ /dev/null @@ -1,65 +0,0 @@ - -#ifndef BT_FRACTURE_BODY -#define BT_FRACTURE_BODY - -class btCollisionShape; -class btDynamicsWorld; -class btCollisionWorld; -class btCompoundShape; -class btManifoldPoint; - -#include "LinearMath/btAlignedObjectArray.h" -#include "BulletDynamics/Dynamics/btRigidBody.h" - -#define CUSTOM_FRACTURE_TYPE (btRigidBody::CO_USER_TYPE + 1) - -struct btConnection -{ - btCollisionShape* m_childShape0; - btCollisionShape* m_childShape1; - int m_childIndex0; - int m_childIndex1; - btScalar m_strength; -}; - -class btFractureBody : public btRigidBody -{ - //connections -public: - btDynamicsWorld* m_world; - btAlignedObjectArray m_masses; - btAlignedObjectArray m_connections; - - btFractureBody(const btRigidBodyConstructionInfo& constructionInfo, btDynamicsWorld* world) - : btRigidBody(constructionInfo), - m_world(world) - { - m_masses.push_back(constructionInfo.m_mass); - m_internalType = CUSTOM_FRACTURE_TYPE + CO_RIGID_BODY; - } - - ///btRigidBody constructor for backwards compatibility. - ///To specify friction (etc) during rigid body construction, please use the other constructor (using btRigidBodyConstructionInfo) - btFractureBody(btScalar mass, btMotionState* motionState, btCollisionShape* collisionShape, const btVector3& localInertia, btScalar* masses, int numMasses, btDynamicsWorld* world) - : btRigidBody(mass, motionState, collisionShape, localInertia), - m_world(world) - { - for (int i = 0; i < numMasses; i++) - m_masses.push_back(masses[i]); - - m_internalType = CUSTOM_FRACTURE_TYPE + CO_RIGID_BODY; - } - - void recomputeConnectivity(btCollisionWorld* world); - - static btCompoundShape* shiftTransform(btCompoundShape* boxCompound, btScalar* masses, btTransform& shift, btVector3& principalInertia); - - static btCompoundShape* shiftTransformDistributeMass(btCompoundShape* boxCompound, btScalar mass, btTransform& shift); - - static bool collisionCallback(btManifoldPoint& cp, const btCollisionObject* colObj0, int partId0, int index0, const btCollisionObject* colObj1, int partId1, int index1); -}; - -void fractureCallback(btDynamicsWorld* world, btScalar timeStep); -void glueCallback(btDynamicsWorld* world, btScalar timeStep); - -#endif //BT_FRACTURE_BODY diff --git a/engine/inc/bullet/FractureDemo/btFractureDynamicsWorld.h b/engine/inc/bullet/FractureDemo/btFractureDynamicsWorld.h deleted file mode 100644 index 857f8ca0..00000000 --- a/engine/inc/bullet/FractureDemo/btFractureDynamicsWorld.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef _BT_FRACTURE_DYNAMICS_WORLD_H -#define _BT_FRACTURE_DYNAMICS_WORLD_H - -#include "BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h" -#include "LinearMath/btAlignedObjectArray.h" - -class btFractureBody; -class btCompoundShape; -class btTransform; - -///The btFractureDynamicsWorld class enabled basic glue and fracture of objects. -///If/once this implementation is stablized/tested we might merge it into btDiscreteDynamicsWorld and remove the class. -class btFractureDynamicsWorld : public btDiscreteDynamicsWorld -{ - btAlignedObjectArray m_fractureBodies; - - bool m_fracturingMode; - - btFractureBody* addNewBody(const btTransform& oldTransform, btScalar* masses, btCompoundShape* oldCompound); - - void breakDisconnectedParts(btFractureBody* fracObj); - -public: - btFractureDynamicsWorld(btDispatcher* dispatcher, btBroadphaseInterface* pairCache, btConstraintSolver* constraintSolver, btCollisionConfiguration* collisionConfiguration); - - virtual void addRigidBody(btRigidBody* body); - - virtual void removeRigidBody(btRigidBody* body); - - void solveConstraints(btContactSolverInfo& solverInfo); - - ///either fracture or glue (!fracture) - void setFractureMode(bool fracture) - { - m_fracturingMode = fracture; - } - - bool getFractureMode() const { return m_fracturingMode; } - - ///normally those callbacks are called internally by the 'solveConstraints' - void glueCallback(); - - ///normally those callbacks are called internally by the 'solveConstraints' - void fractureCallback(); -}; - -#endif //_BT_FRACTURE_DYNAMICS_WORLD_H diff --git a/engine/inc/bullet/GIMPACTUtils/btGImpactConvexDecompositionShape.h b/engine/inc/bullet/GIMPACTUtils/btGImpactConvexDecompositionShape.h deleted file mode 100644 index 47a32706..00000000 --- a/engine/inc/bullet/GIMPACTUtils/btGImpactConvexDecompositionShape.h +++ /dev/null @@ -1,79 +0,0 @@ -/*! \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/engine/inc/bullet/GyroscopicDemo/GyroscopicSetup.h b/engine/inc/bullet/GyroscopicDemo/GyroscopicSetup.h deleted file mode 100644 index a5378143..00000000 --- a/engine/inc/bullet/GyroscopicDemo/GyroscopicSetup.h +++ /dev/null @@ -1,7 +0,0 @@ - -#ifndef GYROSCOPIC_SETUP_H -#define GYROSCOPIC_SETUP_H - -class CommonExampleInterface* GyroscopicCreateFunc(struct CommonExampleOptions& options); - -#endif //GYROSCOPIC_SETUP_H diff --git a/engine/inc/bullet/HACD/hacdCircularList.h b/engine/inc/bullet/HACD/hacdCircularList.h deleted file mode 100644 index d09237ae..00000000 --- a/engine/inc/bullet/HACD/hacdCircularList.h +++ /dev/null @@ -1,86 +0,0 @@ -/* Copyright (c) 2011 Khaled Mamou (kmamou at gmail dot com) - All rights reserved. - - - Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - - 3. The names of the contributors may not be used to endorse or promote products derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#pragma once -#ifndef HACD_CIRCULAR_LIST_H -#define HACD_CIRCULAR_LIST_H -#include -#include "hacdVersion.h" -namespace HACD -{ -//! CircularListElement class. -template -class CircularListElement -{ -public: - T& GetData() { return m_data; } - const T& GetData() const { return m_data; } - CircularListElement*& GetNext() { return m_next; } - CircularListElement*& GetPrev() { return m_prev; } - const CircularListElement*& GetNext() const { return m_next; } - const CircularListElement*& GetPrev() const { return m_prev; } - //! Constructor - CircularListElement(const T& data) { m_data = data; } - CircularListElement(void) {} - //! Destructor - ~CircularListElement(void) {} - -private: - T m_data; - CircularListElement* m_next; - CircularListElement* m_prev; - - CircularListElement(const CircularListElement& rhs); -}; - -//! CircularList class. -template -class CircularList -{ -public: - CircularListElement*& GetHead() { return m_head; } - const CircularListElement* GetHead() const { return m_head; } - bool IsEmpty() const { return (m_size == 0); } - size_t GetSize() const { return m_size; } - const T& GetData() const { return m_head->GetData(); } - T& GetData() { return m_head->GetData(); } - bool Delete(); - bool Delete(CircularListElement* element); - CircularListElement* Add(const T* data = 0); - CircularListElement* Add(const T& data); - bool Next(); - bool Prev(); - void Clear() - { - while (Delete()) - ; - }; - const CircularList& operator=(const CircularList& rhs); - //! Constructor - CircularList() - { - m_head = 0; - m_size = 0; - } - CircularList(const CircularList& rhs); - //! Destructor - virtual ~CircularList(void) { Clear(); }; - -private: - CircularListElement* m_head; //!< a pointer to the head of the circular list - size_t m_size; //!< number of element in the circular list -}; -} // namespace HACD -#include "hacdCircularList.inl" -#endif diff --git a/engine/inc/bullet/HACD/hacdCircularList.inl b/engine/inc/bullet/HACD/hacdCircularList.inl deleted file mode 100644 index 471f9ed4..00000000 --- a/engine/inc/bullet/HACD/hacdCircularList.inl +++ /dev/null @@ -1,163 +0,0 @@ -#pragma once -#ifndef HACD_CIRCULAR_LIST_INL -#define HACD_CIRCULAR_LIST_INL -#include -#include "hacdVersion.h" -namespace HACD -{ - template < typename T > - inline bool CircularList::Delete(CircularListElement * element) - { - if (!element) - { - return false; - } - if (m_size > 1) - { - CircularListElement * next = element->GetNext(); - CircularListElement * prev = element->GetPrev(); - delete element; - m_size--; - if (element == m_head) - { - m_head = next; - } - next->GetPrev() = prev; - prev->GetNext() = next; - return true; - } - else if (m_size == 1) - { - delete m_head; - m_size--; - m_head = 0; - return true; - } - else - { - return false; - } - } - - template < typename T > - inline bool CircularList::Delete() - { - if (m_size > 1) - { - CircularListElement * next = m_head->GetNext(); - CircularListElement * prev = m_head->GetPrev(); - delete m_head; - m_size--; - m_head = next; - next->GetPrev() = prev; - prev->GetNext() = next; - return true; - } - else if (m_size == 1) - { - delete m_head; - m_size--; - m_head = 0; - return true; - } - else - { - return false; - } - } - template < typename T > - inline CircularListElement * CircularList::Add(const T * data) - { - if (m_size == 0) - { - if (data) - { - m_head = new CircularListElement(*data); - } - else - { - m_head = new CircularListElement(); - } - m_head->GetNext() = m_head->GetPrev() = m_head; - } - else - { - CircularListElement * next = m_head->GetNext(); - CircularListElement * element = m_head; - if (data) - { - m_head = new CircularListElement(*data); - } - else - { - m_head = new CircularListElement; - } - m_head->GetNext() = next; - m_head->GetPrev() = element; - element->GetNext() = m_head; - next->GetPrev() = m_head; - } - m_size++; - return m_head; - } - template < typename T > - inline CircularListElement * CircularList::Add(const T & data) - { - const T * pData = &data; - return Add(pData); - } - template < typename T > - inline bool CircularList::Next() - { - if (m_size == 0) - { - return false; - } - m_head = m_head->GetNext(); - return true; - } - template < typename T > - inline bool CircularList::Prev() - { - if (m_size == 0) - { - return false; - } - m_head = m_head->GetPrev(); - return true; - } - template < typename T > - inline CircularList::CircularList(const CircularList& rhs) - { - if (rhs.m_size > 0) - { - CircularListElement * current = rhs.m_head; - do - { - current = current->GetNext(); - Add(current->GetData()); - } - while ( current != rhs.m_head ); - } - } - template < typename T > - inline const CircularList& CircularList::operator=(const CircularList& rhs) - { - if (&rhs != this) - { - Clear(); - if (rhs.m_size > 0) - { - CircularListElement * current = rhs.m_head; - do - { - current = current->GetNext(); - Add(current->GetData()); - } - while ( current != rhs.m_head ); - } - } - return (*this); - } -} -#endif diff --git a/engine/inc/bullet/HACD/hacdGraph.h b/engine/inc/bullet/HACD/hacdGraph.h deleted file mode 100644 index 7df9dd51..00000000 --- a/engine/inc/bullet/HACD/hacdGraph.h +++ /dev/null @@ -1,119 +0,0 @@ -/* Copyright (c) 2011 Khaled Mamou (kmamou at gmail dot com) - All rights reserved. - - - Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - - 3. The names of the contributors may not be used to endorse or promote products derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#pragma once -#ifndef HACD_GRAPH_H -#define HACD_GRAPH_H -#include "hacdVersion.h" -#include "hacdVector.h" -#include "hacdICHull.h" -#include -#include -#include - -namespace HACD -{ -class GraphVertex; -class GraphEdge; -class Graph; -class HACD; - -class GraphVertex -{ -public: - bool AddEdge(long name) - { - m_edges.insert(name); - return true; - } - bool DeleteEdge(long name); - GraphVertex(); - ~GraphVertex() { delete m_convexHull; }; - -private: - long m_name; - long m_cc; - std::set m_edges; - bool m_deleted; - std::vector m_ancestors; - std::map m_distPoints; - - Real m_error; - double m_surf; - double m_volume; - double m_perimeter; - double m_concavity; - ICHull* m_convexHull; - std::set m_boudaryEdges; - - friend class GraphEdge; - friend class Graph; - friend class HACD; -}; - -class GraphEdge -{ -public: - GraphEdge(); - ~GraphEdge() { delete m_convexHull; }; - -private: - long m_name; - long m_v1; - long m_v2; - std::map m_distPoints; - Real m_error; - double m_surf; - double m_volume; - double m_perimeter; - double m_concavity; - ICHull* m_convexHull; - std::set m_boudaryEdges; - bool m_deleted; - - friend class GraphVertex; - friend class Graph; - friend class HACD; -}; - -class Graph -{ -public: - size_t GetNEdges() const { return m_nE; } - size_t GetNVertices() const { return m_nV; } - bool EdgeCollapse(long v1, long v2); - long AddVertex(); - long AddEdge(long v1, long v2); - bool DeleteEdge(long name); - bool DeleteVertex(long name); - long GetEdgeID(long v1, long v2) const; - void Clear(); - void Print() const; - long ExtractCCs(); - - Graph(); - virtual ~Graph(); - void Allocate(size_t nV, size_t nE); - -private: - size_t m_nCCs; - size_t m_nV; - size_t m_nE; - std::vector m_edges; - std::vector m_vertices; - - friend class HACD; -}; -} // namespace HACD -#endif diff --git a/engine/inc/bullet/HACD/hacdHACD.h b/engine/inc/bullet/HACD/hacdHACD.h deleted file mode 100644 index efb0fe85..00000000 --- a/engine/inc/bullet/HACD/hacdHACD.h +++ /dev/null @@ -1,285 +0,0 @@ -/* Copyright (c) 2011 Khaled Mamou (kmamou at gmail dot com) - All rights reserved. - - - Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - - 3. The names of the contributors may not be used to endorse or promote products derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#pragma once -#ifndef HACD_HACD_H -#define HACD_HACD_H -#include "hacdVersion.h" -#include "hacdVector.h" -#include "hacdGraph.h" -#include "hacdICHull.h" -#include -#include -#include -#include - -namespace HACD -{ -const double sc_pi = 3.14159265; -class HACD; - -// just to be able to set the capcity of the container - -template , class _Pr = std::less > -class reservable_priority_queue : public std::priority_queue<_Ty, _Container, _Pr> -{ - typedef typename std::priority_queue<_Ty, _Container, _Pr>::size_type size_type; - -public: - reservable_priority_queue(size_type capacity = 0) { reserve(capacity); }; - void reserve(size_type capacity) { this->c.reserve(capacity); } - size_type capacity() const { return this->c.capacity(); } -}; - -//! priority queque element -class GraphEdgePriorityQueue -{ -public: - //! Constructor - //! @param name edge's id - //! @param priority edge's priority - GraphEdgePriorityQueue(long name, Real priority) - { - m_name = name; - m_priority = priority; - } - //! Destructor - ~GraphEdgePriorityQueue(void) {} - -private: - long m_name; //!< edge name - Real m_priority; //!< priority - //! Operator < for GraphEdgePQ - friend bool operator<(const GraphEdgePriorityQueue &lhs, const GraphEdgePriorityQueue &rhs); - //! Operator > for GraphEdgePQ - friend bool operator>(const GraphEdgePriorityQueue &lhs, const GraphEdgePriorityQueue &rhs); - friend class HACD; -}; -inline bool operator<(const GraphEdgePriorityQueue &lhs, const GraphEdgePriorityQueue &rhs) -{ - return lhs.m_priority < rhs.m_priority; -} -inline bool operator>(const GraphEdgePriorityQueue &lhs, const GraphEdgePriorityQueue &rhs) -{ - return lhs.m_priority > rhs.m_priority; -} -typedef bool (*CallBackFunction)(const char *, double, double, size_t); - -//! Provides an implementation of the Hierarchical Approximate Convex Decomposition (HACD) technique described in "A Simple and Efficient Approach for 3D Mesh Approximate Convex Decomposition" Game Programming Gems 8 - Chapter 2.8, p.202. A short version of the chapter was published in ICIP09 and is available at ftp://ftp.elet.polimi.it/users/Stefano.Tubaro/ICIP_USB_Proceedings_v2/pdfs/0003501.pdf -class HACD -{ -public: - //! Gives the triangles partitionas an array of size m_nTriangles where the i-th element specifies the cluster to which belong the i-th triangle - //! @return triangles partition - const long *GetPartition() const { return m_partition; } - //! Sets the scale factor - //! @param scale scale factor - void SetScaleFactor(double scale) { m_scale = scale; } - //! Gives the scale factor - //! @return scale factor - double GetScaleFactor() const { return m_scale; } - //! Sets the call-back function - //! @param callBack pointer to the call-back function - void SetCallBack(CallBackFunction callBack) { m_callBack = callBack; } - //! Gives the call-back function - //! @return pointer to the call-back function - CallBackFunction GetCallBack() const { return m_callBack; } - - //! Specifies whether faces points should be added when computing the concavity - //! @param addFacesPoints true = faces points should be added - void SetAddFacesPoints(bool addFacesPoints) { m_addFacesPoints = addFacesPoints; } - //! Specifies wheter faces points should be added when computing the concavity - //! @return true = faces points should be added - bool GetAddFacesPoints() const { return m_addFacesPoints; } - //! Specifies whether extra points should be added when computing the concavity - //! @param addExteraDistPoints true = extra points should be added - void SetAddExtraDistPoints(bool addExtraDistPoints) { m_addExtraDistPoints = addExtraDistPoints; } - //! Specifies wheter extra points should be added when computing the concavity - //! @return true = extra points should be added - bool GetAddExtraDistPoints() const { return m_addExtraDistPoints; } - //! Specifies whether extra points should be added when computing the concavity - //! @param addExteraDistPoints true = extra points should be added - void SetAddNeighboursDistPoints(bool addNeighboursDistPoints) { m_addNeighboursDistPoints = addNeighboursDistPoints; } - //! Specifies wheter extra points should be added when computing the concavity - //! @return true = extra points should be added - bool GetAddNeighboursDistPoints() const { return m_addNeighboursDistPoints; } - //! Sets the points of the input mesh (Remark: the input points will be scaled and shifted. Use DenormalizeData() to invert those operations) - //! @param points pointer to the input points - void SetPoints(Vec3 *points) { m_points = points; } - //! Gives the points of the input mesh (Remark: the input points will be scaled and shifted. Use DenormalizeData() to invert those operations) - //! @return pointer to the input points - const Vec3 *GetPoints() const { return m_points; } - //! Sets the triangles of the input mesh. - //! @param triangles points pointer to the input points - void SetTriangles(Vec3 *triangles) { m_triangles = triangles; } - //! Gives the triangles in the input mesh - //! @return pointer to the input triangles - const Vec3 *GetTriangles() const { return m_triangles; } - //! Sets the number of points in the input mesh. - //! @param nPoints number of points the input mesh - void SetNPoints(size_t nPoints) { m_nPoints = nPoints; } - //! Gives the number of points in the input mesh. - //! @return number of points the input mesh - size_t GetNPoints() const { return m_nPoints; } - //! Sets the number of triangles in the input mesh. - //! @param nTriangles number of triangles in the input mesh - void SetNTriangles(size_t nTriangles) { m_nTriangles = nTriangles; } - //! Gives the number of triangles in the input mesh. - //! @return number of triangles the input mesh - size_t GetNTriangles() const { return m_nTriangles; } - //! Sets the minimum number of clusters to be generated. - //! @param nClusters minimum number of clusters - void SetNClusters(size_t nClusters) { m_nMinClusters = nClusters; } - //! Gives the number of generated clusters. - //! @return number of generated clusters - size_t GetNClusters() const { return m_nClusters; } - //! Sets the maximum allowed concavity. - //! @param concavity maximum concavity - void SetConcavity(double concavity) { m_concavity = concavity; } - //! Gives the maximum allowed concavity. - //! @return maximum concavity - double GetConcavity() const { return m_concavity; } - //! Sets the maximum allowed distance to get CCs connected. - //! @param concavity maximum distance to get CCs connected - void SetConnectDist(double ccConnectDist) { m_ccConnectDist = ccConnectDist; } - //! Gives the maximum allowed distance to get CCs connected. - //! @return maximum distance to get CCs connected - double GetConnectDist() const { return m_ccConnectDist; } - //! Sets the volume weight. - //! @param beta volume weight - void SetVolumeWeight(double beta) { m_beta = beta; } - //! Gives the volume weight. - //! @return volume weight - double GetVolumeWeight() const { return m_beta; } - //! Sets the compacity weight (i.e. parameter alpha in ftp://ftp.elet.polimi.it/users/Stefano.Tubaro/ICIP_USB_Proceedings_v2/pdfs/0003501.pdf). - //! @param alpha compacity weight - void SetCompacityWeight(double alpha) { m_alpha = alpha; } - //! Gives the compacity weight (i.e. parameter alpha in ftp://ftp.elet.polimi.it/users/Stefano.Tubaro/ICIP_USB_Proceedings_v2/pdfs/0003501.pdf). - //! @return compacity weight - double GetCompacityWeight() const { return m_alpha; } - //! Sets the maximum number of vertices for each generated convex-hull. - //! @param nVerticesPerCH maximum # vertices per CH - void SetNVerticesPerCH(size_t nVerticesPerCH) { m_nVerticesPerCH = nVerticesPerCH; } - //! Gives the maximum number of vertices for each generated convex-hull. - //! @return maximum # vertices per CH - size_t GetNVerticesPerCH() const { return m_nVerticesPerCH; } - //! Gives the number of vertices for the cluster number numCH. - //! @return number of vertices - size_t GetNPointsCH(size_t numCH) const; - //! Gives the number of triangles for the cluster number numCH. - //! @param numCH cluster's number - //! @return number of triangles - size_t GetNTrianglesCH(size_t numCH) const; - //! Gives the vertices and the triangles of the cluster number numCH. - //! @param numCH cluster's number - //! @param points pointer to the vector of points to be filled - //! @param triangles pointer to the vector of triangles to be filled - //! @return true if sucess - bool GetCH(size_t numCH, Vec3 *const points, Vec3 *const triangles); - //! Computes the HACD decomposition. - //! @param fullCH specifies whether to generate convex-hulls with a full or limited (i.e. < m_nVerticesPerCH) number of vertices - //! @param exportDistPoints specifies wheter distance points should ne exported or not (used only for debugging). - //! @return true if sucess - bool Compute(bool fullCH = false, bool exportDistPoints = false); - //! Saves the generated convex-hulls in a VRML 2.0 file. - //! @param fileName the output file name - //! @param uniColor specifies whether the different convex-hulls should have the same color or not - //! @param numCluster specifies the cluster to be saved, if numCluster < 0 export all clusters - //! @return true if sucess - bool Save(const char *fileName, bool uniColor, long numCluster = -1) const; - //! Shifts and scales to the data to have all the coordinates between 0.0 and 1000.0. - void NormalizeData(); - //! Inverse the operations applied by NormalizeData(). - void DenormalizeData(); - //! Constructor. - HACD(void); - //! Destructor. - ~HACD(void); - -private: - //! Gives the edge index. - //! @param a first vertex id - //! @param b second vertex id - //! @return edge's index - static unsigned long long GetEdgeIndex(unsigned long long a, unsigned long long b) - { - if (a > b) - return (a << 32) + b; - else - return (b << 32) + a; - } - //! Computes the concavity of a cluster. - //! @param ch the cluster's convex-hull - //! @param distPoints the cluster's points - //! @return cluster's concavity - double Concavity(ICHull &ch, std::map &distPoints); - //! Computes the perimeter of a cluster. - //! @param triIndices the cluster's triangles - //! @param distPoints the cluster's points - //! @return cluster's perimeter - double ComputePerimeter(const std::vector &triIndices) const; - //! Creates the Graph by associating to each mesh triangle a vertex in the graph and to each couple of adjacent triangles an edge in the graph. - void CreateGraph(); - //! Initializes the graph costs and computes the vertices normals - void InitializeDualGraph(); - //! Computes the cost of an edge - //! @param e edge's id - void ComputeEdgeCost(size_t e); - //! Initializes the priority queue - //! @param fast specifies whether fast mode is used - //! @return true if success - bool InitializePriorityQueue(); - //! Cleans the intersection between convex-hulls - void CleanClusters(); - //! Computes convex-hulls from partition information - //! @param fullCH specifies whether to generate convex-hulls with a full or limited (i.e. < m_nVerticesPerCH) number of vertices - void ComputeConvexHulls(bool fullCH); - //! Simplifies the graph - //! @param fast specifies whether fast mode is used - void Simplify(); - -private: - double m_scale; //>! scale factor used for NormalizeData() and DenormalizeData() - Vec3 *m_triangles; //>! pointer the triangles array - Vec3 *m_points; //>! pointer the points array - Vec3 *m_facePoints; //>! pointer to the faces points array - Vec3 *m_faceNormals; //>! pointer to the faces normals array - Vec3 *m_normals; //>! pointer the normals array - size_t m_nTriangles; //>! number of triangles in the original mesh - size_t m_nPoints; //>! number of vertices in the original mesh - size_t m_nClusters; //>! number of clusters - size_t m_nMinClusters; //>! minimum number of clusters - double m_ccConnectDist; //>! maximum allowed distance to connect CCs - double m_concavity; //>! maximum concavity - double m_alpha; //>! compacity weigth - double m_beta; //>! volume weigth - double m_diag; //>! length of the BB diagonal - Vec3 m_barycenter; //>! barycenter of the mesh - std::vector m_cVertices; //>! array of vertices each belonging to a different cluster - ICHull *m_convexHulls; //>! convex-hulls associated with the final HACD clusters - Graph m_graph; //>! simplification graph - size_t m_nVerticesPerCH; //>! maximum number of vertices per convex-hull - reservable_priority_queue, - std::greater::value_type> > - m_pqueue; //!> priority queue - HACD(const HACD &rhs); - CallBackFunction m_callBack; //>! call-back function - long *m_partition; //>! array of size m_nTriangles where the i-th element specifies the cluster to which belong the i-th triangle - bool m_addFacesPoints; //>! specifies whether to add faces points or not - bool m_addExtraDistPoints; //>! specifies whether to add extra points for concave shapes or not - bool m_addNeighboursDistPoints; //>! specifies whether to add extra points from adjacent clusters or not -}; -} // namespace HACD -#endif diff --git a/engine/inc/bullet/HACD/hacdICHull.h b/engine/inc/bullet/HACD/hacdICHull.h deleted file mode 100644 index c7d83956..00000000 --- a/engine/inc/bullet/HACD/hacdICHull.h +++ /dev/null @@ -1,120 +0,0 @@ -/* Copyright (c) 2011 Khaled Mamou (kmamou at gmail dot com) - All rights reserved. - - - Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - - 3. The names of the contributors may not be used to endorse or promote products derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#pragma once -#ifndef HACD_ICHULL_H -#define HACD_ICHULL_H -#include "hacdVersion.h" -#include "hacdManifoldMesh.h" -#include "hacdVector.h" -#include -#include -namespace HACD -{ -class DPoint; -class HACD; -//! Incremental Convex Hull algorithm (cf. http://maven.smith.edu/~orourke/books/ftp.html ). -enum ICHullError -{ - ICHullErrorOK = 0, - ICHullErrorCoplanarPoints, - ICHullErrorNoVolume, - ICHullErrorInconsistent, - ICHullErrorNotEnoughPoints -}; -class ICHull -{ -public: - //! - bool IsFlat() { return m_isFlat; } - //! - std::map *GetDistPoints() const { return m_distPoints; } - //! - void SetDistPoints(std::map *distPoints) { m_distPoints = distPoints; } - //! Returns the computed mesh - TMMesh &GetMesh() { return m_mesh; } - //! Add one point to the convex-hull - bool AddPoint(const Vec3 &point) { return AddPoints(&point, 1); } - //! Add one point to the convex-hull - bool AddPoint(const Vec3 &point, long id); - //! Add points to the convex-hull - bool AddPoints(const Vec3 *points, size_t nPoints); - bool AddPoints(std::vector > points); - //! - ICHullError Process(); - //! - ICHullError Process(unsigned long nPointsCH); - //! - double ComputeVolume(); - //! - bool IsInside(const Vec3 &pt0); - //! - double ComputeDistance(long name, const Vec3 &pt, const Vec3 &normal, bool &insideHull, bool updateIncidentPoints); - //! - const ICHull &operator=(ICHull &rhs); - - //! Constructor - ICHull(void); - //! Destructor - virtual ~ICHull(void){}; - -private: - //! DoubleTriangle builds the initial double triangle. It first finds 3 noncollinear points and makes two faces out of them, in opposite order. It then finds a fourth point that is not coplanar with that face. The vertices are stored in the face structure in counterclockwise order so that the volume between the face and the point is negative. Lastly, the 3 newfaces to the fourth point are constructed and the data structures are cleaned up. - ICHullError DoubleTriangle(); - //! MakeFace creates a new face structure from three vertices (in ccw order). It returns a pointer to the face. - CircularListElement *MakeFace(CircularListElement *v0, - CircularListElement *v1, - CircularListElement *v2, - CircularListElement *fold); - //! - CircularListElement *MakeConeFace(CircularListElement *e, CircularListElement *v); - //! - bool ProcessPoint(); - //! - bool ComputePointVolume(double &totalVolume, bool markVisibleFaces); - //! - bool FindMaxVolumePoint(); - //! - bool CleanEdges(); - //! - bool CleanVertices(unsigned long &addedPoints); - //! - bool CleanTriangles(); - //! - bool CleanUp(unsigned long &addedPoints); - //! - bool MakeCCW(CircularListElement *f, - CircularListElement *e, - CircularListElement *v); - void Clear(); - -private: - static const long sc_dummyIndex; - static const double sc_distMin; - TMMesh m_mesh; - std::vector *> m_edgesToDelete; - std::vector *> m_edgesToUpdate; - std::vector *> m_trianglesToDelete; - std::map *m_distPoints; - CircularListElement *m_dummyVertex; - Vec3 m_normal; - bool m_isFlat; - - ICHull(const ICHull &rhs); - - friend class HACD; -}; - -} // namespace HACD -#endif diff --git a/engine/inc/bullet/HACD/hacdManifoldMesh.h b/engine/inc/bullet/HACD/hacdManifoldMesh.h deleted file mode 100644 index 1d229187..00000000 --- a/engine/inc/bullet/HACD/hacdManifoldMesh.h +++ /dev/null @@ -1,251 +0,0 @@ -/* Copyright (c) 2011 Khaled Mamou (kmamou at gmail dot com) -All rights reserved. - - - Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - - 3. The names of the contributors may not be used to endorse or promote products derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* Copyright (c) 2011 Khaled Mamou (kmamou at gmail dot com) - All rights reserved. - - - Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - - 3. The names of the contributors may not be used to endorse or promote products derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#pragma once -#ifndef HACD_MANIFOLD_MESH_H -#define HACD_MANIFOLD_MESH_H -#include -#include -#include "hacdVersion.h" -#include "hacdCircularList.h" -#include "hacdVector.h" -#include -namespace HACD -{ -class TMMTriangle; -class TMMEdge; -class TMMesh; -class ICHull; -class HACD; - -class DPoint -{ -public: - DPoint(Real dist = 0, bool computed = false, bool distOnly = false) - : m_dist(dist), - m_computed(computed), - m_distOnly(distOnly){}; - ~DPoint(){}; - -private: - Real m_dist; - bool m_computed; - bool m_distOnly; - friend class TMMTriangle; - friend class TMMesh; - friend class GraphVertex; - friend class GraphEdge; - friend class Graph; - friend class ICHull; - friend class HACD; -}; - -//! Vertex data structure used in a triangular manifold mesh (TMM). -class TMMVertex -{ -public: - TMMVertex(void); - ~TMMVertex(void); - -private: - Vec3 m_pos; - long m_name; - size_t m_id; - CircularListElement *m_duplicate; // pointer to incident cone edge (or NULL) - bool m_onHull; - bool m_tag; - TMMVertex(const TMMVertex &rhs); - - friend class HACD; - friend class ICHull; - friend class TMMesh; - friend class TMMTriangle; - friend class TMMEdge; -}; - -//! Edge data structure used in a triangular manifold mesh (TMM). -class TMMEdge -{ -public: - TMMEdge(void); - ~TMMEdge(void); - -private: - size_t m_id; - CircularListElement *m_triangles[2]; - CircularListElement *m_vertices[2]; - CircularListElement *m_newFace; - - TMMEdge(const TMMEdge &rhs); - - friend class HACD; - friend class ICHull; - friend class TMMTriangle; - friend class TMMVertex; - friend class TMMesh; -}; - -//! Triangle data structure used in a triangular manifold mesh (TMM). -class TMMTriangle -{ -public: - TMMTriangle(void); - ~TMMTriangle(void); - -private: - size_t m_id; - CircularListElement *m_edges[3]; - CircularListElement *m_vertices[3]; - std::set m_incidentPoints; - bool m_visible; - - TMMTriangle(const TMMTriangle &rhs); - - friend class HACD; - friend class ICHull; - friend class TMMesh; - friend class TMMVertex; - friend class TMMEdge; -}; - -class Material -{ -public: - Material(void); - ~Material(void) {} - // private: - Vec3 m_diffuseColor; - double m_ambientIntensity; - Vec3 m_specularColor; - Vec3 m_emissiveColor; - double m_shininess; - double m_transparency; - - friend class TMMesh; - friend class HACD; -}; - -//! triangular manifold mesh data structure. -class TMMesh -{ -public: - //! Returns the number of vertices> - inline size_t GetNVertices() const { return m_vertices.GetSize(); } - //! Returns the number of edges - inline size_t GetNEdges() const { return m_edges.GetSize(); } - //! Returns the number of triangles - inline size_t GetNTriangles() const { return m_triangles.GetSize(); } - //! Returns the vertices circular list - inline const CircularList &GetVertices() const { return m_vertices; } - //! Returns the edges circular list - inline const CircularList &GetEdges() const { return m_edges; } - //! Returns the triangles circular list - inline const CircularList &GetTriangles() const { return m_triangles; } - //! Returns the vertices circular list - inline CircularList &GetVertices() { return m_vertices; } - //! Returns the edges circular list - inline CircularList &GetEdges() { return m_edges; } - //! Returns the triangles circular list - inline CircularList &GetTriangles() { return m_triangles; } - //! Add vertex to the mesh - CircularListElement *AddVertex() { return m_vertices.Add(); } - //! Add vertex to the mesh - CircularListElement *AddEdge() { return m_edges.Add(); } - //! Add vertex to the mesh - CircularListElement *AddTriangle() { return m_triangles.Add(); } - //! Print mesh information - void Print(); - //! - void GetIFS(Vec3 *const points, Vec3 *const triangles); - //! Save mesh - bool Save(const char *fileName); - //! Save mesh to VRML 2.0 format - bool SaveVRML2(std::ofstream &fout); - //! Save mesh to VRML 2.0 format - bool SaveVRML2(std::ofstream &fout, const Material &material); - //! - void Clear(); - //! - void Copy(TMMesh &mesh); - //! - bool CheckConsistancy(); - //! - bool Normalize(); - //! - bool Denormalize(); - //! Constructor - TMMesh(void); - //! Destructor - virtual ~TMMesh(void); - -private: - CircularList m_vertices; - CircularList m_edges; - CircularList m_triangles; - Real m_diag; //>! length of the BB diagonal - Vec3 m_barycenter; //>! barycenter of the mesh - - // not defined - TMMesh(const TMMesh &rhs); - friend class ICHull; - friend class HACD; -}; -//! IntersectRayTriangle(): intersect a ray with a 3D triangle -//! Input: a ray R, and a triangle T -//! Output: *I = intersection point (when it exists) -//! 0 = disjoint (no intersect) -//! 1 = intersect in unique point I1 -long IntersectRayTriangle(const Vec3 &P0, const Vec3 &dir, - const Vec3 &V0, const Vec3 &V1, - const Vec3 &V2, double &t); - -// intersect_RayTriangle(): intersect a ray with a 3D triangle -// Input: a ray R, and a triangle T -// Output: *I = intersection point (when it exists) -// Return: -1 = triangle is degenerate (a segment or point) -// 0 = disjoint (no intersect) -// 1 = intersect in unique point I1 -// 2 = are in the same plane -long IntersectRayTriangle2(const Vec3 &P0, const Vec3 &dir, - const Vec3 &V0, const Vec3 &V1, - const Vec3 &V2, double &r); - -/* - Calculate the line segment PaPb that is the shortest route between - two lines P1P2 and P3P4. Calculate also the values of mua and mub where - Pa = P1 + mua (P2 - P1) - Pb = P3 + mub (P4 - P3) - Return FALSE if no solution exists. - */ -bool IntersectLineLine(const Vec3 &p1, const Vec3 &p2, - const Vec3 &p3, const Vec3 &p4, - Vec3 &pa, Vec3 &pb, - double &mua, double &mub); -} // namespace HACD -#endif diff --git a/engine/inc/bullet/HACD/hacdVector.h b/engine/inc/bullet/HACD/hacdVector.h deleted file mode 100644 index 778e04a3..00000000 --- a/engine/inc/bullet/HACD/hacdVector.h +++ /dev/null @@ -1,68 +0,0 @@ -/* Copyright (c) 2011 Khaled Mamou (kmamou at gmail dot com) - All rights reserved. - - - Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - - 3. The names of the contributors may not be used to endorse or promote products derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#pragma once -#ifndef HACD_VECTOR_H -#define HACD_VECTOR_H -#include -#include -#include "hacdVersion.h" - -namespace HACD -{ -typedef double Real; -//! Vector dim 3. -template -class Vec3 -{ -public: - T& X(); - T& Y(); - T& Z(); - const T& X() const; - const T& Y() const; - const T& Z() const; - void Normalize(); - T GetNorm() const; - void operator=(const Vec3& rhs); - void operator+=(const Vec3& rhs); - void operator-=(const Vec3& rhs); - void operator-=(T a); - void operator+=(T a); - void operator/=(T a); - void operator*=(T a); - Vec3 operator^(const Vec3& rhs) const; - T operator*(const Vec3& rhs) const; - Vec3 operator+(const Vec3& rhs) const; - Vec3 operator-(const Vec3& rhs) const; - Vec3 operator-() const; - Vec3 operator*(T rhs) const; - Vec3 operator/(T rhs) const; - Vec3(); - Vec3(T a); - Vec3(T x, T y, T z); - Vec3(const Vec3& rhs); - /*virtual*/ ~Vec3(void); - -private: - T m_data[3]; -}; -template -bool Colinear(const Vec3& a, const Vec3& b, const Vec3& c); -template -const T Volume(const Vec3& a, const Vec3& b, const Vec3& c, const Vec3& d); - -} // namespace HACD -#include "hacdVector.inl" // template implementation -#endif diff --git a/engine/inc/bullet/HACD/hacdVector.inl b/engine/inc/bullet/HACD/hacdVector.inl deleted file mode 100644 index b1f0c1b2..00000000 --- a/engine/inc/bullet/HACD/hacdVector.inl +++ /dev/null @@ -1,178 +0,0 @@ -#pragma once -#ifndef HACD_VECTOR_INL -#define HACD_VECTOR_INL -namespace HACD -{ - template - inline Vec3 operator*(T lhs, const Vec3 & rhs) - { - return Vec3(lhs * rhs.X(), lhs * rhs.Y(), lhs * rhs.Z()); - } - template - inline T & Vec3::X() - { - return m_data[0]; - } - template - inline T & Vec3::Y() - { - return m_data[1]; - } - template - inline T & Vec3::Z() - { - return m_data[2]; - } - template - inline const T & Vec3::X() const - { - return m_data[0]; - } - template - inline const T & Vec3::Y() const - { - return m_data[1]; - } - template - inline const T & Vec3::Z() const - { - return m_data[2]; - } - template - inline void Vec3::Normalize() - { - T n = sqrt(m_data[0]*m_data[0]+m_data[1]*m_data[1]+m_data[2]*m_data[2]); - if (n != 0.0) (*this) /= n; - } - template - inline T Vec3::GetNorm() const - { - return sqrt(m_data[0]*m_data[0]+m_data[1]*m_data[1]+m_data[2]*m_data[2]); - } - template - inline void Vec3::operator= (const Vec3 & rhs) - { - this->m_data[0] = rhs.m_data[0]; - this->m_data[1] = rhs.m_data[1]; - this->m_data[2] = rhs.m_data[2]; - } - template - inline void Vec3::operator+=(const Vec3 & rhs) - { - this->m_data[0] += rhs.m_data[0]; - this->m_data[1] += rhs.m_data[1]; - this->m_data[2] += rhs.m_data[2]; - } - template - inline void Vec3::operator-=(const Vec3 & rhs) - { - this->m_data[0] -= rhs.m_data[0]; - this->m_data[1] -= rhs.m_data[1]; - this->m_data[2] -= rhs.m_data[2]; - } - template - inline void Vec3::operator-=(T a) - { - this->m_data[0] -= a; - this->m_data[1] -= a; - this->m_data[2] -= a; - } - template - inline void Vec3::operator+=(T a) - { - this->m_data[0] += a; - this->m_data[1] += a; - this->m_data[2] += a; - } - template - inline void Vec3::operator/=(T a) - { - this->m_data[0] /= a; - this->m_data[1] /= a; - this->m_data[2] /= a; - } - template - inline void Vec3::operator*=(T a) - { - this->m_data[0] *= a; - this->m_data[1] *= a; - this->m_data[2] *= a; - } - template - inline Vec3 Vec3::operator^ (const Vec3 & rhs) const - { - return Vec3(m_data[1] * rhs.m_data[2] - m_data[2] * rhs.m_data[1], - m_data[2] * rhs.m_data[0] - m_data[0] * rhs.m_data[2], - m_data[0] * rhs.m_data[1] - m_data[1] * rhs.m_data[0]); - } - template - inline T Vec3::operator*(const Vec3 & rhs) const - { - return (m_data[0] * rhs.m_data[0] + m_data[1] * rhs.m_data[1] + m_data[2] * rhs.m_data[2]); - } - template - inline Vec3 Vec3::operator+(const Vec3 & rhs) const - { - return Vec3(m_data[0] + rhs.m_data[0],m_data[1] + rhs.m_data[1],m_data[2] + rhs.m_data[2]); - } - template - inline Vec3 Vec3::operator-(const Vec3 & rhs) const - { - return Vec3(m_data[0] - rhs.m_data[0],m_data[1] - rhs.m_data[1],m_data[2] - rhs.m_data[2]) ; - } - template - inline Vec3 Vec3::operator-() const - { - return Vec3(-m_data[0],-m_data[1],-m_data[2]) ; - } - - template - inline Vec3 Vec3::operator*(T rhs) const - { - return Vec3(rhs * this->m_data[0], rhs * this->m_data[1], rhs * this->m_data[2]); - } - template - inline Vec3 Vec3::operator/ (T rhs) const - { - return Vec3(m_data[0] / rhs, m_data[1] / rhs, m_data[2] / rhs); - } - template - inline Vec3::Vec3(T a) - { - m_data[0] = m_data[1] = m_data[2] = a; - } - template - inline Vec3::Vec3(T x, T y, T z) - { - m_data[0] = x; - m_data[1] = y; - m_data[2] = z; - } - template - inline Vec3::Vec3(const Vec3 & rhs) - { - m_data[0] = rhs.m_data[0]; - m_data[1] = rhs.m_data[1]; - m_data[2] = rhs.m_data[2]; - } - template - inline Vec3::~Vec3(void){}; - - template - inline Vec3::Vec3() {} - - template - inline bool Colinear(const Vec3 & a, const Vec3 & b, const Vec3 & c) - { - return ((c.Z() - a.Z()) * (b.Y() - a.Y()) - (b.Z() - a.Z()) * (c.Y() - a.Y()) == 0.0 /*EPS*/) && - ((b.Z() - a.Z()) * (c.X() - a.X()) - (b.X() - a.X()) * (c.Z() - a.Z()) == 0.0 /*EPS*/) && - ((b.X() - a.X()) * (c.Y() - a.Y()) - (b.Y() - a.Y()) * (c.X() - a.X()) == 0.0 /*EPS*/); - } - - template - inline const T Volume(const Vec3 & a, const Vec3 & b, const Vec3 & c, const Vec3 & d) - { - return (a-d) * ((b-d) ^ (c-d)); - } -} -#endif //HACD_VECTOR_INL diff --git a/engine/inc/bullet/HACD/hacdVersion.h b/engine/inc/bullet/HACD/hacdVersion.h deleted file mode 100644 index c9f7f28d..00000000 --- a/engine/inc/bullet/HACD/hacdVersion.h +++ /dev/null @@ -1,20 +0,0 @@ -/* Copyright (c) 2011 Khaled Mamou (kmamou at gmail dot com) - All rights reserved. - - - Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - - 3. The names of the contributors may not be used to endorse or promote products derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#pragma once -#ifndef HACD_VERSION_H -#define HACD_VERSION_H -#define HACD_VERSION_MAJOR 0 -#define HACD_VERSION_MINOR 0 -#endif \ No newline at end of file diff --git a/engine/inc/bullet/Heightfield/HeightfieldExample.h b/engine/inc/bullet/Heightfield/HeightfieldExample.h deleted file mode 100644 index 258e7f70..00000000 --- a/engine/inc/bullet/Heightfield/HeightfieldExample.h +++ /dev/null @@ -1,21 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2015 Google Inc. http://bulletphysics.org - -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 HEIGHTFIELD_EXAMPLE_H -#define HEIGHTFIELD_EXAMPLE_H - -class CommonExampleInterface* HeightfieldExampleCreateFunc(struct CommonExampleOptions& options); - -#endif //HEIGHTFIELD_EXAMPLE_H \ No newline at end of file diff --git a/engine/inc/bullet/Importers/ImportBsp/BspConverter.h b/engine/inc/bullet/Importers/ImportBsp/BspConverter.h deleted file mode 100644 index 20faae66..00000000 --- a/engine/inc/bullet/Importers/ImportBsp/BspConverter.h +++ /dev/null @@ -1,36 +0,0 @@ -/* -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/engine/inc/bullet/Importers/ImportBsp/BspLoader.h b/engine/inc/bullet/Importers/ImportBsp/BspLoader.h deleted file mode 100644 index b7089cc1..00000000 --- a/engine/inc/bullet/Importers/ImportBsp/BspLoader.h +++ /dev/null @@ -1,288 +0,0 @@ -/* -=========================================================================== -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/engine/inc/bullet/Importers/ImportBsp/ImportBspExample.h b/engine/inc/bullet/Importers/ImportBsp/ImportBspExample.h deleted file mode 100644 index 71f6ca92..00000000 --- a/engine/inc/bullet/Importers/ImportBsp/ImportBspExample.h +++ /dev/null @@ -1,20 +0,0 @@ -/* -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 - -class CommonExampleInterface* ImportBspCreateFunc(struct CommonExampleOptions& options); - -#endif //BSP_DEMO_H diff --git a/engine/inc/bullet/Importers/ImportBullet/SerializeSetup.h b/engine/inc/bullet/Importers/ImportBullet/SerializeSetup.h deleted file mode 100644 index eae85c61..00000000 --- a/engine/inc/bullet/Importers/ImportBullet/SerializeSetup.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef SERIALIZE_SETUP_H -#define SERIALIZE_SETUP_H - -class CommonExampleInterface* SerializeBulletCreateFunc(struct CommonExampleOptions& options); - -#endif //SERIALIZE_SETUP_H diff --git a/engine/inc/bullet/Importers/ImportColladaDemo/ColladaGraphicsInstance.h b/engine/inc/bullet/Importers/ImportColladaDemo/ColladaGraphicsInstance.h deleted file mode 100644 index ef750d16..00000000 --- a/engine/inc/bullet/Importers/ImportColladaDemo/ColladaGraphicsInstance.h +++ /dev/null @@ -1,35 +0,0 @@ -/* -Bullet Collision Detection and Physics Library http://bulletphysics.org -This file is Copyright (c) 2014 Google Inc. - -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. - -//original author: Erwin Coumans -*/ - -#ifndef COLLADA_GRAPHICS_INSTANCE_H -#define COLLADA_GRAPHICS_INSTANCE_H - -#include "btMatrix4x4.h" - -struct ColladaGraphicsInstance -{ - ColladaGraphicsInstance() - : m_shapeIndex(-1) - { - m_worldTransform.setIdentity(); - } - btMatrix4x4 m_worldTransform; - int m_shapeIndex; //could be index into array of GLInstanceGraphicsShape - float m_color[4]; -}; - -#endif //COLLADA_GRAPHICS_INSTANCE_H diff --git a/engine/inc/bullet/Importers/ImportColladaDemo/ImportColladaSetup.h b/engine/inc/bullet/Importers/ImportColladaDemo/ImportColladaSetup.h deleted file mode 100644 index 7f37a172..00000000 --- a/engine/inc/bullet/Importers/ImportColladaDemo/ImportColladaSetup.h +++ /dev/null @@ -1,23 +0,0 @@ -/* -Bullet Collision Detection and Physics Library http://bulletphysics.org -This file is Copyright (c) 2014 Google Inc. - -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. - -//original author: Erwin Coumans -*/ - -#ifndef IMPORT_COLLADA_SETUP_H -#define IMPORT_COLLADA_SETUP_H - -class CommonExampleInterface* ImportColladaCreateFunc(struct CommonExampleOptions& options); - -#endif //IMPORT_COLLADA_SETUP_H diff --git a/engine/inc/bullet/Importers/ImportColladaDemo/LoadMeshFromCollada.h b/engine/inc/bullet/Importers/ImportColladaDemo/LoadMeshFromCollada.h deleted file mode 100644 index 16911ae6..00000000 --- a/engine/inc/bullet/Importers/ImportColladaDemo/LoadMeshFromCollada.h +++ /dev/null @@ -1,43 +0,0 @@ -/* -Bullet Collision Detection and Physics Library http://bulletphysics.org -This file is Copyright (c) 2014 Google Inc. - -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. - -//original author: Erwin Coumans -*/ - -#ifndef LOAD_MESH_FROM_COLLADA_H -#define LOAD_MESH_FROM_COLLADA_H - -#include "LinearMath/btAlignedObjectArray.h" -#include "LinearMath/btTransform.h" -#include "../../OpenGLWindow/GLInstanceGraphicsShape.h" -#include "ColladaGraphicsInstance.h" - -void LoadMeshFromCollada(const char* relativeFileName, - btAlignedObjectArray& visualShapes, - btAlignedObjectArray& visualShapeInstances, - btTransform& upAxisTrans, - float& unitMeterScaling, - int clientUpAxis, - struct CommonFileIOInterface* fileIO); - -//#define COMPARE_WITH_ASSIMP -#ifdef COMPARE_WITH_ASSIMP -void LoadMeshFromColladaAssimp(const char* relativeFileName, - btAlignedObjectArray& visualShapes, - btAlignedObjectArray& visualShapeInstances, - btTransform& upAxisTrans, - float& unitMeterScaling); -#endif //COMPARE_WITH_ASSIMP - -#endif //LOAD_MESH_FROM_COLLADA_H diff --git a/engine/inc/bullet/Importers/ImportColladaDemo/btMatrix4x4.h b/engine/inc/bullet/Importers/ImportColladaDemo/btMatrix4x4.h deleted file mode 100644 index 54e449a2..00000000 --- a/engine/inc/bullet/Importers/ImportColladaDemo/btMatrix4x4.h +++ /dev/null @@ -1,152 +0,0 @@ -/* -Bullet Collision Detection and Physics Library http://bulletphysics.org -This file is Copyright (c) 2014 Google Inc. - -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. - -//original author: Erwin Coumans -*/ - -#ifndef MATRIX4x4_H -#define MATRIX4x4_H - -#include "LinearMath/btVector3.h" -#include "LinearMath/btQuaternion.h" - -///This 4x4 matrix class is extremely limited, just created for the purpose of accumulating transform matrices in COLLADA .dae files -ATTRIBUTE_ALIGNED16(class) -btMatrix4x4 -{ - btVector4 m_el[4]; - -public: - btMatrix4x4() - { - } - btMatrix4x4(const btScalar& xx, const btScalar& xy, const btScalar& xz, const btScalar& xw, - const btScalar& yx, const btScalar& yy, const btScalar& yz, const btScalar& yw, - const btScalar& zx, const btScalar& zy, const btScalar& zz, const btScalar& zw, - const btScalar& wx, const btScalar& wy, const btScalar& wz, const btScalar& ww) - { - setValue(xx, xy, xz, xw, - yx, yy, yz, yw, - zx, zy, zz, zw, - wx, wy, wz, ww); - } - - ~btMatrix4x4() - { - } - - inline void setValue(const btScalar& xx, const btScalar& xy, const btScalar& xz, const btScalar& xw, - const btScalar& yx, const btScalar& yy, const btScalar& yz, const btScalar& yw, - const btScalar& zx, const btScalar& zy, const btScalar& zz, const btScalar& zw, - const btScalar& wx, const btScalar& wy, const btScalar& wz, const btScalar& ww) - { - m_el[0].setValue(xx, xy, xz, xw); - m_el[1].setValue(yx, yy, yz, yw); - m_el[2].setValue(zx, zy, zz, zw); - m_el[3].setValue(wx, wy, wz, ww); - } - - inline void setIdentity() - { - m_el[0].setValue(1, 0, 0, 0); - m_el[1].setValue(0, 1, 0, 0); - m_el[2].setValue(0, 0, 1, 0); - m_el[3].setValue(0, 0, 0, 1); - } - inline void setPureRotation(const btQuaternion& orn) - { - setIdentity(); - - btMatrix3x3 m3(orn); - for (int i = 0; i < 3; i++) - { - for (int j = 0; j < 3; j++) - { - m_el[i][j] = m3[i][j]; - } - } - } - - inline void setPureScaling(const btVector3& scale) - { - m_el[0].setValue(scale[0], 0, 0, 0); - m_el[1].setValue(0, scale[1], 0, 0); - m_el[2].setValue(0, 0, scale[2], 0); - m_el[3].setValue(0, 0, 0, 1); - } - - inline void setPureTranslation(const btVector3& pos) - { - m_el[0].setValue(1, 0, 0, pos[0]); - m_el[1].setValue(0, 1, 0, pos[1]); - m_el[2].setValue(0, 0, 1, pos[2]); - m_el[3].setValue(0, 0, 0, 1); - } - SIMD_FORCE_INLINE const btVector4& operator[](int i) const - { - btFullAssert(0 <= i && i < 3); - return m_el[i]; - } - - SIMD_FORCE_INLINE btScalar tdotx(const btVector4& v) const - { - return m_el[0].x() * v.x() + m_el[1].x() * v.y() + m_el[2].x() * v.z() + m_el[3].x() * v.w(); - } - SIMD_FORCE_INLINE btScalar tdoty(const btVector4& v) const - { - return m_el[0].y() * v.x() + m_el[1].y() * v.y() + m_el[2].y() * v.z() + m_el[3].y() * v.w(); - } - SIMD_FORCE_INLINE btScalar tdotz(const btVector4& v) const - { - return m_el[0].z() * v.x() + m_el[1].z() * v.y() + m_el[2].z() * v.z() + m_el[3].z() * v.w(); - } - SIMD_FORCE_INLINE btScalar tdotw(const btVector4& v) const - { - return m_el[0].w() * v.x() + m_el[1].w() * v.y() + m_el[2].w() * v.z() + m_el[3].w() * v.w(); - } - - SIMD_FORCE_INLINE btMatrix4x4& - operator*=(const btMatrix4x4& m) - { - setValue( - m.tdotx(m_el[0]), m.tdoty(m_el[0]), m.tdotz(m_el[0]), m.tdotw(m_el[0]), - m.tdotx(m_el[1]), m.tdoty(m_el[1]), m.tdotz(m_el[1]), m.tdotw(m_el[1]), - m.tdotx(m_el[2]), m.tdoty(m_el[2]), m.tdotz(m_el[2]), m.tdotw(m_el[2]), - m.tdotx(m_el[3]), m.tdoty(m_el[3]), m.tdotz(m_el[3]), m.tdotw(m_el[3])); - return *this; - } -}; - -inline btScalar btDot4(const btVector4& v0, const btVector4& v1) -{ - return v0.x() * v1.x() + v0.y() * v1.y() + v0.z() * v1.z() + v0.w() * v1.w(); -} -SIMD_FORCE_INLINE btVector3 -operator*(const btMatrix4x4& m, const btVector3& v1) -{ - btVector4 v(v1[0], v1[1], v1[2], 1); - return btVector3(btDot4(m[0], v), btDot4(m[1], v), btDot4(m[2], v)); -} - -SIMD_FORCE_INLINE btMatrix4x4 -operator*(const btMatrix4x4& m1, btMatrix4x4& m2) -{ - return btMatrix4x4( - m2.tdotx(m1[0]), m2.tdoty(m1[0]), m2.tdotz(m1[0]), m2.tdotw(m1[0]), - m2.tdotx(m1[1]), m2.tdoty(m1[1]), m2.tdotz(m1[1]), m2.tdotw(m1[1]), - m2.tdotx(m1[2]), m2.tdoty(m1[2]), m2.tdotz(m1[2]), m2.tdotw(m1[2]), - m2.tdotx(m1[3]), m2.tdoty(m1[3]), m2.tdotz(m1[3]), m2.tdotw(m1[3])); -} - -#endif //MATRIX4x4_H diff --git a/engine/inc/bullet/Importers/ImportMJCFDemo/BulletMJCFImporter.h b/engine/inc/bullet/Importers/ImportMJCFDemo/BulletMJCFImporter.h deleted file mode 100644 index d4de6b28..00000000 --- a/engine/inc/bullet/Importers/ImportMJCFDemo/BulletMJCFImporter.h +++ /dev/null @@ -1,93 +0,0 @@ -#ifndef BULLET_MJCF_IMPORTER_H -#define BULLET_MJCF_IMPORTER_H - -#include "../ImportURDFDemo/URDFImporterInterface.h" -#include "../ImportURDFDemo/UrdfRenderingInterface.h" - -struct MJCFErrorLogger -{ - virtual ~MJCFErrorLogger() {} - virtual void reportError(const char* error) = 0; - virtual void reportWarning(const char* warning) = 0; - virtual void printMessage(const char* msg) = 0; -}; - -struct MJCFURDFTexture -{ - int m_width; - int m_height; - unsigned char* textureData1; - bool m_isCached; -}; - -class BulletMJCFImporter : public URDFImporterInterface -{ - struct BulletMJCFImporterInternalData* m_data; - - void convertURDFToVisualShapeInternal(const struct UrdfVisual* visual, const char* urdfPathPrefix, const btTransform& visualTransform, btAlignedObjectArray& verticesOut, btAlignedObjectArray& indicesOut, btAlignedObjectArray& texturesOut) const; - -public: - BulletMJCFImporter(struct GUIHelperInterface* helper, UrdfRenderingInterface* customConverter, struct CommonFileIOInterface* fileIO, int flags); - virtual ~BulletMJCFImporter(); - - virtual bool parseMJCFString(const char* xmlString, MJCFErrorLogger* logger); - - virtual bool loadMJCF(const char* fileName, MJCFErrorLogger* logger, bool forceFixedBase = false); - - virtual bool loadURDF(const char* fileName, bool forceFixedBase = false) - { - return false; - } - - virtual bool loadSDF(const char* fileName, bool forceFixedBase = false) { return false; } - - virtual const char* getPathPrefix(); - - ///return >=0 for the root link index, -1 if there is no root link - virtual int getRootLinkIndex() const; - - ///pure virtual interfaces, precondition is a valid linkIndex (you can assert/terminate if the linkIndex is out of range) - virtual std::string getLinkName(int linkIndex) const; - - virtual std::string getBodyName() const; - - /// optional method to provide the link color. return true if the color is available and copied into colorRGBA, return false otherwise - virtual bool getLinkColor(int linkIndex, btVector4& colorRGBA) const; - bool getLinkColor2(int linkIndex, struct UrdfMaterialColor& matCol) const; - - //optional method to get collision group (type) and mask (affinity) - virtual int getCollisionGroupAndMask(int linkIndex, int& colGroup, int& colMask) const; - - ///this API will likely change, don't override it! - virtual bool getLinkContactInfo(int linkIndex, URDFLinkContactInfo& contactInfo) const; - - virtual std::string getJointName(int linkIndex) const; - - //fill mass and inertial data. If inertial data is missing, please initialize mass, inertia to sensitive values, and inertialFrame to identity. - virtual void getMassAndInertia(int urdfLinkIndex, btScalar& mass, btVector3& localInertiaDiagonal, btTransform& inertialFrame) const; - - ///fill an array of child link indices for this link, btAlignedObjectArray behaves like a std::vector so just use push_back and resize(0) if needed - virtual void getLinkChildIndices(int urdfLinkIndex, btAlignedObjectArray& childLinkIndices) const; - - virtual bool getJointInfo(int urdfLinkIndex, btTransform& parent2joint, btTransform& linkTransformInWorld, btVector3& jointAxisInJointSpace, int& jointType, btScalar& jointLowerLimit, btScalar& jointUpperLimit, btScalar& jointDamping, btScalar& jointFriction) const; - virtual bool getJointInfo2(int urdfLinkIndex, btTransform& parent2joint, btTransform& linkTransformInWorld, btVector3& jointAxisInJointSpace, int& jointType, btScalar& jointLowerLimit, btScalar& jointUpperLimit, btScalar& jointDamping, btScalar& jointFriction, btScalar& jointMaxForce, btScalar& jointMaxVelocity) const; - - virtual bool getRootTransformInWorld(btTransform& rootTransformInWorld) const; - - virtual int convertLinkVisualShapes(int linkIndex, const char* pathPrefix, const btTransform& inertialFrame) const; - - virtual void convertLinkVisualShapes2(int linkIndex, int urdfIndex, const char* pathPrefix, const btTransform& inertialFrame, class btCollisionObject* colObj, int objectIndex) const; - virtual void setBodyUniqueId(int bodyId); - virtual int getBodyUniqueId() const; - - virtual class btCompoundShape* convertLinkCollisionShapes(int linkIndex, const char* pathPrefix, const btTransform& localInertiaFrame) const; - virtual int getNumAllocatedCollisionShapes() const; - virtual class btCollisionShape* getAllocatedCollisionShape(int index); - virtual int getNumModels() const; - virtual void activateModel(int modelIndex); - - virtual int getNumAllocatedMeshInterfaces() const; - virtual btStridingMeshInterface* getAllocatedMeshInterface(int index); -}; - -#endif //BULLET_MJCF_IMPORTER_H diff --git a/engine/inc/bullet/Importers/ImportMJCFDemo/ImportMJCFSetup.h b/engine/inc/bullet/Importers/ImportMJCFDemo/ImportMJCFSetup.h deleted file mode 100644 index fdfa16ca..00000000 --- a/engine/inc/bullet/Importers/ImportMJCFDemo/ImportMJCFSetup.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef IMPORT_MJCF_SETUP_H -#define IMPORT_MJCF_SETUP_H - -class CommonExampleInterface* ImportMJCFCreateFunc(struct CommonExampleOptions& options); - -#endif //IMPORT_MJCF_SETUP_H diff --git a/engine/inc/bullet/Importers/ImportMeshUtility/b3ImportMeshUtility.h b/engine/inc/bullet/Importers/ImportMeshUtility/b3ImportMeshUtility.h deleted file mode 100644 index 1cff27b1..00000000 --- a/engine/inc/bullet/Importers/ImportMeshUtility/b3ImportMeshUtility.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef B3_IMPORT_MESH_UTILITY_H -#define B3_IMPORT_MESH_UTILITY_H - -#include - -enum b3ImportMeshDataFlags -{ - B3_IMPORT_MESH_HAS_RGBA_COLOR=1, - B3_IMPORT_MESH_HAS_SPECULAR_COLOR=2, -}; - -struct b3ImportMeshData -{ - struct GLInstanceGraphicsShape* m_gfxShape; - - unsigned char* m_textureImage1; //in 3 component 8-bit RGB data - bool m_isCached; - int m_textureWidth; - int m_textureHeight; - double m_rgbaColor[4]; - double m_specularColor[4]; - int m_flags; - - b3ImportMeshData() - :m_gfxShape(0), - m_textureImage1(0), - m_isCached(false), - m_textureWidth(0), - m_textureHeight(0), - m_flags(0) - { - } - -}; - -class b3ImportMeshUtility -{ -public: - static bool loadAndRegisterMeshFromFileInternal(const std::string& fileName, b3ImportMeshData& meshData, struct CommonFileIOInterface* fileIO); -}; - -#endif //B3_IMPORT_MESH_UTILITY_H diff --git a/engine/inc/bullet/Importers/ImportObjDemo/ImportObjExample.h b/engine/inc/bullet/Importers/ImportObjDemo/ImportObjExample.h deleted file mode 100644 index b14f2fe0..00000000 --- a/engine/inc/bullet/Importers/ImportObjDemo/ImportObjExample.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef IMPORT_OBJ_EXAMPLE_H -#define IMPORT_OBJ_EXAMPLE_H - -class CommonExampleInterface* ImportObjCreateFunc(struct CommonExampleOptions& options); - -#endif //IMPORT_OBJ_EXAMPLE_H diff --git a/engine/inc/bullet/Importers/ImportObjDemo/LoadMeshFromObj.h b/engine/inc/bullet/Importers/ImportObjDemo/LoadMeshFromObj.h deleted file mode 100644 index 54bc6631..00000000 --- a/engine/inc/bullet/Importers/ImportObjDemo/LoadMeshFromObj.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef LOAD_MESH_FROM_OBJ_H -#define LOAD_MESH_FROM_OBJ_H - -struct GLInstanceGraphicsShape; - -#include "../../ThirdPartyLibs/Wavefront/tiny_obj_loader.h" - -int b3IsFileCachingEnabled(); -void b3EnableFileCaching(int enable); - -std::string LoadFromCachedOrFromObj( - tinyobj::attrib_t& attribute, - std::vector& shapes, // [output] - const char* filename, - const char* mtl_basepath, - struct CommonFileIOInterface* fileIO); - -GLInstanceGraphicsShape* LoadMeshFromObj(const char* relativeFileName, const char* materialPrefixPath,struct CommonFileIOInterface* fileIO); - -#endif //LOAD_MESH_FROM_OBJ_H diff --git a/engine/inc/bullet/Importers/ImportObjDemo/Wavefront2GLInstanceGraphicsShape.h b/engine/inc/bullet/Importers/ImportObjDemo/Wavefront2GLInstanceGraphicsShape.h deleted file mode 100644 index 4054b4da..00000000 --- a/engine/inc/bullet/Importers/ImportObjDemo/Wavefront2GLInstanceGraphicsShape.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef WAVEFRONT2GRAPHICS_H -#define WAVEFRONT2GRAPHICS_H - -#include "../../ThirdPartyLibs/Wavefront/tiny_obj_loader.h" -#include - -struct GLInstanceGraphicsShape* btgCreateGraphicsShapeFromWavefrontObj(const tinyobj::attrib_t& attribute, std::vector& shapes, bool flatShading = false); - -#endif //WAVEFRONT2GRAPHICS_H diff --git a/engine/inc/bullet/Importers/ImportSDFDemo/ImportSDFSetup.h b/engine/inc/bullet/Importers/ImportSDFDemo/ImportSDFSetup.h deleted file mode 100644 index 2aeb0228..00000000 --- a/engine/inc/bullet/Importers/ImportSDFDemo/ImportSDFSetup.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef IMPORT_SDF_SETUP_H -#define IMPORT_SDF_SETUP_H - -class CommonExampleInterface* ImportSDFCreateFunc(struct CommonExampleOptions& options); - -#endif //IMPORT_SDF_SETUP_H diff --git a/engine/inc/bullet/Importers/ImportSTLDemo/ImportSTLSetup.h b/engine/inc/bullet/Importers/ImportSTLDemo/ImportSTLSetup.h deleted file mode 100644 index 5493f3f5..00000000 --- a/engine/inc/bullet/Importers/ImportSTLDemo/ImportSTLSetup.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef IMPORT_STL_SETUP_H -#define IMPORT_STL_SETUP_H - -class CommonExampleInterface* ImportSTLCreateFunc(struct CommonExampleOptions& options); - -#endif //IMPORT_OBJ_SETUP_H diff --git a/engine/inc/bullet/Importers/ImportSTLDemo/LoadMeshFromSTL.h b/engine/inc/bullet/Importers/ImportSTLDemo/LoadMeshFromSTL.h deleted file mode 100644 index 6e8dbed9..00000000 --- a/engine/inc/bullet/Importers/ImportSTLDemo/LoadMeshFromSTL.h +++ /dev/null @@ -1,107 +0,0 @@ -#ifndef LOAD_MESH_FROM_STL_H -#define LOAD_MESH_FROM_STL_H - -#include "../../OpenGLWindow/GLInstanceGraphicsShape.h" -#include //fopen -#include "Bullet3Common/b3AlignedObjectArray.h" -#include "../../CommonInterfaces/CommonFileIOInterface.h" -#include //memcpy -struct MySTLTriangle -{ - float normal[3]; - float vertex0[3]; - float vertex1[3]; - float vertex2[3]; -}; - -static GLInstanceGraphicsShape* LoadMeshFromSTL(const char* relativeFileName, struct CommonFileIOInterface* fileIO) -{ - GLInstanceGraphicsShape* shape = 0; - - int fileHandle = fileIO->fileOpen(relativeFileName, "rb"); - if (fileHandle>=0) - { - int size = 0; - size = fileIO->getFileSize(fileHandle); - { - if (size>=0) - { - //b3Warning("Open STL file of %d bytes\n",size); - char* memoryBuffer = new char[size + 1]; - int actualBytesRead = fileIO->fileRead(fileHandle, memoryBuffer, size); - if (actualBytesRead != size) - { - b3Warning("Error reading from file %s", relativeFileName); - } - else - { - int numTriangles = *(int*)&memoryBuffer[80]; - - if (numTriangles) - { - { - //perform a sanity check instead of crashing on invalid triangles/STL files - int expectedBinaryFileSize = numTriangles * 50 + 84; - if (expectedBinaryFileSize != size) - { - delete[] memoryBuffer; - fileIO->fileClose(fileHandle); - return 0; - } - } - shape = new GLInstanceGraphicsShape; - // b3AlignedObjectArray* m_vertices; - // int m_numvertices; - // b3AlignedObjectArray* m_indices; - // int m_numIndices; - // float m_scaling[4]; - shape->m_scaling[0] = 1; - shape->m_scaling[1] = 1; - shape->m_scaling[2] = 1; - shape->m_scaling[3] = 1; - int index = 0; - shape->m_indices = new b3AlignedObjectArray(); - shape->m_vertices = new b3AlignedObjectArray(); - for (int i = 0; i < numTriangles; i++) - { - char* curPtr = &memoryBuffer[84 + i * 50]; - MySTLTriangle tmp; - memcpy(&tmp, curPtr, sizeof(MySTLTriangle)); - - GLInstanceVertex v0, v1, v2; - v0.uv[0] = v1.uv[0] = v2.uv[0] = 0.5; - v0.uv[1] = v1.uv[1] = v2.uv[1] = 0.5; - for (int v = 0; v < 3; v++) - { - v0.xyzw[v] = tmp.vertex0[v]; - v1.xyzw[v] = tmp.vertex1[v]; - v2.xyzw[v] = tmp.vertex2[v]; - v0.normal[v] = v1.normal[v] = v2.normal[v] = tmp.normal[v]; - } - v0.xyzw[3] = v1.xyzw[3] = v2.xyzw[3] = 0.f; - - shape->m_vertices->push_back(v0); - shape->m_vertices->push_back(v1); - shape->m_vertices->push_back(v2); - - shape->m_indices->push_back(index++); - shape->m_indices->push_back(index++); - shape->m_indices->push_back(index++); - } - } - } - - delete[] memoryBuffer; - } - } - fileIO->fileClose(fileHandle); - } - if (shape) - { - shape->m_numIndices = shape->m_indices->size(); - shape->m_numvertices = shape->m_vertices->size(); - } - return shape; -} - -#endif //LOAD_MESH_FROM_STL_H diff --git a/engine/inc/bullet/Importers/ImportURDFDemo/BulletUrdfImporter.h b/engine/inc/bullet/Importers/ImportURDFDemo/BulletUrdfImporter.h deleted file mode 100644 index eb890c01..00000000 --- a/engine/inc/bullet/Importers/ImportURDFDemo/BulletUrdfImporter.h +++ /dev/null @@ -1,97 +0,0 @@ -#ifndef BULLET_URDF_IMPORTER_H -#define BULLET_URDF_IMPORTER_H - -#include "URDFImporterInterface.h" -#include "UrdfRenderingInterface.h" -#include "UrdfParser.h" - -struct BulletURDFTexture -{ - int m_width; - int m_height; - unsigned char* textureData1; - bool m_isCached; -}; - -///BulletURDFImporter can deal with URDF and (soon) SDF files -class BulletURDFImporter : public URDFImporterInterface -{ - struct BulletURDFInternalData* m_data; - -public: - BulletURDFImporter(struct GUIHelperInterface* helper, UrdfRenderingInterface* customConverter, struct CommonFileIOInterface* fileIO=0,double globalScaling=1, int flags=0); - - virtual ~BulletURDFImporter(); - - virtual bool loadURDF(const char* fileName, bool forceFixedBase = false); - - //warning: some quick test to load SDF: we 'activate' a model, so we can re-use URDF code path - virtual bool loadSDF(const char* fileName, bool forceFixedBase = false); - virtual int getNumModels() const; - virtual void activateModel(int modelIndex); - virtual void setBodyUniqueId(int bodyId); - virtual int getBodyUniqueId() const; - const char* getPathPrefix(); - - void printTree(); //for debugging - - virtual int getRootLinkIndex() const; - - virtual void getLinkChildIndices(int linkIndex, btAlignedObjectArray& childLinkIndices) const; - - virtual std::string getBodyName() const; - - virtual std::string getLinkName(int linkIndex) const; - - virtual bool getLinkColor(int linkIndex, btVector4& colorRGBA) const; - - virtual bool getLinkColor2(int linkIndex, UrdfMaterialColor& matCol) const; - - virtual void setLinkColor2(int linkIndex, struct UrdfMaterialColor& matCol) const; - - virtual bool getLinkContactInfo(int urdflinkIndex, URDFLinkContactInfo& contactInfo) const; - - virtual bool getLinkAudioSource(int linkIndex, SDFAudioSource& audioSource) const; - - virtual std::string getJointName(int linkIndex) const; - - virtual void getMassAndInertia(int linkIndex, btScalar& mass, btVector3& localInertiaDiagonal, btTransform& inertialFrame) const; - virtual void getMassAndInertia2(int urdfLinkIndex, btScalar& mass, btVector3& localInertiaDiagonal, btTransform& inertialFrame, int flags) const; - - virtual bool getJointInfo(int urdfLinkIndex, btTransform& parent2joint, btTransform& linkTransformInWorld, btVector3& jointAxisInJointSpace, int& jointType, btScalar& jointLowerLimit, btScalar& jointUpperLimit, btScalar& jointDamping, btScalar& jointFriction) const; - virtual bool getJointInfo2(int urdfLinkIndex, btTransform& parent2joint, btTransform& linkTransformInWorld, btVector3& jointAxisInJointSpace, int& jointType, btScalar& jointLowerLimit, btScalar& jointUpperLimit, btScalar& jointDamping, btScalar& jointFriction, btScalar& jointMaxForce, btScalar& jointMaxVelocity) const; - - virtual bool getRootTransformInWorld(btTransform& rootTransformInWorld) const; - virtual void setRootTransformInWorld(const btTransform& rootTransformInWorld); - - virtual int convertLinkVisualShapes(int linkIndex, const char* pathPrefix, const btTransform& inertialFrame) const; - - virtual void convertLinkVisualShapes2(int linkIndex, int urdfIndex, const char* pathPrefix, const btTransform& inertialFrame, class btCollisionObject* colObj, int bodyUniqueId) const; - - class btCollisionShape* convertURDFToCollisionShape(const struct UrdfCollision* collision, const char* urdfPathPrefix) const; - - virtual int getUrdfFromCollisionShape(const btCollisionShape* collisionShape, UrdfCollision& collision) const; - - ///todo(erwincoumans) refactor this convertLinkCollisionShapes/memory allocation - - virtual const struct UrdfModel* getUrdfModel() const; - - virtual class btCompoundShape* convertLinkCollisionShapes(int linkIndex, const char* pathPrefix, const btTransform& localInertiaFrame) const; - - virtual int getCollisionGroupAndMask(int linkIndex, int& colGroup, int& colMask) const; - - virtual int getNumAllocatedCollisionShapes() const; - virtual class btCollisionShape* getAllocatedCollisionShape(int index); - - virtual int getNumAllocatedMeshInterfaces() const; - virtual class btStridingMeshInterface* getAllocatedMeshInterface(int index); - - virtual int getNumAllocatedTextures() const; - virtual int getAllocatedTexture(int index) const; - - virtual void setEnableTinyRenderer(bool enable); - void convertURDFToVisualShapeInternal(const struct UrdfVisual* visual, const char* urdfPathPrefix, const class btTransform& visualTransform, btAlignedObjectArray& verticesOut, btAlignedObjectArray& indicesOut, btAlignedObjectArray& texturesOut, struct b3ImportMeshData& meshData) const; - const struct UrdfDeformable& getDeformableModel() const; -}; - -#endif //BULLET_URDF_IMPORTER_H diff --git a/engine/inc/bullet/Importers/ImportURDFDemo/ConvertRigidBodies2MultiBody.h b/engine/inc/bullet/Importers/ImportURDFDemo/ConvertRigidBodies2MultiBody.h deleted file mode 100644 index 4dbc51aa..00000000 --- a/engine/inc/bullet/Importers/ImportURDFDemo/ConvertRigidBodies2MultiBody.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef CONVERT_RIGIDBODIES_2_MULTIBODY_H -#define CONVERT_RIGIDBODIES_2_MULTIBODY_H - -struct ConvertRigidBodies2MultiBody -{ - btAlignedObjectArray m_bodies; - btAlignedObjectArray m_constraints; - - virtual void addRigidBody(btRigidBody* body); - virtual void addConstraint(btTypedConstraint* constraint, bool disableCollisionsBetweenLinkedBodies = false); - virtual btMultiBody* convertToMultiBody(); -}; -#endif //CONVERT_RIGIDBODIES_2_MULTIBODY_H diff --git a/engine/inc/bullet/Importers/ImportURDFDemo/ImportURDFSetup.h b/engine/inc/bullet/Importers/ImportURDFDemo/ImportURDFSetup.h deleted file mode 100644 index f0c6498e..00000000 --- a/engine/inc/bullet/Importers/ImportURDFDemo/ImportURDFSetup.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef IMPORT_URDF_SETUP_H -#define IMPORT_URDF_SETUP_H - -class CommonExampleInterface* ImportURDFCreateFunc(struct CommonExampleOptions& options); - -#endif //IMPORT_URDF_SETUP_H diff --git a/engine/inc/bullet/Importers/ImportURDFDemo/MultiBodyCreationInterface.h b/engine/inc/bullet/Importers/ImportURDFDemo/MultiBodyCreationInterface.h deleted file mode 100644 index 1acc47dd..00000000 --- a/engine/inc/bullet/Importers/ImportURDFDemo/MultiBodyCreationInterface.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef MULTIBODY_CREATION_INTERFACE_H -#define MULTIBODY_CREATION_INTERFACE_H - -#include "LinearMath/btTransform.h" - -class MultiBodyCreationInterface -{ -public: - virtual ~MultiBodyCreationInterface() {} - - virtual void createRigidBodyGraphicsInstance(int linkIndex, class btRigidBody* body, const btVector3& colorRgba, int graphicsIndex) = 0; - virtual void createRigidBodyGraphicsInstance2(int linkIndex, class btRigidBody* body, const btVector3& colorRgba, const btVector3& specularColor, int graphicsIndex) - { - createRigidBodyGraphicsInstance(linkIndex, body, colorRgba, graphicsIndex); - } - - ///optionally create some graphical representation from a collision object, usually for visual debugging purposes. - virtual void createCollisionObjectGraphicsInstance(int linkIndex, class btCollisionObject* col, const btVector3& colorRgba) = 0; - virtual void createCollisionObjectGraphicsInstance2(int linkIndex, class btCollisionObject* col, const btVector4& colorRgba, const btVector3& specularColor) - { - createCollisionObjectGraphicsInstance(linkIndex, col, colorRgba); - } - - virtual class btMultiBody* allocateMultiBody(int urdfLinkIndex, int totalNumJoints, btScalar mass, const btVector3& localInertiaDiagonal, bool isFixedBase, bool canSleep) = 0; - - virtual class btRigidBody* allocateRigidBody(int urdfLinkIndex, btScalar mass, const btVector3& localInertiaDiagonal, const btTransform& initialWorldTrans, class btCollisionShape* colShape) = 0; - - virtual class btGeneric6DofSpring2Constraint* allocateGeneric6DofSpring2Constraint(int urdfLinkIndex, btRigidBody& rbA /*parent*/, btRigidBody& rbB, const btTransform& offsetInA, const btTransform& offsetInB, int rotateOrder = 0) = 0; - - virtual class btGeneric6DofSpring2Constraint* createPrismaticJoint(int urdfLinkIndex, btRigidBody& rbA /*parent*/, btRigidBody& rbB, const btTransform& offsetInA, const btTransform& offsetInB, - const btVector3& jointAxisInJointSpace, btScalar jointLowerLimit, btScalar jointUpperLimit) = 0; - virtual class btGeneric6DofSpring2Constraint* createRevoluteJoint(int urdfLinkIndex, btRigidBody& rbA /*parent*/, btRigidBody& rbB, const btTransform& offsetInA, const btTransform& offsetInB, - const btVector3& jointAxisInJointSpace, btScalar jointLowerLimit, btScalar jointUpperLimit) = 0; - - virtual class btGeneric6DofSpring2Constraint* createFixedJoint(int urdfLinkIndex, btRigidBody& rbA /*parent*/, btRigidBody& rbB, const btTransform& offsetInA, const btTransform& offsetInB) = 0; - - virtual class btMultiBodyLinkCollider* allocateMultiBodyLinkCollider(int urdfLinkIndex, int mbLinkIndex, btMultiBody* body) = 0; - - virtual void addLinkMapping(int urdfLinkIndex, int mbLinkIndex) = 0; -}; - -#endif //MULTIBODY_CREATION_INTERFACE_H \ No newline at end of file diff --git a/engine/inc/bullet/Importers/ImportURDFDemo/MyMultiBodyCreator.h b/engine/inc/bullet/Importers/ImportURDFDemo/MyMultiBodyCreator.h deleted file mode 100644 index c2885236..00000000 --- a/engine/inc/bullet/Importers/ImportURDFDemo/MyMultiBodyCreator.h +++ /dev/null @@ -1,80 +0,0 @@ - -#ifndef MY_MULTIBODY_CREATOR -#define MY_MULTIBODY_CREATOR - -#include "MultiBodyCreationInterface.h" -#include "LinearMath/btAlignedObjectArray.h" -#include "LinearMath/btHashMap.h" - -struct GUIHelperInterface; -class btMultiBody; - -struct GenericConstraintUserInfo -{ - int m_urdfIndex; - int m_urdfJointType; - btVector3 m_jointAxisInJointSpace; - int m_jointAxisIndex; - btScalar m_lowerJointLimit; - btScalar m_upperJointLimit; -}; - -class MyMultiBodyCreator : public MultiBodyCreationInterface -{ -protected: - btMultiBody* m_bulletMultiBody; - btRigidBody* m_rigidBody; - - struct GUIHelperInterface* m_guiHelper; - - btAlignedObjectArray m_6DofConstraints; - -public: - btAlignedObjectArray m_mb2urdfLink; - - MyMultiBodyCreator(GUIHelperInterface* guiHelper); - - virtual ~MyMultiBodyCreator() {} - - virtual void createRigidBodyGraphicsInstance(int linkIndex, class btRigidBody* body, const btVector3& colorRgba, int graphicsIndex); - virtual void createRigidBodyGraphicsInstance2(int linkIndex, class btRigidBody* body, const btVector3& colorRgba, const btVector3& specularColor, int graphicsIndex); - - ///optionally create some graphical representation from a collision object, usually for visual debugging purposes. - virtual void createCollisionObjectGraphicsInstance(int linkIndex, class btCollisionObject* col, const btVector3& colorRgba); - virtual void createCollisionObjectGraphicsInstance2(int linkIndex, class btCollisionObject* col, const btVector4& colorRgba, const btVector3& specularColor); - - virtual class btMultiBody* allocateMultiBody(int urdfLinkIndex, int totalNumJoints, btScalar mass, const btVector3& localInertiaDiagonal, bool isFixedBase, bool canSleep); - - virtual class btRigidBody* allocateRigidBody(int urdfLinkIndex, btScalar mass, const btVector3& localInertiaDiagonal, const btTransform& initialWorldTrans, class btCollisionShape* colShape); - - virtual class btGeneric6DofSpring2Constraint* allocateGeneric6DofSpring2Constraint(int urdfLinkIndex, btRigidBody& rbA /*parent*/, btRigidBody& rbB, const btTransform& offsetInA, const btTransform& offsetInB, int rotateOrder = 0); - - virtual class btGeneric6DofSpring2Constraint* createPrismaticJoint(int urdfLinkIndex, btRigidBody& rbA /*parent*/, btRigidBody& rbB, const btTransform& offsetInA, const btTransform& offsetInB, - const btVector3& jointAxisInJointSpace, btScalar jointLowerLimit, btScalar jointUpperLimit); - virtual class btGeneric6DofSpring2Constraint* createRevoluteJoint(int urdfLinkIndex, btRigidBody& rbA /*parent*/, btRigidBody& rbB, const btTransform& offsetInA, const btTransform& offsetInB, - const btVector3& jointAxisInJointSpace, btScalar jointLowerLimit, btScalar jointUpperLimit); - - virtual class btGeneric6DofSpring2Constraint* createFixedJoint(int urdfLinkIndex, btRigidBody& rbA /*parent*/, btRigidBody& rbB, const btTransform& offsetInA, const btTransform& offsetInB); - - virtual class btMultiBodyLinkCollider* allocateMultiBodyLinkCollider(int urdfLinkIndex, int mbLinkIndex, btMultiBody* body); - - virtual void addLinkMapping(int urdfLinkIndex, int mbLinkIndex); - - btMultiBody* getBulletMultiBody(); - btRigidBody* getRigidBody() - { - return m_rigidBody; - } - - int getNum6DofConstraints() const - { - return m_6DofConstraints.size(); - } - - btGeneric6DofSpring2Constraint* get6DofConstraint(int index) - { - return m_6DofConstraints[index]; - } -}; - -#endif //MY_MULTIBODY_CREATOR diff --git a/engine/inc/bullet/Importers/ImportURDFDemo/SDFAudioTypes.h b/engine/inc/bullet/Importers/ImportURDFDemo/SDFAudioTypes.h deleted file mode 100644 index d3928f3b..00000000 --- a/engine/inc/bullet/Importers/ImportURDFDemo/SDFAudioTypes.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef SDF_AUDIO_TYPES_H -#define SDF_AUDIO_TYPES_H - -#include - -///See audio_source element in http://sdformat.org/spec?ver=1.6&elem=link -struct SDFAudioSource -{ - enum - { - SDFAudioSourceValid = 1, - SDFAudioSourceLooping = 2, - }; - - int m_flags; //repeat mode (0 = no repeat, 1 = loop forever) - - std::string m_uri; //media filename of the sound, .wav file - double m_pitch; //1 = regular rate, -1 play in reverse - double m_gain; //normalized volume in range [0..1] where 0 is silent, 1 is most loud - - double m_attackRate; - double m_decayRate; - double m_sustainLevel; - double m_releaseRate; - - double m_collisionForceThreshold; //force that will trigger the audio, in Newton. If < 0, audio source is invalid - - int m_userIndex; - - SDFAudioSource() - : m_flags(0), - m_pitch(1), - m_gain(1), - m_attackRate(0.0001), - m_decayRate(0.00001), - m_sustainLevel(0.5), - m_releaseRate(0.0005), - m_collisionForceThreshold(0.5), - m_userIndex(-1) - { - } -}; - -#endif //SDF_AUDIO_TYPES_H diff --git a/engine/inc/bullet/Importers/ImportURDFDemo/URDF2Bullet.h b/engine/inc/bullet/Importers/ImportURDFDemo/URDF2Bullet.h deleted file mode 100644 index 233091c1..00000000 --- a/engine/inc/bullet/Importers/ImportURDFDemo/URDF2Bullet.h +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef _URDF2BULLET_H -#define _URDF2BULLET_H -#include "LinearMath/btAlignedObjectArray.h" -#include "LinearMath/btTransform.h" -#include -#include "URDFJointTypes.h" //for UrdfMaterialColor cache - -class btVector3; -class btTransform; -class btMultiBodyDynamicsWorld; -class btTransform; - -class URDFImporterInterface; -class MultiBodyCreationInterface; - - - -struct UrdfVisualShapeCache -{ - btAlignedObjectArray m_cachedUrdfLinkColors; - btAlignedObjectArray m_cachedUrdfLinkVisualShapeIndices; -}; - -void ConvertURDF2Bullet(const URDFImporterInterface& u2b, - MultiBodyCreationInterface& creationCallback, - const btTransform& rootTransformInWorldSpace, - btMultiBodyDynamicsWorld* world, - bool createMultiBody, - const char* pathPrefix, - int flags = 0, - UrdfVisualShapeCache* cachedLinkGraphicsShapes = 0); - -#endif //_URDF2BULLET_H diff --git a/engine/inc/bullet/Importers/ImportURDFDemo/URDFImporterInterface.h b/engine/inc/bullet/Importers/ImportURDFDemo/URDFImporterInterface.h deleted file mode 100644 index 0bf494b0..00000000 --- a/engine/inc/bullet/Importers/ImportURDFDemo/URDFImporterInterface.h +++ /dev/null @@ -1,103 +0,0 @@ -#ifndef URDF_IMPORTER_INTERFACE_H -#define URDF_IMPORTER_INTERFACE_H - -#include -#include "LinearMath/btAlignedObjectArray.h" -#include "LinearMath/btTransform.h" -#include "URDFJointTypes.h" -#include "SDFAudioTypes.h" - -class URDFImporterInterface -{ -public: - virtual ~URDFImporterInterface() {} - - virtual bool loadURDF(const char* fileName, bool forceFixedBase = false) = 0; - - virtual bool loadSDF(const char* fileName, bool forceFixedBase = false) { return false; } - - virtual const char* getPathPrefix() = 0; - - ///return >=0 for the root link index, -1 if there is no root link - virtual int getRootLinkIndex() const = 0; - - ///pure virtual interfaces, precondition is a valid linkIndex (you can assert/terminate if the linkIndex is out of range) - virtual std::string getLinkName(int linkIndex) const = 0; - - //various derived class in internal source code break with new pure virtual methods, so provide some default implementation - virtual std::string getBodyName() const - { - return ""; - } - - /// optional method to provide the link color. return true if the color is available and copied into colorRGBA, return false otherwise - virtual bool getLinkColor(int linkIndex, btVector4& colorRGBA) const { return false; } - - virtual bool getLinkColor2(int linkIndex, struct UrdfMaterialColor& matCol) const { return false; } - virtual void setLinkColor2(int linkIndex, struct UrdfMaterialColor& matCol) const {} - - virtual int getCollisionGroupAndMask(int linkIndex, int& colGroup, int& colMask) const { return 0; } - ///this API will likely change, don't override it! - virtual bool getLinkContactInfo(int linkIndex, URDFLinkContactInfo& contactInfo) const { return false; } - - virtual bool getLinkAudioSource(int linkIndex, SDFAudioSource& audioSource) const { return false; } - - virtual std::string getJointName(int linkIndex) const = 0; - - //fill mass and inertial data. If inertial data is missing, please initialize mass, inertia to sensitive values, and inertialFrame to identity. - virtual void getMassAndInertia(int urdfLinkIndex, btScalar& mass, btVector3& localInertiaDiagonal, btTransform& inertialFrame) const = 0; - virtual void getMassAndInertia2(int urdfLinkIndex, btScalar& mass, btVector3& localInertiaDiagonal, btTransform& inertialFrame, int flags) const - { - getMassAndInertia(urdfLinkIndex, mass, localInertiaDiagonal, inertialFrame); - } - - ///fill an array of child link indices for this link, btAlignedObjectArray behaves like a std::vector so just use push_back and resize(0) if needed - virtual void getLinkChildIndices(int urdfLinkIndex, btAlignedObjectArray& childLinkIndices) const = 0; - - virtual bool getJointInfo(int urdfLinkIndex, btTransform& parent2joint, btTransform& linkTransformInWorld, btVector3& jointAxisInJointSpace, int& jointType, btScalar& jointLowerLimit, btScalar& jointUpperLimit, btScalar& jointDamping, btScalar& jointFriction) const = 0; - - virtual bool getJointInfo2(int urdfLinkIndex, btTransform& parent2joint, btTransform& linkTransformInWorld, btVector3& jointAxisInJointSpace, int& jointType, btScalar& jointLowerLimit, btScalar& jointUpperLimit, btScalar& jointDamping, btScalar& jointFriction, btScalar& jointMaxForce, btScalar& jointMaxVelocity) const - { - //backwards compatibility for custom file importers - jointMaxForce = 0; - jointMaxVelocity = 0; - return getJointInfo(urdfLinkIndex, parent2joint, linkTransformInWorld, jointAxisInJointSpace, jointType, jointLowerLimit, jointUpperLimit, jointDamping, jointFriction); - }; - - virtual bool getRootTransformInWorld(btTransform& rootTransformInWorld) const = 0; - virtual void setRootTransformInWorld(const btTransform& rootTransformInWorld) {} - - ///quick hack: need to rethink the API/dependencies of this - virtual int convertLinkVisualShapes(int linkIndex, const char* pathPrefix, const btTransform& inertialFrame) const { return -1; } - - virtual void convertLinkVisualShapes2(int linkIndex, int urdfIndex, const char* pathPrefix, const btTransform& inertialFrame, class btCollisionObject* colObj, int objectIndex) const {} - virtual void setBodyUniqueId(int bodyId) {} - virtual int getBodyUniqueId() const { return 0; } - - //default implementation for backward compatibility - virtual class btCompoundShape* convertLinkCollisionShapes(int linkIndex, const char* pathPrefix, const btTransform& localInertiaFrame) const = 0; - virtual int getUrdfFromCollisionShape(const class btCollisionShape* collisionShape, struct UrdfCollision& collision) const - { - return 0; - } - - virtual const struct UrdfLink* getUrdfLink(int urdfLinkIndex) const - { - return 0; - } - - virtual const struct UrdfModel* getUrdfModel() const { return 0; }; - - virtual int getNumAllocatedCollisionShapes() const { return 0; } - virtual class btCollisionShape* getAllocatedCollisionShape(int /*index*/) { return 0; } - virtual int getNumModels() const { return 0; } - virtual void activateModel(int /*modelIndex*/) {} - virtual int getNumAllocatedMeshInterfaces() const { return 0; } - - virtual int getNumAllocatedTextures() const { return 0; } - virtual int getAllocatedTexture(int index) const { return 0; } - - virtual class btStridingMeshInterface* getAllocatedMeshInterface(int index) { return 0; } -}; - -#endif //URDF_IMPORTER_INTERFACE_H diff --git a/engine/inc/bullet/Importers/ImportURDFDemo/URDFJointTypes.h b/engine/inc/bullet/Importers/ImportURDFDemo/URDFJointTypes.h deleted file mode 100644 index fff0fee2..00000000 --- a/engine/inc/bullet/Importers/ImportURDFDemo/URDFJointTypes.h +++ /dev/null @@ -1,111 +0,0 @@ -#ifndef URDF_JOINT_TYPES_H -#define URDF_JOINT_TYPES_H - -#include "LinearMath/btScalar.h" -#include "LinearMath/btVector3.h" - -enum UrdfJointTypes -{ - URDFRevoluteJoint = 1, - URDFPrismaticJoint, - URDFContinuousJoint, - URDFFloatingJoint, - URDFPlanarJoint, - URDFFixedJoint, - URDFSphericalJoint, - -}; - -enum URDF_LinkContactFlags -{ - URDF_CONTACT_HAS_LATERAL_FRICTION = 1, - URDF_CONTACT_HAS_INERTIA_SCALING = 2, - URDF_CONTACT_HAS_CONTACT_CFM = 4, - URDF_CONTACT_HAS_CONTACT_ERP = 8, - URDF_CONTACT_HAS_STIFFNESS_DAMPING = 16, - URDF_CONTACT_HAS_ROLLING_FRICTION = 32, - URDF_CONTACT_HAS_SPINNING_FRICTION = 64, - URDF_CONTACT_HAS_RESTITUTION = 128, - URDF_CONTACT_HAS_FRICTION_ANCHOR = 256, - -}; - -struct URDFLinkContactInfo -{ - btScalar m_lateralFriction; - btScalar m_rollingFriction; - btScalar m_spinningFriction; - btScalar m_restitution; - btScalar m_inertiaScaling; - btScalar m_contactCfm; - btScalar m_contactErp; - btScalar m_contactStiffness; - btScalar m_contactDamping; - - int m_flags; - - URDFLinkContactInfo() - : m_lateralFriction(0.5), - m_rollingFriction(0), - m_spinningFriction(0), - m_restitution(0), - m_inertiaScaling(1), - m_contactCfm(0), - m_contactErp(0), - m_contactStiffness(1e4), - m_contactDamping(1) - { - m_flags = URDF_CONTACT_HAS_LATERAL_FRICTION; - } -}; - -enum UrdfCollisionFlags -{ - URDF_FORCE_CONCAVE_TRIMESH = 1, - URDF_HAS_COLLISION_GROUP = 2, - URDF_HAS_COLLISION_MASK = 4, -}; - -struct UrdfMaterialColor -{ - btVector4 m_rgbaColor; - btVector3 m_specularColor; - UrdfMaterialColor() - : m_rgbaColor(0.8, 0.8, 0.8, 1), - m_specularColor(0.4, 0.4, 0.4) - { - } -}; - -//manually sync with eURDF_Flags in SharedMemoryPublic.h! -enum ConvertURDFFlags -{ - CUF_USE_SDF = 1, - // Use inertia values in URDF instead of recomputing them from collision shape. - CUF_USE_URDF_INERTIA = 2, - CUF_USE_MJCF = 4, - CUF_USE_SELF_COLLISION = 8, - CUF_USE_SELF_COLLISION_EXCLUDE_PARENT = 16, - CUF_USE_SELF_COLLISION_EXCLUDE_ALL_PARENTS = 32, - CUF_RESERVED = 64, - CUF_USE_IMPLICIT_CYLINDER = 128, - CUF_GLOBAL_VELOCITIES_MB = 256, - CUF_MJCF_COLORS_FROM_FILE = 512, - CUF_ENABLE_CACHED_GRAPHICS_SHAPES = 1024, - CUF_ENABLE_SLEEPING = 2048, - CUF_INITIALIZE_SAT_FEATURES = 4096, - CUF_USE_SELF_COLLISION_INCLUDE_PARENT = 8192, - CUF_PARSE_SENSORS = 16384, - CUF_USE_MATERIAL_COLORS_FROM_MTL = 32768, - CUF_USE_MATERIAL_TRANSPARANCY_FROM_MTL = 65536, - CUF_MAINTAIN_LINK_ORDER = 131072, - CUF_ENABLE_WAKEUP = 1 << 18, - CUF_MERGE_FIXED_LINKS = 1 << 19, - CUF_IGNORE_VISUAL_SHAPES = 1 << 20, - CUF_IGNORE_COLLISION_SHAPES = 1 << 21, - CUF_PRINT_URDF_INFO = 1 << 22, - CUF_GOOGLEY_UNDEFINED_COLORS = 1 << 23, - -}; - -#endif //URDF_JOINT_TYPES_H diff --git a/engine/inc/bullet/Importers/ImportURDFDemo/UrdfFindMeshFile.h b/engine/inc/bullet/Importers/ImportURDFDemo/UrdfFindMeshFile.h deleted file mode 100644 index 1c92d064..00000000 --- a/engine/inc/bullet/Importers/ImportURDFDemo/UrdfFindMeshFile.h +++ /dev/null @@ -1,112 +0,0 @@ - -#ifndef URDF_FIND_MESH_FILE_H -#define URDF_FIND_MESH_FILE_H - -#include "../../CommonInterfaces/CommonFileIOInterface.h" -#include "Bullet3Common/b3Logging.h" - -#include -#include - -#include "UrdfParser.h" - -static bool UrdfFindMeshFile( - CommonFileIOInterface* fileIO, - const std::string& urdf_path, std::string fn, - const std::string& error_message_prefix, - std::string* out_found_filename, int* out_type) -{ - if (fn.size() <= 4) - { - b3Warning("%s: invalid mesh filename '%s'\n", error_message_prefix.c_str(), fn.c_str()); - return false; - } - - std::string ext; - std::string ext_ = fn.substr(fn.size() - 4); - for (std::string::iterator i = ext_.begin(); i != ext_.end(); ++i) - { - ext += char(tolower(*i)); - } - - if (ext == ".dae") - { - *out_type = UrdfGeometry::FILE_COLLADA; - } - else if (ext == ".stl") - { - *out_type = UrdfGeometry::FILE_STL; - } - else if (ext == ".obj") - { - *out_type = UrdfGeometry::FILE_OBJ; - } - else if (ext == ".cdf") - { - *out_type = UrdfGeometry::FILE_CDF; - } - else if (ext == ".vtk") - { - *out_type = UrdfGeometry::FILE_VTK; - } - else - { - b3Warning("%s: invalid mesh filename extension '%s'\n", error_message_prefix.c_str(), ext.c_str()); - return false; - } - - std::string drop_it_file = "file://"; - std::string drop_it_pack = "package://"; - std::string drop_it_model = "model://"; - if (fn.substr(0, drop_it_file.length()) == drop_it_file) - fn = fn.substr(drop_it_file.length()); - if (fn.substr(0, drop_it_pack.length()) == drop_it_pack) - fn = fn.substr(drop_it_pack.length()); - else if (fn.substr(0, drop_it_model.length()) == drop_it_model) - fn = fn.substr(drop_it_model.length()); - - std::list shorter; - shorter.push_back("../../"); - shorter.push_back("../"); - shorter.push_back("./"); - int cnt = urdf_path.size(); - for (int i = 0; i < cnt; ++i) - { - if (urdf_path[i] == '/' || urdf_path[i] == '\\') - { - shorter.push_back(urdf_path.substr(0, i) + "/"); - } - } - shorter.push_back(""); // no prefix - shorter.reverse(); - - std::string existing_file; - - for (std::list::iterator x = shorter.begin(); x != shorter.end(); ++x) - { - std::string attempt = *x + fn; - int f = fileIO->fileOpen(attempt.c_str(), "rb"); - if (f<0) - { - //b3Printf("%s: tried '%s'", error_message_prefix.c_str(), attempt.c_str()); - continue; - } - fileIO->fileClose(f); - existing_file = attempt; - //b3Printf("%s: found '%s'", error_message_prefix.c_str(), attempt.c_str()); - break; - } - - if (existing_file.empty()) - { - b3Warning("%s: cannot find '%s' in any directory in urdf path\n", error_message_prefix.c_str(), fn.c_str()); - return false; - } - else - { - *out_found_filename = existing_file; - return true; - } -} - -#endif //URDF_FIND_MESH_FILE_H diff --git a/engine/inc/bullet/Importers/ImportURDFDemo/UrdfParser.h b/engine/inc/bullet/Importers/ImportURDFDemo/UrdfParser.h deleted file mode 100644 index efe51b70..00000000 --- a/engine/inc/bullet/Importers/ImportURDFDemo/UrdfParser.h +++ /dev/null @@ -1,426 +0,0 @@ -#ifndef URDF_PARSER_H -#define URDF_PARSER_H - -#include "LinearMath/btTransform.h" -#include "LinearMath/btAlignedObjectArray.h" -#include "LinearMath/btHashMap.h" -#include "URDFJointTypes.h" -#include "SDFAudioTypes.h" -#include - -#define btArray btAlignedObjectArray - -struct ErrorLogger -{ - virtual ~ErrorLogger() {} - virtual void reportError(const char* error) = 0; - virtual void reportWarning(const char* warning) = 0; - virtual void printMessage(const char* msg) = 0; -}; - -struct UrdfMaterial -{ - std::string m_name; - std::string m_textureFilename; - UrdfMaterialColor m_matColor; - - UrdfMaterial() - { - } -}; - -struct UrdfInertia -{ - btTransform m_linkLocalFrame; - bool m_hasLinkLocalFrame; - - double m_mass; - double m_ixx, m_ixy, m_ixz, m_iyy, m_iyz, m_izz; - - UrdfInertia() - { - m_hasLinkLocalFrame = false; - m_linkLocalFrame.setIdentity(); - m_mass = 0.f; - m_ixx = m_ixy = m_ixz = m_iyy = m_iyz = m_izz = 0.f; - } -}; - -enum UrdfGeomTypes -{ - URDF_GEOM_SPHERE = 2, - URDF_GEOM_BOX, - URDF_GEOM_CYLINDER, - URDF_GEOM_MESH, - URDF_GEOM_PLANE, - URDF_GEOM_CAPSULE, //non-standard URDF - URDF_GEOM_CDF, //signed-distance-field, non-standard URDF - URDF_GEOM_HEIGHTFIELD, //heightfield, non-standard URDF - URDF_GEOM_UNKNOWN, -}; - -struct UrdfGeometry -{ - UrdfGeomTypes m_type; - - double m_sphereRadius; - - btVector3 m_boxSize; - - double m_capsuleRadius; - double m_capsuleHeight; - int m_hasFromTo; - btVector3 m_capsuleFrom; - btVector3 m_capsuleTo; - - btVector3 m_planeNormal; - - enum - { - FILE_STL = 1, - FILE_COLLADA = 2, - FILE_OBJ = 3, - FILE_CDF = 4, - MEMORY_VERTICES = 5, - FILE_VTK = 6, - - }; - int m_meshFileType; - std::string m_meshFileName; - btVector3 m_meshScale; - - btArray m_vertices; - btArray m_uvs; - btArray m_normals; - btArray m_indices; - - - UrdfMaterial m_localMaterial; - bool m_hasLocalMaterial; - - UrdfGeometry() - : m_type(URDF_GEOM_UNKNOWN), - m_sphereRadius(1), - m_boxSize(1, 1, 1), - m_capsuleRadius(1), - m_capsuleHeight(1), - m_hasFromTo(0), - m_capsuleFrom(0, 1, 0), - m_capsuleTo(1, 0, 0), - m_planeNormal(0, 0, 1), - m_meshFileType(0), - m_meshScale(1, 1, 1), - m_hasLocalMaterial(false) - { - } -}; - - -struct UrdfShape -{ - std::string m_sourceFileLocation; - btTransform m_linkLocalFrame; - UrdfGeometry m_geometry; - std::string m_name; -}; - -struct UrdfVisual : UrdfShape -{ - std::string m_materialName; - // Maps user data keys to user data values. - btHashMap m_userData; -}; - -struct UrdfCollision : UrdfShape -{ - int m_flags; - int m_collisionGroup; - int m_collisionMask; - UrdfCollision() - : m_flags(0) - { - } -}; - -struct UrdfJoint; - -struct UrdfLink -{ - std::string m_name; - UrdfInertia m_inertia; - btTransform m_linkTransformInWorld; - btArray m_visualArray; - btArray m_collisionArray; - UrdfLink* m_parentLink; - UrdfJoint* m_parentJoint; - - btArray m_childJoints; - btArray m_childLinks; - - int m_linkIndex; - - URDFLinkContactInfo m_contactInfo; - - SDFAudioSource m_audioSource; - // Maps user data keys to user data values. - btHashMap m_userData; - - UrdfLink() - : m_parentLink(0), - m_parentJoint(0), - m_linkIndex(-2) - { - } -}; -struct UrdfJoint -{ - std::string m_name; - UrdfJointTypes m_type; - btTransform m_parentLinkToJointTransform; - std::string m_parentLinkName; - std::string m_childLinkName; - btVector3 m_localJointAxis; - - double m_lowerLimit; - double m_upperLimit; - - double m_effortLimit; - double m_velocityLimit; - - double m_jointDamping; - double m_jointFriction; - UrdfJoint() - : m_lowerLimit(0), - m_upperLimit(-1), - m_effortLimit(0), - m_velocityLimit(0), - m_jointDamping(0), - m_jointFriction(0) - { - } -}; - -struct SpringCoeffcients -{ - double elastic_stiffness; - double damping_stiffness; - double bending_stiffness; - int damp_all_directions; - int bending_stride; - SpringCoeffcients() : elastic_stiffness(0.), - damping_stiffness(0.), - bending_stiffness(0.), - damp_all_directions(0), - bending_stride(2) {} -}; - -struct LameCoefficients -{ - double mu; - double lambda; - double damping; - LameCoefficients() : mu(0.), lambda(0.), damping(0.) {} -}; - -struct UrdfDeformable -{ - std::string m_name; - double m_mass; - double m_collisionMargin; - double m_friction; - double m_repulsionStiffness; - double m_gravFactor; - bool m_cache_barycenter; - - SpringCoeffcients m_springCoefficients; - LameCoefficients m_corotatedCoefficients; - LameCoefficients m_neohookeanCoefficients; - - std::string m_visualFileName; - std::string m_simFileName; - btHashMap m_userData; - - UrdfDeformable() : m_mass(1.), m_collisionMargin(0.02), m_friction(1.), m_repulsionStiffness(0.5), m_gravFactor(1.), m_cache_barycenter(false), m_visualFileName(""), m_simFileName("") - { - } -}; - -struct UrdfModel -{ - std::string m_name; - std::string m_sourceFile; - btTransform m_rootTransformInWorld; - btHashMap m_materials; - btHashMap m_links; - btHashMap m_joints; - UrdfDeformable m_deformable; - // Maps user data keys to user data values. - btHashMap m_userData; - - btArray m_rootLinks; - bool m_overrideFixedBase; - - UrdfModel() - : m_overrideFixedBase(false) - { - m_rootTransformInWorld.setIdentity(); - } - - ~UrdfModel() - { - for (int i = 0; i < m_materials.size(); i++) - { - UrdfMaterial** ptr = m_materials.getAtIndex(i); - if (ptr) - { - UrdfMaterial* t = *ptr; - delete t; - } - } - for (int i = 0; i < m_links.size(); i++) - { - UrdfLink** ptr = m_links.getAtIndex(i); - if (ptr) - { - UrdfLink* t = *ptr; - delete t; - } - } - for (int i = 0; i < m_joints.size(); i++) - { - UrdfJoint** ptr = m_joints.getAtIndex(i); - if (ptr) - { - UrdfJoint* t = *ptr; - delete t; - } - } - } -}; - -namespace tinyxml2 -{ -class XMLElement; -}; - -class UrdfParser -{ -protected: - UrdfModel m_urdf2Model; - btAlignedObjectArray m_sdfModels; - btAlignedObjectArray m_tmpModels; - - bool m_parseSDF; - int m_activeSdfModel; - - btScalar m_urdfScaling; - - struct CommonFileIOInterface* m_fileIO; - - bool parseTransform(btTransform& tr, tinyxml2::XMLElement* xml, ErrorLogger* logger, bool parseSDF = false); - bool parseInertia(UrdfInertia& inertia, tinyxml2::XMLElement* config, ErrorLogger* logger); - bool parseGeometry(UrdfGeometry& geom, tinyxml2::XMLElement* g, ErrorLogger* logger); - bool parseVisual(UrdfModel& model, UrdfVisual& visual, tinyxml2::XMLElement* config, ErrorLogger* logger); - bool parseCollision(UrdfCollision& collision, tinyxml2::XMLElement* config, ErrorLogger* logger); - bool initTreeAndRoot(UrdfModel& model, ErrorLogger* logger); - bool parseMaterial(UrdfMaterial& material, tinyxml2::XMLElement* config, ErrorLogger* logger); - bool parseJointLimits(UrdfJoint& joint, tinyxml2::XMLElement* config, ErrorLogger* logger); - bool parseJointDynamics(UrdfJoint& joint, tinyxml2::XMLElement* config, ErrorLogger* logger); - bool parseJoint(UrdfJoint& joint, tinyxml2::XMLElement* config, ErrorLogger* logger); - bool parseLink(UrdfModel& model, UrdfLink& link, tinyxml2::XMLElement* config, ErrorLogger* logger); - bool parseSensor(UrdfModel& model, UrdfLink& link, UrdfJoint& joint, tinyxml2::XMLElement* config, ErrorLogger* logger); - bool parseLameCoefficients(LameCoefficients& lameCoefficients, tinyxml2::XMLElement* config, ErrorLogger* logger); - bool parseDeformable(UrdfModel& model, tinyxml2::XMLElement* config, ErrorLogger* logger); - - -public: - UrdfParser(struct CommonFileIOInterface* fileIO); - virtual ~UrdfParser(); - - void setParseSDF(bool useSDF) - { - m_parseSDF = useSDF; - } - bool getParseSDF() const - { - return m_parseSDF; - } - void setGlobalScaling(btScalar scaling) - { - m_urdfScaling = scaling; - } - - bool loadUrdf(const char* urdfText, ErrorLogger* logger, bool forceFixedBase, bool parseSensors); - - bool loadUrdf(const char* urdfText, ErrorLogger* logger, bool forceFixedBase) - { - return loadUrdf(urdfText, logger, forceFixedBase, false); - } - - bool loadSDF(const char* sdfText, ErrorLogger* logger); - - int getNumModels() const - { - //user should have loaded an SDF when calling this method - if (m_parseSDF) - { - return m_sdfModels.size(); - } - return 1; - } - - void activateModel(int modelIndex); - - UrdfModel& getModelByIndex(int index) - { - //user should have loaded an SDF when calling this method - btAssert(m_parseSDF); - - return *m_sdfModels[index]; - } - - const UrdfModel& getModelByIndex(int index) const - { - //user should have loaded an SDF when calling this method - btAssert(m_parseSDF); - - return *m_sdfModels[index]; - } - - const UrdfModel& getModel() const - { - if (m_parseSDF) - { - return *m_sdfModels[m_activeSdfModel]; - } - - return m_urdf2Model; - } - - UrdfModel& getModel() - { - if (m_parseSDF) - { - return *m_sdfModels[m_activeSdfModel]; - } - return m_urdf2Model; - } - - const UrdfDeformable& getDeformable() const - { - return m_urdf2Model.m_deformable; - } - - bool mergeFixedLinks(UrdfModel& model, UrdfLink* link, ErrorLogger* logger, bool forceFixedBase, int level); - bool printTree(UrdfLink* link, ErrorLogger* logger, int level); - bool recreateModel(UrdfModel& model, UrdfLink* link, ErrorLogger* logger); - - std::string sourceFileLocation(tinyxml2::XMLElement* e); - - void setSourceFile(const std::string& sourceFile) - { - m_urdf2Model.m_sourceFile = sourceFile; - } -}; - -#endif diff --git a/engine/inc/bullet/Importers/ImportURDFDemo/UrdfRenderingInterface.h b/engine/inc/bullet/Importers/ImportURDFDemo/UrdfRenderingInterface.h deleted file mode 100644 index 460d0cf9..00000000 --- a/engine/inc/bullet/Importers/ImportURDFDemo/UrdfRenderingInterface.h +++ /dev/null @@ -1,115 +0,0 @@ -#ifndef URDF_RENDERING_INTERFACE_H -#define URDF_RENDERING_INTERFACE_H - -///UrdfLink and UrdfModel are the main URDF structures to define a robot -struct UrdfLink; -struct UrdfModel; -///btTransform is a position and 3x3 matrix, as defined in Bullet/src/LinearMath/btTransform -class btTransform; -class btVector3; - -///UrdfRenderingInterface is a simple rendering interface, mainly for URDF-based robots. -///There is an implementation in -///bullet3\examples\SharedMemory\plugins\tinyRendererPlugin\TinyRendererVisualShapeConverter.cpp -struct UrdfRenderingInterface -{ - virtual ~UrdfRenderingInterface() {} - ///given a URDF link, convert all visual shapes into internal renderer (loading graphics meshes, textures etc) - ///use the visualShapeUniqueId as a unique identifier to synchronize the world transform and to remove the visual shape. - virtual int convertVisualShapes(int linkIndex, const char* pathPrefix, const btTransform& localInertiaFrame, const UrdfLink* linkPtr, const UrdfModel* model, int visualShapeUniqueId, int bodyUniqueId, struct CommonFileIOInterface* fileIO) = 0; - - virtual int registerShapeAndInstance(const struct b3VisualShapeData& visualShape, const float* vertices, int numvertices, const int* indices, int numIndices, int primitiveType, int textureId, int orgGraphicsUniqueId, int bodyUniqueId, int linkIndex)=0; - - virtual void updateShape(int shapeUniqueId, const btVector3* vertices, int numVertices, const btVector3* normals, int numNormals) = 0; - - ///remove a visual shapes, based on the shape unique id (shapeUid) - virtual void removeVisualShape(int collisionObjectUid) = 0; - - ///update the world transform + scaling of the visual shape, using the shapeUid - virtual void syncTransform(int collisionObjectUid, const class btTransform& worldTransform, const class btVector3& localScaling) = 0; - - ///return the number of visual shapes, for a particular body unique id - virtual int getNumVisualShapes(int bodyUniqueId) = 0; - - ///return the visual shape information, for a particular body unique id and 'shape index' - virtual int getVisualShapesData(int bodyUniqueId, int shapeIndex, struct b3VisualShapeData* shapeData) = 0; - - ///change the RGBA color for some visual shape. - virtual void changeRGBAColor(int bodyUniqueId, int linkIndex, int shapeIndex, const double rgbaColor[4]) = 0; - - //change the instance flags, double-sided rendering - virtual void changeInstanceFlags(int bodyUniqueId, int linkIndex, int shapeIndex, int flags) = 0; - - ///select a given texture for some visual shape. - virtual void changeShapeTexture(int objectUniqueId, int linkIndex, int shapeIndex, int textureUniqueId) = 0; - - ///pick the up-axis, either Y (1) or Z (2) - virtual void setUpAxis(int axis) = 0; - - ///compute the view matrix based on those parameters - virtual void resetCamera(float camDist, float yaw, float pitch, float camPosX, float camPosY, float camPosZ) = 0; - - ///clear the render buffer with a particular color. - virtual void clearBuffers(struct TGAColor& clearColor) = 0; - - ///remove all visual shapes. - virtual void resetAll() = 0; - - ///return the frame buffer width and height for the renderer - virtual void getWidthAndHeight(int& width, int& height) = 0; - - ///set the frame buffer width and height for the renderer - virtual void setWidthAndHeight(int width, int height) = 0; - - ///set the light direction, in world coordinates - virtual void setLightDirection(float x, float y, float z) = 0; - - ///set the ambient light color, in world coordinates - virtual void setLightColor(float x, float y, float z) = 0; - - ///set the light distance - virtual void setLightDistance(float dist) = 0; - - ///set the light ambient coefficient - virtual void setLightAmbientCoeff(float ambientCoeff) = 0; - - ///set the light diffuse coefficient - virtual void setLightDiffuseCoeff(float diffuseCoeff) = 0; - - ///set the light specular coefficient - virtual void setLightSpecularCoeff(float specularCoeff) = 0; - - ///enable or disable rendering of shadows - virtual void setShadow(bool hasShadow) = 0; - - ///some undocumented flags for experimentation (todo: document) - virtual void setFlags(int flags) = 0; - - ///provide the image pixels as a part of a stream. - virtual void copyCameraImageData(unsigned char* pixelsRGBA, int rgbaBufferSizeInPixels, float* depthBuffer, int depthBufferSizeInPixels, int* segmentationMaskBuffer, int segmentationMaskSizeInPixels, int startPixelIndex, int* widthPtr, int* heightPtr, int* numPixelsCopied) = 0; - - ///render an image, using some arbitraty view and projection matrix - virtual void render() = 0; - - ///render an image using the provided view and projection matrix - virtual void render(const float viewMat[16], const float projMat[16]) = 0; - - ///load a texture from file, in png or other popular/supported format - //virtual int loadTextureFile(const char* filename) = 0; - virtual int loadTextureFile(const char* filename, struct CommonFileIOInterface* fileIO)=0; - - ///register a texture using an in-memory pixel buffer of a given width and height - virtual int registerTexture(unsigned char* texels, int width, int height) = 0; - - virtual void setProjectiveTextureMatrices(const float viewMatrix[16], const float projectionMatrix[16]) {} - virtual void setProjectiveTexture(bool useProjectiveTexture) {} - - - virtual bool getCameraInfo(int* width, int* height, float viewMatrix[16], float projectionMatrix[16], float camUp[3], float camForward[3], float hor[3], float vert[3], float* yaw, float* pitch, float* camDist, float cameraTarget[3]) const - { - return false; - } - -}; - -#endif //LINK_VISUAL_SHAPES_CONVERTER_H diff --git a/engine/inc/bullet/Importers/ImportURDFDemo/urdfLexicalCast.h b/engine/inc/bullet/Importers/ImportURDFDemo/urdfLexicalCast.h deleted file mode 100644 index 66481365..00000000 --- a/engine/inc/bullet/Importers/ImportURDFDemo/urdfLexicalCast.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef BOOST_REPLACEMENT_LEXICAL_CAST_H -#define BOOST_REPLACEMENT_LEXICAL_CAST_H - -#include - -template -T urdfLexicalCast(const char* txt) -{ - double result = atof(txt); - return result; -}; - -#endif diff --git a/engine/inc/bullet/Importers/ImportURDFDemo/urdfStringSplit.h b/engine/inc/bullet/Importers/ImportURDFDemo/urdfStringSplit.h deleted file mode 100644 index 783020da..00000000 --- a/engine/inc/bullet/Importers/ImportURDFDemo/urdfStringSplit.h +++ /dev/null @@ -1,39 +0,0 @@ - -#ifndef STRING_SPLIT_H -#define STRING_SPLIT_H - -#ifdef __cplusplus - -#include -#include -#include "LinearMath/btAlignedObjectArray.h" - -void urdfStringSplit(btAlignedObjectArray& pieces, const std::string& vector_str, const btAlignedObjectArray& separators); - -void urdfIsAnyOf(const char* seps, btAlignedObjectArray& strArray); -#endif - -#ifdef __cplusplus -extern "C" -{ -#endif - - ///The string split C code is by Lars Wirzenius - ///See http://stackoverflow.com/questions/2531605/how-to-split-a-string-with-a-delimiter-larger-than-one-single-char - - /* Split a string into substrings. Return dynamic array of dynamically - allocated substrings, or NULL if there was an error. Caller is - expected to free the memory, for example with str_array_free. */ - char** urdfStrSplit(const char* input, const char* sep); - - /* Free a dynamic array of dynamic strings. */ - void urdfStrArrayFree(char** array); - - /* Return length of a NULL-delimited array of strings. */ - size_t urdfStrArrayLen(char** array); - -#ifdef __cplusplus -} -#endif - -#endif //STRING_SPLIT_H diff --git a/engine/inc/bullet/Importers/ImportURDFDemo/urdf_samples.h b/engine/inc/bullet/Importers/ImportURDFDemo/urdf_samples.h deleted file mode 100644 index 8d668263..00000000 --- a/engine/inc/bullet/Importers/ImportURDFDemo/urdf_samples.h +++ /dev/null @@ -1,823 +0,0 @@ -#ifndef URDF_SAMPLES_H -#define URDF_SAMPLES_H - -#define MSTRINGIFY(A) #A - -const char* urdf_char2 = MSTRINGIFY( - - - - - - - - - - - - - - - - - - - - - ); - -const char* urdf_char1 = MSTRINGIFY( - - - - - - - - - - - ); - -const char* urdf_char3 = MSTRINGIFY( - - - - - - - - - - - - - - - - - - - - - - - ); - -const char* urdf_char4 = MSTRINGIFY( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -); - -const char* urdf_char_r2d2 = MSTRINGIFY( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -); - -const char* urdf_char = MSTRINGIFY( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -); - -#endif //URDF_SAMPLES_H diff --git a/engine/inc/bullet/InverseDynamics/BulletInverseDynamicsUtilsCommon.h b/engine/inc/bullet/InverseDynamics/BulletInverseDynamicsUtilsCommon.h deleted file mode 100644 index 87a0897f..00000000 --- a/engine/inc/bullet/InverseDynamics/BulletInverseDynamicsUtilsCommon.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef BULLET_INVERSE_DYNAMICS_UTILS_COMMON_H -#define BULLET_INVERSE_DYNAMICS_UTILS_COMMON_H -#include "CoilCreator.hpp" -#include "MultiBodyTreeCreator.hpp" -#include "btMultiBodyFromURDF.hpp" -#include "DillCreator.hpp" -#include "MultiBodyTreeDebugGraph.hpp" -#include "btMultiBodyTreeCreator.hpp" -#include "IDRandomUtil.hpp" -#include "SimpleTreeCreator.hpp" -#include "invdyn_bullet_comparison.hpp" -#include "MultiBodyNameMap.hpp" -#include "User2InternalIndex.hpp" - -#endif //BULLET_INVERSE_DYNAMICS_UTILS_COMMON_H diff --git a/engine/inc/bullet/InverseDynamics/InverseDynamicsExample.h b/engine/inc/bullet/InverseDynamics/InverseDynamicsExample.h deleted file mode 100644 index ce21e54f..00000000 --- a/engine/inc/bullet/InverseDynamics/InverseDynamicsExample.h +++ /dev/null @@ -1,27 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2015 Google Inc. http://bulletphysics.org - -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 INVERSE_DYNAMICS_EXAMPLE_H -#define INVERSE_DYNAMICS_EXAMPLE_H - -enum btInverseDynamicsExampleOptions -{ - BT_ID_LOAD_URDF = 0, - BT_ID_PROGRAMMATICALLY = 1 -}; - -class CommonExampleInterface* InverseDynamicsExampleCreateFunc(struct CommonExampleOptions& options); - -#endif //INVERSE_DYNAMICS_EXAMPLE_H diff --git a/engine/inc/bullet/InverseKinematics/InverseKinematicsExample.h b/engine/inc/bullet/InverseKinematics/InverseKinematicsExample.h deleted file mode 100644 index bdfbd813..00000000 --- a/engine/inc/bullet/InverseKinematics/InverseKinematicsExample.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef INVERSE_KINEMATICSEXAMPLE_H -#define INVERSE_KINEMATICSEXAMPLE_H - -enum Method -{ - IK_JACOB_TRANS = 0, - IK_PURE_PSEUDO, - IK_DLS, - IK_SDLS, - IK_DLS_SVD -}; - -class CommonExampleInterface* InverseKinematicsExampleCreateFunc(struct CommonExampleOptions& options); - -#endif //INVERSE_KINEMATICSEXAMPLE_H diff --git a/engine/inc/bullet/LinearMath/TaskScheduler/btThreadSupportInterface.h b/engine/inc/bullet/LinearMath/TaskScheduler/btThreadSupportInterface.h deleted file mode 100644 index 1fe49335..00000000 --- a/engine/inc/bullet/LinearMath/TaskScheduler/btThreadSupportInterface.h +++ /dev/null @@ -1,64 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2018 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. -*/ - -#ifndef BT_THREAD_SUPPORT_INTERFACE_H -#define BT_THREAD_SUPPORT_INTERFACE_H - -class btCriticalSection -{ -public: - btCriticalSection() {} - virtual ~btCriticalSection() {} - - virtual void lock() = 0; - virtual void unlock() = 0; -}; - -class btThreadSupportInterface -{ -public: - virtual ~btThreadSupportInterface() {} - - virtual int getNumWorkerThreads() const = 0; // number of worker threads (total number of logical processors - 1) - virtual int getCacheFriendlyNumThreads() const = 0; // the number of logical processors sharing a single L3 cache - virtual int getLogicalToPhysicalCoreRatio() const = 0; // the number of logical processors per physical processor (usually 1 or 2) - virtual void runTask(int threadIndex, void* userData) = 0; - virtual void waitForAllTasks() = 0; - - virtual btCriticalSection* createCriticalSection() = 0; - virtual void deleteCriticalSection(btCriticalSection* criticalSection) = 0; - - typedef void (*ThreadFunc)(void* userPtr); - - struct ConstructionInfo - { - ConstructionInfo(const char* uniqueName, - ThreadFunc userThreadFunc, - int threadStackSize = 65535) - : m_uniqueName(uniqueName), - m_userThreadFunc(userThreadFunc), - m_threadStackSize(threadStackSize) - { - } - - const char* m_uniqueName; - ThreadFunc m_userThreadFunc; - int m_threadStackSize; - }; - - static btThreadSupportInterface* create(const ConstructionInfo& info); -}; - -#endif //BT_THREAD_SUPPORT_INTERFACE_H diff --git a/engine/inc/bullet/LinearMath/btAabbUtil2.h b/engine/inc/bullet/LinearMath/btAabbUtil2.h deleted file mode 100644 index eea49dd3..00000000 --- a/engine/inc/bullet/LinearMath/btAabbUtil2.h +++ /dev/null @@ -1,217 +0,0 @@ -/* -Copyright (c) 2003-2006 Gino van den Bergen / 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_AABB_UTIL2 -#define BT_AABB_UTIL2 - -#include "btTransform.h" -#include "btVector3.h" -#include "btMinMax.h" - -SIMD_FORCE_INLINE void AabbExpand(btVector3& aabbMin, - btVector3& aabbMax, - const btVector3& expansionMin, - const btVector3& expansionMax) -{ - aabbMin = aabbMin + expansionMin; - aabbMax = aabbMax + expansionMax; -} - -/// conservative test for overlap between two aabbs -SIMD_FORCE_INLINE bool TestPointAgainstAabb2(const btVector3& aabbMin1, const btVector3& aabbMax1, - const btVector3& point) -{ - bool overlap = true; - overlap = (aabbMin1.getX() > point.getX() || aabbMax1.getX() < point.getX()) ? false : overlap; - overlap = (aabbMin1.getZ() > point.getZ() || aabbMax1.getZ() < point.getZ()) ? false : overlap; - overlap = (aabbMin1.getY() > point.getY() || aabbMax1.getY() < point.getY()) ? false : overlap; - return overlap; -} - -/// conservative test for overlap between two aabbs -SIMD_FORCE_INLINE bool TestAabbAgainstAabb2(const btVector3& aabbMin1, const btVector3& aabbMax1, - const btVector3& aabbMin2, const btVector3& aabbMax2) -{ - bool overlap = true; - overlap = (aabbMin1.getX() > aabbMax2.getX() || aabbMax1.getX() < aabbMin2.getX()) ? false : overlap; - overlap = (aabbMin1.getZ() > aabbMax2.getZ() || aabbMax1.getZ() < aabbMin2.getZ()) ? false : overlap; - overlap = (aabbMin1.getY() > aabbMax2.getY() || aabbMax1.getY() < aabbMin2.getY()) ? false : overlap; - return overlap; -} - -/// conservative test for overlap between triangle and aabb -SIMD_FORCE_INLINE bool TestTriangleAgainstAabb2(const btVector3* vertices, - const btVector3& aabbMin, const btVector3& aabbMax) -{ - const btVector3& p1 = vertices[0]; - const btVector3& p2 = vertices[1]; - const btVector3& p3 = vertices[2]; - - if (btMin(btMin(p1[0], p2[0]), p3[0]) > aabbMax[0]) return false; - if (btMax(btMax(p1[0], p2[0]), p3[0]) < aabbMin[0]) return false; - - if (btMin(btMin(p1[2], p2[2]), p3[2]) > aabbMax[2]) return false; - if (btMax(btMax(p1[2], p2[2]), p3[2]) < aabbMin[2]) return false; - - if (btMin(btMin(p1[1], p2[1]), p3[1]) > aabbMax[1]) return false; - if (btMax(btMax(p1[1], p2[1]), p3[1]) < aabbMin[1]) return false; - return true; -} - -SIMD_FORCE_INLINE int btOutcode(const btVector3& p, const btVector3& halfExtent) -{ - return (p.getX() < -halfExtent.getX() ? 0x01 : 0x0) | - (p.getX() > halfExtent.getX() ? 0x08 : 0x0) | - (p.getY() < -halfExtent.getY() ? 0x02 : 0x0) | - (p.getY() > halfExtent.getY() ? 0x10 : 0x0) | - (p.getZ() < -halfExtent.getZ() ? 0x4 : 0x0) | - (p.getZ() > halfExtent.getZ() ? 0x20 : 0x0); -} - -SIMD_FORCE_INLINE bool btRayAabb2(const btVector3& rayFrom, - const btVector3& rayInvDirection, - const unsigned int raySign[3], - const btVector3 bounds[2], - btScalar& tmin, - btScalar lambda_min, - btScalar lambda_max) -{ - btScalar tmax, tymin, tymax, tzmin, tzmax; - tmin = (bounds[raySign[0]].getX() - rayFrom.getX()) * rayInvDirection.getX(); - tmax = (bounds[1 - raySign[0]].getX() - rayFrom.getX()) * rayInvDirection.getX(); - tymin = (bounds[raySign[1]].getY() - rayFrom.getY()) * rayInvDirection.getY(); - tymax = (bounds[1 - raySign[1]].getY() - rayFrom.getY()) * rayInvDirection.getY(); - - if ((tmin > tymax) || (tymin > tmax)) - return false; - - if (tymin > tmin) - tmin = tymin; - - if (tymax < tmax) - tmax = tymax; - - tzmin = (bounds[raySign[2]].getZ() - rayFrom.getZ()) * rayInvDirection.getZ(); - tzmax = (bounds[1 - raySign[2]].getZ() - rayFrom.getZ()) * rayInvDirection.getZ(); - - if ((tmin > tzmax) || (tzmin > tmax)) - return false; - if (tzmin > tmin) - tmin = tzmin; - if (tzmax < tmax) - tmax = tzmax; - return ((tmin < lambda_max) && (tmax > lambda_min)); -} - -SIMD_FORCE_INLINE bool btRayAabb(const btVector3& rayFrom, - const btVector3& rayTo, - const btVector3& aabbMin, - const btVector3& aabbMax, - btScalar& param, btVector3& normal) -{ - btVector3 aabbHalfExtent = (aabbMax - aabbMin) * btScalar(0.5); - btVector3 aabbCenter = (aabbMax + aabbMin) * btScalar(0.5); - btVector3 source = rayFrom - aabbCenter; - btVector3 target = rayTo - aabbCenter; - int sourceOutcode = btOutcode(source, aabbHalfExtent); - int targetOutcode = btOutcode(target, aabbHalfExtent); - if ((sourceOutcode & targetOutcode) == 0x0) - { - btScalar lambda_enter = btScalar(0.0); - btScalar lambda_exit = param; - btVector3 r = target - source; - int i; - btScalar normSign = 1; - btVector3 hitNormal(0, 0, 0); - int bit = 1; - - for (int j = 0; j < 2; j++) - { - for (i = 0; i != 3; ++i) - { - if (sourceOutcode & bit) - { - btScalar lambda = (-source[i] - aabbHalfExtent[i] * normSign) / r[i]; - if (lambda_enter <= lambda) - { - lambda_enter = lambda; - hitNormal.setValue(0, 0, 0); - hitNormal[i] = normSign; - } - } - else if (targetOutcode & bit) - { - btScalar lambda = (-source[i] - aabbHalfExtent[i] * normSign) / r[i]; - btSetMin(lambda_exit, lambda); - } - bit <<= 1; - } - normSign = btScalar(-1.); - } - if (lambda_enter <= lambda_exit) - { - param = lambda_enter; - normal = hitNormal; - return true; - } - } - return false; -} - -SIMD_FORCE_INLINE void btTransformAabb(const btVector3& halfExtents, btScalar margin, const btTransform& t, btVector3& aabbMinOut, btVector3& aabbMaxOut) -{ - btVector3 halfExtentsWithMargin = halfExtents + btVector3(margin, margin, margin); - btMatrix3x3 abs_b = t.getBasis().absolute(); - btVector3 center = t.getOrigin(); - btVector3 extent = halfExtentsWithMargin.dot3(abs_b[0], abs_b[1], abs_b[2]); - aabbMinOut = center - extent; - aabbMaxOut = center + extent; -} - -SIMD_FORCE_INLINE void btTransformAabb(const btVector3& localAabbMin, const btVector3& localAabbMax, btScalar margin, const btTransform& trans, btVector3& aabbMinOut, btVector3& aabbMaxOut) -{ - btAssert(localAabbMin.getX() <= localAabbMax.getX()); - btAssert(localAabbMin.getY() <= localAabbMax.getY()); - btAssert(localAabbMin.getZ() <= localAabbMax.getZ()); - btVector3 localHalfExtents = btScalar(0.5) * (localAabbMax - localAabbMin); - localHalfExtents += btVector3(margin, margin, margin); - - btVector3 localCenter = btScalar(0.5) * (localAabbMax + localAabbMin); - btMatrix3x3 abs_b = trans.getBasis().absolute(); - btVector3 center = trans(localCenter); - btVector3 extent = localHalfExtents.dot3(abs_b[0], abs_b[1], abs_b[2]); - aabbMinOut = center - extent; - aabbMaxOut = center + extent; -} - -#define USE_BANCHLESS 1 -#ifdef USE_BANCHLESS -//This block replaces the block below and uses no branches, and replaces the 8 bit return with a 32 bit return for improved performance (~3x on XBox 360) -SIMD_FORCE_INLINE unsigned testQuantizedAabbAgainstQuantizedAabb(const unsigned short int* aabbMin1, const unsigned short int* aabbMax1, const unsigned short int* aabbMin2, const unsigned short int* aabbMax2) -{ - return static_cast(btSelect((unsigned)((aabbMin1[0] <= aabbMax2[0]) & (aabbMax1[0] >= aabbMin2[0]) & (aabbMin1[2] <= aabbMax2[2]) & (aabbMax1[2] >= aabbMin2[2]) & (aabbMin1[1] <= aabbMax2[1]) & (aabbMax1[1] >= aabbMin2[1])), - 1, 0)); -} -#else -SIMD_FORCE_INLINE bool testQuantizedAabbAgainstQuantizedAabb(const unsigned short int* aabbMin1, const unsigned short int* aabbMax1, const unsigned short int* aabbMin2, const unsigned short int* aabbMax2) -{ - bool overlap = true; - overlap = (aabbMin1[0] > aabbMax2[0] || aabbMax1[0] < aabbMin2[0]) ? false : overlap; - overlap = (aabbMin1[2] > aabbMax2[2] || aabbMax1[2] < aabbMin2[2]) ? false : overlap; - overlap = (aabbMin1[1] > aabbMax2[1] || aabbMax1[1] < aabbMin2[1]) ? false : overlap; - return overlap; -} -#endif //USE_BANCHLESS - -#endif //BT_AABB_UTIL2 diff --git a/engine/inc/bullet/LinearMath/btAlignedAllocator.h b/engine/inc/bullet/LinearMath/btAlignedAllocator.h deleted file mode 100644 index 971f62bf..00000000 --- a/engine/inc/bullet/LinearMath/btAlignedAllocator.h +++ /dev/null @@ -1,115 +0,0 @@ -/* -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_ALIGNED_ALLOCATOR -#define BT_ALIGNED_ALLOCATOR - -///we probably replace this with our own aligned memory allocator -///so we replace _aligned_malloc and _aligned_free with our own -///that is better portable and more predictable - -#include "btScalar.h" - -///BT_DEBUG_MEMORY_ALLOCATIONS preprocessor can be set in build system -///for regression tests to detect memory leaks -///#define BT_DEBUG_MEMORY_ALLOCATIONS 1 -#ifdef BT_DEBUG_MEMORY_ALLOCATIONS - -int btDumpMemoryLeaks(); - -#define btAlignedAlloc(a, b) \ - btAlignedAllocInternal(a, b, __LINE__, __FILE__) - -#define btAlignedFree(ptr) \ - btAlignedFreeInternal(ptr, __LINE__, __FILE__) - -void* btAlignedAllocInternal(size_t size, int alignment, int line, const char* filename); - -void btAlignedFreeInternal(void* ptr, int line, const char* filename); - -#else -void* btAlignedAllocInternal(size_t size, int alignment); -void btAlignedFreeInternal(void* ptr); - -#define btAlignedAlloc(size, alignment) btAlignedAllocInternal(size, alignment) -#define btAlignedFree(ptr) btAlignedFreeInternal(ptr) - -#endif -typedef int size_type; - -typedef void*(btAlignedAllocFunc)(size_t size, int alignment); -typedef void(btAlignedFreeFunc)(void* memblock); -typedef void*(btAllocFunc)(size_t size); -typedef void(btFreeFunc)(void* memblock); - -///The developer can let all Bullet memory allocations go through a custom memory allocator, using btAlignedAllocSetCustom -void btAlignedAllocSetCustom(btAllocFunc* allocFunc, btFreeFunc* freeFunc); -///If the developer has already an custom aligned allocator, then btAlignedAllocSetCustomAligned can be used. The default aligned allocator pre-allocates extra memory using the non-aligned allocator, and instruments it. -void btAlignedAllocSetCustomAligned(btAlignedAllocFunc* allocFunc, btAlignedFreeFunc* freeFunc); - -///The btAlignedAllocator is a portable class for aligned memory allocations. -///Default implementations for unaligned and aligned allocations can be overridden by a custom allocator using btAlignedAllocSetCustom and btAlignedAllocSetCustomAligned. -template -class btAlignedAllocator -{ - typedef btAlignedAllocator self_type; - -public: - //just going down a list: - btAlignedAllocator() {} - /* - btAlignedAllocator( const self_type & ) {} - */ - - template - btAlignedAllocator(const btAlignedAllocator&) - { - } - - typedef const T* const_pointer; - typedef const T& const_reference; - typedef T* pointer; - typedef T& reference; - typedef T value_type; - - pointer address(reference ref) const { return &ref; } - const_pointer address(const_reference ref) const { return &ref; } - pointer allocate(size_type n, const_pointer* hint = 0) - { - (void)hint; - return reinterpret_cast(btAlignedAlloc(sizeof(value_type) * n, Alignment)); - } - void construct(pointer ptr, const value_type& value) { new (ptr) value_type(value); } - void deallocate(pointer ptr) - { - btAlignedFree(reinterpret_cast(ptr)); - } - void destroy(pointer ptr) { ptr->~value_type(); } - - template - struct rebind - { - typedef btAlignedAllocator other; - }; - template - self_type& operator=(const btAlignedAllocator&) - { - return *this; - } - - friend bool operator==(const self_type&, const self_type&) { return true; } -}; - -#endif //BT_ALIGNED_ALLOCATOR diff --git a/engine/inc/bullet/LinearMath/btAlignedObjectArray.h b/engine/inc/bullet/LinearMath/btAlignedObjectArray.h deleted file mode 100644 index b3d5d64b..00000000 --- a/engine/inc/bullet/LinearMath/btAlignedObjectArray.h +++ /dev/null @@ -1,504 +0,0 @@ -/* -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_OBJECT_ARRAY__ -#define BT_OBJECT_ARRAY__ - -#include "btScalar.h" // has definitions like SIMD_FORCE_INLINE -#include "btAlignedAllocator.h" - -///If the platform doesn't support placement new, you can disable BT_USE_PLACEMENT_NEW -///then the btAlignedObjectArray doesn't support objects with virtual methods, and non-trivial constructors/destructors -///You can enable BT_USE_MEMCPY, then swapping elements in the array will use memcpy instead of operator= -///see discussion here: http://continuousphysics.com/Bullet/phpBB2/viewtopic.php?t=1231 and -///http://www.continuousphysics.com/Bullet/phpBB2/viewtopic.php?t=1240 - -#define BT_USE_PLACEMENT_NEW 1 -//#define BT_USE_MEMCPY 1 //disable, because it is cumbersome to find out for each platform where memcpy is defined. It can be in or or otherwise... -#define BT_ALLOW_ARRAY_COPY_OPERATOR // enabling this can accidently perform deep copies of data if you are not careful - -#ifdef BT_USE_MEMCPY -#include -#include -#endif //BT_USE_MEMCPY - -#ifdef BT_USE_PLACEMENT_NEW -#include //for placement new -#endif //BT_USE_PLACEMENT_NEW - -///The btAlignedObjectArray template class uses a subset of the stl::vector interface for its methods -///It is developed to replace stl::vector to avoid portability issues, including STL alignment issues to add SIMD/SSE data -template -//template -class btAlignedObjectArray -{ - btAlignedAllocator m_allocator; - - int m_size; - int m_capacity; - T* m_data; - //PCK: added this line - bool m_ownsMemory; - -#ifdef BT_ALLOW_ARRAY_COPY_OPERATOR -public: - SIMD_FORCE_INLINE btAlignedObjectArray& operator=(const btAlignedObjectArray& other) - { - copyFromArray(other); - return *this; - } -#else //BT_ALLOW_ARRAY_COPY_OPERATOR -private: - SIMD_FORCE_INLINE btAlignedObjectArray& operator=(const btAlignedObjectArray& other); -#endif //BT_ALLOW_ARRAY_COPY_OPERATOR - -protected: - SIMD_FORCE_INLINE int allocSize(int size) - { - return (size ? size * 2 : 1); - } - SIMD_FORCE_INLINE void copy(int start, int end, T* dest) const - { - int i; - for (i = start; i < end; ++i) -#ifdef BT_USE_PLACEMENT_NEW - new (&dest[i]) T(m_data[i]); -#else - dest[i] = m_data[i]; -#endif //BT_USE_PLACEMENT_NEW - } - - SIMD_FORCE_INLINE void init() - { - //PCK: added this line - m_ownsMemory = true; - m_data = 0; - m_size = 0; - m_capacity = 0; - } - SIMD_FORCE_INLINE void destroy(int first, int last) - { - int i; - for (i = first; i < last; i++) - { - m_data[i].~T(); - } - } - - SIMD_FORCE_INLINE void* allocate(int size) - { - if (size) - return m_allocator.allocate(size); - return 0; - } - - SIMD_FORCE_INLINE void deallocate() - { - if (m_data) - { - //PCK: enclosed the deallocation in this block - if (m_ownsMemory) - { - m_allocator.deallocate(m_data); - } - m_data = 0; - } - } - -public: - btAlignedObjectArray() - { - init(); - } - - ~btAlignedObjectArray() - { - clear(); - } - - ///Generally it is best to avoid using the copy constructor of an btAlignedObjectArray, and use a (const) reference to the array instead. - btAlignedObjectArray(const btAlignedObjectArray& otherArray) - { - init(); - - int otherSize = otherArray.size(); - resize(otherSize); - otherArray.copy(0, otherSize, m_data); - } - - /// return the number of elements in the array - SIMD_FORCE_INLINE int size() const - { - return m_size; - } - - SIMD_FORCE_INLINE const T& at(int n) const - { - btAssert(n >= 0); - btAssert(n < size()); - return m_data[n]; - } - - SIMD_FORCE_INLINE T& at(int n) - { - btAssert(n >= 0); - btAssert(n < size()); - return m_data[n]; - } - - SIMD_FORCE_INLINE const T& operator[](int n) const - { - btAssert(n >= 0); - btAssert(n < size()); - return m_data[n]; - } - - SIMD_FORCE_INLINE T& operator[](int n) - { - btAssert(n >= 0); - btAssert(n < size()); - return m_data[n]; - } - - ///clear the array, deallocated memory. Generally it is better to use array.resize(0), to reduce performance overhead of run-time memory (de)allocations. - SIMD_FORCE_INLINE void clear() - { - destroy(0, size()); - - deallocate(); - - init(); - } - - SIMD_FORCE_INLINE void pop_back() - { - btAssert(m_size > 0); - m_size--; - m_data[m_size].~T(); - } - - ///resize changes the number of elements in the array. If the new size is larger, the new elements will be constructed using the optional second argument. - ///when the new number of elements is smaller, the destructor will be called, but memory will not be freed, to reduce performance overhead of run-time memory (de)allocations. - SIMD_FORCE_INLINE void resizeNoInitialize(int newsize) - { - if (newsize > size()) - { - reserve(newsize); - } - m_size = newsize; - } - - SIMD_FORCE_INLINE void resize(int newsize, const T& fillData = T()) - { - const int curSize = size(); - - if (newsize < curSize) - { - for (int i = newsize; i < curSize; i++) - { - m_data[i].~T(); - } - } - else - { - if (newsize > curSize) - { - reserve(newsize); - } -#ifdef BT_USE_PLACEMENT_NEW - for (int i = curSize; i < newsize; i++) - { - new (&m_data[i]) T(fillData); - } -#endif //BT_USE_PLACEMENT_NEW - } - - m_size = newsize; - } - SIMD_FORCE_INLINE T& expandNonInitializing() - { - const int sz = size(); - if (sz == capacity()) - { - reserve(allocSize(size())); - } - m_size++; - - return m_data[sz]; - } - - SIMD_FORCE_INLINE T& expand(const T& fillValue = T()) - { - const int sz = size(); - if (sz == capacity()) - { - reserve(allocSize(size())); - } - m_size++; -#ifdef BT_USE_PLACEMENT_NEW - new (&m_data[sz]) T(fillValue); //use the in-place new (not really allocating heap memory) -#endif - - return m_data[sz]; - } - - SIMD_FORCE_INLINE void push_back(const T& _Val) - { - const int sz = size(); - if (sz == capacity()) - { - reserve(allocSize(size())); - } - -#ifdef BT_USE_PLACEMENT_NEW - new (&m_data[m_size]) T(_Val); -#else - m_data[size()] = _Val; -#endif //BT_USE_PLACEMENT_NEW - - m_size++; - } - - /// return the pre-allocated (reserved) elements, this is at least as large as the total number of elements,see size() and reserve() - SIMD_FORCE_INLINE int capacity() const - { - return m_capacity; - } - - SIMD_FORCE_INLINE void reserve(int _Count) - { // determine new minimum length of allocated storage - if (capacity() < _Count) - { // not enough room, reallocate - T* s = (T*)allocate(_Count); - - copy(0, size(), s); - - destroy(0, size()); - - deallocate(); - - //PCK: added this line - m_ownsMemory = true; - - m_data = s; - - m_capacity = _Count; - } - } - - class less - { - public: - bool operator()(const T& a, const T& b) const - { - return (a < b); - } - }; - - template - void quickSortInternal(const L& CompareFunc, int lo, int hi) - { - // lo is the lower index, hi is the upper index - // of the region of array a that is to be sorted - int i = lo, j = hi; - T x = m_data[(lo + hi) / 2]; - - // partition - do - { - while (CompareFunc(m_data[i], x)) - i++; - while (CompareFunc(x, m_data[j])) - j--; - if (i <= j) - { - swap(i, j); - i++; - j--; - } - } while (i <= j); - - // recursion - if (lo < j) - quickSortInternal(CompareFunc, lo, j); - if (i < hi) - quickSortInternal(CompareFunc, i, hi); - } - - template - void quickSort(const L& CompareFunc) - { - //don't sort 0 or 1 elements - if (size() > 1) - { - quickSortInternal(CompareFunc, 0, size() - 1); - } - } - - ///heap sort from http://www.csse.monash.edu.au/~lloyd/tildeAlgDS/Sort/Heap/ - template - void downHeap(T* pArr, int k, int n, const L& CompareFunc) - { - /* PRE: a[k+1..N] is a heap */ - /* POST: a[k..N] is a heap */ - - T temp = pArr[k - 1]; - /* k has child(s) */ - while (k <= n / 2) - { - int child = 2 * k; - - if ((child < n) && CompareFunc(pArr[child - 1], pArr[child])) - { - child++; - } - /* pick larger child */ - if (CompareFunc(temp, pArr[child - 1])) - { - /* move child up */ - pArr[k - 1] = pArr[child - 1]; - k = child; - } - else - { - break; - } - } - pArr[k - 1] = temp; - } /*downHeap*/ - - void swap(int index0, int index1) - { -#ifdef BT_USE_MEMCPY - char temp[sizeof(T)]; - memcpy(temp, &m_data[index0], sizeof(T)); - memcpy(&m_data[index0], &m_data[index1], sizeof(T)); - memcpy(&m_data[index1], temp, sizeof(T)); -#else - T temp = m_data[index0]; - m_data[index0] = m_data[index1]; - m_data[index1] = temp; -#endif //BT_USE_PLACEMENT_NEW - } - - template - void heapSort(const L& CompareFunc) - { - /* sort a[0..N-1], N.B. 0 to N-1 */ - int k; - int n = m_size; - for (k = n / 2; k > 0; k--) - { - downHeap(m_data, k, n, CompareFunc); - } - - /* a[1..N] is now a heap */ - while (n >= 1) - { - swap(0, n - 1); /* largest of a[0..n-1] */ - - n = n - 1; - /* restore a[1..i-1] heap */ - downHeap(m_data, 1, n, CompareFunc); - } - } - - ///non-recursive binary search, assumes sorted array - int findBinarySearch(const T& key) const - { - int first = 0; - int last = size() - 1; - - //assume sorted array - while (first <= last) - { - int mid = (first + last) / 2; // compute mid point. - if (key > m_data[mid]) - first = mid + 1; // repeat search in top half. - else if (key < m_data[mid]) - last = mid - 1; // repeat search in bottom half. - else - return mid; // found it. return position ///// - } - return size(); // failed to find key - } - - int findLinearSearch(const T& key) const - { - int index = size(); - int i; - - for (i = 0; i < size(); i++) - { - if (m_data[i] == key) - { - index = i; - break; - } - } - return index; - } - - // If the key is not in the array, return -1 instead of 0, - // since 0 also means the first element in the array. - int findLinearSearch2(const T& key) const - { - int index = -1; - int i; - - for (i = 0; i < size(); i++) - { - if (m_data[i] == key) - { - index = i; - break; - } - } - return index; - } - - void removeAtIndex(int index) - { - if (index < size()) - { - swap(index, size() - 1); - pop_back(); - } - } - void remove(const T& key) - { - int findIndex = findLinearSearch(key); - removeAtIndex(findIndex); - } - - //PCK: whole function - void initializeFromBuffer(void* buffer, int size, int capacity) - { - clear(); - m_ownsMemory = false; - m_data = (T*)buffer; - m_size = size; - m_capacity = capacity; - } - - void copyFromArray(const btAlignedObjectArray& otherArray) - { - int otherSize = otherArray.size(); - resize(otherSize); - otherArray.copy(0, otherSize, m_data); - } -}; - -#endif //BT_OBJECT_ARRAY__ diff --git a/engine/inc/bullet/LinearMath/btConvexHull.h b/engine/inc/bullet/LinearMath/btConvexHull.h deleted file mode 100644 index f890d75e..00000000 --- a/engine/inc/bullet/LinearMath/btConvexHull.h +++ /dev/null @@ -1,233 +0,0 @@ - -/* -Stan Melax Convex Hull Computation -Copyright (c) 2008 Stan Melax http://www.melax.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. -*/ - -///includes modifications/improvements by John Ratcliff, see BringOutYourDead below. - -#ifndef BT_CD_HULL_H -#define BT_CD_HULL_H - -#include "btVector3.h" -#include "btAlignedObjectArray.h" - -typedef btAlignedObjectArray TUIntArray; - -class HullResult -{ -public: - HullResult(void) - { - mPolygons = true; - mNumOutputVertices = 0; - mNumFaces = 0; - mNumIndices = 0; - } - bool mPolygons; // true if indices represents polygons, false indices are triangles - unsigned int mNumOutputVertices; // number of vertices in the output hull - btAlignedObjectArray m_OutputVertices; // array of vertices - unsigned int mNumFaces; // the number of faces produced - unsigned int mNumIndices; // the total number of indices - btAlignedObjectArray m_Indices; // 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_DEFAULT = QF_TRIANGLES -}; - -class HullDesc -{ -public: - HullDesc(void) - { - mFlags = QF_DEFAULT; - mVcount = 0; - mVertices = 0; - mVertexStride = sizeof(btVector3); - mNormalEpsilon = 0.001f; - mMaxVertices = 4096; // maximum number of points to be considered for a convex hull. - mMaxFaces = 4096; - }; - - HullDesc(HullFlag flag, - unsigned int vcount, - const btVector3* vertices, - unsigned int stride = sizeof(btVector3)) - { - mFlags = flag; - mVcount = vcount; - mVertices = vertices; - mVertexStride = stride; - mNormalEpsilon = btScalar(0.001); - mMaxVertices = 4096; - } - - 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 btVector3* mVertices; // the array of vertices. - unsigned int mVertexStride; // the stride of each vertex, in bytes. - btScalar mNormalEpsilon; // the epsilon for removing duplicates. This is a normalized value, if normalized bit is on. - 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 btPlane -{ -public: - btVector3 normal; - btScalar dist; // distance below origin - the D from plane equasion Ax+By+Cz+D=0 - btPlane(const btVector3& n, btScalar d) : normal(n), dist(d) {} - btPlane() : normal(), dist(0) {} -}; - -class ConvexH -{ -public: - class HalfEdge - { - public: - short ea; // the other half of the edge (index into edges list) - unsigned char v; // the vertex at the start of this edge (index into vertices list) - unsigned char p; // the facet on which this edge lies (index into facets list) - HalfEdge() {} - HalfEdge(short _ea, unsigned char _v, unsigned char _p) : ea(_ea), v(_v), p(_p) {} - }; - ConvexH() - { - } - ~ConvexH() - { - } - btAlignedObjectArray vertices; - btAlignedObjectArray edges; - btAlignedObjectArray facets; - ConvexH(int vertices_size, int edges_size, int facets_size); -}; - -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]; } -}; - -class PHullResult -{ -public: - PHullResult(void) - { - mVcount = 0; - mIndexCount = 0; - mFaceCount = 0; - mVertices = 0; - } - - unsigned int mVcount; - unsigned int mIndexCount; - unsigned int mFaceCount; - btVector3* mVertices; - TUIntArray m_Indices; -}; - -///The HullLibrary class can create a convex hull from a collection of vertices, using the ComputeHull method. -///The btShapeHull class uses this HullLibrary to create a approximate convex mesh given a general (non-polyhedral) convex shape. -class HullLibrary -{ - btAlignedObjectArray m_tris; - -public: - btAlignedObjectArray m_vertexIndexMapping; - - 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: - bool ComputeHull(unsigned int vcount, const btVector3* vertices, PHullResult& result, unsigned int vlimit); - - class btHullTriangle* allocateTriangle(int a, int b, int c); - void deAllocateTriangle(btHullTriangle*); - void b2bfix(btHullTriangle* s, btHullTriangle* t); - - void removeb2b(btHullTriangle* s, btHullTriangle* t); - - void checkit(btHullTriangle* t); - - btHullTriangle* extrudable(btScalar epsilon); - - int calchull(btVector3* verts, int verts_count, TUIntArray& tris_out, int& tris_count, int vlimit); - - int calchullgen(btVector3* verts, int verts_count, int vlimit); - - int4 FindSimplex(btVector3* verts, int verts_count, btAlignedObjectArray& allow); - - class ConvexH* ConvexHCrop(ConvexH& convex, const btPlane& slice); - - void extrude(class btHullTriangle* t0, int v); - - ConvexH* test_cube(); - - //BringOutYourDead (John Ratcliff): When you create a convex hull you hand it a large input set of vertices forming a 'point cloud'. - //After the hull is generated it give you back a set of polygon faces which index the *original* point cloud. - //The thing is, often times, there are many 'dead vertices' in the point cloud that are on longer referenced by the hull. - //The routine 'BringOutYourDead' find only the referenced vertices, copies them to an new buffer, and re-indexes the hull so that it is a minimal representation. - void BringOutYourDead(const btVector3* verts, unsigned int vcount, btVector3* overts, unsigned int& ocount, unsigned int* indices, unsigned indexcount); - - bool CleanupVertices(unsigned int svcount, - const btVector3* svertices, - unsigned int stride, - unsigned int& vcount, // output number of vertices - btVector3* vertices, // location to store the results. - btScalar normalepsilon, - btVector3& scale); -}; - -#endif //BT_CD_HULL_H diff --git a/engine/inc/bullet/LinearMath/btConvexHullComputer.h b/engine/inc/bullet/LinearMath/btConvexHullComputer.h deleted file mode 100644 index 18b26eea..00000000 --- a/engine/inc/bullet/LinearMath/btConvexHullComputer.h +++ /dev/null @@ -1,102 +0,0 @@ -/* -Copyright (c) 2011 Ole Kniemeyer, MAXON, www.maxon.net - -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_CONVEX_HULL_COMPUTER_H -#define BT_CONVEX_HULL_COMPUTER_H - -#include "btVector3.h" -#include "btAlignedObjectArray.h" - -/// Convex hull implementation based on Preparata and Hong -/// See http://code.google.com/p/bullet/issues/detail?id=275 -/// Ole Kniemeyer, MAXON Computer GmbH -class btConvexHullComputer -{ -private: - btScalar compute(const void* coords, bool doubleCoords, int stride, int count, btScalar shrink, btScalar shrinkClamp); - -public: - class Edge - { - private: - int next; - int reverse; - int targetVertex; - - friend class btConvexHullComputer; - - public: - int getSourceVertex() const - { - return (this + reverse)->targetVertex; - } - - int getTargetVertex() const - { - return targetVertex; - } - - const Edge* getNextEdgeOfVertex() const // clockwise list of all edges of a vertex - { - return this + next; - } - - const Edge* getNextEdgeOfFace() const // counter-clockwise list of all edges of a face - { - return (this + reverse)->getNextEdgeOfVertex(); - } - - const Edge* getReverseEdge() const - { - return this + reverse; - } - }; - - // Vertices of the output hull - btAlignedObjectArray vertices; - - // The original vertex index in the input coords array - btAlignedObjectArray original_vertex_index; - - // Edges of the output hull - btAlignedObjectArray edges; - - // Faces of the convex hull. Each entry is an index into the "edges" array pointing to an edge of the face. Faces are planar n-gons - btAlignedObjectArray faces; - - /* - Compute convex hull of "count" vertices stored in "coords". "stride" is the difference in bytes - between the addresses of consecutive vertices. If "shrink" is positive, the convex hull is shrunken - by that amount (each face is moved by "shrink" length units towards the center along its normal). - If "shrinkClamp" is positive, "shrink" is clamped to not exceed "shrinkClamp * innerRadius", where "innerRadius" - is the minimum distance of a face to the center of the convex hull. - - The returned value is the amount by which the hull has been shrunken. If it is negative, the amount was so large - that the resulting convex hull is empty. - - The output convex hull can be found in the member variables "vertices", "edges", "faces". - */ - btScalar compute(const float* coords, int stride, int count, btScalar shrink, btScalar shrinkClamp) - { - return compute(coords, false, stride, count, shrink, shrinkClamp); - } - - // same as above, but double precision - btScalar compute(const double* coords, int stride, int count, btScalar shrink, btScalar shrinkClamp) - { - return compute(coords, true, stride, count, shrink, shrinkClamp); - } -}; - -#endif //BT_CONVEX_HULL_COMPUTER_H diff --git a/engine/inc/bullet/LinearMath/btCpuFeatureUtility.h b/engine/inc/bullet/LinearMath/btCpuFeatureUtility.h deleted file mode 100644 index 5e4b9a31..00000000 --- a/engine/inc/bullet/LinearMath/btCpuFeatureUtility.h +++ /dev/null @@ -1,88 +0,0 @@ - -#ifndef BT_CPU_UTILITY_H -#define BT_CPU_UTILITY_H - -#include "LinearMath/btScalar.h" - -#include //memset -#ifdef USE_SIMD -#include -#ifdef BT_ALLOW_SSE4 -#include -#endif //BT_ALLOW_SSE4 -#endif //USE_SIMD - -#if defined BT_USE_NEON -#define ARM_NEON_GCC_COMPATIBILITY 1 -#include -#include -#include //for sysctlbyname -#endif //BT_USE_NEON - -///Rudimentary btCpuFeatureUtility for CPU features: only report the features that Bullet actually uses (SSE4/FMA3, NEON_HPFP) -///We assume SSE2 in case BT_USE_SSE2 is defined in LinearMath/btScalar.h -class btCpuFeatureUtility -{ -public: - enum btCpuFeature - { - CPU_FEATURE_FMA3 = 1, - CPU_FEATURE_SSE4_1 = 2, - CPU_FEATURE_NEON_HPFP = 4 - }; - - static int getCpuFeatures() - { - static int capabilities = 0; - static bool testedCapabilities = false; - if (0 != testedCapabilities) - { - return capabilities; - } - -#ifdef BT_USE_NEON - { - uint32_t hasFeature = 0; - size_t featureSize = sizeof(hasFeature); - int err = sysctlbyname("hw.optional.neon_hpfp", &hasFeature, &featureSize, NULL, 0); - if (0 == err && hasFeature) - capabilities |= CPU_FEATURE_NEON_HPFP; - } -#endif //BT_USE_NEON - -#ifdef BT_ALLOW_SSE4 - { - int cpuInfo[4]; - memset(cpuInfo, 0, sizeof(cpuInfo)); - unsigned long long sseExt = 0; - __cpuid(cpuInfo, 1); - - bool osUsesXSAVE_XRSTORE = cpuInfo[2] & (1 << 27) || false; - bool cpuAVXSuport = cpuInfo[2] & (1 << 28) || false; - - if (osUsesXSAVE_XRSTORE && cpuAVXSuport) - { - sseExt = _xgetbv(0); - } - const int OSXSAVEFlag = (1UL << 27); - const int AVXFlag = ((1UL << 28) | OSXSAVEFlag); - const int FMAFlag = ((1UL << 12) | AVXFlag | OSXSAVEFlag); - if ((cpuInfo[2] & FMAFlag) == FMAFlag && (sseExt & 6) == 6) - { - capabilities |= btCpuFeatureUtility::CPU_FEATURE_FMA3; - } - - const int SSE41Flag = (1 << 19); - if (cpuInfo[2] & SSE41Flag) - { - capabilities |= btCpuFeatureUtility::CPU_FEATURE_SSE4_1; - } - } -#endif //BT_ALLOW_SSE4 - - testedCapabilities = true; - return capabilities; - } -}; - -#endif //BT_CPU_UTILITY_H diff --git a/engine/inc/bullet/LinearMath/btDefaultMotionState.h b/engine/inc/bullet/LinearMath/btDefaultMotionState.h deleted file mode 100644 index 14c40d36..00000000 --- a/engine/inc/bullet/LinearMath/btDefaultMotionState.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef BT_DEFAULT_MOTION_STATE_H -#define BT_DEFAULT_MOTION_STATE_H - -#include "btMotionState.h" - -///The btDefaultMotionState provides a common implementation to synchronize world transforms with offsets. -ATTRIBUTE_ALIGNED16(struct) -btDefaultMotionState : public btMotionState -{ - btTransform m_graphicsWorldTrans; - btTransform m_centerOfMassOffset; - btTransform m_startWorldTrans; - void* m_userPointer; - - BT_DECLARE_ALIGNED_ALLOCATOR(); - - btDefaultMotionState(const btTransform& startTrans = btTransform::getIdentity(), const btTransform& centerOfMassOffset = btTransform::getIdentity()) - : m_graphicsWorldTrans(startTrans), - m_centerOfMassOffset(centerOfMassOffset), - m_startWorldTrans(startTrans), - m_userPointer(0) - - { - } - - ///synchronizes world transform from user to physics - virtual void getWorldTransform(btTransform & centerOfMassWorldTrans) const - { - centerOfMassWorldTrans = m_graphicsWorldTrans * m_centerOfMassOffset.inverse(); - } - - ///synchronizes world transform from physics to user - ///Bullet only calls the update of worldtransform for active objects - virtual void setWorldTransform(const btTransform& centerOfMassWorldTrans) - { - m_graphicsWorldTrans = centerOfMassWorldTrans * m_centerOfMassOffset; - } -}; - -#endif //BT_DEFAULT_MOTION_STATE_H diff --git a/engine/inc/bullet/LinearMath/btGeometryUtil.h b/engine/inc/bullet/LinearMath/btGeometryUtil.h deleted file mode 100644 index 0ce5b76d..00000000 --- a/engine/inc/bullet/LinearMath/btGeometryUtil.h +++ /dev/null @@ -1,36 +0,0 @@ -/* -Copyright (c) 2003-2006 Gino van den Bergen / 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_GEOMETRY_UTIL_H -#define BT_GEOMETRY_UTIL_H - -#include "btVector3.h" -#include "btAlignedObjectArray.h" - -///The btGeometryUtil helper class provides a few methods to convert between plane equations and vertices. -class btGeometryUtil -{ -public: - static void getPlaneEquationsFromVertices(btAlignedObjectArray& vertices, btAlignedObjectArray& planeEquationsOut); - - static void getVerticesFromPlaneEquations(const btAlignedObjectArray& planeEquations, btAlignedObjectArray& verticesOut); - - static bool isInside(const btAlignedObjectArray& vertices, const btVector3& planeNormal, btScalar margin); - - static bool isPointInsidePlanes(const btAlignedObjectArray& planeEquations, const btVector3& point, btScalar margin); - - static bool areVerticesBehindPlane(const btVector3& planeNormal, const btAlignedObjectArray& vertices, btScalar margin); -}; - -#endif //BT_GEOMETRY_UTIL_H diff --git a/engine/inc/bullet/LinearMath/btGrahamScan2dConvexHull.h b/engine/inc/bullet/LinearMath/btGrahamScan2dConvexHull.h deleted file mode 100644 index 0fcb2859..00000000 --- a/engine/inc/bullet/LinearMath/btGrahamScan2dConvexHull.h +++ /dev/null @@ -1,129 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2011 Advanced Micro Devices, Inc. http://bulletphysics.org - -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 GRAHAM_SCAN_2D_CONVEX_HULL_H -#define GRAHAM_SCAN_2D_CONVEX_HULL_H - -#include "btVector3.h" -#include "btAlignedObjectArray.h" - -struct GrahamVector3 : public btVector3 -{ - GrahamVector3(const btVector3& org, int orgIndex) - : btVector3(org), - m_orgIndex(orgIndex) - { - } - btScalar m_angle; - int m_orgIndex; -}; - -struct btAngleCompareFunc -{ - btVector3 m_anchor; - btAngleCompareFunc(const btVector3& anchor) - : m_anchor(anchor) - { - } - bool operator()(const GrahamVector3& a, const GrahamVector3& b) const - { - if (a.m_angle != b.m_angle) - return a.m_angle < b.m_angle; - else - { - btScalar al = (a - m_anchor).length2(); - btScalar bl = (b - m_anchor).length2(); - if (al != bl) - return al < bl; - else - { - return a.m_orgIndex < b.m_orgIndex; - } - } - } -}; - -inline void GrahamScanConvexHull2D(btAlignedObjectArray& originalPoints, btAlignedObjectArray& hull, const btVector3& normalAxis) -{ - btVector3 axis0, axis1; - btPlaneSpace1(normalAxis, axis0, axis1); - - if (originalPoints.size() <= 1) - { - for (int i = 0; i < originalPoints.size(); i++) - hull.push_back(originalPoints[0]); - return; - } - //step1 : find anchor point with smallest projection on axis0 and move it to first location - for (int i = 0; i < originalPoints.size(); i++) - { - // const btVector3& left = originalPoints[i]; - // const btVector3& right = originalPoints[0]; - btScalar projL = originalPoints[i].dot(axis0); - btScalar projR = originalPoints[0].dot(axis0); - if (projL < projR) - { - originalPoints.swap(0, i); - } - } - - //also precompute angles - originalPoints[0].m_angle = -1e30f; - for (int i = 1; i < originalPoints.size(); i++) - { - btVector3 ar = originalPoints[i] - originalPoints[0]; - btScalar ar1 = axis1.dot(ar); - btScalar ar0 = axis0.dot(ar); - if (ar1 * ar1 + ar0 * ar0 < FLT_EPSILON) - { - originalPoints[i].m_angle = 0.0f; - } - else - { - originalPoints[i].m_angle = btAtan2Fast(ar1, ar0); - } - } - - //step 2: sort all points, based on 'angle' with this anchor - btAngleCompareFunc comp(originalPoints[0]); - originalPoints.quickSortInternal(comp, 1, originalPoints.size() - 1); - - int i; - for (i = 0; i < 2; i++) - hull.push_back(originalPoints[i]); - - //step 3: keep all 'convex' points and discard concave points (using back tracking) - for (; i != originalPoints.size(); i++) - { - bool isConvex = false; - while (!isConvex && hull.size() > 1) - { - btVector3& a = hull[hull.size() - 2]; - btVector3& b = hull[hull.size() - 1]; - isConvex = btCross(a - b, a - originalPoints[i]).dot(normalAxis) > 0; - if (!isConvex) - hull.pop_back(); - else - hull.push_back(originalPoints[i]); - } - - if (hull.size() == 1) - { - hull.push_back(originalPoints[i]); - } - } -} - -#endif //GRAHAM_SCAN_2D_CONVEX_HULL_H diff --git a/engine/inc/bullet/LinearMath/btHashMap.h b/engine/inc/bullet/LinearMath/btHashMap.h deleted file mode 100644 index 1fca0fb7..00000000 --- a/engine/inc/bullet/LinearMath/btHashMap.h +++ /dev/null @@ -1,470 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_HASH_MAP_H -#define BT_HASH_MAP_H - -#include -#include "btAlignedObjectArray.h" - -///very basic hashable string implementation, compatible with btHashMap -struct btHashString -{ - std::string m_string1; - unsigned int m_hash; - - SIMD_FORCE_INLINE unsigned int getHash() const - { - return m_hash; - } - - btHashString() - { - m_string1 = ""; - m_hash = 0; - } - btHashString(const char* name) - : m_string1(name) - { - /* magic numbers from http://www.isthe.com/chongo/tech/comp/fnv/ */ - static const unsigned int InitialFNV = 2166136261u; - static const unsigned int FNVMultiple = 16777619u; - - /* Fowler / Noll / Vo (FNV) Hash */ - unsigned int hash = InitialFNV; - - for (int i = 0; m_string1.c_str()[i]; i++) - { - hash = hash ^ (m_string1.c_str()[i]); /* xor the low 8 bits */ - hash = hash * FNVMultiple; /* multiply by the magic number */ - } - m_hash = hash; - } - - bool equals(const btHashString& other) const - { - return (m_string1 == other.m_string1); - } -}; - -const int BT_HASH_NULL = 0xffffffff; - -class btHashInt -{ - int m_uid; - -public: - btHashInt() - { - } - - btHashInt(int uid) : m_uid(uid) - { - } - - int getUid1() const - { - return m_uid; - } - - void setUid1(int uid) - { - m_uid = uid; - } - - bool equals(const btHashInt& other) const - { - return getUid1() == other.getUid1(); - } - //to our success - SIMD_FORCE_INLINE unsigned int getHash() const - { - unsigned int key = m_uid; - // Thomas Wang's hash - key += ~(key << 15); - key ^= (key >> 10); - key += (key << 3); - key ^= (key >> 6); - key += ~(key << 11); - key ^= (key >> 16); - - return key; - } -}; - -class btHashPtr -{ - union { - const void* m_pointer; - unsigned int m_hashValues[2]; - }; - -public: - btHashPtr(const void* ptr) - : m_pointer(ptr) - { - } - - const void* getPointer() const - { - return m_pointer; - } - - bool equals(const btHashPtr& other) const - { - return getPointer() == other.getPointer(); - } - - //to our success - SIMD_FORCE_INLINE unsigned int getHash() const - { - const bool VOID_IS_8 = ((sizeof(void*) == 8)); - - unsigned int key = VOID_IS_8 ? m_hashValues[0] + m_hashValues[1] : m_hashValues[0]; - // Thomas Wang's hash - key += ~(key << 15); - key ^= (key >> 10); - key += (key << 3); - key ^= (key >> 6); - key += ~(key << 11); - key ^= (key >> 16); - return key; - } -}; - -template -class btHashKeyPtr -{ - int m_uid; - -public: - btHashKeyPtr(int uid) : m_uid(uid) - { - } - - int getUid1() const - { - return m_uid; - } - - bool equals(const btHashKeyPtr& other) const - { - return getUid1() == other.getUid1(); - } - - //to our success - SIMD_FORCE_INLINE unsigned int getHash() const - { - unsigned int key = m_uid; - // Thomas Wang's hash - key += ~(key << 15); - key ^= (key >> 10); - key += (key << 3); - key ^= (key >> 6); - key += ~(key << 11); - key ^= (key >> 16); - return key; - } -}; - -template -class btHashKey -{ - int m_uid; - -public: - btHashKey(int uid) : m_uid(uid) - { - } - - int getUid1() const - { - return m_uid; - } - - bool equals(const btHashKey& other) const - { - return getUid1() == other.getUid1(); - } - //to our success - SIMD_FORCE_INLINE unsigned int getHash() const - { - unsigned int key = m_uid; - // Thomas Wang's hash - key += ~(key << 15); - key ^= (key >> 10); - key += (key << 3); - key ^= (key >> 6); - key += ~(key << 11); - key ^= (key >> 16); - return key; - } -}; - -///The btHashMap template class implements a generic and lightweight hashmap. -///A basic sample of how to use btHashMap is located in Demos\BasicDemo\main.cpp -template -class btHashMap -{ -protected: - btAlignedObjectArray m_hashTable; - btAlignedObjectArray m_next; - - btAlignedObjectArray m_valueArray; - btAlignedObjectArray m_keyArray; - - void growTables(const Key& /*key*/) - { - int newCapacity = m_valueArray.capacity(); - - if (m_hashTable.size() < newCapacity) - { - //grow hashtable and next table - int curHashtableSize = m_hashTable.size(); - - m_hashTable.resize(newCapacity); - m_next.resize(newCapacity); - - int i; - - for (i = 0; i < newCapacity; ++i) - { - m_hashTable[i] = BT_HASH_NULL; - } - for (i = 0; i < newCapacity; ++i) - { - m_next[i] = BT_HASH_NULL; - } - - for (i = 0; i < curHashtableSize; i++) - { - //const Value& value = m_valueArray[i]; - //const Key& key = m_keyArray[i]; - - int hashValue = m_keyArray[i].getHash() & (m_valueArray.capacity() - 1); // New hash value with new mask - m_next[i] = m_hashTable[hashValue]; - m_hashTable[hashValue] = i; - } - } - } - -public: - void insert(const Key& key, const Value& value) - { - int hash = key.getHash() & (m_valueArray.capacity() - 1); - - //replace value if the key is already there - int index = findIndex(key); - if (index != BT_HASH_NULL) - { - m_valueArray[index] = value; - return; - } - - int count = m_valueArray.size(); - int oldCapacity = m_valueArray.capacity(); - m_valueArray.push_back(value); - m_keyArray.push_back(key); - - int newCapacity = m_valueArray.capacity(); - if (oldCapacity < newCapacity) - { - growTables(key); - //hash with new capacity - hash = key.getHash() & (m_valueArray.capacity() - 1); - } - m_next[count] = m_hashTable[hash]; - m_hashTable[hash] = count; - } - - void remove(const Key& key) - { - int hash = key.getHash() & (m_valueArray.capacity() - 1); - - int pairIndex = findIndex(key); - - if (pairIndex == BT_HASH_NULL) - { - return; - } - - // Remove the pair from the hash table. - int index = m_hashTable[hash]; - btAssert(index != BT_HASH_NULL); - - int previous = BT_HASH_NULL; - while (index != pairIndex) - { - previous = index; - index = m_next[index]; - } - - if (previous != BT_HASH_NULL) - { - btAssert(m_next[previous] == pairIndex); - m_next[previous] = m_next[pairIndex]; - } - else - { - m_hashTable[hash] = m_next[pairIndex]; - } - - // We now move the last pair into spot of the - // pair being removed. We need to fix the hash - // table indices to support the move. - - int lastPairIndex = m_valueArray.size() - 1; - - // If the removed pair is the last pair, we are done. - if (lastPairIndex == pairIndex) - { - m_valueArray.pop_back(); - m_keyArray.pop_back(); - return; - } - - // Remove the last pair from the hash table. - int lastHash = m_keyArray[lastPairIndex].getHash() & (m_valueArray.capacity() - 1); - - index = m_hashTable[lastHash]; - btAssert(index != BT_HASH_NULL); - - previous = BT_HASH_NULL; - while (index != lastPairIndex) - { - previous = index; - index = m_next[index]; - } - - if (previous != BT_HASH_NULL) - { - btAssert(m_next[previous] == lastPairIndex); - m_next[previous] = m_next[lastPairIndex]; - } - else - { - m_hashTable[lastHash] = m_next[lastPairIndex]; - } - - // Copy the last pair into the remove pair's spot. - m_valueArray[pairIndex] = m_valueArray[lastPairIndex]; - m_keyArray[pairIndex] = m_keyArray[lastPairIndex]; - - // Insert the last pair into the hash table - m_next[pairIndex] = m_hashTable[lastHash]; - m_hashTable[lastHash] = pairIndex; - - m_valueArray.pop_back(); - m_keyArray.pop_back(); - } - - int size() const - { - return m_valueArray.size(); - } - - const Value* getAtIndex(int index) const - { - btAssert(index < m_valueArray.size()); - btAssert(index >= 0); - if (index >= 0 && index < m_valueArray.size()) - { - return &m_valueArray[index]; - } - return 0; - } - - Value* getAtIndex(int index) - { - btAssert(index < m_valueArray.size()); - btAssert(index >= 0); - if (index >= 0 && index < m_valueArray.size()) - { - return &m_valueArray[index]; - } - return 0; - } - - Key getKeyAtIndex(int index) - { - btAssert(index < m_keyArray.size()); - btAssert(index >= 0); - return m_keyArray[index]; - } - - const Key getKeyAtIndex(int index) const - { - btAssert(index < m_keyArray.size()); - btAssert(index >= 0); - return m_keyArray[index]; - } - - Value* operator[](const Key& key) - { - return find(key); - } - - const Value* operator[](const Key& key) const - { - return find(key); - } - - const Value* find(const Key& key) const - { - int index = findIndex(key); - if (index == BT_HASH_NULL) - { - return NULL; - } - return &m_valueArray[index]; - } - - Value* find(const Key& key) - { - int index = findIndex(key); - if (index == BT_HASH_NULL) - { - return NULL; - } - return &m_valueArray[index]; - } - - int findIndex(const Key& key) const - { - unsigned int hash = key.getHash() & (m_valueArray.capacity() - 1); - - if (hash >= (unsigned int)m_hashTable.size()) - { - return BT_HASH_NULL; - } - - int index = m_hashTable[hash]; - while ((index != BT_HASH_NULL) && key.equals(m_keyArray[index]) == false) - { - index = m_next[index]; - } - return index; - } - - void clear() - { - m_hashTable.clear(); - m_next.clear(); - m_valueArray.clear(); - m_keyArray.clear(); - } -}; - -#endif //BT_HASH_MAP_H diff --git a/engine/inc/bullet/LinearMath/btIDebugDraw.h b/engine/inc/bullet/LinearMath/btIDebugDraw.h deleted file mode 100644 index 82ec19a6..00000000 --- a/engine/inc/bullet/LinearMath/btIDebugDraw.h +++ /dev/null @@ -1,473 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_IDEBUG_DRAW__H -#define BT_IDEBUG_DRAW__H - -#include "btVector3.h" -#include "btTransform.h" - -///The btIDebugDraw interface class allows hooking up a debug renderer to visually debug simulations. -///Typical use case: create a debug drawer object, and assign it to a btCollisionWorld or btDynamicsWorld using setDebugDrawer and call debugDrawWorld. -///A class that implements the btIDebugDraw interface has to implement the drawLine method at a minimum. -///For color arguments the X,Y,Z components refer to Red, Green and Blue each in the range [0..1] -class btIDebugDraw -{ -public: - ATTRIBUTE_ALIGNED16(struct) - DefaultColors - { - btVector3 m_activeObject; - btVector3 m_deactivatedObject; - btVector3 m_wantsDeactivationObject; - btVector3 m_disabledDeactivationObject; - btVector3 m_disabledSimulationObject; - btVector3 m_aabb; - btVector3 m_contactPoint; - - DefaultColors() - : m_activeObject(1, 1, 1), - m_deactivatedObject(0, 1, 0), - m_wantsDeactivationObject(0, 1, 1), - m_disabledDeactivationObject(1, 0, 0), - m_disabledSimulationObject(1, 1, 0), - m_aabb(1, 0, 0), - m_contactPoint(1, 1, 0) - { - } - }; - - enum DebugDrawModes - { - DBG_NoDebug = 0, - DBG_DrawWireframe = 1, - DBG_DrawAabb = 2, - DBG_DrawFeaturesText = 4, - DBG_DrawContactPoints = 8, - DBG_NoDeactivation = 16, - DBG_NoHelpText = 32, - DBG_DrawText = 64, - DBG_ProfileTimings = 128, - DBG_EnableSatComparison = 256, - DBG_DisableBulletLCP = 512, - DBG_EnableCCD = 1024, - DBG_DrawConstraints = (1 << 11), - DBG_DrawConstraintLimits = (1 << 12), - DBG_FastWireframe = (1 << 13), - DBG_DrawNormals = (1 << 14), - DBG_DrawFrames = (1 << 15), - DBG_MAX_DEBUG_DRAW_MODE - }; - - virtual ~btIDebugDraw(){}; - - virtual DefaultColors getDefaultColors() const - { - DefaultColors colors; - return colors; - } - ///the default implementation for setDefaultColors has no effect. A derived class can implement it and store the colors. - virtual void setDefaultColors(const DefaultColors& /*colors*/) {} - - virtual void drawLine(const btVector3& from, const btVector3& to, const btVector3& color) = 0; - - virtual void drawLine(const btVector3& from, const btVector3& to, const btVector3& fromColor, const btVector3& toColor) - { - (void)toColor; - drawLine(from, to, fromColor); - } - - virtual void drawSphere(btScalar radius, const btTransform& transform, const btVector3& color) - { - btVector3 center = transform.getOrigin(); - btVector3 up = transform.getBasis().getColumn(1); - btVector3 axis = transform.getBasis().getColumn(0); - btScalar minTh = -SIMD_HALF_PI; - btScalar maxTh = SIMD_HALF_PI; - btScalar minPs = -SIMD_HALF_PI; - btScalar maxPs = SIMD_HALF_PI; - btScalar stepDegrees = 30.f; - drawSpherePatch(center, up, axis, radius, minTh, maxTh, minPs, maxPs, color, stepDegrees, false); - drawSpherePatch(center, up, -axis, radius, minTh, maxTh, minPs, maxPs, color, stepDegrees, false); - } - - virtual void drawSphere(const btVector3& p, btScalar radius, const btVector3& color) - { - btTransform tr; - tr.setIdentity(); - tr.setOrigin(p); - drawSphere(radius, tr, color); - } - - virtual void drawTriangle(const btVector3& v0, const btVector3& v1, const btVector3& v2, const btVector3& /*n0*/, const btVector3& /*n1*/, const btVector3& /*n2*/, const btVector3& color, btScalar alpha) - { - drawTriangle(v0, v1, v2, color, alpha); - } - virtual void drawTriangle(const btVector3& v0, const btVector3& v1, const btVector3& v2, const btVector3& color, btScalar /*alpha*/) - { - drawLine(v0, v1, color); - drawLine(v1, v2, color); - drawLine(v2, v0, color); - } - - virtual void drawContactPoint(const btVector3& PointOnB, const btVector3& normalOnB, btScalar distance, int lifeTime, const btVector3& color) = 0; - - virtual void reportErrorWarning(const char* warningString) = 0; - - virtual void draw3dText(const btVector3& location, const char* textString) = 0; - - virtual void setDebugMode(int debugMode) = 0; - - virtual int getDebugMode() const = 0; - - virtual void drawAabb(const btVector3& from, const btVector3& to, const btVector3& color) - { - btVector3 halfExtents = (to - from) * 0.5f; - btVector3 center = (to + from) * 0.5f; - int i, j; - - btVector3 edgecoord(1.f, 1.f, 1.f), pa, pb; - for (i = 0; i < 4; i++) - { - for (j = 0; j < 3; j++) - { - pa = btVector3(edgecoord[0] * halfExtents[0], edgecoord[1] * halfExtents[1], - edgecoord[2] * halfExtents[2]); - pa += center; - - int othercoord = j % 3; - edgecoord[othercoord] *= -1.f; - pb = btVector3(edgecoord[0] * halfExtents[0], edgecoord[1] * halfExtents[1], - edgecoord[2] * halfExtents[2]); - pb += center; - - drawLine(pa, pb, color); - } - edgecoord = btVector3(-1.f, -1.f, -1.f); - if (i < 3) - edgecoord[i] *= -1.f; - } - } - virtual void drawTransform(const btTransform& transform, btScalar orthoLen) - { - btVector3 start = transform.getOrigin(); - drawLine(start, start + transform.getBasis() * btVector3(orthoLen, 0, 0), btVector3(btScalar(1.), btScalar(0.3), btScalar(0.3))); - drawLine(start, start + transform.getBasis() * btVector3(0, orthoLen, 0), btVector3(btScalar(0.3), btScalar(1.), btScalar(0.3))); - drawLine(start, start + transform.getBasis() * btVector3(0, 0, orthoLen), btVector3(btScalar(0.3), btScalar(0.3), btScalar(1.))); - } - - virtual void drawArc(const btVector3& center, const btVector3& normal, const btVector3& axis, btScalar radiusA, btScalar radiusB, btScalar minAngle, btScalar maxAngle, - const btVector3& color, bool drawSect, btScalar stepDegrees = btScalar(10.f)) - { - const btVector3& vx = axis; - btVector3 vy = normal.cross(axis); - btScalar step = stepDegrees * SIMD_RADS_PER_DEG; - int nSteps = (int)btFabs((maxAngle - minAngle) / step); - if (!nSteps) nSteps = 1; - btVector3 prev = center + radiusA * vx * btCos(minAngle) + radiusB * vy * btSin(minAngle); - if (drawSect) - { - drawLine(center, prev, color); - } - for (int i = 1; i <= nSteps; i++) - { - btScalar angle = minAngle + (maxAngle - minAngle) * btScalar(i) / btScalar(nSteps); - btVector3 next = center + radiusA * vx * btCos(angle) + radiusB * vy * btSin(angle); - drawLine(prev, next, color); - prev = next; - } - if (drawSect) - { - drawLine(center, prev, color); - } - } - virtual void drawSpherePatch(const btVector3& center, const btVector3& up, const btVector3& axis, btScalar radius, - btScalar minTh, btScalar maxTh, btScalar minPs, btScalar maxPs, const btVector3& color, btScalar stepDegrees = btScalar(10.f), bool drawCenter = true) - { - btVector3 vA[74]; - btVector3 vB[74]; - btVector3 *pvA = vA, *pvB = vB, *pT; - btVector3 npole = center + up * radius; - btVector3 spole = center - up * radius; - btVector3 arcStart; - btScalar step = stepDegrees * SIMD_RADS_PER_DEG; - const btVector3& kv = up; - const btVector3& iv = axis; - btVector3 jv = kv.cross(iv); - bool drawN = false; - bool drawS = false; - if (minTh <= -SIMD_HALF_PI) - { - minTh = -SIMD_HALF_PI + step; - drawN = true; - } - if (maxTh >= SIMD_HALF_PI) - { - maxTh = SIMD_HALF_PI - step; - drawS = true; - } - if (minTh > maxTh) - { - minTh = -SIMD_HALF_PI + step; - maxTh = SIMD_HALF_PI - step; - drawN = drawS = true; - } - int n_hor = (int)((maxTh - minTh) / step) + 1; - if (n_hor < 2) n_hor = 2; - btScalar step_h = (maxTh - minTh) / btScalar(n_hor - 1); - bool isClosed = false; - if (minPs > maxPs) - { - minPs = -SIMD_PI + step; - maxPs = SIMD_PI; - isClosed = true; - } - else if ((maxPs - minPs) >= SIMD_PI * btScalar(2.f)) - { - isClosed = true; - } - else - { - isClosed = false; - } - int n_vert = (int)((maxPs - minPs) / step) + 1; - if (n_vert < 2) n_vert = 2; - btScalar step_v = (maxPs - minPs) / btScalar(n_vert - 1); - for (int i = 0; i < n_hor; i++) - { - btScalar th = minTh + btScalar(i) * step_h; - btScalar sth = radius * btSin(th); - btScalar cth = radius * btCos(th); - for (int j = 0; j < n_vert; j++) - { - btScalar psi = minPs + btScalar(j) * step_v; - btScalar sps = btSin(psi); - btScalar cps = btCos(psi); - pvB[j] = center + cth * cps * iv + cth * sps * jv + sth * kv; - if (i) - { - drawLine(pvA[j], pvB[j], color); - } - else if (drawS) - { - drawLine(spole, pvB[j], color); - } - if (j) - { - drawLine(pvB[j - 1], pvB[j], color); - } - else - { - arcStart = pvB[j]; - } - if ((i == (n_hor - 1)) && drawN) - { - drawLine(npole, pvB[j], color); - } - - if (drawCenter) - { - if (isClosed) - { - if (j == (n_vert - 1)) - { - drawLine(arcStart, pvB[j], color); - } - } - else - { - if (((!i) || (i == (n_hor - 1))) && ((!j) || (j == (n_vert - 1)))) - { - drawLine(center, pvB[j], color); - } - } - } - } - pT = pvA; - pvA = pvB; - pvB = pT; - } - } - - virtual void drawBox(const btVector3& bbMin, const btVector3& bbMax, const btVector3& color) - { - drawLine(btVector3(bbMin[0], bbMin[1], bbMin[2]), btVector3(bbMax[0], bbMin[1], bbMin[2]), color); - drawLine(btVector3(bbMax[0], bbMin[1], bbMin[2]), btVector3(bbMax[0], bbMax[1], bbMin[2]), color); - drawLine(btVector3(bbMax[0], bbMax[1], bbMin[2]), btVector3(bbMin[0], bbMax[1], bbMin[2]), color); - drawLine(btVector3(bbMin[0], bbMax[1], bbMin[2]), btVector3(bbMin[0], bbMin[1], bbMin[2]), color); - drawLine(btVector3(bbMin[0], bbMin[1], bbMin[2]), btVector3(bbMin[0], bbMin[1], bbMax[2]), color); - drawLine(btVector3(bbMax[0], bbMin[1], bbMin[2]), btVector3(bbMax[0], bbMin[1], bbMax[2]), color); - drawLine(btVector3(bbMax[0], bbMax[1], bbMin[2]), btVector3(bbMax[0], bbMax[1], bbMax[2]), color); - drawLine(btVector3(bbMin[0], bbMax[1], bbMin[2]), btVector3(bbMin[0], bbMax[1], bbMax[2]), color); - drawLine(btVector3(bbMin[0], bbMin[1], bbMax[2]), btVector3(bbMax[0], bbMin[1], bbMax[2]), color); - drawLine(btVector3(bbMax[0], bbMin[1], bbMax[2]), btVector3(bbMax[0], bbMax[1], bbMax[2]), color); - drawLine(btVector3(bbMax[0], bbMax[1], bbMax[2]), btVector3(bbMin[0], bbMax[1], bbMax[2]), color); - drawLine(btVector3(bbMin[0], bbMax[1], bbMax[2]), btVector3(bbMin[0], bbMin[1], bbMax[2]), color); - } - virtual void drawBox(const btVector3& bbMin, const btVector3& bbMax, const btTransform& trans, const btVector3& color) - { - drawLine(trans * btVector3(bbMin[0], bbMin[1], bbMin[2]), trans * btVector3(bbMax[0], bbMin[1], bbMin[2]), color); - drawLine(trans * btVector3(bbMax[0], bbMin[1], bbMin[2]), trans * btVector3(bbMax[0], bbMax[1], bbMin[2]), color); - drawLine(trans * btVector3(bbMax[0], bbMax[1], bbMin[2]), trans * btVector3(bbMin[0], bbMax[1], bbMin[2]), color); - drawLine(trans * btVector3(bbMin[0], bbMax[1], bbMin[2]), trans * btVector3(bbMin[0], bbMin[1], bbMin[2]), color); - drawLine(trans * btVector3(bbMin[0], bbMin[1], bbMin[2]), trans * btVector3(bbMin[0], bbMin[1], bbMax[2]), color); - drawLine(trans * btVector3(bbMax[0], bbMin[1], bbMin[2]), trans * btVector3(bbMax[0], bbMin[1], bbMax[2]), color); - drawLine(trans * btVector3(bbMax[0], bbMax[1], bbMin[2]), trans * btVector3(bbMax[0], bbMax[1], bbMax[2]), color); - drawLine(trans * btVector3(bbMin[0], bbMax[1], bbMin[2]), trans * btVector3(bbMin[0], bbMax[1], bbMax[2]), color); - drawLine(trans * btVector3(bbMin[0], bbMin[1], bbMax[2]), trans * btVector3(bbMax[0], bbMin[1], bbMax[2]), color); - drawLine(trans * btVector3(bbMax[0], bbMin[1], bbMax[2]), trans * btVector3(bbMax[0], bbMax[1], bbMax[2]), color); - drawLine(trans * btVector3(bbMax[0], bbMax[1], bbMax[2]), trans * btVector3(bbMin[0], bbMax[1], bbMax[2]), color); - drawLine(trans * btVector3(bbMin[0], bbMax[1], bbMax[2]), trans * btVector3(bbMin[0], bbMin[1], bbMax[2]), color); - } - - virtual void drawCapsule(btScalar radius, btScalar halfHeight, int upAxis, const btTransform& transform, const btVector3& color) - { - int stepDegrees = 30; - - btVector3 capStart(0.f, 0.f, 0.f); - capStart[upAxis] = -halfHeight; - - btVector3 capEnd(0.f, 0.f, 0.f); - capEnd[upAxis] = halfHeight; - - // Draw the ends - { - btTransform childTransform = transform; - childTransform.getOrigin() = transform * capStart; - { - btVector3 center = childTransform.getOrigin(); - btVector3 up = childTransform.getBasis().getColumn((upAxis + 1) % 3); - btVector3 axis = -childTransform.getBasis().getColumn(upAxis); - btScalar minTh = -SIMD_HALF_PI; - btScalar maxTh = SIMD_HALF_PI; - btScalar minPs = -SIMD_HALF_PI; - btScalar maxPs = SIMD_HALF_PI; - - drawSpherePatch(center, up, axis, radius, minTh, maxTh, minPs, maxPs, color, btScalar(stepDegrees), false); - } - } - - { - btTransform childTransform = transform; - childTransform.getOrigin() = transform * capEnd; - { - btVector3 center = childTransform.getOrigin(); - btVector3 up = childTransform.getBasis().getColumn((upAxis + 1) % 3); - btVector3 axis = childTransform.getBasis().getColumn(upAxis); - btScalar minTh = -SIMD_HALF_PI; - btScalar maxTh = SIMD_HALF_PI; - btScalar minPs = -SIMD_HALF_PI; - btScalar maxPs = SIMD_HALF_PI; - drawSpherePatch(center, up, axis, radius, minTh, maxTh, minPs, maxPs, color, btScalar(stepDegrees), false); - } - } - - // Draw some additional lines - btVector3 start = transform.getOrigin(); - - for (int i = 0; i < 360; i += stepDegrees) - { - capEnd[(upAxis + 1) % 3] = capStart[(upAxis + 1) % 3] = btSin(btScalar(i) * SIMD_RADS_PER_DEG) * radius; - capEnd[(upAxis + 2) % 3] = capStart[(upAxis + 2) % 3] = btCos(btScalar(i) * SIMD_RADS_PER_DEG) * radius; - drawLine(start + transform.getBasis() * capStart, start + transform.getBasis() * capEnd, color); - } - } - - virtual void drawCylinder(btScalar radius, btScalar halfHeight, int upAxis, const btTransform& transform, const btVector3& color) - { - btVector3 start = transform.getOrigin(); - btVector3 offsetHeight(0, 0, 0); - offsetHeight[upAxis] = halfHeight; - int stepDegrees = 30; - btVector3 capStart(0.f, 0.f, 0.f); - capStart[upAxis] = -halfHeight; - btVector3 capEnd(0.f, 0.f, 0.f); - capEnd[upAxis] = halfHeight; - - for (int i = 0; i < 360; i += stepDegrees) - { - capEnd[(upAxis + 1) % 3] = capStart[(upAxis + 1) % 3] = btSin(btScalar(i) * SIMD_RADS_PER_DEG) * radius; - capEnd[(upAxis + 2) % 3] = capStart[(upAxis + 2) % 3] = btCos(btScalar(i) * SIMD_RADS_PER_DEG) * radius; - drawLine(start + transform.getBasis() * capStart, start + transform.getBasis() * capEnd, color); - } - // Drawing top and bottom caps of the cylinder - btVector3 yaxis(0, 0, 0); - yaxis[upAxis] = btScalar(1.0); - btVector3 xaxis(0, 0, 0); - xaxis[(upAxis + 1) % 3] = btScalar(1.0); - drawArc(start - transform.getBasis() * (offsetHeight), transform.getBasis() * yaxis, transform.getBasis() * xaxis, radius, radius, 0, SIMD_2_PI, color, false, btScalar(10.0)); - drawArc(start + transform.getBasis() * (offsetHeight), transform.getBasis() * yaxis, transform.getBasis() * xaxis, radius, radius, 0, SIMD_2_PI, color, false, btScalar(10.0)); - } - - virtual void drawCone(btScalar radius, btScalar height, int upAxis, const btTransform& transform, const btVector3& color) - { - int stepDegrees = 30; - btVector3 start = transform.getOrigin(); - - btVector3 offsetHeight(0, 0, 0); - btScalar halfHeight = height * btScalar(0.5); - offsetHeight[upAxis] = halfHeight; - btVector3 offsetRadius(0, 0, 0); - offsetRadius[(upAxis + 1) % 3] = radius; - btVector3 offset2Radius(0, 0, 0); - offset2Radius[(upAxis + 2) % 3] = radius; - - btVector3 capEnd(0.f, 0.f, 0.f); - capEnd[upAxis] = -halfHeight; - - for (int i = 0; i < 360; i += stepDegrees) - { - capEnd[(upAxis + 1) % 3] = btSin(btScalar(i) * SIMD_RADS_PER_DEG) * radius; - capEnd[(upAxis + 2) % 3] = btCos(btScalar(i) * SIMD_RADS_PER_DEG) * radius; - drawLine(start + transform.getBasis() * (offsetHeight), start + transform.getBasis() * capEnd, color); - } - - drawLine(start + transform.getBasis() * (offsetHeight), start + transform.getBasis() * (-offsetHeight + offsetRadius), color); - drawLine(start + transform.getBasis() * (offsetHeight), start + transform.getBasis() * (-offsetHeight - offsetRadius), color); - drawLine(start + transform.getBasis() * (offsetHeight), start + transform.getBasis() * (-offsetHeight + offset2Radius), color); - drawLine(start + transform.getBasis() * (offsetHeight), start + transform.getBasis() * (-offsetHeight - offset2Radius), color); - - // Drawing the base of the cone - btVector3 yaxis(0, 0, 0); - yaxis[upAxis] = btScalar(1.0); - btVector3 xaxis(0, 0, 0); - xaxis[(upAxis + 1) % 3] = btScalar(1.0); - drawArc(start - transform.getBasis() * (offsetHeight), transform.getBasis() * yaxis, transform.getBasis() * xaxis, radius, radius, 0, SIMD_2_PI, color, false, 10.0); - } - - virtual void drawPlane(const btVector3& planeNormal, btScalar planeConst, const btTransform& transform, const btVector3& color) - { - 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; - drawLine(transform * pt0, transform * pt1, color); - drawLine(transform * pt2, transform * pt3, color); - } - - virtual void clearLines() - { - } - - virtual void flushLines() - { - } -}; - -#endif //BT_IDEBUG_DRAW__H diff --git a/engine/inc/bullet/LinearMath/btImplicitQRSVD.h b/engine/inc/bullet/LinearMath/btImplicitQRSVD.h deleted file mode 100644 index aaedc964..00000000 --- a/engine/inc/bullet/LinearMath/btImplicitQRSVD.h +++ /dev/null @@ -1,916 +0,0 @@ -/** - Bullet Continuous Collision Detection and Physics Library - Copyright (c) 2019 Google Inc. http://bulletphysics.org - 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. - - Copyright (c) 2016 Theodore Gast, Chuyuan Fu, Chenfanfu Jiang, Joseph Teran - - Permission is hereby granted, free of charge, to any person obtaining a copy of - this software and associated documentation files (the "Software"), to deal in - the Software without restriction, including without limitation the rights to - use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies - of the Software, and to permit persons to whom the Software is furnished to do - so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - If the code is used in an article, the following paper shall be cited: - @techreport{qrsvd:2016, - title={Implicit-shifted Symmetric QR Singular Value Decomposition of 3x3 Matrices}, - author={Gast, Theodore and Fu, Chuyuan and Jiang, Chenfanfu and Teran, Joseph}, - year={2016}, - institution={University of California Los Angeles} - } - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. -**/ - -#ifndef btImplicitQRSVD_h -#define btImplicitQRSVD_h -#include -#include "btMatrix3x3.h" -class btMatrix2x2 -{ -public: - btScalar m_00, m_01, m_10, m_11; - btMatrix2x2(): m_00(0), m_10(0), m_01(0), m_11(0) - { - } - btMatrix2x2(const btMatrix2x2& other): m_00(other.m_00),m_01(other.m_01),m_10(other.m_10),m_11(other.m_11) - {} - btScalar& operator()(int i, int j) - { - if (i == 0 && j == 0) - return m_00; - if (i == 1 && j == 0) - return m_10; - if (i == 0 && j == 1) - return m_01; - if (i == 1 && j == 1) - return m_11; - btAssert(false); - return m_00; - } - const btScalar& operator()(int i, int j) const - { - if (i == 0 && j == 0) - return m_00; - if (i == 1 && j == 0) - return m_10; - if (i == 0 && j == 1) - return m_01; - if (i == 1 && j == 1) - return m_11; - btAssert(false); - return m_00; - } - void setIdentity() - { - m_00 = 1; - m_11 = 1; - m_01 = 0; - m_10 = 0; - } -}; - -static inline btScalar copySign(btScalar x, btScalar y) { - if ((x < 0 && y > 0) || (x > 0 && y < 0)) - return -x; - return x; -} - -/** - Class for givens rotation. - Row rotation G*A corresponds to something like - c -s 0 - ( s c 0 ) A - 0 0 1 - Column rotation A G' corresponds to something like - c -s 0 - A ( s c 0 ) - 0 0 1 - - c and s are always computed so that - ( c -s ) ( a ) = ( * ) - s c b ( 0 ) - - Assume rowi SIMD_EPSILON) { - btScalar sqrtd = btSqrt(d); - if (sqrtd>SIMD_EPSILON) - { - btScalar t = btScalar(1.0)/sqrtd; - c = a * t; - s = -b * t; - } - } - } - - /** - This function computes c and s so that - ( c -s ) ( a ) = ( 0 ) - s c b ( * ) - */ - inline void computeUnconventional(const btScalar a, const btScalar b) - { - btScalar d = a * a + b * b; - c = 0; - s = 1; - if (d > SIMD_EPSILON) { - btScalar t = btScalar(1.0)/btSqrt(d); - s = a * t; - c = b * t; - } - } - /** - Fill the R with the entries of this rotation - */ - inline void fill(const btMatrix3x3& R) const - { - btMatrix3x3& A = const_cast(R); - A.setIdentity(); - A[rowi][rowi] = c; - A[rowk][rowi] = -s; - A[rowi][rowk] = s; - A[rowk][rowk] = c; - } - - inline void fill(const btMatrix2x2& R) const - { - btMatrix2x2& A = const_cast(R); - A(rowi,rowi) = c; - A(rowk,rowi) = -s; - A(rowi,rowk) = s; - A(rowk,rowk) = c; - } - - /** - This function does something like - c -s 0 - ( s c 0 ) A -> A - 0 0 1 - It only affects row i and row k of A. - */ - inline void rowRotation(btMatrix3x3& A) const - { - for (int j = 0; j < 3; j++) { - btScalar tau1 = A[rowi][j]; - btScalar tau2 = A[rowk][j]; - A[rowi][j] = c * tau1 - s * tau2; - A[rowk][j] = s * tau1 + c * tau2; - } - } - inline void rowRotation(btMatrix2x2& A) const - { - for (int j = 0; j < 2; j++) { - btScalar tau1 = A(rowi,j); - btScalar tau2 = A(rowk,j); - A(rowi,j) = c * tau1 - s * tau2; - A(rowk,j) = s * tau1 + c * tau2; - } - } - - /** - This function does something like - c s 0 - A ( -s c 0 ) -> A - 0 0 1 - It only affects column i and column k of A. - */ - inline void columnRotation(btMatrix3x3& A) const - { - for (int j = 0; j < 3; j++) { - btScalar tau1 = A[j][rowi]; - btScalar tau2 = A[j][rowk]; - A[j][rowi] = c * tau1 - s * tau2; - A[j][rowk] = s * tau1 + c * tau2; - } - } - inline void columnRotation(btMatrix2x2& A) const - { - for (int j = 0; j < 2; j++) { - btScalar tau1 = A(j,rowi); - btScalar tau2 = A(j,rowk); - A(j,rowi) = c * tau1 - s * tau2; - A(j,rowk) = s * tau1 + c * tau2; - } - } - - /** - Multiply givens must be for same row and column - **/ - inline void operator*=(const GivensRotation& A) - { - btScalar new_c = c * A.c - s * A.s; - btScalar new_s = s * A.c + c * A.s; - c = new_c; - s = new_s; - } - - /** - Multiply givens must be for same row and column - **/ - inline GivensRotation operator*(const GivensRotation& A) const - { - GivensRotation r(*this); - r *= A; - return r; - } -}; - -/** - \brief zero chasing the 3X3 matrix to bidiagonal form - original form of H: x x 0 - x x x - 0 0 x - after zero chase: - x x 0 - 0 x x - 0 0 x - */ -inline void zeroChase(btMatrix3x3& H, btMatrix3x3& U, btMatrix3x3& V) -{ - - /** - Reduce H to of form - x x + - 0 x x - 0 0 x - */ - GivensRotation r1(H[0][0], H[1][0], 0, 1); - /** - Reduce H to of form - x x 0 - 0 x x - 0 + x - Can calculate r2 without multiplying by r1 since both entries are in first two - rows thus no need to divide by sqrt(a^2+b^2) - */ - GivensRotation r2(1, 2); - if (H[1][0] != 0) - r2.compute(H[0][0] * H[0][1] + H[1][0] * H[1][1], H[0][0] * H[0][2] + H[1][0] * H[1][2]); - else - r2.compute(H[0][1], H[0][2]); - - r1.rowRotation(H); - - /* GivensRotation r2(H(0, 1), H(0, 2), 1, 2); */ - r2.columnRotation(H); - r2.columnRotation(V); - - /** - Reduce H to of form - x x 0 - 0 x x - 0 0 x - */ - GivensRotation r3(H[1][1], H[2][1], 1, 2); - r3.rowRotation(H); - - // Save this till end for better cache coherency - // r1.rowRotation(u_transpose); - // r3.rowRotation(u_transpose); - r1.columnRotation(U); - r3.columnRotation(U); -} - -/** - \brief make a 3X3 matrix to upper bidiagonal form - original form of H: x x x - x x x - x x x - after zero chase: - x x 0 - 0 x x - 0 0 x - */ -inline void makeUpperBidiag(btMatrix3x3& H, btMatrix3x3& U, btMatrix3x3& V) -{ - U.setIdentity(); - V.setIdentity(); - - /** - Reduce H to of form - x x x - x x x - 0 x x - */ - - GivensRotation r(H[1][0], H[2][0], 1, 2); - r.rowRotation(H); - // r.rowRotation(u_transpose); - r.columnRotation(U); - // zeroChase(H, u_transpose, V); - zeroChase(H, U, V); -} - -/** - \brief make a 3X3 matrix to lambda shape - original form of H: x x x - * x x x - * x x x - after : - * x 0 0 - * x x 0 - * x 0 x - */ -inline void makeLambdaShape(btMatrix3x3& H, btMatrix3x3& U, btMatrix3x3& V) -{ - U.setIdentity(); - V.setIdentity(); - - /** - Reduce H to of form - * x x 0 - * x x x - * x x x - */ - - GivensRotation r1(H[0][1], H[0][2], 1, 2); - r1.columnRotation(H); - r1.columnRotation(V); - - /** - Reduce H to of form - * x x 0 - * x x 0 - * x x x - */ - - r1.computeUnconventional(H[1][2], H[2][2]); - r1.rowRotation(H); - r1.columnRotation(U); - - /** - Reduce H to of form - * x x 0 - * x x 0 - * x 0 x - */ - - GivensRotation r2(H[2][0], H[2][1], 0, 1); - r2.columnRotation(H); - r2.columnRotation(V); - - /** - Reduce H to of form - * x 0 0 - * x x 0 - * x 0 x - */ - r2.computeUnconventional(H[0][1], H[1][1]); - r2.rowRotation(H); - r2.columnRotation(U); -} - -/** - \brief 2x2 polar decomposition. - \param[in] A matrix. - \param[out] R Robustly a rotation matrix. - \param[out] S_Sym Symmetric. Whole matrix is stored - - Polar guarantees negative sign is on the small magnitude singular value. - S is guaranteed to be the closest one to identity. - R is guaranteed to be the closest rotation to A. - */ -inline void polarDecomposition(const btMatrix2x2& A, - GivensRotation& R, - const btMatrix2x2& S_Sym) -{ - btScalar a = (A(0, 0) + A(1, 1)), b = (A(1, 0) - A(0, 1)); - btScalar denominator = btSqrt(a*a+b*b); - R.c = (btScalar)1; - R.s = (btScalar)0; - if (denominator > SIMD_EPSILON) { - /* - No need to use a tolerance here because x(0) and x(1) always have - smaller magnitude then denominator, therefore overflow never happens. - In Bullet, we use a tolerance anyway. - */ - R.c = a / denominator; - R.s = -b / denominator; - } - btMatrix2x2& S = const_cast(S_Sym); - S = A; - R.rowRotation(S); -} - -inline void polarDecomposition(const btMatrix2x2& A, - const btMatrix2x2& R, - const btMatrix2x2& S_Sym) -{ - GivensRotation r(0, 1); - polarDecomposition(A, r, S_Sym); - r.fill(R); -} - -/** - \brief 2x2 SVD (singular value decomposition) A=USV' - \param[in] A Input matrix. - \param[out] U Robustly a rotation matrix in Givens form - \param[out] Sigma matrix of singular values sorted with decreasing magnitude. The second one can be negative. - \param[out] V Robustly a rotation matrix in Givens form - */ -inline void singularValueDecomposition( - const btMatrix2x2& A, - GivensRotation& U, - const btMatrix2x2& Sigma, - GivensRotation& V, - const btScalar tol = 64 * std::numeric_limits::epsilon()) -{ - btMatrix2x2& sigma = const_cast(Sigma); - sigma.setIdentity(); - btMatrix2x2 S_Sym; - polarDecomposition(A, U, S_Sym); - btScalar cosine, sine; - btScalar x = S_Sym(0, 0); - btScalar y = S_Sym(0, 1); - btScalar z = S_Sym(1, 1); - if (y == 0) { - // S is already diagonal - cosine = 1; - sine = 0; - sigma(0,0) = x; - sigma(1,1) = z; - } - else { - btScalar tau = 0.5 * (x - z); - btScalar val = tau * tau + y * y; - if (val > SIMD_EPSILON) - { - btScalar w = btSqrt(val); - // w > y > 0 - btScalar t; - if (tau > 0) { - // tau + w > w > y > 0 ==> division is safe - t = y / (tau + w); - } - else { - // tau - w < -w < -y < 0 ==> division is safe - t = y / (tau - w); - } - cosine = btScalar(1) / btSqrt(t * t + btScalar(1)); - sine = -t * cosine; - /* - V = [cosine -sine; sine cosine] - Sigma = V'SV. Only compute the diagonals for efficiency. - Also utilize symmetry of S and don't form V yet. - */ - btScalar c2 = cosine * cosine; - btScalar csy = 2 * cosine * sine * y; - btScalar s2 = sine * sine; - sigma(0,0) = c2 * x - csy + s2 * z; - sigma(1,1) = s2 * x + csy + c2 * z; - } else - { - cosine = 1; - sine = 0; - sigma(0,0) = x; - sigma(1,1) = z; - } - } - - // Sorting - // Polar already guarantees negative sign is on the small magnitude singular value. - if (sigma(0,0) < sigma(1,1)) { - std::swap(sigma(0,0), sigma(1,1)); - V.c = -sine; - V.s = cosine; - } - else { - V.c = cosine; - V.s = sine; - } - U *= V; -} - -/** - \brief 2x2 SVD (singular value decomposition) A=USV' - \param[in] A Input matrix. - \param[out] U Robustly a rotation matrix. - \param[out] Sigma Vector of singular values sorted with decreasing magnitude. The second one can be negative. - \param[out] V Robustly a rotation matrix. - */ -inline void singularValueDecomposition( - const btMatrix2x2& A, - const btMatrix2x2& U, - const btMatrix2x2& Sigma, - const btMatrix2x2& V, - const btScalar tol = 64 * std::numeric_limits::epsilon()) -{ - GivensRotation gv(0, 1); - GivensRotation gu(0, 1); - singularValueDecomposition(A, gu, Sigma, gv); - - gu.fill(U); - gv.fill(V); -} - -/** - \brief compute wilkinsonShift of the block - a1 b1 - b1 a2 - based on the wilkinsonShift formula - mu = c + d - sign (d) \ sqrt (d*d + b*b), where d = (a-c)/2 - - */ -inline btScalar wilkinsonShift(const btScalar a1, const btScalar b1, const btScalar a2) -{ - btScalar d = (btScalar)0.5 * (a1 - a2); - btScalar bs = b1 * b1; - btScalar val = d * d + bs; - if (val>SIMD_EPSILON) - { - btScalar denom = btFabs(d) + btSqrt(val); - - btScalar mu = a2 - copySign(bs / (denom), d); - // T mu = a2 - bs / ( d + sign_d*sqrt (d*d + bs)); - return mu; - } - return a2; -} - -/** - \brief Helper function of 3X3 SVD for processing 2X2 SVD - */ -template -inline void process(btMatrix3x3& B, btMatrix3x3& U, btVector3& sigma, btMatrix3x3& V) -{ - int other = (t == 1) ? 0 : 2; - GivensRotation u(0, 1); - GivensRotation v(0, 1); - sigma[other] = B[other][other]; - - btMatrix2x2 B_sub, sigma_sub; - if (t == 0) - { - B_sub.m_00 = B[0][0]; - B_sub.m_10 = B[1][0]; - B_sub.m_01 = B[0][1]; - B_sub.m_11 = B[1][1]; - sigma_sub.m_00 = sigma[0]; - sigma_sub.m_11 = sigma[1]; -// singularValueDecomposition(B.template block<2, 2>(t, t), u, sigma.template block<2, 1>(t, 0), v); - singularValueDecomposition(B_sub, u, sigma_sub, v); - B[0][0] = B_sub.m_00; - B[1][0] = B_sub.m_10; - B[0][1] = B_sub.m_01; - B[1][1] = B_sub.m_11; - sigma[0] = sigma_sub.m_00; - sigma[1] = sigma_sub.m_11; - } - else - { - B_sub.m_00 = B[1][1]; - B_sub.m_10 = B[2][1]; - B_sub.m_01 = B[1][2]; - B_sub.m_11 = B[2][2]; - sigma_sub.m_00 = sigma[1]; - sigma_sub.m_11 = sigma[2]; - // singularValueDecomposition(B.template block<2, 2>(t, t), u, sigma.template block<2, 1>(t, 0), v); - singularValueDecomposition(B_sub, u, sigma_sub, v); - B[1][1] = B_sub.m_00; - B[2][1] = B_sub.m_10; - B[1][2] = B_sub.m_01; - B[2][2] = B_sub.m_11; - sigma[1] = sigma_sub.m_00; - sigma[2] = sigma_sub.m_11; - } - u.rowi += t; - u.rowk += t; - v.rowi += t; - v.rowk += t; - u.columnRotation(U); - v.columnRotation(V); -} - -/** - \brief Helper function of 3X3 SVD for flipping signs due to flipping signs of sigma - */ -inline void flipSign(int i, btMatrix3x3& U, btVector3& sigma) -{ - sigma[i] = -sigma[i]; - U[0][i] = -U[0][i]; - U[1][i] = -U[1][i]; - U[2][i] = -U[2][i]; -} - -inline void flipSign(int i, btMatrix3x3& U) -{ - U[0][i] = -U[0][i]; - U[1][i] = -U[1][i]; - U[2][i] = -U[2][i]; -} - -inline void swapCol(btMatrix3x3& A, int i, int j) -{ - for (int d = 0; d < 3; ++d) - std::swap(A[d][i], A[d][j]); -} -/** - \brief Helper function of 3X3 SVD for sorting singular values - */ -inline void sort(btMatrix3x3& U, btVector3& sigma, btMatrix3x3& V, int t) -{ - if (t == 0) - { - // Case: sigma(0) > |sigma(1)| >= |sigma(2)| - if (btFabs(sigma[1]) >= btFabs(sigma[2])) { - if (sigma[1] < 0) { - flipSign(1, U, sigma); - flipSign(2, U, sigma); - } - return; - } - - //fix sign of sigma for both cases - if (sigma[2] < 0) { - flipSign(1, U, sigma); - flipSign(2, U, sigma); - } - - //swap sigma(1) and sigma(2) for both cases - std::swap(sigma[1], sigma[2]); - // swap the col 1 and col 2 for U,V - swapCol(U,1,2); - swapCol(V,1,2); - - // Case: |sigma(2)| >= sigma(0) > |simga(1)| - if (sigma[1] > sigma[0]) { - std::swap(sigma[0], sigma[1]); - swapCol(U,0,1); - swapCol(V,0,1); - } - - // Case: sigma(0) >= |sigma(2)| > |simga(1)| - else { - flipSign(2, U); - flipSign(2, V); - } - } - else if (t == 1) - { - // Case: |sigma(0)| >= sigma(1) > |sigma(2)| - if (btFabs(sigma[0]) >= sigma[1]) { - if (sigma[0] < 0) { - flipSign(0, U, sigma); - flipSign(2, U, sigma); - } - return; - } - - //swap sigma(0) and sigma(1) for both cases - std::swap(sigma[0], sigma[1]); - swapCol(U, 0, 1); - swapCol(V, 0, 1); - - // Case: sigma(1) > |sigma(2)| >= |sigma(0)| - if (btFabs(sigma[1]) < btFabs(sigma[2])) { - std::swap(sigma[1], sigma[2]); - swapCol(U, 1, 2); - swapCol(V, 1, 2); - } - - // Case: sigma(1) >= |sigma(0)| > |sigma(2)| - else { - flipSign(1, U); - flipSign(1, V); - } - - // fix sign for both cases - if (sigma[1] < 0) { - flipSign(1, U, sigma); - flipSign(2, U, sigma); - } - } -} - -/** - \brief 3X3 SVD (singular value decomposition) A=USV' - \param[in] A Input matrix. - \param[out] U is a rotation matrix. - \param[out] sigma Diagonal matrix, sorted with decreasing magnitude. The third one can be negative. - \param[out] V is a rotation matrix. - */ -inline int singularValueDecomposition(const btMatrix3x3& A, - btMatrix3x3& U, - btVector3& sigma, - btMatrix3x3& V, - btScalar tol = 128*std::numeric_limits::epsilon()) -{ -// using std::fabs; - btMatrix3x3 B = A; - U.setIdentity(); - V.setIdentity(); - - makeUpperBidiag(B, U, V); - - int count = 0; - btScalar mu = (btScalar)0; - GivensRotation r(0, 1); - - btScalar alpha_1 = B[0][0]; - btScalar beta_1 = B[0][1]; - btScalar alpha_2 = B[1][1]; - btScalar alpha_3 = B[2][2]; - btScalar beta_2 = B[1][2]; - btScalar gamma_1 = alpha_1 * beta_1; - btScalar gamma_2 = alpha_2 * beta_2; - btScalar val = alpha_1 * alpha_1 + alpha_2 * alpha_2 + alpha_3 * alpha_3 + beta_1 * beta_1 + beta_2 * beta_2; - if (val > SIMD_EPSILON) - { - tol *= btMax((btScalar)0.5 * btSqrt(val), (btScalar)1); - } - /** - Do implicit shift QR until A^T A is block diagonal - */ - int max_count = 100; - - while (btFabs(beta_2) > tol && btFabs(beta_1) > tol - && btFabs(alpha_1) > tol && btFabs(alpha_2) > tol - && btFabs(alpha_3) > tol - && count < max_count) { - mu = wilkinsonShift(alpha_2 * alpha_2 + beta_1 * beta_1, gamma_2, alpha_3 * alpha_3 + beta_2 * beta_2); - - r.compute(alpha_1 * alpha_1 - mu, gamma_1); - r.columnRotation(B); - - r.columnRotation(V); - zeroChase(B, U, V); - - alpha_1 = B[0][0]; - beta_1 = B[0][1]; - alpha_2 = B[1][1]; - alpha_3 = B[2][2]; - beta_2 = B[1][2]; - gamma_1 = alpha_1 * beta_1; - gamma_2 = alpha_2 * beta_2; - count++; - } - /** - Handle the cases of one of the alphas and betas being 0 - Sorted by ease of handling and then frequency - of occurrence - - If B is of form - x x 0 - 0 x 0 - 0 0 x - */ - if (btFabs(beta_2) <= tol) { - process<0>(B, U, sigma, V); - sort(U, sigma, V,0); - } - /** - If B is of form - x 0 0 - 0 x x - 0 0 x - */ - else if (btFabs(beta_1) <= tol) { - process<1>(B, U, sigma, V); - sort(U, sigma, V,1); - } - /** - If B is of form - x x 0 - 0 0 x - 0 0 x - */ - else if (btFabs(alpha_2) <= tol) { - /** - Reduce B to - x x 0 - 0 0 0 - 0 0 x - */ - GivensRotation r1(1, 2); - r1.computeUnconventional(B[1][2], B[2][2]); - r1.rowRotation(B); - r1.columnRotation(U); - - process<0>(B, U, sigma, V); - sort(U, sigma, V, 0); - } - /** - If B is of form - x x 0 - 0 x x - 0 0 0 - */ - else if (btFabs(alpha_3) <= tol) { - /** - Reduce B to - x x + - 0 x 0 - 0 0 0 - */ - GivensRotation r1(1, 2); - r1.compute(B[1][1], B[1][2]); - r1.columnRotation(B); - r1.columnRotation(V); - /** - Reduce B to - x x 0 - + x 0 - 0 0 0 - */ - GivensRotation r2(0, 2); - r2.compute(B[0][0], B[0][2]); - r2.columnRotation(B); - r2.columnRotation(V); - - process<0>(B, U, sigma, V); - sort(U, sigma, V, 0); - } - /** - If B is of form - 0 x 0 - 0 x x - 0 0 x - */ - else if (btFabs(alpha_1) <= tol) { - /** - Reduce B to - 0 0 + - 0 x x - 0 0 x - */ - GivensRotation r1(0, 1); - r1.computeUnconventional(B[0][1], B[1][1]); - r1.rowRotation(B); - r1.columnRotation(U); - - /** - Reduce B to - 0 0 0 - 0 x x - 0 + x - */ - GivensRotation r2(0, 2); - r2.computeUnconventional(B[0][2], B[2][2]); - r2.rowRotation(B); - r2.columnRotation(U); - - process<1>(B, U, sigma, V); - sort(U, sigma, V, 1); - } - - return count; -} -#endif /* btImplicitQRSVD_h */ diff --git a/engine/inc/bullet/LinearMath/btList.h b/engine/inc/bullet/LinearMath/btList.h deleted file mode 100644 index b255938c..00000000 --- a/engine/inc/bullet/LinearMath/btList.h +++ /dev/null @@ -1,73 +0,0 @@ -/* -Copyright (c) 2003-2006 Gino van den Bergen / 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_GEN_LIST_H -#define BT_GEN_LIST_H - -class btGEN_Link -{ -public: - btGEN_Link() : m_next(0), m_prev(0) {} - btGEN_Link(btGEN_Link *next, btGEN_Link *prev) : m_next(next), m_prev(prev) {} - - btGEN_Link *getNext() const { return m_next; } - btGEN_Link *getPrev() const { return m_prev; } - - bool isHead() const { return m_prev == 0; } - bool isTail() const { return m_next == 0; } - - void insertBefore(btGEN_Link *link) - { - m_next = link; - m_prev = link->m_prev; - m_next->m_prev = this; - m_prev->m_next = this; - } - - void insertAfter(btGEN_Link *link) - { - m_next = link->m_next; - m_prev = link; - m_next->m_prev = this; - m_prev->m_next = this; - } - - void remove() - { - m_next->m_prev = m_prev; - m_prev->m_next = m_next; - } - -private: - btGEN_Link *m_next; - btGEN_Link *m_prev; -}; - -class btGEN_List -{ -public: - btGEN_List() : m_head(&m_tail, 0), m_tail(0, &m_head) {} - - btGEN_Link *getHead() const { return m_head.getNext(); } - btGEN_Link *getTail() const { return m_tail.getPrev(); } - - void addHead(btGEN_Link *link) { link->insertAfter(&m_head); } - void addTail(btGEN_Link *link) { link->insertBefore(&m_tail); } - -private: - btGEN_Link m_head; - btGEN_Link m_tail; -}; - -#endif //BT_GEN_LIST_H diff --git a/engine/inc/bullet/LinearMath/btMatrix3x3.h b/engine/inc/bullet/LinearMath/btMatrix3x3.h deleted file mode 100644 index 9c90fee1..00000000 --- a/engine/inc/bullet/LinearMath/btMatrix3x3.h +++ /dev/null @@ -1,1431 +0,0 @@ -/* -Copyright (c) 2003-2006 Gino van den Bergen / 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_MATRIX3x3_H -#define BT_MATRIX3x3_H - -#include "btVector3.h" -#include "btQuaternion.h" -#include - -#ifdef BT_USE_SSE -//const __m128 ATTRIBUTE_ALIGNED16(v2220) = {2.0f, 2.0f, 2.0f, 0.0f}; -//const __m128 ATTRIBUTE_ALIGNED16(vMPPP) = {-0.0f, +0.0f, +0.0f, +0.0f}; -#define vMPPP (_mm_set_ps(+0.0f, +0.0f, +0.0f, -0.0f)) -#endif - -#if defined(BT_USE_SSE) -#define v0000 (_mm_set_ps(0.0f, 0.0f, 0.0f, 0.0f)) -#define v1000 (_mm_set_ps(0.0f, 0.0f, 0.0f, 1.0f)) -#define v0100 (_mm_set_ps(0.0f, 0.0f, 1.0f, 0.0f)) -#define v0010 (_mm_set_ps(0.0f, 1.0f, 0.0f, 0.0f)) -#elif defined(BT_USE_NEON) -const btSimdFloat4 ATTRIBUTE_ALIGNED16(v0000) = {0.0f, 0.0f, 0.0f, 0.0f}; -const btSimdFloat4 ATTRIBUTE_ALIGNED16(v1000) = {1.0f, 0.0f, 0.0f, 0.0f}; -const btSimdFloat4 ATTRIBUTE_ALIGNED16(v0100) = {0.0f, 1.0f, 0.0f, 0.0f}; -const btSimdFloat4 ATTRIBUTE_ALIGNED16(v0010) = {0.0f, 0.0f, 1.0f, 0.0f}; -#endif - -#ifdef BT_USE_DOUBLE_PRECISION -#define btMatrix3x3Data btMatrix3x3DoubleData -#else -#define btMatrix3x3Data btMatrix3x3FloatData -#endif //BT_USE_DOUBLE_PRECISION - -/**@brief The btMatrix3x3 class implements a 3x3 rotation matrix, to perform linear algebra in combination with btQuaternion, btTransform and btVector3. -* Make sure to only include a pure orthogonal matrix without scaling. */ -ATTRIBUTE_ALIGNED16(class) -btMatrix3x3 -{ - ///Data storage for the matrix, each vector is a row of the matrix - btVector3 m_el[3]; - -public: - /** @brief No initializaion constructor */ - btMatrix3x3() {} - - // explicit btMatrix3x3(const btScalar *m) { setFromOpenGLSubMatrix(m); } - - /**@brief Constructor from Quaternion */ - explicit btMatrix3x3(const btQuaternion& q) { setRotation(q); } - /* - template - Matrix3x3(const btScalar& yaw, const btScalar& pitch, const btScalar& roll) - { - setEulerYPR(yaw, pitch, roll); - } - */ - /** @brief Constructor with row major formatting */ - btMatrix3x3(const btScalar& xx, const btScalar& xy, const btScalar& xz, - const btScalar& yx, const btScalar& yy, const btScalar& yz, - const btScalar& zx, const btScalar& zy, const btScalar& zz) - { - setValue(xx, xy, xz, - yx, yy, yz, - zx, zy, zz); - } - -#if (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)) || defined(BT_USE_NEON) - SIMD_FORCE_INLINE btMatrix3x3(const btSimdFloat4 v0, const btSimdFloat4 v1, const btSimdFloat4 v2) - { - m_el[0].mVec128 = v0; - m_el[1].mVec128 = v1; - m_el[2].mVec128 = v2; - } - - SIMD_FORCE_INLINE btMatrix3x3(const btVector3& v0, const btVector3& v1, const btVector3& v2) - { - m_el[0] = v0; - m_el[1] = v1; - m_el[2] = v2; - } - - // Copy constructor - SIMD_FORCE_INLINE btMatrix3x3(const btMatrix3x3& rhs) - { - m_el[0].mVec128 = rhs.m_el[0].mVec128; - m_el[1].mVec128 = rhs.m_el[1].mVec128; - m_el[2].mVec128 = rhs.m_el[2].mVec128; - } - - // Assignment Operator - SIMD_FORCE_INLINE btMatrix3x3& operator=(const btMatrix3x3& m) - { - m_el[0].mVec128 = m.m_el[0].mVec128; - m_el[1].mVec128 = m.m_el[1].mVec128; - m_el[2].mVec128 = m.m_el[2].mVec128; - - return *this; - } - -#else - - /** @brief Copy constructor */ - SIMD_FORCE_INLINE btMatrix3x3(const btMatrix3x3& other) - { - m_el[0] = other.m_el[0]; - m_el[1] = other.m_el[1]; - m_el[2] = other.m_el[2]; - } - - /** @brief Assignment Operator */ - SIMD_FORCE_INLINE btMatrix3x3& operator=(const btMatrix3x3& other) - { - m_el[0] = other.m_el[0]; - m_el[1] = other.m_el[1]; - m_el[2] = other.m_el[2]; - return *this; - } - - SIMD_FORCE_INLINE btMatrix3x3(const btVector3& v0, const btVector3& v1, const btVector3& v2) - { - m_el[0] = v0; - m_el[1] = v1; - m_el[2] = v2; - } - -#endif - - /** @brief Get a column of the matrix as a vector - * @param i Column number 0 indexed */ - SIMD_FORCE_INLINE btVector3 getColumn(int i) const - { - return btVector3(m_el[0][i], m_el[1][i], m_el[2][i]); - } - - /** @brief Get a row of the matrix as a vector - * @param i Row number 0 indexed */ - SIMD_FORCE_INLINE const btVector3& getRow(int i) const - { - btFullAssert(0 <= i && i < 3); - return m_el[i]; - } - - /** @brief Get a mutable reference to a row of the matrix as a vector - * @param i Row number 0 indexed */ - SIMD_FORCE_INLINE btVector3& operator[](int i) - { - btFullAssert(0 <= i && i < 3); - return m_el[i]; - } - - /** @brief Get a const reference to a row of the matrix as a vector - * @param i Row number 0 indexed */ - SIMD_FORCE_INLINE const btVector3& operator[](int i) const - { - btFullAssert(0 <= i && i < 3); - return m_el[i]; - } - - /** @brief Multiply by the target matrix on the right - * @param m Rotation matrix to be applied - * Equivilant to this = this * m */ - btMatrix3x3& operator*=(const btMatrix3x3& m); - - /** @brief Adds by the target matrix on the right - * @param m matrix to be applied - * Equivilant to this = this + m */ - btMatrix3x3& operator+=(const btMatrix3x3& m); - - /** @brief Substractss by the target matrix on the right - * @param m matrix to be applied - * Equivilant to this = this - m */ - btMatrix3x3& operator-=(const btMatrix3x3& m); - - /** @brief Set from the rotational part of a 4x4 OpenGL matrix - * @param m A pointer to the beginning of the array of scalars*/ - void setFromOpenGLSubMatrix(const btScalar* m) - { - m_el[0].setValue(m[0], m[4], m[8]); - m_el[1].setValue(m[1], m[5], m[9]); - m_el[2].setValue(m[2], m[6], m[10]); - } - /** @brief Set the values of the matrix explicitly (row major) - * @param xx Top left - * @param xy Top Middle - * @param xz Top Right - * @param yx Middle Left - * @param yy Middle Middle - * @param yz Middle Right - * @param zx Bottom Left - * @param zy Bottom Middle - * @param zz Bottom Right*/ - void setValue(const btScalar& xx, const btScalar& xy, const btScalar& xz, - const btScalar& yx, const btScalar& yy, const btScalar& yz, - const btScalar& zx, const btScalar& zy, const btScalar& zz) - { - m_el[0].setValue(xx, xy, xz); - m_el[1].setValue(yx, yy, yz); - m_el[2].setValue(zx, zy, zz); - } - - /** @brief Set the matrix from a quaternion - * @param q The Quaternion to match */ - void setRotation(const btQuaternion& q) - { - btScalar d = q.length2(); - btFullAssert(d != btScalar(0.0)); - btScalar s = btScalar(2.0) / d; - -#if defined BT_USE_SIMD_VECTOR3 && defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - __m128 vs, Q = q.get128(); - __m128i Qi = btCastfTo128i(Q); - __m128 Y, Z; - __m128 V1, V2, V3; - __m128 V11, V21, V31; - __m128 NQ = _mm_xor_ps(Q, btvMzeroMask); - __m128i NQi = btCastfTo128i(NQ); - - V1 = btCastiTo128f(_mm_shuffle_epi32(Qi, BT_SHUFFLE(1, 0, 2, 3))); // Y X Z W - V2 = _mm_shuffle_ps(NQ, Q, BT_SHUFFLE(0, 0, 1, 3)); // -X -X Y W - V3 = btCastiTo128f(_mm_shuffle_epi32(Qi, BT_SHUFFLE(2, 1, 0, 3))); // Z Y X W - V1 = _mm_xor_ps(V1, vMPPP); // change the sign of the first element - - V11 = btCastiTo128f(_mm_shuffle_epi32(Qi, BT_SHUFFLE(1, 1, 0, 3))); // Y Y X W - V21 = _mm_unpackhi_ps(Q, Q); // Z Z W W - V31 = _mm_shuffle_ps(Q, NQ, BT_SHUFFLE(0, 2, 0, 3)); // X Z -X -W - - V2 = V2 * V1; // - V1 = V1 * V11; // - V3 = V3 * V31; // - - V11 = _mm_shuffle_ps(NQ, Q, BT_SHUFFLE(2, 3, 1, 3)); // -Z -W Y W - V11 = V11 * V21; // - V21 = _mm_xor_ps(V21, vMPPP); // change the sign of the first element - V31 = _mm_shuffle_ps(Q, NQ, BT_SHUFFLE(3, 3, 1, 3)); // W W -Y -W - V31 = _mm_xor_ps(V31, vMPPP); // change the sign of the first element - Y = btCastiTo128f(_mm_shuffle_epi32(NQi, BT_SHUFFLE(3, 2, 0, 3))); // -W -Z -X -W - Z = btCastiTo128f(_mm_shuffle_epi32(Qi, BT_SHUFFLE(1, 0, 1, 3))); // Y X Y W - - vs = _mm_load_ss(&s); - V21 = V21 * Y; - V31 = V31 * Z; - - V1 = V1 + V11; - V2 = V2 + V21; - V3 = V3 + V31; - - vs = bt_splat3_ps(vs, 0); - // s ready - V1 = V1 * vs; - V2 = V2 * vs; - V3 = V3 * vs; - - V1 = V1 + v1000; - V2 = V2 + v0100; - V3 = V3 + v0010; - - m_el[0] = V1; - m_el[1] = V2; - m_el[2] = V3; -#else - btScalar xs = q.x() * s, ys = q.y() * s, zs = q.z() * s; - btScalar wx = q.w() * xs, wy = q.w() * ys, wz = q.w() * zs; - btScalar xx = q.x() * xs, xy = q.x() * ys, xz = q.x() * zs; - btScalar yy = q.y() * ys, yz = q.y() * zs, zz = q.z() * zs; - setValue( - btScalar(1.0) - (yy + zz), xy - wz, xz + wy, - xy + wz, btScalar(1.0) - (xx + zz), yz - wx, - xz - wy, yz + wx, btScalar(1.0) - (xx + yy)); -#endif - } - - /** @brief Set the matrix from euler angles using YPR around YXZ respectively - * @param yaw Yaw about Y axis - * @param pitch Pitch about X axis - * @param roll Roll about Z axis - */ - void setEulerYPR(const btScalar& yaw, const btScalar& pitch, const btScalar& roll) - { - setEulerZYX(roll, pitch, yaw); - } - - /** @brief Set the matrix from euler angles YPR around ZYX axes - * @param eulerX Roll about X axis - * @param eulerY Pitch around Y axis - * @param eulerZ Yaw about Z axis - * - * These angles are used to produce a rotation matrix. The euler - * angles are applied in ZYX order. I.e a vector is first rotated - * about X then Y and then Z - **/ - void setEulerZYX(btScalar eulerX, btScalar eulerY, btScalar eulerZ) - { - ///@todo proposed to reverse this since it's labeled zyx but takes arguments xyz and it will match all other parts of the code - btScalar ci(btCos(eulerX)); - btScalar cj(btCos(eulerY)); - btScalar ch(btCos(eulerZ)); - btScalar si(btSin(eulerX)); - btScalar sj(btSin(eulerY)); - btScalar sh(btSin(eulerZ)); - btScalar cc = ci * ch; - btScalar cs = ci * sh; - btScalar sc = si * ch; - btScalar ss = si * sh; - - setValue(cj * ch, sj * sc - cs, sj * cc + ss, - cj * sh, sj * ss + cc, sj * cs - sc, - -sj, cj * si, cj * ci); - } - - /**@brief Set the matrix to the identity */ - void setIdentity() - { -#if (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)) || defined(BT_USE_NEON) - m_el[0] = v1000; - m_el[1] = v0100; - m_el[2] = v0010; -#else - setValue(btScalar(1.0), btScalar(0.0), btScalar(0.0), - btScalar(0.0), btScalar(1.0), btScalar(0.0), - btScalar(0.0), btScalar(0.0), btScalar(1.0)); -#endif - } - - /**@brief Set the matrix to the identity */ - void setZero() - { -#if (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)) || defined(BT_USE_NEON) - m_el[0] = v0000; - m_el[1] = v0000; - m_el[2] = v0000; -#else - setValue(btScalar(0.0), btScalar(0.0), btScalar(0.0), - btScalar(0.0), btScalar(0.0), btScalar(0.0), - btScalar(0.0), btScalar(0.0), btScalar(0.0)); -#endif - } - - static const btMatrix3x3& getIdentity() - { -#if (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)) || defined(BT_USE_NEON) - static const btMatrix3x3 - identityMatrix(v1000, v0100, v0010); -#else - static const btMatrix3x3 - identityMatrix( - btScalar(1.0), btScalar(0.0), btScalar(0.0), - btScalar(0.0), btScalar(1.0), btScalar(0.0), - btScalar(0.0), btScalar(0.0), btScalar(1.0)); -#endif - return identityMatrix; - } - - /**@brief Fill the rotational part of an OpenGL matrix and clear the shear/perspective - * @param m The array to be filled */ - void getOpenGLSubMatrix(btScalar * m) const - { -#if defined BT_USE_SIMD_VECTOR3 && defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - __m128 v0 = m_el[0].mVec128; - __m128 v1 = m_el[1].mVec128; - __m128 v2 = m_el[2].mVec128; // x2 y2 z2 w2 - __m128* vm = (__m128*)m; - __m128 vT; - - v2 = _mm_and_ps(v2, btvFFF0fMask); // x2 y2 z2 0 - - vT = _mm_unpackhi_ps(v0, v1); // z0 z1 * * - v0 = _mm_unpacklo_ps(v0, v1); // x0 x1 y0 y1 - - v1 = _mm_shuffle_ps(v0, v2, BT_SHUFFLE(2, 3, 1, 3)); // y0 y1 y2 0 - v0 = _mm_shuffle_ps(v0, v2, BT_SHUFFLE(0, 1, 0, 3)); // x0 x1 x2 0 - v2 = btCastdTo128f(_mm_move_sd(btCastfTo128d(v2), btCastfTo128d(vT))); // z0 z1 z2 0 - - vm[0] = v0; - vm[1] = v1; - vm[2] = v2; -#elif defined(BT_USE_NEON) - // note: zeros the w channel. We can preserve it at the cost of two more vtrn instructions. - static const uint32x2_t zMask = (const uint32x2_t){static_cast(-1), 0}; - float32x4_t* vm = (float32x4_t*)m; - float32x4x2_t top = vtrnq_f32(m_el[0].mVec128, m_el[1].mVec128); // {x0 x1 z0 z1}, {y0 y1 w0 w1} - float32x2x2_t bl = vtrn_f32(vget_low_f32(m_el[2].mVec128), vdup_n_f32(0.0f)); // {x2 0 }, {y2 0} - float32x4_t v0 = vcombine_f32(vget_low_f32(top.val[0]), bl.val[0]); - float32x4_t v1 = vcombine_f32(vget_low_f32(top.val[1]), bl.val[1]); - float32x2_t q = (float32x2_t)vand_u32((uint32x2_t)vget_high_f32(m_el[2].mVec128), zMask); - float32x4_t v2 = vcombine_f32(vget_high_f32(top.val[0]), q); // z0 z1 z2 0 - - vm[0] = v0; - vm[1] = v1; - vm[2] = v2; -#else - m[0] = btScalar(m_el[0].x()); - m[1] = btScalar(m_el[1].x()); - m[2] = btScalar(m_el[2].x()); - m[3] = btScalar(0.0); - m[4] = btScalar(m_el[0].y()); - m[5] = btScalar(m_el[1].y()); - m[6] = btScalar(m_el[2].y()); - m[7] = btScalar(0.0); - m[8] = btScalar(m_el[0].z()); - m[9] = btScalar(m_el[1].z()); - m[10] = btScalar(m_el[2].z()); - m[11] = btScalar(0.0); -#endif - } - - /**@brief Get the matrix represented as a quaternion - * @param q The quaternion which will be set */ - void getRotation(btQuaternion & q) const - { -#if (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)) || defined(BT_USE_NEON) - btScalar trace = m_el[0].x() + m_el[1].y() + m_el[2].z(); - btScalar s, x; - - union { - btSimdFloat4 vec; - btScalar f[4]; - } temp; - - if (trace > btScalar(0.0)) - { - x = trace + btScalar(1.0); - - temp.f[0] = m_el[2].y() - m_el[1].z(); - temp.f[1] = m_el[0].z() - m_el[2].x(); - temp.f[2] = m_el[1].x() - m_el[0].y(); - temp.f[3] = x; - //temp.f[3]= s * btScalar(0.5); - } - else - { - int i, j, k; - if (m_el[0].x() < m_el[1].y()) - { - if (m_el[1].y() < m_el[2].z()) - { - i = 2; - j = 0; - k = 1; - } - else - { - i = 1; - j = 2; - k = 0; - } - } - else - { - if (m_el[0].x() < m_el[2].z()) - { - i = 2; - j = 0; - k = 1; - } - else - { - i = 0; - j = 1; - k = 2; - } - } - - x = m_el[i][i] - m_el[j][j] - m_el[k][k] + btScalar(1.0); - - temp.f[3] = (m_el[k][j] - m_el[j][k]); - temp.f[j] = (m_el[j][i] + m_el[i][j]); - temp.f[k] = (m_el[k][i] + m_el[i][k]); - temp.f[i] = x; - //temp.f[i] = s * btScalar(0.5); - } - - s = btSqrt(x); - q.set128(temp.vec); - s = btScalar(0.5) / s; - - q *= s; -#else - btScalar trace = m_el[0].x() + m_el[1].y() + m_el[2].z(); - - btScalar temp[4]; - - if (trace > btScalar(0.0)) - { - btScalar s = btSqrt(trace + btScalar(1.0)); - temp[3] = (s * btScalar(0.5)); - s = btScalar(0.5) / s; - - temp[0] = ((m_el[2].y() - m_el[1].z()) * s); - temp[1] = ((m_el[0].z() - m_el[2].x()) * s); - temp[2] = ((m_el[1].x() - m_el[0].y()) * s); - } - else - { - int i = m_el[0].x() < m_el[1].y() ? (m_el[1].y() < m_el[2].z() ? 2 : 1) : (m_el[0].x() < m_el[2].z() ? 2 : 0); - int j = (i + 1) % 3; - int k = (i + 2) % 3; - - btScalar s = btSqrt(m_el[i][i] - m_el[j][j] - m_el[k][k] + btScalar(1.0)); - temp[i] = s * btScalar(0.5); - s = btScalar(0.5) / s; - - temp[3] = (m_el[k][j] - m_el[j][k]) * s; - temp[j] = (m_el[j][i] + m_el[i][j]) * s; - temp[k] = (m_el[k][i] + m_el[i][k]) * s; - } - q.setValue(temp[0], temp[1], temp[2], temp[3]); -#endif - } - - /**@brief Get the matrix represented as euler angles around YXZ, roundtrip with setEulerYPR - * @param yaw Yaw around Y axis - * @param pitch Pitch around X axis - * @param roll around Z axis */ - void getEulerYPR(btScalar & yaw, btScalar & pitch, btScalar & roll) const - { - // first use the normal calculus - yaw = btScalar(btAtan2(m_el[1].x(), m_el[0].x())); - pitch = btScalar(btAsin(-m_el[2].x())); - roll = btScalar(btAtan2(m_el[2].y(), m_el[2].z())); - - // on pitch = +/-HalfPI - if (btFabs(pitch) == SIMD_HALF_PI) - { - if (yaw > 0) - yaw -= SIMD_PI; - else - yaw += SIMD_PI; - - if (roll > 0) - roll -= SIMD_PI; - else - roll += SIMD_PI; - } - }; - - /**@brief Get the matrix represented as euler angles around ZYX - * @param yaw Yaw around Z axis - * @param pitch Pitch around Y axis - * @param roll around X axis - * @param solution_number Which solution of two possible solutions ( 1 or 2) are possible values*/ - void getEulerZYX(btScalar & yaw, btScalar & pitch, btScalar & roll, unsigned int solution_number = 1) const - { - struct Euler - { - btScalar yaw; - btScalar pitch; - btScalar roll; - }; - - Euler euler_out; - Euler euler_out2; //second solution - //get the pointer to the raw data - - // Check that pitch is not at a singularity - if (btFabs(m_el[2].x()) >= 1) - { - euler_out.yaw = 0; - euler_out2.yaw = 0; - - // From difference of angles formula - btScalar delta = btAtan2(m_el[0].x(), m_el[0].z()); - if (m_el[2].x() > 0) //gimbal locked up - { - euler_out.pitch = SIMD_PI / btScalar(2.0); - euler_out2.pitch = SIMD_PI / btScalar(2.0); - euler_out.roll = euler_out.pitch + delta; - euler_out2.roll = euler_out.pitch + delta; - } - else // gimbal locked down - { - euler_out.pitch = -SIMD_PI / btScalar(2.0); - euler_out2.pitch = -SIMD_PI / btScalar(2.0); - euler_out.roll = -euler_out.pitch + delta; - euler_out2.roll = -euler_out.pitch + delta; - } - } - else - { - euler_out.pitch = -btAsin(m_el[2].x()); - euler_out2.pitch = SIMD_PI - euler_out.pitch; - - euler_out.roll = btAtan2(m_el[2].y() / btCos(euler_out.pitch), - m_el[2].z() / btCos(euler_out.pitch)); - euler_out2.roll = btAtan2(m_el[2].y() / btCos(euler_out2.pitch), - m_el[2].z() / btCos(euler_out2.pitch)); - - euler_out.yaw = btAtan2(m_el[1].x() / btCos(euler_out.pitch), - m_el[0].x() / btCos(euler_out.pitch)); - euler_out2.yaw = btAtan2(m_el[1].x() / btCos(euler_out2.pitch), - m_el[0].x() / btCos(euler_out2.pitch)); - } - - if (solution_number == 1) - { - yaw = euler_out.yaw; - pitch = euler_out.pitch; - roll = euler_out.roll; - } - else - { - yaw = euler_out2.yaw; - pitch = euler_out2.pitch; - roll = euler_out2.roll; - } - } - - /**@brief Create a scaled copy of the matrix - * @param s Scaling vector The elements of the vector will scale each column */ - - btMatrix3x3 scaled(const btVector3& s) const - { -#if (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)) || defined(BT_USE_NEON) - return btMatrix3x3(m_el[0] * s, m_el[1] * s, m_el[2] * s); -#else - return btMatrix3x3( - m_el[0].x() * s.x(), m_el[0].y() * s.y(), m_el[0].z() * s.z(), - m_el[1].x() * s.x(), m_el[1].y() * s.y(), m_el[1].z() * s.z(), - m_el[2].x() * s.x(), m_el[2].y() * s.y(), m_el[2].z() * s.z()); -#endif - } - - /**@brief Return the determinant of the matrix */ - btScalar determinant() const; - /**@brief Return the adjoint of the matrix */ - btMatrix3x3 adjoint() const; - /**@brief Return the matrix with all values non negative */ - btMatrix3x3 absolute() const; - /**@brief Return the transpose of the matrix */ - btMatrix3x3 transpose() const; - /**@brief Return the inverse of the matrix */ - btMatrix3x3 inverse() const; - - /// Solve A * x = b, where b is a column vector. This is more efficient - /// than computing the inverse in one-shot cases. - ///Solve33 is from Box2d, thanks to Erin Catto, - btVector3 solve33(const btVector3& b) const - { - btVector3 col1 = getColumn(0); - btVector3 col2 = getColumn(1); - btVector3 col3 = getColumn(2); - - btScalar det = btDot(col1, btCross(col2, col3)); - if (btFabs(det) > SIMD_EPSILON) - { - det = 1.0f / det; - } - btVector3 x; - x[0] = det * btDot(b, btCross(col2, col3)); - x[1] = det * btDot(col1, btCross(b, col3)); - x[2] = det * btDot(col1, btCross(col2, b)); - return x; - } - - btMatrix3x3 transposeTimes(const btMatrix3x3& m) const; - btMatrix3x3 timesTranspose(const btMatrix3x3& m) const; - - SIMD_FORCE_INLINE btScalar tdotx(const btVector3& v) const - { - return m_el[0].x() * v.x() + m_el[1].x() * v.y() + m_el[2].x() * v.z(); - } - SIMD_FORCE_INLINE btScalar tdoty(const btVector3& v) const - { - return m_el[0].y() * v.x() + m_el[1].y() * v.y() + m_el[2].y() * v.z(); - } - SIMD_FORCE_INLINE btScalar tdotz(const btVector3& v) const - { - return m_el[0].z() * v.x() + m_el[1].z() * v.y() + m_el[2].z() * v.z(); - } - - ///extractRotation is from "A robust method to extract the rotational part of deformations" - ///See http://dl.acm.org/citation.cfm?doid=2994258.2994269 - ///decomposes a matrix A in a orthogonal matrix R and a - ///symmetric matrix S: - ///A = R*S. - ///note that R can include both rotation and scaling. - SIMD_FORCE_INLINE void extractRotation(btQuaternion & q, btScalar tolerance = 1.0e-9, int maxIter = 100) - { - int iter = 0; - btScalar w; - const btMatrix3x3& A = *this; - for (iter = 0; iter < maxIter; iter++) - { - btMatrix3x3 R(q); - btVector3 omega = (R.getColumn(0).cross(A.getColumn(0)) + R.getColumn(1).cross(A.getColumn(1)) + R.getColumn(2).cross(A.getColumn(2))) * (btScalar(1.0) / btFabs(R.getColumn(0).dot(A.getColumn(0)) + R.getColumn(1).dot(A.getColumn(1)) + R.getColumn(2).dot(A.getColumn(2))) + - tolerance); - w = omega.norm(); - if (w < tolerance) - break; - q = btQuaternion(btVector3((btScalar(1.0) / w) * omega), w) * - q; - q.normalize(); - } - } - - /**@brief diagonalizes this matrix by the Jacobi method. - * @param rot stores the rotation from the coordinate system in which the matrix is diagonal to the original - * coordinate system, i.e., old_this = rot * new_this * rot^T. - * @param threshold See iteration - * @param iteration The iteration stops when all off-diagonal elements are less than the threshold multiplied - * by the sum of the absolute values of the diagonal, or when maxSteps have been executed. - * - * Note that this matrix is assumed to be symmetric. - */ - void diagonalize(btMatrix3x3 & rot, btScalar threshold, int maxSteps) - { - rot.setIdentity(); - for (int step = maxSteps; step > 0; step--) - { - // find off-diagonal element [p][q] with largest magnitude - int p = 0; - int q = 1; - int r = 2; - btScalar max = btFabs(m_el[0][1]); - btScalar v = btFabs(m_el[0][2]); - if (v > max) - { - q = 2; - r = 1; - max = v; - } - v = btFabs(m_el[1][2]); - if (v > max) - { - p = 1; - q = 2; - r = 0; - max = v; - } - - btScalar t = threshold * (btFabs(m_el[0][0]) + btFabs(m_el[1][1]) + btFabs(m_el[2][2])); - if (max <= t) - { - if (max <= SIMD_EPSILON * t) - { - return; - } - step = 1; - } - - // compute Jacobi rotation J which leads to a zero for element [p][q] - btScalar mpq = m_el[p][q]; - btScalar theta = (m_el[q][q] - m_el[p][p]) / (2 * mpq); - btScalar theta2 = theta * theta; - btScalar cos; - btScalar sin; - if (theta2 * theta2 < btScalar(10 / SIMD_EPSILON)) - { - t = (theta >= 0) ? 1 / (theta + btSqrt(1 + theta2)) - : 1 / (theta - btSqrt(1 + theta2)); - cos = 1 / btSqrt(1 + t * t); - sin = cos * t; - } - else - { - // approximation for large theta-value, i.e., a nearly diagonal matrix - t = 1 / (theta * (2 + btScalar(0.5) / theta2)); - cos = 1 - btScalar(0.5) * t * t; - sin = cos * t; - } - - // apply rotation to matrix (this = J^T * this * J) - m_el[p][q] = m_el[q][p] = 0; - m_el[p][p] -= t * mpq; - m_el[q][q] += t * mpq; - btScalar mrp = m_el[r][p]; - btScalar mrq = m_el[r][q]; - m_el[r][p] = m_el[p][r] = cos * mrp - sin * mrq; - m_el[r][q] = m_el[q][r] = cos * mrq + sin * mrp; - - // apply rotation to rot (rot = rot * J) - for (int i = 0; i < 3; i++) - { - btVector3& row = rot[i]; - mrp = row[p]; - mrq = row[q]; - row[p] = cos * mrp - sin * mrq; - row[q] = cos * mrq + sin * mrp; - } - } - } - - /**@brief Calculate the matrix cofactor - * @param r1 The first row to use for calculating the cofactor - * @param c1 The first column to use for calculating the cofactor - * @param r1 The second row to use for calculating the cofactor - * @param c1 The second column to use for calculating the cofactor - * See http://en.wikipedia.org/wiki/Cofactor_(linear_algebra) for more details - */ - btScalar cofac(int r1, int c1, int r2, int c2) const - { - return m_el[r1][c1] * m_el[r2][c2] - m_el[r1][c2] * m_el[r2][c1]; - } - - void serialize(struct btMatrix3x3Data & dataOut) const; - - void serializeFloat(struct btMatrix3x3FloatData & dataOut) const; - - void deSerialize(const struct btMatrix3x3Data& dataIn); - - void deSerializeFloat(const struct btMatrix3x3FloatData& dataIn); - - void deSerializeDouble(const struct btMatrix3x3DoubleData& dataIn); -}; - -SIMD_FORCE_INLINE btMatrix3x3& -btMatrix3x3::operator*=(const btMatrix3x3& m) -{ -#if defined BT_USE_SIMD_VECTOR3 && defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - __m128 rv00, rv01, rv02; - __m128 rv10, rv11, rv12; - __m128 rv20, rv21, rv22; - __m128 mv0, mv1, mv2; - - rv02 = m_el[0].mVec128; - rv12 = m_el[1].mVec128; - rv22 = m_el[2].mVec128; - - mv0 = _mm_and_ps(m[0].mVec128, btvFFF0fMask); - mv1 = _mm_and_ps(m[1].mVec128, btvFFF0fMask); - mv2 = _mm_and_ps(m[2].mVec128, btvFFF0fMask); - - // rv0 - rv00 = bt_splat_ps(rv02, 0); - rv01 = bt_splat_ps(rv02, 1); - rv02 = bt_splat_ps(rv02, 2); - - rv00 = _mm_mul_ps(rv00, mv0); - rv01 = _mm_mul_ps(rv01, mv1); - rv02 = _mm_mul_ps(rv02, mv2); - - // rv1 - rv10 = bt_splat_ps(rv12, 0); - rv11 = bt_splat_ps(rv12, 1); - rv12 = bt_splat_ps(rv12, 2); - - rv10 = _mm_mul_ps(rv10, mv0); - rv11 = _mm_mul_ps(rv11, mv1); - rv12 = _mm_mul_ps(rv12, mv2); - - // rv2 - rv20 = bt_splat_ps(rv22, 0); - rv21 = bt_splat_ps(rv22, 1); - rv22 = bt_splat_ps(rv22, 2); - - rv20 = _mm_mul_ps(rv20, mv0); - rv21 = _mm_mul_ps(rv21, mv1); - rv22 = _mm_mul_ps(rv22, mv2); - - rv00 = _mm_add_ps(rv00, rv01); - rv10 = _mm_add_ps(rv10, rv11); - rv20 = _mm_add_ps(rv20, rv21); - - m_el[0].mVec128 = _mm_add_ps(rv00, rv02); - m_el[1].mVec128 = _mm_add_ps(rv10, rv12); - m_el[2].mVec128 = _mm_add_ps(rv20, rv22); - -#elif defined(BT_USE_NEON) - - float32x4_t rv0, rv1, rv2; - float32x4_t v0, v1, v2; - float32x4_t mv0, mv1, mv2; - - v0 = m_el[0].mVec128; - v1 = m_el[1].mVec128; - v2 = m_el[2].mVec128; - - mv0 = (float32x4_t)vandq_s32((int32x4_t)m[0].mVec128, btvFFF0Mask); - mv1 = (float32x4_t)vandq_s32((int32x4_t)m[1].mVec128, btvFFF0Mask); - mv2 = (float32x4_t)vandq_s32((int32x4_t)m[2].mVec128, btvFFF0Mask); - - rv0 = vmulq_lane_f32(mv0, vget_low_f32(v0), 0); - rv1 = vmulq_lane_f32(mv0, vget_low_f32(v1), 0); - rv2 = vmulq_lane_f32(mv0, vget_low_f32(v2), 0); - - rv0 = vmlaq_lane_f32(rv0, mv1, vget_low_f32(v0), 1); - rv1 = vmlaq_lane_f32(rv1, mv1, vget_low_f32(v1), 1); - rv2 = vmlaq_lane_f32(rv2, mv1, vget_low_f32(v2), 1); - - rv0 = vmlaq_lane_f32(rv0, mv2, vget_high_f32(v0), 0); - rv1 = vmlaq_lane_f32(rv1, mv2, vget_high_f32(v1), 0); - rv2 = vmlaq_lane_f32(rv2, mv2, vget_high_f32(v2), 0); - - m_el[0].mVec128 = rv0; - m_el[1].mVec128 = rv1; - m_el[2].mVec128 = rv2; -#else - setValue( - m.tdotx(m_el[0]), m.tdoty(m_el[0]), m.tdotz(m_el[0]), - m.tdotx(m_el[1]), m.tdoty(m_el[1]), m.tdotz(m_el[1]), - m.tdotx(m_el[2]), m.tdoty(m_el[2]), m.tdotz(m_el[2])); -#endif - return *this; -} - -SIMD_FORCE_INLINE btMatrix3x3& -btMatrix3x3::operator+=(const btMatrix3x3& m) -{ -#if (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)) || defined(BT_USE_NEON) - m_el[0].mVec128 = m_el[0].mVec128 + m.m_el[0].mVec128; - m_el[1].mVec128 = m_el[1].mVec128 + m.m_el[1].mVec128; - m_el[2].mVec128 = m_el[2].mVec128 + m.m_el[2].mVec128; -#else - setValue( - m_el[0][0] + m.m_el[0][0], - m_el[0][1] + m.m_el[0][1], - m_el[0][2] + m.m_el[0][2], - m_el[1][0] + m.m_el[1][0], - m_el[1][1] + m.m_el[1][1], - m_el[1][2] + m.m_el[1][2], - m_el[2][0] + m.m_el[2][0], - m_el[2][1] + m.m_el[2][1], - m_el[2][2] + m.m_el[2][2]); -#endif - return *this; -} - -SIMD_FORCE_INLINE btMatrix3x3 -operator*(const btMatrix3x3& m, const btScalar& k) -{ -#if (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)) - __m128 vk = bt_splat_ps(_mm_load_ss((float*)&k), 0x80); - return btMatrix3x3( - _mm_mul_ps(m[0].mVec128, vk), - _mm_mul_ps(m[1].mVec128, vk), - _mm_mul_ps(m[2].mVec128, vk)); -#elif defined(BT_USE_NEON) - return btMatrix3x3( - vmulq_n_f32(m[0].mVec128, k), - vmulq_n_f32(m[1].mVec128, k), - vmulq_n_f32(m[2].mVec128, k)); -#else - return btMatrix3x3( - m[0].x() * k, m[0].y() * k, m[0].z() * k, - m[1].x() * k, m[1].y() * k, m[1].z() * k, - m[2].x() * k, m[2].y() * k, m[2].z() * k); -#endif -} - -SIMD_FORCE_INLINE btMatrix3x3 -operator+(const btMatrix3x3& m1, const btMatrix3x3& m2) -{ -#if (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)) || defined(BT_USE_NEON) - return btMatrix3x3( - m1[0].mVec128 + m2[0].mVec128, - m1[1].mVec128 + m2[1].mVec128, - m1[2].mVec128 + m2[2].mVec128); -#else - return btMatrix3x3( - m1[0][0] + m2[0][0], - m1[0][1] + m2[0][1], - m1[0][2] + m2[0][2], - - m1[1][0] + m2[1][0], - m1[1][1] + m2[1][1], - m1[1][2] + m2[1][2], - - m1[2][0] + m2[2][0], - m1[2][1] + m2[2][1], - m1[2][2] + m2[2][2]); -#endif -} - -SIMD_FORCE_INLINE btMatrix3x3 -operator-(const btMatrix3x3& m1, const btMatrix3x3& m2) -{ -#if (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)) || defined(BT_USE_NEON) - return btMatrix3x3( - m1[0].mVec128 - m2[0].mVec128, - m1[1].mVec128 - m2[1].mVec128, - m1[2].mVec128 - m2[2].mVec128); -#else - return btMatrix3x3( - m1[0][0] - m2[0][0], - m1[0][1] - m2[0][1], - m1[0][2] - m2[0][2], - - m1[1][0] - m2[1][0], - m1[1][1] - m2[1][1], - m1[1][2] - m2[1][2], - - m1[2][0] - m2[2][0], - m1[2][1] - m2[2][1], - m1[2][2] - m2[2][2]); -#endif -} - -SIMD_FORCE_INLINE btMatrix3x3& -btMatrix3x3::operator-=(const btMatrix3x3& m) -{ -#if (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)) || defined(BT_USE_NEON) - m_el[0].mVec128 = m_el[0].mVec128 - m.m_el[0].mVec128; - m_el[1].mVec128 = m_el[1].mVec128 - m.m_el[1].mVec128; - m_el[2].mVec128 = m_el[2].mVec128 - m.m_el[2].mVec128; -#else - setValue( - m_el[0][0] - m.m_el[0][0], - m_el[0][1] - m.m_el[0][1], - m_el[0][2] - m.m_el[0][2], - m_el[1][0] - m.m_el[1][0], - m_el[1][1] - m.m_el[1][1], - m_el[1][2] - m.m_el[1][2], - m_el[2][0] - m.m_el[2][0], - m_el[2][1] - m.m_el[2][1], - m_el[2][2] - m.m_el[2][2]); -#endif - return *this; -} - -SIMD_FORCE_INLINE btScalar -btMatrix3x3::determinant() const -{ - return btTriple((*this)[0], (*this)[1], (*this)[2]); -} - -SIMD_FORCE_INLINE btMatrix3x3 -btMatrix3x3::absolute() const -{ -#if defined BT_USE_SIMD_VECTOR3 && (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)) - return btMatrix3x3( - _mm_and_ps(m_el[0].mVec128, btvAbsfMask), - _mm_and_ps(m_el[1].mVec128, btvAbsfMask), - _mm_and_ps(m_el[2].mVec128, btvAbsfMask)); -#elif defined(BT_USE_NEON) - return btMatrix3x3( - (float32x4_t)vandq_s32((int32x4_t)m_el[0].mVec128, btv3AbsMask), - (float32x4_t)vandq_s32((int32x4_t)m_el[1].mVec128, btv3AbsMask), - (float32x4_t)vandq_s32((int32x4_t)m_el[2].mVec128, btv3AbsMask)); -#else - return btMatrix3x3( - btFabs(m_el[0].x()), btFabs(m_el[0].y()), btFabs(m_el[0].z()), - btFabs(m_el[1].x()), btFabs(m_el[1].y()), btFabs(m_el[1].z()), - btFabs(m_el[2].x()), btFabs(m_el[2].y()), btFabs(m_el[2].z())); -#endif -} - -SIMD_FORCE_INLINE btMatrix3x3 -btMatrix3x3::transpose() const -{ -#if defined BT_USE_SIMD_VECTOR3 && (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)) - __m128 v0 = m_el[0].mVec128; - __m128 v1 = m_el[1].mVec128; - __m128 v2 = m_el[2].mVec128; // x2 y2 z2 w2 - __m128 vT; - - v2 = _mm_and_ps(v2, btvFFF0fMask); // x2 y2 z2 0 - - vT = _mm_unpackhi_ps(v0, v1); // z0 z1 * * - v0 = _mm_unpacklo_ps(v0, v1); // x0 x1 y0 y1 - - v1 = _mm_shuffle_ps(v0, v2, BT_SHUFFLE(2, 3, 1, 3)); // y0 y1 y2 0 - v0 = _mm_shuffle_ps(v0, v2, BT_SHUFFLE(0, 1, 0, 3)); // x0 x1 x2 0 - v2 = btCastdTo128f(_mm_move_sd(btCastfTo128d(v2), btCastfTo128d(vT))); // z0 z1 z2 0 - - return btMatrix3x3(v0, v1, v2); -#elif defined(BT_USE_NEON) - // note: zeros the w channel. We can preserve it at the cost of two more vtrn instructions. - static const uint32x2_t zMask = (const uint32x2_t){static_cast(-1), 0}; - float32x4x2_t top = vtrnq_f32(m_el[0].mVec128, m_el[1].mVec128); // {x0 x1 z0 z1}, {y0 y1 w0 w1} - float32x2x2_t bl = vtrn_f32(vget_low_f32(m_el[2].mVec128), vdup_n_f32(0.0f)); // {x2 0 }, {y2 0} - float32x4_t v0 = vcombine_f32(vget_low_f32(top.val[0]), bl.val[0]); - float32x4_t v1 = vcombine_f32(vget_low_f32(top.val[1]), bl.val[1]); - float32x2_t q = (float32x2_t)vand_u32((uint32x2_t)vget_high_f32(m_el[2].mVec128), zMask); - float32x4_t v2 = vcombine_f32(vget_high_f32(top.val[0]), q); // z0 z1 z2 0 - return btMatrix3x3(v0, v1, v2); -#else - return btMatrix3x3(m_el[0].x(), m_el[1].x(), m_el[2].x(), - m_el[0].y(), m_el[1].y(), m_el[2].y(), - m_el[0].z(), m_el[1].z(), m_el[2].z()); -#endif -} - -SIMD_FORCE_INLINE btMatrix3x3 -btMatrix3x3::adjoint() const -{ - return btMatrix3x3(cofac(1, 1, 2, 2), cofac(0, 2, 2, 1), cofac(0, 1, 1, 2), - cofac(1, 2, 2, 0), cofac(0, 0, 2, 2), cofac(0, 2, 1, 0), - cofac(1, 0, 2, 1), cofac(0, 1, 2, 0), cofac(0, 0, 1, 1)); -} - -SIMD_FORCE_INLINE btMatrix3x3 -btMatrix3x3::inverse() const -{ - btVector3 co(cofac(1, 1, 2, 2), cofac(1, 2, 2, 0), cofac(1, 0, 2, 1)); - btScalar det = (*this)[0].dot(co); - //btFullAssert(det != btScalar(0.0)); - btAssert(det != btScalar(0.0)); - btScalar s = btScalar(1.0) / det; - return btMatrix3x3(co.x() * s, cofac(0, 2, 2, 1) * s, cofac(0, 1, 1, 2) * s, - co.y() * s, cofac(0, 0, 2, 2) * s, cofac(0, 2, 1, 0) * s, - co.z() * s, cofac(0, 1, 2, 0) * s, cofac(0, 0, 1, 1) * s); -} - -SIMD_FORCE_INLINE btMatrix3x3 -btMatrix3x3::transposeTimes(const btMatrix3x3& m) const -{ -#if defined BT_USE_SIMD_VECTOR3 && (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)) - // zeros w - // static const __m128i xyzMask = (const __m128i){ -1ULL, 0xffffffffULL }; - __m128 row = m_el[0].mVec128; - __m128 m0 = _mm_and_ps(m.getRow(0).mVec128, btvFFF0fMask); - __m128 m1 = _mm_and_ps(m.getRow(1).mVec128, btvFFF0fMask); - __m128 m2 = _mm_and_ps(m.getRow(2).mVec128, btvFFF0fMask); - __m128 r0 = _mm_mul_ps(m0, _mm_shuffle_ps(row, row, 0)); - __m128 r1 = _mm_mul_ps(m0, _mm_shuffle_ps(row, row, 0x55)); - __m128 r2 = _mm_mul_ps(m0, _mm_shuffle_ps(row, row, 0xaa)); - row = m_el[1].mVec128; - r0 = _mm_add_ps(r0, _mm_mul_ps(m1, _mm_shuffle_ps(row, row, 0))); - r1 = _mm_add_ps(r1, _mm_mul_ps(m1, _mm_shuffle_ps(row, row, 0x55))); - r2 = _mm_add_ps(r2, _mm_mul_ps(m1, _mm_shuffle_ps(row, row, 0xaa))); - row = m_el[2].mVec128; - r0 = _mm_add_ps(r0, _mm_mul_ps(m2, _mm_shuffle_ps(row, row, 0))); - r1 = _mm_add_ps(r1, _mm_mul_ps(m2, _mm_shuffle_ps(row, row, 0x55))); - r2 = _mm_add_ps(r2, _mm_mul_ps(m2, _mm_shuffle_ps(row, row, 0xaa))); - return btMatrix3x3(r0, r1, r2); - -#elif defined BT_USE_NEON - // zeros w - static const uint32x4_t xyzMask = (const uint32x4_t){static_cast(-1), static_cast(-1), static_cast(-1), 0}; - float32x4_t m0 = (float32x4_t)vandq_u32((uint32x4_t)m.getRow(0).mVec128, xyzMask); - float32x4_t m1 = (float32x4_t)vandq_u32((uint32x4_t)m.getRow(1).mVec128, xyzMask); - float32x4_t m2 = (float32x4_t)vandq_u32((uint32x4_t)m.getRow(2).mVec128, xyzMask); - float32x4_t row = m_el[0].mVec128; - float32x4_t r0 = vmulq_lane_f32(m0, vget_low_f32(row), 0); - float32x4_t r1 = vmulq_lane_f32(m0, vget_low_f32(row), 1); - float32x4_t r2 = vmulq_lane_f32(m0, vget_high_f32(row), 0); - row = m_el[1].mVec128; - r0 = vmlaq_lane_f32(r0, m1, vget_low_f32(row), 0); - r1 = vmlaq_lane_f32(r1, m1, vget_low_f32(row), 1); - r2 = vmlaq_lane_f32(r2, m1, vget_high_f32(row), 0); - row = m_el[2].mVec128; - r0 = vmlaq_lane_f32(r0, m2, vget_low_f32(row), 0); - r1 = vmlaq_lane_f32(r1, m2, vget_low_f32(row), 1); - r2 = vmlaq_lane_f32(r2, m2, vget_high_f32(row), 0); - return btMatrix3x3(r0, r1, r2); -#else - return btMatrix3x3( - m_el[0].x() * m[0].x() + m_el[1].x() * m[1].x() + m_el[2].x() * m[2].x(), - m_el[0].x() * m[0].y() + m_el[1].x() * m[1].y() + m_el[2].x() * m[2].y(), - m_el[0].x() * m[0].z() + m_el[1].x() * m[1].z() + m_el[2].x() * m[2].z(), - m_el[0].y() * m[0].x() + m_el[1].y() * m[1].x() + m_el[2].y() * m[2].x(), - m_el[0].y() * m[0].y() + m_el[1].y() * m[1].y() + m_el[2].y() * m[2].y(), - m_el[0].y() * m[0].z() + m_el[1].y() * m[1].z() + m_el[2].y() * m[2].z(), - m_el[0].z() * m[0].x() + m_el[1].z() * m[1].x() + m_el[2].z() * m[2].x(), - m_el[0].z() * m[0].y() + m_el[1].z() * m[1].y() + m_el[2].z() * m[2].y(), - m_el[0].z() * m[0].z() + m_el[1].z() * m[1].z() + m_el[2].z() * m[2].z()); -#endif -} - -SIMD_FORCE_INLINE btMatrix3x3 -btMatrix3x3::timesTranspose(const btMatrix3x3& m) const -{ -#if (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)) - __m128 a0 = m_el[0].mVec128; - __m128 a1 = m_el[1].mVec128; - __m128 a2 = m_el[2].mVec128; - - btMatrix3x3 mT = m.transpose(); // we rely on transpose() zeroing w channel so that we don't have to do it here - __m128 mx = mT[0].mVec128; - __m128 my = mT[1].mVec128; - __m128 mz = mT[2].mVec128; - - __m128 r0 = _mm_mul_ps(mx, _mm_shuffle_ps(a0, a0, 0x00)); - __m128 r1 = _mm_mul_ps(mx, _mm_shuffle_ps(a1, a1, 0x00)); - __m128 r2 = _mm_mul_ps(mx, _mm_shuffle_ps(a2, a2, 0x00)); - r0 = _mm_add_ps(r0, _mm_mul_ps(my, _mm_shuffle_ps(a0, a0, 0x55))); - r1 = _mm_add_ps(r1, _mm_mul_ps(my, _mm_shuffle_ps(a1, a1, 0x55))); - r2 = _mm_add_ps(r2, _mm_mul_ps(my, _mm_shuffle_ps(a2, a2, 0x55))); - r0 = _mm_add_ps(r0, _mm_mul_ps(mz, _mm_shuffle_ps(a0, a0, 0xaa))); - r1 = _mm_add_ps(r1, _mm_mul_ps(mz, _mm_shuffle_ps(a1, a1, 0xaa))); - r2 = _mm_add_ps(r2, _mm_mul_ps(mz, _mm_shuffle_ps(a2, a2, 0xaa))); - return btMatrix3x3(r0, r1, r2); - -#elif defined BT_USE_NEON - float32x4_t a0 = m_el[0].mVec128; - float32x4_t a1 = m_el[1].mVec128; - float32x4_t a2 = m_el[2].mVec128; - - btMatrix3x3 mT = m.transpose(); // we rely on transpose() zeroing w channel so that we don't have to do it here - float32x4_t mx = mT[0].mVec128; - float32x4_t my = mT[1].mVec128; - float32x4_t mz = mT[2].mVec128; - - float32x4_t r0 = vmulq_lane_f32(mx, vget_low_f32(a0), 0); - float32x4_t r1 = vmulq_lane_f32(mx, vget_low_f32(a1), 0); - float32x4_t r2 = vmulq_lane_f32(mx, vget_low_f32(a2), 0); - r0 = vmlaq_lane_f32(r0, my, vget_low_f32(a0), 1); - r1 = vmlaq_lane_f32(r1, my, vget_low_f32(a1), 1); - r2 = vmlaq_lane_f32(r2, my, vget_low_f32(a2), 1); - r0 = vmlaq_lane_f32(r0, mz, vget_high_f32(a0), 0); - r1 = vmlaq_lane_f32(r1, mz, vget_high_f32(a1), 0); - r2 = vmlaq_lane_f32(r2, mz, vget_high_f32(a2), 0); - return btMatrix3x3(r0, r1, r2); - -#else - return btMatrix3x3( - m_el[0].dot(m[0]), m_el[0].dot(m[1]), m_el[0].dot(m[2]), - m_el[1].dot(m[0]), m_el[1].dot(m[1]), m_el[1].dot(m[2]), - m_el[2].dot(m[0]), m_el[2].dot(m[1]), m_el[2].dot(m[2])); -#endif -} - -SIMD_FORCE_INLINE btVector3 -operator*(const btMatrix3x3& m, const btVector3& v) -{ -#if (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)) || defined(BT_USE_NEON) - return v.dot3(m[0], m[1], m[2]); -#else - return btVector3(m[0].dot(v), m[1].dot(v), m[2].dot(v)); -#endif -} - -SIMD_FORCE_INLINE btVector3 -operator*(const btVector3& v, const btMatrix3x3& m) -{ -#if defined BT_USE_SIMD_VECTOR3 && (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)) - - const __m128 vv = v.mVec128; - - __m128 c0 = bt_splat_ps(vv, 0); - __m128 c1 = bt_splat_ps(vv, 1); - __m128 c2 = bt_splat_ps(vv, 2); - - c0 = _mm_mul_ps(c0, _mm_and_ps(m[0].mVec128, btvFFF0fMask)); - c1 = _mm_mul_ps(c1, _mm_and_ps(m[1].mVec128, btvFFF0fMask)); - c0 = _mm_add_ps(c0, c1); - c2 = _mm_mul_ps(c2, _mm_and_ps(m[2].mVec128, btvFFF0fMask)); - - return btVector3(_mm_add_ps(c0, c2)); -#elif defined(BT_USE_NEON) - const float32x4_t vv = v.mVec128; - const float32x2_t vlo = vget_low_f32(vv); - const float32x2_t vhi = vget_high_f32(vv); - - float32x4_t c0, c1, c2; - - c0 = (float32x4_t)vandq_s32((int32x4_t)m[0].mVec128, btvFFF0Mask); - c1 = (float32x4_t)vandq_s32((int32x4_t)m[1].mVec128, btvFFF0Mask); - c2 = (float32x4_t)vandq_s32((int32x4_t)m[2].mVec128, btvFFF0Mask); - - c0 = vmulq_lane_f32(c0, vlo, 0); - c1 = vmulq_lane_f32(c1, vlo, 1); - c2 = vmulq_lane_f32(c2, vhi, 0); - c0 = vaddq_f32(c0, c1); - c0 = vaddq_f32(c0, c2); - - return btVector3(c0); -#else - return btVector3(m.tdotx(v), m.tdoty(v), m.tdotz(v)); -#endif -} - -SIMD_FORCE_INLINE btMatrix3x3 -operator*(const btMatrix3x3& m1, const btMatrix3x3& m2) -{ -#if defined BT_USE_SIMD_VECTOR3 && (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)) - - __m128 m10 = m1[0].mVec128; - __m128 m11 = m1[1].mVec128; - __m128 m12 = m1[2].mVec128; - - __m128 m2v = _mm_and_ps(m2[0].mVec128, btvFFF0fMask); - - __m128 c0 = bt_splat_ps(m10, 0); - __m128 c1 = bt_splat_ps(m11, 0); - __m128 c2 = bt_splat_ps(m12, 0); - - c0 = _mm_mul_ps(c0, m2v); - c1 = _mm_mul_ps(c1, m2v); - c2 = _mm_mul_ps(c2, m2v); - - m2v = _mm_and_ps(m2[1].mVec128, btvFFF0fMask); - - __m128 c0_1 = bt_splat_ps(m10, 1); - __m128 c1_1 = bt_splat_ps(m11, 1); - __m128 c2_1 = bt_splat_ps(m12, 1); - - c0_1 = _mm_mul_ps(c0_1, m2v); - c1_1 = _mm_mul_ps(c1_1, m2v); - c2_1 = _mm_mul_ps(c2_1, m2v); - - m2v = _mm_and_ps(m2[2].mVec128, btvFFF0fMask); - - c0 = _mm_add_ps(c0, c0_1); - c1 = _mm_add_ps(c1, c1_1); - c2 = _mm_add_ps(c2, c2_1); - - m10 = bt_splat_ps(m10, 2); - m11 = bt_splat_ps(m11, 2); - m12 = bt_splat_ps(m12, 2); - - m10 = _mm_mul_ps(m10, m2v); - m11 = _mm_mul_ps(m11, m2v); - m12 = _mm_mul_ps(m12, m2v); - - c0 = _mm_add_ps(c0, m10); - c1 = _mm_add_ps(c1, m11); - c2 = _mm_add_ps(c2, m12); - - return btMatrix3x3(c0, c1, c2); - -#elif defined(BT_USE_NEON) - - float32x4_t rv0, rv1, rv2; - float32x4_t v0, v1, v2; - float32x4_t mv0, mv1, mv2; - - v0 = m1[0].mVec128; - v1 = m1[1].mVec128; - v2 = m1[2].mVec128; - - mv0 = (float32x4_t)vandq_s32((int32x4_t)m2[0].mVec128, btvFFF0Mask); - mv1 = (float32x4_t)vandq_s32((int32x4_t)m2[1].mVec128, btvFFF0Mask); - mv2 = (float32x4_t)vandq_s32((int32x4_t)m2[2].mVec128, btvFFF0Mask); - - rv0 = vmulq_lane_f32(mv0, vget_low_f32(v0), 0); - rv1 = vmulq_lane_f32(mv0, vget_low_f32(v1), 0); - rv2 = vmulq_lane_f32(mv0, vget_low_f32(v2), 0); - - rv0 = vmlaq_lane_f32(rv0, mv1, vget_low_f32(v0), 1); - rv1 = vmlaq_lane_f32(rv1, mv1, vget_low_f32(v1), 1); - rv2 = vmlaq_lane_f32(rv2, mv1, vget_low_f32(v2), 1); - - rv0 = vmlaq_lane_f32(rv0, mv2, vget_high_f32(v0), 0); - rv1 = vmlaq_lane_f32(rv1, mv2, vget_high_f32(v1), 0); - rv2 = vmlaq_lane_f32(rv2, mv2, vget_high_f32(v2), 0); - - return btMatrix3x3(rv0, rv1, rv2); - -#else - return btMatrix3x3( - m2.tdotx(m1[0]), m2.tdoty(m1[0]), m2.tdotz(m1[0]), - m2.tdotx(m1[1]), m2.tdoty(m1[1]), m2.tdotz(m1[1]), - m2.tdotx(m1[2]), m2.tdoty(m1[2]), m2.tdotz(m1[2])); -#endif -} - -/* -SIMD_FORCE_INLINE btMatrix3x3 btMultTransposeLeft(const btMatrix3x3& m1, const btMatrix3x3& m2) { -return btMatrix3x3( -m1[0][0] * m2[0][0] + m1[1][0] * m2[1][0] + m1[2][0] * m2[2][0], -m1[0][0] * m2[0][1] + m1[1][0] * m2[1][1] + m1[2][0] * m2[2][1], -m1[0][0] * m2[0][2] + m1[1][0] * m2[1][2] + m1[2][0] * m2[2][2], -m1[0][1] * m2[0][0] + m1[1][1] * m2[1][0] + m1[2][1] * m2[2][0], -m1[0][1] * m2[0][1] + m1[1][1] * m2[1][1] + m1[2][1] * m2[2][1], -m1[0][1] * m2[0][2] + m1[1][1] * m2[1][2] + m1[2][1] * m2[2][2], -m1[0][2] * m2[0][0] + m1[1][2] * m2[1][0] + m1[2][2] * m2[2][0], -m1[0][2] * m2[0][1] + m1[1][2] * m2[1][1] + m1[2][2] * m2[2][1], -m1[0][2] * m2[0][2] + m1[1][2] * m2[1][2] + m1[2][2] * m2[2][2]); -} -*/ - -/**@brief Equality operator between two matrices -* It will test all elements are equal. */ -SIMD_FORCE_INLINE bool operator==(const btMatrix3x3& m1, const btMatrix3x3& m2) -{ -#if (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)) - - __m128 c0, c1, c2; - - c0 = _mm_cmpeq_ps(m1[0].mVec128, m2[0].mVec128); - c1 = _mm_cmpeq_ps(m1[1].mVec128, m2[1].mVec128); - c2 = _mm_cmpeq_ps(m1[2].mVec128, m2[2].mVec128); - - c0 = _mm_and_ps(c0, c1); - c0 = _mm_and_ps(c0, c2); - - int m = _mm_movemask_ps((__m128)c0); - return (0x7 == (m & 0x7)); - -#else - return (m1[0][0] == m2[0][0] && m1[1][0] == m2[1][0] && m1[2][0] == m2[2][0] && - m1[0][1] == m2[0][1] && m1[1][1] == m2[1][1] && m1[2][1] == m2[2][1] && - m1[0][2] == m2[0][2] && m1[1][2] == m2[1][2] && m1[2][2] == m2[2][2]); -#endif -} - -///for serialization -struct btMatrix3x3FloatData -{ - btVector3FloatData m_el[3]; -}; - -///for serialization -struct btMatrix3x3DoubleData -{ - btVector3DoubleData m_el[3]; -}; - -SIMD_FORCE_INLINE void btMatrix3x3::serialize(struct btMatrix3x3Data& dataOut) const -{ - for (int i = 0; i < 3; i++) - m_el[i].serialize(dataOut.m_el[i]); -} - -SIMD_FORCE_INLINE void btMatrix3x3::serializeFloat(struct btMatrix3x3FloatData& dataOut) const -{ - for (int i = 0; i < 3; i++) - m_el[i].serializeFloat(dataOut.m_el[i]); -} - -SIMD_FORCE_INLINE void btMatrix3x3::deSerialize(const struct btMatrix3x3Data& dataIn) -{ - for (int i = 0; i < 3; i++) - m_el[i].deSerialize(dataIn.m_el[i]); -} - -SIMD_FORCE_INLINE void btMatrix3x3::deSerializeFloat(const struct btMatrix3x3FloatData& dataIn) -{ - for (int i = 0; i < 3; i++) - m_el[i].deSerializeFloat(dataIn.m_el[i]); -} - -SIMD_FORCE_INLINE void btMatrix3x3::deSerializeDouble(const struct btMatrix3x3DoubleData& dataIn) -{ - for (int i = 0; i < 3; i++) - m_el[i].deSerializeDouble(dataIn.m_el[i]); -} - -#endif //BT_MATRIX3x3_H diff --git a/engine/inc/bullet/LinearMath/btMatrixX.h b/engine/inc/bullet/LinearMath/btMatrixX.h deleted file mode 100644 index bb0f0dd2..00000000 --- a/engine/inc/bullet/LinearMath/btMatrixX.h +++ /dev/null @@ -1,532 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2013 Erwin Coumans http://bulletphysics.org - -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. -*/ -///original version written by Erwin Coumans, October 2013 - -#ifndef BT_MATRIX_X_H -#define BT_MATRIX_X_H - -#include "LinearMath/btQuickprof.h" -#include "LinearMath/btAlignedObjectArray.h" -#include - -//#define BT_DEBUG_OSTREAM -#ifdef BT_DEBUG_OSTREAM -#include -#include // std::setw -#endif //BT_DEBUG_OSTREAM - -class btIntSortPredicate -{ -public: - bool operator()(const int& a, const int& b) const - { - return a < b; - } -}; - -template -struct btVectorX -{ - btAlignedObjectArray m_storage; - - btVectorX() - { - } - btVectorX(int numRows) - { - m_storage.resize(numRows); - } - - void resize(int rows) - { - m_storage.resize(rows); - } - int cols() const - { - return 1; - } - int rows() const - { - return m_storage.size(); - } - int size() const - { - return rows(); - } - - T nrm2() const - { - T norm = T(0); - - int nn = rows(); - - { - if (nn == 1) - { - norm = btFabs((*this)[0]); - } - else - { - T scale = 0.0; - T ssq = 1.0; - - /* The following loop is equivalent to this call to the LAPACK - auxiliary routine: CALL SLASSQ( N, X, INCX, SCALE, SSQ ) */ - - for (int ix = 0; ix < nn; ix++) - { - if ((*this)[ix] != 0.0) - { - T absxi = btFabs((*this)[ix]); - if (scale < absxi) - { - T temp; - temp = scale / absxi; - ssq = ssq * (temp * temp) + BT_ONE; - scale = absxi; - } - else - { - T temp; - temp = absxi / scale; - ssq += temp * temp; - } - } - } - norm = scale * sqrt(ssq); - } - } - return norm; - } - void setZero() - { - if (m_storage.size()) - { - // for (int i=0;i - void setElem(btMatrixX& mat, int row, int col, T val) - { - mat.setElem(row,col,val); - } - */ - -template -struct btMatrixX -{ - int m_rows; - int m_cols; - int m_operations; - int m_resizeOperations; - int m_setElemOperations; - - btAlignedObjectArray m_storage; - mutable btAlignedObjectArray > m_rowNonZeroElements1; - - T* getBufferPointerWritable() - { - return m_storage.size() ? &m_storage[0] : 0; - } - - const T* getBufferPointer() const - { - return m_storage.size() ? &m_storage[0] : 0; - } - btMatrixX() - : m_rows(0), - m_cols(0), - m_operations(0), - m_resizeOperations(0), - m_setElemOperations(0) - { - } - btMatrixX(int rows, int cols) - : m_rows(rows), - m_cols(cols), - m_operations(0), - m_resizeOperations(0), - m_setElemOperations(0) - { - resize(rows, cols); - } - void resize(int rows, int cols) - { - m_resizeOperations++; - m_rows = rows; - m_cols = cols; - { - BT_PROFILE("m_storage.resize"); - m_storage.resize(rows * cols); - } - } - int cols() const - { - return m_cols; - } - int rows() const - { - return m_rows; - } - ///we don't want this read/write operator(), because we cannot keep track of non-zero elements, use setElem instead - /*T& operator() (int row,int col) - { - return m_storage[col*m_rows+row]; - } - */ - - void addElem(int row, int col, T val) - { - if (val) - { - if (m_storage[col + row * m_cols] == 0.f) - { - setElem(row, col, val); - } - else - { - m_storage[row * m_cols + col] += val; - } - } - } - - void setElem(int row, int col, T val) - { - m_setElemOperations++; - m_storage[row * m_cols + col] = val; - } - - void mulElem(int row, int col, T val) - { - m_setElemOperations++; - //mul doesn't change sparsity info - - m_storage[row * m_cols + col] *= val; - } - - void copyLowerToUpperTriangle() - { - int count = 0; - for (int row = 0; row < rows(); row++) - { - for (int col = 0; col < row; col++) - { - setElem(col, row, (*this)(row, col)); - count++; - } - } - //printf("copyLowerToUpperTriangle copied %d elements out of %dx%d=%d\n", count,rows(),cols(),cols()*rows()); - } - - const T& operator()(int row, int col) const - { - return m_storage[col + row * m_cols]; - } - - void setZero() - { - { - BT_PROFILE("storage=0"); - if (m_storage.size()) - { - btSetZero(&m_storage[0], m_storage.size()); - } - //memset(&m_storage[0],0,sizeof(T)*m_storage.size()); - //for (int i=0;i 0 && numRowsOther > 0 && B && C); - const btScalar* bb = B; - for (int i = 0; i < numRows; i++) - { - const btScalar* cc = C; - for (int j = 0; j < numRowsOther; j++) - { - btScalar sum; - sum = bb[0] * cc[0]; - sum += bb[1] * cc[1]; - sum += bb[2] * cc[2]; - sum += bb[4] * cc[4]; - sum += bb[5] * cc[5]; - sum += bb[6] * cc[6]; - setElem(row + i, col + j, sum); - cc += 8; - } - bb += 8; - } - } - - void setSubMatrix(int rowstart, int colstart, int rowend, int colend, const T value) - { - int numRows = rowend + 1 - rowstart; - int numCols = colend + 1 - colstart; - - for (int row = 0; row < numRows; row++) - { - for (int col = 0; col < numCols; col++) - { - setElem(rowstart + row, colstart + col, value); - } - } - } - - void setSubMatrix(int rowstart, int colstart, int rowend, int colend, const btMatrixX& block) - { - btAssert(rowend + 1 - rowstart == block.rows()); - btAssert(colend + 1 - colstart == block.cols()); - for (int row = 0; row < block.rows(); row++) - { - for (int col = 0; col < block.cols(); col++) - { - setElem(rowstart + row, colstart + col, block(row, col)); - } - } - } - void setSubMatrix(int rowstart, int colstart, int rowend, int colend, const btVectorX& block) - { - btAssert(rowend + 1 - rowstart == block.rows()); - btAssert(colend + 1 - colstart == block.cols()); - for (int row = 0; row < block.rows(); row++) - { - for (int col = 0; col < block.cols(); col++) - { - setElem(rowstart + row, colstart + col, block[row]); - } - } - } - - btMatrixX negative() - { - btMatrixX neg(rows(), cols()); - for (int i = 0; i < rows(); i++) - for (int j = 0; j < cols(); j++) - { - T v = (*this)(i, j); - neg.setElem(i, j, -v); - } - return neg; - } -}; - -typedef btMatrixX btMatrixXf; -typedef btVectorX btVectorXf; - -typedef btMatrixX btMatrixXd; -typedef btVectorX btVectorXd; - -#ifdef BT_DEBUG_OSTREAM -template -std::ostream& operator<<(std::ostream& os, const btMatrixX& mat) -{ - os << " ["; - //printf("%s ---------------------\n",msg); - for (int i = 0; i < mat.rows(); i++) - { - for (int j = 0; j < mat.cols(); j++) - { - os << std::setw(12) << mat(i, j); - } - if (i != mat.rows() - 1) - os << std::endl - << " "; - } - os << " ]"; - //printf("\n---------------------\n"); - - return os; -} -template -std::ostream& operator<<(std::ostream& os, const btVectorX& mat) -{ - os << " ["; - //printf("%s ---------------------\n",msg); - for (int i = 0; i < mat.rows(); i++) - { - os << std::setw(12) << mat[i]; - if (i != mat.rows() - 1) - os << std::endl - << " "; - } - os << " ]"; - //printf("\n---------------------\n"); - - return os; -} - -#endif //BT_DEBUG_OSTREAM - -inline void setElem(btMatrixXd& mat, int row, int col, double val) -{ - mat.setElem(row, col, val); -} - -inline void setElem(btMatrixXf& mat, int row, int col, float val) -{ - mat.setElem(row, col, val); -} - -#ifdef BT_USE_DOUBLE_PRECISION -#define btVectorXu btVectorXd -#define btMatrixXu btMatrixXd -#else -#define btVectorXu btVectorXf -#define btMatrixXu btMatrixXf -#endif //BT_USE_DOUBLE_PRECISION - -#endif //BT_MATRIX_H_H diff --git a/engine/inc/bullet/LinearMath/btMinMax.h b/engine/inc/bullet/LinearMath/btMinMax.h deleted file mode 100644 index 92fea027..00000000 --- a/engine/inc/bullet/LinearMath/btMinMax.h +++ /dev/null @@ -1,69 +0,0 @@ -/* -Copyright (c) 2003-2006 Gino van den Bergen / 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_GEN_MINMAX_H -#define BT_GEN_MINMAX_H - -#include "btScalar.h" - -template -SIMD_FORCE_INLINE const T& btMin(const T& a, const T& b) -{ - return a < b ? a : b; -} - -template -SIMD_FORCE_INLINE const T& btMax(const T& a, const T& b) -{ - return a > b ? a : b; -} - -template -SIMD_FORCE_INLINE const T& btClamped(const T& a, const T& lb, const T& ub) -{ - return a < lb ? lb : (ub < a ? ub : a); -} - -template -SIMD_FORCE_INLINE void btSetMin(T& a, const T& b) -{ - if (b < a) - { - a = b; - } -} - -template -SIMD_FORCE_INLINE void btSetMax(T& a, const T& b) -{ - if (a < b) - { - a = b; - } -} - -template -SIMD_FORCE_INLINE void btClamp(T& a, const T& lb, const T& ub) -{ - if (a < lb) - { - a = lb; - } - else if (ub < a) - { - a = ub; - } -} - -#endif //BT_GEN_MINMAX_H diff --git a/engine/inc/bullet/LinearMath/btModifiedGramSchmidt.h b/engine/inc/bullet/LinearMath/btModifiedGramSchmidt.h deleted file mode 100644 index 33bab8d6..00000000 --- a/engine/inc/bullet/LinearMath/btModifiedGramSchmidt.h +++ /dev/null @@ -1,83 +0,0 @@ -// -// btModifiedGramSchmidt.h -// LinearMath -// -// Created by Xuchen Han on 4/4/20. -// - -#ifndef btModifiedGramSchmidt_h -#define btModifiedGramSchmidt_h - -#include "btReducedVector.h" -#include "btAlignedObjectArray.h" -#include -#include -template -class btModifiedGramSchmidt -{ -public: - btAlignedObjectArray m_in; - btAlignedObjectArray m_out; - - btModifiedGramSchmidt(const btAlignedObjectArray& vecs): m_in(vecs) - { - m_out.resize(0); - } - - void solve() - { - m_out.resize(m_in.size()); - for (int i = 0; i < m_in.size(); ++i) - { -// printf("========= starting %d ==========\n", i); - TV v(m_in[i]); -// v.print(); - for (int j = 0; j < i; ++j) - { - v = v - v.proj(m_out[j]); -// v.print(); - } - v.normalize(); - m_out[i] = v; -// v.print(); - } - } - - void test() - { - std::cout << SIMD_EPSILON << std::endl; - printf("=======inputs=========\n"); - for (int i = 0; i < m_out.size(); ++i) - { - m_in[i].print(); - } - printf("=======output=========\n"); - for (int i = 0; i < m_out.size(); ++i) - { - m_out[i].print(); - } - btScalar eps = SIMD_EPSILON; - for (int i = 0; i < m_out.size(); ++i) - { - for (int j = 0; j < m_out.size(); ++j) - { - if (i == j) - { - if (std::abs(1.0-m_out[i].dot(m_out[j])) > eps)// && std::abs(m_out[i].dot(m_out[j])) > eps) - { - printf("vec[%d] is not unit, norm squared = %f\n", i,m_out[i].dot(m_out[j])); - } - } - else - { - if (std::abs(m_out[i].dot(m_out[j])) > eps) - { - printf("vec[%d] and vec[%d] is not orthogonal, dot product = %f\n", i, j, m_out[i].dot(m_out[j])); - } - } - } - } - } -}; -template class btModifiedGramSchmidt; -#endif /* btModifiedGramSchmidt_h */ diff --git a/engine/inc/bullet/LinearMath/btMotionState.h b/engine/inc/bullet/LinearMath/btMotionState.h deleted file mode 100644 index ae6a5161..00000000 --- a/engine/inc/bullet/LinearMath/btMotionState.h +++ /dev/null @@ -1,36 +0,0 @@ -/* -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_MOTIONSTATE_H -#define BT_MOTIONSTATE_H - -#include "btTransform.h" - -///The btMotionState interface class allows the dynamics world to synchronize and interpolate the updated world transforms with graphics -///For optimizations, potentially only moving objects get synchronized (using setWorldPosition/setWorldOrientation) -class btMotionState -{ -public: - virtual ~btMotionState() - { - } - - virtual void getWorldTransform(btTransform& worldTrans) const = 0; - - //Bullet only calls the update of worldtransform for active objects - virtual void setWorldTransform(const btTransform& worldTrans) = 0; -}; - -#endif //BT_MOTIONSTATE_H diff --git a/engine/inc/bullet/LinearMath/btPolarDecomposition.h b/engine/inc/bullet/LinearMath/btPolarDecomposition.h deleted file mode 100644 index bf29140a..00000000 --- a/engine/inc/bullet/LinearMath/btPolarDecomposition.h +++ /dev/null @@ -1,69 +0,0 @@ -#ifndef POLARDECOMPOSITION_H -#define POLARDECOMPOSITION_H - -#include "btMatrix3x3.h" - -/** - * This class is used to compute the polar decomposition of a matrix. In - * general, the polar decomposition factorizes a matrix, A, into two parts: a - * unitary matrix (U) and a positive, semi-definite Hermitian matrix (H). - * However, in this particular implementation the original matrix, A, is - * required to be a square 3x3 matrix with real elements. This means that U will - * be an orthogonal matrix and H with be a positive-definite, symmetric matrix. - */ -class btPolarDecomposition -{ -public: - /** - * Creates an instance with optional parameters. - * - * @param tolerance - the tolerance used to determine convergence of the - * algorithm - * @param maxIterations - the maximum number of iterations used to achieve - * convergence - */ - btPolarDecomposition(btScalar tolerance = btScalar(0.0001), - unsigned int maxIterations = 16); - - /** - * Decomposes a matrix into orthogonal and symmetric, positive-definite - * parts. If the number of iterations returned by this function is equal to - * the maximum number of iterations, the algorithm has failed to converge. - * - * @param a - the original matrix - * @param u - the resulting orthogonal matrix - * @param h - the resulting symmetric matrix - * - * @return the number of iterations performed by the algorithm. - */ - unsigned int decompose(const btMatrix3x3& a, btMatrix3x3& u, btMatrix3x3& h) const; - - /** - * Returns the maximum number of iterations that this algorithm will perform - * to achieve convergence. - * - * @return maximum number of iterations - */ - unsigned int maxIterations() const; - -private: - btScalar m_tolerance; - unsigned int m_maxIterations; -}; - -/** - * This functions decomposes the matrix 'a' into two parts: an orthogonal matrix - * 'u' and a symmetric, positive-definite matrix 'h'. If the number of - * iterations returned by this function is equal to - * btPolarDecomposition::DEFAULT_MAX_ITERATIONS, the algorithm has failed to - * converge. - * - * @param a - the original matrix - * @param u - the resulting orthogonal matrix - * @param h - the resulting symmetric matrix - * - * @return the number of iterations performed by the algorithm. - */ -unsigned int polarDecompose(const btMatrix3x3& a, btMatrix3x3& u, btMatrix3x3& h); - -#endif // POLARDECOMPOSITION_H diff --git a/engine/inc/bullet/LinearMath/btPoolAllocator.h b/engine/inc/bullet/LinearMath/btPoolAllocator.h deleted file mode 100644 index 4e7b4966..00000000 --- a/engine/inc/bullet/LinearMath/btPoolAllocator.h +++ /dev/null @@ -1,130 +0,0 @@ -/* -Copyright (c) 2003-2006 Gino van den Bergen / 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_POOL_ALLOCATOR_H -#define _BT_POOL_ALLOCATOR_H - -#include "btScalar.h" -#include "btAlignedAllocator.h" -#include "btThreads.h" - -///The btPoolAllocator class allows to efficiently allocate a large pool of objects, instead of dynamically allocating them separately. -class btPoolAllocator -{ - int m_elemSize; - int m_maxElements; - int m_freeCount; - void* m_firstFree; - unsigned char* m_pool; - btSpinMutex m_mutex; // only used if BT_THREADSAFE - -public: - btPoolAllocator(int elemSize, int maxElements) - : m_elemSize(elemSize), - m_maxElements(maxElements) - { - m_pool = (unsigned char*)btAlignedAlloc(static_cast(m_elemSize * m_maxElements), 16); - - unsigned char* p = m_pool; - m_firstFree = p; - m_freeCount = m_maxElements; - int count = m_maxElements; - while (--count) - { - *(void**)p = (p + m_elemSize); - p += m_elemSize; - } - *(void**)p = 0; - } - - ~btPoolAllocator() - { - btAlignedFree(m_pool); - } - - int getFreeCount() const - { - return m_freeCount; - } - - int getUsedCount() const - { - return m_maxElements - m_freeCount; - } - - int getMaxCount() const - { - return m_maxElements; - } - - void* allocate(int size) - { - // release mode fix - (void)size; - btMutexLock(&m_mutex); - btAssert(!size || size <= m_elemSize); - //btAssert(m_freeCount>0); // should return null if all full - void* result = m_firstFree; - if (NULL != m_firstFree) - { - m_firstFree = *(void**)m_firstFree; - --m_freeCount; - } - btMutexUnlock(&m_mutex); - return result; - } - - bool validPtr(void* ptr) - { - if (ptr) - { - if (((unsigned char*)ptr >= m_pool && (unsigned char*)ptr < m_pool + m_maxElements * m_elemSize)) - { - return true; - } - } - return false; - } - - void freeMemory(void* ptr) - { - if (ptr) - { - btAssert((unsigned char*)ptr >= m_pool && (unsigned char*)ptr < m_pool + m_maxElements * m_elemSize); - - btMutexLock(&m_mutex); - *(void**)ptr = m_firstFree; - m_firstFree = ptr; - ++m_freeCount; - btMutexUnlock(&m_mutex); - } - } - - int getElementSize() const - { - return m_elemSize; - } - - unsigned char* getPoolAddress() - { - return m_pool; - } - - const unsigned char* getPoolAddress() const - { - return m_pool; - } -}; - -#endif //_BT_POOL_ALLOCATOR_H diff --git a/engine/inc/bullet/LinearMath/btQuadWord.h b/engine/inc/bullet/LinearMath/btQuadWord.h deleted file mode 100644 index ab2d3175..00000000 --- a/engine/inc/bullet/LinearMath/btQuadWord.h +++ /dev/null @@ -1,238 +0,0 @@ -/* -Copyright (c) 2003-2006 Gino van den Bergen / 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_SIMD_QUADWORD_H -#define BT_SIMD_QUADWORD_H - -#include "btScalar.h" -#include "btMinMax.h" - -#if defined(__CELLOS_LV2) && defined(__SPU__) -#include -#endif - -/**@brief The btQuadWord class is base class for btVector3 and btQuaternion. - * Some issues under PS3 Linux with IBM 2.1 SDK, gcc compiler prevent from using aligned quadword. - */ -#ifndef USE_LIBSPE2 -ATTRIBUTE_ALIGNED16(class) -btQuadWord -#else -class btQuadWord -#endif -{ -protected: -#if defined(__SPU__) && defined(__CELLOS_LV2__) - union { - vec_float4 mVec128; - btScalar m_floats[4]; - }; - -public: - vec_float4 get128() const - { - return mVec128; - } - -protected: -#else //__CELLOS_LV2__ __SPU__ - -#if defined(BT_USE_SSE) || defined(BT_USE_NEON) - union { - btSimdFloat4 mVec128; - btScalar m_floats[4]; - }; - -public: - SIMD_FORCE_INLINE btSimdFloat4 get128() const - { - return mVec128; - } - SIMD_FORCE_INLINE void set128(btSimdFloat4 v128) - { - mVec128 = v128; - } -#else - btScalar m_floats[4]; -#endif // BT_USE_SSE - -#endif //__CELLOS_LV2__ __SPU__ - -public: -#if (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)) || defined(BT_USE_NEON) - - // Set Vector - SIMD_FORCE_INLINE btQuadWord(const btSimdFloat4 vec) - { - mVec128 = vec; - } - - // Copy constructor - SIMD_FORCE_INLINE btQuadWord(const btQuadWord& rhs) - { - mVec128 = rhs.mVec128; - } - - // Assignment Operator - SIMD_FORCE_INLINE btQuadWord& - operator=(const btQuadWord& v) - { - mVec128 = v.mVec128; - - return *this; - } - -#endif - - /**@brief Return the x value */ - SIMD_FORCE_INLINE const btScalar& getX() const { return m_floats[0]; } - /**@brief Return the y value */ - SIMD_FORCE_INLINE const btScalar& getY() const { return m_floats[1]; } - /**@brief Return the z value */ - SIMD_FORCE_INLINE const btScalar& getZ() const { return m_floats[2]; } - /**@brief Set the x value */ - SIMD_FORCE_INLINE void setX(btScalar _x) { m_floats[0] = _x; }; - /**@brief Set the y value */ - SIMD_FORCE_INLINE void setY(btScalar _y) { m_floats[1] = _y; }; - /**@brief Set the z value */ - SIMD_FORCE_INLINE void setZ(btScalar _z) { m_floats[2] = _z; }; - /**@brief Set the w value */ - SIMD_FORCE_INLINE void setW(btScalar _w) { m_floats[3] = _w; }; - /**@brief Return the x value */ - SIMD_FORCE_INLINE const btScalar& x() const { return m_floats[0]; } - /**@brief Return the y value */ - SIMD_FORCE_INLINE const btScalar& y() const { return m_floats[1]; } - /**@brief Return the z value */ - SIMD_FORCE_INLINE const btScalar& z() const { return m_floats[2]; } - /**@brief Return the w value */ - SIMD_FORCE_INLINE const btScalar& w() const { return m_floats[3]; } - - //SIMD_FORCE_INLINE btScalar& operator[](int i) { return (&m_floats[0])[i]; } - //SIMD_FORCE_INLINE const btScalar& operator[](int i) const { return (&m_floats[0])[i]; } - ///operator btScalar*() replaces operator[], using implicit conversion. We added operator != and operator == to avoid pointer comparisons. - SIMD_FORCE_INLINE operator btScalar*() { return &m_floats[0]; } - SIMD_FORCE_INLINE operator const btScalar*() const { return &m_floats[0]; } - - SIMD_FORCE_INLINE bool operator==(const btQuadWord& other) const - { -#ifdef BT_USE_SSE - return (0xf == _mm_movemask_ps((__m128)_mm_cmpeq_ps(mVec128, other.mVec128))); -#else - return ((m_floats[3] == other.m_floats[3]) && - (m_floats[2] == other.m_floats[2]) && - (m_floats[1] == other.m_floats[1]) && - (m_floats[0] == other.m_floats[0])); -#endif - } - - SIMD_FORCE_INLINE bool operator!=(const btQuadWord& other) const - { - return !(*this == other); - } - - /**@brief Set x,y,z and zero w - * @param x Value of x - * @param y Value of y - * @param z Value of z - */ - SIMD_FORCE_INLINE void setValue(const btScalar& _x, const btScalar& _y, const btScalar& _z) - { - m_floats[0] = _x; - m_floats[1] = _y; - m_floats[2] = _z; - m_floats[3] = 0.f; - } - - /* void getValue(btScalar *m) const - { - m[0] = m_floats[0]; - m[1] = m_floats[1]; - m[2] = m_floats[2]; - } -*/ - /**@brief Set the values - * @param x Value of x - * @param y Value of y - * @param z Value of z - * @param w Value of w - */ - SIMD_FORCE_INLINE void setValue(const btScalar& _x, const btScalar& _y, const btScalar& _z, const btScalar& _w) - { - m_floats[0] = _x; - m_floats[1] = _y; - m_floats[2] = _z; - m_floats[3] = _w; - } - /**@brief No initialization constructor */ - SIMD_FORCE_INLINE btQuadWord() - // :m_floats[0](btScalar(0.)),m_floats[1](btScalar(0.)),m_floats[2](btScalar(0.)),m_floats[3](btScalar(0.)) - { - } - - /**@brief Three argument constructor (zeros w) - * @param x Value of x - * @param y Value of y - * @param z Value of z - */ - SIMD_FORCE_INLINE btQuadWord(const btScalar& _x, const btScalar& _y, const btScalar& _z) - { - m_floats[0] = _x, m_floats[1] = _y, m_floats[2] = _z, m_floats[3] = 0.0f; - } - - /**@brief Initializing constructor - * @param x Value of x - * @param y Value of y - * @param z Value of z - * @param w Value of w - */ - SIMD_FORCE_INLINE btQuadWord(const btScalar& _x, const btScalar& _y, const btScalar& _z, const btScalar& _w) - { - m_floats[0] = _x, m_floats[1] = _y, m_floats[2] = _z, m_floats[3] = _w; - } - - /**@brief Set each element to the max of the current values and the values of another btQuadWord - * @param other The other btQuadWord to compare with - */ - SIMD_FORCE_INLINE void setMax(const btQuadWord& other) - { -#ifdef BT_USE_SSE - mVec128 = _mm_max_ps(mVec128, other.mVec128); -#elif defined(BT_USE_NEON) - mVec128 = vmaxq_f32(mVec128, other.mVec128); -#else - btSetMax(m_floats[0], other.m_floats[0]); - btSetMax(m_floats[1], other.m_floats[1]); - btSetMax(m_floats[2], other.m_floats[2]); - btSetMax(m_floats[3], other.m_floats[3]); -#endif - } - /**@brief Set each element to the min of the current values and the values of another btQuadWord - * @param other The other btQuadWord to compare with - */ - SIMD_FORCE_INLINE void setMin(const btQuadWord& other) - { -#ifdef BT_USE_SSE - mVec128 = _mm_min_ps(mVec128, other.mVec128); -#elif defined(BT_USE_NEON) - mVec128 = vminq_f32(mVec128, other.mVec128); -#else - btSetMin(m_floats[0], other.m_floats[0]); - btSetMin(m_floats[1], other.m_floats[1]); - btSetMin(m_floats[2], other.m_floats[2]); - btSetMin(m_floats[3], other.m_floats[3]); -#endif - } -}; - -#endif //BT_SIMD_QUADWORD_H diff --git a/engine/inc/bullet/LinearMath/btQuaternion.h b/engine/inc/bullet/LinearMath/btQuaternion.h deleted file mode 100644 index 53e8169b..00000000 --- a/engine/inc/bullet/LinearMath/btQuaternion.h +++ /dev/null @@ -1,1021 +0,0 @@ -/* -Copyright (c) 2003-2006 Gino van den Bergen / 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_SIMD__QUATERNION_H_ -#define BT_SIMD__QUATERNION_H_ - -#include "btVector3.h" -#include "btQuadWord.h" - -#ifdef BT_USE_DOUBLE_PRECISION -#define btQuaternionData btQuaternionDoubleData -#define btQuaternionDataName "btQuaternionDoubleData" -#else -#define btQuaternionData btQuaternionFloatData -#define btQuaternionDataName "btQuaternionFloatData" -#endif //BT_USE_DOUBLE_PRECISION - -#ifdef BT_USE_SSE - -//const __m128 ATTRIBUTE_ALIGNED16(vOnes) = {1.0f, 1.0f, 1.0f, 1.0f}; -#define vOnes (_mm_set_ps(1.0f, 1.0f, 1.0f, 1.0f)) - -#endif - -#if defined(BT_USE_SSE) - -#define vQInv (_mm_set_ps(+0.0f, -0.0f, -0.0f, -0.0f)) -#define vPPPM (_mm_set_ps(-0.0f, +0.0f, +0.0f, +0.0f)) - -#elif defined(BT_USE_NEON) - -const btSimdFloat4 ATTRIBUTE_ALIGNED16(vQInv) = {-0.0f, -0.0f, -0.0f, +0.0f}; -const btSimdFloat4 ATTRIBUTE_ALIGNED16(vPPPM) = {+0.0f, +0.0f, +0.0f, -0.0f}; - -#endif - -/**@brief The btQuaternion implements quaternion to perform linear algebra rotations in combination with btMatrix3x3, btVector3 and btTransform. */ -class btQuaternion : public btQuadWord -{ -public: - /**@brief No initialization constructor */ - btQuaternion() {} - -#if (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)) || defined(BT_USE_NEON) - // Set Vector - SIMD_FORCE_INLINE btQuaternion(const btSimdFloat4 vec) - { - mVec128 = vec; - } - - // Copy constructor - SIMD_FORCE_INLINE btQuaternion(const btQuaternion& rhs) - { - mVec128 = rhs.mVec128; - } - - // Assignment Operator - SIMD_FORCE_INLINE btQuaternion& - operator=(const btQuaternion& v) - { - mVec128 = v.mVec128; - - return *this; - } - -#endif - - // template - // explicit Quaternion(const btScalar *v) : Tuple4(v) {} - /**@brief Constructor from scalars */ - btQuaternion(const btScalar& _x, const btScalar& _y, const btScalar& _z, const btScalar& _w) - : btQuadWord(_x, _y, _z, _w) - { - } - /**@brief Axis angle Constructor - * @param axis The axis which the rotation is around - * @param angle The magnitude of the rotation around the angle (Radians) */ - btQuaternion(const btVector3& _axis, const btScalar& _angle) - { - setRotation(_axis, _angle); - } - /**@brief Constructor from Euler angles - * @param yaw Angle around Y unless BT_EULER_DEFAULT_ZYX defined then Z - * @param pitch Angle around X unless BT_EULER_DEFAULT_ZYX defined then Y - * @param roll Angle around Z unless BT_EULER_DEFAULT_ZYX defined then X */ - btQuaternion(const btScalar& yaw, const btScalar& pitch, const btScalar& roll) - { -#ifndef BT_EULER_DEFAULT_ZYX - setEuler(yaw, pitch, roll); -#else - setEulerZYX(yaw, pitch, roll); -#endif - } - /**@brief Set the rotation using axis angle notation - * @param axis The axis around which to rotate - * @param angle The magnitude of the rotation in Radians */ - void setRotation(const btVector3& axis, const btScalar& _angle) - { - btScalar d = axis.length(); - btAssert(d != btScalar(0.0)); - btScalar s = btSin(_angle * btScalar(0.5)) / d; - setValue(axis.x() * s, axis.y() * s, axis.z() * s, - btCos(_angle * btScalar(0.5))); - } - /**@brief Set the quaternion using Euler angles - * @param yaw Angle around Y - * @param pitch Angle around X - * @param roll Angle around Z */ - void setEuler(const btScalar& yaw, const btScalar& pitch, const btScalar& roll) - { - btScalar halfYaw = btScalar(yaw) * btScalar(0.5); - btScalar halfPitch = btScalar(pitch) * btScalar(0.5); - btScalar halfRoll = btScalar(roll) * btScalar(0.5); - btScalar cosYaw = btCos(halfYaw); - btScalar sinYaw = btSin(halfYaw); - btScalar cosPitch = btCos(halfPitch); - btScalar sinPitch = btSin(halfPitch); - btScalar cosRoll = btCos(halfRoll); - btScalar sinRoll = btSin(halfRoll); - setValue(cosRoll * sinPitch * cosYaw + sinRoll * cosPitch * sinYaw, - cosRoll * cosPitch * sinYaw - sinRoll * sinPitch * cosYaw, - sinRoll * cosPitch * cosYaw - cosRoll * sinPitch * sinYaw, - cosRoll * cosPitch * cosYaw + sinRoll * sinPitch * sinYaw); - } - /**@brief Set the quaternion using euler angles - * @param yaw Angle around Z - * @param pitch Angle around Y - * @param roll Angle around X */ - void setEulerZYX(const btScalar& yawZ, const btScalar& pitchY, const btScalar& rollX) - { - btScalar halfYaw = btScalar(yawZ) * btScalar(0.5); - btScalar halfPitch = btScalar(pitchY) * btScalar(0.5); - btScalar halfRoll = btScalar(rollX) * btScalar(0.5); - btScalar cosYaw = btCos(halfYaw); - btScalar sinYaw = btSin(halfYaw); - btScalar cosPitch = btCos(halfPitch); - btScalar sinPitch = btSin(halfPitch); - btScalar cosRoll = btCos(halfRoll); - btScalar sinRoll = btSin(halfRoll); - setValue(sinRoll * cosPitch * cosYaw - cosRoll * sinPitch * sinYaw, //x - cosRoll * sinPitch * cosYaw + sinRoll * cosPitch * sinYaw, //y - cosRoll * cosPitch * sinYaw - sinRoll * sinPitch * cosYaw, //z - cosRoll * cosPitch * cosYaw + sinRoll * sinPitch * sinYaw); //formerly yzx - } - - /**@brief Get the euler angles from this quaternion - * @param yaw Angle around Z - * @param pitch Angle around Y - * @param roll Angle around X */ - void getEulerZYX(btScalar& yawZ, btScalar& pitchY, btScalar& rollX) const - { - btScalar squ; - btScalar sqx; - btScalar sqy; - btScalar sqz; - btScalar sarg; - sqx = m_floats[0] * m_floats[0]; - sqy = m_floats[1] * m_floats[1]; - sqz = m_floats[2] * m_floats[2]; - squ = m_floats[3] * m_floats[3]; - sarg = btScalar(-2.) * (m_floats[0] * m_floats[2] - m_floats[3] * m_floats[1]); - - // If the pitch angle is PI/2 or -PI/2, we can only compute - // the sum roll + yaw. However, any combination that gives - // the right sum will produce the correct orientation, so we - // set rollX = 0 and compute yawZ. - if (sarg <= -btScalar(0.99999)) - { - pitchY = btScalar(-0.5) * SIMD_PI; - rollX = 0; - yawZ = btScalar(2) * btAtan2(m_floats[0], -m_floats[1]); - } - else if (sarg >= btScalar(0.99999)) - { - pitchY = btScalar(0.5) * SIMD_PI; - rollX = 0; - yawZ = btScalar(2) * btAtan2(-m_floats[0], m_floats[1]); - } - else - { - pitchY = btAsin(sarg); - rollX = btAtan2(2 * (m_floats[1] * m_floats[2] + m_floats[3] * m_floats[0]), squ - sqx - sqy + sqz); - yawZ = btAtan2(2 * (m_floats[0] * m_floats[1] + m_floats[3] * m_floats[2]), squ + sqx - sqy - sqz); - } - } - - /**@brief Add two quaternions - * @param q The quaternion to add to this one */ - SIMD_FORCE_INLINE btQuaternion& operator+=(const btQuaternion& q) - { -#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - mVec128 = _mm_add_ps(mVec128, q.mVec128); -#elif defined(BT_USE_NEON) - mVec128 = vaddq_f32(mVec128, q.mVec128); -#else - m_floats[0] += q.x(); - m_floats[1] += q.y(); - m_floats[2] += q.z(); - m_floats[3] += q.m_floats[3]; -#endif - return *this; - } - - /**@brief Subtract out a quaternion - * @param q The quaternion to subtract from this one */ - btQuaternion& operator-=(const btQuaternion& q) - { -#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - mVec128 = _mm_sub_ps(mVec128, q.mVec128); -#elif defined(BT_USE_NEON) - mVec128 = vsubq_f32(mVec128, q.mVec128); -#else - m_floats[0] -= q.x(); - m_floats[1] -= q.y(); - m_floats[2] -= q.z(); - m_floats[3] -= q.m_floats[3]; -#endif - return *this; - } - - /**@brief Scale this quaternion - * @param s The scalar to scale by */ - btQuaternion& operator*=(const btScalar& s) - { -#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - __m128 vs = _mm_load_ss(&s); // (S 0 0 0) - vs = bt_pshufd_ps(vs, 0); // (S S S S) - mVec128 = _mm_mul_ps(mVec128, vs); -#elif defined(BT_USE_NEON) - mVec128 = vmulq_n_f32(mVec128, s); -#else - m_floats[0] *= s; - m_floats[1] *= s; - m_floats[2] *= s; - m_floats[3] *= s; -#endif - return *this; - } - - /**@brief Multiply this quaternion by q on the right - * @param q The other quaternion - * Equivilant to this = this * q */ - btQuaternion& operator*=(const btQuaternion& q) - { -#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - __m128 vQ2 = q.get128(); - - __m128 A1 = bt_pshufd_ps(mVec128, BT_SHUFFLE(0, 1, 2, 0)); - __m128 B1 = bt_pshufd_ps(vQ2, BT_SHUFFLE(3, 3, 3, 0)); - - A1 = A1 * B1; - - __m128 A2 = bt_pshufd_ps(mVec128, BT_SHUFFLE(1, 2, 0, 1)); - __m128 B2 = bt_pshufd_ps(vQ2, BT_SHUFFLE(2, 0, 1, 1)); - - A2 = A2 * B2; - - B1 = bt_pshufd_ps(mVec128, BT_SHUFFLE(2, 0, 1, 2)); - B2 = bt_pshufd_ps(vQ2, BT_SHUFFLE(1, 2, 0, 2)); - - B1 = B1 * B2; // A3 *= B3 - - mVec128 = bt_splat_ps(mVec128, 3); // A0 - mVec128 = mVec128 * vQ2; // A0 * B0 - - A1 = A1 + A2; // AB12 - mVec128 = mVec128 - B1; // AB03 = AB0 - AB3 - A1 = _mm_xor_ps(A1, vPPPM); // change sign of the last element - mVec128 = mVec128 + A1; // AB03 + AB12 - -#elif defined(BT_USE_NEON) - - float32x4_t vQ1 = mVec128; - float32x4_t vQ2 = q.get128(); - float32x4_t A0, A1, B1, A2, B2, A3, B3; - float32x2_t vQ1zx, vQ2wx, vQ1yz, vQ2zx, vQ2yz, vQ2xz; - - { - float32x2x2_t tmp; - tmp = vtrn_f32(vget_high_f32(vQ1), vget_low_f32(vQ1)); // {z x}, {w y} - vQ1zx = tmp.val[0]; - - tmp = vtrn_f32(vget_high_f32(vQ2), vget_low_f32(vQ2)); // {z x}, {w y} - vQ2zx = tmp.val[0]; - } - vQ2wx = vext_f32(vget_high_f32(vQ2), vget_low_f32(vQ2), 1); - - vQ1yz = vext_f32(vget_low_f32(vQ1), vget_high_f32(vQ1), 1); - - vQ2yz = vext_f32(vget_low_f32(vQ2), vget_high_f32(vQ2), 1); - vQ2xz = vext_f32(vQ2zx, vQ2zx, 1); - - A1 = vcombine_f32(vget_low_f32(vQ1), vQ1zx); // X Y z x - B1 = vcombine_f32(vdup_lane_f32(vget_high_f32(vQ2), 1), vQ2wx); // W W W X - - A2 = vcombine_f32(vQ1yz, vget_low_f32(vQ1)); - B2 = vcombine_f32(vQ2zx, vdup_lane_f32(vget_low_f32(vQ2), 1)); - - A3 = vcombine_f32(vQ1zx, vQ1yz); // Z X Y Z - B3 = vcombine_f32(vQ2yz, vQ2xz); // Y Z x z - - A1 = vmulq_f32(A1, B1); - A2 = vmulq_f32(A2, B2); - A3 = vmulq_f32(A3, B3); // A3 *= B3 - A0 = vmulq_lane_f32(vQ2, vget_high_f32(vQ1), 1); // A0 * B0 - - A1 = vaddq_f32(A1, A2); // AB12 = AB1 + AB2 - A0 = vsubq_f32(A0, A3); // AB03 = AB0 - AB3 - - // change the sign of the last element - A1 = (btSimdFloat4)veorq_s32((int32x4_t)A1, (int32x4_t)vPPPM); - A0 = vaddq_f32(A0, A1); // AB03 + AB12 - - mVec128 = A0; -#else - setValue( - m_floats[3] * q.x() + m_floats[0] * q.m_floats[3] + m_floats[1] * q.z() - m_floats[2] * q.y(), - m_floats[3] * q.y() + m_floats[1] * q.m_floats[3] + m_floats[2] * q.x() - m_floats[0] * q.z(), - m_floats[3] * q.z() + m_floats[2] * q.m_floats[3] + m_floats[0] * q.y() - m_floats[1] * q.x(), - m_floats[3] * q.m_floats[3] - m_floats[0] * q.x() - m_floats[1] * q.y() - m_floats[2] * q.z()); -#endif - return *this; - } - /**@brief Return the dot product between this quaternion and another - * @param q The other quaternion */ - btScalar dot(const btQuaternion& q) const - { -#if defined BT_USE_SIMD_VECTOR3 && defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - __m128 vd; - - vd = _mm_mul_ps(mVec128, q.mVec128); - - __m128 t = _mm_movehl_ps(vd, vd); - vd = _mm_add_ps(vd, t); - t = _mm_shuffle_ps(vd, vd, 0x55); - vd = _mm_add_ss(vd, t); - - return _mm_cvtss_f32(vd); -#elif defined(BT_USE_NEON) - float32x4_t vd = vmulq_f32(mVec128, q.mVec128); - float32x2_t x = vpadd_f32(vget_low_f32(vd), vget_high_f32(vd)); - x = vpadd_f32(x, x); - return vget_lane_f32(x, 0); -#else - return m_floats[0] * q.x() + - m_floats[1] * q.y() + - m_floats[2] * q.z() + - m_floats[3] * q.m_floats[3]; -#endif - } - - /**@brief Return the length squared of the quaternion */ - btScalar length2() const - { - return dot(*this); - } - - /**@brief Return the length of the quaternion */ - btScalar length() const - { - return btSqrt(length2()); - } - btQuaternion& safeNormalize() - { - btScalar l2 = length2(); - if (l2 > SIMD_EPSILON) - { - normalize(); - } - return *this; - } - /**@brief Normalize the quaternion - * Such that x^2 + y^2 + z^2 +w^2 = 1 */ - btQuaternion& normalize() - { -#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - __m128 vd; - - vd = _mm_mul_ps(mVec128, mVec128); - - __m128 t = _mm_movehl_ps(vd, vd); - vd = _mm_add_ps(vd, t); - t = _mm_shuffle_ps(vd, vd, 0x55); - vd = _mm_add_ss(vd, t); - - vd = _mm_sqrt_ss(vd); - vd = _mm_div_ss(vOnes, vd); - vd = bt_pshufd_ps(vd, 0); // splat - mVec128 = _mm_mul_ps(mVec128, vd); - - return *this; -#else - return *this /= length(); -#endif - } - - /**@brief Return a scaled version of this quaternion - * @param s The scale factor */ - SIMD_FORCE_INLINE btQuaternion - operator*(const btScalar& s) const - { -#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - __m128 vs = _mm_load_ss(&s); // (S 0 0 0) - vs = bt_pshufd_ps(vs, 0x00); // (S S S S) - - return btQuaternion(_mm_mul_ps(mVec128, vs)); -#elif defined(BT_USE_NEON) - return btQuaternion(vmulq_n_f32(mVec128, s)); -#else - return btQuaternion(x() * s, y() * s, z() * s, m_floats[3] * s); -#endif - } - - /**@brief Return an inversely scaled versionof this quaternion - * @param s The inverse scale factor */ - btQuaternion operator/(const btScalar& s) const - { - btAssert(s != btScalar(0.0)); - return *this * (btScalar(1.0) / s); - } - - /**@brief Inversely scale this quaternion - * @param s The scale factor */ - btQuaternion& operator/=(const btScalar& s) - { - btAssert(s != btScalar(0.0)); - return *this *= btScalar(1.0) / s; - } - - /**@brief Return a normalized version of this quaternion */ - btQuaternion normalized() const - { - return *this / length(); - } - /**@brief Return the ***half*** angle between this quaternion and the other - * @param q The other quaternion */ - btScalar angle(const btQuaternion& q) const - { - btScalar s = btSqrt(length2() * q.length2()); - btAssert(s != btScalar(0.0)); - return btAcos(dot(q) / s); - } - - /**@brief Return the angle between this quaternion and the other along the shortest path - * @param q The other quaternion */ - btScalar angleShortestPath(const btQuaternion& q) const - { - btScalar s = btSqrt(length2() * q.length2()); - btAssert(s != btScalar(0.0)); - if (dot(q) < 0) // Take care of long angle case see http://en.wikipedia.org/wiki/Slerp - return btAcos(dot(-q) / s) * btScalar(2.0); - else - return btAcos(dot(q) / s) * btScalar(2.0); - } - - /**@brief Return the angle [0, 2Pi] of rotation represented by this quaternion */ - btScalar getAngle() const - { - btScalar s = btScalar(2.) * btAcos(m_floats[3]); - return s; - } - - /**@brief Return the angle [0, Pi] of rotation represented by this quaternion along the shortest path */ - btScalar getAngleShortestPath() const - { - btScalar s; - if (m_floats[3] >= 0) - s = btScalar(2.) * btAcos(m_floats[3]); - else - s = btScalar(2.) * btAcos(-m_floats[3]); - return s; - } - - /**@brief Return the axis of the rotation represented by this quaternion */ - btVector3 getAxis() const - { - btScalar s_squared = 1.f - m_floats[3] * m_floats[3]; - - if (s_squared < btScalar(10.) * SIMD_EPSILON) //Check for divide by zero - return btVector3(1.0, 0.0, 0.0); // Arbitrary - btScalar s = 1.f / btSqrt(s_squared); - return btVector3(m_floats[0] * s, m_floats[1] * s, m_floats[2] * s); - } - - /**@brief Return the inverse of this quaternion */ - btQuaternion inverse() const - { -#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - return btQuaternion(_mm_xor_ps(mVec128, vQInv)); -#elif defined(BT_USE_NEON) - return btQuaternion((btSimdFloat4)veorq_s32((int32x4_t)mVec128, (int32x4_t)vQInv)); -#else - return btQuaternion(-m_floats[0], -m_floats[1], -m_floats[2], m_floats[3]); -#endif - } - - /**@brief Return the sum of this quaternion and the other - * @param q2 The other quaternion */ - SIMD_FORCE_INLINE btQuaternion - operator+(const btQuaternion& q2) const - { -#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - return btQuaternion(_mm_add_ps(mVec128, q2.mVec128)); -#elif defined(BT_USE_NEON) - return btQuaternion(vaddq_f32(mVec128, q2.mVec128)); -#else - const btQuaternion& q1 = *this; - return btQuaternion(q1.x() + q2.x(), q1.y() + q2.y(), q1.z() + q2.z(), q1.m_floats[3] + q2.m_floats[3]); -#endif - } - - /**@brief Return the difference between this quaternion and the other - * @param q2 The other quaternion */ - SIMD_FORCE_INLINE btQuaternion - operator-(const btQuaternion& q2) const - { -#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - return btQuaternion(_mm_sub_ps(mVec128, q2.mVec128)); -#elif defined(BT_USE_NEON) - return btQuaternion(vsubq_f32(mVec128, q2.mVec128)); -#else - const btQuaternion& q1 = *this; - return btQuaternion(q1.x() - q2.x(), q1.y() - q2.y(), q1.z() - q2.z(), q1.m_floats[3] - q2.m_floats[3]); -#endif - } - - /**@brief Return the negative of this quaternion - * This simply negates each element */ - SIMD_FORCE_INLINE btQuaternion operator-() const - { -#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - return btQuaternion(_mm_xor_ps(mVec128, btvMzeroMask)); -#elif defined(BT_USE_NEON) - return btQuaternion((btSimdFloat4)veorq_s32((int32x4_t)mVec128, (int32x4_t)btvMzeroMask)); -#else - const btQuaternion& q2 = *this; - return btQuaternion(-q2.x(), -q2.y(), -q2.z(), -q2.m_floats[3]); -#endif - } - /**@todo document this and it's use */ - SIMD_FORCE_INLINE btQuaternion farthest(const btQuaternion& qd) const - { - btQuaternion diff, sum; - diff = *this - qd; - sum = *this + qd; - if (diff.dot(diff) > sum.dot(sum)) - return qd; - return (-qd); - } - - /**@todo document this and it's use */ - SIMD_FORCE_INLINE btQuaternion nearest(const btQuaternion& qd) const - { - btQuaternion diff, sum; - diff = *this - qd; - sum = *this + qd; - if (diff.dot(diff) < sum.dot(sum)) - return qd; - return (-qd); - } - - /**@brief Return the quaternion which is the result of Spherical Linear Interpolation between this and the other quaternion - * @param q The other quaternion to interpolate with - * @param t The ratio between this and q to interpolate. If t = 0 the result is this, if t=1 the result is q. - * Slerp interpolates assuming constant velocity. */ - btQuaternion slerp(const btQuaternion& q, const btScalar& t) const - { - const btScalar magnitude = btSqrt(length2() * q.length2()); - btAssert(magnitude > btScalar(0)); - - const btScalar product = dot(q) / magnitude; - const btScalar absproduct = btFabs(product); - - if (absproduct < btScalar(1.0 - SIMD_EPSILON)) - { - // Take care of long angle case see http://en.wikipedia.org/wiki/Slerp - const btScalar theta = btAcos(absproduct); - const btScalar d = btSin(theta); - btAssert(d > btScalar(0)); - - const btScalar sign = (product < 0) ? btScalar(-1) : btScalar(1); - const btScalar s0 = btSin((btScalar(1.0) - t) * theta) / d; - const btScalar s1 = btSin(sign * t * theta) / d; - - return btQuaternion( - (m_floats[0] * s0 + q.x() * s1), - (m_floats[1] * s0 + q.y() * s1), - (m_floats[2] * s0 + q.z() * s1), - (m_floats[3] * s0 + q.w() * s1)); - } - else - { - return *this; - } - } - - static const btQuaternion& getIdentity() - { - static const btQuaternion identityQuat(btScalar(0.), btScalar(0.), btScalar(0.), btScalar(1.)); - return identityQuat; - } - - SIMD_FORCE_INLINE const btScalar& getW() const { return m_floats[3]; } - - SIMD_FORCE_INLINE void serialize(struct btQuaternionData& dataOut) const; - - SIMD_FORCE_INLINE void deSerialize(const struct btQuaternionFloatData& dataIn); - - SIMD_FORCE_INLINE void deSerialize(const struct btQuaternionDoubleData& dataIn); - - SIMD_FORCE_INLINE void serializeFloat(struct btQuaternionFloatData& dataOut) const; - - SIMD_FORCE_INLINE void deSerializeFloat(const struct btQuaternionFloatData& dataIn); - - SIMD_FORCE_INLINE void serializeDouble(struct btQuaternionDoubleData& dataOut) const; - - SIMD_FORCE_INLINE void deSerializeDouble(const struct btQuaternionDoubleData& dataIn); -}; - -/**@brief Return the product of two quaternions */ -SIMD_FORCE_INLINE btQuaternion -operator*(const btQuaternion& q1, const btQuaternion& q2) -{ -#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - __m128 vQ1 = q1.get128(); - __m128 vQ2 = q2.get128(); - __m128 A0, A1, B1, A2, B2; - - A1 = bt_pshufd_ps(vQ1, BT_SHUFFLE(0, 1, 2, 0)); // X Y z x // vtrn - B1 = bt_pshufd_ps(vQ2, BT_SHUFFLE(3, 3, 3, 0)); // W W W X // vdup vext - - A1 = A1 * B1; - - A2 = bt_pshufd_ps(vQ1, BT_SHUFFLE(1, 2, 0, 1)); // Y Z X Y // vext - B2 = bt_pshufd_ps(vQ2, BT_SHUFFLE(2, 0, 1, 1)); // z x Y Y // vtrn vdup - - A2 = A2 * B2; - - B1 = bt_pshufd_ps(vQ1, BT_SHUFFLE(2, 0, 1, 2)); // z x Y Z // vtrn vext - B2 = bt_pshufd_ps(vQ2, BT_SHUFFLE(1, 2, 0, 2)); // Y Z x z // vext vtrn - - B1 = B1 * B2; // A3 *= B3 - - A0 = bt_splat_ps(vQ1, 3); // A0 - A0 = A0 * vQ2; // A0 * B0 - - A1 = A1 + A2; // AB12 - A0 = A0 - B1; // AB03 = AB0 - AB3 - - A1 = _mm_xor_ps(A1, vPPPM); // change sign of the last element - A0 = A0 + A1; // AB03 + AB12 - - return btQuaternion(A0); - -#elif defined(BT_USE_NEON) - - float32x4_t vQ1 = q1.get128(); - float32x4_t vQ2 = q2.get128(); - float32x4_t A0, A1, B1, A2, B2, A3, B3; - float32x2_t vQ1zx, vQ2wx, vQ1yz, vQ2zx, vQ2yz, vQ2xz; - - { - float32x2x2_t tmp; - tmp = vtrn_f32(vget_high_f32(vQ1), vget_low_f32(vQ1)); // {z x}, {w y} - vQ1zx = tmp.val[0]; - - tmp = vtrn_f32(vget_high_f32(vQ2), vget_low_f32(vQ2)); // {z x}, {w y} - vQ2zx = tmp.val[0]; - } - vQ2wx = vext_f32(vget_high_f32(vQ2), vget_low_f32(vQ2), 1); - - vQ1yz = vext_f32(vget_low_f32(vQ1), vget_high_f32(vQ1), 1); - - vQ2yz = vext_f32(vget_low_f32(vQ2), vget_high_f32(vQ2), 1); - vQ2xz = vext_f32(vQ2zx, vQ2zx, 1); - - A1 = vcombine_f32(vget_low_f32(vQ1), vQ1zx); // X Y z x - B1 = vcombine_f32(vdup_lane_f32(vget_high_f32(vQ2), 1), vQ2wx); // W W W X - - A2 = vcombine_f32(vQ1yz, vget_low_f32(vQ1)); - B2 = vcombine_f32(vQ2zx, vdup_lane_f32(vget_low_f32(vQ2), 1)); - - A3 = vcombine_f32(vQ1zx, vQ1yz); // Z X Y Z - B3 = vcombine_f32(vQ2yz, vQ2xz); // Y Z x z - - A1 = vmulq_f32(A1, B1); - A2 = vmulq_f32(A2, B2); - A3 = vmulq_f32(A3, B3); // A3 *= B3 - A0 = vmulq_lane_f32(vQ2, vget_high_f32(vQ1), 1); // A0 * B0 - - A1 = vaddq_f32(A1, A2); // AB12 = AB1 + AB2 - A0 = vsubq_f32(A0, A3); // AB03 = AB0 - AB3 - - // change the sign of the last element - A1 = (btSimdFloat4)veorq_s32((int32x4_t)A1, (int32x4_t)vPPPM); - A0 = vaddq_f32(A0, A1); // AB03 + AB12 - - return btQuaternion(A0); - -#else - return btQuaternion( - q1.w() * q2.x() + q1.x() * q2.w() + q1.y() * q2.z() - q1.z() * q2.y(), - q1.w() * q2.y() + q1.y() * q2.w() + q1.z() * q2.x() - q1.x() * q2.z(), - q1.w() * q2.z() + q1.z() * q2.w() + q1.x() * q2.y() - q1.y() * q2.x(), - q1.w() * q2.w() - q1.x() * q2.x() - q1.y() * q2.y() - q1.z() * q2.z()); -#endif -} - -SIMD_FORCE_INLINE btQuaternion -operator*(const btQuaternion& q, const btVector3& w) -{ -#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - __m128 vQ1 = q.get128(); - __m128 vQ2 = w.get128(); - __m128 A1, B1, A2, B2, A3, B3; - - A1 = bt_pshufd_ps(vQ1, BT_SHUFFLE(3, 3, 3, 0)); - B1 = bt_pshufd_ps(vQ2, BT_SHUFFLE(0, 1, 2, 0)); - - A1 = A1 * B1; - - A2 = bt_pshufd_ps(vQ1, BT_SHUFFLE(1, 2, 0, 1)); - B2 = bt_pshufd_ps(vQ2, BT_SHUFFLE(2, 0, 1, 1)); - - A2 = A2 * B2; - - A3 = bt_pshufd_ps(vQ1, BT_SHUFFLE(2, 0, 1, 2)); - B3 = bt_pshufd_ps(vQ2, BT_SHUFFLE(1, 2, 0, 2)); - - A3 = A3 * B3; // A3 *= B3 - - A1 = A1 + A2; // AB12 - A1 = _mm_xor_ps(A1, vPPPM); // change sign of the last element - A1 = A1 - A3; // AB123 = AB12 - AB3 - - return btQuaternion(A1); - -#elif defined(BT_USE_NEON) - - float32x4_t vQ1 = q.get128(); - float32x4_t vQ2 = w.get128(); - float32x4_t A1, B1, A2, B2, A3, B3; - float32x2_t vQ1wx, vQ2zx, vQ1yz, vQ2yz, vQ1zx, vQ2xz; - - vQ1wx = vext_f32(vget_high_f32(vQ1), vget_low_f32(vQ1), 1); - { - float32x2x2_t tmp; - - tmp = vtrn_f32(vget_high_f32(vQ2), vget_low_f32(vQ2)); // {z x}, {w y} - vQ2zx = tmp.val[0]; - - tmp = vtrn_f32(vget_high_f32(vQ1), vget_low_f32(vQ1)); // {z x}, {w y} - vQ1zx = tmp.val[0]; - } - - vQ1yz = vext_f32(vget_low_f32(vQ1), vget_high_f32(vQ1), 1); - - vQ2yz = vext_f32(vget_low_f32(vQ2), vget_high_f32(vQ2), 1); - vQ2xz = vext_f32(vQ2zx, vQ2zx, 1); - - A1 = vcombine_f32(vdup_lane_f32(vget_high_f32(vQ1), 1), vQ1wx); // W W W X - B1 = vcombine_f32(vget_low_f32(vQ2), vQ2zx); // X Y z x - - A2 = vcombine_f32(vQ1yz, vget_low_f32(vQ1)); - B2 = vcombine_f32(vQ2zx, vdup_lane_f32(vget_low_f32(vQ2), 1)); - - A3 = vcombine_f32(vQ1zx, vQ1yz); // Z X Y Z - B3 = vcombine_f32(vQ2yz, vQ2xz); // Y Z x z - - A1 = vmulq_f32(A1, B1); - A2 = vmulq_f32(A2, B2); - A3 = vmulq_f32(A3, B3); // A3 *= B3 - - A1 = vaddq_f32(A1, A2); // AB12 = AB1 + AB2 - - // change the sign of the last element - A1 = (btSimdFloat4)veorq_s32((int32x4_t)A1, (int32x4_t)vPPPM); - - A1 = vsubq_f32(A1, A3); // AB123 = AB12 - AB3 - - return btQuaternion(A1); - -#else - return btQuaternion( - q.w() * w.x() + q.y() * w.z() - q.z() * w.y(), - q.w() * w.y() + q.z() * w.x() - q.x() * w.z(), - q.w() * w.z() + q.x() * w.y() - q.y() * w.x(), - -q.x() * w.x() - q.y() * w.y() - q.z() * w.z()); -#endif -} - -SIMD_FORCE_INLINE btQuaternion -operator*(const btVector3& w, const btQuaternion& q) -{ -#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - __m128 vQ1 = w.get128(); - __m128 vQ2 = q.get128(); - __m128 A1, B1, A2, B2, A3, B3; - - A1 = bt_pshufd_ps(vQ1, BT_SHUFFLE(0, 1, 2, 0)); // X Y z x - B1 = bt_pshufd_ps(vQ2, BT_SHUFFLE(3, 3, 3, 0)); // W W W X - - A1 = A1 * B1; - - A2 = bt_pshufd_ps(vQ1, BT_SHUFFLE(1, 2, 0, 1)); - B2 = bt_pshufd_ps(vQ2, BT_SHUFFLE(2, 0, 1, 1)); - - A2 = A2 * B2; - - A3 = bt_pshufd_ps(vQ1, BT_SHUFFLE(2, 0, 1, 2)); - B3 = bt_pshufd_ps(vQ2, BT_SHUFFLE(1, 2, 0, 2)); - - A3 = A3 * B3; // A3 *= B3 - - A1 = A1 + A2; // AB12 - A1 = _mm_xor_ps(A1, vPPPM); // change sign of the last element - A1 = A1 - A3; // AB123 = AB12 - AB3 - - return btQuaternion(A1); - -#elif defined(BT_USE_NEON) - - float32x4_t vQ1 = w.get128(); - float32x4_t vQ2 = q.get128(); - float32x4_t A1, B1, A2, B2, A3, B3; - float32x2_t vQ1zx, vQ2wx, vQ1yz, vQ2zx, vQ2yz, vQ2xz; - - { - float32x2x2_t tmp; - - tmp = vtrn_f32(vget_high_f32(vQ1), vget_low_f32(vQ1)); // {z x}, {w y} - vQ1zx = tmp.val[0]; - - tmp = vtrn_f32(vget_high_f32(vQ2), vget_low_f32(vQ2)); // {z x}, {w y} - vQ2zx = tmp.val[0]; - } - vQ2wx = vext_f32(vget_high_f32(vQ2), vget_low_f32(vQ2), 1); - - vQ1yz = vext_f32(vget_low_f32(vQ1), vget_high_f32(vQ1), 1); - - vQ2yz = vext_f32(vget_low_f32(vQ2), vget_high_f32(vQ2), 1); - vQ2xz = vext_f32(vQ2zx, vQ2zx, 1); - - A1 = vcombine_f32(vget_low_f32(vQ1), vQ1zx); // X Y z x - B1 = vcombine_f32(vdup_lane_f32(vget_high_f32(vQ2), 1), vQ2wx); // W W W X - - A2 = vcombine_f32(vQ1yz, vget_low_f32(vQ1)); - B2 = vcombine_f32(vQ2zx, vdup_lane_f32(vget_low_f32(vQ2), 1)); - - A3 = vcombine_f32(vQ1zx, vQ1yz); // Z X Y Z - B3 = vcombine_f32(vQ2yz, vQ2xz); // Y Z x z - - A1 = vmulq_f32(A1, B1); - A2 = vmulq_f32(A2, B2); - A3 = vmulq_f32(A3, B3); // A3 *= B3 - - A1 = vaddq_f32(A1, A2); // AB12 = AB1 + AB2 - - // change the sign of the last element - A1 = (btSimdFloat4)veorq_s32((int32x4_t)A1, (int32x4_t)vPPPM); - - A1 = vsubq_f32(A1, A3); // AB123 = AB12 - AB3 - - return btQuaternion(A1); - -#else - return btQuaternion( - +w.x() * q.w() + w.y() * q.z() - w.z() * q.y(), - +w.y() * q.w() + w.z() * q.x() - w.x() * q.z(), - +w.z() * q.w() + w.x() * q.y() - w.y() * q.x(), - -w.x() * q.x() - w.y() * q.y() - w.z() * q.z()); -#endif -} - -/**@brief Calculate the dot product between two quaternions */ -SIMD_FORCE_INLINE btScalar -dot(const btQuaternion& q1, const btQuaternion& q2) -{ - return q1.dot(q2); -} - -/**@brief Return the length of a quaternion */ -SIMD_FORCE_INLINE btScalar -length(const btQuaternion& q) -{ - return q.length(); -} - -/**@brief Return the angle between two quaternions*/ -SIMD_FORCE_INLINE btScalar -btAngle(const btQuaternion& q1, const btQuaternion& q2) -{ - return q1.angle(q2); -} - -/**@brief Return the inverse of a quaternion*/ -SIMD_FORCE_INLINE btQuaternion -inverse(const btQuaternion& q) -{ - return q.inverse(); -} - -/**@brief Return the result of spherical linear interpolation betwen two quaternions - * @param q1 The first quaternion - * @param q2 The second quaternion - * @param t The ration between q1 and q2. t = 0 return q1, t=1 returns q2 - * Slerp assumes constant velocity between positions. */ -SIMD_FORCE_INLINE btQuaternion -slerp(const btQuaternion& q1, const btQuaternion& q2, const btScalar& t) -{ - return q1.slerp(q2, t); -} - -SIMD_FORCE_INLINE btVector3 -quatRotate(const btQuaternion& rotation, const btVector3& v) -{ - btQuaternion q = rotation * v; - q *= rotation.inverse(); -#if defined BT_USE_SIMD_VECTOR3 && defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - return btVector3(_mm_and_ps(q.get128(), btvFFF0fMask)); -#elif defined(BT_USE_NEON) - return btVector3((float32x4_t)vandq_s32((int32x4_t)q.get128(), btvFFF0Mask)); -#else - return btVector3(q.getX(), q.getY(), q.getZ()); -#endif -} - -SIMD_FORCE_INLINE btQuaternion -shortestArcQuat(const btVector3& v0, const btVector3& v1) // Game Programming Gems 2.10. make sure v0,v1 are normalized -{ - btVector3 c = v0.cross(v1); - btScalar d = v0.dot(v1); - - if (d < -1.0 + SIMD_EPSILON) - { - btVector3 n, unused; - btPlaneSpace1(v0, n, unused); - return btQuaternion(n.x(), n.y(), n.z(), 0.0f); // just pick any vector that is orthogonal to v0 - } - - btScalar s = btSqrt((1.0f + d) * 2.0f); - btScalar rs = 1.0f / s; - - return btQuaternion(c.getX() * rs, c.getY() * rs, c.getZ() * rs, s * 0.5f); -} - -SIMD_FORCE_INLINE btQuaternion -shortestArcQuatNormalize2(btVector3& v0, btVector3& v1) -{ - v0.normalize(); - v1.normalize(); - return shortestArcQuat(v0, v1); -} - -struct btQuaternionFloatData -{ - float m_floats[4]; -}; - -struct btQuaternionDoubleData -{ - double m_floats[4]; -}; - -SIMD_FORCE_INLINE void btQuaternion::serializeFloat(struct btQuaternionFloatData& dataOut) const -{ - ///could also do a memcpy, check if it is worth it - for (int i = 0; i < 4; i++) - dataOut.m_floats[i] = float(m_floats[i]); -} - -SIMD_FORCE_INLINE void btQuaternion::deSerializeFloat(const struct btQuaternionFloatData& dataIn) -{ - for (int i = 0; i < 4; i++) - m_floats[i] = btScalar(dataIn.m_floats[i]); -} - -SIMD_FORCE_INLINE void btQuaternion::serializeDouble(struct btQuaternionDoubleData& dataOut) const -{ - ///could also do a memcpy, check if it is worth it - for (int i = 0; i < 4; i++) - dataOut.m_floats[i] = double(m_floats[i]); -} - -SIMD_FORCE_INLINE void btQuaternion::deSerializeDouble(const struct btQuaternionDoubleData& dataIn) -{ - for (int i = 0; i < 4; i++) - m_floats[i] = btScalar(dataIn.m_floats[i]); -} - -SIMD_FORCE_INLINE void btQuaternion::serialize(struct btQuaternionData& dataOut) const -{ - ///could also do a memcpy, check if it is worth it - for (int i = 0; i < 4; i++) - dataOut.m_floats[i] = m_floats[i]; -} - -SIMD_FORCE_INLINE void btQuaternion::deSerialize(const struct btQuaternionFloatData& dataIn) -{ - for (int i = 0; i < 4; i++) - m_floats[i] = (btScalar)dataIn.m_floats[i]; -} - -SIMD_FORCE_INLINE void btQuaternion::deSerialize(const struct btQuaternionDoubleData& dataIn) -{ - for (int i = 0; i < 4; i++) - m_floats[i] = (btScalar)dataIn.m_floats[i]; -} - -#endif //BT_SIMD__QUATERNION_H_ diff --git a/engine/inc/bullet/LinearMath/btQuickprof.h b/engine/inc/bullet/LinearMath/btQuickprof.h deleted file mode 100644 index 990d401d..00000000 --- a/engine/inc/bullet/LinearMath/btQuickprof.h +++ /dev/null @@ -1,200 +0,0 @@ - -/*************************************************************************************************** -** -** Real-Time Hierarchical Profiling for Game Programming Gems 3 -** -** by Greg Hjelstrom & Byon Garrabrant -** -***************************************************************************************************/ - -// Credits: The Clock class was inspired by the Timer classes in -// Ogre (www.ogre3d.org). - -#ifndef BT_QUICK_PROF_H -#define BT_QUICK_PROF_H - -#include "btScalar.h" -#define USE_BT_CLOCK 1 - -#ifdef USE_BT_CLOCK - -///The btClock is a portable basic clock that measures accurate time in seconds, use for profiling. -class btClock -{ -public: - btClock(); - - btClock(const btClock& other); - btClock& operator=(const btClock& other); - - ~btClock(); - - /// Resets the initial reference time. - void reset(); - - /// Returns the time in ms since the last call to reset or since - /// the btClock was created. - unsigned long long int getTimeMilliseconds(); - - /// Returns the time in us since the last call to reset or since - /// the Clock was created. - unsigned long long int getTimeMicroseconds(); - - unsigned long long int getTimeNanoseconds(); - - /// Returns the time in s since the last call to reset or since - /// the Clock was created. - btScalar getTimeSeconds(); - -private: - struct btClockData* m_data; -}; - -#endif //USE_BT_CLOCK - -typedef void(btEnterProfileZoneFunc)(const char* msg); -typedef void(btLeaveProfileZoneFunc)(); - -btEnterProfileZoneFunc* btGetCurrentEnterProfileZoneFunc(); -btLeaveProfileZoneFunc* btGetCurrentLeaveProfileZoneFunc(); - -void btSetCustomEnterProfileZoneFunc(btEnterProfileZoneFunc* enterFunc); -void btSetCustomLeaveProfileZoneFunc(btLeaveProfileZoneFunc* leaveFunc); - -#ifndef BT_ENABLE_PROFILE -#define BT_NO_PROFILE 1 -#endif //BT_NO_PROFILE - -const unsigned int BT_QUICKPROF_MAX_THREAD_COUNT = 64; - -//btQuickprofGetCurrentThreadIndex will return -1 if thread index cannot be determined, -//otherwise returns thread index in range [0..maxThreads] -unsigned int btQuickprofGetCurrentThreadIndex2(); - -#ifndef BT_NO_PROFILE - - -#include //@todo remove this, backwards compatibility - -#include "btAlignedAllocator.h" -#include - -///A node in the Profile Hierarchy Tree -class CProfileNode -{ -public: - CProfileNode(const char* name, CProfileNode* parent); - ~CProfileNode(void); - - CProfileNode* Get_Sub_Node(const char* name); - - CProfileNode* Get_Parent(void) { return Parent; } - CProfileNode* Get_Sibling(void) { return Sibling; } - CProfileNode* Get_Child(void) { return Child; } - - void CleanupMemory(); - void Reset(void); - void Call(void); - bool Return(void); - - const char* Get_Name(void) { return Name; } - int Get_Total_Calls(void) { return TotalCalls; } - float Get_Total_Time(void) { return TotalTime; } - void* GetUserPointer() const { return m_userPtr; } - void SetUserPointer(void* ptr) { m_userPtr = ptr; } - -protected: - const char* Name; - int TotalCalls; - float TotalTime; - unsigned long int StartTime; - int RecursionCounter; - - CProfileNode* Parent; - CProfileNode* Child; - CProfileNode* Sibling; - void* m_userPtr; -}; - -///An iterator to navigate through the tree -class CProfileIterator -{ -public: - // Access all the children of the current parent - void First(void); - void Next(void); - bool Is_Done(void); - bool Is_Root(void) { return (CurrentParent->Get_Parent() == 0); } - - void Enter_Child(int index); // Make the given child the new parent - void Enter_Largest_Child(void); // Make the largest child the new parent - void Enter_Parent(void); // Make the current parent's parent the new parent - - // Access the current child - const char* Get_Current_Name(void) { return CurrentChild->Get_Name(); } - int Get_Current_Total_Calls(void) { return CurrentChild->Get_Total_Calls(); } - float Get_Current_Total_Time(void) { return CurrentChild->Get_Total_Time(); } - - void* Get_Current_UserPointer(void) { return CurrentChild->GetUserPointer(); } - void Set_Current_UserPointer(void* ptr) { CurrentChild->SetUserPointer(ptr); } - // Access the current parent - const char* Get_Current_Parent_Name(void) { return CurrentParent->Get_Name(); } - int Get_Current_Parent_Total_Calls(void) { return CurrentParent->Get_Total_Calls(); } - float Get_Current_Parent_Total_Time(void) { return CurrentParent->Get_Total_Time(); } - -protected: - CProfileNode* CurrentParent; - CProfileNode* CurrentChild; - - CProfileIterator(CProfileNode* start); - friend class CProfileManager; -}; - -///The Manager for the Profile system -class CProfileManager -{ -public: - static void Start_Profile(const char* name); - static void Stop_Profile(void); - - static void CleanupMemory(void); - // { - // Root.CleanupMemory(); - // } - - static void Reset(void); - static void Increment_Frame_Counter(void); - static int Get_Frame_Count_Since_Reset(void) { return FrameCounter; } - static float Get_Time_Since_Reset(void); - - static CProfileIterator* Get_Iterator(void); - // { - // - // return new CProfileIterator( &Root ); - // } - static void Release_Iterator(CProfileIterator* iterator) { delete (iterator); } - - static void dumpRecursive(CProfileIterator* profileIterator, int spacing); - - static void dumpAll(); - -private: - static int FrameCounter; - static unsigned long int ResetTime; -}; - -#endif //#ifndef BT_NO_PROFILE - -///ProfileSampleClass is a simple way to profile a function's scope -///Use the BT_PROFILE macro at the start of scope to time -class CProfileSample -{ -public: - CProfileSample(const char* name); - - ~CProfileSample(void); -}; - -#define BT_PROFILE(name) CProfileSample __profile(name) - -#endif //BT_QUICK_PROF_H diff --git a/engine/inc/bullet/LinearMath/btRandom.h b/engine/inc/bullet/LinearMath/btRandom.h deleted file mode 100644 index e659af86..00000000 --- a/engine/inc/bullet/LinearMath/btRandom.h +++ /dev/null @@ -1,39 +0,0 @@ -/* -Copyright (c) 2003-2006 Gino van den Bergen / 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_GEN_RANDOM_H -#define BT_GEN_RANDOM_H - -#ifdef MT19937 - -#include -#include - -#define GEN_RAND_MAX UINT_MAX - -SIMD_FORCE_INLINE void GEN_srand(unsigned int seed) { init_genrand(seed); } -SIMD_FORCE_INLINE unsigned int GEN_rand() { return genrand_int32(); } - -#else - -#include - -#define GEN_RAND_MAX RAND_MAX - -SIMD_FORCE_INLINE void GEN_srand(unsigned int seed) { srand(seed); } -SIMD_FORCE_INLINE unsigned int GEN_rand() { return rand(); } - -#endif - -#endif //BT_GEN_RANDOM_H diff --git a/engine/inc/bullet/LinearMath/btReducedVector.h b/engine/inc/bullet/LinearMath/btReducedVector.h deleted file mode 100644 index 313a4271..00000000 --- a/engine/inc/bullet/LinearMath/btReducedVector.h +++ /dev/null @@ -1,320 +0,0 @@ -// -// btReducedVectors.h -// BulletLinearMath -// -// Created by Xuchen Han on 4/4/20. -// -#ifndef btReducedVectors_h -#define btReducedVectors_h -#include "btVector3.h" -#include "btMatrix3x3.h" -#include "btAlignedObjectArray.h" -#include -#include -#include -struct TwoInts -{ - int a,b; -}; -inline bool operator<(const TwoInts& A, const TwoInts& B) -{ - return A.b < B.b; -} - - -// A helper vector type used for CG projections -class btReducedVector -{ -public: - btAlignedObjectArray m_indices; - btAlignedObjectArray m_vecs; - int m_sz; // all m_indices value < m_sz -public: - btReducedVector():m_sz(0) - { - m_indices.resize(0); - m_vecs.resize(0); - m_indices.clear(); - m_vecs.clear(); - } - - btReducedVector(int sz): m_sz(sz) - { - m_indices.resize(0); - m_vecs.resize(0); - m_indices.clear(); - m_vecs.clear(); - } - - btReducedVector(int sz, const btAlignedObjectArray& indices, const btAlignedObjectArray& vecs): m_sz(sz), m_indices(indices), m_vecs(vecs) - { - } - - void simplify() - { - btAlignedObjectArray old_indices(m_indices); - btAlignedObjectArray old_vecs(m_vecs); - m_indices.resize(0); - m_vecs.resize(0); - m_indices.clear(); - m_vecs.clear(); - for (int i = 0; i < old_indices.size(); ++i) - { - if (old_vecs[i].length2() > SIMD_EPSILON) - { - m_indices.push_back(old_indices[i]); - m_vecs.push_back(old_vecs[i]); - } - } - } - - btReducedVector operator+(const btReducedVector& other) - { - btReducedVector ret(m_sz); - int i=0, j=0; - while (i < m_indices.size() && j < other.m_indices.size()) - { - if (m_indices[i] < other.m_indices[j]) - { - ret.m_indices.push_back(m_indices[i]); - ret.m_vecs.push_back(m_vecs[i]); - ++i; - } - else if (m_indices[i] > other.m_indices[j]) - { - ret.m_indices.push_back(other.m_indices[j]); - ret.m_vecs.push_back(other.m_vecs[j]); - ++j; - } - else - { - ret.m_indices.push_back(other.m_indices[j]); - ret.m_vecs.push_back(m_vecs[i] + other.m_vecs[j]); - ++i; ++j; - } - } - while (i < m_indices.size()) - { - ret.m_indices.push_back(m_indices[i]); - ret.m_vecs.push_back(m_vecs[i]); - ++i; - } - while (j < other.m_indices.size()) - { - ret.m_indices.push_back(other.m_indices[j]); - ret.m_vecs.push_back(other.m_vecs[j]); - ++j; - } - ret.simplify(); - return ret; - } - - btReducedVector operator-() - { - btReducedVector ret(m_sz); - for (int i = 0; i < m_indices.size(); ++i) - { - ret.m_indices.push_back(m_indices[i]); - ret.m_vecs.push_back(-m_vecs[i]); - } - ret.simplify(); - return ret; - } - - btReducedVector operator-(const btReducedVector& other) - { - btReducedVector ret(m_sz); - int i=0, j=0; - while (i < m_indices.size() && j < other.m_indices.size()) - { - if (m_indices[i] < other.m_indices[j]) - { - ret.m_indices.push_back(m_indices[i]); - ret.m_vecs.push_back(m_vecs[i]); - ++i; - } - else if (m_indices[i] > other.m_indices[j]) - { - ret.m_indices.push_back(other.m_indices[j]); - ret.m_vecs.push_back(-other.m_vecs[j]); - ++j; - } - else - { - ret.m_indices.push_back(other.m_indices[j]); - ret.m_vecs.push_back(m_vecs[i] - other.m_vecs[j]); - ++i; ++j; - } - } - while (i < m_indices.size()) - { - ret.m_indices.push_back(m_indices[i]); - ret.m_vecs.push_back(m_vecs[i]); - ++i; - } - while (j < other.m_indices.size()) - { - ret.m_indices.push_back(other.m_indices[j]); - ret.m_vecs.push_back(-other.m_vecs[j]); - ++j; - } - ret.simplify(); - return ret; - } - - bool operator==(const btReducedVector& other) const - { - if (m_sz != other.m_sz) - return false; - if (m_indices.size() != other.m_indices.size()) - return false; - for (int i = 0; i < m_indices.size(); ++i) - { - if (m_indices[i] != other.m_indices[i] || m_vecs[i] != other.m_vecs[i]) - { - return false; - } - } - return true; - } - - bool operator!=(const btReducedVector& other) const - { - return !(*this == other); - } - - btReducedVector& operator=(const btReducedVector& other) - { - if (this == &other) - { - return *this; - } - m_sz = other.m_sz; - m_indices.copyFromArray(other.m_indices); - m_vecs.copyFromArray(other.m_vecs); - return *this; - } - - btScalar dot(const btReducedVector& other) const - { - btScalar ret = 0; - int j = 0; - for (int i = 0; i < m_indices.size(); ++i) - { - while (j < other.m_indices.size() && other.m_indices[j] < m_indices[i]) - { - ++j; - } - if (j < other.m_indices.size() && other.m_indices[j] == m_indices[i]) - { - ret += m_vecs[i].dot(other.m_vecs[j]); -// ++j; - } - } - return ret; - } - - btScalar dot(const btAlignedObjectArray& other) const - { - btScalar ret = 0; - for (int i = 0; i < m_indices.size(); ++i) - { - ret += m_vecs[i].dot(other[m_indices[i]]); - } - return ret; - } - - btScalar length2() const - { - return this->dot(*this); - } - - void normalize(); - - // returns the projection of this onto other - btReducedVector proj(const btReducedVector& other) const; - - bool testAdd() const; - - bool testMinus() const; - - bool testDot() const; - - bool testMultiply() const; - - void test() const; - - void print() const - { - for (int i = 0; i < m_indices.size(); ++i) - { - printf("%d: (%f, %f, %f)/", m_indices[i], m_vecs[i][0],m_vecs[i][1],m_vecs[i][2]); - } - printf("\n"); - } - - - void sort() - { - std::vector tuples; - for (int i = 0; i < m_indices.size(); ++i) - { - TwoInts ti; - ti.a = i; - ti.b = m_indices[i]; - tuples.push_back(ti); - } - std::sort(tuples.begin(), tuples.end()); - btAlignedObjectArray new_indices; - btAlignedObjectArray new_vecs; - for (size_t i = 0; i < tuples.size(); ++i) - { - new_indices.push_back(tuples[i].b); - new_vecs.push_back(m_vecs[tuples[i].a]); - } - m_indices = new_indices; - m_vecs = new_vecs; - } -}; - -SIMD_FORCE_INLINE btReducedVector operator*(const btReducedVector& v, btScalar s) -{ - btReducedVector ret(v.m_sz); - for (int i = 0; i < v.m_indices.size(); ++i) - { - ret.m_indices.push_back(v.m_indices[i]); - ret.m_vecs.push_back(s*v.m_vecs[i]); - } - ret.simplify(); - return ret; -} - -SIMD_FORCE_INLINE btReducedVector operator*(btScalar s, const btReducedVector& v) -{ - return v*s; -} - -SIMD_FORCE_INLINE btReducedVector operator/(const btReducedVector& v, btScalar s) -{ - return v * (1.0/s); -} - -SIMD_FORCE_INLINE btReducedVector& operator/=(btReducedVector& v, btScalar s) -{ - v = v/s; - return v; -} - -SIMD_FORCE_INLINE btReducedVector& operator+=(btReducedVector& v1, const btReducedVector& v2) -{ - v1 = v1+v2; - return v1; -} - -SIMD_FORCE_INLINE btReducedVector& operator-=(btReducedVector& v1, const btReducedVector& v2) -{ - v1 = v1-v2; - return v1; -} - -#endif /* btReducedVectors_h */ diff --git a/engine/inc/bullet/LinearMath/btScalar.h b/engine/inc/bullet/LinearMath/btScalar.h deleted file mode 100644 index 36b90cc9..00000000 --- a/engine/inc/bullet/LinearMath/btScalar.h +++ /dev/null @@ -1,832 +0,0 @@ -/* -Copyright (c) 2003-2009 Erwin Coumans http://bullet.googlecode.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 BT_SCALAR_H -#define BT_SCALAR_H - -#ifdef BT_MANAGED_CODE -//Aligned data types not supported in managed code -#pragma unmanaged -#endif - -#include -#include //size_t for MSVC 6.0 -#include - -/* SVN $Revision$ on $Date$ from http://bullet.googlecode.com*/ -#define BT_BULLET_VERSION 307 - -inline int btGetVersion() -{ - return BT_BULLET_VERSION; -} - -inline int btIsDoublePrecision() -{ - #ifdef BT_USE_DOUBLE_PRECISION - return true; - #else - return false; - #endif -} - - -// The following macro "BT_NOT_EMPTY_FILE" can be put into a file -// in order suppress the MS Visual C++ Linker warning 4221 -// -// warning LNK4221: no public symbols found; archive member will be inaccessible -// -// This warning occurs on PC and XBOX when a file compiles out completely -// has no externally visible symbols which may be dependant on configuration -// #defines and options. -// -// see more https://stackoverflow.com/questions/1822887/what-is-the-best-way-to-eliminate-ms-visual-c-linker-warning-warning-lnk422 - -#if defined(_MSC_VER) -#define BT_NOT_EMPTY_FILE_CAT_II(p, res) res -#define BT_NOT_EMPTY_FILE_CAT_I(a, b) BT_NOT_EMPTY_FILE_CAT_II(~, a##b) -#define BT_NOT_EMPTY_FILE_CAT(a, b) BT_NOT_EMPTY_FILE_CAT_I(a, b) -#define BT_NOT_EMPTY_FILE \ - namespace \ - { \ - char BT_NOT_EMPTY_FILE_CAT(NoEmptyFileDummy, __COUNTER__); \ - } -#else -#define BT_NOT_EMPTY_FILE -#endif - -// clang and most formatting tools don't support indentation of preprocessor guards, so turn it off -// clang-format off -#if defined(DEBUG) || defined (_DEBUG) - #define BT_DEBUG -#endif - -#ifdef _WIN32 - #if defined(__GNUC__) // it should handle both MINGW and CYGWIN - #define SIMD_FORCE_INLINE __inline__ __attribute__((always_inline)) - #define ATTRIBUTE_ALIGNED16(a) a __attribute__((aligned(16))) - #define ATTRIBUTE_ALIGNED64(a) a __attribute__((aligned(64))) - #define ATTRIBUTE_ALIGNED128(a) a __attribute__((aligned(128))) - #elif ( defined(_MSC_VER) && _MSC_VER < 1300 ) - #define SIMD_FORCE_INLINE inline - #define ATTRIBUTE_ALIGNED16(a) a - #define ATTRIBUTE_ALIGNED64(a) a - #define ATTRIBUTE_ALIGNED128(a) a - #elif defined(_M_ARM) - #define SIMD_FORCE_INLINE __forceinline - #define ATTRIBUTE_ALIGNED16(a) __declspec() a - #define ATTRIBUTE_ALIGNED64(a) __declspec() a - #define ATTRIBUTE_ALIGNED128(a) __declspec () a - #else//__MINGW32__ - //#define BT_HAS_ALIGNED_ALLOCATOR - #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 - - #define SIMD_FORCE_INLINE __forceinline - #define ATTRIBUTE_ALIGNED16(a) __declspec(align(16)) a - #define ATTRIBUTE_ALIGNED64(a) __declspec(align(64)) a - #define ATTRIBUTE_ALIGNED128(a) __declspec (align(128)) a - #ifdef _XBOX - #define BT_USE_VMX128 - - #include - #define BT_HAVE_NATIVE_FSEL - #define btFsel(a,b,c) __fsel((a),(b),(c)) - #else - -#if defined (_M_ARM) - //Do not turn SSE on for ARM (may want to turn on BT_USE_NEON however) -#elif (defined (_WIN32) && (_MSC_VER) && _MSC_VER >= 1400) && (!defined (BT_USE_DOUBLE_PRECISION)) - -#ifdef __clang__ -#define __BT_DISABLE_SSE__ -#endif -#ifndef __BT_DISABLE_SSE__ - #if _MSC_VER>1400 - #define BT_USE_SIMD_VECTOR3 - #endif - #define BT_USE_SSE -#endif//__BT_DISABLE_SSE__ - #ifdef BT_USE_SSE - -#if (_MSC_FULL_VER >= 170050727)//Visual Studio 2012 can compile SSE4/FMA3 (but SSE4/FMA3 is not enabled by default) - #define BT_ALLOW_SSE4 -#endif //(_MSC_FULL_VER >= 160040219) - - //BT_USE_SSE_IN_API is disabled under Windows by default, because - //it makes it harder to integrate Bullet into your application under Windows - //(structured embedding Bullet structs/classes need to be 16-byte aligned) - //with relatively little performance gain - //If you are not embedded Bullet data in your classes, or make sure that you align those classes on 16-byte boundaries - //you can manually enable this line or set it in the build system for a bit of performance gain (a few percent, dependent on usage) - //#define BT_USE_SSE_IN_API - #endif //BT_USE_SSE - #include -#endif - - #endif//_XBOX - - #endif //__MINGW32__ - - #ifdef BT_DEBUG - #ifdef _MSC_VER - #include - #define btAssert(x) { if(!(x)){printf("Assert " __FILE__ ":%u (%s)\n", __LINE__, #x);__debugbreak(); }} - #else//_MSC_VER - #include - #define btAssert assert - #endif//_MSC_VER - #else - #define btAssert(x) - #endif - //btFullAssert is optional, slows down a lot - #define btFullAssert(x) - - #define btLikely(_c) _c - #define btUnlikely(_c) _c - -#else//_WIN32 - - #if defined (__CELLOS_LV2__) - #define SIMD_FORCE_INLINE inline __attribute__((always_inline)) - #define ATTRIBUTE_ALIGNED16(a) a __attribute__ ((aligned (16))) - #define ATTRIBUTE_ALIGNED64(a) a __attribute__ ((aligned (64))) - #define ATTRIBUTE_ALIGNED128(a) a __attribute__ ((aligned (128))) - #ifndef assert - #include - #endif - #ifdef BT_DEBUG - #ifdef __SPU__ - #include - #define printf spu_printf - #define btAssert(x) {if(!(x)){printf("Assert " __FILE__ ":%u ("#x")\n", __LINE__);spu_hcmpeq(0,0);}} - #else - #define btAssert assert - #endif - - #else//BT_DEBUG - #define btAssert(x) - #endif//BT_DEBUG - //btFullAssert is optional, slows down a lot - #define btFullAssert(x) - - #define btLikely(_c) _c - #define btUnlikely(_c) _c - - #else//defined (__CELLOS_LV2__) - - #ifdef USE_LIBSPE2 - - #define SIMD_FORCE_INLINE __inline - #define ATTRIBUTE_ALIGNED16(a) a __attribute__ ((aligned (16))) - #define ATTRIBUTE_ALIGNED64(a) a __attribute__ ((aligned (64))) - #define ATTRIBUTE_ALIGNED128(a) a __attribute__ ((aligned (128))) - #ifndef assert - #include - #endif - #ifdef BT_DEBUG - #define btAssert assert - #else - #define btAssert(x) - #endif - //btFullAssert is optional, slows down a lot - #define btFullAssert(x) - - - #define btLikely(_c) __builtin_expect((_c), 1) - #define btUnlikely(_c) __builtin_expect((_c), 0) - - - #else//USE_LIBSPE2 - //non-windows systems - - #if (defined (__APPLE__) && (!defined (BT_USE_DOUBLE_PRECISION))) - #if defined (__i386__) || defined (__x86_64__) - #define BT_USE_SIMD_VECTOR3 - #define BT_USE_SSE - //BT_USE_SSE_IN_API is enabled on Mac OSX by default, because memory is automatically aligned on 16-byte boundaries - //if apps run into issues, we will disable the next line - #define BT_USE_SSE_IN_API - #ifdef BT_USE_SSE - // include appropriate SSE level - #if defined (__SSE4_1__) - #include - #elif defined (__SSSE3__) - #include - #elif defined (__SSE3__) - #include - #else - #include - #endif - #endif //BT_USE_SSE - #elif defined( __ARM_NEON__ ) - #ifdef __clang__ - #define BT_USE_NEON 1 - #define BT_USE_SIMD_VECTOR3 - - #if defined BT_USE_NEON && defined (__clang__) - #include - #endif//BT_USE_NEON - #endif //__clang__ - #endif//__arm__ - - #define SIMD_FORCE_INLINE inline __attribute__ ((always_inline)) - ///@todo: check out alignment methods for other platforms/compilers - #define ATTRIBUTE_ALIGNED16(a) a __attribute__ ((aligned (16))) - #define ATTRIBUTE_ALIGNED64(a) a __attribute__ ((aligned (64))) - #define ATTRIBUTE_ALIGNED128(a) a __attribute__ ((aligned (128))) - #ifndef assert - #include - #endif - - #if defined(DEBUG) || defined (_DEBUG) - #if defined (__i386__) || defined (__x86_64__) - #include - #define btAssert(x)\ - {\ - if(!(x))\ - {\ - printf("Assert %s in line %d, file %s\n",#x, __LINE__, __FILE__);\ - asm volatile ("int3");\ - }\ - } - #else//defined (__i386__) || defined (__x86_64__) - #define btAssert assert - #endif//defined (__i386__) || defined (__x86_64__) - #else//defined(DEBUG) || defined (_DEBUG) - #define btAssert(x) - #endif//defined(DEBUG) || defined (_DEBUG) - - //btFullAssert is optional, slows down a lot - #define btFullAssert(x) - #define btLikely(_c) _c - #define btUnlikely(_c) _c - - #else//__APPLE__ - - #define SIMD_FORCE_INLINE inline - ///@todo: check out alignment methods for other platforms/compilers - ///#define ATTRIBUTE_ALIGNED16(a) a __attribute__ ((aligned (16))) - ///#define ATTRIBUTE_ALIGNED64(a) a __attribute__ ((aligned (64))) - ///#define ATTRIBUTE_ALIGNED128(a) a __attribute__ ((aligned (128))) - #define ATTRIBUTE_ALIGNED16(a) a - #define ATTRIBUTE_ALIGNED64(a) a - #define ATTRIBUTE_ALIGNED128(a) a - #ifndef assert - #include - #endif - - #if defined(DEBUG) || defined (_DEBUG) - #define btAssert assert - #else - #define btAssert(x) - #endif - - //btFullAssert is optional, slows down a lot - #define btFullAssert(x) - #define btLikely(_c) _c - #define btUnlikely(_c) _c - #endif //__APPLE__ - #endif // LIBSPE2 - #endif //__CELLOS_LV2__ -#endif//_WIN32 - - -///The btScalar type abstracts floating point numbers, to easily switch between double and single floating point precision. -#if defined(BT_USE_DOUBLE_PRECISION) - typedef double btScalar; - //this number could be bigger in double precision - #define BT_LARGE_FLOAT 1e30 -#else - typedef float btScalar; - //keep BT_LARGE_FLOAT*BT_LARGE_FLOAT < FLT_MAX - #define BT_LARGE_FLOAT 1e18f -#endif - -#ifdef BT_USE_SSE - typedef __m128 btSimdFloat4; -#endif //BT_USE_SSE - -#if defined(BT_USE_SSE) - //#if defined BT_USE_SSE_IN_API && defined (BT_USE_SSE) - #ifdef _WIN32 - - #ifndef BT_NAN - static int btNanMask = 0x7F800001; - #define BT_NAN (*(float *)&btNanMask) - #endif - - #ifndef BT_INFINITY - static int btInfinityMask = 0x7F800000; - #define BT_INFINITY (*(float *)&btInfinityMask) - inline int btGetInfinityMask() //suppress stupid compiler warning - { - return btInfinityMask; - } - #endif - - - - //use this, in case there are clashes (such as xnamath.h) - #ifndef BT_NO_SIMD_OPERATOR_OVERLOADS - inline __m128 operator+(const __m128 A, const __m128 B) - { - return _mm_add_ps(A, B); - } - - inline __m128 operator-(const __m128 A, const __m128 B) - { - return _mm_sub_ps(A, B); - } - - inline __m128 operator*(const __m128 A, const __m128 B) - { - return _mm_mul_ps(A, B); - } - #endif //BT_NO_SIMD_OPERATOR_OVERLOADS - - #define btCastfTo128i(a) (_mm_castps_si128(a)) - #define btCastfTo128d(a) (_mm_castps_pd(a)) - #define btCastiTo128f(a) (_mm_castsi128_ps(a)) - #define btCastdTo128f(a) (_mm_castpd_ps(a)) - #define btCastdTo128i(a) (_mm_castpd_si128(a)) - #define btAssign128(r0, r1, r2, r3) _mm_setr_ps(r0, r1, r2, r3) - - #else //_WIN32 - - #define btCastfTo128i(a) ((__m128i)(a)) - #define btCastfTo128d(a) ((__m128d)(a)) - #define btCastiTo128f(a) ((__m128)(a)) - #define btCastdTo128f(a) ((__m128)(a)) - #define btCastdTo128i(a) ((__m128i)(a)) - #define btAssign128(r0, r1, r2, r3) \ - (__m128) { r0, r1, r2, r3 } - #define BT_INFINITY INFINITY - #define BT_NAN NAN - #endif //_WIN32 -#else//BT_USE_SSE - - #ifdef BT_USE_NEON - #include - - typedef float32x4_t btSimdFloat4; - #define BT_INFINITY INFINITY - #define BT_NAN NAN - #define btAssign128(r0, r1, r2, r3) \ - (float32x4_t) { r0, r1, r2, r3 } - #else //BT_USE_NEON - - #ifndef BT_INFINITY - struct btInfMaskConverter - { - union { - float mask; - int intmask; - }; - btInfMaskConverter(int _mask = 0x7F800000) - : intmask(_mask) - { - } - }; - static btInfMaskConverter btInfinityMask = 0x7F800000; - #define BT_INFINITY (btInfinityMask.mask) - inline int btGetInfinityMask() //suppress stupid compiler warning - { - return btInfinityMask.intmask; - } - #endif - #endif //BT_USE_NEON - -#endif //BT_USE_SSE - -#ifdef BT_USE_NEON - #include - - typedef float32x4_t btSimdFloat4; - #define BT_INFINITY INFINITY - #define BT_NAN NAN - #define btAssign128(r0, r1, r2, r3) \ - (float32x4_t) { r0, r1, r2, r3 } -#endif//BT_USE_NEON - -#define BT_DECLARE_ALIGNED_ALLOCATOR() \ - SIMD_FORCE_INLINE void *operator new(size_t sizeInBytes) { return btAlignedAlloc(sizeInBytes, 16); } \ - SIMD_FORCE_INLINE void operator delete(void *ptr) { btAlignedFree(ptr); } \ - SIMD_FORCE_INLINE void *operator new(size_t, void *ptr) { return ptr; } \ - SIMD_FORCE_INLINE void operator delete(void *, void *) {} \ - SIMD_FORCE_INLINE void *operator new[](size_t sizeInBytes) { return btAlignedAlloc(sizeInBytes, 16); } \ - SIMD_FORCE_INLINE void operator delete[](void *ptr) { btAlignedFree(ptr); } \ - SIMD_FORCE_INLINE void *operator new[](size_t, void *ptr) { return ptr; } \ - SIMD_FORCE_INLINE void operator delete[](void *, void *) {} - -#if defined(BT_USE_DOUBLE_PRECISION) || defined(BT_FORCE_DOUBLE_FUNCTIONS) - - SIMD_FORCE_INLINE btScalar btSqrt(btScalar x) - { - return sqrt(x); - } - SIMD_FORCE_INLINE btScalar btFabs(btScalar x) { return fabs(x); } - SIMD_FORCE_INLINE btScalar btCos(btScalar x) { return cos(x); } - SIMD_FORCE_INLINE btScalar btSin(btScalar x) { return sin(x); } - SIMD_FORCE_INLINE btScalar btTan(btScalar x) { return tan(x); } - SIMD_FORCE_INLINE btScalar btAcos(btScalar x) - { - if (x < btScalar(-1)) x = btScalar(-1); - if (x > btScalar(1)) x = btScalar(1); - return acos(x); - } - SIMD_FORCE_INLINE btScalar btAsin(btScalar x) - { - if (x < btScalar(-1)) x = btScalar(-1); - if (x > btScalar(1)) x = btScalar(1); - return asin(x); - } - SIMD_FORCE_INLINE btScalar btAtan(btScalar x) { return atan(x); } - SIMD_FORCE_INLINE btScalar btAtan2(btScalar x, btScalar y) { return atan2(x, y); } - SIMD_FORCE_INLINE btScalar btExp(btScalar x) { return exp(x); } - SIMD_FORCE_INLINE btScalar btLog(btScalar x) { return log(x); } - SIMD_FORCE_INLINE btScalar btPow(btScalar x, btScalar y) { return pow(x, y); } - SIMD_FORCE_INLINE btScalar btFmod(btScalar x, btScalar y) { return fmod(x, y); } - -#else//BT_USE_DOUBLE_PRECISION - - SIMD_FORCE_INLINE btScalar btSqrt(btScalar y) - { - #ifdef USE_APPROXIMATION - #ifdef __LP64__ - float xhalf = 0.5f * y; - int i = *(int *)&y; - i = 0x5f375a86 - (i >> 1); - y = *(float *)&i; - y = y * (1.5f - xhalf * y * y); - y = y * (1.5f - xhalf * y * y); - y = y * (1.5f - xhalf * y * y); - y = 1 / y; - return y; - #else - double x, z, tempf; - unsigned long *tfptr = ((unsigned long *)&tempf) + 1; - tempf = y; - *tfptr = (0xbfcdd90a - *tfptr) >> 1; /* estimate of 1/sqrt(y) */ - x = tempf; - z = y * btScalar(0.5); - x = (btScalar(1.5) * x) - (x * x) * (x * z); /* iteration formula */ - x = (btScalar(1.5) * x) - (x * x) * (x * z); - x = (btScalar(1.5) * x) - (x * x) * (x * z); - x = (btScalar(1.5) * x) - (x * x) * (x * z); - x = (btScalar(1.5) * x) - (x * x) * (x * z); - return x * y; - #endif - #else - return sqrtf(y); - #endif - } - SIMD_FORCE_INLINE btScalar btFabs(btScalar x) { return fabsf(x); } - SIMD_FORCE_INLINE btScalar btCos(btScalar x) { return cosf(x); } - SIMD_FORCE_INLINE btScalar btSin(btScalar x) { return sinf(x); } - SIMD_FORCE_INLINE btScalar btTan(btScalar x) { return tanf(x); } - SIMD_FORCE_INLINE btScalar btAcos(btScalar x) - { - if (x < btScalar(-1)) - x = btScalar(-1); - if (x > btScalar(1)) - x = btScalar(1); - return acosf(x); - } - SIMD_FORCE_INLINE btScalar btAsin(btScalar x) - { - if (x < btScalar(-1)) - x = btScalar(-1); - if (x > btScalar(1)) - x = btScalar(1); - return asinf(x); - } - SIMD_FORCE_INLINE btScalar btAtan(btScalar x) { return atanf(x); } - SIMD_FORCE_INLINE btScalar btAtan2(btScalar x, btScalar y) { return atan2f(x, y); } - SIMD_FORCE_INLINE btScalar btExp(btScalar x) { return expf(x); } - SIMD_FORCE_INLINE btScalar btLog(btScalar x) { return logf(x); } - SIMD_FORCE_INLINE btScalar btPow(btScalar x, btScalar y) { return powf(x, y); } - SIMD_FORCE_INLINE btScalar btFmod(btScalar x, btScalar y) { return fmodf(x, y); } - -#endif//BT_USE_DOUBLE_PRECISION - -#define SIMD_PI btScalar(3.1415926535897932384626433832795029) -#define SIMD_2_PI (btScalar(2.0) * SIMD_PI) -#define SIMD_HALF_PI (SIMD_PI * btScalar(0.5)) -#define SIMD_RADS_PER_DEG (SIMD_2_PI / btScalar(360.0)) -#define SIMD_DEGS_PER_RAD (btScalar(360.0) / SIMD_2_PI) -#define SIMDSQRT12 btScalar(0.7071067811865475244008443621048490) -#define btRecipSqrt(x) ((btScalar)(btScalar(1.0) / btSqrt(btScalar(x)))) /* reciprocal square root */ -#define btRecip(x) (btScalar(1.0) / btScalar(x)) - -#ifdef BT_USE_DOUBLE_PRECISION - #define SIMD_EPSILON DBL_EPSILON - #define SIMD_INFINITY DBL_MAX - #define BT_ONE 1.0 - #define BT_ZERO 0.0 - #define BT_TWO 2.0 - #define BT_HALF 0.5 -#else - #define SIMD_EPSILON FLT_EPSILON - #define SIMD_INFINITY FLT_MAX - #define BT_ONE 1.0f - #define BT_ZERO 0.0f - #define BT_TWO 2.0f - #define BT_HALF 0.5f -#endif - -// clang-format on - -SIMD_FORCE_INLINE btScalar btAtan2Fast(btScalar y, btScalar x) -{ - btScalar coeff_1 = SIMD_PI / 4.0f; - btScalar coeff_2 = 3.0f * coeff_1; - btScalar abs_y = btFabs(y); - btScalar angle; - if (x >= 0.0f) - { - btScalar r = (x - abs_y) / (x + abs_y); - angle = coeff_1 - coeff_1 * r; - } - else - { - btScalar r = (x + abs_y) / (abs_y - x); - angle = coeff_2 - coeff_1 * r; - } - return (y < 0.0f) ? -angle : angle; -} - -SIMD_FORCE_INLINE bool btFuzzyZero(btScalar x) { return btFabs(x) < SIMD_EPSILON; } - -SIMD_FORCE_INLINE bool btEqual(btScalar a, btScalar eps) -{ - return (((a) <= eps) && !((a) < -eps)); -} -SIMD_FORCE_INLINE bool btGreaterEqual(btScalar a, btScalar eps) -{ - return (!((a) <= eps)); -} - -SIMD_FORCE_INLINE int btIsNegative(btScalar x) -{ - return x < btScalar(0.0) ? 1 : 0; -} - -SIMD_FORCE_INLINE btScalar btRadians(btScalar x) { return x * SIMD_RADS_PER_DEG; } -SIMD_FORCE_INLINE btScalar btDegrees(btScalar x) { return x * SIMD_DEGS_PER_RAD; } - -#define BT_DECLARE_HANDLE(name) \ - typedef struct name##__ \ - { \ - int unused; \ - } * name - -#ifndef btFsel -SIMD_FORCE_INLINE btScalar btFsel(btScalar a, btScalar b, btScalar c) -{ - return a >= 0 ? b : c; -} -#endif -#define btFsels(a, b, c) (btScalar) btFsel(a, b, c) - -SIMD_FORCE_INLINE bool btMachineIsLittleEndian() -{ - long int i = 1; - const char *p = (const char *)&i; - if (p[0] == 1) // Lowest address contains the least significant byte - return true; - else - return false; -} - -///btSelect avoids branches, which makes performance much better for consoles like Playstation 3 and XBox 360 -///Thanks Phil Knight. See also http://www.cellperformance.com/articles/2006/04/more_techniques_for_eliminatin_1.html -SIMD_FORCE_INLINE unsigned btSelect(unsigned condition, unsigned valueIfConditionNonZero, unsigned valueIfConditionZero) -{ - // Set testNz to 0xFFFFFFFF if condition is nonzero, 0x00000000 if condition is zero - // Rely on positive value or'ed with its negative having sign bit on - // and zero value or'ed with its negative (which is still zero) having sign bit off - // Use arithmetic shift right, shifting the sign bit through all 32 bits - unsigned testNz = (unsigned)(((int)condition | -(int)condition) >> 31); - unsigned testEqz = ~testNz; - return ((valueIfConditionNonZero & testNz) | (valueIfConditionZero & testEqz)); -} -SIMD_FORCE_INLINE int btSelect(unsigned condition, int valueIfConditionNonZero, int valueIfConditionZero) -{ - unsigned testNz = (unsigned)(((int)condition | -(int)condition) >> 31); - unsigned testEqz = ~testNz; - return static_cast((valueIfConditionNonZero & testNz) | (valueIfConditionZero & testEqz)); -} -SIMD_FORCE_INLINE float btSelect(unsigned condition, float valueIfConditionNonZero, float valueIfConditionZero) -{ -#ifdef BT_HAVE_NATIVE_FSEL - return (float)btFsel((btScalar)condition - btScalar(1.0f), valueIfConditionNonZero, valueIfConditionZero); -#else - return (condition != 0) ? valueIfConditionNonZero : valueIfConditionZero; -#endif -} - -template -SIMD_FORCE_INLINE void btSwap(T &a, T &b) -{ - T tmp = a; - a = b; - b = tmp; -} - -//PCK: endian swapping functions -SIMD_FORCE_INLINE unsigned btSwapEndian(unsigned val) -{ - return (((val & 0xff000000) >> 24) | ((val & 0x00ff0000) >> 8) | ((val & 0x0000ff00) << 8) | ((val & 0x000000ff) << 24)); -} - -SIMD_FORCE_INLINE unsigned short btSwapEndian(unsigned short val) -{ - return static_cast(((val & 0xff00) >> 8) | ((val & 0x00ff) << 8)); -} - -SIMD_FORCE_INLINE unsigned btSwapEndian(int val) -{ - return btSwapEndian((unsigned)val); -} - -SIMD_FORCE_INLINE unsigned short btSwapEndian(short val) -{ - return btSwapEndian((unsigned short)val); -} - -///btSwapFloat uses using char pointers to swap the endianness -////btSwapFloat/btSwapDouble will NOT return a float, because the machine might 'correct' invalid floating point values -///Not all values of sign/exponent/mantissa are valid floating point numbers according to IEEE 754. -///When a floating point unit is faced with an invalid value, it may actually change the value, or worse, throw an exception. -///In most systems, running user mode code, you wouldn't get an exception, but instead the hardware/os/runtime will 'fix' the number for you. -///so instead of returning a float/double, we return integer/long long integer -SIMD_FORCE_INLINE unsigned int btSwapEndianFloat(float d) -{ - unsigned int a = 0; - unsigned char *dst = (unsigned char *)&a; - unsigned char *src = (unsigned char *)&d; - - dst[0] = src[3]; - dst[1] = src[2]; - dst[2] = src[1]; - dst[3] = src[0]; - return a; -} - -// unswap using char pointers -SIMD_FORCE_INLINE float btUnswapEndianFloat(unsigned int a) -{ - float d = 0.0f; - unsigned char *src = (unsigned char *)&a; - unsigned char *dst = (unsigned char *)&d; - - dst[0] = src[3]; - dst[1] = src[2]; - dst[2] = src[1]; - dst[3] = src[0]; - - return d; -} - -// swap using char pointers -SIMD_FORCE_INLINE void btSwapEndianDouble(double d, unsigned char *dst) -{ - unsigned char *src = (unsigned char *)&d; - - dst[0] = src[7]; - dst[1] = src[6]; - dst[2] = src[5]; - dst[3] = src[4]; - dst[4] = src[3]; - dst[5] = src[2]; - dst[6] = src[1]; - dst[7] = src[0]; -} - -// unswap using char pointers -SIMD_FORCE_INLINE double btUnswapEndianDouble(const unsigned char *src) -{ - double d = 0.0; - unsigned char *dst = (unsigned char *)&d; - - dst[0] = src[7]; - dst[1] = src[6]; - dst[2] = src[5]; - dst[3] = src[4]; - dst[4] = src[3]; - dst[5] = src[2]; - dst[6] = src[1]; - dst[7] = src[0]; - - return d; -} - -template -SIMD_FORCE_INLINE void btSetZero(T *a, int n) -{ - T *acurr = a; - size_t ncurr = n; - while (ncurr > 0) - { - *(acurr++) = 0; - --ncurr; - } -} - -SIMD_FORCE_INLINE btScalar btLargeDot(const btScalar *a, const btScalar *b, int n) -{ - btScalar p0, q0, m0, p1, q1, m1, sum; - sum = 0; - n -= 2; - while (n >= 0) - { - p0 = a[0]; - q0 = b[0]; - m0 = p0 * q0; - p1 = a[1]; - q1 = b[1]; - m1 = p1 * q1; - sum += m0; - sum += m1; - a += 2; - b += 2; - n -= 2; - } - n += 2; - while (n > 0) - { - sum += (*a) * (*b); - a++; - b++; - n--; - } - return sum; -} - -// returns normalized value in range [-SIMD_PI, SIMD_PI] -SIMD_FORCE_INLINE btScalar btNormalizeAngle(btScalar angleInRadians) -{ - angleInRadians = btFmod(angleInRadians, SIMD_2_PI); - if (angleInRadians < -SIMD_PI) - { - return angleInRadians + SIMD_2_PI; - } - else if (angleInRadians > SIMD_PI) - { - return angleInRadians - SIMD_2_PI; - } - else - { - return angleInRadians; - } -} - -///rudimentary class to provide type info -struct btTypedObject -{ - btTypedObject(int objectType) - : m_objectType(objectType) - { - } - int m_objectType; - inline int getObjectType() const - { - return m_objectType; - } -}; - -///align a pointer to the provided alignment, upwards -template -T *btAlignPointer(T *unalignedPtr, size_t alignment) -{ - struct btConvertPointerSizeT - { - union { - T *ptr; - size_t integer; - }; - }; - btConvertPointerSizeT converter; - - const size_t bit_mask = ~(alignment - 1); - converter.ptr = unalignedPtr; - converter.integer += alignment - 1; - converter.integer &= bit_mask; - return converter.ptr; -} - -#endif //BT_SCALAR_H diff --git a/engine/inc/bullet/LinearMath/btSerializer.h b/engine/inc/bullet/LinearMath/btSerializer.h deleted file mode 100644 index 9abcf031..00000000 --- a/engine/inc/bullet/LinearMath/btSerializer.h +++ /dev/null @@ -1,869 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org - -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_SERIALIZER_H -#define BT_SERIALIZER_H - -#include "btScalar.h" // has definitions like SIMD_FORCE_INLINE -#include "btHashMap.h" - -#if !defined(__CELLOS_LV2__) && !defined(__MWERKS__) -#include -#endif -#include - -extern char sBulletDNAstr[]; -extern int sBulletDNAlen; -extern char sBulletDNAstr64[]; -extern int sBulletDNAlen64; - -SIMD_FORCE_INLINE int btStrLen(const char* str) -{ - if (!str) - return (0); - int len = 0; - - while (*str != 0) - { - str++; - len++; - } - - return len; -} - -class btChunk -{ -public: - int m_chunkCode; - int m_length; - void* m_oldPtr; - int m_dna_nr; - int m_number; -}; - -enum btSerializationFlags -{ - BT_SERIALIZE_NO_BVH = 1, - BT_SERIALIZE_NO_TRIANGLEINFOMAP = 2, - BT_SERIALIZE_NO_DUPLICATE_ASSERT = 4, - BT_SERIALIZE_CONTACT_MANIFOLDS = 8, -}; - -class btSerializer -{ -public: - virtual ~btSerializer() {} - - virtual const unsigned char* getBufferPointer() const = 0; - - virtual int getCurrentBufferSize() const = 0; - - virtual btChunk* allocate(size_t size, int numElements) = 0; - - virtual void finalizeChunk(btChunk* chunk, const char* structType, int chunkCode, void* oldPtr) = 0; - - virtual void* findPointer(void* oldPtr) = 0; - - virtual void* getUniquePointer(void* oldPtr) = 0; - - virtual void startSerialization() = 0; - - virtual void finishSerialization() = 0; - - virtual const char* findNameForPointer(const void* ptr) const = 0; - - virtual void registerNameForPointer(const void* ptr, const char* name) = 0; - - virtual void serializeName(const char* ptr) = 0; - - virtual int getSerializationFlags() const = 0; - - virtual void setSerializationFlags(int flags) = 0; - - virtual int getNumChunks() const = 0; - - virtual const btChunk* getChunk(int chunkIndex) const = 0; -}; - -#define BT_HEADER_LENGTH 12 -#if defined(__sgi) || defined(__sparc) || defined(__sparc__) || defined(__PPC__) || defined(__ppc__) || defined(__BIG_ENDIAN__) -#define BT_MAKE_ID(a, b, c, d) ((int)(a) << 24 | (int)(b) << 16 | (c) << 8 | (d)) -#else -#define BT_MAKE_ID(a, b, c, d) ((int)(d) << 24 | (int)(c) << 16 | (b) << 8 | (a)) -#endif - -#define BT_MULTIBODY_CODE BT_MAKE_ID('M', 'B', 'D', 'Y') -#define BT_MB_LINKCOLLIDER_CODE BT_MAKE_ID('M', 'B', 'L', 'C') -#define BT_SOFTBODY_CODE BT_MAKE_ID('S', 'B', 'D', 'Y') -#define BT_COLLISIONOBJECT_CODE BT_MAKE_ID('C', 'O', 'B', 'J') -#define BT_RIGIDBODY_CODE BT_MAKE_ID('R', 'B', 'D', 'Y') -#define BT_CONSTRAINT_CODE BT_MAKE_ID('C', 'O', 'N', 'S') -#define BT_BOXSHAPE_CODE BT_MAKE_ID('B', 'O', 'X', 'S') -#define BT_QUANTIZED_BVH_CODE BT_MAKE_ID('Q', 'B', 'V', 'H') -#define BT_TRIANLGE_INFO_MAP BT_MAKE_ID('T', 'M', 'A', 'P') -#define BT_SHAPE_CODE BT_MAKE_ID('S', 'H', 'A', 'P') -#define BT_ARRAY_CODE BT_MAKE_ID('A', 'R', 'A', 'Y') -#define BT_SBMATERIAL_CODE BT_MAKE_ID('S', 'B', 'M', 'T') -#define BT_SBNODE_CODE BT_MAKE_ID('S', 'B', 'N', 'D') -#define BT_DYNAMICSWORLD_CODE BT_MAKE_ID('D', 'W', 'L', 'D') -#define BT_CONTACTMANIFOLD_CODE BT_MAKE_ID('C', 'O', 'N', 'T') -#define BT_DNA_CODE BT_MAKE_ID('D', 'N', 'A', '1') - -struct btPointerUid -{ - union { - void* m_ptr; - int m_uniqueIds[2]; - }; -}; - -struct btBulletSerializedArrays -{ - btBulletSerializedArrays() - { - } - btAlignedObjectArray m_bvhsDouble; - btAlignedObjectArray m_bvhsFloat; - btAlignedObjectArray m_colShapeData; - btAlignedObjectArray m_dynamicWorldInfoDataDouble; - btAlignedObjectArray m_dynamicWorldInfoDataFloat; - btAlignedObjectArray m_rigidBodyDataDouble; - btAlignedObjectArray m_rigidBodyDataFloat; - btAlignedObjectArray m_collisionObjectDataDouble; - btAlignedObjectArray m_collisionObjectDataFloat; - btAlignedObjectArray m_constraintDataFloat; - btAlignedObjectArray m_constraintDataDouble; - btAlignedObjectArray m_constraintData; //for backwards compatibility - btAlignedObjectArray m_softBodyFloatData; - btAlignedObjectArray m_softBodyDoubleData; -}; - -///The btDefaultSerializer is the main Bullet serialization class. -///The constructor takes an optional argument for backwards compatibility, it is recommended to leave this empty/zero. -class btDefaultSerializer : public btSerializer -{ -protected: - btAlignedObjectArray mTypes; - btAlignedObjectArray mStructs; - btAlignedObjectArray mTlens; - btHashMap mStructReverse; - btHashMap mTypeLookup; - - btHashMap m_chunkP; - - btHashMap m_nameMap; - - btHashMap m_uniquePointers; - int m_uniqueIdGenerator; - - int m_totalSize; - unsigned char* m_buffer; - bool m_ownsBuffer; - int m_currentSize; - void* m_dna; - int m_dnaLength; - - int m_serializationFlags; - - btAlignedObjectArray m_chunkPtrs; - -protected: - virtual void* findPointer(void* oldPtr) - { - void** ptr = m_chunkP.find(oldPtr); - if (ptr && *ptr) - return *ptr; - return 0; - } - - virtual void writeDNA() - { - btChunk* dnaChunk = allocate(m_dnaLength, 1); - memcpy(dnaChunk->m_oldPtr, m_dna, m_dnaLength); - finalizeChunk(dnaChunk, "DNA1", BT_DNA_CODE, m_dna); - } - - int getReverseType(const char* type) const - { - btHashString key(type); - const int* valuePtr = mTypeLookup.find(key); - if (valuePtr) - return *valuePtr; - - return -1; - } - - void initDNA(const char* bdnaOrg, int dnalen) - { - ///was already initialized - if (m_dna) - return; - - int littleEndian = 1; - littleEndian = ((char*)&littleEndian)[0]; - - m_dna = btAlignedAlloc(dnalen, 16); - memcpy(m_dna, bdnaOrg, dnalen); - m_dnaLength = dnalen; - - int* intPtr = 0; - short* shtPtr = 0; - char* cp = 0; - int dataLen = 0; - intPtr = (int*)m_dna; - - /* - SDNA (4 bytes) (magic number) - NAME (4 bytes) - (4 bytes) amount of names (int) - - - */ - - if (strncmp((const char*)m_dna, "SDNA", 4) == 0) - { - // skip ++ NAME - intPtr++; - intPtr++; - } - - // Parse names - if (!littleEndian) - *intPtr = btSwapEndian(*intPtr); - - dataLen = *intPtr; - - intPtr++; - - cp = (char*)intPtr; - int i; - for (i = 0; i < dataLen; i++) - { - while (*cp) cp++; - cp++; - } - cp = btAlignPointer(cp, 4); - - /* - TYPE (4 bytes) - amount of types (int) - - - */ - - intPtr = (int*)cp; - btAssert(strncmp(cp, "TYPE", 4) == 0); - intPtr++; - - if (!littleEndian) - *intPtr = btSwapEndian(*intPtr); - - dataLen = *intPtr; - intPtr++; - - cp = (char*)intPtr; - for (i = 0; i < dataLen; i++) - { - mTypes.push_back(cp); - while (*cp) cp++; - cp++; - } - - cp = btAlignPointer(cp, 4); - - /* - TLEN (4 bytes) - (short) the lengths of types - - */ - - // Parse type lens - intPtr = (int*)cp; - btAssert(strncmp(cp, "TLEN", 4) == 0); - intPtr++; - - dataLen = (int)mTypes.size(); - - shtPtr = (short*)intPtr; - for (i = 0; i < dataLen; i++, shtPtr++) - { - if (!littleEndian) - shtPtr[0] = btSwapEndian(shtPtr[0]); - mTlens.push_back(shtPtr[0]); - } - - if (dataLen & 1) shtPtr++; - - /* - STRC (4 bytes) - amount of structs (int) - - - - - - - */ - - intPtr = (int*)shtPtr; - cp = (char*)intPtr; - btAssert(strncmp(cp, "STRC", 4) == 0); - intPtr++; - - if (!littleEndian) - *intPtr = btSwapEndian(*intPtr); - dataLen = *intPtr; - intPtr++; - - shtPtr = (short*)intPtr; - for (i = 0; i < dataLen; i++) - { - mStructs.push_back(shtPtr); - - if (!littleEndian) - { - shtPtr[0] = btSwapEndian(shtPtr[0]); - shtPtr[1] = btSwapEndian(shtPtr[1]); - - int len = shtPtr[1]; - shtPtr += 2; - - for (int a = 0; a < len; a++, shtPtr += 2) - { - shtPtr[0] = btSwapEndian(shtPtr[0]); - shtPtr[1] = btSwapEndian(shtPtr[1]); - } - } - else - { - shtPtr += (2 * shtPtr[1]) + 2; - } - } - - // build reverse lookups - for (i = 0; i < (int)mStructs.size(); i++) - { - short* strc = mStructs.at(i); - mStructReverse.insert(strc[0], i); - mTypeLookup.insert(btHashString(mTypes[strc[0]]), i); - } - } - -public: - btHashMap m_skipPointers; - - btDefaultSerializer(int totalSize = 0, unsigned char* buffer = 0) - : m_uniqueIdGenerator(0), - m_totalSize(totalSize), - m_currentSize(0), - m_dna(0), - m_dnaLength(0), - m_serializationFlags(0) - { - if (buffer == 0) - { - m_buffer = m_totalSize ? (unsigned char*)btAlignedAlloc(totalSize, 16) : 0; - m_ownsBuffer = true; - } - else - { - m_buffer = buffer; - m_ownsBuffer = false; - } - - const bool VOID_IS_8 = ((sizeof(void*) == 8)); - -#ifdef BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES - if (VOID_IS_8) - { -#if _WIN64 - initDNA((const char*)sBulletDNAstr64, sBulletDNAlen64); -#else - btAssert(0); -#endif - } - else - { -#ifndef _WIN64 - initDNA((const char*)sBulletDNAstr, sBulletDNAlen); -#else - btAssert(0); -#endif - } - -#else //BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES - if (VOID_IS_8) - { - initDNA((const char*)sBulletDNAstr64, sBulletDNAlen64); - } - else - { - initDNA((const char*)sBulletDNAstr, sBulletDNAlen); - } -#endif //BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES - } - - virtual ~btDefaultSerializer() - { - if (m_buffer && m_ownsBuffer) - btAlignedFree(m_buffer); - if (m_dna) - btAlignedFree(m_dna); - } - - static int getMemoryDnaSizeInBytes() - { - const bool VOID_IS_8 = ((sizeof(void*) == 8)); - - if (VOID_IS_8) - { - return sBulletDNAlen64; - } - return sBulletDNAlen; - } - static const char* getMemoryDna() - { - const bool VOID_IS_8 = ((sizeof(void*) == 8)); - if (VOID_IS_8) - { - return (const char*)sBulletDNAstr64; - } - return (const char*)sBulletDNAstr; - } - - void insertHeader() - { - writeHeader(m_buffer); - m_currentSize += BT_HEADER_LENGTH; - } - - void writeHeader(unsigned char* buffer) const - { -#ifdef BT_USE_DOUBLE_PRECISION - memcpy(buffer, "BULLETd", 7); -#else - memcpy(buffer, "BULLETf", 7); -#endif //BT_USE_DOUBLE_PRECISION - - int littleEndian = 1; - littleEndian = ((char*)&littleEndian)[0]; - - if (sizeof(void*) == 8) - { - buffer[7] = '-'; - } - else - { - buffer[7] = '_'; - } - - if (littleEndian) - { - buffer[8] = 'v'; - } - else - { - buffer[8] = 'V'; - } - - buffer[9] = '3'; - buffer[10] = '0'; - buffer[11] = '7'; - } - - virtual void startSerialization() - { - m_uniqueIdGenerator = 1; - if (m_totalSize) - { - unsigned char* buffer = internalAlloc(BT_HEADER_LENGTH); - writeHeader(buffer); - } - } - - virtual void finishSerialization() - { - writeDNA(); - - //if we didn't pre-allocate a buffer, we need to create a contiguous buffer now - int mysize = 0; - if (!m_totalSize) - { - if (m_buffer) - btAlignedFree(m_buffer); - - m_currentSize += BT_HEADER_LENGTH; - m_buffer = (unsigned char*)btAlignedAlloc(m_currentSize, 16); - - unsigned char* currentPtr = m_buffer; - writeHeader(m_buffer); - currentPtr += BT_HEADER_LENGTH; - mysize += BT_HEADER_LENGTH; - for (int i = 0; i < m_chunkPtrs.size(); i++) - { - int curLength = sizeof(btChunk) + m_chunkPtrs[i]->m_length; - memcpy(currentPtr, m_chunkPtrs[i], curLength); - btAlignedFree(m_chunkPtrs[i]); - currentPtr += curLength; - mysize += curLength; - } - } - - mTypes.clear(); - mStructs.clear(); - mTlens.clear(); - mStructReverse.clear(); - mTypeLookup.clear(); - m_skipPointers.clear(); - m_chunkP.clear(); - m_nameMap.clear(); - m_uniquePointers.clear(); - m_chunkPtrs.clear(); - } - - virtual void* getUniquePointer(void* oldPtr) - { - btAssert(m_uniqueIdGenerator >= 0); - if (!oldPtr) - return 0; - - btPointerUid* uptr = (btPointerUid*)m_uniquePointers.find(oldPtr); - if (uptr) - { - return uptr->m_ptr; - } - - void** ptr2 = m_skipPointers[oldPtr]; - if (ptr2) - { - return 0; - } - - m_uniqueIdGenerator++; - - btPointerUid uid; - uid.m_uniqueIds[0] = m_uniqueIdGenerator; - uid.m_uniqueIds[1] = m_uniqueIdGenerator; - m_uniquePointers.insert(oldPtr, uid); - return uid.m_ptr; - } - - virtual const unsigned char* getBufferPointer() const - { - return m_buffer; - } - - virtual int getCurrentBufferSize() const - { - return m_currentSize; - } - - virtual void finalizeChunk(btChunk* chunk, const char* structType, int chunkCode, void* oldPtr) - { - if (!(m_serializationFlags & BT_SERIALIZE_NO_DUPLICATE_ASSERT)) - { - btAssert(!findPointer(oldPtr)); - } - - chunk->m_dna_nr = getReverseType(structType); - - chunk->m_chunkCode = chunkCode; - - void* uniquePtr = getUniquePointer(oldPtr); - - m_chunkP.insert(oldPtr, uniquePtr); //chunk->m_oldPtr); - chunk->m_oldPtr = uniquePtr; //oldPtr; - } - - virtual unsigned char* internalAlloc(size_t size) - { - unsigned char* ptr = 0; - - if (m_totalSize) - { - ptr = m_buffer + m_currentSize; - m_currentSize += int(size); - btAssert(m_currentSize < m_totalSize); - } - else - { - ptr = (unsigned char*)btAlignedAlloc(size, 16); - m_currentSize += int(size); - } - return ptr; - } - - virtual btChunk* allocate(size_t size, int numElements) - { - unsigned char* ptr = internalAlloc(int(size) * numElements + sizeof(btChunk)); - - unsigned char* data = ptr + sizeof(btChunk); - - btChunk* chunk = (btChunk*)ptr; - chunk->m_chunkCode = 0; - chunk->m_oldPtr = data; - chunk->m_length = int(size) * numElements; - chunk->m_number = numElements; - - m_chunkPtrs.push_back(chunk); - - return chunk; - } - - virtual const char* findNameForPointer(const void* ptr) const - { - const char* const* namePtr = m_nameMap.find(ptr); - if (namePtr && *namePtr) - return *namePtr; - return 0; - } - - virtual void registerNameForPointer(const void* ptr, const char* name) - { - m_nameMap.insert(ptr, name); - } - - virtual void serializeName(const char* name) - { - if (name) - { - //don't serialize name twice - if (findPointer((void*)name)) - return; - - int len = btStrLen(name); - if (len) - { - int newLen = len + 1; - int padding = ((newLen + 3) & ~3) - newLen; - newLen += padding; - - //serialize name string now - btChunk* chunk = allocate(sizeof(char), newLen); - char* destinationName = (char*)chunk->m_oldPtr; - for (int i = 0; i < len; i++) - { - destinationName[i] = name[i]; - } - destinationName[len] = 0; - finalizeChunk(chunk, "char", BT_ARRAY_CODE, (void*)name); - } - } - } - - virtual int getSerializationFlags() const - { - return m_serializationFlags; - } - - virtual void setSerializationFlags(int flags) - { - m_serializationFlags = flags; - } - int getNumChunks() const - { - return m_chunkPtrs.size(); - } - - const btChunk* getChunk(int chunkIndex) const - { - return m_chunkPtrs[chunkIndex]; - } -}; - -///In general it is best to use btDefaultSerializer, -///in particular when writing the data to disk or sending it over the network. -///The btInMemorySerializer is experimental and only suitable in a few cases. -///The btInMemorySerializer takes a shortcut and can be useful to create a deep-copy -///of objects. There will be a demo on how to use the btInMemorySerializer. -#ifdef ENABLE_INMEMORY_SERIALIZER - -struct btInMemorySerializer : public btDefaultSerializer -{ - btHashMap m_uid2ChunkPtr; - btHashMap m_orgPtr2UniqueDataPtr; - btHashMap m_names2Ptr; - - btBulletSerializedArrays m_arrays; - - btInMemorySerializer(int totalSize = 0, unsigned char* buffer = 0) - : btDefaultSerializer(totalSize, buffer) - { - } - - virtual void startSerialization() - { - m_uid2ChunkPtr.clear(); - //todo: m_arrays.clear(); - btDefaultSerializer::startSerialization(); - } - - btChunk* findChunkFromUniquePointer(void* uniquePointer) - { - btChunk** chkPtr = m_uid2ChunkPtr[uniquePointer]; - if (chkPtr) - { - return *chkPtr; - } - return 0; - } - - virtual void registerNameForPointer(const void* ptr, const char* name) - { - btDefaultSerializer::registerNameForPointer(ptr, name); - m_names2Ptr.insert(name, ptr); - } - - virtual void finishSerialization() - { - } - - virtual void* getUniquePointer(void* oldPtr) - { - if (oldPtr == 0) - return 0; - - // void* uniquePtr = getUniquePointer(oldPtr); - btChunk* chunk = findChunkFromUniquePointer(oldPtr); - if (chunk) - { - return chunk->m_oldPtr; - } - else - { - const char* n = (const char*)oldPtr; - const void** ptr = m_names2Ptr[n]; - if (ptr) - { - return oldPtr; - } - else - { - void** ptr2 = m_skipPointers[oldPtr]; - if (ptr2) - { - return 0; - } - else - { - //If this assert hit, serialization happened in the wrong order - // 'getUniquePointer' - btAssert(0); - } - } - return 0; - } - return oldPtr; - } - - virtual void finalizeChunk(btChunk* chunk, const char* structType, int chunkCode, void* oldPtr) - { - if (!(m_serializationFlags & BT_SERIALIZE_NO_DUPLICATE_ASSERT)) - { - btAssert(!findPointer(oldPtr)); - } - - chunk->m_dna_nr = getReverseType(structType); - chunk->m_chunkCode = chunkCode; - //void* uniquePtr = getUniquePointer(oldPtr); - m_chunkP.insert(oldPtr, oldPtr); //chunk->m_oldPtr); - // chunk->m_oldPtr = uniquePtr;//oldPtr; - - void* uid = findPointer(oldPtr); - m_uid2ChunkPtr.insert(uid, chunk); - - switch (chunk->m_chunkCode) - { - case BT_SOFTBODY_CODE: - { -#ifdef BT_USE_DOUBLE_PRECISION - m_arrays.m_softBodyDoubleData.push_back((btSoftBodyDoubleData*)chunk->m_oldPtr); -#else - m_arrays.m_softBodyFloatData.push_back((btSoftBodyFloatData*)chunk->m_oldPtr); -#endif - break; - } - case BT_COLLISIONOBJECT_CODE: - { -#ifdef BT_USE_DOUBLE_PRECISION - m_arrays.m_collisionObjectDataDouble.push_back((btCollisionObjectDoubleData*)chunk->m_oldPtr); -#else //BT_USE_DOUBLE_PRECISION - m_arrays.m_collisionObjectDataFloat.push_back((btCollisionObjectFloatData*)chunk->m_oldPtr); -#endif //BT_USE_DOUBLE_PRECISION - break; - } - case BT_RIGIDBODY_CODE: - { -#ifdef BT_USE_DOUBLE_PRECISION - m_arrays.m_rigidBodyDataDouble.push_back((btRigidBodyDoubleData*)chunk->m_oldPtr); -#else - m_arrays.m_rigidBodyDataFloat.push_back((btRigidBodyFloatData*)chunk->m_oldPtr); -#endif //BT_USE_DOUBLE_PRECISION - break; - }; - case BT_CONSTRAINT_CODE: - { -#ifdef BT_USE_DOUBLE_PRECISION - m_arrays.m_constraintDataDouble.push_back((btTypedConstraintDoubleData*)chunk->m_oldPtr); -#else - m_arrays.m_constraintDataFloat.push_back((btTypedConstraintFloatData*)chunk->m_oldPtr); -#endif - break; - } - case BT_QUANTIZED_BVH_CODE: - { -#ifdef BT_USE_DOUBLE_PRECISION - m_arrays.m_bvhsDouble.push_back((btQuantizedBvhDoubleData*)chunk->m_oldPtr); -#else - m_arrays.m_bvhsFloat.push_back((btQuantizedBvhFloatData*)chunk->m_oldPtr); -#endif - break; - } - - case BT_SHAPE_CODE: - { - btCollisionShapeData* shapeData = (btCollisionShapeData*)chunk->m_oldPtr; - m_arrays.m_colShapeData.push_back(shapeData); - break; - } - case BT_TRIANLGE_INFO_MAP: - case BT_ARRAY_CODE: - case BT_SBMATERIAL_CODE: - case BT_SBNODE_CODE: - case BT_DYNAMICSWORLD_CODE: - case BT_DNA_CODE: - { - break; - } - default: - { - } - }; - } - - int getNumChunks() const - { - return m_uid2ChunkPtr.size(); - } - - const btChunk* getChunk(int chunkIndex) const - { - return *m_uid2ChunkPtr.getAtIndex(chunkIndex); - } -}; -#endif //ENABLE_INMEMORY_SERIALIZER - -#endif //BT_SERIALIZER_H diff --git a/engine/inc/bullet/LinearMath/btSpatialAlgebra.h b/engine/inc/bullet/LinearMath/btSpatialAlgebra.h deleted file mode 100644 index 6ad67a10..00000000 --- a/engine/inc/bullet/LinearMath/btSpatialAlgebra.h +++ /dev/null @@ -1,389 +0,0 @@ -/* -Copyright (c) 2003-2015 Erwin Coumans, Jakub Stepien - -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. -*/ - -///These spatial algebra classes are used for btMultiBody, -///see BulletDynamics/Featherstone - -#ifndef BT_SPATIAL_ALGEBRA_H -#define BT_SPATIAL_ALGEBRA_H - -#include "btMatrix3x3.h" - -struct btSpatialForceVector -{ - btVector3 m_topVec, m_bottomVec; - // - btSpatialForceVector() { setZero(); } - btSpatialForceVector(const btVector3 &angular, const btVector3 &linear) : m_topVec(linear), m_bottomVec(angular) {} - btSpatialForceVector(const btScalar &ax, const btScalar &ay, const btScalar &az, const btScalar &lx, const btScalar &ly, const btScalar &lz) - { - setValue(ax, ay, az, lx, ly, lz); - } - // - void setVector(const btVector3 &angular, const btVector3 &linear) - { - m_topVec = linear; - m_bottomVec = angular; - } - void setValue(const btScalar &ax, const btScalar &ay, const btScalar &az, const btScalar &lx, const btScalar &ly, const btScalar &lz) - { - m_bottomVec.setValue(ax, ay, az); - m_topVec.setValue(lx, ly, lz); - } - // - void addVector(const btVector3 &angular, const btVector3 &linear) - { - m_topVec += linear; - m_bottomVec += angular; - } - void addValue(const btScalar &ax, const btScalar &ay, const btScalar &az, const btScalar &lx, const btScalar &ly, const btScalar &lz) - { - m_bottomVec[0] += ax; - m_bottomVec[1] += ay; - m_bottomVec[2] += az; - m_topVec[0] += lx; - m_topVec[1] += ly; - m_topVec[2] += lz; - } - // - const btVector3 &getLinear() const { return m_topVec; } - const btVector3 &getAngular() const { return m_bottomVec; } - // - void setLinear(const btVector3 &linear) { m_topVec = linear; } - void setAngular(const btVector3 &angular) { m_bottomVec = angular; } - // - void addAngular(const btVector3 &angular) { m_bottomVec += angular; } - void addLinear(const btVector3 &linear) { m_topVec += linear; } - // - void setZero() - { - m_topVec.setZero(); - m_bottomVec.setZero(); - } - // - btSpatialForceVector &operator+=(const btSpatialForceVector &vec) - { - m_topVec += vec.m_topVec; - m_bottomVec += vec.m_bottomVec; - return *this; - } - btSpatialForceVector &operator-=(const btSpatialForceVector &vec) - { - m_topVec -= vec.m_topVec; - m_bottomVec -= vec.m_bottomVec; - return *this; - } - btSpatialForceVector operator-(const btSpatialForceVector &vec) const { return btSpatialForceVector(m_bottomVec - vec.m_bottomVec, m_topVec - vec.m_topVec); } - btSpatialForceVector operator+(const btSpatialForceVector &vec) const { return btSpatialForceVector(m_bottomVec + vec.m_bottomVec, m_topVec + vec.m_topVec); } - btSpatialForceVector operator-() const { return btSpatialForceVector(-m_bottomVec, -m_topVec); } - btSpatialForceVector operator*(const btScalar &s) const { return btSpatialForceVector(s * m_bottomVec, s * m_topVec); } - //btSpatialForceVector & operator = (const btSpatialForceVector &vec) { m_topVec = vec.m_topVec; m_bottomVec = vec.m_bottomVec; return *this; } -}; - -struct btSpatialMotionVector -{ - btVector3 m_topVec, m_bottomVec; - // - btSpatialMotionVector() { setZero(); } - btSpatialMotionVector(const btVector3 &angular, const btVector3 &linear) : m_topVec(angular), m_bottomVec(linear) {} - // - void setVector(const btVector3 &angular, const btVector3 &linear) - { - m_topVec = angular; - m_bottomVec = linear; - } - void setValue(const btScalar &ax, const btScalar &ay, const btScalar &az, const btScalar &lx, const btScalar &ly, const btScalar &lz) - { - m_topVec.setValue(ax, ay, az); - m_bottomVec.setValue(lx, ly, lz); - } - // - void addVector(const btVector3 &angular, const btVector3 &linear) - { - m_topVec += linear; - m_bottomVec += angular; - } - void addValue(const btScalar &ax, const btScalar &ay, const btScalar &az, const btScalar &lx, const btScalar &ly, const btScalar &lz) - { - m_topVec[0] += ax; - m_topVec[1] += ay; - m_topVec[2] += az; - m_bottomVec[0] += lx; - m_bottomVec[1] += ly; - m_bottomVec[2] += lz; - } - // - const btVector3 &getAngular() const { return m_topVec; } - const btVector3 &getLinear() const { return m_bottomVec; } - // - void setAngular(const btVector3 &angular) { m_topVec = angular; } - void setLinear(const btVector3 &linear) { m_bottomVec = linear; } - // - void addAngular(const btVector3 &angular) { m_topVec += angular; } - void addLinear(const btVector3 &linear) { m_bottomVec += linear; } - // - void setZero() - { - m_topVec.setZero(); - m_bottomVec.setZero(); - } - // - btScalar dot(const btSpatialForceVector &b) const - { - return m_bottomVec.dot(b.m_topVec) + m_topVec.dot(b.m_bottomVec); - } - // - template - void cross(const SpatialVectorType &b, SpatialVectorType &out) const - { - out.m_topVec = m_topVec.cross(b.m_topVec); - out.m_bottomVec = m_bottomVec.cross(b.m_topVec) + m_topVec.cross(b.m_bottomVec); - } - template - SpatialVectorType cross(const SpatialVectorType &b) const - { - SpatialVectorType out; - out.m_topVec = m_topVec.cross(b.m_topVec); - out.m_bottomVec = m_bottomVec.cross(b.m_topVec) + m_topVec.cross(b.m_bottomVec); - return out; - } - // - btSpatialMotionVector &operator+=(const btSpatialMotionVector &vec) - { - m_topVec += vec.m_topVec; - m_bottomVec += vec.m_bottomVec; - return *this; - } - btSpatialMotionVector &operator-=(const btSpatialMotionVector &vec) - { - m_topVec -= vec.m_topVec; - m_bottomVec -= vec.m_bottomVec; - return *this; - } - btSpatialMotionVector &operator*=(const btScalar &s) - { - m_topVec *= s; - m_bottomVec *= s; - return *this; - } - btSpatialMotionVector operator-(const btSpatialMotionVector &vec) const { return btSpatialMotionVector(m_topVec - vec.m_topVec, m_bottomVec - vec.m_bottomVec); } - btSpatialMotionVector operator+(const btSpatialMotionVector &vec) const { return btSpatialMotionVector(m_topVec + vec.m_topVec, m_bottomVec + vec.m_bottomVec); } - btSpatialMotionVector operator-() const { return btSpatialMotionVector(-m_topVec, -m_bottomVec); } - btSpatialMotionVector operator*(const btScalar &s) const { return btSpatialMotionVector(s * m_topVec, s * m_bottomVec); } -}; - -struct btSymmetricSpatialDyad -{ - btMatrix3x3 m_topLeftMat, m_topRightMat, m_bottomLeftMat; - // - btSymmetricSpatialDyad() { setIdentity(); } - btSymmetricSpatialDyad(const btMatrix3x3 &topLeftMat, const btMatrix3x3 &topRightMat, const btMatrix3x3 &bottomLeftMat) { setMatrix(topLeftMat, topRightMat, bottomLeftMat); } - // - void setMatrix(const btMatrix3x3 &topLeftMat, const btMatrix3x3 &topRightMat, const btMatrix3x3 &bottomLeftMat) - { - m_topLeftMat = topLeftMat; - m_topRightMat = topRightMat; - m_bottomLeftMat = bottomLeftMat; - } - // - void addMatrix(const btMatrix3x3 &topLeftMat, const btMatrix3x3 &topRightMat, const btMatrix3x3 &bottomLeftMat) - { - m_topLeftMat += topLeftMat; - m_topRightMat += topRightMat; - m_bottomLeftMat += bottomLeftMat; - } - // - void setIdentity() - { - m_topLeftMat.setIdentity(); - m_topRightMat.setIdentity(); - m_bottomLeftMat.setIdentity(); - } - // - btSymmetricSpatialDyad &operator-=(const btSymmetricSpatialDyad &mat) - { - m_topLeftMat -= mat.m_topLeftMat; - m_topRightMat -= mat.m_topRightMat; - m_bottomLeftMat -= mat.m_bottomLeftMat; - return *this; - } - // - btSpatialForceVector operator*(const btSpatialMotionVector &vec) - { - return btSpatialForceVector(m_bottomLeftMat * vec.m_topVec + m_topLeftMat.transpose() * vec.m_bottomVec, m_topLeftMat * vec.m_topVec + m_topRightMat * vec.m_bottomVec); - } -}; - -struct btSpatialTransformationMatrix -{ - btMatrix3x3 m_rotMat; //btMatrix3x3 m_trnCrossMat; - btVector3 m_trnVec; - // - enum eOutputOperation - { - None = 0, - Add = 1, - Subtract = 2 - }; - // - template - void transform(const SpatialVectorType &inVec, - SpatialVectorType &outVec, - eOutputOperation outOp = None) - { - if (outOp == None) - { - outVec.m_topVec = m_rotMat * inVec.m_topVec; - outVec.m_bottomVec = -m_trnVec.cross(outVec.m_topVec) + m_rotMat * inVec.m_bottomVec; - } - else if (outOp == Add) - { - outVec.m_topVec += m_rotMat * inVec.m_topVec; - outVec.m_bottomVec += -m_trnVec.cross(outVec.m_topVec) + m_rotMat * inVec.m_bottomVec; - } - else if (outOp == Subtract) - { - outVec.m_topVec -= m_rotMat * inVec.m_topVec; - outVec.m_bottomVec -= -m_trnVec.cross(outVec.m_topVec) + m_rotMat * inVec.m_bottomVec; - } - } - - template - void transformRotationOnly(const SpatialVectorType &inVec, - SpatialVectorType &outVec, - eOutputOperation outOp = None) - { - if (outOp == None) - { - outVec.m_topVec = m_rotMat * inVec.m_topVec; - outVec.m_bottomVec = m_rotMat * inVec.m_bottomVec; - } - else if (outOp == Add) - { - outVec.m_topVec += m_rotMat * inVec.m_topVec; - outVec.m_bottomVec += m_rotMat * inVec.m_bottomVec; - } - else if (outOp == Subtract) - { - outVec.m_topVec -= m_rotMat * inVec.m_topVec; - outVec.m_bottomVec -= m_rotMat * inVec.m_bottomVec; - } - } - - template - void transformInverse(const SpatialVectorType &inVec, - SpatialVectorType &outVec, - eOutputOperation outOp = None) - { - if (outOp == None) - { - outVec.m_topVec = m_rotMat.transpose() * inVec.m_topVec; - outVec.m_bottomVec = m_rotMat.transpose() * (inVec.m_bottomVec + m_trnVec.cross(inVec.m_topVec)); - } - else if (outOp == Add) - { - outVec.m_topVec += m_rotMat.transpose() * inVec.m_topVec; - outVec.m_bottomVec += m_rotMat.transpose() * (inVec.m_bottomVec + m_trnVec.cross(inVec.m_topVec)); - } - else if (outOp == Subtract) - { - outVec.m_topVec -= m_rotMat.transpose() * inVec.m_topVec; - outVec.m_bottomVec -= m_rotMat.transpose() * (inVec.m_bottomVec + m_trnVec.cross(inVec.m_topVec)); - } - } - - template - void transformInverseRotationOnly(const SpatialVectorType &inVec, - SpatialVectorType &outVec, - eOutputOperation outOp = None) - { - if (outOp == None) - { - outVec.m_topVec = m_rotMat.transpose() * inVec.m_topVec; - outVec.m_bottomVec = m_rotMat.transpose() * inVec.m_bottomVec; - } - else if (outOp == Add) - { - outVec.m_topVec += m_rotMat.transpose() * inVec.m_topVec; - outVec.m_bottomVec += m_rotMat.transpose() * inVec.m_bottomVec; - } - else if (outOp == Subtract) - { - outVec.m_topVec -= m_rotMat.transpose() * inVec.m_topVec; - outVec.m_bottomVec -= m_rotMat.transpose() * inVec.m_bottomVec; - } - } - - void transformInverse(const btSymmetricSpatialDyad &inMat, - btSymmetricSpatialDyad &outMat, - eOutputOperation outOp = None) - { - const btMatrix3x3 r_cross(0, -m_trnVec[2], m_trnVec[1], - m_trnVec[2], 0, -m_trnVec[0], - -m_trnVec[1], m_trnVec[0], 0); - - if (outOp == None) - { - outMat.m_topLeftMat = m_rotMat.transpose() * (inMat.m_topLeftMat - inMat.m_topRightMat * r_cross) * m_rotMat; - outMat.m_topRightMat = m_rotMat.transpose() * inMat.m_topRightMat * m_rotMat; - outMat.m_bottomLeftMat = m_rotMat.transpose() * (r_cross * (inMat.m_topLeftMat - inMat.m_topRightMat * r_cross) + inMat.m_bottomLeftMat - inMat.m_topLeftMat.transpose() * r_cross) * m_rotMat; - } - else if (outOp == Add) - { - outMat.m_topLeftMat += m_rotMat.transpose() * (inMat.m_topLeftMat - inMat.m_topRightMat * r_cross) * m_rotMat; - outMat.m_topRightMat += m_rotMat.transpose() * inMat.m_topRightMat * m_rotMat; - outMat.m_bottomLeftMat += m_rotMat.transpose() * (r_cross * (inMat.m_topLeftMat - inMat.m_topRightMat * r_cross) + inMat.m_bottomLeftMat - inMat.m_topLeftMat.transpose() * r_cross) * m_rotMat; - } - else if (outOp == Subtract) - { - outMat.m_topLeftMat -= m_rotMat.transpose() * (inMat.m_topLeftMat - inMat.m_topRightMat * r_cross) * m_rotMat; - outMat.m_topRightMat -= m_rotMat.transpose() * inMat.m_topRightMat * m_rotMat; - outMat.m_bottomLeftMat -= m_rotMat.transpose() * (r_cross * (inMat.m_topLeftMat - inMat.m_topRightMat * r_cross) + inMat.m_bottomLeftMat - inMat.m_topLeftMat.transpose() * r_cross) * m_rotMat; - } - } - - template - SpatialVectorType operator*(const SpatialVectorType &vec) - { - SpatialVectorType out; - transform(vec, out); - return out; - } -}; - -template -void symmetricSpatialOuterProduct(const SpatialVectorType &a, const SpatialVectorType &b, btSymmetricSpatialDyad &out) -{ - //output op maybe? - - out.m_topLeftMat = outerProduct(a.m_topVec, b.m_bottomVec); - out.m_topRightMat = outerProduct(a.m_topVec, b.m_topVec); - out.m_topLeftMat = outerProduct(a.m_bottomVec, b.m_bottomVec); - //maybe simple a*spatTranspose(a) would be nicer? -} - -template -btSymmetricSpatialDyad symmetricSpatialOuterProduct(const SpatialVectorType &a, const SpatialVectorType &b) -{ - btSymmetricSpatialDyad out; - - out.m_topLeftMat = outerProduct(a.m_topVec, b.m_bottomVec); - out.m_topRightMat = outerProduct(a.m_topVec, b.m_topVec); - out.m_bottomLeftMat = outerProduct(a.m_bottomVec, b.m_bottomVec); - - return out; - //maybe simple a*spatTranspose(a) would be nicer? -} - -#endif //BT_SPATIAL_ALGEBRA_H diff --git a/engine/inc/bullet/LinearMath/btStackAlloc.h b/engine/inc/bullet/LinearMath/btStackAlloc.h deleted file mode 100644 index 3fc20849..00000000 --- a/engine/inc/bullet/LinearMath/btStackAlloc.h +++ /dev/null @@ -1,118 +0,0 @@ -/* -Copyright (c) 2003-2006 Gino van den Bergen / 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. -*/ - -/* -StackAlloc extracted from GJK-EPA collision solver by Nathanael Presson -Nov.2006 -*/ - -#ifndef BT_STACK_ALLOC -#define BT_STACK_ALLOC - -#include "btScalar.h" //for btAssert -#include "btAlignedAllocator.h" - -///The btBlock class is an internal structure for the btStackAlloc memory allocator. -struct btBlock -{ - btBlock* previous; - unsigned char* address; -}; - -///The StackAlloc class provides some fast stack-based memory allocator (LIFO last-in first-out) -class btStackAlloc -{ -public: - btStackAlloc(unsigned int size) - { - ctor(); - create(size); - } - ~btStackAlloc() { destroy(); } - - inline void create(unsigned int size) - { - destroy(); - data = (unsigned char*)btAlignedAlloc(size, 16); - totalsize = size; - } - inline void destroy() - { - btAssert(usedsize == 0); - //Raise(L"StackAlloc is still in use"); - - if (usedsize == 0) - { - if (!ischild && data) - btAlignedFree(data); - - data = 0; - usedsize = 0; - } - } - - int getAvailableMemory() const - { - return static_cast(totalsize - usedsize); - } - - unsigned char* allocate(unsigned int size) - { - const unsigned int nus(usedsize + size); - if (nus < totalsize) - { - usedsize = nus; - return (data + (usedsize - size)); - } - btAssert(0); - //&& (L"Not enough memory")); - - return (0); - } - SIMD_FORCE_INLINE btBlock* beginBlock() - { - btBlock* pb = (btBlock*)allocate(sizeof(btBlock)); - pb->previous = current; - pb->address = data + usedsize; - current = pb; - return (pb); - } - SIMD_FORCE_INLINE void endBlock(btBlock* block) - { - btAssert(block == current); - //Raise(L"Unmatched blocks"); - if (block == current) - { - current = block->previous; - usedsize = (unsigned int)((block->address - data) - sizeof(btBlock)); - } - } - -private: - void ctor() - { - data = 0; - totalsize = 0; - usedsize = 0; - current = 0; - ischild = false; - } - unsigned char* data; - unsigned int totalsize; - unsigned int usedsize; - btBlock* current; - bool ischild; -}; - -#endif //BT_STACK_ALLOC diff --git a/engine/inc/bullet/LinearMath/btThreads.h b/engine/inc/bullet/LinearMath/btThreads.h deleted file mode 100644 index b2227e17..00000000 --- a/engine/inc/bullet/LinearMath/btThreads.h +++ /dev/null @@ -1,177 +0,0 @@ -/* -Copyright (c) 2003-2014 Erwin Coumans http://bullet.googlecode.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 BT_THREADS_H -#define BT_THREADS_H - -#include "btScalar.h" // has definitions like SIMD_FORCE_INLINE - -#if defined(_MSC_VER) && _MSC_VER >= 1600 -// give us a compile error if any signatures of overriden methods is changed -#define BT_OVERRIDE override -#endif - -#ifndef BT_OVERRIDE -#define BT_OVERRIDE -#endif - -// Don't set this to larger than 64, without modifying btThreadSupportPosix -// and btThreadSupportWin32. They use UINT64 bit-masks. -const unsigned int BT_MAX_THREAD_COUNT = 64; // only if BT_THREADSAFE is 1 - -// for internal use only -bool btIsMainThread(); -bool btThreadsAreRunning(); -unsigned int btGetCurrentThreadIndex(); -void btResetThreadIndexCounter(); // notify that all worker threads have been destroyed - -/// -/// btSpinMutex -- lightweight spin-mutex implemented with atomic ops, never puts -/// a thread to sleep because it is designed to be used with a task scheduler -/// which has one thread per core and the threads don't sleep until they -/// run out of tasks. Not good for general purpose use. -/// -class btSpinMutex -{ - int mLock; - -public: - btSpinMutex() - { - mLock = 0; - } - void lock(); - void unlock(); - bool tryLock(); -}; - -// -// NOTE: btMutex* is for internal Bullet use only -// -// If BT_THREADSAFE is undefined or 0, should optimize away to nothing. -// This is good because for the single-threaded build of Bullet, any calls -// to these functions will be optimized out. -// -// However, for users of the multi-threaded build of Bullet this is kind -// of bad because if you call any of these functions from external code -// (where BT_THREADSAFE is undefined) you will get unexpected race conditions. -// -SIMD_FORCE_INLINE void btMutexLock(btSpinMutex* mutex) -{ -#if BT_THREADSAFE - mutex->lock(); -#else - (void)mutex; -#endif // #if BT_THREADSAFE -} - -SIMD_FORCE_INLINE void btMutexUnlock(btSpinMutex* mutex) -{ -#if BT_THREADSAFE - mutex->unlock(); -#else - (void)mutex; -#endif // #if BT_THREADSAFE -} - -SIMD_FORCE_INLINE bool btMutexTryLock(btSpinMutex* mutex) -{ -#if BT_THREADSAFE - return mutex->tryLock(); -#else - (void)mutex; - return true; -#endif // #if BT_THREADSAFE -} - -// -// btIParallelForBody -- subclass this to express work that can be done in parallel -// -class btIParallelForBody -{ -public: - virtual ~btIParallelForBody() {} - virtual void forLoop(int iBegin, int iEnd) const = 0; -}; - -// -// btIParallelSumBody -- subclass this to express work that can be done in parallel -// and produces a sum over all loop elements -// -class btIParallelSumBody -{ -public: - virtual ~btIParallelSumBody() {} - virtual btScalar sumLoop(int iBegin, int iEnd) const = 0; -}; - -// -// btITaskScheduler -- subclass this to implement a task scheduler that can dispatch work to -// worker threads -// -class btITaskScheduler -{ -public: - btITaskScheduler(const char* name); - virtual ~btITaskScheduler() {} - const char* getName() const { return m_name; } - - virtual int getMaxNumThreads() const = 0; - virtual int getNumThreads() const = 0; - virtual void setNumThreads(int numThreads) = 0; - virtual void parallelFor(int iBegin, int iEnd, int grainSize, const btIParallelForBody& body) = 0; - virtual btScalar parallelSum(int iBegin, int iEnd, int grainSize, const btIParallelSumBody& body) = 0; - virtual void sleepWorkerThreadsHint() {} // hint the task scheduler that we may not be using these threads for a little while - - // internal use only - virtual void activate(); - virtual void deactivate(); - -protected: - const char* m_name; - unsigned int m_savedThreadCounter; - bool m_isActive; -}; - -// set the task scheduler to use for all calls to btParallelFor() -// NOTE: you must set this prior to using any of the multi-threaded "Mt" classes -void btSetTaskScheduler(btITaskScheduler* ts); - -// get the current task scheduler -btITaskScheduler* btGetTaskScheduler(); - -// get non-threaded task scheduler (always available) -btITaskScheduler* btGetSequentialTaskScheduler(); - -// create a default task scheduler (Win32 or pthreads based) -btITaskScheduler* btCreateDefaultTaskScheduler(); - -// get OpenMP task scheduler (if available, otherwise returns null) -btITaskScheduler* btGetOpenMPTaskScheduler(); - -// get Intel TBB task scheduler (if available, otherwise returns null) -btITaskScheduler* btGetTBBTaskScheduler(); - -// get PPL task scheduler (if available, otherwise returns null) -btITaskScheduler* btGetPPLTaskScheduler(); - -// btParallelFor -- call this to dispatch work like a for-loop -// (iterations may be done out of order, so no dependencies are allowed) -void btParallelFor(int iBegin, int iEnd, int grainSize, const btIParallelForBody& body); - -// btParallelSum -- call this to dispatch work like a for-loop, returns the sum of all iterations -// (iterations may be done out of order, so no dependencies are allowed) -btScalar btParallelSum(int iBegin, int iEnd, int grainSize, const btIParallelSumBody& body); - -#endif diff --git a/engine/inc/bullet/LinearMath/btTransform.h b/engine/inc/bullet/LinearMath/btTransform.h deleted file mode 100644 index 6f2f9981..00000000 --- a/engine/inc/bullet/LinearMath/btTransform.h +++ /dev/null @@ -1,286 +0,0 @@ -/* -Copyright (c) 2003-2006 Gino van den Bergen / 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_TRANSFORM_H -#define BT_TRANSFORM_H - -#include "btMatrix3x3.h" - -#ifdef BT_USE_DOUBLE_PRECISION -#define btTransformData btTransformDoubleData -#else -#define btTransformData btTransformFloatData -#endif - -/**@brief The btTransform class supports rigid transforms with only translation and rotation and no scaling/shear. - *It can be used in combination with btVector3, btQuaternion and btMatrix3x3 linear algebra classes. */ -ATTRIBUTE_ALIGNED16(class) -btTransform -{ - ///Storage for the rotation - btMatrix3x3 m_basis; - ///Storage for the translation - btVector3 m_origin; - -public: - /**@brief No initialization constructor */ - btTransform() {} - /**@brief Constructor from btQuaternion (optional btVector3 ) - * @param q Rotation from quaternion - * @param c Translation from Vector (default 0,0,0) */ - explicit SIMD_FORCE_INLINE btTransform(const btQuaternion& q, - const btVector3& c = btVector3(btScalar(0), btScalar(0), btScalar(0))) - : m_basis(q), - m_origin(c) - { - } - - /**@brief Constructor from btMatrix3x3 (optional btVector3) - * @param b Rotation from Matrix - * @param c Translation from Vector default (0,0,0)*/ - explicit SIMD_FORCE_INLINE btTransform(const btMatrix3x3& b, - const btVector3& c = btVector3(btScalar(0), btScalar(0), btScalar(0))) - : m_basis(b), - m_origin(c) - { - } - /**@brief Copy constructor */ - SIMD_FORCE_INLINE btTransform(const btTransform& other) - : m_basis(other.m_basis), - m_origin(other.m_origin) - { - } - /**@brief Assignment Operator */ - SIMD_FORCE_INLINE btTransform& operator=(const btTransform& other) - { - m_basis = other.m_basis; - m_origin = other.m_origin; - return *this; - } - - /**@brief Set the current transform as the value of the product of two transforms - * @param t1 Transform 1 - * @param t2 Transform 2 - * This = Transform1 * Transform2 */ - SIMD_FORCE_INLINE void mult(const btTransform& t1, const btTransform& t2) - { - m_basis = t1.m_basis * t2.m_basis; - m_origin = t1(t2.m_origin); - } - - /* void multInverseLeft(const btTransform& t1, const btTransform& t2) { - btVector3 v = t2.m_origin - t1.m_origin; - m_basis = btMultTransposeLeft(t1.m_basis, t2.m_basis); - m_origin = v * t1.m_basis; - } - */ - - /**@brief Return the transform of the vector */ - SIMD_FORCE_INLINE btVector3 operator()(const btVector3& x) const - { - return x.dot3(m_basis[0], m_basis[1], m_basis[2]) + m_origin; - } - - /**@brief Return the transform of the vector */ - SIMD_FORCE_INLINE btVector3 operator*(const btVector3& x) const - { - return (*this)(x); - } - - /**@brief Return the transform of the btQuaternion */ - SIMD_FORCE_INLINE btQuaternion operator*(const btQuaternion& q) const - { - return getRotation() * q; - } - - /**@brief Return the basis matrix for the rotation */ - SIMD_FORCE_INLINE btMatrix3x3& getBasis() { return m_basis; } - /**@brief Return the basis matrix for the rotation */ - SIMD_FORCE_INLINE const btMatrix3x3& getBasis() const { return m_basis; } - - /**@brief Return the origin vector translation */ - SIMD_FORCE_INLINE btVector3& getOrigin() { return m_origin; } - /**@brief Return the origin vector translation */ - SIMD_FORCE_INLINE const btVector3& getOrigin() const { return m_origin; } - - /**@brief Return a quaternion representing the rotation */ - btQuaternion getRotation() const - { - btQuaternion q; - m_basis.getRotation(q); - return q; - } - - /**@brief Set from an array - * @param m A pointer to a 16 element array (12 rotation(row major padded on the right by 1), and 3 translation */ - void setFromOpenGLMatrix(const btScalar* m) - { - m_basis.setFromOpenGLSubMatrix(m); - m_origin.setValue(m[12], m[13], m[14]); - } - - /**@brief Fill an array representation - * @param m A pointer to a 16 element array (12 rotation(row major padded on the right by 1), and 3 translation */ - void getOpenGLMatrix(btScalar * m) const - { - m_basis.getOpenGLSubMatrix(m); - m[12] = m_origin.x(); - m[13] = m_origin.y(); - m[14] = m_origin.z(); - m[15] = btScalar(1.0); - } - - /**@brief Set the translational element - * @param origin The vector to set the translation to */ - SIMD_FORCE_INLINE void setOrigin(const btVector3& origin) - { - m_origin = origin; - } - - SIMD_FORCE_INLINE btVector3 invXform(const btVector3& inVec) const; - - /**@brief Set the rotational element by btMatrix3x3 */ - SIMD_FORCE_INLINE void setBasis(const btMatrix3x3& basis) - { - m_basis = basis; - } - - /**@brief Set the rotational element by btQuaternion */ - SIMD_FORCE_INLINE void setRotation(const btQuaternion& q) - { - m_basis.setRotation(q); - } - - /**@brief Set this transformation to the identity */ - void setIdentity() - { - m_basis.setIdentity(); - m_origin.setValue(btScalar(0.0), btScalar(0.0), btScalar(0.0)); - } - - /**@brief Multiply this Transform by another(this = this * another) - * @param t The other transform */ - btTransform& operator*=(const btTransform& t) - { - m_origin += m_basis * t.m_origin; - m_basis *= t.m_basis; - return *this; - } - - /**@brief Return the inverse of this transform */ - btTransform inverse() const - { - btMatrix3x3 inv = m_basis.transpose(); - return btTransform(inv, inv * -m_origin); - } - - /**@brief Return the inverse of this transform times the other transform - * @param t The other transform - * return this.inverse() * the other */ - btTransform inverseTimes(const btTransform& t) const; - - /**@brief Return the product of this transform and the other */ - btTransform operator*(const btTransform& t) const; - - /**@brief Return an identity transform */ - static const btTransform& getIdentity() - { - static const btTransform identityTransform(btMatrix3x3::getIdentity()); - return identityTransform; - } - - void serialize(struct btTransformData & dataOut) const; - - void serializeFloat(struct btTransformFloatData & dataOut) const; - - void deSerialize(const struct btTransformData& dataIn); - - void deSerializeDouble(const struct btTransformDoubleData& dataIn); - - void deSerializeFloat(const struct btTransformFloatData& dataIn); -}; - -SIMD_FORCE_INLINE btVector3 -btTransform::invXform(const btVector3& inVec) const -{ - btVector3 v = inVec - m_origin; - return (m_basis.transpose() * v); -} - -SIMD_FORCE_INLINE btTransform -btTransform::inverseTimes(const btTransform& t) const -{ - btVector3 v = t.getOrigin() - m_origin; - return btTransform(m_basis.transposeTimes(t.m_basis), - v * m_basis); -} - -SIMD_FORCE_INLINE btTransform - btTransform::operator*(const btTransform& t) const -{ - return btTransform(m_basis * t.m_basis, - (*this)(t.m_origin)); -} - -/**@brief Test if two transforms have all elements equal */ -SIMD_FORCE_INLINE bool operator==(const btTransform& t1, const btTransform& t2) -{ - return (t1.getBasis() == t2.getBasis() && - t1.getOrigin() == t2.getOrigin()); -} - -///for serialization -struct btTransformFloatData -{ - btMatrix3x3FloatData m_basis; - btVector3FloatData m_origin; -}; - -struct btTransformDoubleData -{ - btMatrix3x3DoubleData m_basis; - btVector3DoubleData m_origin; -}; - -SIMD_FORCE_INLINE void btTransform::serialize(btTransformData& dataOut) const -{ - m_basis.serialize(dataOut.m_basis); - m_origin.serialize(dataOut.m_origin); -} - -SIMD_FORCE_INLINE void btTransform::serializeFloat(btTransformFloatData& dataOut) const -{ - m_basis.serializeFloat(dataOut.m_basis); - m_origin.serializeFloat(dataOut.m_origin); -} - -SIMD_FORCE_INLINE void btTransform::deSerialize(const btTransformData& dataIn) -{ - m_basis.deSerialize(dataIn.m_basis); - m_origin.deSerialize(dataIn.m_origin); -} - -SIMD_FORCE_INLINE void btTransform::deSerializeFloat(const btTransformFloatData& dataIn) -{ - m_basis.deSerializeFloat(dataIn.m_basis); - m_origin.deSerializeFloat(dataIn.m_origin); -} - -SIMD_FORCE_INLINE void btTransform::deSerializeDouble(const btTransformDoubleData& dataIn) -{ - m_basis.deSerializeDouble(dataIn.m_basis); - m_origin.deSerializeDouble(dataIn.m_origin); -} - -#endif //BT_TRANSFORM_H diff --git a/engine/inc/bullet/LinearMath/btTransformUtil.h b/engine/inc/bullet/LinearMath/btTransformUtil.h deleted file mode 100644 index b874dd68..00000000 --- a/engine/inc/bullet/LinearMath/btTransformUtil.h +++ /dev/null @@ -1,223 +0,0 @@ -/* -Copyright (c) 2003-2006 Gino van den Bergen / 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_TRANSFORM_UTIL_H -#define BT_TRANSFORM_UTIL_H - -#include "btTransform.h" -#define ANGULAR_MOTION_THRESHOLD btScalar(0.5) * SIMD_HALF_PI - -SIMD_FORCE_INLINE btVector3 btAabbSupport(const btVector3& halfExtents, const btVector3& supportDir) -{ - return btVector3(supportDir.x() < btScalar(0.0) ? -halfExtents.x() : halfExtents.x(), - supportDir.y() < btScalar(0.0) ? -halfExtents.y() : halfExtents.y(), - supportDir.z() < btScalar(0.0) ? -halfExtents.z() : halfExtents.z()); -} - -/// Utils related to temporal transforms -class btTransformUtil -{ -public: - static void integrateTransform(const btTransform& curTrans, const btVector3& linvel, const btVector3& angvel, btScalar timeStep, btTransform& predictedTransform) - { - predictedTransform.setOrigin(curTrans.getOrigin() + linvel * timeStep); - // #define QUATERNION_DERIVATIVE -#ifdef QUATERNION_DERIVATIVE - btQuaternion predictedOrn = curTrans.getRotation(); - predictedOrn += (angvel * predictedOrn) * (timeStep * btScalar(0.5)); - predictedOrn.safeNormalize(); -#else - //Exponential map - //google for "Practical Parameterization of Rotations Using the Exponential Map", F. Sebastian Grassia - - btVector3 axis; - btScalar fAngle2 = angvel.length2(); - btScalar fAngle = 0; - if (fAngle2 > SIMD_EPSILON) - { - fAngle = btSqrt(fAngle2); - } - - //limit the angular motion - if (fAngle * timeStep > ANGULAR_MOTION_THRESHOLD) - { - fAngle = ANGULAR_MOTION_THRESHOLD / timeStep; - } - - if (fAngle < btScalar(0.001)) - { - // use Taylor's expansions of sync function - axis = angvel * (btScalar(0.5) * timeStep - (timeStep * timeStep * timeStep) * (btScalar(0.020833333333)) * fAngle * fAngle); - } - else - { - // sync(fAngle) = sin(c*fAngle)/t - axis = angvel * (btSin(btScalar(0.5) * fAngle * timeStep) / fAngle); - } - btQuaternion dorn(axis.x(), axis.y(), axis.z(), btCos(fAngle * timeStep * btScalar(0.5))); - btQuaternion orn0 = curTrans.getRotation(); - - btQuaternion predictedOrn = dorn * orn0; - predictedOrn.safeNormalize(); -#endif - if (predictedOrn.length2() > SIMD_EPSILON) - { - predictedTransform.setRotation(predictedOrn); - } - else - { - predictedTransform.setBasis(curTrans.getBasis()); - } - } - - static void calculateVelocityQuaternion(const btVector3& pos0, const btVector3& pos1, const btQuaternion& orn0, const btQuaternion& orn1, btScalar timeStep, btVector3& linVel, btVector3& angVel) - { - linVel = (pos1 - pos0) / timeStep; - btVector3 axis; - btScalar angle; - if (orn0 != orn1) - { - calculateDiffAxisAngleQuaternion(orn0, orn1, axis, angle); - angVel = axis * angle / timeStep; - } - else - { - angVel.setValue(0, 0, 0); - } - } - - static void calculateDiffAxisAngleQuaternion(const btQuaternion& orn0, const btQuaternion& orn1a, btVector3& axis, btScalar& angle) - { - btQuaternion orn1 = orn0.nearest(orn1a); - btQuaternion dorn = orn1 * orn0.inverse(); - angle = dorn.getAngle(); - axis = btVector3(dorn.x(), dorn.y(), dorn.z()); - axis[3] = btScalar(0.); - //check for axis length - btScalar len = axis.length2(); - if (len < SIMD_EPSILON * SIMD_EPSILON) - axis = btVector3(btScalar(1.), btScalar(0.), btScalar(0.)); - else - axis /= btSqrt(len); - } - - static void calculateVelocity(const btTransform& transform0, const btTransform& transform1, btScalar timeStep, btVector3& linVel, btVector3& angVel) - { - linVel = (transform1.getOrigin() - transform0.getOrigin()) / timeStep; - btVector3 axis; - btScalar angle; - calculateDiffAxisAngle(transform0, transform1, axis, angle); - angVel = axis * angle / timeStep; - } - - static void calculateDiffAxisAngle(const btTransform& transform0, const btTransform& transform1, btVector3& axis, btScalar& angle) - { - btMatrix3x3 dmat = transform1.getBasis() * transform0.getBasis().inverse(); - btQuaternion dorn; - dmat.getRotation(dorn); - - ///floating point inaccuracy can lead to w component > 1..., which breaks - dorn.normalize(); - - angle = dorn.getAngle(); - axis = btVector3(dorn.x(), dorn.y(), dorn.z()); - axis[3] = btScalar(0.); - //check for axis length - btScalar len = axis.length2(); - if (len < SIMD_EPSILON * SIMD_EPSILON) - axis = btVector3(btScalar(1.), btScalar(0.), btScalar(0.)); - else - axis /= btSqrt(len); - } -}; - -///The btConvexSeparatingDistanceUtil can help speed up convex collision detection -///by conservatively updating a cached separating distance/vector instead of re-calculating the closest distance -class btConvexSeparatingDistanceUtil -{ - btQuaternion m_ornA; - btQuaternion m_ornB; - btVector3 m_posA; - btVector3 m_posB; - - btVector3 m_separatingNormal; - - btScalar m_boundingRadiusA; - btScalar m_boundingRadiusB; - btScalar m_separatingDistance; - -public: - btConvexSeparatingDistanceUtil(btScalar boundingRadiusA, btScalar boundingRadiusB) - : m_boundingRadiusA(boundingRadiusA), - m_boundingRadiusB(boundingRadiusB), - m_separatingDistance(0.f) - { - } - - btScalar getConservativeSeparatingDistance() - { - return m_separatingDistance; - } - - void updateSeparatingDistance(const btTransform& transA, const btTransform& transB) - { - const btVector3& toPosA = transA.getOrigin(); - const btVector3& toPosB = transB.getOrigin(); - btQuaternion toOrnA = transA.getRotation(); - btQuaternion toOrnB = transB.getRotation(); - - if (m_separatingDistance > 0.f) - { - btVector3 linVelA, angVelA, linVelB, angVelB; - btTransformUtil::calculateVelocityQuaternion(m_posA, toPosA, m_ornA, toOrnA, btScalar(1.), linVelA, angVelA); - btTransformUtil::calculateVelocityQuaternion(m_posB, toPosB, m_ornB, toOrnB, btScalar(1.), linVelB, angVelB); - btScalar maxAngularProjectedVelocity = angVelA.length() * m_boundingRadiusA + angVelB.length() * m_boundingRadiusB; - btVector3 relLinVel = (linVelB - linVelA); - btScalar relLinVelocLength = relLinVel.dot(m_separatingNormal); - if (relLinVelocLength < 0.f) - { - relLinVelocLength = 0.f; - } - - btScalar projectedMotion = maxAngularProjectedVelocity + relLinVelocLength; - m_separatingDistance -= projectedMotion; - } - - m_posA = toPosA; - m_posB = toPosB; - m_ornA = toOrnA; - m_ornB = toOrnB; - } - - void initSeparatingDistance(const btVector3& separatingVector, btScalar separatingDistance, const btTransform& transA, const btTransform& transB) - { - m_separatingDistance = separatingDistance; - - if (m_separatingDistance > 0.f) - { - m_separatingNormal = separatingVector; - - const btVector3& toPosA = transA.getOrigin(); - const btVector3& toPosB = transB.getOrigin(); - btQuaternion toOrnA = transA.getRotation(); - btQuaternion toOrnB = transB.getRotation(); - m_posA = toPosA; - m_posB = toPosB; - m_ornA = toOrnA; - m_ornB = toOrnB; - } - } -}; - -#endif //BT_TRANSFORM_UTIL_H diff --git a/engine/inc/bullet/LinearMath/btVector3.h b/engine/inc/bullet/LinearMath/btVector3.h deleted file mode 100644 index d65ed980..00000000 --- a/engine/inc/bullet/LinearMath/btVector3.h +++ /dev/null @@ -1,1336 +0,0 @@ -/* -Copyright (c) 2003-2006 Gino van den Bergen / 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_VECTOR3_H -#define BT_VECTOR3_H - -//#include -#include "btScalar.h" -#include "btMinMax.h" -#include "btAlignedAllocator.h" - -#ifdef BT_USE_DOUBLE_PRECISION -#define btVector3Data btVector3DoubleData -#define btVector3DataName "btVector3DoubleData" -#else -#define btVector3Data btVector3FloatData -#define btVector3DataName "btVector3FloatData" -#endif //BT_USE_DOUBLE_PRECISION - -#if defined BT_USE_SSE - -//typedef uint32_t __m128i __attribute__ ((vector_size(16))); - -#ifdef _MSC_VER -#pragma warning(disable : 4556) // value of intrinsic immediate argument '4294967239' is out of range '0 - 255' -#endif - -#define BT_SHUFFLE(x, y, z, w) (((w) << 6 | (z) << 4 | (y) << 2 | (x)) & 0xff) -//#define bt_pshufd_ps( _a, _mask ) (__m128) _mm_shuffle_epi32((__m128i)(_a), (_mask) ) -#define bt_pshufd_ps(_a, _mask) _mm_shuffle_ps((_a), (_a), (_mask)) -#define bt_splat3_ps(_a, _i) bt_pshufd_ps((_a), BT_SHUFFLE(_i, _i, _i, 3)) -#define bt_splat_ps(_a, _i) bt_pshufd_ps((_a), BT_SHUFFLE(_i, _i, _i, _i)) - -#define btv3AbsiMask (_mm_set_epi32(0x00000000, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF)) -#define btvAbsMask (_mm_set_epi32(0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF)) -#define btvFFF0Mask (_mm_set_epi32(0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF)) -#define btv3AbsfMask btCastiTo128f(btv3AbsiMask) -#define btvFFF0fMask btCastiTo128f(btvFFF0Mask) -#define btvxyzMaskf btvFFF0fMask -#define btvAbsfMask btCastiTo128f(btvAbsMask) - -//there is an issue with XCode 3.2 (LCx errors) -#define btvMzeroMask (_mm_set_ps(-0.0f, -0.0f, -0.0f, -0.0f)) -#define v1110 (_mm_set_ps(0.0f, 1.0f, 1.0f, 1.0f)) -#define vHalf (_mm_set_ps(0.5f, 0.5f, 0.5f, 0.5f)) -#define v1_5 (_mm_set_ps(1.5f, 1.5f, 1.5f, 1.5f)) - -//const __m128 ATTRIBUTE_ALIGNED16(btvMzeroMask) = {-0.0f, -0.0f, -0.0f, -0.0f}; -//const __m128 ATTRIBUTE_ALIGNED16(v1110) = {1.0f, 1.0f, 1.0f, 0.0f}; -//const __m128 ATTRIBUTE_ALIGNED16(vHalf) = {0.5f, 0.5f, 0.5f, 0.5f}; -//const __m128 ATTRIBUTE_ALIGNED16(v1_5) = {1.5f, 1.5f, 1.5f, 1.5f}; - -#endif - -#ifdef BT_USE_NEON - -const float32x4_t ATTRIBUTE_ALIGNED16(btvMzeroMask) = (float32x4_t){-0.0f, -0.0f, -0.0f, -0.0f}; -const int32x4_t ATTRIBUTE_ALIGNED16(btvFFF0Mask) = (int32x4_t){static_cast(0xFFFFFFFF), - static_cast(0xFFFFFFFF), static_cast(0xFFFFFFFF), 0x0}; -const int32x4_t ATTRIBUTE_ALIGNED16(btvAbsMask) = (int32x4_t){0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF}; -const int32x4_t ATTRIBUTE_ALIGNED16(btv3AbsMask) = (int32x4_t){0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x0}; - -#endif - -/**@brief btVector3 can be used to represent 3D points and vectors. - * It has an un-used w component to suit 16-byte alignment when btVector3 is stored in containers. This extra component can be used by derived classes (Quaternion?) or by user - * Ideally, this class should be replaced by a platform optimized SIMD version that keeps the data in registers - */ -ATTRIBUTE_ALIGNED16(class) -btVector3 -{ -public: - BT_DECLARE_ALIGNED_ALLOCATOR(); - -#if defined(__SPU__) && defined(__CELLOS_LV2__) - btScalar m_floats[4]; - -public: - SIMD_FORCE_INLINE const vec_float4& get128() const - { - return *((const vec_float4*)&m_floats[0]); - } - -public: -#else //__CELLOS_LV2__ __SPU__ -#if defined(BT_USE_SSE) || defined(BT_USE_NEON) // _WIN32 || ARM - union { - btSimdFloat4 mVec128; - btScalar m_floats[4]; - }; - SIMD_FORCE_INLINE btSimdFloat4 get128() const - { - return mVec128; - } - SIMD_FORCE_INLINE void set128(btSimdFloat4 v128) - { - mVec128 = v128; - } -#else - btScalar m_floats[4]; -#endif -#endif //__CELLOS_LV2__ __SPU__ - -public: - /**@brief No initialization constructor */ - SIMD_FORCE_INLINE btVector3() - { - } - - /**@brief Constructor from scalars - * @param x X value - * @param y Y value - * @param z Z value - */ - SIMD_FORCE_INLINE btVector3(const btScalar& _x, const btScalar& _y, const btScalar& _z) - { - m_floats[0] = _x; - m_floats[1] = _y; - m_floats[2] = _z; - m_floats[3] = btScalar(0.f); - } - -#if (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)) || defined(BT_USE_NEON) - // Set Vector - SIMD_FORCE_INLINE btVector3(btSimdFloat4 v) - { - mVec128 = v; - } - - // Copy constructor - SIMD_FORCE_INLINE btVector3(const btVector3& rhs) - { - mVec128 = rhs.mVec128; - } - - // Assignment Operator - SIMD_FORCE_INLINE btVector3& - operator=(const btVector3& v) - { - mVec128 = v.mVec128; - - return *this; - } -#endif // #if defined (BT_USE_SSE_IN_API) || defined (BT_USE_NEON) - - /**@brief Add a vector to this one - * @param The vector to add to this one */ - SIMD_FORCE_INLINE btVector3& operator+=(const btVector3& v) - { -#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - mVec128 = _mm_add_ps(mVec128, v.mVec128); -#elif defined(BT_USE_NEON) - mVec128 = vaddq_f32(mVec128, v.mVec128); -#else - m_floats[0] += v.m_floats[0]; - m_floats[1] += v.m_floats[1]; - m_floats[2] += v.m_floats[2]; -#endif - return *this; - } - - /**@brief Subtract a vector from this one - * @param The vector to subtract */ - SIMD_FORCE_INLINE btVector3& operator-=(const btVector3& v) - { -#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - mVec128 = _mm_sub_ps(mVec128, v.mVec128); -#elif defined(BT_USE_NEON) - mVec128 = vsubq_f32(mVec128, v.mVec128); -#else - m_floats[0] -= v.m_floats[0]; - m_floats[1] -= v.m_floats[1]; - m_floats[2] -= v.m_floats[2]; -#endif - return *this; - } - - /**@brief Scale the vector - * @param s Scale factor */ - SIMD_FORCE_INLINE btVector3& operator*=(const btScalar& s) - { -#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - __m128 vs = _mm_load_ss(&s); // (S 0 0 0) - vs = bt_pshufd_ps(vs, 0x80); // (S S S 0.0) - mVec128 = _mm_mul_ps(mVec128, vs); -#elif defined(BT_USE_NEON) - mVec128 = vmulq_n_f32(mVec128, s); -#else - m_floats[0] *= s; - m_floats[1] *= s; - m_floats[2] *= s; -#endif - return *this; - } - - /**@brief Inversely scale the vector - * @param s Scale factor to divide by */ - SIMD_FORCE_INLINE btVector3& operator/=(const btScalar& s) - { - btFullAssert(s != btScalar(0.0)); - -#if 0 //defined(BT_USE_SSE_IN_API) -// this code is not faster ! - __m128 vs = _mm_load_ss(&s); - vs = _mm_div_ss(v1110, vs); - vs = bt_pshufd_ps(vs, 0x00); // (S S S S) - - mVec128 = _mm_mul_ps(mVec128, vs); - - return *this; -#else - return *this *= btScalar(1.0) / s; -#endif - } - - /**@brief Return the dot product - * @param v The other vector in the dot product */ - SIMD_FORCE_INLINE btScalar dot(const btVector3& v) const - { -#if defined BT_USE_SIMD_VECTOR3 && defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - __m128 vd = _mm_mul_ps(mVec128, v.mVec128); - __m128 z = _mm_movehl_ps(vd, vd); - __m128 y = _mm_shuffle_ps(vd, vd, 0x55); - vd = _mm_add_ss(vd, y); - vd = _mm_add_ss(vd, z); - return _mm_cvtss_f32(vd); -#elif defined(BT_USE_NEON) - float32x4_t vd = vmulq_f32(mVec128, v.mVec128); - float32x2_t x = vpadd_f32(vget_low_f32(vd), vget_low_f32(vd)); - x = vadd_f32(x, vget_high_f32(vd)); - return vget_lane_f32(x, 0); -#else - return m_floats[0] * v.m_floats[0] + - m_floats[1] * v.m_floats[1] + - m_floats[2] * v.m_floats[2]; -#endif - } - - /**@brief Return the length of the vector squared */ - SIMD_FORCE_INLINE btScalar length2() const - { - return dot(*this); - } - - /**@brief Return the length of the vector */ - SIMD_FORCE_INLINE btScalar length() const - { - return btSqrt(length2()); - } - - /**@brief Return the norm (length) of the vector */ - SIMD_FORCE_INLINE btScalar norm() const - { - return length(); - } - - /**@brief Return the norm (length) of the vector */ - SIMD_FORCE_INLINE btScalar safeNorm() const - { - btScalar d = length2(); - //workaround for some clang/gcc issue of sqrtf(tiny number) = -INF - if (d > SIMD_EPSILON) - return btSqrt(d); - return btScalar(0); - } - - /**@brief Return the distance squared between the ends of this and another vector - * This is symantically treating the vector like a point */ - SIMD_FORCE_INLINE btScalar distance2(const btVector3& v) const; - - /**@brief Return the distance between the ends of this and another vector - * This is symantically treating the vector like a point */ - SIMD_FORCE_INLINE btScalar distance(const btVector3& v) const; - - SIMD_FORCE_INLINE btVector3& safeNormalize() - { - btScalar l2 = length2(); - //triNormal.normalize(); - if (l2 >= SIMD_EPSILON * SIMD_EPSILON) - { - (*this) /= btSqrt(l2); - } - else - { - setValue(1, 0, 0); - } - return *this; - } - - /**@brief Normalize this vector - * x^2 + y^2 + z^2 = 1 */ - SIMD_FORCE_INLINE btVector3& normalize() - { - btAssert(!fuzzyZero()); - -#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - // dot product first - __m128 vd = _mm_mul_ps(mVec128, mVec128); - __m128 z = _mm_movehl_ps(vd, vd); - __m128 y = _mm_shuffle_ps(vd, vd, 0x55); - vd = _mm_add_ss(vd, y); - vd = _mm_add_ss(vd, z); - -#if 0 - vd = _mm_sqrt_ss(vd); - vd = _mm_div_ss(v1110, vd); - vd = bt_splat_ps(vd, 0x80); - mVec128 = _mm_mul_ps(mVec128, vd); -#else - - // NR step 1/sqrt(x) - vd is x, y is output - y = _mm_rsqrt_ss(vd); // estimate - - // one step NR - z = v1_5; - vd = _mm_mul_ss(vd, vHalf); // vd * 0.5 - //x2 = vd; - vd = _mm_mul_ss(vd, y); // vd * 0.5 * y0 - vd = _mm_mul_ss(vd, y); // vd * 0.5 * y0 * y0 - z = _mm_sub_ss(z, vd); // 1.5 - vd * 0.5 * y0 * y0 - - y = _mm_mul_ss(y, z); // y0 * (1.5 - vd * 0.5 * y0 * y0) - - y = bt_splat_ps(y, 0x80); - mVec128 = _mm_mul_ps(mVec128, y); - -#endif - - return *this; -#else - return *this /= length(); -#endif - } - - /**@brief Return a normalized version of this vector */ - SIMD_FORCE_INLINE btVector3 normalized() const; - - /**@brief Return a rotated version of this vector - * @param wAxis The axis to rotate about - * @param angle The angle to rotate by */ - SIMD_FORCE_INLINE btVector3 rotate(const btVector3& wAxis, const btScalar angle) const; - - /**@brief Return the angle between this and another vector - * @param v The other vector */ - SIMD_FORCE_INLINE btScalar angle(const btVector3& v) const - { - btScalar s = btSqrt(length2() * v.length2()); - btFullAssert(s != btScalar(0.0)); - return btAcos(dot(v) / s); - } - - /**@brief Return a vector with the absolute values of each element */ - SIMD_FORCE_INLINE btVector3 absolute() const - { -#if defined BT_USE_SIMD_VECTOR3 && defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - return btVector3(_mm_and_ps(mVec128, btv3AbsfMask)); -#elif defined(BT_USE_NEON) - return btVector3(vabsq_f32(mVec128)); -#else - return btVector3( - btFabs(m_floats[0]), - btFabs(m_floats[1]), - btFabs(m_floats[2])); -#endif - } - - /**@brief Return the cross product between this and another vector - * @param v The other vector */ - SIMD_FORCE_INLINE btVector3 cross(const btVector3& v) const - { -#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - __m128 T, V; - - T = bt_pshufd_ps(mVec128, BT_SHUFFLE(1, 2, 0, 3)); // (Y Z X 0) - V = bt_pshufd_ps(v.mVec128, BT_SHUFFLE(1, 2, 0, 3)); // (Y Z X 0) - - V = _mm_mul_ps(V, mVec128); - T = _mm_mul_ps(T, v.mVec128); - V = _mm_sub_ps(V, T); - - V = bt_pshufd_ps(V, BT_SHUFFLE(1, 2, 0, 3)); - return btVector3(V); -#elif defined(BT_USE_NEON) - float32x4_t T, V; - // form (Y, Z, X, _) of mVec128 and v.mVec128 - float32x2_t Tlow = vget_low_f32(mVec128); - float32x2_t Vlow = vget_low_f32(v.mVec128); - T = vcombine_f32(vext_f32(Tlow, vget_high_f32(mVec128), 1), Tlow); - V = vcombine_f32(vext_f32(Vlow, vget_high_f32(v.mVec128), 1), Vlow); - - V = vmulq_f32(V, mVec128); - T = vmulq_f32(T, v.mVec128); - V = vsubq_f32(V, T); - Vlow = vget_low_f32(V); - // form (Y, Z, X, _); - V = vcombine_f32(vext_f32(Vlow, vget_high_f32(V), 1), Vlow); - V = (float32x4_t)vandq_s32((int32x4_t)V, btvFFF0Mask); - - return btVector3(V); -#else - return btVector3( - m_floats[1] * v.m_floats[2] - m_floats[2] * v.m_floats[1], - m_floats[2] * v.m_floats[0] - m_floats[0] * v.m_floats[2], - m_floats[0] * v.m_floats[1] - m_floats[1] * v.m_floats[0]); -#endif - } - - SIMD_FORCE_INLINE btScalar triple(const btVector3& v1, const btVector3& v2) const - { -#if defined BT_USE_SIMD_VECTOR3 && defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - // cross: - __m128 T = _mm_shuffle_ps(v1.mVec128, v1.mVec128, BT_SHUFFLE(1, 2, 0, 3)); // (Y Z X 0) - __m128 V = _mm_shuffle_ps(v2.mVec128, v2.mVec128, BT_SHUFFLE(1, 2, 0, 3)); // (Y Z X 0) - - V = _mm_mul_ps(V, v1.mVec128); - T = _mm_mul_ps(T, v2.mVec128); - V = _mm_sub_ps(V, T); - - V = _mm_shuffle_ps(V, V, BT_SHUFFLE(1, 2, 0, 3)); - - // dot: - V = _mm_mul_ps(V, mVec128); - __m128 z = _mm_movehl_ps(V, V); - __m128 y = _mm_shuffle_ps(V, V, 0x55); - V = _mm_add_ss(V, y); - V = _mm_add_ss(V, z); - return _mm_cvtss_f32(V); - -#elif defined(BT_USE_NEON) - // cross: - float32x4_t T, V; - // form (Y, Z, X, _) of mVec128 and v.mVec128 - float32x2_t Tlow = vget_low_f32(v1.mVec128); - float32x2_t Vlow = vget_low_f32(v2.mVec128); - T = vcombine_f32(vext_f32(Tlow, vget_high_f32(v1.mVec128), 1), Tlow); - V = vcombine_f32(vext_f32(Vlow, vget_high_f32(v2.mVec128), 1), Vlow); - - V = vmulq_f32(V, v1.mVec128); - T = vmulq_f32(T, v2.mVec128); - V = vsubq_f32(V, T); - Vlow = vget_low_f32(V); - // form (Y, Z, X, _); - V = vcombine_f32(vext_f32(Vlow, vget_high_f32(V), 1), Vlow); - - // dot: - V = vmulq_f32(mVec128, V); - float32x2_t x = vpadd_f32(vget_low_f32(V), vget_low_f32(V)); - x = vadd_f32(x, vget_high_f32(V)); - return vget_lane_f32(x, 0); -#else - return m_floats[0] * (v1.m_floats[1] * v2.m_floats[2] - v1.m_floats[2] * v2.m_floats[1]) + - m_floats[1] * (v1.m_floats[2] * v2.m_floats[0] - v1.m_floats[0] * v2.m_floats[2]) + - m_floats[2] * (v1.m_floats[0] * v2.m_floats[1] - v1.m_floats[1] * v2.m_floats[0]); -#endif - } - - /**@brief Return the axis with the smallest value - * Note return values are 0,1,2 for x, y, or z */ - SIMD_FORCE_INLINE int minAxis() const - { - return m_floats[0] < m_floats[1] ? (m_floats[0] < m_floats[2] ? 0 : 2) : (m_floats[1] < m_floats[2] ? 1 : 2); - } - - /**@brief Return the axis with the largest value - * Note return values are 0,1,2 for x, y, or z */ - SIMD_FORCE_INLINE int maxAxis() const - { - return m_floats[0] < m_floats[1] ? (m_floats[1] < m_floats[2] ? 2 : 1) : (m_floats[0] < m_floats[2] ? 2 : 0); - } - - SIMD_FORCE_INLINE int furthestAxis() const - { - return absolute().minAxis(); - } - - SIMD_FORCE_INLINE int closestAxis() const - { - return absolute().maxAxis(); - } - - SIMD_FORCE_INLINE void setInterpolate3(const btVector3& v0, const btVector3& v1, btScalar rt) - { -#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - __m128 vrt = _mm_load_ss(&rt); // (rt 0 0 0) - btScalar s = btScalar(1.0) - rt; - __m128 vs = _mm_load_ss(&s); // (S 0 0 0) - vs = bt_pshufd_ps(vs, 0x80); // (S S S 0.0) - __m128 r0 = _mm_mul_ps(v0.mVec128, vs); - vrt = bt_pshufd_ps(vrt, 0x80); // (rt rt rt 0.0) - __m128 r1 = _mm_mul_ps(v1.mVec128, vrt); - __m128 tmp3 = _mm_add_ps(r0, r1); - mVec128 = tmp3; -#elif defined(BT_USE_NEON) - float32x4_t vl = vsubq_f32(v1.mVec128, v0.mVec128); - vl = vmulq_n_f32(vl, rt); - mVec128 = vaddq_f32(vl, v0.mVec128); -#else - btScalar s = btScalar(1.0) - rt; - m_floats[0] = s * v0.m_floats[0] + rt * v1.m_floats[0]; - m_floats[1] = s * v0.m_floats[1] + rt * v1.m_floats[1]; - m_floats[2] = s * v0.m_floats[2] + rt * v1.m_floats[2]; - //don't do the unused w component - // m_co[3] = s * v0[3] + rt * v1[3]; -#endif - } - - /**@brief Return the linear interpolation between this and another vector - * @param v The other vector - * @param t The ration of this to v (t = 0 => return this, t=1 => return other) */ - SIMD_FORCE_INLINE btVector3 lerp(const btVector3& v, const btScalar& t) const - { -#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - __m128 vt = _mm_load_ss(&t); // (t 0 0 0) - vt = bt_pshufd_ps(vt, 0x80); // (rt rt rt 0.0) - __m128 vl = _mm_sub_ps(v.mVec128, mVec128); - vl = _mm_mul_ps(vl, vt); - vl = _mm_add_ps(vl, mVec128); - - return btVector3(vl); -#elif defined(BT_USE_NEON) - float32x4_t vl = vsubq_f32(v.mVec128, mVec128); - vl = vmulq_n_f32(vl, t); - vl = vaddq_f32(vl, mVec128); - - return btVector3(vl); -#else - return btVector3(m_floats[0] + (v.m_floats[0] - m_floats[0]) * t, - m_floats[1] + (v.m_floats[1] - m_floats[1]) * t, - m_floats[2] + (v.m_floats[2] - m_floats[2]) * t); -#endif - } - - /**@brief Elementwise multiply this vector by the other - * @param v The other vector */ - SIMD_FORCE_INLINE btVector3& operator*=(const btVector3& v) - { -#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - mVec128 = _mm_mul_ps(mVec128, v.mVec128); -#elif defined(BT_USE_NEON) - mVec128 = vmulq_f32(mVec128, v.mVec128); -#else - m_floats[0] *= v.m_floats[0]; - m_floats[1] *= v.m_floats[1]; - m_floats[2] *= v.m_floats[2]; -#endif - return *this; - } - - /**@brief Return the x value */ - SIMD_FORCE_INLINE const btScalar& getX() const { return m_floats[0]; } - /**@brief Return the y value */ - SIMD_FORCE_INLINE const btScalar& getY() const { return m_floats[1]; } - /**@brief Return the z value */ - SIMD_FORCE_INLINE const btScalar& getZ() const { return m_floats[2]; } - /**@brief Set the x value */ - SIMD_FORCE_INLINE void setX(btScalar _x) { m_floats[0] = _x; }; - /**@brief Set the y value */ - SIMD_FORCE_INLINE void setY(btScalar _y) { m_floats[1] = _y; }; - /**@brief Set the z value */ - SIMD_FORCE_INLINE void setZ(btScalar _z) { m_floats[2] = _z; }; - /**@brief Set the w value */ - SIMD_FORCE_INLINE void setW(btScalar _w) { m_floats[3] = _w; }; - /**@brief Return the x value */ - SIMD_FORCE_INLINE const btScalar& x() const { return m_floats[0]; } - /**@brief Return the y value */ - SIMD_FORCE_INLINE const btScalar& y() const { return m_floats[1]; } - /**@brief Return the z value */ - SIMD_FORCE_INLINE const btScalar& z() const { return m_floats[2]; } - /**@brief Return the w value */ - SIMD_FORCE_INLINE const btScalar& w() const { return m_floats[3]; } - - //SIMD_FORCE_INLINE btScalar& operator[](int i) { return (&m_floats[0])[i]; } - //SIMD_FORCE_INLINE const btScalar& operator[](int i) const { return (&m_floats[0])[i]; } - ///operator btScalar*() replaces operator[], using implicit conversion. We added operator != and operator == to avoid pointer comparisons. - SIMD_FORCE_INLINE operator btScalar*() { return &m_floats[0]; } - SIMD_FORCE_INLINE operator const btScalar*() const { return &m_floats[0]; } - - SIMD_FORCE_INLINE bool operator==(const btVector3& other) const - { -#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - return (0xf == _mm_movemask_ps((__m128)_mm_cmpeq_ps(mVec128, other.mVec128))); -#else - return ((m_floats[3] == other.m_floats[3]) && - (m_floats[2] == other.m_floats[2]) && - (m_floats[1] == other.m_floats[1]) && - (m_floats[0] == other.m_floats[0])); -#endif - } - - SIMD_FORCE_INLINE bool operator!=(const btVector3& other) const - { - return !(*this == other); - } - - /**@brief Set each element to the max of the current values and the values of another btVector3 - * @param other The other btVector3 to compare with - */ - SIMD_FORCE_INLINE void setMax(const btVector3& other) - { -#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - mVec128 = _mm_max_ps(mVec128, other.mVec128); -#elif defined(BT_USE_NEON) - mVec128 = vmaxq_f32(mVec128, other.mVec128); -#else - btSetMax(m_floats[0], other.m_floats[0]); - btSetMax(m_floats[1], other.m_floats[1]); - btSetMax(m_floats[2], other.m_floats[2]); - btSetMax(m_floats[3], other.w()); -#endif - } - - /**@brief Set each element to the min of the current values and the values of another btVector3 - * @param other The other btVector3 to compare with - */ - SIMD_FORCE_INLINE void setMin(const btVector3& other) - { -#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - mVec128 = _mm_min_ps(mVec128, other.mVec128); -#elif defined(BT_USE_NEON) - mVec128 = vminq_f32(mVec128, other.mVec128); -#else - btSetMin(m_floats[0], other.m_floats[0]); - btSetMin(m_floats[1], other.m_floats[1]); - btSetMin(m_floats[2], other.m_floats[2]); - btSetMin(m_floats[3], other.w()); -#endif - } - - SIMD_FORCE_INLINE void setValue(const btScalar& _x, const btScalar& _y, const btScalar& _z) - { - m_floats[0] = _x; - m_floats[1] = _y; - m_floats[2] = _z; - m_floats[3] = btScalar(0.f); - } - - void getSkewSymmetricMatrix(btVector3 * v0, btVector3 * v1, btVector3 * v2) const - { -#if defined BT_USE_SIMD_VECTOR3 && defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - - __m128 V = _mm_and_ps(mVec128, btvFFF0fMask); - __m128 V0 = _mm_xor_ps(btvMzeroMask, V); - __m128 V2 = _mm_movelh_ps(V0, V); - - __m128 V1 = _mm_shuffle_ps(V, V0, 0xCE); - - V0 = _mm_shuffle_ps(V0, V, 0xDB); - V2 = _mm_shuffle_ps(V2, V, 0xF9); - - v0->mVec128 = V0; - v1->mVec128 = V1; - v2->mVec128 = V2; -#else - v0->setValue(0., -z(), y()); - v1->setValue(z(), 0., -x()); - v2->setValue(-y(), x(), 0.); -#endif - } - - void setZero() - { -#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - mVec128 = (__m128)_mm_xor_ps(mVec128, mVec128); -#elif defined(BT_USE_NEON) - int32x4_t vi = vdupq_n_s32(0); - mVec128 = vreinterpretq_f32_s32(vi); -#else - setValue(btScalar(0.), btScalar(0.), btScalar(0.)); -#endif - } - - SIMD_FORCE_INLINE bool isZero() const - { - return m_floats[0] == btScalar(0) && m_floats[1] == btScalar(0) && m_floats[2] == btScalar(0); - } - - SIMD_FORCE_INLINE bool fuzzyZero() const - { - return length2() < SIMD_EPSILON * SIMD_EPSILON; - } - - SIMD_FORCE_INLINE void serialize(struct btVector3Data & dataOut) const; - - SIMD_FORCE_INLINE void deSerialize(const struct btVector3DoubleData& dataIn); - - SIMD_FORCE_INLINE void deSerialize(const struct btVector3FloatData& dataIn); - - SIMD_FORCE_INLINE void serializeFloat(struct btVector3FloatData & dataOut) const; - - SIMD_FORCE_INLINE void deSerializeFloat(const struct btVector3FloatData& dataIn); - - SIMD_FORCE_INLINE void serializeDouble(struct btVector3DoubleData & dataOut) const; - - SIMD_FORCE_INLINE void deSerializeDouble(const struct btVector3DoubleData& dataIn); - - /**@brief returns index of maximum dot product between this and vectors in array[] - * @param array The other vectors - * @param array_count The number of other vectors - * @param dotOut The maximum dot product */ - SIMD_FORCE_INLINE long maxDot(const btVector3* array, long array_count, btScalar& dotOut) const; - - /**@brief returns index of minimum dot product between this and vectors in array[] - * @param array The other vectors - * @param array_count The number of other vectors - * @param dotOut The minimum dot product */ - SIMD_FORCE_INLINE long minDot(const btVector3* array, long array_count, btScalar& dotOut) const; - - /* create a vector as btVector3( this->dot( btVector3 v0 ), this->dot( btVector3 v1), this->dot( btVector3 v2 )) */ - SIMD_FORCE_INLINE btVector3 dot3(const btVector3& v0, const btVector3& v1, const btVector3& v2) const - { -#if defined BT_USE_SIMD_VECTOR3 && defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - - __m128 a0 = _mm_mul_ps(v0.mVec128, this->mVec128); - __m128 a1 = _mm_mul_ps(v1.mVec128, this->mVec128); - __m128 a2 = _mm_mul_ps(v2.mVec128, this->mVec128); - __m128 b0 = _mm_unpacklo_ps(a0, a1); - __m128 b1 = _mm_unpackhi_ps(a0, a1); - __m128 b2 = _mm_unpacklo_ps(a2, _mm_setzero_ps()); - __m128 r = _mm_movelh_ps(b0, b2); - r = _mm_add_ps(r, _mm_movehl_ps(b2, b0)); - a2 = _mm_and_ps(a2, btvxyzMaskf); - r = _mm_add_ps(r, btCastdTo128f(_mm_move_sd(btCastfTo128d(a2), btCastfTo128d(b1)))); - return btVector3(r); - -#elif defined(BT_USE_NEON) - static const uint32x4_t xyzMask = (const uint32x4_t){static_cast(-1), static_cast(-1), static_cast(-1), 0}; - float32x4_t a0 = vmulq_f32(v0.mVec128, this->mVec128); - float32x4_t a1 = vmulq_f32(v1.mVec128, this->mVec128); - float32x4_t a2 = vmulq_f32(v2.mVec128, this->mVec128); - float32x2x2_t zLo = vtrn_f32(vget_high_f32(a0), vget_high_f32(a1)); - a2 = (float32x4_t)vandq_u32((uint32x4_t)a2, xyzMask); - float32x2_t b0 = vadd_f32(vpadd_f32(vget_low_f32(a0), vget_low_f32(a1)), zLo.val[0]); - float32x2_t b1 = vpadd_f32(vpadd_f32(vget_low_f32(a2), vget_high_f32(a2)), vdup_n_f32(0.0f)); - return btVector3(vcombine_f32(b0, b1)); -#else - return btVector3(dot(v0), dot(v1), dot(v2)); -#endif - } -}; - -/**@brief Return the sum of two vectors (Point symantics)*/ -SIMD_FORCE_INLINE btVector3 -operator+(const btVector3& v1, const btVector3& v2) -{ -#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - return btVector3(_mm_add_ps(v1.mVec128, v2.mVec128)); -#elif defined(BT_USE_NEON) - return btVector3(vaddq_f32(v1.mVec128, v2.mVec128)); -#else - return btVector3( - v1.m_floats[0] + v2.m_floats[0], - v1.m_floats[1] + v2.m_floats[1], - v1.m_floats[2] + v2.m_floats[2]); -#endif -} - -/**@brief Return the elementwise product of two vectors */ -SIMD_FORCE_INLINE btVector3 -operator*(const btVector3& v1, const btVector3& v2) -{ -#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - return btVector3(_mm_mul_ps(v1.mVec128, v2.mVec128)); -#elif defined(BT_USE_NEON) - return btVector3(vmulq_f32(v1.mVec128, v2.mVec128)); -#else - return btVector3( - v1.m_floats[0] * v2.m_floats[0], - v1.m_floats[1] * v2.m_floats[1], - v1.m_floats[2] * v2.m_floats[2]); -#endif -} - -/**@brief Return the difference between two vectors */ -SIMD_FORCE_INLINE btVector3 -operator-(const btVector3& v1, const btVector3& v2) -{ -#if defined BT_USE_SIMD_VECTOR3 && (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)) - - // without _mm_and_ps this code causes slowdown in Concave moving - __m128 r = _mm_sub_ps(v1.mVec128, v2.mVec128); - return btVector3(_mm_and_ps(r, btvFFF0fMask)); -#elif defined(BT_USE_NEON) - float32x4_t r = vsubq_f32(v1.mVec128, v2.mVec128); - return btVector3((float32x4_t)vandq_s32((int32x4_t)r, btvFFF0Mask)); -#else - return btVector3( - v1.m_floats[0] - v2.m_floats[0], - v1.m_floats[1] - v2.m_floats[1], - v1.m_floats[2] - v2.m_floats[2]); -#endif -} - -/**@brief Return the negative of the vector */ -SIMD_FORCE_INLINE btVector3 -operator-(const btVector3& v) -{ -#if defined BT_USE_SIMD_VECTOR3 && (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)) - __m128 r = _mm_xor_ps(v.mVec128, btvMzeroMask); - return btVector3(_mm_and_ps(r, btvFFF0fMask)); -#elif defined(BT_USE_NEON) - return btVector3((btSimdFloat4)veorq_s32((int32x4_t)v.mVec128, (int32x4_t)btvMzeroMask)); -#else - return btVector3(-v.m_floats[0], -v.m_floats[1], -v.m_floats[2]); -#endif -} - -/**@brief Return the vector scaled by s */ -SIMD_FORCE_INLINE btVector3 -operator*(const btVector3& v, const btScalar& s) -{ -#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - __m128 vs = _mm_load_ss(&s); // (S 0 0 0) - vs = bt_pshufd_ps(vs, 0x80); // (S S S 0.0) - return btVector3(_mm_mul_ps(v.mVec128, vs)); -#elif defined(BT_USE_NEON) - float32x4_t r = vmulq_n_f32(v.mVec128, s); - return btVector3((float32x4_t)vandq_s32((int32x4_t)r, btvFFF0Mask)); -#else - return btVector3(v.m_floats[0] * s, v.m_floats[1] * s, v.m_floats[2] * s); -#endif -} - -/**@brief Return the vector scaled by s */ -SIMD_FORCE_INLINE btVector3 -operator*(const btScalar& s, const btVector3& v) -{ - return v * s; -} - -/**@brief Return the vector inversely scaled by s */ -SIMD_FORCE_INLINE btVector3 -operator/(const btVector3& v, const btScalar& s) -{ - btFullAssert(s != btScalar(0.0)); -#if 0 //defined(BT_USE_SSE_IN_API) -// this code is not faster ! - __m128 vs = _mm_load_ss(&s); - vs = _mm_div_ss(v1110, vs); - vs = bt_pshufd_ps(vs, 0x00); // (S S S S) - - return btVector3(_mm_mul_ps(v.mVec128, vs)); -#else - return v * (btScalar(1.0) / s); -#endif -} - -/**@brief Return the vector inversely scaled by s */ -SIMD_FORCE_INLINE btVector3 -operator/(const btVector3& v1, const btVector3& v2) -{ -#if defined BT_USE_SIMD_VECTOR3 && (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)) - __m128 vec = _mm_div_ps(v1.mVec128, v2.mVec128); - vec = _mm_and_ps(vec, btvFFF0fMask); - return btVector3(vec); -#elif defined(BT_USE_NEON) - float32x4_t x, y, v, m; - - x = v1.mVec128; - y = v2.mVec128; - - v = vrecpeq_f32(y); // v ~ 1/y - m = vrecpsq_f32(y, v); // m = (2-v*y) - v = vmulq_f32(v, m); // vv = v*m ~~ 1/y - m = vrecpsq_f32(y, v); // mm = (2-vv*y) - v = vmulq_f32(v, x); // x*vv - v = vmulq_f32(v, m); // (x*vv)*(2-vv*y) = x*(vv(2-vv*y)) ~~~ x/y - - return btVector3(v); -#else - return btVector3( - v1.m_floats[0] / v2.m_floats[0], - v1.m_floats[1] / v2.m_floats[1], - v1.m_floats[2] / v2.m_floats[2]); -#endif -} - -/**@brief Return the dot product between two vectors */ -SIMD_FORCE_INLINE btScalar -btDot(const btVector3& v1, const btVector3& v2) -{ - return v1.dot(v2); -} - -/**@brief Return the distance squared between two vectors */ -SIMD_FORCE_INLINE btScalar -btDistance2(const btVector3& v1, const btVector3& v2) -{ - return v1.distance2(v2); -} - -/**@brief Return the distance between two vectors */ -SIMD_FORCE_INLINE btScalar -btDistance(const btVector3& v1, const btVector3& v2) -{ - return v1.distance(v2); -} - -/**@brief Return the angle between two vectors */ -SIMD_FORCE_INLINE btScalar -btAngle(const btVector3& v1, const btVector3& v2) -{ - return v1.angle(v2); -} - -/**@brief Return the cross product of two vectors */ -SIMD_FORCE_INLINE btVector3 -btCross(const btVector3& v1, const btVector3& v2) -{ - return v1.cross(v2); -} - -SIMD_FORCE_INLINE btScalar -btTriple(const btVector3& v1, const btVector3& v2, const btVector3& v3) -{ - return v1.triple(v2, v3); -} - -/**@brief Return the linear interpolation between two vectors - * @param v1 One vector - * @param v2 The other vector - * @param t The ration of this to v (t = 0 => return v1, t=1 => return v2) */ -SIMD_FORCE_INLINE btVector3 -lerp(const btVector3& v1, const btVector3& v2, const btScalar& t) -{ - return v1.lerp(v2, t); -} - -SIMD_FORCE_INLINE btScalar btVector3::distance2(const btVector3& v) const -{ - return (v - *this).length2(); -} - -SIMD_FORCE_INLINE btScalar btVector3::distance(const btVector3& v) const -{ - return (v - *this).length(); -} - -SIMD_FORCE_INLINE btVector3 btVector3::normalized() const -{ - btVector3 nrm = *this; - - return nrm.normalize(); -} - -SIMD_FORCE_INLINE btVector3 btVector3::rotate(const btVector3& wAxis, const btScalar _angle) const -{ - // wAxis must be a unit lenght vector - -#if defined BT_USE_SIMD_VECTOR3 && defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - - __m128 O = _mm_mul_ps(wAxis.mVec128, mVec128); - btScalar ssin = btSin(_angle); - __m128 C = wAxis.cross(mVec128).mVec128; - O = _mm_and_ps(O, btvFFF0fMask); - btScalar scos = btCos(_angle); - - __m128 vsin = _mm_load_ss(&ssin); // (S 0 0 0) - __m128 vcos = _mm_load_ss(&scos); // (S 0 0 0) - - __m128 Y = bt_pshufd_ps(O, 0xC9); // (Y Z X 0) - __m128 Z = bt_pshufd_ps(O, 0xD2); // (Z X Y 0) - O = _mm_add_ps(O, Y); - vsin = bt_pshufd_ps(vsin, 0x80); // (S S S 0) - O = _mm_add_ps(O, Z); - vcos = bt_pshufd_ps(vcos, 0x80); // (S S S 0) - - vsin = vsin * C; - O = O * wAxis.mVec128; - __m128 X = mVec128 - O; - - O = O + vsin; - vcos = vcos * X; - O = O + vcos; - - return btVector3(O); -#else - btVector3 o = wAxis * wAxis.dot(*this); - btVector3 _x = *this - o; - btVector3 _y; - - _y = wAxis.cross(*this); - - return (o + _x * btCos(_angle) + _y * btSin(_angle)); -#endif -} - -SIMD_FORCE_INLINE long btVector3::maxDot(const btVector3* array, long array_count, btScalar& dotOut) const -{ -#if (defined BT_USE_SSE && defined BT_USE_SIMD_VECTOR3 && defined BT_USE_SSE_IN_API) || defined(BT_USE_NEON) -#if defined _WIN32 || defined(BT_USE_SSE) - const long scalar_cutoff = 10; - long _maxdot_large(const float* array, const float* vec, unsigned long array_count, float* dotOut); -#elif defined BT_USE_NEON - const long scalar_cutoff = 4; - extern long (*_maxdot_large)(const float* array, const float* vec, unsigned long array_count, float* dotOut); -#endif - if (array_count < scalar_cutoff) -#endif - { - btScalar maxDot1 = -SIMD_INFINITY; - int i = 0; - int ptIndex = -1; - for (i = 0; i < array_count; i++) - { - btScalar dot = array[i].dot(*this); - - if (dot > maxDot1) - { - maxDot1 = dot; - ptIndex = i; - } - } - - dotOut = maxDot1; - return ptIndex; - } -#if (defined BT_USE_SSE && defined BT_USE_SIMD_VECTOR3 && defined BT_USE_SSE_IN_API) || defined(BT_USE_NEON) - return _maxdot_large((float*)array, (float*)&m_floats[0], array_count, &dotOut); -#endif -} - -SIMD_FORCE_INLINE long btVector3::minDot(const btVector3* array, long array_count, btScalar& dotOut) const -{ -#if (defined BT_USE_SSE && defined BT_USE_SIMD_VECTOR3 && defined BT_USE_SSE_IN_API) || defined(BT_USE_NEON) -#if defined BT_USE_SSE - const long scalar_cutoff = 10; - long _mindot_large(const float* array, const float* vec, unsigned long array_count, float* dotOut); -#elif defined BT_USE_NEON - const long scalar_cutoff = 4; - extern long (*_mindot_large)(const float* array, const float* vec, unsigned long array_count, float* dotOut); -#else -#error unhandled arch! -#endif - - if (array_count < scalar_cutoff) -#endif - { - btScalar minDot = SIMD_INFINITY; - int i = 0; - int ptIndex = -1; - - for (i = 0; i < array_count; i++) - { - btScalar dot = array[i].dot(*this); - - if (dot < minDot) - { - minDot = dot; - ptIndex = i; - } - } - - dotOut = minDot; - - return ptIndex; - } -#if (defined BT_USE_SSE && defined BT_USE_SIMD_VECTOR3 && defined BT_USE_SSE_IN_API) || defined(BT_USE_NEON) - return _mindot_large((float*)array, (float*)&m_floats[0], array_count, &dotOut); -#endif //BT_USE_SIMD_VECTOR3 -} - -class btVector4 : public btVector3 -{ -public: - SIMD_FORCE_INLINE btVector4() {} - - SIMD_FORCE_INLINE btVector4(const btScalar& _x, const btScalar& _y, const btScalar& _z, const btScalar& _w) - : btVector3(_x, _y, _z) - { - m_floats[3] = _w; - } - -#if (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)) || defined(BT_USE_NEON) - SIMD_FORCE_INLINE btVector4(const btSimdFloat4 vec) - { - mVec128 = vec; - } - - SIMD_FORCE_INLINE btVector4(const btVector3& rhs) - { - mVec128 = rhs.mVec128; - } - - SIMD_FORCE_INLINE btVector4& - operator=(const btVector4& v) - { - mVec128 = v.mVec128; - return *this; - } -#endif // #if defined (BT_USE_SSE_IN_API) || defined (BT_USE_NEON) - - SIMD_FORCE_INLINE btVector4 absolute4() const - { -#if defined BT_USE_SIMD_VECTOR3 && defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE) - return btVector4(_mm_and_ps(mVec128, btvAbsfMask)); -#elif defined(BT_USE_NEON) - return btVector4(vabsq_f32(mVec128)); -#else - return btVector4( - btFabs(m_floats[0]), - btFabs(m_floats[1]), - btFabs(m_floats[2]), - btFabs(m_floats[3])); -#endif - } - - btScalar getW() const { return m_floats[3]; } - - SIMD_FORCE_INLINE int maxAxis4() const - { - int maxIndex = -1; - btScalar maxVal = btScalar(-BT_LARGE_FLOAT); - if (m_floats[0] > maxVal) - { - maxIndex = 0; - maxVal = m_floats[0]; - } - if (m_floats[1] > maxVal) - { - maxIndex = 1; - maxVal = m_floats[1]; - } - if (m_floats[2] > maxVal) - { - maxIndex = 2; - maxVal = m_floats[2]; - } - if (m_floats[3] > maxVal) - { - maxIndex = 3; - } - - return maxIndex; - } - - SIMD_FORCE_INLINE int minAxis4() const - { - int minIndex = -1; - btScalar minVal = btScalar(BT_LARGE_FLOAT); - if (m_floats[0] < minVal) - { - minIndex = 0; - minVal = m_floats[0]; - } - if (m_floats[1] < minVal) - { - minIndex = 1; - minVal = m_floats[1]; - } - if (m_floats[2] < minVal) - { - minIndex = 2; - minVal = m_floats[2]; - } - if (m_floats[3] < minVal) - { - minIndex = 3; - } - - return minIndex; - } - - SIMD_FORCE_INLINE int closestAxis4() const - { - return absolute4().maxAxis4(); - } - - /**@brief Set x,y,z and zero w - * @param x Value of x - * @param y Value of y - * @param z Value of z - */ - - /* void getValue(btScalar *m) const - { - m[0] = m_floats[0]; - m[1] = m_floats[1]; - m[2] =m_floats[2]; - } -*/ - /**@brief Set the values - * @param x Value of x - * @param y Value of y - * @param z Value of z - * @param w Value of w - */ - SIMD_FORCE_INLINE void setValue(const btScalar& _x, const btScalar& _y, const btScalar& _z, const btScalar& _w) - { - m_floats[0] = _x; - m_floats[1] = _y; - m_floats[2] = _z; - m_floats[3] = _w; - } -}; - -///btSwapVector3Endian swaps vector endianness, useful for network and cross-platform serialization -SIMD_FORCE_INLINE void btSwapScalarEndian(const btScalar& sourceVal, btScalar& destVal) -{ -#ifdef BT_USE_DOUBLE_PRECISION - unsigned char* dest = (unsigned char*)&destVal; - const unsigned char* src = (const unsigned char*)&sourceVal; - dest[0] = src[7]; - dest[1] = src[6]; - dest[2] = src[5]; - dest[3] = src[4]; - dest[4] = src[3]; - dest[5] = src[2]; - dest[6] = src[1]; - dest[7] = src[0]; -#else - unsigned char* dest = (unsigned char*)&destVal; - const unsigned char* src = (const unsigned char*)&sourceVal; - dest[0] = src[3]; - dest[1] = src[2]; - dest[2] = src[1]; - dest[3] = src[0]; -#endif //BT_USE_DOUBLE_PRECISION -} -///btSwapVector3Endian swaps vector endianness, useful for network and cross-platform serialization -SIMD_FORCE_INLINE void btSwapVector3Endian(const btVector3& sourceVec, btVector3& destVec) -{ - for (int i = 0; i < 4; i++) - { - btSwapScalarEndian(sourceVec[i], destVec[i]); - } -} - -///btUnSwapVector3Endian swaps vector endianness, useful for network and cross-platform serialization -SIMD_FORCE_INLINE void btUnSwapVector3Endian(btVector3& vector) -{ - btVector3 swappedVec; - for (int i = 0; i < 4; i++) - { - btSwapScalarEndian(vector[i], swappedVec[i]); - } - vector = swappedVec; -} - -template -SIMD_FORCE_INLINE void btPlaneSpace1(const T& n, T& p, T& q) -{ - if (btFabs(n[2]) > SIMDSQRT12) - { - // choose p in y-z plane - btScalar a = n[1] * n[1] + n[2] * n[2]; - btScalar k = btRecipSqrt(a); - p[0] = 0; - p[1] = -n[2] * k; - p[2] = n[1] * k; - // set q = n x p - q[0] = a * k; - q[1] = -n[0] * p[2]; - q[2] = n[0] * p[1]; - } - else - { - // choose p in x-y plane - btScalar a = n[0] * n[0] + n[1] * n[1]; - btScalar k = btRecipSqrt(a); - p[0] = -n[1] * k; - p[1] = n[0] * k; - p[2] = 0; - // set q = n x p - q[0] = -n[2] * p[1]; - q[1] = n[2] * p[0]; - q[2] = a * k; - } -} - -struct btVector3FloatData -{ - float m_floats[4]; -}; - -struct btVector3DoubleData -{ - double m_floats[4]; -}; - -SIMD_FORCE_INLINE void btVector3::serializeFloat(struct btVector3FloatData& dataOut) const -{ - ///could also do a memcpy, check if it is worth it - for (int i = 0; i < 4; i++) - dataOut.m_floats[i] = float(m_floats[i]); -} - -SIMD_FORCE_INLINE void btVector3::deSerializeFloat(const struct btVector3FloatData& dataIn) -{ - for (int i = 0; i < 4; i++) - m_floats[i] = btScalar(dataIn.m_floats[i]); -} - -SIMD_FORCE_INLINE void btVector3::serializeDouble(struct btVector3DoubleData& dataOut) const -{ - ///could also do a memcpy, check if it is worth it - for (int i = 0; i < 4; i++) - dataOut.m_floats[i] = double(m_floats[i]); -} - -SIMD_FORCE_INLINE void btVector3::deSerializeDouble(const struct btVector3DoubleData& dataIn) -{ - for (int i = 0; i < 4; i++) - m_floats[i] = btScalar(dataIn.m_floats[i]); -} - -SIMD_FORCE_INLINE void btVector3::serialize(struct btVector3Data& dataOut) const -{ - ///could also do a memcpy, check if it is worth it - for (int i = 0; i < 4; i++) - dataOut.m_floats[i] = m_floats[i]; -} - -SIMD_FORCE_INLINE void btVector3::deSerialize(const struct btVector3FloatData& dataIn) -{ - for (int i = 0; i < 4; i++) - m_floats[i] = (btScalar)dataIn.m_floats[i]; -} - -SIMD_FORCE_INLINE void btVector3::deSerialize(const struct btVector3DoubleData& dataIn) -{ - for (int i = 0; i < 4; i++) - m_floats[i] = (btScalar)dataIn.m_floats[i]; -} - -#endif //BT_VECTOR3_H diff --git a/engine/inc/bullet/LuaDemo/LuaPhysicsSetup.h b/engine/inc/bullet/LuaDemo/LuaPhysicsSetup.h deleted file mode 100644 index 76d91238..00000000 --- a/engine/inc/bullet/LuaDemo/LuaPhysicsSetup.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _LUA_PHYSICS_SETUP_H -#define _LUA_PHYSICS_SETUP_H - -class CommonExampleInterface* LuaDemoCreateFunc(struct CommonExampleOptions& options); - -#endif //_LUA_PHYSICS_SETUP_H diff --git a/engine/inc/bullet/MultiBody/InvertedPendulumPDControl.h b/engine/inc/bullet/MultiBody/InvertedPendulumPDControl.h deleted file mode 100644 index b108f292..00000000 --- a/engine/inc/bullet/MultiBody/InvertedPendulumPDControl.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef INVERTED_PENDULUM_PD_CONTROL_H -#define INVERTED_PENDULUM_PD_CONTROL_H - -class CommonExampleInterface* InvertedPendulumPDControlCreateFunc(struct CommonExampleOptions& options); - -#endif //INVERTED_PENDULUM_PD_CONTROL_H diff --git a/engine/inc/bullet/MultiBody/KinematicMultiBodyExample.h b/engine/inc/bullet/MultiBody/KinematicMultiBodyExample.h deleted file mode 100644 index 1d6f44bb..00000000 --- a/engine/inc/bullet/MultiBody/KinematicMultiBodyExample.h +++ /dev/null @@ -1,21 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2015 Google Inc. http://bulletphysics.org - -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 KINEMATIC_MULTI_BODY_EXAMPLE_H -#define KINEMATIC_MULTI_BODY_EXAMPLE_H - -class CommonExampleInterface* KinematicMultiBodyExampleCreateFunc(struct CommonExampleOptions& options); - -#endif //KINEMATIC_MULTI_BODY_EXAMPLE_H diff --git a/engine/inc/bullet/MultiBody/MultiBodyConstraintFeedback.h b/engine/inc/bullet/MultiBody/MultiBodyConstraintFeedback.h deleted file mode 100644 index 333d7efb..00000000 --- a/engine/inc/bullet/MultiBody/MultiBodyConstraintFeedback.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef MULTIBODY_CONSTRAINT_FEEDBACK_H -#define MULTIBODY_CONSTRAINT_FEEDBACK_H - -class CommonExampleInterface* MultiBodyConstraintFeedbackCreateFunc(struct CommonExampleOptions& options); - -#endif //MULTIBODY_CONSTRAINT_FEEDBACK_H diff --git a/engine/inc/bullet/MultiBody/MultiBodySoftContact.h b/engine/inc/bullet/MultiBody/MultiBodySoftContact.h deleted file mode 100644 index aebfda74..00000000 --- a/engine/inc/bullet/MultiBody/MultiBodySoftContact.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef MULTI_BODY_SOFT_CONTACT_H -#define MULTI_BODY_SOFT_CONTACT_H - -class CommonExampleInterface* MultiBodySoftContactCreateFunc(struct CommonExampleOptions& options); - -#endif //MULTI_BODY_SOFT_CONTACT_H diff --git a/engine/inc/bullet/MultiBody/MultiDofDemo.h b/engine/inc/bullet/MultiBody/MultiDofDemo.h deleted file mode 100644 index bf640e17..00000000 --- a/engine/inc/bullet/MultiBody/MultiDofDemo.h +++ /dev/null @@ -1,7 +0,0 @@ - -#ifndef MULTI_DOF_DEMO_H -#define MULTI_DOF_DEMO_H - -class CommonExampleInterface* MultiDofCreateFunc(struct CommonExampleOptions& options); - -#endif //MULTI_DOF_DEMO_H diff --git a/engine/inc/bullet/MultiBody/Pendulum.h b/engine/inc/bullet/MultiBody/Pendulum.h deleted file mode 100644 index 28a5150c..00000000 --- a/engine/inc/bullet/MultiBody/Pendulum.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef TEST_PENDULUM_H -#define TEST_PENDULUM_H - -class CommonExampleInterface* TestPendulumCreateFunc(struct CommonExampleOptions& options); - -#endif //TEST_PENDULUM_H diff --git a/engine/inc/bullet/MultiBody/SerialChains.h b/engine/inc/bullet/MultiBody/SerialChains.h deleted file mode 100644 index aa7d75ec..00000000 --- a/engine/inc/bullet/MultiBody/SerialChains.h +++ /dev/null @@ -1,7 +0,0 @@ - -#ifndef MULTI_BODY_CONSTRAINT_SOLVERS_DEMO_H -#define MULTI_BODY_CONSTRAINT_SOLVERS_DEMO_H - -class CommonExampleInterface* SerialChainsCreateFunc(struct CommonExampleOptions& options); - -#endif //MULTI_BODY_CONSTRAINT_SOLVERS_DEMO_H diff --git a/engine/inc/bullet/MultiBody/TestJointTorqueSetup.h b/engine/inc/bullet/MultiBody/TestJointTorqueSetup.h deleted file mode 100644 index 60a2d67a..00000000 --- a/engine/inc/bullet/MultiBody/TestJointTorqueSetup.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef TEST_JOINT_TORQUE_SETUP_H -#define TEST_JOINT_TORQUE_SETUP_H - -class CommonExampleInterface* TestJointTorqueCreateFunc(struct CommonExampleOptions& options); - -#endif //TEST_JOINT_TORQUE_SETUP_H diff --git a/engine/inc/bullet/MultiBody/pendulum_gold.h b/engine/inc/bullet/MultiBody/pendulum_gold.h deleted file mode 100644 index 8530a80d..00000000 --- a/engine/inc/bullet/MultiBody/pendulum_gold.h +++ /dev/null @@ -1,2057 +0,0 @@ -#ifndef PENDULUM_GOLD_H -#define PENDULUM_GOLD_H - -#include "LinearMath/btScalar.h" - -/* -sPendulumGold data was created using the Python script, -thanks to Andreas Bihlmaier for the script. - -#!/usr/bin/env python - -from __future__ import print_function - -import numpy as np -from scipy import integrate -import pylab as pl -import math -import argparse - -theta_pos = 0 -dtheta_pos = 1 - -def pendulum_system(Y, t): - m = 10 # [kg] - g = 9.81 # [m/s^2] - l = 0.5 # [m] - tau = 20 # [Nm] - I = m * pow(l, 2) # inertia - return [Y[dtheta_pos], (tau - m*g*l*math.sin(Y[theta_pos])) / I] - -def main(): - parser = argparse.ArgumentParser() - parser.add_argument('--plot', action='store_true', default=False, help='Plot results') - args = parser.parse_args() - - t = np.arange(0, 2, 0.001) # [s] - theta0 = 0 - dtheta0 = 0 - theta = integrate.odeint(pendulum_system, [theta0, dtheta0], t) # [rad] - print("timestamp;theta;") - for i in range(theta.shape[0]): - print("%f;%f;" % (t[i], theta[i,theta_pos])) - - if args.plot: - pl.plot(t, theta[:,theta_pos], '+') - pl.show() - - -if __name__ == '__main__': - main() -*/ - -//sPendulumGold stores scalar values of a simulated pendulum in tuples 'timestamp' and 'theta joint angle' -static btScalar sPendulumGold[] = - { - 0.000000, 0.000000, - 0.001000, 0.000004, - 0.002000, 0.000016, - 0.003000, 0.000036, - 0.004000, 0.000064, - 0.005000, 0.000100, - 0.006000, 0.000144, - 0.007000, 0.000196, - 0.008000, 0.000256, - 0.009000, 0.000324, - 0.010000, 0.000400, - 0.011000, 0.000484, - 0.012000, 0.000576, - 0.013000, 0.000676, - 0.014000, 0.000784, - 0.015000, 0.000900, - 0.016000, 0.001024, - 0.017000, 0.001155, - 0.018000, 0.001295, - 0.019000, 0.001443, - 0.020000, 0.001599, - 0.021000, 0.001763, - 0.022000, 0.001934, - 0.023000, 0.002114, - 0.024000, 0.002302, - 0.025000, 0.002497, - 0.026000, 0.002701, - 0.027000, 0.002913, - 0.028000, 0.003132, - 0.029000, 0.003359, - 0.030000, 0.003595, - 0.031000, 0.003838, - 0.032000, 0.004089, - 0.033000, 0.004348, - 0.034000, 0.004615, - 0.035000, 0.004890, - 0.036000, 0.005173, - 0.037000, 0.005464, - 0.038000, 0.005762, - 0.039000, 0.006069, - 0.040000, 0.006383, - 0.041000, 0.006706, - 0.042000, 0.007036, - 0.043000, 0.007374, - 0.044000, 0.007720, - 0.045000, 0.008073, - 0.046000, 0.008435, - 0.047000, 0.008804, - 0.048000, 0.009181, - 0.049000, 0.009566, - 0.050000, 0.009959, - 0.051000, 0.010360, - 0.052000, 0.010768, - 0.053000, 0.011184, - 0.054000, 0.011608, - 0.055000, 0.012040, - 0.056000, 0.012480, - 0.057000, 0.012927, - 0.058000, 0.013382, - 0.059000, 0.013845, - 0.060000, 0.014315, - 0.061000, 0.014794, - 0.062000, 0.015280, - 0.063000, 0.015773, - 0.064000, 0.016275, - 0.065000, 0.016784, - 0.066000, 0.017300, - 0.067000, 0.017825, - 0.068000, 0.018357, - 0.069000, 0.018896, - 0.070000, 0.019443, - 0.071000, 0.019998, - 0.072000, 0.020561, - 0.073000, 0.021131, - 0.074000, 0.021709, - 0.075000, 0.022294, - 0.076000, 0.022887, - 0.077000, 0.023487, - 0.078000, 0.024095, - 0.079000, 0.024710, - 0.080000, 0.025333, - 0.081000, 0.025964, - 0.082000, 0.026602, - 0.083000, 0.027247, - 0.084000, 0.027900, - 0.085000, 0.028560, - 0.086000, 0.029228, - 0.087000, 0.029903, - 0.088000, 0.030586, - 0.089000, 0.031276, - 0.090000, 0.031973, - 0.091000, 0.032678, - 0.092000, 0.033390, - 0.093000, 0.034110, - 0.094000, 0.034836, - 0.095000, 0.035570, - 0.096000, 0.036312, - 0.097000, 0.037061, - 0.098000, 0.037817, - 0.099000, 0.038580, - 0.100000, 0.039350, - 0.101000, 0.040128, - 0.102000, 0.040913, - 0.103000, 0.041705, - 0.104000, 0.042504, - 0.105000, 0.043311, - 0.106000, 0.044124, - 0.107000, 0.044945, - 0.108000, 0.045773, - 0.109000, 0.046608, - 0.110000, 0.047450, - 0.111000, 0.048299, - 0.112000, 0.049155, - 0.113000, 0.050019, - 0.114000, 0.050889, - 0.115000, 0.051766, - 0.116000, 0.052650, - 0.117000, 0.053542, - 0.118000, 0.054440, - 0.119000, 0.055345, - 0.120000, 0.056257, - 0.121000, 0.057176, - 0.122000, 0.058101, - 0.123000, 0.059034, - 0.124000, 0.059973, - 0.125000, 0.060920, - 0.126000, 0.061873, - 0.127000, 0.062833, - 0.128000, 0.063799, - 0.129000, 0.064773, - 0.130000, 0.065753, - 0.131000, 0.066740, - 0.132000, 0.067733, - 0.133000, 0.068734, - 0.134000, 0.069740, - 0.135000, 0.070754, - 0.136000, 0.071774, - 0.137000, 0.072801, - 0.138000, 0.073834, - 0.139000, 0.074874, - 0.140000, 0.075920, - 0.141000, 0.076973, - 0.142000, 0.078032, - 0.143000, 0.079098, - 0.144000, 0.080170, - 0.145000, 0.081249, - 0.146000, 0.082334, - 0.147000, 0.083426, - 0.148000, 0.084524, - 0.149000, 0.085628, - 0.150000, 0.086738, - 0.151000, 0.087855, - 0.152000, 0.088978, - 0.153000, 0.090108, - 0.154000, 0.091243, - 0.155000, 0.092385, - 0.156000, 0.093533, - 0.157000, 0.094687, - 0.158000, 0.095848, - 0.159000, 0.097014, - 0.160000, 0.098187, - 0.161000, 0.099365, - 0.162000, 0.100550, - 0.163000, 0.101741, - 0.164000, 0.102937, - 0.165000, 0.104140, - 0.166000, 0.105349, - 0.167000, 0.106563, - 0.168000, 0.107784, - 0.169000, 0.109010, - 0.170000, 0.110242, - 0.171000, 0.111480, - 0.172000, 0.112724, - 0.173000, 0.113974, - 0.174000, 0.115230, - 0.175000, 0.116491, - 0.176000, 0.117758, - 0.177000, 0.119030, - 0.178000, 0.120309, - 0.179000, 0.121593, - 0.180000, 0.122882, - 0.181000, 0.124177, - 0.182000, 0.125478, - 0.183000, 0.126784, - 0.184000, 0.128096, - 0.185000, 0.129413, - 0.186000, 0.130736, - 0.187000, 0.132064, - 0.188000, 0.133398, - 0.189000, 0.134737, - 0.190000, 0.136081, - 0.191000, 0.137431, - 0.192000, 0.138786, - 0.193000, 0.140146, - 0.194000, 0.141512, - 0.195000, 0.142883, - 0.196000, 0.144259, - 0.197000, 0.145640, - 0.198000, 0.147026, - 0.199000, 0.148418, - 0.200000, 0.149814, - 0.201000, 0.151216, - 0.202000, 0.152623, - 0.203000, 0.154034, - 0.204000, 0.155451, - 0.205000, 0.156873, - 0.206000, 0.158299, - 0.207000, 0.159731, - 0.208000, 0.161167, - 0.209000, 0.162608, - 0.210000, 0.164054, - 0.211000, 0.165505, - 0.212000, 0.166961, - 0.213000, 0.168421, - 0.214000, 0.169886, - 0.215000, 0.171356, - 0.216000, 0.172830, - 0.217000, 0.174309, - 0.218000, 0.175793, - 0.219000, 0.177281, - 0.220000, 0.178774, - 0.221000, 0.180271, - 0.222000, 0.181773, - 0.223000, 0.183279, - 0.224000, 0.184790, - 0.225000, 0.186305, - 0.226000, 0.187824, - 0.227000, 0.189348, - 0.228000, 0.190876, - 0.229000, 0.192408, - 0.230000, 0.193945, - 0.231000, 0.195485, - 0.232000, 0.197030, - 0.233000, 0.198579, - 0.234000, 0.200133, - 0.235000, 0.201690, - 0.236000, 0.203251, - 0.237000, 0.204817, - 0.238000, 0.206386, - 0.239000, 0.207960, - 0.240000, 0.209537, - 0.241000, 0.211118, - 0.242000, 0.212703, - 0.243000, 0.214293, - 0.244000, 0.215885, - 0.245000, 0.217482, - 0.246000, 0.219082, - 0.247000, 0.220687, - 0.248000, 0.222295, - 0.249000, 0.223906, - 0.250000, 0.225521, - 0.251000, 0.227140, - 0.252000, 0.228762, - 0.253000, 0.230388, - 0.254000, 0.232018, - 0.255000, 0.233651, - 0.256000, 0.235287, - 0.257000, 0.236927, - 0.258000, 0.238570, - 0.259000, 0.240217, - 0.260000, 0.241867, - 0.261000, 0.243520, - 0.262000, 0.245176, - 0.263000, 0.246836, - 0.264000, 0.248499, - 0.265000, 0.250165, - 0.266000, 0.251834, - 0.267000, 0.253507, - 0.268000, 0.255182, - 0.269000, 0.256861, - 0.270000, 0.258542, - 0.271000, 0.260227, - 0.272000, 0.261914, - 0.273000, 0.263604, - 0.274000, 0.265298, - 0.275000, 0.266994, - 0.276000, 0.268693, - 0.277000, 0.270394, - 0.278000, 0.272099, - 0.279000, 0.273806, - 0.280000, 0.275516, - 0.281000, 0.277229, - 0.282000, 0.278944, - 0.283000, 0.280662, - 0.284000, 0.282382, - 0.285000, 0.284105, - 0.286000, 0.285830, - 0.287000, 0.287558, - 0.288000, 0.289288, - 0.289000, 0.291021, - 0.290000, 0.292756, - 0.291000, 0.294493, - 0.292000, 0.296233, - 0.293000, 0.297975, - 0.294000, 0.299719, - 0.295000, 0.301466, - 0.296000, 0.303214, - 0.297000, 0.304965, - 0.298000, 0.306718, - 0.299000, 0.308473, - 0.300000, 0.310230, - 0.301000, 0.311989, - 0.302000, 0.313750, - 0.303000, 0.315513, - 0.304000, 0.317278, - 0.305000, 0.319044, - 0.306000, 0.320813, - 0.307000, 0.322583, - 0.308000, 0.324355, - 0.309000, 0.326129, - 0.310000, 0.327905, - 0.311000, 0.329682, - 0.312000, 0.331461, - 0.313000, 0.333241, - 0.314000, 0.335024, - 0.315000, 0.336807, - 0.316000, 0.338592, - 0.317000, 0.340379, - 0.318000, 0.342167, - 0.319000, 0.343957, - 0.320000, 0.345748, - 0.321000, 0.347540, - 0.322000, 0.349334, - 0.323000, 0.351128, - 0.324000, 0.352925, - 0.325000, 0.354722, - 0.326000, 0.356520, - 0.327000, 0.358320, - 0.328000, 0.360121, - 0.329000, 0.361923, - 0.330000, 0.363726, - 0.331000, 0.365530, - 0.332000, 0.367335, - 0.333000, 0.369141, - 0.334000, 0.370947, - 0.335000, 0.372755, - 0.336000, 0.374564, - 0.337000, 0.376373, - 0.338000, 0.378183, - 0.339000, 0.379994, - 0.340000, 0.381806, - 0.341000, 0.383618, - 0.342000, 0.385431, - 0.343000, 0.387245, - 0.344000, 0.389059, - 0.345000, 0.390874, - 0.346000, 0.392689, - 0.347000, 0.394505, - 0.348000, 0.396321, - 0.349000, 0.398138, - 0.350000, 0.399955, - 0.351000, 0.401772, - 0.352000, 0.403590, - 0.353000, 0.405408, - 0.354000, 0.407226, - 0.355000, 0.409045, - 0.356000, 0.410864, - 0.357000, 0.412682, - 0.358000, 0.414501, - 0.359000, 0.416321, - 0.360000, 0.418140, - 0.361000, 0.419959, - 0.362000, 0.421778, - 0.363000, 0.423597, - 0.364000, 0.425417, - 0.365000, 0.427236, - 0.366000, 0.429055, - 0.367000, 0.430873, - 0.368000, 0.432692, - 0.369000, 0.434510, - 0.370000, 0.436328, - 0.371000, 0.438146, - 0.372000, 0.439963, - 0.373000, 0.441781, - 0.374000, 0.443597, - 0.375000, 0.445413, - 0.376000, 0.447229, - 0.377000, 0.449045, - 0.378000, 0.450859, - 0.379000, 0.452674, - 0.380000, 0.454487, - 0.381000, 0.456301, - 0.382000, 0.458113, - 0.383000, 0.459925, - 0.384000, 0.461736, - 0.385000, 0.463546, - 0.386000, 0.465356, - 0.387000, 0.467164, - 0.388000, 0.468972, - 0.389000, 0.470779, - 0.390000, 0.472585, - 0.391000, 0.474391, - 0.392000, 0.476195, - 0.393000, 0.477998, - 0.394000, 0.479800, - 0.395000, 0.481601, - 0.396000, 0.483402, - 0.397000, 0.485200, - 0.398000, 0.486998, - 0.399000, 0.488795, - 0.400000, 0.490590, - 0.401000, 0.492384, - 0.402000, 0.494177, - 0.403000, 0.495969, - 0.404000, 0.497759, - 0.405000, 0.499548, - 0.406000, 0.501336, - 0.407000, 0.503122, - 0.408000, 0.504906, - 0.409000, 0.506689, - 0.410000, 0.508471, - 0.411000, 0.510251, - 0.412000, 0.512029, - 0.413000, 0.513806, - 0.414000, 0.515581, - 0.415000, 0.517355, - 0.416000, 0.519127, - 0.417000, 0.520897, - 0.418000, 0.522665, - 0.419000, 0.524432, - 0.420000, 0.526196, - 0.421000, 0.527959, - 0.422000, 0.529720, - 0.423000, 0.531479, - 0.424000, 0.533236, - 0.425000, 0.534991, - 0.426000, 0.536745, - 0.427000, 0.538496, - 0.428000, 0.540245, - 0.429000, 0.541992, - 0.430000, 0.543736, - 0.431000, 0.545479, - 0.432000, 0.547220, - 0.433000, 0.548958, - 0.434000, 0.550694, - 0.435000, 0.552428, - 0.436000, 0.554159, - 0.437000, 0.555888, - 0.438000, 0.557615, - 0.439000, 0.559340, - 0.440000, 0.561062, - 0.441000, 0.562781, - 0.442000, 0.564498, - 0.443000, 0.566213, - 0.444000, 0.567925, - 0.445000, 0.569634, - 0.446000, 0.571341, - 0.447000, 0.573046, - 0.448000, 0.574747, - 0.449000, 0.576446, - 0.450000, 0.578143, - 0.451000, 0.579836, - 0.452000, 0.581527, - 0.453000, 0.583215, - 0.454000, 0.584901, - 0.455000, 0.586583, - 0.456000, 0.588263, - 0.457000, 0.589939, - 0.458000, 0.591613, - 0.459000, 0.593284, - 0.460000, 0.594952, - 0.461000, 0.596617, - 0.462000, 0.598279, - 0.463000, 0.599937, - 0.464000, 0.601593, - 0.465000, 0.603246, - 0.466000, 0.604895, - 0.467000, 0.606542, - 0.468000, 0.608185, - 0.469000, 0.609825, - 0.470000, 0.611461, - 0.471000, 0.613095, - 0.472000, 0.614725, - 0.473000, 0.616352, - 0.474000, 0.617975, - 0.475000, 0.619595, - 0.476000, 0.621212, - 0.477000, 0.622825, - 0.478000, 0.624435, - 0.479000, 0.626042, - 0.480000, 0.627645, - 0.481000, 0.629244, - 0.482000, 0.630840, - 0.483000, 0.632432, - 0.484000, 0.634021, - 0.485000, 0.635606, - 0.486000, 0.637187, - 0.487000, 0.638765, - 0.488000, 0.640339, - 0.489000, 0.641909, - 0.490000, 0.643476, - 0.491000, 0.645039, - 0.492000, 0.646598, - 0.493000, 0.648153, - 0.494000, 0.649704, - 0.495000, 0.651252, - 0.496000, 0.652795, - 0.497000, 0.654335, - 0.498000, 0.655870, - 0.499000, 0.657402, - 0.500000, 0.658930, - 0.501000, 0.660454, - 0.502000, 0.661973, - 0.503000, 0.663489, - 0.504000, 0.665001, - 0.505000, 0.666508, - 0.506000, 0.668011, - 0.507000, 0.669511, - 0.508000, 0.671006, - 0.509000, 0.672496, - 0.510000, 0.673983, - 0.511000, 0.675465, - 0.512000, 0.676943, - 0.513000, 0.678417, - 0.514000, 0.679886, - 0.515000, 0.681352, - 0.516000, 0.682812, - 0.517000, 0.684269, - 0.518000, 0.685721, - 0.519000, 0.687168, - 0.520000, 0.688611, - 0.521000, 0.690050, - 0.522000, 0.691484, - 0.523000, 0.692914, - 0.524000, 0.694339, - 0.525000, 0.695759, - 0.526000, 0.697175, - 0.527000, 0.698587, - 0.528000, 0.699994, - 0.529000, 0.701396, - 0.530000, 0.702793, - 0.531000, 0.704186, - 0.532000, 0.705574, - 0.533000, 0.706957, - 0.534000, 0.708336, - 0.535000, 0.709710, - 0.536000, 0.711079, - 0.537000, 0.712443, - 0.538000, 0.713803, - 0.539000, 0.715157, - 0.540000, 0.716507, - 0.541000, 0.717852, - 0.542000, 0.719192, - 0.543000, 0.720527, - 0.544000, 0.721857, - 0.545000, 0.723182, - 0.546000, 0.724502, - 0.547000, 0.725817, - 0.548000, 0.727127, - 0.549000, 0.728432, - 0.550000, 0.729732, - 0.551000, 0.731027, - 0.552000, 0.732317, - 0.553000, 0.733602, - 0.554000, 0.734881, - 0.555000, 0.736155, - 0.556000, 0.737425, - 0.557000, 0.738689, - 0.558000, 0.739948, - 0.559000, 0.741201, - 0.560000, 0.742449, - 0.561000, 0.743693, - 0.562000, 0.744930, - 0.563000, 0.746163, - 0.564000, 0.747390, - 0.565000, 0.748612, - 0.566000, 0.749828, - 0.567000, 0.751039, - 0.568000, 0.752245, - 0.569000, 0.753446, - 0.570000, 0.754640, - 0.571000, 0.755830, - 0.572000, 0.757014, - 0.573000, 0.758192, - 0.574000, 0.759365, - 0.575000, 0.760533, - 0.576000, 0.761695, - 0.577000, 0.762851, - 0.578000, 0.764002, - 0.579000, 0.765148, - 0.580000, 0.766287, - 0.581000, 0.767422, - 0.582000, 0.768550, - 0.583000, 0.769673, - 0.584000, 0.770790, - 0.585000, 0.771902, - 0.586000, 0.773008, - 0.587000, 0.774108, - 0.588000, 0.775202, - 0.589000, 0.776291, - 0.590000, 0.777374, - 0.591000, 0.778451, - 0.592000, 0.779522, - 0.593000, 0.780588, - 0.594000, 0.781648, - 0.595000, 0.782702, - 0.596000, 0.783750, - 0.597000, 0.784792, - 0.598000, 0.785829, - 0.599000, 0.786860, - 0.600000, 0.787884, - 0.601000, 0.788903, - 0.602000, 0.789916, - 0.603000, 0.790923, - 0.604000, 0.791924, - 0.605000, 0.792919, - 0.606000, 0.793908, - 0.607000, 0.794891, - 0.608000, 0.795868, - 0.609000, 0.796839, - 0.610000, 0.797804, - 0.611000, 0.798763, - 0.612000, 0.799716, - 0.613000, 0.800663, - 0.614000, 0.801603, - 0.615000, 0.802538, - 0.616000, 0.803466, - 0.617000, 0.804389, - 0.618000, 0.805305, - 0.619000, 0.806215, - 0.620000, 0.807119, - 0.621000, 0.808017, - 0.622000, 0.808909, - 0.623000, 0.809794, - 0.624000, 0.810673, - 0.625000, 0.811546, - 0.626000, 0.812413, - 0.627000, 0.813274, - 0.628000, 0.814128, - 0.629000, 0.814976, - 0.630000, 0.815817, - 0.631000, 0.816653, - 0.632000, 0.817482, - 0.633000, 0.818305, - 0.634000, 0.819121, - 0.635000, 0.819931, - 0.636000, 0.820735, - 0.637000, 0.821533, - 0.638000, 0.822324, - 0.639000, 0.823109, - 0.640000, 0.823887, - 0.641000, 0.824659, - 0.642000, 0.825424, - 0.643000, 0.826183, - 0.644000, 0.826936, - 0.645000, 0.827682, - 0.646000, 0.828422, - 0.647000, 0.829156, - 0.648000, 0.829882, - 0.649000, 0.830603, - 0.650000, 0.831317, - 0.651000, 0.832024, - 0.652000, 0.832725, - 0.653000, 0.833419, - 0.654000, 0.834107, - 0.655000, 0.834789, - 0.656000, 0.835463, - 0.657000, 0.836132, - 0.658000, 0.836793, - 0.659000, 0.837448, - 0.660000, 0.838097, - 0.661000, 0.838739, - 0.662000, 0.839374, - 0.663000, 0.840003, - 0.664000, 0.840625, - 0.665000, 0.841241, - 0.666000, 0.841850, - 0.667000, 0.842452, - 0.668000, 0.843048, - 0.669000, 0.843637, - 0.670000, 0.844219, - 0.671000, 0.844795, - 0.672000, 0.845364, - 0.673000, 0.845926, - 0.674000, 0.846481, - 0.675000, 0.847030, - 0.676000, 0.847573, - 0.677000, 0.848108, - 0.678000, 0.848637, - 0.679000, 0.849159, - 0.680000, 0.849674, - 0.681000, 0.850183, - 0.682000, 0.850685, - 0.683000, 0.851180, - 0.684000, 0.851668, - 0.685000, 0.852150, - 0.686000, 0.852625, - 0.687000, 0.853093, - 0.688000, 0.853554, - 0.689000, 0.854009, - 0.690000, 0.854456, - 0.691000, 0.854897, - 0.692000, 0.855331, - 0.693000, 0.855759, - 0.694000, 0.856179, - 0.695000, 0.856593, - 0.696000, 0.857000, - 0.697000, 0.857400, - 0.698000, 0.857793, - 0.699000, 0.858179, - 0.700000, 0.858559, - 0.701000, 0.858931, - 0.702000, 0.859297, - 0.703000, 0.859656, - 0.704000, 0.860008, - 0.705000, 0.860353, - 0.706000, 0.860691, - 0.707000, 0.861023, - 0.708000, 0.861347, - 0.709000, 0.861665, - 0.710000, 0.861976, - 0.711000, 0.862280, - 0.712000, 0.862577, - 0.713000, 0.862867, - 0.714000, 0.863150, - 0.715000, 0.863426, - 0.716000, 0.863696, - 0.717000, 0.863958, - 0.718000, 0.864214, - 0.719000, 0.864462, - 0.720000, 0.864704, - 0.721000, 0.864939, - 0.722000, 0.865166, - 0.723000, 0.865387, - 0.724000, 0.865601, - 0.725000, 0.865808, - 0.726000, 0.866008, - 0.727000, 0.866201, - 0.728000, 0.866388, - 0.729000, 0.866567, - 0.730000, 0.866739, - 0.731000, 0.866904, - 0.732000, 0.867063, - 0.733000, 0.867214, - 0.734000, 0.867358, - 0.735000, 0.867496, - 0.736000, 0.867626, - 0.737000, 0.867750, - 0.738000, 0.867867, - 0.739000, 0.867976, - 0.740000, 0.868079, - 0.741000, 0.868174, - 0.742000, 0.868263, - 0.743000, 0.868345, - 0.744000, 0.868420, - 0.745000, 0.868487, - 0.746000, 0.868548, - 0.747000, 0.868602, - 0.748000, 0.868649, - 0.749000, 0.868689, - 0.750000, 0.868721, - 0.751000, 0.868747, - 0.752000, 0.868766, - 0.753000, 0.868778, - 0.754000, 0.868783, - 0.755000, 0.868781, - 0.756000, 0.868772, - 0.757000, 0.868756, - 0.758000, 0.868733, - 0.759000, 0.868703, - 0.760000, 0.868666, - 0.761000, 0.868622, - 0.762000, 0.868571, - 0.763000, 0.868513, - 0.764000, 0.868449, - 0.765000, 0.868377, - 0.766000, 0.868298, - 0.767000, 0.868212, - 0.768000, 0.868119, - 0.769000, 0.868020, - 0.770000, 0.867913, - 0.771000, 0.867799, - 0.772000, 0.867679, - 0.773000, 0.867551, - 0.774000, 0.867416, - 0.775000, 0.867275, - 0.776000, 0.867126, - 0.777000, 0.866971, - 0.778000, 0.866809, - 0.779000, 0.866639, - 0.780000, 0.866463, - 0.781000, 0.866280, - 0.782000, 0.866089, - 0.783000, 0.865892, - 0.784000, 0.865688, - 0.785000, 0.865477, - 0.786000, 0.865259, - 0.787000, 0.865034, - 0.788000, 0.864802, - 0.789000, 0.864564, - 0.790000, 0.864318, - 0.791000, 0.864065, - 0.792000, 0.863806, - 0.793000, 0.863539, - 0.794000, 0.863266, - 0.795000, 0.862985, - 0.796000, 0.862698, - 0.797000, 0.862404, - 0.798000, 0.862103, - 0.799000, 0.861795, - 0.800000, 0.861480, - 0.801000, 0.861159, - 0.802000, 0.860830, - 0.803000, 0.860495, - 0.804000, 0.860152, - 0.805000, 0.859803, - 0.806000, 0.859447, - 0.807000, 0.859084, - 0.808000, 0.858714, - 0.809000, 0.858338, - 0.810000, 0.857954, - 0.811000, 0.857564, - 0.812000, 0.857167, - 0.813000, 0.856763, - 0.814000, 0.856352, - 0.815000, 0.855934, - 0.816000, 0.855510, - 0.817000, 0.855079, - 0.818000, 0.854641, - 0.819000, 0.854196, - 0.820000, 0.853744, - 0.821000, 0.853286, - 0.822000, 0.852820, - 0.823000, 0.852348, - 0.824000, 0.851869, - 0.825000, 0.851384, - 0.826000, 0.850892, - 0.827000, 0.850393, - 0.828000, 0.849887, - 0.829000, 0.849374, - 0.830000, 0.848855, - 0.831000, 0.848329, - 0.832000, 0.847796, - 0.833000, 0.847257, - 0.834000, 0.846711, - 0.835000, 0.846158, - 0.836000, 0.845598, - 0.837000, 0.845032, - 0.838000, 0.844459, - 0.839000, 0.843880, - 0.840000, 0.843293, - 0.841000, 0.842700, - 0.842000, 0.842101, - 0.843000, 0.841495, - 0.844000, 0.840882, - 0.845000, 0.840263, - 0.846000, 0.839637, - 0.847000, 0.839004, - 0.848000, 0.838365, - 0.849000, 0.837719, - 0.850000, 0.837067, - 0.851000, 0.836408, - 0.852000, 0.835742, - 0.853000, 0.835070, - 0.854000, 0.834391, - 0.855000, 0.833706, - 0.856000, 0.833015, - 0.857000, 0.832316, - 0.858000, 0.831612, - 0.859000, 0.830900, - 0.860000, 0.830183, - 0.861000, 0.829459, - 0.862000, 0.828728, - 0.863000, 0.827991, - 0.864000, 0.827247, - 0.865000, 0.826497, - 0.866000, 0.825741, - 0.867000, 0.824978, - 0.868000, 0.824209, - 0.869000, 0.823433, - 0.870000, 0.822651, - 0.871000, 0.821863, - 0.872000, 0.821068, - 0.873000, 0.820267, - 0.874000, 0.819459, - 0.875000, 0.818645, - 0.876000, 0.817825, - 0.877000, 0.816998, - 0.878000, 0.816166, - 0.879000, 0.815327, - 0.880000, 0.814481, - 0.881000, 0.813630, - 0.882000, 0.812772, - 0.883000, 0.811907, - 0.884000, 0.811037, - 0.885000, 0.810160, - 0.886000, 0.809278, - 0.887000, 0.808389, - 0.888000, 0.807493, - 0.889000, 0.806592, - 0.890000, 0.805684, - 0.891000, 0.804771, - 0.892000, 0.803851, - 0.893000, 0.802925, - 0.894000, 0.801993, - 0.895000, 0.801055, - 0.896000, 0.800110, - 0.897000, 0.799160, - 0.898000, 0.798203, - 0.899000, 0.797241, - 0.900000, 0.796272, - 0.901000, 0.795298, - 0.902000, 0.794317, - 0.903000, 0.793331, - 0.904000, 0.792338, - 0.905000, 0.791340, - 0.906000, 0.790335, - 0.907000, 0.789325, - 0.908000, 0.788309, - 0.909000, 0.787286, - 0.910000, 0.786258, - 0.911000, 0.785224, - 0.912000, 0.784184, - 0.913000, 0.783139, - 0.914000, 0.782087, - 0.915000, 0.781030, - 0.916000, 0.779966, - 0.917000, 0.778897, - 0.918000, 0.777823, - 0.919000, 0.776742, - 0.920000, 0.775656, - 0.921000, 0.774564, - 0.922000, 0.773466, - 0.923000, 0.772362, - 0.924000, 0.771253, - 0.925000, 0.770138, - 0.926000, 0.769018, - 0.927000, 0.767891, - 0.928000, 0.766760, - 0.929000, 0.765622, - 0.930000, 0.764479, - 0.931000, 0.763331, - 0.932000, 0.762177, - 0.933000, 0.761017, - 0.934000, 0.759852, - 0.935000, 0.758681, - 0.936000, 0.757505, - 0.937000, 0.756323, - 0.938000, 0.755136, - 0.939000, 0.753943, - 0.940000, 0.752745, - 0.941000, 0.751542, - 0.942000, 0.750333, - 0.943000, 0.749118, - 0.944000, 0.747899, - 0.945000, 0.746674, - 0.946000, 0.745444, - 0.947000, 0.744208, - 0.948000, 0.742967, - 0.949000, 0.741721, - 0.950000, 0.740470, - 0.951000, 0.739213, - 0.952000, 0.737951, - 0.953000, 0.736684, - 0.954000, 0.735412, - 0.955000, 0.734134, - 0.956000, 0.732852, - 0.957000, 0.731564, - 0.958000, 0.730271, - 0.959000, 0.728973, - 0.960000, 0.727670, - 0.961000, 0.726362, - 0.962000, 0.725049, - 0.963000, 0.723731, - 0.964000, 0.722408, - 0.965000, 0.721080, - 0.966000, 0.719747, - 0.967000, 0.718410, - 0.968000, 0.717067, - 0.969000, 0.715719, - 0.970000, 0.714366, - 0.971000, 0.713009, - 0.972000, 0.711647, - 0.973000, 0.710280, - 0.974000, 0.708908, - 0.975000, 0.707531, - 0.976000, 0.706150, - 0.977000, 0.704764, - 0.978000, 0.703373, - 0.979000, 0.701977, - 0.980000, 0.700577, - 0.981000, 0.699172, - 0.982000, 0.697763, - 0.983000, 0.696349, - 0.984000, 0.694930, - 0.985000, 0.693507, - 0.986000, 0.692079, - 0.987000, 0.690647, - 0.988000, 0.689210, - 0.989000, 0.687769, - 0.990000, 0.686323, - 0.991000, 0.684873, - 0.992000, 0.683419, - 0.993000, 0.681960, - 0.994000, 0.680496, - 0.995000, 0.679029, - 0.996000, 0.677557, - 0.997000, 0.676080, - 0.998000, 0.674600, - 0.999000, 0.673115, - 1.000000, 0.671626, - 1.001000, 0.670133, - 1.002000, 0.668635, - 1.003000, 0.667134, - 1.004000, 0.665628, - 1.005000, 0.664118, - 1.006000, 0.662604, - 1.007000, 0.661086, - 1.008000, 0.659564, - 1.009000, 0.658038, - 1.010000, 0.656508, - 1.011000, 0.654974, - 1.012000, 0.653436, - 1.013000, 0.651894, - 1.014000, 0.650348, - 1.015000, 0.648798, - 1.016000, 0.647245, - 1.017000, 0.645687, - 1.018000, 0.644126, - 1.019000, 0.642561, - 1.020000, 0.640992, - 1.021000, 0.639420, - 1.022000, 0.637844, - 1.023000, 0.636264, - 1.024000, 0.634680, - 1.025000, 0.633093, - 1.026000, 0.631502, - 1.027000, 0.629908, - 1.028000, 0.628310, - 1.029000, 0.626709, - 1.030000, 0.625104, - 1.031000, 0.623495, - 1.032000, 0.621883, - 1.033000, 0.620268, - 1.034000, 0.618649, - 1.035000, 0.617027, - 1.036000, 0.615402, - 1.037000, 0.613773, - 1.038000, 0.612141, - 1.039000, 0.610506, - 1.040000, 0.608867, - 1.041000, 0.607225, - 1.042000, 0.605580, - 1.043000, 0.603932, - 1.044000, 0.602281, - 1.045000, 0.600626, - 1.046000, 0.598969, - 1.047000, 0.597308, - 1.048000, 0.595645, - 1.049000, 0.593978, - 1.050000, 0.592308, - 1.051000, 0.590636, - 1.052000, 0.588960, - 1.053000, 0.587282, - 1.054000, 0.585601, - 1.055000, 0.583916, - 1.056000, 0.582230, - 1.057000, 0.580540, - 1.058000, 0.578847, - 1.059000, 0.577152, - 1.060000, 0.575454, - 1.061000, 0.573754, - 1.062000, 0.572050, - 1.063000, 0.570345, - 1.064000, 0.568636, - 1.065000, 0.566925, - 1.066000, 0.565212, - 1.067000, 0.563495, - 1.068000, 0.561777, - 1.069000, 0.560056, - 1.070000, 0.558332, - 1.071000, 0.556607, - 1.072000, 0.554878, - 1.073000, 0.553148, - 1.074000, 0.551415, - 1.075000, 0.549680, - 1.076000, 0.547943, - 1.077000, 0.546203, - 1.078000, 0.544461, - 1.079000, 0.542717, - 1.080000, 0.540971, - 1.081000, 0.539223, - 1.082000, 0.537473, - 1.083000, 0.535721, - 1.084000, 0.533966, - 1.085000, 0.532210, - 1.086000, 0.530452, - 1.087000, 0.528692, - 1.088000, 0.526930, - 1.089000, 0.525166, - 1.090000, 0.523400, - 1.091000, 0.521632, - 1.092000, 0.519863, - 1.093000, 0.518092, - 1.094000, 0.516319, - 1.095000, 0.514545, - 1.096000, 0.512768, - 1.097000, 0.510991, - 1.098000, 0.509211, - 1.099000, 0.507430, - 1.100000, 0.505648, - 1.101000, 0.503864, - 1.102000, 0.502078, - 1.103000, 0.500292, - 1.104000, 0.498503, - 1.105000, 0.496714, - 1.106000, 0.494923, - 1.107000, 0.493130, - 1.108000, 0.491337, - 1.109000, 0.489542, - 1.110000, 0.487746, - 1.111000, 0.485948, - 1.112000, 0.484150, - 1.113000, 0.482350, - 1.114000, 0.480549, - 1.115000, 0.478748, - 1.116000, 0.476945, - 1.117000, 0.475141, - 1.118000, 0.473336, - 1.119000, 0.471530, - 1.120000, 0.469724, - 1.121000, 0.467916, - 1.122000, 0.466108, - 1.123000, 0.464299, - 1.124000, 0.462489, - 1.125000, 0.460678, - 1.126000, 0.458866, - 1.127000, 0.457054, - 1.128000, 0.455242, - 1.129000, 0.453428, - 1.130000, 0.451614, - 1.131000, 0.449799, - 1.132000, 0.447984, - 1.133000, 0.446169, - 1.134000, 0.444353, - 1.135000, 0.442536, - 1.136000, 0.440719, - 1.137000, 0.438902, - 1.138000, 0.437084, - 1.139000, 0.435266, - 1.140000, 0.433448, - 1.141000, 0.431630, - 1.142000, 0.429811, - 1.143000, 0.427992, - 1.144000, 0.426173, - 1.145000, 0.424354, - 1.146000, 0.422535, - 1.147000, 0.420716, - 1.148000, 0.418896, - 1.149000, 0.417077, - 1.150000, 0.415258, - 1.151000, 0.413439, - 1.152000, 0.411620, - 1.153000, 0.409801, - 1.154000, 0.407983, - 1.155000, 0.406164, - 1.156000, 0.404346, - 1.157000, 0.402528, - 1.158000, 0.400710, - 1.159000, 0.398893, - 1.160000, 0.397076, - 1.161000, 0.395260, - 1.162000, 0.393444, - 1.163000, 0.391629, - 1.164000, 0.389814, - 1.165000, 0.387999, - 1.166000, 0.386185, - 1.167000, 0.384372, - 1.168000, 0.382559, - 1.169000, 0.380747, - 1.170000, 0.378936, - 1.171000, 0.377126, - 1.172000, 0.375316, - 1.173000, 0.373507, - 1.174000, 0.371699, - 1.175000, 0.369892, - 1.176000, 0.368085, - 1.177000, 0.366280, - 1.178000, 0.364476, - 1.179000, 0.362672, - 1.180000, 0.360870, - 1.181000, 0.359069, - 1.182000, 0.357269, - 1.183000, 0.355470, - 1.184000, 0.353672, - 1.185000, 0.351875, - 1.186000, 0.350080, - 1.187000, 0.348286, - 1.188000, 0.346493, - 1.189000, 0.344701, - 1.190000, 0.342911, - 1.191000, 0.341123, - 1.192000, 0.339335, - 1.193000, 0.337549, - 1.194000, 0.335765, - 1.195000, 0.333982, - 1.196000, 0.332201, - 1.197000, 0.330422, - 1.198000, 0.328644, - 1.199000, 0.326867, - 1.200000, 0.325093, - 1.201000, 0.323320, - 1.202000, 0.321549, - 1.203000, 0.319779, - 1.204000, 0.318012, - 1.205000, 0.316246, - 1.206000, 0.314483, - 1.207000, 0.312721, - 1.208000, 0.310961, - 1.209000, 0.309203, - 1.210000, 0.307448, - 1.211000, 0.305694, - 1.212000, 0.303942, - 1.213000, 0.302193, - 1.214000, 0.300445, - 1.215000, 0.298700, - 1.216000, 0.296957, - 1.217000, 0.295217, - 1.218000, 0.293478, - 1.219000, 0.291742, - 1.220000, 0.290009, - 1.221000, 0.288277, - 1.222000, 0.286548, - 1.223000, 0.284822, - 1.224000, 0.283098, - 1.225000, 0.281377, - 1.226000, 0.279658, - 1.227000, 0.277942, - 1.228000, 0.276228, - 1.229000, 0.274517, - 1.230000, 0.272809, - 1.231000, 0.271103, - 1.232000, 0.269400, - 1.233000, 0.267700, - 1.234000, 0.266003, - 1.235000, 0.264308, - 1.236000, 0.262617, - 1.237000, 0.260928, - 1.238000, 0.259242, - 1.239000, 0.257560, - 1.240000, 0.255880, - 1.241000, 0.254203, - 1.242000, 0.252530, - 1.243000, 0.250859, - 1.244000, 0.249192, - 1.245000, 0.247527, - 1.246000, 0.245866, - 1.247000, 0.244208, - 1.248000, 0.242554, - 1.249000, 0.240903, - 1.250000, 0.239255, - 1.251000, 0.237610, - 1.252000, 0.235969, - 1.253000, 0.234331, - 1.254000, 0.232696, - 1.255000, 0.231066, - 1.256000, 0.229438, - 1.257000, 0.227814, - 1.258000, 0.226194, - 1.259000, 0.224577, - 1.260000, 0.222964, - 1.261000, 0.221355, - 1.262000, 0.219749, - 1.263000, 0.218147, - 1.264000, 0.216549, - 1.265000, 0.214954, - 1.266000, 0.213364, - 1.267000, 0.211777, - 1.268000, 0.210194, - 1.269000, 0.208615, - 1.270000, 0.207040, - 1.271000, 0.205469, - 1.272000, 0.203902, - 1.273000, 0.202339, - 1.274000, 0.200780, - 1.275000, 0.199225, - 1.276000, 0.197674, - 1.277000, 0.196127, - 1.278000, 0.194585, - 1.279000, 0.193047, - 1.280000, 0.191512, - 1.281000, 0.189983, - 1.282000, 0.188457, - 1.283000, 0.186936, - 1.284000, 0.185419, - 1.285000, 0.183907, - 1.286000, 0.182399, - 1.287000, 0.180895, - 1.288000, 0.179396, - 1.289000, 0.177901, - 1.290000, 0.176411, - 1.291000, 0.174926, - 1.292000, 0.173445, - 1.293000, 0.171969, - 1.294000, 0.170497, - 1.295000, 0.169030, - 1.296000, 0.167568, - 1.297000, 0.166110, - 1.298000, 0.164657, - 1.299000, 0.163209, - 1.300000, 0.161766, - 1.301000, 0.160328, - 1.302000, 0.158894, - 1.303000, 0.157465, - 1.304000, 0.156042, - 1.305000, 0.154623, - 1.306000, 0.153209, - 1.307000, 0.151800, - 1.308000, 0.150397, - 1.309000, 0.148998, - 1.310000, 0.147604, - 1.311000, 0.146216, - 1.312000, 0.144833, - 1.313000, 0.143454, - 1.314000, 0.142081, - 1.315000, 0.140714, - 1.316000, 0.139351, - 1.317000, 0.137994, - 1.318000, 0.136642, - 1.319000, 0.135295, - 1.320000, 0.133954, - 1.321000, 0.132618, - 1.322000, 0.131288, - 1.323000, 0.129963, - 1.324000, 0.128643, - 1.325000, 0.127329, - 1.326000, 0.126021, - 1.327000, 0.124718, - 1.328000, 0.123420, - 1.329000, 0.122128, - 1.330000, 0.120842, - 1.331000, 0.119561, - 1.332000, 0.118286, - 1.333000, 0.117017, - 1.334000, 0.115753, - 1.335000, 0.114495, - 1.336000, 0.113243, - 1.337000, 0.111997, - 1.338000, 0.110757, - 1.339000, 0.109522, - 1.340000, 0.108293, - 1.341000, 0.107070, - 1.342000, 0.105853, - 1.343000, 0.104642, - 1.344000, 0.103437, - 1.345000, 0.102237, - 1.346000, 0.101044, - 1.347000, 0.099857, - 1.348000, 0.098676, - 1.349000, 0.097501, - 1.350000, 0.096332, - 1.351000, 0.095169, - 1.352000, 0.094012, - 1.353000, 0.092862, - 1.354000, 0.091717, - 1.355000, 0.090579, - 1.356000, 0.089447, - 1.357000, 0.088322, - 1.358000, 0.087202, - 1.359000, 0.086089, - 1.360000, 0.084982, - 1.361000, 0.083882, - 1.362000, 0.082787, - 1.363000, 0.081700, - 1.364000, 0.080618, - 1.365000, 0.079543, - 1.366000, 0.078475, - 1.367000, 0.077413, - 1.368000, 0.076357, - 1.369000, 0.075308, - 1.370000, 0.074266, - 1.371000, 0.073230, - 1.372000, 0.072200, - 1.373000, 0.071177, - 1.374000, 0.070161, - 1.375000, 0.069151, - 1.376000, 0.068148, - 1.377000, 0.067152, - 1.378000, 0.066163, - 1.379000, 0.065180, - 1.380000, 0.064203, - 1.381000, 0.063234, - 1.382000, 0.062271, - 1.383000, 0.061315, - 1.384000, 0.060366, - 1.385000, 0.059424, - 1.386000, 0.058488, - 1.387000, 0.057560, - 1.388000, 0.056638, - 1.389000, 0.055723, - 1.390000, 0.054815, - 1.391000, 0.053914, - 1.392000, 0.053020, - 1.393000, 0.052133, - 1.394000, 0.051253, - 1.395000, 0.050380, - 1.396000, 0.049514, - 1.397000, 0.048654, - 1.398000, 0.047802, - 1.399000, 0.046957, - 1.400000, 0.046119, - 1.401000, 0.045289, - 1.402000, 0.044465, - 1.403000, 0.043648, - 1.404000, 0.042839, - 1.405000, 0.042037, - 1.406000, 0.041242, - 1.407000, 0.040454, - 1.408000, 0.039673, - 1.409000, 0.038899, - 1.410000, 0.038133, - 1.411000, 0.037374, - 1.412000, 0.036622, - 1.413000, 0.035878, - 1.414000, 0.035141, - 1.415000, 0.034411, - 1.416000, 0.033688, - 1.417000, 0.032973, - 1.418000, 0.032265, - 1.419000, 0.031565, - 1.420000, 0.030872, - 1.421000, 0.030186, - 1.422000, 0.029508, - 1.423000, 0.028837, - 1.424000, 0.028174, - 1.425000, 0.027518, - 1.426000, 0.026869, - 1.427000, 0.026228, - 1.428000, 0.025595, - 1.429000, 0.024968, - 1.430000, 0.024350, - 1.431000, 0.023739, - 1.432000, 0.023135, - 1.433000, 0.022539, - 1.434000, 0.021951, - 1.435000, 0.021370, - 1.436000, 0.020797, - 1.437000, 0.020231, - 1.438000, 0.019673, - 1.439000, 0.019123, - 1.440000, 0.018580, - 1.441000, 0.018045, - 1.442000, 0.017517, - 1.443000, 0.016998, - 1.444000, 0.016485, - 1.445000, 0.015981, - 1.446000, 0.015484, - 1.447000, 0.014995, - 1.448000, 0.014513, - 1.449000, 0.014040, - 1.450000, 0.013574, - 1.451000, 0.013115, - 1.452000, 0.012665, - 1.453000, 0.012222, - 1.454000, 0.011787, - 1.455000, 0.011360, - 1.456000, 0.010940, - 1.457000, 0.010529, - 1.458000, 0.010125, - 1.459000, 0.009729, - 1.460000, 0.009341, - 1.461000, 0.008960, - 1.462000, 0.008587, - 1.463000, 0.008223, - 1.464000, 0.007866, - 1.465000, 0.007517, - 1.466000, 0.007175, - 1.467000, 0.006842, - 1.468000, 0.006516, - 1.469000, 0.006199, - 1.470000, 0.005889, - 1.471000, 0.005587, - 1.472000, 0.005293, - 1.473000, 0.005007, - 1.474000, 0.004729, - 1.475000, 0.004458, - 1.476000, 0.004196, - 1.477000, 0.003942, - 1.478000, 0.003695, - 1.479000, 0.003456, - 1.480000, 0.003226, - 1.481000, 0.003003, - 1.482000, 0.002788, - 1.483000, 0.002581, - 1.484000, 0.002382, - 1.485000, 0.002191, - 1.486000, 0.002008, - 1.487000, 0.001833, - 1.488000, 0.001666, - 1.489000, 0.001507, - 1.490000, 0.001356, - 1.491000, 0.001213, - 1.492000, 0.001077, - 1.493000, 0.000950, - 1.494000, 0.000831, - 1.495000, 0.000720, - 1.496000, 0.000617, - 1.497000, 0.000521, - 1.498000, 0.000434, - 1.499000, 0.000355, - 1.500000, 0.000283, - 1.501000, 0.000220, - 1.502000, 0.000165, - 1.503000, 0.000117, - 1.504000, 0.000078, - 1.505000, 0.000047, - 1.506000, 0.000023, - 1.507000, 0.000008, - 1.508000, 0.000001, - 1.509000, 0.000001, - 1.510000, 0.000010, - 1.511000, 0.000027, - 1.512000, 0.000051, - 1.513000, 0.000084, - 1.514000, 0.000125, - 1.515000, 0.000173, - 1.516000, 0.000230, - 1.517000, 0.000295, - 1.518000, 0.000367, - 1.519000, 0.000448, - 1.520000, 0.000537, - 1.521000, 0.000633, - 1.522000, 0.000738, - 1.523000, 0.000851, - 1.524000, 0.000971, - 1.525000, 0.001100, - 1.526000, 0.001236, - 1.527000, 0.001381, - 1.528000, 0.001533, - 1.529000, 0.001694, - 1.530000, 0.001862, - 1.531000, 0.002039, - 1.532000, 0.002223, - 1.533000, 0.002415, - 1.534000, 0.002615, - 1.535000, 0.002824, - 1.536000, 0.003040, - 1.537000, 0.003264, - 1.538000, 0.003496, - 1.539000, 0.003736, - 1.540000, 0.003984, - 1.541000, 0.004240, - 1.542000, 0.004503, - 1.543000, 0.004775, - 1.544000, 0.005054, - 1.545000, 0.005342, - 1.546000, 0.005637, - 1.547000, 0.005941, - 1.548000, 0.006252, - 1.549000, 0.006571, - 1.550000, 0.006897, - 1.551000, 0.007232, - 1.552000, 0.007575, - 1.553000, 0.007925, - 1.554000, 0.008283, - 1.555000, 0.008650, - 1.556000, 0.009024, - 1.557000, 0.009405, - 1.558000, 0.009795, - 1.559000, 0.010192, - 1.560000, 0.010598, - 1.561000, 0.011010, - 1.562000, 0.011431, - 1.563000, 0.011860, - 1.564000, 0.012296, - 1.565000, 0.012740, - 1.566000, 0.013192, - 1.567000, 0.013652, - 1.568000, 0.014119, - 1.569000, 0.014594, - 1.570000, 0.015077, - 1.571000, 0.015567, - 1.572000, 0.016065, - 1.573000, 0.016571, - 1.574000, 0.017085, - 1.575000, 0.017606, - 1.576000, 0.018134, - 1.577000, 0.018671, - 1.578000, 0.019215, - 1.579000, 0.019767, - 1.580000, 0.020326, - 1.581000, 0.020893, - 1.582000, 0.021467, - 1.583000, 0.022050, - 1.584000, 0.022639, - 1.585000, 0.023236, - 1.586000, 0.023841, - 1.587000, 0.024454, - 1.588000, 0.025073, - 1.589000, 0.025701, - 1.590000, 0.026335, - 1.591000, 0.026978, - 1.592000, 0.027628, - 1.593000, 0.028285, - 1.594000, 0.028949, - 1.595000, 0.029622, - 1.596000, 0.030301, - 1.597000, 0.030988, - 1.598000, 0.031682, - 1.599000, 0.032384, - 1.600000, 0.033093, - 1.601000, 0.033810, - 1.602000, 0.034533, - 1.603000, 0.035264, - 1.604000, 0.036003, - 1.605000, 0.036748, - 1.606000, 0.037501, - 1.607000, 0.038262, - 1.608000, 0.039029, - 1.609000, 0.039804, - 1.610000, 0.040586, - 1.611000, 0.041375, - 1.612000, 0.042171, - 1.613000, 0.042975, - 1.614000, 0.043785, - 1.615000, 0.044603, - 1.616000, 0.045428, - 1.617000, 0.046260, - 1.618000, 0.047099, - 1.619000, 0.047945, - 1.620000, 0.048799, - 1.621000, 0.049659, - 1.622000, 0.050526, - 1.623000, 0.051400, - 1.624000, 0.052282, - 1.625000, 0.053170, - 1.626000, 0.054065, - 1.627000, 0.054968, - 1.628000, 0.055877, - 1.629000, 0.056793, - 1.630000, 0.057716, - 1.631000, 0.058645, - 1.632000, 0.059582, - 1.633000, 0.060525, - 1.634000, 0.061476, - 1.635000, 0.062433, - 1.636000, 0.063397, - 1.637000, 0.064367, - 1.638000, 0.065345, - 1.639000, 0.066329, - 1.640000, 0.067319, - 1.641000, 0.068317, - 1.642000, 0.069321, - 1.643000, 0.070332, - 1.644000, 0.071349, - 1.645000, 0.072373, - 1.646000, 0.073403, - 1.647000, 0.074441, - 1.648000, 0.075484, - 1.649000, 0.076534, - 1.650000, 0.077591, - 1.651000, 0.078654, - 1.652000, 0.079724, - 1.653000, 0.080800, - 1.654000, 0.081882, - 1.655000, 0.082971, - 1.656000, 0.084066, - 1.657000, 0.085168, - 1.658000, 0.086276, - 1.659000, 0.087390, - 1.660000, 0.088511, - 1.661000, 0.089637, - 1.662000, 0.090770, - 1.663000, 0.091910, - 1.664000, 0.093055, - 1.665000, 0.094207, - 1.666000, 0.095364, - 1.667000, 0.096528, - 1.668000, 0.097698, - 1.669000, 0.098874, - 1.670000, 0.100056, - 1.671000, 0.101245, - 1.672000, 0.102439, - 1.673000, 0.103639, - 1.674000, 0.104845, - 1.675000, 0.106057, - 1.676000, 0.107275, - 1.677000, 0.108499, - 1.678000, 0.109729, - 1.679000, 0.110965, - 1.680000, 0.112206, - 1.681000, 0.113454, - 1.682000, 0.114707, - 1.683000, 0.115966, - 1.684000, 0.117230, - 1.685000, 0.118500, - 1.686000, 0.119776, - 1.687000, 0.121058, - 1.688000, 0.122345, - 1.689000, 0.123638, - 1.690000, 0.124936, - 1.691000, 0.126240, - 1.692000, 0.127550, - 1.693000, 0.128865, - 1.694000, 0.130185, - 1.695000, 0.131511, - 1.696000, 0.132843, - 1.697000, 0.134179, - 1.698000, 0.135522, - 1.699000, 0.136869, - 1.700000, 0.138222, - 1.701000, 0.139580, - 1.702000, 0.140943, - 1.703000, 0.142312, - 1.704000, 0.143686, - 1.705000, 0.145065, - 1.706000, 0.146449, - 1.707000, 0.147839, - 1.708000, 0.149233, - 1.709000, 0.150632, - 1.710000, 0.152037, - 1.711000, 0.153447, - 1.712000, 0.154861, - 1.713000, 0.156281, - 1.714000, 0.157705, - 1.715000, 0.159135, - 1.716000, 0.160569, - 1.717000, 0.162008, - 1.718000, 0.163452, - 1.719000, 0.164901, - 1.720000, 0.166355, - 1.721000, 0.167813, - 1.722000, 0.169276, - 1.723000, 0.170744, - 1.724000, 0.172217, - 1.725000, 0.173694, - 1.726000, 0.175176, - 1.727000, 0.176662, - 1.728000, 0.178153, - 1.729000, 0.179648, - 1.730000, 0.181148, - 1.731000, 0.182652, - 1.732000, 0.184161, - 1.733000, 0.185674, - 1.734000, 0.187192, - 1.735000, 0.188714, - 1.736000, 0.190240, - 1.737000, 0.191770, - 1.738000, 0.193305, - 1.739000, 0.194844, - 1.740000, 0.196387, - 1.741000, 0.197935, - 1.742000, 0.199486, - 1.743000, 0.201042, - 1.744000, 0.202601, - 1.745000, 0.204165, - 1.746000, 0.205733, - 1.747000, 0.207305, - 1.748000, 0.208881, - 1.749000, 0.210460, - 1.750000, 0.212044, - 1.751000, 0.213631, - 1.752000, 0.215222, - 1.753000, 0.216818, - 1.754000, 0.218416, - 1.755000, 0.220019, - 1.756000, 0.221625, - 1.757000, 0.223235, - 1.758000, 0.224849, - 1.759000, 0.226466, - 1.760000, 0.228087, - 1.761000, 0.229712, - 1.762000, 0.231340, - 1.763000, 0.232971, - 1.764000, 0.234606, - 1.765000, 0.236245, - 1.766000, 0.237886, - 1.767000, 0.239532, - 1.768000, 0.241180, - 1.769000, 0.242832, - 1.770000, 0.244487, - 1.771000, 0.246146, - 1.772000, 0.247807, - 1.773000, 0.249472, - 1.774000, 0.251140, - 1.775000, 0.252811, - 1.776000, 0.254485, - 1.777000, 0.256162, - 1.778000, 0.257843, - 1.779000, 0.259526, - 1.780000, 0.261212, - 1.781000, 0.262901, - 1.782000, 0.264593, - 1.783000, 0.266288, - 1.784000, 0.267986, - 1.785000, 0.269686, - 1.786000, 0.271390, - 1.787000, 0.273096, - 1.788000, 0.274805, - 1.789000, 0.276516, - 1.790000, 0.278230, - 1.791000, 0.279947, - 1.792000, 0.281666, - 1.793000, 0.283388, - 1.794000, 0.285112, - 1.795000, 0.286839, - 1.796000, 0.288568, - 1.797000, 0.290300, - 1.798000, 0.292034, - 1.799000, 0.293771, - 1.800000, 0.295509, - 1.801000, 0.297250, - 1.802000, 0.298994, - 1.803000, 0.300739, - 1.804000, 0.302487, - 1.805000, 0.304237, - 1.806000, 0.305989, - 1.807000, 0.307743, - 1.808000, 0.309499, - 1.809000, 0.311257, - 1.810000, 0.313017, - 1.811000, 0.314779, - 1.812000, 0.316543, - 1.813000, 0.318309, - 1.814000, 0.320077, - 1.815000, 0.321847, - 1.816000, 0.323618, - 1.817000, 0.325391, - 1.818000, 0.327166, - 1.819000, 0.328943, - 1.820000, 0.330721, - 1.821000, 0.332501, - 1.822000, 0.334282, - 1.823000, 0.336065, - 1.824000, 0.337850, - 1.825000, 0.339636, - 1.826000, 0.341423, - 1.827000, 0.343212, - 1.828000, 0.345003, - 1.829000, 0.346794, - 1.830000, 0.348587, - 1.831000, 0.350382, - 1.832000, 0.352177, - 1.833000, 0.353974, - 1.834000, 0.355772, - 1.835000, 0.357572, - 1.836000, 0.359372, - 1.837000, 0.361173, - 1.838000, 0.362976, - 1.839000, 0.364779, - 1.840000, 0.366584, - 1.841000, 0.368389, - 1.842000, 0.370196, - 1.843000, 0.372003, - 1.844000, 0.373811, - 1.845000, 0.375620, - 1.846000, 0.377430, - 1.847000, 0.379241, - 1.848000, 0.381052, - 1.849000, 0.382864, - 1.850000, 0.384677, - 1.851000, 0.386490, - 1.852000, 0.388304, - 1.853000, 0.390119, - 1.854000, 0.391934, - 1.855000, 0.393750, - 1.856000, 0.395566, - 1.857000, 0.397382, - 1.858000, 0.399199, - 1.859000, 0.401016, - 1.860000, 0.402834, - 1.861000, 0.404652, - 1.862000, 0.406470, - 1.863000, 0.408289, - 1.864000, 0.410107, - 1.865000, 0.411926, - 1.866000, 0.413745, - 1.867000, 0.415564, - 1.868000, 0.417383, - 1.869000, 0.419202, - 1.870000, 0.421022, - 1.871000, 0.422841, - 1.872000, 0.424660, - 1.873000, 0.426479, - 1.874000, 0.428298, - 1.875000, 0.430117, - 1.876000, 0.431936, - 1.877000, 0.433754, - 1.878000, 0.435572, - 1.879000, 0.437390, - 1.880000, 0.439208, - 1.881000, 0.441025, - 1.882000, 0.442842, - 1.883000, 0.444658, - 1.884000, 0.446474, - 1.885000, 0.448290, - 1.886000, 0.450105, - 1.887000, 0.451919, - 1.888000, 0.453733, - 1.889000, 0.455547, - 1.890000, 0.457359, - 1.891000, 0.459171, - 1.892000, 0.460983, - 1.893000, 0.462793, - 1.894000, 0.464603, - 1.895000, 0.466412, - 1.896000, 0.468221, - 1.897000, 0.470028, - 1.898000, 0.471834, - 1.899000, 0.473640, - 1.900000, 0.475445, - 1.901000, 0.477248, - 1.902000, 0.479051, - 1.903000, 0.480853, - 1.904000, 0.482653, - 1.905000, 0.484453, - 1.906000, 0.486251, - 1.907000, 0.488048, - 1.908000, 0.489844, - 1.909000, 0.491639, - 1.910000, 0.493432, - 1.911000, 0.495224, - 1.912000, 0.497015, - 1.913000, 0.498804, - 1.914000, 0.500592, - 1.915000, 0.502379, - 1.916000, 0.504164, - 1.917000, 0.505948, - 1.918000, 0.507730, - 1.919000, 0.509511, - 1.920000, 0.511290, - 1.921000, 0.513067, - 1.922000, 0.514843, - 1.923000, 0.516618, - 1.924000, 0.518390, - 1.925000, 0.520161, - 1.926000, 0.521930, - 1.927000, 0.523697, - 1.928000, 0.525463, - 1.929000, 0.527226, - 1.930000, 0.528988, - 1.931000, 0.530748, - 1.932000, 0.532506, - 1.933000, 0.534262, - 1.934000, 0.536016, - 1.935000, 0.537768, - 1.936000, 0.539518, - 1.937000, 0.541265, - 1.938000, 0.543011, - 1.939000, 0.544755, - 1.940000, 0.546496, - 1.941000, 0.548235, - 1.942000, 0.549972, - 1.943000, 0.551707, - 1.944000, 0.553439, - 1.945000, 0.555169, - 1.946000, 0.556897, - 1.947000, 0.558623, - 1.948000, 0.560346, - 1.949000, 0.562066, - 1.950000, 0.563784, - 1.951000, 0.565500, - 1.952000, 0.567213, - 1.953000, 0.568924, - 1.954000, 0.570632, - 1.955000, 0.572337, - 1.956000, 0.574040, - 1.957000, 0.575740, - 1.958000, 0.577438, - 1.959000, 0.579132, - 1.960000, 0.580824, - 1.961000, 0.582514, - 1.962000, 0.584200, - 1.963000, 0.585884, - 1.964000, 0.587565, - 1.965000, 0.589242, - 1.966000, 0.590917, - 1.967000, 0.592589, - 1.968000, 0.594259, - 1.969000, 0.595925, - 1.970000, 0.597588, - 1.971000, 0.599248, - 1.972000, 0.600905, - 1.973000, 0.602559, - 1.974000, 0.604210, - 1.975000, 0.605857, - 1.976000, 0.607502, - 1.977000, 0.609143, - 1.978000, 0.610781, - 1.979000, 0.612416, - 1.980000, 0.614047, - 1.981000, 0.615676, - 1.982000, 0.617301, - 1.983000, 0.618922, - 1.984000, 0.620540, - 1.985000, 0.622155, - 1.986000, 0.623766, - 1.987000, 0.625374, - 1.988000, 0.626979, - 1.989000, 0.628579, - 1.990000, 0.630177, - 1.991000, 0.631770, - 1.992000, 0.633361, - 1.993000, 0.634947, - 1.994000, 0.636530, - 1.995000, 0.638109, - 1.996000, 0.639685, - 1.997000, 0.641257, - 1.998000, 0.642825, - 1.999000, 0.644389}; - -#endif //PENDULUM_GOLD_H diff --git a/engine/inc/bullet/MultiBodyBaseline/MultiBodyBaseline.h b/engine/inc/bullet/MultiBodyBaseline/MultiBodyBaseline.h deleted file mode 100644 index 35734c63..00000000 --- a/engine/inc/bullet/MultiBodyBaseline/MultiBodyBaseline.h +++ /dev/null @@ -1,20 +0,0 @@ -/* -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 _MULTIBODY_BASELINE_H -#define _MULTIBODY_BASELINE_H - -class CommonExampleInterface* MultiBodyBaselineCreateFunc(struct CommonExampleOptions& options); - -#endif //_MULTIBODY_BASELINE_H diff --git a/engine/inc/bullet/MultiThreadedDemo/CommonRigidBodyMTBase.h b/engine/inc/bullet/MultiThreadedDemo/CommonRigidBodyMTBase.h deleted file mode 100644 index ff96070c..00000000 --- a/engine/inc/bullet/MultiThreadedDemo/CommonRigidBodyMTBase.h +++ /dev/null @@ -1,444 +0,0 @@ - -#ifndef COMMON_RIGID_BODY_MT_BASE_H -#define COMMON_RIGID_BODY_MT_BASE_H - -#include "btBulletDynamicsCommon.h" -#include "../CommonInterfaces/CommonExampleInterface.h" -#include "../CommonInterfaces/CommonGUIHelperInterface.h" -#include "../CommonInterfaces/CommonRenderInterface.h" -#include "../CommonInterfaces/CommonCameraInterface.h" -#include "../CommonInterfaces/CommonGraphicsAppInterface.h" -#include "../CommonInterfaces/CommonWindowInterface.h" - -enum SolverType -{ - SOLVER_TYPE_SEQUENTIAL_IMPULSE, - SOLVER_TYPE_SEQUENTIAL_IMPULSE_MT, - SOLVER_TYPE_NNCG, - SOLVER_TYPE_MLCP_PGS, - SOLVER_TYPE_MLCP_DANTZIG, - SOLVER_TYPE_MLCP_LEMKE, - - SOLVER_TYPE_COUNT -}; - -inline const char* getSolverTypeName(SolverType t) -{ - switch (t) - { - case SOLVER_TYPE_SEQUENTIAL_IMPULSE: - return "SequentialImpulse"; - case SOLVER_TYPE_SEQUENTIAL_IMPULSE_MT: - return "SequentialImpulseMt"; - case SOLVER_TYPE_NNCG: - return "NNCG"; - case SOLVER_TYPE_MLCP_PGS: - return "MLCP ProjectedGaussSeidel"; - case SOLVER_TYPE_MLCP_DANTZIG: - return "MLCP Dantzig"; - case SOLVER_TYPE_MLCP_LEMKE: - return "MLCP Lemke"; - default: - { - } - } - btAssert(!"unhandled solver type in switch"); - return "???"; -} - -struct CommonRigidBodyMTBase : public CommonExampleInterface -{ - //keep the collision shapes, for deletion/cleanup - btAlignedObjectArray m_collisionShapes; - btBroadphaseInterface* m_broadphase; - btCollisionDispatcher* m_dispatcher; - btConstraintSolver* m_solver; - btDefaultCollisionConfiguration* m_collisionConfiguration; - btDiscreteDynamicsWorld* m_dynamicsWorld; - SolverType m_solverType; - bool m_multithreadedWorld; - bool m_multithreadCapable; - - //data for picking objects - class btRigidBody* m_pickedBody; - class btTypedConstraint* m_pickedConstraint; - int m_savedState; - btVector3 m_oldPickingPos; - btVector3 m_hitPos; - btScalar m_oldPickingDist; - struct GUIHelperInterface* m_guiHelper; - - CommonRigidBodyMTBase(struct GUIHelperInterface* helper); - virtual ~CommonRigidBodyMTBase(); - - btDiscreteDynamicsWorld* getDynamicsWorld() - { - return m_dynamicsWorld; - } - - virtual void createDefaultParameters(); - virtual void createEmptyDynamicsWorld(); - - virtual void stepSimulation(float deltaTime) - { - if (m_dynamicsWorld) - { - m_dynamicsWorld->stepSimulation(deltaTime); - } - } - - virtual void drawScreenText(); - virtual void renderScene(); - virtual void physicsDebugDraw(int debugFlags); - - virtual void exitPhysics() - { - removePickingConstraint(); - //cleanup in the reverse order of creation/initialization - - //remove the rigidbodies from the dynamics world and delete them - - if (m_dynamicsWorld) - { - int i; - for (i = m_dynamicsWorld->getNumConstraints() - 1; i >= 0; i--) - { - m_dynamicsWorld->removeConstraint(m_dynamicsWorld->getConstraint(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.size(); j++) - { - btCollisionShape* shape = m_collisionShapes[j]; - delete shape; - } - m_collisionShapes.clear(); - - delete m_dynamicsWorld; - m_dynamicsWorld = 0; - - delete m_solver; - m_solver = 0; - - delete m_broadphase; - m_broadphase = 0; - - delete m_dispatcher; - m_dispatcher = 0; - - delete m_collisionConfiguration; - m_collisionConfiguration = 0; - } - - virtual void debugDraw(int debugDrawFlags) - { - if (m_dynamicsWorld) - { - if (m_dynamicsWorld->getDebugDrawer()) - { - m_dynamicsWorld->getDebugDrawer()->setDebugMode(debugDrawFlags); - } - m_dynamicsWorld->debugDrawWorld(); - } - } - - virtual bool keyboardCallback(int key, int state) - { - if ((key == B3G_F3) && state && m_dynamicsWorld) - { - btDefaultSerializer* serializer = new btDefaultSerializer(); - m_dynamicsWorld->serialize(serializer); - - FILE* file = fopen("testFile.bullet", "wb"); - fwrite(serializer->getBufferPointer(), serializer->getCurrentBufferSize(), 1, file); - fclose(file); - //b3Printf("btDefaultSerializer wrote testFile.bullet"); - delete serializer; - return true; - } - return false; //don't handle this key - } - - btVector3 getRayTo(int x, int y) - { - CommonRenderInterface* renderer = m_guiHelper->getRenderInterface(); - - if (!renderer) - { - btAssert(0); - return btVector3(0, 0, 0); - } - - float top = 1.f; - float bottom = -1.f; - float nearPlane = 1.f; - float tanFov = (top - bottom) * 0.5f / nearPlane; - float fov = btScalar(2.0) * btAtan(tanFov); - - btVector3 camPos, camTarget; - - renderer->getActiveCamera()->getCameraPosition(camPos); - renderer->getActiveCamera()->getCameraTargetPosition(camTarget); - - btVector3 rayFrom = camPos; - btVector3 rayForward = (camTarget - camPos); - rayForward.normalize(); - float farPlane = 10000.f; - rayForward *= farPlane; - - btVector3 rightOffset; - btVector3 cameraUp = btVector3(0, 0, 0); - cameraUp[m_guiHelper->getAppInterface()->getUpAxis()] = 1; - - btVector3 vertical = cameraUp; - - btVector3 hor; - hor = rayForward.cross(vertical); - hor.safeNormalize(); - vertical = hor.cross(rayForward); - vertical.safeNormalize(); - - float tanfov = tanf(0.5f * fov); - - hor *= 2.f * farPlane * tanfov; - vertical *= 2.f * farPlane * tanfov; - - btScalar aspect; - float width = float(renderer->getScreenWidth()); - float height = float(renderer->getScreenHeight()); - - aspect = width / height; - - hor *= aspect; - - btVector3 rayToCenter = rayFrom + rayForward; - btVector3 dHor = hor * 1.f / width; - btVector3 dVert = vertical * 1.f / height; - - btVector3 rayTo = rayToCenter - 0.5f * hor + 0.5f * vertical; - rayTo += btScalar(x) * dHor; - rayTo -= btScalar(y) * dVert; - return rayTo; - } - - virtual bool mouseMoveCallback(float x, float y) - { - CommonRenderInterface* renderer = m_guiHelper->getRenderInterface(); - - if (!renderer) - { - btAssert(0); - return false; - } - - btVector3 rayTo = getRayTo(int(x), int(y)); - btVector3 rayFrom; - renderer->getActiveCamera()->getCameraPosition(rayFrom); - movePickedBody(rayFrom, rayTo); - - return false; - } - - virtual bool mouseButtonCallback(int button, int state, float x, float y) - { - CommonRenderInterface* renderer = m_guiHelper->getRenderInterface(); - - if (!renderer) - { - btAssert(0); - return false; - } - - CommonWindowInterface* window = m_guiHelper->getAppInterface()->m_window; - -#if 0 - if (window->isModifierKeyPressed(B3G_ALT)) - { - printf("ALT pressed\n"); - } else - { - printf("NO ALT pressed\n"); - } - - if (window->isModifierKeyPressed(B3G_SHIFT)) - { - printf("SHIFT pressed\n"); - } else - { - printf("NO SHIFT pressed\n"); - } - - if (window->isModifierKeyPressed(B3G_CONTROL)) - { - printf("CONTROL pressed\n"); - } else - { - printf("NO CONTROL pressed\n"); - } -#endif - - if (state == 1) - { - if (button == 0 && (!window->isModifierKeyPressed(B3G_ALT) && !window->isModifierKeyPressed(B3G_CONTROL))) - { - btVector3 camPos; - renderer->getActiveCamera()->getCameraPosition(camPos); - - btVector3 rayFrom = camPos; - btVector3 rayTo = getRayTo(int(x), int(y)); - - pickBody(rayFrom, rayTo); - } - } - else - { - if (button == 0) - { - removePickingConstraint(); - //remove p2p - } - } - - //printf("button=%d, state=%d\n",button,state); - return false; - } - - virtual bool pickBody(const btVector3& rayFromWorld, const btVector3& rayToWorld) - { - if (m_dynamicsWorld == 0) - return false; - - btCollisionWorld::ClosestRayResultCallback rayCallback(rayFromWorld, rayToWorld); - - m_dynamicsWorld->rayTest(rayFromWorld, rayToWorld, rayCallback); - if (rayCallback.hasHit()) - { - btVector3 pickPos = rayCallback.m_hitPointWorld; - btRigidBody* body = (btRigidBody*)btRigidBody::upcast(rayCallback.m_collisionObject); - if (body) - { - //other exclusions? - if (!(body->isStaticObject() || body->isKinematicObject())) - { - m_pickedBody = body; - m_savedState = m_pickedBody->getActivationState(); - m_pickedBody->setActivationState(DISABLE_DEACTIVATION); - //printf("pickPos=%f,%f,%f\n",pickPos.getX(),pickPos.getY(),pickPos.getZ()); - btVector3 localPivot = body->getCenterOfMassTransform().inverse() * pickPos; - btPoint2PointConstraint* p2p = new btPoint2PointConstraint(*body, localPivot); - m_dynamicsWorld->addConstraint(p2p, true); - m_pickedConstraint = p2p; - btScalar mousePickClamping = 30.f; - p2p->m_setting.m_impulseClamp = mousePickClamping; - //very weak constraint for picking - p2p->m_setting.m_tau = 0.001f; - } - } - - // pickObject(pickPos, rayCallback.m_collisionObject); - m_oldPickingPos = rayToWorld; - m_hitPos = pickPos; - m_oldPickingDist = (pickPos - rayFromWorld).length(); - // printf("hit !\n"); - //add p2p - } - return false; - } - virtual bool movePickedBody(const btVector3& rayFromWorld, const btVector3& rayToWorld) - { - if (m_pickedBody && m_pickedConstraint) - { - btPoint2PointConstraint* pickCon = static_cast(m_pickedConstraint); - if (pickCon) - { - //keep it at the same picking distance - - btVector3 newPivotB; - - btVector3 dir = rayToWorld - rayFromWorld; - dir.normalize(); - dir *= m_oldPickingDist; - - newPivotB = rayFromWorld + dir; - pickCon->setPivotB(newPivotB); - return true; - } - } - return false; - } - virtual void removePickingConstraint() - { - if (m_pickedConstraint) - { - m_pickedBody->forceActivationState(m_savedState); - m_pickedBody->activate(); - m_dynamicsWorld->removeConstraint(m_pickedConstraint); - delete m_pickedConstraint; - m_pickedConstraint = 0; - m_pickedBody = 0; - } - } - - btBoxShape* createBoxShape(const btVector3& halfExtents) - { - btBoxShape* box = new btBoxShape(halfExtents); - return box; - } - - btRigidBody* createRigidBody(float mass, const btTransform& startTransform, btCollisionShape* shape, const btVector4& color = btVector4(1, 0, 0, 1)) - { - 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); - //body->setContactProcessingThreshold(m_defaultContactProcessingThreshold); - -#else - btRigidBody* body = new btRigidBody(mass, 0, shape, localInertia); - body->setWorldTransform(startTransform); -#endif // - - body->setUserIndex(-1); - m_dynamicsWorld->addRigidBody(body); - return body; - } - - btRigidBody* createKinematicBody(const btTransform& startTransform, btCollisionShape* shape) - { - btAssert((!shape || shape->getShapeType() != INVALID_SHAPE_PROXYTYPE)); - - btRigidBody* body = new btRigidBody(0.0f, NULL, shape); - body->setWorldTransform(startTransform); - body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT); - body->setUserIndex(-1); - m_dynamicsWorld->addRigidBody(body); - return body; - } -}; - -#endif //#define COMMON_RIGID_BODY_MT_BASE_H diff --git a/engine/inc/bullet/MultiThreadedDemo/MultiThreadedDemo.h b/engine/inc/bullet/MultiThreadedDemo/MultiThreadedDemo.h deleted file mode 100644 index a4ae274f..00000000 --- a/engine/inc/bullet/MultiThreadedDemo/MultiThreadedDemo.h +++ /dev/null @@ -1,20 +0,0 @@ -/* -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 MULTITHREADED_DEMO_H -#define MULTITHREADED_DEMO_H - -class CommonExampleInterface* MultiThreadedDemoCreateFunc(struct CommonExampleOptions& options); - -#endif // MULTITHREADED_DEMO_H diff --git a/engine/inc/bullet/MultiThreading/MultiThreadingExample.h b/engine/inc/bullet/MultiThreading/MultiThreadingExample.h deleted file mode 100644 index 6bc142c3..00000000 --- a/engine/inc/bullet/MultiThreading/MultiThreadingExample.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef MULTI_THREADING_EXAMPLE_H -#define MULTI_THREADING_EXAMPLE_H - -enum EnumMultiThreadingExampleTypes -{ - SINGLE_SIM_THREAD = 0, -}; - -class CommonExampleInterface* MultiThreadingExampleCreateFunc(struct CommonExampleOptions& options); - -#endif //MULTI_THREADING_EXAMPLE_H diff --git a/engine/inc/bullet/MultiThreading/b3PosixThreadSupport.h b/engine/inc/bullet/MultiThreading/b3PosixThreadSupport.h deleted file mode 100644 index f20a7f85..00000000 --- a/engine/inc/bullet/MultiThreading/b3PosixThreadSupport.h +++ /dev/null @@ -1,142 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2007 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. -*/ - -#ifndef B3_POSIX_THREAD_SUPPORT_H -#define B3_POSIX_THREAD_SUPPORT_H - -#include "Bullet3Common/b3Scalar.h" - -#ifndef _XOPEN_SOURCE -#define _XOPEN_SOURCE 600 //for definition of pthread_barrier_t, see http://pages.cs.wisc.edu/~travitch/pthreads_primer.html -#endif //_XOPEN_SOURCE -#include -#include - -#include "Bullet3Common/b3AlignedObjectArray.h" - -#include "b3ThreadSupportInterface.h" - -typedef void (*b3PosixThreadFunc)(void* userPtr, void* lsMemory); -typedef void* (*b3PosixlsMemorySetupFunc)(); -typedef void (*b3PosixlsMemoryReleaseFunc)(void* ptr); - -// b3PosixThreadSupport helps to initialize/shutdown libspe2, start/stop SPU tasks and communication -class b3PosixThreadSupport : public b3ThreadSupportInterface -{ -public: - typedef enum sStatus - { - STATUS_BUSY, - STATUS_READY, - STATUS_FINISHED - } Status; - - // placeholder, until libspe2 support is there - struct b3ThreadStatus - { - int m_taskId; - int m_commandId; - int m_status; - - b3PosixThreadFunc m_userThreadFunc; - void* m_userPtr; //for taskDesc etc - b3PosixlsMemoryReleaseFunc m_lsMemoryReleaseFunc; - - void* m_lsMemory; //initialized using PosixLocalStoreMemorySetupFunc - - pthread_t thread; - //each tread will wait until this signal to start its work - sem_t* startSemaphore; - - // this is a copy of m_mainSemaphore, - //each tread will signal once it is finished with its work - sem_t* m_mainSemaphore; - unsigned long threadUsed; - }; - -private: - b3AlignedObjectArray m_activeThreadStatus; - - // m_mainSemaphoresemaphore will signal, if and how many threads are finished with their work - sem_t* m_mainSemaphore; - -public: - ///Setup and initialize SPU/CELL/Libspe2 - - struct ThreadConstructionInfo - { - ThreadConstructionInfo(const char* uniqueName, - b3PosixThreadFunc userThreadFunc, - b3PosixlsMemorySetupFunc lsMemoryFunc, - b3PosixlsMemoryReleaseFunc lsMemoryReleaseFunc, - int numThreads = 1, - int threadStackSize = 65535) - : m_uniqueName(uniqueName), - m_userThreadFunc(userThreadFunc), - m_lsMemoryFunc(lsMemoryFunc), - m_lsMemoryReleaseFunc(lsMemoryReleaseFunc), - m_numThreads(numThreads), - m_threadStackSize(threadStackSize) - { - } - - const char* m_uniqueName; - b3PosixThreadFunc m_userThreadFunc; - b3PosixlsMemorySetupFunc m_lsMemoryFunc; - b3PosixlsMemoryReleaseFunc m_lsMemoryReleaseFunc; - - int m_numThreads; - int m_threadStackSize; - }; - - b3PosixThreadSupport(ThreadConstructionInfo& threadConstructionInfo); - - ///cleanup/shutdown Libspe2 - virtual ~b3PosixThreadSupport(); - - void startThreads(ThreadConstructionInfo& threadInfo); - - virtual void runTask(int uiCommand, void* uiArgument0, int uiArgument1); - - virtual void waitForResponse(int* puiArgument0, int* puiArgument1); - - ///tell the task scheduler we are done with the SPU tasks - virtual void stopThreads(); - - virtual void setNumTasks(int numTasks) {} - - virtual int getNumTasks() const - { - return m_activeThreadStatus.size(); - } - - ///non-blocking test if a task is completed. First implement all versions, and then enable this API - virtual bool isTaskCompleted(int* puiArgument0, int* puiArgument1, int timeOutInMilliseconds); - - virtual b3Barrier* createBarrier(); - - virtual b3CriticalSection* createCriticalSection(); - - virtual void deleteBarrier(b3Barrier* barrier); - - virtual void deleteCriticalSection(b3CriticalSection* criticalSection); - - virtual void* getThreadLocalMemory(int taskId) - { - return m_activeThreadStatus[taskId].m_lsMemory; - } -}; - -#endif // B3_POSIX_THREAD_SUPPORT_H diff --git a/engine/inc/bullet/MultiThreading/b3ThreadSupportInterface.h b/engine/inc/bullet/MultiThreading/b3ThreadSupportInterface.h deleted file mode 100644 index 5f61951c..00000000 --- a/engine/inc/bullet/MultiThreading/b3ThreadSupportInterface.h +++ /dev/null @@ -1,84 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2007 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. -*/ - -#ifndef B3_THREAD_SUPPORT_INTERFACE_H -#define B3_THREAD_SUPPORT_INTERFACE_H - -enum -{ - B3_THREAD_SCHEDULE_TASK = 1, -}; - -#include "Bullet3Common/b3Scalar.h" //for B3_ATTRIBUTE_ALIGNED16 -//#include "PlatformDefinitions.h" -//#include "PpuAddressSpace.h" - -class b3Barrier -{ -public: - b3Barrier() {} - virtual ~b3Barrier() {} - - virtual void sync() = 0; - virtual void setMaxCount(int n) = 0; - virtual int getMaxCount() = 0; -}; - -class b3CriticalSection -{ -public: - b3CriticalSection() {} - virtual ~b3CriticalSection() {} - - B3_ATTRIBUTE_ALIGNED16(unsigned int mCommonBuff[32]); - - virtual unsigned int getSharedParam(int i) = 0; - virtual void setSharedParam(int i, unsigned int p) = 0; - - virtual void lock() = 0; - virtual void unlock() = 0; -}; - -class b3ThreadSupportInterface -{ -public: - virtual ~b3ThreadSupportInterface(); - - virtual void runTask(int uiCommand, void* uiArgument0, int uiArgument1) = 0; - - virtual void waitForResponse(int* puiArgument0, int* puiArgument1) = 0; - - ///non-blocking test if a task is completed. First implement all versions, and then enable this API - virtual bool isTaskCompleted(int* puiArgument0, int* puiArgument1, int timeOutInMilliseconds) = 0; - - virtual void stopThreads() = 0; - - ///tell the task scheduler to use no more than numTasks tasks - virtual void setNumTasks(int numTasks) = 0; - - virtual int getNumTasks() const = 0; - - virtual b3Barrier* createBarrier() = 0; - - virtual b3CriticalSection* createCriticalSection() = 0; - - virtual void deleteBarrier(b3Barrier* barrier) = 0; - - virtual void deleteCriticalSection(b3CriticalSection* criticalSection) = 0; - - virtual void* getThreadLocalMemory(int taskId) { return 0; } -}; - -#endif //B3_THREAD_SUPPORT_INTERFACE_H diff --git a/engine/inc/bullet/MultiThreading/b3Win32ThreadSupport.h b/engine/inc/bullet/MultiThreading/b3Win32ThreadSupport.h deleted file mode 100644 index 3b452629..00000000 --- a/engine/inc/bullet/MultiThreading/b3Win32ThreadSupport.h +++ /dev/null @@ -1,135 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2007 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 "Bullet3Common/b3Scalar.h" - -#ifndef BT_WIN32_THREAD_SUPPORT_H -#define BT_WIN32_THREAD_SUPPORT_H - -#include "Bullet3Common/b3AlignedObjectArray.h" - -#include "b3ThreadSupportInterface.h" - -typedef void (*b3Win32ThreadFunc)(void* userPtr, void* lsMemory); -typedef void* (*b3Win32lsMemorySetupFunc)(); -typedef void (*b3Win32lsMemoryReleaseFunc)(void*); - -///b3Win32ThreadSupport helps to initialize/shutdown libspe2, start/stop SPU tasks and communication -class b3Win32ThreadSupport : public b3ThreadSupportInterface -{ -public: - ///placeholder, until libspe2 support is there - struct b3ThreadStatus - { - int m_taskId; - int m_commandId; - int m_status; - - b3Win32ThreadFunc m_userThreadFunc; - void* m_userPtr; //for taskDesc etc - void* m_lsMemory; //initialized using Win32LocalStoreMemorySetupFunc - - b3Win32lsMemoryReleaseFunc m_lsMemoryReleaseFunc; - - void* m_threadHandle; //this one is calling 'Win32ThreadFunc' - - void* m_eventStartHandle; - char m_eventStartHandleName[32]; - - void* m_eventCompletetHandle; - char m_eventCompletetHandleName[32]; - }; - -private: - b3AlignedObjectArray m_activeThreadStatus; - b3AlignedObjectArray m_completeHandles; - - int m_maxNumTasks; - -public: - ///Setup and initialize SPU/CELL/Libspe2 - - struct Win32ThreadConstructionInfo - { - Win32ThreadConstructionInfo(const char* uniqueName, - b3Win32ThreadFunc userThreadFunc, - b3Win32lsMemorySetupFunc lsMemoryFunc, - b3Win32lsMemoryReleaseFunc lsMemoryReleaseFunc, - int numThreads = 1, - int threadStackSize = 65535) - : m_uniqueName(uniqueName), - m_userThreadFunc(userThreadFunc), - m_lsMemoryFunc(lsMemoryFunc), - m_lsMemoryReleaseFunc(lsMemoryReleaseFunc), - m_numThreads(numThreads), - m_threadStackSize(threadStackSize), - m_priority(0) - { - } - - const char* m_uniqueName; - b3Win32ThreadFunc m_userThreadFunc; - b3Win32lsMemorySetupFunc m_lsMemoryFunc; - b3Win32lsMemoryReleaseFunc m_lsMemoryReleaseFunc; - int m_numThreads; - int m_threadStackSize; - int m_priority; - }; - - b3Win32ThreadSupport(const Win32ThreadConstructionInfo& threadConstructionInfo); - - ///cleanup/shutdown Libspe2 - virtual ~b3Win32ThreadSupport(); - - void startThreads(const Win32ThreadConstructionInfo& threadInfo); - - ///send messages to SPUs - virtual void runTask(int uiCommand, void* uiArgument0, int uiArgument1); - - ///check for messages from SPUs - virtual void waitForResponse(int* puiArgument0, int* puiArgument1); - - virtual bool isTaskCompleted(int* puiArgument0, int* puiArgument1, int timeOutInMilliseconds); - - ///start the spus (can be called at the beginning of each frame, to make sure that the right SPU program is loaded) - virtual void startThreads(); - - ///tell the task scheduler we are done with the SPU tasks - virtual void stopThreads(); - - virtual void setNumTasks(int numTasks) - { - m_maxNumTasks = numTasks; - } - - virtual int getNumTasks() const - { - return m_maxNumTasks; - } - - virtual void* getThreadLocalMemory(int taskId) - { - return m_activeThreadStatus[taskId].m_lsMemory; - } - virtual b3Barrier* createBarrier(); - - virtual b3CriticalSection* createCriticalSection(); - - virtual void deleteBarrier(b3Barrier* barrier); - - virtual void deleteCriticalSection(b3CriticalSection* criticalSection); -}; - -#endif //BT_WIN32_THREAD_SUPPORT_H diff --git a/engine/inc/bullet/OpenCL/CommonOpenCL/CommonOpenCLBase.h b/engine/inc/bullet/OpenCL/CommonOpenCL/CommonOpenCLBase.h deleted file mode 100644 index e327b0e1..00000000 --- a/engine/inc/bullet/OpenCL/CommonOpenCL/CommonOpenCLBase.h +++ /dev/null @@ -1,145 +0,0 @@ -#ifndef COMMON_MULTI_BODY_SETUP_H -#define COMMON_MULTI_BODY_SETUP_H - -#include "../CommonInterfaces/CommonExampleInterface.h" -#include "../CommonInterfaces/CommonGUIHelperInterface.h" -#include "../CommonInterfaces/CommonRenderInterface.h" -#include "../CommonInterfaces/CommonGraphicsAppInterface.h" -#include "../CommonInterfaces/CommonWindowInterface.h" -#include "../CommonInterfaces/CommonCameraInterface.h" - -#include "GpuDemoInternalData.h" -#include "Bullet3Common/b3Scalar.h" -#include "Bullet3OpenCL/Initialize/b3OpenCLUtils.h" - -struct CommonOpenCLBase : public CommonExampleInterface -{ - struct GUIHelperInterface* m_guiHelper; - struct GpuDemoInternalData* m_clData; - - CommonOpenCLBase(GUIHelperInterface* helper) - : m_guiHelper(helper), - m_clData(0) - { - m_clData = new GpuDemoInternalData(); - } - - virtual ~CommonOpenCLBase() - { - delete m_clData; - m_clData = 0; - } - - virtual void stepSimulation(float deltaTime) - { - } - - virtual void initCL(int preferredDeviceIndex, int preferredPlatformIndex) - { - // void* glCtx=0; - // void* glDC = 0; - - int ciErrNum = 0; - - cl_device_type deviceType = CL_DEVICE_TYPE_GPU; - //if (gAllowCpuOpenCL) - // deviceType = CL_DEVICE_TYPE_ALL; - - // if (useInterop) - // { - // m_data->m_clContext = b3OpenCLUtils::createContextFromType(deviceType, &ciErrNum, glCtx, glDC); - // } else - { - m_clData->m_clContext = b3OpenCLUtils::createContextFromType(deviceType, &ciErrNum, 0, 0, preferredDeviceIndex, preferredPlatformIndex, &m_clData->m_platformId); - } - - oclCHECKERROR(ciErrNum, CL_SUCCESS); - - int numDev = b3OpenCLUtils::getNumDevices(m_clData->m_clContext); - - if (numDev > 0) - { - m_clData->m_clDevice = b3OpenCLUtils::getDevice(m_clData->m_clContext, 0); - m_clData->m_clQueue = clCreateCommandQueue(m_clData->m_clContext, m_clData->m_clDevice, 0, &ciErrNum); - oclCHECKERROR(ciErrNum, CL_SUCCESS); - - b3OpenCLDeviceInfo info; - b3OpenCLUtils::getDeviceInfo(m_clData->m_clDevice, &info); - m_clData->m_clDeviceName = info.m_deviceName; - m_clData->m_clInitialized = true; - } - } - - virtual void exitCL() - { - if (m_clData && m_clData->m_clInitialized) - { - clReleaseCommandQueue(m_clData->m_clQueue); - clReleaseContext(m_clData->m_clContext); - m_clData->m_clInitialized = false; - } - } - - virtual void renderScene() - { - if (m_guiHelper->getRenderInterface()) - { - m_guiHelper->getRenderInterface()->renderScene(); - } - } - - virtual void physicsDebugDraw(int debugDrawFlags) - { - } - - virtual bool keyboardCallback(int key, int state) - { - return false; //don't handle this key - } - - virtual bool mouseMoveCallback(float x, float y) - { - return false; - } - - virtual bool mouseButtonCallback(int button, int state, float x, float y) - { - CommonRenderInterface* renderer = m_guiHelper->getRenderInterface(); - - if (!renderer) - { - b3Assert(0); - return false; - } - - CommonWindowInterface* window = m_guiHelper->getAppInterface()->m_window; - - if (state == 1) - { - if (button == 0 && (!window->isModifierKeyPressed(B3G_ALT) && !window->isModifierKeyPressed(B3G_CONTROL))) - { - /*btVector3 camPos; - renderer->getActiveCamera()->getCameraPosition(camPos); - - btVector3 rayFrom = camPos; - btVector3 rayTo = getRayTo(int(x),int(y)); - - pickBody(rayFrom, rayTo); - */ - } - } - else - { - if (button == 0) - { - // removePickingConstraint(); - //remove p2p - } - } - - //printf("button=%d, state=%d\n",button,state); - return false; - } -}; - -#endif //COMMON_MULTI_BODY_SETUP_H diff --git a/engine/inc/bullet/OpenCL/CommonOpenCL/GpuDemoInternalData.h b/engine/inc/bullet/OpenCL/CommonOpenCL/GpuDemoInternalData.h deleted file mode 100644 index 1781e0e9..00000000 --- a/engine/inc/bullet/OpenCL/CommonOpenCL/GpuDemoInternalData.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef GPU_DEMO_INTERNAL_DATA_H -#define GPU_DEMO_INTERNAL_DATA_H - -#include "Bullet3OpenCL/Initialize/b3OpenCLInclude.h" - -struct GpuDemoInternalData -{ - cl_platform_id m_platformId; - cl_context m_clContext; - cl_device_id m_clDevice; - cl_command_queue m_clQueue; - bool m_clInitialized; - char* m_clDeviceName; - - GpuDemoInternalData() - : m_platformId(0), - m_clContext(0), - m_clDevice(0), - m_clQueue(0), - m_clInitialized(false), - m_clDeviceName(0) - { - } -}; - -#endif diff --git a/engine/inc/bullet/OpenCL/broadphase/PairBench.h b/engine/inc/bullet/OpenCL/broadphase/PairBench.h deleted file mode 100644 index 2a3040ee..00000000 --- a/engine/inc/bullet/OpenCL/broadphase/PairBench.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef PAIR_BENCH_H -#define PAIR_BENCH_H - -class CommonExampleInterface* PairBenchOpenCLCreateFunc(struct CommonExampleOptions& options); - -#endif diff --git a/engine/inc/bullet/OpenCL/broadphase/pairsKernel.h b/engine/inc/bullet/OpenCL/broadphase/pairsKernel.h deleted file mode 100644 index 803dcd46..00000000 --- a/engine/inc/bullet/OpenCL/broadphase/pairsKernel.h +++ /dev/null @@ -1,76 +0,0 @@ -//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project -static const char* pairsKernelsCL = - "__kernel void moveObjectsKernel(__global float4* posOrnColors, int numObjects)\n" - "{\n" - " int iGID = get_global_id(0);\n" - " if (iGID>=numObjects)\n" - " return;\n" - " __global float4* positions = &posOrnColors[0];\n" - " if (iGID<0.5*numObjects)\n" - " {\n" - " positions[iGID].y +=0.01f;\n" - " }\n" - " __global float4* colors = &posOrnColors[numObjects*2];\n" - " colors[iGID] = (float4)(0,0,1,1);\n" - "}\n" - "__kernel void colorPairsKernel2(__global float4* posOrnColors, int numObjects, __global const int4* pairs, int indexOffset, int numPairs)\n" - "{\n" - " int iPairId = get_global_id(0);\n" - " if (iPairId>=numPairs)\n" - " return;\n" - " __global float4* colors = &posOrnColors[numObjects*2];\n" - " int iObjectA = pairs[iPairId].x-indexOffset;\n" - " int iObjectB = pairs[iPairId].y-indexOffset;\n" - " colors[iObjectA] = (float4)(1,0,0,1);\n" - " colors[iObjectB] = (float4)(1,0,0,1);\n" - "}\n" - "__kernel void \n" - " sineWaveKernel( __global float4* posOrnColors, __global float* pBodyTimes,float timeStepPos, float mAmplitude,const int numNodes)\n" - "{\n" - " int nodeID = get_global_id(0);\n" - " if( nodeID < numNodes )\n" - " {\n" - " pBodyTimes[nodeID] += timeStepPos;\n" - " float4 position = posOrnColors[nodeID];\n" - " position.x = native_cos(pBodyTimes[nodeID]*2.17f)*mAmplitude + native_sin(pBodyTimes[nodeID])*mAmplitude*0.5f;\n" - " position.y = native_cos(pBodyTimes[nodeID]*1.38f)*mAmplitude + native_sin(pBodyTimes[nodeID]*mAmplitude);\n" - " position.z = native_cos(pBodyTimes[nodeID]*2.17f)*mAmplitude + native_sin(pBodyTimes[nodeID]*0.777f)*mAmplitude;\n" - " \n" - " posOrnColors[nodeID] = position;\n" - " __global float4* colors = &posOrnColors[numNodes*2];\n" - " colors[nodeID] = (float4)(0,0,1,1);\n" - " }\n" - "}\n" - "typedef struct \n" - "{\n" - " float fx;\n" - " float fy;\n" - " float fz;\n" - " int uw;\n" - "} b3AABBCL;\n" - "__kernel void updateAabbSimple( __global float4* posOrnColors, const int numNodes, __global b3AABBCL* pAABB)\n" - "{\n" - " int nodeId = get_global_id(0);\n" - " if( nodeId < numNodes )\n" - " {\n" - " \n" - " b3AABBCL orgAabbMin = pAABB[nodeId*2];\n" - " b3AABBCL orgAabbMax = pAABB[nodeId*2+1];\n" - " int orgNodeId = orgAabbMin.uw;\n" - " int orgBroadphaseIndex = orgAabbMax.uw;\n" - " \n" - " float4 position = posOrnColors[nodeId];\n" - " float4 argAabbMinVec = (float4)(orgAabbMin.fx,orgAabbMin.fy,orgAabbMin.fz,0.f);\n" - " float4 argAabbMaxVec = (float4)(orgAabbMax.fx,orgAabbMax.fy,orgAabbMax.fz,0.f);\n" - " float4 halfExtents = 0.5f*(argAabbMaxVec-argAabbMinVec);\n" - " \n" - " pAABB[nodeId*2].fx = position.x-halfExtents.x;\n" - " pAABB[nodeId*2].fy = position.y-halfExtents.y;\n" - " pAABB[nodeId*2].fz = position.z-halfExtents.z;\n" - " pAABB[nodeId*2].uw = orgNodeId;\n" - " pAABB[nodeId*2+1].fx = position.x+halfExtents.x;\n" - " pAABB[nodeId*2+1].fy = position.y+halfExtents.y;\n" - " pAABB[nodeId*2+1].fz = position.z+halfExtents.z;\n" - " pAABB[nodeId*2+1].uw = orgBroadphaseIndex; \n" - " }\n" - "}\n"; diff --git a/engine/inc/bullet/OpenCL/rigidbody/ConcaveScene.h b/engine/inc/bullet/OpenCL/rigidbody/ConcaveScene.h deleted file mode 100644 index 9086858d..00000000 --- a/engine/inc/bullet/OpenCL/rigidbody/ConcaveScene.h +++ /dev/null @@ -1,90 +0,0 @@ -#ifndef CONCAVE_SCENE_H -#define CONCAVE_SCENE_H - -#include "GpuRigidBodyDemo.h" -#include "Bullet3Common/b3Vector3.h" - -class ConcaveScene : public GpuRigidBodyDemo -{ -public: - ConcaveScene() {} - virtual ~ConcaveScene() {} - virtual const char* getName() - { - return "BoxTrimesh"; - } - - static GpuDemo* MyCreateFunc() - { - GpuDemo* demo = new ConcaveScene; - return demo; - } - - virtual void setupScene(const ConstructionInfo& ci); - - virtual void createDynamicObjects(const ConstructionInfo& ci); - - virtual void createConcaveMesh(const ConstructionInfo& ci, const char* fileName, const b3Vector3& shift, const b3Vector3& scaling); -}; - -class ConcaveSphereScene : public ConcaveScene -{ -public: - ConcaveSphereScene() {} - virtual ~ConcaveSphereScene() {} - virtual const char* getName() - { - return "SphereTrimesh"; - } - - static GpuDemo* MyCreateFunc() - { - GpuDemo* demo = new ConcaveSphereScene; - return demo; - } - - virtual void setupScene(const ConstructionInfo& ci); - - virtual void createDynamicObjects(const ConstructionInfo& ci); -}; - -class ConcaveCompoundScene : public ConcaveScene -{ -public: - ConcaveCompoundScene() {} - virtual ~ConcaveCompoundScene() {} - virtual const char* getName() - { - return "CompoundConcave"; - } - - static GpuDemo* MyCreateFunc() - { - GpuDemo* demo = new ConcaveCompoundScene; - return demo; - } - - virtual void setupScene(const ConstructionInfo& ci); - - virtual void createDynamicObjects(const ConstructionInfo& ci); -}; - -class ConcaveCompound2Scene : public ConcaveCompoundScene -{ -public: - ConcaveCompound2Scene() {} - virtual ~ConcaveCompound2Scene() {} - virtual const char* getName() - { - return "GRBConcave2Compound"; - } - - static GpuDemo* MyCreateFunc() - { - GpuDemo* demo = new ConcaveCompound2Scene; - return demo; - } - virtual void createDynamicObjects(const ConstructionInfo& ci); -}; - -#endif //CONCAVE_SCENE_H diff --git a/engine/inc/bullet/OpenCL/rigidbody/GpuCompoundScene.h b/engine/inc/bullet/OpenCL/rigidbody/GpuCompoundScene.h deleted file mode 100644 index 6e8d1508..00000000 --- a/engine/inc/bullet/OpenCL/rigidbody/GpuCompoundScene.h +++ /dev/null @@ -1,45 +0,0 @@ -#ifndef GPU_COMPOUND_SCENE_H -#define GPU_COMPOUND_SCENE_H - -#include "GpuRigidBodyDemo.h" - -class GpuCompoundScene : public GpuRigidBodyDemo -{ -public: - GpuCompoundScene() {} - virtual ~GpuCompoundScene() {} - virtual const char* getName() - { - return "CompoundOnSphere"; - } - - static GpuDemo* MyCreateFunc() - { - GpuDemo* demo = new GpuCompoundScene; - return demo; - } - - virtual void setupScene(const ConstructionInfo& ci); - - virtual void createStaticEnvironment(const ConstructionInfo& ci); -}; - -class GpuCompoundPlaneScene : public GpuCompoundScene -{ -public: - GpuCompoundPlaneScene() {} - virtual ~GpuCompoundPlaneScene() {} - virtual const char* getName() - { - return "CompoundOnPlane"; - } - - static GpuDemo* MyCreateFunc() - { - GpuDemo* demo = new GpuCompoundPlaneScene; - return demo; - } - - virtual void createStaticEnvironment(const ConstructionInfo& ci); -}; -#endif //GPU_COMPOUND_SCENE_H diff --git a/engine/inc/bullet/OpenCL/rigidbody/GpuConvexScene.h b/engine/inc/bullet/OpenCL/rigidbody/GpuConvexScene.h deleted file mode 100644 index 6aea434b..00000000 --- a/engine/inc/bullet/OpenCL/rigidbody/GpuConvexScene.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef GPU_CONVEX_SCENE_H -#define GPU_CONVEX_SCENE_H - -class CommonExampleInterface* OpenCLBoxBoxCreateFunc(struct CommonExampleOptions& options); - -#endif //GPU_CONVEX_SCENE_H diff --git a/engine/inc/bullet/OpenCL/rigidbody/GpuRigidBodyDemo.h b/engine/inc/bullet/OpenCL/rigidbody/GpuRigidBodyDemo.h deleted file mode 100644 index 3eabc38d..00000000 --- a/engine/inc/bullet/OpenCL/rigidbody/GpuRigidBodyDemo.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef GPU_RIGID_BODY_DEMO_H -#define GPU_RIGID_BODY_DEMO_H - -#include "Bullet3Common/b3Vector3.h" -#include "../CommonOpenCL/CommonOpenCLBase.h" - -class GpuRigidBodyDemo : public CommonOpenCLBase -{ -protected: - class GLInstancingRenderer* m_instancingRenderer; - class GLPrimitiveRenderer* m_primRenderer; - class CommonWindowInterface* m_window; - - struct GpuRigidBodyDemoInternalData* m_data; - -public: - GpuRigidBodyDemo(GUIHelperInterface* helper); - virtual ~GpuRigidBodyDemo(); - - virtual void initPhysics(); - - virtual void setupScene(); - - virtual void destroyScene(){}; - - virtual void exitPhysics(); - - virtual void renderScene(); - - void resetCamera(); - - virtual void stepSimulation(float deltaTime); - - //for picking - b3Vector3 getRayTo(int x, int y); - virtual bool mouseMoveCallback(float x, float y); - virtual bool mouseButtonCallback(int button, int state, float x, float y); - virtual bool keyboardCallback(int key, int state); - - unsigned char* loadImage(const char* fileName, int& width, int& height, int& n); -}; - -#endif //GPU_RIGID_BODY_DEMO_H diff --git a/engine/inc/bullet/OpenCL/rigidbody/GpuRigidBodyDemoInternalData.h b/engine/inc/bullet/OpenCL/rigidbody/GpuRigidBodyDemoInternalData.h deleted file mode 100644 index 9e56fc59..00000000 --- a/engine/inc/bullet/OpenCL/rigidbody/GpuRigidBodyDemoInternalData.h +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef GPU_RIGIDBODY_INTERNAL_DATA_H -#define GPU_RIGIDBODY_INTERNAL_DATA_H - -#include "Bullet3OpenCL/Initialize/b3OpenCLUtils.h" -#include "Bullet3OpenCL/ParallelPrimitives/b3OpenCLArray.h" -#include "Bullet3Common/b3Vector3.h" -#include "Bullet3Collision/NarrowPhaseCollision/b3Config.h" - -struct GpuRigidBodyDemoInternalData -{ - cl_kernel m_copyTransformsToVBOKernel; - - b3OpenCLArray* m_instancePosOrnColor; - - class b3GpuRigidBodyPipeline* m_rigidBodyPipeline; - - class b3GpuNarrowPhase* m_np; - class b3GpuBroadphaseInterface* m_bp; - struct b3DynamicBvhBroadphase* m_broadphaseDbvt; - - b3Vector3 m_pickPivotInA; - b3Vector3 m_pickPivotInB; - float m_pickDistance; - int m_pickBody; - int m_pickConstraint; - - int m_altPressed; - int m_controlPressed; - - int m_pickFixedBody; - int m_pickGraphicsShapeIndex; - int m_pickGraphicsShapeInstance; - b3Config m_config; - GUIHelperInterface* m_guiHelper; - - GpuRigidBodyDemoInternalData() - : m_instancePosOrnColor(0), - m_copyTransformsToVBOKernel(0), - m_rigidBodyPipeline(0), - m_np(0), - m_bp(0), - m_broadphaseDbvt(0), - m_pickConstraint(-1), - m_pickFixedBody(-1), - m_pickGraphicsShapeIndex(-1), - m_pickGraphicsShapeInstance(-1), - m_pickBody(-1), - m_altPressed(0), - m_controlPressed(0), - m_guiHelper(0) - - { - } -}; - -#endif //GPU_RIGIDBODY_INTERNAL_DATA_H diff --git a/engine/inc/bullet/OpenCL/rigidbody/GpuSphereScene.h b/engine/inc/bullet/OpenCL/rigidbody/GpuSphereScene.h deleted file mode 100644 index bc2e0014..00000000 --- a/engine/inc/bullet/OpenCL/rigidbody/GpuSphereScene.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef GPU_SPHERE_SCENE_H -#define GPU_SPHERE_SCENE_H - -#include "GpuRigidBodyDemo.h" - -class GpuSphereScene : public GpuRigidBodyDemo -{ -public: - GpuSphereScene() {} - virtual ~GpuSphereScene() {} - virtual const char* getName() - { - return "BoxOnSphere"; - } - - static GpuDemo* MyCreateFunc() - { - GpuDemo* demo = new GpuSphereScene; - return demo; - } - - virtual void setupScene(const ConstructionInfo& ci); -}; - -#endif //GPU_SPHERE_SCENE_H diff --git a/engine/inc/bullet/OpenGLWindow/EGLOpenGLWindow.h b/engine/inc/bullet/OpenGLWindow/EGLOpenGLWindow.h deleted file mode 100644 index 54b86fc2..00000000 --- a/engine/inc/bullet/OpenGLWindow/EGLOpenGLWindow.h +++ /dev/null @@ -1,71 +0,0 @@ -#ifndef EGL_OPENGL_WINDOW_H -#define EGL_OPENGL_WINDOW_H - -#ifdef BT_USE_EGL - -#include "../CommonInterfaces/CommonWindowInterface.h" - -class EGLOpenGLWindow : public CommonWindowInterface -{ - struct EGLInternalData2* m_data; - bool m_OpenGLInitialized; - bool m_requestedExit; - -public: - EGLOpenGLWindow(); - virtual ~EGLOpenGLWindow(); - - virtual void createDefaultWindow(int width, int height, const char* title) - { - b3gWindowConstructionInfo ci(width, height); - ci.m_title = title; - createWindow(ci); - } - - virtual void createWindow(const b3gWindowConstructionInfo& ci); - - virtual void closeWindow(); - - virtual void runMainLoop(); - virtual float getTimeInSeconds(); - - virtual bool requestedExit() const; - virtual void setRequestExit(); - - virtual void startRendering(); - - virtual void endRendering(); - - virtual bool isModifierKeyPressed(int key); - - virtual void setMouseMoveCallback(b3MouseMoveCallback mouseCallback); - virtual b3MouseMoveCallback getMouseMoveCallback(); - - virtual void setMouseButtonCallback(b3MouseButtonCallback mouseCallback); - virtual b3MouseButtonCallback getMouseButtonCallback(); - - virtual void setResizeCallback(b3ResizeCallback resizeCallback); - virtual b3ResizeCallback getResizeCallback(); - - virtual void setWheelCallback(b3WheelCallback wheelCallback); - virtual b3WheelCallback getWheelCallback(); - - virtual void setKeyboardCallback(b3KeyboardCallback keyboardCallback); - virtual b3KeyboardCallback getKeyboardCallback(); - - virtual void setRenderCallback(b3RenderCallback renderCallback); - - virtual void setWindowTitle(const char* title); - - virtual float getRetinaScale() const; - virtual void setAllowRetina(bool allow); - - virtual int getWidth() const; - virtual int getHeight() const; - - virtual int fileOpenDialog(char* fileName, int maxFileNameLength); -}; - -#endif //BT_USE_EGL - -#endif //EGL_OPENGL_WINDOW_H diff --git a/engine/inc/bullet/OpenGLWindow/GLFWOpenGLWindow.h b/engine/inc/bullet/OpenGLWindow/GLFWOpenGLWindow.h deleted file mode 100644 index 69ab5461..00000000 --- a/engine/inc/bullet/OpenGLWindow/GLFWOpenGLWindow.h +++ /dev/null @@ -1,72 +0,0 @@ - -#ifndef GLFW_OPENGL_WINDOW_H -#define GLFW_OPENGL_WINDOW_H - -#ifdef B3_USE_GLFW - -#include "../CommonInterfaces/CommonWindowInterface.h" - -#define b3gDefaultOpenGLWindow GLFWOpenGLWindow - -class GLFWOpenGLWindow : public CommonWindowInterface -{ - struct GLFWOpenGLWindowInternalData* m_data; - -protected: -public: - GLFWOpenGLWindow(); - - virtual ~GLFWOpenGLWindow(); - - virtual void createDefaultWindow(int width, int height, const char* title); - - virtual void createWindow(const b3gWindowConstructionInfo& ci); - - virtual void closeWindow(); - - virtual void runMainLoop(); - virtual float getTimeInSeconds(); - - virtual bool requestedExit() const; - virtual void setRequestExit(); - - virtual void startRendering(); - - virtual void endRendering(); - - virtual bool isModifierKeyPressed(int key); - - virtual void setMouseMoveCallback(b3MouseMoveCallback mouseCallback); - virtual b3MouseMoveCallback getMouseMoveCallback(); - - virtual void setMouseButtonCallback(b3MouseButtonCallback mouseCallback); - virtual b3MouseButtonCallback getMouseButtonCallback(); - - virtual void setResizeCallback(b3ResizeCallback resizeCallback); - virtual b3ResizeCallback getResizeCallback(); - - virtual void setWheelCallback(b3WheelCallback wheelCallback); - virtual b3WheelCallback getWheelCallback(); - - virtual void setKeyboardCallback(b3KeyboardCallback keyboardCallback); - virtual b3KeyboardCallback getKeyboardCallback(); - - virtual void setRenderCallback(b3RenderCallback renderCallback); - - virtual void setWindowTitle(const char* title); - - virtual float getRetinaScale() const; - virtual void setAllowRetina(bool allow); - - virtual int getWidth() const; - virtual int getHeight() const; - - virtual int fileOpenDialog(char* fileName, int maxFileNameLength); - - void keyboardCallbackInternal(int key, int state); - void mouseButtonCallbackInternal(int button, int state); - void mouseCursorCallbackInternal(double xPos, double yPos); - void resizeInternal(int width, int height); -}; -#endif //B3_USE_GLFW -#endif //GLFW_OPENGL_WINDOW_H diff --git a/engine/inc/bullet/OpenGLWindow/GLInstanceGraphicsShape.h b/engine/inc/bullet/OpenGLWindow/GLInstanceGraphicsShape.h deleted file mode 100644 index ce1781e5..00000000 --- a/engine/inc/bullet/OpenGLWindow/GLInstanceGraphicsShape.h +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef GL_INSTANCE_GRAPHICS_SHAPE_H -#define GL_INSTANCE_GRAPHICS_SHAPE_H - -#include "Bullet3Common/b3AlignedObjectArray.h" - -struct GLInstanceVertex -{ - float xyzw[4]; - float normal[3]; - float uv[2]; -}; -struct GLInstanceGraphicsShape -{ - b3AlignedObjectArray* m_vertices; - int m_numvertices; - b3AlignedObjectArray* m_indices; - int m_numIndices; - float m_scaling[4]; - - GLInstanceGraphicsShape() - : m_vertices(0), - m_indices(0) - { - } - - virtual ~GLInstanceGraphicsShape() - { - delete m_vertices; - delete m_indices; - } -}; - -#endif //GL_INSTANCE_GRAPHICS_SHAPE_H diff --git a/engine/inc/bullet/OpenGLWindow/GLInstanceRendererInternalData.h b/engine/inc/bullet/OpenGLWindow/GLInstanceRendererInternalData.h deleted file mode 100644 index 41a22a36..00000000 --- a/engine/inc/bullet/OpenGLWindow/GLInstanceRendererInternalData.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef GL_INSTANCE_RENDERER_INTERNAL_DATA_H -#define GL_INSTANCE_RENDERER_INTERNAL_DATA_H - -#include "OpenGLInclude.h" -#include "Bullet3Common/b3AlignedObjectArray.h" - -struct GLInstanceRendererInternalData -{ - b3AlignedObjectArray m_instance_positions_ptr; - b3AlignedObjectArray m_instance_quaternion_ptr; - b3AlignedObjectArray m_instance_colors_ptr; - b3AlignedObjectArray m_instance_scale_ptr; - - int m_vboSize; - GLuint m_vbo; - int m_totalNumInstances; - int m_maxNumObjectCapacity; - int m_maxShapeCapacityInBytes; -}; - -#endif //GL_INSTANCE_RENDERER_INTERNAL_DATA_H diff --git a/engine/inc/bullet/OpenGLWindow/GLInstancingRenderer.h b/engine/inc/bullet/OpenGLWindow/GLInstancingRenderer.h deleted file mode 100644 index 71575821..00000000 --- a/engine/inc/bullet/OpenGLWindow/GLInstancingRenderer.h +++ /dev/null @@ -1,156 +0,0 @@ -/* -Copyright (c) 2012 Advanced Micro Devices, Inc. - -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 Erwin Coumans - -#ifndef GL_INSTANCING_RENDERER_H -#define GL_INSTANCING_RENDERER_H - -#include "Bullet3Common/b3AlignedObjectArray.h" -#include "../CommonInterfaces/CommonRenderInterface.h" -#include "SimpleCamera.h" - -class GLInstancingRenderer : public CommonRenderInterface -{ - b3AlignedObjectArray m_graphicsInstances; - - struct InternalDataRenderer* m_data; - - bool m_textureenabled; - bool m_textureinitialized; - - int m_screenWidth; - int m_screenHeight; - - int m_upAxis; - - int m_planeReflectionShapeIndex; - - int registerGraphicsInstanceInternal(int shapeIndex, const float* position, const float* quaternion, const float* color, const float* scaling); - void rebuildGraphicsInstances(); - -public: - GLInstancingRenderer(int m_maxObjectCapacity, int maxShapeCapacityInBytes = 56 * 1024 * 1024); - virtual ~GLInstancingRenderer(); - - virtual void init(); - - virtual void renderScene(); - virtual void renderSceneInternal(int orgRenderMode = B3_DEFAULT_RENDERMODE); - - void InitShaders(); - void CleanupShaders(); - virtual void removeAllInstances(); - virtual void removeGraphicsInstance(int instanceUid); - - virtual void updateShape(int shapeIndex, const float* vertices, int numVertices); - - ///vertices must be in the format x,y,z, nx,ny,nz, u,v - virtual int registerShape(const float* vertices, int numvertices, const int* indices, int numIndices, int primitiveType = B3_GL_TRIANGLES, int textureIndex = -1); - - virtual int registerTexture(const unsigned char* texels, int width, int height, bool flipPixelsY = true); - virtual void updateTexture(int textureIndex, const unsigned char* texels, bool flipPixelsY = true); - virtual void activateTexture(int textureIndex); - virtual void replaceTexture(int shapeIndex, int textureId); - virtual int getShapeIndexFromInstance(int srcIndex); - virtual void removeTexture(int textureIndex); - - ///position x,y,z, quaternion x,y,z,w, color r,g,b,a, scaling x,y,z - virtual int registerGraphicsInstance(int shapeIndex, const float* position, const float* quaternion, const float* color, const float* scaling); - virtual int registerGraphicsInstance(int shapeIndex, const double* position, const double* quaternion, const double* color, const double* scaling); - - void writeTransforms(); - - virtual bool readSingleInstanceTransformToCPU(float* position, float* orientation, int srcIndex); - - virtual void writeSingleInstanceTransformToCPU(const float* position, const float* orientation, int srcIndex); - virtual void writeSingleInstanceTransformToCPU(const double* position, const double* orientation, int srcIndex) - { - float pos[4]; - float orn[4]; - pos[0] = (float)position[0]; - pos[1] = (float)position[1]; - pos[2] = (float)position[2]; - pos[3] = (float)position[3]; - orn[0] = (float)orientation[0]; - orn[1] = (float)orientation[1]; - orn[2] = (float)orientation[2]; - orn[3] = (float)orientation[3]; - writeSingleInstanceTransformToCPU(pos, orn, srcIndex); - } - - virtual void readSingleInstanceTransformFromCPU(int srcIndex, float* position, float* orientation); - - virtual void writeSingleInstanceTransformToGPU(float* position, float* orientation, int srcIndex); - - virtual void writeSingleInstanceColorToCPU(const float* color, int srcIndex); - virtual void writeSingleInstanceColorToCPU(const double* color, int srcIndex); - virtual void writeSingleInstanceFlagsToCPU(int flags, int srcIndex2); - - virtual void writeSingleInstanceSpecularColorToCPU(const double* specular, int srcIndex2); - virtual void writeSingleInstanceSpecularColorToCPU(const float* specular, int srcIndex2); - - virtual void writeSingleInstanceScaleToCPU(const float* scale, int srcIndex); - virtual void writeSingleInstanceScaleToCPU(const double* scale, int srcIndex); - - virtual struct GLInstanceRendererInternalData* getInternalData(); - - virtual void drawLine(const float from[4], const float to[4], const float color[4], float lineWidth = 1); - virtual void drawLine(const double from[4], const double to[4], const double color[4], double lineWidth = 1); - virtual void drawLines(const float* positions, const float color[4], int numPoints, int pointStrideInBytes, const unsigned int* indices, int numIndices, float pointDrawSize); - virtual void drawPoints(const float* positions, const float color[4], int numPoints, int pointStrideInBytes, float pointDrawSize); - virtual void drawPoint(const float* position, const float color[4], float pointSize = 1); - virtual void drawPoint(const double* position, const double color[4], double pointDrawSize = 1); - virtual void drawTexturedTriangleMesh(float worldPosition[3], float worldOrientation[4], const float* vertices, int numvertices, const unsigned int* indices, int numIndices, float color[4], int textureIndex = -1, int vertexLayout = 0); - - virtual void updateCamera(int upAxis = 1); - - virtual const CommonCameraInterface* getActiveCamera() const; - virtual CommonCameraInterface* getActiveCamera(); - virtual void setActiveCamera(CommonCameraInterface* cam); - - virtual void setLightPosition(const float lightPos[3]); - virtual void setLightPosition(const double lightPos[3]); - virtual void setShadowMapResolution(int shadowMapResolution); - virtual void setShadowMapIntensity(double shadowMapIntensity); - virtual void setShadowMapWorldSize(float worldSize); - void setLightSpecularIntensity(const float lightSpecularIntensity[3]); - virtual void setProjectiveTextureMatrices(const float viewMatrix[16], const float projectionMatrix[16]); - virtual void setProjectiveTexture(bool useProjectiveTexture); - - virtual void resize(int width, int height); - virtual int getScreenWidth() - { - return m_screenWidth; - } - virtual int getScreenHeight() - { - return m_screenHeight; - } - - virtual int getMaxShapeCapacity() const; - - virtual int getInstanceCapacity() const; - - virtual int getTotalNumInstances() const; - - virtual void enableShadowMap(); - - virtual void setPlaneReflectionShapeIndex(int index); - - virtual void clearZBuffer(); - - virtual void setRenderFrameBuffer(unsigned int renderFrameBuffer); -}; - -#endif //GL_INSTANCING_RENDERER_H diff --git a/engine/inc/bullet/OpenGLWindow/GLPrimInternalData.h b/engine/inc/bullet/OpenGLWindow/GLPrimInternalData.h deleted file mode 100644 index 144732c0..00000000 --- a/engine/inc/bullet/OpenGLWindow/GLPrimInternalData.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef PRIM_INTERNAL_DATA -#define PRIM_INTERNAL_DATA - -#include "OpenGLInclude.h" - -struct PrimInternalData -{ - GLuint m_shaderProg; - GLint m_viewmatUniform; - GLint m_projMatUniform; - GLint m_positionUniform; - GLint m_colourAttribute; - GLint m_positionAttribute; - GLint m_textureAttribute; - GLuint m_vertexBuffer; - GLuint m_vertexBuffer2; - - GLuint m_vertexArrayObject; - GLuint m_vertexArrayObject2; - - GLuint m_indexBuffer; - GLuint m_indexBuffer2; - GLuint m_texturehandle; -}; - -#endif //PRIM_INTERNAL_DATA diff --git a/engine/inc/bullet/OpenGLWindow/GLPrimitiveRenderer.h b/engine/inc/bullet/OpenGLWindow/GLPrimitiveRenderer.h deleted file mode 100644 index 5a5d70e7..00000000 --- a/engine/inc/bullet/OpenGLWindow/GLPrimitiveRenderer.h +++ /dev/null @@ -1,82 +0,0 @@ -#ifndef _GL_PRIMITIVE_RENDERER_H -#define _GL_PRIMITIVE_RENDERER_H - -//#include "OpenGLInclude.h" - -struct PrimVec2 -{ - PrimVec2() - { - } - PrimVec2(float x, float y) - { - p[0] = x; - p[1] = y; - } - float p[2]; -}; - -struct PrimVec4 -{ - PrimVec4() {} - PrimVec4(float x, float y, float z, float w) - { - p[0] = x; - p[1] = y; - p[2] = z; - p[3] = w; - } - - float p[4]; -}; - -struct PrimVertex -{ - PrimVertex(const PrimVec4& p, const PrimVec4& c, const PrimVec2& u) - : position(p), - colour(c), - uv(u) - { - } - - PrimVertex() - { - } - PrimVec4 position; - PrimVec4 colour; - PrimVec2 uv; -}; - -class GLPrimitiveRenderer -{ - int m_screenWidth; - int m_screenHeight; - - struct PrimInternalData* m_data; - struct PrimInternalData2* m_data2; - void loadBufferData(); - -public: - GLPrimitiveRenderer(int screenWidth, int screenHeight); - virtual ~GLPrimitiveRenderer(); - - void drawRect(float x0, float y0, float x1, float y1, float color[4]); - void drawTexturedRect(float x0, float y0, float x1, float y1, float color[4], float u0, float v0, float u1, float v1, int useRGBA = 0); - void drawTexturedRect3D(const PrimVertex& v0, const PrimVertex& v1, const PrimVertex& v2, const PrimVertex& v3, float viewMat[16], float projMat[16], bool useRGBA = true); - void drawLine(); //float from[4], float to[4], float color[4]); - void setScreenSize(int width, int height); - - void drawTexturedRect2(float x0, float y0, float x1, float y1, float color[4], float u0, float v0, float u1, float v1, int useRGBA = 0); - void drawTexturedRect2a(float x0, float y0, float x1, float y1, float color[4], float u0, float v0, float u1, float v1, int useRGBA = 0); - void flushBatchedRects(); - - void drawTexturedRect3D2Text(bool useRGBA = true); - void drawTexturedRect3D2(PrimVertex* vertices, int numVertices, bool useRGBA = true); - - PrimInternalData* getData() - { - return m_data; - } -}; - -#endif //_GL_PRIMITIVE_RENDERER_H diff --git a/engine/inc/bullet/OpenGLWindow/GLRenderToTexture.h b/engine/inc/bullet/OpenGLWindow/GLRenderToTexture.h deleted file mode 100644 index 081f2ec9..00000000 --- a/engine/inc/bullet/OpenGLWindow/GLRenderToTexture.h +++ /dev/null @@ -1,30 +0,0 @@ - -#ifndef GL_RENDER_TO_TEXTURE_H -#define GL_RENDER_TO_TEXTURE_H - -///See http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-14-render-to-texture/ -#include "OpenGLInclude.h" - -enum -{ - RENDERTEXTURE_COLOR = 1, - RENDERTEXTURE_DEPTH, -}; -struct GLRenderToTexture -{ - GLuint m_framebufferName; - GLuint m_depthrenderbuffer; - bool m_initialized; - int m_renderTextureType; - -public: - GLRenderToTexture(); - - void init(int width, int height, GLuint textureId, int renderTextureType = RENDERTEXTURE_COLOR); - bool enable(); - void disable(); - - virtual ~GLRenderToTexture(); -}; - -#endif //GL_RENDER_TO_TEXTURE_H diff --git a/engine/inc/bullet/OpenGLWindow/GwenOpenGL3CoreRenderer.h b/engine/inc/bullet/OpenGLWindow/GwenOpenGL3CoreRenderer.h deleted file mode 100644 index b28a45f8..00000000 --- a/engine/inc/bullet/OpenGLWindow/GwenOpenGL3CoreRenderer.h +++ /dev/null @@ -1,372 +0,0 @@ - -#ifndef __GWEN_OPENGL3_CORE_RENDERER_H -#define __GWEN_OPENGL3_CORE_RENDERER_H - -#include "Gwen/Gwen.h" -#include "Gwen/BaseRender.h" -#include "GLPrimitiveRenderer.h" -#include "../OpenGLWindow/OpenGLInclude.h" - -struct sth_stash; -#include "fontstash.h" -#include "Gwen/Texture.h" - -#include "TwFonts.h" -static float extraSpacing = 0.; //6f; -#include -#include - -template -inline void MyClamp(T& a, const T& lb, const T& ub) -{ - if (a < lb) - { - a = lb; - } - else if (ub < a) - { - a = ub; - } -} - -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); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, _Font->m_TexWidth, _Font->m_TexHeight, 0, GL_RED, GL_UNSIGNED_BYTE, _Font->m_TexBytes); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glBindTexture(GL_TEXTURE_2D, 0); - - return TexID; -} - -struct MyTextureLoader -{ - virtual ~MyTextureLoader() - { - } - virtual void LoadTexture(Gwen::Texture* pTexture) = 0; - virtual void FreeTexture(Gwen::Texture* pTexture) = 0; -}; - -class GwenOpenGL3CoreRenderer : public Gwen::Renderer::Base -{ - GLPrimitiveRenderer* m_primitiveRenderer; - float m_currentColor[4]; - float m_yOffset; - sth_stash* m_font; - float m_screenWidth; - float m_screenHeight; - float m_fontScaling; - float m_retinaScale; - bool m_useTrueTypeFont; - const CTexFont* m_currentFont; - - GLuint m_fontTextureId; - MyTextureLoader* m_textureLoader; - -public: - GwenOpenGL3CoreRenderer(GLPrimitiveRenderer* primRender, sth_stash* font, float screenWidth, float screenHeight, float retinaScale, MyTextureLoader* loader = 0) - : m_primitiveRenderer(primRender), - m_font(font), - m_screenWidth(screenWidth), - m_screenHeight(screenHeight), - m_retinaScale(retinaScale), - m_useTrueTypeFont(false), - m_textureLoader(loader) - { - ///only enable true type fonts on Macbook Retina, it looks gorgeous - if (retinaScale == 2.0f) - { - m_useTrueTypeFont = true; - } - m_currentColor[0] = 1; - m_currentColor[1] = 1; - m_currentColor[2] = 1; - m_currentColor[3] = 1; - - m_fontScaling = 16.f * m_retinaScale; - - TwGenerateDefaultFonts(); - - m_currentFont = g_DefaultNormalFont; - //m_currentFont = g_DefaultNormalFontAA; - - //m_currentFont = g_DefaultLargeFont; - m_fontTextureId = BindFont(m_currentFont); - } - - virtual ~GwenOpenGL3CoreRenderer() - { - TwDeleteDefaultFonts(); - } - virtual void Resize(int width, int height) - { - m_screenWidth = width; - m_screenHeight = height; - } - - virtual void Begin() - { - m_yOffset = 0; - glEnable(GL_BLEND); - assert(glGetError() == GL_NO_ERROR); - - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - assert(glGetError() == GL_NO_ERROR); - - assert(glGetError() == GL_NO_ERROR); - - glDisable(GL_DEPTH_TEST); - assert(glGetError() == GL_NO_ERROR); - //glColor4ub(255,0,0,255); - - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - // saveOpenGLState(width,height);//m_glutScreenWidth,m_glutScreenHeight); - - assert(glGetError() == GL_NO_ERROR); - - glDisable(GL_CULL_FACE); - - glDisable(GL_DEPTH_TEST); - assert(glGetError() == GL_NO_ERROR); - - glEnable(GL_BLEND); - - assert(glGetError() == GL_NO_ERROR); - } - virtual void End() - { - glDisable(GL_BLEND); - } - - virtual void StartClip() - { - if (m_useTrueTypeFont) - sth_flush_draw(m_font); - Gwen::Rect rect = ClipRegion(); - - // OpenGL's coords are from the bottom left - // so we need to translate them here. - { - GLint view[4]; - glGetIntegerv(GL_VIEWPORT, &view[0]); - rect.y = view[3] / m_retinaScale - (rect.y + rect.h); - } - - glScissor(m_retinaScale * rect.x * Scale(), m_retinaScale * rect.y * Scale(), m_retinaScale * rect.w * Scale(), m_retinaScale * rect.h * Scale()); - glEnable(GL_SCISSOR_TEST); - //glDisable( GL_SCISSOR_TEST ); - }; - - virtual void EndClip() - { - if (m_useTrueTypeFont) - sth_flush_draw(m_font); - glDisable(GL_SCISSOR_TEST); - }; - - virtual void SetDrawColor(Gwen::Color color) - { - m_currentColor[0] = color.r / 256.f; - m_currentColor[1] = color.g / 256.f; - m_currentColor[2] = color.b / 256.f; - m_currentColor[3] = color.a / 256.f; - } - virtual void DrawFilledRect(Gwen::Rect rect) - { - // BT_PROFILE("GWEN_DrawFilledRect"); - Translate(rect); - - m_primitiveRenderer->drawRect(rect.x, rect.y + m_yOffset, - rect.x + rect.w, rect.y + rect.h + m_yOffset, m_currentColor); - - // m_primitiveRenderer->drawTexturedRect2a(rect.x, rect.y+m_yOffset, - // rect.x+rect.w, rect.y+rect.h+m_yOffset, m_currentColor,0,0,1,1); - // m_yOffset+=rect.h+10; - } - - void RenderText(Gwen::Font* pFont, Gwen::Point rasterPos, const Gwen::UnicodeString& text) - { - // BT_PROFILE("GWEN_RenderText"); - - Gwen::String str = Gwen::Utility::UnicodeToString(text); - const char* unicodeText = (const char*)str.c_str(); - - Gwen::Rect r; - r.x = rasterPos.x; - r.y = rasterPos.y; - r.w = 0; - r.h = 0; - - // - //printf("str = %s\n",unicodeText); - //int xpos=0; - //int ypos=0; - float dx; - - int measureOnly = 0; - - if (m_useTrueTypeFont) - { - float yoffset = 0.f; - if (m_retinaScale == 2.0f) - { - yoffset = -12; - } - Translate(r); - sth_draw_text(m_font, - 1, m_fontScaling, - r.x, r.y + yoffset, - unicodeText, &dx, m_screenWidth, m_screenHeight, measureOnly, m_retinaScale); - } - else - { - //float width = 0.f; - int pos = 0; - //float color[]={0.2f,0.2,0.2f,1.f}; - - glBindTexture(GL_TEXTURE_2D, m_fontTextureId); - float width = r.x; - - while (unicodeText[pos]) - { - int c = unicodeText[pos]; - r.h = m_currentFont->m_CharHeight; - r.w = m_currentFont->m_CharWidth[c] + extraSpacing; - Gwen::Rect rect = r; - Translate(rect); - - m_primitiveRenderer->drawTexturedRect2(rect.x, rect.y + m_yOffset, rect.x + rect.w, rect.y + rect.h + m_yOffset, m_currentColor, m_currentFont->m_CharU0[c], m_currentFont->m_CharV0[c], m_currentFont->m_CharU1[c], m_currentFont->m_CharV1[c]); - - width += r.w; - r.x = width; - pos++; - } - { - m_primitiveRenderer->drawTexturedRect3D2Text(false); - } - glBindTexture(GL_TEXTURE_2D, 0); - } - } - Gwen::Point MeasureText(Gwen::Font* pFont, const Gwen::UnicodeString& text) - { - // BT_PROFILE("GWEN_MeasureText"); - Gwen::String str = Gwen::Utility::UnicodeToString(text); - const char* unicodeText = (const char*)str.c_str(); - - // printf("str = %s\n",unicodeText); - int xpos = 0; - int ypos = 0; - - int measureOnly = 1; - float dx = 0; - if (m_useTrueTypeFont) - { - sth_draw_text(m_font, - 1, m_fontScaling, - xpos, ypos, - unicodeText, &dx, m_screenWidth, m_screenHeight, measureOnly); - - Gwen::Point pt; - - if (m_retinaScale == 2.0f) - { - pt.x = dx * Scale() / 2.f; - pt.y = m_fontScaling / 2 * Scale() + 1; - } - else - { - pt.x = dx * Scale(); - pt.y = m_fontScaling * Scale() + 1; - } - return pt; - } - else - { - float width = 0.f; - int pos = 0; - while (unicodeText[pos]) - { - width += m_currentFont->m_CharWidth[(int)unicodeText[pos]] + extraSpacing; - pos++; - } - Gwen::Point pt; - int fontHeight = m_currentFont->m_CharHeight; - - pt.x = width * Scale(); - pt.y = (fontHeight + 2) * Scale(); - - return pt; - } - - return Gwen::Renderer::Base::MeasureText(pFont, text); - } - - virtual void LoadTexture(Gwen::Texture* pTexture) - { - if (m_textureLoader) - m_textureLoader->LoadTexture(pTexture); - } - virtual void FreeTexture(Gwen::Texture* pTexture) - { - if (m_textureLoader) - m_textureLoader->FreeTexture(pTexture); - } - - virtual void DrawTexturedRect(Gwen::Texture* pTexture, Gwen::Rect rect, float u1 = 0.0f, float v1 = 0.0f, float u2 = 1.0f, float v2 = 1.0f) - { - // BT_PROFILE("DrawTexturedRect"); - Translate(rect); - - //float eraseColor[4] = {0,0,0,0}; - //m_primitiveRenderer->drawRect(rect.x, rect.y+m_yOffset, rect.x+rect.w, rect.y+rect.h+m_yOffset, eraseColor); - - GLint texHandle = (GLint)pTexture->m_intData; - //if (!texHandle) - // return; - - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, texHandle); - // glDisable(GL_DEPTH_TEST); - - assert(glGetError() == GL_NO_ERROR); - - /* bool useFiltering = true; - if (useFiltering) - { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - } else - { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - } - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); -*/ - - //glEnable(GL_TEXTURE_2D); - - // glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE ); - static float add = 0.0; - //add+=1./512.;//0.01; - float color[4] = {1, 1, 1, 1}; - - m_primitiveRenderer->drawTexturedRect(rect.x, rect.y + m_yOffset, rect.x + rect.w, rect.y + rect.h + m_yOffset, color, 0 + add, 0, 1 + add, 1, true); - - assert(glGetError() == GL_NO_ERROR); - } -}; -#endif //__GWEN_OPENGL3_CORE_RENDERER_H diff --git a/engine/inc/bullet/OpenGLWindow/LoadShader.h b/engine/inc/bullet/OpenGLWindow/LoadShader.h deleted file mode 100644 index b879a153..00000000 --- a/engine/inc/bullet/OpenGLWindow/LoadShader.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef _LOAD_SHADER_H -#define _LOAD_SHADER_H - -#include "OpenGLInclude.h" - -#ifdef __cplusplus -extern "C" -{ -#endif //__cplusplus - - GLuint gltLoadShaderPair(const char *szVertexProg, const char *szFragmentProg); - -#ifdef __cplusplus -} -#endif //__cplusplus - -#endif //_LOAD_SHADER_H diff --git a/engine/inc/bullet/OpenGLWindow/MacOpenGLWindow.h b/engine/inc/bullet/OpenGLWindow/MacOpenGLWindow.h deleted file mode 100644 index f0bc34be..00000000 --- a/engine/inc/bullet/OpenGLWindow/MacOpenGLWindow.h +++ /dev/null @@ -1,72 +0,0 @@ -#ifndef MAC_OPENGL_WINDOW_H -#define MAC_OPENGL_WINDOW_H - -#include "../CommonInterfaces/CommonWindowInterface.h" - -#define b3gDefaultOpenGLWindow MacOpenGLWindow - -class MacOpenGLWindow : public CommonWindowInterface -{ - struct MacOpenGLWindowInternalData* m_internalData; - -public: - MacOpenGLWindow(); - virtual ~MacOpenGLWindow(); - - void init(int width, int height, const char* windowTitle); - - void closeWindow(); - - void startRendering(); - - void endRendering(); //swap buffers - - virtual bool requestedExit() const; - - virtual void setRequestExit(); - - void getMouseCoordinates(int& x, int& y); - - void runMainLoop(); - - virtual bool isModifierKeyPressed(int key); - - void setMouseButtonCallback(b3MouseButtonCallback mouseCallback); - - void setMouseMoveCallback(b3MouseMoveCallback mouseCallback); - - void setResizeCallback(b3ResizeCallback resizeCallback); - - void setKeyboardCallback(b3KeyboardCallback keyboardCallback); - - virtual b3MouseMoveCallback getMouseMoveCallback(); - - virtual b3MouseButtonCallback getMouseButtonCallback(); - - virtual b3ResizeCallback getResizeCallback(); - - virtual b3WheelCallback getWheelCallback(); - - b3KeyboardCallback getKeyboardCallback(); - - void setWheelCallback(b3WheelCallback wheelCallback); - - float getRetinaScale() const; - - virtual void setAllowRetina(bool allow); - - virtual void createWindow(const b3gWindowConstructionInfo& ci); - - virtual float getTimeInSeconds(); - - virtual int getWidth() const; - virtual int getHeight() const; - - virtual void setRenderCallback(b3RenderCallback renderCallback); - - virtual void setWindowTitle(const char* title); - - int fileOpenDialog(char* filename, int maxNameLength); -}; - -#endif diff --git a/engine/inc/bullet/OpenGLWindow/MacOpenGLWindowObjC.h b/engine/inc/bullet/OpenGLWindow/MacOpenGLWindowObjC.h deleted file mode 100644 index 3b6173d1..00000000 --- a/engine/inc/bullet/OpenGLWindow/MacOpenGLWindowObjC.h +++ /dev/null @@ -1,72 +0,0 @@ -#ifndef MAC_OPENGL_WINDOW_OBJC_H -#define MAC_OPENGL_WINDOW_OBJC_H - -struct MacOpenGLWindowInternalData; - -#include "../CommonInterfaces/CommonCallbacks.h" - -struct MacWindowConstructionInfo -{ - int m_width; - int m_height; - int m_fullscreen; - int m_colorBitsPerPixel; - void* m_windowHandle; - const char* m_title; - int m_openglVersion; - int m_allowRetina; -}; - -enum -{ - MY_MAC_ALTKEY = 1, - MY_MAC_SHIFTKEY = 2, - MY_MAC_CONTROL_KEY = 4 -}; - -#ifdef __cplusplus -extern "C" -{ -#endif - - struct MacOpenGLWindowInternalData* Mac_createData(); - void Mac_destroyData(struct MacOpenGLWindowInternalData* data); - - int Mac_createWindow(struct MacOpenGLWindowInternalData* m_internalData, struct MacWindowConstructionInfo* ci); - - void Mac_setWindowTitle(struct MacOpenGLWindowInternalData* data, const char* windowTitle); - int Mac_updateWindow(struct MacOpenGLWindowInternalData* m_internalData); - void Mac_swapBuffer(struct MacOpenGLWindowInternalData* m_internalData); - int Mac_requestedExit(struct MacOpenGLWindowInternalData* m_internalData); - void Mac_setRequestExit(struct MacOpenGLWindowInternalData* m_internalData); - float Mac_getRetinaScale(struct MacOpenGLWindowInternalData* m_internalData); - void Mac_setAllowRetina(struct MacOpenGLWindowInternalData* m_internalData, int allow); - - int Mac_getWidth(struct MacOpenGLWindowInternalData* m_internalData); - int Mac_getHeight(struct MacOpenGLWindowInternalData* m_internalData); - - int Mac_fileOpenDialog(char* filename, int maxNameLength); - - void Mac_setKeyboardCallback(struct MacOpenGLWindowInternalData* m_internalData, b3KeyboardCallback keyboardCallback); - b3KeyboardCallback Mac_getKeyboardCallback(struct MacOpenGLWindowInternalData* m_internalData); - int Mac_isModifierKeyPressed(struct MacOpenGLWindowInternalData* m_internalData, int key); - - void Mac_setMouseButtonCallback(struct MacOpenGLWindowInternalData* m_internalData, b3MouseButtonCallback mouseCallback); - b3MouseButtonCallback Mac_getMouseButtonCallback(struct MacOpenGLWindowInternalData* m_internalData); - void Mac_getMouseCoordinates(struct MacOpenGLWindowInternalData* m_internalData, int* xPtr, int* yPtr); - void Mac_setMouseMoveCallback(struct MacOpenGLWindowInternalData* m_internalData, b3MouseMoveCallback mouseCallback); - b3MouseMoveCallback Mac_getMouseMoveCallback(struct MacOpenGLWindowInternalData* m_internalData); - - void Mac_setWheelCallback(struct MacOpenGLWindowInternalData* m_internalData, b3WheelCallback wheelCallback); - b3WheelCallback Mac_getWheelCallback(struct MacOpenGLWindowInternalData* m_internalData); - - void Mac_setResizeCallback(struct MacOpenGLWindowInternalData* m_internalData, b3ResizeCallback resizeCallback); - b3ResizeCallback Mac_getResizeCallback(struct MacOpenGLWindowInternalData* m_internalData); - - //void Mac_setRenderCallback(struct MacOpenGLWindowInternalData* m_internalData, b3RenderCallback renderCallback); - -#ifdef __cplusplus -} -#endif - -#endif //MAC_OPENGL_WINDOW_OBJC_H diff --git a/engine/inc/bullet/OpenGLWindow/OpenGL2Include.h b/engine/inc/bullet/OpenGLWindow/OpenGL2Include.h deleted file mode 100644 index ce07038e..00000000 --- a/engine/inc/bullet/OpenGLWindow/OpenGL2Include.h +++ /dev/null @@ -1,48 +0,0 @@ -/* -Copyright (c) 2012 Advanced Micro Devices, Inc. - -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 Erwin Coumans - -#ifndef __OPENGL_INCLUDE_H -#define __OPENGL_INCLUDE_H - -#ifdef BT_NO_GLAD -#include "third_party/GL/gl/include/EGL/egl.h" -#include "third_party/GL/gl/include/EGL/eglext.h" -#include "third_party/GL/gl/include/GL/gl.h" -#else - -#ifdef B3_USE_GLFW -#include "glad/gl.h" -#include -#else -#include "glad/gl.h" -#endif //B3_USE_GLFW -#endif //BT_NO_GLAD - -//disable glGetError -//#undef glGetError -//#define glGetError MyGetError -// -//GLenum inline MyGetError() -//{ -// return 0; -//} - -///on Linux only glDrawElementsInstancedARB is defined?!? -//#ifdef __linux -//#define glDrawElementsInstanced glDrawElementsInstancedARB -// -//#endif //__linux - -#endif //__OPENGL_INCLUDE_H diff --git a/engine/inc/bullet/OpenGLWindow/OpenGLInclude.h b/engine/inc/bullet/OpenGLWindow/OpenGLInclude.h deleted file mode 100644 index 4000ceca..00000000 --- a/engine/inc/bullet/OpenGLWindow/OpenGLInclude.h +++ /dev/null @@ -1,31 +0,0 @@ -/* -Copyright (c) 2012 Advanced Micro Devices, Inc. - -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 Erwin Coumans - -#ifndef __OPENGL_INCLUDE_H -#define __OPENGL_INCLUDE_H - -#ifdef BT_NO_GLAD -#include "third_party/GL/gl/include/EGL/egl.h" -#include "third_party/GL/gl/include/EGL/eglext.h" -#include "third_party/GL/gl/include/GL/gl.h" -#else -#ifdef B3_USE_GLFW -#include -#include -#else -#include "glad/gl.h" -#endif //B3_USE_GLFW -#endif //BT_NO_GLAD -#endif //__OPENGL_INCLUDE_H diff --git a/engine/inc/bullet/OpenGLWindow/Shaders/createShadowMapInstancingPS.h b/engine/inc/bullet/OpenGLWindow/Shaders/createShadowMapInstancingPS.h deleted file mode 100644 index 8b2dce8f..00000000 --- a/engine/inc/bullet/OpenGLWindow/Shaders/createShadowMapInstancingPS.h +++ /dev/null @@ -1,10 +0,0 @@ -//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project -static const char* createShadowMapInstancingFragmentShader= \ -"#version 330\n" -"precision highp float;\n" -"layout(location = 0) out float fragmentdepth;\n" -"void main(void)\n" -"{\n" -" fragmentdepth = gl_FragCoord.z;\n" -"}\n" -; diff --git a/engine/inc/bullet/OpenGLWindow/Shaders/createShadowMapInstancingVS.h b/engine/inc/bullet/OpenGLWindow/Shaders/createShadowMapInstancingVS.h deleted file mode 100644 index 5e46a20f..00000000 --- a/engine/inc/bullet/OpenGLWindow/Shaders/createShadowMapInstancingVS.h +++ /dev/null @@ -1,48 +0,0 @@ -//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project -static const char* createShadowMapInstancingVertexShader= \ -"#version 330\n" -"precision highp float;\n" -"layout (location = 0) in vec4 position;\n" -"layout (location = 1) in vec4 instance_position;\n" -"layout (location = 2) in vec4 instance_quaternion;\n" -"layout (location = 3) in vec2 uvcoords;\n" -"layout (location = 4) in vec3 vertexnormal;\n" -"layout (location = 5) in vec4 instance_color;\n" -"layout (location = 6) in vec4 instance_scale_obUid;\n" -"uniform mat4 depthMVP;\n" -"vec4 quatMul ( in vec4 q1, in vec4 q2 )\n" -"{\n" -" vec3 im = q1.w * q2.xyz + q1.xyz * q2.w + cross ( q1.xyz, q2.xyz );\n" -" vec4 dt = q1 * q2;\n" -" float re = dot ( dt, vec4 ( -1.0, -1.0, -1.0, 1.0 ) );\n" -" return vec4 ( im, re );\n" -"}\n" -"vec4 quatFromAxisAngle(vec4 axis, in float angle)\n" -"{\n" -" float cah = cos(angle*0.5);\n" -" float sah = sin(angle*0.5);\n" -" float d = inversesqrt(dot(axis,axis));\n" -" vec4 q = vec4(axis.x*sah*d,axis.y*sah*d,axis.z*sah*d,cah);\n" -" return q;\n" -"}\n" -"//\n" -"// vector rotation via quaternion\n" -"//\n" -"vec4 quatRotate3 ( in vec3 p, in vec4 q )\n" -"{\n" -" vec4 temp = quatMul ( q, vec4 ( p, 0.0 ) );\n" -" return quatMul ( temp, vec4 ( -q.x, -q.y, -q.z, q.w ) );\n" -"}\n" -"vec4 quatRotate ( in vec4 p, in vec4 q )\n" -"{\n" -" vec4 temp = quatMul ( q, p );\n" -" return quatMul ( temp, vec4 ( -q.x, -q.y, -q.z, q.w ) );\n" -"}\n" -"void main(void)\n" -"{\n" -" vec4 q = instance_quaternion;\n" -" vec4 localcoord = quatRotate3( position.xyz*instance_scale_obUid.xyz,q);\n" -" vec4 vertexPos = depthMVP * vec4( (instance_position+localcoord).xyz,1);\n" -" gl_Position = vertexPos;\n" -"}\n" -; diff --git a/engine/inc/bullet/OpenGLWindow/Shaders/instancingPS.h b/engine/inc/bullet/OpenGLWindow/Shaders/instancingPS.h deleted file mode 100644 index 8e2ed9f2..00000000 --- a/engine/inc/bullet/OpenGLWindow/Shaders/instancingPS.h +++ /dev/null @@ -1,35 +0,0 @@ -//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project -static const char* instancingFragmentShader= \ -"#version 330\n" -"precision highp float;\n" -"in Fragment\n" -"{\n" -" vec4 color;\n" -"} fragment;\n" -"in Vert\n" -"{\n" -" vec2 texcoord;\n" -"} vert;\n" -"uniform sampler2D Diffuse;\n" -"in vec3 lightDir,normal,ambient;\n" -"out vec4 color;\n" -"void main_textured(void)\n" -"{\n" -" color = vec4(0.1,0.2,0.3,0.3);\n" -"}\n" -"void main(void)\n" -"{\n" -" vec4 texel = fragment.color*texture(Diffuse,vert.texcoord);//fragment.color;\n" -" vec3 ct,cf;\n" -" float intensity,at,af;\n" -" \n" -" intensity = 0.5+0.5*clamp( dot( normalize(normal),lightDir ), -1,1 );\n" -" cf = intensity*(vec3(1.0,1.0,1.0)-ambient)+ambient;\n" -" af = 1.0;\n" -" \n" -" ct = texel.rgb;\n" -" at = texel.a;\n" -" \n" -" color = vec4(ct * cf, at * af); \n" -"}\n" -; diff --git a/engine/inc/bullet/OpenGLWindow/Shaders/instancingVS.h b/engine/inc/bullet/OpenGLWindow/Shaders/instancingVS.h deleted file mode 100644 index 199bfe5a..00000000 --- a/engine/inc/bullet/OpenGLWindow/Shaders/instancingVS.h +++ /dev/null @@ -1,69 +0,0 @@ -//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project -static const char* instancingVertexShader= \ -"#version 330\n" -"precision highp float;\n" -"layout (location = 0) in vec4 position;\n" -"layout (location = 1) in vec4 instance_position;\n" -"layout (location = 2) in vec4 instance_quaternion;\n" -"layout (location = 3) in vec2 uvcoords;\n" -"layout (location = 4) in vec3 vertexnormal;\n" -"layout (location = 5) in vec4 instance_color;\n" -"layout (location = 6) in vec4 instance_scale_obUid;\n" -"uniform mat4 ModelViewMatrix;\n" -"uniform mat4 ProjectionMatrix;\n" -"uniform vec3 lightDirIn;\n" -"out Fragment\n" -"{\n" -" vec4 color;\n" -"} fragment;\n" -"out Vert\n" -"{\n" -" vec2 texcoord;\n" -"} vert;\n" -"vec4 quatMul ( in vec4 q1, in vec4 q2 )\n" -"{\n" -" vec3 im = q1.w * q2.xyz + q1.xyz * q2.w + cross ( q1.xyz, q2.xyz );\n" -" vec4 dt = q1 * q2;\n" -" float re = dot ( dt, vec4 ( -1.0, -1.0, -1.0, 1.0 ) );\n" -" return vec4 ( im, re );\n" -"}\n" -"vec4 quatFromAxisAngle(vec4 axis, in float angle)\n" -"{\n" -" float cah = cos(angle*0.5);\n" -" float sah = sin(angle*0.5);\n" -" float d = inversesqrt(dot(axis,axis));\n" -" vec4 q = vec4(axis.x*sah*d,axis.y*sah*d,axis.z*sah*d,cah);\n" -" return q;\n" -"}\n" -"//\n" -"// vector rotation via quaternion\n" -"//\n" -"vec4 quatRotate3 ( in vec3 p, in vec4 q )\n" -"{\n" -" vec4 temp = quatMul ( q, vec4 ( p, 0.0 ) );\n" -" return quatMul ( temp, vec4 ( -q.x, -q.y, -q.z, q.w ) );\n" -"}\n" -"vec4 quatRotate ( in vec4 p, in vec4 q )\n" -"{\n" -" vec4 temp = quatMul ( q, p );\n" -" return quatMul ( temp, vec4 ( -q.x, -q.y, -q.z, q.w ) );\n" -"}\n" -"out vec3 lightDir,normal,ambient;\n" -"void main(void)\n" -"{\n" -" vec4 q = instance_quaternion;\n" -" ambient = vec3(0.5,.5,0.5);\n" -" \n" -" vec4 worldNormal = (quatRotate3( vertexnormal,q));\n" -" normal = normalize(worldNormal).xyz;\n" -" \n" -" lightDir = lightDirIn;\n" -" \n" -" vec4 localcoord = quatRotate3( position.xyz*instance_scale_obUid.xyz,q);\n" -" vec4 vertexPos = ProjectionMatrix * ModelViewMatrix *(instance_position+localcoord);\n" -" gl_Position = vertexPos;\n" -" \n" -" fragment.color = instance_color;\n" -" vert.texcoord = uvcoords;\n" -"}\n" -; diff --git a/engine/inc/bullet/OpenGLWindow/Shaders/linesPS.h b/engine/inc/bullet/OpenGLWindow/Shaders/linesPS.h deleted file mode 100644 index 49a4cf3e..00000000 --- a/engine/inc/bullet/OpenGLWindow/Shaders/linesPS.h +++ /dev/null @@ -1,10 +0,0 @@ -//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project -static const char* linesFragmentShader= \ -"#version 150\n" -"in vec4 colourV;\n" -"out vec4 fragColour;\n" -"void main(void)\n" -"{\n" -" fragColour = colourV;\n" -"}\n" -; diff --git a/engine/inc/bullet/OpenGLWindow/Shaders/linesVS.h b/engine/inc/bullet/OpenGLWindow/Shaders/linesVS.h deleted file mode 100644 index 8fc6eb3e..00000000 --- a/engine/inc/bullet/OpenGLWindow/Shaders/linesVS.h +++ /dev/null @@ -1,15 +0,0 @@ -//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project -static const char* linesVertexShader= \ -"#version 150 \n" -"uniform mat4 ModelViewMatrix;\n" -"uniform mat4 ProjectionMatrix;\n" -"uniform vec4 colour;\n" -"in vec4 position;\n" -"out vec4 colourV;\n" -"void main (void)\n" -"{\n" -" colourV = colour;\n" -" gl_Position = ProjectionMatrix * ModelViewMatrix * position;\n" -" \n" -"}\n" -; diff --git a/engine/inc/bullet/OpenGLWindow/Shaders/pointSpritePS.h b/engine/inc/bullet/OpenGLWindow/Shaders/pointSpritePS.h deleted file mode 100644 index e0d57e23..00000000 --- a/engine/inc/bullet/OpenGLWindow/Shaders/pointSpritePS.h +++ /dev/null @@ -1,33 +0,0 @@ -//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project -static const char* pointSpriteFragmentShader= \ -"#version 330\n" -"precision highp float;\n" -"in Fragment\n" -"{\n" -" vec4 color;\n" -"} fragment;\n" -"in vec3 ambient;\n" -"out vec4 color;\n" -"void main_textured(void)\n" -"{\n" -" color = fragment.color;//texture2D(Diffuse,vert.texcoord);//fragment.color;\n" -"}\n" -"void main(void)\n" -"{\n" -" vec3 N;\n" -" N.xy = gl_PointCoord.st*vec2(2.0, -2.0) + vec2(-1.0, 1.0);\n" -" float mag = dot(N.xy, N.xy);\n" -" if (mag > 1.0) discard; \n" -" vec4 texel = fragment.color;//vec4(1,0,0,1);//fragment.color*texture(Diffuse,vert.texcoord);//fragment.color;\n" -" vec3 ct;\n" -" float at,af;\n" -" af = 1.0;\n" -" \n" -" ct = texel.rgb;\n" -" at = texel.a;\n" -" \n" -" vec3 lightDir= vec3(1,0,0);\n" -" float diffuse = max(0.0, dot(lightDir, N));\n" -" color = vec4(ct * diffuse, at * af); \n" -"}\n" -; diff --git a/engine/inc/bullet/OpenGLWindow/Shaders/pointSpriteVS.h b/engine/inc/bullet/OpenGLWindow/Shaders/pointSpriteVS.h deleted file mode 100644 index ba1ac583..00000000 --- a/engine/inc/bullet/OpenGLWindow/Shaders/pointSpriteVS.h +++ /dev/null @@ -1,37 +0,0 @@ -//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project -static const char* pointSpriteVertexShader= \ -"#version 330\n" -"precision highp float;\n" -"layout (location = 0) in vec4 position;\n" -"layout (location = 1) in vec4 instance_position;\n" -"layout (location = 3) in vec2 uvcoords;\n" -"layout (location = 4) in vec3 vertexnormal;\n" -"layout (location = 5) in vec4 instance_color;\n" -"layout (location = 6) in vec4 instance_scale_obUid;\n" -"uniform float screenWidth = 700.f;\n" -"uniform mat4 ModelViewMatrix;\n" -"uniform mat4 ProjectionMatrix;\n" -"out Fragment\n" -"{\n" -" vec4 color;\n" -"} fragment;\n" -"//\n" -"// vector rotation via quaternion\n" -"//\n" -"out vec3 ambient;\n" -"void main(void)\n" -"{\n" -" ambient = vec3(0.3,.3,0.3);\n" -" \n" -" \n" -" vec4 axis = vec4(1,1,1,0);\n" -" vec4 vertexPos = ProjectionMatrix * ModelViewMatrix *(instance_position);\n" -" vec3 posEye = vec3(ModelViewMatrix * vec4(instance_position.xyz, 1.0));\n" -" float dist = length(posEye);\n" -" float pointRadius = 1.f;\n" -" gl_PointSize = instance_scale_obUid.x * pointRadius * (screenWidth / dist);\n" -" gl_Position = vertexPos;\n" -" \n" -" fragment.color = instance_color;\n" -"}\n" -; diff --git a/engine/inc/bullet/OpenGLWindow/Shaders/projectiveTextureInstancingPS.h b/engine/inc/bullet/OpenGLWindow/Shaders/projectiveTextureInstancingPS.h deleted file mode 100644 index ce9a8a99..00000000 --- a/engine/inc/bullet/OpenGLWindow/Shaders/projectiveTextureInstancingPS.h +++ /dev/null @@ -1,64 +0,0 @@ -//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project -static const char* projectiveTextureInstancingFragmentShader= \ -"#version 330 core\n" -"//precision highp float;\n" -"in Fragment\n" -"{\n" -" vec4 color;\n" -"} fragment;\n" -"uniform sampler2D Diffuse;\n" -"uniform mat4 ViewMatrixInverse;\n" -"uniform mat4 TextureMVP;\n" -"in vec3 lightPos,cameraPosition, normal,ambient;\n" -"in vec4 vertexPos;\n" -"in float materialShininess;\n" -"in vec3 lightSpecularIntensity;\n" -"in vec3 materialSpecularColor;\n" -"out vec4 color;\n" -"void main(void)\n" -"{\n" -" vec4 projcoords = TextureMVP * vertexPos;\n" -" vec2 texturecoords = projcoords.xy/projcoords.w;\n" -" vec4 texel = fragment.color*texture(Diffuse,texturecoords);\n" -" vec3 ct,cf;\n" -" float intensity,at,af;\n" -" if (fragment.color.w==0)\n" -" discard;\n" -" vec3 lightDir = normalize(lightPos);\n" -" \n" -" vec3 normalDir = normalize(normal);\n" -" \n" -" intensity = 0.5+0.5*clamp( dot( normalDir,lightDir ), -1,1 );\n" -" \n" -" af = 1.0;\n" -" \n" -" ct = texel.rgb;\n" -" at = texel.a;\n" -" \n" -" //float bias = 0.005f;\n" -" \n" -" vec3 specularReflection;\n" -" \n" -" if (dot(normalDir, lightDir) < 0.0) \n" -" {\n" -" specularReflection = vec3(0.0, 0.0, 0.0);\n" -" }\n" -" else // light source on the right side\n" -" {\n" -" vec3 surfaceToLight = normalize(lightPos - vertexPos.xyz);\n" -" vec3 surfaceToCamera = normalize(cameraPosition - vertexPos.xyz);\n" -" \n" -" \n" -" float specularCoefficient = 0.0;\n" -" specularCoefficient = pow(max(0.0, dot(surfaceToCamera, reflect(-surfaceToLight, normalDir))), materialShininess);\n" -" specularReflection = specularCoefficient * materialSpecularColor * lightSpecularIntensity;\n" -" \n" -" }\n" -" \n" -" float visibility = 1.0;\n" -" intensity = 0.7*intensity + 0.3*intensity*visibility;\n" -" \n" -" cf = intensity*(vec3(1.0,1.0,1.0)-ambient)+ambient+specularReflection*visibility;\n" -" color = vec4(ct * cf, fragment.color.w);\n" -"}\n" -; diff --git a/engine/inc/bullet/OpenGLWindow/Shaders/projectiveTextureInstancingVS.h b/engine/inc/bullet/OpenGLWindow/Shaders/projectiveTextureInstancingVS.h deleted file mode 100644 index 550720b6..00000000 --- a/engine/inc/bullet/OpenGLWindow/Shaders/projectiveTextureInstancingVS.h +++ /dev/null @@ -1,84 +0,0 @@ -//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project -static const char* projectiveTextureInstancingVertexShader= \ -"#version 330 \n" -"precision highp float;\n" -"layout (location = 0) in vec4 position;\n" -"layout (location = 1) in vec4 instance_position;\n" -"layout (location = 2) in vec4 instance_quaternion;\n" -"layout (location = 3) in vec2 uvcoords;\n" -"layout (location = 4) in vec3 vertexnormal;\n" -"layout (location = 5) in vec4 instance_color;\n" -"layout (location = 6) in vec4 instance_scale_obUid;\n" -"uniform mat4 TextureMVP;\n" -"uniform mat4 MVP;\n" -"uniform vec3 lightPosIn;\n" -"uniform vec3 cameraPositionIn;\n" -"uniform mat4 ViewMatrixInverse;\n" -"uniform float materialShininessIn;\n" -"uniform vec3 lightSpecularIntensityIn;\n" -"uniform vec3 materialSpecularColorIn;\n" -"out vec4 ShadowCoord;\n" -"out Fragment\n" -"{\n" -" vec4 color;\n" -"} fragment;\n" -"out Vert\n" -"{\n" -" vec2 texcoord;\n" -"} vert;\n" -"vec4 quatMul ( in vec4 q1, in vec4 q2 )\n" -"{\n" -" vec3 im = q1.w * q2.xyz + q1.xyz * q2.w + cross ( q1.xyz, q2.xyz );\n" -" vec4 dt = q1 * q2;\n" -" float re = dot ( dt, vec4 ( -1.0, -1.0, -1.0, 1.0 ) );\n" -" return vec4 ( im, re );\n" -"}\n" -"vec4 quatFromAxisAngle(vec4 axis, in float angle)\n" -"{\n" -" float cah = cos(angle*0.5);\n" -" float sah = sin(angle*0.5);\n" -" float d = inversesqrt(dot(axis,axis));\n" -" vec4 q = vec4(axis.x*sah*d,axis.y*sah*d,axis.z*sah*d,cah);\n" -" return q;\n" -"}\n" -"//\n" -"// vector rotation via quaternion\n" -"//\n" -"vec4 quatRotate3 ( in vec3 p, in vec4 q )\n" -"{\n" -" vec4 temp = quatMul ( q, vec4 ( p, 0.0 ) );\n" -" return quatMul ( temp, vec4 ( -q.x, -q.y, -q.z, q.w ) );\n" -"}\n" -"vec4 quatRotate ( in vec4 p, in vec4 q )\n" -"{\n" -" vec4 temp = quatMul ( q, p );\n" -" return quatMul ( temp, vec4 ( -q.x, -q.y, -q.z, q.w ) );\n" -"}\n" -"out vec3 lightPos,normal,ambient;\n" -"out vec4 vertexPos;\n" -"out vec3 cameraPosition;\n" -"out float materialShininess;\n" -"out vec3 lightSpecularIntensity;\n" -"out vec3 materialSpecularColor;\n" -"void main(void)\n" -"{\n" -" vec4 q = instance_quaternion;\n" -" ambient = vec3(0.5,.5,0.5);\n" -" \n" -" vec4 worldNormal = (quatRotate3( vertexnormal,q));\n" -" \n" -" normal = worldNormal.xyz;\n" -" lightPos = lightPosIn;\n" -" cameraPosition = cameraPositionIn;\n" -" materialShininess = materialShininessIn;\n" -" lightSpecularIntensity = lightSpecularIntensityIn;\n" -" materialSpecularColor = materialSpecularColorIn;\n" -" \n" -" vec4 localcoord = quatRotate3( position.xyz*instance_scale_obUid.xyz,q);\n" -" vertexPos = vec4((instance_position+localcoord).xyz,1);\n" -" \n" -" vec4 vertexLoc = MVP* vec4((instance_position+localcoord).xyz,1);\n" -" gl_Position = vertexLoc;\n" -" fragment.color = instance_color;\n" -"}\n" -; diff --git a/engine/inc/bullet/OpenGLWindow/Shaders/segmentationMaskInstancingPS.h b/engine/inc/bullet/OpenGLWindow/Shaders/segmentationMaskInstancingPS.h deleted file mode 100644 index 08196f23..00000000 --- a/engine/inc/bullet/OpenGLWindow/Shaders/segmentationMaskInstancingPS.h +++ /dev/null @@ -1,16 +0,0 @@ -//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project -static const char* segmentationMaskInstancingFragmentShader= \ -"#version 330\n" -"precision highp float;\n" -"in vec4 scale_obuid;\n" -"out vec4 color;\n" -"void main(void)\n" -"{\n" -" highp int obuid = int(scale_obuid.w);\n" -" float r = ((obuid>>0 )&0xff)*(1./255.f);\n" -" float g = ((obuid>>8 )&0xff)*(1./255.f);\n" -" float b = ((obuid>>16)&0xff)*(1./255.f);\n" -" float a = ((obuid>>24)&0xff)*(1./255.f);\n" -" color = vec4(r,g,b,a);\n" -"}\n" -; diff --git a/engine/inc/bullet/OpenGLWindow/Shaders/segmentationMaskInstancingVS.h b/engine/inc/bullet/OpenGLWindow/Shaders/segmentationMaskInstancingVS.h deleted file mode 100644 index b274a7d9..00000000 --- a/engine/inc/bullet/OpenGLWindow/Shaders/segmentationMaskInstancingVS.h +++ /dev/null @@ -1,54 +0,0 @@ -//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project -static const char* segmentationMaskInstancingVertexShader= \ -"#version 330\n" -"precision highp float;\n" -"layout (location = 0) in vec4 position;\n" -"layout (location = 1) in vec4 instance_position;\n" -"layout (location = 2) in vec4 instance_quaternion;\n" -"layout (location = 5) in vec4 instance_color;\n" -"layout (location = 6) in vec4 instance_scale_obUid;\n" -"uniform mat4 ModelViewMatrix;\n" -"uniform mat4 ProjectionMatrix;\n" -"out vec4 scale_obuid;\n" -"out Fragment\n" -"{\n" -" vec4 color;\n" -"} fragment;\n" -"vec4 quatMul ( in vec4 q1, in vec4 q2 )\n" -"{\n" -" vec3 im = q1.w * q2.xyz + q1.xyz * q2.w + cross ( q1.xyz, q2.xyz );\n" -" vec4 dt = q1 * q2;\n" -" float re = dot ( dt, vec4 ( -1.0, -1.0, -1.0, 1.0 ) );\n" -" return vec4 ( im, re );\n" -"}\n" -"vec4 quatFromAxisAngle(vec4 axis, in float angle)\n" -"{\n" -" float cah = cos(angle*0.5);\n" -" float sah = sin(angle*0.5);\n" -" float d = inversesqrt(dot(axis,axis));\n" -" vec4 q = vec4(axis.x*sah*d,axis.y*sah*d,axis.z*sah*d,cah);\n" -" return q;\n" -"}\n" -"//\n" -"// vector rotation via quaternion\n" -"//\n" -"vec4 quatRotate3 ( in vec3 p, in vec4 q )\n" -"{\n" -" vec4 temp = quatMul ( q, vec4 ( p, 0.0 ) );\n" -" return quatMul ( temp, vec4 ( -q.x, -q.y, -q.z, q.w ) );\n" -"}\n" -"vec4 quatRotate ( in vec4 p, in vec4 q )\n" -"{\n" -" vec4 temp = quatMul ( q, p );\n" -" return quatMul ( temp, vec4 ( -q.x, -q.y, -q.z, q.w ) );\n" -"}\n" -"void main(void)\n" -"{\n" -" vec4 q = instance_quaternion;\n" -" vec4 localcoord = quatRotate3( position.xyz*instance_scale_obUid.xyz,q);\n" -" vec4 vertexPos = ProjectionMatrix * ModelViewMatrix *(instance_position+localcoord);\n" -" scale_obuid = instance_scale_obUid;\n" -" gl_Position = vertexPos;\n" -" fragment.color = instance_color;\n" -"}\n" -; diff --git a/engine/inc/bullet/OpenGLWindow/Shaders/useShadowMapInstancingPS.h b/engine/inc/bullet/OpenGLWindow/Shaders/useShadowMapInstancingPS.h deleted file mode 100644 index f8b86b03..00000000 --- a/engine/inc/bullet/OpenGLWindow/Shaders/useShadowMapInstancingPS.h +++ /dev/null @@ -1,70 +0,0 @@ -//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project -static const char* useShadowMapInstancingFragmentShader= \ -"#version 330 core\n" -"//precision highp float;\n" -"in Fragment\n" -"{\n" -" vec4 color;\n" -"} fragment;\n" -"in Vert\n" -"{\n" -" vec2 texcoord;\n" -"} vert;\n" -"uniform sampler2D Diffuse;\n" -"uniform sampler2DShadow shadowMap;\n" -"uniform mat4 ViewMatrixInverse;\n" -"in vec3 lightPos,cameraPosition, normal,ambient;\n" -"in vec4 ShadowCoord;\n" -"in vec4 vertexPos;\n" -"in float materialShininess;\n" -"in float shadowmapIntensity;\n" -"in vec3 lightSpecularIntensity;\n" -"in vec3 materialSpecularColor;\n" -"out vec4 color;\n" -"void main(void)\n" -"{\n" -" vec4 texel = fragment.color*texture(Diffuse,vert.texcoord);\n" -" vec3 ct,cf;\n" -" float intensity,at,af;\n" -" if (fragment.color.w==0)\n" -" discard;\n" -" vec3 lightDir = normalize(lightPos);\n" -" \n" -" vec3 normalDir = normalize(normal);\n" -" \n" -" intensity = 0.5+0.5*clamp( dot( normalDir,lightDir ), -1,1 );\n" -" \n" -" af = 1.0;\n" -" \n" -" ct = texel.rgb;\n" -" at = texel.a;\n" -" \n" -" //float bias = 0.005f;\n" -" \n" -" vec3 specularReflection;\n" -" \n" -" if (dot(normalDir, lightDir) < 0.0) \n" -" {\n" -" specularReflection = vec3(0.0, 0.0, 0.0);\n" -" }\n" -" else // light source on the right side\n" -" {\n" -" vec3 surfaceToLight = normalize(lightPos - vertexPos.xyz);\n" -" vec3 surfaceToCamera = normalize(cameraPosition - vertexPos.xyz);\n" -" \n" -" \n" -" float specularCoefficient = 0.0;\n" -" specularCoefficient = pow(max(0.0, dot(surfaceToCamera, reflect(-surfaceToLight, normalDir))), materialShininess);\n" -" specularReflection = specularCoefficient * materialSpecularColor * lightSpecularIntensity;\n" -" \n" -" }\n" -" \n" -" float visibility = texture(shadowMap, vec3(ShadowCoord.xy,(ShadowCoord.z)/ShadowCoord.w));\n" -" if (intensity<0.5)\n" -" visibility = 0;\n" -" intensity = (1.0-shadowmapIntensity)*intensity + shadowmapIntensity*intensity*visibility;\n" -" \n" -" cf = intensity*(vec3(1.0,1.0,1.0)-ambient)+ambient+specularReflection*visibility;\n" -" color = vec4(ct * cf, fragment.color.w);\n" -"}\n" -; diff --git a/engine/inc/bullet/OpenGLWindow/Shaders/useShadowMapInstancingVS.h b/engine/inc/bullet/OpenGLWindow/Shaders/useShadowMapInstancingVS.h deleted file mode 100644 index ad8fe1b8..00000000 --- a/engine/inc/bullet/OpenGLWindow/Shaders/useShadowMapInstancingVS.h +++ /dev/null @@ -1,92 +0,0 @@ -//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project -static const char* useShadowMapInstancingVertexShader= \ -"#version 330 \n" -"precision highp float;\n" -"layout (location = 0) in vec4 position;\n" -"layout (location = 1) in vec4 instance_position;\n" -"layout (location = 2) in vec4 instance_quaternion;\n" -"layout (location = 3) in vec2 uvcoords;\n" -"layout (location = 4) in vec3 vertexnormal;\n" -"layout (location = 5) in vec4 instance_color;\n" -"layout (location = 6) in vec4 instance_scale_obUid;\n" -"uniform mat4 ModelViewMatrix;\n" -"uniform mat4 ProjectionMatrix;\n" -"uniform mat4 DepthBiasModelViewProjectionMatrix;\n" -"uniform mat4 MVP;\n" -"uniform vec3 lightPosIn;\n" -"uniform vec3 cameraPositionIn;\n" -"uniform mat4 ViewMatrixInverse;\n" -"uniform float materialShininessIn;\n" -"uniform float shadowmapIntensityIn;\n" -"uniform vec3 lightSpecularIntensityIn;\n" -"uniform vec3 materialSpecularColorIn;\n" -"out vec4 ShadowCoord;\n" -"out Fragment\n" -"{\n" -" vec4 color;\n" -"} fragment;\n" -"out Vert\n" -"{\n" -" vec2 texcoord;\n" -"} vert;\n" -"vec4 quatMul ( in vec4 q1, in vec4 q2 )\n" -"{\n" -" vec3 im = q1.w * q2.xyz + q1.xyz * q2.w + cross ( q1.xyz, q2.xyz );\n" -" vec4 dt = q1 * q2;\n" -" float re = dot ( dt, vec4 ( -1.0, -1.0, -1.0, 1.0 ) );\n" -" return vec4 ( im, re );\n" -"}\n" -"vec4 quatFromAxisAngle(vec4 axis, in float angle)\n" -"{\n" -" float cah = cos(angle*0.5);\n" -" float sah = sin(angle*0.5);\n" -" float d = inversesqrt(dot(axis,axis));\n" -" vec4 q = vec4(axis.x*sah*d,axis.y*sah*d,axis.z*sah*d,cah);\n" -" return q;\n" -"}\n" -"//\n" -"// vector rotation via quaternion\n" -"//\n" -"vec4 quatRotate3 ( in vec3 p, in vec4 q )\n" -"{\n" -" vec4 temp = quatMul ( q, vec4 ( p, 0.0 ) );\n" -" return quatMul ( temp, vec4 ( -q.x, -q.y, -q.z, q.w ) );\n" -"}\n" -"vec4 quatRotate ( in vec4 p, in vec4 q )\n" -"{\n" -" vec4 temp = quatMul ( q, p );\n" -" return quatMul ( temp, vec4 ( -q.x, -q.y, -q.z, q.w ) );\n" -"}\n" -"out vec3 lightPos,normal,ambient;\n" -"out vec4 vertexPos;\n" -"out vec3 cameraPosition;\n" -"out float materialShininess;\n" -"out float shadowmapIntensity;\n" -"out vec3 lightSpecularIntensity;\n" -"out vec3 materialSpecularColor;\n" -"void main(void)\n" -"{\n" -" vec4 q = instance_quaternion;\n" -" ambient = vec3(0.5,.5,0.5);\n" -" \n" -" vec4 worldNormal = (quatRotate3( vertexnormal,q));\n" -" \n" -" normal = worldNormal.xyz;\n" -" lightPos = lightPosIn;\n" -" cameraPosition = cameraPositionIn;\n" -" materialShininess = materialShininessIn;\n" -" \n" -" shadowmapIntensity = shadowmapIntensityIn;\n" -" lightSpecularIntensity = lightSpecularIntensityIn;\n" -" materialSpecularColor = materialSpecularColorIn;\n" -" \n" -" vec4 localcoord = quatRotate3( position.xyz*instance_scale_obUid.xyz,q);\n" -" vertexPos = vec4((instance_position+localcoord).xyz,1);\n" -" \n" -" vec4 vertexLoc = MVP* vec4((instance_position+localcoord).xyz,1);\n" -" gl_Position = vertexLoc;\n" -" ShadowCoord = DepthBiasModelViewProjectionMatrix * vec4((instance_position+localcoord).xyz,1);\n" -" fragment.color = instance_color;\n" -" vert.texcoord = uvcoords;\n" -"}\n" -; diff --git a/engine/inc/bullet/OpenGLWindow/ShapeData.h b/engine/inc/bullet/OpenGLWindow/ShapeData.h deleted file mode 100644 index 54c195a8..00000000 --- a/engine/inc/bullet/OpenGLWindow/ShapeData.h +++ /dev/null @@ -1,59331 +0,0 @@ -#ifndef SHAPE_DATA_H -#define SHAPE_DATA_H - -#ifdef USE_BARREL_VERTICES -static float barrel_vertices[] = { - 0.0f, -0.5f, 0.0f, 1.0f, 0.0f, -1.0f, 0.0f, 0.5f, 0.5f, - 0.282362f, -0.5f, -0.205148f, 1.0f, 0.0f, -1.0f, 0.0f, 0.5f, 0.5f, - 0.349018f, -0.5f, 0.0f, 1.0f, 0.0f, -1.0f, 0.0f, 0.5f, 0.5f, - 0.107853f, -0.5f, -0.331936f, 1.0f, 0.0f, -1.0f, 0.0f, 0.5f, 0.5f, - -0.107853f, -0.5f, -0.331936f, 1.0f, 0.0f, -1.0f, 0.0f, 0.5f, 0.5f, - 0.107853f, -0.5f, -0.331936f, 1.0f, 0.0f, -1.0f, 0.0f, 0.5f, 0.5f, - -0.282362f, -0.5f, -0.205148f, 1.0f, 0.0f, -1.0f, 0.0f, 0.5f, 0.5f, - -0.349018f, -0.5f, 0.0f, 1.0f, 0.0f, -1.0f, 0.0f, 0.5f, 0.5f, - -0.282362f, -0.5f, 0.205148f, 1.0f, 0.0f, -1.0f, 0.0f, 0.5f, 0.5f, - -0.107853f, -0.5f, 0.331936f, 1.0f, 0.0f, -1.0f, 0.0f, 0.5f, 0.5f, - 0.107853f, -0.5f, 0.331936f, 1.0f, 0.0f, -1.0f, 0.0f, 0.5f, 0.5f, - 0.282362f, -0.5f, 0.205148f, 1.0f, 0.0f, -1.0f, 0.0f, 0.5f, 0.5f, - 0.0f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.5f, 0.5f, - 0.349018f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.5f, 0.5f, - 0.282362f, 0.5f, -0.205148f, 1.0f, 0.0f, 1.0f, 0.0f, 0.5f, 0.5f, - 0.107853f, 0.5f, -0.331936f, 1.0f, 0.0f, 1.0f, 0.0f, 0.5f, 0.5f, - 0.107853f, 0.5f, -0.331936f, 1.0f, 0.0f, 1.0f, 0.0f, 0.5f, 0.5f, - -0.107853f, 0.5f, -0.331936f, 1.0f, 0.0f, 1.0f, 0.0f, 0.5f, 0.5f, - -0.282362f, 0.5f, -0.205148f, 1.0f, 0.0f, 1.0f, 0.0f, 0.5f, 0.5f, - -0.349018f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.5f, 0.5f, - -0.282362f, 0.5f, 0.205148f, 1.0f, 0.0f, 1.0f, 0.0f, 0.5f, 0.5f, - -0.107853f, 0.5f, 0.331936f, 1.0f, 0.0f, 1.0f, 0.0f, 0.5f, 0.5f, - 0.107853f, 0.5f, 0.331936f, 1.0f, 0.0f, 1.0f, 0.0f, 0.5f, 0.5f, - 0.282362f, 0.5f, 0.205148f, 1.0f, 0.0f, 1.0f, 0.0f, 0.5f, 0.5f, - 0.349018f, -0.5f, 0.0f, 1.0f, 0.957307f, -0.289072f, 0.0f, 0.5f, 0.5f, - 0.404509f, 0.0f, -0.293893f, 1.0f, 0.809017f, 0.0f, -0.587785f, 0.5f, 0.5f, - 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.5f, 0.5f, - 0.282362f, -0.5f, -0.205148f, 1.0f, 0.774478f, -0.289072f, -0.562691f, 0.5f, 0.5f, - 0.154508f, 0.0f, -0.475528f, 1.0f, 0.309017f, 0.0f, -0.951057f, 0.5f, 0.5f, - 0.107853f, -0.5f, -0.331936f, 1.0f, 0.295824f, -0.289072f, -0.910453f, 0.5f, 0.5f, - 0.107853f, -0.5f, -0.331936f, 1.0f, 0.295824f, -0.289072f, -0.910453f, 0.5f, 0.5f, - -0.154509f, 0.0f, -0.475528f, 1.0f, -0.309017f, 0.0f, -0.951057f, 0.5f, 0.5f, - 0.154508f, 0.0f, -0.475528f, 1.0f, 0.309017f, 0.0f, -0.951057f, 0.5f, 0.5f, - -0.107853f, -0.5f, -0.331936f, 1.0f, -0.295824f, -0.289072f, -0.910453f, 0.5f, 0.5f, - -0.404509f, 0.0f, -0.293893f, 1.0f, -0.809017f, 0.0f, -0.587785f, 0.5f, 0.5f, - -0.282362f, -0.5f, -0.205148f, 1.0f, -0.774478f, -0.289072f, -0.562691f, 0.5f, 0.5f, - -0.5f, 0.0f, 0.0f, 1.0f, -1.0f, 0.0f, 0.0f, 0.5f, 0.5f, - -0.349018f, -0.5f, 0.0f, 1.0f, -0.957307f, -0.289072f, 0.0f, 0.5f, 0.5f, - -0.404508f, 0.0f, 0.293893f, 1.0f, -0.809017f, 0.0f, 0.587785f, 0.5f, 0.5f, - -0.282362f, -0.5f, 0.205148f, 1.0f, -0.774478f, -0.289072f, 0.562691f, 0.5f, 0.5f, - -0.154509f, 0.0f, 0.475528f, 1.0f, -0.309017f, 0.0f, 0.951056f, 0.5f, 0.5f, - -0.107853f, -0.5f, 0.331936f, 1.0f, -0.295824f, -0.289072f, 0.910453f, 0.5f, 0.5f, - 0.154509f, 0.0f, 0.475528f, 1.0f, 0.309017f, 0.0f, 0.951056f, 0.5f, 0.5f, - 0.107853f, -0.5f, 0.331936f, 1.0f, 0.295824f, -0.289072f, 0.910453f, 0.5f, 0.5f, - 0.404509f, 0.0f, 0.293892f, 1.0f, 0.809017f, 0.0f, 0.587785f, 0.5f, 0.5f, - 0.282362f, -0.5f, 0.205148f, 1.0f, 0.774478f, -0.289072f, 0.562691f, 0.5f, 0.5f, - 0.282362f, 0.5f, -0.205148f, 1.0f, 0.774478f, 0.289072f, -0.562691f, 0.5f, 0.5f, - 0.349018f, 0.5f, 0.0f, 1.0f, 0.957307f, 0.289072f, 0.0f, 0.5f, 0.5f, - 0.107853f, 0.5f, -0.331936f, 1.0f, 0.295824f, 0.289072f, -0.910453f, 0.5f, 0.5f, - -0.107853f, 0.5f, -0.331936f, 1.0f, -0.295824f, 0.289072f, -0.910453f, 0.5f, 0.5f, - 0.107853f, 0.5f, -0.331936f, 1.0f, 0.295824f, 0.289072f, -0.910453f, 0.5f, 0.5f, - -0.282362f, 0.5f, -0.205148f, 1.0f, -0.774478f, 0.289072f, -0.562691f, 0.5f, 0.5f, - -0.349018f, 0.5f, 0.0f, 1.0f, -0.957307f, 0.289072f, 0.0f, 0.5f, 0.5f, - -0.282362f, 0.5f, 0.205148f, 1.0f, -0.774478f, 0.289072f, 0.562691f, 0.5f, 0.5f, - -0.107853f, 0.5f, 0.331936f, 1.0f, -0.295824f, 0.289072f, 0.910453f, 0.5f, 0.5f, - 0.107853f, 0.5f, 0.331936f, 1.0f, 0.295824f, 0.289072f, 0.910453f, 0.5f, 0.5f, - 0.282362f, 0.5f, 0.205148f, 1.0f, 0.774478f, 0.289072f, 0.562691f, 0.5f, 0.5f}; - -static int barrel_indices[] = { - 0, - 1, - 2, - 0, - 3, - 1, - 0, - 4, - 5, - 0, - 6, - 4, - 0, - 7, - 6, - 0, - 8, - 7, - 0, - 9, - 8, - 0, - 10, - 9, - 0, - 11, - 10, - 0, - 2, - 11, - 12, - 13, - 14, - 12, - 14, - 15, - 12, - 16, - 17, - 12, - 17, - 18, - 12, - 18, - 19, - 12, - 19, - 20, - 12, - 20, - 21, - 12, - 21, - 22, - 12, - 22, - 23, - 12, - 23, - 13, - 24, - 25, - 26, - 24, - 27, - 25, - 27, - 28, - 25, - 27, - 29, - 28, - 30, - 31, - 32, - 30, - 33, - 31, - 33, - 34, - 31, - 33, - 35, - 34, - 35, - 36, - 34, - 35, - 37, - 36, - 37, - 38, - 36, - 37, - 39, - 38, - 39, - 40, - 38, - 39, - 41, - 40, - 41, - 42, - 40, - 41, - 43, - 42, - 43, - 44, - 42, - 43, - 45, - 44, - 45, - 26, - 44, - 45, - 24, - 26, - 26, - 46, - 47, - 26, - 25, - 46, - 25, - 48, - 46, - 25, - 28, - 48, - 32, - 49, - 50, - 32, - 31, - 49, - 31, - 51, - 49, - 31, - 34, - 51, - 34, - 52, - 51, - 34, - 36, - 52, - 36, - 53, - 52, - 36, - 38, - 53, - 38, - 54, - 53, - 38, - 40, - 54, - 40, - 55, - 54, - 40, - 42, - 55, - 42, - 56, - 55, - 42, - 44, - 56, - 44, - 47, - 56, - 44, - 26, - 47, -}; -#endif //USE_BARREL_VERTICES - -///position xyz, unused w, normal, uv -static const float cube_vertices[] = - { - -1.0f, - -1.0f, - 1.0f, - 1.0f, - 0, - 0, - 1, - 0, - 0, //0 - 1.0f, - -1.0f, - 1.0f, - 1.0f, - 0, - 0, - 1, - 1, - 0, //1 - 1.0f, - 1.0f, - 1.0f, - 1.0f, - 0, - 0, - 1, - 1, - 1, //2 - -1.0f, - 1.0f, - 1.0f, - 1.0f, - 0, - 0, - 1, - 0, - 1, //3 - - -1.0f, - -1.0f, - -1.0f, - 1.0f, - 0, - 0, - -1, - 0, - 0, //4 - 1.0f, - -1.0f, - -1.0f, - 1.0f, - 0, - 0, - -1, - 1, - 0, //5 - 1.0f, - 1.0f, - -1.0f, - 1.0f, - 0, - 0, - -1, - 1, - 1, //6 - -1.0f, - 1.0f, - -1.0f, - 1.0f, - 0, - 0, - -1, - 0, - 1, //7 - - -1.0f, - -1.0f, - -1.0f, - 1.0f, - -1, - 0, - 0, - 0, - 0, - -1.0f, - 1.0f, - -1.0f, - 1.0f, - -1, - 0, - 0, - 1, - 0, - -1.0f, - 1.0f, - 1.0f, - 1.0f, - -1, - 0, - 0, - 1, - 1, - -1.0f, - -1.0f, - 1.0f, - 1.0f, - -1, - 0, - 0, - 0, - 1, - - 1.0f, - -1.0f, - -1.0f, - 1.0f, - 1, - 0, - 0, - 0, - 0, - 1.0f, - 1.0f, - -1.0f, - 1.0f, - 1, - 0, - 0, - 1, - 0, - 1.0f, - 1.0f, - 1.0f, - 1.0f, - 1, - 0, - 0, - 1, - 1, - 1.0f, - -1.0f, - 1.0f, - 1.0f, - 1, - 0, - 0, - 0, - 1, - - -1.0f, - -1.0f, - -1.0f, - 1.0f, - 0, - -1, - 0, - 0, - 0, - -1.0f, - -1.0f, - 1.0f, - 1.0f, - 0, - -1, - 0, - 1, - 0, - 1.0f, - -1.0f, - 1.0f, - 1.0f, - 0, - -1, - 0, - 1, - 1, - 1.0f, - -1.0f, - -1.0f, - 1.0f, - 0, - -1, - 0, - 0, - 1, - - -1.0f, - 1.0f, - -1.0f, - 1.0f, - 0, - 1, - 0, - 0, - 0, - -1.0f, - 1.0f, - 1.0f, - 1.0f, - 0, - 1, - 0, - 1, - 0, - 1.0f, - 1.0f, - 1.0f, - 1.0f, - 0, - 1, - 0, - 1, - 1, - 1.0f, - 1.0f, - -1.0f, - 1.0f, - 0, - 1, - 0, - 0, - 1, -}; - -///position xyz, unused w, normal, uv -static const float cube_vertices_textured[] = - { - -1.0f, - -1.0f, - 1.0f, - 1.0f, - 0, - 0, - 1, - 0.75, - 0.25, //0//back - 1.0f, - -1.0f, - 1.0f, - 1.0f, - 0, - 0, - 1, - 1, - 0.25, //1 - 1.0f, - 1.0f, - 1.0f, - 1.0f, - 0, - 0, - 1, - 1, - 0, //2 - -1.0f, - 1.0f, - 1.0f, - 1.0f, - 0, - 0, - 1, - 0.75, - 0, //3 - - -1.0f, - -1.0f, - -1.0f, - 1.0f, - 0, - 0, - -1, - 0.5, - 0.25, //4//front - 1.0f, - -1.0f, - -1.0f, - 1.0f, - 0, - 0, - -1, - 0.25, - 0.25, //5 - 1.0f, - 1.0f, - -1.0f, - 1.0f, - 0, - 0, - -1, - 0.25, - 0, //6 - -1.0f, - 1.0f, - -1.0f, - 1.0f, - 0, - 0, - -1, - 0.5, - 0, //7 - - -1.0f, - -1.0f, - -1.0f, - 1.0f, - -1, - 0, - 0, - 0.5, - 0, //Right - -1.0f, - 1.0f, - -1.0f, - 1.0f, - -1, - 0, - 0, - 0.75, - 0, - -1.0f, - 1.0f, - 1.0f, - 1.0f, - -1, - 0, - 0, - 0.75, - 0.25, - -1.0f, - -1.0f, - 1.0f, - 1.0f, - -1, - 0, - 0, - 0.5, - 0.25, - - 1.0f, - -1.0f, - -1.0f, - 1.0f, - 1, - 0, - 0, - 0.25, - 0.5, //Left - 1.0f, - 1.0f, - -1.0f, - 1.0f, - 1, - 0, - 0, - 0.25, - 0.25, - 1.0f, - 1.0f, - 1.0f, - 1.0f, - 1, - 0, - 0, - 0., - .25, - 1.0f, - -1.0f, - 1.0f, - 1.0f, - 1, - 0, - 0, - 0, - .5, - - -1.0f, - -1.0f, - -1.0f, - 1.0f, - 0, - -1, - 0, - 0.25, - 0.5, //bottom - -1.0f, - -1.0f, - 1.0f, - 1.0f, - 0, - -1, - 0, - 0.25, - 0.25, - 1.0f, - -1.0f, - 1.0f, - 1.0f, - 0, - -1, - 0, - 0.5, - 0.25, - 1.0f, - -1.0f, - -1.0f, - 1.0f, - 0, - -1, - 0, - 0.5, - 0.5, - - -1.0f, - 1.0f, - -1.0f, - 1.0f, - 0, - 1, - 0, - 0, - 0, //top - -1.0f, - 1.0f, - 1.0f, - 1.0f, - 0, - 1, - 0, - 0, - 0.25, - 1.0f, - 1.0f, - 1.0f, - 1.0f, - 0, - 1, - 0, - 0.25, - 0.25, - 1.0f, - 1.0f, - -1.0f, - 1.0f, - 0, - 1, - 0, - 0.25, - 0, -}; - -///position xyz, unused w, normal, uv -static const float cube_vertices2[] = - { - -1.5f, - -0.5f, - 0.5f, - 0.0f, - 0, - 0, - 1, - 0, - 0, //0 - 1.5f, - -0.5f, - 0.5f, - 0.0f, - 0, - 0, - 1, - 1, - 0, //1 - 1.5f, - 0.5f, - 0.5f, - 0.0f, - 0, - 0, - 1, - 1, - 1, //2 - -1.5f, - 0.5f, - 0.5f, - 0.0f, - 0, - 0, - 1, - 0, - 1, //3 - - -1.5f, - -0.5f, - -0.5f, - 0.5f, - 0, - 0, - -1, - 0, - 0, //4 - 1.5f, - -0.5f, - -0.5f, - 0.5f, - 0, - 0, - -1, - 1, - 0, //5 - 1.5f, - 0.5f, - -0.5f, - 0.5f, - 0, - 0, - -1, - 1, - 1, //6 - -1.5f, - 0.5f, - -0.5f, - 0.5f, - 0, - 0, - -1, - 0, - 1, //7 - - -1.5f, - -0.5f, - -0.5f, - 0.5f, - -1, - 0, - 0, - 0, - 0, - -1.5f, - 0.5f, - -0.5f, - 0.5f, - -1, - 0, - 0, - 1, - 0, - -1.5f, - 0.5f, - 0.5f, - 0.5f, - -1, - 0, - 0, - 1, - 1, - -1.5f, - -0.5f, - 0.5f, - 0.5f, - -1, - 0, - 0, - 0, - 1, - - 1.5f, - -0.5f, - -0.5f, - 0.5f, - 1, - 0, - 0, - 0, - 0, - 1.5f, - 0.5f, - -0.5f, - 0.5f, - 1, - 0, - 0, - 1, - 0, - 1.5f, - 0.5f, - 0.5f, - 0.5f, - 1, - 0, - 0, - 1, - 1, - 1.5f, - -0.5f, - 0.5f, - 0.5f, - 1, - 0, - 0, - 0, - 1, - - -1.5f, - -0.5f, - -0.5f, - 0.5f, - 0, - -1, - 0, - 0, - 0, - -1.5f, - -0.5f, - 0.5f, - 0.5f, - 0, - -1, - 0, - 1, - 0, - 1.5f, - -0.5f, - 0.5f, - 0.5f, - 0, - -1, - 0, - 1, - 1, - 1.5f, - -0.5f, - -0.5f, - 0.5f, - 0, - -1, - 0, - 0, - 1, - - -1.5f, - 0.5f, - -0.5f, - 0.5f, - 0, - 1, - 0, - 0, - 0, - -1.5f, - 0.5f, - 0.5f, - 0.5f, - 0, - 1, - 0, - 1, - 0, - 1.5f, - 0.5f, - 0.5f, - 0.5f, - 0, - 1, - 0, - 1, - 1, - 1.5f, - 0.5f, - -0.5f, - 0.5f, - 0, - 1, - 0, - 0, - 1, -}; - -static const int cube_indices[] = - { - 0, 1, 2, 0, 2, 3, //ground face - 6, 5, 4, 7, 6, 4, //top face - 10, 9, 8, 11, 10, 8, - 12, 13, 14, 12, 14, 15, - 18, 17, 16, 19, 18, 16, - 20, 21, 22, 20, 22, 23}; -/* -static const float fat_triangle[]= -{ - -6.158554,-0.000000,-0.000925, 0.5f, 0, 1,0, 0,1, - -0.028798,-0.000000,-0.000925, 0.5f, 0, 1,0, 0,1, - -6.158554,-0.000000,-6.130690, 0.5f, 0, 1,0, 0,1 -}; - - -static const int fat_triangle_indices[]= -{ - 0,1,2,3,4,5 -}; - -static const float fat_triangle[]= -{ - -10.f, -10, -0.05, 0.5f, 0, 1,0, 0,0, - -10.f, 0, -0.05, 0.5f, 0, 1,0, 1,0, - 10.f, 0, -0.05, 0.5f, 0, 1,0, 1,1, - -10.f, -10, 0.05, 0.5f, 0, 1,0, 0,1, - -10.f, 0, 0.05, 0.5f, 0, 1,0, 0,1, - 10.f, 0, 0.05, 0.5f, 0, 1,0, 0,0 -}; -*/ -#if 0 -static const float triangle_vertices[] = -{ - -1.f, -0.15, -1.f, 0.5f, 0, 1,0, 0,0, - -1.f, -0.15, 1.f, 0.5f, 0, 1,0, 1,0, - 1.f, -0.15, 1.f, 0.5f, 0, 1,0, 1,1, - -1.f, 0.15, -1.f, 0.5f, 0, 1,0, 0,0, - -1.f, 0.15, 1.f, 0.5f, 0, 1,0, 1,0, - 1.f, 0.15, 1.f, 0.5f, 0, 1,0, 1,1, - -}; - -static const int triangle_indices[]= -{ - 0,1,2,3,4,5 -}; -#endif - -static const float quad_vertices[] = - { - -1.f, - 0, - -1.f, - 0.5f, - 0, - 1, - 0, - 0, - 0, - -1.f, - 0, - 1.f, - 0.5f, - 0, - 1, - 0, - 1, - 0, - 1.f, - 0, - 1.f, - 0.5f, - 0, - 1, - 0, - 1, - 1, - 1.f, - 0, - -1.f, - 0.5f, - 0, - 1, - 0, - 0, - 1, -}; - -static const int quad_indices[] = - { - 0, 1, 2, 0, 2, 3}; - -static const float pyramid_vertices[] = - { - -1.f, 0, -1.f, 0.5f, 0, 1, 0, 0, 0, - -1.f, 0, 1.f, 0.5f, 0, 1, 0, 1, 0, - 1.f, 0, 1.f, 0.5f, 0, 1, 0, 1, 1, - 1.f, 0, -1.f, 0.5f, 0, 1, 0, 0, 1, - 0, -1, 0, 0.5f, 0, 1, 0, 0, 1}; - -static const int pyramid_indices[] = - { - 0, 1, 2, 0, 2, 3, //ground face - 4, 1, 2, 4, 2, 3, - 4, 3, 0, 4, 0, 1}; - -static const float tetra_vertices[] = - { - 0.f, 0.f, 1.f, 0.5f, 0, 1, 0, 0, 0, - 1.f, -1.f, -1.f, 0.5f, 0, 1, 0, 1, 0, - -1.f, 1.f, -1.f, 0.5f, 0, 1, 0, 1, 1, - -1.f, -1, 1.f, 0.5f, 0, 1, 0, 0, 1}; - -static const int tetra_indices[] = - { - 0, 1, 2, //ground face - 2, 1, 3, - 1, 0, 3, - 0, 2, 3}; - -static const float detailed_sphere_vertices[] = - { - 0.000000f, -0.183479f, -0.983024f, 0.000000f, 0.000000f, -0.183479f, -0.983024f, 0.500000f, 0.408260f, - 0.000000f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, -1.000000f, 0.500000f, 0.500000f, - 0.174499f, -0.056698f, -0.983024f, 0.000000f, 0.174499f, -0.056698f, -0.983024f, 0.587250f, 0.471651f, - 0.176851f, -0.243415f, -0.953663f, 0.000000f, 0.176851f, -0.243415f, -0.953663f, 0.588426f, 0.378293f, - 0.174499f, -0.056698f, -0.983024f, 0.000000f, 0.174499f, -0.056698f, -0.983024f, 0.587250f, 0.471651f, - 0.343074f, -0.111472f, -0.932670f, 0.000000f, 0.343074f, -0.111472f, -0.932670f, 0.671537f, 0.444264f, - 0.000000f, -0.183479f, -0.983024f, 0.000000f, 0.000000f, -0.183479f, -0.983024f, 0.500000f, 0.408260f, - 0.176851f, -0.243415f, -0.953663f, 0.000000f, 0.176851f, -0.243415f, -0.953663f, 0.588426f, 0.378293f, - 0.000000f, -0.360730f, -0.932670f, 0.000000f, 0.000000f, -0.360730f, -0.932670f, 0.500000f, 0.319635f, - 0.000000f, -0.183479f, -0.983024f, 0.000000f, 0.000000f, -0.183479f, -0.983024f, 0.500000f, 0.408260f, - 0.174499f, -0.056698f, -0.983024f, 0.000000f, 0.174499f, -0.056698f, -0.983024f, 0.587250f, 0.471651f, - 0.176851f, -0.243415f, -0.953663f, 0.000000f, 0.176851f, -0.243415f, -0.953663f, 0.588426f, 0.378293f, - 0.345991f, -0.298381f, -0.889527f, 0.000000f, 0.345991f, -0.298381f, -0.889527f, 0.672996f, 0.350810f, - 0.343074f, -0.111472f, -0.932670f, 0.000000f, 0.343074f, -0.111472f, -0.932670f, 0.671537f, 0.444264f, - 0.500000f, -0.162460f, -0.850651f, 0.000000f, 0.500000f, -0.162460f, -0.850651f, 0.750000f, 0.418770f, - 0.176860f, -0.421262f, -0.889527f, 0.000000f, 0.176860f, -0.421262f, -0.889527f, 0.588430f, 0.289369f, - 0.176851f, -0.243415f, -0.953663f, 0.000000f, 0.176851f, -0.243415f, -0.953663f, 0.588426f, 0.378293f, - 0.345991f, -0.298381f, -0.889527f, 0.000000f, 0.345991f, -0.298381f, -0.889527f, 0.672996f, 0.350810f, - 0.000000f, -0.360730f, -0.932670f, 0.000000f, 0.000000f, -0.360730f, -0.932670f, 0.500000f, 0.319635f, - 0.176860f, -0.421262f, -0.889527f, 0.000000f, 0.176860f, -0.421262f, -0.889527f, 0.588430f, 0.289369f, - 0.000000f, -0.525731f, -0.850651f, 0.000000f, 0.000000f, -0.525731f, -0.850651f, 0.500000f, 0.237134f, - 0.176851f, -0.243415f, -0.953663f, 0.000000f, 0.176851f, -0.243415f, -0.953663f, 0.588426f, 0.378293f, - 0.343074f, -0.111472f, -0.932670f, 0.000000f, 0.343074f, -0.111472f, -0.932670f, 0.671537f, 0.444264f, - 0.345991f, -0.298381f, -0.889527f, 0.000000f, 0.345991f, -0.298381f, -0.889527f, 0.672996f, 0.350810f, - 0.000000f, -0.360730f, -0.932670f, 0.000000f, 0.000000f, -0.360730f, -0.932670f, 0.500000f, 0.319635f, - 0.176851f, -0.243415f, -0.953663f, 0.000000f, 0.176851f, -0.243415f, -0.953663f, 0.588426f, 0.378293f, - 0.176860f, -0.421262f, -0.889527f, 0.000000f, 0.176860f, -0.421262f, -0.889527f, 0.588430f, 0.289369f, - 0.522851f, -0.355846f, -0.774597f, 0.000000f, 0.522851f, -0.355846f, -0.774597f, 0.761425f, 0.322077f, - 0.500000f, -0.162460f, -0.850651f, 0.000000f, 0.500000f, -0.162460f, -0.850651f, 0.750000f, 0.418770f, - 0.639949f, -0.207932f, -0.739749f, 0.000000f, 0.639949f, -0.207932f, -0.739749f, 0.819975f, 0.396034f, - 0.356822f, -0.491123f, -0.794654f, 0.000000f, 0.356822f, -0.491123f, -0.794654f, 0.678411f, 0.254439f, - 0.345991f, -0.298381f, -0.889527f, 0.000000f, 0.345991f, -0.298381f, -0.889527f, 0.672996f, 0.350810f, - 0.522851f, -0.355846f, -0.774597f, 0.000000f, 0.522851f, -0.355846f, -0.774597f, 0.761425f, 0.322077f, - 0.176860f, -0.421262f, -0.889527f, 0.000000f, 0.176860f, -0.421262f, -0.889527f, 0.588430f, 0.289369f, - 0.356822f, -0.491123f, -0.794654f, 0.000000f, 0.356822f, -0.491123f, -0.794654f, 0.678411f, 0.254439f, - 0.176860f, -0.607223f, -0.774597f, 0.000000f, 0.176860f, -0.607223f, -0.774597f, 0.588430f, 0.196389f, - 0.000000f, -0.525731f, -0.850651f, 0.000000f, 0.000000f, -0.525731f, -0.850651f, 0.500000f, 0.237134f, - 0.176860f, -0.607223f, -0.774597f, 0.000000f, 0.176860f, -0.607223f, -0.774597f, 0.588430f, 0.196389f, - 0.000000f, -0.672883f, -0.739749f, 0.000000f, 0.000000f, -0.672883f, -0.739749f, 0.500000f, 0.163559f, - 0.345991f, -0.298381f, -0.889527f, 0.000000f, 0.345991f, -0.298381f, -0.889527f, 0.672996f, 0.350810f, - 0.500000f, -0.162460f, -0.850651f, 0.000000f, 0.500000f, -0.162460f, -0.850651f, 0.750000f, 0.418770f, - 0.522851f, -0.355846f, -0.774597f, 0.000000f, 0.522851f, -0.355846f, -0.774597f, 0.761425f, 0.322077f, - 0.176860f, -0.421262f, -0.889527f, 0.000000f, 0.176860f, -0.421262f, -0.889527f, 0.588430f, 0.289369f, - 0.345991f, -0.298381f, -0.889527f, 0.000000f, 0.345991f, -0.298381f, -0.889527f, 0.672996f, 0.350810f, - 0.356822f, -0.491123f, -0.794654f, 0.000000f, 0.356822f, -0.491123f, -0.794654f, 0.678411f, 0.254439f, - 0.000000f, -0.525731f, -0.850651f, 0.000000f, 0.000000f, -0.525731f, -0.850651f, 0.500000f, 0.237134f, - 0.176860f, -0.421262f, -0.889527f, 0.000000f, 0.176860f, -0.421262f, -0.889527f, 0.588430f, 0.289369f, - 0.176860f, -0.607223f, -0.774597f, 0.000000f, 0.176860f, -0.607223f, -0.774597f, 0.588430f, 0.196389f, - 0.653054f, -0.398142f, -0.644208f, 0.000000f, 0.653054f, -0.398142f, -0.644208f, 0.912551f, 0.300929f, - 0.639949f, -0.207932f, -0.739749f, 0.000000f, 0.639949f, -0.207932f, -0.739749f, 0.819975f, 0.396034f, - 0.758172f, -0.246345f, -0.603730f, 0.000000f, 0.758172f, -0.246345f, -0.603730f, 0.960321f, 0.396034f, - 0.522851f, -0.533682f, -0.664689f, 0.000000f, 0.522851f, -0.533682f, -0.664689f, 0.892312f, 0.376828f, - 0.522851f, -0.355846f, -0.774597f, 0.000000f, 0.522851f, -0.355846f, -0.774597f, 0.761425f, 0.322077f, - 0.653054f, -0.398142f, -0.644208f, 0.000000f, 0.653054f, -0.398142f, -0.644208f, 0.912551f, 0.300929f, - 0.345991f, -0.662178f, -0.664689f, 0.000000f, 0.345991f, -0.662178f, -0.664689f, 0.761425f, 0.233159f, - 0.356822f, -0.491123f, -0.794654f, 0.000000f, 0.356822f, -0.491123f, -0.794654f, 0.678411f, 0.254439f, - 0.522851f, -0.533682f, -0.664689f, 0.000000f, 0.522851f, -0.533682f, -0.664689f, 0.892312f, 0.376828f, - 0.176860f, -0.607223f, -0.774597f, 0.000000f, 0.176860f, -0.607223f, -0.774597f, 0.588430f, 0.196389f, - 0.345991f, -0.662178f, -0.664689f, 0.000000f, 0.345991f, -0.662178f, -0.664689f, 0.761425f, 0.233159f, - 0.176851f, -0.744124f, -0.644208f, 0.000000f, 0.176851f, -0.744124f, -0.644208f, 0.826527f, 0.300929f, - 0.000000f, -0.672883f, -0.739749f, 0.000000f, 0.000000f, -0.672883f, -0.739749f, 0.500000f, 0.163559f, - 0.176851f, -0.744124f, -0.644208f, 0.000000f, 0.176851f, -0.744124f, -0.644208f, 0.826527f, 0.300929f, - 0.000000f, -0.797189f, -0.603730f, 0.000000f, 0.000000f, -0.797189f, -0.603730f, 0.672996f, 0.168911f, - 0.522851f, -0.355846f, -0.774597f, 0.000000f, 0.522851f, -0.355846f, -0.774597f, 0.761425f, 0.322077f, - 0.639949f, -0.207932f, -0.739749f, 0.000000f, 0.639949f, -0.207932f, -0.739749f, 0.819975f, 0.396034f, - 0.653054f, -0.398142f, -0.644208f, 0.000000f, 0.653054f, -0.398142f, -0.644208f, 0.912551f, 0.300929f, - 0.356822f, -0.491123f, -0.794654f, 0.000000f, 0.356822f, -0.491123f, -0.794654f, 0.678411f, 0.254439f, - 0.522851f, -0.355846f, -0.774597f, 0.000000f, 0.522851f, -0.355846f, -0.774597f, 0.761425f, 0.322077f, - 0.522851f, -0.533682f, -0.664689f, 0.000000f, 0.522851f, -0.533682f, -0.664689f, 0.892312f, 0.376828f, - 0.176860f, -0.607223f, -0.774597f, 0.000000f, 0.176860f, -0.607223f, -0.774597f, 0.588430f, 0.196389f, - 0.356822f, -0.491123f, -0.794654f, 0.000000f, 0.356822f, -0.491123f, -0.794654f, 0.678411f, 0.254439f, - 0.345991f, -0.662178f, -0.664689f, 0.000000f, 0.345991f, -0.662178f, -0.664689f, 0.761425f, 0.233159f, - 0.000000f, -0.672883f, -0.739749f, 0.000000f, 0.000000f, -0.672883f, -0.739749f, 0.500000f, 0.163559f, - 0.176860f, -0.607223f, -0.774597f, 0.000000f, 0.176860f, -0.607223f, -0.774597f, 0.588430f, 0.196389f, - 0.176851f, -0.744124f, -0.644208f, 0.000000f, 0.176851f, -0.744124f, -0.644208f, 0.826527f, 0.300929f, - 0.758172f, -0.429824f, -0.490334f, 0.000000f, 0.758172f, -0.429824f, -0.490334f, 0.588426f, 0.127938f, - 0.758172f, -0.246345f, -0.603730f, 0.000000f, 0.758172f, -0.246345f, -0.603730f, 0.960321f, 0.396034f, - 0.850651f, -0.276393f, -0.447214f, 0.000000f, 0.850651f, -0.276393f, -0.447214f, 0.500000f, 0.960321f, - 0.639949f, -0.568662f, -0.516806f, 0.000000f, 0.639949f, -0.568662f, -0.516806f, 0.588426f, 0.912551f, - 0.653054f, -0.398142f, -0.644208f, 0.000000f, 0.653054f, -0.398142f, -0.644208f, 0.912551f, 0.300929f, - 0.758172f, -0.429824f, -0.490334f, 0.000000f, 0.758172f, -0.429824f, -0.490334f, 0.588426f, 0.127938f, - 0.500000f, -0.688191f, -0.525731f, 0.000000f, 0.500000f, -0.688191f, -0.525731f, 0.500000f, 0.892312f, - 0.522851f, -0.533682f, -0.664689f, 0.000000f, 0.522851f, -0.533682f, -0.664689f, 0.892312f, 0.376828f, - 0.639949f, -0.568662f, -0.516806f, 0.000000f, 0.639949f, -0.568662f, -0.516806f, 0.588426f, 0.912551f, - 0.345991f, -0.662178f, -0.664689f, 0.000000f, 0.345991f, -0.662178f, -0.664689f, 0.761425f, 0.233159f, - 0.500000f, -0.688191f, -0.525731f, 0.000000f, 0.500000f, -0.688191f, -0.525731f, 0.500000f, 0.892312f, - 0.343074f, -0.784354f, -0.516806f, 0.000000f, 0.343074f, -0.784354f, -0.516806f, 0.835614f, 0.285088f, - 0.176851f, -0.744124f, -0.644208f, 0.000000f, 0.176851f, -0.744124f, -0.644208f, 0.826527f, 0.300929f, - 0.343074f, -0.784354f, -0.516806f, 0.000000f, 0.343074f, -0.784354f, -0.516806f, 0.835614f, 0.285088f, - 0.174499f, -0.853887f, -0.490334f, 0.000000f, 0.174499f, -0.853887f, -0.490334f, 0.814054f, 0.361804f, - 0.000000f, -0.797189f, -0.603730f, 0.000000f, 0.000000f, -0.797189f, -0.603730f, 0.672996f, 0.168911f, - 0.174499f, -0.853887f, -0.490334f, 0.000000f, 0.174499f, -0.853887f, -0.490334f, 0.814054f, 0.361804f, - 0.000000f, -0.894427f, -0.447214f, 0.000000f, 0.000000f, -0.894427f, -0.447214f, 0.848850f, 0.215669f, - 0.653054f, -0.398142f, -0.644208f, 0.000000f, 0.653054f, -0.398142f, -0.644208f, 0.912551f, 0.300929f, - 0.758172f, -0.246345f, -0.603730f, 0.000000f, 0.758172f, -0.246345f, -0.603730f, 0.960321f, 0.396034f, - 0.758172f, -0.429824f, -0.490334f, 0.000000f, 0.758172f, -0.429824f, -0.490334f, 0.588426f, 0.127938f, - 0.522851f, -0.533682f, -0.664689f, 0.000000f, 0.522851f, -0.533682f, -0.664689f, 0.892312f, 0.376828f, - 0.653054f, -0.398142f, -0.644208f, 0.000000f, 0.653054f, -0.398142f, -0.644208f, 0.912551f, 0.300929f, - 0.639949f, -0.568662f, -0.516806f, 0.000000f, 0.639949f, -0.568662f, -0.516806f, 0.588426f, 0.912551f, - 0.345991f, -0.662178f, -0.664689f, 0.000000f, 0.345991f, -0.662178f, -0.664689f, 0.761425f, 0.233159f, - 0.522851f, -0.533682f, -0.664689f, 0.000000f, 0.522851f, -0.533682f, -0.664689f, 0.892312f, 0.376828f, - 0.500000f, -0.688191f, -0.525731f, 0.000000f, 0.500000f, -0.688191f, -0.525731f, 0.500000f, 0.892312f, - 0.176851f, -0.744124f, -0.644208f, 0.000000f, 0.176851f, -0.744124f, -0.644208f, 0.826527f, 0.300929f, - 0.345991f, -0.662178f, -0.664689f, 0.000000f, 0.345991f, -0.662178f, -0.664689f, 0.761425f, 0.233159f, - 0.343074f, -0.784354f, -0.516806f, 0.000000f, 0.343074f, -0.784354f, -0.516806f, 0.835614f, 0.285088f, - 0.000000f, -0.797189f, -0.603730f, 0.000000f, 0.000000f, -0.797189f, -0.603730f, 0.672996f, 0.168911f, - 0.176851f, -0.744124f, -0.644208f, 0.000000f, 0.176851f, -0.744124f, -0.644208f, 0.826527f, 0.300929f, - 0.174499f, -0.853887f, -0.490334f, 0.000000f, 0.174499f, -0.853887f, -0.490334f, 0.814054f, 0.361804f, - 0.174499f, -0.056698f, -0.983024f, 0.000000f, 0.174499f, -0.056698f, -0.983024f, 0.587250f, 0.471651f, - 0.000000f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, -1.000000f, 0.500000f, 0.500000f, - 0.107846f, 0.148438f, -0.983024f, 0.000000f, 0.107846f, 0.148438f, -0.983024f, 0.750000f, 0.853312f, - 0.286151f, 0.092976f, -0.953663f, 0.000000f, 0.286151f, 0.092976f, -0.953663f, 0.761425f, 0.922791f, - 0.107846f, 0.148438f, -0.983024f, 0.000000f, 0.107846f, 0.148438f, -0.983024f, 0.750000f, 0.853312f, - 0.212032f, 0.291836f, -0.932670f, 0.000000f, 0.212032f, 0.291836f, -0.932670f, 0.819975f, 0.848850f, - 0.174499f, -0.056698f, -0.983024f, 0.000000f, 0.174499f, -0.056698f, -0.983024f, 0.587250f, 0.471651f, - 0.286151f, 0.092976f, -0.953663f, 0.000000f, 0.286151f, 0.092976f, -0.953663f, 0.761425f, 0.922791f, - 0.343074f, -0.111472f, -0.932670f, 0.000000f, 0.343074f, -0.111472f, -0.932670f, 0.671537f, 0.444264f, - 0.174499f, -0.056698f, -0.983024f, 0.000000f, 0.174499f, -0.056698f, -0.983024f, 0.587250f, 0.471651f, - 0.107846f, 0.148438f, -0.983024f, 0.000000f, 0.107846f, 0.148438f, -0.983024f, 0.750000f, 0.853312f, - 0.286151f, 0.092976f, -0.953663f, 0.000000f, 0.286151f, 0.092976f, -0.953663f, 0.761425f, 0.922791f, - 0.390694f, 0.236853f, -0.889527f, 0.000000f, 0.390694f, 0.236853f, -0.889527f, 0.672996f, 0.922791f, - 0.212032f, 0.291836f, -0.932670f, 0.000000f, 0.212032f, 0.291836f, -0.932670f, 0.819975f, 0.848850f, - 0.309017f, 0.425325f, -0.850651f, 0.000000f, 0.309017f, 0.425325f, -0.850651f, 0.671537f, 0.848850f, - 0.455297f, 0.038026f, -0.889527f, 0.000000f, 0.455297f, 0.038026f, -0.889527f, 0.587250f, 0.835614f, - 0.286151f, 0.092976f, -0.953663f, 0.000000f, 0.286151f, 0.092976f, -0.953663f, 0.761425f, 0.922791f, - 0.390694f, 0.236853f, -0.889527f, 0.000000f, 0.390694f, 0.236853f, -0.889527f, 0.672996f, 0.922791f, - 0.343074f, -0.111472f, -0.932670f, 0.000000f, 0.343074f, -0.111472f, -0.932670f, 0.671537f, 0.444264f, - 0.455297f, 0.038026f, -0.889527f, 0.000000f, 0.455297f, 0.038026f, -0.889527f, 0.587250f, 0.835614f, - 0.500000f, -0.162460f, -0.850651f, 0.000000f, 0.500000f, -0.162460f, -0.850651f, 0.750000f, 0.418770f, - 0.286151f, 0.092976f, -0.953663f, 0.000000f, 0.286151f, 0.092976f, -0.953663f, 0.761425f, 0.922791f, - 0.212032f, 0.291836f, -0.932670f, 0.000000f, 0.212032f, 0.291836f, -0.932670f, 0.819975f, 0.848850f, - 0.390694f, 0.236853f, -0.889527f, 0.000000f, 0.390694f, 0.236853f, -0.889527f, 0.672996f, 0.922791f, - 0.343074f, -0.111472f, -0.932670f, 0.000000f, 0.343074f, -0.111472f, -0.932670f, 0.671537f, 0.444264f, - 0.286151f, 0.092976f, -0.953663f, 0.000000f, 0.286151f, 0.092976f, -0.953663f, 0.761425f, 0.922791f, - 0.455297f, 0.038026f, -0.889527f, 0.000000f, 0.455297f, 0.038026f, -0.889527f, 0.587250f, 0.835614f, - 0.499999f, 0.387298f, -0.774597f, 0.000000f, 0.499999f, 0.387298f, -0.774597f, 0.500000f, 0.814054f, - 0.309017f, 0.425325f, -0.850651f, 0.000000f, 0.309017f, 0.425325f, -0.850651f, 0.671537f, 0.848850f, - 0.395510f, 0.544373f, -0.739749f, 0.000000f, 0.395510f, 0.544373f, -0.739749f, 0.922791f, 0.233159f, - 0.577350f, 0.187592f, -0.794654f, 0.000000f, 0.577350f, 0.187592f, -0.794654f, 0.553923f, 0.574219f, - 0.390694f, 0.236853f, -0.889527f, 0.000000f, 0.390694f, 0.236853f, -0.889527f, 0.672996f, 0.922791f, - 0.499999f, 0.387298f, -0.774597f, 0.000000f, 0.499999f, 0.387298f, -0.774597f, 0.500000f, 0.814054f, - 0.455297f, 0.038026f, -0.889527f, 0.000000f, 0.455297f, 0.038026f, -0.889527f, 0.587250f, 0.835614f, - 0.577350f, 0.187592f, -0.794654f, 0.000000f, 0.577350f, 0.187592f, -0.794654f, 0.553923f, 0.574219f, - 0.632156f, -0.019439f, -0.774597f, 0.000000f, 0.632156f, -0.019439f, -0.774597f, 0.643075f, 0.546488f, - 0.500000f, -0.162460f, -0.850651f, 0.000000f, 0.500000f, -0.162460f, -0.850651f, 0.750000f, 0.418770f, - 0.632156f, -0.019439f, -0.774597f, 0.000000f, 0.632156f, -0.019439f, -0.774597f, 0.643075f, 0.546488f, - 0.639949f, -0.207932f, -0.739749f, 0.000000f, 0.639949f, -0.207932f, -0.739749f, 0.819975f, 0.396034f, - 0.390694f, 0.236853f, -0.889527f, 0.000000f, 0.390694f, 0.236853f, -0.889527f, 0.672996f, 0.922791f, - 0.309017f, 0.425325f, -0.850651f, 0.000000f, 0.309017f, 0.425325f, -0.850651f, 0.671537f, 0.848850f, - 0.499999f, 0.387298f, -0.774597f, 0.000000f, 0.499999f, 0.387298f, -0.774597f, 0.500000f, 0.814054f, - 0.455297f, 0.038026f, -0.889527f, 0.000000f, 0.455297f, 0.038026f, -0.889527f, 0.587250f, 0.835614f, - 0.390694f, 0.236853f, -0.889527f, 0.000000f, 0.390694f, 0.236853f, -0.889527f, 0.672996f, 0.922791f, - 0.577350f, 0.187592f, -0.794654f, 0.000000f, 0.577350f, 0.187592f, -0.794654f, 0.553923f, 0.574219f, - 0.500000f, -0.162460f, -0.850651f, 0.000000f, 0.500000f, -0.162460f, -0.850651f, 0.750000f, 0.418770f, - 0.455297f, 0.038026f, -0.889527f, 0.000000f, 0.455297f, 0.038026f, -0.889527f, 0.587250f, 0.835614f, - 0.632156f, -0.019439f, -0.774597f, 0.000000f, 0.632156f, -0.019439f, -0.774597f, 0.643075f, 0.546488f, - 0.580460f, 0.498058f, -0.644208f, 0.000000f, 0.580460f, 0.498058f, -0.644208f, 0.606016f, 0.645918f, - 0.395510f, 0.544373f, -0.739749f, 0.000000f, 0.395510f, 0.544373f, -0.739749f, 0.922791f, 0.233159f, - 0.468576f, 0.644939f, -0.603730f, 0.000000f, 0.468576f, 0.644939f, -0.603730f, 0.695347f, 0.618427f, - 0.669131f, 0.332344f, -0.664689f, 0.000000f, 0.669131f, 0.332344f, -0.664689f, 0.654508f, 0.712663f, - 0.499999f, 0.387298f, -0.774597f, 0.000000f, 0.499999f, 0.387298f, -0.774597f, 0.500000f, 0.814054f, - 0.580460f, 0.498058f, -0.644208f, 0.000000f, 0.580460f, 0.498058f, -0.644208f, 0.606016f, 0.645918f, - 0.736686f, 0.124433f, -0.664689f, 0.000000f, 0.736686f, 0.124433f, -0.664689f, 0.727648f, 0.519013f, - 0.577350f, 0.187592f, -0.794654f, 0.000000f, 0.577350f, 0.187592f, -0.794654f, 0.553923f, 0.574219f, - 0.669131f, 0.332344f, -0.664689f, 0.000000f, 0.669131f, 0.332344f, -0.664689f, 0.654508f, 0.712663f, - 0.632156f, -0.019439f, -0.774597f, 0.000000f, 0.632156f, -0.019439f, -0.774597f, 0.643075f, 0.546488f, - 0.736686f, 0.124433f, -0.664689f, 0.000000f, 0.736686f, 0.124433f, -0.664689f, 0.727648f, 0.519013f, - 0.762354f, -0.061752f, -0.644208f, 0.000000f, 0.762354f, -0.061752f, -0.644208f, 0.750000f, 0.693649f, - 0.639949f, -0.207932f, -0.739749f, 0.000000f, 0.639949f, -0.207932f, -0.739749f, 0.819975f, 0.396034f, - 0.762354f, -0.061752f, -0.644208f, 0.000000f, 0.762354f, -0.061752f, -0.644208f, 0.750000f, 0.693649f, - 0.758172f, -0.246345f, -0.603730f, 0.000000f, 0.758172f, -0.246345f, -0.603730f, 0.960321f, 0.396034f, - 0.499999f, 0.387298f, -0.774597f, 0.000000f, 0.499999f, 0.387298f, -0.774597f, 0.500000f, 0.814054f, - 0.395510f, 0.544373f, -0.739749f, 0.000000f, 0.395510f, 0.544373f, -0.739749f, 0.922791f, 0.233159f, - 0.580460f, 0.498058f, -0.644208f, 0.000000f, 0.580460f, 0.498058f, -0.644208f, 0.606016f, 0.645918f, - 0.577350f, 0.187592f, -0.794654f, 0.000000f, 0.577350f, 0.187592f, -0.794654f, 0.553923f, 0.574219f, - 0.499999f, 0.387298f, -0.774597f, 0.000000f, 0.499999f, 0.387298f, -0.774597f, 0.500000f, 0.814054f, - 0.669131f, 0.332344f, -0.664689f, 0.000000f, 0.669131f, 0.332344f, -0.664689f, 0.654508f, 0.712663f, - 0.632156f, -0.019439f, -0.774597f, 0.000000f, 0.632156f, -0.019439f, -0.774597f, 0.643075f, 0.546488f, - 0.577350f, 0.187592f, -0.794654f, 0.000000f, 0.577350f, 0.187592f, -0.794654f, 0.553923f, 0.574219f, - 0.736686f, 0.124433f, -0.664689f, 0.000000f, 0.736686f, 0.124433f, -0.664689f, 0.727648f, 0.519013f, - 0.639949f, -0.207932f, -0.739749f, 0.000000f, 0.639949f, -0.207932f, -0.739749f, 0.819975f, 0.396034f, - 0.632156f, -0.019439f, -0.774597f, 0.000000f, 0.632156f, -0.019439f, -0.774597f, 0.643075f, 0.546488f, - 0.762354f, -0.061752f, -0.644208f, 0.000000f, 0.762354f, -0.061752f, -0.644208f, 0.750000f, 0.693649f, - 0.643075f, 0.588241f, -0.490334f, 0.000000f, 0.643075f, 0.588241f, -0.490334f, 0.697755f, 0.772187f, - 0.468576f, 0.644939f, -0.603730f, 0.000000f, 0.468576f, 0.644939f, -0.603730f, 0.695347f, 0.618427f, - 0.525731f, 0.723607f, -0.447214f, 0.000000f, 0.525731f, 0.723607f, -0.447214f, 0.788675f, 0.593796f, - 0.738585f, 0.432902f, -0.516806f, 0.000000f, 0.738585f, 0.432902f, -0.516806f, 0.816078f, 0.490281f, - 0.580460f, 0.498058f, -0.644208f, 0.000000f, 0.580460f, 0.498058f, -0.644208f, 0.606016f, 0.645918f, - 0.643075f, 0.588241f, -0.490334f, 0.000000f, 0.643075f, 0.588241f, -0.490334f, 0.697755f, 0.772187f, - 0.809017f, 0.262865f, -0.525731f, 0.000000f, 0.809017f, 0.262865f, -0.525731f, 0.790230f, 0.749029f, - 0.669131f, 0.332344f, -0.664689f, 0.000000f, 0.669131f, 0.332344f, -0.664689f, 0.654508f, 0.712663f, - 0.738585f, 0.432902f, -0.516806f, 0.000000f, 0.738585f, 0.432902f, -0.516806f, 0.816078f, 0.490281f, - 0.736686f, 0.124433f, -0.664689f, 0.000000f, 0.736686f, 0.124433f, -0.664689f, 0.727648f, 0.519013f, - 0.809017f, 0.262865f, -0.525731f, 0.000000f, 0.809017f, 0.262865f, -0.525731f, 0.790230f, 0.749029f, - 0.851981f, 0.083904f, -0.516806f, 0.000000f, 0.851981f, 0.083904f, -0.516806f, 0.734288f, 0.822469f, - 0.762354f, -0.061752f, -0.644208f, 0.000000f, 0.762354f, -0.061752f, -0.644208f, 0.750000f, 0.693649f, - 0.851981f, 0.083904f, -0.516806f, 0.000000f, 0.851981f, 0.083904f, -0.516806f, 0.734288f, 0.822469f, - 0.866018f, -0.097907f, -0.490334f, 0.000000f, 0.866018f, -0.097907f, -0.490334f, 0.834566f, 0.666172f, - 0.758172f, -0.246345f, -0.603730f, 0.000000f, 0.758172f, -0.246345f, -0.603730f, 0.960321f, 0.396034f, - 0.866018f, -0.097907f, -0.490334f, 0.000000f, 0.866018f, -0.097907f, -0.490334f, 0.834566f, 0.666172f, - 0.850651f, -0.276393f, -0.447214f, 0.000000f, 0.850651f, -0.276393f, -0.447214f, 0.500000f, 0.960321f, - 0.580460f, 0.498058f, -0.644208f, 0.000000f, 0.580460f, 0.498058f, -0.644208f, 0.606016f, 0.645918f, - 0.468576f, 0.644939f, -0.603730f, 0.000000f, 0.468576f, 0.644939f, -0.603730f, 0.695347f, 0.618427f, - 0.643075f, 0.588241f, -0.490334f, 0.000000f, 0.643075f, 0.588241f, -0.490334f, 0.697755f, 0.772187f, - 0.669131f, 0.332344f, -0.664689f, 0.000000f, 0.669131f, 0.332344f, -0.664689f, 0.654508f, 0.712663f, - 0.580460f, 0.498058f, -0.644208f, 0.000000f, 0.580460f, 0.498058f, -0.644208f, 0.606016f, 0.645918f, - 0.738585f, 0.432902f, -0.516806f, 0.000000f, 0.738585f, 0.432902f, -0.516806f, 0.816078f, 0.490281f, - 0.736686f, 0.124433f, -0.664689f, 0.000000f, 0.736686f, 0.124433f, -0.664689f, 0.727648f, 0.519013f, - 0.669131f, 0.332344f, -0.664689f, 0.000000f, 0.669131f, 0.332344f, -0.664689f, 0.654508f, 0.712663f, - 0.809017f, 0.262865f, -0.525731f, 0.000000f, 0.809017f, 0.262865f, -0.525731f, 0.790230f, 0.749029f, - 0.762354f, -0.061752f, -0.644208f, 0.000000f, 0.762354f, -0.061752f, -0.644208f, 0.750000f, 0.693649f, - 0.736686f, 0.124433f, -0.664689f, 0.000000f, 0.736686f, 0.124433f, -0.664689f, 0.727648f, 0.519013f, - 0.851981f, 0.083904f, -0.516806f, 0.000000f, 0.851981f, 0.083904f, -0.516806f, 0.734288f, 0.822469f, - 0.758172f, -0.246345f, -0.603730f, 0.000000f, 0.758172f, -0.246345f, -0.603730f, 0.960321f, 0.396034f, - 0.762354f, -0.061752f, -0.644208f, 0.000000f, 0.762354f, -0.061752f, -0.644208f, 0.750000f, 0.693649f, - 0.866018f, -0.097907f, -0.490334f, 0.000000f, 0.866018f, -0.097907f, -0.490334f, 0.834566f, 0.666172f, - 0.107846f, 0.148438f, -0.983024f, 0.000000f, 0.107846f, 0.148438f, -0.983024f, 0.750000f, 0.853312f, - 0.000000f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, -1.000000f, 0.500000f, 0.500000f, - -0.107846f, 0.148438f, -0.983024f, 0.000000f, -0.107846f, 0.148438f, -0.983024f, 0.868343f, 0.562217f, - 0.000000f, 0.300877f, -0.953663f, 0.000000f, 0.000000f, 0.300877f, -0.953663f, 0.977745f, 0.490281f, - -0.107846f, 0.148438f, -0.983024f, 0.000000f, -0.107846f, 0.148438f, -0.983024f, 0.868343f, 0.562217f, - -0.212032f, 0.291836f, -0.932670f, 0.000000f, -0.212032f, 0.291836f, -0.932670f, 0.922791f, 0.562217f, - 0.107846f, 0.148438f, -0.983024f, 0.000000f, 0.107846f, 0.148438f, -0.983024f, 0.750000f, 0.853312f, - 0.000000f, 0.300877f, -0.953663f, 0.000000f, 0.000000f, 0.300877f, -0.953663f, 0.977745f, 0.490281f, - 0.212032f, 0.291836f, -0.932670f, 0.000000f, 0.212032f, 0.291836f, -0.932670f, 0.819975f, 0.848850f, - 0.107846f, 0.148438f, -0.983024f, 0.000000f, 0.107846f, 0.148438f, -0.983024f, 0.750000f, 0.853312f, - -0.107846f, 0.148438f, -0.983024f, 0.000000f, -0.107846f, 0.148438f, -0.983024f, 0.868343f, 0.562217f, - 0.000000f, 0.300877f, -0.953663f, 0.000000f, 0.000000f, 0.300877f, -0.953663f, 0.977745f, 0.490281f, - -0.104529f, 0.444764f, -0.889527f, 0.000000f, -0.104529f, 0.444764f, -0.889527f, 0.912551f, 0.469124f, - -0.212032f, 0.291836f, -0.932670f, 0.000000f, -0.212032f, 0.291836f, -0.932670f, 0.922791f, 0.562217f, - -0.309017f, 0.425325f, -0.850651f, 0.000000f, -0.309017f, 0.425325f, -0.850651f, 0.881177f, 0.469124f, - 0.104529f, 0.444764f, -0.889527f, 0.000000f, 0.104529f, 0.444764f, -0.889527f, 0.821537f, 0.835614f, - 0.000000f, 0.300877f, -0.953663f, 0.000000f, 0.000000f, 0.300877f, -0.953663f, 0.977745f, 0.490281f, - -0.104529f, 0.444764f, -0.889527f, 0.000000f, -0.104529f, 0.444764f, -0.889527f, 0.912551f, 0.469124f, - 0.212032f, 0.291836f, -0.932670f, 0.000000f, 0.212032f, 0.291836f, -0.932670f, 0.819975f, 0.848850f, - 0.104529f, 0.444764f, -0.889527f, 0.000000f, 0.104529f, 0.444764f, -0.889527f, 0.821537f, 0.835614f, - 0.309017f, 0.425325f, -0.850651f, 0.000000f, 0.309017f, 0.425325f, -0.850651f, 0.671537f, 0.848850f, - 0.000000f, 0.300877f, -0.953663f, 0.000000f, 0.000000f, 0.300877f, -0.953663f, 0.977745f, 0.490281f, - -0.212032f, 0.291836f, -0.932670f, 0.000000f, -0.212032f, 0.291836f, -0.932670f, 0.922791f, 0.562217f, - -0.104529f, 0.444764f, -0.889527f, 0.000000f, -0.104529f, 0.444764f, -0.889527f, 0.912551f, 0.469124f, - 0.212032f, 0.291836f, -0.932670f, 0.000000f, 0.212032f, 0.291836f, -0.932670f, 0.819975f, 0.848850f, - 0.000000f, 0.300877f, -0.953663f, 0.000000f, 0.000000f, 0.300877f, -0.953663f, 0.977745f, 0.490281f, - 0.104529f, 0.444764f, -0.889527f, 0.000000f, 0.104529f, 0.444764f, -0.889527f, 0.821537f, 0.835614f, - -0.213834f, 0.595209f, -0.774597f, 0.000000f, -0.213834f, 0.595209f, -0.774597f, 0.734288f, 0.892312f, - -0.309017f, 0.425325f, -0.850651f, 0.000000f, -0.309017f, 0.425325f, -0.850651f, 0.881177f, 0.469124f, - -0.395510f, 0.544373f, -0.739749f, 0.000000f, -0.395510f, 0.544373f, -0.739749f, 0.762866f, 0.814054f, - 0.000000f, 0.607062f, -0.794654f, 0.000000f, 0.000000f, 0.607062f, -0.794654f, 0.848850f, 0.716451f, - -0.104529f, 0.444764f, -0.889527f, 0.000000f, -0.104529f, 0.444764f, -0.889527f, 0.912551f, 0.469124f, - -0.213834f, 0.595209f, -0.774597f, 0.000000f, -0.213834f, 0.595209f, -0.774597f, 0.734288f, 0.892312f, - 0.104529f, 0.444764f, -0.889527f, 0.000000f, 0.104529f, 0.444764f, -0.889527f, 0.821537f, 0.835614f, - 0.000000f, 0.607062f, -0.794654f, 0.000000f, 0.000000f, 0.607062f, -0.794654f, 0.848850f, 0.716451f, - 0.213834f, 0.595209f, -0.774597f, 0.000000f, 0.213834f, 0.595209f, -0.774597f, 0.912551f, 0.749029f, - 0.309017f, 0.425325f, -0.850651f, 0.000000f, 0.309017f, 0.425325f, -0.850651f, 0.671537f, 0.848850f, - 0.213834f, 0.595209f, -0.774597f, 0.000000f, 0.213834f, 0.595209f, -0.774597f, 0.912551f, 0.749029f, - 0.395510f, 0.544373f, -0.739749f, 0.000000f, 0.395510f, 0.544373f, -0.739749f, 0.922791f, 0.233159f, - -0.104529f, 0.444764f, -0.889527f, 0.000000f, -0.104529f, 0.444764f, -0.889527f, 0.912551f, 0.469124f, - -0.309017f, 0.425325f, -0.850651f, 0.000000f, -0.309017f, 0.425325f, -0.850651f, 0.881177f, 0.469124f, - -0.213834f, 0.595209f, -0.774597f, 0.000000f, -0.213834f, 0.595209f, -0.774597f, 0.734288f, 0.892312f, - 0.104529f, 0.444764f, -0.889527f, 0.000000f, 0.104529f, 0.444764f, -0.889527f, 0.821537f, 0.835614f, - -0.104529f, 0.444764f, -0.889527f, 0.000000f, -0.104529f, 0.444764f, -0.889527f, 0.912551f, 0.469124f, - 0.000000f, 0.607062f, -0.794654f, 0.000000f, 0.000000f, 0.607062f, -0.794654f, 0.848850f, 0.716451f, - 0.309017f, 0.425325f, -0.850651f, 0.000000f, 0.309017f, 0.425325f, -0.850651f, 0.671537f, 0.848850f, - 0.104529f, 0.444764f, -0.889527f, 0.000000f, 0.104529f, 0.444764f, -0.889527f, 0.821537f, 0.835614f, - 0.213834f, 0.595209f, -0.774597f, 0.000000f, 0.213834f, 0.595209f, -0.774597f, 0.912551f, 0.749029f, - -0.294309f, 0.705959f, -0.644208f, 0.000000f, -0.294309f, 0.705959f, -0.644208f, 0.835614f, 0.794120f, - -0.395510f, 0.544373f, -0.739749f, 0.000000f, -0.395510f, 0.544373f, -0.739749f, 0.762866f, 0.814054f, - -0.468576f, 0.644939f, -0.603730f, 0.000000f, -0.468576f, 0.644939f, -0.603730f, 0.853312f, 0.631433f, - -0.109305f, 0.739082f, -0.664689f, 0.000000f, -0.109305f, 0.739082f, -0.664689f, 0.922791f, 0.666172f, - -0.213834f, 0.595209f, -0.774597f, 0.000000f, -0.213834f, 0.595209f, -0.774597f, 0.734288f, 0.892312f, - -0.294309f, 0.705959f, -0.644208f, 0.000000f, -0.294309f, 0.705959f, -0.644208f, 0.835614f, 0.794120f, - 0.109305f, 0.739082f, -0.664689f, 0.000000f, 0.109305f, 0.739082f, -0.664689f, 0.848850f, 0.541952f, - 0.000000f, 0.607062f, -0.794654f, 0.000000f, 0.000000f, 0.607062f, -0.794654f, 0.848850f, 0.716451f, - -0.109305f, 0.739082f, -0.664689f, 0.000000f, -0.109305f, 0.739082f, -0.664689f, 0.922791f, 0.666172f, - 0.213834f, 0.595209f, -0.774597f, 0.000000f, 0.213834f, 0.595209f, -0.774597f, 0.912551f, 0.749029f, - 0.109305f, 0.739082f, -0.664689f, 0.000000f, 0.109305f, 0.739082f, -0.664689f, 0.848850f, 0.541952f, - 0.294310f, 0.705959f, -0.644208f, 0.000000f, 0.294310f, 0.705959f, -0.644208f, 0.835614f, 0.451046f, - 0.395510f, 0.544373f, -0.739749f, 0.000000f, 0.395510f, 0.544373f, -0.739749f, 0.922791f, 0.233159f, - 0.294310f, 0.705959f, -0.644208f, 0.000000f, 0.294310f, 0.705959f, -0.644208f, 0.835614f, 0.451046f, - 0.468576f, 0.644939f, -0.603730f, 0.000000f, 0.468576f, 0.644939f, -0.603730f, 0.695347f, 0.618427f, - -0.213834f, 0.595209f, -0.774597f, 0.000000f, -0.213834f, 0.595209f, -0.774597f, 0.734288f, 0.892312f, - -0.395510f, 0.544373f, -0.739749f, 0.000000f, -0.395510f, 0.544373f, -0.739749f, 0.762866f, 0.814054f, - -0.294309f, 0.705959f, -0.644208f, 0.000000f, -0.294309f, 0.705959f, -0.644208f, 0.835614f, 0.794120f, - 0.000000f, 0.607062f, -0.794654f, 0.000000f, 0.000000f, 0.607062f, -0.794654f, 0.848850f, 0.716451f, - -0.213834f, 0.595209f, -0.774597f, 0.000000f, -0.213834f, 0.595209f, -0.774597f, 0.734288f, 0.892312f, - -0.109305f, 0.739082f, -0.664689f, 0.000000f, -0.109305f, 0.739082f, -0.664689f, 0.922791f, 0.666172f, - 0.213834f, 0.595209f, -0.774597f, 0.000000f, 0.213834f, 0.595209f, -0.774597f, 0.912551f, 0.749029f, - 0.000000f, 0.607062f, -0.794654f, 0.000000f, 0.000000f, 0.607062f, -0.794654f, 0.848850f, 0.716451f, - 0.109305f, 0.739082f, -0.664689f, 0.000000f, 0.109305f, 0.739082f, -0.664689f, 0.848850f, 0.541952f, - 0.395510f, 0.544373f, -0.739749f, 0.000000f, 0.395510f, 0.544373f, -0.739749f, 0.922791f, 0.233159f, - 0.213834f, 0.595209f, -0.774597f, 0.000000f, 0.213834f, 0.595209f, -0.774597f, 0.912551f, 0.749029f, - 0.294310f, 0.705959f, -0.644208f, 0.000000f, 0.294310f, 0.705959f, -0.644208f, 0.835614f, 0.451046f, - -0.360730f, 0.793377f, -0.490334f, 0.000000f, -0.360730f, 0.793377f, -0.490334f, 0.790230f, 0.912551f, - -0.468576f, 0.644939f, -0.603730f, 0.000000f, -0.468576f, 0.644939f, -0.603730f, 0.853312f, 0.631433f, - -0.525731f, 0.723607f, -0.447214f, 0.000000f, -0.525731f, 0.723607f, -0.447214f, 0.446077f, 0.574219f, - -0.183479f, 0.836210f, -0.516806f, 0.000000f, -0.183479f, 0.836210f, -0.516806f, 0.500000f, 0.650438f, - -0.294309f, 0.705959f, -0.644208f, 0.000000f, -0.294309f, 0.705959f, -0.644208f, 0.835614f, 0.794120f, - -0.360730f, 0.793377f, -0.490334f, 0.000000f, -0.360730f, 0.793377f, -0.490334f, 0.790230f, 0.912551f, - 0.000000f, 0.850651f, -0.525731f, 0.000000f, 0.000000f, 0.850651f, -0.525731f, 0.393984f, 0.645918f, - -0.109305f, 0.739082f, -0.664689f, 0.000000f, -0.109305f, 0.739082f, -0.664689f, 0.922791f, 0.666172f, - -0.183479f, 0.836210f, -0.516806f, 0.000000f, -0.183479f, 0.836210f, -0.516806f, 0.500000f, 0.650438f, - 0.109305f, 0.739082f, -0.664689f, 0.000000f, 0.109305f, 0.739082f, -0.664689f, 0.848850f, 0.541952f, - 0.000000f, 0.850651f, -0.525731f, 0.000000f, 0.000000f, 0.850651f, -0.525731f, 0.393984f, 0.645918f, - 0.183479f, 0.836210f, -0.516806f, 0.000000f, 0.183479f, 0.836210f, -0.516806f, 0.447735f, 0.722382f, - 0.294310f, 0.705959f, -0.644208f, 0.000000f, 0.294310f, 0.705959f, -0.644208f, 0.835614f, 0.451046f, - 0.183479f, 0.836210f, -0.516806f, 0.000000f, 0.183479f, 0.836210f, -0.516806f, 0.447735f, 0.722382f, - 0.360730f, 0.793377f, -0.490334f, 0.000000f, 0.360730f, 0.793377f, -0.490334f, 0.345491f, 0.712663f, - 0.468576f, 0.644939f, -0.603730f, 0.000000f, 0.468576f, 0.644939f, -0.603730f, 0.695347f, 0.618427f, - 0.360730f, 0.793377f, -0.490334f, 0.000000f, 0.360730f, 0.793377f, -0.490334f, 0.345491f, 0.712663f, - 0.525731f, 0.723607f, -0.447214f, 0.000000f, 0.525731f, 0.723607f, -0.447214f, 0.788675f, 0.593796f, - -0.294309f, 0.705959f, -0.644208f, 0.000000f, -0.294309f, 0.705959f, -0.644208f, 0.835614f, 0.794120f, - -0.468576f, 0.644939f, -0.603730f, 0.000000f, -0.468576f, 0.644939f, -0.603730f, 0.853312f, 0.631433f, - -0.360730f, 0.793377f, -0.490334f, 0.000000f, -0.360730f, 0.793377f, -0.490334f, 0.790230f, 0.912551f, - -0.109305f, 0.739082f, -0.664689f, 0.000000f, -0.109305f, 0.739082f, -0.664689f, 0.922791f, 0.666172f, - -0.294309f, 0.705959f, -0.644208f, 0.000000f, -0.294309f, 0.705959f, -0.644208f, 0.835614f, 0.794120f, - -0.183479f, 0.836210f, -0.516806f, 0.000000f, -0.183479f, 0.836210f, -0.516806f, 0.500000f, 0.650438f, - 0.109305f, 0.739082f, -0.664689f, 0.000000f, 0.109305f, 0.739082f, -0.664689f, 0.848850f, 0.541952f, - -0.109305f, 0.739082f, -0.664689f, 0.000000f, -0.109305f, 0.739082f, -0.664689f, 0.922791f, 0.666172f, - 0.000000f, 0.850651f, -0.525731f, 0.000000f, 0.000000f, 0.850651f, -0.525731f, 0.393984f, 0.645918f, - 0.294310f, 0.705959f, -0.644208f, 0.000000f, 0.294310f, 0.705959f, -0.644208f, 0.835614f, 0.451046f, - 0.109305f, 0.739082f, -0.664689f, 0.000000f, 0.109305f, 0.739082f, -0.664689f, 0.848850f, 0.541952f, - 0.183479f, 0.836210f, -0.516806f, 0.000000f, 0.183479f, 0.836210f, -0.516806f, 0.447735f, 0.722382f, - 0.468576f, 0.644939f, -0.603730f, 0.000000f, 0.468576f, 0.644939f, -0.603730f, 0.695347f, 0.618427f, - 0.294310f, 0.705959f, -0.644208f, 0.000000f, 0.294310f, 0.705959f, -0.644208f, 0.835614f, 0.451046f, - 0.360730f, 0.793377f, -0.490334f, 0.000000f, 0.360730f, 0.793377f, -0.490334f, 0.345491f, 0.712663f, - 0.000000f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, -1.000000f, 0.500000f, 0.500000f, - -0.174499f, -0.056698f, -0.983024f, 0.000000f, -0.174499f, -0.056698f, -0.983024f, 0.552265f, 0.722382f, - -0.107846f, 0.148438f, -0.983024f, 0.000000f, -0.107846f, 0.148438f, -0.983024f, 0.868343f, 0.562217f, - -0.286151f, 0.092976f, -0.953663f, 0.000000f, -0.286151f, 0.092976f, -0.953663f, 0.393083f, 0.797605f, - -0.174499f, -0.056698f, -0.983024f, 0.000000f, -0.174499f, -0.056698f, -0.983024f, 0.552265f, 0.722382f, - -0.343074f, -0.111472f, -0.932670f, 0.000000f, -0.343074f, -0.111472f, -0.932670f, 0.302245f, 0.772187f, - -0.107846f, 0.148438f, -0.983024f, 0.000000f, -0.107846f, 0.148438f, -0.983024f, 0.868343f, 0.562217f, - -0.286151f, 0.092976f, -0.953663f, 0.000000f, -0.286151f, 0.092976f, -0.953663f, 0.393083f, 0.797605f, - -0.212032f, 0.291836f, -0.932670f, 0.000000f, -0.212032f, 0.291836f, -0.932670f, 0.922791f, 0.562217f, - -0.107846f, 0.148438f, -0.983024f, 0.000000f, -0.107846f, 0.148438f, -0.983024f, 0.868343f, 0.562217f, - -0.174499f, -0.056698f, -0.983024f, 0.000000f, -0.174499f, -0.056698f, -0.983024f, 0.552265f, 0.722382f, - -0.286151f, 0.092976f, -0.953663f, 0.000000f, -0.286151f, 0.092976f, -0.953663f, 0.393083f, 0.797605f, - -0.455297f, 0.038026f, -0.889527f, 0.000000f, -0.455297f, 0.038026f, -0.889527f, 0.500000f, 0.803531f, - -0.343074f, -0.111472f, -0.932670f, 0.000000f, -0.343074f, -0.111472f, -0.932670f, 0.302245f, 0.772187f, - -0.500000f, -0.162460f, -0.850651f, 0.000000f, -0.500000f, -0.162460f, -0.850651f, 0.606917f, 0.797605f, - -0.286151f, 0.092976f, -0.953663f, 0.000000f, -0.286151f, 0.092976f, -0.953663f, 0.393083f, 0.797605f, - -0.455297f, 0.038026f, -0.889527f, 0.000000f, -0.455297f, 0.038026f, -0.889527f, 0.500000f, 0.803531f, - -0.390694f, 0.236853f, -0.889527f, 0.000000f, -0.390694f, 0.236853f, -0.889527f, 0.352845f, 0.852980f, - -0.212032f, 0.291836f, -0.932670f, 0.000000f, -0.212032f, 0.291836f, -0.932670f, 0.922791f, 0.562217f, - -0.390694f, 0.236853f, -0.889527f, 0.000000f, -0.390694f, 0.236853f, -0.889527f, 0.352845f, 0.852980f, - -0.309017f, 0.425325f, -0.850651f, 0.000000f, -0.309017f, 0.425325f, -0.850651f, 0.881177f, 0.469124f, - -0.286151f, 0.092976f, -0.953663f, 0.000000f, -0.286151f, 0.092976f, -0.953663f, 0.393083f, 0.797605f, - -0.343074f, -0.111472f, -0.932670f, 0.000000f, -0.343074f, -0.111472f, -0.932670f, 0.302245f, 0.772187f, - -0.455297f, 0.038026f, -0.889527f, 0.000000f, -0.455297f, 0.038026f, -0.889527f, 0.500000f, 0.803531f, - -0.212032f, 0.291836f, -0.932670f, 0.000000f, -0.212032f, 0.291836f, -0.932670f, 0.922791f, 0.562217f, - -0.286151f, 0.092976f, -0.953663f, 0.000000f, -0.286151f, 0.092976f, -0.953663f, 0.393083f, 0.797605f, - -0.390694f, 0.236853f, -0.889527f, 0.000000f, -0.390694f, 0.236853f, -0.889527f, 0.352845f, 0.852980f, - -0.632156f, -0.019439f, -0.774597f, 0.000000f, -0.632156f, -0.019439f, -0.774597f, 0.265712f, 0.822469f, - -0.500000f, -0.162460f, -0.850651f, 0.000000f, -0.500000f, -0.162460f, -0.850651f, 0.606917f, 0.797605f, - -0.639949f, -0.207932f, -0.739749f, 0.000000f, -0.639949f, -0.207932f, -0.739749f, 0.445347f, 0.869541f, - -0.577350f, 0.187593f, -0.794654f, 0.000000f, -0.577350f, 0.187593f, -0.794654f, 0.554653f, 0.869541f, - -0.455297f, 0.038026f, -0.889527f, 0.000000f, -0.455297f, 0.038026f, -0.889527f, 0.500000f, 0.803531f, - -0.632156f, -0.019439f, -0.774597f, 0.000000f, -0.632156f, -0.019439f, -0.774597f, 0.265712f, 0.822469f, - -0.390694f, 0.236853f, -0.889527f, 0.000000f, -0.390694f, 0.236853f, -0.889527f, 0.352845f, 0.852980f, - -0.577350f, 0.187593f, -0.794654f, 0.000000f, -0.577350f, 0.187593f, -0.794654f, 0.554653f, 0.869541f, - -0.499999f, 0.387299f, -0.774597f, 0.000000f, -0.499999f, 0.387299f, -0.774597f, 0.647155f, 0.852980f, - -0.309017f, 0.425325f, -0.850651f, 0.000000f, -0.309017f, 0.425325f, -0.850651f, 0.881177f, 0.469124f, - -0.499999f, 0.387299f, -0.774597f, 0.000000f, -0.499999f, 0.387299f, -0.774597f, 0.647155f, 0.852980f, - -0.395510f, 0.544373f, -0.739749f, 0.000000f, -0.395510f, 0.544373f, -0.739749f, 0.762866f, 0.814054f, - -0.455297f, 0.038026f, -0.889527f, 0.000000f, -0.455297f, 0.038026f, -0.889527f, 0.500000f, 0.803531f, - -0.500000f, -0.162460f, -0.850651f, 0.000000f, -0.500000f, -0.162460f, -0.850651f, 0.606917f, 0.797605f, - -0.632156f, -0.019439f, -0.774597f, 0.000000f, -0.632156f, -0.019439f, -0.774597f, 0.265712f, 0.822469f, - -0.390694f, 0.236853f, -0.889527f, 0.000000f, -0.390694f, 0.236853f, -0.889527f, 0.352845f, 0.852980f, - -0.455297f, 0.038026f, -0.889527f, 0.000000f, -0.455297f, 0.038026f, -0.889527f, 0.500000f, 0.803531f, - -0.577350f, 0.187593f, -0.794654f, 0.000000f, -0.577350f, 0.187593f, -0.794654f, 0.554653f, 0.869541f, - -0.309017f, 0.425325f, -0.850651f, 0.000000f, -0.309017f, 0.425325f, -0.850651f, 0.881177f, 0.469124f, - -0.390694f, 0.236853f, -0.889527f, 0.000000f, -0.390694f, 0.236853f, -0.889527f, 0.352845f, 0.852980f, - -0.499999f, 0.387299f, -0.774597f, 0.000000f, -0.499999f, 0.387299f, -0.774597f, 0.647155f, 0.852980f, - -0.762354f, -0.061751f, -0.644208f, 0.000000f, -0.762354f, -0.061751f, -0.644208f, 0.319635f, 0.835614f, - -0.639949f, -0.207932f, -0.739749f, 0.000000f, -0.639949f, -0.207932f, -0.739749f, 0.445347f, 0.869541f, - -0.758172f, -0.246345f, -0.603730f, 0.000000f, -0.758172f, -0.246345f, -0.603730f, 0.265712f, 0.892312f, - -0.736685f, 0.124433f, -0.664689f, 0.000000f, -0.736685f, 0.124433f, -0.664689f, 0.237134f, 0.814054f, - -0.632156f, -0.019439f, -0.774597f, 0.000000f, -0.632156f, -0.019439f, -0.774597f, 0.265712f, 0.822469f, - -0.762354f, -0.061751f, -0.644208f, 0.000000f, -0.762354f, -0.061751f, -0.644208f, 0.319635f, 0.835614f, - -0.577350f, 0.187593f, -0.794654f, 0.000000f, -0.577350f, 0.187593f, -0.794654f, 0.554653f, 0.869541f, - -0.736685f, 0.124433f, -0.664689f, 0.000000f, -0.736685f, 0.124433f, -0.664689f, 0.237134f, 0.814054f, - -0.669131f, 0.332344f, -0.664689f, 0.000000f, -0.669131f, 0.332344f, -0.664689f, 0.408260f, 0.848850f, - -0.499999f, 0.387299f, -0.774597f, 0.000000f, -0.499999f, 0.387299f, -0.774597f, 0.647155f, 0.852980f, - -0.669131f, 0.332344f, -0.664689f, 0.000000f, -0.669131f, 0.332344f, -0.664689f, 0.408260f, 0.848850f, - -0.580460f, 0.498058f, -0.644208f, 0.000000f, -0.580460f, 0.498058f, -0.644208f, 0.352845f, 0.912551f, - -0.395510f, 0.544373f, -0.739749f, 0.000000f, -0.395510f, 0.544373f, -0.739749f, 0.762866f, 0.814054f, - -0.580460f, 0.498058f, -0.644208f, 0.000000f, -0.580460f, 0.498058f, -0.644208f, 0.352845f, 0.912551f, - -0.468576f, 0.644939f, -0.603730f, 0.000000f, -0.468576f, 0.644939f, -0.603730f, 0.853312f, 0.631433f, - -0.632156f, -0.019439f, -0.774597f, 0.000000f, -0.632156f, -0.019439f, -0.774597f, 0.265712f, 0.822469f, - -0.639949f, -0.207932f, -0.739749f, 0.000000f, -0.639949f, -0.207932f, -0.739749f, 0.445347f, 0.869541f, - -0.762354f, -0.061751f, -0.644208f, 0.000000f, -0.762354f, -0.061751f, -0.644208f, 0.319635f, 0.835614f, - -0.577350f, 0.187593f, -0.794654f, 0.000000f, -0.577350f, 0.187593f, -0.794654f, 0.554653f, 0.869541f, - -0.632156f, -0.019439f, -0.774597f, 0.000000f, -0.632156f, -0.019439f, -0.774597f, 0.265712f, 0.822469f, - -0.736685f, 0.124433f, -0.664689f, 0.000000f, -0.736685f, 0.124433f, -0.664689f, 0.237134f, 0.814054f, - -0.499999f, 0.387299f, -0.774597f, 0.000000f, -0.499999f, 0.387299f, -0.774597f, 0.647155f, 0.852980f, - -0.577350f, 0.187593f, -0.794654f, 0.000000f, -0.577350f, 0.187593f, -0.794654f, 0.554653f, 0.869541f, - -0.669131f, 0.332344f, -0.664689f, 0.000000f, -0.669131f, 0.332344f, -0.664689f, 0.408260f, 0.848850f, - -0.395510f, 0.544373f, -0.739749f, 0.000000f, -0.395510f, 0.544373f, -0.739749f, 0.762866f, 0.814054f, - -0.499999f, 0.387299f, -0.774597f, 0.000000f, -0.499999f, 0.387299f, -0.774597f, 0.647155f, 0.852980f, - -0.580460f, 0.498058f, -0.644208f, 0.000000f, -0.580460f, 0.498058f, -0.644208f, 0.352845f, 0.912551f, - -0.866018f, -0.097907f, -0.490334f, 0.000000f, -0.866018f, -0.097907f, -0.490334f, 0.500000f, 0.853312f, - -0.758172f, -0.246345f, -0.603730f, 0.000000f, -0.758172f, -0.246345f, -0.603730f, 0.265712f, 0.892312f, - -0.850651f, -0.276393f, -0.447214f, 0.000000f, -0.850651f, -0.276393f, -0.447214f, 0.445347f, 0.922791f, - -0.851981f, 0.083904f, -0.516806f, 0.000000f, -0.851981f, 0.083904f, -0.516806f, 0.554653f, 0.922791f, - -0.762354f, -0.061751f, -0.644208f, 0.000000f, -0.762354f, -0.061751f, -0.644208f, 0.319635f, 0.835614f, - -0.866018f, -0.097907f, -0.490334f, 0.000000f, -0.866018f, -0.097907f, -0.490334f, 0.500000f, 0.853312f, - -0.809017f, 0.262866f, -0.525731f, 0.000000f, -0.809017f, 0.262866f, -0.525731f, 0.591739f, 0.848850f, - -0.736685f, 0.124433f, -0.664689f, 0.000000f, -0.736685f, 0.124433f, -0.664689f, 0.237134f, 0.814054f, - -0.851981f, 0.083904f, -0.516806f, 0.000000f, -0.851981f, 0.083904f, -0.516806f, 0.554653f, 0.922791f, - -0.669131f, 0.332344f, -0.664689f, 0.000000f, -0.669131f, 0.332344f, -0.664689f, 0.408260f, 0.848850f, - -0.809017f, 0.262866f, -0.525731f, 0.000000f, -0.809017f, 0.262866f, -0.525731f, 0.591739f, 0.848850f, - -0.738585f, 0.432902f, -0.516806f, 0.000000f, -0.738585f, 0.432902f, -0.516806f, 0.647155f, 0.912551f, - -0.580460f, 0.498058f, -0.644208f, 0.000000f, -0.580460f, 0.498058f, -0.644208f, 0.352845f, 0.912551f, - -0.738585f, 0.432902f, -0.516806f, 0.000000f, -0.738585f, 0.432902f, -0.516806f, 0.647155f, 0.912551f, - -0.643075f, 0.588241f, -0.490334f, 0.000000f, -0.643075f, 0.588241f, -0.490334f, 0.680365f, 0.835614f, - -0.468576f, 0.644939f, -0.603730f, 0.000000f, -0.468576f, 0.644939f, -0.603730f, 0.853312f, 0.631433f, - -0.643075f, 0.588241f, -0.490334f, 0.000000f, -0.643075f, 0.588241f, -0.490334f, 0.680365f, 0.835614f, - -0.525731f, 0.723607f, -0.447214f, 0.000000f, -0.525731f, 0.723607f, -0.447214f, 0.446077f, 0.574219f, - -0.762354f, -0.061751f, -0.644208f, 0.000000f, -0.762354f, -0.061751f, -0.644208f, 0.319635f, 0.835614f, - -0.758172f, -0.246345f, -0.603730f, 0.000000f, -0.758172f, -0.246345f, -0.603730f, 0.265712f, 0.892312f, - -0.866018f, -0.097907f, -0.490334f, 0.000000f, -0.866018f, -0.097907f, -0.490334f, 0.500000f, 0.853312f, - -0.736685f, 0.124433f, -0.664689f, 0.000000f, -0.736685f, 0.124433f, -0.664689f, 0.237134f, 0.814054f, - -0.762354f, -0.061751f, -0.644208f, 0.000000f, -0.762354f, -0.061751f, -0.644208f, 0.319635f, 0.835614f, - -0.851981f, 0.083904f, -0.516806f, 0.000000f, -0.851981f, 0.083904f, -0.516806f, 0.554653f, 0.922791f, - -0.669131f, 0.332344f, -0.664689f, 0.000000f, -0.669131f, 0.332344f, -0.664689f, 0.408260f, 0.848850f, - -0.736685f, 0.124433f, -0.664689f, 0.000000f, -0.736685f, 0.124433f, -0.664689f, 0.237134f, 0.814054f, - -0.809017f, 0.262866f, -0.525731f, 0.000000f, -0.809017f, 0.262866f, -0.525731f, 0.591739f, 0.848850f, - -0.580460f, 0.498058f, -0.644208f, 0.000000f, -0.580460f, 0.498058f, -0.644208f, 0.352845f, 0.912551f, - -0.669131f, 0.332344f, -0.664689f, 0.000000f, -0.669131f, 0.332344f, -0.664689f, 0.408260f, 0.848850f, - -0.738585f, 0.432902f, -0.516806f, 0.000000f, -0.738585f, 0.432902f, -0.516806f, 0.647155f, 0.912551f, - -0.468576f, 0.644939f, -0.603730f, 0.000000f, -0.468576f, 0.644939f, -0.603730f, 0.853312f, 0.631433f, - -0.580460f, 0.498058f, -0.644208f, 0.000000f, -0.580460f, 0.498058f, -0.644208f, 0.352845f, 0.912551f, - -0.643075f, 0.588241f, -0.490334f, 0.000000f, -0.643075f, 0.588241f, -0.490334f, 0.680365f, 0.835614f, - 0.000000f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, -1.000000f, 0.500000f, 0.500000f, - 0.000000f, -0.183479f, -0.983024f, 0.000000f, 0.000000f, -0.183479f, -0.983024f, 0.500000f, 0.408260f, - -0.174499f, -0.056698f, -0.983024f, 0.000000f, -0.174499f, -0.056698f, -0.983024f, 0.552265f, 0.722382f, - -0.176851f, -0.243415f, -0.953663f, 0.000000f, -0.176851f, -0.243415f, -0.953663f, 0.412750f, 0.471651f, - 0.000000f, -0.183479f, -0.983024f, 0.000000f, 0.000000f, -0.183479f, -0.983024f, 0.500000f, 0.408260f, - 0.000000f, -0.360730f, -0.932670f, 0.000000f, 0.000000f, -0.360730f, -0.932670f, 0.500000f, 0.319635f, - -0.174499f, -0.056698f, -0.983024f, 0.000000f, -0.174499f, -0.056698f, -0.983024f, 0.552265f, 0.722382f, - -0.176851f, -0.243415f, -0.953663f, 0.000000f, -0.176851f, -0.243415f, -0.953663f, 0.412750f, 0.471651f, - -0.343074f, -0.111472f, -0.932670f, 0.000000f, -0.343074f, -0.111472f, -0.932670f, 0.302245f, 0.772187f, - -0.174499f, -0.056698f, -0.983024f, 0.000000f, -0.174499f, -0.056698f, -0.983024f, 0.552265f, 0.722382f, - 0.000000f, -0.183479f, -0.983024f, 0.000000f, 0.000000f, -0.183479f, -0.983024f, 0.500000f, 0.408260f, - -0.176851f, -0.243415f, -0.953663f, 0.000000f, -0.176851f, -0.243415f, -0.953663f, 0.412750f, 0.471651f, - -0.176860f, -0.421262f, -0.889527f, 0.000000f, -0.176860f, -0.421262f, -0.889527f, 0.356925f, 0.546488f, - 0.000000f, -0.360730f, -0.932670f, 0.000000f, 0.000000f, -0.360730f, -0.932670f, 0.500000f, 0.319635f, - 0.000000f, -0.525731f, -0.850651f, 0.000000f, 0.000000f, -0.525731f, -0.850651f, 0.500000f, 0.237134f, - -0.176851f, -0.243415f, -0.953663f, 0.000000f, -0.176851f, -0.243415f, -0.953663f, 0.412750f, 0.471651f, - -0.176860f, -0.421262f, -0.889527f, 0.000000f, -0.176860f, -0.421262f, -0.889527f, 0.356925f, 0.546488f, - -0.345991f, -0.298381f, -0.889527f, 0.000000f, -0.345991f, -0.298381f, -0.889527f, 0.328463f, 0.444264f, - -0.343074f, -0.111472f, -0.932670f, 0.000000f, -0.343074f, -0.111472f, -0.932670f, 0.302245f, 0.772187f, - -0.345991f, -0.298381f, -0.889527f, 0.000000f, -0.345991f, -0.298381f, -0.889527f, 0.328463f, 0.444264f, - -0.500000f, -0.162460f, -0.850651f, 0.000000f, -0.500000f, -0.162460f, -0.850651f, 0.606917f, 0.797605f, - -0.176851f, -0.243415f, -0.953663f, 0.000000f, -0.176851f, -0.243415f, -0.953663f, 0.412750f, 0.471651f, - 0.000000f, -0.360730f, -0.932670f, 0.000000f, 0.000000f, -0.360730f, -0.932670f, 0.500000f, 0.319635f, - -0.176860f, -0.421262f, -0.889527f, 0.000000f, -0.176860f, -0.421262f, -0.889527f, 0.356925f, 0.546488f, - -0.343074f, -0.111472f, -0.932670f, 0.000000f, -0.343074f, -0.111472f, -0.932670f, 0.302245f, 0.772187f, - -0.176851f, -0.243415f, -0.953663f, 0.000000f, -0.176851f, -0.243415f, -0.953663f, 0.412750f, 0.471651f, - -0.345991f, -0.298381f, -0.889527f, 0.000000f, -0.345991f, -0.298381f, -0.889527f, 0.328463f, 0.444264f, - -0.176860f, -0.607223f, -0.774597f, 0.000000f, -0.176860f, -0.607223f, -0.774597f, 0.272352f, 0.519013f, - 0.000000f, -0.525731f, -0.850651f, 0.000000f, 0.000000f, -0.525731f, -0.850651f, 0.500000f, 0.237134f, - 0.000000f, -0.672883f, -0.739749f, 0.000000f, 0.000000f, -0.672883f, -0.739749f, 0.500000f, 0.163559f, - -0.356822f, -0.491123f, -0.794655f, 0.000000f, -0.356822f, -0.491123f, -0.794655f, 0.250000f, 0.418770f, - -0.176860f, -0.421262f, -0.889527f, 0.000000f, -0.176860f, -0.421262f, -0.889527f, 0.356925f, 0.546488f, - -0.176860f, -0.607223f, -0.774597f, 0.000000f, -0.176860f, -0.607223f, -0.774597f, 0.272352f, 0.519013f, - -0.345991f, -0.298381f, -0.889527f, 0.000000f, -0.345991f, -0.298381f, -0.889527f, 0.328463f, 0.444264f, - -0.356822f, -0.491123f, -0.794655f, 0.000000f, -0.356822f, -0.491123f, -0.794655f, 0.250000f, 0.418770f, - -0.522851f, -0.355846f, -0.774597f, 0.000000f, -0.522851f, -0.355846f, -0.774597f, 0.304653f, 0.618427f, - -0.500000f, -0.162460f, -0.850651f, 0.000000f, -0.500000f, -0.162460f, -0.850651f, 0.606917f, 0.797605f, - -0.522851f, -0.355846f, -0.774597f, 0.000000f, -0.522851f, -0.355846f, -0.774597f, 0.304653f, 0.618427f, - -0.639949f, -0.207932f, -0.739749f, 0.000000f, -0.639949f, -0.207932f, -0.739749f, 0.445347f, 0.869541f, - -0.176860f, -0.421262f, -0.889527f, 0.000000f, -0.176860f, -0.421262f, -0.889527f, 0.356925f, 0.546488f, - 0.000000f, -0.525731f, -0.850651f, 0.000000f, 0.000000f, -0.525731f, -0.850651f, 0.500000f, 0.237134f, - -0.176860f, -0.607223f, -0.774597f, 0.000000f, -0.176860f, -0.607223f, -0.774597f, 0.272352f, 0.519013f, - -0.345991f, -0.298381f, -0.889527f, 0.000000f, -0.345991f, -0.298381f, -0.889527f, 0.328463f, 0.444264f, - -0.176860f, -0.421262f, -0.889527f, 0.000000f, -0.176860f, -0.421262f, -0.889527f, 0.356925f, 0.546488f, - -0.356822f, -0.491123f, -0.794655f, 0.000000f, -0.356822f, -0.491123f, -0.794655f, 0.250000f, 0.418770f, - -0.500000f, -0.162460f, -0.850651f, 0.000000f, -0.500000f, -0.162460f, -0.850651f, 0.606917f, 0.797605f, - -0.345991f, -0.298381f, -0.889527f, 0.000000f, -0.345991f, -0.298381f, -0.889527f, 0.328463f, 0.444264f, - -0.522851f, -0.355846f, -0.774597f, 0.000000f, -0.522851f, -0.355846f, -0.774597f, 0.304653f, 0.618427f, - -0.176851f, -0.744124f, -0.644208f, 0.000000f, -0.176851f, -0.744124f, -0.644208f, 0.183922f, 0.490281f, - 0.000000f, -0.672883f, -0.739749f, 0.000000f, 0.000000f, -0.672883f, -0.739749f, 0.500000f, 0.163559f, - 0.000000f, -0.797189f, -0.603730f, 0.000000f, 0.000000f, -0.797189f, -0.603730f, 0.672996f, 0.168911f, - -0.345991f, -0.662178f, -0.664689f, 0.000000f, -0.345991f, -0.662178f, -0.664689f, 0.180025f, 0.396034f, - -0.176860f, -0.607223f, -0.774597f, 0.000000f, -0.176860f, -0.607223f, -0.774597f, 0.272352f, 0.519013f, - -0.176851f, -0.744124f, -0.644208f, 0.000000f, -0.176851f, -0.744124f, -0.644208f, 0.183922f, 0.490281f, - -0.356822f, -0.491123f, -0.794655f, 0.000000f, -0.356822f, -0.491123f, -0.794655f, 0.250000f, 0.418770f, - -0.345991f, -0.662178f, -0.664689f, 0.000000f, -0.345991f, -0.662178f, -0.664689f, 0.180025f, 0.396034f, - -0.522851f, -0.533681f, -0.664689f, 0.000000f, -0.522851f, -0.533681f, -0.664689f, 0.211325f, 0.593796f, - -0.522851f, -0.355846f, -0.774597f, 0.000000f, -0.522851f, -0.355846f, -0.774597f, 0.304653f, 0.618427f, - -0.522851f, -0.533681f, -0.664689f, 0.000000f, -0.522851f, -0.533681f, -0.664689f, 0.211325f, 0.593796f, - -0.653054f, -0.398142f, -0.644208f, 0.000000f, -0.653054f, -0.398142f, -0.644208f, 0.250001f, 0.693650f, - -0.639949f, -0.207932f, -0.739749f, 0.000000f, -0.639949f, -0.207932f, -0.739749f, 0.445347f, 0.869541f, - -0.653054f, -0.398142f, -0.644208f, 0.000000f, -0.653054f, -0.398142f, -0.644208f, 0.250001f, 0.693650f, - -0.758172f, -0.246345f, -0.603730f, 0.000000f, -0.758172f, -0.246345f, -0.603730f, 0.265712f, 0.892312f, - -0.176860f, -0.607223f, -0.774597f, 0.000000f, -0.176860f, -0.607223f, -0.774597f, 0.272352f, 0.519013f, - 0.000000f, -0.672883f, -0.739749f, 0.000000f, 0.000000f, -0.672883f, -0.739749f, 0.500000f, 0.163559f, - -0.176851f, -0.744124f, -0.644208f, 0.000000f, -0.176851f, -0.744124f, -0.644208f, 0.183922f, 0.490281f, - -0.356822f, -0.491123f, -0.794655f, 0.000000f, -0.356822f, -0.491123f, -0.794655f, 0.250000f, 0.418770f, - -0.176860f, -0.607223f, -0.774597f, 0.000000f, -0.176860f, -0.607223f, -0.774597f, 0.272352f, 0.519013f, - -0.345991f, -0.662178f, -0.664689f, 0.000000f, -0.345991f, -0.662178f, -0.664689f, 0.180025f, 0.396034f, - -0.522851f, -0.355846f, -0.774597f, 0.000000f, -0.522851f, -0.355846f, -0.774597f, 0.304653f, 0.618427f, - -0.356822f, -0.491123f, -0.794655f, 0.000000f, -0.356822f, -0.491123f, -0.794655f, 0.250000f, 0.418770f, - -0.522851f, -0.533681f, -0.664689f, 0.000000f, -0.522851f, -0.533681f, -0.664689f, 0.211325f, 0.593796f, - -0.639949f, -0.207932f, -0.739749f, 0.000000f, -0.639949f, -0.207932f, -0.739749f, 0.445347f, 0.869541f, - -0.522851f, -0.355846f, -0.774597f, 0.000000f, -0.522851f, -0.355846f, -0.774597f, 0.304653f, 0.618427f, - -0.653054f, -0.398142f, -0.644208f, 0.000000f, -0.653054f, -0.398142f, -0.644208f, 0.250001f, 0.693650f, - -0.174499f, -0.853887f, -0.490334f, 0.000000f, -0.174499f, -0.853887f, -0.490334f, 0.131658f, 0.562217f, - 0.000000f, -0.797189f, -0.603730f, 0.000000f, 0.000000f, -0.797189f, -0.603730f, 0.672996f, 0.168911f, - 0.000000f, -0.894427f, -0.447214f, 0.000000f, 0.000000f, -0.894427f, -0.447214f, 0.848850f, 0.215669f, - -0.343074f, -0.784354f, -0.516806f, 0.000000f, -0.343074f, -0.784354f, -0.516806f, 0.165435f, 0.666172f, - -0.176851f, -0.744124f, -0.644208f, 0.000000f, -0.176851f, -0.744124f, -0.644208f, 0.183922f, 0.490281f, - -0.174499f, -0.853887f, -0.490334f, 0.000000f, -0.174499f, -0.853887f, -0.490334f, 0.131658f, 0.562217f, - -0.500000f, -0.688191f, -0.525731f, 0.000000f, -0.500000f, -0.688191f, -0.525731f, 0.209770f, 0.749029f, - -0.345991f, -0.662178f, -0.664689f, 0.000000f, -0.345991f, -0.662178f, -0.664689f, 0.180025f, 0.396034f, - -0.343074f, -0.784354f, -0.516806f, 0.000000f, -0.343074f, -0.784354f, -0.516806f, 0.165435f, 0.666172f, - -0.522851f, -0.533681f, -0.664689f, 0.000000f, -0.522851f, -0.533681f, -0.664689f, 0.211325f, 0.593796f, - -0.500000f, -0.688191f, -0.525731f, 0.000000f, -0.500000f, -0.688191f, -0.525731f, 0.209770f, 0.749029f, - -0.639949f, -0.568662f, -0.516806f, 0.000000f, -0.639949f, -0.568662f, -0.516806f, 0.118823f, 0.469124f, - -0.653054f, -0.398142f, -0.644208f, 0.000000f, -0.653054f, -0.398142f, -0.644208f, 0.250001f, 0.693650f, - -0.639949f, -0.568662f, -0.516806f, 0.000000f, -0.639949f, -0.568662f, -0.516806f, 0.118823f, 0.469124f, - -0.758172f, -0.429824f, -0.490334f, 0.000000f, -0.758172f, -0.429824f, -0.490334f, 0.178463f, 0.835614f, - -0.758172f, -0.246345f, -0.603730f, 0.000000f, -0.758172f, -0.246345f, -0.603730f, 0.265712f, 0.892312f, - -0.758172f, -0.429824f, -0.490334f, 0.000000f, -0.758172f, -0.429824f, -0.490334f, 0.178463f, 0.835614f, - -0.850651f, -0.276393f, -0.447214f, 0.000000f, -0.850651f, -0.276393f, -0.447214f, 0.445347f, 0.922791f, - -0.176851f, -0.744124f, -0.644208f, 0.000000f, -0.176851f, -0.744124f, -0.644208f, 0.183922f, 0.490281f, - 0.000000f, -0.797189f, -0.603730f, 0.000000f, 0.000000f, -0.797189f, -0.603730f, 0.672996f, 0.168911f, - -0.174499f, -0.853887f, -0.490334f, 0.000000f, -0.174499f, -0.853887f, -0.490334f, 0.131658f, 0.562217f, - -0.345991f, -0.662178f, -0.664689f, 0.000000f, -0.345991f, -0.662178f, -0.664689f, 0.180025f, 0.396034f, - -0.176851f, -0.744124f, -0.644208f, 0.000000f, -0.176851f, -0.744124f, -0.644208f, 0.183922f, 0.490281f, - -0.343074f, -0.784354f, -0.516806f, 0.000000f, -0.343074f, -0.784354f, -0.516806f, 0.165435f, 0.666172f, - -0.522851f, -0.533681f, -0.664689f, 0.000000f, -0.522851f, -0.533681f, -0.664689f, 0.211325f, 0.593796f, - -0.345991f, -0.662178f, -0.664689f, 0.000000f, -0.345991f, -0.662178f, -0.664689f, 0.180025f, 0.396034f, - -0.500000f, -0.688191f, -0.525731f, 0.000000f, -0.500000f, -0.688191f, -0.525731f, 0.209770f, 0.749029f, - -0.653054f, -0.398142f, -0.644208f, 0.000000f, -0.653054f, -0.398142f, -0.644208f, 0.250001f, 0.693650f, - -0.522851f, -0.533681f, -0.664689f, 0.000000f, -0.522851f, -0.533681f, -0.664689f, 0.211325f, 0.593796f, - -0.639949f, -0.568662f, -0.516806f, 0.000000f, -0.639949f, -0.568662f, -0.516806f, 0.118823f, 0.469124f, - -0.758172f, -0.246345f, -0.603730f, 0.000000f, -0.758172f, -0.246345f, -0.603730f, 0.265712f, 0.892312f, - -0.653054f, -0.398142f, -0.644208f, 0.000000f, -0.653054f, -0.398142f, -0.644208f, 0.250001f, 0.693650f, - -0.758172f, -0.429824f, -0.490334f, 0.000000f, -0.758172f, -0.429824f, -0.490334f, 0.178463f, 0.835614f, - 0.107846f, -0.148438f, 0.983024f, 0.000000f, 0.107846f, -0.148438f, 0.983024f, 0.209770f, 0.912551f, - 0.174499f, 0.056698f, 0.983024f, 0.000000f, 0.174499f, 0.056698f, 0.983024f, 0.411574f, 0.378293f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.411570f, 0.289369f, - 0.212032f, -0.291836f, 0.932670f, 0.000000f, 0.212032f, -0.291836f, 0.932670f, 0.327004f, 0.350810f, - 0.286151f, -0.092976f, 0.953663f, 0.000000f, 0.286151f, -0.092976f, 0.953663f, 0.411570f, 0.196389f, - 0.107846f, -0.148438f, 0.983024f, 0.000000f, 0.107846f, -0.148438f, 0.983024f, 0.209770f, 0.912551f, - 0.286151f, -0.092976f, 0.953663f, 0.000000f, 0.286151f, -0.092976f, 0.953663f, 0.411570f, 0.196389f, - 0.343074f, 0.111472f, 0.932670f, 0.000000f, 0.343074f, 0.111472f, 0.932670f, 0.321589f, 0.254439f, - 0.174499f, 0.056698f, 0.983024f, 0.000000f, 0.174499f, 0.056698f, 0.983024f, 0.411574f, 0.378293f, - 0.107846f, -0.148438f, 0.983024f, 0.000000f, 0.107846f, -0.148438f, 0.983024f, 0.209770f, 0.912551f, - 0.286151f, -0.092976f, 0.953663f, 0.000000f, 0.286151f, -0.092976f, 0.953663f, 0.411570f, 0.196389f, - 0.174499f, 0.056698f, 0.983024f, 0.000000f, 0.174499f, 0.056698f, 0.983024f, 0.411574f, 0.378293f, - 0.309017f, -0.425325f, 0.850651f, 0.000000f, 0.309017f, -0.425325f, 0.850651f, 0.238575f, 0.322077f, - 0.390694f, -0.236853f, 0.889527f, 0.000000f, 0.390694f, -0.236853f, 0.889527f, 0.411574f, 0.912551f, - 0.212032f, -0.291836f, 0.932670f, 0.000000f, 0.212032f, -0.291836f, 0.932670f, 0.327004f, 0.350810f, - 0.390694f, -0.236853f, 0.889527f, 0.000000f, 0.390694f, -0.236853f, 0.889527f, 0.411574f, 0.912551f, - 0.455297f, -0.038026f, 0.889527f, 0.000000f, 0.455297f, -0.038026f, 0.889527f, 0.327004f, 0.168911f, - 0.286151f, -0.092976f, 0.953663f, 0.000000f, 0.286151f, -0.092976f, 0.953663f, 0.411570f, 0.196389f, - 0.455297f, -0.038026f, 0.889527f, 0.000000f, 0.455297f, -0.038026f, 0.889527f, 0.327004f, 0.168911f, - 0.500000f, 0.162460f, 0.850651f, 0.000000f, 0.500000f, 0.162460f, 0.850651f, 0.411574f, 0.127938f, - 0.343074f, 0.111472f, 0.932670f, 0.000000f, 0.343074f, 0.111472f, 0.932670f, 0.321589f, 0.254439f, - 0.212032f, -0.291836f, 0.932670f, 0.000000f, 0.212032f, -0.291836f, 0.932670f, 0.327004f, 0.350810f, - 0.390694f, -0.236853f, 0.889527f, 0.000000f, 0.390694f, -0.236853f, 0.889527f, 0.411574f, 0.912551f, - 0.286151f, -0.092976f, 0.953663f, 0.000000f, 0.286151f, -0.092976f, 0.953663f, 0.411570f, 0.196389f, - 0.455297f, -0.038026f, 0.889527f, 0.000000f, 0.455297f, -0.038026f, 0.889527f, 0.327004f, 0.168911f, - 0.343074f, 0.111472f, 0.932670f, 0.000000f, 0.343074f, 0.111472f, 0.932670f, 0.321589f, 0.254439f, - 0.286151f, -0.092976f, 0.953663f, 0.000000f, 0.286151f, -0.092976f, 0.953663f, 0.411570f, 0.196389f, - 0.395510f, -0.544373f, 0.739749f, 0.000000f, 0.395510f, -0.544373f, 0.739749f, 0.238575f, 0.233160f, - 0.499999f, -0.387298f, 0.774597f, 0.000000f, 0.499999f, -0.387298f, 0.774597f, 0.173473f, 0.300929f, - 0.309017f, -0.425325f, 0.850651f, 0.000000f, 0.309017f, -0.425325f, 0.850651f, 0.238575f, 0.322077f, - 0.499999f, -0.387298f, 0.774597f, 0.000000f, 0.499999f, -0.387298f, 0.774597f, 0.173473f, 0.300929f, - 0.577350f, -0.187592f, 0.794654f, 0.000000f, 0.577350f, -0.187592f, 0.794654f, 0.412750f, 0.835614f, - 0.390694f, -0.236853f, 0.889527f, 0.000000f, 0.390694f, -0.236853f, 0.889527f, 0.411574f, 0.912551f, - 0.577350f, -0.187592f, 0.794654f, 0.000000f, 0.577350f, -0.187592f, 0.794654f, 0.412750f, 0.835614f, - 0.632156f, 0.019439f, 0.774597f, 0.000000f, 0.632156f, 0.019439f, 0.774597f, 0.328463f, 0.848850f, - 0.455297f, -0.038026f, 0.889527f, 0.000000f, 0.455297f, -0.038026f, 0.889527f, 0.327004f, 0.168911f, - 0.632156f, 0.019439f, 0.774597f, 0.000000f, 0.632156f, 0.019439f, 0.774597f, 0.328463f, 0.848850f, - 0.639949f, 0.207932f, 0.739749f, 0.000000f, 0.639949f, 0.207932f, 0.739749f, 0.250000f, 0.853312f, - 0.500000f, 0.162460f, 0.850651f, 0.000000f, 0.500000f, 0.162460f, 0.850651f, 0.411574f, 0.127938f, - 0.309017f, -0.425325f, 0.850651f, 0.000000f, 0.309017f, -0.425325f, 0.850651f, 0.238575f, 0.322077f, - 0.499999f, -0.387298f, 0.774597f, 0.000000f, 0.499999f, -0.387298f, 0.774597f, 0.173473f, 0.300929f, - 0.390694f, -0.236853f, 0.889527f, 0.000000f, 0.390694f, -0.236853f, 0.889527f, 0.411574f, 0.912551f, - 0.390694f, -0.236853f, 0.889527f, 0.000000f, 0.390694f, -0.236853f, 0.889527f, 0.411574f, 0.912551f, - 0.577350f, -0.187592f, 0.794654f, 0.000000f, 0.577350f, -0.187592f, 0.794654f, 0.412750f, 0.835614f, - 0.455297f, -0.038026f, 0.889527f, 0.000000f, 0.455297f, -0.038026f, 0.889527f, 0.327004f, 0.168911f, - 0.632156f, 0.019439f, 0.774597f, 0.000000f, 0.632156f, 0.019439f, 0.774597f, 0.328463f, 0.848850f, - 0.500000f, 0.162460f, 0.850651f, 0.000000f, 0.500000f, 0.162460f, 0.850651f, 0.411574f, 0.127938f, - 0.455297f, -0.038026f, 0.889527f, 0.000000f, 0.455297f, -0.038026f, 0.889527f, 0.327004f, 0.168911f, - 0.468576f, -0.644939f, 0.603730f, 0.000000f, 0.468576f, -0.644939f, 0.603730f, 0.327004f, 0.922791f, - 0.580460f, -0.498058f, 0.644208f, 0.000000f, 0.580460f, -0.498058f, 0.644208f, 0.238575f, 0.922791f, - 0.395510f, -0.544373f, 0.739749f, 0.000000f, 0.395510f, -0.544373f, 0.739749f, 0.238575f, 0.233160f, - 0.580460f, -0.498058f, 0.644208f, 0.000000f, 0.580460f, -0.498058f, 0.644208f, 0.238575f, 0.922791f, - 0.669131f, -0.332344f, 0.664689f, 0.000000f, 0.669131f, -0.332344f, 0.664689f, 0.180025f, 0.848850f, - 0.499999f, -0.387298f, 0.774597f, 0.000000f, 0.499999f, -0.387298f, 0.774597f, 0.173473f, 0.300929f, - 0.669131f, -0.332344f, 0.664689f, 0.000000f, 0.669131f, -0.332344f, 0.664689f, 0.180025f, 0.848850f, - 0.736685f, -0.124433f, 0.664689f, 0.000000f, 0.736685f, -0.124433f, 0.664689f, 0.922791f, 0.233160f, - 0.577350f, -0.187592f, 0.794654f, 0.000000f, 0.577350f, -0.187592f, 0.794654f, 0.412750f, 0.835614f, - 0.736685f, -0.124433f, 0.664689f, 0.000000f, 0.736685f, -0.124433f, 0.664689f, 0.922791f, 0.233160f, - 0.762354f, 0.061751f, 0.644208f, 0.000000f, 0.762354f, 0.061751f, 0.644208f, 0.553923f, 0.425781f, - 0.632156f, 0.019439f, 0.774597f, 0.000000f, 0.632156f, 0.019439f, 0.774597f, 0.328463f, 0.848850f, - 0.762354f, 0.061751f, 0.644208f, 0.000000f, 0.762354f, 0.061751f, 0.644208f, 0.553923f, 0.425781f, - 0.758172f, 0.246345f, 0.603730f, 0.000000f, 0.758172f, 0.246345f, 0.603730f, 0.587250f, 0.528349f, - 0.639949f, 0.207932f, 0.739749f, 0.000000f, 0.639949f, 0.207932f, 0.739749f, 0.250000f, 0.853312f, - 0.395510f, -0.544373f, 0.739749f, 0.000000f, 0.395510f, -0.544373f, 0.739749f, 0.238575f, 0.233160f, - 0.580460f, -0.498058f, 0.644208f, 0.000000f, 0.580460f, -0.498058f, 0.644208f, 0.238575f, 0.922791f, - 0.499999f, -0.387298f, 0.774597f, 0.000000f, 0.499999f, -0.387298f, 0.774597f, 0.173473f, 0.300929f, - 0.499999f, -0.387298f, 0.774597f, 0.000000f, 0.499999f, -0.387298f, 0.774597f, 0.173473f, 0.300929f, - 0.669131f, -0.332344f, 0.664689f, 0.000000f, 0.669131f, -0.332344f, 0.664689f, 0.180025f, 0.848850f, - 0.577350f, -0.187592f, 0.794654f, 0.000000f, 0.577350f, -0.187592f, 0.794654f, 0.412750f, 0.835614f, - 0.736685f, -0.124433f, 0.664689f, 0.000000f, 0.736685f, -0.124433f, 0.664689f, 0.922791f, 0.233160f, - 0.632156f, 0.019439f, 0.774597f, 0.000000f, 0.632156f, 0.019439f, 0.774597f, 0.328463f, 0.848850f, - 0.577350f, -0.187592f, 0.794654f, 0.000000f, 0.577350f, -0.187592f, 0.794654f, 0.412750f, 0.835614f, - 0.762354f, 0.061751f, 0.644208f, 0.000000f, 0.762354f, 0.061751f, 0.644208f, 0.553923f, 0.425781f, - 0.639949f, 0.207932f, 0.739749f, 0.000000f, 0.639949f, 0.207932f, 0.739749f, 0.250000f, 0.853312f, - 0.632156f, 0.019439f, 0.774597f, 0.000000f, 0.632156f, 0.019439f, 0.774597f, 0.328463f, 0.848850f, - 0.525731f, -0.723607f, 0.447214f, 0.000000f, 0.525731f, -0.723607f, 0.447214f, 0.606016f, 0.354082f, - 0.643075f, -0.588241f, 0.490334f, 0.000000f, 0.643075f, -0.588241f, 0.490334f, 0.643075f, 0.453512f, - 0.468576f, -0.644939f, 0.603730f, 0.000000f, 0.468576f, -0.644939f, 0.603730f, 0.327004f, 0.922791f, - 0.643075f, -0.588241f, 0.490334f, 0.000000f, 0.643075f, -0.588241f, 0.490334f, 0.643075f, 0.453512f, - 0.738585f, -0.432902f, 0.516806f, 0.000000f, 0.738585f, -0.432902f, 0.516806f, 0.671537f, 0.555736f, - 0.580460f, -0.498058f, 0.644208f, 0.000000f, 0.580460f, -0.498058f, 0.644208f, 0.238575f, 0.922791f, - 0.738585f, -0.432902f, 0.516806f, 0.000000f, 0.738585f, -0.432902f, 0.516806f, 0.671537f, 0.555736f, - 0.809017f, -0.262866f, 0.525731f, 0.000000f, 0.809017f, -0.262866f, 0.525731f, 0.654508f, 0.287337f, - 0.669131f, -0.332344f, 0.664689f, 0.000000f, 0.669131f, -0.332344f, 0.664689f, 0.180025f, 0.848850f, - 0.809017f, -0.262866f, 0.525731f, 0.000000f, 0.809017f, -0.262866f, 0.525731f, 0.654508f, 0.287337f, - 0.851981f, -0.083904f, 0.516806f, 0.000000f, 0.851981f, -0.083904f, 0.516806f, 0.695347f, 0.381573f, - 0.736685f, -0.124433f, 0.664689f, 0.000000f, 0.736685f, -0.124433f, 0.664689f, 0.922791f, 0.233160f, - 0.851981f, -0.083904f, 0.516806f, 0.000000f, 0.851981f, -0.083904f, 0.516806f, 0.695347f, 0.381573f, - 0.866018f, 0.097907f, 0.490334f, 0.000000f, 0.866018f, 0.097907f, 0.490334f, 0.727648f, 0.480987f, - 0.762354f, 0.061751f, 0.644208f, 0.000000f, 0.762354f, 0.061751f, 0.644208f, 0.553923f, 0.425781f, - 0.866018f, 0.097907f, 0.490334f, 0.000000f, 0.866018f, 0.097907f, 0.490334f, 0.727648f, 0.480987f, - 0.850651f, 0.276393f, 0.447214f, 0.000000f, 0.850651f, 0.276393f, 0.447214f, 0.750000f, 0.581230f, - 0.758172f, 0.246345f, 0.603730f, 0.000000f, 0.758172f, 0.246345f, 0.603730f, 0.587250f, 0.528349f, - 0.468576f, -0.644939f, 0.603730f, 0.000000f, 0.468576f, -0.644939f, 0.603730f, 0.327004f, 0.922791f, - 0.643075f, -0.588241f, 0.490334f, 0.000000f, 0.643075f, -0.588241f, 0.490334f, 0.643075f, 0.453512f, - 0.580460f, -0.498058f, 0.644208f, 0.000000f, 0.580460f, -0.498058f, 0.644208f, 0.238575f, 0.922791f, - 0.580460f, -0.498058f, 0.644208f, 0.000000f, 0.580460f, -0.498058f, 0.644208f, 0.238575f, 0.922791f, - 0.738585f, -0.432902f, 0.516806f, 0.000000f, 0.738585f, -0.432902f, 0.516806f, 0.671537f, 0.555736f, - 0.669131f, -0.332344f, 0.664689f, 0.000000f, 0.669131f, -0.332344f, 0.664689f, 0.180025f, 0.848850f, - 0.669131f, -0.332344f, 0.664689f, 0.000000f, 0.669131f, -0.332344f, 0.664689f, 0.180025f, 0.848850f, - 0.809017f, -0.262866f, 0.525731f, 0.000000f, 0.809017f, -0.262866f, 0.525731f, 0.654508f, 0.287337f, - 0.736685f, -0.124433f, 0.664689f, 0.000000f, 0.736685f, -0.124433f, 0.664689f, 0.922791f, 0.233160f, - 0.851981f, -0.083904f, 0.516806f, 0.000000f, 0.851981f, -0.083904f, 0.516806f, 0.695347f, 0.381573f, - 0.762354f, 0.061751f, 0.644208f, 0.000000f, 0.762354f, 0.061751f, 0.644208f, 0.553923f, 0.425781f, - 0.736685f, -0.124433f, 0.664689f, 0.000000f, 0.736685f, -0.124433f, 0.664689f, 0.922791f, 0.233160f, - 0.866018f, 0.097907f, 0.490334f, 0.000000f, 0.866018f, 0.097907f, 0.490334f, 0.727648f, 0.480987f, - 0.758172f, 0.246345f, 0.603730f, 0.000000f, 0.758172f, 0.246345f, 0.603730f, 0.587250f, 0.528349f, - 0.762354f, 0.061751f, 0.644208f, 0.000000f, 0.762354f, 0.061751f, 0.644208f, 0.553923f, 0.425781f, - 0.174499f, 0.056698f, 0.983024f, 0.000000f, 0.174499f, 0.056698f, 0.983024f, 0.411574f, 0.378293f, - 0.000000f, 0.183479f, 0.983024f, 0.000000f, 0.000000f, 0.183479f, 0.983024f, 0.697755f, 0.227814f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.411570f, 0.289369f, - 0.343074f, 0.111472f, 0.932670f, 0.000000f, 0.343074f, 0.111472f, 0.932670f, 0.321589f, 0.254439f, - 0.176851f, 0.243415f, 0.953663f, 0.000000f, 0.176851f, 0.243415f, 0.953663f, 0.750000f, 0.306351f, - 0.174499f, 0.056698f, 0.983024f, 0.000000f, 0.174499f, 0.056698f, 0.983024f, 0.411574f, 0.378293f, - 0.176851f, 0.243415f, 0.953663f, 0.000000f, 0.176851f, 0.243415f, 0.953663f, 0.750000f, 0.306351f, - 0.000000f, 0.360730f, 0.932670f, 0.000000f, 0.000000f, 0.360730f, 0.932670f, 0.788675f, 0.406204f, - 0.000000f, 0.183479f, 0.983024f, 0.000000f, 0.000000f, 0.183479f, 0.983024f, 0.697755f, 0.227814f, - 0.174499f, 0.056698f, 0.983024f, 0.000000f, 0.174499f, 0.056698f, 0.983024f, 0.411574f, 0.378293f, - 0.176851f, 0.243415f, 0.953663f, 0.000000f, 0.176851f, 0.243415f, 0.953663f, 0.750000f, 0.306351f, - 0.000000f, 0.183479f, 0.983024f, 0.000000f, 0.000000f, 0.183479f, 0.983024f, 0.697755f, 0.227814f, - 0.500000f, 0.162460f, 0.850651f, 0.000000f, 0.500000f, 0.162460f, 0.850651f, 0.411574f, 0.127938f, - 0.345991f, 0.298381f, 0.889527f, 0.000000f, 0.345991f, 0.298381f, 0.889527f, 0.816078f, 0.509719f, - 0.343074f, 0.111472f, 0.932670f, 0.000000f, 0.343074f, 0.111472f, 0.932670f, 0.321589f, 0.254439f, - 0.345991f, 0.298381f, 0.889527f, 0.000000f, 0.345991f, 0.298381f, 0.889527f, 0.816078f, 0.509719f, - 0.176860f, 0.421262f, 0.889527f, 0.000000f, 0.176860f, 0.421262f, 0.889527f, 0.819975f, 0.603966f, - 0.176851f, 0.243415f, 0.953663f, 0.000000f, 0.176851f, 0.243415f, 0.953663f, 0.750000f, 0.306351f, - 0.176860f, 0.421262f, 0.889527f, 0.000000f, 0.176860f, 0.421262f, 0.889527f, 0.819975f, 0.603966f, - 0.000000f, 0.525731f, 0.850651f, 0.000000f, 0.000000f, 0.525731f, 0.850651f, 0.734288f, 0.177530f, - 0.000000f, 0.360730f, 0.932670f, 0.000000f, 0.000000f, 0.360730f, 0.932670f, 0.788675f, 0.406204f, - 0.343074f, 0.111472f, 0.932670f, 0.000000f, 0.343074f, 0.111472f, 0.932670f, 0.321589f, 0.254439f, - 0.345991f, 0.298381f, 0.889527f, 0.000000f, 0.345991f, 0.298381f, 0.889527f, 0.816078f, 0.509719f, - 0.176851f, 0.243415f, 0.953663f, 0.000000f, 0.176851f, 0.243415f, 0.953663f, 0.750000f, 0.306351f, - 0.176860f, 0.421262f, 0.889527f, 0.000000f, 0.176860f, 0.421262f, 0.889527f, 0.819975f, 0.603966f, - 0.000000f, 0.360730f, 0.932670f, 0.000000f, 0.000000f, 0.360730f, 0.932670f, 0.788675f, 0.406204f, - 0.176851f, 0.243415f, 0.953663f, 0.000000f, 0.176851f, 0.243415f, 0.953663f, 0.750000f, 0.306351f, - 0.639949f, 0.207932f, 0.739749f, 0.000000f, 0.639949f, 0.207932f, 0.739749f, 0.250000f, 0.853312f, - 0.522851f, 0.355846f, 0.774597f, 0.000000f, 0.522851f, 0.355846f, 0.774597f, 0.790230f, 0.250971f, - 0.500000f, 0.162460f, 0.850651f, 0.000000f, 0.500000f, 0.162460f, 0.850651f, 0.411574f, 0.127938f, - 0.522851f, 0.355846f, 0.774597f, 0.000000f, 0.522851f, 0.355846f, 0.774597f, 0.790230f, 0.250971f, - 0.356822f, 0.491123f, 0.794654f, 0.000000f, 0.356822f, 0.491123f, 0.794654f, 0.834566f, 0.333828f, - 0.345991f, 0.298381f, 0.889527f, 0.000000f, 0.345991f, 0.298381f, 0.889527f, 0.816078f, 0.509719f, - 0.356822f, 0.491123f, 0.794654f, 0.000000f, 0.356822f, 0.491123f, 0.794654f, 0.834566f, 0.333828f, - 0.176860f, 0.607223f, 0.774597f, 0.000000f, 0.176860f, 0.607223f, 0.774597f, 0.868343f, 0.437784f, - 0.176860f, 0.421262f, 0.889527f, 0.000000f, 0.176860f, 0.421262f, 0.889527f, 0.819975f, 0.603966f, - 0.176860f, 0.607223f, 0.774597f, 0.000000f, 0.176860f, 0.607223f, 0.774597f, 0.868343f, 0.437784f, - 0.000000f, 0.672883f, 0.739749f, 0.000000f, 0.000000f, 0.672883f, 0.739749f, 0.258102f, 0.437784f, - 0.000000f, 0.525731f, 0.850651f, 0.000000f, 0.000000f, 0.525731f, 0.850651f, 0.734288f, 0.177530f, - 0.500000f, 0.162460f, 0.850651f, 0.000000f, 0.500000f, 0.162460f, 0.850651f, 0.411574f, 0.127938f, - 0.522851f, 0.355846f, 0.774597f, 0.000000f, 0.522851f, 0.355846f, 0.774597f, 0.790230f, 0.250971f, - 0.345991f, 0.298381f, 0.889527f, 0.000000f, 0.345991f, 0.298381f, 0.889527f, 0.816078f, 0.509719f, - 0.345991f, 0.298381f, 0.889527f, 0.000000f, 0.345991f, 0.298381f, 0.889527f, 0.816078f, 0.509719f, - 0.356822f, 0.491123f, 0.794654f, 0.000000f, 0.356822f, 0.491123f, 0.794654f, 0.834566f, 0.333828f, - 0.176860f, 0.421262f, 0.889527f, 0.000000f, 0.176860f, 0.421262f, 0.889527f, 0.819975f, 0.603966f, - 0.176860f, 0.607223f, 0.774597f, 0.000000f, 0.176860f, 0.607223f, 0.774597f, 0.868343f, 0.437784f, - 0.000000f, 0.525731f, 0.850651f, 0.000000f, 0.000000f, 0.525731f, 0.850651f, 0.734288f, 0.177530f, - 0.176860f, 0.421262f, 0.889527f, 0.000000f, 0.176860f, 0.421262f, 0.889527f, 0.819975f, 0.603966f, - 0.758172f, 0.246345f, 0.603730f, 0.000000f, 0.758172f, 0.246345f, 0.603730f, 0.587250f, 0.528349f, - 0.653054f, 0.398142f, 0.644208f, 0.000000f, 0.653054f, 0.398142f, 0.644208f, 0.268343f, 0.530876f, - 0.639949f, 0.207932f, 0.739749f, 0.000000f, 0.639949f, 0.207932f, 0.739749f, 0.250000f, 0.853312f, - 0.653054f, 0.398142f, 0.644208f, 0.000000f, 0.653054f, 0.398142f, 0.644208f, 0.268343f, 0.530876f, - 0.522851f, 0.533681f, 0.664689f, 0.000000f, 0.522851f, 0.533681f, 0.664689f, 0.203148f, 0.509719f, - 0.522851f, 0.355846f, 0.774597f, 0.000000f, 0.522851f, 0.355846f, 0.774597f, 0.790230f, 0.250971f, - 0.522851f, 0.533681f, 0.664689f, 0.000000f, 0.522851f, 0.533681f, 0.664689f, 0.203148f, 0.509719f, - 0.345991f, 0.662178f, 0.664689f, 0.000000f, 0.345991f, 0.662178f, 0.664689f, 0.288582f, 0.623173f, - 0.356822f, 0.491123f, 0.794654f, 0.000000f, 0.356822f, 0.491123f, 0.794654f, 0.834566f, 0.333828f, - 0.345991f, 0.662178f, 0.664689f, 0.000000f, 0.345991f, 0.662178f, 0.664689f, 0.288582f, 0.623173f, - 0.176851f, 0.744124f, 0.644208f, 0.000000f, 0.176851f, 0.744124f, 0.644208f, 0.220572f, 0.603966f, - 0.176860f, 0.607223f, 0.774597f, 0.000000f, 0.176860f, 0.607223f, 0.774597f, 0.868343f, 0.437784f, - 0.176851f, 0.744124f, 0.644208f, 0.000000f, 0.176851f, 0.744124f, 0.644208f, 0.220572f, 0.603966f, - 0.000000f, 0.797189f, 0.603730f, 0.000000f, 0.000000f, 0.797189f, 0.603730f, 0.881177f, 0.530876f, - 0.000000f, 0.672883f, 0.739749f, 0.000000f, 0.000000f, 0.672883f, 0.739749f, 0.258102f, 0.437784f, - 0.639949f, 0.207932f, 0.739749f, 0.000000f, 0.639949f, 0.207932f, 0.739749f, 0.250000f, 0.853312f, - 0.653054f, 0.398142f, 0.644208f, 0.000000f, 0.653054f, 0.398142f, 0.644208f, 0.268343f, 0.530876f, - 0.522851f, 0.355846f, 0.774597f, 0.000000f, 0.522851f, 0.355846f, 0.774597f, 0.790230f, 0.250971f, - 0.522851f, 0.355846f, 0.774597f, 0.000000f, 0.522851f, 0.355846f, 0.774597f, 0.790230f, 0.250971f, - 0.522851f, 0.533681f, 0.664689f, 0.000000f, 0.522851f, 0.533681f, 0.664689f, 0.203148f, 0.509719f, - 0.356822f, 0.491123f, 0.794654f, 0.000000f, 0.356822f, 0.491123f, 0.794654f, 0.834566f, 0.333828f, - 0.345991f, 0.662178f, 0.664689f, 0.000000f, 0.345991f, 0.662178f, 0.664689f, 0.288582f, 0.623173f, - 0.176860f, 0.607223f, 0.774597f, 0.000000f, 0.176860f, 0.607223f, 0.774597f, 0.868343f, 0.437784f, - 0.356822f, 0.491123f, 0.794654f, 0.000000f, 0.356822f, 0.491123f, 0.794654f, 0.834566f, 0.333828f, - 0.176851f, 0.744124f, 0.644208f, 0.000000f, 0.176851f, 0.744124f, 0.644208f, 0.220572f, 0.603966f, - 0.000000f, 0.672883f, 0.739749f, 0.000000f, 0.000000f, 0.672883f, 0.739749f, 0.258102f, 0.437784f, - 0.176860f, 0.607223f, 0.774597f, 0.000000f, 0.176860f, 0.607223f, 0.774597f, 0.868343f, 0.437784f, - 0.850651f, 0.276393f, 0.447214f, 0.000000f, 0.850651f, 0.276393f, 0.447214f, 0.750000f, 0.581230f, - 0.758172f, 0.429824f, 0.490334f, 0.000000f, 0.758172f, 0.429824f, 0.490334f, 0.762866f, 0.366840f, - 0.758172f, 0.246345f, 0.603730f, 0.000000f, 0.758172f, 0.246345f, 0.603730f, 0.587250f, 0.528349f, - 0.758172f, 0.429824f, 0.490334f, 0.000000f, 0.758172f, 0.429824f, 0.490334f, 0.762866f, 0.366840f, - 0.639949f, 0.568662f, 0.516806f, 0.000000f, 0.639949f, 0.568662f, 0.516806f, 0.821537f, 0.345280f, - 0.653054f, 0.398142f, 0.644208f, 0.000000f, 0.653054f, 0.398142f, 0.644208f, 0.268343f, 0.530876f, - 0.639949f, 0.568662f, 0.516806f, 0.000000f, 0.639949f, 0.568662f, 0.516806f, 0.821537f, 0.345280f, - 0.500000f, 0.688191f, 0.525731f, 0.000000f, 0.500000f, 0.688191f, 0.525731f, 0.734288f, 0.288582f, - 0.522851f, 0.533681f, 0.664689f, 0.000000f, 0.522851f, 0.533681f, 0.664689f, 0.203148f, 0.509719f, - 0.500000f, 0.688191f, 0.525731f, 0.000000f, 0.500000f, 0.688191f, 0.525731f, 0.734288f, 0.288582f, - 0.343074f, 0.784354f, 0.516806f, 0.000000f, 0.343074f, 0.784354f, 0.516806f, 0.345280f, 0.205880f, - 0.345991f, 0.662178f, 0.664689f, 0.000000f, 0.345991f, 0.662178f, 0.664689f, 0.288582f, 0.623173f, - 0.343074f, 0.784354f, 0.516806f, 0.000000f, 0.343074f, 0.784354f, 0.516806f, 0.345280f, 0.205880f, - 0.174499f, 0.853887f, 0.490334f, 0.000000f, 0.174499f, 0.853887f, 0.490334f, 0.332044f, 0.283549f, - 0.176851f, 0.744124f, 0.644208f, 0.000000f, 0.176851f, 0.744124f, 0.644208f, 0.220572f, 0.603966f, - 0.174499f, 0.853887f, 0.490334f, 0.000000f, 0.174499f, 0.853887f, 0.490334f, 0.332044f, 0.283549f, - 0.000000f, 0.894427f, 0.447214f, 0.000000f, 0.000000f, 0.894427f, 0.447214f, 0.268343f, 0.250971f, - 0.000000f, 0.797189f, 0.603730f, 0.000000f, 0.000000f, 0.797189f, 0.603730f, 0.881177f, 0.530876f, - 0.758172f, 0.246345f, 0.603730f, 0.000000f, 0.758172f, 0.246345f, 0.603730f, 0.587250f, 0.528349f, - 0.758172f, 0.429824f, 0.490334f, 0.000000f, 0.758172f, 0.429824f, 0.490334f, 0.762866f, 0.366840f, - 0.653054f, 0.398142f, 0.644208f, 0.000000f, 0.653054f, 0.398142f, 0.644208f, 0.268343f, 0.530876f, - 0.653054f, 0.398142f, 0.644208f, 0.000000f, 0.653054f, 0.398142f, 0.644208f, 0.268343f, 0.530876f, - 0.639949f, 0.568662f, 0.516806f, 0.000000f, 0.639949f, 0.568662f, 0.516806f, 0.821537f, 0.345280f, - 0.522851f, 0.533681f, 0.664689f, 0.000000f, 0.522851f, 0.533681f, 0.664689f, 0.203148f, 0.509719f, - 0.522851f, 0.533681f, 0.664689f, 0.000000f, 0.522851f, 0.533681f, 0.664689f, 0.203148f, 0.509719f, - 0.500000f, 0.688191f, 0.525731f, 0.000000f, 0.500000f, 0.688191f, 0.525731f, 0.734288f, 0.288582f, - 0.345991f, 0.662178f, 0.664689f, 0.000000f, 0.345991f, 0.662178f, 0.664689f, 0.288582f, 0.623173f, - 0.343074f, 0.784354f, 0.516806f, 0.000000f, 0.343074f, 0.784354f, 0.516806f, 0.345280f, 0.205880f, - 0.176851f, 0.744124f, 0.644208f, 0.000000f, 0.176851f, 0.744124f, 0.644208f, 0.220572f, 0.603966f, - 0.345991f, 0.662178f, 0.664689f, 0.000000f, 0.345991f, 0.662178f, 0.664689f, 0.288582f, 0.623173f, - 0.174499f, 0.853887f, 0.490334f, 0.000000f, 0.174499f, 0.853887f, 0.490334f, 0.332044f, 0.283549f, - 0.000000f, 0.797189f, 0.603730f, 0.000000f, 0.000000f, 0.797189f, 0.603730f, 0.881177f, 0.530876f, - 0.176851f, 0.744124f, 0.644208f, 0.000000f, 0.176851f, 0.744124f, 0.644208f, 0.220572f, 0.603966f, - 0.000000f, 0.183479f, 0.983024f, 0.000000f, 0.000000f, 0.183479f, 0.983024f, 0.697755f, 0.227814f, - -0.174499f, 0.056698f, 0.983024f, 0.000000f, -0.174499f, 0.056698f, 0.983024f, 0.327581f, 0.368567f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.411570f, 0.289369f, - 0.000000f, 0.360730f, 0.932670f, 0.000000f, 0.000000f, 0.360730f, 0.932670f, 0.788675f, 0.406204f, - -0.176851f, 0.243415f, 0.953663f, 0.000000f, -0.176851f, 0.243415f, 0.953663f, 0.258102f, 0.333828f, - 0.000000f, 0.183479f, 0.983024f, 0.000000f, 0.000000f, 0.183479f, 0.983024f, 0.697755f, 0.227814f, - -0.176851f, 0.243415f, 0.953663f, 0.000000f, -0.176851f, 0.243415f, 0.953663f, 0.258102f, 0.333828f, - -0.343074f, 0.111472f, 0.932670f, 0.000000f, -0.343074f, 0.111472f, 0.932670f, 0.332044f, 0.458048f, - -0.174499f, 0.056698f, 0.983024f, 0.000000f, -0.174499f, 0.056698f, 0.983024f, 0.327581f, 0.368567f, - -0.176851f, 0.243415f, 0.953663f, 0.000000f, -0.176851f, 0.243415f, 0.953663f, 0.258102f, 0.333828f, - -0.174499f, 0.056698f, 0.983024f, 0.000000f, -0.174499f, 0.056698f, 0.983024f, 0.327581f, 0.368567f, - 0.000000f, 0.183479f, 0.983024f, 0.000000f, 0.000000f, 0.183479f, 0.983024f, 0.697755f, 0.227814f, - 0.000000f, 0.525731f, 0.850651f, 0.000000f, 0.000000f, 0.525731f, 0.850651f, 0.734288f, 0.177530f, - -0.176860f, 0.421262f, 0.889527f, 0.000000f, -0.176860f, 0.421262f, 0.889527f, 0.345280f, 0.548954f, - 0.000000f, 0.360730f, 0.932670f, 0.000000f, 0.000000f, 0.360730f, 0.932670f, 0.788675f, 0.406204f, - -0.176860f, 0.421262f, 0.889527f, 0.000000f, -0.176860f, 0.421262f, 0.889527f, 0.345280f, 0.548954f, - -0.345991f, 0.298381f, 0.889527f, 0.000000f, -0.345991f, 0.298381f, 0.889527f, 0.366840f, 0.638196f, - -0.176851f, 0.243415f, 0.953663f, 0.000000f, -0.176851f, 0.243415f, 0.953663f, 0.258102f, 0.333828f, - -0.345991f, 0.298381f, 0.889527f, 0.000000f, -0.345991f, 0.298381f, 0.889527f, 0.366840f, 0.638196f, - -0.500000f, 0.162460f, 0.850651f, 0.000000f, -0.500000f, 0.162460f, 0.850651f, 0.790230f, 0.268343f, - -0.343074f, 0.111472f, 0.932670f, 0.000000f, -0.343074f, 0.111472f, 0.932670f, 0.332044f, 0.458048f, - 0.000000f, 0.360730f, 0.932670f, 0.000000f, 0.000000f, 0.360730f, 0.932670f, 0.788675f, 0.406204f, - -0.176860f, 0.421262f, 0.889527f, 0.000000f, -0.176860f, 0.421262f, 0.889527f, 0.345280f, 0.548954f, - -0.176851f, 0.243415f, 0.953663f, 0.000000f, -0.176851f, 0.243415f, 0.953663f, 0.258102f, 0.333828f, - -0.345991f, 0.298381f, 0.889527f, 0.000000f, -0.345991f, 0.298381f, 0.889527f, 0.366840f, 0.638196f, - -0.343074f, 0.111472f, 0.932670f, 0.000000f, -0.343074f, 0.111472f, 0.932670f, 0.332044f, 0.458048f, - -0.176851f, 0.243415f, 0.953663f, 0.000000f, -0.176851f, 0.243415f, 0.953663f, 0.258102f, 0.333828f, - 0.000000f, 0.672883f, 0.739749f, 0.000000f, 0.000000f, 0.672883f, 0.739749f, 0.258102f, 0.437784f, - -0.176860f, 0.607223f, 0.774597f, 0.000000f, -0.176860f, 0.607223f, 0.774597f, 0.500000f, 0.591739f, - 0.000000f, 0.525731f, 0.850651f, 0.000000f, 0.000000f, 0.525731f, 0.850651f, 0.734288f, 0.177530f, - -0.176860f, 0.607223f, 0.774597f, 0.000000f, -0.176860f, 0.607223f, 0.774597f, 0.500000f, 0.591739f, - -0.356822f, 0.491123f, 0.794654f, 0.000000f, -0.356822f, 0.491123f, 0.794654f, 0.588426f, 0.621707f, - -0.176860f, 0.421262f, 0.889527f, 0.000000f, -0.176860f, 0.421262f, 0.889527f, 0.345280f, 0.548954f, - -0.356822f, 0.491123f, 0.794654f, 0.000000f, -0.356822f, 0.491123f, 0.794654f, 0.588426f, 0.621707f, - -0.522851f, 0.355846f, 0.774597f, 0.000000f, -0.522851f, 0.355846f, 0.774597f, 0.500000f, 0.680365f, - -0.345991f, 0.298381f, 0.889527f, 0.000000f, -0.345991f, 0.298381f, 0.889527f, 0.366840f, 0.638196f, - -0.522851f, 0.355846f, 0.774597f, 0.000000f, -0.522851f, 0.355846f, 0.774597f, 0.500000f, 0.680365f, - -0.639949f, 0.207932f, 0.739749f, 0.000000f, -0.639949f, 0.207932f, 0.739749f, 0.672996f, 0.649190f, - -0.500000f, 0.162460f, 0.850651f, 0.000000f, -0.500000f, 0.162460f, 0.850651f, 0.790230f, 0.268343f, - 0.000000f, 0.525731f, 0.850651f, 0.000000f, 0.000000f, 0.525731f, 0.850651f, 0.734288f, 0.177530f, - -0.176860f, 0.607223f, 0.774597f, 0.000000f, -0.176860f, 0.607223f, 0.774597f, 0.500000f, 0.591739f, - -0.176860f, 0.421262f, 0.889527f, 0.000000f, -0.176860f, 0.421262f, 0.889527f, 0.345280f, 0.548954f, - -0.356822f, 0.491123f, 0.794654f, 0.000000f, -0.356822f, 0.491123f, 0.794654f, 0.588426f, 0.621707f, - -0.345991f, 0.298381f, 0.889527f, 0.000000f, -0.345991f, 0.298381f, 0.889527f, 0.366840f, 0.638196f, - -0.176860f, 0.421262f, 0.889527f, 0.000000f, -0.176860f, 0.421262f, 0.889527f, 0.345280f, 0.548954f, - -0.522851f, 0.355846f, 0.774597f, 0.000000f, -0.522851f, 0.355846f, 0.774597f, 0.500000f, 0.680365f, - -0.500000f, 0.162460f, 0.850651f, 0.000000f, -0.500000f, 0.162460f, 0.850651f, 0.790230f, 0.268343f, - -0.345991f, 0.298381f, 0.889527f, 0.000000f, -0.345991f, 0.298381f, 0.889527f, 0.366840f, 0.638196f, - 0.000000f, 0.797189f, 0.603730f, 0.000000f, 0.000000f, 0.797189f, 0.603730f, 0.881177f, 0.530876f, - -0.176851f, 0.744124f, 0.644208f, 0.000000f, -0.176851f, 0.744124f, 0.644208f, 0.588430f, 0.710631f, - 0.000000f, 0.672883f, 0.739749f, 0.000000f, 0.000000f, 0.672883f, 0.739749f, 0.258102f, 0.437784f, - -0.176851f, 0.744124f, 0.644208f, 0.000000f, -0.176851f, 0.744124f, 0.644208f, 0.588430f, 0.710631f, - -0.345991f, 0.662178f, 0.664689f, 0.000000f, -0.345991f, 0.662178f, 0.664689f, 0.500000f, 0.762866f, - -0.176860f, 0.607223f, 0.774597f, 0.000000f, -0.176860f, 0.607223f, 0.774597f, 0.500000f, 0.591739f, - -0.345991f, 0.662178f, 0.664689f, 0.000000f, -0.345991f, 0.662178f, 0.664689f, 0.500000f, 0.762866f, - -0.522851f, 0.533682f, 0.664689f, 0.000000f, -0.522851f, 0.533682f, 0.664689f, 0.761425f, 0.677923f, - -0.356822f, 0.491123f, 0.794654f, 0.000000f, -0.356822f, 0.491123f, 0.794654f, 0.588426f, 0.621707f, - -0.522851f, 0.533682f, 0.664689f, 0.000000f, -0.522851f, 0.533682f, 0.664689f, 0.761425f, 0.677923f, - -0.653054f, 0.398142f, 0.644208f, 0.000000f, -0.653054f, 0.398142f, 0.644208f, 0.678411f, 0.745561f, - -0.522851f, 0.355846f, 0.774597f, 0.000000f, -0.522851f, 0.355846f, 0.774597f, 0.500000f, 0.680365f, - -0.653054f, 0.398142f, 0.644208f, 0.000000f, -0.653054f, 0.398142f, 0.644208f, 0.678411f, 0.745561f, - -0.758172f, 0.246345f, 0.603730f, 0.000000f, -0.758172f, 0.246345f, 0.603730f, 0.588430f, 0.803612f, - -0.639949f, 0.207932f, 0.739749f, 0.000000f, -0.639949f, 0.207932f, 0.739749f, 0.672996f, 0.649190f, - 0.000000f, 0.672883f, 0.739749f, 0.000000f, 0.000000f, 0.672883f, 0.739749f, 0.258102f, 0.437784f, - -0.176851f, 0.744124f, 0.644208f, 0.000000f, -0.176851f, 0.744124f, 0.644208f, 0.588430f, 0.710631f, - -0.176860f, 0.607223f, 0.774597f, 0.000000f, -0.176860f, 0.607223f, 0.774597f, 0.500000f, 0.591739f, - -0.176860f, 0.607223f, 0.774597f, 0.000000f, -0.176860f, 0.607223f, 0.774597f, 0.500000f, 0.591739f, - -0.345991f, 0.662178f, 0.664689f, 0.000000f, -0.345991f, 0.662178f, 0.664689f, 0.500000f, 0.762866f, - -0.356822f, 0.491123f, 0.794654f, 0.000000f, -0.356822f, 0.491123f, 0.794654f, 0.588426f, 0.621707f, - -0.522851f, 0.533682f, 0.664689f, 0.000000f, -0.522851f, 0.533682f, 0.664689f, 0.761425f, 0.677923f, - -0.522851f, 0.355846f, 0.774597f, 0.000000f, -0.522851f, 0.355846f, 0.774597f, 0.500000f, 0.680365f, - -0.356822f, 0.491123f, 0.794654f, 0.000000f, -0.356822f, 0.491123f, 0.794654f, 0.588426f, 0.621707f, - -0.653054f, 0.398142f, 0.644208f, 0.000000f, -0.653054f, 0.398142f, 0.644208f, 0.678411f, 0.745561f, - -0.639949f, 0.207932f, 0.739749f, 0.000000f, -0.639949f, 0.207932f, 0.739749f, 0.672996f, 0.649190f, - -0.522851f, 0.355846f, 0.774597f, 0.000000f, -0.522851f, 0.355846f, 0.774597f, 0.500000f, 0.680365f, - 0.000000f, 0.894427f, 0.447214f, 0.000000f, 0.000000f, 0.894427f, 0.447214f, 0.268343f, 0.250971f, - -0.174499f, 0.853887f, 0.490334f, 0.000000f, -0.174499f, 0.853887f, 0.490334f, 0.500000f, 0.836442f, - 0.000000f, 0.797189f, 0.603730f, 0.000000f, 0.000000f, 0.797189f, 0.603730f, 0.881177f, 0.530876f, - -0.174499f, 0.853887f, 0.490334f, 0.000000f, -0.174499f, 0.853887f, 0.490334f, 0.500000f, 0.836442f, - -0.343074f, 0.784354f, 0.516806f, 0.000000f, -0.343074f, 0.784354f, 0.516806f, 0.268343f, 0.699071f, - -0.176851f, 0.744124f, 0.644208f, 0.000000f, -0.176851f, 0.744124f, 0.644208f, 0.588430f, 0.710631f, - -0.343074f, 0.784354f, 0.516806f, 0.000000f, -0.343074f, 0.784354f, 0.516806f, 0.268343f, 0.699071f, - -0.500000f, 0.688191f, 0.525731f, 0.000000f, -0.500000f, 0.688191f, 0.525731f, 0.826527f, 0.699071f, - -0.345991f, 0.662178f, 0.664689f, 0.000000f, -0.345991f, 0.662178f, 0.664689f, 0.500000f, 0.762866f, - -0.500000f, 0.688191f, 0.525731f, 0.000000f, -0.500000f, 0.688191f, 0.525731f, 0.826527f, 0.699071f, - -0.639949f, 0.568662f, 0.516806f, 0.000000f, -0.639949f, 0.568662f, 0.516806f, 0.761425f, 0.766840f, - -0.522851f, 0.533682f, 0.664689f, 0.000000f, -0.522851f, 0.533682f, 0.664689f, 0.761425f, 0.677923f, - -0.639949f, 0.568662f, 0.516806f, 0.000000f, -0.639949f, 0.568662f, 0.516806f, 0.761425f, 0.766840f, - -0.758172f, 0.429824f, 0.490334f, 0.000000f, -0.758172f, 0.429824f, 0.490334f, 0.672996f, 0.831089f, - -0.653054f, 0.398142f, 0.644208f, 0.000000f, -0.653054f, 0.398142f, 0.644208f, 0.678411f, 0.745561f, - -0.758172f, 0.429824f, 0.490334f, 0.000000f, -0.758172f, 0.429824f, 0.490334f, 0.672996f, 0.831089f, - -0.850651f, 0.276393f, 0.447214f, 0.000000f, -0.850651f, 0.276393f, 0.447214f, 0.588426f, 0.872062f, - -0.758172f, 0.246345f, 0.603730f, 0.000000f, -0.758172f, 0.246345f, 0.603730f, 0.588430f, 0.803612f, - 0.000000f, 0.797189f, 0.603730f, 0.000000f, 0.000000f, 0.797189f, 0.603730f, 0.881177f, 0.530876f, - -0.174499f, 0.853887f, 0.490334f, 0.000000f, -0.174499f, 0.853887f, 0.490334f, 0.500000f, 0.836442f, - -0.176851f, 0.744124f, 0.644208f, 0.000000f, -0.176851f, 0.744124f, 0.644208f, 0.588430f, 0.710631f, - -0.176851f, 0.744124f, 0.644208f, 0.000000f, -0.176851f, 0.744124f, 0.644208f, 0.588430f, 0.710631f, - -0.343074f, 0.784354f, 0.516806f, 0.000000f, -0.343074f, 0.784354f, 0.516806f, 0.268343f, 0.699071f, - -0.345991f, 0.662178f, 0.664689f, 0.000000f, -0.345991f, 0.662178f, 0.664689f, 0.500000f, 0.762866f, - -0.500000f, 0.688191f, 0.525731f, 0.000000f, -0.500000f, 0.688191f, 0.525731f, 0.826527f, 0.699071f, - -0.522851f, 0.533682f, 0.664689f, 0.000000f, -0.522851f, 0.533682f, 0.664689f, 0.761425f, 0.677923f, - -0.345991f, 0.662178f, 0.664689f, 0.000000f, -0.345991f, 0.662178f, 0.664689f, 0.500000f, 0.762866f, - -0.639949f, 0.568662f, 0.516806f, 0.000000f, -0.639949f, 0.568662f, 0.516806f, 0.761425f, 0.766840f, - -0.653054f, 0.398142f, 0.644208f, 0.000000f, -0.653054f, 0.398142f, 0.644208f, 0.678411f, 0.745561f, - -0.522851f, 0.533682f, 0.664689f, 0.000000f, -0.522851f, 0.533682f, 0.664689f, 0.761425f, 0.677923f, - -0.758172f, 0.429824f, 0.490334f, 0.000000f, -0.758172f, 0.429824f, 0.490334f, 0.672996f, 0.831089f, - -0.758172f, 0.246345f, 0.603730f, 0.000000f, -0.758172f, 0.246345f, 0.603730f, 0.588430f, 0.803612f, - -0.653054f, 0.398142f, 0.644208f, 0.000000f, -0.653054f, 0.398142f, 0.644208f, 0.678411f, 0.745561f, - -0.174499f, 0.056698f, 0.983024f, 0.000000f, -0.174499f, 0.056698f, 0.983024f, 0.327581f, 0.368567f, - -0.107846f, -0.148438f, 0.983024f, 0.000000f, -0.107846f, -0.148438f, 0.983024f, 0.588426f, 0.268343f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.411570f, 0.289369f, - -0.343074f, 0.111472f, 0.932670f, 0.000000f, -0.343074f, 0.111472f, 0.932670f, 0.332044f, 0.458048f, - -0.286151f, -0.092976f, 0.953663f, 0.000000f, -0.286151f, -0.092976f, 0.953663f, 0.500000f, 0.288582f, - -0.174499f, 0.056698f, 0.983024f, 0.000000f, -0.174499f, 0.056698f, 0.983024f, 0.327581f, 0.368567f, - -0.286151f, -0.092976f, 0.953663f, 0.000000f, -0.286151f, -0.092976f, 0.953663f, 0.500000f, 0.288582f, - -0.212032f, -0.291836f, 0.932670f, 0.000000f, -0.212032f, -0.291836f, 0.932670f, 0.500000f, 0.220572f, - -0.107846f, -0.148438f, 0.983024f, 0.000000f, -0.107846f, -0.148438f, 0.983024f, 0.588426f, 0.268343f, - -0.286151f, -0.092976f, 0.953663f, 0.000000f, -0.286151f, -0.092976f, 0.953663f, 0.500000f, 0.288582f, - -0.107846f, -0.148438f, 0.983024f, 0.000000f, -0.107846f, -0.148438f, 0.983024f, 0.588426f, 0.268343f, - -0.174499f, 0.056698f, 0.983024f, 0.000000f, -0.174499f, 0.056698f, 0.983024f, 0.327581f, 0.368567f, - -0.500000f, 0.162460f, 0.850651f, 0.000000f, -0.500000f, 0.162460f, 0.850651f, 0.790230f, 0.268343f, - -0.455297f, -0.038026f, 0.889527f, 0.000000f, -0.455297f, -0.038026f, 0.889527f, 0.345280f, 0.714912f, - -0.343074f, 0.111472f, 0.932670f, 0.000000f, -0.343074f, 0.111472f, 0.932670f, 0.332044f, 0.458048f, - -0.455297f, -0.038026f, 0.889527f, 0.000000f, -0.455297f, -0.038026f, 0.889527f, 0.345280f, 0.714912f, - -0.390694f, -0.236853f, 0.889527f, 0.000000f, -0.390694f, -0.236853f, 0.889527f, 0.332044f, 0.784331f, - -0.286151f, -0.092976f, 0.953663f, 0.000000f, -0.286151f, -0.092976f, 0.953663f, 0.500000f, 0.288582f, - -0.390694f, -0.236853f, 0.889527f, 0.000000f, -0.390694f, -0.236853f, 0.889527f, 0.332044f, 0.784331f, - -0.309017f, -0.425325f, 0.850651f, 0.000000f, -0.309017f, -0.425325f, 0.850651f, 0.819975f, 0.332044f, - -0.212032f, -0.291836f, 0.932670f, 0.000000f, -0.212032f, -0.291836f, 0.932670f, 0.500000f, 0.220572f, - -0.343074f, 0.111472f, 0.932670f, 0.000000f, -0.343074f, 0.111472f, 0.932670f, 0.332044f, 0.458048f, - -0.455297f, -0.038026f, 0.889527f, 0.000000f, -0.455297f, -0.038026f, 0.889527f, 0.345280f, 0.714912f, - -0.286151f, -0.092976f, 0.953663f, 0.000000f, -0.286151f, -0.092976f, 0.953663f, 0.500000f, 0.288582f, - -0.390694f, -0.236853f, 0.889527f, 0.000000f, -0.390694f, -0.236853f, 0.889527f, 0.332044f, 0.784331f, - -0.212032f, -0.291836f, 0.932670f, 0.000000f, -0.212032f, -0.291836f, 0.932670f, 0.500000f, 0.220572f, - -0.286151f, -0.092976f, 0.953663f, 0.000000f, -0.286151f, -0.092976f, 0.953663f, 0.500000f, 0.288582f, - -0.639949f, 0.207932f, 0.739749f, 0.000000f, -0.639949f, 0.207932f, 0.739749f, 0.672996f, 0.649190f, - -0.632156f, 0.019439f, 0.774597f, 0.000000f, -0.632156f, 0.019439f, 0.774597f, 0.750000f, 0.327581f, - -0.500000f, 0.162460f, 0.850651f, 0.000000f, -0.500000f, 0.162460f, 0.850651f, 0.790230f, 0.268343f, - -0.632156f, 0.019439f, 0.774597f, 0.000000f, -0.632156f, 0.019439f, 0.774597f, 0.750000f, 0.327581f, - -0.577350f, -0.187592f, 0.794654f, 0.000000f, -0.577350f, -0.187592f, 0.794654f, 0.761425f, 0.258102f, - -0.455297f, -0.038026f, 0.889527f, 0.000000f, -0.455297f, -0.038026f, 0.889527f, 0.345280f, 0.714912f, - -0.577350f, -0.187592f, 0.794654f, 0.000000f, -0.577350f, -0.187592f, 0.794654f, 0.761425f, 0.258102f, - -0.499999f, -0.387298f, 0.774597f, 0.000000f, -0.499999f, -0.387298f, 0.774597f, 0.671537f, 0.332044f, - -0.390694f, -0.236853f, 0.889527f, 0.000000f, -0.390694f, -0.236853f, 0.889527f, 0.332044f, 0.784331f, - -0.499999f, -0.387298f, 0.774597f, 0.000000f, -0.499999f, -0.387298f, 0.774597f, 0.671537f, 0.332044f, - -0.395511f, -0.544373f, 0.739749f, 0.000000f, -0.395511f, -0.544373f, 0.739749f, 0.672996f, 0.258102f, - -0.309017f, -0.425325f, 0.850651f, 0.000000f, -0.309017f, -0.425325f, 0.850651f, 0.819975f, 0.332044f, - -0.500000f, 0.162460f, 0.850651f, 0.000000f, -0.500000f, 0.162460f, 0.850651f, 0.790230f, 0.268343f, - -0.632156f, 0.019439f, 0.774597f, 0.000000f, -0.632156f, 0.019439f, 0.774597f, 0.750000f, 0.327581f, - -0.455297f, -0.038026f, 0.889527f, 0.000000f, -0.455297f, -0.038026f, 0.889527f, 0.345280f, 0.714912f, - -0.577350f, -0.187592f, 0.794654f, 0.000000f, -0.577350f, -0.187592f, 0.794654f, 0.761425f, 0.258102f, - -0.390694f, -0.236853f, 0.889527f, 0.000000f, -0.390694f, -0.236853f, 0.889527f, 0.332044f, 0.784331f, - -0.455297f, -0.038026f, 0.889527f, 0.000000f, -0.455297f, -0.038026f, 0.889527f, 0.345280f, 0.714912f, - -0.499999f, -0.387298f, 0.774597f, 0.000000f, -0.499999f, -0.387298f, 0.774597f, 0.671537f, 0.332044f, - -0.309017f, -0.425325f, 0.850651f, 0.000000f, -0.309017f, -0.425325f, 0.850651f, 0.819975f, 0.332044f, - -0.390694f, -0.236853f, 0.889527f, 0.000000f, -0.390694f, -0.236853f, 0.889527f, 0.332044f, 0.784331f, - -0.758172f, 0.246345f, 0.603730f, 0.000000f, -0.758172f, 0.246345f, 0.603730f, 0.588430f, 0.803612f, - -0.762354f, 0.061752f, 0.644208f, 0.000000f, -0.762354f, 0.061752f, 0.644208f, 0.587250f, 0.345280f, - -0.639949f, 0.207932f, 0.739749f, 0.000000f, -0.639949f, 0.207932f, 0.739749f, 0.672996f, 0.649190f, - -0.762354f, 0.061752f, 0.644208f, 0.000000f, -0.762354f, 0.061752f, 0.644208f, 0.587250f, 0.345280f, - -0.736686f, -0.124433f, 0.664689f, 0.000000f, -0.736686f, -0.124433f, 0.664689f, 0.500000f, 0.366840f, - -0.632156f, 0.019439f, 0.774597f, 0.000000f, -0.632156f, 0.019439f, 0.774597f, 0.750000f, 0.327581f, - -0.736686f, -0.124433f, 0.664689f, 0.000000f, -0.736686f, -0.124433f, 0.664689f, 0.500000f, 0.366840f, - -0.669131f, -0.332344f, 0.664689f, 0.000000f, -0.669131f, -0.332344f, 0.664689f, 0.258102f, 0.766840f, - -0.577350f, -0.187592f, 0.794654f, 0.000000f, -0.577350f, -0.187592f, 0.794654f, 0.761425f, 0.258102f, - -0.669131f, -0.332344f, 0.664689f, 0.000000f, -0.669131f, -0.332344f, 0.664689f, 0.258102f, 0.766840f, - -0.580461f, -0.498058f, 0.644208f, 0.000000f, -0.580461f, -0.498058f, 0.644208f, 0.412750f, 0.528349f, - -0.499999f, -0.387298f, 0.774597f, 0.000000f, -0.499999f, -0.387298f, 0.774597f, 0.671537f, 0.332044f, - -0.580461f, -0.498058f, 0.644208f, 0.000000f, -0.580461f, -0.498058f, 0.644208f, 0.412750f, 0.528349f, - -0.468576f, -0.644939f, 0.603730f, 0.000000f, -0.468576f, -0.644939f, 0.603730f, 0.411574f, 0.621707f, - -0.395511f, -0.544373f, 0.739749f, 0.000000f, -0.395511f, -0.544373f, 0.739749f, 0.672996f, 0.258102f, - -0.639949f, 0.207932f, 0.739749f, 0.000000f, -0.639949f, 0.207932f, 0.739749f, 0.672996f, 0.649190f, - -0.762354f, 0.061752f, 0.644208f, 0.000000f, -0.762354f, 0.061752f, 0.644208f, 0.587250f, 0.345280f, - -0.632156f, 0.019439f, 0.774597f, 0.000000f, -0.632156f, 0.019439f, 0.774597f, 0.750000f, 0.327581f, - -0.632156f, 0.019439f, 0.774597f, 0.000000f, -0.632156f, 0.019439f, 0.774597f, 0.750000f, 0.327581f, - -0.736686f, -0.124433f, 0.664689f, 0.000000f, -0.736686f, -0.124433f, 0.664689f, 0.500000f, 0.366840f, - -0.577350f, -0.187592f, 0.794654f, 0.000000f, -0.577350f, -0.187592f, 0.794654f, 0.761425f, 0.258102f, - -0.669131f, -0.332344f, 0.664689f, 0.000000f, -0.669131f, -0.332344f, 0.664689f, 0.258102f, 0.766840f, - -0.499999f, -0.387298f, 0.774597f, 0.000000f, -0.499999f, -0.387298f, 0.774597f, 0.671537f, 0.332044f, - -0.577350f, -0.187592f, 0.794654f, 0.000000f, -0.577350f, -0.187592f, 0.794654f, 0.761425f, 0.258102f, - -0.580461f, -0.498058f, 0.644208f, 0.000000f, -0.580461f, -0.498058f, 0.644208f, 0.412750f, 0.528349f, - -0.395511f, -0.544373f, 0.739749f, 0.000000f, -0.395511f, -0.544373f, 0.739749f, 0.672996f, 0.258102f, - -0.499999f, -0.387298f, 0.774597f, 0.000000f, -0.499999f, -0.387298f, 0.774597f, 0.671537f, 0.332044f, - -0.850651f, 0.276393f, 0.447214f, 0.000000f, -0.850651f, 0.276393f, 0.447214f, 0.588426f, 0.872062f, - -0.866018f, 0.097907f, 0.490334f, 0.000000f, -0.866018f, 0.097907f, 0.490334f, 0.328463f, 0.555736f, - -0.758172f, 0.246345f, 0.603730f, 0.000000f, -0.758172f, 0.246345f, 0.603730f, 0.588430f, 0.803612f, - -0.866018f, 0.097907f, 0.490334f, 0.000000f, -0.866018f, 0.097907f, 0.490334f, 0.328463f, 0.555736f, - -0.851981f, -0.083904f, 0.516806f, 0.000000f, -0.851981f, -0.083904f, 0.516806f, 0.411570f, 0.710631f, - -0.762354f, 0.061752f, 0.644208f, 0.000000f, -0.762354f, 0.061752f, 0.644208f, 0.587250f, 0.345280f, - -0.851981f, -0.083904f, 0.516806f, 0.000000f, -0.851981f, -0.083904f, 0.516806f, 0.411570f, 0.710631f, - -0.809017f, -0.262865f, 0.525731f, 0.000000f, -0.809017f, -0.262865f, 0.525731f, 0.327004f, 0.649190f, - -0.736686f, -0.124433f, 0.664689f, 0.000000f, -0.736686f, -0.124433f, 0.664689f, 0.500000f, 0.366840f, - -0.809017f, -0.262865f, 0.525731f, 0.000000f, -0.809017f, -0.262865f, 0.525731f, 0.327004f, 0.649190f, - -0.738585f, -0.432902f, 0.516806f, 0.000000f, -0.738585f, -0.432902f, 0.516806f, 0.250000f, 0.581230f, - -0.669131f, -0.332344f, 0.664689f, 0.000000f, -0.669131f, -0.332344f, 0.664689f, 0.258102f, 0.766840f, - -0.738585f, -0.432902f, 0.516806f, 0.000000f, -0.738585f, -0.432902f, 0.516806f, 0.250000f, 0.581230f, - -0.643075f, -0.588241f, 0.490334f, 0.000000f, -0.643075f, -0.588241f, 0.490334f, 0.411570f, 0.803612f, - -0.580461f, -0.498058f, 0.644208f, 0.000000f, -0.580461f, -0.498058f, 0.644208f, 0.412750f, 0.528349f, - -0.643075f, -0.588241f, 0.490334f, 0.000000f, -0.643075f, -0.588241f, 0.490334f, 0.411570f, 0.803612f, - -0.525731f, -0.723607f, 0.447214f, 0.000000f, -0.525731f, -0.723607f, 0.447214f, 0.321589f, 0.745561f, - -0.468576f, -0.644939f, 0.603730f, 0.000000f, -0.468576f, -0.644939f, 0.603730f, 0.411574f, 0.621707f, - -0.758172f, 0.246345f, 0.603730f, 0.000000f, -0.758172f, 0.246345f, 0.603730f, 0.588430f, 0.803612f, - -0.866018f, 0.097907f, 0.490334f, 0.000000f, -0.866018f, 0.097907f, 0.490334f, 0.328463f, 0.555736f, - -0.762354f, 0.061752f, 0.644208f, 0.000000f, -0.762354f, 0.061752f, 0.644208f, 0.587250f, 0.345280f, - -0.762354f, 0.061752f, 0.644208f, 0.000000f, -0.762354f, 0.061752f, 0.644208f, 0.587250f, 0.345280f, - -0.851981f, -0.083904f, 0.516806f, 0.000000f, -0.851981f, -0.083904f, 0.516806f, 0.411570f, 0.710631f, - -0.736686f, -0.124433f, 0.664689f, 0.000000f, -0.736686f, -0.124433f, 0.664689f, 0.500000f, 0.366840f, - -0.809017f, -0.262865f, 0.525731f, 0.000000f, -0.809017f, -0.262865f, 0.525731f, 0.327004f, 0.649190f, - -0.669131f, -0.332344f, 0.664689f, 0.000000f, -0.669131f, -0.332344f, 0.664689f, 0.258102f, 0.766840f, - -0.736686f, -0.124433f, 0.664689f, 0.000000f, -0.736686f, -0.124433f, 0.664689f, 0.500000f, 0.366840f, - -0.738585f, -0.432902f, 0.516806f, 0.000000f, -0.738585f, -0.432902f, 0.516806f, 0.250000f, 0.581230f, - -0.580461f, -0.498058f, 0.644208f, 0.000000f, -0.580461f, -0.498058f, 0.644208f, 0.412750f, 0.528349f, - -0.669131f, -0.332344f, 0.664689f, 0.000000f, -0.669131f, -0.332344f, 0.664689f, 0.258102f, 0.766840f, - -0.643075f, -0.588241f, 0.490334f, 0.000000f, -0.643075f, -0.588241f, 0.490334f, 0.411570f, 0.803612f, - -0.468576f, -0.644939f, 0.603730f, 0.000000f, -0.468576f, -0.644939f, 0.603730f, 0.411574f, 0.621707f, - -0.580461f, -0.498058f, 0.644208f, 0.000000f, -0.580461f, -0.498058f, 0.644208f, 0.412750f, 0.528349f, - -0.107846f, -0.148438f, 0.983024f, 0.000000f, -0.107846f, -0.148438f, 0.983024f, 0.588426f, 0.268343f, - 0.107846f, -0.148438f, 0.983024f, 0.000000f, 0.107846f, -0.148438f, 0.983024f, 0.209770f, 0.912551f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.411570f, 0.289369f, - -0.212032f, -0.291836f, 0.932670f, 0.000000f, -0.212032f, -0.291836f, 0.932670f, 0.500000f, 0.220572f, - -0.000000f, -0.300877f, 0.953663f, 0.000000f, -0.000000f, -0.300877f, 0.953663f, 0.238575f, 0.677923f, - -0.107846f, -0.148438f, 0.983024f, 0.000000f, -0.107846f, -0.148438f, 0.983024f, 0.588426f, 0.268343f, - -0.000000f, -0.300877f, 0.953663f, 0.000000f, -0.000000f, -0.300877f, 0.953663f, 0.238575f, 0.677923f, - 0.212032f, -0.291836f, 0.932670f, 0.000000f, 0.212032f, -0.291836f, 0.932670f, 0.327004f, 0.350810f, - 0.107846f, -0.148438f, 0.983024f, 0.000000f, 0.107846f, -0.148438f, 0.983024f, 0.209770f, 0.912551f, - -0.000000f, -0.300877f, 0.953663f, 0.000000f, -0.000000f, -0.300877f, 0.953663f, 0.238575f, 0.677923f, - 0.107846f, -0.148438f, 0.983024f, 0.000000f, 0.107846f, -0.148438f, 0.983024f, 0.209770f, 0.912551f, - -0.107846f, -0.148438f, 0.983024f, 0.000000f, -0.107846f, -0.148438f, 0.983024f, 0.588426f, 0.268343f, - -0.309017f, -0.425325f, 0.850651f, 0.000000f, -0.309017f, -0.425325f, 0.850651f, 0.819975f, 0.332044f, - -0.104529f, -0.444764f, 0.889527f, 0.000000f, -0.104529f, -0.444764f, 0.889527f, 0.180025f, 0.603966f, - -0.212032f, -0.291836f, 0.932670f, 0.000000f, -0.212032f, -0.291836f, 0.932670f, 0.500000f, 0.220572f, - -0.104529f, -0.444764f, 0.889527f, 0.000000f, -0.104529f, -0.444764f, 0.889527f, 0.180025f, 0.603966f, - 0.104529f, -0.444764f, 0.889527f, 0.000000f, 0.104529f, -0.444764f, 0.889527f, 0.411574f, 0.268343f, - -0.000000f, -0.300877f, 0.953663f, 0.000000f, -0.000000f, -0.300877f, 0.953663f, 0.238575f, 0.677923f, - 0.104529f, -0.444764f, 0.889527f, 0.000000f, 0.104529f, -0.444764f, 0.889527f, 0.411574f, 0.268343f, - 0.309017f, -0.425325f, 0.850651f, 0.000000f, 0.309017f, -0.425325f, 0.850651f, 0.238575f, 0.322077f, - 0.212032f, -0.291836f, 0.932670f, 0.000000f, 0.212032f, -0.291836f, 0.932670f, 0.327004f, 0.350810f, - -0.212032f, -0.291836f, 0.932670f, 0.000000f, -0.212032f, -0.291836f, 0.932670f, 0.500000f, 0.220572f, - -0.104529f, -0.444764f, 0.889527f, 0.000000f, -0.104529f, -0.444764f, 0.889527f, 0.180025f, 0.603966f, - -0.000000f, -0.300877f, 0.953663f, 0.000000f, -0.000000f, -0.300877f, 0.953663f, 0.238575f, 0.677923f, - 0.104529f, -0.444764f, 0.889527f, 0.000000f, 0.104529f, -0.444764f, 0.889527f, 0.411574f, 0.268343f, - 0.212032f, -0.291836f, 0.932670f, 0.000000f, 0.212032f, -0.291836f, 0.932670f, 0.327004f, 0.350810f, - -0.000000f, -0.300877f, 0.953663f, 0.000000f, -0.000000f, -0.300877f, 0.953663f, 0.238575f, 0.677923f, - -0.395511f, -0.544373f, 0.739749f, 0.000000f, -0.395511f, -0.544373f, 0.739749f, 0.672996f, 0.258102f, - -0.213835f, -0.595209f, 0.774597f, 0.000000f, -0.213835f, -0.595209f, 0.774597f, 0.411574f, 0.872062f, - -0.309017f, -0.425325f, 0.850651f, 0.000000f, -0.309017f, -0.425325f, 0.850651f, 0.819975f, 0.332044f, - -0.213835f, -0.595209f, 0.774597f, 0.000000f, -0.213835f, -0.595209f, 0.774597f, 0.411574f, 0.872062f, - -0.000000f, -0.607062f, 0.794655f, 0.000000f, -0.000000f, -0.607062f, 0.794655f, 0.327004f, 0.831089f, - -0.104529f, -0.444764f, 0.889527f, 0.000000f, -0.104529f, -0.444764f, 0.889527f, 0.180025f, 0.603966f, - -0.000000f, -0.607062f, 0.794655f, 0.000000f, -0.000000f, -0.607062f, 0.794655f, 0.327004f, 0.831089f, - 0.213834f, -0.595209f, 0.774597f, 0.000000f, 0.213834f, -0.595209f, 0.774597f, 0.238575f, 0.766841f, - 0.104529f, -0.444764f, 0.889527f, 0.000000f, 0.104529f, -0.444764f, 0.889527f, 0.411574f, 0.268343f, - 0.213834f, -0.595209f, 0.774597f, 0.000000f, 0.213834f, -0.595209f, 0.774597f, 0.238575f, 0.766841f, - 0.395510f, -0.544373f, 0.739749f, 0.000000f, 0.395510f, -0.544373f, 0.739749f, 0.238575f, 0.233160f, - 0.309017f, -0.425325f, 0.850651f, 0.000000f, 0.309017f, -0.425325f, 0.850651f, 0.238575f, 0.322077f, - -0.309017f, -0.425325f, 0.850651f, 0.000000f, -0.309017f, -0.425325f, 0.850651f, 0.819975f, 0.332044f, - -0.213835f, -0.595209f, 0.774597f, 0.000000f, -0.213835f, -0.595209f, 0.774597f, 0.411574f, 0.872062f, - -0.104529f, -0.444764f, 0.889527f, 0.000000f, -0.104529f, -0.444764f, 0.889527f, 0.180025f, 0.603966f, - -0.000000f, -0.607062f, 0.794655f, 0.000000f, -0.000000f, -0.607062f, 0.794655f, 0.327004f, 0.831089f, - 0.104529f, -0.444764f, 0.889527f, 0.000000f, 0.104529f, -0.444764f, 0.889527f, 0.411574f, 0.268343f, - -0.104529f, -0.444764f, 0.889527f, 0.000000f, -0.104529f, -0.444764f, 0.889527f, 0.180025f, 0.603966f, - 0.213834f, -0.595209f, 0.774597f, 0.000000f, 0.213834f, -0.595209f, 0.774597f, 0.238575f, 0.766841f, - 0.309017f, -0.425325f, 0.850651f, 0.000000f, 0.309017f, -0.425325f, 0.850651f, 0.238575f, 0.322077f, - 0.104529f, -0.444764f, 0.889527f, 0.000000f, 0.104529f, -0.444764f, 0.889527f, 0.411574f, 0.268343f, - -0.468576f, -0.644939f, 0.603730f, 0.000000f, -0.468576f, -0.644939f, 0.603730f, 0.411574f, 0.621707f, - -0.294310f, -0.705959f, 0.644208f, 0.000000f, -0.294310f, -0.705959f, 0.644208f, 0.173473f, 0.699071f, - -0.395511f, -0.544373f, 0.739749f, 0.000000f, -0.395511f, -0.544373f, 0.739749f, 0.672996f, 0.258102f, - -0.294310f, -0.705959f, 0.644208f, 0.000000f, -0.294310f, -0.705959f, 0.644208f, 0.173473f, 0.699071f, - -0.109305f, -0.739082f, 0.664689f, 0.000000f, -0.109305f, -0.739082f, 0.664689f, 0.412750f, 0.345280f, - -0.213835f, -0.595209f, 0.774597f, 0.000000f, -0.213835f, -0.595209f, 0.774597f, 0.411574f, 0.872062f, - -0.109305f, -0.739082f, 0.664689f, 0.000000f, -0.109305f, -0.739082f, 0.664689f, 0.412750f, 0.345280f, - 0.109305f, -0.739082f, 0.664689f, 0.000000f, 0.109305f, -0.739082f, 0.664689f, 0.328463f, 0.332044f, - -0.000000f, -0.607062f, 0.794655f, 0.000000f, -0.000000f, -0.607062f, 0.794655f, 0.327004f, 0.831089f, - 0.109305f, -0.739082f, 0.664689f, 0.000000f, 0.109305f, -0.739082f, 0.664689f, 0.328463f, 0.332044f, - 0.294309f, -0.705959f, 0.644208f, 0.000000f, 0.294309f, -0.705959f, 0.644208f, 0.250000f, 0.327581f, - 0.213834f, -0.595209f, 0.774597f, 0.000000f, 0.213834f, -0.595209f, 0.774597f, 0.238575f, 0.766841f, - 0.294309f, -0.705959f, 0.644208f, 0.000000f, 0.294309f, -0.705959f, 0.644208f, 0.250000f, 0.327581f, - 0.468576f, -0.644939f, 0.603730f, 0.000000f, 0.468576f, -0.644939f, 0.603730f, 0.327004f, 0.922791f, - 0.395510f, -0.544373f, 0.739749f, 0.000000f, 0.395510f, -0.544373f, 0.739749f, 0.238575f, 0.233160f, - -0.395511f, -0.544373f, 0.739749f, 0.000000f, -0.395511f, -0.544373f, 0.739749f, 0.672996f, 0.258102f, - -0.294310f, -0.705959f, 0.644208f, 0.000000f, -0.294310f, -0.705959f, 0.644208f, 0.173473f, 0.699071f, - -0.213835f, -0.595209f, 0.774597f, 0.000000f, -0.213835f, -0.595209f, 0.774597f, 0.411574f, 0.872062f, - -0.213835f, -0.595209f, 0.774597f, 0.000000f, -0.213835f, -0.595209f, 0.774597f, 0.411574f, 0.872062f, - -0.109305f, -0.739082f, 0.664689f, 0.000000f, -0.109305f, -0.739082f, 0.664689f, 0.412750f, 0.345280f, - -0.000000f, -0.607062f, 0.794655f, 0.000000f, -0.000000f, -0.607062f, 0.794655f, 0.327004f, 0.831089f, - 0.109305f, -0.739082f, 0.664689f, 0.000000f, 0.109305f, -0.739082f, 0.664689f, 0.328463f, 0.332044f, - 0.213834f, -0.595209f, 0.774597f, 0.000000f, 0.213834f, -0.595209f, 0.774597f, 0.238575f, 0.766841f, - -0.000000f, -0.607062f, 0.794655f, 0.000000f, -0.000000f, -0.607062f, 0.794655f, 0.327004f, 0.831089f, - 0.294309f, -0.705959f, 0.644208f, 0.000000f, 0.294309f, -0.705959f, 0.644208f, 0.250000f, 0.327581f, - 0.395510f, -0.544373f, 0.739749f, 0.000000f, 0.395510f, -0.544373f, 0.739749f, 0.238575f, 0.233160f, - 0.213834f, -0.595209f, 0.774597f, 0.000000f, 0.213834f, -0.595209f, 0.774597f, 0.238575f, 0.766841f, - -0.525731f, -0.723607f, 0.447214f, 0.000000f, -0.525731f, -0.723607f, 0.447214f, 0.321589f, 0.745561f, - -0.360730f, -0.793377f, 0.490334f, 0.000000f, -0.360730f, -0.793377f, 0.490334f, 0.327004f, 0.258102f, - -0.468576f, -0.644939f, 0.603730f, 0.000000f, -0.468576f, -0.644939f, 0.603730f, 0.411574f, 0.621707f, - -0.360730f, -0.793377f, 0.490334f, 0.000000f, -0.360730f, -0.793377f, 0.490334f, 0.327004f, 0.258102f, - -0.183479f, -0.836210f, 0.516806f, 0.000000f, -0.183479f, -0.836210f, 0.516806f, 0.180025f, 0.332044f, - -0.294310f, -0.705959f, 0.644208f, 0.000000f, -0.294310f, -0.705959f, 0.644208f, 0.173473f, 0.699071f, - -0.183479f, -0.836210f, 0.516806f, 0.000000f, -0.183479f, -0.836210f, 0.516806f, 0.180025f, 0.332044f, - -0.000000f, -0.850651f, 0.525731f, 0.000000f, -0.000000f, -0.850651f, 0.525731f, 0.238575f, 0.258102f, - -0.109305f, -0.739082f, 0.664689f, 0.000000f, -0.109305f, -0.739082f, 0.664689f, 0.412750f, 0.345280f, - -0.000000f, -0.850651f, 0.525731f, 0.000000f, -0.000000f, -0.850651f, 0.525731f, 0.238575f, 0.258102f, - 0.183479f, -0.836210f, 0.516806f, 0.000000f, 0.183479f, -0.836210f, 0.516806f, 0.258102f, 0.766841f, - 0.109305f, -0.739082f, 0.664689f, 0.000000f, 0.109305f, -0.739082f, 0.664689f, 0.328463f, 0.332044f, - 0.183479f, -0.836210f, 0.516806f, 0.000000f, 0.183479f, -0.836210f, 0.516806f, 0.258102f, 0.766841f, - 0.360730f, -0.793377f, 0.490334f, 0.000000f, 0.360730f, -0.793377f, 0.490334f, 0.446077f, 0.425781f, - 0.294309f, -0.705959f, 0.644208f, 0.000000f, 0.294309f, -0.705959f, 0.644208f, 0.250000f, 0.327581f, - 0.360730f, -0.793377f, 0.490334f, 0.000000f, 0.360730f, -0.793377f, 0.490334f, 0.446077f, 0.425781f, - 0.525731f, -0.723607f, 0.447214f, 0.000000f, 0.525731f, -0.723607f, 0.447214f, 0.606016f, 0.354082f, - 0.468576f, -0.644939f, 0.603730f, 0.000000f, 0.468576f, -0.644939f, 0.603730f, 0.327004f, 0.922791f, - -0.468576f, -0.644939f, 0.603730f, 0.000000f, -0.468576f, -0.644939f, 0.603730f, 0.411574f, 0.621707f, - -0.360730f, -0.793377f, 0.490334f, 0.000000f, -0.360730f, -0.793377f, 0.490334f, 0.327004f, 0.258102f, - -0.294310f, -0.705959f, 0.644208f, 0.000000f, -0.294310f, -0.705959f, 0.644208f, 0.173473f, 0.699071f, - -0.294310f, -0.705959f, 0.644208f, 0.000000f, -0.294310f, -0.705959f, 0.644208f, 0.173473f, 0.699071f, - -0.183479f, -0.836210f, 0.516806f, 0.000000f, -0.183479f, -0.836210f, 0.516806f, 0.180025f, 0.332044f, - -0.109305f, -0.739082f, 0.664689f, 0.000000f, -0.109305f, -0.739082f, 0.664689f, 0.412750f, 0.345280f, - -0.109305f, -0.739082f, 0.664689f, 0.000000f, -0.109305f, -0.739082f, 0.664689f, 0.412750f, 0.345280f, - -0.000000f, -0.850651f, 0.525731f, 0.000000f, -0.000000f, -0.850651f, 0.525731f, 0.238575f, 0.258102f, - 0.109305f, -0.739082f, 0.664689f, 0.000000f, 0.109305f, -0.739082f, 0.664689f, 0.328463f, 0.332044f, - 0.183479f, -0.836210f, 0.516806f, 0.000000f, 0.183479f, -0.836210f, 0.516806f, 0.258102f, 0.766841f, - 0.294309f, -0.705959f, 0.644208f, 0.000000f, 0.294309f, -0.705959f, 0.644208f, 0.250000f, 0.327581f, - 0.109305f, -0.739082f, 0.664689f, 0.000000f, 0.109305f, -0.739082f, 0.664689f, 0.328463f, 0.332044f, - 0.360730f, -0.793377f, 0.490334f, 0.000000f, 0.360730f, -0.793377f, 0.490334f, 0.446077f, 0.425781f, - 0.468576f, -0.644939f, 0.603730f, 0.000000f, 0.468576f, -0.644939f, 0.603730f, 0.327004f, 0.922791f, - 0.294309f, -0.705959f, 0.644208f, 0.000000f, 0.294309f, -0.705959f, 0.644208f, 0.250000f, 0.327581f, - 0.000000f, -0.894427f, -0.447214f, 0.000000f, 0.000000f, -0.894427f, -0.447214f, 0.848850f, 0.215669f, - 0.174499f, -0.853887f, -0.490334f, 0.000000f, 0.174499f, -0.853887f, -0.490334f, 0.814054f, 0.361804f, - 0.107846f, -0.945626f, -0.306855f, 0.000000f, 0.107846f, -0.945626f, -0.306855f, 0.356925f, 0.453512f, - 0.174499f, -0.853887f, -0.490334f, 0.000000f, 0.174499f, -0.853887f, -0.490334f, 0.814054f, 0.361804f, - 0.343074f, -0.784354f, -0.516806f, 0.000000f, 0.343074f, -0.784354f, -0.516806f, 0.835614f, 0.285088f, - 0.286151f, -0.894562f, -0.343331f, 0.000000f, 0.286151f, -0.894562f, -0.343331f, 0.393984f, 0.354082f, - 0.107846f, -0.945626f, -0.306855f, 0.000000f, 0.107846f, -0.945626f, -0.306855f, 0.356925f, 0.453512f, - 0.286151f, -0.894562f, -0.343331f, 0.000000f, 0.286151f, -0.894562f, -0.343331f, 0.393984f, 0.354082f, - 0.212032f, -0.964719f, -0.156077f, 0.000000f, 0.212032f, -0.964719f, -0.156077f, 0.272352f, 0.480987f, - 0.174499f, -0.853887f, -0.490334f, 0.000000f, 0.174499f, -0.853887f, -0.490334f, 0.814054f, 0.361804f, - 0.286151f, -0.894562f, -0.343331f, 0.000000f, 0.286151f, -0.894562f, -0.343331f, 0.393984f, 0.354082f, - 0.107846f, -0.945626f, -0.306855f, 0.000000f, 0.107846f, -0.945626f, -0.306855f, 0.356925f, 0.453512f, - 0.343074f, -0.784354f, -0.516806f, 0.000000f, 0.343074f, -0.784354f, -0.516806f, 0.835614f, 0.285088f, - 0.500000f, -0.688191f, -0.525731f, 0.000000f, 0.500000f, -0.688191f, -0.525731f, 0.500000f, 0.892312f, - 0.455297f, -0.812623f, -0.363797f, 0.000000f, 0.455297f, -0.812623f, -0.363797f, 0.304653f, 0.381573f, - 0.286151f, -0.894562f, -0.343331f, 0.000000f, 0.286151f, -0.894562f, -0.343331f, 0.393984f, 0.354082f, - 0.455297f, -0.812623f, -0.363797f, 0.000000f, 0.455297f, -0.812623f, -0.363797f, 0.304653f, 0.381573f, - 0.390694f, -0.901541f, -0.185961f, 0.000000f, 0.390694f, -0.901541f, -0.185961f, 0.345491f, 0.287337f, - 0.212032f, -0.964719f, -0.156077f, 0.000000f, 0.212032f, -0.964719f, -0.156077f, 0.272352f, 0.480987f, - 0.390694f, -0.901541f, -0.185961f, 0.000000f, 0.390694f, -0.901541f, -0.185961f, 0.345491f, 0.287337f, - 0.309017f, -0.951057f, 0.000000f, 0.000000f, 0.309017f, -0.951057f, 0.000000f, 0.183922f, 0.509719f, - 0.343074f, -0.784354f, -0.516806f, 0.000000f, 0.343074f, -0.784354f, -0.516806f, 0.835614f, 0.285088f, - 0.455297f, -0.812623f, -0.363797f, 0.000000f, 0.455297f, -0.812623f, -0.363797f, 0.304653f, 0.381573f, - 0.286151f, -0.894562f, -0.343331f, 0.000000f, 0.286151f, -0.894562f, -0.343331f, 0.393984f, 0.354082f, - 0.286151f, -0.894562f, -0.343331f, 0.000000f, 0.286151f, -0.894562f, -0.343331f, 0.393984f, 0.354082f, - 0.390694f, -0.901541f, -0.185961f, 0.000000f, 0.390694f, -0.901541f, -0.185961f, 0.345491f, 0.287337f, - 0.212032f, -0.964719f, -0.156077f, 0.000000f, 0.212032f, -0.964719f, -0.156077f, 0.272352f, 0.480987f, - 0.500000f, -0.688191f, -0.525731f, 0.000000f, 0.500000f, -0.688191f, -0.525731f, 0.500000f, 0.892312f, - 0.639949f, -0.568662f, -0.516806f, 0.000000f, 0.639949f, -0.568662f, -0.516806f, 0.588426f, 0.912551f, - 0.632156f, -0.684127f, -0.363797f, 0.000000f, 0.632156f, -0.684127f, -0.363797f, 0.211325f, 0.406204f, - 0.455297f, -0.812623f, -0.363797f, 0.000000f, 0.455297f, -0.812623f, -0.363797f, 0.304653f, 0.381573f, - 0.632156f, -0.684127f, -0.363797f, 0.000000f, 0.632156f, -0.684127f, -0.363797f, 0.211325f, 0.406204f, - 0.577350f, -0.794654f, -0.187593f, 0.000000f, 0.577350f, -0.794654f, -0.187593f, 0.250001f, 0.306351f, - 0.390694f, -0.901541f, -0.185961f, 0.000000f, 0.390694f, -0.901541f, -0.185961f, 0.345491f, 0.287337f, - 0.577350f, -0.794654f, -0.187593f, 0.000000f, 0.577350f, -0.794654f, -0.187593f, 0.250001f, 0.306351f, - 0.499999f, -0.866026f, 0.000000f, 0.000000f, 0.499999f, -0.866026f, 0.000000f, 0.302244f, 0.227814f, - 0.309017f, -0.951057f, 0.000000f, 0.000000f, 0.309017f, -0.951057f, 0.000000f, 0.183922f, 0.509719f, - 0.499999f, -0.866026f, 0.000000f, 0.000000f, 0.499999f, -0.866026f, 0.000000f, 0.302244f, 0.227814f, - 0.395510f, -0.905103f, 0.156077f, 0.000000f, 0.395510f, -0.905103f, 0.156077f, 0.131657f, 0.437784f, - 0.455297f, -0.812623f, -0.363797f, 0.000000f, 0.455297f, -0.812623f, -0.363797f, 0.304653f, 0.381573f, - 0.500000f, -0.688191f, -0.525731f, 0.000000f, 0.500000f, -0.688191f, -0.525731f, 0.500000f, 0.892312f, - 0.632156f, -0.684127f, -0.363797f, 0.000000f, 0.632156f, -0.684127f, -0.363797f, 0.211325f, 0.406204f, - 0.455297f, -0.812623f, -0.363797f, 0.000000f, 0.455297f, -0.812623f, -0.363797f, 0.304653f, 0.381573f, - 0.577350f, -0.794654f, -0.187593f, 0.000000f, 0.577350f, -0.794654f, -0.187593f, 0.250001f, 0.306351f, - 0.390694f, -0.901541f, -0.185961f, 0.000000f, 0.390694f, -0.901541f, -0.185961f, 0.345491f, 0.287337f, - 0.309017f, -0.951057f, 0.000000f, 0.000000f, 0.309017f, -0.951057f, 0.000000f, 0.183922f, 0.509719f, - 0.390694f, -0.901541f, -0.185961f, 0.000000f, 0.390694f, -0.901541f, -0.185961f, 0.345491f, 0.287337f, - 0.499999f, -0.866026f, 0.000000f, 0.000000f, 0.499999f, -0.866026f, 0.000000f, 0.302244f, 0.227814f, - 0.639949f, -0.568662f, -0.516806f, 0.000000f, 0.639949f, -0.568662f, -0.516806f, 0.588426f, 0.912551f, - 0.758172f, -0.429824f, -0.490334f, 0.000000f, 0.758172f, -0.429824f, -0.490334f, 0.588426f, 0.127938f, - 0.762354f, -0.548581f, -0.343331f, 0.000000f, 0.762354f, -0.548581f, -0.343331f, 0.165435f, 0.333828f, - 0.632156f, -0.684127f, -0.363797f, 0.000000f, 0.632156f, -0.684127f, -0.363797f, 0.211325f, 0.406204f, - 0.762354f, -0.548581f, -0.343331f, 0.000000f, 0.762354f, -0.548581f, -0.343331f, 0.165435f, 0.333828f, - 0.736686f, -0.650164f, -0.185961f, 0.000000f, 0.736686f, -0.650164f, -0.185961f, 0.209769f, 0.250971f, - 0.577350f, -0.794654f, -0.187593f, 0.000000f, 0.577350f, -0.794654f, -0.187593f, 0.250001f, 0.306351f, - 0.736686f, -0.650164f, -0.185961f, 0.000000f, 0.736686f, -0.650164f, -0.185961f, 0.209769f, 0.250971f, - 0.669131f, -0.743144f, 0.000000f, 0.000000f, 0.669131f, -0.743144f, 0.000000f, 0.265712f, 0.177530f, - 0.499999f, -0.866026f, 0.000000f, 0.000000f, 0.499999f, -0.866026f, 0.000000f, 0.302244f, 0.227814f, - 0.669131f, -0.743144f, 0.000000f, 0.000000f, 0.669131f, -0.743144f, 0.000000f, 0.265712f, 0.177530f, - 0.580460f, -0.798935f, 0.157379f, 0.000000f, 0.580460f, -0.798935f, 0.157379f, 0.118823f, 0.530876f, - 0.395510f, -0.905103f, 0.156077f, 0.000000f, 0.395510f, -0.905103f, 0.156077f, 0.131657f, 0.437784f, - 0.580460f, -0.798935f, 0.157379f, 0.000000f, 0.580460f, -0.798935f, 0.157379f, 0.118823f, 0.530876f, - 0.468576f, -0.828418f, 0.306855f, 0.000000f, 0.468576f, -0.828418f, 0.306855f, 0.178463f, 0.345280f, - 0.632156f, -0.684127f, -0.363797f, 0.000000f, 0.632156f, -0.684127f, -0.363797f, 0.211325f, 0.406204f, - 0.639949f, -0.568662f, -0.516806f, 0.000000f, 0.639949f, -0.568662f, -0.516806f, 0.588426f, 0.912551f, - 0.762354f, -0.548581f, -0.343331f, 0.000000f, 0.762354f, -0.548581f, -0.343331f, 0.165435f, 0.333828f, - 0.577350f, -0.794654f, -0.187593f, 0.000000f, 0.577350f, -0.794654f, -0.187593f, 0.250001f, 0.306351f, - 0.632156f, -0.684127f, -0.363797f, 0.000000f, 0.632156f, -0.684127f, -0.363797f, 0.211325f, 0.406204f, - 0.736686f, -0.650164f, -0.185961f, 0.000000f, 0.736686f, -0.650164f, -0.185961f, 0.209769f, 0.250971f, - 0.499999f, -0.866026f, 0.000000f, 0.000000f, 0.499999f, -0.866026f, 0.000000f, 0.302244f, 0.227814f, - 0.577350f, -0.794654f, -0.187593f, 0.000000f, 0.577350f, -0.794654f, -0.187593f, 0.250001f, 0.306351f, - 0.669131f, -0.743144f, 0.000000f, 0.000000f, 0.669131f, -0.743144f, 0.000000f, 0.265712f, 0.177530f, - 0.395510f, -0.905103f, 0.156077f, 0.000000f, 0.395510f, -0.905103f, 0.156077f, 0.131657f, 0.437784f, - 0.499999f, -0.866026f, 0.000000f, 0.000000f, 0.499999f, -0.866026f, 0.000000f, 0.302244f, 0.227814f, - 0.580460f, -0.798935f, 0.157379f, 0.000000f, 0.580460f, -0.798935f, 0.157379f, 0.118823f, 0.530876f, - 0.758172f, -0.429824f, -0.490334f, 0.000000f, 0.758172f, -0.429824f, -0.490334f, 0.588426f, 0.127938f, - 0.850651f, -0.276393f, -0.447214f, 0.000000f, 0.850651f, -0.276393f, -0.447214f, 0.500000f, 0.960321f, - 0.866018f, -0.394782f, -0.306855f, 0.000000f, 0.866018f, -0.394782f, -0.306855f, 0.237134f, 0.366840f, - 0.762354f, -0.548581f, -0.343331f, 0.000000f, 0.762354f, -0.548581f, -0.343331f, 0.165435f, 0.333828f, - 0.866018f, -0.394782f, -0.306855f, 0.000000f, 0.866018f, -0.394782f, -0.306855f, 0.237134f, 0.366840f, - 0.851981f, -0.499769f, -0.156077f, 0.000000f, 0.851981f, -0.499769f, -0.156077f, 0.265712f, 0.288582f, - 0.736686f, -0.650164f, -0.185961f, 0.000000f, 0.736686f, -0.650164f, -0.185961f, 0.209769f, 0.250971f, - 0.851981f, -0.499769f, -0.156077f, 0.000000f, 0.851981f, -0.499769f, -0.156077f, 0.265712f, 0.288582f, - 0.809017f, -0.587785f, 0.000000f, 0.000000f, 0.809017f, -0.587785f, 0.000000f, 0.209769f, 0.268343f, - 0.669131f, -0.743144f, 0.000000f, 0.000000f, 0.669131f, -0.743144f, 0.000000f, 0.265712f, 0.177530f, - 0.809017f, -0.587785f, 0.000000f, 0.000000f, 0.809017f, -0.587785f, 0.000000f, 0.209769f, 0.268343f, - 0.738585f, -0.655845f, 0.156077f, 0.000000f, 0.738585f, -0.655845f, 0.156077f, 0.500000f, 0.349562f, - 0.580460f, -0.798935f, 0.157379f, 0.000000f, 0.580460f, -0.798935f, 0.157379f, 0.118823f, 0.530876f, - 0.738585f, -0.655845f, 0.156077f, 0.000000f, 0.738585f, -0.655845f, 0.156077f, 0.500000f, 0.349562f, - 0.643075f, -0.701637f, 0.306855f, 0.000000f, 0.643075f, -0.701637f, 0.306855f, 0.447735f, 0.277618f, - 0.468576f, -0.828418f, 0.306855f, 0.000000f, 0.468576f, -0.828418f, 0.306855f, 0.178463f, 0.345280f, - 0.643075f, -0.701637f, 0.306855f, 0.000000f, 0.643075f, -0.701637f, 0.306855f, 0.447735f, 0.277618f, - 0.525731f, -0.723607f, 0.447214f, 0.000000f, 0.525731f, -0.723607f, 0.447214f, 0.606016f, 0.354082f, - 0.762354f, -0.548581f, -0.343331f, 0.000000f, 0.762354f, -0.548581f, -0.343331f, 0.165435f, 0.333828f, - 0.758172f, -0.429824f, -0.490334f, 0.000000f, 0.758172f, -0.429824f, -0.490334f, 0.588426f, 0.127938f, - 0.866018f, -0.394782f, -0.306855f, 0.000000f, 0.866018f, -0.394782f, -0.306855f, 0.237134f, 0.366840f, - 0.736686f, -0.650164f, -0.185961f, 0.000000f, 0.736686f, -0.650164f, -0.185961f, 0.209769f, 0.250971f, - 0.762354f, -0.548581f, -0.343331f, 0.000000f, 0.762354f, -0.548581f, -0.343331f, 0.165435f, 0.333828f, - 0.851981f, -0.499769f, -0.156077f, 0.000000f, 0.851981f, -0.499769f, -0.156077f, 0.265712f, 0.288582f, - 0.669131f, -0.743144f, 0.000000f, 0.000000f, 0.669131f, -0.743144f, 0.000000f, 0.265712f, 0.177530f, - 0.736686f, -0.650164f, -0.185961f, 0.000000f, 0.736686f, -0.650164f, -0.185961f, 0.209769f, 0.250971f, - 0.809017f, -0.587785f, 0.000000f, 0.000000f, 0.809017f, -0.587785f, 0.000000f, 0.209769f, 0.268343f, - 0.669131f, -0.743144f, 0.000000f, 0.000000f, 0.669131f, -0.743144f, 0.000000f, 0.265712f, 0.177530f, - 0.738585f, -0.655845f, 0.156077f, 0.000000f, 0.738585f, -0.655845f, 0.156077f, 0.500000f, 0.349562f, - 0.580460f, -0.798935f, 0.157379f, 0.000000f, 0.580460f, -0.798935f, 0.157379f, 0.118823f, 0.530876f, - 0.468576f, -0.828418f, 0.306855f, 0.000000f, 0.468576f, -0.828418f, 0.306855f, 0.178463f, 0.345280f, - 0.580460f, -0.798935f, 0.157379f, 0.000000f, 0.580460f, -0.798935f, 0.157379f, 0.118823f, 0.530876f, - 0.643075f, -0.701637f, 0.306855f, 0.000000f, 0.643075f, -0.701637f, 0.306855f, 0.447735f, 0.277618f, - 0.850651f, -0.276393f, -0.447214f, 0.000000f, 0.850651f, -0.276393f, -0.447214f, 0.500000f, 0.960321f, - 0.866018f, -0.097907f, -0.490334f, 0.000000f, 0.866018f, -0.097907f, -0.490334f, 0.834566f, 0.666172f, - 0.932670f, -0.189647f, -0.306855f, 0.000000f, 0.932670f, -0.189647f, -0.306855f, 0.552265f, 0.277618f, - 0.866018f, -0.097907f, -0.490334f, 0.000000f, 0.866018f, -0.097907f, -0.490334f, 0.834566f, 0.666172f, - 0.851981f, 0.083904f, -0.516806f, 0.000000f, 0.851981f, 0.083904f, -0.516806f, 0.734288f, 0.822469f, - 0.939205f, -0.004289f, -0.343331f, 0.000000f, 0.939205f, -0.004289f, -0.343331f, 0.393082f, 0.202395f, - 0.932670f, -0.189647f, -0.306855f, 0.000000f, 0.932670f, -0.189647f, -0.306855f, 0.552265f, 0.277618f, - 0.939205f, -0.004289f, -0.343331f, 0.000000f, 0.939205f, -0.004289f, -0.343331f, 0.393082f, 0.202395f, - 0.983024f, -0.096461f, -0.156077f, 0.000000f, 0.983024f, -0.096461f, -0.156077f, 0.500000f, 0.196469f, - 0.866018f, -0.097907f, -0.490334f, 0.000000f, 0.866018f, -0.097907f, -0.490334f, 0.834566f, 0.666172f, - 0.939205f, -0.004289f, -0.343331f, 0.000000f, 0.939205f, -0.004289f, -0.343331f, 0.393082f, 0.202395f, - 0.932670f, -0.189647f, -0.306855f, 0.000000f, 0.932670f, -0.189647f, -0.306855f, 0.552265f, 0.277618f, - 0.851981f, 0.083904f, -0.516806f, 0.000000f, 0.851981f, 0.083904f, -0.516806f, 0.734288f, 0.822469f, - 0.809017f, 0.262865f, -0.525731f, 0.000000f, 0.809017f, 0.262865f, -0.525731f, 0.790230f, 0.749029f, - 0.913545f, 0.181898f, -0.363797f, 0.000000f, 0.913545f, 0.181898f, -0.363797f, 0.606917f, 0.202395f, - 0.939205f, -0.004289f, -0.343331f, 0.000000f, 0.939205f, -0.004289f, -0.343331f, 0.393082f, 0.202395f, - 0.913545f, 0.181898f, -0.363797f, 0.000000f, 0.913545f, 0.181898f, -0.363797f, 0.606917f, 0.202395f, - 0.978148f, 0.092981f, -0.185961f, 0.000000f, 0.978148f, 0.092981f, -0.185961f, 0.352845f, 0.147020f, - 0.983024f, -0.096461f, -0.156077f, 0.000000f, 0.983024f, -0.096461f, -0.156077f, 0.500000f, 0.196469f, - 0.978148f, 0.092981f, -0.185961f, 0.000000f, 0.978148f, 0.092981f, -0.185961f, 0.352845f, 0.147020f, - 1.000000f, -0.000000f, 0.000000f, 0.000000f, 1.000000f, -0.000000f, 0.000000f, 0.445347f, 0.130459f, - 0.851981f, 0.083904f, -0.516806f, 0.000000f, 0.851981f, 0.083904f, -0.516806f, 0.734288f, 0.822469f, - 0.913545f, 0.181898f, -0.363797f, 0.000000f, 0.913545f, 0.181898f, -0.363797f, 0.606917f, 0.202395f, - 0.939205f, -0.004289f, -0.343331f, 0.000000f, 0.939205f, -0.004289f, -0.343331f, 0.393082f, 0.202395f, - 0.939205f, -0.004289f, -0.343331f, 0.000000f, 0.939205f, -0.004289f, -0.343331f, 0.393082f, 0.202395f, - 0.978148f, 0.092981f, -0.185961f, 0.000000f, 0.978148f, 0.092981f, -0.185961f, 0.352845f, 0.147020f, - 0.983024f, -0.096461f, -0.156077f, 0.000000f, 0.983024f, -0.096461f, -0.156077f, 0.500000f, 0.196469f, - 0.809017f, 0.262865f, -0.525731f, 0.000000f, 0.809017f, 0.262865f, -0.525731f, 0.790230f, 0.749029f, - 0.738585f, 0.432902f, -0.516806f, 0.000000f, 0.738585f, 0.432902f, -0.516806f, 0.816078f, 0.490281f, - 0.845991f, 0.389809f, -0.363797f, 0.000000f, 0.845991f, 0.389809f, -0.363797f, 0.554653f, 0.130459f, - 0.913545f, 0.181898f, -0.363797f, 0.000000f, 0.913545f, 0.181898f, -0.363797f, 0.606917f, 0.202395f, - 0.845991f, 0.389809f, -0.363797f, 0.000000f, 0.845991f, 0.389809f, -0.363797f, 0.554653f, 0.130459f, - 0.934172f, 0.303531f, -0.187593f, 0.000000f, 0.934172f, 0.303531f, -0.187593f, 0.647155f, 0.147020f, - 0.978148f, 0.092981f, -0.185961f, 0.000000f, 0.978148f, 0.092981f, -0.185961f, 0.352845f, 0.147020f, - 0.934172f, 0.303531f, -0.187593f, 0.000000f, 0.934172f, 0.303531f, -0.187593f, 0.647155f, 0.147020f, - 0.978148f, 0.207911f, 0.000000f, 0.000000f, 0.978148f, 0.207911f, 0.000000f, 0.319635f, 0.345280f, - 1.000000f, -0.000000f, 0.000000f, 0.000000f, 1.000000f, -0.000000f, 0.000000f, 0.445347f, 0.130459f, - 0.978148f, 0.207911f, 0.000000f, 0.000000f, 0.978148f, 0.207911f, 0.000000f, 0.319635f, 0.345280f, - 0.983024f, 0.096460f, 0.156077f, 0.000000f, 0.983024f, 0.096460f, 0.156077f, 0.408260f, 0.332044f, - 0.913545f, 0.181898f, -0.363797f, 0.000000f, 0.913545f, 0.181898f, -0.363797f, 0.606917f, 0.202395f, - 0.809017f, 0.262865f, -0.525731f, 0.000000f, 0.809017f, 0.262865f, -0.525731f, 0.790230f, 0.749029f, - 0.845991f, 0.389809f, -0.363797f, 0.000000f, 0.845991f, 0.389809f, -0.363797f, 0.554653f, 0.130459f, - 0.913545f, 0.181898f, -0.363797f, 0.000000f, 0.913545f, 0.181898f, -0.363797f, 0.606917f, 0.202395f, - 0.934172f, 0.303531f, -0.187593f, 0.000000f, 0.934172f, 0.303531f, -0.187593f, 0.647155f, 0.147020f, - 0.978148f, 0.092981f, -0.185961f, 0.000000f, 0.978148f, 0.092981f, -0.185961f, 0.352845f, 0.147020f, - 1.000000f, -0.000000f, 0.000000f, 0.000000f, 1.000000f, -0.000000f, 0.000000f, 0.445347f, 0.130459f, - 0.978148f, 0.092981f, -0.185961f, 0.000000f, 0.978148f, 0.092981f, -0.185961f, 0.352845f, 0.147020f, - 0.978148f, 0.207911f, 0.000000f, 0.000000f, 0.978148f, 0.207911f, 0.000000f, 0.319635f, 0.345280f, - 0.738585f, 0.432902f, -0.516806f, 0.000000f, 0.738585f, 0.432902f, -0.516806f, 0.816078f, 0.490281f, - 0.643075f, 0.588241f, -0.490334f, 0.000000f, 0.643075f, 0.588241f, -0.490334f, 0.697755f, 0.772187f, - 0.757312f, 0.555521f, -0.343331f, 0.000000f, 0.757312f, 0.555521f, -0.343331f, 0.352845f, 0.268343f, - 0.845991f, 0.389809f, -0.363797f, 0.000000f, 0.845991f, 0.389809f, -0.363797f, 0.554653f, 0.130459f, - 0.757312f, 0.555521f, -0.343331f, 0.000000f, 0.757312f, 0.555521f, -0.343331f, 0.352845f, 0.268343f, - 0.845991f, 0.499718f, -0.185961f, 0.000000f, 0.845991f, 0.499718f, -0.185961f, 0.500000f, 0.327581f, - 0.934172f, 0.303531f, -0.187593f, 0.000000f, 0.934172f, 0.303531f, -0.187593f, 0.647155f, 0.147020f, - 0.845991f, 0.499718f, -0.185961f, 0.000000f, 0.845991f, 0.499718f, -0.185961f, 0.500000f, 0.327581f, - 0.913545f, 0.406737f, 0.000000f, 0.000000f, 0.913545f, 0.406737f, 0.000000f, 0.445347f, 0.258102f, - 0.978148f, 0.207911f, 0.000000f, 0.000000f, 0.978148f, 0.207911f, 0.000000f, 0.319635f, 0.345280f, - 0.913545f, 0.406737f, 0.000000f, 0.000000f, 0.913545f, 0.406737f, 0.000000f, 0.445347f, 0.258102f, - 0.939205f, 0.305166f, 0.157379f, 0.000000f, 0.939205f, 0.305166f, 0.157379f, 0.591739f, 0.332044f, - 0.983024f, 0.096460f, 0.156077f, 0.000000f, 0.983024f, 0.096460f, 0.156077f, 0.408260f, 0.332044f, - 0.939205f, 0.305166f, 0.157379f, 0.000000f, 0.939205f, 0.305166f, 0.157379f, 0.591739f, 0.332044f, - 0.932670f, 0.189647f, 0.306855f, 0.000000f, 0.932670f, 0.189647f, 0.306855f, 0.554653f, 0.258102f, - 0.845991f, 0.389809f, -0.363797f, 0.000000f, 0.845991f, 0.389809f, -0.363797f, 0.554653f, 0.130459f, - 0.738585f, 0.432902f, -0.516806f, 0.000000f, 0.738585f, 0.432902f, -0.516806f, 0.816078f, 0.490281f, - 0.757312f, 0.555521f, -0.343331f, 0.000000f, 0.757312f, 0.555521f, -0.343331f, 0.352845f, 0.268343f, - 0.934172f, 0.303531f, -0.187593f, 0.000000f, 0.934172f, 0.303531f, -0.187593f, 0.647155f, 0.147020f, - 0.845991f, 0.389809f, -0.363797f, 0.000000f, 0.845991f, 0.389809f, -0.363797f, 0.554653f, 0.130459f, - 0.845991f, 0.499718f, -0.185961f, 0.000000f, 0.845991f, 0.499718f, -0.185961f, 0.500000f, 0.327581f, - 0.978148f, 0.207911f, 0.000000f, 0.000000f, 0.978148f, 0.207911f, 0.000000f, 0.319635f, 0.345280f, - 0.934172f, 0.303531f, -0.187593f, 0.000000f, 0.934172f, 0.303531f, -0.187593f, 0.647155f, 0.147020f, - 0.913545f, 0.406737f, 0.000000f, 0.000000f, 0.913545f, 0.406737f, 0.000000f, 0.445347f, 0.258102f, - 0.983024f, 0.096460f, 0.156077f, 0.000000f, 0.983024f, 0.096460f, 0.156077f, 0.408260f, 0.332044f, - 0.978148f, 0.207911f, 0.000000f, 0.000000f, 0.978148f, 0.207911f, 0.000000f, 0.319635f, 0.345280f, - 0.939205f, 0.305166f, 0.157379f, 0.000000f, 0.939205f, 0.305166f, 0.157379f, 0.591739f, 0.332044f, - 0.643075f, 0.588241f, -0.490334f, 0.000000f, 0.643075f, 0.588241f, -0.490334f, 0.697755f, 0.772187f, - 0.525731f, 0.723607f, -0.447214f, 0.000000f, 0.525731f, 0.723607f, -0.447214f, 0.788675f, 0.593796f, - 0.643075f, 0.701637f, -0.306855f, 0.000000f, 0.643075f, 0.701637f, -0.306855f, 0.680365f, 0.345280f, - 0.757312f, 0.555521f, -0.343331f, 0.000000f, 0.757312f, 0.555521f, -0.343331f, 0.352845f, 0.268343f, - 0.643075f, 0.701637f, -0.306855f, 0.000000f, 0.643075f, 0.701637f, -0.306855f, 0.680365f, 0.345280f, - 0.738585f, 0.655845f, -0.156077f, 0.000000f, 0.738585f, 0.655845f, -0.156077f, 0.647155f, 0.268343f, - 0.845991f, 0.499718f, -0.185961f, 0.000000f, 0.845991f, 0.499718f, -0.185961f, 0.500000f, 0.327581f, - 0.738585f, 0.655845f, -0.156077f, 0.000000f, 0.738585f, 0.655845f, -0.156077f, 0.647155f, 0.268343f, - 0.809017f, 0.587785f, 0.000000f, 0.000000f, 0.809017f, 0.587785f, 0.000000f, 0.553923f, 0.743874f, - 0.913545f, 0.406737f, 0.000000f, 0.000000f, 0.913545f, 0.406737f, 0.000000f, 0.445347f, 0.258102f, - 0.809017f, 0.587785f, 0.000000f, 0.000000f, 0.809017f, 0.587785f, 0.000000f, 0.553923f, 0.743874f, - 0.851981f, 0.499768f, 0.156077f, 0.000000f, 0.851981f, 0.499768f, 0.156077f, 0.643075f, 0.762112f, - 0.939205f, 0.305166f, 0.157379f, 0.000000f, 0.939205f, 0.305166f, 0.157379f, 0.591739f, 0.332044f, - 0.851981f, 0.499768f, 0.156077f, 0.000000f, 0.851981f, 0.499768f, 0.156077f, 0.643075f, 0.762112f, - 0.866018f, 0.394782f, 0.306855f, 0.000000f, 0.866018f, 0.394782f, 0.306855f, 0.606016f, 0.668485f, - 0.932670f, 0.189647f, 0.306855f, 0.000000f, 0.932670f, 0.189647f, 0.306855f, 0.554653f, 0.258102f, - 0.866018f, 0.394782f, 0.306855f, 0.000000f, 0.866018f, 0.394782f, 0.306855f, 0.606016f, 0.668485f, - 0.850651f, 0.276393f, 0.447214f, 0.000000f, 0.850651f, 0.276393f, 0.447214f, 0.750000f, 0.581230f, - 0.757312f, 0.555521f, -0.343331f, 0.000000f, 0.757312f, 0.555521f, -0.343331f, 0.352845f, 0.268343f, - 0.643075f, 0.588241f, -0.490334f, 0.000000f, 0.643075f, 0.588241f, -0.490334f, 0.697755f, 0.772187f, - 0.643075f, 0.701637f, -0.306855f, 0.000000f, 0.643075f, 0.701637f, -0.306855f, 0.680365f, 0.345280f, - 0.845991f, 0.499718f, -0.185961f, 0.000000f, 0.845991f, 0.499718f, -0.185961f, 0.500000f, 0.327581f, - 0.757312f, 0.555521f, -0.343331f, 0.000000f, 0.757312f, 0.555521f, -0.343331f, 0.352845f, 0.268343f, - 0.738585f, 0.655845f, -0.156077f, 0.000000f, 0.738585f, 0.655845f, -0.156077f, 0.647155f, 0.268343f, - 0.913545f, 0.406737f, 0.000000f, 0.000000f, 0.913545f, 0.406737f, 0.000000f, 0.445347f, 0.258102f, - 0.845991f, 0.499718f, -0.185961f, 0.000000f, 0.845991f, 0.499718f, -0.185961f, 0.500000f, 0.327581f, - 0.809017f, 0.587785f, 0.000000f, 0.000000f, 0.809017f, 0.587785f, 0.000000f, 0.553923f, 0.743874f, - 0.913545f, 0.406737f, 0.000000f, 0.000000f, 0.913545f, 0.406737f, 0.000000f, 0.445347f, 0.258102f, - 0.851981f, 0.499768f, 0.156077f, 0.000000f, 0.851981f, 0.499768f, 0.156077f, 0.643075f, 0.762112f, - 0.939205f, 0.305166f, 0.157379f, 0.000000f, 0.939205f, 0.305166f, 0.157379f, 0.591739f, 0.332044f, - 0.932670f, 0.189647f, 0.306855f, 0.000000f, 0.932670f, 0.189647f, 0.306855f, 0.554653f, 0.258102f, - 0.939205f, 0.305166f, 0.157379f, 0.000000f, 0.939205f, 0.305166f, 0.157379f, 0.591739f, 0.332044f, - 0.866018f, 0.394782f, 0.306855f, 0.000000f, 0.866018f, 0.394782f, 0.306855f, 0.606016f, 0.668485f, - 0.525731f, 0.723607f, -0.447214f, 0.000000f, 0.525731f, 0.723607f, -0.447214f, 0.788675f, 0.593796f, - 0.360730f, 0.793377f, -0.490334f, 0.000000f, 0.360730f, 0.793377f, -0.490334f, 0.345491f, 0.712663f, - 0.468576f, 0.828418f, -0.306855f, 0.000000f, 0.468576f, 0.828418f, -0.306855f, 0.727648f, 0.772345f, - 0.360730f, 0.793377f, -0.490334f, 0.000000f, 0.360730f, 0.793377f, -0.490334f, 0.345491f, 0.712663f, - 0.183479f, 0.836210f, -0.516806f, 0.000000f, 0.183479f, 0.836210f, -0.516806f, 0.447735f, 0.722382f, - 0.294310f, 0.891911f, -0.343331f, 0.000000f, 0.294310f, 0.891911f, -0.343331f, 0.695347f, 0.683427f, - 0.468576f, 0.828418f, -0.306855f, 0.000000f, 0.468576f, 0.828418f, -0.306855f, 0.727648f, 0.772345f, - 0.294310f, 0.891911f, -0.343331f, 0.000000f, 0.294310f, 0.891911f, -0.343331f, 0.695347f, 0.683427f, - 0.395511f, 0.905103f, -0.156077f, 0.000000f, 0.395511f, 0.905103f, -0.156077f, 0.654508f, 0.590447f, - 0.360730f, 0.793377f, -0.490334f, 0.000000f, 0.360730f, 0.793377f, -0.490334f, 0.345491f, 0.712663f, - 0.294310f, 0.891911f, -0.343331f, 0.000000f, 0.294310f, 0.891911f, -0.343331f, 0.695347f, 0.683427f, - 0.468576f, 0.828418f, -0.306855f, 0.000000f, 0.468576f, 0.828418f, -0.306855f, 0.727648f, 0.772345f, - 0.183479f, 0.836210f, -0.516806f, 0.000000f, 0.183479f, 0.836210f, -0.516806f, 0.447735f, 0.722382f, - 0.000000f, 0.850651f, -0.525731f, 0.000000f, 0.000000f, 0.850651f, -0.525731f, 0.393984f, 0.645918f, - 0.109305f, 0.925043f, -0.363797f, 0.000000f, 0.109305f, 0.925043f, -0.363797f, 0.816078f, 0.772345f, - 0.294310f, 0.891911f, -0.343331f, 0.000000f, 0.294310f, 0.891911f, -0.343331f, 0.695347f, 0.683427f, - 0.109305f, 0.925043f, -0.363797f, 0.000000f, 0.109305f, 0.925043f, -0.363797f, 0.816078f, 0.772345f, - 0.213835f, 0.959006f, -0.185961f, 0.000000f, 0.213835f, 0.959006f, -0.185961f, 0.788675f, 0.684243f, - 0.395511f, 0.905103f, -0.156077f, 0.000000f, 0.395511f, 0.905103f, -0.156077f, 0.654508f, 0.590447f, - 0.213835f, 0.959006f, -0.185961f, 0.000000f, 0.213835f, 0.959006f, -0.185961f, 0.788675f, 0.684243f, - 0.309017f, 0.951056f, 0.000000f, 0.000000f, 0.309017f, 0.951056f, 0.000000f, 0.750000f, 0.590447f, - 0.183479f, 0.836210f, -0.516806f, 0.000000f, 0.183479f, 0.836210f, -0.516806f, 0.447735f, 0.722382f, - 0.109305f, 0.925043f, -0.363797f, 0.000000f, 0.109305f, 0.925043f, -0.363797f, 0.816078f, 0.772345f, - 0.294310f, 0.891911f, -0.343331f, 0.000000f, 0.294310f, 0.891911f, -0.343331f, 0.695347f, 0.683427f, - 0.294310f, 0.891911f, -0.343331f, 0.000000f, 0.294310f, 0.891911f, -0.343331f, 0.695347f, 0.683427f, - 0.213835f, 0.959006f, -0.185961f, 0.000000f, 0.213835f, 0.959006f, -0.185961f, 0.788675f, 0.684243f, - 0.395511f, 0.905103f, -0.156077f, 0.000000f, 0.395511f, 0.905103f, -0.156077f, 0.654508f, 0.590447f, - 0.000000f, 0.850651f, -0.525731f, 0.000000f, 0.000000f, 0.850651f, -0.525731f, 0.393984f, 0.645918f, - -0.183479f, 0.836210f, -0.516806f, 0.000000f, -0.183479f, 0.836210f, -0.516806f, 0.500000f, 0.650438f, - -0.109305f, 0.925043f, -0.363797f, 0.000000f, -0.109305f, 0.925043f, -0.363797f, 0.697755f, 0.512408f, - 0.109305f, 0.925043f, -0.363797f, 0.000000f, 0.109305f, 0.925043f, -0.363797f, 0.816078f, 0.772345f, - -0.109305f, 0.925043f, -0.363797f, 0.000000f, -0.109305f, 0.925043f, -0.363797f, 0.697755f, 0.512408f, - 0.000000f, 0.982247f, -0.187593f, 0.000000f, 0.000000f, 0.982247f, -0.187593f, 0.762112f, 0.225709f, - 0.213835f, 0.959006f, -0.185961f, 0.000000f, 0.213835f, 0.959006f, -0.185961f, 0.788675f, 0.684243f, - 0.000000f, 0.982247f, -0.187593f, 0.000000f, 0.000000f, 0.982247f, -0.187593f, 0.762112f, 0.225709f, - 0.104529f, 0.994522f, 0.000000f, 0.000000f, 0.104529f, 0.994522f, 0.000000f, 0.772345f, 0.157937f, - 0.309017f, 0.951056f, 0.000000f, 0.000000f, 0.309017f, 0.951056f, 0.000000f, 0.750000f, 0.590447f, - 0.104529f, 0.994522f, 0.000000f, 0.000000f, 0.104529f, 0.994522f, 0.000000f, 0.772345f, 0.157937f, - 0.212032f, 0.964719f, 0.156077f, 0.000000f, 0.212032f, 0.964719f, 0.156077f, 0.683427f, 0.174918f, - 0.109305f, 0.925043f, -0.363797f, 0.000000f, 0.109305f, 0.925043f, -0.363797f, 0.816078f, 0.772345f, - 0.000000f, 0.850651f, -0.525731f, 0.000000f, 0.000000f, 0.850651f, -0.525731f, 0.393984f, 0.645918f, - -0.109305f, 0.925043f, -0.363797f, 0.000000f, -0.109305f, 0.925043f, -0.363797f, 0.697755f, 0.512408f, - 0.109305f, 0.925043f, -0.363797f, 0.000000f, 0.109305f, 0.925043f, -0.363797f, 0.816078f, 0.772345f, - 0.000000f, 0.982247f, -0.187593f, 0.000000f, 0.000000f, 0.982247f, -0.187593f, 0.762112f, 0.225709f, - 0.213835f, 0.959006f, -0.185961f, 0.000000f, 0.213835f, 0.959006f, -0.185961f, 0.788675f, 0.684243f, - 0.309017f, 0.951056f, 0.000000f, 0.000000f, 0.309017f, 0.951056f, 0.000000f, 0.750000f, 0.590447f, - 0.213835f, 0.959006f, -0.185961f, 0.000000f, 0.213835f, 0.959006f, -0.185961f, 0.788675f, 0.684243f, - 0.104529f, 0.994522f, 0.000000f, 0.000000f, 0.104529f, 0.994522f, 0.000000f, 0.772345f, 0.157937f, - -0.183479f, 0.836210f, -0.516806f, 0.000000f, -0.183479f, 0.836210f, -0.516806f, 0.500000f, 0.650438f, - -0.360730f, 0.793377f, -0.490334f, 0.000000f, -0.360730f, 0.793377f, -0.490334f, 0.790230f, 0.912551f, - -0.294309f, 0.891911f, -0.343331f, 0.000000f, -0.294309f, 0.891911f, -0.343331f, 0.868343f, 0.683427f, - -0.109305f, 0.925043f, -0.363797f, 0.000000f, -0.109305f, 0.925043f, -0.363797f, 0.697755f, 0.512408f, - -0.294309f, 0.891911f, -0.343331f, 0.000000f, -0.294309f, 0.891911f, -0.343331f, 0.868343f, 0.683427f, - -0.213834f, 0.959006f, -0.185961f, 0.000000f, -0.213834f, 0.959006f, -0.185961f, 0.834566f, 0.590447f, - 0.000000f, 0.982247f, -0.187593f, 0.000000f, 0.000000f, 0.982247f, -0.187593f, 0.762112f, 0.225709f, - -0.213834f, 0.959006f, -0.185961f, 0.000000f, -0.213834f, 0.959006f, -0.185961f, 0.834566f, 0.590447f, - -0.104529f, 0.994522f, 0.000000f, 0.000000f, -0.104529f, 0.994522f, 0.000000f, 0.790230f, 0.511757f, - 0.104529f, 0.994522f, 0.000000f, 0.000000f, 0.104529f, 0.994522f, 0.000000f, 0.772345f, 0.157937f, - -0.104529f, 0.994522f, 0.000000f, 0.000000f, -0.104529f, 0.994522f, 0.000000f, 0.790230f, 0.511757f, - 0.000000f, 0.987538f, 0.157379f, 0.000000f, 0.000000f, 0.987538f, 0.157379f, 0.734288f, 0.437019f, - 0.212032f, 0.964719f, 0.156077f, 0.000000f, 0.212032f, 0.964719f, 0.156077f, 0.683427f, 0.174918f, - 0.000000f, 0.987538f, 0.157379f, 0.000000f, 0.000000f, 0.987538f, 0.157379f, 0.734288f, 0.437019f, - 0.107846f, 0.945626f, 0.306855f, 0.000000f, 0.107846f, 0.945626f, 0.306855f, 0.743874f, 0.302609f, - -0.109305f, 0.925043f, -0.363797f, 0.000000f, -0.109305f, 0.925043f, -0.363797f, 0.697755f, 0.512408f, - -0.183479f, 0.836210f, -0.516806f, 0.000000f, -0.183479f, 0.836210f, -0.516806f, 0.500000f, 0.650438f, - -0.294309f, 0.891911f, -0.343331f, 0.000000f, -0.294309f, 0.891911f, -0.343331f, 0.868343f, 0.683427f, - 0.000000f, 0.982247f, -0.187593f, 0.000000f, 0.000000f, 0.982247f, -0.187593f, 0.762112f, 0.225709f, - -0.109305f, 0.925043f, -0.363797f, 0.000000f, -0.109305f, 0.925043f, -0.363797f, 0.697755f, 0.512408f, - -0.213834f, 0.959006f, -0.185961f, 0.000000f, -0.213834f, 0.959006f, -0.185961f, 0.834566f, 0.590447f, - 0.104529f, 0.994522f, 0.000000f, 0.000000f, 0.104529f, 0.994522f, 0.000000f, 0.772345f, 0.157937f, - 0.000000f, 0.982247f, -0.187593f, 0.000000f, 0.000000f, 0.982247f, -0.187593f, 0.762112f, 0.225709f, - -0.104529f, 0.994522f, 0.000000f, 0.000000f, -0.104529f, 0.994522f, 0.000000f, 0.790230f, 0.511757f, - 0.212032f, 0.964719f, 0.156077f, 0.000000f, 0.212032f, 0.964719f, 0.156077f, 0.683427f, 0.174918f, - 0.104529f, 0.994522f, 0.000000f, 0.000000f, 0.104529f, 0.994522f, 0.000000f, 0.772345f, 0.157937f, - 0.000000f, 0.987538f, 0.157379f, 0.000000f, 0.000000f, 0.987538f, 0.157379f, 0.734288f, 0.437019f, - -0.360730f, 0.793377f, -0.490334f, 0.000000f, -0.360730f, 0.793377f, -0.490334f, 0.790230f, 0.912551f, - -0.525731f, 0.723607f, -0.447214f, 0.000000f, -0.525731f, 0.723607f, -0.447214f, 0.446077f, 0.574219f, - -0.468576f, 0.828418f, -0.306855f, 0.000000f, -0.468576f, 0.828418f, -0.306855f, 0.668485f, 0.250116f, - -0.294309f, 0.891911f, -0.343331f, 0.000000f, -0.294309f, 0.891911f, -0.343331f, 0.868343f, 0.683427f, - -0.468576f, 0.828418f, -0.306855f, 0.000000f, -0.468576f, 0.828418f, -0.306855f, 0.668485f, 0.250116f, - -0.395510f, 0.905103f, -0.156077f, 0.000000f, -0.395510f, 0.905103f, -0.156077f, 0.590447f, 0.206107f, - -0.213834f, 0.959006f, -0.185961f, 0.000000f, -0.213834f, 0.959006f, -0.185961f, 0.834566f, 0.590447f, - -0.395510f, 0.905103f, -0.156077f, 0.000000f, -0.395510f, 0.905103f, -0.156077f, 0.590447f, 0.206107f, - -0.309017f, 0.951057f, 0.000000f, 0.000000f, -0.309017f, 0.951057f, 0.000000f, 0.590447f, 0.128428f, - -0.104529f, 0.994522f, 0.000000f, 0.000000f, -0.104529f, 0.994522f, 0.000000f, 0.790230f, 0.511757f, - -0.309017f, 0.951057f, 0.000000f, 0.000000f, -0.309017f, 0.951057f, 0.000000f, 0.590447f, 0.128428f, - -0.212031f, 0.964719f, 0.156077f, 0.000000f, -0.212031f, 0.964719f, 0.156077f, 0.512408f, 0.172078f, - 0.000000f, 0.987538f, 0.157379f, 0.000000f, 0.000000f, 0.987538f, 0.157379f, 0.734288f, 0.437019f, - -0.212031f, 0.964719f, 0.156077f, 0.000000f, -0.212031f, 0.964719f, 0.156077f, 0.512408f, 0.172078f, - -0.107846f, 0.945626f, 0.306855f, 0.000000f, -0.107846f, 0.945626f, 0.306855f, 0.869292f, 0.512408f, - 0.107846f, 0.945626f, 0.306855f, 0.000000f, 0.107846f, 0.945626f, 0.306855f, 0.743874f, 0.302609f, - -0.107846f, 0.945626f, 0.306855f, 0.000000f, -0.107846f, 0.945626f, 0.306855f, 0.869292f, 0.512408f, - 0.000000f, 0.894427f, 0.447214f, 0.000000f, 0.000000f, 0.894427f, 0.447214f, 0.268343f, 0.250971f, - -0.294309f, 0.891911f, -0.343331f, 0.000000f, -0.294309f, 0.891911f, -0.343331f, 0.868343f, 0.683427f, - -0.360730f, 0.793377f, -0.490334f, 0.000000f, -0.360730f, 0.793377f, -0.490334f, 0.790230f, 0.912551f, - -0.468576f, 0.828418f, -0.306855f, 0.000000f, -0.468576f, 0.828418f, -0.306855f, 0.668485f, 0.250116f, - -0.213834f, 0.959006f, -0.185961f, 0.000000f, -0.213834f, 0.959006f, -0.185961f, 0.834566f, 0.590447f, - -0.294309f, 0.891911f, -0.343331f, 0.000000f, -0.294309f, 0.891911f, -0.343331f, 0.868343f, 0.683427f, - -0.395510f, 0.905103f, -0.156077f, 0.000000f, -0.395510f, 0.905103f, -0.156077f, 0.590447f, 0.206107f, - -0.213834f, 0.959006f, -0.185961f, 0.000000f, -0.213834f, 0.959006f, -0.185961f, 0.834566f, 0.590447f, - -0.309017f, 0.951057f, 0.000000f, 0.000000f, -0.309017f, 0.951057f, 0.000000f, 0.590447f, 0.128428f, - -0.104529f, 0.994522f, 0.000000f, 0.000000f, -0.104529f, 0.994522f, 0.000000f, 0.790230f, 0.511757f, - -0.104529f, 0.994522f, 0.000000f, 0.000000f, -0.104529f, 0.994522f, 0.000000f, 0.790230f, 0.511757f, - -0.212031f, 0.964719f, 0.156077f, 0.000000f, -0.212031f, 0.964719f, 0.156077f, 0.512408f, 0.172078f, - 0.000000f, 0.987538f, 0.157379f, 0.000000f, 0.000000f, 0.987538f, 0.157379f, 0.734288f, 0.437019f, - 0.107846f, 0.945626f, 0.306855f, 0.000000f, 0.107846f, 0.945626f, 0.306855f, 0.743874f, 0.302609f, - 0.000000f, 0.987538f, 0.157379f, 0.000000f, 0.000000f, 0.987538f, 0.157379f, 0.734288f, 0.437019f, - -0.107846f, 0.945626f, 0.306855f, 0.000000f, -0.107846f, 0.945626f, 0.306855f, 0.869292f, 0.512408f, - -0.525731f, 0.723607f, -0.447214f, 0.000000f, -0.525731f, 0.723607f, -0.447214f, 0.446077f, 0.574219f, - -0.643075f, 0.588241f, -0.490334f, 0.000000f, -0.643075f, 0.588241f, -0.490334f, 0.680365f, 0.835614f, - -0.643075f, 0.701637f, -0.306855f, 0.000000f, -0.643075f, 0.701637f, -0.306855f, 0.821537f, 0.437019f, - -0.643075f, 0.588241f, -0.490334f, 0.000000f, -0.643075f, 0.588241f, -0.490334f, 0.680365f, 0.835614f, - -0.738585f, 0.432902f, -0.516806f, 0.000000f, -0.738585f, 0.432902f, -0.516806f, 0.647155f, 0.912551f, - -0.757311f, 0.555521f, -0.343331f, 0.000000f, -0.757311f, 0.555521f, -0.343331f, 0.743874f, 0.405176f, - -0.643075f, 0.701637f, -0.306855f, 0.000000f, -0.643075f, 0.701637f, -0.306855f, 0.821537f, 0.437019f, - -0.757311f, 0.555521f, -0.343331f, 0.000000f, -0.757311f, 0.555521f, -0.343331f, 0.743874f, 0.405176f, - -0.738585f, 0.655845f, -0.156077f, 0.000000f, -0.738585f, 0.655845f, -0.156077f, 0.762112f, 0.497855f, - -0.643075f, 0.588241f, -0.490334f, 0.000000f, -0.643075f, 0.588241f, -0.490334f, 0.680365f, 0.835614f, - -0.757311f, 0.555521f, -0.343331f, 0.000000f, -0.757311f, 0.555521f, -0.343331f, 0.743874f, 0.405176f, - -0.643075f, 0.701637f, -0.306855f, 0.000000f, -0.643075f, 0.701637f, -0.306855f, 0.821537f, 0.437019f, - -0.738585f, 0.432902f, -0.516806f, 0.000000f, -0.738585f, 0.432902f, -0.516806f, 0.647155f, 0.912551f, - -0.809017f, 0.262866f, -0.525731f, 0.000000f, -0.809017f, 0.262866f, -0.525731f, 0.591739f, 0.848850f, - -0.845991f, 0.389810f, -0.363797f, 0.000000f, -0.845991f, 0.389810f, -0.363797f, 0.668485f, 0.451770f, - -0.757311f, 0.555521f, -0.343331f, 0.000000f, -0.757311f, 0.555521f, -0.343331f, 0.743874f, 0.405176f, - -0.845991f, 0.389810f, -0.363797f, 0.000000f, -0.845991f, 0.389810f, -0.363797f, 0.668485f, 0.451770f, - -0.845991f, 0.499718f, -0.185961f, 0.000000f, -0.845991f, 0.499718f, -0.185961f, 0.772345f, 0.590949f, - -0.738585f, 0.655845f, -0.156077f, 0.000000f, -0.738585f, 0.655845f, -0.156077f, 0.762112f, 0.497855f, - -0.845991f, 0.499718f, -0.185961f, 0.000000f, -0.845991f, 0.499718f, -0.185961f, 0.772345f, 0.590949f, - -0.809017f, 0.587785f, 0.000000f, 0.000000f, -0.809017f, 0.587785f, 0.000000f, 0.683427f, 0.546490f, - -0.738585f, 0.432902f, -0.516806f, 0.000000f, -0.738585f, 0.432902f, -0.516806f, 0.647155f, 0.912551f, - -0.845991f, 0.389810f, -0.363797f, 0.000000f, -0.845991f, 0.389810f, -0.363797f, 0.668485f, 0.451770f, - -0.757311f, 0.555521f, -0.343331f, 0.000000f, -0.757311f, 0.555521f, -0.343331f, 0.743874f, 0.405176f, - -0.757311f, 0.555521f, -0.343331f, 0.000000f, -0.757311f, 0.555521f, -0.343331f, 0.743874f, 0.405176f, - -0.845991f, 0.499718f, -0.185961f, 0.000000f, -0.845991f, 0.499718f, -0.185961f, 0.772345f, 0.590949f, - -0.738585f, 0.655845f, -0.156077f, 0.000000f, -0.738585f, 0.655845f, -0.156077f, 0.762112f, 0.497855f, - -0.809017f, 0.262866f, -0.525731f, 0.000000f, -0.809017f, 0.262866f, -0.525731f, 0.591739f, 0.848850f, - -0.851981f, 0.083904f, -0.516806f, 0.000000f, -0.851981f, 0.083904f, -0.516806f, 0.554653f, 0.922791f, - -0.913545f, 0.181899f, -0.363797f, 0.000000f, -0.913545f, 0.181899f, -0.363797f, 0.590447f, 0.500000f, - -0.845991f, 0.389810f, -0.363797f, 0.000000f, -0.845991f, 0.389810f, -0.363797f, 0.668485f, 0.451770f, - -0.913545f, 0.181899f, -0.363797f, 0.000000f, -0.913545f, 0.181899f, -0.363797f, 0.590447f, 0.500000f, - -0.934172f, 0.303531f, -0.187593f, 0.000000f, -0.934172f, 0.303531f, -0.187593f, 0.772345f, 0.694905f, - -0.845991f, 0.499718f, -0.185961f, 0.000000f, -0.845991f, 0.499718f, -0.185961f, 0.772345f, 0.590949f, - -0.934172f, 0.303531f, -0.187593f, 0.000000f, -0.934172f, 0.303531f, -0.187593f, 0.772345f, 0.694905f, - -0.913545f, 0.406737f, 0.000000f, 0.000000f, -0.913545f, 0.406737f, 0.000000f, 0.684243f, 0.651765f, - -0.809017f, 0.587785f, 0.000000f, 0.000000f, -0.809017f, 0.587785f, 0.000000f, 0.683427f, 0.546490f, - -0.913545f, 0.406737f, 0.000000f, 0.000000f, -0.913545f, 0.406737f, 0.000000f, 0.684243f, 0.651765f, - -0.851981f, 0.499769f, 0.156077f, 0.000000f, -0.851981f, 0.499769f, 0.156077f, 0.590447f, 0.603956f, - -0.809017f, 0.262866f, -0.525731f, 0.000000f, -0.809017f, 0.262866f, -0.525731f, 0.591739f, 0.848850f, - -0.913545f, 0.181899f, -0.363797f, 0.000000f, -0.913545f, 0.181899f, -0.363797f, 0.590447f, 0.500000f, - -0.845991f, 0.389810f, -0.363797f, 0.000000f, -0.845991f, 0.389810f, -0.363797f, 0.668485f, 0.451770f, - -0.845991f, 0.389810f, -0.363797f, 0.000000f, -0.845991f, 0.389810f, -0.363797f, 0.668485f, 0.451770f, - -0.934172f, 0.303531f, -0.187593f, 0.000000f, -0.934172f, 0.303531f, -0.187593f, 0.772345f, 0.694905f, - -0.845991f, 0.499718f, -0.185961f, 0.000000f, -0.845991f, 0.499718f, -0.185961f, 0.772345f, 0.590949f, - -0.845991f, 0.499718f, -0.185961f, 0.000000f, -0.845991f, 0.499718f, -0.185961f, 0.772345f, 0.590949f, - -0.913545f, 0.406737f, 0.000000f, 0.000000f, -0.913545f, 0.406737f, 0.000000f, 0.684243f, 0.651765f, - -0.809017f, 0.587785f, 0.000000f, 0.000000f, -0.809017f, 0.587785f, 0.000000f, 0.683427f, 0.546490f, - -0.851981f, 0.083904f, -0.516806f, 0.000000f, -0.851981f, 0.083904f, -0.516806f, 0.554653f, 0.922791f, - -0.866018f, -0.097907f, -0.490334f, 0.000000f, -0.866018f, -0.097907f, -0.490334f, 0.500000f, 0.853312f, - -0.939205f, -0.004289f, -0.343331f, 0.000000f, -0.939205f, -0.004289f, -0.343331f, 0.512408f, 0.548230f, - -0.913545f, 0.181899f, -0.363797f, 0.000000f, -0.913545f, 0.181899f, -0.363797f, 0.590447f, 0.500000f, - -0.939205f, -0.004289f, -0.343331f, 0.000000f, -0.939205f, -0.004289f, -0.343331f, 0.512408f, 0.548230f, - -0.978148f, 0.092981f, -0.185961f, 0.000000f, -0.978148f, 0.092981f, -0.185961f, 0.762112f, 0.777761f, - -0.934172f, 0.303531f, -0.187593f, 0.000000f, -0.934172f, 0.303531f, -0.187593f, 0.772345f, 0.694905f, - -0.978148f, 0.092981f, -0.185961f, 0.000000f, -0.978148f, 0.092981f, -0.185961f, 0.762112f, 0.777761f, - -0.978148f, 0.207911f, 0.000000f, 0.000000f, -0.978148f, 0.207911f, 0.000000f, 0.683427f, 0.749859f, - -0.913545f, 0.406737f, 0.000000f, 0.000000f, -0.913545f, 0.406737f, 0.000000f, 0.684243f, 0.651765f, - -0.978148f, 0.207911f, 0.000000f, 0.000000f, -0.978148f, 0.207911f, 0.000000f, 0.683427f, 0.749859f, - -0.939205f, 0.305166f, 0.157379f, 0.000000f, -0.939205f, 0.305166f, 0.157379f, 0.590447f, 0.703368f, - -0.851981f, 0.499769f, 0.156077f, 0.000000f, -0.851981f, 0.499769f, 0.156077f, 0.590447f, 0.603956f, - -0.939205f, 0.305166f, 0.157379f, 0.000000f, -0.939205f, 0.305166f, 0.157379f, 0.590447f, 0.703368f, - -0.866018f, 0.394783f, 0.306855f, 0.000000f, -0.866018f, 0.394783f, 0.306855f, 0.511757f, 0.652583f, - -0.913545f, 0.181899f, -0.363797f, 0.000000f, -0.913545f, 0.181899f, -0.363797f, 0.590447f, 0.500000f, - -0.851981f, 0.083904f, -0.516806f, 0.000000f, -0.851981f, 0.083904f, -0.516806f, 0.554653f, 0.922791f, - -0.939205f, -0.004289f, -0.343331f, 0.000000f, -0.939205f, -0.004289f, -0.343331f, 0.512408f, 0.548230f, - -0.934172f, 0.303531f, -0.187593f, 0.000000f, -0.934172f, 0.303531f, -0.187593f, 0.772345f, 0.694905f, - -0.913545f, 0.181899f, -0.363797f, 0.000000f, -0.913545f, 0.181899f, -0.363797f, 0.590447f, 0.500000f, - -0.978148f, 0.092981f, -0.185961f, 0.000000f, -0.978148f, 0.092981f, -0.185961f, 0.762112f, 0.777761f, - -0.934172f, 0.303531f, -0.187593f, 0.000000f, -0.934172f, 0.303531f, -0.187593f, 0.772345f, 0.694905f, - -0.978148f, 0.207911f, 0.000000f, 0.000000f, -0.978148f, 0.207911f, 0.000000f, 0.683427f, 0.749859f, - -0.913545f, 0.406737f, 0.000000f, 0.000000f, -0.913545f, 0.406737f, 0.000000f, 0.684243f, 0.651765f, - -0.851981f, 0.499769f, 0.156077f, 0.000000f, -0.851981f, 0.499769f, 0.156077f, 0.590447f, 0.603956f, - -0.913545f, 0.406737f, 0.000000f, 0.000000f, -0.913545f, 0.406737f, 0.000000f, 0.684243f, 0.651765f, - -0.939205f, 0.305166f, 0.157379f, 0.000000f, -0.939205f, 0.305166f, 0.157379f, 0.590447f, 0.703368f, - -0.866018f, -0.097907f, -0.490334f, 0.000000f, -0.866018f, -0.097907f, -0.490334f, 0.500000f, 0.853312f, - -0.850651f, -0.276393f, -0.447214f, 0.000000f, -0.850651f, -0.276393f, -0.447214f, 0.445347f, 0.922791f, - -0.932670f, -0.189647f, -0.306855f, 0.000000f, -0.932670f, -0.189647f, -0.306855f, 0.437019f, 0.594823f, - -0.939205f, -0.004289f, -0.343331f, 0.000000f, -0.939205f, -0.004289f, -0.343331f, 0.512408f, 0.548230f, - -0.932670f, -0.189647f, -0.306855f, 0.000000f, -0.932670f, -0.189647f, -0.306855f, 0.437019f, 0.594823f, - -0.983024f, -0.096460f, -0.156077f, 0.000000f, -0.983024f, -0.096460f, -0.156077f, 0.821537f, 0.743874f, - -0.978148f, 0.092981f, -0.185961f, 0.000000f, -0.978148f, 0.092981f, -0.185961f, 0.762112f, 0.777761f, - -0.983024f, -0.096460f, -0.156077f, 0.000000f, -0.983024f, -0.096460f, -0.156077f, 0.821537f, 0.743874f, - -1.000000f, 0.000000f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 0.743874f, 0.850819f, - -0.978148f, 0.207911f, 0.000000f, 0.000000f, -0.978148f, 0.207911f, 0.000000f, 0.683427f, 0.749859f, - -1.000000f, 0.000000f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 0.743874f, 0.850819f, - -0.983024f, 0.096461f, 0.156077f, 0.000000f, -0.983024f, 0.096461f, 0.156077f, 0.668485f, 0.827922f, - -0.939205f, 0.305166f, 0.157379f, 0.000000f, -0.939205f, 0.305166f, 0.157379f, 0.590447f, 0.703368f, - -0.983024f, 0.096461f, 0.156077f, 0.000000f, -0.983024f, 0.096461f, 0.156077f, 0.668485f, 0.827922f, - -0.932670f, 0.189647f, 0.306855f, 0.000000f, -0.932670f, 0.189647f, 0.306855f, 0.590447f, 0.793893f, - -0.866018f, 0.394783f, 0.306855f, 0.000000f, -0.866018f, 0.394783f, 0.306855f, 0.511757f, 0.652583f, - -0.932670f, 0.189647f, 0.306855f, 0.000000f, -0.932670f, 0.189647f, 0.306855f, 0.590447f, 0.793893f, - -0.850651f, 0.276393f, 0.447214f, 0.000000f, -0.850651f, 0.276393f, 0.447214f, 0.588426f, 0.872062f, - -0.939205f, -0.004289f, -0.343331f, 0.000000f, -0.939205f, -0.004289f, -0.343331f, 0.512408f, 0.548230f, - -0.866018f, -0.097907f, -0.490334f, 0.000000f, -0.866018f, -0.097907f, -0.490334f, 0.500000f, 0.853312f, - -0.932670f, -0.189647f, -0.306855f, 0.000000f, -0.932670f, -0.189647f, -0.306855f, 0.437019f, 0.594823f, - -0.978148f, 0.092981f, -0.185961f, 0.000000f, -0.978148f, 0.092981f, -0.185961f, 0.762112f, 0.777761f, - -0.939205f, -0.004289f, -0.343331f, 0.000000f, -0.939205f, -0.004289f, -0.343331f, 0.512408f, 0.548230f, - -0.983024f, -0.096460f, -0.156077f, 0.000000f, -0.983024f, -0.096460f, -0.156077f, 0.821537f, 0.743874f, - -0.978148f, 0.092981f, -0.185961f, 0.000000f, -0.978148f, 0.092981f, -0.185961f, 0.762112f, 0.777761f, - -1.000000f, 0.000000f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 0.743874f, 0.850819f, - -0.978148f, 0.207911f, 0.000000f, 0.000000f, -0.978148f, 0.207911f, 0.000000f, 0.683427f, 0.749859f, - -0.978148f, 0.207911f, 0.000000f, 0.000000f, -0.978148f, 0.207911f, 0.000000f, 0.683427f, 0.749859f, - -0.983024f, 0.096461f, 0.156077f, 0.000000f, -0.983024f, 0.096461f, 0.156077f, 0.668485f, 0.827922f, - -0.939205f, 0.305166f, 0.157379f, 0.000000f, -0.939205f, 0.305166f, 0.157379f, 0.590447f, 0.703368f, - -0.939205f, 0.305166f, 0.157379f, 0.000000f, -0.939205f, 0.305166f, 0.157379f, 0.590447f, 0.703368f, - -0.932670f, 0.189647f, 0.306855f, 0.000000f, -0.932670f, 0.189647f, 0.306855f, 0.590447f, 0.793893f, - -0.866018f, 0.394783f, 0.306855f, 0.000000f, -0.866018f, 0.394783f, 0.306855f, 0.511757f, 0.652583f, - -0.850651f, -0.276393f, -0.447214f, 0.000000f, -0.850651f, -0.276393f, -0.447214f, 0.445347f, 0.922791f, - -0.758172f, -0.429824f, -0.490334f, 0.000000f, -0.758172f, -0.429824f, -0.490334f, 0.178463f, 0.835614f, - -0.866018f, -0.394782f, -0.306855f, 0.000000f, -0.866018f, -0.394782f, -0.306855f, 0.512408f, 0.749884f, - -0.758172f, -0.429824f, -0.490334f, 0.000000f, -0.758172f, -0.429824f, -0.490334f, 0.178463f, 0.835614f, - -0.639949f, -0.568662f, -0.516806f, 0.000000f, -0.639949f, -0.568662f, -0.516806f, 0.118823f, 0.469124f, - -0.762354f, -0.548581f, -0.343331f, 0.000000f, -0.762354f, -0.548581f, -0.343331f, 0.437019f, 0.697391f, - -0.866018f, -0.394782f, -0.306855f, 0.000000f, -0.866018f, -0.394782f, -0.306855f, 0.512408f, 0.749884f, - -0.762354f, -0.548581f, -0.343331f, 0.000000f, -0.762354f, -0.548581f, -0.343331f, 0.437019f, 0.697391f, - -0.851981f, -0.499768f, -0.156077f, 0.000000f, -0.851981f, -0.499768f, -0.156077f, 0.734288f, 0.743874f, - -0.758172f, -0.429824f, -0.490334f, 0.000000f, -0.758172f, -0.429824f, -0.490334f, 0.178463f, 0.835614f, - -0.762354f, -0.548581f, -0.343331f, 0.000000f, -0.762354f, -0.548581f, -0.343331f, 0.437019f, 0.697391f, - -0.866018f, -0.394782f, -0.306855f, 0.000000f, -0.866018f, -0.394782f, -0.306855f, 0.512408f, 0.749884f, - -0.639949f, -0.568662f, -0.516806f, 0.000000f, -0.639949f, -0.568662f, -0.516806f, 0.118823f, 0.469124f, - -0.500000f, -0.688191f, -0.525731f, 0.000000f, -0.500000f, -0.688191f, -0.525731f, 0.209770f, 0.749029f, - -0.632156f, -0.684127f, -0.363797f, 0.000000f, -0.632156f, -0.684127f, -0.363797f, 0.647155f, 0.762112f, - -0.762354f, -0.548581f, -0.343331f, 0.000000f, -0.762354f, -0.548581f, -0.343331f, 0.437019f, 0.697391f, - -0.632156f, -0.684127f, -0.363797f, 0.000000f, -0.632156f, -0.684127f, -0.363797f, 0.647155f, 0.762112f, - -0.736686f, -0.650164f, -0.185961f, 0.000000f, -0.736686f, -0.650164f, -0.185961f, 0.697756f, 0.668485f, - -0.851981f, -0.499768f, -0.156077f, 0.000000f, -0.851981f, -0.499768f, -0.156077f, 0.734288f, 0.743874f, - -0.736686f, -0.650164f, -0.185961f, 0.000000f, -0.736686f, -0.650164f, -0.185961f, 0.697756f, 0.668485f, - -0.809017f, -0.587785f, 0.000000f, 0.000000f, -0.809017f, -0.587785f, 0.000000f, 0.554653f, 0.772345f, - -0.639949f, -0.568662f, -0.516806f, 0.000000f, -0.639949f, -0.568662f, -0.516806f, 0.118823f, 0.469124f, - -0.632156f, -0.684127f, -0.363797f, 0.000000f, -0.632156f, -0.684127f, -0.363797f, 0.647155f, 0.762112f, - -0.762354f, -0.548581f, -0.343331f, 0.000000f, -0.762354f, -0.548581f, -0.343331f, 0.437019f, 0.697391f, - -0.762354f, -0.548581f, -0.343331f, 0.000000f, -0.762354f, -0.548581f, -0.343331f, 0.437019f, 0.697391f, - -0.736686f, -0.650164f, -0.185961f, 0.000000f, -0.736686f, -0.650164f, -0.185961f, 0.697756f, 0.668485f, - -0.851981f, -0.499768f, -0.156077f, 0.000000f, -0.851981f, -0.499768f, -0.156077f, 0.734288f, 0.743874f, - -0.500000f, -0.688191f, -0.525731f, 0.000000f, -0.500000f, -0.688191f, -0.525731f, 0.209770f, 0.749029f, - -0.343074f, -0.784354f, -0.516806f, 0.000000f, -0.343074f, -0.784354f, -0.516806f, 0.165435f, 0.666172f, - -0.455297f, -0.812623f, -0.363797f, 0.000000f, -0.455297f, -0.812623f, -0.363797f, 0.606918f, 0.683427f, - -0.632156f, -0.684127f, -0.363797f, 0.000000f, -0.632156f, -0.684127f, -0.363797f, 0.647155f, 0.762112f, - -0.455297f, -0.812623f, -0.363797f, 0.000000f, -0.455297f, -0.812623f, -0.363797f, 0.606918f, 0.683427f, - -0.577350f, -0.794654f, -0.187593f, 0.000000f, -0.577350f, -0.794654f, -0.187593f, 0.445347f, 0.772345f, - -0.736686f, -0.650164f, -0.185961f, 0.000000f, -0.736686f, -0.650164f, -0.185961f, 0.697756f, 0.668485f, - -0.577350f, -0.794654f, -0.187593f, 0.000000f, -0.577350f, -0.794654f, -0.187593f, 0.445347f, 0.772345f, - -0.669131f, -0.743144f, 0.000000f, 0.000000f, -0.669131f, -0.743144f, 0.000000f, 0.500000f, 0.684243f, - -0.809017f, -0.587785f, 0.000000f, 0.000000f, -0.809017f, -0.587785f, 0.000000f, 0.554653f, 0.772345f, - -0.669131f, -0.743144f, 0.000000f, 0.000000f, -0.669131f, -0.743144f, 0.000000f, 0.500000f, 0.684243f, - -0.738585f, -0.655845f, 0.156077f, 0.000000f, -0.738585f, -0.655845f, 0.156077f, 0.552265f, 0.590447f, - -0.500000f, -0.688191f, -0.525731f, 0.000000f, -0.500000f, -0.688191f, -0.525731f, 0.209770f, 0.749029f, - -0.455297f, -0.812623f, -0.363797f, 0.000000f, -0.455297f, -0.812623f, -0.363797f, 0.606918f, 0.683427f, - -0.632156f, -0.684127f, -0.363797f, 0.000000f, -0.632156f, -0.684127f, -0.363797f, 0.647155f, 0.762112f, - -0.632156f, -0.684127f, -0.363797f, 0.000000f, -0.632156f, -0.684127f, -0.363797f, 0.647155f, 0.762112f, - -0.577350f, -0.794654f, -0.187593f, 0.000000f, -0.577350f, -0.794654f, -0.187593f, 0.445347f, 0.772345f, - -0.736686f, -0.650164f, -0.185961f, 0.000000f, -0.736686f, -0.650164f, -0.185961f, 0.697756f, 0.668485f, - -0.736686f, -0.650164f, -0.185961f, 0.000000f, -0.736686f, -0.650164f, -0.185961f, 0.697756f, 0.668485f, - -0.669131f, -0.743144f, 0.000000f, 0.000000f, -0.669131f, -0.743144f, 0.000000f, 0.500000f, 0.684243f, - -0.809017f, -0.587785f, 0.000000f, 0.000000f, -0.809017f, -0.587785f, 0.000000f, 0.554653f, 0.772345f, - -0.343074f, -0.784354f, -0.516806f, 0.000000f, -0.343074f, -0.784354f, -0.516806f, 0.165435f, 0.666172f, - -0.174499f, -0.853887f, -0.490334f, 0.000000f, -0.174499f, -0.853887f, -0.490334f, 0.131658f, 0.562217f, - -0.286151f, -0.894562f, -0.343331f, 0.000000f, -0.286151f, -0.894562f, -0.343331f, 0.606016f, 0.512408f, - -0.455297f, -0.812623f, -0.363797f, 0.000000f, -0.455297f, -0.812623f, -0.363797f, 0.606918f, 0.683427f, - -0.286151f, -0.894562f, -0.343331f, 0.000000f, -0.286151f, -0.894562f, -0.343331f, 0.606016f, 0.512408f, - -0.390694f, -0.901541f, -0.185961f, 0.000000f, -0.390694f, -0.901541f, -0.185961f, 0.352845f, 0.762112f, - -0.577350f, -0.794654f, -0.187593f, 0.000000f, -0.577350f, -0.794654f, -0.187593f, 0.445347f, 0.772345f, - -0.390694f, -0.901541f, -0.185961f, 0.000000f, -0.390694f, -0.901541f, -0.185961f, 0.352845f, 0.762112f, - -0.499999f, -0.866026f, 0.000000f, 0.000000f, -0.499999f, -0.866026f, 0.000000f, 0.393083f, 0.683427f, - -0.669131f, -0.743144f, 0.000000f, 0.000000f, -0.669131f, -0.743144f, 0.000000f, 0.500000f, 0.684243f, - -0.499999f, -0.866026f, 0.000000f, 0.000000f, -0.499999f, -0.866026f, 0.000000f, 0.393083f, 0.683427f, - -0.580461f, -0.798935f, 0.157379f, 0.000000f, -0.580461f, -0.798935f, 0.157379f, 0.447735f, 0.590447f, - -0.738585f, -0.655845f, 0.156077f, 0.000000f, -0.738585f, -0.655845f, 0.156077f, 0.552265f, 0.590447f, - -0.580461f, -0.798935f, 0.157379f, 0.000000f, -0.580461f, -0.798935f, 0.157379f, 0.447735f, 0.590447f, - -0.643075f, -0.701637f, 0.306855f, 0.000000f, -0.643075f, -0.701637f, 0.306855f, 0.500000f, 0.511757f, - -0.455297f, -0.812623f, -0.363797f, 0.000000f, -0.455297f, -0.812623f, -0.363797f, 0.606918f, 0.683427f, - -0.343074f, -0.784354f, -0.516806f, 0.000000f, -0.343074f, -0.784354f, -0.516806f, 0.165435f, 0.666172f, - -0.286151f, -0.894562f, -0.343331f, 0.000000f, -0.286151f, -0.894562f, -0.343331f, 0.606016f, 0.512408f, - -0.577350f, -0.794654f, -0.187593f, 0.000000f, -0.577350f, -0.794654f, -0.187593f, 0.445347f, 0.772345f, - -0.455297f, -0.812623f, -0.363797f, 0.000000f, -0.455297f, -0.812623f, -0.363797f, 0.606918f, 0.683427f, - -0.390694f, -0.901541f, -0.185961f, 0.000000f, -0.390694f, -0.901541f, -0.185961f, 0.352845f, 0.762112f, - -0.577350f, -0.794654f, -0.187593f, 0.000000f, -0.577350f, -0.794654f, -0.187593f, 0.445347f, 0.772345f, - -0.499999f, -0.866026f, 0.000000f, 0.000000f, -0.499999f, -0.866026f, 0.000000f, 0.393083f, 0.683427f, - -0.669131f, -0.743144f, 0.000000f, 0.000000f, -0.669131f, -0.743144f, 0.000000f, 0.500000f, 0.684243f, - -0.738585f, -0.655845f, 0.156077f, 0.000000f, -0.738585f, -0.655845f, 0.156077f, 0.552265f, 0.590447f, - -0.669131f, -0.743144f, 0.000000f, 0.000000f, -0.669131f, -0.743144f, 0.000000f, 0.500000f, 0.684243f, - -0.580461f, -0.798935f, 0.157379f, 0.000000f, -0.580461f, -0.798935f, 0.157379f, 0.447735f, 0.590447f, - -0.174499f, -0.853887f, -0.490334f, 0.000000f, -0.174499f, -0.853887f, -0.490334f, 0.131658f, 0.562217f, - 0.000000f, -0.894427f, -0.447214f, 0.000000f, 0.000000f, -0.894427f, -0.447214f, 0.848850f, 0.215669f, - -0.107846f, -0.945626f, -0.306855f, 0.000000f, -0.107846f, -0.945626f, -0.306855f, 0.553923f, 0.437019f, - -0.286151f, -0.894562f, -0.343331f, 0.000000f, -0.286151f, -0.894562f, -0.343331f, 0.606016f, 0.512408f, - -0.107846f, -0.945626f, -0.306855f, 0.000000f, -0.107846f, -0.945626f, -0.306855f, 0.553923f, 0.437019f, - -0.212032f, -0.964719f, -0.156077f, 0.000000f, -0.212032f, -0.964719f, -0.156077f, 0.265712f, 0.743874f, - -0.390694f, -0.901541f, -0.185961f, 0.000000f, -0.390694f, -0.901541f, -0.185961f, 0.352845f, 0.762112f, - -0.212032f, -0.964719f, -0.156077f, 0.000000f, -0.212032f, -0.964719f, -0.156077f, 0.265712f, 0.743874f, - -0.309017f, -0.951056f, 0.000000f, 0.000000f, -0.309017f, -0.951056f, 0.000000f, 0.302245f, 0.668485f, - -0.499999f, -0.866026f, 0.000000f, 0.000000f, -0.499999f, -0.866026f, 0.000000f, 0.393083f, 0.683427f, - -0.309017f, -0.951056f, 0.000000f, 0.000000f, -0.309017f, -0.951056f, 0.000000f, 0.302245f, 0.668485f, - -0.395511f, -0.905103f, 0.156077f, 0.000000f, -0.395511f, -0.905103f, 0.156077f, 0.345491f, 0.590447f, - -0.580461f, -0.798935f, 0.157379f, 0.000000f, -0.580461f, -0.798935f, 0.157379f, 0.447735f, 0.590447f, - -0.395511f, -0.905103f, 0.156077f, 0.000000f, -0.395511f, -0.905103f, 0.156077f, 0.345491f, 0.590447f, - -0.468576f, -0.828418f, 0.306855f, 0.000000f, -0.468576f, -0.828418f, 0.306855f, 0.393984f, 0.512408f, - -0.643075f, -0.701637f, 0.306855f, 0.000000f, -0.643075f, -0.701637f, 0.306855f, 0.500000f, 0.511757f, - -0.468576f, -0.828418f, 0.306855f, 0.000000f, -0.468576f, -0.828418f, 0.306855f, 0.393984f, 0.512408f, - -0.525731f, -0.723607f, 0.447214f, 0.000000f, -0.525731f, -0.723607f, 0.447214f, 0.321589f, 0.745561f, - -0.286151f, -0.894562f, -0.343331f, 0.000000f, -0.286151f, -0.894562f, -0.343331f, 0.606016f, 0.512408f, - -0.174499f, -0.853887f, -0.490334f, 0.000000f, -0.174499f, -0.853887f, -0.490334f, 0.131658f, 0.562217f, - -0.107846f, -0.945626f, -0.306855f, 0.000000f, -0.107846f, -0.945626f, -0.306855f, 0.553923f, 0.437019f, - -0.390694f, -0.901541f, -0.185961f, 0.000000f, -0.390694f, -0.901541f, -0.185961f, 0.352845f, 0.762112f, - -0.286151f, -0.894562f, -0.343331f, 0.000000f, -0.286151f, -0.894562f, -0.343331f, 0.606016f, 0.512408f, - -0.212032f, -0.964719f, -0.156077f, 0.000000f, -0.212032f, -0.964719f, -0.156077f, 0.265712f, 0.743874f, - -0.390694f, -0.901541f, -0.185961f, 0.000000f, -0.390694f, -0.901541f, -0.185961f, 0.352845f, 0.762112f, - -0.309017f, -0.951056f, 0.000000f, 0.000000f, -0.309017f, -0.951056f, 0.000000f, 0.302245f, 0.668485f, - -0.499999f, -0.866026f, 0.000000f, 0.000000f, -0.499999f, -0.866026f, 0.000000f, 0.393083f, 0.683427f, - -0.499999f, -0.866026f, 0.000000f, 0.000000f, -0.499999f, -0.866026f, 0.000000f, 0.393083f, 0.683427f, - -0.395511f, -0.905103f, 0.156077f, 0.000000f, -0.395511f, -0.905103f, 0.156077f, 0.345491f, 0.590447f, - -0.580461f, -0.798935f, 0.157379f, 0.000000f, -0.580461f, -0.798935f, 0.157379f, 0.447735f, 0.590447f, - -0.580461f, -0.798935f, 0.157379f, 0.000000f, -0.580461f, -0.798935f, 0.157379f, 0.447735f, 0.590447f, - -0.468576f, -0.828418f, 0.306855f, 0.000000f, -0.468576f, -0.828418f, 0.306855f, 0.393984f, 0.512408f, - -0.643075f, -0.701637f, 0.306855f, 0.000000f, -0.643075f, -0.701637f, 0.306855f, 0.500000f, 0.511757f, - 0.932670f, 0.189647f, 0.306855f, 0.000000f, 0.932670f, 0.189647f, 0.306855f, 0.554653f, 0.258102f, - 0.850651f, 0.276393f, 0.447214f, 0.000000f, 0.850651f, 0.276393f, 0.447214f, 0.750000f, 0.581230f, - 0.866018f, 0.097907f, 0.490334f, 0.000000f, 0.866018f, 0.097907f, 0.490334f, 0.727648f, 0.480987f, - 0.939205f, 0.004289f, 0.343331f, 0.000000f, 0.939205f, 0.004289f, 0.343331f, 0.446077f, 0.437019f, - 0.866018f, 0.097907f, 0.490334f, 0.000000f, 0.866018f, 0.097907f, 0.490334f, 0.727648f, 0.480987f, - 0.851981f, -0.083904f, 0.516806f, 0.000000f, 0.851981f, -0.083904f, 0.516806f, 0.695347f, 0.381573f, - 0.983024f, 0.096460f, 0.156077f, 0.000000f, 0.983024f, 0.096460f, 0.156077f, 0.408260f, 0.332044f, - 0.932670f, 0.189647f, 0.306855f, 0.000000f, 0.932670f, 0.189647f, 0.306855f, 0.554653f, 0.258102f, - 0.939205f, 0.004289f, 0.343331f, 0.000000f, 0.939205f, 0.004289f, 0.343331f, 0.446077f, 0.437019f, - 0.939205f, 0.004289f, 0.343331f, 0.000000f, 0.939205f, 0.004289f, 0.343331f, 0.446077f, 0.437019f, - 0.932670f, 0.189647f, 0.306855f, 0.000000f, 0.932670f, 0.189647f, 0.306855f, 0.554653f, 0.258102f, - 0.866018f, 0.097907f, 0.490334f, 0.000000f, 0.866018f, 0.097907f, 0.490334f, 0.727648f, 0.480987f, - 0.913545f, -0.181898f, 0.363797f, 0.000000f, 0.913545f, -0.181898f, 0.363797f, 0.178463f, 0.743874f, - 0.851981f, -0.083904f, 0.516806f, 0.000000f, 0.851981f, -0.083904f, 0.516806f, 0.695347f, 0.381573f, - 0.809017f, -0.262866f, 0.525731f, 0.000000f, 0.809017f, -0.262866f, 0.525731f, 0.654508f, 0.287337f, - 0.978148f, -0.092981f, 0.185961f, 0.000000f, 0.978148f, -0.092981f, 0.185961f, 0.437019f, 0.697392f, - 0.939205f, 0.004289f, 0.343331f, 0.000000f, 0.939205f, 0.004289f, 0.343331f, 0.446077f, 0.437019f, - 0.913545f, -0.181898f, 0.363797f, 0.000000f, 0.913545f, -0.181898f, 0.363797f, 0.178463f, 0.743874f, - 1.000000f, -0.000000f, 0.000000f, 0.000000f, 1.000000f, -0.000000f, 0.000000f, 0.445347f, 0.130459f, - 0.983024f, 0.096460f, 0.156077f, 0.000000f, 0.983024f, 0.096460f, 0.156077f, 0.408260f, 0.332044f, - 0.978148f, -0.092981f, 0.185961f, 0.000000f, 0.978148f, -0.092981f, 0.185961f, 0.437019f, 0.697392f, - 0.913545f, -0.181898f, 0.363797f, 0.000000f, 0.913545f, -0.181898f, 0.363797f, 0.178463f, 0.743874f, - 0.939205f, 0.004289f, 0.343331f, 0.000000f, 0.939205f, 0.004289f, 0.343331f, 0.446077f, 0.437019f, - 0.851981f, -0.083904f, 0.516806f, 0.000000f, 0.851981f, -0.083904f, 0.516806f, 0.695347f, 0.381573f, - 0.978148f, -0.092981f, 0.185961f, 0.000000f, 0.978148f, -0.092981f, 0.185961f, 0.437019f, 0.697392f, - 0.983024f, 0.096460f, 0.156077f, 0.000000f, 0.983024f, 0.096460f, 0.156077f, 0.408260f, 0.332044f, - 0.939205f, 0.004289f, 0.343331f, 0.000000f, 0.939205f, 0.004289f, 0.343331f, 0.446077f, 0.437019f, - 0.738585f, -0.432902f, 0.516806f, 0.000000f, 0.738585f, -0.432902f, 0.516806f, 0.671537f, 0.555736f, - 0.845991f, -0.389809f, 0.363797f, 0.000000f, 0.845991f, -0.389809f, 0.363797f, 0.183922f, 0.772345f, - 0.809017f, -0.262866f, 0.525731f, 0.000000f, 0.809017f, -0.262866f, 0.525731f, 0.654508f, 0.287337f, - 0.845991f, -0.389809f, 0.363797f, 0.000000f, 0.845991f, -0.389809f, 0.363797f, 0.183922f, 0.772345f, - 0.934172f, -0.303531f, 0.187593f, 0.000000f, 0.934172f, -0.303531f, 0.187593f, 0.272352f, 0.772345f, - 0.913545f, -0.181898f, 0.363797f, 0.000000f, 0.913545f, -0.181898f, 0.363797f, 0.178463f, 0.743874f, - 0.978148f, -0.207911f, 0.000000f, 0.000000f, 0.978148f, -0.207911f, 0.000000f, 0.211325f, 0.684243f, - 0.978148f, -0.092981f, 0.185961f, 0.000000f, 0.978148f, -0.092981f, 0.185961f, 0.437019f, 0.697392f, - 0.934172f, -0.303531f, 0.187593f, 0.000000f, 0.934172f, -0.303531f, 0.187593f, 0.272352f, 0.772345f, - 0.978148f, -0.207911f, 0.000000f, 0.000000f, 0.978148f, -0.207911f, 0.000000f, 0.211325f, 0.684243f, - 0.983024f, -0.096461f, -0.156077f, 0.000000f, 0.983024f, -0.096461f, -0.156077f, 0.500000f, 0.196469f, - 1.000000f, -0.000000f, 0.000000f, 0.000000f, 1.000000f, -0.000000f, 0.000000f, 0.445347f, 0.130459f, - 0.845991f, -0.389809f, 0.363797f, 0.000000f, 0.845991f, -0.389809f, 0.363797f, 0.183922f, 0.772345f, - 0.913545f, -0.181898f, 0.363797f, 0.000000f, 0.913545f, -0.181898f, 0.363797f, 0.178463f, 0.743874f, - 0.809017f, -0.262866f, 0.525731f, 0.000000f, 0.809017f, -0.262866f, 0.525731f, 0.654508f, 0.287337f, - 0.934172f, -0.303531f, 0.187593f, 0.000000f, 0.934172f, -0.303531f, 0.187593f, 0.272352f, 0.772345f, - 0.978148f, -0.092981f, 0.185961f, 0.000000f, 0.978148f, -0.092981f, 0.185961f, 0.437019f, 0.697392f, - 0.913545f, -0.181898f, 0.363797f, 0.000000f, 0.913545f, -0.181898f, 0.363797f, 0.178463f, 0.743874f, - 0.978148f, -0.207911f, 0.000000f, 0.000000f, 0.978148f, -0.207911f, 0.000000f, 0.211325f, 0.684243f, - 1.000000f, -0.000000f, 0.000000f, 0.000000f, 1.000000f, -0.000000f, 0.000000f, 0.445347f, 0.130459f, - 0.978148f, -0.092981f, 0.185961f, 0.000000f, 0.978148f, -0.092981f, 0.185961f, 0.437019f, 0.697392f, - 0.643075f, -0.588241f, 0.490334f, 0.000000f, 0.643075f, -0.588241f, 0.490334f, 0.643075f, 0.453512f, - 0.757311f, -0.555521f, 0.343331f, 0.000000f, 0.757311f, -0.555521f, 0.343331f, 0.131657f, 0.683427f, - 0.738585f, -0.432902f, 0.516806f, 0.000000f, 0.738585f, -0.432902f, 0.516806f, 0.671537f, 0.555736f, - 0.757311f, -0.555521f, 0.343331f, 0.000000f, 0.757311f, -0.555521f, 0.343331f, 0.131657f, 0.683427f, - 0.845991f, -0.499718f, 0.185961f, 0.000000f, 0.845991f, -0.499718f, 0.185961f, 0.165435f, 0.590447f, - 0.845991f, -0.389809f, 0.363797f, 0.000000f, 0.845991f, -0.389809f, 0.363797f, 0.183922f, 0.772345f, - 0.845991f, -0.499718f, 0.185961f, 0.000000f, 0.845991f, -0.499718f, 0.185961f, 0.165435f, 0.590447f, - 0.913545f, -0.406737f, 0.000000f, 0.000000f, 0.913545f, -0.406737f, 0.000000f, 0.356925f, 0.762112f, - 0.934172f, -0.303531f, 0.187593f, 0.000000f, 0.934172f, -0.303531f, 0.187593f, 0.272352f, 0.772345f, - 0.913545f, -0.406737f, 0.000000f, 0.000000f, 0.913545f, -0.406737f, 0.000000f, 0.356925f, 0.762112f, - 0.939205f, -0.305166f, -0.157379f, 0.000000f, 0.939205f, -0.305166f, -0.157379f, 0.304653f, 0.683427f, - 0.978148f, -0.207911f, 0.000000f, 0.000000f, 0.978148f, -0.207911f, 0.000000f, 0.211325f, 0.684243f, - 0.939205f, -0.305166f, -0.157379f, 0.000000f, 0.939205f, -0.305166f, -0.157379f, 0.304653f, 0.683427f, - 0.932670f, -0.189647f, -0.306855f, 0.000000f, 0.932670f, -0.189647f, -0.306855f, 0.552265f, 0.277618f, - 0.983024f, -0.096461f, -0.156077f, 0.000000f, 0.983024f, -0.096461f, -0.156077f, 0.500000f, 0.196469f, - 0.757311f, -0.555521f, 0.343331f, 0.000000f, 0.757311f, -0.555521f, 0.343331f, 0.131657f, 0.683427f, - 0.845991f, -0.389809f, 0.363797f, 0.000000f, 0.845991f, -0.389809f, 0.363797f, 0.183922f, 0.772345f, - 0.738585f, -0.432902f, 0.516806f, 0.000000f, 0.738585f, -0.432902f, 0.516806f, 0.671537f, 0.555736f, - 0.845991f, -0.499718f, 0.185961f, 0.000000f, 0.845991f, -0.499718f, 0.185961f, 0.165435f, 0.590447f, - 0.934172f, -0.303531f, 0.187593f, 0.000000f, 0.934172f, -0.303531f, 0.187593f, 0.272352f, 0.772345f, - 0.845991f, -0.389809f, 0.363797f, 0.000000f, 0.845991f, -0.389809f, 0.363797f, 0.183922f, 0.772345f, - 0.913545f, -0.406737f, 0.000000f, 0.000000f, 0.913545f, -0.406737f, 0.000000f, 0.356925f, 0.762112f, - 0.978148f, -0.207911f, 0.000000f, 0.000000f, 0.978148f, -0.207911f, 0.000000f, 0.211325f, 0.684243f, - 0.934172f, -0.303531f, 0.187593f, 0.000000f, 0.934172f, -0.303531f, 0.187593f, 0.272352f, 0.772345f, - 0.939205f, -0.305166f, -0.157379f, 0.000000f, 0.939205f, -0.305166f, -0.157379f, 0.304653f, 0.683427f, - 0.983024f, -0.096461f, -0.156077f, 0.000000f, 0.983024f, -0.096461f, -0.156077f, 0.500000f, 0.196469f, - 0.978148f, -0.207911f, 0.000000f, 0.000000f, 0.978148f, -0.207911f, 0.000000f, 0.211325f, 0.684243f, - 0.525731f, -0.723607f, 0.447214f, 0.000000f, 0.525731f, -0.723607f, 0.447214f, 0.606016f, 0.354082f, - 0.643075f, -0.701637f, 0.306855f, 0.000000f, 0.643075f, -0.701637f, 0.306855f, 0.447735f, 0.277618f, - 0.643075f, -0.588241f, 0.490334f, 0.000000f, 0.643075f, -0.588241f, 0.490334f, 0.643075f, 0.453512f, - 0.643075f, -0.701637f, 0.306855f, 0.000000f, 0.643075f, -0.701637f, 0.306855f, 0.447735f, 0.277618f, - 0.738585f, -0.655845f, 0.156077f, 0.000000f, 0.738585f, -0.655845f, 0.156077f, 0.500000f, 0.349562f, - 0.757311f, -0.555521f, 0.343331f, 0.000000f, 0.757311f, -0.555521f, 0.343331f, 0.131657f, 0.683427f, - 0.738585f, -0.655845f, 0.156077f, 0.000000f, 0.738585f, -0.655845f, 0.156077f, 0.500000f, 0.349562f, - 0.809017f, -0.587785f, 0.000000f, 0.000000f, 0.809017f, -0.587785f, 0.000000f, 0.209769f, 0.268343f, - 0.845991f, -0.499718f, 0.185961f, 0.000000f, 0.845991f, -0.499718f, 0.185961f, 0.165435f, 0.590447f, - 0.809017f, -0.587785f, 0.000000f, 0.000000f, 0.809017f, -0.587785f, 0.000000f, 0.209769f, 0.268343f, - 0.851981f, -0.499769f, -0.156077f, 0.000000f, 0.851981f, -0.499769f, -0.156077f, 0.265712f, 0.288582f, - 0.913545f, -0.406737f, 0.000000f, 0.000000f, 0.913545f, -0.406737f, 0.000000f, 0.356925f, 0.762112f, - 0.866018f, -0.394782f, -0.306855f, 0.000000f, 0.866018f, -0.394782f, -0.306855f, 0.237134f, 0.366840f, - 0.939205f, -0.305166f, -0.157379f, 0.000000f, 0.939205f, -0.305166f, -0.157379f, 0.304653f, 0.683427f, - 0.851981f, -0.499769f, -0.156077f, 0.000000f, 0.851981f, -0.499769f, -0.156077f, 0.265712f, 0.288582f, - 0.866018f, -0.394782f, -0.306855f, 0.000000f, 0.866018f, -0.394782f, -0.306855f, 0.237134f, 0.366840f, - 0.850651f, -0.276393f, -0.447214f, 0.000000f, 0.850651f, -0.276393f, -0.447214f, 0.500000f, 0.960321f, - 0.932670f, -0.189647f, -0.306855f, 0.000000f, 0.932670f, -0.189647f, -0.306855f, 0.552265f, 0.277618f, - 0.643075f, -0.701637f, 0.306855f, 0.000000f, 0.643075f, -0.701637f, 0.306855f, 0.447735f, 0.277618f, - 0.757311f, -0.555521f, 0.343331f, 0.000000f, 0.757311f, -0.555521f, 0.343331f, 0.131657f, 0.683427f, - 0.643075f, -0.588241f, 0.490334f, 0.000000f, 0.643075f, -0.588241f, 0.490334f, 0.643075f, 0.453512f, - 0.738585f, -0.655845f, 0.156077f, 0.000000f, 0.738585f, -0.655845f, 0.156077f, 0.500000f, 0.349562f, - 0.845991f, -0.499718f, 0.185961f, 0.000000f, 0.845991f, -0.499718f, 0.185961f, 0.165435f, 0.590447f, - 0.757311f, -0.555521f, 0.343331f, 0.000000f, 0.757311f, -0.555521f, 0.343331f, 0.131657f, 0.683427f, - 0.809017f, -0.587785f, 0.000000f, 0.000000f, 0.809017f, -0.587785f, 0.000000f, 0.209769f, 0.268343f, - 0.913545f, -0.406737f, 0.000000f, 0.000000f, 0.913545f, -0.406737f, 0.000000f, 0.356925f, 0.762112f, - 0.845991f, -0.499718f, 0.185961f, 0.000000f, 0.845991f, -0.499718f, 0.185961f, 0.165435f, 0.590447f, - 0.851981f, -0.499769f, -0.156077f, 0.000000f, 0.851981f, -0.499769f, -0.156077f, 0.265712f, 0.288582f, - 0.939205f, -0.305166f, -0.157379f, 0.000000f, 0.939205f, -0.305166f, -0.157379f, 0.304653f, 0.683427f, - 0.913545f, -0.406737f, 0.000000f, 0.000000f, 0.913545f, -0.406737f, 0.000000f, 0.356925f, 0.762112f, - 0.866018f, -0.394782f, -0.306855f, 0.000000f, 0.866018f, -0.394782f, -0.306855f, 0.237134f, 0.366840f, - 0.932670f, -0.189647f, -0.306855f, 0.000000f, 0.932670f, -0.189647f, -0.306855f, 0.552265f, 0.277618f, - 0.939205f, -0.305166f, -0.157379f, 0.000000f, 0.939205f, -0.305166f, -0.157379f, 0.304653f, 0.683427f, - 0.107846f, 0.945626f, 0.306855f, 0.000000f, 0.107846f, 0.945626f, 0.306855f, 0.743874f, 0.302609f, - 0.000000f, 0.894427f, 0.447214f, 0.000000f, 0.000000f, 0.894427f, 0.447214f, 0.268343f, 0.250971f, - 0.174499f, 0.853887f, 0.490334f, 0.000000f, 0.174499f, 0.853887f, 0.490334f, 0.332044f, 0.283549f, - 0.286151f, 0.894562f, 0.343331f, 0.000000f, 0.286151f, 0.894562f, 0.343331f, 0.250001f, 0.590447f, - 0.174499f, 0.853887f, 0.490334f, 0.000000f, 0.174499f, 0.853887f, 0.490334f, 0.332044f, 0.283549f, - 0.343074f, 0.784354f, 0.516806f, 0.000000f, 0.343074f, 0.784354f, 0.516806f, 0.345280f, 0.205880f, - 0.212032f, 0.964719f, 0.156077f, 0.000000f, 0.212032f, 0.964719f, 0.156077f, 0.683427f, 0.174918f, - 0.107846f, 0.945626f, 0.306855f, 0.000000f, 0.107846f, 0.945626f, 0.306855f, 0.743874f, 0.302609f, - 0.286151f, 0.894562f, 0.343331f, 0.000000f, 0.286151f, 0.894562f, 0.343331f, 0.250001f, 0.590447f, - 0.286151f, 0.894562f, 0.343331f, 0.000000f, 0.286151f, 0.894562f, 0.343331f, 0.250001f, 0.590447f, - 0.107846f, 0.945626f, 0.306855f, 0.000000f, 0.107846f, 0.945626f, 0.306855f, 0.743874f, 0.302609f, - 0.174499f, 0.853887f, 0.490334f, 0.000000f, 0.174499f, 0.853887f, 0.490334f, 0.332044f, 0.283549f, - 0.455297f, 0.812623f, 0.363797f, 0.000000f, 0.455297f, 0.812623f, 0.363797f, 0.209769f, 0.511757f, - 0.343074f, 0.784354f, 0.516806f, 0.000000f, 0.343074f, 0.784354f, 0.516806f, 0.345280f, 0.205880f, - 0.500000f, 0.688191f, 0.525731f, 0.000000f, 0.500000f, 0.688191f, 0.525731f, 0.734288f, 0.288582f, - 0.390694f, 0.901541f, 0.185961f, 0.000000f, 0.390694f, 0.901541f, 0.185961f, 0.130708f, 0.512408f, - 0.286151f, 0.894562f, 0.343331f, 0.000000f, 0.286151f, 0.894562f, 0.343331f, 0.250001f, 0.590447f, - 0.455297f, 0.812623f, 0.363797f, 0.000000f, 0.455297f, 0.812623f, 0.363797f, 0.209769f, 0.511757f, - 0.309017f, 0.951056f, 0.000000f, 0.000000f, 0.309017f, 0.951056f, 0.000000f, 0.750000f, 0.590447f, - 0.212032f, 0.964719f, 0.156077f, 0.000000f, 0.212032f, 0.964719f, 0.156077f, 0.683427f, 0.174918f, - 0.390694f, 0.901541f, 0.185961f, 0.000000f, 0.390694f, 0.901541f, 0.185961f, 0.130708f, 0.512408f, - 0.455297f, 0.812623f, 0.363797f, 0.000000f, 0.455297f, 0.812623f, 0.363797f, 0.209769f, 0.511757f, - 0.286151f, 0.894562f, 0.343331f, 0.000000f, 0.286151f, 0.894562f, 0.343331f, 0.250001f, 0.590447f, - 0.343074f, 0.784354f, 0.516806f, 0.000000f, 0.343074f, 0.784354f, 0.516806f, 0.345280f, 0.205880f, - 0.390694f, 0.901541f, 0.185961f, 0.000000f, 0.390694f, 0.901541f, 0.185961f, 0.130708f, 0.512408f, - 0.212032f, 0.964719f, 0.156077f, 0.000000f, 0.212032f, 0.964719f, 0.156077f, 0.683427f, 0.174918f, - 0.286151f, 0.894562f, 0.343331f, 0.000000f, 0.286151f, 0.894562f, 0.343331f, 0.250001f, 0.590447f, - 0.639949f, 0.568662f, 0.516806f, 0.000000f, 0.639949f, 0.568662f, 0.516806f, 0.821537f, 0.345280f, - 0.632156f, 0.684127f, 0.363797f, 0.000000f, 0.632156f, 0.684127f, 0.363797f, 0.178463f, 0.437019f, - 0.500000f, 0.688191f, 0.525731f, 0.000000f, 0.500000f, 0.688191f, 0.525731f, 0.734288f, 0.288582f, - 0.632156f, 0.684127f, 0.363797f, 0.000000f, 0.632156f, 0.684127f, 0.363797f, 0.178463f, 0.437019f, - 0.577350f, 0.794654f, 0.187593f, 0.000000f, 0.577350f, 0.794654f, 0.187593f, 0.446077f, 0.743874f, - 0.455297f, 0.812623f, 0.363797f, 0.000000f, 0.455297f, 0.812623f, 0.363797f, 0.209769f, 0.511757f, - 0.499999f, 0.866026f, 0.000000f, 0.000000f, 0.499999f, 0.866026f, 0.000000f, 0.393984f, 0.668485f, - 0.390694f, 0.901541f, 0.185961f, 0.000000f, 0.390694f, 0.901541f, 0.185961f, 0.130708f, 0.512408f, - 0.577350f, 0.794654f, 0.187593f, 0.000000f, 0.577350f, 0.794654f, 0.187593f, 0.446077f, 0.743874f, - 0.499999f, 0.866026f, 0.000000f, 0.000000f, 0.499999f, 0.866026f, 0.000000f, 0.393984f, 0.668485f, - 0.395511f, 0.905103f, -0.156077f, 0.000000f, 0.395511f, 0.905103f, -0.156077f, 0.654508f, 0.590447f, - 0.309017f, 0.951056f, 0.000000f, 0.000000f, 0.309017f, 0.951056f, 0.000000f, 0.750000f, 0.590447f, - 0.632156f, 0.684127f, 0.363797f, 0.000000f, 0.632156f, 0.684127f, 0.363797f, 0.178463f, 0.437019f, - 0.455297f, 0.812623f, 0.363797f, 0.000000f, 0.455297f, 0.812623f, 0.363797f, 0.209769f, 0.511757f, - 0.500000f, 0.688191f, 0.525731f, 0.000000f, 0.500000f, 0.688191f, 0.525731f, 0.734288f, 0.288582f, - 0.577350f, 0.794654f, 0.187593f, 0.000000f, 0.577350f, 0.794654f, 0.187593f, 0.446077f, 0.743874f, - 0.390694f, 0.901541f, 0.185961f, 0.000000f, 0.390694f, 0.901541f, 0.185961f, 0.130708f, 0.512408f, - 0.455297f, 0.812623f, 0.363797f, 0.000000f, 0.455297f, 0.812623f, 0.363797f, 0.209769f, 0.511757f, - 0.499999f, 0.866026f, 0.000000f, 0.000000f, 0.499999f, 0.866026f, 0.000000f, 0.393984f, 0.668485f, - 0.309017f, 0.951056f, 0.000000f, 0.000000f, 0.309017f, 0.951056f, 0.000000f, 0.750000f, 0.590447f, - 0.390694f, 0.901541f, 0.185961f, 0.000000f, 0.390694f, 0.901541f, 0.185961f, 0.130708f, 0.512408f, - 0.758172f, 0.429824f, 0.490334f, 0.000000f, 0.758172f, 0.429824f, 0.490334f, 0.762866f, 0.366840f, - 0.762354f, 0.548581f, 0.343331f, 0.000000f, 0.762354f, 0.548581f, 0.343331f, 0.302244f, 0.512408f, - 0.639949f, 0.568662f, 0.516806f, 0.000000f, 0.639949f, 0.568662f, 0.516806f, 0.821537f, 0.345280f, - 0.762354f, 0.548581f, 0.343331f, 0.000000f, 0.762354f, 0.548581f, 0.343331f, 0.302244f, 0.512408f, - 0.736686f, 0.650164f, 0.185961f, 0.000000f, 0.736686f, 0.650164f, 0.185961f, 0.265712f, 0.437019f, - 0.632156f, 0.684127f, 0.363797f, 0.000000f, 0.632156f, 0.684127f, 0.363797f, 0.178463f, 0.437019f, - 0.736686f, 0.650164f, 0.185961f, 0.000000f, 0.736686f, 0.650164f, 0.185961f, 0.265712f, 0.437019f, - 0.669131f, 0.743144f, 0.000000f, 0.000000f, 0.669131f, 0.743144f, 0.000000f, 0.418781f, 0.502145f, - 0.577350f, 0.794654f, 0.187593f, 0.000000f, 0.577350f, 0.794654f, 0.187593f, 0.446077f, 0.743874f, - 0.669131f, 0.743144f, 0.000000f, 0.000000f, 0.669131f, 0.743144f, 0.000000f, 0.418781f, 0.502145f, - 0.580461f, 0.798935f, -0.157379f, 0.000000f, 0.580461f, 0.798935f, -0.157379f, 0.408548f, 0.409051f, - 0.499999f, 0.866026f, 0.000000f, 0.000000f, 0.499999f, 0.866026f, 0.000000f, 0.393984f, 0.668485f, - 0.580461f, 0.798935f, -0.157379f, 0.000000f, 0.580461f, 0.798935f, -0.157379f, 0.408548f, 0.409051f, - 0.468576f, 0.828418f, -0.306855f, 0.000000f, 0.468576f, 0.828418f, -0.306855f, 0.727648f, 0.772345f, - 0.395511f, 0.905103f, -0.156077f, 0.000000f, 0.395511f, 0.905103f, -0.156077f, 0.654508f, 0.590447f, - 0.762354f, 0.548581f, 0.343331f, 0.000000f, 0.762354f, 0.548581f, 0.343331f, 0.302244f, 0.512408f, - 0.632156f, 0.684127f, 0.363797f, 0.000000f, 0.632156f, 0.684127f, 0.363797f, 0.178463f, 0.437019f, - 0.639949f, 0.568662f, 0.516806f, 0.000000f, 0.639949f, 0.568662f, 0.516806f, 0.821537f, 0.345280f, - 0.736686f, 0.650164f, 0.185961f, 0.000000f, 0.736686f, 0.650164f, 0.185961f, 0.265712f, 0.437019f, - 0.577350f, 0.794654f, 0.187593f, 0.000000f, 0.577350f, 0.794654f, 0.187593f, 0.446077f, 0.743874f, - 0.632156f, 0.684127f, 0.363797f, 0.000000f, 0.632156f, 0.684127f, 0.363797f, 0.178463f, 0.437019f, - 0.669131f, 0.743144f, 0.000000f, 0.000000f, 0.669131f, 0.743144f, 0.000000f, 0.418781f, 0.502145f, - 0.499999f, 0.866026f, 0.000000f, 0.000000f, 0.499999f, 0.866026f, 0.000000f, 0.393984f, 0.668485f, - 0.577350f, 0.794654f, 0.187593f, 0.000000f, 0.577350f, 0.794654f, 0.187593f, 0.446077f, 0.743874f, - 0.580461f, 0.798935f, -0.157379f, 0.000000f, 0.580461f, 0.798935f, -0.157379f, 0.408548f, 0.409051f, - 0.395511f, 0.905103f, -0.156077f, 0.000000f, 0.395511f, 0.905103f, -0.156077f, 0.654508f, 0.590447f, - 0.499999f, 0.866026f, 0.000000f, 0.000000f, 0.499999f, 0.866026f, 0.000000f, 0.393984f, 0.668485f, - 0.850651f, 0.276393f, 0.447214f, 0.000000f, 0.850651f, 0.276393f, 0.447214f, 0.750000f, 0.581230f, - 0.866018f, 0.394782f, 0.306855f, 0.000000f, 0.866018f, 0.394782f, 0.306855f, 0.606016f, 0.668485f, - 0.758172f, 0.429824f, 0.490334f, 0.000000f, 0.758172f, 0.429824f, 0.490334f, 0.762866f, 0.366840f, - 0.866018f, 0.394782f, 0.306855f, 0.000000f, 0.866018f, 0.394782f, 0.306855f, 0.606016f, 0.668485f, - 0.851981f, 0.499768f, 0.156077f, 0.000000f, 0.851981f, 0.499768f, 0.156077f, 0.643075f, 0.762112f, - 0.762354f, 0.548581f, 0.343331f, 0.000000f, 0.762354f, 0.548581f, 0.343331f, 0.302244f, 0.512408f, - 0.851981f, 0.499768f, 0.156077f, 0.000000f, 0.851981f, 0.499768f, 0.156077f, 0.643075f, 0.762112f, - 0.809017f, 0.587785f, 0.000000f, 0.000000f, 0.809017f, 0.587785f, 0.000000f, 0.553923f, 0.743874f, - 0.736686f, 0.650164f, 0.185961f, 0.000000f, 0.736686f, 0.650164f, 0.185961f, 0.265712f, 0.437019f, - 0.809017f, 0.587785f, 0.000000f, 0.000000f, 0.809017f, 0.587785f, 0.000000f, 0.553923f, 0.743874f, - 0.738585f, 0.655845f, -0.156077f, 0.000000f, 0.738585f, 0.655845f, -0.156077f, 0.647155f, 0.268343f, - 0.669131f, 0.743144f, 0.000000f, 0.000000f, 0.669131f, 0.743144f, 0.000000f, 0.418781f, 0.502145f, - 0.643075f, 0.701637f, -0.306855f, 0.000000f, 0.643075f, 0.701637f, -0.306855f, 0.680365f, 0.345280f, - 0.580461f, 0.798935f, -0.157379f, 0.000000f, 0.580461f, 0.798935f, -0.157379f, 0.408548f, 0.409051f, - 0.738585f, 0.655845f, -0.156077f, 0.000000f, 0.738585f, 0.655845f, -0.156077f, 0.647155f, 0.268343f, - 0.643075f, 0.701637f, -0.306855f, 0.000000f, 0.643075f, 0.701637f, -0.306855f, 0.680365f, 0.345280f, - 0.525731f, 0.723607f, -0.447214f, 0.000000f, 0.525731f, 0.723607f, -0.447214f, 0.788675f, 0.593796f, - 0.468576f, 0.828418f, -0.306855f, 0.000000f, 0.468576f, 0.828418f, -0.306855f, 0.727648f, 0.772345f, - 0.866018f, 0.394782f, 0.306855f, 0.000000f, 0.866018f, 0.394782f, 0.306855f, 0.606016f, 0.668485f, - 0.762354f, 0.548581f, 0.343331f, 0.000000f, 0.762354f, 0.548581f, 0.343331f, 0.302244f, 0.512408f, - 0.758172f, 0.429824f, 0.490334f, 0.000000f, 0.758172f, 0.429824f, 0.490334f, 0.762866f, 0.366840f, - 0.851981f, 0.499768f, 0.156077f, 0.000000f, 0.851981f, 0.499768f, 0.156077f, 0.643075f, 0.762112f, - 0.736686f, 0.650164f, 0.185961f, 0.000000f, 0.736686f, 0.650164f, 0.185961f, 0.265712f, 0.437019f, - 0.762354f, 0.548581f, 0.343331f, 0.000000f, 0.762354f, 0.548581f, 0.343331f, 0.302244f, 0.512408f, - 0.809017f, 0.587785f, 0.000000f, 0.000000f, 0.809017f, 0.587785f, 0.000000f, 0.553923f, 0.743874f, - 0.669131f, 0.743144f, 0.000000f, 0.000000f, 0.669131f, 0.743144f, 0.000000f, 0.418781f, 0.502145f, - 0.736686f, 0.650164f, 0.185961f, 0.000000f, 0.736686f, 0.650164f, 0.185961f, 0.265712f, 0.437019f, - 0.738585f, 0.655845f, -0.156077f, 0.000000f, 0.738585f, 0.655845f, -0.156077f, 0.647155f, 0.268343f, - 0.580461f, 0.798935f, -0.157379f, 0.000000f, 0.580461f, 0.798935f, -0.157379f, 0.408548f, 0.409051f, - 0.669131f, 0.743144f, 0.000000f, 0.000000f, 0.669131f, 0.743144f, 0.000000f, 0.418781f, 0.502145f, - 0.643075f, 0.701637f, -0.306855f, 0.000000f, 0.643075f, 0.701637f, -0.306855f, 0.680365f, 0.345280f, - 0.468576f, 0.828418f, -0.306855f, 0.000000f, 0.468576f, 0.828418f, -0.306855f, 0.727648f, 0.772345f, - 0.580461f, 0.798935f, -0.157379f, 0.000000f, 0.580461f, 0.798935f, -0.157379f, 0.408548f, 0.409051f, - -0.866018f, 0.394783f, 0.306855f, 0.000000f, -0.866018f, 0.394783f, 0.306855f, 0.511757f, 0.652583f, - -0.850651f, 0.276393f, 0.447214f, 0.000000f, -0.850651f, 0.276393f, 0.447214f, 0.588426f, 0.872062f, - -0.758172f, 0.429824f, 0.490334f, 0.000000f, -0.758172f, 0.429824f, 0.490334f, 0.672996f, 0.831089f, - -0.762354f, 0.548581f, 0.343331f, 0.000000f, -0.762354f, 0.548581f, 0.343331f, 0.497466f, 0.453510f, - -0.758172f, 0.429824f, 0.490334f, 0.000000f, -0.758172f, 0.429824f, 0.490334f, 0.672996f, 0.831089f, - -0.639949f, 0.568662f, 0.516806f, 0.000000f, -0.639949f, 0.568662f, 0.516806f, 0.761425f, 0.766840f, - -0.851981f, 0.499769f, 0.156077f, 0.000000f, -0.851981f, 0.499769f, 0.156077f, 0.590447f, 0.603956f, - -0.866018f, 0.394783f, 0.306855f, 0.000000f, -0.866018f, 0.394783f, 0.306855f, 0.511757f, 0.652583f, - -0.762354f, 0.548581f, 0.343331f, 0.000000f, -0.762354f, 0.548581f, 0.343331f, 0.497466f, 0.453510f, - -0.762354f, 0.548581f, 0.343331f, 0.000000f, -0.762354f, 0.548581f, 0.343331f, 0.497466f, 0.453510f, - -0.866018f, 0.394783f, 0.306855f, 0.000000f, -0.866018f, 0.394783f, 0.306855f, 0.511757f, 0.652583f, - -0.758172f, 0.429824f, 0.490334f, 0.000000f, -0.758172f, 0.429824f, 0.490334f, 0.672996f, 0.831089f, - -0.632156f, 0.684127f, 0.363797f, 0.000000f, -0.632156f, 0.684127f, 0.363797f, 0.408548f, 0.305095f, - -0.639949f, 0.568662f, 0.516806f, 0.000000f, -0.639949f, 0.568662f, 0.516806f, 0.761425f, 0.766840f, - -0.500000f, 0.688191f, 0.525731f, 0.000000f, -0.500000f, 0.688191f, 0.525731f, 0.826527f, 0.699071f, - -0.736685f, 0.650164f, 0.185961f, 0.000000f, -0.736685f, 0.650164f, 0.185961f, 0.496650f, 0.348235f, - -0.762354f, 0.548581f, 0.343331f, 0.000000f, -0.762354f, 0.548581f, 0.343331f, 0.497466f, 0.453510f, - -0.632156f, 0.684127f, 0.363797f, 0.000000f, -0.632156f, 0.684127f, 0.363797f, 0.408548f, 0.305095f, - -0.809017f, 0.587785f, 0.000000f, 0.000000f, -0.809017f, 0.587785f, 0.000000f, 0.683427f, 0.546490f, - -0.851981f, 0.499769f, 0.156077f, 0.000000f, -0.851981f, 0.499769f, 0.156077f, 0.590447f, 0.603956f, - -0.736685f, 0.650164f, 0.185961f, 0.000000f, -0.736685f, 0.650164f, 0.185961f, 0.496650f, 0.348235f, - -0.632156f, 0.684127f, 0.363797f, 0.000000f, -0.632156f, 0.684127f, 0.363797f, 0.408548f, 0.305095f, - -0.762354f, 0.548581f, 0.343331f, 0.000000f, -0.762354f, 0.548581f, 0.343331f, 0.497466f, 0.453510f, - -0.639949f, 0.568662f, 0.516806f, 0.000000f, -0.639949f, 0.568662f, 0.516806f, 0.761425f, 0.766840f, - -0.736685f, 0.650164f, 0.185961f, 0.000000f, -0.736685f, 0.650164f, 0.185961f, 0.496650f, 0.348235f, - -0.851981f, 0.499769f, 0.156077f, 0.000000f, -0.851981f, 0.499769f, 0.156077f, 0.590447f, 0.603956f, - -0.762354f, 0.548581f, 0.343331f, 0.000000f, -0.762354f, 0.548581f, 0.343331f, 0.497466f, 0.453510f, - -0.343074f, 0.784354f, 0.516806f, 0.000000f, -0.343074f, 0.784354f, 0.516806f, 0.268343f, 0.699071f, - -0.455297f, 0.812623f, 0.363797f, 0.000000f, -0.455297f, 0.812623f, 0.363797f, 0.590447f, 0.396044f, - -0.500000f, 0.688191f, 0.525731f, 0.000000f, -0.500000f, 0.688191f, 0.525731f, 0.826527f, 0.699071f, - -0.577350f, 0.794655f, 0.187593f, 0.000000f, -0.577350f, 0.794655f, 0.187593f, 0.418781f, 0.222239f, - -0.632156f, 0.684127f, 0.363797f, 0.000000f, -0.632156f, 0.684127f, 0.363797f, 0.408548f, 0.305095f, - -0.455297f, 0.812623f, 0.363797f, 0.000000f, -0.455297f, 0.812623f, 0.363797f, 0.590447f, 0.396044f, - -0.669131f, 0.743144f, 0.000000f, 0.000000f, -0.669131f, 0.743144f, 0.000000f, 0.497466f, 0.250141f, - -0.736685f, 0.650164f, 0.185961f, 0.000000f, -0.736685f, 0.650164f, 0.185961f, 0.496650f, 0.348235f, - -0.577350f, 0.794655f, 0.187593f, 0.000000f, -0.577350f, 0.794655f, 0.187593f, 0.418781f, 0.222239f, - -0.738585f, 0.655845f, -0.156077f, 0.000000f, -0.738585f, 0.655845f, -0.156077f, 0.762112f, 0.497855f, - -0.809017f, 0.587785f, 0.000000f, 0.000000f, -0.809017f, 0.587785f, 0.000000f, 0.683427f, 0.546490f, - -0.669131f, 0.743144f, 0.000000f, 0.000000f, -0.669131f, 0.743144f, 0.000000f, 0.497466f, 0.250141f, - -0.455297f, 0.812623f, 0.363797f, 0.000000f, -0.455297f, 0.812623f, 0.363797f, 0.590447f, 0.396044f, - -0.632156f, 0.684127f, 0.363797f, 0.000000f, -0.632156f, 0.684127f, 0.363797f, 0.408548f, 0.305095f, - -0.500000f, 0.688191f, 0.525731f, 0.000000f, -0.500000f, 0.688191f, 0.525731f, 0.826527f, 0.699071f, - -0.577350f, 0.794655f, 0.187593f, 0.000000f, -0.577350f, 0.794655f, 0.187593f, 0.418781f, 0.222239f, - -0.736685f, 0.650164f, 0.185961f, 0.000000f, -0.736685f, 0.650164f, 0.185961f, 0.496650f, 0.348235f, - -0.632156f, 0.684127f, 0.363797f, 0.000000f, -0.632156f, 0.684127f, 0.363797f, 0.408548f, 0.305095f, - -0.669131f, 0.743144f, 0.000000f, 0.000000f, -0.669131f, 0.743144f, 0.000000f, 0.497466f, 0.250141f, - -0.809017f, 0.587785f, 0.000000f, 0.000000f, -0.809017f, 0.587785f, 0.000000f, 0.683427f, 0.546490f, - -0.736685f, 0.650164f, 0.185961f, 0.000000f, -0.736685f, 0.650164f, 0.185961f, 0.496650f, 0.348235f, - -0.174499f, 0.853887f, 0.490334f, 0.000000f, -0.174499f, 0.853887f, 0.490334f, 0.500000f, 0.836442f, - -0.286151f, 0.894562f, 0.343331f, 0.000000f, -0.286151f, 0.894562f, 0.343331f, 0.590447f, 0.296632f, - -0.343074f, 0.784354f, 0.516806f, 0.000000f, -0.343074f, 0.784354f, 0.516806f, 0.268343f, 0.699071f, - -0.286151f, 0.894562f, 0.343331f, 0.000000f, -0.286151f, 0.894562f, 0.343331f, 0.590447f, 0.296632f, - -0.390694f, 0.901541f, 0.185961f, 0.000000f, -0.390694f, 0.901541f, 0.185961f, 0.669136f, 0.347417f, - -0.455297f, 0.812623f, 0.363797f, 0.000000f, -0.455297f, 0.812623f, 0.363797f, 0.590447f, 0.396044f, - -0.390694f, 0.901541f, 0.185961f, 0.000000f, -0.390694f, 0.901541f, 0.185961f, 0.669136f, 0.347417f, - -0.499999f, 0.866026f, 0.000000f, 0.000000f, -0.499999f, 0.866026f, 0.000000f, 0.437019f, 0.149181f, - -0.577350f, 0.794655f, 0.187593f, 0.000000f, -0.577350f, 0.794655f, 0.187593f, 0.418781f, 0.222239f, - -0.580460f, 0.798935f, -0.157379f, 0.000000f, -0.580460f, 0.798935f, -0.157379f, 0.643075f, 0.418781f, - -0.669131f, 0.743144f, 0.000000f, 0.000000f, -0.669131f, 0.743144f, 0.000000f, 0.497466f, 0.250141f, - -0.499999f, 0.866026f, 0.000000f, 0.000000f, -0.499999f, 0.866026f, 0.000000f, 0.437019f, 0.149181f, - -0.580460f, 0.798935f, -0.157379f, 0.000000f, -0.580460f, 0.798935f, -0.157379f, 0.643075f, 0.418781f, - -0.643075f, 0.701637f, -0.306855f, 0.000000f, -0.643075f, 0.701637f, -0.306855f, 0.821537f, 0.437019f, - -0.738585f, 0.655845f, -0.156077f, 0.000000f, -0.738585f, 0.655845f, -0.156077f, 0.762112f, 0.497855f, - -0.286151f, 0.894562f, 0.343331f, 0.000000f, -0.286151f, 0.894562f, 0.343331f, 0.590447f, 0.296632f, - -0.455297f, 0.812623f, 0.363797f, 0.000000f, -0.455297f, 0.812623f, 0.363797f, 0.590447f, 0.396044f, - -0.343074f, 0.784354f, 0.516806f, 0.000000f, -0.343074f, 0.784354f, 0.516806f, 0.268343f, 0.699071f, - -0.390694f, 0.901541f, 0.185961f, 0.000000f, -0.390694f, 0.901541f, 0.185961f, 0.669136f, 0.347417f, - -0.577350f, 0.794655f, 0.187593f, 0.000000f, -0.577350f, 0.794655f, 0.187593f, 0.418781f, 0.222239f, - -0.455297f, 0.812623f, 0.363797f, 0.000000f, -0.455297f, 0.812623f, 0.363797f, 0.590447f, 0.396044f, - -0.499999f, 0.866026f, 0.000000f, 0.000000f, -0.499999f, 0.866026f, 0.000000f, 0.437019f, 0.149181f, - -0.669131f, 0.743144f, 0.000000f, 0.000000f, -0.669131f, 0.743144f, 0.000000f, 0.497466f, 0.250141f, - -0.577350f, 0.794655f, 0.187593f, 0.000000f, -0.577350f, 0.794655f, 0.187593f, 0.418781f, 0.222239f, - -0.580460f, 0.798935f, -0.157379f, 0.000000f, -0.580460f, 0.798935f, -0.157379f, 0.643075f, 0.418781f, - -0.738585f, 0.655845f, -0.156077f, 0.000000f, -0.738585f, 0.655845f, -0.156077f, 0.762112f, 0.497855f, - -0.669131f, 0.743144f, 0.000000f, 0.000000f, -0.669131f, 0.743144f, 0.000000f, 0.497466f, 0.250141f, - 0.000000f, 0.894427f, 0.447214f, 0.000000f, 0.000000f, 0.894427f, 0.447214f, 0.268343f, 0.250971f, - -0.107846f, 0.945626f, 0.306855f, 0.000000f, -0.107846f, 0.945626f, 0.306855f, 0.869292f, 0.512408f, - -0.174499f, 0.853887f, 0.490334f, 0.000000f, -0.174499f, 0.853887f, 0.490334f, 0.500000f, 0.836442f, - -0.107846f, 0.945626f, 0.306855f, 0.000000f, -0.107846f, 0.945626f, 0.306855f, 0.869292f, 0.512408f, - -0.212031f, 0.964719f, 0.156077f, 0.000000f, -0.212031f, 0.964719f, 0.156077f, 0.512408f, 0.172078f, - -0.286151f, 0.894562f, 0.343331f, 0.000000f, -0.286151f, 0.894562f, 0.343331f, 0.590447f, 0.296632f, - -0.212031f, 0.964719f, 0.156077f, 0.000000f, -0.212031f, 0.964719f, 0.156077f, 0.512408f, 0.172078f, - -0.309017f, 0.951057f, 0.000000f, 0.000000f, -0.309017f, 0.951057f, 0.000000f, 0.590447f, 0.128428f, - -0.390694f, 0.901541f, 0.185961f, 0.000000f, -0.390694f, 0.901541f, 0.185961f, 0.669136f, 0.347417f, - -0.395510f, 0.905103f, -0.156077f, 0.000000f, -0.395510f, 0.905103f, -0.156077f, 0.590447f, 0.206107f, - -0.499999f, 0.866026f, 0.000000f, 0.000000f, -0.499999f, 0.866026f, 0.000000f, 0.437019f, 0.149181f, - -0.309017f, 0.951057f, 0.000000f, 0.000000f, -0.309017f, 0.951057f, 0.000000f, 0.590447f, 0.128428f, - -0.468576f, 0.828418f, -0.306855f, 0.000000f, -0.468576f, 0.828418f, -0.306855f, 0.668485f, 0.250116f, - -0.580460f, 0.798935f, -0.157379f, 0.000000f, -0.580460f, 0.798935f, -0.157379f, 0.643075f, 0.418781f, - -0.395510f, 0.905103f, -0.156077f, 0.000000f, -0.395510f, 0.905103f, -0.156077f, 0.590447f, 0.206107f, - -0.525731f, 0.723607f, -0.447214f, 0.000000f, -0.525731f, 0.723607f, -0.447214f, 0.446077f, 0.574219f, - -0.643075f, 0.701637f, -0.306855f, 0.000000f, -0.643075f, 0.701637f, -0.306855f, 0.821537f, 0.437019f, - -0.468576f, 0.828418f, -0.306855f, 0.000000f, -0.468576f, 0.828418f, -0.306855f, 0.668485f, 0.250116f, - -0.107846f, 0.945626f, 0.306855f, 0.000000f, -0.107846f, 0.945626f, 0.306855f, 0.869292f, 0.512408f, - -0.286151f, 0.894562f, 0.343331f, 0.000000f, -0.286151f, 0.894562f, 0.343331f, 0.590447f, 0.296632f, - -0.174499f, 0.853887f, 0.490334f, 0.000000f, -0.174499f, 0.853887f, 0.490334f, 0.500000f, 0.836442f, - -0.212031f, 0.964719f, 0.156077f, 0.000000f, -0.212031f, 0.964719f, 0.156077f, 0.512408f, 0.172078f, - -0.390694f, 0.901541f, 0.185961f, 0.000000f, -0.390694f, 0.901541f, 0.185961f, 0.669136f, 0.347417f, - -0.286151f, 0.894562f, 0.343331f, 0.000000f, -0.286151f, 0.894562f, 0.343331f, 0.590447f, 0.296632f, - -0.309017f, 0.951057f, 0.000000f, 0.000000f, -0.309017f, 0.951057f, 0.000000f, 0.590447f, 0.128428f, - -0.499999f, 0.866026f, 0.000000f, 0.000000f, -0.499999f, 0.866026f, 0.000000f, 0.437019f, 0.149181f, - -0.390694f, 0.901541f, 0.185961f, 0.000000f, -0.390694f, 0.901541f, 0.185961f, 0.669136f, 0.347417f, - -0.395510f, 0.905103f, -0.156077f, 0.000000f, -0.395510f, 0.905103f, -0.156077f, 0.590447f, 0.206107f, - -0.580460f, 0.798935f, -0.157379f, 0.000000f, -0.580460f, 0.798935f, -0.157379f, 0.643075f, 0.418781f, - -0.499999f, 0.866026f, 0.000000f, 0.000000f, -0.499999f, 0.866026f, 0.000000f, 0.437019f, 0.149181f, - -0.468576f, 0.828418f, -0.306855f, 0.000000f, -0.468576f, 0.828418f, -0.306855f, 0.668485f, 0.250116f, - -0.643075f, 0.701637f, -0.306855f, 0.000000f, -0.643075f, 0.701637f, -0.306855f, 0.821537f, 0.437019f, - -0.580460f, 0.798935f, -0.157379f, 0.000000f, -0.580460f, 0.798935f, -0.157379f, 0.643075f, 0.418781f, - -0.643075f, -0.701637f, 0.306855f, 0.000000f, -0.643075f, -0.701637f, 0.306855f, 0.500000f, 0.511757f, - -0.525731f, -0.723607f, 0.447214f, 0.000000f, -0.525731f, -0.723607f, 0.447214f, 0.321589f, 0.745561f, - -0.643075f, -0.588241f, 0.490334f, 0.000000f, -0.643075f, -0.588241f, 0.490334f, 0.411570f, 0.803612f, - -0.757312f, -0.555521f, 0.343331f, 0.000000f, -0.757312f, -0.555521f, 0.343331f, 0.727648f, 0.408548f, - -0.643075f, -0.588241f, 0.490334f, 0.000000f, -0.643075f, -0.588241f, 0.490334f, 0.411570f, 0.803612f, - -0.738585f, -0.432902f, 0.516806f, 0.000000f, -0.738585f, -0.432902f, 0.516806f, 0.250000f, 0.581230f, - -0.738585f, -0.655845f, 0.156077f, 0.000000f, -0.738585f, -0.655845f, 0.156077f, 0.552265f, 0.590447f, - -0.643075f, -0.701637f, 0.306855f, 0.000000f, -0.643075f, -0.701637f, 0.306855f, 0.500000f, 0.511757f, - -0.757312f, -0.555521f, 0.343331f, 0.000000f, -0.757312f, -0.555521f, 0.343331f, 0.727648f, 0.408548f, - -0.757312f, -0.555521f, 0.343331f, 0.000000f, -0.757312f, -0.555521f, 0.343331f, 0.727648f, 0.408548f, - -0.643075f, -0.701637f, 0.306855f, 0.000000f, -0.643075f, -0.701637f, 0.306855f, 0.500000f, 0.511757f, - -0.643075f, -0.588241f, 0.490334f, 0.000000f, -0.643075f, -0.588241f, 0.490334f, 0.411570f, 0.803612f, - -0.845991f, -0.389809f, 0.363797f, 0.000000f, -0.845991f, -0.389809f, 0.363797f, 0.695347f, 0.497466f, - -0.738585f, -0.432902f, 0.516806f, 0.000000f, -0.738585f, -0.432902f, 0.516806f, 0.250000f, 0.581230f, - -0.809017f, -0.262865f, 0.525731f, 0.000000f, -0.809017f, -0.262865f, 0.525731f, 0.327004f, 0.649190f, - -0.845991f, -0.499718f, 0.185961f, 0.000000f, -0.845991f, -0.499718f, 0.185961f, 0.816078f, 0.408548f, - -0.757312f, -0.555521f, 0.343331f, 0.000000f, -0.757312f, -0.555521f, 0.343331f, 0.727648f, 0.408548f, - -0.845991f, -0.389809f, 0.363797f, 0.000000f, -0.845991f, -0.389809f, 0.363797f, 0.695347f, 0.497466f, - -0.809017f, -0.587785f, 0.000000f, 0.000000f, -0.809017f, -0.587785f, 0.000000f, 0.554653f, 0.772345f, - -0.738585f, -0.655845f, 0.156077f, 0.000000f, -0.738585f, -0.655845f, 0.156077f, 0.552265f, 0.590447f, - -0.845991f, -0.499718f, 0.185961f, 0.000000f, -0.845991f, -0.499718f, 0.185961f, 0.816078f, 0.408548f, - -0.845991f, -0.389809f, 0.363797f, 0.000000f, -0.845991f, -0.389809f, 0.363797f, 0.695347f, 0.497466f, - -0.757312f, -0.555521f, 0.343331f, 0.000000f, -0.757312f, -0.555521f, 0.343331f, 0.727648f, 0.408548f, - -0.738585f, -0.432902f, 0.516806f, 0.000000f, -0.738585f, -0.432902f, 0.516806f, 0.250000f, 0.581230f, - -0.845991f, -0.499718f, 0.185961f, 0.000000f, -0.845991f, -0.499718f, 0.185961f, 0.816078f, 0.408548f, - -0.738585f, -0.655845f, 0.156077f, 0.000000f, -0.738585f, -0.655845f, 0.156077f, 0.552265f, 0.590447f, - -0.757312f, -0.555521f, 0.343331f, 0.000000f, -0.757312f, -0.555521f, 0.343331f, 0.727648f, 0.408548f, - -0.851981f, -0.083904f, 0.516806f, 0.000000f, -0.851981f, -0.083904f, 0.516806f, 0.411570f, 0.710631f, - -0.913545f, -0.181898f, 0.363797f, 0.000000f, -0.913545f, -0.181898f, 0.363797f, 0.788675f, 0.496650f, - -0.809017f, -0.262865f, 0.525731f, 0.000000f, -0.809017f, -0.262865f, 0.525731f, 0.327004f, 0.649190f, - -0.934172f, -0.303531f, 0.187593f, 0.000000f, -0.934172f, -0.303531f, 0.187593f, 0.418781f, 0.774291f, - -0.845991f, -0.389809f, 0.363797f, 0.000000f, -0.845991f, -0.389809f, 0.363797f, 0.695347f, 0.497466f, - -0.913545f, -0.181898f, 0.363797f, 0.000000f, -0.913545f, -0.181898f, 0.363797f, 0.788675f, 0.496650f, - -0.913545f, -0.406737f, 0.000000f, 0.000000f, -0.913545f, -0.406737f, 0.000000f, 0.497466f, 0.825082f, - -0.845991f, -0.499718f, 0.185961f, 0.000000f, -0.845991f, -0.499718f, 0.185961f, 0.816078f, 0.408548f, - -0.934172f, -0.303531f, 0.187593f, 0.000000f, -0.934172f, -0.303531f, 0.187593f, 0.418781f, 0.774291f, - -0.851981f, -0.499768f, -0.156077f, 0.000000f, -0.851981f, -0.499768f, -0.156077f, 0.734288f, 0.743874f, - -0.809017f, -0.587785f, 0.000000f, 0.000000f, -0.809017f, -0.587785f, 0.000000f, 0.554653f, 0.772345f, - -0.913545f, -0.406737f, 0.000000f, 0.000000f, -0.913545f, -0.406737f, 0.000000f, 0.497466f, 0.825082f, - -0.913545f, -0.181898f, 0.363797f, 0.000000f, -0.913545f, -0.181898f, 0.363797f, 0.788675f, 0.496650f, - -0.845991f, -0.389809f, 0.363797f, 0.000000f, -0.845991f, -0.389809f, 0.363797f, 0.695347f, 0.497466f, - -0.809017f, -0.262865f, 0.525731f, 0.000000f, -0.809017f, -0.262865f, 0.525731f, 0.327004f, 0.649190f, - -0.934172f, -0.303531f, 0.187593f, 0.000000f, -0.934172f, -0.303531f, 0.187593f, 0.418781f, 0.774291f, - -0.845991f, -0.499718f, 0.185961f, 0.000000f, -0.845991f, -0.499718f, 0.185961f, 0.816078f, 0.408548f, - -0.845991f, -0.389809f, 0.363797f, 0.000000f, -0.845991f, -0.389809f, 0.363797f, 0.695347f, 0.497466f, - -0.913545f, -0.406737f, 0.000000f, 0.000000f, -0.913545f, -0.406737f, 0.000000f, 0.497466f, 0.825082f, - -0.809017f, -0.587785f, 0.000000f, 0.000000f, -0.809017f, -0.587785f, 0.000000f, 0.554653f, 0.772345f, - -0.845991f, -0.499718f, 0.185961f, 0.000000f, -0.845991f, -0.499718f, 0.185961f, 0.816078f, 0.408548f, - -0.866018f, 0.097907f, 0.490334f, 0.000000f, -0.866018f, 0.097907f, 0.490334f, 0.328463f, 0.555736f, - -0.939205f, 0.004289f, 0.343331f, 0.000000f, -0.939205f, 0.004289f, 0.343331f, 0.408548f, 0.842063f, - -0.851981f, -0.083904f, 0.516806f, 0.000000f, -0.851981f, -0.083904f, 0.516806f, 0.411570f, 0.710631f, - -0.939205f, 0.004289f, 0.343331f, 0.000000f, -0.939205f, 0.004289f, 0.343331f, 0.408548f, 0.842063f, - -0.978148f, -0.092980f, 0.185961f, 0.000000f, -0.978148f, -0.092980f, 0.185961f, 0.868343f, 0.497466f, - -0.913545f, -0.181898f, 0.363797f, 0.000000f, -0.913545f, -0.181898f, 0.363797f, 0.788675f, 0.496650f, - -0.978148f, -0.092980f, 0.185961f, 0.000000f, -0.978148f, -0.092980f, 0.185961f, 0.868343f, 0.497466f, - -0.978148f, -0.207911f, 0.000000f, 0.000000f, -0.978148f, -0.207911f, 0.000000f, 0.790231f, 0.669136f, - -0.934172f, -0.303531f, 0.187593f, 0.000000f, -0.934172f, -0.303531f, 0.187593f, 0.418781f, 0.774291f, - -0.939205f, -0.305166f, -0.157379f, 0.000000f, -0.939205f, -0.305166f, -0.157379f, 0.590447f, 0.871572f, - -0.913545f, -0.406737f, 0.000000f, 0.000000f, -0.913545f, -0.406737f, 0.000000f, 0.497466f, 0.825082f, - -0.978148f, -0.207911f, 0.000000f, 0.000000f, -0.978148f, -0.207911f, 0.000000f, 0.790231f, 0.669136f, - -0.939205f, -0.305166f, -0.157379f, 0.000000f, -0.939205f, -0.305166f, -0.157379f, 0.590447f, 0.871572f, - -0.866018f, -0.394782f, -0.306855f, 0.000000f, -0.866018f, -0.394782f, -0.306855f, 0.512408f, 0.749884f, - -0.851981f, -0.499768f, -0.156077f, 0.000000f, -0.851981f, -0.499768f, -0.156077f, 0.734288f, 0.743874f, - -0.939205f, 0.004289f, 0.343331f, 0.000000f, -0.939205f, 0.004289f, 0.343331f, 0.408548f, 0.842063f, - -0.913545f, -0.181898f, 0.363797f, 0.000000f, -0.913545f, -0.181898f, 0.363797f, 0.788675f, 0.496650f, - -0.851981f, -0.083904f, 0.516806f, 0.000000f, -0.851981f, -0.083904f, 0.516806f, 0.411570f, 0.710631f, - -0.978148f, -0.092980f, 0.185961f, 0.000000f, -0.978148f, -0.092980f, 0.185961f, 0.868343f, 0.497466f, - -0.934172f, -0.303531f, 0.187593f, 0.000000f, -0.934172f, -0.303531f, 0.187593f, 0.418781f, 0.774291f, - -0.913545f, -0.181898f, 0.363797f, 0.000000f, -0.913545f, -0.181898f, 0.363797f, 0.788675f, 0.496650f, - -0.978148f, -0.207911f, 0.000000f, 0.000000f, -0.978148f, -0.207911f, 0.000000f, 0.790231f, 0.669136f, - -0.913545f, -0.406737f, 0.000000f, 0.000000f, -0.913545f, -0.406737f, 0.000000f, 0.497466f, 0.825082f, - -0.934172f, -0.303531f, 0.187593f, 0.000000f, -0.934172f, -0.303531f, 0.187593f, 0.418781f, 0.774291f, - -0.939205f, -0.305166f, -0.157379f, 0.000000f, -0.939205f, -0.305166f, -0.157379f, 0.590447f, 0.871572f, - -0.851981f, -0.499768f, -0.156077f, 0.000000f, -0.851981f, -0.499768f, -0.156077f, 0.734288f, 0.743874f, - -0.913545f, -0.406737f, 0.000000f, 0.000000f, -0.913545f, -0.406737f, 0.000000f, 0.497466f, 0.825082f, - -0.850651f, 0.276393f, 0.447214f, 0.000000f, -0.850651f, 0.276393f, 0.447214f, 0.588426f, 0.872062f, - -0.932670f, 0.189647f, 0.306855f, 0.000000f, -0.932670f, 0.189647f, 0.306855f, 0.590447f, 0.793893f, - -0.866018f, 0.097907f, 0.490334f, 0.000000f, -0.866018f, 0.097907f, 0.490334f, 0.328463f, 0.555736f, - -0.932670f, 0.189647f, 0.306855f, 0.000000f, -0.932670f, 0.189647f, 0.306855f, 0.590447f, 0.793893f, - -0.983024f, 0.096461f, 0.156077f, 0.000000f, -0.983024f, 0.096461f, 0.156077f, 0.668485f, 0.827922f, - -0.939205f, 0.004289f, 0.343331f, 0.000000f, -0.939205f, 0.004289f, 0.343331f, 0.408548f, 0.842063f, - -0.983024f, 0.096461f, 0.156077f, 0.000000f, -0.983024f, 0.096461f, 0.156077f, 0.668485f, 0.827922f, - -1.000000f, 0.000000f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 0.743874f, 0.850819f, - -0.978148f, -0.092980f, 0.185961f, 0.000000f, -0.978148f, -0.092980f, 0.185961f, 0.868343f, 0.497466f, - -0.983024f, -0.096460f, -0.156077f, 0.000000f, -0.983024f, -0.096460f, -0.156077f, 0.821537f, 0.743874f, - -0.978148f, -0.207911f, 0.000000f, 0.000000f, -0.978148f, -0.207911f, 0.000000f, 0.790231f, 0.669136f, - -1.000000f, 0.000000f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 0.743874f, 0.850819f, - -0.932670f, -0.189647f, -0.306855f, 0.000000f, -0.932670f, -0.189647f, -0.306855f, 0.437019f, 0.594823f, - -0.939205f, -0.305166f, -0.157379f, 0.000000f, -0.939205f, -0.305166f, -0.157379f, 0.590447f, 0.871572f, - -0.983024f, -0.096460f, -0.156077f, 0.000000f, -0.983024f, -0.096460f, -0.156077f, 0.821537f, 0.743874f, - -0.850651f, -0.276393f, -0.447214f, 0.000000f, -0.850651f, -0.276393f, -0.447214f, 0.445347f, 0.922791f, - -0.866018f, -0.394782f, -0.306855f, 0.000000f, -0.866018f, -0.394782f, -0.306855f, 0.512408f, 0.749884f, - -0.932670f, -0.189647f, -0.306855f, 0.000000f, -0.932670f, -0.189647f, -0.306855f, 0.437019f, 0.594823f, - -0.932670f, 0.189647f, 0.306855f, 0.000000f, -0.932670f, 0.189647f, 0.306855f, 0.590447f, 0.793893f, - -0.939205f, 0.004289f, 0.343331f, 0.000000f, -0.939205f, 0.004289f, 0.343331f, 0.408548f, 0.842063f, - -0.866018f, 0.097907f, 0.490334f, 0.000000f, -0.866018f, 0.097907f, 0.490334f, 0.328463f, 0.555736f, - -0.983024f, 0.096461f, 0.156077f, 0.000000f, -0.983024f, 0.096461f, 0.156077f, 0.668485f, 0.827922f, - -0.978148f, -0.092980f, 0.185961f, 0.000000f, -0.978148f, -0.092980f, 0.185961f, 0.868343f, 0.497466f, - -0.939205f, 0.004289f, 0.343331f, 0.000000f, -0.939205f, 0.004289f, 0.343331f, 0.408548f, 0.842063f, - -1.000000f, 0.000000f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 0.743874f, 0.850819f, - -0.978148f, -0.207911f, 0.000000f, 0.000000f, -0.978148f, -0.207911f, 0.000000f, 0.790231f, 0.669136f, - -0.978148f, -0.092980f, 0.185961f, 0.000000f, -0.978148f, -0.092980f, 0.185961f, 0.868343f, 0.497466f, - -0.983024f, -0.096460f, -0.156077f, 0.000000f, -0.983024f, -0.096460f, -0.156077f, 0.821537f, 0.743874f, - -0.939205f, -0.305166f, -0.157379f, 0.000000f, -0.939205f, -0.305166f, -0.157379f, 0.590447f, 0.871572f, - -0.978148f, -0.207911f, 0.000000f, 0.000000f, -0.978148f, -0.207911f, 0.000000f, 0.790231f, 0.669136f, - -0.932670f, -0.189647f, -0.306855f, 0.000000f, -0.932670f, -0.189647f, -0.306855f, 0.437019f, 0.594823f, - -0.866018f, -0.394782f, -0.306855f, 0.000000f, -0.866018f, -0.394782f, -0.306855f, 0.512408f, 0.749884f, - -0.939205f, -0.305166f, -0.157379f, 0.000000f, -0.939205f, -0.305166f, -0.157379f, 0.590447f, 0.871572f, - 0.468576f, -0.828418f, 0.306855f, 0.000000f, 0.468576f, -0.828418f, 0.306855f, 0.178463f, 0.345280f, - 0.525731f, -0.723607f, 0.447214f, 0.000000f, 0.525731f, -0.723607f, 0.447214f, 0.606016f, 0.354082f, - 0.360730f, -0.793377f, 0.490334f, 0.000000f, 0.360730f, -0.793377f, 0.490334f, 0.446077f, 0.425781f, - 0.294309f, -0.891911f, 0.343331f, 0.000000f, 0.294309f, -0.891911f, 0.343331f, 0.869292f, 0.668485f, - 0.360730f, -0.793377f, 0.490334f, 0.000000f, 0.360730f, -0.793377f, 0.490334f, 0.446077f, 0.425781f, - 0.183479f, -0.836210f, 0.516806f, 0.000000f, 0.183479f, -0.836210f, 0.516806f, 0.258102f, 0.766841f, - 0.395510f, -0.905103f, 0.156077f, 0.000000f, 0.395510f, -0.905103f, 0.156077f, 0.131657f, 0.437784f, - 0.468576f, -0.828418f, 0.306855f, 0.000000f, 0.468576f, -0.828418f, 0.306855f, 0.178463f, 0.345280f, - 0.294309f, -0.891911f, 0.343331f, 0.000000f, 0.294309f, -0.891911f, 0.343331f, 0.869292f, 0.668485f, - 0.294309f, -0.891911f, 0.343331f, 0.000000f, 0.294309f, -0.891911f, 0.343331f, 0.869292f, 0.668485f, - 0.468576f, -0.828418f, 0.306855f, 0.000000f, 0.468576f, -0.828418f, 0.306855f, 0.178463f, 0.345280f, - 0.360730f, -0.793377f, 0.490334f, 0.000000f, 0.360730f, -0.793377f, 0.490334f, 0.446077f, 0.425781f, - 0.109305f, -0.925043f, 0.363797f, 0.000000f, 0.109305f, -0.925043f, 0.363797f, 0.183922f, 0.408548f, - 0.183479f, -0.836210f, 0.516806f, 0.000000f, 0.183479f, -0.836210f, 0.516806f, 0.258102f, 0.766841f, - -0.000000f, -0.850651f, 0.525731f, 0.000000f, -0.000000f, -0.850651f, 0.525731f, 0.238575f, 0.258102f, - 0.213834f, -0.959006f, 0.185961f, 0.000000f, 0.213834f, -0.959006f, 0.185961f, 0.272352f, 0.408548f, - 0.294309f, -0.891911f, 0.343331f, 0.000000f, 0.294309f, -0.891911f, 0.343331f, 0.869292f, 0.668485f, - 0.109305f, -0.925043f, 0.363797f, 0.000000f, 0.109305f, -0.925043f, 0.363797f, 0.183922f, 0.408548f, - 0.309017f, -0.951057f, 0.000000f, 0.000000f, 0.309017f, -0.951057f, 0.000000f, 0.183922f, 0.509719f, - 0.395510f, -0.905103f, 0.156077f, 0.000000f, 0.395510f, -0.905103f, 0.156077f, 0.131657f, 0.437784f, - 0.213834f, -0.959006f, 0.185961f, 0.000000f, 0.213834f, -0.959006f, 0.185961f, 0.272352f, 0.408548f, - 0.109305f, -0.925043f, 0.363797f, 0.000000f, 0.109305f, -0.925043f, 0.363797f, 0.183922f, 0.408548f, - 0.294309f, -0.891911f, 0.343331f, 0.000000f, 0.294309f, -0.891911f, 0.343331f, 0.869292f, 0.668485f, - 0.183479f, -0.836210f, 0.516806f, 0.000000f, 0.183479f, -0.836210f, 0.516806f, 0.258102f, 0.766841f, - 0.213834f, -0.959006f, 0.185961f, 0.000000f, 0.213834f, -0.959006f, 0.185961f, 0.272352f, 0.408548f, - 0.395510f, -0.905103f, 0.156077f, 0.000000f, 0.395510f, -0.905103f, 0.156077f, 0.131657f, 0.437784f, - 0.294309f, -0.891911f, 0.343331f, 0.000000f, 0.294309f, -0.891911f, 0.343331f, 0.869292f, 0.668485f, - -0.183479f, -0.836210f, 0.516806f, 0.000000f, -0.183479f, -0.836210f, 0.516806f, 0.180025f, 0.332044f, - -0.109305f, -0.925043f, 0.363797f, 0.000000f, -0.109305f, -0.925043f, 0.363797f, 0.211325f, 0.496650f, - -0.000000f, -0.850651f, 0.525731f, 0.000000f, -0.000000f, -0.850651f, 0.525731f, 0.238575f, 0.258102f, - -0.109305f, -0.925043f, 0.363797f, 0.000000f, -0.109305f, -0.925043f, 0.363797f, 0.211325f, 0.496650f, - -0.000000f, -0.982247f, 0.187593f, 0.000000f, -0.000000f, -0.982247f, 0.187593f, 0.131658f, 0.497466f, - 0.109305f, -0.925043f, 0.363797f, 0.000000f, 0.109305f, -0.925043f, 0.363797f, 0.183922f, 0.408548f, - 0.104529f, -0.994522f, 0.000000f, 0.000000f, 0.104529f, -0.994522f, 0.000000f, 0.356925f, 0.418781f, - 0.213834f, -0.959006f, 0.185961f, 0.000000f, 0.213834f, -0.959006f, 0.185961f, 0.272352f, 0.408548f, - -0.000000f, -0.982247f, 0.187593f, 0.000000f, -0.000000f, -0.982247f, 0.187593f, 0.131658f, 0.497466f, - 0.104529f, -0.994522f, 0.000000f, 0.000000f, 0.104529f, -0.994522f, 0.000000f, 0.356925f, 0.418781f, - 0.212032f, -0.964719f, -0.156077f, 0.000000f, 0.212032f, -0.964719f, -0.156077f, 0.272352f, 0.480987f, - 0.309017f, -0.951057f, 0.000000f, 0.000000f, 0.309017f, -0.951057f, 0.000000f, 0.183922f, 0.509719f, - -0.109305f, -0.925043f, 0.363797f, 0.000000f, -0.109305f, -0.925043f, 0.363797f, 0.211325f, 0.496650f, - 0.109305f, -0.925043f, 0.363797f, 0.000000f, 0.109305f, -0.925043f, 0.363797f, 0.183922f, 0.408548f, - -0.000000f, -0.850651f, 0.525731f, 0.000000f, -0.000000f, -0.850651f, 0.525731f, 0.238575f, 0.258102f, - -0.000000f, -0.982247f, 0.187593f, 0.000000f, -0.000000f, -0.982247f, 0.187593f, 0.131658f, 0.497466f, - 0.213834f, -0.959006f, 0.185961f, 0.000000f, 0.213834f, -0.959006f, 0.185961f, 0.272352f, 0.408548f, - 0.109305f, -0.925043f, 0.363797f, 0.000000f, 0.109305f, -0.925043f, 0.363797f, 0.183922f, 0.408548f, - 0.104529f, -0.994522f, 0.000000f, 0.000000f, 0.104529f, -0.994522f, 0.000000f, 0.356925f, 0.418781f, - 0.309017f, -0.951057f, 0.000000f, 0.000000f, 0.309017f, -0.951057f, 0.000000f, 0.183922f, 0.509719f, - 0.213834f, -0.959006f, 0.185961f, 0.000000f, 0.213834f, -0.959006f, 0.185961f, 0.272352f, 0.408548f, - -0.360730f, -0.793377f, 0.490334f, 0.000000f, -0.360730f, -0.793377f, 0.490334f, 0.327004f, 0.258102f, - -0.294310f, -0.891911f, 0.343331f, 0.000000f, -0.294310f, -0.891911f, 0.343331f, 0.304653f, 0.497466f, - -0.183479f, -0.836210f, 0.516806f, 0.000000f, -0.183479f, -0.836210f, 0.516806f, 0.180025f, 0.332044f, - -0.294310f, -0.891911f, 0.343331f, 0.000000f, -0.294310f, -0.891911f, 0.343331f, 0.304653f, 0.497466f, - -0.213835f, -0.959006f, 0.185961f, 0.000000f, -0.213835f, -0.959006f, 0.185961f, 0.209770f, 0.669136f, - -0.109305f, -0.925043f, 0.363797f, 0.000000f, -0.109305f, -0.925043f, 0.363797f, 0.211325f, 0.496650f, - -0.213835f, -0.959006f, 0.185961f, 0.000000f, -0.213835f, -0.959006f, 0.185961f, 0.209770f, 0.669136f, - -0.104529f, -0.994522f, 0.000000f, 0.000000f, -0.104529f, -0.994522f, 0.000000f, 0.130708f, 0.668485f, - -0.000000f, -0.982247f, 0.187593f, 0.000000f, -0.000000f, -0.982247f, 0.187593f, 0.131658f, 0.497466f, - -0.104529f, -0.994522f, 0.000000f, 0.000000f, -0.104529f, -0.994522f, 0.000000f, 0.130708f, 0.668485f, - -0.000000f, -0.987538f, -0.157379f, 0.000000f, -0.000000f, -0.987538f, -0.157379f, 0.647155f, 0.418781f, - 0.104529f, -0.994522f, 0.000000f, 0.000000f, 0.104529f, -0.994522f, 0.000000f, 0.356925f, 0.418781f, - -0.000000f, -0.987538f, -0.157379f, 0.000000f, -0.000000f, -0.987538f, -0.157379f, 0.647155f, 0.418781f, - 0.107846f, -0.945626f, -0.306855f, 0.000000f, 0.107846f, -0.945626f, -0.306855f, 0.356925f, 0.453512f, - 0.212032f, -0.964719f, -0.156077f, 0.000000f, 0.212032f, -0.964719f, -0.156077f, 0.272352f, 0.480987f, - -0.294310f, -0.891911f, 0.343331f, 0.000000f, -0.294310f, -0.891911f, 0.343331f, 0.304653f, 0.497466f, - -0.109305f, -0.925043f, 0.363797f, 0.000000f, -0.109305f, -0.925043f, 0.363797f, 0.211325f, 0.496650f, - -0.183479f, -0.836210f, 0.516806f, 0.000000f, -0.183479f, -0.836210f, 0.516806f, 0.180025f, 0.332044f, - -0.213835f, -0.959006f, 0.185961f, 0.000000f, -0.213835f, -0.959006f, 0.185961f, 0.209770f, 0.669136f, - -0.000000f, -0.982247f, 0.187593f, 0.000000f, -0.000000f, -0.982247f, 0.187593f, 0.131658f, 0.497466f, - -0.109305f, -0.925043f, 0.363797f, 0.000000f, -0.109305f, -0.925043f, 0.363797f, 0.211325f, 0.496650f, - -0.104529f, -0.994522f, 0.000000f, 0.000000f, -0.104529f, -0.994522f, 0.000000f, 0.130708f, 0.668485f, - 0.104529f, -0.994522f, 0.000000f, 0.000000f, 0.104529f, -0.994522f, 0.000000f, 0.356925f, 0.418781f, - -0.000000f, -0.982247f, 0.187593f, 0.000000f, -0.000000f, -0.982247f, 0.187593f, 0.131658f, 0.497466f, - -0.000000f, -0.987538f, -0.157379f, 0.000000f, -0.000000f, -0.987538f, -0.157379f, 0.647155f, 0.418781f, - 0.212032f, -0.964719f, -0.156077f, 0.000000f, 0.212032f, -0.964719f, -0.156077f, 0.272352f, 0.480987f, - 0.104529f, -0.994522f, 0.000000f, 0.000000f, 0.104529f, -0.994522f, 0.000000f, 0.356925f, 0.418781f, - -0.525731f, -0.723607f, 0.447214f, 0.000000f, -0.525731f, -0.723607f, 0.447214f, 0.321589f, 0.745561f, - -0.468576f, -0.828418f, 0.306855f, 0.000000f, -0.468576f, -0.828418f, 0.306855f, 0.393984f, 0.512408f, - -0.360730f, -0.793377f, 0.490334f, 0.000000f, -0.360730f, -0.793377f, 0.490334f, 0.327004f, 0.258102f, - -0.468576f, -0.828418f, 0.306855f, 0.000000f, -0.468576f, -0.828418f, 0.306855f, 0.393984f, 0.512408f, - -0.395511f, -0.905103f, 0.156077f, 0.000000f, -0.395511f, -0.905103f, 0.156077f, 0.345491f, 0.590447f, - -0.294310f, -0.891911f, 0.343331f, 0.000000f, -0.294310f, -0.891911f, 0.343331f, 0.304653f, 0.497466f, - -0.395511f, -0.905103f, 0.156077f, 0.000000f, -0.395511f, -0.905103f, 0.156077f, 0.345491f, 0.590447f, - -0.309017f, -0.951056f, 0.000000f, 0.000000f, -0.309017f, -0.951056f, 0.000000f, 0.302245f, 0.668485f, - -0.213835f, -0.959006f, 0.185961f, 0.000000f, -0.213835f, -0.959006f, 0.185961f, 0.209770f, 0.669136f, - -0.212032f, -0.964719f, -0.156077f, 0.000000f, -0.212032f, -0.964719f, -0.156077f, 0.265712f, 0.743874f, - -0.104529f, -0.994522f, 0.000000f, 0.000000f, -0.104529f, -0.994522f, 0.000000f, 0.130708f, 0.668485f, - -0.309017f, -0.951056f, 0.000000f, 0.000000f, -0.309017f, -0.951056f, 0.000000f, 0.302245f, 0.668485f, - -0.107846f, -0.945626f, -0.306855f, 0.000000f, -0.107846f, -0.945626f, -0.306855f, 0.553923f, 0.437019f, - -0.000000f, -0.987538f, -0.157379f, 0.000000f, -0.000000f, -0.987538f, -0.157379f, 0.647155f, 0.418781f, - -0.212032f, -0.964719f, -0.156077f, 0.000000f, -0.212032f, -0.964719f, -0.156077f, 0.265712f, 0.743874f, - -0.107846f, -0.945626f, -0.306855f, 0.000000f, -0.107846f, -0.945626f, -0.306855f, 0.553923f, 0.437019f, - 0.000000f, -0.894427f, -0.447214f, 0.000000f, 0.000000f, -0.894427f, -0.447214f, 0.848850f, 0.215669f, - 0.107846f, -0.945626f, -0.306855f, 0.000000f, 0.107846f, -0.945626f, -0.306855f, 0.356925f, 0.453512f, - -0.468576f, -0.828418f, 0.306855f, 0.000000f, -0.468576f, -0.828418f, 0.306855f, 0.393984f, 0.512408f, - -0.294310f, -0.891911f, 0.343331f, 0.000000f, -0.294310f, -0.891911f, 0.343331f, 0.304653f, 0.497466f, - -0.360730f, -0.793377f, 0.490334f, 0.000000f, -0.360730f, -0.793377f, 0.490334f, 0.327004f, 0.258102f, - -0.395511f, -0.905103f, 0.156077f, 0.000000f, -0.395511f, -0.905103f, 0.156077f, 0.345491f, 0.590447f, - -0.213835f, -0.959006f, 0.185961f, 0.000000f, -0.213835f, -0.959006f, 0.185961f, 0.209770f, 0.669136f, - -0.294310f, -0.891911f, 0.343331f, 0.000000f, -0.294310f, -0.891911f, 0.343331f, 0.304653f, 0.497466f, - -0.309017f, -0.951056f, 0.000000f, 0.000000f, -0.309017f, -0.951056f, 0.000000f, 0.302245f, 0.668485f, - -0.104529f, -0.994522f, 0.000000f, 0.000000f, -0.104529f, -0.994522f, 0.000000f, 0.130708f, 0.668485f, - -0.213835f, -0.959006f, 0.185961f, 0.000000f, -0.213835f, -0.959006f, 0.185961f, 0.209770f, 0.669136f, - -0.212032f, -0.964719f, -0.156077f, 0.000000f, -0.212032f, -0.964719f, -0.156077f, 0.265712f, 0.743874f, - -0.000000f, -0.987538f, -0.157379f, 0.000000f, -0.000000f, -0.987538f, -0.157379f, 0.647155f, 0.418781f, - -0.104529f, -0.994522f, 0.000000f, 0.000000f, -0.104529f, -0.994522f, 0.000000f, 0.130708f, 0.668485f, - -0.107846f, -0.945626f, -0.306855f, 0.000000f, -0.107846f, -0.945626f, -0.306855f, 0.553923f, 0.437019f, - 0.107846f, -0.945626f, -0.306855f, 0.000000f, 0.107846f, -0.945626f, -0.306855f, 0.356925f, 0.453512f, - -0.000000f, -0.987538f, -0.157379f, 0.000000f, -0.000000f, -0.987538f, -0.157379f, 0.647155f, 0.418781f}; - -static const int detailed_sphere_indices[] = - { - 0, 1, 2, - 3, 4, 5, - 6, 7, 8, - 9, 10, 11, - 12, 13, 14, - 15, 16, 17, - 18, 19, 20, - 21, 22, 23, - 24, 25, 26, - 27, 28, 29, - 30, 31, 32, - 33, 34, 35, - 36, 37, 38, - 39, 40, 41, - 42, 43, 44, - 45, 46, 47, - 48, 49, 50, - 51, 52, 53, - 54, 55, 56, - 57, 58, 59, - 60, 61, 62, - 63, 64, 65, - 66, 67, 68, - 69, 70, 71, - 72, 73, 74, - 75, 76, 77, - 78, 79, 80, - 81, 82, 83, - 84, 85, 86, - 87, 88, 89, - 90, 91, 92, - 93, 94, 95, - 96, 97, 98, - 99, 100, 101, - 102, 103, 104, - 105, 106, 107, - 108, 109, 110, - 111, 112, 113, - 114, 115, 116, - 117, 118, 119, - 120, 121, 122, - 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, 256, 257, - 258, 259, 260, - 261, 262, 263, - 264, 265, 266, - 267, 268, 269, - 270, 271, 272, - 273, 274, 275, - 276, 277, 278, - 279, 280, 281, - 282, 283, 284, - 285, 286, 287, - 288, 289, 290, - 291, 292, 293, - 294, 295, 296, - 297, 298, 299, - 300, 301, 302, - 303, 304, 305, - 306, 307, 308, - 309, 310, 311, - 312, 313, 314, - 315, 316, 317, - 318, 319, 320, - 321, 322, 323, - 324, 325, 326, - 327, 328, 329, - 330, 331, 332, - 333, 334, 335, - 336, 337, 338, - 339, 340, 341, - 342, 343, 344, - 345, 346, 347, - 348, 349, 350, - 351, 352, 353, - 354, 355, 356, - 357, 358, 359, - 360, 361, 362, - 363, 364, 365, - 366, 367, 368, - 369, 370, 371, - 372, 373, 374, - 375, 376, 377, - 378, 379, 380, - 381, 382, 383, - 384, 385, 386, - 387, 388, 389, - 390, 391, 392, - 393, 394, 395, - 396, 397, 398, - 399, 400, 401, - 402, 403, 404, - 405, 406, 407, - 408, 409, 410, - 411, 412, 413, - 414, 415, 416, - 417, 418, 419, - 420, 421, 422, - 423, 424, 425, - 426, 427, 428, - 429, 430, 431, - 432, 433, 434, - 435, 436, 437, - 438, 439, 440, - 441, 442, 443, - 444, 445, 446, - 447, 448, 449, - 450, 451, 452, - 453, 454, 455, - 456, 457, 458, - 459, 460, 461, - 462, 463, 464, - 465, 466, 467, - 468, 469, 470, - 471, 472, 473, - 474, 475, 476, - 477, 478, 479, - 480, 481, 482, - 483, 484, 485, - 486, 487, 488, - 489, 490, 491, - 492, 493, 494, - 495, 496, 497, - 498, 499, 500, - 501, 502, 503, - 504, 505, 506, - 507, 508, 509, - 510, 511, 512, - 513, 514, 515, - 516, 517, 518, - 519, 520, 521, - 522, 523, 524, - 525, 526, 527, - 528, 529, 530, - 531, 532, 533, - 534, 535, 536, - 537, 538, 539, - 540, 541, 542, - 543, 544, 545, - 546, 547, 548, - 549, 550, 551, - 552, 553, 554, - 555, 556, 557, - 558, 559, 560, - 561, 562, 563, - 564, 565, 566, - 567, 568, 569, - 570, 571, 572, - 573, 574, 575, - 576, 577, 578, - 579, 580, 581, - 582, 583, 584, - 585, 586, 587, - 588, 589, 590, - 591, 592, 593, - 594, 595, 596, - 597, 598, 599, - 600, 601, 602, - 603, 604, 605, - 606, 607, 608, - 609, 610, 611, - 612, 613, 614, - 615, 616, 617, - 618, 619, 620, - 621, 622, 623, - 624, 625, 626, - 627, 628, 629, - 630, 631, 632, - 633, 634, 635, - 636, 637, 638, - 639, 640, 641, - 642, 643, 644, - 645, 646, 647, - 648, 649, 650, - 651, 652, 653, - 654, 655, 656, - 657, 658, 659, - 660, 661, 662, - 663, 664, 665, - 666, 667, 668, - 669, 670, 671, - 672, 673, 674, - 675, 676, 677, - 678, 679, 680, - 681, 682, 683, - 684, 685, 686, - 687, 688, 689, - 690, 691, 692, - 693, 694, 695, - 696, 697, 698, - 699, 700, 701, - 702, 703, 704, - 705, 706, 707, - 708, 709, 710, - 711, 712, 713, - 714, 715, 716, - 717, 718, 719, - 720, 721, 722, - 723, 724, 725, - 726, 727, 728, - 729, 730, 731, - 732, 733, 734, - 735, 736, 737, - 738, 739, 740, - 741, 742, 743, - 744, 745, 746, - 747, 748, 749, - 750, 751, 752, - 753, 754, 755, - 756, 757, 758, - 759, 760, 761, - 762, 763, 764, - 765, 766, 767, - 768, 769, 770, - 771, 772, 773, - 774, 775, 776, - 777, 778, 779, - 780, 781, 782, - 783, 784, 785, - 786, 787, 788, - 789, 790, 791, - 792, 793, 794, - 795, 796, 797, - 798, 799, 800, - 801, 802, 803, - 804, 805, 806, - 807, 808, 809, - 810, 811, 812, - 813, 814, 815, - 816, 817, 818, - 819, 820, 821, - 822, 823, 824, - 825, 826, 827, - 828, 829, 830, - 831, 832, 833, - 834, 835, 836, - 837, 838, 839, - 840, 841, 842, - 843, 844, 845, - 846, 847, 848, - 849, 850, 851, - 852, 853, 854, - 855, 856, 857, - 858, 859, 860, - 861, 862, 863, - 864, 865, 866, - 867, 868, 869, - 870, 871, 872, - 873, 874, 875, - 876, 877, 878, - 879, 880, 881, - 882, 883, 884, - 885, 886, 887, - 888, 889, 890, - 891, 892, 893, - 894, 895, 896, - 897, 898, 899, - 900, 901, 902, - 903, 904, 905, - 906, 907, 908, - 909, 910, 911, - 912, 913, 914, - 915, 916, 917, - 918, 919, 920, - 921, 922, 923, - 924, 925, 926, - 927, 928, 929, - 930, 931, 932, - 933, 934, 935, - 936, 937, 938, - 939, 940, 941, - 942, 943, 944, - 945, 946, 947, - 948, 949, 950, - 951, 952, 953, - 954, 955, 956, - 957, 958, 959, - 960, 961, 962, - 963, 964, 965, - 966, 967, 968, - 969, 970, 971, - 972, 973, 974, - 975, 976, 977, - 978, 979, 980, - 981, 982, 983, - 984, 985, 986, - 987, 988, 989, - 990, 991, 992, - 993, 994, 995, - 996, 997, 998, - 999, 1000, 1001, - 1002, 1003, 1004, - 1005, 1006, 1007, - 1008, 1009, 1010, - 1011, 1012, 1013, - 1014, 1015, 1016, - 1017, 1018, 1019, - 1020, 1021, 1022, - 1023, 1024, 1025, - 1026, 1027, 1028, - 1029, 1030, 1031, - 1032, 1033, 1034, - 1035, 1036, 1037, - 1038, 1039, 1040, - 1041, 1042, 1043, - 1044, 1045, 1046, - 1047, 1048, 1049, - 1050, 1051, 1052, - 1053, 1054, 1055, - 1056, 1057, 1058, - 1059, 1060, 1061, - 1062, 1063, 1064, - 1065, 1066, 1067, - 1068, 1069, 1070, - 1071, 1072, 1073, - 1074, 1075, 1076, - 1077, 1078, 1079, - 1080, 1081, 1082, - 1083, 1084, 1085, - 1086, 1087, 1088, - 1089, 1090, 1091, - 1092, 1093, 1094, - 1095, 1096, 1097, - 1098, 1099, 1100, - 1101, 1102, 1103, - 1104, 1105, 1106, - 1107, 1108, 1109, - 1110, 1111, 1112, - 1113, 1114, 1115, - 1116, 1117, 1118, - 1119, 1120, 1121, - 1122, 1123, 1124, - 1125, 1126, 1127, - 1128, 1129, 1130, - 1131, 1132, 1133, - 1134, 1135, 1136, - 1137, 1138, 1139, - 1140, 1141, 1142, - 1143, 1144, 1145, - 1146, 1147, 1148, - 1149, 1150, 1151, - 1152, 1153, 1154, - 1155, 1156, 1157, - 1158, 1159, 1160, - 1161, 1162, 1163, - 1164, 1165, 1166, - 1167, 1168, 1169, - 1170, 1171, 1172, - 1173, 1174, 1175, - 1176, 1177, 1178, - 1179, 1180, 1181, - 1182, 1183, 1184, - 1185, 1186, 1187, - 1188, 1189, 1190, - 1191, 1192, 1193, - 1194, 1195, 1196, - 1197, 1198, 1199, - 1200, 1201, 1202, - 1203, 1204, 1205, - 1206, 1207, 1208, - 1209, 1210, 1211, - 1212, 1213, 1214, - 1215, 1216, 1217, - 1218, 1219, 1220, - 1221, 1222, 1223, - 1224, 1225, 1226, - 1227, 1228, 1229, - 1230, 1231, 1232, - 1233, 1234, 1235, - 1236, 1237, 1238, - 1239, 1240, 1241, - 1242, 1243, 1244, - 1245, 1246, 1247, - 1248, 1249, 1250, - 1251, 1252, 1253, - 1254, 1255, 1256, - 1257, 1258, 1259, - 1260, 1261, 1262, - 1263, 1264, 1265, - 1266, 1267, 1268, - 1269, 1270, 1271, - 1272, 1273, 1274, - 1275, 1276, 1277, - 1278, 1279, 1280, - 1281, 1282, 1283, - 1284, 1285, 1286, - 1287, 1288, 1289, - 1290, 1291, 1292, - 1293, 1294, 1295, - 1296, 1297, 1298, - 1299, 1300, 1301, - 1302, 1303, 1304, - 1305, 1306, 1307, - 1308, 1309, 1310, - 1311, 1312, 1313, - 1314, 1315, 1316, - 1317, 1318, 1319, - 1320, 1321, 1322, - 1323, 1324, 1325, - 1326, 1327, 1328, - 1329, 1330, 1331, - 1332, 1333, 1334, - 1335, 1336, 1337, - 1338, 1339, 1340, - 1341, 1342, 1343, - 1344, 1345, 1346, - 1347, 1348, 1349, - 1350, 1351, 1352, - 1353, 1354, 1355, - 1356, 1357, 1358, - 1359, 1360, 1361, - 1362, 1363, 1364, - 1365, 1366, 1367, - 1368, 1369, 1370, - 1371, 1372, 1373, - 1374, 1375, 1376, - 1377, 1378, 1379, - 1380, 1381, 1382, - 1383, 1384, 1385, - 1386, 1387, 1388, - 1389, 1390, 1391, - 1392, 1393, 1394, - 1395, 1396, 1397, - 1398, 1399, 1400, - 1401, 1402, 1403, - 1404, 1405, 1406, - 1407, 1408, 1409, - 1410, 1411, 1412, - 1413, 1414, 1415, - 1416, 1417, 1418, - 1419, 1420, 1421, - 1422, 1423, 1424, - 1425, 1426, 1427, - 1428, 1429, 1430, - 1431, 1432, 1433, - 1434, 1435, 1436, - 1437, 1438, 1439, - 1440, 1441, 1442, - 1443, 1444, 1445, - 1446, 1447, 1448, - 1449, 1450, 1451, - 1452, 1453, 1454, - 1455, 1456, 1457, - 1458, 1459, 1460, - 1461, 1462, 1463, - 1464, 1465, 1466, - 1467, 1468, 1469, - 1470, 1471, 1472, - 1473, 1474, 1475, - 1476, 1477, 1478, - 1479, 1480, 1481, - 1482, 1483, 1484, - 1485, 1486, 1487, - 1488, 1489, 1490, - 1491, 1492, 1493, - 1494, 1495, 1496, - 1497, 1498, 1499, - 1500, 1501, 1502, - 1503, 1504, 1505, - 1506, 1507, 1508, - 1509, 1510, 1511, - 1512, 1513, 1514, - 1515, 1516, 1517, - 1518, 1519, 1520, - 1521, 1522, 1523, - 1524, 1525, 1526, - 1527, 1528, 1529, - 1530, 1531, 1532, - 1533, 1534, 1535, - 1536, 1537, 1538, - 1539, 1540, 1541, - 1542, 1543, 1544, - 1545, 1546, 1547, - 1548, 1549, 1550, - 1551, 1552, 1553, - 1554, 1555, 1556, - 1557, 1558, 1559, - 1560, 1561, 1562, - 1563, 1564, 1565, - 1566, 1567, 1568, - 1569, 1570, 1571, - 1572, 1573, 1574, - 1575, 1576, 1577, - 1578, 1579, 1580, - 1581, 1582, 1583, - 1584, 1585, 1586, - 1587, 1588, 1589, - 1590, 1591, 1592, - 1593, 1594, 1595, - 1596, 1597, 1598, - 1599, 1600, 1601, - 1602, 1603, 1604, - 1605, 1606, 1607, - 1608, 1609, 1610, - 1611, 1612, 1613, - 1614, 1615, 1616, - 1617, 1618, 1619, - 1620, 1621, 1622, - 1623, 1624, 1625, - 1626, 1627, 1628, - 1629, 1630, 1631, - 1632, 1633, 1634, - 1635, 1636, 1637, - 1638, 1639, 1640, - 1641, 1642, 1643, - 1644, 1645, 1646, - 1647, 1648, 1649, - 1650, 1651, 1652, - 1653, 1654, 1655, - 1656, 1657, 1658, - 1659, 1660, 1661, - 1662, 1663, 1664, - 1665, 1666, 1667, - 1668, 1669, 1670, - 1671, 1672, 1673, - 1674, 1675, 1676, - 1677, 1678, 1679, - 1680, 1681, 1682, - 1683, 1684, 1685, - 1686, 1687, 1688, - 1689, 1690, 1691, - 1692, 1693, 1694, - 1695, 1696, 1697, - 1698, 1699, 1700, - 1701, 1702, 1703, - 1704, 1705, 1706, - 1707, 1708, 1709, - 1710, 1711, 1712, - 1713, 1714, 1715, - 1716, 1717, 1718, - 1719, 1720, 1721, - 1722, 1723, 1724, - 1725, 1726, 1727, - 1728, 1729, 1730, - 1731, 1732, 1733, - 1734, 1735, 1736, - 1737, 1738, 1739, - 1740, 1741, 1742, - 1743, 1744, 1745, - 1746, 1747, 1748, - 1749, 1750, 1751, - 1752, 1753, 1754, - 1755, 1756, 1757, - 1758, 1759, 1760, - 1761, 1762, 1763, - 1764, 1765, 1766, - 1767, 1768, 1769, - 1770, 1771, 1772, - 1773, 1774, 1775, - 1776, 1777, 1778, - 1779, 1780, 1781, - 1782, 1783, 1784, - 1785, 1786, 1787, - 1788, 1789, 1790, - 1791, 1792, 1793, - 1794, 1795, 1796, - 1797, 1798, 1799, - 1800, 1801, 1802, - 1803, 1804, 1805, - 1806, 1807, 1808, - 1809, 1810, 1811, - 1812, 1813, 1814, - 1815, 1816, 1817, - 1818, 1819, 1820, - 1821, 1822, 1823, - 1824, 1825, 1826, - 1827, 1828, 1829, - 1830, 1831, 1832, - 1833, 1834, 1835, - 1836, 1837, 1838, - 1839, 1840, 1841, - 1842, 1843, 1844, - 1845, 1846, 1847, - 1848, 1849, 1850, - 1851, 1852, 1853, - 1854, 1855, 1856, - 1857, 1858, 1859, - 1860, 1861, 1862, - 1863, 1864, 1865, - 1866, 1867, 1868, - 1869, 1870, 1871, - 1872, 1873, 1874, - 1875, 1876, 1877, - 1878, 1879, 1880, - 1881, 1882, 1883, - 1884, 1885, 1886, - 1887, 1888, 1889, - 1890, 1891, 1892, - 1893, 1894, 1895, - 1896, 1897, 1898, - 1899, 1900, 1901, - 1902, 1903, 1904, - 1905, 1906, 1907, - 1908, 1909, 1910, - 1911, 1912, 1913, - 1914, 1915, 1916, - 1917, 1918, 1919, - 1920, 1921, 1922, - 1923, 1924, 1925, - 1926, 1927, 1928, - 1929, 1930, 1931, - 1932, 1933, 1934, - 1935, 1936, 1937, - 1938, 1939, 1940, - 1941, 1942, 1943, - 1944, 1945, 1946, - 1947, 1948, 1949, - 1950, 1951, 1952, - 1953, 1954, 1955, - 1956, 1957, 1958, - 1959, 1960, 1961, - 1962, 1963, 1964, - 1965, 1966, 1967, - 1968, 1969, 1970, - 1971, 1972, 1973, - 1974, 1975, 1976, - 1977, 1978, 1979, - 1980, 1981, 1982, - 1983, 1984, 1985, - 1986, 1987, 1988, - 1989, 1990, 1991, - 1992, 1993, 1994, - 1995, 1996, 1997, - 1998, 1999, 2000, - 2001, 2002, 2003, - 2004, 2005, 2006, - 2007, 2008, 2009, - 2010, 2011, 2012, - 2013, 2014, 2015, - 2016, 2017, 2018, - 2019, 2020, 2021, - 2022, 2023, 2024, - 2025, 2026, 2027, - 2028, 2029, 2030, - 2031, 2032, 2033, - 2034, 2035, 2036, - 2037, 2038, 2039, - 2040, 2041, 2042, - 2043, 2044, 2045, - 2046, 2047, 2048, - 2049, 2050, 2051, - 2052, 2053, 2054, - 2055, 2056, 2057, - 2058, 2059, 2060, - 2061, 2062, 2063, - 2064, 2065, 2066, - 2067, 2068, 2069, - 2070, 2071, 2072, - 2073, 2074, 2075, - 2076, 2077, 2078, - 2079, 2080, 2081, - 2082, 2083, 2084, - 2085, 2086, 2087, - 2088, 2089, 2090, - 2091, 2092, 2093, - 2094, 2095, 2096, - 2097, 2098, 2099, - 2100, 2101, 2102, - 2103, 2104, 2105, - 2106, 2107, 2108, - 2109, 2110, 2111, - 2112, 2113, 2114, - 2115, 2116, 2117, - 2118, 2119, 2120, - 2121, 2122, 2123, - 2124, 2125, 2126, - 2127, 2128, 2129, - 2130, 2131, 2132, - 2133, 2134, 2135, - 2136, 2137, 2138, - 2139, 2140, 2141, - 2142, 2143, 2144, - 2145, 2146, 2147, - 2148, 2149, 2150, - 2151, 2152, 2153, - 2154, 2155, 2156, - 2157, 2158, 2159}; - -const float medium_sphere_vertices[] = - { - 0.000000f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 0.999999f, 0.020053f, - 0.203181f, -0.967950f, 0.147618f, 0.000000f, 0.203181f, -0.967950f, 0.147618f, 0.566902f, 0.400852f, - -0.077607f, -0.967950f, 0.238853f, 0.000000f, -0.077607f, -0.967950f, 0.238853f, 0.986368f, 0.352464f, - 0.723607f, -0.447220f, 0.525725f, 0.000000f, 0.723607f, -0.447220f, 0.525725f, 0.779690f, 0.082142f, - 0.609547f, -0.657519f, 0.442856f, 0.000000f, 0.609547f, -0.657519f, 0.442856f, 0.381800f, 0.317539f, - 0.812729f, -0.502301f, 0.295238f, 0.000000f, 0.812729f, -0.502301f, 0.295238f, 0.918131f, 0.436615f, - 0.000000f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 0.999999f, 0.020053f, - -0.077607f, -0.967950f, 0.238853f, 0.000000f, -0.077607f, -0.967950f, 0.238853f, 0.986368f, 0.352464f, - -0.251147f, -0.967949f, 0.000000f, 0.000000f, -0.251147f, -0.967949f, 0.000000f, 0.444254f, 0.709621f, - 0.000000f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 0.999999f, 0.020053f, - -0.251147f, -0.967949f, 0.000000f, 0.000000f, -0.251147f, -0.967949f, 0.000000f, 0.444254f, 0.709621f, - -0.077607f, -0.967950f, -0.238853f, 0.000000f, -0.077607f, -0.967950f, -0.238853f, 0.043816f, 0.747734f, - 0.000000f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 0.999999f, 0.020053f, - -0.077607f, -0.967950f, -0.238853f, 0.000000f, -0.077607f, -0.967950f, -0.238853f, 0.043816f, 0.747734f, - 0.203181f, -0.967950f, -0.147618f, 0.000000f, 0.203181f, -0.967950f, -0.147618f, 0.966205f, 0.438787f, - 0.723607f, -0.447220f, 0.525725f, 0.000000f, 0.723607f, -0.447220f, 0.525725f, 0.779690f, 0.082142f, - 0.812729f, -0.502301f, 0.295238f, 0.000000f, 0.812729f, -0.502301f, 0.295238f, 0.918131f, 0.436615f, - 0.860698f, -0.251151f, 0.442858f, 0.000000f, 0.860698f, -0.251151f, 0.442858f, 0.689049f, 0.234408f, - -0.276388f, -0.447220f, 0.850649f, 0.000000f, -0.276388f, -0.447220f, 0.850649f, 0.554423f, 0.061638f, - -0.029639f, -0.502302f, 0.864184f, 0.000000f, -0.029639f, -0.502302f, 0.864184f, 0.180731f, 0.340648f, - -0.155215f, -0.251152f, 0.955422f, 0.000000f, -0.155215f, -0.251152f, 0.955422f, 0.885924f, 0.257323f, - -0.894426f, -0.447216f, 0.000000f, 0.000000f, -0.894426f, -0.447216f, 0.000000f, 0.746383f, 0.351642f, - -0.831051f, -0.502299f, 0.238853f, 0.000000f, -0.831051f, -0.502299f, 0.238853f, 0.634945f, 0.715428f, - -0.956626f, -0.251149f, 0.147618f, 0.000000f, -0.956626f, -0.251149f, 0.147618f, 0.397050f, 0.226232f, - -0.276388f, -0.447220f, -0.850649f, 0.000000f, -0.276388f, -0.447220f, -0.850649f, 0.750122f, 0.271069f, - -0.483971f, -0.502302f, -0.716565f, 0.000000f, -0.483971f, -0.502302f, -0.716565f, 0.250122f, 0.728931f, - -0.436007f, -0.251152f, -0.864188f, 0.000000f, -0.436007f, -0.251152f, -0.864188f, 0.134945f, 0.284572f, - 0.723607f, -0.447220f, -0.525725f, 0.000000f, 0.723607f, -0.447220f, -0.525725f, 0.791456f, 0.337315f, - 0.531941f, -0.502302f, -0.681712f, 0.000000f, 0.531941f, -0.502302f, -0.681712f, 0.833640f, 0.738875f, - 0.687159f, -0.251152f, -0.681715f, 0.000000f, 0.687159f, -0.251152f, -0.681715f, 0.268675f, 0.239476f, - 0.723607f, -0.447220f, 0.525725f, 0.000000f, 0.723607f, -0.447220f, 0.525725f, 0.779690f, 0.082142f, - 0.860698f, -0.251151f, 0.442858f, 0.000000f, 0.860698f, -0.251151f, 0.442858f, 0.689049f, 0.234408f, - 0.687159f, -0.251152f, 0.681715f, 0.000000f, 0.687159f, -0.251152f, 0.681715f, 0.702477f, 0.326245f, - -0.276388f, -0.447220f, 0.850649f, 0.000000f, -0.276388f, -0.447220f, 0.850649f, 0.554423f, 0.061638f, - -0.155215f, -0.251152f, 0.955422f, 0.000000f, -0.155215f, -0.251152f, 0.955422f, 0.885924f, 0.257323f, - -0.436007f, -0.251152f, 0.864188f, 0.000000f, -0.436007f, -0.251152f, 0.864188f, 0.813138f, 0.249674f, - -0.894426f, -0.447216f, 0.000000f, 0.000000f, -0.894426f, -0.447216f, 0.000000f, 0.746383f, 0.351642f, - -0.956626f, -0.251149f, 0.147618f, 0.000000f, -0.956626f, -0.251149f, 0.147618f, 0.397050f, 0.226232f, - -0.956626f, -0.251149f, -0.147618f, 0.000000f, -0.956626f, -0.251149f, -0.147618f, 0.304489f, 0.071876f, - -0.276388f, -0.447220f, -0.850649f, 0.000000f, -0.276388f, -0.447220f, -0.850649f, 0.750122f, 0.271069f, - -0.436007f, -0.251152f, -0.864188f, 0.000000f, -0.436007f, -0.251152f, -0.864188f, 0.134945f, 0.284572f, - -0.155215f, -0.251152f, -0.955422f, 0.000000f, -0.155215f, -0.251152f, -0.955422f, 0.129692f, 0.189429f, - 0.723607f, -0.447220f, -0.525725f, 0.000000f, 0.723607f, -0.447220f, -0.525725f, 0.791456f, 0.337315f, - 0.687159f, -0.251152f, -0.681715f, 0.000000f, 0.687159f, -0.251152f, -0.681715f, 0.268675f, 0.239476f, - 0.860698f, -0.251151f, -0.442858f, 0.000000f, 0.860698f, -0.251151f, -0.442858f, 0.543816f, 0.252266f, - 0.276388f, 0.447220f, 0.850649f, 0.000000f, 0.276388f, 0.447220f, 0.850649f, 1.304489f, 0.071876f, - 0.483971f, 0.502302f, 0.716565f, 0.000000f, 0.483971f, 0.502302f, 0.716565f, 1.036828f, 0.167036f, - 0.232822f, 0.657519f, 0.716563f, 0.000000f, 0.232822f, 0.657519f, 0.716563f, 0.616405f, 0.395845f, - -0.723607f, 0.447220f, 0.525725f, 0.000000f, -0.723607f, 0.447220f, 0.525725f, 1.115709f, 0.094716f, - -0.531941f, 0.502302f, 0.681712f, 0.000000f, -0.531941f, 0.502302f, 0.681712f, 0.074553f, 0.260244f, - -0.609547f, 0.657519f, 0.442856f, 0.000000f, -0.609547f, 0.657519f, 0.442856f, 0.418131f, 0.563385f, - -0.723607f, 0.447220f, -0.525725f, 0.000000f, -0.723607f, 0.447220f, -0.525725f, 0.952607f, 0.099770f, - -0.812729f, 0.502301f, -0.295238f, 0.000000f, -0.812729f, 0.502301f, -0.295238f, 0.093723f, 0.349056f, - -0.609547f, 0.657519f, -0.442856f, 0.000000f, -0.609547f, 0.657519f, -0.442856f, 0.441249f, 0.481295f, - 0.276388f, 0.447220f, -0.850649f, 0.000000f, 0.276388f, 0.447220f, -0.850649f, 0.768276f, 0.421330f, - 0.029639f, 0.502302f, -0.864184f, 0.000000f, 0.029639f, 0.502302f, -0.864184f, 0.791278f, 0.505149f, - 0.232822f, 0.657519f, -0.716563f, 0.000000f, 0.232822f, 0.657519f, -0.716563f, 0.467747f, 0.391208f, - 0.894426f, 0.447216f, 0.000000f, 0.000000f, 0.894426f, 0.447216f, 0.000000f, 0.542767f, 0.333057f, - 0.831051f, 0.502299f, -0.238853f, 0.000000f, 0.831051f, 0.502299f, -0.238853f, 0.891200f, 0.515555f, - 0.753442f, 0.657515f, 0.000000f, 0.000000f, 0.753442f, 0.657515f, 0.000000f, 0.870330f, 0.424531f, - -0.232822f, -0.657519f, 0.716563f, 0.000000f, -0.232822f, -0.657519f, 0.716563f, 0.163633f, 0.429436f, - -0.029639f, -0.502302f, 0.864184f, 0.000000f, -0.029639f, -0.502302f, 0.864184f, 0.180731f, 0.340648f, - -0.276388f, -0.447220f, 0.850649f, 0.000000f, -0.276388f, -0.447220f, 0.850649f, 0.554423f, 0.061638f, - -0.162456f, -0.850654f, 0.499995f, 0.000000f, -0.162456f, -0.850654f, 0.499995f, 0.943007f, 0.371159f, - 0.052790f, -0.723612f, 0.688185f, 0.000000f, 0.052790f, -0.723612f, 0.688185f, 0.219605f, 0.584779f, - -0.232822f, -0.657519f, 0.716563f, 0.000000f, -0.232822f, -0.657519f, 0.716563f, 0.163633f, 0.429436f, - -0.077607f, -0.967950f, 0.238853f, 0.000000f, -0.077607f, -0.967950f, 0.238853f, 0.986368f, 0.352464f, - 0.138199f, -0.894429f, 0.425321f, 0.000000f, 0.138199f, -0.894429f, 0.425321f, 0.268276f, 0.578670f, - -0.162456f, -0.850654f, 0.499995f, 0.000000f, -0.162456f, -0.850654f, 0.499995f, 0.943007f, 0.371159f, - -0.232822f, -0.657519f, 0.716563f, 0.000000f, -0.232822f, -0.657519f, 0.716563f, 0.163633f, 0.429436f, - 0.052790f, -0.723612f, 0.688185f, 0.000000f, 0.052790f, -0.723612f, 0.688185f, 0.219605f, 0.584779f, - -0.029639f, -0.502302f, 0.864184f, 0.000000f, -0.029639f, -0.502302f, 0.864184f, 0.180731f, 0.340648f, - 0.052790f, -0.723612f, 0.688185f, 0.000000f, 0.052790f, -0.723612f, 0.688185f, 0.219605f, 0.584779f, - 0.262869f, -0.525738f, 0.809012f, 0.000000f, 0.262869f, -0.525738f, 0.809012f, 0.137692f, 0.365246f, - -0.029639f, -0.502302f, 0.864184f, 0.000000f, -0.029639f, -0.502302f, 0.864184f, 0.180731f, 0.340648f, - -0.162456f, -0.850654f, 0.499995f, 0.000000f, -0.162456f, -0.850654f, 0.499995f, 0.943007f, 0.371159f, - 0.138199f, -0.894429f, 0.425321f, 0.000000f, 0.138199f, -0.894429f, 0.425321f, 0.268276f, 0.578670f, - 0.052790f, -0.723612f, 0.688185f, 0.000000f, 0.052790f, -0.723612f, 0.688185f, 0.219605f, 0.584779f, - 0.138199f, -0.894429f, 0.425321f, 0.000000f, 0.138199f, -0.894429f, 0.425321f, 0.268276f, 0.578670f, - 0.361805f, -0.723611f, 0.587779f, 0.000000f, 0.361805f, -0.723611f, 0.587779f, 0.191461f, 0.507219f, - 0.052790f, -0.723612f, 0.688185f, 0.000000f, 0.052790f, -0.723612f, 0.688185f, 0.219605f, 0.584779f, - 0.052790f, -0.723612f, 0.688185f, 0.000000f, 0.052790f, -0.723612f, 0.688185f, 0.219605f, 0.584779f, - 0.361805f, -0.723611f, 0.587779f, 0.000000f, 0.361805f, -0.723611f, 0.587779f, 0.191461f, 0.507219f, - 0.262869f, -0.525738f, 0.809012f, 0.000000f, 0.262869f, -0.525738f, 0.809012f, 0.137692f, 0.365246f, - 0.361805f, -0.723611f, 0.587779f, 0.000000f, 0.361805f, -0.723611f, 0.587779f, 0.191461f, 0.507219f, - 0.531941f, -0.502302f, 0.681712f, 0.000000f, 0.531941f, -0.502302f, 0.681712f, 0.363599f, 0.405960f, - 0.262869f, -0.525738f, 0.809012f, 0.000000f, 0.262869f, -0.525738f, 0.809012f, 0.137692f, 0.365246f, - -0.077607f, -0.967950f, 0.238853f, 0.000000f, -0.077607f, -0.967950f, 0.238853f, 0.986368f, 0.352464f, - 0.203181f, -0.967950f, 0.147618f, 0.000000f, 0.203181f, -0.967950f, 0.147618f, 0.566902f, 0.400852f, - 0.138199f, -0.894429f, 0.425321f, 0.000000f, 0.138199f, -0.894429f, 0.425321f, 0.268276f, 0.578670f, - 0.203181f, -0.967950f, 0.147618f, 0.000000f, 0.203181f, -0.967950f, 0.147618f, 0.566902f, 0.400852f, - 0.425323f, -0.850654f, 0.309011f, 0.000000f, 0.425323f, -0.850654f, 0.309011f, 0.336927f, 0.341759f, - 0.138199f, -0.894429f, 0.425321f, 0.000000f, 0.138199f, -0.894429f, 0.425321f, 0.268276f, 0.578670f, - 0.138199f, -0.894429f, 0.425321f, 0.000000f, 0.138199f, -0.894429f, 0.425321f, 0.268276f, 0.578670f, - 0.425323f, -0.850654f, 0.309011f, 0.000000f, 0.425323f, -0.850654f, 0.309011f, 0.336927f, 0.341759f, - 0.361805f, -0.723611f, 0.587779f, 0.000000f, 0.361805f, -0.723611f, 0.587779f, 0.191461f, 0.507219f, - 0.425323f, -0.850654f, 0.309011f, 0.000000f, 0.425323f, -0.850654f, 0.309011f, 0.336927f, 0.341759f, - 0.609547f, -0.657519f, 0.442856f, 0.000000f, 0.609547f, -0.657519f, 0.442856f, 0.381800f, 0.317539f, - 0.361805f, -0.723611f, 0.587779f, 0.000000f, 0.361805f, -0.723611f, 0.587779f, 0.191461f, 0.507219f, - 0.361805f, -0.723611f, 0.587779f, 0.000000f, 0.361805f, -0.723611f, 0.587779f, 0.191461f, 0.507219f, - 0.609547f, -0.657519f, 0.442856f, 0.000000f, 0.609547f, -0.657519f, 0.442856f, 0.381800f, 0.317539f, - 0.531941f, -0.502302f, 0.681712f, 0.000000f, 0.531941f, -0.502302f, 0.681712f, 0.363599f, 0.405960f, - 0.609547f, -0.657519f, 0.442856f, 0.000000f, 0.609547f, -0.657519f, 0.442856f, 0.381800f, 0.317539f, - 0.723607f, -0.447220f, 0.525725f, 0.000000f, 0.723607f, -0.447220f, 0.525725f, 0.779690f, 0.082142f, - 0.531941f, -0.502302f, 0.681712f, 0.000000f, 0.531941f, -0.502302f, 0.681712f, 0.363599f, 0.405960f, - 0.812729f, -0.502301f, -0.295238f, 0.000000f, 0.812729f, -0.502301f, -0.295238f, 0.314480f, 0.411140f, - 0.609547f, -0.657519f, -0.442856f, 0.000000f, 0.609547f, -0.657519f, -0.442856f, 0.517304f, 0.399254f, - 0.723607f, -0.447220f, -0.525725f, 0.000000f, 0.723607f, -0.447220f, -0.525725f, 0.791456f, 0.337315f, - 0.850648f, -0.525736f, 0.000000f, 0.000000f, 0.850648f, -0.525736f, 0.000000f, 0.115418f, 0.434134f, - 0.670817f, -0.723611f, -0.162457f, 0.000000f, 0.670817f, -0.723611f, -0.162457f, 0.241373f, 0.501088f, - 0.812729f, -0.502301f, -0.295238f, 0.000000f, 0.812729f, -0.502301f, -0.295238f, 0.314480f, 0.411140f, - 0.812729f, -0.502301f, 0.295238f, 0.000000f, 0.812729f, -0.502301f, 0.295238f, 0.918131f, 0.436615f, - 0.670817f, -0.723610f, 0.162458f, 0.000000f, 0.670817f, -0.723610f, 0.162458f, 0.211591f, 0.415486f, - 0.850648f, -0.525736f, 0.000000f, 0.000000f, 0.850648f, -0.525736f, 0.000000f, 0.115418f, 0.434134f, - 0.812729f, -0.502301f, -0.295238f, 0.000000f, 0.812729f, -0.502301f, -0.295238f, 0.314480f, 0.411140f, - 0.670817f, -0.723611f, -0.162457f, 0.000000f, 0.670817f, -0.723611f, -0.162457f, 0.241373f, 0.501088f, - 0.609547f, -0.657519f, -0.442856f, 0.000000f, 0.609547f, -0.657519f, -0.442856f, 0.517304f, 0.399254f, - 0.670817f, -0.723611f, -0.162457f, 0.000000f, 0.670817f, -0.723611f, -0.162457f, 0.241373f, 0.501088f, - 0.425323f, -0.850654f, -0.309011f, 0.000000f, 0.425323f, -0.850654f, -0.309011f, 0.719605f, 0.415221f, - 0.609547f, -0.657519f, -0.442856f, 0.000000f, 0.609547f, -0.657519f, -0.442856f, 0.517304f, 0.399254f, - 0.850648f, -0.525736f, 0.000000f, 0.000000f, 0.850648f, -0.525736f, 0.000000f, 0.115418f, 0.434134f, - 0.670817f, -0.723610f, 0.162458f, 0.000000f, 0.670817f, -0.723610f, 0.162458f, 0.211591f, 0.415486f, - 0.670817f, -0.723611f, -0.162457f, 0.000000f, 0.670817f, -0.723611f, -0.162457f, 0.241373f, 0.501088f, - 0.670817f, -0.723610f, 0.162458f, 0.000000f, 0.670817f, -0.723610f, 0.162458f, 0.211591f, 0.415486f, - 0.447211f, -0.894428f, 0.000001f, 0.000000f, 0.447211f, -0.894428f, 0.000001f, 0.291278f, 0.494851f, - 0.670817f, -0.723611f, -0.162457f, 0.000000f, 0.670817f, -0.723611f, -0.162457f, 0.241373f, 0.501088f, - 0.670817f, -0.723611f, -0.162457f, 0.000000f, 0.670817f, -0.723611f, -0.162457f, 0.241373f, 0.501088f, - 0.447211f, -0.894428f, 0.000001f, 0.000000f, 0.447211f, -0.894428f, 0.000001f, 0.291278f, 0.494851f, - 0.425323f, -0.850654f, -0.309011f, 0.000000f, 0.425323f, -0.850654f, -0.309011f, 0.719605f, 0.415221f, - 0.447211f, -0.894428f, 0.000001f, 0.000000f, 0.447211f, -0.894428f, 0.000001f, 0.291278f, 0.494851f, - 0.203181f, -0.967950f, -0.147618f, 0.000000f, 0.203181f, -0.967950f, -0.147618f, 0.966205f, 0.438787f, - 0.425323f, -0.850654f, -0.309011f, 0.000000f, 0.425323f, -0.850654f, -0.309011f, 0.719605f, 0.415221f, - 0.812729f, -0.502301f, 0.295238f, 0.000000f, 0.812729f, -0.502301f, 0.295238f, 0.918131f, 0.436615f, - 0.609547f, -0.657519f, 0.442856f, 0.000000f, 0.609547f, -0.657519f, 0.442856f, 0.381800f, 0.317539f, - 0.670817f, -0.723610f, 0.162458f, 0.000000f, 0.670817f, -0.723610f, 0.162458f, 0.211591f, 0.415486f, - 0.609547f, -0.657519f, 0.442856f, 0.000000f, 0.609547f, -0.657519f, 0.442856f, 0.381800f, 0.317539f, - 0.425323f, -0.850654f, 0.309011f, 0.000000f, 0.425323f, -0.850654f, 0.309011f, 0.336927f, 0.341759f, - 0.670817f, -0.723610f, 0.162458f, 0.000000f, 0.670817f, -0.723610f, 0.162458f, 0.211591f, 0.415486f, - 0.670817f, -0.723610f, 0.162458f, 0.000000f, 0.670817f, -0.723610f, 0.162458f, 0.211591f, 0.415486f, - 0.425323f, -0.850654f, 0.309011f, 0.000000f, 0.425323f, -0.850654f, 0.309011f, 0.336927f, 0.341759f, - 0.447211f, -0.894428f, 0.000001f, 0.000000f, 0.447211f, -0.894428f, 0.000001f, 0.291278f, 0.494851f, - 0.425323f, -0.850654f, 0.309011f, 0.000000f, 0.425323f, -0.850654f, 0.309011f, 0.336927f, 0.341759f, - 0.203181f, -0.967950f, 0.147618f, 0.000000f, 0.203181f, -0.967950f, 0.147618f, 0.566902f, 0.400852f, - 0.447211f, -0.894428f, 0.000001f, 0.000000f, 0.447211f, -0.894428f, 0.000001f, 0.291278f, 0.494851f, - 0.447211f, -0.894428f, 0.000001f, 0.000000f, 0.447211f, -0.894428f, 0.000001f, 0.291278f, 0.494851f, - 0.203181f, -0.967950f, 0.147618f, 0.000000f, 0.203181f, -0.967950f, 0.147618f, 0.566902f, 0.400852f, - 0.203181f, -0.967950f, -0.147618f, 0.000000f, 0.203181f, -0.967950f, -0.147618f, 0.966205f, 0.438787f, - 0.203181f, -0.967950f, 0.147618f, 0.000000f, 0.203181f, -0.967950f, 0.147618f, 0.566902f, 0.400852f, - 0.000000f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 0.999999f, 0.020053f, - 0.203181f, -0.967950f, -0.147618f, 0.000000f, 0.203181f, -0.967950f, -0.147618f, 0.966205f, 0.438787f, - -0.753442f, -0.657515f, 0.000000f, 0.000000f, -0.753442f, -0.657515f, 0.000000f, 0.443007f, 0.628841f, - -0.831051f, -0.502299f, 0.238853f, 0.000000f, -0.831051f, -0.502299f, 0.238853f, 0.634945f, 0.715428f, - -0.894426f, -0.447216f, 0.000000f, 0.000000f, -0.894426f, -0.447216f, 0.000000f, 0.746383f, 0.351642f, - -0.525730f, -0.850652f, 0.000000f, 0.000000f, -0.525730f, -0.850652f, 0.000000f, 0.486368f, 0.647536f, - -0.638195f, -0.723609f, 0.262864f, 0.000000f, -0.638195f, -0.723609f, 0.262864f, 0.265485f, 0.408729f, - -0.753442f, -0.657515f, 0.000000f, 0.000000f, -0.753442f, -0.657515f, 0.000000f, 0.443007f, 0.628841f, - -0.251147f, -0.967949f, 0.000000f, 0.000000f, -0.251147f, -0.967949f, 0.000000f, 0.444254f, 0.709621f, - -0.361801f, -0.894428f, 0.262864f, 0.000000f, -0.361801f, -0.894428f, 0.262864f, 0.017304f, 0.600746f, - -0.525730f, -0.850652f, 0.000000f, 0.000000f, -0.525730f, -0.850652f, 0.000000f, 0.486368f, 0.647536f, - -0.753442f, -0.657515f, 0.000000f, 0.000000f, -0.753442f, -0.657515f, 0.000000f, 0.443007f, 0.628841f, - -0.638195f, -0.723609f, 0.262864f, 0.000000f, -0.638195f, -0.723609f, 0.262864f, 0.265485f, 0.408729f, - -0.831051f, -0.502299f, 0.238853f, 0.000000f, -0.831051f, -0.502299f, 0.238853f, 0.634945f, 0.715428f, - -0.638195f, -0.723609f, 0.262864f, 0.000000f, -0.638195f, -0.723609f, 0.262864f, 0.265485f, 0.408729f, - -0.688189f, -0.525736f, 0.499997f, 0.000000f, -0.688189f, -0.525736f, 0.499997f, 0.680731f, 0.659352f, - -0.831051f, -0.502299f, 0.238853f, 0.000000f, -0.831051f, -0.502299f, 0.238853f, 0.634945f, 0.715428f, - -0.525730f, -0.850652f, 0.000000f, 0.000000f, -0.525730f, -0.850652f, 0.000000f, 0.486368f, 0.647536f, - -0.361801f, -0.894428f, 0.262864f, 0.000000f, -0.361801f, -0.894428f, 0.262864f, 0.017304f, 0.600746f, - -0.638195f, -0.723609f, 0.262864f, 0.000000f, -0.638195f, -0.723609f, 0.262864f, 0.265485f, 0.408729f, - -0.361801f, -0.894428f, 0.262864f, 0.000000f, -0.361801f, -0.894428f, 0.262864f, 0.017304f, 0.600746f, - -0.447211f, -0.723610f, 0.525729f, 0.000000f, -0.447211f, -0.723610f, 0.525729f, 0.066902f, 0.599148f, - -0.638195f, -0.723609f, 0.262864f, 0.000000f, -0.638195f, -0.723609f, 0.262864f, 0.265485f, 0.408729f, - -0.638195f, -0.723609f, 0.262864f, 0.000000f, -0.638195f, -0.723609f, 0.262864f, 0.265485f, 0.408729f, - -0.447211f, -0.723610f, 0.525729f, 0.000000f, -0.447211f, -0.723610f, 0.525729f, 0.066902f, 0.599148f, - -0.688189f, -0.525736f, 0.499997f, 0.000000f, -0.688189f, -0.525736f, 0.499997f, 0.680731f, 0.659352f, - -0.447211f, -0.723610f, 0.525729f, 0.000000f, -0.447211f, -0.723610f, 0.525729f, 0.066902f, 0.599148f, - -0.483971f, -0.502302f, 0.716565f, 0.000000f, -0.483971f, -0.502302f, 0.716565f, 0.637692f, 0.634754f, - -0.688189f, -0.525736f, 0.499997f, 0.000000f, -0.688189f, -0.525736f, 0.499997f, 0.680731f, 0.659352f, - -0.251147f, -0.967949f, 0.000000f, 0.000000f, -0.251147f, -0.967949f, 0.000000f, 0.444254f, 0.709621f, - -0.077607f, -0.967950f, 0.238853f, 0.000000f, -0.077607f, -0.967950f, 0.238853f, 0.986368f, 0.352464f, - -0.361801f, -0.894428f, 0.262864f, 0.000000f, -0.361801f, -0.894428f, 0.262864f, 0.017304f, 0.600746f, - -0.077607f, -0.967950f, 0.238853f, 0.000000f, -0.077607f, -0.967950f, 0.238853f, 0.986368f, 0.352464f, - -0.162456f, -0.850654f, 0.499995f, 0.000000f, -0.162456f, -0.850654f, 0.499995f, 0.943007f, 0.371159f, - -0.361801f, -0.894428f, 0.262864f, 0.000000f, -0.361801f, -0.894428f, 0.262864f, 0.017304f, 0.600746f, - -0.361801f, -0.894428f, 0.262864f, 0.000000f, -0.361801f, -0.894428f, 0.262864f, 0.017304f, 0.600746f, - -0.162456f, -0.850654f, 0.499995f, 0.000000f, -0.162456f, -0.850654f, 0.499995f, 0.943007f, 0.371159f, - -0.447211f, -0.723610f, 0.525729f, 0.000000f, -0.447211f, -0.723610f, 0.525729f, 0.066902f, 0.599148f, - -0.162456f, -0.850654f, 0.499995f, 0.000000f, -0.162456f, -0.850654f, 0.499995f, 0.943007f, 0.371159f, - -0.232822f, -0.657519f, 0.716563f, 0.000000f, -0.232822f, -0.657519f, 0.716563f, 0.163633f, 0.429436f, - -0.447211f, -0.723610f, 0.525729f, 0.000000f, -0.447211f, -0.723610f, 0.525729f, 0.066902f, 0.599148f, - -0.447211f, -0.723610f, 0.525729f, 0.000000f, -0.447211f, -0.723610f, 0.525729f, 0.066902f, 0.599148f, - -0.232822f, -0.657519f, 0.716563f, 0.000000f, -0.232822f, -0.657519f, 0.716563f, 0.163633f, 0.429436f, - -0.483971f, -0.502302f, 0.716565f, 0.000000f, -0.483971f, -0.502302f, 0.716565f, 0.637692f, 0.634754f, - -0.232822f, -0.657519f, 0.716563f, 0.000000f, -0.232822f, -0.657519f, 0.716563f, 0.163633f, 0.429436f, - -0.276388f, -0.447220f, 0.850649f, 0.000000f, -0.276388f, -0.447220f, 0.850649f, 0.554423f, 0.061638f, - -0.483971f, -0.502302f, 0.716565f, 0.000000f, -0.483971f, -0.502302f, 0.716565f, 0.637692f, 0.634754f, - -0.232822f, -0.657519f, -0.716563f, 0.000000f, -0.232822f, -0.657519f, -0.716563f, 0.042767f, 0.666943f, - -0.483971f, -0.502302f, -0.716565f, 0.000000f, -0.483971f, -0.502302f, -0.716565f, 0.250122f, 0.728931f, - -0.276388f, -0.447220f, -0.850649f, 0.000000f, -0.276388f, -0.447220f, -0.850649f, 0.750122f, 0.271069f, - -0.162456f, -0.850654f, -0.499995f, 0.000000f, -0.162456f, -0.850654f, -0.499995f, 0.089135f, 0.684613f, - -0.447211f, -0.723611f, -0.525727f, 0.000000f, -0.447211f, -0.723611f, -0.525727f, 0.991338f, 0.520023f, - -0.232822f, -0.657519f, -0.716563f, 0.000000f, -0.232822f, -0.657519f, -0.716563f, 0.042767f, 0.666943f, - -0.077607f, -0.967950f, -0.238853f, 0.000000f, -0.077607f, -0.967950f, -0.238853f, 0.043816f, 0.747734f, - -0.361801f, -0.894429f, -0.262863f, 0.000000f, -0.361801f, -0.894429f, -0.262863f, 1.041434f, 0.519379f, - -0.162456f, -0.850654f, -0.499995f, 0.000000f, -0.162456f, -0.850654f, -0.499995f, 0.089135f, 0.684613f, - -0.232822f, -0.657519f, -0.716563f, 0.000000f, -0.232822f, -0.657519f, -0.716563f, 0.042767f, 0.666943f, - -0.447211f, -0.723611f, -0.525727f, 0.000000f, -0.447211f, -0.723611f, -0.525727f, 0.991338f, 0.520023f, - -0.483971f, -0.502302f, -0.716565f, 0.000000f, -0.483971f, -0.502302f, -0.716565f, 0.250122f, 0.728931f, - -0.447211f, -0.723611f, -0.525727f, 0.000000f, -0.447211f, -0.723611f, -0.525727f, 0.991338f, 0.520023f, - -0.688189f, -0.525736f, -0.499997f, 0.000000f, -0.688189f, -0.525736f, -0.499997f, 0.291456f, 0.662685f, - -0.483971f, -0.502302f, -0.716565f, 0.000000f, -0.483971f, -0.502302f, -0.716565f, 0.250122f, 0.728931f, - -0.162456f, -0.850654f, -0.499995f, 0.000000f, -0.162456f, -0.850654f, -0.499995f, 0.089135f, 0.684613f, - -0.361801f, -0.894429f, -0.262863f, 0.000000f, -0.361801f, -0.894429f, -0.262863f, 1.041434f, 0.519379f, - -0.447211f, -0.723611f, -0.525727f, 0.000000f, -0.447211f, -0.723611f, -0.525727f, 0.991338f, 0.520023f, - -0.361801f, -0.894429f, -0.262863f, 0.000000f, -0.361801f, -0.894429f, -0.262863f, 1.041434f, 0.519379f, - -0.638195f, -0.723609f, -0.262863f, 0.000000f, -0.638195f, -0.723609f, -0.262863f, 1.017304f, 0.600746f, - -0.447211f, -0.723611f, -0.525727f, 0.000000f, -0.447211f, -0.723611f, -0.525727f, 0.991338f, 0.520023f, - -0.447211f, -0.723611f, -0.525727f, 0.000000f, -0.447211f, -0.723611f, -0.525727f, 0.991338f, 0.520023f, - -0.638195f, -0.723609f, -0.262863f, 0.000000f, -0.638195f, -0.723609f, -0.262863f, 1.017304f, 0.600746f, - -0.688189f, -0.525736f, -0.499997f, 0.000000f, -0.688189f, -0.525736f, -0.499997f, 0.291456f, 0.662685f, - -0.638195f, -0.723609f, -0.262863f, 0.000000f, -0.638195f, -0.723609f, -0.262863f, 1.017304f, 0.600746f, - -0.831051f, -0.502299f, -0.238853f, 0.000000f, -0.831051f, -0.502299f, -0.238853f, 0.246383f, 0.648358f, - -0.688189f, -0.525736f, -0.499997f, 0.000000f, -0.688189f, -0.525736f, -0.499997f, 0.291456f, 0.662685f, - -0.077607f, -0.967950f, -0.238853f, 0.000000f, -0.077607f, -0.967950f, -0.238853f, 0.043816f, 0.747734f, - -0.251147f, -0.967949f, 0.000000f, 0.000000f, -0.251147f, -0.967949f, 0.000000f, 0.444254f, 0.709621f, - -0.361801f, -0.894429f, -0.262863f, 0.000000f, -0.361801f, -0.894429f, -0.262863f, 1.041434f, 0.519379f, - -0.251147f, -0.967949f, 0.000000f, 0.000000f, -0.251147f, -0.967949f, 0.000000f, 0.444254f, 0.709621f, - -0.525730f, -0.850652f, 0.000000f, 0.000000f, -0.525730f, -0.850652f, 0.000000f, 0.486368f, 0.647536f, - -0.361801f, -0.894429f, -0.262863f, 0.000000f, -0.361801f, -0.894429f, -0.262863f, 1.041434f, 0.519379f, - -0.361801f, -0.894429f, -0.262863f, 0.000000f, -0.361801f, -0.894429f, -0.262863f, 1.041434f, 0.519379f, - -0.525730f, -0.850652f, 0.000000f, 0.000000f, -0.525730f, -0.850652f, 0.000000f, 0.486368f, 0.647536f, - -0.638195f, -0.723609f, -0.262863f, 0.000000f, -0.638195f, -0.723609f, -0.262863f, 1.017304f, 0.600746f, - -0.525730f, -0.850652f, 0.000000f, 0.000000f, -0.525730f, -0.850652f, 0.000000f, 0.486368f, 0.647536f, - -0.753442f, -0.657515f, 0.000000f, 0.000000f, -0.753442f, -0.657515f, 0.000000f, 0.443007f, 0.628841f, - -0.638195f, -0.723609f, -0.262863f, 0.000000f, -0.638195f, -0.723609f, -0.262863f, 1.017304f, 0.600746f, - -0.638195f, -0.723609f, -0.262863f, 0.000000f, -0.638195f, -0.723609f, -0.262863f, 1.017304f, 0.600746f, - -0.753442f, -0.657515f, 0.000000f, 0.000000f, -0.753442f, -0.657515f, 0.000000f, 0.443007f, 0.628841f, - -0.831051f, -0.502299f, -0.238853f, 0.000000f, -0.831051f, -0.502299f, -0.238853f, 0.246383f, 0.648358f, - -0.753442f, -0.657515f, 0.000000f, 0.000000f, -0.753442f, -0.657515f, 0.000000f, 0.443007f, 0.628841f, - -0.894426f, -0.447216f, 0.000000f, 0.000000f, -0.894426f, -0.447216f, 0.000000f, 0.746383f, 0.351642f, - -0.831051f, -0.502299f, -0.238853f, 0.000000f, -0.831051f, -0.502299f, -0.238853f, 0.246383f, 0.648358f, - 0.609547f, -0.657519f, -0.442856f, 0.000000f, 0.609547f, -0.657519f, -0.442856f, 0.517304f, 0.399254f, - 0.531941f, -0.502302f, -0.681712f, 0.000000f, 0.531941f, -0.502302f, -0.681712f, 0.833640f, 0.738875f, - 0.723607f, -0.447220f, -0.525725f, 0.000000f, 0.723607f, -0.447220f, -0.525725f, 0.791456f, 0.337315f, - 0.425323f, -0.850654f, -0.309011f, 0.000000f, 0.425323f, -0.850654f, -0.309011f, 0.719605f, 0.415221f, - 0.361804f, -0.723612f, -0.587779f, 0.000000f, 0.361804f, -0.723612f, -0.587779f, 1.014094f, 0.430832f, - 0.609547f, -0.657519f, -0.442856f, 0.000000f, 0.609547f, -0.657519f, -0.442856f, 0.517304f, 0.399254f, - 0.203181f, -0.967950f, -0.147618f, 0.000000f, 0.203181f, -0.967950f, -0.147618f, 0.966205f, 0.438787f, - 0.138197f, -0.894429f, -0.425321f, 0.000000f, 0.138197f, -0.894429f, -0.425321f, 0.041434f, 0.519379f, - 0.425323f, -0.850654f, -0.309011f, 0.000000f, 0.425323f, -0.850654f, -0.309011f, 0.719605f, 0.415221f, - 0.609547f, -0.657519f, -0.442856f, 0.000000f, 0.609547f, -0.657519f, -0.442856f, 0.517304f, 0.399254f, - 0.361804f, -0.723612f, -0.587779f, 0.000000f, 0.361804f, -0.723612f, -0.587779f, 1.014094f, 0.430832f, - 0.531941f, -0.502302f, -0.681712f, 0.000000f, 0.531941f, -0.502302f, -0.681712f, 0.833640f, 0.738875f, - 0.361804f, -0.723612f, -0.587779f, 0.000000f, 0.361804f, -0.723612f, -0.587779f, 1.014094f, 0.430832f, - 0.262869f, -0.525738f, -0.809012f, 0.000000f, 0.262869f, -0.525738f, -0.809012f, 0.881800f, 0.682461f, - 0.531941f, -0.502302f, -0.681712f, 0.000000f, 0.531941f, -0.502302f, -0.681712f, 0.833640f, 0.738875f, - 0.425323f, -0.850654f, -0.309011f, 0.000000f, 0.425323f, -0.850654f, -0.309011f, 0.719605f, 0.415221f, - 0.138197f, -0.894429f, -0.425321f, 0.000000f, 0.138197f, -0.894429f, -0.425321f, 0.041434f, 0.519379f, - 0.361804f, -0.723612f, -0.587779f, 0.000000f, 0.361804f, -0.723612f, -0.587779f, 1.014094f, 0.430832f, - 0.138197f, -0.894429f, -0.425321f, 0.000000f, 0.138197f, -0.894429f, -0.425321f, 0.041434f, 0.519379f, - 0.052789f, -0.723611f, -0.688186f, 0.000000f, 0.052789f, -0.723611f, -0.688186f, 0.091499f, 0.516836f, - 0.361804f, -0.723612f, -0.587779f, 0.000000f, 0.361804f, -0.723612f, -0.587779f, 1.014094f, 0.430832f, - 0.361804f, -0.723612f, -0.587779f, 0.000000f, 0.361804f, -0.723612f, -0.587779f, 1.014094f, 0.430832f, - 0.052789f, -0.723611f, -0.688186f, 0.000000f, 0.052789f, -0.723611f, -0.688186f, 0.091499f, 0.516836f, - 0.262869f, -0.525738f, -0.809012f, 0.000000f, 0.262869f, -0.525738f, -0.809012f, 0.881800f, 0.682461f, - 0.052789f, -0.723611f, -0.688186f, 0.000000f, 0.052789f, -0.723611f, -0.688186f, 0.091499f, 0.516836f, - -0.029639f, -0.502302f, -0.864184f, 0.000000f, -0.029639f, -0.502302f, -0.864184f, 0.836927f, 0.658241f, - 0.262869f, -0.525738f, -0.809012f, 0.000000f, 0.262869f, -0.525738f, -0.809012f, 0.881800f, 0.682461f, - 0.203181f, -0.967950f, -0.147618f, 0.000000f, 0.203181f, -0.967950f, -0.147618f, 0.966205f, 0.438787f, - -0.077607f, -0.967950f, -0.238853f, 0.000000f, -0.077607f, -0.967950f, -0.238853f, 0.043816f, 0.747734f, - 0.138197f, -0.894429f, -0.425321f, 0.000000f, 0.138197f, -0.894429f, -0.425321f, 0.041434f, 0.519379f, - -0.077607f, -0.967950f, -0.238853f, 0.000000f, -0.077607f, -0.967950f, -0.238853f, 0.043816f, 0.747734f, - -0.162456f, -0.850654f, -0.499995f, 0.000000f, -0.162456f, -0.850654f, -0.499995f, 0.089135f, 0.684613f, - 0.138197f, -0.894429f, -0.425321f, 0.000000f, 0.138197f, -0.894429f, -0.425321f, 0.041434f, 0.519379f, - 0.138197f, -0.894429f, -0.425321f, 0.000000f, 0.138197f, -0.894429f, -0.425321f, 0.041434f, 0.519379f, - -0.162456f, -0.850654f, -0.499995f, 0.000000f, -0.162456f, -0.850654f, -0.499995f, 0.089135f, 0.684613f, - 0.052789f, -0.723611f, -0.688186f, 0.000000f, 0.052789f, -0.723611f, -0.688186f, 0.091499f, 0.516836f, - -0.162456f, -0.850654f, -0.499995f, 0.000000f, -0.162456f, -0.850654f, -0.499995f, 0.089135f, 0.684613f, - -0.232822f, -0.657519f, -0.716563f, 0.000000f, -0.232822f, -0.657519f, -0.716563f, 0.042767f, 0.666943f, - 0.052789f, -0.723611f, -0.688186f, 0.000000f, 0.052789f, -0.723611f, -0.688186f, 0.091499f, 0.516836f, - 0.052789f, -0.723611f, -0.688186f, 0.000000f, 0.052789f, -0.723611f, -0.688186f, 0.091499f, 0.516836f, - -0.232822f, -0.657519f, -0.716563f, 0.000000f, -0.232822f, -0.657519f, -0.716563f, 0.042767f, 0.666943f, - -0.029639f, -0.502302f, -0.864184f, 0.000000f, -0.029639f, -0.502302f, -0.864184f, 0.836927f, 0.658241f, - -0.232822f, -0.657519f, -0.716563f, 0.000000f, -0.232822f, -0.657519f, -0.716563f, 0.042767f, 0.666943f, - -0.276388f, -0.447220f, -0.850649f, 0.000000f, -0.276388f, -0.447220f, -0.850649f, 0.750122f, 0.271069f, - -0.029639f, -0.502302f, -0.864184f, 0.000000f, -0.029639f, -0.502302f, -0.864184f, 0.836927f, 0.658241f, - 0.956626f, 0.251149f, 0.147618f, 0.000000f, 0.956626f, 0.251149f, 0.147618f, 0.658365f, 0.135762f, - 0.956626f, 0.251149f, -0.147618f, 0.000000f, 0.956626f, 0.251149f, -0.147618f, 0.610420f, 0.226784f, - 0.894426f, 0.447216f, 0.000000f, 0.000000f, 0.894426f, 0.447216f, 0.000000f, 0.542767f, 0.333057f, - 0.951058f, -0.000000f, 0.309013f, 0.000000f, 0.951058f, -0.000000f, 0.309013f, 0.646443f, 0.311386f, - 1.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.014094f, 0.430832f, - 0.956626f, 0.251149f, 0.147618f, 0.000000f, 0.956626f, 0.251149f, 0.147618f, 0.658365f, 0.135762f, - 0.860698f, -0.251151f, 0.442858f, 0.000000f, 0.860698f, -0.251151f, 0.442858f, 0.689049f, 0.234408f, - 0.947213f, -0.276396f, 0.162458f, 0.000000f, 0.947213f, -0.276396f, 0.162458f, 0.067324f, 0.429118f, - 0.951058f, -0.000000f, 0.309013f, 0.000000f, 0.951058f, -0.000000f, 0.309013f, 0.646443f, 0.311386f, - 0.956626f, 0.251149f, 0.147618f, 0.000000f, 0.956626f, 0.251149f, 0.147618f, 0.658365f, 0.135762f, - 1.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.014094f, 0.430832f, - 0.956626f, 0.251149f, -0.147618f, 0.000000f, 0.956626f, 0.251149f, -0.147618f, 0.610420f, 0.226784f, - 1.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.014094f, 0.430832f, - 0.951058f, 0.000000f, -0.309013f, 0.000000f, 0.951058f, 0.000000f, -0.309013f, 0.546072f, 0.156902f, - 0.956626f, 0.251149f, -0.147618f, 0.000000f, 0.956626f, 0.251149f, -0.147618f, 0.610420f, 0.226784f, - 0.951058f, -0.000000f, 0.309013f, 0.000000f, 0.951058f, -0.000000f, 0.309013f, 0.646443f, 0.311386f, - 0.947213f, -0.276396f, 0.162458f, 0.000000f, 0.947213f, -0.276396f, 0.162458f, 0.067324f, 0.429118f, - 1.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.014094f, 0.430832f, - 0.947213f, -0.276396f, 0.162458f, 0.000000f, 0.947213f, -0.276396f, 0.162458f, 0.067324f, 0.429118f, - 0.947213f, -0.276396f, -0.162458f, 0.000000f, 0.947213f, -0.276396f, -0.162458f, 0.711591f, 0.584513f, - 1.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.014094f, 0.430832f, - 1.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.014094f, 0.430832f, - 0.947213f, -0.276396f, -0.162458f, 0.000000f, 0.947213f, -0.276396f, -0.162458f, 0.711591f, 0.584513f, - 0.951058f, 0.000000f, -0.309013f, 0.000000f, 0.951058f, 0.000000f, -0.309013f, 0.546072f, 0.156902f, - 0.947213f, -0.276396f, -0.162458f, 0.000000f, 0.947213f, -0.276396f, -0.162458f, 0.711591f, 0.584513f, - 0.860698f, -0.251151f, -0.442858f, 0.000000f, 0.860698f, -0.251151f, -0.442858f, 0.543816f, 0.252266f, - 0.951058f, 0.000000f, -0.309013f, 0.000000f, 0.951058f, 0.000000f, -0.309013f, 0.546072f, 0.156902f, - 0.860698f, -0.251151f, 0.442858f, 0.000000f, 0.860698f, -0.251151f, 0.442858f, 0.689049f, 0.234408f, - 0.812729f, -0.502301f, 0.295238f, 0.000000f, 0.812729f, -0.502301f, 0.295238f, 0.918131f, 0.436615f, - 0.947213f, -0.276396f, 0.162458f, 0.000000f, 0.947213f, -0.276396f, 0.162458f, 0.067324f, 0.429118f, - 0.812729f, -0.502301f, 0.295238f, 0.000000f, 0.812729f, -0.502301f, 0.295238f, 0.918131f, 0.436615f, - 0.850648f, -0.525736f, 0.000000f, 0.000000f, 0.850648f, -0.525736f, 0.000000f, 0.115418f, 0.434134f, - 0.947213f, -0.276396f, 0.162458f, 0.000000f, 0.947213f, -0.276396f, 0.162458f, 0.067324f, 0.429118f, - 0.947213f, -0.276396f, 0.162458f, 0.000000f, 0.947213f, -0.276396f, 0.162458f, 0.067324f, 0.429118f, - 0.850648f, -0.525736f, 0.000000f, 0.000000f, 0.850648f, -0.525736f, 0.000000f, 0.115418f, 0.434134f, - 0.947213f, -0.276396f, -0.162458f, 0.000000f, 0.947213f, -0.276396f, -0.162458f, 0.711591f, 0.584513f, - 0.850648f, -0.525736f, 0.000000f, 0.000000f, 0.850648f, -0.525736f, 0.000000f, 0.115418f, 0.434134f, - 0.812729f, -0.502301f, -0.295238f, 0.000000f, 0.812729f, -0.502301f, -0.295238f, 0.314480f, 0.411140f, - 0.947213f, -0.276396f, -0.162458f, 0.000000f, 0.947213f, -0.276396f, -0.162458f, 0.711591f, 0.584513f, - 0.947213f, -0.276396f, -0.162458f, 0.000000f, 0.947213f, -0.276396f, -0.162458f, 0.711591f, 0.584513f, - 0.812729f, -0.502301f, -0.295238f, 0.000000f, 0.812729f, -0.502301f, -0.295238f, 0.314480f, 0.411140f, - 0.860698f, -0.251151f, -0.442858f, 0.000000f, 0.860698f, -0.251151f, -0.442858f, 0.543816f, 0.252266f, - 0.812729f, -0.502301f, -0.295238f, 0.000000f, 0.812729f, -0.502301f, -0.295238f, 0.314480f, 0.411140f, - 0.723607f, -0.447220f, -0.525725f, 0.000000f, 0.723607f, -0.447220f, -0.525725f, 0.791456f, 0.337315f, - 0.860698f, -0.251151f, -0.442858f, 0.000000f, 0.860698f, -0.251151f, -0.442858f, 0.543816f, 0.252266f, - 0.155215f, 0.251152f, 0.955422f, 0.000000f, 0.155215f, 0.251152f, 0.955422f, 0.944254f, 0.290379f, - 0.436007f, 0.251152f, 0.864188f, 0.000000f, 0.436007f, 0.251152f, 0.864188f, 0.900083f, 0.348597f, - 0.276388f, 0.447220f, 0.850649f, 0.000000f, 0.276388f, 0.447220f, 0.850649f, 1.304489f, 0.071876f, - -0.000000f, -0.000000f, 1.000000f, 0.000000f, -0.000000f, -0.000000f, 1.000000f, 0.846308f, 0.334943f, - 0.309017f, 0.000000f, 0.951056f, 0.000000f, 0.309017f, 0.000000f, 0.951056f, 0.741373f, 0.498912f, - 0.155215f, 0.251152f, 0.955422f, 0.000000f, 0.155215f, 0.251152f, 0.955422f, 0.944254f, 0.290379f, - -0.155215f, -0.251152f, 0.955422f, 0.000000f, -0.155215f, -0.251152f, 0.955422f, 0.885924f, 0.257323f, - 0.138199f, -0.276398f, 0.951055f, 0.000000f, 0.138199f, -0.276398f, 0.951055f, 0.735205f, 0.674734f, - -0.000000f, -0.000000f, 1.000000f, 0.000000f, -0.000000f, -0.000000f, 1.000000f, 0.846308f, 0.334943f, - 0.155215f, 0.251152f, 0.955422f, 0.000000f, 0.155215f, 0.251152f, 0.955422f, 0.944254f, 0.290379f, - 0.309017f, 0.000000f, 0.951056f, 0.000000f, 0.309017f, 0.000000f, 0.951056f, 0.741373f, 0.498912f, - 0.436007f, 0.251152f, 0.864188f, 0.000000f, 0.436007f, 0.251152f, 0.864188f, 0.900083f, 0.348597f, - 0.309017f, 0.000000f, 0.951056f, 0.000000f, 0.309017f, 0.000000f, 0.951056f, 0.741373f, 0.498912f, - 0.587786f, 0.000000f, 0.809017f, 0.000000f, 0.587786f, 0.000000f, 0.809017f, 0.757596f, 0.176140f, - 0.436007f, 0.251152f, 0.864188f, 0.000000f, 0.436007f, 0.251152f, 0.864188f, 0.900083f, 0.348597f, - -0.000000f, -0.000000f, 1.000000f, 0.000000f, -0.000000f, -0.000000f, 1.000000f, 0.846308f, 0.334943f, - 0.138199f, -0.276398f, 0.951055f, 0.000000f, 0.138199f, -0.276398f, 0.951055f, 0.735205f, 0.674734f, - 0.309017f, 0.000000f, 0.951056f, 0.000000f, 0.309017f, 0.000000f, 0.951056f, 0.741373f, 0.498912f, - 0.138199f, -0.276398f, 0.951055f, 0.000000f, 0.138199f, -0.276398f, 0.951055f, 0.735205f, 0.674734f, - 0.447216f, -0.276398f, 0.850648f, 0.000000f, 0.447216f, -0.276398f, 0.850648f, 0.765485f, 0.591271f, - 0.309017f, 0.000000f, 0.951056f, 0.000000f, 0.309017f, 0.000000f, 0.951056f, 0.741373f, 0.498912f, - 0.309017f, 0.000000f, 0.951056f, 0.000000f, 0.309017f, 0.000000f, 0.951056f, 0.741373f, 0.498912f, - 0.447216f, -0.276398f, 0.850648f, 0.000000f, 0.447216f, -0.276398f, 0.850648f, 0.765485f, 0.591271f, - 0.587786f, 0.000000f, 0.809017f, 0.000000f, 0.587786f, 0.000000f, 0.809017f, 0.757596f, 0.176140f, - 0.447216f, -0.276398f, 0.850648f, 0.000000f, 0.447216f, -0.276398f, 0.850648f, 0.765485f, 0.591271f, - 0.687159f, -0.251152f, 0.681715f, 0.000000f, 0.687159f, -0.251152f, 0.681715f, 0.702477f, 0.326245f, - 0.587786f, 0.000000f, 0.809017f, 0.000000f, 0.587786f, 0.000000f, 0.809017f, 0.757596f, 0.176140f, - -0.155215f, -0.251152f, 0.955422f, 0.000000f, -0.155215f, -0.251152f, 0.955422f, 0.885924f, 0.257323f, - -0.029639f, -0.502302f, 0.864184f, 0.000000f, -0.029639f, -0.502302f, 0.864184f, 0.180731f, 0.340648f, - 0.138199f, -0.276398f, 0.951055f, 0.000000f, 0.138199f, -0.276398f, 0.951055f, 0.735205f, 0.674734f, - -0.029639f, -0.502302f, 0.864184f, 0.000000f, -0.029639f, -0.502302f, 0.864184f, 0.180731f, 0.340648f, - 0.262869f, -0.525738f, 0.809012f, 0.000000f, 0.262869f, -0.525738f, 0.809012f, 0.137692f, 0.365246f, - 0.138199f, -0.276398f, 0.951055f, 0.000000f, 0.138199f, -0.276398f, 0.951055f, 0.735205f, 0.674734f, - 0.138199f, -0.276398f, 0.951055f, 0.000000f, 0.138199f, -0.276398f, 0.951055f, 0.735205f, 0.674734f, - 0.262869f, -0.525738f, 0.809012f, 0.000000f, 0.262869f, -0.525738f, 0.809012f, 0.137692f, 0.365246f, - 0.447216f, -0.276398f, 0.850648f, 0.000000f, 0.447216f, -0.276398f, 0.850648f, 0.765485f, 0.591271f, - 0.262869f, -0.525738f, 0.809012f, 0.000000f, 0.262869f, -0.525738f, 0.809012f, 0.137692f, 0.365246f, - 0.531941f, -0.502302f, 0.681712f, 0.000000f, 0.531941f, -0.502302f, 0.681712f, 0.363599f, 0.405960f, - 0.447216f, -0.276398f, 0.850648f, 0.000000f, 0.447216f, -0.276398f, 0.850648f, 0.765485f, 0.591271f, - 0.447216f, -0.276398f, 0.850648f, 0.000000f, 0.447216f, -0.276398f, 0.850648f, 0.765485f, 0.591271f, - 0.531941f, -0.502302f, 0.681712f, 0.000000f, 0.531941f, -0.502302f, 0.681712f, 0.363599f, 0.405960f, - 0.687159f, -0.251152f, 0.681715f, 0.000000f, 0.687159f, -0.251152f, 0.681715f, 0.702477f, 0.326245f, - 0.531941f, -0.502302f, 0.681712f, 0.000000f, 0.531941f, -0.502302f, 0.681712f, 0.363599f, 0.405960f, - 0.723607f, -0.447220f, 0.525725f, 0.000000f, 0.723607f, -0.447220f, 0.525725f, 0.779690f, 0.082142f, - 0.687159f, -0.251152f, 0.681715f, 0.000000f, 0.687159f, -0.251152f, 0.681715f, 0.702477f, 0.326245f, - -0.860698f, 0.251151f, 0.442858f, 0.000000f, -0.860698f, 0.251151f, 0.442858f, 0.333640f, 0.261125f, - -0.687159f, 0.251152f, 0.681715f, 0.000000f, -0.687159f, 0.251152f, 0.681715f, 0.856930f, 0.159299f, - -0.723607f, 0.447220f, 0.525725f, 0.000000f, -0.723607f, 0.447220f, 0.525725f, 1.115709f, 0.094716f, - -0.951058f, -0.000000f, 0.309013f, 0.000000f, -0.951058f, -0.000000f, 0.309013f, 0.326823f, 0.166086f, - -0.809018f, 0.000000f, 0.587783f, 0.000000f, -0.809018f, 0.000000f, 0.587783f, 0.791096f, 0.672983f, - -0.860698f, 0.251151f, 0.442858f, 0.000000f, -0.860698f, 0.251151f, 0.442858f, 0.333640f, 0.261125f, - -0.956626f, -0.251149f, 0.147618f, 0.000000f, -0.956626f, -0.251149f, 0.147618f, 0.397050f, 0.226232f, - -0.861803f, -0.276396f, 0.425324f, 0.000000f, -0.861803f, -0.276396f, 0.425324f, 0.514094f, 0.569167f, - -0.951058f, -0.000000f, 0.309013f, 0.000000f, -0.951058f, -0.000000f, 0.309013f, 0.326823f, 0.166086f, - -0.860698f, 0.251151f, 0.442858f, 0.000000f, -0.860698f, 0.251151f, 0.442858f, 0.333640f, 0.261125f, - -0.809018f, 0.000000f, 0.587783f, 0.000000f, -0.809018f, 0.000000f, 0.587783f, 0.791096f, 0.672983f, - -0.687159f, 0.251152f, 0.681715f, 0.000000f, -0.687159f, 0.251152f, 0.681715f, 0.856930f, 0.159299f, - -0.809018f, 0.000000f, 0.587783f, 0.000000f, -0.809018f, 0.000000f, 0.587783f, 0.791096f, 0.672983f, - -0.587786f, 0.000000f, 0.809017f, 0.000000f, -0.587786f, 0.000000f, 0.809017f, 0.946597f, 0.195033f, - -0.687159f, 0.251152f, 0.681715f, 0.000000f, -0.687159f, 0.251152f, 0.681715f, 0.856930f, 0.159299f, - -0.951058f, -0.000000f, 0.309013f, 0.000000f, -0.951058f, -0.000000f, 0.309013f, 0.326823f, 0.166086f, - -0.861803f, -0.276396f, 0.425324f, 0.000000f, -0.861803f, -0.276396f, 0.425324f, 0.514094f, 0.569167f, - -0.809018f, 0.000000f, 0.587783f, 0.000000f, -0.809018f, 0.000000f, 0.587783f, 0.791096f, 0.672983f, - -0.861803f, -0.276396f, 0.425324f, 0.000000f, -0.861803f, -0.276396f, 0.425324f, 0.514094f, 0.569167f, - -0.670819f, -0.276397f, 0.688191f, 0.000000f, -0.670819f, -0.276397f, 0.688191f, 0.541434f, 0.480621f, - -0.809018f, 0.000000f, 0.587783f, 0.000000f, -0.809018f, 0.000000f, 0.587783f, 0.791096f, 0.672983f, - -0.809018f, 0.000000f, 0.587783f, 0.000000f, -0.809018f, 0.000000f, 0.587783f, 0.791096f, 0.672983f, - -0.670819f, -0.276397f, 0.688191f, 0.000000f, -0.670819f, -0.276397f, 0.688191f, 0.541434f, 0.480621f, - -0.587786f, 0.000000f, 0.809017f, 0.000000f, -0.587786f, 0.000000f, 0.809017f, 0.946597f, 0.195033f, - -0.670819f, -0.276397f, 0.688191f, 0.000000f, -0.670819f, -0.276397f, 0.688191f, 0.541434f, 0.480621f, - -0.436007f, -0.251152f, 0.864188f, 0.000000f, -0.436007f, -0.251152f, 0.864188f, 0.813138f, 0.249674f, - -0.587786f, 0.000000f, 0.809017f, 0.000000f, -0.587786f, 0.000000f, 0.809017f, 0.946597f, 0.195033f, - -0.956626f, -0.251149f, 0.147618f, 0.000000f, -0.956626f, -0.251149f, 0.147618f, 0.397050f, 0.226232f, - -0.831051f, -0.502299f, 0.238853f, 0.000000f, -0.831051f, -0.502299f, 0.238853f, 0.634945f, 0.715428f, - -0.861803f, -0.276396f, 0.425324f, 0.000000f, -0.861803f, -0.276396f, 0.425324f, 0.514094f, 0.569167f, - -0.831051f, -0.502299f, 0.238853f, 0.000000f, -0.831051f, -0.502299f, 0.238853f, 0.634945f, 0.715428f, - -0.688189f, -0.525736f, 0.499997f, 0.000000f, -0.688189f, -0.525736f, 0.499997f, 0.680731f, 0.659352f, - -0.861803f, -0.276396f, 0.425324f, 0.000000f, -0.861803f, -0.276396f, 0.425324f, 0.514094f, 0.569167f, - -0.861803f, -0.276396f, 0.425324f, 0.000000f, -0.861803f, -0.276396f, 0.425324f, 0.514094f, 0.569167f, - -0.688189f, -0.525736f, 0.499997f, 0.000000f, -0.688189f, -0.525736f, 0.499997f, 0.680731f, 0.659352f, - -0.670819f, -0.276397f, 0.688191f, 0.000000f, -0.670819f, -0.276397f, 0.688191f, 0.541434f, 0.480621f, - -0.688189f, -0.525736f, 0.499997f, 0.000000f, -0.688189f, -0.525736f, 0.499997f, 0.680731f, 0.659352f, - -0.483971f, -0.502302f, 0.716565f, 0.000000f, -0.483971f, -0.502302f, 0.716565f, 0.637692f, 0.634754f, - -0.670819f, -0.276397f, 0.688191f, 0.000000f, -0.670819f, -0.276397f, 0.688191f, 0.541434f, 0.480621f, - -0.670819f, -0.276397f, 0.688191f, 0.000000f, -0.670819f, -0.276397f, 0.688191f, 0.541434f, 0.480621f, - -0.483971f, -0.502302f, 0.716565f, 0.000000f, -0.483971f, -0.502302f, 0.716565f, 0.637692f, 0.634754f, - -0.436007f, -0.251152f, 0.864188f, 0.000000f, -0.436007f, -0.251152f, 0.864188f, 0.813138f, 0.249674f, - -0.483971f, -0.502302f, 0.716565f, 0.000000f, -0.483971f, -0.502302f, 0.716565f, 0.637692f, 0.634754f, - -0.276388f, -0.447220f, 0.850649f, 0.000000f, -0.276388f, -0.447220f, 0.850649f, 0.554423f, 0.061638f, - -0.436007f, -0.251152f, 0.864188f, 0.000000f, -0.436007f, -0.251152f, 0.864188f, 0.813138f, 0.249674f, - -0.687159f, 0.251152f, -0.681715f, 0.000000f, -0.687159f, 0.251152f, -0.681715f, 0.477658f, 0.222612f, - -0.860698f, 0.251151f, -0.442858f, 0.000000f, -0.860698f, 0.251151f, -0.442858f, 0.438926f, 0.305137f, - -0.723607f, 0.447220f, -0.525725f, 0.000000f, -0.723607f, 0.447220f, -0.525725f, 0.952607f, 0.099770f, - -0.587786f, -0.000000f, -0.809017f, 0.000000f, -0.587786f, -0.000000f, -0.809017f, 0.496685f, 0.312438f, - -0.809018f, -0.000000f, -0.587783f, 0.000000f, -0.809018f, -0.000000f, -0.587783f, 0.539894f, 0.656807f, - -0.687159f, 0.251152f, -0.681715f, 0.000000f, -0.687159f, 0.251152f, -0.681715f, 0.477658f, 0.222612f, - -0.436007f, -0.251152f, -0.864188f, 0.000000f, -0.436007f, -0.251152f, -0.864188f, 0.134945f, 0.284572f, - -0.670819f, -0.276397f, -0.688191f, 0.000000f, -0.670819f, -0.276397f, -0.688191f, 0.567324f, 0.570882f, - -0.587786f, -0.000000f, -0.809017f, 0.000000f, -0.587786f, -0.000000f, -0.809017f, 0.496685f, 0.312438f, - -0.687159f, 0.251152f, -0.681715f, 0.000000f, -0.687159f, 0.251152f, -0.681715f, 0.477658f, 0.222612f, - -0.809018f, -0.000000f, -0.587783f, 0.000000f, -0.809018f, -0.000000f, -0.587783f, 0.539894f, 0.656807f, - -0.860698f, 0.251151f, -0.442858f, 0.000000f, -0.860698f, 0.251151f, -0.442858f, 0.438926f, 0.305137f, - -0.809018f, -0.000000f, -0.587783f, 0.000000f, -0.809018f, -0.000000f, -0.587783f, 0.539894f, 0.656807f, - -0.951058f, 0.000000f, -0.309013f, 0.000000f, -0.951058f, 0.000000f, -0.309013f, 0.433048f, 0.129063f, - -0.860698f, 0.251151f, -0.442858f, 0.000000f, -0.860698f, 0.251151f, -0.442858f, 0.438926f, 0.305137f, - -0.587786f, -0.000000f, -0.809017f, 0.000000f, -0.587786f, -0.000000f, -0.809017f, 0.496685f, 0.312438f, - -0.670819f, -0.276397f, -0.688191f, 0.000000f, -0.670819f, -0.276397f, -0.688191f, 0.567324f, 0.570882f, - -0.809018f, -0.000000f, -0.587783f, 0.000000f, -0.809018f, -0.000000f, -0.587783f, 0.539894f, 0.656807f, - -0.670819f, -0.276397f, -0.688191f, 0.000000f, -0.670819f, -0.276397f, -0.688191f, 0.567324f, 0.570882f, - -0.861803f, -0.276396f, -0.425324f, 0.000000f, -0.861803f, -0.276396f, -0.425324f, 0.593723f, 0.650945f, - -0.809018f, -0.000000f, -0.587783f, 0.000000f, -0.809018f, -0.000000f, -0.587783f, 0.539894f, 0.656807f, - -0.809018f, -0.000000f, -0.587783f, 0.000000f, -0.809018f, -0.000000f, -0.587783f, 0.539894f, 0.656807f, - -0.861803f, -0.276396f, -0.425324f, 0.000000f, -0.861803f, -0.276396f, -0.425324f, 0.593723f, 0.650945f, - -0.951058f, 0.000000f, -0.309013f, 0.000000f, -0.951058f, 0.000000f, -0.309013f, 0.433048f, 0.129063f, - -0.861803f, -0.276396f, -0.425324f, 0.000000f, -0.861803f, -0.276396f, -0.425324f, 0.593723f, 0.650945f, - -0.956626f, -0.251149f, -0.147618f, 0.000000f, -0.956626f, -0.251149f, -0.147618f, 0.304489f, 0.071876f, - -0.951058f, 0.000000f, -0.309013f, 0.000000f, -0.951058f, 0.000000f, -0.309013f, 0.433048f, 0.129063f, - -0.436007f, -0.251152f, -0.864188f, 0.000000f, -0.436007f, -0.251152f, -0.864188f, 0.134945f, 0.284572f, - -0.483971f, -0.502302f, -0.716565f, 0.000000f, -0.483971f, -0.502302f, -0.716565f, 0.250122f, 0.728931f, - -0.670819f, -0.276397f, -0.688191f, 0.000000f, -0.670819f, -0.276397f, -0.688191f, 0.567324f, 0.570882f, - -0.483971f, -0.502302f, -0.716565f, 0.000000f, -0.483971f, -0.502302f, -0.716565f, 0.250122f, 0.728931f, - -0.688189f, -0.525736f, -0.499997f, 0.000000f, -0.688189f, -0.525736f, -0.499997f, 0.291456f, 0.662685f, - -0.670819f, -0.276397f, -0.688191f, 0.000000f, -0.670819f, -0.276397f, -0.688191f, 0.567324f, 0.570882f, - -0.670819f, -0.276397f, -0.688191f, 0.000000f, -0.670819f, -0.276397f, -0.688191f, 0.567324f, 0.570882f, - -0.688189f, -0.525736f, -0.499997f, 0.000000f, -0.688189f, -0.525736f, -0.499997f, 0.291456f, 0.662685f, - -0.861803f, -0.276396f, -0.425324f, 0.000000f, -0.861803f, -0.276396f, -0.425324f, 0.593723f, 0.650945f, - -0.688189f, -0.525736f, -0.499997f, 0.000000f, -0.688189f, -0.525736f, -0.499997f, 0.291456f, 0.662685f, - -0.831051f, -0.502299f, -0.238853f, 0.000000f, -0.831051f, -0.502299f, -0.238853f, 0.246383f, 0.648358f, - -0.861803f, -0.276396f, -0.425324f, 0.000000f, -0.861803f, -0.276396f, -0.425324f, 0.593723f, 0.650945f, - -0.861803f, -0.276396f, -0.425324f, 0.000000f, -0.861803f, -0.276396f, -0.425324f, 0.593723f, 0.650945f, - -0.831051f, -0.502299f, -0.238853f, 0.000000f, -0.831051f, -0.502299f, -0.238853f, 0.246383f, 0.648358f, - -0.956626f, -0.251149f, -0.147618f, 0.000000f, -0.956626f, -0.251149f, -0.147618f, 0.304489f, 0.071876f, - -0.831051f, -0.502299f, -0.238853f, 0.000000f, -0.831051f, -0.502299f, -0.238853f, 0.246383f, 0.648358f, - -0.894426f, -0.447216f, 0.000000f, 0.000000f, -0.894426f, -0.447216f, 0.000000f, 0.746383f, 0.351642f, - -0.956626f, -0.251149f, -0.147618f, 0.000000f, -0.956626f, -0.251149f, -0.147618f, 0.304489f, 0.071876f, - 0.436007f, 0.251152f, -0.864188f, 0.000000f, 0.436007f, 0.251152f, -0.864188f, 0.221600f, 0.149916f, - 0.155215f, 0.251152f, -0.955422f, 0.000000f, 0.155215f, 0.251152f, -0.955422f, 0.115709f, 0.094716f, - 0.276388f, 0.447220f, -0.850649f, 0.000000f, 0.276388f, 0.447220f, -0.850649f, 0.768276f, 0.421330f, - 0.587786f, -0.000000f, -0.809017f, 0.000000f, 0.587786f, -0.000000f, -0.809017f, 0.235205f, 0.325266f, - 0.309017f, -0.000000f, -0.951056f, 0.000000f, 0.309017f, -0.000000f, -0.951056f, 0.316839f, 0.581107f, - 0.436007f, 0.251152f, -0.864188f, 0.000000f, 0.436007f, 0.251152f, -0.864188f, 0.221600f, 0.149916f, - 0.687159f, -0.251152f, -0.681715f, 0.000000f, 0.687159f, -0.251152f, -0.681715f, 0.268675f, 0.239476f, - 0.447216f, -0.276398f, -0.850648f, 0.000000f, 0.447216f, -0.276398f, -0.850648f, 0.341211f, 0.489117f, - 0.587786f, -0.000000f, -0.809017f, 0.000000f, 0.587786f, -0.000000f, -0.809017f, 0.235205f, 0.325266f, - 0.436007f, 0.251152f, -0.864188f, 0.000000f, 0.436007f, 0.251152f, -0.864188f, 0.221600f, 0.149916f, - 0.309017f, -0.000000f, -0.951056f, 0.000000f, 0.309017f, -0.000000f, -0.951056f, 0.316839f, 0.581107f, - 0.155215f, 0.251152f, -0.955422f, 0.000000f, 0.155215f, 0.251152f, -0.955422f, 0.115709f, 0.094716f, - 0.309017f, -0.000000f, -0.951056f, 0.000000f, 0.309017f, -0.000000f, -0.951056f, 0.316839f, 0.581107f, - 0.000000f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, -1.000000f, 0.193762f, 0.248844f, - 0.155215f, 0.251152f, -0.955422f, 0.000000f, 0.155215f, 0.251152f, -0.955422f, 0.115709f, 0.094716f, - 0.587786f, -0.000000f, -0.809017f, 0.000000f, 0.587786f, -0.000000f, -0.809017f, 0.235205f, 0.325266f, - 0.447216f, -0.276398f, -0.850648f, 0.000000f, 0.447216f, -0.276398f, -0.850648f, 0.341211f, 0.489117f, - 0.309017f, -0.000000f, -0.951056f, 0.000000f, 0.309017f, -0.000000f, -0.951056f, 0.316839f, 0.581107f, - 0.447216f, -0.276398f, -0.850648f, 0.000000f, 0.447216f, -0.276398f, -0.850648f, 0.341211f, 0.489117f, - 0.138199f, -0.276398f, -0.951055f, 0.000000f, 0.138199f, -0.276398f, -0.951055f, 0.346308f, 0.665057f, - 0.309017f, -0.000000f, -0.951056f, 0.000000f, 0.309017f, -0.000000f, -0.951056f, 0.316839f, 0.581107f, - 0.309017f, -0.000000f, -0.951056f, 0.000000f, 0.309017f, -0.000000f, -0.951056f, 0.316839f, 0.581107f, - 0.138199f, -0.276398f, -0.951055f, 0.000000f, 0.138199f, -0.276398f, -0.951055f, 0.346308f, 0.665057f, - 0.000000f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, -1.000000f, 0.193762f, 0.248844f, - 0.138199f, -0.276398f, -0.951055f, 0.000000f, 0.138199f, -0.276398f, -0.951055f, 0.346308f, 0.665057f, - -0.155215f, -0.251152f, -0.955422f, 0.000000f, -0.155215f, -0.251152f, -0.955422f, 0.129692f, 0.189429f, - 0.000000f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, -1.000000f, 0.193762f, 0.248844f, - 0.687159f, -0.251152f, -0.681715f, 0.000000f, 0.687159f, -0.251152f, -0.681715f, 0.268675f, 0.239476f, - 0.531941f, -0.502302f, -0.681712f, 0.000000f, 0.531941f, -0.502302f, -0.681712f, 0.833640f, 0.738875f, - 0.447216f, -0.276398f, -0.850648f, 0.000000f, 0.447216f, -0.276398f, -0.850648f, 0.341211f, 0.489117f, - 0.531941f, -0.502302f, -0.681712f, 0.000000f, 0.531941f, -0.502302f, -0.681712f, 0.833640f, 0.738875f, - 0.262869f, -0.525738f, -0.809012f, 0.000000f, 0.262869f, -0.525738f, -0.809012f, 0.881800f, 0.682461f, - 0.447216f, -0.276398f, -0.850648f, 0.000000f, 0.447216f, -0.276398f, -0.850648f, 0.341211f, 0.489117f, - 0.447216f, -0.276398f, -0.850648f, 0.000000f, 0.447216f, -0.276398f, -0.850648f, 0.341211f, 0.489117f, - 0.262869f, -0.525738f, -0.809012f, 0.000000f, 0.262869f, -0.525738f, -0.809012f, 0.881800f, 0.682461f, - 0.138199f, -0.276398f, -0.951055f, 0.000000f, 0.138199f, -0.276398f, -0.951055f, 0.346308f, 0.665057f, - 0.262869f, -0.525738f, -0.809012f, 0.000000f, 0.262869f, -0.525738f, -0.809012f, 0.881800f, 0.682461f, - -0.029639f, -0.502302f, -0.864184f, 0.000000f, -0.029639f, -0.502302f, -0.864184f, 0.836927f, 0.658241f, - 0.138199f, -0.276398f, -0.951055f, 0.000000f, 0.138199f, -0.276398f, -0.951055f, 0.346308f, 0.665057f, - 0.138199f, -0.276398f, -0.951055f, 0.000000f, 0.138199f, -0.276398f, -0.951055f, 0.346308f, 0.665057f, - -0.029639f, -0.502302f, -0.864184f, 0.000000f, -0.029639f, -0.502302f, -0.864184f, 0.836927f, 0.658241f, - -0.155215f, -0.251152f, -0.955422f, 0.000000f, -0.155215f, -0.251152f, -0.955422f, 0.129692f, 0.189429f, - -0.029639f, -0.502302f, -0.864184f, 0.000000f, -0.029639f, -0.502302f, -0.864184f, 0.836927f, 0.658241f, - -0.276388f, -0.447220f, -0.850649f, 0.000000f, -0.276388f, -0.447220f, -0.850649f, 0.750122f, 0.271069f, - -0.155215f, -0.251152f, -0.955422f, 0.000000f, -0.155215f, -0.251152f, -0.955422f, 0.129692f, 0.189429f, - 0.436007f, 0.251152f, 0.864188f, 0.000000f, 0.436007f, 0.251152f, 0.864188f, 0.900083f, 0.348597f, - 0.483971f, 0.502302f, 0.716565f, 0.000000f, 0.483971f, 0.502302f, 0.716565f, 1.036828f, 0.167036f, - 0.276388f, 0.447220f, 0.850649f, 0.000000f, 0.276388f, 0.447220f, 0.850649f, 1.304489f, 0.071876f, - 0.587786f, 0.000000f, 0.809017f, 0.000000f, 0.587786f, 0.000000f, 0.809017f, 0.757596f, 0.176140f, - 0.670820f, 0.276396f, 0.688190f, 0.000000f, 0.670820f, 0.276396f, 0.688190f, 0.370330f, 0.575469f, - 0.436007f, 0.251152f, 0.864188f, 0.000000f, 0.436007f, 0.251152f, 0.864188f, 0.900083f, 0.348597f, - 0.687159f, -0.251152f, 0.681715f, 0.000000f, 0.687159f, -0.251152f, 0.681715f, 0.702477f, 0.326245f, - 0.809019f, -0.000002f, 0.587783f, 0.000000f, 0.809019f, -0.000002f, 0.587783f, 0.400083f, 0.651403f, - 0.587786f, 0.000000f, 0.809017f, 0.000000f, 0.587786f, 0.000000f, 0.809017f, 0.757596f, 0.176140f, - 0.436007f, 0.251152f, 0.864188f, 0.000000f, 0.436007f, 0.251152f, 0.864188f, 0.900083f, 0.348597f, - 0.670820f, 0.276396f, 0.688190f, 0.000000f, 0.670820f, 0.276396f, 0.688190f, 0.370330f, 0.575469f, - 0.483971f, 0.502302f, 0.716565f, 0.000000f, 0.483971f, 0.502302f, 0.716565f, 1.036828f, 0.167036f, - 0.670820f, 0.276396f, 0.688190f, 0.000000f, 0.670820f, 0.276396f, 0.688190f, 0.370330f, 0.575469f, - 0.688189f, 0.525736f, 0.499997f, 0.000000f, 0.688189f, 0.525736f, 0.499997f, 1.003325f, 0.262529f, - 0.483971f, 0.502302f, 0.716565f, 0.000000f, 0.483971f, 0.502302f, 0.716565f, 1.036828f, 0.167036f, - 0.587786f, 0.000000f, 0.809017f, 0.000000f, 0.587786f, 0.000000f, 0.809017f, 0.757596f, 0.176140f, - 0.809019f, -0.000002f, 0.587783f, 0.000000f, 0.809019f, -0.000002f, 0.587783f, 0.400083f, 0.651403f, - 0.670820f, 0.276396f, 0.688190f, 0.000000f, 0.670820f, 0.276396f, 0.688190f, 0.370330f, 0.575469f, - 0.809019f, -0.000002f, 0.587783f, 0.000000f, 0.809019f, -0.000002f, 0.587783f, 0.400083f, 0.651403f, - 0.861804f, 0.276394f, 0.425323f, 0.000000f, 0.861804f, 0.276394f, 0.425323f, 0.116405f, 0.604155f, - 0.670820f, 0.276396f, 0.688190f, 0.000000f, 0.670820f, 0.276396f, 0.688190f, 0.370330f, 0.575469f, - 0.670820f, 0.276396f, 0.688190f, 0.000000f, 0.670820f, 0.276396f, 0.688190f, 0.370330f, 0.575469f, - 0.861804f, 0.276394f, 0.425323f, 0.000000f, 0.861804f, 0.276394f, 0.425323f, 0.116405f, 0.604155f, - 0.688189f, 0.525736f, 0.499997f, 0.000000f, 0.688189f, 0.525736f, 0.499997f, 1.003325f, 0.262529f, - 0.861804f, 0.276394f, 0.425323f, 0.000000f, 0.861804f, 0.276394f, 0.425323f, 0.116405f, 0.604155f, - 0.831051f, 0.502299f, 0.238853f, 0.000000f, 0.831051f, 0.502299f, 0.238853f, 0.291096f, 0.327017f, - 0.688189f, 0.525736f, 0.499997f, 0.000000f, 0.688189f, 0.525736f, 0.499997f, 1.003325f, 0.262529f, - 0.687159f, -0.251152f, 0.681715f, 0.000000f, 0.687159f, -0.251152f, 0.681715f, 0.702477f, 0.326245f, - 0.860698f, -0.251151f, 0.442858f, 0.000000f, 0.860698f, -0.251151f, 0.442858f, 0.689049f, 0.234408f, - 0.809019f, -0.000002f, 0.587783f, 0.000000f, 0.809019f, -0.000002f, 0.587783f, 0.400083f, 0.651403f, - 0.860698f, -0.251151f, 0.442858f, 0.000000f, 0.860698f, -0.251151f, 0.442858f, 0.689049f, 0.234408f, - 0.951058f, -0.000000f, 0.309013f, 0.000000f, 0.951058f, -0.000000f, 0.309013f, 0.646443f, 0.311386f, - 0.809019f, -0.000002f, 0.587783f, 0.000000f, 0.809019f, -0.000002f, 0.587783f, 0.400083f, 0.651403f, - 0.809019f, -0.000002f, 0.587783f, 0.000000f, 0.809019f, -0.000002f, 0.587783f, 0.400083f, 0.651403f, - 0.951058f, -0.000000f, 0.309013f, 0.000000f, 0.951058f, -0.000000f, 0.309013f, 0.646443f, 0.311386f, - 0.861804f, 0.276394f, 0.425323f, 0.000000f, 0.861804f, 0.276394f, 0.425323f, 0.116405f, 0.604155f, - 0.951058f, -0.000000f, 0.309013f, 0.000000f, 0.951058f, -0.000000f, 0.309013f, 0.646443f, 0.311386f, - 0.956626f, 0.251149f, 0.147618f, 0.000000f, 0.956626f, 0.251149f, 0.147618f, 0.658365f, 0.135762f, - 0.861804f, 0.276394f, 0.425323f, 0.000000f, 0.861804f, 0.276394f, 0.425323f, 0.116405f, 0.604155f, - 0.861804f, 0.276394f, 0.425323f, 0.000000f, 0.861804f, 0.276394f, 0.425323f, 0.116405f, 0.604155f, - 0.956626f, 0.251149f, 0.147618f, 0.000000f, 0.956626f, 0.251149f, 0.147618f, 0.658365f, 0.135762f, - 0.831051f, 0.502299f, 0.238853f, 0.000000f, 0.831051f, 0.502299f, 0.238853f, 0.291096f, 0.327017f, - 0.956626f, 0.251149f, 0.147618f, 0.000000f, 0.956626f, 0.251149f, 0.147618f, 0.658365f, 0.135762f, - 0.894426f, 0.447216f, 0.000000f, 0.000000f, 0.894426f, 0.447216f, 0.000000f, 0.542767f, 0.333057f, - 0.831051f, 0.502299f, 0.238853f, 0.000000f, 0.831051f, 0.502299f, 0.238853f, 0.291096f, 0.327017f, - -0.687159f, 0.251152f, 0.681715f, 0.000000f, -0.687159f, 0.251152f, 0.681715f, 0.856930f, 0.159299f, - -0.531941f, 0.502302f, 0.681712f, 0.000000f, -0.531941f, 0.502302f, 0.681712f, 0.074553f, 0.260244f, - -0.723607f, 0.447220f, 0.525725f, 0.000000f, -0.723607f, 0.447220f, 0.525725f, 1.115709f, 0.094716f, - -0.587786f, 0.000000f, 0.809017f, 0.000000f, -0.587786f, 0.000000f, 0.809017f, 0.946597f, 0.195033f, - -0.447216f, 0.276397f, 0.850649f, 0.000000f, -0.447216f, 0.276397f, 0.850649f, 0.141510f, 0.512645f, - -0.687159f, 0.251152f, 0.681715f, 0.000000f, -0.687159f, 0.251152f, 0.681715f, 0.856930f, 0.159299f, - -0.436007f, -0.251152f, 0.864188f, 0.000000f, -0.436007f, -0.251152f, 0.864188f, 0.813138f, 0.249674f, - -0.309017f, -0.000001f, 0.951056f, 0.000000f, -0.309017f, -0.000001f, 0.951056f, 0.146443f, 0.688614f, - -0.587786f, 0.000000f, 0.809017f, 0.000000f, -0.587786f, 0.000000f, 0.809017f, 0.946597f, 0.195033f, - -0.687159f, 0.251152f, 0.681715f, 0.000000f, -0.687159f, 0.251152f, 0.681715f, 0.856930f, 0.159299f, - -0.447216f, 0.276397f, 0.850649f, 0.000000f, -0.447216f, 0.276397f, 0.850649f, 0.141510f, 0.512645f, - -0.531941f, 0.502302f, 0.681712f, 0.000000f, -0.531941f, 0.502302f, 0.681712f, 0.074553f, 0.260244f, - -0.447216f, 0.276397f, 0.850649f, 0.000000f, -0.447216f, 0.276397f, 0.850649f, 0.141510f, 0.512645f, - -0.262869f, 0.525738f, 0.809012f, 0.000000f, -0.262869f, 0.525738f, 0.809012f, 0.036828f, 0.167036f, - -0.531941f, 0.502302f, 0.681712f, 0.000000f, -0.531941f, 0.502302f, 0.681712f, 0.074553f, 0.260244f, - -0.587786f, 0.000000f, 0.809017f, 0.000000f, -0.587786f, 0.000000f, 0.809017f, 0.946597f, 0.195033f, - -0.309017f, -0.000001f, 0.951056f, 0.000000f, -0.309017f, -0.000001f, 0.951056f, 0.146443f, 0.688614f, - -0.447216f, 0.276397f, 0.850649f, 0.000000f, -0.447216f, 0.276397f, 0.850649f, 0.141510f, 0.512645f, - -0.309017f, -0.000001f, 0.951056f, 0.000000f, -0.309017f, -0.000001f, 0.951056f, 0.146443f, 0.688614f, - -0.138199f, 0.276397f, 0.951055f, 0.000000f, -0.138199f, 0.276397f, 0.951055f, 0.171061f, 0.598834f, - -0.447216f, 0.276397f, 0.850649f, 0.000000f, -0.447216f, 0.276397f, 0.850649f, 0.141510f, 0.512645f, - -0.447216f, 0.276397f, 0.850649f, 0.000000f, -0.447216f, 0.276397f, 0.850649f, 0.141510f, 0.512645f, - -0.138199f, 0.276397f, 0.951055f, 0.000000f, -0.138199f, 0.276397f, 0.951055f, 0.171061f, 0.598834f, - -0.262869f, 0.525738f, 0.809012f, 0.000000f, -0.262869f, 0.525738f, 0.809012f, 0.036828f, 0.167036f, - -0.138199f, 0.276397f, 0.951055f, 0.000000f, -0.138199f, 0.276397f, 0.951055f, 0.171061f, 0.598834f, - 0.029639f, 0.502302f, 0.864184f, 0.000000f, 0.029639f, 0.502302f, 0.864184f, 1.039894f, 0.343193f, - -0.262869f, 0.525738f, 0.809012f, 0.000000f, -0.262869f, 0.525738f, 0.809012f, 0.036828f, 0.167036f, - -0.436007f, -0.251152f, 0.864188f, 0.000000f, -0.436007f, -0.251152f, 0.864188f, 0.813138f, 0.249674f, - -0.155215f, -0.251152f, 0.955422f, 0.000000f, -0.155215f, -0.251152f, 0.955422f, 0.885924f, 0.257323f, - -0.309017f, -0.000001f, 0.951056f, 0.000000f, -0.309017f, -0.000001f, 0.951056f, 0.146443f, 0.688614f, - -0.155215f, -0.251152f, 0.955422f, 0.000000f, -0.155215f, -0.251152f, 0.955422f, 0.885924f, 0.257323f, - -0.000000f, -0.000000f, 1.000000f, 0.000000f, -0.000000f, -0.000000f, 1.000000f, 0.846308f, 0.334943f, - -0.309017f, -0.000001f, 0.951056f, 0.000000f, -0.309017f, -0.000001f, 0.951056f, 0.146443f, 0.688614f, - -0.309017f, -0.000001f, 0.951056f, 0.000000f, -0.309017f, -0.000001f, 0.951056f, 0.146443f, 0.688614f, - -0.000000f, -0.000000f, 1.000000f, 0.000000f, -0.000000f, -0.000000f, 1.000000f, 0.846308f, 0.334943f, - -0.138199f, 0.276397f, 0.951055f, 0.000000f, -0.138199f, 0.276397f, 0.951055f, 0.171061f, 0.598834f, - -0.000000f, -0.000000f, 1.000000f, 0.000000f, -0.000000f, -0.000000f, 1.000000f, 0.846308f, 0.334943f, - 0.155215f, 0.251152f, 0.955422f, 0.000000f, 0.155215f, 0.251152f, 0.955422f, 0.944254f, 0.290379f, - -0.138199f, 0.276397f, 0.951055f, 0.000000f, -0.138199f, 0.276397f, 0.951055f, 0.171061f, 0.598834f, - -0.138199f, 0.276397f, 0.951055f, 0.000000f, -0.138199f, 0.276397f, 0.951055f, 0.171061f, 0.598834f, - 0.155215f, 0.251152f, 0.955422f, 0.000000f, 0.155215f, 0.251152f, 0.955422f, 0.944254f, 0.290379f, - 0.029639f, 0.502302f, 0.864184f, 0.000000f, 0.029639f, 0.502302f, 0.864184f, 1.039894f, 0.343193f, - 0.155215f, 0.251152f, 0.955422f, 0.000000f, 0.155215f, 0.251152f, 0.955422f, 0.944254f, 0.290379f, - 0.276388f, 0.447220f, 0.850649f, 0.000000f, 0.276388f, 0.447220f, 0.850649f, 1.304489f, 0.071876f, - 0.029639f, 0.502302f, 0.864184f, 0.000000f, 0.029639f, 0.502302f, 0.864184f, 1.039894f, 0.343193f, - -0.860698f, 0.251151f, -0.442858f, 0.000000f, -0.860698f, 0.251151f, -0.442858f, 0.438926f, 0.305137f, - -0.812729f, 0.502301f, -0.295238f, 0.000000f, -0.812729f, 0.502301f, -0.295238f, 0.093723f, 0.349056f, - -0.723607f, 0.447220f, -0.525725f, 0.000000f, -0.723607f, 0.447220f, -0.525725f, 0.952607f, 0.099770f, - -0.951058f, 0.000000f, -0.309013f, 0.000000f, -0.951058f, 0.000000f, -0.309013f, 0.433048f, 0.129063f, - -0.947213f, 0.276396f, -0.162458f, 0.000000f, -0.947213f, 0.276396f, -0.162458f, 0.202477f, 0.673755f, - -0.860698f, 0.251151f, -0.442858f, 0.000000f, -0.860698f, 0.251151f, -0.442858f, 0.438926f, 0.305137f, - -0.956626f, -0.251149f, -0.147618f, 0.000000f, -0.956626f, -0.251149f, -0.147618f, 0.304489f, 0.071876f, - -1.000000f, 0.000001f, 0.000000f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 0.912676f, 0.606305f, - -0.951058f, 0.000000f, -0.309013f, 0.000000f, -0.951058f, 0.000000f, -0.309013f, 0.433048f, 0.129063f, - -0.860698f, 0.251151f, -0.442858f, 0.000000f, -0.860698f, 0.251151f, -0.442858f, 0.438926f, 0.305137f, - -0.947213f, 0.276396f, -0.162458f, 0.000000f, -0.947213f, 0.276396f, -0.162458f, 0.202477f, 0.673755f, - -0.812729f, 0.502301f, -0.295238f, 0.000000f, -0.812729f, 0.502301f, -0.295238f, 0.093723f, 0.349056f, - -0.947213f, 0.276396f, -0.162458f, 0.000000f, -0.947213f, 0.276396f, -0.162458f, 0.202477f, 0.673755f, - -0.850648f, 0.525736f, -0.000000f, 0.000000f, -0.850648f, 0.525736f, -0.000000f, 0.039894f, 0.343193f, - -0.812729f, 0.502301f, -0.295238f, 0.000000f, -0.812729f, 0.502301f, -0.295238f, 0.093723f, 0.349056f, - -0.951058f, 0.000000f, -0.309013f, 0.000000f, -0.951058f, 0.000000f, -0.309013f, 0.433048f, 0.129063f, - -1.000000f, 0.000001f, 0.000000f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 0.912676f, 0.606305f, - -0.947213f, 0.276396f, -0.162458f, 0.000000f, -0.947213f, 0.276396f, -0.162458f, 0.202477f, 0.673755f, - -1.000000f, 0.000001f, 0.000000f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 0.912676f, 0.606305f, - -0.947213f, 0.276397f, 0.162458f, 0.000000f, -0.947213f, 0.276397f, 0.162458f, 0.941248f, 0.518705f, - -0.947213f, 0.276396f, -0.162458f, 0.000000f, -0.947213f, 0.276396f, -0.162458f, 0.202477f, 0.673755f, - -0.947213f, 0.276396f, -0.162458f, 0.000000f, -0.947213f, 0.276396f, -0.162458f, 0.202477f, 0.673755f, - -0.947213f, 0.276397f, 0.162458f, 0.000000f, -0.947213f, 0.276397f, 0.162458f, 0.941248f, 0.518705f, - -0.850648f, 0.525736f, -0.000000f, 0.000000f, -0.850648f, 0.525736f, -0.000000f, 0.039894f, 0.343193f, - -0.947213f, 0.276397f, 0.162458f, 0.000000f, -0.947213f, 0.276397f, 0.162458f, 0.941248f, 0.518705f, - -0.812729f, 0.502301f, 0.295238f, 0.000000f, -0.812729f, 0.502301f, 0.295238f, 0.003325f, 0.262529f, - -0.850648f, 0.525736f, -0.000000f, 0.000000f, -0.850648f, 0.525736f, -0.000000f, 0.039894f, 0.343193f, - -0.956626f, -0.251149f, -0.147618f, 0.000000f, -0.956626f, -0.251149f, -0.147618f, 0.304489f, 0.071876f, - -0.956626f, -0.251149f, 0.147618f, 0.000000f, -0.956626f, -0.251149f, 0.147618f, 0.397050f, 0.226232f, - -1.000000f, 0.000001f, 0.000000f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 0.912676f, 0.606305f, - -0.956626f, -0.251149f, 0.147618f, 0.000000f, -0.956626f, -0.251149f, 0.147618f, 0.397050f, 0.226232f, - -0.951058f, -0.000000f, 0.309013f, 0.000000f, -0.951058f, -0.000000f, 0.309013f, 0.326823f, 0.166086f, - -1.000000f, 0.000001f, 0.000000f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 0.912676f, 0.606305f, - -1.000000f, 0.000001f, 0.000000f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 0.912676f, 0.606305f, - -0.951058f, -0.000000f, 0.309013f, 0.000000f, -0.951058f, -0.000000f, 0.309013f, 0.326823f, 0.166086f, - -0.947213f, 0.276397f, 0.162458f, 0.000000f, -0.947213f, 0.276397f, 0.162458f, 0.941248f, 0.518705f, - -0.951058f, -0.000000f, 0.309013f, 0.000000f, -0.951058f, -0.000000f, 0.309013f, 0.326823f, 0.166086f, - -0.860698f, 0.251151f, 0.442858f, 0.000000f, -0.860698f, 0.251151f, 0.442858f, 0.333640f, 0.261125f, - -0.947213f, 0.276397f, 0.162458f, 0.000000f, -0.947213f, 0.276397f, 0.162458f, 0.941248f, 0.518705f, - -0.947213f, 0.276397f, 0.162458f, 0.000000f, -0.947213f, 0.276397f, 0.162458f, 0.941248f, 0.518705f, - -0.860698f, 0.251151f, 0.442858f, 0.000000f, -0.860698f, 0.251151f, 0.442858f, 0.333640f, 0.261125f, - -0.812729f, 0.502301f, 0.295238f, 0.000000f, -0.812729f, 0.502301f, 0.295238f, 0.003325f, 0.262529f, - -0.860698f, 0.251151f, 0.442858f, 0.000000f, -0.860698f, 0.251151f, 0.442858f, 0.333640f, 0.261125f, - -0.723607f, 0.447220f, 0.525725f, 0.000000f, -0.723607f, 0.447220f, 0.525725f, 1.115709f, 0.094716f, - -0.812729f, 0.502301f, 0.295238f, 0.000000f, -0.812729f, 0.502301f, 0.295238f, 0.003325f, 0.262529f, - 0.155215f, 0.251152f, -0.955422f, 0.000000f, 0.155215f, 0.251152f, -0.955422f, 0.115709f, 0.094716f, - 0.029639f, 0.502302f, -0.864184f, 0.000000f, 0.029639f, 0.502302f, -0.864184f, 0.791278f, 0.505149f, - 0.276388f, 0.447220f, -0.850649f, 0.000000f, 0.276388f, 0.447220f, -0.850649f, 0.768276f, 0.421330f, - 0.000000f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, -1.000000f, 0.193762f, 0.248844f, - -0.138199f, 0.276397f, -0.951055f, 0.000000f, -0.138199f, 0.276397f, -0.951055f, 0.938926f, 0.694863f, - 0.155215f, 0.251152f, -0.955422f, 0.000000f, 0.155215f, 0.251152f, -0.955422f, 0.115709f, 0.094716f, - -0.155215f, -0.251152f, -0.955422f, 0.000000f, -0.155215f, -0.251152f, -0.955422f, 0.129692f, 0.189429f, - -0.309016f, -0.000000f, -0.951057f, 0.000000f, -0.309016f, -0.000000f, -0.951057f, 0.967747f, 0.608792f, - 0.000000f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, -1.000000f, 0.193762f, 0.248844f, - 0.155215f, 0.251152f, -0.955422f, 0.000000f, 0.155215f, 0.251152f, -0.955422f, 0.115709f, 0.094716f, - -0.138199f, 0.276397f, -0.951055f, 0.000000f, -0.138199f, 0.276397f, -0.951055f, 0.938926f, 0.694863f, - 0.029639f, 0.502302f, -0.864184f, 0.000000f, 0.029639f, 0.502302f, -0.864184f, 0.791278f, 0.505149f, - -0.138199f, 0.276397f, -0.951055f, 0.000000f, -0.138199f, 0.276397f, -0.951055f, 0.938926f, 0.694863f, - -0.262869f, 0.525738f, -0.809012f, 0.000000f, -0.262869f, 0.525738f, -0.809012f, 0.863599f, 0.594041f, - 0.029639f, 0.502302f, -0.864184f, 0.000000f, 0.029639f, 0.502302f, -0.864184f, 0.791278f, 0.505149f, - 0.000000f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, -1.000000f, 0.193762f, 0.248844f, - -0.309016f, -0.000000f, -0.951057f, 0.000000f, -0.309016f, -0.000000f, -0.951057f, 0.967747f, 0.608792f, - -0.138199f, 0.276397f, -0.951055f, 0.000000f, -0.138199f, 0.276397f, -0.951055f, 0.938926f, 0.694863f, - -0.309016f, -0.000000f, -0.951057f, 0.000000f, -0.309016f, -0.000000f, -0.951057f, 0.967747f, 0.608792f, - -0.447215f, 0.276397f, -0.850649f, 0.000000f, -0.447215f, 0.276397f, -0.850649f, 0.996685f, 0.687562f, - -0.138199f, 0.276397f, -0.951055f, 0.000000f, -0.138199f, 0.276397f, -0.951055f, 0.938926f, 0.694863f, - -0.138199f, 0.276397f, -0.951055f, 0.000000f, -0.138199f, 0.276397f, -0.951055f, 0.938926f, 0.694863f, - -0.447215f, 0.276397f, -0.850649f, 0.000000f, -0.447215f, 0.276397f, -0.850649f, 0.996685f, 0.687562f, - -0.262869f, 0.525738f, -0.809012f, 0.000000f, -0.262869f, 0.525738f, -0.809012f, 0.863599f, 0.594041f, - -0.447215f, 0.276397f, -0.850649f, 0.000000f, -0.447215f, 0.276397f, -0.850649f, 0.996685f, 0.687562f, - -0.531941f, 0.502302f, -0.681712f, 0.000000f, -0.531941f, 0.502302f, -0.681712f, 0.814480f, 0.588860f, - -0.262869f, 0.525738f, -0.809012f, 0.000000f, -0.262869f, 0.525738f, -0.809012f, 0.863599f, 0.594041f, - -0.155215f, -0.251152f, -0.955422f, 0.000000f, -0.155215f, -0.251152f, -0.955422f, 0.129692f, 0.189429f, - -0.436007f, -0.251152f, -0.864188f, 0.000000f, -0.436007f, -0.251152f, -0.864188f, 0.134945f, 0.284572f, - -0.309016f, -0.000000f, -0.951057f, 0.000000f, -0.309016f, -0.000000f, -0.951057f, 0.967747f, 0.608792f, - -0.436007f, -0.251152f, -0.864188f, 0.000000f, -0.436007f, -0.251152f, -0.864188f, 0.134945f, 0.284572f, - -0.587786f, -0.000000f, -0.809017f, 0.000000f, -0.587786f, -0.000000f, -0.809017f, 0.496685f, 0.312438f, - -0.309016f, -0.000000f, -0.951057f, 0.000000f, -0.309016f, -0.000000f, -0.951057f, 0.967747f, 0.608792f, - -0.309016f, -0.000000f, -0.951057f, 0.000000f, -0.309016f, -0.000000f, -0.951057f, 0.967747f, 0.608792f, - -0.587786f, -0.000000f, -0.809017f, 0.000000f, -0.587786f, -0.000000f, -0.809017f, 0.496685f, 0.312438f, - -0.447215f, 0.276397f, -0.850649f, 0.000000f, -0.447215f, 0.276397f, -0.850649f, 0.996685f, 0.687562f, - -0.587786f, -0.000000f, -0.809017f, 0.000000f, -0.587786f, -0.000000f, -0.809017f, 0.496685f, 0.312438f, - -0.687159f, 0.251152f, -0.681715f, 0.000000f, -0.687159f, 0.251152f, -0.681715f, 0.477658f, 0.222612f, - -0.447215f, 0.276397f, -0.850649f, 0.000000f, -0.447215f, 0.276397f, -0.850649f, 0.996685f, 0.687562f, - -0.447215f, 0.276397f, -0.850649f, 0.000000f, -0.447215f, 0.276397f, -0.850649f, 0.996685f, 0.687562f, - -0.687159f, 0.251152f, -0.681715f, 0.000000f, -0.687159f, 0.251152f, -0.681715f, 0.477658f, 0.222612f, - -0.531941f, 0.502302f, -0.681712f, 0.000000f, -0.531941f, 0.502302f, -0.681712f, 0.814480f, 0.588860f, - -0.687159f, 0.251152f, -0.681715f, 0.000000f, -0.687159f, 0.251152f, -0.681715f, 0.477658f, 0.222612f, - -0.723607f, 0.447220f, -0.525725f, 0.000000f, -0.723607f, 0.447220f, -0.525725f, 0.952607f, 0.099770f, - -0.531941f, 0.502302f, -0.681712f, 0.000000f, -0.531941f, 0.502302f, -0.681712f, 0.814480f, 0.588860f, - 0.956626f, 0.251149f, -0.147618f, 0.000000f, 0.956626f, 0.251149f, -0.147618f, 0.610420f, 0.226784f, - 0.831051f, 0.502299f, -0.238853f, 0.000000f, 0.831051f, 0.502299f, -0.238853f, 0.891200f, 0.515555f, - 0.894426f, 0.447216f, 0.000000f, 0.000000f, 0.894426f, 0.447216f, 0.000000f, 0.542767f, 0.333057f, - 0.951058f, 0.000000f, -0.309013f, 0.000000f, 0.951058f, 0.000000f, -0.309013f, 0.546072f, 0.156902f, - 0.861804f, 0.276396f, -0.425322f, 0.000000f, 0.861804f, 0.276396f, -0.425322f, 1.042767f, 0.666943f, - 0.956626f, 0.251149f, -0.147618f, 0.000000f, 0.956626f, 0.251149f, -0.147618f, 0.610420f, 0.226784f, - 0.860698f, -0.251151f, -0.442858f, 0.000000f, 0.860698f, -0.251151f, -0.442858f, 0.543816f, 0.252266f, - 0.809019f, 0.000000f, -0.587782f, 0.000000f, 0.809019f, 0.000000f, -0.587782f, 0.615709f, 0.905284f, - 0.951058f, 0.000000f, -0.309013f, 0.000000f, 0.951058f, 0.000000f, -0.309013f, 0.546072f, 0.156902f, - 0.956626f, 0.251149f, -0.147618f, 0.000000f, 0.956626f, 0.251149f, -0.147618f, 0.610420f, 0.226784f, - 0.861804f, 0.276396f, -0.425322f, 0.000000f, 0.861804f, 0.276396f, -0.425322f, 1.042767f, 0.666943f, - 0.831051f, 0.502299f, -0.238853f, 0.000000f, 0.831051f, 0.502299f, -0.238853f, 0.891200f, 0.515555f, - 0.861804f, 0.276396f, -0.425322f, 0.000000f, 0.861804f, 0.276396f, -0.425322f, 1.042767f, 0.666943f, - 0.688189f, 0.525736f, -0.499997f, 0.000000f, 0.688189f, 0.525736f, -0.499997f, 0.816839f, 0.418893f, - 0.831051f, 0.502299f, -0.238853f, 0.000000f, 0.831051f, 0.502299f, -0.238853f, 0.891200f, 0.515555f, - 0.951058f, 0.000000f, -0.309013f, 0.000000f, 0.951058f, 0.000000f, -0.309013f, 0.546072f, 0.156902f, - 0.809019f, 0.000000f, -0.587782f, 0.000000f, 0.809019f, 0.000000f, -0.587782f, 0.615709f, 0.905284f, - 0.861804f, 0.276396f, -0.425322f, 0.000000f, 0.861804f, 0.276396f, -0.425322f, 1.042767f, 0.666943f, - 0.809019f, 0.000000f, -0.587782f, 0.000000f, 0.809019f, 0.000000f, -0.587782f, 0.615709f, 0.905284f, - 0.670821f, 0.276397f, -0.688189f, 0.000000f, 0.670821f, 0.276397f, -0.688189f, 0.804489f, 0.928124f, - 0.861804f, 0.276396f, -0.425322f, 0.000000f, 0.861804f, 0.276396f, -0.425322f, 1.042767f, 0.666943f, - 0.861804f, 0.276396f, -0.425322f, 0.000000f, 0.861804f, 0.276396f, -0.425322f, 1.042767f, 0.666943f, - 0.670821f, 0.276397f, -0.688189f, 0.000000f, 0.670821f, 0.276397f, -0.688189f, 0.804489f, 0.928124f, - 0.688189f, 0.525736f, -0.499997f, 0.000000f, 0.688189f, 0.525736f, -0.499997f, 0.816839f, 0.418893f, - 0.670821f, 0.276397f, -0.688189f, 0.000000f, 0.670821f, 0.276397f, -0.688189f, 0.804489f, 0.928124f, - 0.483971f, 0.502302f, -0.716565f, 0.000000f, 0.483971f, 0.502302f, -0.716565f, 0.841211f, 0.510884f, - 0.688189f, 0.525736f, -0.499997f, 0.000000f, 0.688189f, 0.525736f, -0.499997f, 0.816839f, 0.418893f, - 0.860698f, -0.251151f, -0.442858f, 0.000000f, 0.860698f, -0.251151f, -0.442858f, 0.543816f, 0.252266f, - 0.687159f, -0.251152f, -0.681715f, 0.000000f, 0.687159f, -0.251152f, -0.681715f, 0.268675f, 0.239476f, - 0.809019f, 0.000000f, -0.587782f, 0.000000f, 0.809019f, 0.000000f, -0.587782f, 0.615709f, 0.905284f, - 0.687159f, -0.251152f, -0.681715f, 0.000000f, 0.687159f, -0.251152f, -0.681715f, 0.268675f, 0.239476f, - 0.587786f, -0.000000f, -0.809017f, 0.000000f, 0.587786f, -0.000000f, -0.809017f, 0.235205f, 0.325266f, - 0.809019f, 0.000000f, -0.587782f, 0.000000f, 0.809019f, 0.000000f, -0.587782f, 0.615709f, 0.905284f, - 0.809019f, 0.000000f, -0.587782f, 0.000000f, 0.809019f, 0.000000f, -0.587782f, 0.615709f, 0.905284f, - 0.587786f, -0.000000f, -0.809017f, 0.000000f, 0.587786f, -0.000000f, -0.809017f, 0.235205f, 0.325266f, - 0.670821f, 0.276397f, -0.688189f, 0.000000f, 0.670821f, 0.276397f, -0.688189f, 0.804489f, 0.928124f, - 0.587786f, -0.000000f, -0.809017f, 0.000000f, 0.587786f, -0.000000f, -0.809017f, 0.235205f, 0.325266f, - 0.436007f, 0.251152f, -0.864188f, 0.000000f, 0.436007f, 0.251152f, -0.864188f, 0.221600f, 0.149916f, - 0.670821f, 0.276397f, -0.688189f, 0.000000f, 0.670821f, 0.276397f, -0.688189f, 0.804489f, 0.928124f, - 0.670821f, 0.276397f, -0.688189f, 0.000000f, 0.670821f, 0.276397f, -0.688189f, 0.804489f, 0.928124f, - 0.436007f, 0.251152f, -0.864188f, 0.000000f, 0.436007f, 0.251152f, -0.864188f, 0.221600f, 0.149916f, - 0.483971f, 0.502302f, -0.716565f, 0.000000f, 0.483971f, 0.502302f, -0.716565f, 0.841211f, 0.510884f, - 0.436007f, 0.251152f, -0.864188f, 0.000000f, 0.436007f, 0.251152f, -0.864188f, 0.221600f, 0.149916f, - 0.276388f, 0.447220f, -0.850649f, 0.000000f, 0.276388f, 0.447220f, -0.850649f, 0.768276f, 0.421330f, - 0.483971f, 0.502302f, -0.716565f, 0.000000f, 0.483971f, 0.502302f, -0.716565f, 0.841211f, 0.510884f, - 0.077607f, 0.967950f, 0.238853f, 0.000000f, 0.077607f, 0.967950f, 0.238853f, 0.591499f, 0.483164f, - 0.251147f, 0.967949f, 0.000000f, 0.000000f, 0.251147f, 0.967949f, 0.000000f, 0.663633f, 0.570564f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.589135f, 0.315387f, - 0.162456f, 0.850654f, 0.499995f, 0.000000f, 0.162456f, 0.850654f, 0.499995f, 0.641510f, 0.487355f, - 0.361800f, 0.894429f, 0.262863f, 0.000000f, 0.361800f, 0.894429f, 0.262863f, 0.499999f, 0.979947f, - 0.077607f, 0.967950f, 0.238853f, 0.000000f, 0.077607f, 0.967950f, 0.238853f, 0.591499f, 0.483164f, - 0.232822f, 0.657519f, 0.716563f, 0.000000f, 0.232822f, 0.657519f, 0.716563f, 0.616405f, 0.395845f, - 0.447209f, 0.723612f, 0.525728f, 0.000000f, 0.447209f, 0.723612f, 0.525728f, 0.629692f, 0.810571f, - 0.162456f, 0.850654f, 0.499995f, 0.000000f, 0.162456f, 0.850654f, 0.499995f, 0.641510f, 0.487355f, - 0.077607f, 0.967950f, 0.238853f, 0.000000f, 0.077607f, 0.967950f, 0.238853f, 0.591499f, 0.483164f, - 0.361800f, 0.894429f, 0.262863f, 0.000000f, 0.361800f, 0.894429f, 0.262863f, 0.499999f, 0.979947f, - 0.251147f, 0.967949f, 0.000000f, 0.000000f, 0.251147f, 0.967949f, 0.000000f, 0.663633f, 0.570564f, - 0.361800f, 0.894429f, 0.262863f, 0.000000f, 0.361800f, 0.894429f, 0.262863f, 0.499999f, 0.979947f, - 0.525730f, 0.850652f, 0.000000f, 0.000000f, 0.525730f, 0.850652f, 0.000000f, 0.615418f, 0.565866f, - 0.251147f, 0.967949f, 0.000000f, 0.000000f, 0.251147f, 0.967949f, 0.000000f, 0.663633f, 0.570564f, - 0.162456f, 0.850654f, 0.499995f, 0.000000f, 0.162456f, 0.850654f, 0.499995f, 0.641510f, 0.487355f, - 0.447209f, 0.723612f, 0.525728f, 0.000000f, 0.447209f, 0.723612f, 0.525728f, 0.629692f, 0.810571f, - 0.361800f, 0.894429f, 0.262863f, 0.000000f, 0.361800f, 0.894429f, 0.262863f, 0.499999f, 0.979947f, - 0.447209f, 0.723612f, 0.525728f, 0.000000f, 0.447209f, 0.723612f, 0.525728f, 0.629692f, 0.810571f, - 0.638194f, 0.723610f, 0.262864f, 0.000000f, 0.638194f, 0.723610f, 0.262864f, 0.721600f, 0.850084f, - 0.361800f, 0.894429f, 0.262863f, 0.000000f, 0.361800f, 0.894429f, 0.262863f, 0.499999f, 0.979947f, - 0.361800f, 0.894429f, 0.262863f, 0.000000f, 0.361800f, 0.894429f, 0.262863f, 0.499999f, 0.979947f, - 0.638194f, 0.723610f, 0.262864f, 0.000000f, 0.638194f, 0.723610f, 0.262864f, 0.721600f, 0.850084f, - 0.525730f, 0.850652f, 0.000000f, 0.000000f, 0.525730f, 0.850652f, 0.000000f, 0.615418f, 0.565866f, - 0.638194f, 0.723610f, 0.262864f, 0.000000f, 0.638194f, 0.723610f, 0.262864f, 0.721600f, 0.850084f, - 0.753442f, 0.657515f, 0.000000f, 0.000000f, 0.753442f, 0.657515f, 0.000000f, 0.870330f, 0.424531f, - 0.525730f, 0.850652f, 0.000000f, 0.000000f, 0.525730f, 0.850652f, 0.000000f, 0.615418f, 0.565866f, - 0.232822f, 0.657519f, 0.716563f, 0.000000f, 0.232822f, 0.657519f, 0.716563f, 0.616405f, 0.395845f, - 0.483971f, 0.502302f, 0.716565f, 0.000000f, 0.483971f, 0.502302f, 0.716565f, 1.036828f, 0.167036f, - 0.447209f, 0.723612f, 0.525728f, 0.000000f, 0.447209f, 0.723612f, 0.525728f, 0.629692f, 0.810571f, - 0.483971f, 0.502302f, 0.716565f, 0.000000f, 0.483971f, 0.502302f, 0.716565f, 1.036828f, 0.167036f, - 0.688189f, 0.525736f, 0.499997f, 0.000000f, 0.688189f, 0.525736f, 0.499997f, 1.003325f, 0.262529f, - 0.447209f, 0.723612f, 0.525728f, 0.000000f, 0.447209f, 0.723612f, 0.525728f, 0.629692f, 0.810571f, - 0.447209f, 0.723612f, 0.525728f, 0.000000f, 0.447209f, 0.723612f, 0.525728f, 0.629692f, 0.810571f, - 0.688189f, 0.525736f, 0.499997f, 0.000000f, 0.688189f, 0.525736f, 0.499997f, 1.003325f, 0.262529f, - 0.638194f, 0.723610f, 0.262864f, 0.000000f, 0.638194f, 0.723610f, 0.262864f, 0.721600f, 0.850084f, - 0.688189f, 0.525736f, 0.499997f, 0.000000f, 0.688189f, 0.525736f, 0.499997f, 1.003325f, 0.262529f, - 0.831051f, 0.502299f, 0.238853f, 0.000000f, 0.831051f, 0.502299f, 0.238853f, 0.291096f, 0.327017f, - 0.638194f, 0.723610f, 0.262864f, 0.000000f, 0.638194f, 0.723610f, 0.262864f, 0.721600f, 0.850084f, - 0.638194f, 0.723610f, 0.262864f, 0.000000f, 0.638194f, 0.723610f, 0.262864f, 0.721600f, 0.850084f, - 0.831051f, 0.502299f, 0.238853f, 0.000000f, 0.831051f, 0.502299f, 0.238853f, 0.291096f, 0.327017f, - 0.753442f, 0.657515f, 0.000000f, 0.000000f, 0.753442f, 0.657515f, 0.000000f, 0.870330f, 0.424531f, - 0.831051f, 0.502299f, 0.238853f, 0.000000f, 0.831051f, 0.502299f, 0.238853f, 0.291096f, 0.327017f, - 0.894426f, 0.447216f, 0.000000f, 0.000000f, 0.894426f, 0.447216f, 0.000000f, 0.542767f, 0.333057f, - 0.753442f, 0.657515f, 0.000000f, 0.000000f, 0.753442f, 0.657515f, 0.000000f, 0.870330f, 0.424531f, - -0.203181f, 0.967950f, 0.147618f, 0.000000f, -0.203181f, 0.967950f, 0.147618f, 0.691461f, 0.492781f, - 0.077607f, 0.967950f, 0.238853f, 0.000000f, 0.077607f, 0.967950f, 0.238853f, 0.591499f, 0.483164f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.589135f, 0.315387f, - -0.425323f, 0.850654f, 0.309011f, 0.000000f, -0.425323f, 0.850654f, 0.309011f, 0.671061f, 0.401166f, - -0.138197f, 0.894430f, 0.425320f, 0.000000f, -0.138197f, 0.894430f, 0.425320f, 0.693762f, 0.751156f, - -0.203181f, 0.967950f, 0.147618f, 0.000000f, -0.203181f, 0.967950f, 0.147618f, 0.691461f, 0.492781f, - -0.609547f, 0.657519f, 0.442856f, 0.000000f, -0.609547f, 0.657519f, 0.442856f, 0.418131f, 0.563385f, - -0.361804f, 0.723612f, 0.587778f, 0.000000f, -0.361804f, 0.723612f, 0.587778f, 0.826823f, 0.833914f, - -0.425323f, 0.850654f, 0.309011f, 0.000000f, -0.425323f, 0.850654f, 0.309011f, 0.671061f, 0.401166f, - -0.203181f, 0.967950f, 0.147618f, 0.000000f, -0.203181f, 0.967950f, 0.147618f, 0.691461f, 0.492781f, - -0.138197f, 0.894430f, 0.425320f, 0.000000f, -0.138197f, 0.894430f, 0.425320f, 0.693762f, 0.751156f, - 0.077607f, 0.967950f, 0.238853f, 0.000000f, 0.077607f, 0.967950f, 0.238853f, 0.591499f, 0.483164f, - -0.138197f, 0.894430f, 0.425320f, 0.000000f, -0.138197f, 0.894430f, 0.425320f, 0.693762f, 0.751156f, - 0.162456f, 0.850654f, 0.499995f, 0.000000f, 0.162456f, 0.850654f, 0.499995f, 0.641510f, 0.487355f, - 0.077607f, 0.967950f, 0.238853f, 0.000000f, 0.077607f, 0.967950f, 0.238853f, 0.591499f, 0.483164f, - -0.425323f, 0.850654f, 0.309011f, 0.000000f, -0.425323f, 0.850654f, 0.309011f, 0.671061f, 0.401166f, - -0.361804f, 0.723612f, 0.587778f, 0.000000f, -0.361804f, 0.723612f, 0.587778f, 0.826823f, 0.833914f, - -0.138197f, 0.894430f, 0.425320f, 0.000000f, -0.138197f, 0.894430f, 0.425320f, 0.693762f, 0.751156f, - -0.361804f, 0.723612f, 0.587778f, 0.000000f, -0.361804f, 0.723612f, 0.587778f, 0.826823f, 0.833914f, - -0.052790f, 0.723612f, 0.688185f, 0.000000f, -0.052790f, 0.723612f, 0.688185f, 0.768674f, 0.760524f, - -0.138197f, 0.894430f, 0.425320f, 0.000000f, -0.138197f, 0.894430f, 0.425320f, 0.693762f, 0.751156f, - -0.138197f, 0.894430f, 0.425320f, 0.000000f, -0.138197f, 0.894430f, 0.425320f, 0.693762f, 0.751156f, - -0.052790f, 0.723612f, 0.688185f, 0.000000f, -0.052790f, 0.723612f, 0.688185f, 0.768674f, 0.760524f, - 0.162456f, 0.850654f, 0.499995f, 0.000000f, 0.162456f, 0.850654f, 0.499995f, 0.641510f, 0.487355f, - -0.052790f, 0.723612f, 0.688185f, 0.000000f, -0.052790f, 0.723612f, 0.688185f, 0.768674f, 0.760524f, - 0.232822f, 0.657519f, 0.716563f, 0.000000f, 0.232822f, 0.657519f, 0.716563f, 0.616405f, 0.395845f, - 0.162456f, 0.850654f, 0.499995f, 0.000000f, 0.162456f, 0.850654f, 0.499995f, 0.641510f, 0.487355f, - -0.609547f, 0.657519f, 0.442856f, 0.000000f, -0.609547f, 0.657519f, 0.442856f, 0.418131f, 0.563385f, - -0.531941f, 0.502302f, 0.681712f, 0.000000f, -0.531941f, 0.502302f, 0.681712f, 0.074553f, 0.260244f, - -0.361804f, 0.723612f, 0.587778f, 0.000000f, -0.361804f, 0.723612f, 0.587778f, 0.826823f, 0.833914f, - -0.531941f, 0.502302f, 0.681712f, 0.000000f, -0.531941f, 0.502302f, 0.681712f, 0.074553f, 0.260244f, - -0.262869f, 0.525738f, 0.809012f, 0.000000f, -0.262869f, 0.525738f, 0.809012f, 0.036828f, 0.167036f, - -0.361804f, 0.723612f, 0.587778f, 0.000000f, -0.361804f, 0.723612f, 0.587778f, 0.826823f, 0.833914f, - -0.361804f, 0.723612f, 0.587778f, 0.000000f, -0.361804f, 0.723612f, 0.587778f, 0.826823f, 0.833914f, - -0.262869f, 0.525738f, 0.809012f, 0.000000f, -0.262869f, 0.525738f, 0.809012f, 0.036828f, 0.167036f, - -0.052790f, 0.723612f, 0.688185f, 0.000000f, -0.052790f, 0.723612f, 0.688185f, 0.768674f, 0.760524f, - -0.262869f, 0.525738f, 0.809012f, 0.000000f, -0.262869f, 0.525738f, 0.809012f, 0.036828f, 0.167036f, - 0.029639f, 0.502302f, 0.864184f, 0.000000f, 0.029639f, 0.502302f, 0.864184f, 1.039894f, 0.343193f, - -0.052790f, 0.723612f, 0.688185f, 0.000000f, -0.052790f, 0.723612f, 0.688185f, 0.768674f, 0.760524f, - -0.052790f, 0.723612f, 0.688185f, 0.000000f, -0.052790f, 0.723612f, 0.688185f, 0.768674f, 0.760524f, - 0.029639f, 0.502302f, 0.864184f, 0.000000f, 0.029639f, 0.502302f, 0.864184f, 1.039894f, 0.343193f, - 0.232822f, 0.657519f, 0.716563f, 0.000000f, 0.232822f, 0.657519f, 0.716563f, 0.616405f, 0.395845f, - 0.029639f, 0.502302f, 0.864184f, 0.000000f, 0.029639f, 0.502302f, 0.864184f, 1.039894f, 0.343193f, - 0.276388f, 0.447220f, 0.850649f, 0.000000f, 0.276388f, 0.447220f, 0.850649f, 1.304489f, 0.071876f, - 0.232822f, 0.657519f, 0.716563f, 0.000000f, 0.232822f, 0.657519f, 0.716563f, 0.616405f, 0.395845f, - -0.203181f, 0.967950f, -0.147618f, 0.000000f, -0.203181f, 0.967950f, -0.147618f, 0.466205f, 0.561213f, - -0.203181f, 0.967950f, 0.147618f, 0.000000f, -0.203181f, 0.967950f, 0.147618f, 0.691461f, 0.492781f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.589135f, 0.315387f, - -0.425323f, 0.850654f, -0.309011f, 0.000000f, -0.425323f, 0.850654f, -0.309011f, 0.391200f, 0.484445f, - -0.447210f, 0.894429f, 0.000000f, 0.000000f, -0.447210f, 0.894429f, 0.000000f, 0.452607f, 0.900230f, - -0.203181f, 0.967950f, -0.147618f, 0.000000f, -0.203181f, 0.967950f, -0.147618f, 0.466205f, 0.561213f, - -0.609547f, 0.657519f, -0.442856f, 0.000000f, -0.609547f, 0.657519f, -0.442856f, 0.441249f, 0.481295f, - -0.670817f, 0.723611f, -0.162457f, 0.000000f, -0.670817f, 0.723611f, -0.162457f, 0.446597f, 0.804967f, - -0.425323f, 0.850654f, -0.309011f, 0.000000f, -0.425323f, 0.850654f, -0.309011f, 0.391200f, 0.484445f, - -0.203181f, 0.967950f, -0.147618f, 0.000000f, -0.203181f, 0.967950f, -0.147618f, 0.466205f, 0.561213f, - -0.447210f, 0.894429f, 0.000000f, 0.000000f, -0.447210f, 0.894429f, 0.000000f, 0.452607f, 0.900230f, - -0.203181f, 0.967950f, 0.147618f, 0.000000f, -0.203181f, 0.967950f, 0.147618f, 0.691461f, 0.492781f, - -0.447210f, 0.894429f, 0.000000f, 0.000000f, -0.447210f, 0.894429f, 0.000000f, 0.452607f, 0.900230f, - -0.425323f, 0.850654f, 0.309011f, 0.000000f, -0.425323f, 0.850654f, 0.309011f, 0.671061f, 0.401166f, - -0.203181f, 0.967950f, 0.147618f, 0.000000f, -0.203181f, 0.967950f, 0.147618f, 0.691461f, 0.492781f, - -0.425323f, 0.850654f, -0.309011f, 0.000000f, -0.425323f, 0.850654f, -0.309011f, 0.391200f, 0.484445f, - -0.670817f, 0.723611f, -0.162457f, 0.000000f, -0.670817f, 0.723611f, -0.162457f, 0.446597f, 0.804967f, - -0.447210f, 0.894429f, 0.000000f, 0.000000f, -0.447210f, 0.894429f, 0.000000f, 0.452607f, 0.900230f, - -0.670817f, 0.723611f, -0.162457f, 0.000000f, -0.670817f, 0.723611f, -0.162457f, 0.446597f, 0.804967f, - -0.670817f, 0.723611f, 0.162457f, 0.000000f, -0.670817f, 0.723611f, 0.162457f, 0.536828f, 0.832965f, - -0.447210f, 0.894429f, 0.000000f, 0.000000f, -0.447210f, 0.894429f, 0.000000f, 0.452607f, 0.900230f, - -0.447210f, 0.894429f, 0.000000f, 0.000000f, -0.447210f, 0.894429f, 0.000000f, 0.452607f, 0.900230f, - -0.670817f, 0.723611f, 0.162457f, 0.000000f, -0.670817f, 0.723611f, 0.162457f, 0.536828f, 0.832965f, - -0.425323f, 0.850654f, 0.309011f, 0.000000f, -0.425323f, 0.850654f, 0.309011f, 0.671061f, 0.401166f, - -0.670817f, 0.723611f, 0.162457f, 0.000000f, -0.670817f, 0.723611f, 0.162457f, 0.536828f, 0.832965f, - -0.609547f, 0.657519f, 0.442856f, 0.000000f, -0.609547f, 0.657519f, 0.442856f, 0.418131f, 0.563385f, - -0.425323f, 0.850654f, 0.309011f, 0.000000f, -0.425323f, 0.850654f, 0.309011f, 0.671061f, 0.401166f, - -0.609547f, 0.657519f, -0.442856f, 0.000000f, -0.609547f, 0.657519f, -0.442856f, 0.441249f, 0.481295f, - -0.812729f, 0.502301f, -0.295238f, 0.000000f, -0.812729f, 0.502301f, -0.295238f, 0.093723f, 0.349056f, - -0.670817f, 0.723611f, -0.162457f, 0.000000f, -0.670817f, 0.723611f, -0.162457f, 0.446597f, 0.804967f, - -0.812729f, 0.502301f, -0.295238f, 0.000000f, -0.812729f, 0.502301f, -0.295238f, 0.093723f, 0.349056f, - -0.850648f, 0.525736f, -0.000000f, 0.000000f, -0.850648f, 0.525736f, -0.000000f, 0.039894f, 0.343193f, - -0.670817f, 0.723611f, -0.162457f, 0.000000f, -0.670817f, 0.723611f, -0.162457f, 0.446597f, 0.804967f, - -0.670817f, 0.723611f, -0.162457f, 0.000000f, -0.670817f, 0.723611f, -0.162457f, 0.446597f, 0.804967f, - -0.850648f, 0.525736f, -0.000000f, 0.000000f, -0.850648f, 0.525736f, -0.000000f, 0.039894f, 0.343193f, - -0.670817f, 0.723611f, 0.162457f, 0.000000f, -0.670817f, 0.723611f, 0.162457f, 0.536828f, 0.832965f, - -0.850648f, 0.525736f, -0.000000f, 0.000000f, -0.850648f, 0.525736f, -0.000000f, 0.039894f, 0.343193f, - -0.812729f, 0.502301f, 0.295238f, 0.000000f, -0.812729f, 0.502301f, 0.295238f, 0.003325f, 0.262529f, - -0.670817f, 0.723611f, 0.162457f, 0.000000f, -0.670817f, 0.723611f, 0.162457f, 0.536828f, 0.832965f, - -0.670817f, 0.723611f, 0.162457f, 0.000000f, -0.670817f, 0.723611f, 0.162457f, 0.536828f, 0.832965f, - -0.812729f, 0.502301f, 0.295238f, 0.000000f, -0.812729f, 0.502301f, 0.295238f, 0.003325f, 0.262529f, - -0.609547f, 0.657519f, 0.442856f, 0.000000f, -0.609547f, 0.657519f, 0.442856f, 0.418131f, 0.563385f, - -0.812729f, 0.502301f, 0.295238f, 0.000000f, -0.812729f, 0.502301f, 0.295238f, 0.003325f, 0.262529f, - -0.723607f, 0.447220f, 0.525725f, 0.000000f, -0.723607f, 0.447220f, 0.525725f, 1.115709f, 0.094716f, - -0.609547f, 0.657519f, 0.442856f, 0.000000f, -0.609547f, 0.657519f, 0.442856f, 0.418131f, 0.563385f, - 0.077607f, 0.967950f, -0.238853f, 0.000000f, 0.077607f, 0.967950f, -0.238853f, 0.412677f, 0.393695f, - -0.203181f, 0.967950f, -0.147618f, 0.000000f, -0.203181f, 0.967950f, -0.147618f, 0.466205f, 0.561213f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.589135f, 0.315387f, - 0.162456f, 0.850654f, -0.499995f, 0.000000f, 0.162456f, 0.850654f, -0.499995f, 0.491338f, 0.479977f, - -0.138197f, 0.894430f, -0.425320f, 0.000000f, -0.138197f, 0.894430f, -0.425320f, 0.503325f, 0.737471f, - 0.077607f, 0.967950f, -0.238853f, 0.000000f, 0.077607f, 0.967950f, -0.238853f, 0.412677f, 0.393695f, - 0.232822f, 0.657519f, -0.716563f, 0.000000f, 0.232822f, 0.657519f, -0.716563f, 0.467747f, 0.391208f, - -0.052790f, 0.723612f, -0.688185f, 0.000000f, -0.052790f, 0.723612f, -0.688185f, 0.574552f, 0.739757f, - 0.162456f, 0.850654f, -0.499995f, 0.000000f, 0.162456f, 0.850654f, -0.499995f, 0.491338f, 0.479977f, - 0.077607f, 0.967950f, -0.238853f, 0.000000f, 0.077607f, 0.967950f, -0.238853f, 0.412677f, 0.393695f, - -0.138197f, 0.894430f, -0.425320f, 0.000000f, -0.138197f, 0.894430f, -0.425320f, 0.503325f, 0.737471f, - -0.203181f, 0.967950f, -0.147618f, 0.000000f, -0.203181f, 0.967950f, -0.147618f, 0.466205f, 0.561213f, - -0.138197f, 0.894430f, -0.425320f, 0.000000f, -0.138197f, 0.894430f, -0.425320f, 0.503325f, 0.737471f, - -0.425323f, 0.850654f, -0.309011f, 0.000000f, -0.425323f, 0.850654f, -0.309011f, 0.391200f, 0.484445f, - -0.203181f, 0.967950f, -0.147618f, 0.000000f, -0.203181f, 0.967950f, -0.147618f, 0.466205f, 0.561213f, - 0.162456f, 0.850654f, -0.499995f, 0.000000f, 0.162456f, 0.850654f, -0.499995f, 0.491338f, 0.479977f, - -0.052790f, 0.723612f, -0.688185f, 0.000000f, -0.052790f, 0.723612f, -0.688185f, 0.574552f, 0.739757f, - -0.138197f, 0.894430f, -0.425320f, 0.000000f, -0.138197f, 0.894430f, -0.425320f, 0.503325f, 0.737471f, - -0.052790f, 0.723612f, -0.688185f, 0.000000f, -0.052790f, 0.723612f, -0.688185f, 0.574552f, 0.739757f, - -0.361804f, 0.723612f, -0.587778f, 0.000000f, -0.361804f, 0.723612f, -0.587778f, 0.279690f, 0.917858f, - -0.138197f, 0.894430f, -0.425320f, 0.000000f, -0.138197f, 0.894430f, -0.425320f, 0.503325f, 0.737471f, - -0.138197f, 0.894430f, -0.425320f, 0.000000f, -0.138197f, 0.894430f, -0.425320f, 0.503325f, 0.737471f, - -0.361804f, 0.723612f, -0.587778f, 0.000000f, -0.361804f, 0.723612f, -0.587778f, 0.279690f, 0.917858f, - -0.425323f, 0.850654f, -0.309011f, 0.000000f, -0.425323f, 0.850654f, -0.309011f, 0.391200f, 0.484445f, - -0.361804f, 0.723612f, -0.587778f, 0.000000f, -0.361804f, 0.723612f, -0.587778f, 0.279690f, 0.917858f, - -0.609547f, 0.657519f, -0.442856f, 0.000000f, -0.609547f, 0.657519f, -0.442856f, 0.441249f, 0.481295f, - -0.425323f, 0.850654f, -0.309011f, 0.000000f, -0.425323f, 0.850654f, -0.309011f, 0.391200f, 0.484445f, - 0.232822f, 0.657519f, -0.716563f, 0.000000f, 0.232822f, 0.657519f, -0.716563f, 0.467747f, 0.391208f, - 0.029639f, 0.502302f, -0.864184f, 0.000000f, 0.029639f, 0.502302f, -0.864184f, 0.791278f, 0.505149f, - -0.052790f, 0.723612f, -0.688185f, 0.000000f, -0.052790f, 0.723612f, -0.688185f, 0.574552f, 0.739757f, - 0.029639f, 0.502302f, -0.864184f, 0.000000f, 0.029639f, 0.502302f, -0.864184f, 0.791278f, 0.505149f, - -0.262869f, 0.525738f, -0.809012f, 0.000000f, -0.262869f, 0.525738f, -0.809012f, 0.863599f, 0.594041f, - -0.052790f, 0.723612f, -0.688185f, 0.000000f, -0.052790f, 0.723612f, -0.688185f, 0.574552f, 0.739757f, - -0.052790f, 0.723612f, -0.688185f, 0.000000f, -0.052790f, 0.723612f, -0.688185f, 0.574552f, 0.739757f, - -0.262869f, 0.525738f, -0.809012f, 0.000000f, -0.262869f, 0.525738f, -0.809012f, 0.863599f, 0.594041f, - -0.361804f, 0.723612f, -0.587778f, 0.000000f, -0.361804f, 0.723612f, -0.587778f, 0.279690f, 0.917858f, - -0.262869f, 0.525738f, -0.809012f, 0.000000f, -0.262869f, 0.525738f, -0.809012f, 0.863599f, 0.594041f, - -0.531941f, 0.502302f, -0.681712f, 0.000000f, -0.531941f, 0.502302f, -0.681712f, 0.814480f, 0.588860f, - -0.361804f, 0.723612f, -0.587778f, 0.000000f, -0.361804f, 0.723612f, -0.587778f, 0.279690f, 0.917858f, - -0.361804f, 0.723612f, -0.587778f, 0.000000f, -0.361804f, 0.723612f, -0.587778f, 0.279690f, 0.917858f, - -0.531941f, 0.502302f, -0.681712f, 0.000000f, -0.531941f, 0.502302f, -0.681712f, 0.814480f, 0.588860f, - -0.609547f, 0.657519f, -0.442856f, 0.000000f, -0.609547f, 0.657519f, -0.442856f, 0.441249f, 0.481295f, - -0.531941f, 0.502302f, -0.681712f, 0.000000f, -0.531941f, 0.502302f, -0.681712f, 0.814480f, 0.588860f, - -0.723607f, 0.447220f, -0.525725f, 0.000000f, -0.723607f, 0.447220f, -0.525725f, 0.952607f, 0.099770f, - -0.609547f, 0.657519f, -0.442856f, 0.000000f, -0.609547f, 0.657519f, -0.442856f, 0.441249f, 0.481295f, - 0.251147f, 0.967949f, 0.000000f, 0.000000f, 0.251147f, 0.967949f, 0.000000f, 0.663633f, 0.570564f, - 0.077607f, 0.967950f, -0.238853f, 0.000000f, 0.077607f, 0.967950f, -0.238853f, 0.412677f, 0.393695f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.589135f, 0.315387f, - 0.525730f, 0.850652f, 0.000000f, 0.000000f, 0.525730f, 0.850652f, 0.000000f, 0.615418f, 0.565866f, - 0.361800f, 0.894429f, -0.262863f, 0.000000f, 0.361800f, 0.894429f, -0.262863f, 0.257596f, 0.823860f, - 0.251147f, 0.967949f, 0.000000f, 0.000000f, 0.251147f, 0.967949f, 0.000000f, 0.663633f, 0.570564f, - 0.753442f, 0.657515f, 0.000000f, 0.000000f, 0.753442f, 0.657515f, 0.000000f, 0.870330f, 0.424531f, - 0.638194f, 0.723610f, -0.262864f, 0.000000f, 0.638194f, 0.723610f, -0.262864f, 0.356930f, 0.840702f, - 0.525730f, 0.850652f, 0.000000f, 0.000000f, 0.525730f, 0.850652f, 0.000000f, 0.615418f, 0.565866f, - 0.251147f, 0.967949f, 0.000000f, 0.000000f, 0.251147f, 0.967949f, 0.000000f, 0.663633f, 0.570564f, - 0.361800f, 0.894429f, -0.262863f, 0.000000f, 0.361800f, 0.894429f, -0.262863f, 0.257596f, 0.823860f, - 0.077607f, 0.967950f, -0.238853f, 0.000000f, 0.077607f, 0.967950f, -0.238853f, 0.412677f, 0.393695f, - 0.361800f, 0.894429f, -0.262863f, 0.000000f, 0.361800f, 0.894429f, -0.262863f, 0.257596f, 0.823860f, - 0.162456f, 0.850654f, -0.499995f, 0.000000f, 0.162456f, 0.850654f, -0.499995f, 0.491338f, 0.479977f, - 0.077607f, 0.967950f, -0.238853f, 0.000000f, 0.077607f, 0.967950f, -0.238853f, 0.412677f, 0.393695f, - 0.525730f, 0.850652f, 0.000000f, 0.000000f, 0.525730f, 0.850652f, 0.000000f, 0.615418f, 0.565866f, - 0.638194f, 0.723610f, -0.262864f, 0.000000f, 0.638194f, 0.723610f, -0.262864f, 0.356930f, 0.840702f, - 0.361800f, 0.894429f, -0.262863f, 0.000000f, 0.361800f, 0.894429f, -0.262863f, 0.257596f, 0.823860f, - 0.638194f, 0.723610f, -0.262864f, 0.000000f, 0.638194f, 0.723610f, -0.262864f, 0.356930f, 0.840702f, - 0.447209f, 0.723612f, -0.525728f, 0.000000f, 0.447209f, 0.723612f, -0.525728f, 0.313138f, 0.750327f, - 0.361800f, 0.894429f, -0.262863f, 0.000000f, 0.361800f, 0.894429f, -0.262863f, 0.257596f, 0.823860f, - 0.361800f, 0.894429f, -0.262863f, 0.000000f, 0.361800f, 0.894429f, -0.262863f, 0.257596f, 0.823860f, - 0.447209f, 0.723612f, -0.525728f, 0.000000f, 0.447209f, 0.723612f, -0.525728f, 0.313138f, 0.750327f, - 0.162456f, 0.850654f, -0.499995f, 0.000000f, 0.162456f, 0.850654f, -0.499995f, 0.491338f, 0.479977f, - 0.447209f, 0.723612f, -0.525728f, 0.000000f, 0.447209f, 0.723612f, -0.525728f, 0.313138f, 0.750327f, - 0.232822f, 0.657519f, -0.716563f, 0.000000f, 0.232822f, 0.657519f, -0.716563f, 0.467747f, 0.391208f, - 0.162456f, 0.850654f, -0.499995f, 0.000000f, 0.162456f, 0.850654f, -0.499995f, 0.491338f, 0.479977f, - 0.753442f, 0.657515f, 0.000000f, 0.000000f, 0.753442f, 0.657515f, 0.000000f, 0.870330f, 0.424531f, - 0.831051f, 0.502299f, -0.238853f, 0.000000f, 0.831051f, 0.502299f, -0.238853f, 0.891200f, 0.515555f, - 0.638194f, 0.723610f, -0.262864f, 0.000000f, 0.638194f, 0.723610f, -0.262864f, 0.356930f, 0.840702f, - 0.831051f, 0.502299f, -0.238853f, 0.000000f, 0.831051f, 0.502299f, -0.238853f, 0.891200f, 0.515555f, - 0.688189f, 0.525736f, -0.499997f, 0.000000f, 0.688189f, 0.525736f, -0.499997f, 0.816839f, 0.418893f, - 0.638194f, 0.723610f, -0.262864f, 0.000000f, 0.638194f, 0.723610f, -0.262864f, 0.356930f, 0.840702f, - 0.638194f, 0.723610f, -0.262864f, 0.000000f, 0.638194f, 0.723610f, -0.262864f, 0.356930f, 0.840702f, - 0.688189f, 0.525736f, -0.499997f, 0.000000f, 0.688189f, 0.525736f, -0.499997f, 0.816839f, 0.418893f, - 0.447209f, 0.723612f, -0.525728f, 0.000000f, 0.447209f, 0.723612f, -0.525728f, 0.313138f, 0.750327f, - 0.688189f, 0.525736f, -0.499997f, 0.000000f, 0.688189f, 0.525736f, -0.499997f, 0.816839f, 0.418893f, - 0.483971f, 0.502302f, -0.716565f, 0.000000f, 0.483971f, 0.502302f, -0.716565f, 0.841211f, 0.510884f, - 0.447209f, 0.723612f, -0.525728f, 0.000000f, 0.447209f, 0.723612f, -0.525728f, 0.313138f, 0.750327f, - 0.447209f, 0.723612f, -0.525728f, 0.000000f, 0.447209f, 0.723612f, -0.525728f, 0.313138f, 0.750327f, - 0.483971f, 0.502302f, -0.716565f, 0.000000f, 0.483971f, 0.502302f, -0.716565f, 0.841211f, 0.510884f, - 0.232822f, 0.657519f, -0.716563f, 0.000000f, 0.232822f, 0.657519f, -0.716563f, 0.467747f, 0.391208f, - 0.483971f, 0.502302f, -0.716565f, 0.000000f, 0.483971f, 0.502302f, -0.716565f, 0.841211f, 0.510884f, - 0.276388f, 0.447220f, -0.850649f, 0.000000f, 0.276388f, 0.447220f, -0.850649f, 0.768276f, 0.421330f, - 0.232822f, 0.657519f, -0.716563f, 0.000000f, 0.232822f, 0.657519f, -0.716563f, 0.467747f, 0.391208f}; - -const int medium_sphere_indices[] = - { - 0, 1, 2, - 3, 4, 5, - 6, 7, 8, - 9, 10, 11, - 12, 13, 14, - 15, 16, 17, - 18, 19, 20, - 21, 22, 23, - 24, 25, 26, - 27, 28, 29, - 30, 31, 32, - 33, 34, 35, - 36, 37, 38, - 39, 40, 41, - 42, 43, 44, - 45, 46, 47, - 48, 49, 50, - 51, 52, 53, - 54, 55, 56, - 57, 58, 59, - 60, 61, 62, - 63, 64, 65, - 66, 67, 68, - 69, 70, 71, - 72, 73, 74, - 75, 76, 77, - 78, 79, 80, - 81, 82, 83, - 84, 85, 86, - 87, 88, 89, - 90, 91, 92, - 93, 94, 95, - 96, 97, 98, - 99, 100, 101, - 102, 103, 104, - 105, 106, 107, - 108, 109, 110, - 111, 112, 113, - 114, 115, 116, - 117, 118, 119, - 120, 121, 122, - 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, 256, 257, - 258, 259, 260, - 261, 262, 263, - 264, 265, 266, - 267, 268, 269, - 270, 271, 272, - 273, 274, 275, - 276, 277, 278, - 279, 280, 281, - 282, 283, 284, - 285, 286, 287, - 288, 289, 290, - 291, 292, 293, - 294, 295, 296, - 297, 298, 299, - 300, 301, 302, - 303, 304, 305, - 306, 307, 308, - 309, 310, 311, - 312, 313, 314, - 315, 316, 317, - 318, 319, 320, - 321, 322, 323, - 324, 325, 326, - 327, 328, 329, - 330, 331, 332, - 333, 334, 335, - 336, 337, 338, - 339, 340, 341, - 342, 343, 344, - 345, 346, 347, - 348, 349, 350, - 351, 352, 353, - 354, 355, 356, - 357, 358, 359, - 360, 361, 362, - 363, 364, 365, - 366, 367, 368, - 369, 370, 371, - 372, 373, 374, - 375, 376, 377, - 378, 379, 380, - 381, 382, 383, - 384, 385, 386, - 387, 388, 389, - 390, 391, 392, - 393, 394, 395, - 396, 397, 398, - 399, 400, 401, - 402, 403, 404, - 405, 406, 407, - 408, 409, 410, - 411, 412, 413, - 414, 415, 416, - 417, 418, 419, - 420, 421, 422, - 423, 424, 425, - 426, 427, 428, - 429, 430, 431, - 432, 433, 434, - 435, 436, 437, - 438, 439, 440, - 441, 442, 443, - 444, 445, 446, - 447, 448, 449, - 450, 451, 452, - 453, 454, 455, - 456, 457, 458, - 459, 460, 461, - 462, 463, 464, - 465, 466, 467, - 468, 469, 470, - 471, 472, 473, - 474, 475, 476, - 477, 478, 479, - 480, 481, 482, - 483, 484, 485, - 486, 487, 488, - 489, 490, 491, - 492, 493, 494, - 495, 496, 497, - 498, 499, 500, - 501, 502, 503, - 504, 505, 506, - 507, 508, 509, - 510, 511, 512, - 513, 514, 515, - 516, 517, 518, - 519, 520, 521, - 522, 523, 524, - 525, 526, 527, - 528, 529, 530, - 531, 532, 533, - 534, 535, 536, - 537, 538, 539, - 540, 541, 542, - 543, 544, 545, - 546, 547, 548, - 549, 550, 551, - 552, 553, 554, - 555, 556, 557, - 558, 559, 560, - 561, 562, 563, - 564, 565, 566, - 567, 568, 569, - 570, 571, 572, - 573, 574, 575, - 576, 577, 578, - 579, 580, 581, - 582, 583, 584, - 585, 586, 587, - 588, 589, 590, - 591, 592, 593, - 594, 595, 596, - 597, 598, 599, - 600, 601, 602, - 603, 604, 605, - 606, 607, 608, - 609, 610, 611, - 612, 613, 614, - 615, 616, 617, - 618, 619, 620, - 621, 622, 623, - 624, 625, 626, - 627, 628, 629, - 630, 631, 632, - 633, 634, 635, - 636, 637, 638, - 639, 640, 641, - 642, 643, 644, - 645, 646, 647, - 648, 649, 650, - 651, 652, 653, - 654, 655, 656, - 657, 658, 659, - 660, 661, 662, - 663, 664, 665, - 666, 667, 668, - 669, 670, 671, - 672, 673, 674, - 675, 676, 677, - 678, 679, 680, - 681, 682, 683, - 684, 685, 686, - 687, 688, 689, - 690, 691, 692, - 693, 694, 695, - 696, 697, 698, - 699, 700, 701, - 702, 703, 704, - 705, 706, 707, - 708, 709, 710, - 711, 712, 713, - 714, 715, 716, - 717, 718, 719, - 720, 721, 722, - 723, 724, 725, - 726, 727, 728, - 729, 730, 731, - 732, 733, 734, - 735, 736, 737, - 738, 739, 740, - 741, 742, 743, - 744, 745, 746, - 747, 748, 749, - 750, 751, 752, - 753, 754, 755, - 756, 757, 758, - 759, 760, 761, - 762, 763, 764, - 765, 766, 767, - 768, 769, 770, - 771, 772, 773, - 774, 775, 776, - 777, 778, 779, - 780, 781, 782, - 783, 784, 785, - 786, 787, 788, - 789, 790, 791, - 792, 793, 794, - 795, 796, 797, - 798, 799, 800, - 801, 802, 803, - 804, 805, 806, - 807, 808, 809, - 810, 811, 812, - 813, 814, 815, - 816, 817, 818, - 819, 820, 821, - 822, 823, 824, - 825, 826, 827, - 828, 829, 830, - 831, 832, 833, - 834, 835, 836, - 837, 838, 839, - 840, 841, 842, - 843, 844, 845, - 846, 847, 848, - 849, 850, 851, - 852, 853, 854, - 855, 856, 857, - 858, 859, 860, - 861, 862, 863, - 864, 865, 866, - 867, 868, 869, - 870, 871, 872, - 873, 874, 875, - 876, 877, 878, - 879, 880, 881, - 882, 883, 884, - 885, 886, 887, - 888, 889, 890, - 891, 892, 893, - 894, 895, 896, - 897, 898, 899, - 900, 901, 902, - 903, 904, 905, - 906, 907, 908, - 909, 910, 911, - 912, 913, 914, - 915, 916, 917, - 918, 919, 920, - 921, 922, 923, - 924, 925, 926, - 927, 928, 929, - 930, 931, 932, - 933, 934, 935, - 936, 937, 938, - 939, 940, 941, - 942, 943, 944, - 945, 946, 947, - 948, 949, 950, - 951, 952, 953, - 954, 955, 956, - 957, 958, 959}; - -const float low_sphere_vertices[] = - { - 0.000000f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 0.999999f, 0.020053f, - 0.425323f, -0.850654f, 0.309011f, 0.000000f, 0.425323f, -0.850654f, 0.309011f, 0.336927f, 0.341759f, - -0.162456f, -0.850654f, 0.499995f, 0.000000f, -0.162456f, -0.850654f, 0.499995f, 0.391200f, 0.484445f, - 0.723607f, -0.447220f, 0.525725f, 0.000000f, 0.723607f, -0.447220f, 0.525725f, 0.757596f, 0.176140f, - 0.425323f, -0.850654f, 0.309011f, 0.000000f, 0.425323f, -0.850654f, 0.309011f, 0.336927f, 0.341759f, - 0.850648f, -0.525736f, 0.000000f, 0.000000f, 0.850648f, -0.525736f, 0.000000f, 0.235205f, 0.325266f, - 0.000000f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 0.999999f, 0.020053f, - -0.162456f, -0.850654f, 0.499995f, 0.000000f, -0.162456f, -0.850654f, 0.499995f, 0.391200f, 0.484445f, - -0.525730f, -0.850652f, 0.000000f, 0.000000f, -0.525730f, -0.850652f, 0.000000f, 0.943007f, 0.371159f, - 0.000000f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 0.999999f, 0.020053f, - -0.525730f, -0.850652f, 0.000000f, 0.000000f, -0.525730f, -0.850652f, 0.000000f, 0.943007f, 0.371159f, - -0.162456f, -0.850654f, -0.499995f, 0.000000f, -0.162456f, -0.850654f, -0.499995f, 0.991338f, 0.520023f, - 0.000000f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 0.999999f, 0.020053f, - -0.162456f, -0.850654f, -0.499995f, 0.000000f, -0.162456f, -0.850654f, -0.499995f, 0.991338f, 0.520023f, - 0.425323f, -0.850654f, -0.309011f, 0.000000f, 0.425323f, -0.850654f, -0.309011f, 0.137692f, 0.365246f, - 0.723607f, -0.447220f, 0.525725f, 0.000000f, 0.723607f, -0.447220f, 0.525725f, 0.757596f, 0.176140f, - 0.850648f, -0.525736f, 0.000000f, 0.000000f, 0.850648f, -0.525736f, 0.000000f, 0.235205f, 0.325266f, - 0.951058f, 0.000000f, 0.309013f, 0.000000f, 0.951058f, 0.000000f, 0.309013f, 0.291278f, 0.494851f, - -0.276388f, -0.447220f, 0.850649f, 0.000000f, -0.276388f, -0.447220f, 0.850649f, 0.546072f, 0.156902f, - 0.262869f, -0.525738f, 0.809012f, 0.000000f, 0.262869f, -0.525738f, 0.809012f, 0.438926f, 0.305137f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.891200f, 0.515555f, - -0.894426f, -0.447216f, 0.000000f, 0.000000f, -0.894426f, -0.447216f, 0.000000f, 0.746383f, 0.351642f, - -0.688189f, -0.525736f, 0.499997f, 0.000000f, -0.688189f, -0.525736f, 0.499997f, 0.191461f, 0.507219f, - -0.951058f, 0.000000f, 0.309013f, 0.000000f, -0.951058f, 0.000000f, 0.309013f, 0.735205f, 0.674734f, - -0.276388f, -0.447220f, -0.850649f, 0.000000f, -0.276388f, -0.447220f, -0.850649f, 0.846308f, 0.334943f, - -0.688189f, -0.525736f, -0.499997f, 0.000000f, -0.688189f, -0.525736f, -0.499997f, 1.039894f, 0.343193f, - -0.587786f, 0.000000f, -0.809017f, 0.000000f, -0.587786f, 0.000000f, -0.809017f, 0.443007f, 0.628841f, - 0.723607f, -0.447220f, -0.525725f, 0.000000f, 0.723607f, -0.447220f, -0.525725f, 1.326823f, 0.166086f, - 0.262869f, -0.525738f, -0.809012f, 0.000000f, 0.262869f, -0.525738f, -0.809012f, 0.691461f, 0.492781f, - 0.587786f, 0.000000f, -0.809017f, 0.000000f, 0.587786f, 0.000000f, -0.809017f, 0.446597f, 0.804967f, - 0.723607f, -0.447220f, 0.525725f, 0.000000f, 0.723607f, -0.447220f, 0.525725f, 0.757596f, 0.176140f, - 0.951058f, 0.000000f, 0.309013f, 0.000000f, 0.951058f, 0.000000f, 0.309013f, 0.291278f, 0.494851f, - 0.587786f, 0.000000f, 0.809017f, 0.000000f, 0.587786f, 0.000000f, 0.809017f, 0.091499f, 0.516836f, - -0.276388f, -0.447220f, 0.850649f, 0.000000f, -0.276388f, -0.447220f, 0.850649f, 0.546072f, 0.156902f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.891200f, 0.515555f, - -0.587786f, 0.000000f, 0.809017f, 0.000000f, -0.587786f, 0.000000f, 0.809017f, 0.637692f, 0.634754f, - -0.894426f, -0.447216f, 0.000000f, 0.000000f, -0.894426f, -0.447216f, 0.000000f, 0.746383f, 0.351642f, - -0.951058f, 0.000000f, 0.309013f, 0.000000f, -0.951058f, 0.000000f, 0.309013f, 0.735205f, 0.674734f, - -0.951058f, 0.000000f, -0.309013f, 0.000000f, -0.951058f, 0.000000f, -0.309013f, 0.629692f, 0.810571f, - -0.276388f, -0.447220f, -0.850649f, 0.000000f, -0.276388f, -0.447220f, -0.850649f, 0.846308f, 0.334943f, - -0.587786f, 0.000000f, -0.809017f, 0.000000f, -0.587786f, 0.000000f, -0.809017f, 0.443007f, 0.628841f, - 0.000000f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, -1.000000f, 0.539894f, 0.656807f, - 0.723607f, -0.447220f, -0.525725f, 0.000000f, 0.723607f, -0.447220f, -0.525725f, 1.326823f, 0.166086f, - 0.587786f, 0.000000f, -0.809017f, 0.000000f, 0.587786f, 0.000000f, -0.809017f, 0.446597f, 0.804967f, - 0.951058f, 0.000000f, -0.309013f, 0.000000f, 0.951058f, 0.000000f, -0.309013f, 0.491338f, 0.479977f, - 0.276388f, 0.447220f, 0.850649f, 0.000000f, 0.276388f, 0.447220f, 0.850649f, 1.129692f, 0.189429f, - 0.688189f, 0.525736f, 0.499997f, 0.000000f, 0.688189f, 0.525736f, 0.499997f, 0.246383f, 0.648358f, - 0.162456f, 0.850654f, 0.499995f, 0.000000f, 0.162456f, 0.850654f, 0.499995f, 0.836927f, 0.658241f, - -0.723607f, 0.447220f, 0.525725f, 0.000000f, -0.723607f, 0.447220f, 0.525725f, 0.946597f, 0.195033f, - -0.262869f, 0.525738f, 0.809012f, 0.000000f, -0.262869f, 0.525738f, 0.809012f, 0.346308f, 0.665057f, - -0.425323f, 0.850654f, 0.309011f, 0.000000f, -0.425323f, 0.850654f, 0.309011f, 0.938926f, 0.694863f, - -0.723607f, 0.447220f, -0.525725f, 0.000000f, -0.723607f, 0.447220f, -0.525725f, 0.791278f, 0.505149f, - -0.850648f, 0.525736f, 0.000000f, 0.000000f, -0.850648f, 0.525736f, 0.000000f, 0.257596f, 0.823860f, - -0.425323f, 0.850654f, -0.309011f, 0.000000f, -0.425323f, 0.850654f, -0.309011f, 0.826823f, 0.833914f, - 0.276388f, 0.447220f, -0.850649f, 0.000000f, 0.276388f, 0.447220f, -0.850649f, 0.542767f, 0.333057f, - -0.262869f, 0.525738f, -0.809012f, 0.000000f, -0.262869f, 0.525738f, -0.809012f, 0.042767f, 0.666943f, - 0.162456f, 0.850654f, -0.499995f, 0.000000f, 0.162456f, 0.850654f, -0.499995f, 0.326823f, 0.166086f, - 0.894426f, 0.447216f, 0.000000f, 0.000000f, 0.894426f, 0.447216f, 0.000000f, 0.646443f, 0.311386f, - 0.688189f, 0.525736f, -0.499997f, 0.000000f, 0.688189f, 0.525736f, -0.499997f, 0.146443f, 0.688614f, - 0.525730f, 0.850652f, 0.000000f, 0.000000f, 0.525730f, 0.850652f, 0.000000f, 0.046072f, 0.843098f, - -0.162456f, -0.850654f, 0.499995f, 0.000000f, -0.162456f, -0.850654f, 0.499995f, 0.391200f, 0.484445f, - 0.262869f, -0.525738f, 0.809012f, 0.000000f, 0.262869f, -0.525738f, 0.809012f, 0.438926f, 0.305137f, - -0.276388f, -0.447220f, 0.850649f, 0.000000f, -0.276388f, -0.447220f, 0.850649f, 0.546072f, 0.156902f, - -0.162456f, -0.850654f, 0.499995f, 0.000000f, -0.162456f, -0.850654f, 0.499995f, 0.391200f, 0.484445f, - 0.425323f, -0.850654f, 0.309011f, 0.000000f, 0.425323f, -0.850654f, 0.309011f, 0.336927f, 0.341759f, - 0.262869f, -0.525738f, 0.809012f, 0.000000f, 0.262869f, -0.525738f, 0.809012f, 0.438926f, 0.305137f, - 0.425323f, -0.850654f, 0.309011f, 0.000000f, 0.425323f, -0.850654f, 0.309011f, 0.336927f, 0.341759f, - 0.723607f, -0.447220f, 0.525725f, 0.000000f, 0.723607f, -0.447220f, 0.525725f, 0.757596f, 0.176140f, - 0.262869f, -0.525738f, 0.809012f, 0.000000f, 0.262869f, -0.525738f, 0.809012f, 0.438926f, 0.305137f, - 0.850648f, -0.525736f, 0.000000f, 0.000000f, 0.850648f, -0.525736f, 0.000000f, 0.235205f, 0.325266f, - 0.425323f, -0.850654f, -0.309011f, 0.000000f, 0.425323f, -0.850654f, -0.309011f, 0.137692f, 0.365246f, - 0.723607f, -0.447220f, -0.525725f, 0.000000f, 0.723607f, -0.447220f, -0.525725f, 1.326823f, 0.166086f, - 0.850648f, -0.525736f, 0.000000f, 0.000000f, 0.850648f, -0.525736f, 0.000000f, 0.235205f, 0.325266f, - 0.425323f, -0.850654f, 0.309011f, 0.000000f, 0.425323f, -0.850654f, 0.309011f, 0.336927f, 0.341759f, - 0.425323f, -0.850654f, -0.309011f, 0.000000f, 0.425323f, -0.850654f, -0.309011f, 0.137692f, 0.365246f, - 0.425323f, -0.850654f, 0.309011f, 0.000000f, 0.425323f, -0.850654f, 0.309011f, 0.336927f, 0.341759f, - 0.000000f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 0.999999f, 0.020053f, - 0.425323f, -0.850654f, -0.309011f, 0.000000f, 0.425323f, -0.850654f, -0.309011f, 0.137692f, 0.365246f, - -0.525730f, -0.850652f, 0.000000f, 0.000000f, -0.525730f, -0.850652f, 0.000000f, 0.943007f, 0.371159f, - -0.688189f, -0.525736f, 0.499997f, 0.000000f, -0.688189f, -0.525736f, 0.499997f, 0.191461f, 0.507219f, - -0.894426f, -0.447216f, 0.000000f, 0.000000f, -0.894426f, -0.447216f, 0.000000f, 0.746383f, 0.351642f, - -0.525730f, -0.850652f, 0.000000f, 0.000000f, -0.525730f, -0.850652f, 0.000000f, 0.943007f, 0.371159f, - -0.162456f, -0.850654f, 0.499995f, 0.000000f, -0.162456f, -0.850654f, 0.499995f, 0.391200f, 0.484445f, - -0.688189f, -0.525736f, 0.499997f, 0.000000f, -0.688189f, -0.525736f, 0.499997f, 0.191461f, 0.507219f, - -0.162456f, -0.850654f, 0.499995f, 0.000000f, -0.162456f, -0.850654f, 0.499995f, 0.391200f, 0.484445f, - -0.276388f, -0.447220f, 0.850649f, 0.000000f, -0.276388f, -0.447220f, 0.850649f, 0.546072f, 0.156902f, - -0.688189f, -0.525736f, 0.499997f, 0.000000f, -0.688189f, -0.525736f, 0.499997f, 0.191461f, 0.507219f, - -0.162456f, -0.850654f, -0.499995f, 0.000000f, -0.162456f, -0.850654f, -0.499995f, 0.991338f, 0.520023f, - -0.688189f, -0.525736f, -0.499997f, 0.000000f, -0.688189f, -0.525736f, -0.499997f, 1.039894f, 0.343193f, - -0.276388f, -0.447220f, -0.850649f, 0.000000f, -0.276388f, -0.447220f, -0.850649f, 0.846308f, 0.334943f, - -0.162456f, -0.850654f, -0.499995f, 0.000000f, -0.162456f, -0.850654f, -0.499995f, 0.991338f, 0.520023f, - -0.525730f, -0.850652f, 0.000000f, 0.000000f, -0.525730f, -0.850652f, 0.000000f, 0.943007f, 0.371159f, - -0.688189f, -0.525736f, -0.499997f, 0.000000f, -0.688189f, -0.525736f, -0.499997f, 1.039894f, 0.343193f, - -0.525730f, -0.850652f, 0.000000f, 0.000000f, -0.525730f, -0.850652f, 0.000000f, 0.943007f, 0.371159f, - -0.894426f, -0.447216f, 0.000000f, 0.000000f, -0.894426f, -0.447216f, 0.000000f, 0.746383f, 0.351642f, - -0.688189f, -0.525736f, -0.499997f, 0.000000f, -0.688189f, -0.525736f, -0.499997f, 1.039894f, 0.343193f, - 0.425323f, -0.850654f, -0.309011f, 0.000000f, 0.425323f, -0.850654f, -0.309011f, 0.137692f, 0.365246f, - 0.262869f, -0.525738f, -0.809012f, 0.000000f, 0.262869f, -0.525738f, -0.809012f, 0.691461f, 0.492781f, - 0.723607f, -0.447220f, -0.525725f, 0.000000f, 0.723607f, -0.447220f, -0.525725f, 1.326823f, 0.166086f, - 0.425323f, -0.850654f, -0.309011f, 0.000000f, 0.425323f, -0.850654f, -0.309011f, 0.137692f, 0.365246f, - -0.162456f, -0.850654f, -0.499995f, 0.000000f, -0.162456f, -0.850654f, -0.499995f, 0.991338f, 0.520023f, - 0.262869f, -0.525738f, -0.809012f, 0.000000f, 0.262869f, -0.525738f, -0.809012f, 0.691461f, 0.492781f, - -0.162456f, -0.850654f, -0.499995f, 0.000000f, -0.162456f, -0.850654f, -0.499995f, 0.991338f, 0.520023f, - -0.276388f, -0.447220f, -0.850649f, 0.000000f, -0.276388f, -0.447220f, -0.850649f, 0.846308f, 0.334943f, - 0.262869f, -0.525738f, -0.809012f, 0.000000f, 0.262869f, -0.525738f, -0.809012f, 0.691461f, 0.492781f, - 0.951058f, 0.000000f, 0.309013f, 0.000000f, 0.951058f, 0.000000f, 0.309013f, 0.291278f, 0.494851f, - 0.951058f, 0.000000f, -0.309013f, 0.000000f, 0.951058f, 0.000000f, -0.309013f, 0.491338f, 0.479977f, - 0.894426f, 0.447216f, 0.000000f, 0.000000f, 0.894426f, 0.447216f, 0.000000f, 0.646443f, 0.311386f, - 0.951058f, 0.000000f, 0.309013f, 0.000000f, 0.951058f, 0.000000f, 0.309013f, 0.291278f, 0.494851f, - 0.850648f, -0.525736f, 0.000000f, 0.000000f, 0.850648f, -0.525736f, 0.000000f, 0.235205f, 0.325266f, - 0.951058f, 0.000000f, -0.309013f, 0.000000f, 0.951058f, 0.000000f, -0.309013f, 0.491338f, 0.479977f, - 0.850648f, -0.525736f, 0.000000f, 0.000000f, 0.850648f, -0.525736f, 0.000000f, 0.235205f, 0.325266f, - 0.723607f, -0.447220f, -0.525725f, 0.000000f, 0.723607f, -0.447220f, -0.525725f, 1.326823f, 0.166086f, - 0.951058f, 0.000000f, -0.309013f, 0.000000f, 0.951058f, 0.000000f, -0.309013f, 0.491338f, 0.479977f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.891200f, 0.515555f, - 0.587786f, 0.000000f, 0.809017f, 0.000000f, 0.587786f, 0.000000f, 0.809017f, 0.091499f, 0.516836f, - 0.276388f, 0.447220f, 0.850649f, 0.000000f, 0.276388f, 0.447220f, 0.850649f, 1.129692f, 0.189429f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.891200f, 0.515555f, - 0.262869f, -0.525738f, 0.809012f, 0.000000f, 0.262869f, -0.525738f, 0.809012f, 0.438926f, 0.305137f, - 0.587786f, 0.000000f, 0.809017f, 0.000000f, 0.587786f, 0.000000f, 0.809017f, 0.091499f, 0.516836f, - 0.262869f, -0.525738f, 0.809012f, 0.000000f, 0.262869f, -0.525738f, 0.809012f, 0.438926f, 0.305137f, - 0.723607f, -0.447220f, 0.525725f, 0.000000f, 0.723607f, -0.447220f, 0.525725f, 0.757596f, 0.176140f, - 0.587786f, 0.000000f, 0.809017f, 0.000000f, 0.587786f, 0.000000f, 0.809017f, 0.091499f, 0.516836f, - -0.951058f, 0.000000f, 0.309013f, 0.000000f, -0.951058f, 0.000000f, 0.309013f, 0.735205f, 0.674734f, - -0.587786f, 0.000000f, 0.809017f, 0.000000f, -0.587786f, 0.000000f, 0.809017f, 0.637692f, 0.634754f, - -0.723607f, 0.447220f, 0.525725f, 0.000000f, -0.723607f, 0.447220f, 0.525725f, 0.946597f, 0.195033f, - -0.951058f, 0.000000f, 0.309013f, 0.000000f, -0.951058f, 0.000000f, 0.309013f, 0.735205f, 0.674734f, - -0.688189f, -0.525736f, 0.499997f, 0.000000f, -0.688189f, -0.525736f, 0.499997f, 0.191461f, 0.507219f, - -0.587786f, 0.000000f, 0.809017f, 0.000000f, -0.587786f, 0.000000f, 0.809017f, 0.637692f, 0.634754f, - -0.688189f, -0.525736f, 0.499997f, 0.000000f, -0.688189f, -0.525736f, 0.499997f, 0.191461f, 0.507219f, - -0.276388f, -0.447220f, 0.850649f, 0.000000f, -0.276388f, -0.447220f, 0.850649f, 0.546072f, 0.156902f, - -0.587786f, 0.000000f, 0.809017f, 0.000000f, -0.587786f, 0.000000f, 0.809017f, 0.637692f, 0.634754f, - -0.587786f, 0.000000f, -0.809017f, 0.000000f, -0.587786f, 0.000000f, -0.809017f, 0.443007f, 0.628841f, - -0.951058f, 0.000000f, -0.309013f, 0.000000f, -0.951058f, 0.000000f, -0.309013f, 0.629692f, 0.810571f, - -0.723607f, 0.447220f, -0.525725f, 0.000000f, -0.723607f, 0.447220f, -0.525725f, 0.791278f, 0.505149f, - -0.587786f, 0.000000f, -0.809017f, 0.000000f, -0.587786f, 0.000000f, -0.809017f, 0.443007f, 0.628841f, - -0.688189f, -0.525736f, -0.499997f, 0.000000f, -0.688189f, -0.525736f, -0.499997f, 1.039894f, 0.343193f, - -0.951058f, 0.000000f, -0.309013f, 0.000000f, -0.951058f, 0.000000f, -0.309013f, 0.629692f, 0.810571f, - -0.688189f, -0.525736f, -0.499997f, 0.000000f, -0.688189f, -0.525736f, -0.499997f, 1.039894f, 0.343193f, - -0.894426f, -0.447216f, 0.000000f, 0.000000f, -0.894426f, -0.447216f, 0.000000f, 0.746383f, 0.351642f, - -0.951058f, 0.000000f, -0.309013f, 0.000000f, -0.951058f, 0.000000f, -0.309013f, 0.629692f, 0.810571f, - 0.587786f, 0.000000f, -0.809017f, 0.000000f, 0.587786f, 0.000000f, -0.809017f, 0.446597f, 0.804967f, - 0.000000f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, -1.000000f, 0.539894f, 0.656807f, - 0.276388f, 0.447220f, -0.850649f, 0.000000f, 0.276388f, 0.447220f, -0.850649f, 0.542767f, 0.333057f, - 0.587786f, 0.000000f, -0.809017f, 0.000000f, 0.587786f, 0.000000f, -0.809017f, 0.446597f, 0.804967f, - 0.262869f, -0.525738f, -0.809012f, 0.000000f, 0.262869f, -0.525738f, -0.809012f, 0.691461f, 0.492781f, - 0.000000f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, -1.000000f, 0.539894f, 0.656807f, - 0.262869f, -0.525738f, -0.809012f, 0.000000f, 0.262869f, -0.525738f, -0.809012f, 0.691461f, 0.492781f, - -0.276388f, -0.447220f, -0.850649f, 0.000000f, -0.276388f, -0.447220f, -0.850649f, 0.846308f, 0.334943f, - 0.000000f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, -1.000000f, 0.539894f, 0.656807f, - 0.587786f, 0.000000f, 0.809017f, 0.000000f, 0.587786f, 0.000000f, 0.809017f, 0.091499f, 0.516836f, - 0.688189f, 0.525736f, 0.499997f, 0.000000f, 0.688189f, 0.525736f, 0.499997f, 0.246383f, 0.648358f, - 0.276388f, 0.447220f, 0.850649f, 0.000000f, 0.276388f, 0.447220f, 0.850649f, 1.129692f, 0.189429f, - 0.587786f, 0.000000f, 0.809017f, 0.000000f, 0.587786f, 0.000000f, 0.809017f, 0.091499f, 0.516836f, - 0.951058f, 0.000000f, 0.309013f, 0.000000f, 0.951058f, 0.000000f, 0.309013f, 0.291278f, 0.494851f, - 0.688189f, 0.525736f, 0.499997f, 0.000000f, 0.688189f, 0.525736f, 0.499997f, 0.246383f, 0.648358f, - 0.951058f, 0.000000f, 0.309013f, 0.000000f, 0.951058f, 0.000000f, 0.309013f, 0.291278f, 0.494851f, - 0.894426f, 0.447216f, 0.000000f, 0.000000f, 0.894426f, 0.447216f, 0.000000f, 0.646443f, 0.311386f, - 0.688189f, 0.525736f, 0.499997f, 0.000000f, 0.688189f, 0.525736f, 0.499997f, 0.246383f, 0.648358f, - -0.587786f, 0.000000f, 0.809017f, 0.000000f, -0.587786f, 0.000000f, 0.809017f, 0.637692f, 0.634754f, - -0.262869f, 0.525738f, 0.809012f, 0.000000f, -0.262869f, 0.525738f, 0.809012f, 0.346308f, 0.665057f, - -0.723607f, 0.447220f, 0.525725f, 0.000000f, -0.723607f, 0.447220f, 0.525725f, 0.946597f, 0.195033f, - -0.587786f, 0.000000f, 0.809017f, 0.000000f, -0.587786f, 0.000000f, 0.809017f, 0.637692f, 0.634754f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.891200f, 0.515555f, - -0.262869f, 0.525738f, 0.809012f, 0.000000f, -0.262869f, 0.525738f, 0.809012f, 0.346308f, 0.665057f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.891200f, 0.515555f, - 0.276388f, 0.447220f, 0.850649f, 0.000000f, 0.276388f, 0.447220f, 0.850649f, 1.129692f, 0.189429f, - -0.262869f, 0.525738f, 0.809012f, 0.000000f, -0.262869f, 0.525738f, 0.809012f, 0.346308f, 0.665057f, - -0.951058f, 0.000000f, -0.309013f, 0.000000f, -0.951058f, 0.000000f, -0.309013f, 0.629692f, 0.810571f, - -0.850648f, 0.525736f, 0.000000f, 0.000000f, -0.850648f, 0.525736f, 0.000000f, 0.257596f, 0.823860f, - -0.723607f, 0.447220f, -0.525725f, 0.000000f, -0.723607f, 0.447220f, -0.525725f, 0.791278f, 0.505149f, - -0.951058f, 0.000000f, -0.309013f, 0.000000f, -0.951058f, 0.000000f, -0.309013f, 0.629692f, 0.810571f, - -0.951058f, 0.000000f, 0.309013f, 0.000000f, -0.951058f, 0.000000f, 0.309013f, 0.735205f, 0.674734f, - -0.850648f, 0.525736f, 0.000000f, 0.000000f, -0.850648f, 0.525736f, 0.000000f, 0.257596f, 0.823860f, - -0.951058f, 0.000000f, 0.309013f, 0.000000f, -0.951058f, 0.000000f, 0.309013f, 0.735205f, 0.674734f, - -0.723607f, 0.447220f, 0.525725f, 0.000000f, -0.723607f, 0.447220f, 0.525725f, 0.946597f, 0.195033f, - -0.850648f, 0.525736f, 0.000000f, 0.000000f, -0.850648f, 0.525736f, 0.000000f, 0.257596f, 0.823860f, - 0.000000f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, -1.000000f, 0.539894f, 0.656807f, - -0.262869f, 0.525738f, -0.809012f, 0.000000f, -0.262869f, 0.525738f, -0.809012f, 0.042767f, 0.666943f, - 0.276388f, 0.447220f, -0.850649f, 0.000000f, 0.276388f, 0.447220f, -0.850649f, 0.542767f, 0.333057f, - 0.000000f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, -1.000000f, 0.539894f, 0.656807f, - -0.587786f, 0.000000f, -0.809017f, 0.000000f, -0.587786f, 0.000000f, -0.809017f, 0.443007f, 0.628841f, - -0.262869f, 0.525738f, -0.809012f, 0.000000f, -0.262869f, 0.525738f, -0.809012f, 0.042767f, 0.666943f, - -0.587786f, 0.000000f, -0.809017f, 0.000000f, -0.587786f, 0.000000f, -0.809017f, 0.443007f, 0.628841f, - -0.723607f, 0.447220f, -0.525725f, 0.000000f, -0.723607f, 0.447220f, -0.525725f, 0.791278f, 0.505149f, - -0.262869f, 0.525738f, -0.809012f, 0.000000f, -0.262869f, 0.525738f, -0.809012f, 0.042767f, 0.666943f, - 0.951058f, 0.000000f, -0.309013f, 0.000000f, 0.951058f, 0.000000f, -0.309013f, 0.491338f, 0.479977f, - 0.688189f, 0.525736f, -0.499997f, 0.000000f, 0.688189f, 0.525736f, -0.499997f, 0.146443f, 0.688614f, - 0.894426f, 0.447216f, 0.000000f, 0.000000f, 0.894426f, 0.447216f, 0.000000f, 0.646443f, 0.311386f, - 0.951058f, 0.000000f, -0.309013f, 0.000000f, 0.951058f, 0.000000f, -0.309013f, 0.491338f, 0.479977f, - 0.587786f, 0.000000f, -0.809017f, 0.000000f, 0.587786f, 0.000000f, -0.809017f, 0.446597f, 0.804967f, - 0.688189f, 0.525736f, -0.499997f, 0.000000f, 0.688189f, 0.525736f, -0.499997f, 0.146443f, 0.688614f, - 0.587786f, 0.000000f, -0.809017f, 0.000000f, 0.587786f, 0.000000f, -0.809017f, 0.446597f, 0.804967f, - 0.276388f, 0.447220f, -0.850649f, 0.000000f, 0.276388f, 0.447220f, -0.850649f, 0.542767f, 0.333057f, - 0.688189f, 0.525736f, -0.499997f, 0.000000f, 0.688189f, 0.525736f, -0.499997f, 0.146443f, 0.688614f, - 0.162456f, 0.850654f, 0.499995f, 0.000000f, 0.162456f, 0.850654f, 0.499995f, 0.836927f, 0.658241f, - 0.525730f, 0.850652f, 0.000000f, 0.000000f, 0.525730f, 0.850652f, 0.000000f, 0.046072f, 0.843098f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.591499f, 0.483164f, - 0.162456f, 0.850654f, 0.499995f, 0.000000f, 0.162456f, 0.850654f, 0.499995f, 0.836927f, 0.658241f, - 0.688189f, 0.525736f, 0.499997f, 0.000000f, 0.688189f, 0.525736f, 0.499997f, 0.246383f, 0.648358f, - 0.525730f, 0.850652f, 0.000000f, 0.000000f, 0.525730f, 0.850652f, 0.000000f, 0.046072f, 0.843098f, - 0.688189f, 0.525736f, 0.499997f, 0.000000f, 0.688189f, 0.525736f, 0.499997f, 0.246383f, 0.648358f, - 0.894426f, 0.447216f, 0.000000f, 0.000000f, 0.894426f, 0.447216f, 0.000000f, 0.646443f, 0.311386f, - 0.525730f, 0.850652f, 0.000000f, 0.000000f, 0.525730f, 0.850652f, 0.000000f, 0.046072f, 0.843098f, - -0.425323f, 0.850654f, 0.309011f, 0.000000f, -0.425323f, 0.850654f, 0.309011f, 0.938926f, 0.694863f, - 0.162456f, 0.850654f, 0.499995f, 0.000000f, 0.162456f, 0.850654f, 0.499995f, 0.836927f, 0.658241f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.591499f, 0.483164f, - -0.425323f, 0.850654f, 0.309011f, 0.000000f, -0.425323f, 0.850654f, 0.309011f, 0.938926f, 0.694863f, - -0.262869f, 0.525738f, 0.809012f, 0.000000f, -0.262869f, 0.525738f, 0.809012f, 0.346308f, 0.665057f, - 0.162456f, 0.850654f, 0.499995f, 0.000000f, 0.162456f, 0.850654f, 0.499995f, 0.836927f, 0.658241f, - -0.262869f, 0.525738f, 0.809012f, 0.000000f, -0.262869f, 0.525738f, 0.809012f, 0.346308f, 0.665057f, - 0.276388f, 0.447220f, 0.850649f, 0.000000f, 0.276388f, 0.447220f, 0.850649f, 1.129692f, 0.189429f, - 0.162456f, 0.850654f, 0.499995f, 0.000000f, 0.162456f, 0.850654f, 0.499995f, 0.836927f, 0.658241f, - -0.425323f, 0.850654f, -0.309011f, 0.000000f, -0.425323f, 0.850654f, -0.309011f, 0.826823f, 0.833914f, - -0.425323f, 0.850654f, 0.309011f, 0.000000f, -0.425323f, 0.850654f, 0.309011f, 0.938926f, 0.694863f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.591499f, 0.483164f, - -0.425323f, 0.850654f, -0.309011f, 0.000000f, -0.425323f, 0.850654f, -0.309011f, 0.826823f, 0.833914f, - -0.850648f, 0.525736f, 0.000000f, 0.000000f, -0.850648f, 0.525736f, 0.000000f, 0.257596f, 0.823860f, - -0.425323f, 0.850654f, 0.309011f, 0.000000f, -0.425323f, 0.850654f, 0.309011f, 0.938926f, 0.694863f, - -0.850648f, 0.525736f, 0.000000f, 0.000000f, -0.850648f, 0.525736f, 0.000000f, 0.257596f, 0.823860f, - -0.723607f, 0.447220f, 0.525725f, 0.000000f, -0.723607f, 0.447220f, 0.525725f, 0.946597f, 0.195033f, - -0.425323f, 0.850654f, 0.309011f, 0.000000f, -0.425323f, 0.850654f, 0.309011f, 0.938926f, 0.694863f, - 0.162456f, 0.850654f, -0.499995f, 0.000000f, 0.162456f, 0.850654f, -0.499995f, 0.326823f, 0.166086f, - -0.425323f, 0.850654f, -0.309011f, 0.000000f, -0.425323f, 0.850654f, -0.309011f, 0.826823f, 0.833914f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.591499f, 0.483164f, - 0.162456f, 0.850654f, -0.499995f, 0.000000f, 0.162456f, 0.850654f, -0.499995f, 0.326823f, 0.166086f, - -0.262869f, 0.525738f, -0.809012f, 0.000000f, -0.262869f, 0.525738f, -0.809012f, 0.042767f, 0.666943f, - -0.425323f, 0.850654f, -0.309011f, 0.000000f, -0.425323f, 0.850654f, -0.309011f, 0.826823f, 0.833914f, - -0.262869f, 0.525738f, -0.809012f, 0.000000f, -0.262869f, 0.525738f, -0.809012f, 0.042767f, 0.666943f, - -0.723607f, 0.447220f, -0.525725f, 0.000000f, -0.723607f, 0.447220f, -0.525725f, 0.791278f, 0.505149f, - -0.425323f, 0.850654f, -0.309011f, 0.000000f, -0.425323f, 0.850654f, -0.309011f, 0.826823f, 0.833914f, - 0.525730f, 0.850652f, 0.000000f, 0.000000f, 0.525730f, 0.850652f, 0.000000f, 0.046072f, 0.843098f, - 0.162456f, 0.850654f, -0.499995f, 0.000000f, 0.162456f, 0.850654f, -0.499995f, 0.326823f, 0.166086f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.591499f, 0.483164f, - 0.525730f, 0.850652f, 0.000000f, 0.000000f, 0.525730f, 0.850652f, 0.000000f, 0.046072f, 0.843098f, - 0.688189f, 0.525736f, -0.499997f, 0.000000f, 0.688189f, 0.525736f, -0.499997f, 0.146443f, 0.688614f, - 0.162456f, 0.850654f, -0.499995f, 0.000000f, 0.162456f, 0.850654f, -0.499995f, 0.326823f, 0.166086f, - 0.688189f, 0.525736f, -0.499997f, 0.000000f, 0.688189f, 0.525736f, -0.499997f, 0.146443f, 0.688614f, - 0.276388f, 0.447220f, -0.850649f, 0.000000f, 0.276388f, 0.447220f, -0.850649f, 0.542767f, 0.333057f, - 0.162456f, 0.850654f, -0.499995f, 0.000000f, 0.162456f, 0.850654f, -0.499995f, 0.326823f, 0.166086f}; - -const int low_sphere_indices[] = - { - 0, 1, 2, - 3, 4, 5, - 6, 7, 8, - 9, 10, 11, - 12, 13, 14, - 15, 16, 17, - 18, 19, 20, - 21, 22, 23, - 24, 25, 26, - 27, 28, 29, - 30, 31, 32, - 33, 34, 35, - 36, 37, 38, - 39, 40, 41, - 42, 43, 44, - 45, 46, 47, - 48, 49, 50, - 51, 52, 53, - 54, 55, 56, - 57, 58, 59, - 60, 61, 62, - 63, 64, 65, - 66, 67, 68, - 69, 70, 71, - 72, 73, 74, - 75, 76, 77, - 78, 79, 80, - 81, 82, 83, - 84, 85, 86, - 87, 88, 89, - 90, 91, 92, - 93, 94, 95, - 96, 97, 98, - 99, 100, 101, - 102, 103, 104, - 105, 106, 107, - 108, 109, 110, - 111, 112, 113, - 114, 115, 116, - 117, 118, 119, - 120, 121, 122, - 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}; - -const float point_sphere_vertices[] = - { - 0.000000, - 0.000000, - 0.000000, - 0.000000, - 0.000000, - -1.000000, - 0.000000, - 0.48f, - 0.48f, -}; - -const int point_sphere_indices[] = - { - 0}; - -const float textured_detailed_sphere_vertices[] = - { - -0.493414f, - -0.080891f, - 0.000000f, - 0.000000f, - -0.986900f, - -0.161200f, - 0.000000f, - 1.000000f, - 0.448300f, - -0.499267f, - -0.027069f, - 0.000000f, - 0.000000f, - -0.998500f, - -0.054000f, - 0.000000f, - 1.000000f, - 0.482800f, - -0.489673f, - -0.027069f, - -0.097402f, - 0.000000f, - -0.979300f, - -0.054000f, - -0.194800f, - 0.968800f, - 0.482800f, - -0.493414f, - -0.080891f, - 0.000000f, - 0.000000f, - -0.986900f, - -0.161200f, - 0.000000f, - 1.000000f, - 0.448300f, - -0.489673f, - -0.027069f, - -0.097402f, - 0.000000f, - -0.979300f, - -0.054000f, - -0.194800f, - 0.968800f, - 0.482800f, - -0.483932f, - -0.080891f, - -0.096260f, - 0.000000f, - -0.967900f, - -0.161200f, - -0.192500f, - 0.968800f, - 0.448300f, - -0.159651f, - 0.473826f, - 0.000000f, - 0.000000f, - -0.322300f, - 0.946600f, - 0.000000f, - 1.000000f, - 0.896600f, - -0.107485f, - 0.488310f, - 0.000000f, - 0.000000f, - -0.218200f, - 0.975900f, - 0.000000f, - 1.000000f, - 0.931000f, - -0.105420f, - 0.488310f, - -0.020969f, - 0.000000f, - -0.214000f, - 0.975900f, - -0.042500f, - 0.968800f, - 0.931000f, - -0.159651f, - 0.473826f, - 0.000000f, - 0.000000f, - -0.322300f, - 0.946600f, - 0.000000f, - 1.000000f, - 0.896600f, - -0.105420f, - 0.488310f, - -0.020969f, - 0.000000f, - -0.214000f, - 0.975900f, - -0.042500f, - 0.968800f, - 0.931000f, - -0.156583f, - 0.473826f, - -0.031146f, - 0.000000f, - -0.316100f, - 0.946600f, - -0.062900f, - 0.968800f, - 0.896600f, - -0.481775f, - -0.133764f, - 0.000000f, - 0.000000f, - -0.963800f, - -0.266600f, - 0.000000f, - 1.000000f, - 0.413800f, - -0.493414f, - -0.080891f, - 0.000000f, - 0.000000f, - -0.986900f, - -0.161200f, - 0.000000f, - 1.000000f, - 0.448300f, - -0.483932f, - -0.080891f, - -0.096260f, - 0.000000f, - -0.967900f, - -0.161200f, - -0.192500f, - 0.968800f, - 0.448300f, - -0.481775f, - -0.133764f, - 0.000000f, - 0.000000f, - -0.963800f, - -0.266600f, - 0.000000f, - 1.000000f, - 0.413800f, - -0.483932f, - -0.080891f, - -0.096260f, - 0.000000f, - -0.967900f, - -0.161200f, - -0.192500f, - 0.968800f, - 0.448300f, - -0.472518f, - -0.133764f, - -0.093989f, - 0.000000f, - -0.945200f, - -0.266600f, - -0.188000f, - 0.968800f, - 0.413800f, - -0.209945f, - 0.453788f, - 0.000000f, - 0.000000f, - -0.422700f, - 0.906300f, - 0.000000f, - 1.000000f, - 0.862100f, - -0.159651f, - 0.473826f, - 0.000000f, - 0.000000f, - -0.322300f, - 0.946600f, - 0.000000f, - 1.000000f, - 0.896600f, - -0.156583f, - 0.473826f, - -0.031146f, - 0.000000f, - -0.316100f, - 0.946600f, - -0.062900f, - 0.968800f, - 0.896600f, - -0.209945f, - 0.453788f, - 0.000000f, - 0.000000f, - -0.422700f, - 0.906300f, - 0.000000f, - 1.000000f, - 0.862100f, - -0.156583f, - 0.473826f, - -0.031146f, - 0.000000f, - -0.316100f, - 0.946600f, - -0.062900f, - 0.968800f, - 0.896600f, - -0.205911f, - 0.453788f, - -0.040958f, - 0.000000f, - -0.414500f, - 0.906300f, - -0.082400f, - 0.968800f, - 0.862100f, - -0.464489f, - -0.185069f, - 0.000000f, - 0.000000f, - -0.929400f, - -0.369000f, - 0.000000f, - 1.000000f, - 0.379300f, - -0.481775f, - -0.133764f, - 0.000000f, - 0.000000f, - -0.963800f, - -0.266600f, - 0.000000f, - 1.000000f, - 0.413800f, - -0.472518f, - -0.133764f, - -0.093989f, - 0.000000f, - -0.945200f, - -0.266600f, - -0.188000f, - 0.968800f, - 0.413800f, - -0.464489f, - -0.185069f, - 0.000000f, - 0.000000f, - -0.929400f, - -0.369000f, - 0.000000f, - 1.000000f, - 0.379300f, - -0.472518f, - -0.133764f, - -0.093989f, - 0.000000f, - -0.945200f, - -0.266600f, - -0.188000f, - 0.968800f, - 0.413800f, - -0.455563f, - -0.185069f, - -0.090617f, - 0.000000f, - -0.911600f, - -0.369000f, - -0.181300f, - 0.968800f, - 0.379300f, - -0.257777f, - 0.428429f, - 0.000000f, - 0.000000f, - -0.518000f, - 0.855300f, - 0.000000f, - 1.000000f, - 0.827600f, - -0.209945f, - 0.453788f, - 0.000000f, - 0.000000f, - -0.422700f, - 0.906300f, - 0.000000f, - 1.000000f, - 0.862100f, - -0.205911f, - 0.453788f, - -0.040958f, - 0.000000f, - -0.414500f, - 0.906300f, - -0.082400f, - 0.968800f, - 0.862100f, - -0.257777f, - 0.428429f, - 0.000000f, - 0.000000f, - -0.518000f, - 0.855300f, - 0.000000f, - 1.000000f, - 0.827600f, - -0.205911f, - 0.453788f, - -0.040958f, - 0.000000f, - -0.414500f, - 0.906300f, - -0.082400f, - 0.968800f, - 0.862100f, - -0.252824f, - 0.428429f, - -0.050290f, - 0.000000f, - -0.508100f, - 0.855300f, - -0.101000f, - 0.968800f, - 0.827600f, - -0.441756f, - -0.234204f, - 0.000000f, - 0.000000f, - -0.884200f, - -0.467000f, - 0.000000f, - 1.000000f, - 0.344800f, - -0.464489f, - -0.185069f, - 0.000000f, - 0.000000f, - -0.929400f, - -0.369000f, - 0.000000f, - 1.000000f, - 0.379300f, - -0.455563f, - -0.185069f, - -0.090617f, - 0.000000f, - -0.911600f, - -0.369000f, - -0.181300f, - 0.968800f, - 0.379300f, - -0.441756f, - -0.234204f, - 0.000000f, - 0.000000f, - -0.884200f, - -0.467000f, - 0.000000f, - 1.000000f, - 0.344800f, - -0.455563f, - -0.185069f, - -0.090617f, - 0.000000f, - -0.911600f, - -0.369000f, - -0.181300f, - 0.968800f, - 0.379300f, - -0.433268f, - -0.234204f, - -0.086182f, - 0.000000f, - -0.867200f, - -0.467000f, - -0.172500f, - 0.968800f, - 0.344800f, - -0.302587f, - 0.398046f, - 0.000000f, - 0.000000f, - -0.607300f, - 0.794500f, - 0.000000f, - 1.000000f, - 0.793100f, - -0.257777f, - 0.428429f, - 0.000000f, - 0.000000f, - -0.518000f, - 0.855300f, - 0.000000f, - 1.000000f, - 0.827600f, - -0.252824f, - 0.428429f, - -0.050290f, - 0.000000f, - -0.508100f, - 0.855300f, - -0.101000f, - 0.968800f, - 0.827600f, - -0.302587f, - 0.398046f, - 0.000000f, - 0.000000f, - -0.607300f, - 0.794500f, - 0.000000f, - 1.000000f, - 0.793100f, - -0.252824f, - 0.428429f, - -0.050290f, - 0.000000f, - -0.508100f, - 0.855300f, - -0.101000f, - 0.968800f, - 0.827600f, - -0.296773f, - 0.398046f, - -0.059032f, - 0.000000f, - -0.595600f, - 0.794500f, - -0.118500f, - 0.968800f, - 0.793100f, - -0.413844f, - -0.280594f, - 0.000000f, - 0.000000f, - -0.828700f, - -0.559600f, - 0.000000f, - 1.000000f, - 0.310300f, - -0.441756f, - -0.234204f, - 0.000000f, - 0.000000f, - -0.884200f, - -0.467000f, - 0.000000f, - 1.000000f, - 0.344800f, - -0.433268f, - -0.234204f, - -0.086182f, - 0.000000f, - -0.867200f, - -0.467000f, - -0.172500f, - 0.968800f, - 0.344800f, - -0.413844f, - -0.280594f, - 0.000000f, - 0.000000f, - -0.828700f, - -0.559600f, - 0.000000f, - 1.000000f, - 0.310300f, - -0.433268f, - -0.234204f, - -0.086182f, - 0.000000f, - -0.867200f, - -0.467000f, - -0.172500f, - 0.968800f, - 0.344800f, - -0.405892f, - -0.280594f, - -0.080737f, - 0.000000f, - -0.812800f, - -0.559600f, - -0.161700f, - 0.968800f, - 0.310300f, - -0.343850f, - 0.362998f, - 0.000000f, - 0.000000f, - -0.689400f, - 0.724300f, - 0.000000f, - 1.000000f, - 0.758600f, - -0.302587f, - 0.398046f, - 0.000000f, - 0.000000f, - -0.607300f, - 0.794500f, - 0.000000f, - 1.000000f, - 0.793100f, - -0.296773f, - 0.398046f, - -0.059032f, - 0.000000f, - -0.595600f, - 0.794500f, - -0.118500f, - 0.968800f, - 0.793100f, - -0.343850f, - 0.362998f, - 0.000000f, - 0.000000f, - -0.689400f, - 0.724300f, - 0.000000f, - 1.000000f, - 0.758600f, - -0.296773f, - 0.398046f, - -0.059032f, - 0.000000f, - -0.595600f, - 0.794500f, - -0.118500f, - 0.968800f, - 0.793100f, - -0.337243f, - 0.362998f, - -0.067082f, - 0.000000f, - -0.676200f, - 0.724300f, - -0.134500f, - 0.968800f, - 0.758600f, - -0.381081f, - -0.323693f, - 0.000000f, - 0.000000f, - -0.763500f, - -0.645700f, - 0.000000f, - 1.000000f, - 0.275900f, - -0.413844f, - -0.280594f, - 0.000000f, - 0.000000f, - -0.828700f, - -0.559600f, - 0.000000f, - 1.000000f, - 0.310300f, - -0.405892f, - -0.280594f, - -0.080737f, - 0.000000f, - -0.812800f, - -0.559600f, - -0.161700f, - 0.968800f, - 0.310300f, - -0.381081f, - -0.323693f, - 0.000000f, - 0.000000f, - -0.763500f, - -0.645700f, - 0.000000f, - 1.000000f, - 0.275900f, - -0.405892f, - -0.280594f, - -0.080737f, - 0.000000f, - -0.812800f, - -0.559600f, - -0.161700f, - 0.968800f, - 0.310300f, - -0.373759f, - -0.323693f, - -0.074345f, - 0.000000f, - -0.748900f, - -0.645700f, - -0.149000f, - 0.968800f, - 0.275900f, - -0.381081f, - 0.323693f, - 0.000000f, - 0.000000f, - -0.763500f, - 0.645700f, - 0.000000f, - 1.000000f, - 0.724100f, - -0.343850f, - 0.362998f, - 0.000000f, - 0.000000f, - -0.689400f, - 0.724300f, - 0.000000f, - 1.000000f, - 0.758600f, - -0.337243f, - 0.362998f, - -0.067082f, - 0.000000f, - -0.676200f, - 0.724300f, - -0.134500f, - 0.968800f, - 0.758600f, - -0.381081f, - 0.323693f, - 0.000000f, - 0.000000f, - -0.763500f, - 0.645700f, - 0.000000f, - 1.000000f, - 0.724100f, - -0.337243f, - 0.362998f, - -0.067082f, - 0.000000f, - -0.676200f, - 0.724300f, - -0.134500f, - 0.968800f, - 0.758600f, - -0.373758f, - 0.323693f, - -0.074345f, - 0.000000f, - -0.748900f, - 0.645700f, - -0.149000f, - 0.968800f, - 0.724100f, - -0.343850f, - -0.362998f, - 0.000000f, - 0.000000f, - -0.689400f, - -0.724300f, - 0.000000f, - 1.000000f, - 0.241400f, - -0.381081f, - -0.323693f, - 0.000000f, - 0.000000f, - -0.763500f, - -0.645700f, - 0.000000f, - 1.000000f, - 0.275900f, - -0.373759f, - -0.323693f, - -0.074345f, - 0.000000f, - -0.748900f, - -0.645700f, - -0.149000f, - 0.968800f, - 0.275900f, - -0.343850f, - -0.362998f, - 0.000000f, - 0.000000f, - -0.689400f, - -0.724300f, - 0.000000f, - 1.000000f, - 0.241400f, - -0.373759f, - -0.323693f, - -0.074345f, - 0.000000f, - -0.748900f, - -0.645700f, - -0.149000f, - 0.968800f, - 0.275900f, - -0.337243f, - -0.362998f, - -0.067082f, - 0.000000f, - -0.676200f, - -0.724300f, - -0.134500f, - 0.968800f, - 0.241400f, - -0.413844f, - 0.280594f, - 0.000000f, - 0.000000f, - -0.828700f, - 0.559600f, - 0.000000f, - 1.000000f, - 0.689700f, - -0.381081f, - 0.323693f, - 0.000000f, - 0.000000f, - -0.763500f, - 0.645700f, - 0.000000f, - 1.000000f, - 0.724100f, - -0.373758f, - 0.323693f, - -0.074345f, - 0.000000f, - -0.748900f, - 0.645700f, - -0.149000f, - 0.968800f, - 0.724100f, - -0.413844f, - 0.280594f, - 0.000000f, - 0.000000f, - -0.828700f, - 0.559600f, - 0.000000f, - 1.000000f, - 0.689700f, - -0.373758f, - 0.323693f, - -0.074345f, - 0.000000f, - -0.748900f, - 0.645700f, - -0.149000f, - 0.968800f, - 0.724100f, - -0.405892f, - 0.280594f, - -0.080737f, - 0.000000f, - -0.812800f, - 0.559600f, - -0.161700f, - 0.968800f, - 0.689700f, - -0.302588f, - -0.398046f, - 0.000000f, - 0.000000f, - -0.607300f, - -0.794500f, - 0.000000f, - 1.000000f, - 0.206900f, - -0.343850f, - -0.362998f, - 0.000000f, - 0.000000f, - -0.689400f, - -0.724300f, - 0.000000f, - 1.000000f, - 0.241400f, - -0.337243f, - -0.362998f, - -0.067082f, - 0.000000f, - -0.676200f, - -0.724300f, - -0.134500f, - 0.968800f, - 0.241400f, - -0.302588f, - -0.398046f, - 0.000000f, - 0.000000f, - -0.607300f, - -0.794500f, - 0.000000f, - 1.000000f, - 0.206900f, - -0.337243f, - -0.362998f, - -0.067082f, - 0.000000f, - -0.676200f, - -0.724300f, - -0.134500f, - 0.968800f, - 0.241400f, - -0.296773f, - -0.398046f, - -0.059032f, - 0.000000f, - -0.595600f, - -0.794500f, - -0.118500f, - 0.968800f, - 0.206900f, - -0.441756f, - 0.234204f, - 0.000000f, - 0.000000f, - -0.884200f, - 0.467000f, - 0.000000f, - 1.000000f, - 0.655200f, - -0.413844f, - 0.280594f, - 0.000000f, - 0.000000f, - -0.828700f, - 0.559600f, - 0.000000f, - 1.000000f, - 0.689700f, - -0.405892f, - 0.280594f, - -0.080737f, - 0.000000f, - -0.812800f, - 0.559600f, - -0.161700f, - 0.968800f, - 0.689700f, - -0.441756f, - 0.234204f, - 0.000000f, - 0.000000f, - -0.884200f, - 0.467000f, - 0.000000f, - 1.000000f, - 0.655200f, - -0.405892f, - 0.280594f, - -0.080737f, - 0.000000f, - -0.812800f, - 0.559600f, - -0.161700f, - 0.968800f, - 0.689700f, - -0.433268f, - 0.234204f, - -0.086182f, - 0.000000f, - -0.867200f, - 0.467000f, - -0.172500f, - 0.968800f, - 0.655200f, - -0.257777f, - -0.428429f, - 0.000000f, - 0.000000f, - -0.518000f, - -0.855300f, - 0.000000f, - 1.000000f, - 0.172400f, - -0.302588f, - -0.398046f, - 0.000000f, - 0.000000f, - -0.607300f, - -0.794500f, - 0.000000f, - 1.000000f, - 0.206900f, - -0.296773f, - -0.398046f, - -0.059032f, - 0.000000f, - -0.595600f, - -0.794500f, - -0.118500f, - 0.968800f, - 0.206900f, - -0.257777f, - -0.428429f, - 0.000000f, - 0.000000f, - -0.518000f, - -0.855300f, - 0.000000f, - 1.000000f, - 0.172400f, - -0.296773f, - -0.398046f, - -0.059032f, - 0.000000f, - -0.595600f, - -0.794500f, - -0.118500f, - 0.968800f, - 0.206900f, - -0.252824f, - -0.428429f, - -0.050290f, - 0.000000f, - -0.508100f, - -0.855300f, - -0.101000f, - 0.968800f, - 0.172400f, - -0.464489f, - 0.185069f, - 0.000000f, - 0.000000f, - -0.929400f, - 0.369000f, - 0.000000f, - 1.000000f, - 0.620700f, - -0.441756f, - 0.234204f, - 0.000000f, - 0.000000f, - -0.884200f, - 0.467000f, - 0.000000f, - 1.000000f, - 0.655200f, - -0.433268f, - 0.234204f, - -0.086182f, - 0.000000f, - -0.867200f, - 0.467000f, - -0.172500f, - 0.968800f, - 0.655200f, - -0.464489f, - 0.185069f, - 0.000000f, - 0.000000f, - -0.929400f, - 0.369000f, - 0.000000f, - 1.000000f, - 0.620700f, - -0.433268f, - 0.234204f, - -0.086182f, - 0.000000f, - -0.867200f, - 0.467000f, - -0.172500f, - 0.968800f, - 0.655200f, - -0.455563f, - 0.185069f, - -0.090617f, - 0.000000f, - -0.911600f, - 0.369000f, - -0.181300f, - 0.968800f, - 0.620700f, - -0.209945f, - -0.453788f, - 0.000000f, - 0.000000f, - -0.422700f, - -0.906300f, - 0.000000f, - 1.000000f, - 0.137900f, - -0.257777f, - -0.428429f, - 0.000000f, - 0.000000f, - -0.518000f, - -0.855300f, - 0.000000f, - 1.000000f, - 0.172400f, - -0.252824f, - -0.428429f, - -0.050290f, - 0.000000f, - -0.508100f, - -0.855300f, - -0.101000f, - 0.968800f, - 0.172400f, - -0.209945f, - -0.453788f, - 0.000000f, - 0.000000f, - -0.422700f, - -0.906300f, - 0.000000f, - 1.000000f, - 0.137900f, - -0.252824f, - -0.428429f, - -0.050290f, - 0.000000f, - -0.508100f, - -0.855300f, - -0.101000f, - 0.968800f, - 0.172400f, - -0.205911f, - -0.453788f, - -0.040958f, - 0.000000f, - -0.414500f, - -0.906300f, - -0.082400f, - 0.968800f, - 0.137900f, - -0.481775f, - 0.133764f, - 0.000000f, - 0.000000f, - -0.963800f, - 0.266600f, - 0.000000f, - 1.000000f, - 0.586200f, - -0.464489f, - 0.185069f, - 0.000000f, - 0.000000f, - -0.929400f, - 0.369000f, - 0.000000f, - 1.000000f, - 0.620700f, - -0.455563f, - 0.185069f, - -0.090617f, - 0.000000f, - -0.911600f, - 0.369000f, - -0.181300f, - 0.968800f, - 0.620700f, - -0.481775f, - 0.133764f, - 0.000000f, - 0.000000f, - -0.963800f, - 0.266600f, - 0.000000f, - 1.000000f, - 0.586200f, - -0.455563f, - 0.185069f, - -0.090617f, - 0.000000f, - -0.911600f, - 0.369000f, - -0.181300f, - 0.968800f, - 0.620700f, - -0.472518f, - 0.133764f, - -0.093989f, - 0.000000f, - -0.945200f, - 0.266600f, - -0.188000f, - 0.968800f, - 0.586200f, - -0.159651f, - -0.473826f, - 0.000000f, - 0.000000f, - -0.322300f, - -0.946600f, - 0.000000f, - 1.000000f, - 0.103400f, - -0.209945f, - -0.453788f, - 0.000000f, - 0.000000f, - -0.422700f, - -0.906300f, - 0.000000f, - 1.000000f, - 0.137900f, - -0.205911f, - -0.453788f, - -0.040958f, - 0.000000f, - -0.414500f, - -0.906300f, - -0.082400f, - 0.968800f, - 0.137900f, - -0.159651f, - -0.473826f, - 0.000000f, - 0.000000f, - -0.322300f, - -0.946600f, - 0.000000f, - 1.000000f, - 0.103400f, - -0.205911f, - -0.453788f, - -0.040958f, - 0.000000f, - -0.414500f, - -0.906300f, - -0.082400f, - 0.968800f, - 0.137900f, - -0.156584f, - -0.473826f, - -0.031147f, - 0.000000f, - -0.316100f, - -0.946600f, - -0.062900f, - 0.968800f, - 0.103400f, - -0.493414f, - 0.080891f, - 0.000000f, - 0.000000f, - -0.986900f, - 0.161200f, - 0.000000f, - 1.000000f, - 0.551700f, - -0.481775f, - 0.133764f, - 0.000000f, - 0.000000f, - -0.963800f, - 0.266600f, - 0.000000f, - 1.000000f, - 0.586200f, - -0.472518f, - 0.133764f, - -0.093989f, - 0.000000f, - -0.945200f, - 0.266600f, - -0.188000f, - 0.968800f, - 0.586200f, - -0.493414f, - 0.080891f, - 0.000000f, - 0.000000f, - -0.986900f, - 0.161200f, - 0.000000f, - 1.000000f, - 0.551700f, - -0.472518f, - 0.133764f, - -0.093989f, - 0.000000f, - -0.945200f, - 0.266600f, - -0.188000f, - 0.968800f, - 0.586200f, - -0.483932f, - 0.080891f, - -0.096260f, - 0.000000f, - -0.967900f, - 0.161200f, - -0.192500f, - 0.968800f, - 0.551700f, - -0.107486f, - -0.488310f, - 0.000000f, - 0.000000f, - -0.218200f, - -0.975900f, - 0.000000f, - 1.000000f, - 0.069000f, - -0.159651f, - -0.473826f, - 0.000000f, - 0.000000f, - -0.322300f, - -0.946600f, - 0.000000f, - 1.000000f, - 0.103400f, - -0.156584f, - -0.473826f, - -0.031147f, - 0.000000f, - -0.316100f, - -0.946600f, - -0.062900f, - 0.968800f, - 0.103400f, - -0.107486f, - -0.488310f, - 0.000000f, - 0.000000f, - -0.218200f, - -0.975900f, - 0.000000f, - 1.000000f, - 0.069000f, - -0.156584f, - -0.473826f, - -0.031147f, - 0.000000f, - -0.316100f, - -0.946600f, - -0.062900f, - 0.968800f, - 0.103400f, - -0.105421f, - -0.488310f, - -0.020970f, - 0.000000f, - -0.214000f, - -0.975900f, - -0.042500f, - 0.968800f, - 0.069000f, - -0.499267f, - 0.027069f, - 0.000000f, - 0.000000f, - -0.998500f, - 0.054000f, - 0.000000f, - 1.000000f, - 0.517200f, - -0.493414f, - 0.080891f, - 0.000000f, - 0.000000f, - -0.986900f, - 0.161200f, - 0.000000f, - 1.000000f, - 0.551700f, - -0.483932f, - 0.080891f, - -0.096260f, - 0.000000f, - -0.967900f, - 0.161200f, - -0.192500f, - 0.968800f, - 0.551700f, - -0.499267f, - 0.027069f, - 0.000000f, - 0.000000f, - -0.998500f, - 0.054000f, - 0.000000f, - 1.000000f, - 0.517200f, - -0.483932f, - 0.080891f, - -0.096260f, - 0.000000f, - -0.967900f, - 0.161200f, - -0.192500f, - 0.968800f, - 0.551700f, - -0.489673f, - 0.027069f, - -0.097402f, - 0.000000f, - -0.979300f, - 0.054000f, - -0.194800f, - 0.968800f, - 0.517200f, - -0.054060f, - 0.497069f, - 0.000000f, - 0.000000f, - -0.111500f, - 0.993700f, - 0.000000f, - 0.427200f, - 0.962300f, - -0.000000f, - 0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - 1.000000f, - 0.000000f, - 0.423900f, - 0.960300f, - -0.053021f, - 0.497069f, - -0.010546f, - 0.000000f, - -0.109300f, - 0.993700f, - -0.021700f, - 0.429000f, - 0.962300f, - -0.054060f, - -0.497069f, - 0.000000f, - 0.000000f, - -0.111500f, - -0.993700f, - 0.000000f, - 1.000000f, - 0.034500f, - -0.107486f, - -0.488310f, - 0.000000f, - 0.000000f, - -0.218200f, - -0.975900f, - 0.000000f, - 1.000000f, - 0.069000f, - -0.105421f, - -0.488310f, - -0.020970f, - 0.000000f, - -0.214000f, - -0.975900f, - -0.042500f, - 0.968800f, - 0.069000f, - -0.054060f, - -0.497069f, - 0.000000f, - 0.000000f, - -0.111500f, - -0.993700f, - 0.000000f, - 1.000000f, - 0.034500f, - -0.105421f, - -0.488310f, - -0.020970f, - 0.000000f, - -0.214000f, - -0.975900f, - -0.042500f, - 0.968800f, - 0.069000f, - -0.053021f, - -0.497069f, - -0.010546f, - 0.000000f, - -0.109300f, - -0.993700f, - -0.021700f, - 0.968800f, - 0.034500f, - -0.499267f, - -0.027069f, - 0.000000f, - 0.000000f, - -0.998500f, - -0.054000f, - 0.000000f, - 1.000000f, - 0.482800f, - -0.499267f, - 0.027069f, - 0.000000f, - 0.000000f, - -0.998500f, - 0.054000f, - 0.000000f, - 1.000000f, - 0.517200f, - -0.489673f, - 0.027069f, - -0.097402f, - 0.000000f, - -0.979300f, - 0.054000f, - -0.194800f, - 0.968800f, - 0.517200f, - -0.499267f, - -0.027069f, - 0.000000f, - 0.000000f, - -0.998500f, - -0.054000f, - 0.000000f, - 1.000000f, - 0.482800f, - -0.489673f, - 0.027069f, - -0.097402f, - 0.000000f, - -0.979300f, - 0.054000f, - -0.194800f, - 0.968800f, - 0.517200f, - -0.489673f, - -0.027069f, - -0.097402f, - 0.000000f, - -0.979300f, - -0.054000f, - -0.194800f, - 0.968800f, - 0.482800f, - -0.107485f, - 0.488310f, - 0.000000f, - 0.000000f, - -0.218200f, - 0.975900f, - 0.000000f, - 1.000000f, - 0.931000f, - -0.054060f, - 0.497069f, - 0.000000f, - 0.000000f, - -0.111500f, - 0.993700f, - 0.000000f, - 1.000000f, - 0.965500f, - -0.053021f, - 0.497069f, - -0.010546f, - 0.000000f, - -0.109300f, - 0.993700f, - -0.021700f, - 0.968800f, - 0.965500f, - -0.107485f, - 0.488310f, - 0.000000f, - 0.000000f, - -0.218200f, - 0.975900f, - 0.000000f, - 1.000000f, - 0.931000f, - -0.053021f, - 0.497069f, - -0.010546f, - 0.000000f, - -0.109300f, - 0.993700f, - -0.021700f, - 0.968800f, - 0.965500f, - -0.105420f, - 0.488310f, - -0.020969f, - 0.000000f, - -0.214000f, - 0.975900f, - -0.042500f, - 0.968800f, - 0.931000f, - -0.000000f, - -0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - -1.000000f, - 0.000000f, - 0.495500f, - 0.051000f, - -0.054060f, - -0.497069f, - 0.000000f, - 0.000000f, - -0.111500f, - -0.993700f, - 0.000000f, - 0.494200f, - 0.053800f, - -0.053021f, - -0.497069f, - -0.010546f, - 0.000000f, - -0.109300f, - -0.993700f, - -0.021700f, - 0.491600f, - 0.053800f, - -0.489673f, - 0.027069f, - -0.097402f, - 0.000000f, - -0.979300f, - 0.054000f, - -0.194800f, - 0.968800f, - 0.517200f, - -0.483932f, - 0.080891f, - -0.096260f, - 0.000000f, - -0.967900f, - 0.161200f, - -0.192500f, - 0.968800f, - 0.551700f, - -0.455855f, - 0.080891f, - -0.188821f, - 0.000000f, - -0.911800f, - 0.161200f, - -0.377700f, - 0.937500f, - 0.551700f, - -0.489673f, - 0.027069f, - -0.097402f, - 0.000000f, - -0.979300f, - 0.054000f, - -0.194800f, - 0.968800f, - 0.517200f, - -0.455855f, - 0.080891f, - -0.188821f, - 0.000000f, - -0.911800f, - 0.161200f, - -0.377700f, - 0.937500f, - 0.551700f, - -0.461262f, - 0.027069f, - -0.191061f, - 0.000000f, - -0.922500f, - 0.054000f, - -0.382100f, - 0.937500f, - 0.517200f, - -0.053021f, - 0.497069f, - -0.010546f, - 0.000000f, - -0.109300f, - 0.993700f, - -0.021700f, - 0.429000f, - 0.962300f, - -0.000000f, - 0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - 1.000000f, - 0.000000f, - 0.423900f, - 0.960300f, - -0.049945f, - 0.497069f, - -0.020688f, - 0.000000f, - -0.103000f, - 0.993700f, - -0.042600f, - 0.430800f, - 0.962300f, - -0.053021f, - -0.497069f, - -0.010546f, - 0.000000f, - -0.109300f, - -0.993700f, - -0.021700f, - 0.968800f, - 0.034500f, - -0.105421f, - -0.488310f, - -0.020970f, - 0.000000f, - -0.214000f, - -0.975900f, - -0.042500f, - 0.968800f, - 0.069000f, - -0.099304f, - -0.488310f, - -0.041133f, - 0.000000f, - -0.201600f, - -0.975900f, - -0.083500f, - 0.937500f, - 0.069000f, - -0.053021f, - -0.497069f, - -0.010546f, - 0.000000f, - -0.109300f, - -0.993700f, - -0.021700f, - 0.968800f, - 0.034500f, - -0.099304f, - -0.488310f, - -0.041133f, - 0.000000f, - -0.201600f, - -0.975900f, - -0.083500f, - 0.937500f, - 0.069000f, - -0.049945f, - -0.497069f, - -0.020688f, - 0.000000f, - -0.103000f, - -0.993700f, - -0.042600f, - 0.937500f, - 0.034500f, - -0.489673f, - -0.027069f, - -0.097402f, - 0.000000f, - -0.979300f, - -0.054000f, - -0.194800f, - 0.968800f, - 0.482800f, - -0.489673f, - 0.027069f, - -0.097402f, - 0.000000f, - -0.979300f, - 0.054000f, - -0.194800f, - 0.968800f, - 0.517200f, - -0.461262f, - 0.027069f, - -0.191061f, - 0.000000f, - -0.922500f, - 0.054000f, - -0.382100f, - 0.937500f, - 0.517200f, - -0.489673f, - -0.027069f, - -0.097402f, - 0.000000f, - -0.979300f, - -0.054000f, - -0.194800f, - 0.968800f, - 0.482800f, - -0.461262f, - 0.027069f, - -0.191061f, - 0.000000f, - -0.922500f, - 0.054000f, - -0.382100f, - 0.937500f, - 0.517200f, - -0.461262f, - -0.027069f, - -0.191061f, - 0.000000f, - -0.922500f, - -0.054000f, - -0.382100f, - 0.937500f, - 0.482800f, - -0.105420f, - 0.488310f, - -0.020969f, - 0.000000f, - -0.214000f, - 0.975900f, - -0.042500f, - 0.968800f, - 0.931000f, - -0.053021f, - 0.497069f, - -0.010546f, - 0.000000f, - -0.109300f, - 0.993700f, - -0.021700f, - 0.968800f, - 0.965500f, - -0.049945f, - 0.497069f, - -0.020688f, - 0.000000f, - -0.103000f, - 0.993700f, - -0.042600f, - 0.937500f, - 0.965500f, - -0.105420f, - 0.488310f, - -0.020969f, - 0.000000f, - -0.214000f, - 0.975900f, - -0.042500f, - 0.968800f, - 0.931000f, - -0.049945f, - 0.497069f, - -0.020688f, - 0.000000f, - -0.103000f, - 0.993700f, - -0.042600f, - 0.937500f, - 0.965500f, - -0.099303f, - 0.488310f, - -0.041132f, - 0.000000f, - -0.201600f, - 0.975900f, - -0.083500f, - 0.937500f, - 0.931000f, - -0.000000f, - -0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - -1.000000f, - 0.000000f, - 0.495500f, - 0.051000f, - -0.053021f, - -0.497069f, - -0.010546f, - 0.000000f, - -0.109300f, - -0.993700f, - -0.021700f, - 0.491600f, - 0.053800f, - -0.049945f, - -0.497069f, - -0.020688f, - 0.000000f, - -0.103000f, - -0.993700f, - -0.042600f, - 0.489000f, - 0.053800f, - -0.483932f, - -0.080891f, - -0.096260f, - 0.000000f, - -0.967900f, - -0.161200f, - -0.192500f, - 0.968800f, - 0.448300f, - -0.489673f, - -0.027069f, - -0.097402f, - 0.000000f, - -0.979300f, - -0.054000f, - -0.194800f, - 0.968800f, - 0.482800f, - -0.461262f, - -0.027069f, - -0.191061f, - 0.000000f, - -0.922500f, - -0.054000f, - -0.382100f, - 0.937500f, - 0.482800f, - -0.483932f, - -0.080891f, - -0.096260f, - 0.000000f, - -0.967900f, - -0.161200f, - -0.192500f, - 0.968800f, - 0.448300f, - -0.461262f, - -0.027069f, - -0.191061f, - 0.000000f, - -0.922500f, - -0.054000f, - -0.382100f, - 0.937500f, - 0.482800f, - -0.455855f, - -0.080891f, - -0.188821f, - 0.000000f, - -0.911800f, - -0.161200f, - -0.377700f, - 0.937500f, - 0.448300f, - -0.156583f, - 0.473826f, - -0.031146f, - 0.000000f, - -0.316100f, - 0.946600f, - -0.062900f, - 0.968800f, - 0.896600f, - -0.105420f, - 0.488310f, - -0.020969f, - 0.000000f, - -0.214000f, - 0.975900f, - -0.042500f, - 0.968800f, - 0.931000f, - -0.099303f, - 0.488310f, - -0.041132f, - 0.000000f, - -0.201600f, - 0.975900f, - -0.083500f, - 0.937500f, - 0.931000f, - -0.156583f, - 0.473826f, - -0.031146f, - 0.000000f, - -0.316100f, - 0.946600f, - -0.062900f, - 0.968800f, - 0.896600f, - -0.099303f, - 0.488310f, - -0.041132f, - 0.000000f, - -0.201600f, - 0.975900f, - -0.083500f, - 0.937500f, - 0.931000f, - -0.147498f, - 0.473826f, - -0.061095f, - 0.000000f, - -0.297800f, - 0.946600f, - -0.123300f, - 0.937500f, - 0.896600f, - -0.472518f, - -0.133764f, - -0.093989f, - 0.000000f, - -0.945200f, - -0.266600f, - -0.188000f, - 0.968800f, - 0.413800f, - -0.483932f, - -0.080891f, - -0.096260f, - 0.000000f, - -0.967900f, - -0.161200f, - -0.192500f, - 0.968800f, - 0.448300f, - -0.455855f, - -0.080891f, - -0.188821f, - 0.000000f, - -0.911800f, - -0.161200f, - -0.377700f, - 0.937500f, - 0.448300f, - -0.472518f, - -0.133764f, - -0.093989f, - 0.000000f, - -0.945200f, - -0.266600f, - -0.188000f, - 0.968800f, - 0.413800f, - -0.455855f, - -0.080891f, - -0.188821f, - 0.000000f, - -0.911800f, - -0.161200f, - -0.377700f, - 0.937500f, - 0.448300f, - -0.445102f, - -0.133764f, - -0.184367f, - 0.000000f, - -0.890400f, - -0.266600f, - -0.368800f, - 0.937500f, - 0.413800f, - -0.205911f, - 0.453788f, - -0.040958f, - 0.000000f, - -0.414500f, - 0.906300f, - -0.082400f, - 0.968800f, - 0.862100f, - -0.156583f, - 0.473826f, - -0.031146f, - 0.000000f, - -0.316100f, - 0.946600f, - -0.062900f, - 0.968800f, - 0.896600f, - -0.147498f, - 0.473826f, - -0.061095f, - 0.000000f, - -0.297800f, - 0.946600f, - -0.123300f, - 0.937500f, - 0.896600f, - -0.205911f, - 0.453788f, - -0.040958f, - 0.000000f, - -0.414500f, - 0.906300f, - -0.082400f, - 0.968800f, - 0.862100f, - -0.147498f, - 0.473826f, - -0.061095f, - 0.000000f, - -0.297800f, - 0.946600f, - -0.123300f, - 0.937500f, - 0.896600f, - -0.193963f, - 0.453788f, - -0.080342f, - 0.000000f, - -0.390500f, - 0.906300f, - -0.161700f, - 0.937500f, - 0.862100f, - -0.455563f, - -0.185069f, - -0.090617f, - 0.000000f, - -0.911600f, - -0.369000f, - -0.181300f, - 0.968800f, - 0.379300f, - -0.472518f, - -0.133764f, - -0.093989f, - 0.000000f, - -0.945200f, - -0.266600f, - -0.188000f, - 0.968800f, - 0.413800f, - -0.445102f, - -0.133764f, - -0.184367f, - 0.000000f, - -0.890400f, - -0.266600f, - -0.368800f, - 0.937500f, - 0.413800f, - -0.455563f, - -0.185069f, - -0.090617f, - 0.000000f, - -0.911600f, - -0.369000f, - -0.181300f, - 0.968800f, - 0.379300f, - -0.445102f, - -0.133764f, - -0.184367f, - 0.000000f, - -0.890400f, - -0.266600f, - -0.368800f, - 0.937500f, - 0.413800f, - -0.429132f, - -0.185069f, - -0.177752f, - 0.000000f, - -0.858700f, - -0.369000f, - -0.355700f, - 0.937500f, - 0.379300f, - -0.252824f, - 0.428429f, - -0.050290f, - 0.000000f, - -0.508100f, - 0.855300f, - -0.101000f, - 0.968800f, - 0.827600f, - -0.205911f, - 0.453788f, - -0.040958f, - 0.000000f, - -0.414500f, - 0.906300f, - -0.082400f, - 0.968800f, - 0.862100f, - -0.193963f, - 0.453788f, - -0.080342f, - 0.000000f, - -0.390500f, - 0.906300f, - -0.161700f, - 0.937500f, - 0.862100f, - -0.252824f, - 0.428429f, - -0.050290f, - 0.000000f, - -0.508100f, - 0.855300f, - -0.101000f, - 0.968800f, - 0.827600f, - -0.193963f, - 0.453788f, - -0.080342f, - 0.000000f, - -0.390500f, - 0.906300f, - -0.161700f, - 0.937500f, - 0.862100f, - -0.238155f, - 0.428429f, - -0.098647f, - 0.000000f, - -0.478600f, - 0.855300f, - -0.198200f, - 0.937500f, - 0.827600f, - -0.433268f, - -0.234204f, - -0.086182f, - 0.000000f, - -0.867200f, - -0.467000f, - -0.172500f, - 0.968800f, - 0.344800f, - -0.455563f, - -0.185069f, - -0.090617f, - 0.000000f, - -0.911600f, - -0.369000f, - -0.181300f, - 0.968800f, - 0.379300f, - -0.429132f, - -0.185069f, - -0.177752f, - 0.000000f, - -0.858700f, - -0.369000f, - -0.355700f, - 0.937500f, - 0.379300f, - -0.433268f, - -0.234204f, - -0.086182f, - 0.000000f, - -0.867200f, - -0.467000f, - -0.172500f, - 0.968800f, - 0.344800f, - -0.429132f, - -0.185069f, - -0.177752f, - 0.000000f, - -0.858700f, - -0.369000f, - -0.355700f, - 0.937500f, - 0.379300f, - -0.408130f, - -0.234204f, - -0.169052f, - 0.000000f, - -0.816900f, - -0.467000f, - -0.338400f, - 0.937500f, - 0.344800f, - -0.296773f, - 0.398046f, - -0.059032f, - 0.000000f, - -0.595600f, - 0.794500f, - -0.118500f, - 0.968800f, - 0.793100f, - -0.252824f, - 0.428429f, - -0.050290f, - 0.000000f, - -0.508100f, - 0.855300f, - -0.101000f, - 0.968800f, - 0.827600f, - -0.238155f, - 0.428429f, - -0.098647f, - 0.000000f, - -0.478600f, - 0.855300f, - -0.198200f, - 0.937500f, - 0.827600f, - -0.296773f, - 0.398046f, - -0.059032f, - 0.000000f, - -0.595600f, - 0.794500f, - -0.118500f, - 0.968800f, - 0.793100f, - -0.238155f, - 0.428429f, - -0.098647f, - 0.000000f, - -0.478600f, - 0.855300f, - -0.198200f, - 0.937500f, - 0.827600f, - -0.279554f, - 0.398046f, - -0.115795f, - 0.000000f, - -0.561100f, - 0.794500f, - -0.232400f, - 0.937500f, - 0.793100f, - -0.405892f, - -0.280594f, - -0.080737f, - 0.000000f, - -0.812800f, - -0.559600f, - -0.161700f, - 0.968800f, - 0.310300f, - -0.433268f, - -0.234204f, - -0.086182f, - 0.000000f, - -0.867200f, - -0.467000f, - -0.172500f, - 0.968800f, - 0.344800f, - -0.408130f, - -0.234204f, - -0.169052f, - 0.000000f, - -0.816900f, - -0.467000f, - -0.338400f, - 0.937500f, - 0.344800f, - -0.405892f, - -0.280594f, - -0.080737f, - 0.000000f, - -0.812800f, - -0.559600f, - -0.161700f, - 0.968800f, - 0.310300f, - -0.408130f, - -0.234204f, - -0.169052f, - 0.000000f, - -0.816900f, - -0.467000f, - -0.338400f, - 0.937500f, - 0.344800f, - -0.382342f, - -0.280594f, - -0.158371f, - 0.000000f, - -0.765600f, - -0.559600f, - -0.317100f, - 0.937500f, - 0.310300f, - -0.337243f, - 0.362998f, - -0.067082f, - 0.000000f, - -0.676200f, - 0.724300f, - -0.134500f, - 0.968800f, - 0.758600f, - -0.296773f, - 0.398046f, - -0.059032f, - 0.000000f, - -0.595600f, - 0.794500f, - -0.118500f, - 0.968800f, - 0.793100f, - -0.279554f, - 0.398046f, - -0.115795f, - 0.000000f, - -0.561100f, - 0.794500f, - -0.232400f, - 0.937500f, - 0.793100f, - -0.337243f, - 0.362998f, - -0.067082f, - 0.000000f, - -0.676200f, - 0.724300f, - -0.134500f, - 0.968800f, - 0.758600f, - -0.279554f, - 0.398046f, - -0.115795f, - 0.000000f, - -0.561100f, - 0.794500f, - -0.232400f, - 0.937500f, - 0.793100f, - -0.317676f, - 0.362998f, - -0.131585f, - 0.000000f, - -0.637000f, - 0.724300f, - -0.263800f, - 0.937500f, - 0.758600f, - -0.373759f, - -0.323693f, - -0.074345f, - 0.000000f, - -0.748900f, - -0.645700f, - -0.149000f, - 0.968800f, - 0.275900f, - -0.405892f, - -0.280594f, - -0.080737f, - 0.000000f, - -0.812800f, - -0.559600f, - -0.161700f, - 0.968800f, - 0.310300f, - -0.382342f, - -0.280594f, - -0.158371f, - 0.000000f, - -0.765600f, - -0.559600f, - -0.317100f, - 0.937500f, - 0.310300f, - -0.373759f, - -0.323693f, - -0.074345f, - 0.000000f, - -0.748900f, - -0.645700f, - -0.149000f, - 0.968800f, - 0.275900f, - -0.382342f, - -0.280594f, - -0.158371f, - 0.000000f, - -0.765600f, - -0.559600f, - -0.317100f, - 0.937500f, - 0.310300f, - -0.352073f, - -0.323693f, - -0.145834f, - 0.000000f, - -0.705400f, - -0.645700f, - -0.292200f, - 0.937500f, - 0.275900f, - -0.373758f, - 0.323693f, - -0.074345f, - 0.000000f, - -0.748900f, - 0.645700f, - -0.149000f, - 0.968800f, - 0.724100f, - -0.337243f, - 0.362998f, - -0.067082f, - 0.000000f, - -0.676200f, - 0.724300f, - -0.134500f, - 0.968800f, - 0.758600f, - -0.317676f, - 0.362998f, - -0.131585f, - 0.000000f, - -0.637000f, - 0.724300f, - -0.263800f, - 0.937500f, - 0.758600f, - -0.373758f, - 0.323693f, - -0.074345f, - 0.000000f, - -0.748900f, - 0.645700f, - -0.149000f, - 0.968800f, - 0.724100f, - -0.317676f, - 0.362998f, - -0.131585f, - 0.000000f, - -0.637000f, - 0.724300f, - -0.263800f, - 0.937500f, - 0.758600f, - -0.352073f, - 0.323693f, - -0.145833f, - 0.000000f, - -0.705400f, - 0.645700f, - -0.292200f, - 0.937500f, - 0.724100f, - -0.337243f, - -0.362998f, - -0.067082f, - 0.000000f, - -0.676200f, - -0.724300f, - -0.134500f, - 0.968800f, - 0.241400f, - -0.373759f, - -0.323693f, - -0.074345f, - 0.000000f, - -0.748900f, - -0.645700f, - -0.149000f, - 0.968800f, - 0.275900f, - -0.352073f, - -0.323693f, - -0.145834f, - 0.000000f, - -0.705400f, - -0.645700f, - -0.292200f, - 0.937500f, - 0.275900f, - -0.337243f, - -0.362998f, - -0.067082f, - 0.000000f, - -0.676200f, - -0.724300f, - -0.134500f, - 0.968800f, - 0.241400f, - -0.352073f, - -0.323693f, - -0.145834f, - 0.000000f, - -0.705400f, - -0.645700f, - -0.292200f, - 0.937500f, - 0.275900f, - -0.317676f, - -0.362998f, - -0.131585f, - 0.000000f, - -0.637000f, - -0.724300f, - -0.263800f, - 0.937500f, - 0.241400f, - -0.405892f, - 0.280594f, - -0.080737f, - 0.000000f, - -0.812800f, - 0.559600f, - -0.161700f, - 0.968800f, - 0.689700f, - -0.373758f, - 0.323693f, - -0.074345f, - 0.000000f, - -0.748900f, - 0.645700f, - -0.149000f, - 0.968800f, - 0.724100f, - -0.352073f, - 0.323693f, - -0.145833f, - 0.000000f, - -0.705400f, - 0.645700f, - -0.292200f, - 0.937500f, - 0.724100f, - -0.405892f, - 0.280594f, - -0.080737f, - 0.000000f, - -0.812800f, - 0.559600f, - -0.161700f, - 0.968800f, - 0.689700f, - -0.352073f, - 0.323693f, - -0.145833f, - 0.000000f, - -0.705400f, - 0.645700f, - -0.292200f, - 0.937500f, - 0.724100f, - -0.382342f, - 0.280594f, - -0.158371f, - 0.000000f, - -0.765600f, - 0.559600f, - -0.317100f, - 0.937500f, - 0.689700f, - -0.296773f, - -0.398046f, - -0.059032f, - 0.000000f, - -0.595600f, - -0.794500f, - -0.118500f, - 0.968800f, - 0.206900f, - -0.337243f, - -0.362998f, - -0.067082f, - 0.000000f, - -0.676200f, - -0.724300f, - -0.134500f, - 0.968800f, - 0.241400f, - -0.317676f, - -0.362998f, - -0.131585f, - 0.000000f, - -0.637000f, - -0.724300f, - -0.263800f, - 0.937500f, - 0.241400f, - -0.296773f, - -0.398046f, - -0.059032f, - 0.000000f, - -0.595600f, - -0.794500f, - -0.118500f, - 0.968800f, - 0.206900f, - -0.317676f, - -0.362998f, - -0.131585f, - 0.000000f, - -0.637000f, - -0.724300f, - -0.263800f, - 0.937500f, - 0.241400f, - -0.279554f, - -0.398046f, - -0.115795f, - 0.000000f, - -0.561100f, - -0.794500f, - -0.232400f, - 0.937500f, - 0.206900f, - -0.433268f, - 0.234204f, - -0.086182f, - 0.000000f, - -0.867200f, - 0.467000f, - -0.172500f, - 0.968800f, - 0.655200f, - -0.405892f, - 0.280594f, - -0.080737f, - 0.000000f, - -0.812800f, - 0.559600f, - -0.161700f, - 0.968800f, - 0.689700f, - -0.382342f, - 0.280594f, - -0.158371f, - 0.000000f, - -0.765600f, - 0.559600f, - -0.317100f, - 0.937500f, - 0.689700f, - -0.433268f, - 0.234204f, - -0.086182f, - 0.000000f, - -0.867200f, - 0.467000f, - -0.172500f, - 0.968800f, - 0.655200f, - -0.382342f, - 0.280594f, - -0.158371f, - 0.000000f, - -0.765600f, - 0.559600f, - -0.317100f, - 0.937500f, - 0.689700f, - -0.408130f, - 0.234204f, - -0.169052f, - 0.000000f, - -0.816900f, - 0.467000f, - -0.338400f, - 0.937500f, - 0.655200f, - -0.252824f, - -0.428429f, - -0.050290f, - 0.000000f, - -0.508100f, - -0.855300f, - -0.101000f, - 0.968800f, - 0.172400f, - -0.296773f, - -0.398046f, - -0.059032f, - 0.000000f, - -0.595600f, - -0.794500f, - -0.118500f, - 0.968800f, - 0.206900f, - -0.279554f, - -0.398046f, - -0.115795f, - 0.000000f, - -0.561100f, - -0.794500f, - -0.232400f, - 0.937500f, - 0.206900f, - -0.252824f, - -0.428429f, - -0.050290f, - 0.000000f, - -0.508100f, - -0.855300f, - -0.101000f, - 0.968800f, - 0.172400f, - -0.279554f, - -0.398046f, - -0.115795f, - 0.000000f, - -0.561100f, - -0.794500f, - -0.232400f, - 0.937500f, - 0.206900f, - -0.238155f, - -0.428429f, - -0.098647f, - 0.000000f, - -0.478600f, - -0.855300f, - -0.198200f, - 0.937500f, - 0.172400f, - -0.455563f, - 0.185069f, - -0.090617f, - 0.000000f, - -0.911600f, - 0.369000f, - -0.181300f, - 0.968800f, - 0.620700f, - -0.433268f, - 0.234204f, - -0.086182f, - 0.000000f, - -0.867200f, - 0.467000f, - -0.172500f, - 0.968800f, - 0.655200f, - -0.408130f, - 0.234204f, - -0.169052f, - 0.000000f, - -0.816900f, - 0.467000f, - -0.338400f, - 0.937500f, - 0.655200f, - -0.455563f, - 0.185069f, - -0.090617f, - 0.000000f, - -0.911600f, - 0.369000f, - -0.181300f, - 0.968800f, - 0.620700f, - -0.408130f, - 0.234204f, - -0.169052f, - 0.000000f, - -0.816900f, - 0.467000f, - -0.338400f, - 0.937500f, - 0.655200f, - -0.429132f, - 0.185069f, - -0.177752f, - 0.000000f, - -0.858700f, - 0.369000f, - -0.355700f, - 0.937500f, - 0.620700f, - -0.205911f, - -0.453788f, - -0.040958f, - 0.000000f, - -0.414500f, - -0.906300f, - -0.082400f, - 0.968800f, - 0.137900f, - -0.252824f, - -0.428429f, - -0.050290f, - 0.000000f, - -0.508100f, - -0.855300f, - -0.101000f, - 0.968800f, - 0.172400f, - -0.238155f, - -0.428429f, - -0.098647f, - 0.000000f, - -0.478600f, - -0.855300f, - -0.198200f, - 0.937500f, - 0.172400f, - -0.205911f, - -0.453788f, - -0.040958f, - 0.000000f, - -0.414500f, - -0.906300f, - -0.082400f, - 0.968800f, - 0.137900f, - -0.238155f, - -0.428429f, - -0.098647f, - 0.000000f, - -0.478600f, - -0.855300f, - -0.198200f, - 0.937500f, - 0.172400f, - -0.193964f, - -0.453788f, - -0.080342f, - 0.000000f, - -0.390500f, - -0.906300f, - -0.161700f, - 0.937500f, - 0.137900f, - -0.472518f, - 0.133764f, - -0.093989f, - 0.000000f, - -0.945200f, - 0.266600f, - -0.188000f, - 0.968800f, - 0.586200f, - -0.455563f, - 0.185069f, - -0.090617f, - 0.000000f, - -0.911600f, - 0.369000f, - -0.181300f, - 0.968800f, - 0.620700f, - -0.429132f, - 0.185069f, - -0.177752f, - 0.000000f, - -0.858700f, - 0.369000f, - -0.355700f, - 0.937500f, - 0.620700f, - -0.472518f, - 0.133764f, - -0.093989f, - 0.000000f, - -0.945200f, - 0.266600f, - -0.188000f, - 0.968800f, - 0.586200f, - -0.429132f, - 0.185069f, - -0.177752f, - 0.000000f, - -0.858700f, - 0.369000f, - -0.355700f, - 0.937500f, - 0.620700f, - -0.445102f, - 0.133764f, - -0.184367f, - 0.000000f, - -0.890400f, - 0.266600f, - -0.368800f, - 0.937500f, - 0.586200f, - -0.156584f, - -0.473826f, - -0.031147f, - 0.000000f, - -0.316100f, - -0.946600f, - -0.062900f, - 0.968800f, - 0.103400f, - -0.205911f, - -0.453788f, - -0.040958f, - 0.000000f, - -0.414500f, - -0.906300f, - -0.082400f, - 0.968800f, - 0.137900f, - -0.193964f, - -0.453788f, - -0.080342f, - 0.000000f, - -0.390500f, - -0.906300f, - -0.161700f, - 0.937500f, - 0.137900f, - -0.156584f, - -0.473826f, - -0.031147f, - 0.000000f, - -0.316100f, - -0.946600f, - -0.062900f, - 0.968800f, - 0.103400f, - -0.193964f, - -0.453788f, - -0.080342f, - 0.000000f, - -0.390500f, - -0.906300f, - -0.161700f, - 0.937500f, - 0.137900f, - -0.147499f, - -0.473826f, - -0.061095f, - 0.000000f, - -0.297800f, - -0.946600f, - -0.123300f, - 0.937500f, - 0.103400f, - -0.483932f, - 0.080891f, - -0.096260f, - 0.000000f, - -0.967900f, - 0.161200f, - -0.192500f, - 0.968800f, - 0.551700f, - -0.472518f, - 0.133764f, - -0.093989f, - 0.000000f, - -0.945200f, - 0.266600f, - -0.188000f, - 0.968800f, - 0.586200f, - -0.445102f, - 0.133764f, - -0.184367f, - 0.000000f, - -0.890400f, - 0.266600f, - -0.368800f, - 0.937500f, - 0.586200f, - -0.483932f, - 0.080891f, - -0.096260f, - 0.000000f, - -0.967900f, - 0.161200f, - -0.192500f, - 0.968800f, - 0.551700f, - -0.445102f, - 0.133764f, - -0.184367f, - 0.000000f, - -0.890400f, - 0.266600f, - -0.368800f, - 0.937500f, - 0.586200f, - -0.455855f, - 0.080891f, - -0.188821f, - 0.000000f, - -0.911800f, - 0.161200f, - -0.377700f, - 0.937500f, - 0.551700f, - -0.105421f, - -0.488310f, - -0.020970f, - 0.000000f, - -0.214000f, - -0.975900f, - -0.042500f, - 0.968800f, - 0.069000f, - -0.156584f, - -0.473826f, - -0.031147f, - 0.000000f, - -0.316100f, - -0.946600f, - -0.062900f, - 0.968800f, - 0.103400f, - -0.147499f, - -0.473826f, - -0.061095f, - 0.000000f, - -0.297800f, - -0.946600f, - -0.123300f, - 0.937500f, - 0.103400f, - -0.105421f, - -0.488310f, - -0.020970f, - 0.000000f, - -0.214000f, - -0.975900f, - -0.042500f, - 0.968800f, - 0.069000f, - -0.147499f, - -0.473826f, - -0.061095f, - 0.000000f, - -0.297800f, - -0.946600f, - -0.123300f, - 0.937500f, - 0.103400f, - -0.099304f, - -0.488310f, - -0.041133f, - 0.000000f, - -0.201600f, - -0.975900f, - -0.083500f, - 0.937500f, - 0.069000f, - -0.317676f, - -0.362998f, - -0.131585f, - 0.000000f, - -0.637000f, - -0.724300f, - -0.263800f, - 0.937500f, - 0.241400f, - -0.352073f, - -0.323693f, - -0.145834f, - 0.000000f, - -0.705400f, - -0.645700f, - -0.292200f, - 0.937500f, - 0.275900f, - -0.316857f, - -0.323693f, - -0.211717f, - 0.000000f, - -0.634900f, - -0.645700f, - -0.424200f, - 0.906300f, - 0.275900f, - -0.317676f, - -0.362998f, - -0.131585f, - 0.000000f, - -0.637000f, - -0.724300f, - -0.263800f, - 0.937500f, - 0.241400f, - -0.316857f, - -0.323693f, - -0.211717f, - 0.000000f, - -0.634900f, - -0.645700f, - -0.424200f, - 0.906300f, - 0.275900f, - -0.285901f, - -0.362998f, - -0.191032f, - 0.000000f, - -0.573300f, - -0.724300f, - -0.383000f, - 0.906300f, - 0.241400f, - -0.382342f, - 0.280594f, - -0.158371f, - 0.000000f, - -0.765600f, - 0.559600f, - -0.317100f, - 0.937500f, - 0.689700f, - -0.352073f, - 0.323693f, - -0.145833f, - 0.000000f, - -0.705400f, - 0.645700f, - -0.292200f, - 0.937500f, - 0.724100f, - -0.316857f, - 0.323693f, - -0.211717f, - 0.000000f, - -0.634900f, - 0.645700f, - -0.424200f, - 0.906300f, - 0.724100f, - -0.382342f, - 0.280594f, - -0.158371f, - 0.000000f, - -0.765600f, - 0.559600f, - -0.317100f, - 0.937500f, - 0.689700f, - -0.316857f, - 0.323693f, - -0.211717f, - 0.000000f, - -0.634900f, - 0.645700f, - -0.424200f, - 0.906300f, - 0.724100f, - -0.344099f, - 0.280594f, - -0.229919f, - 0.000000f, - -0.689100f, - 0.559600f, - -0.460400f, - 0.906300f, - 0.689700f, - -0.279554f, - -0.398046f, - -0.115795f, - 0.000000f, - -0.561100f, - -0.794500f, - -0.232400f, - 0.937500f, - 0.206900f, - -0.317676f, - -0.362998f, - -0.131585f, - 0.000000f, - -0.637000f, - -0.724300f, - -0.263800f, - 0.937500f, - 0.241400f, - -0.285901f, - -0.362998f, - -0.191032f, - 0.000000f, - -0.573300f, - -0.724300f, - -0.383000f, - 0.906300f, - 0.241400f, - -0.279554f, - -0.398046f, - -0.115795f, - 0.000000f, - -0.561100f, - -0.794500f, - -0.232400f, - 0.937500f, - 0.206900f, - -0.285901f, - -0.362998f, - -0.191032f, - 0.000000f, - -0.573300f, - -0.724300f, - -0.383000f, - 0.906300f, - 0.241400f, - -0.251592f, - -0.398046f, - -0.168108f, - 0.000000f, - -0.505000f, - -0.794500f, - -0.337400f, - 0.906300f, - 0.206900f, - -0.408130f, - 0.234204f, - -0.169052f, - 0.000000f, - -0.816900f, - 0.467000f, - -0.338400f, - 0.937500f, - 0.655200f, - -0.382342f, - 0.280594f, - -0.158371f, - 0.000000f, - -0.765600f, - 0.559600f, - -0.317100f, - 0.937500f, - 0.689700f, - -0.344099f, - 0.280594f, - -0.229919f, - 0.000000f, - -0.689100f, - 0.559600f, - -0.460400f, - 0.906300f, - 0.689700f, - -0.408130f, - 0.234204f, - -0.169052f, - 0.000000f, - -0.816900f, - 0.467000f, - -0.338400f, - 0.937500f, - 0.655200f, - -0.344099f, - 0.280594f, - -0.229919f, - 0.000000f, - -0.689100f, - 0.559600f, - -0.460400f, - 0.906300f, - 0.689700f, - -0.367307f, - 0.234204f, - -0.245426f, - 0.000000f, - -0.735200f, - 0.467000f, - -0.491300f, - 0.906300f, - 0.655200f, - -0.238155f, - -0.428429f, - -0.098647f, - 0.000000f, - -0.478600f, - -0.855300f, - -0.198200f, - 0.937500f, - 0.172400f, - -0.279554f, - -0.398046f, - -0.115795f, - 0.000000f, - -0.561100f, - -0.794500f, - -0.232400f, - 0.937500f, - 0.206900f, - -0.251592f, - -0.398046f, - -0.168108f, - 0.000000f, - -0.505000f, - -0.794500f, - -0.337400f, - 0.906300f, - 0.206900f, - -0.238155f, - -0.428429f, - -0.098647f, - 0.000000f, - -0.478600f, - -0.855300f, - -0.198200f, - 0.937500f, - 0.172400f, - -0.251592f, - -0.398046f, - -0.168108f, - 0.000000f, - -0.505000f, - -0.794500f, - -0.337400f, - 0.906300f, - 0.206900f, - -0.214334f, - -0.428429f, - -0.143213f, - 0.000000f, - -0.430700f, - -0.855300f, - -0.287800f, - 0.906300f, - 0.172400f, - -0.429132f, - 0.185069f, - -0.177752f, - 0.000000f, - -0.858700f, - 0.369000f, - -0.355700f, - 0.937500f, - 0.620700f, - -0.408130f, - 0.234204f, - -0.169052f, - 0.000000f, - -0.816900f, - 0.467000f, - -0.338400f, - 0.937500f, - 0.655200f, - -0.367307f, - 0.234204f, - -0.245426f, - 0.000000f, - -0.735200f, - 0.467000f, - -0.491300f, - 0.906300f, - 0.655200f, - -0.429132f, - 0.185069f, - -0.177752f, - 0.000000f, - -0.858700f, - 0.369000f, - -0.355700f, - 0.937500f, - 0.620700f, - -0.367307f, - 0.234204f, - -0.245426f, - 0.000000f, - -0.735200f, - 0.467000f, - -0.491300f, - 0.906300f, - 0.655200f, - -0.386208f, - 0.185069f, - -0.258056f, - 0.000000f, - -0.772800f, - 0.369000f, - -0.516300f, - 0.906200f, - 0.620700f, - -0.193964f, - -0.453788f, - -0.080342f, - 0.000000f, - -0.390500f, - -0.906300f, - -0.161700f, - 0.937500f, - 0.137900f, - -0.238155f, - -0.428429f, - -0.098647f, - 0.000000f, - -0.478600f, - -0.855300f, - -0.198200f, - 0.937500f, - 0.172400f, - -0.214334f, - -0.428429f, - -0.143213f, - 0.000000f, - -0.430700f, - -0.855300f, - -0.287800f, - 0.906300f, - 0.172400f, - -0.193964f, - -0.453788f, - -0.080342f, - 0.000000f, - -0.390500f, - -0.906300f, - -0.161700f, - 0.937500f, - 0.137900f, - -0.214334f, - -0.428429f, - -0.143213f, - 0.000000f, - -0.430700f, - -0.855300f, - -0.287800f, - 0.906300f, - 0.172400f, - -0.174563f, - -0.453788f, - -0.116639f, - 0.000000f, - -0.351400f, - -0.906300f, - -0.234800f, - 0.906300f, - 0.137900f, - -0.445102f, - 0.133764f, - -0.184367f, - 0.000000f, - -0.890400f, - 0.266600f, - -0.368800f, - 0.937500f, - 0.586200f, - -0.429132f, - 0.185069f, - -0.177752f, - 0.000000f, - -0.858700f, - 0.369000f, - -0.355700f, - 0.937500f, - 0.620700f, - -0.386208f, - 0.185069f, - -0.258056f, - 0.000000f, - -0.772800f, - 0.369000f, - -0.516300f, - 0.906200f, - 0.620700f, - -0.445102f, - 0.133764f, - -0.184367f, - 0.000000f, - -0.890400f, - 0.266600f, - -0.368800f, - 0.937500f, - 0.586200f, - -0.386208f, - 0.185069f, - -0.258056f, - 0.000000f, - -0.772800f, - 0.369000f, - -0.516300f, - 0.906200f, - 0.620700f, - -0.400582f, - 0.133764f, - -0.267659f, - 0.000000f, - -0.801400f, - 0.266600f, - -0.535400f, - 0.906300f, - 0.586200f, - -0.147499f, - -0.473826f, - -0.061095f, - 0.000000f, - -0.297800f, - -0.946600f, - -0.123300f, - 0.937500f, - 0.103400f, - -0.193964f, - -0.453788f, - -0.080342f, - 0.000000f, - -0.390500f, - -0.906300f, - -0.161700f, - 0.937500f, - 0.137900f, - -0.174563f, - -0.453788f, - -0.116639f, - 0.000000f, - -0.351400f, - -0.906300f, - -0.234800f, - 0.906300f, - 0.137900f, - -0.147499f, - -0.473826f, - -0.061095f, - 0.000000f, - -0.297800f, - -0.946600f, - -0.123300f, - 0.937500f, - 0.103400f, - -0.174563f, - -0.453788f, - -0.116639f, - 0.000000f, - -0.351400f, - -0.906300f, - -0.234800f, - 0.906300f, - 0.137900f, - -0.132745f, - -0.473826f, - -0.088697f, - 0.000000f, - -0.268000f, - -0.946600f, - -0.179100f, - 0.906300f, - 0.103400f, - -0.455855f, - 0.080891f, - -0.188821f, - 0.000000f, - -0.911800f, - 0.161200f, - -0.377700f, - 0.937500f, - 0.551700f, - -0.445102f, - 0.133764f, - -0.184367f, - 0.000000f, - -0.890400f, - 0.266600f, - -0.368800f, - 0.937500f, - 0.586200f, - -0.400582f, - 0.133764f, - -0.267659f, - 0.000000f, - -0.801400f, - 0.266600f, - -0.535400f, - 0.906300f, - 0.586200f, - -0.455855f, - 0.080891f, - -0.188821f, - 0.000000f, - -0.911800f, - 0.161200f, - -0.377700f, - 0.937500f, - 0.551700f, - -0.400582f, - 0.133764f, - -0.267659f, - 0.000000f, - -0.801400f, - 0.266600f, - -0.535400f, - 0.906300f, - 0.586200f, - -0.410258f, - 0.080891f, - -0.274125f, - 0.000000f, - -0.820600f, - 0.161200f, - -0.548300f, - 0.906300f, - 0.551700f, - -0.099304f, - -0.488310f, - -0.041133f, - 0.000000f, - -0.201600f, - -0.975900f, - -0.083500f, - 0.937500f, - 0.069000f, - -0.147499f, - -0.473826f, - -0.061095f, - 0.000000f, - -0.297800f, - -0.946600f, - -0.123300f, - 0.937500f, - 0.103400f, - -0.132745f, - -0.473826f, - -0.088697f, - 0.000000f, - -0.268000f, - -0.946600f, - -0.179100f, - 0.906300f, - 0.103400f, - -0.099304f, - -0.488310f, - -0.041133f, - 0.000000f, - -0.201600f, - -0.975900f, - -0.083500f, - 0.937500f, - 0.069000f, - -0.132745f, - -0.473826f, - -0.088697f, - 0.000000f, - -0.268000f, - -0.946600f, - -0.179100f, - 0.906300f, - 0.103400f, - -0.089371f, - -0.488310f, - -0.059715f, - 0.000000f, - -0.181400f, - -0.975900f, - -0.121200f, - 0.906300f, - 0.069000f, - -0.461262f, - 0.027069f, - -0.191061f, - 0.000000f, - -0.922500f, - 0.054000f, - -0.382100f, - 0.937500f, - 0.517200f, - -0.455855f, - 0.080891f, - -0.188821f, - 0.000000f, - -0.911800f, - 0.161200f, - -0.377700f, - 0.937500f, - 0.551700f, - -0.410258f, - 0.080891f, - -0.274125f, - 0.000000f, - -0.820600f, - 0.161200f, - -0.548300f, - 0.906300f, - 0.551700f, - -0.461262f, - 0.027069f, - -0.191061f, - 0.000000f, - -0.922500f, - 0.054000f, - -0.382100f, - 0.937500f, - 0.517200f, - -0.410258f, - 0.080891f, - -0.274125f, - 0.000000f, - -0.820600f, - 0.161200f, - -0.548300f, - 0.906300f, - 0.551700f, - -0.415125f, - 0.027069f, - -0.277377f, - 0.000000f, - -0.830300f, - 0.054000f, - -0.554700f, - 0.906300f, - 0.517200f, - -0.049945f, - 0.497069f, - -0.020688f, - 0.000000f, - -0.103000f, - 0.993700f, - -0.042600f, - 0.430800f, - 0.962300f, - -0.000000f, - 0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - 1.000000f, - 0.000000f, - 0.423900f, - 0.960300f, - -0.044949f, - 0.497069f, - -0.030034f, - 0.000000f, - -0.092700f, - 0.993700f, - -0.061900f, - 0.432600f, - 0.962300f, - -0.049945f, - -0.497069f, - -0.020688f, - 0.000000f, - -0.103000f, - -0.993700f, - -0.042600f, - 0.937500f, - 0.034500f, - -0.099304f, - -0.488310f, - -0.041133f, - 0.000000f, - -0.201600f, - -0.975900f, - -0.083500f, - 0.937500f, - 0.069000f, - -0.089371f, - -0.488310f, - -0.059715f, - 0.000000f, - -0.181400f, - -0.975900f, - -0.121200f, - 0.906300f, - 0.069000f, - -0.049945f, - -0.497069f, - -0.020688f, - 0.000000f, - -0.103000f, - -0.993700f, - -0.042600f, - 0.937500f, - 0.034500f, - -0.089371f, - -0.488310f, - -0.059715f, - 0.000000f, - -0.181400f, - -0.975900f, - -0.121200f, - 0.906300f, - 0.069000f, - -0.044949f, - -0.497069f, - -0.030034f, - 0.000000f, - -0.092700f, - -0.993700f, - -0.061900f, - 0.906300f, - 0.034500f, - -0.461262f, - -0.027069f, - -0.191061f, - 0.000000f, - -0.922500f, - -0.054000f, - -0.382100f, - 0.937500f, - 0.482800f, - -0.461262f, - 0.027069f, - -0.191061f, - 0.000000f, - -0.922500f, - 0.054000f, - -0.382100f, - 0.937500f, - 0.517200f, - -0.415125f, - 0.027069f, - -0.277377f, - 0.000000f, - -0.830300f, - 0.054000f, - -0.554700f, - 0.906300f, - 0.517200f, - -0.461262f, - -0.027069f, - -0.191061f, - 0.000000f, - -0.922500f, - -0.054000f, - -0.382100f, - 0.937500f, - 0.482800f, - -0.415125f, - 0.027069f, - -0.277377f, - 0.000000f, - -0.830300f, - 0.054000f, - -0.554700f, - 0.906300f, - 0.517200f, - -0.415125f, - -0.027069f, - -0.277377f, - 0.000000f, - -0.830300f, - -0.054000f, - -0.554700f, - 0.906300f, - 0.482800f, - -0.099303f, - 0.488310f, - -0.041132f, - 0.000000f, - -0.201600f, - 0.975900f, - -0.083500f, - 0.937500f, - 0.931000f, - -0.049945f, - 0.497069f, - -0.020688f, - 0.000000f, - -0.103000f, - 0.993700f, - -0.042600f, - 0.937500f, - 0.965500f, - -0.044949f, - 0.497069f, - -0.030034f, - 0.000000f, - -0.092700f, - 0.993700f, - -0.061900f, - 0.906300f, - 0.965500f, - -0.099303f, - 0.488310f, - -0.041132f, - 0.000000f, - -0.201600f, - 0.975900f, - -0.083500f, - 0.937500f, - 0.931000f, - -0.044949f, - 0.497069f, - -0.030034f, - 0.000000f, - -0.092700f, - 0.993700f, - -0.061900f, - 0.906300f, - 0.965500f, - -0.089371f, - 0.488310f, - -0.059715f, - 0.000000f, - -0.181400f, - 0.975900f, - -0.121200f, - 0.906300f, - 0.931000f, - -0.000000f, - -0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - -1.000000f, - 0.000000f, - 0.495500f, - 0.051000f, - -0.049945f, - -0.497069f, - -0.020688f, - 0.000000f, - -0.103000f, - -0.993700f, - -0.042600f, - 0.489000f, - 0.053800f, - -0.044949f, - -0.497069f, - -0.030034f, - 0.000000f, - -0.092700f, - -0.993700f, - -0.061900f, - 0.486400f, - 0.053800f, - -0.455855f, - -0.080891f, - -0.188821f, - 0.000000f, - -0.911800f, - -0.161200f, - -0.377700f, - 0.937500f, - 0.448300f, - -0.461262f, - -0.027069f, - -0.191061f, - 0.000000f, - -0.922500f, - -0.054000f, - -0.382100f, - 0.937500f, - 0.482800f, - -0.415125f, - -0.027069f, - -0.277377f, - 0.000000f, - -0.830300f, - -0.054000f, - -0.554700f, - 0.906300f, - 0.482800f, - -0.455855f, - -0.080891f, - -0.188821f, - 0.000000f, - -0.911800f, - -0.161200f, - -0.377700f, - 0.937500f, - 0.448300f, - -0.415125f, - -0.027069f, - -0.277377f, - 0.000000f, - -0.830300f, - -0.054000f, - -0.554700f, - 0.906300f, - 0.482800f, - -0.410258f, - -0.080891f, - -0.274125f, - 0.000000f, - -0.820600f, - -0.161200f, - -0.548300f, - 0.906300f, - 0.448300f, - -0.147498f, - 0.473826f, - -0.061095f, - 0.000000f, - -0.297800f, - 0.946600f, - -0.123300f, - 0.937500f, - 0.896600f, - -0.099303f, - 0.488310f, - -0.041132f, - 0.000000f, - -0.201600f, - 0.975900f, - -0.083500f, - 0.937500f, - 0.931000f, - -0.089371f, - 0.488310f, - -0.059715f, - 0.000000f, - -0.181400f, - 0.975900f, - -0.121200f, - 0.906300f, - 0.931000f, - -0.147498f, - 0.473826f, - -0.061095f, - 0.000000f, - -0.297800f, - 0.946600f, - -0.123300f, - 0.937500f, - 0.896600f, - -0.089371f, - 0.488310f, - -0.059715f, - 0.000000f, - -0.181400f, - 0.975900f, - -0.121200f, - 0.906300f, - 0.931000f, - -0.132745f, - 0.473826f, - -0.088697f, - 0.000000f, - -0.268000f, - 0.946600f, - -0.179100f, - 0.906300f, - 0.896600f, - -0.445102f, - -0.133764f, - -0.184367f, - 0.000000f, - -0.890400f, - -0.266600f, - -0.368800f, - 0.937500f, - 0.413800f, - -0.455855f, - -0.080891f, - -0.188821f, - 0.000000f, - -0.911800f, - -0.161200f, - -0.377700f, - 0.937500f, - 0.448300f, - -0.410258f, - -0.080891f, - -0.274125f, - 0.000000f, - -0.820600f, - -0.161200f, - -0.548300f, - 0.906300f, - 0.448300f, - -0.445102f, - -0.133764f, - -0.184367f, - 0.000000f, - -0.890400f, - -0.266600f, - -0.368800f, - 0.937500f, - 0.413800f, - -0.410258f, - -0.080891f, - -0.274125f, - 0.000000f, - -0.820600f, - -0.161200f, - -0.548300f, - 0.906300f, - 0.448300f, - -0.400582f, - -0.133764f, - -0.267659f, - 0.000000f, - -0.801400f, - -0.266600f, - -0.535400f, - 0.906300f, - 0.413800f, - -0.193963f, - 0.453788f, - -0.080342f, - 0.000000f, - -0.390500f, - 0.906300f, - -0.161700f, - 0.937500f, - 0.862100f, - -0.147498f, - 0.473826f, - -0.061095f, - 0.000000f, - -0.297800f, - 0.946600f, - -0.123300f, - 0.937500f, - 0.896600f, - -0.132745f, - 0.473826f, - -0.088697f, - 0.000000f, - -0.268000f, - 0.946600f, - -0.179100f, - 0.906300f, - 0.896600f, - -0.193963f, - 0.453788f, - -0.080342f, - 0.000000f, - -0.390500f, - 0.906300f, - -0.161700f, - 0.937500f, - 0.862100f, - -0.132745f, - 0.473826f, - -0.088697f, - 0.000000f, - -0.268000f, - 0.946600f, - -0.179100f, - 0.906300f, - 0.896600f, - -0.174562f, - 0.453788f, - -0.116638f, - 0.000000f, - -0.351400f, - 0.906300f, - -0.234800f, - 0.906300f, - 0.862100f, - -0.429132f, - -0.185069f, - -0.177752f, - 0.000000f, - -0.858700f, - -0.369000f, - -0.355700f, - 0.937500f, - 0.379300f, - -0.445102f, - -0.133764f, - -0.184367f, - 0.000000f, - -0.890400f, - -0.266600f, - -0.368800f, - 0.937500f, - 0.413800f, - -0.400582f, - -0.133764f, - -0.267659f, - 0.000000f, - -0.801400f, - -0.266600f, - -0.535400f, - 0.906300f, - 0.413800f, - -0.429132f, - -0.185069f, - -0.177752f, - 0.000000f, - -0.858700f, - -0.369000f, - -0.355700f, - 0.937500f, - 0.379300f, - -0.400582f, - -0.133764f, - -0.267659f, - 0.000000f, - -0.801400f, - -0.266600f, - -0.535400f, - 0.906300f, - 0.413800f, - -0.386208f, - -0.185069f, - -0.258056f, - 0.000000f, - -0.772800f, - -0.369000f, - -0.516300f, - 0.906300f, - 0.379300f, - -0.238155f, - 0.428429f, - -0.098647f, - 0.000000f, - -0.478600f, - 0.855300f, - -0.198200f, - 0.937500f, - 0.827600f, - -0.193963f, - 0.453788f, - -0.080342f, - 0.000000f, - -0.390500f, - 0.906300f, - -0.161700f, - 0.937500f, - 0.862100f, - -0.174562f, - 0.453788f, - -0.116638f, - 0.000000f, - -0.351400f, - 0.906300f, - -0.234800f, - 0.906300f, - 0.862100f, - -0.238155f, - 0.428429f, - -0.098647f, - 0.000000f, - -0.478600f, - 0.855300f, - -0.198200f, - 0.937500f, - 0.827600f, - -0.174562f, - 0.453788f, - -0.116638f, - 0.000000f, - -0.351400f, - 0.906300f, - -0.234800f, - 0.906300f, - 0.862100f, - -0.214334f, - 0.428429f, - -0.143213f, - 0.000000f, - -0.430700f, - 0.855300f, - -0.287800f, - 0.906300f, - 0.827600f, - -0.408130f, - -0.234204f, - -0.169052f, - 0.000000f, - -0.816900f, - -0.467000f, - -0.338400f, - 0.937500f, - 0.344800f, - -0.429132f, - -0.185069f, - -0.177752f, - 0.000000f, - -0.858700f, - -0.369000f, - -0.355700f, - 0.937500f, - 0.379300f, - -0.386208f, - -0.185069f, - -0.258056f, - 0.000000f, - -0.772800f, - -0.369000f, - -0.516300f, - 0.906300f, - 0.379300f, - -0.408130f, - -0.234204f, - -0.169052f, - 0.000000f, - -0.816900f, - -0.467000f, - -0.338400f, - 0.937500f, - 0.344800f, - -0.386208f, - -0.185069f, - -0.258056f, - 0.000000f, - -0.772800f, - -0.369000f, - -0.516300f, - 0.906300f, - 0.379300f, - -0.367307f, - -0.234204f, - -0.245427f, - 0.000000f, - -0.735200f, - -0.467000f, - -0.491300f, - 0.906300f, - 0.344800f, - -0.279554f, - 0.398046f, - -0.115795f, - 0.000000f, - -0.561100f, - 0.794500f, - -0.232400f, - 0.937500f, - 0.793100f, - -0.238155f, - 0.428429f, - -0.098647f, - 0.000000f, - -0.478600f, - 0.855300f, - -0.198200f, - 0.937500f, - 0.827600f, - -0.214334f, - 0.428429f, - -0.143213f, - 0.000000f, - -0.430700f, - 0.855300f, - -0.287800f, - 0.906300f, - 0.827600f, - -0.279554f, - 0.398046f, - -0.115795f, - 0.000000f, - -0.561100f, - 0.794500f, - -0.232400f, - 0.937500f, - 0.793100f, - -0.214334f, - 0.428429f, - -0.143213f, - 0.000000f, - -0.430700f, - 0.855300f, - -0.287800f, - 0.906300f, - 0.827600f, - -0.251592f, - 0.398046f, - -0.168108f, - 0.000000f, - -0.504900f, - 0.794500f, - -0.337400f, - 0.906300f, - 0.793100f, - -0.382342f, - -0.280594f, - -0.158371f, - 0.000000f, - -0.765600f, - -0.559600f, - -0.317100f, - 0.937500f, - 0.310300f, - -0.408130f, - -0.234204f, - -0.169052f, - 0.000000f, - -0.816900f, - -0.467000f, - -0.338400f, - 0.937500f, - 0.344800f, - -0.367307f, - -0.234204f, - -0.245427f, - 0.000000f, - -0.735200f, - -0.467000f, - -0.491300f, - 0.906300f, - 0.344800f, - -0.382342f, - -0.280594f, - -0.158371f, - 0.000000f, - -0.765600f, - -0.559600f, - -0.317100f, - 0.937500f, - 0.310300f, - -0.367307f, - -0.234204f, - -0.245427f, - 0.000000f, - -0.735200f, - -0.467000f, - -0.491300f, - 0.906300f, - 0.344800f, - -0.344099f, - -0.280594f, - -0.229919f, - 0.000000f, - -0.689100f, - -0.559600f, - -0.460400f, - 0.906300f, - 0.310300f, - -0.317676f, - 0.362998f, - -0.131585f, - 0.000000f, - -0.637000f, - 0.724300f, - -0.263800f, - 0.937500f, - 0.758600f, - -0.279554f, - 0.398046f, - -0.115795f, - 0.000000f, - -0.561100f, - 0.794500f, - -0.232400f, - 0.937500f, - 0.793100f, - -0.251592f, - 0.398046f, - -0.168108f, - 0.000000f, - -0.504900f, - 0.794500f, - -0.337400f, - 0.906300f, - 0.793100f, - -0.317676f, - 0.362998f, - -0.131585f, - 0.000000f, - -0.637000f, - 0.724300f, - -0.263800f, - 0.937500f, - 0.758600f, - -0.251592f, - 0.398046f, - -0.168108f, - 0.000000f, - -0.504900f, - 0.794500f, - -0.337400f, - 0.906300f, - 0.793100f, - -0.285901f, - 0.362998f, - -0.191032f, - 0.000000f, - -0.573300f, - 0.724300f, - -0.383000f, - 0.906300f, - 0.758600f, - -0.352073f, - -0.323693f, - -0.145834f, - 0.000000f, - -0.705400f, - -0.645700f, - -0.292200f, - 0.937500f, - 0.275900f, - -0.382342f, - -0.280594f, - -0.158371f, - 0.000000f, - -0.765600f, - -0.559600f, - -0.317100f, - 0.937500f, - 0.310300f, - -0.344099f, - -0.280594f, - -0.229919f, - 0.000000f, - -0.689100f, - -0.559600f, - -0.460400f, - 0.906300f, - 0.310300f, - -0.352073f, - -0.323693f, - -0.145834f, - 0.000000f, - -0.705400f, - -0.645700f, - -0.292200f, - 0.937500f, - 0.275900f, - -0.344099f, - -0.280594f, - -0.229919f, - 0.000000f, - -0.689100f, - -0.559600f, - -0.460400f, - 0.906300f, - 0.310300f, - -0.316857f, - -0.323693f, - -0.211717f, - 0.000000f, - -0.634900f, - -0.645700f, - -0.424200f, - 0.906300f, - 0.275900f, - -0.352073f, - 0.323693f, - -0.145833f, - 0.000000f, - -0.705400f, - 0.645700f, - -0.292200f, - 0.937500f, - 0.724100f, - -0.317676f, - 0.362998f, - -0.131585f, - 0.000000f, - -0.637000f, - 0.724300f, - -0.263800f, - 0.937500f, - 0.758600f, - -0.285901f, - 0.362998f, - -0.191032f, - 0.000000f, - -0.573300f, - 0.724300f, - -0.383000f, - 0.906300f, - 0.758600f, - -0.352073f, - 0.323693f, - -0.145833f, - 0.000000f, - -0.705400f, - 0.645700f, - -0.292200f, - 0.937500f, - 0.724100f, - -0.285901f, - 0.362998f, - -0.191032f, - 0.000000f, - -0.573300f, - 0.724300f, - -0.383000f, - 0.906300f, - 0.758600f, - -0.316857f, - 0.323693f, - -0.211717f, - 0.000000f, - -0.634900f, - 0.645700f, - -0.424200f, - 0.906300f, - 0.724100f, - -0.132745f, - 0.473826f, - -0.088697f, - 0.000000f, - -0.268000f, - 0.946600f, - -0.179100f, - 0.906300f, - 0.896600f, - -0.089371f, - 0.488310f, - -0.059715f, - 0.000000f, - -0.181400f, - 0.975900f, - -0.121200f, - 0.906300f, - 0.931000f, - -0.076003f, - 0.488310f, - -0.076003f, - 0.000000f, - -0.154300f, - 0.975900f, - -0.154300f, - 0.875000f, - 0.931000f, - -0.132745f, - 0.473826f, - -0.088697f, - 0.000000f, - -0.268000f, - 0.946600f, - -0.179100f, - 0.906300f, - 0.896600f, - -0.076003f, - 0.488310f, - -0.076003f, - 0.000000f, - -0.154300f, - 0.975900f, - -0.154300f, - 0.875000f, - 0.931000f, - -0.112890f, - 0.473826f, - -0.112890f, - 0.000000f, - -0.227900f, - 0.946600f, - -0.227900f, - 0.875000f, - 0.896600f, - -0.400582f, - -0.133764f, - -0.267659f, - 0.000000f, - -0.801400f, - -0.266600f, - -0.535400f, - 0.906300f, - 0.413800f, - -0.410258f, - -0.080891f, - -0.274125f, - 0.000000f, - -0.820600f, - -0.161200f, - -0.548300f, - 0.906300f, - 0.448300f, - -0.348896f, - -0.080891f, - -0.348895f, - 0.000000f, - -0.697800f, - -0.161200f, - -0.697800f, - 0.875000f, - 0.448300f, - -0.400582f, - -0.133764f, - -0.267659f, - 0.000000f, - -0.801400f, - -0.266600f, - -0.535400f, - 0.906300f, - 0.413800f, - -0.348896f, - -0.080891f, - -0.348895f, - 0.000000f, - -0.697800f, - -0.161200f, - -0.697800f, - 0.875000f, - 0.448300f, - -0.340667f, - -0.133764f, - -0.340666f, - 0.000000f, - -0.681500f, - -0.266600f, - -0.681500f, - 0.875000f, - 0.413800f, - -0.174562f, - 0.453788f, - -0.116638f, - 0.000000f, - -0.351400f, - 0.906300f, - -0.234800f, - 0.906300f, - 0.862100f, - -0.132745f, - 0.473826f, - -0.088697f, - 0.000000f, - -0.268000f, - 0.946600f, - -0.179100f, - 0.906300f, - 0.896600f, - -0.112890f, - 0.473826f, - -0.112890f, - 0.000000f, - -0.227900f, - 0.946600f, - -0.227900f, - 0.875000f, - 0.896600f, - -0.174562f, - 0.453788f, - -0.116638f, - 0.000000f, - -0.351400f, - 0.906300f, - -0.234800f, - 0.906300f, - 0.862100f, - -0.112890f, - 0.473826f, - -0.112890f, - 0.000000f, - -0.227900f, - 0.946600f, - -0.227900f, - 0.875000f, - 0.896600f, - -0.148454f, - 0.453788f, - -0.148453f, - 0.000000f, - -0.298900f, - 0.906300f, - -0.298900f, - 0.875000f, - 0.862100f, - -0.386208f, - -0.185069f, - -0.258056f, - 0.000000f, - -0.772800f, - -0.369000f, - -0.516300f, - 0.906300f, - 0.379300f, - -0.400582f, - -0.133764f, - -0.267659f, - 0.000000f, - -0.801400f, - -0.266600f, - -0.535400f, - 0.906300f, - 0.413800f, - -0.340667f, - -0.133764f, - -0.340666f, - 0.000000f, - -0.681500f, - -0.266600f, - -0.681500f, - 0.875000f, - 0.413800f, - -0.386208f, - -0.185069f, - -0.258056f, - 0.000000f, - -0.772800f, - -0.369000f, - -0.516300f, - 0.906300f, - 0.379300f, - -0.340667f, - -0.133764f, - -0.340666f, - 0.000000f, - -0.681500f, - -0.266600f, - -0.681500f, - 0.875000f, - 0.413800f, - -0.328443f, - -0.185069f, - -0.328443f, - 0.000000f, - -0.657200f, - -0.369000f, - -0.657200f, - 0.875000f, - 0.379300f, - -0.214334f, - 0.428429f, - -0.143213f, - 0.000000f, - -0.430700f, - 0.855300f, - -0.287800f, - 0.906300f, - 0.827600f, - -0.174562f, - 0.453788f, - -0.116638f, - 0.000000f, - -0.351400f, - 0.906300f, - -0.234800f, - 0.906300f, - 0.862100f, - -0.148454f, - 0.453788f, - -0.148453f, - 0.000000f, - -0.298900f, - 0.906300f, - -0.298900f, - 0.875000f, - 0.862100f, - -0.214334f, - 0.428429f, - -0.143213f, - 0.000000f, - -0.430700f, - 0.855300f, - -0.287800f, - 0.906300f, - 0.827600f, - -0.148454f, - 0.453788f, - -0.148453f, - 0.000000f, - -0.298900f, - 0.906300f, - -0.298900f, - 0.875000f, - 0.862100f, - -0.182276f, - 0.428429f, - -0.182276f, - 0.000000f, - -0.366300f, - 0.855300f, - -0.366300f, - 0.875000f, - 0.827600f, - -0.367307f, - -0.234204f, - -0.245427f, - 0.000000f, - -0.735200f, - -0.467000f, - -0.491300f, - 0.906300f, - 0.344800f, - -0.386208f, - -0.185069f, - -0.258056f, - 0.000000f, - -0.772800f, - -0.369000f, - -0.516300f, - 0.906300f, - 0.379300f, - -0.328443f, - -0.185069f, - -0.328443f, - 0.000000f, - -0.657200f, - -0.369000f, - -0.657200f, - 0.875000f, - 0.379300f, - -0.367307f, - -0.234204f, - -0.245427f, - 0.000000f, - -0.735200f, - -0.467000f, - -0.491300f, - 0.906300f, - 0.344800f, - -0.328443f, - -0.185069f, - -0.328443f, - 0.000000f, - -0.657200f, - -0.369000f, - -0.657200f, - 0.875000f, - 0.379300f, - -0.312369f, - -0.234204f, - -0.312369f, - 0.000000f, - -0.625200f, - -0.467000f, - -0.625200f, - 0.875000f, - 0.344800f, - -0.251592f, - 0.398046f, - -0.168108f, - 0.000000f, - -0.504900f, - 0.794500f, - -0.337400f, - 0.906300f, - 0.793100f, - -0.214334f, - 0.428429f, - -0.143213f, - 0.000000f, - -0.430700f, - 0.855300f, - -0.287800f, - 0.906300f, - 0.827600f, - -0.182276f, - 0.428429f, - -0.182276f, - 0.000000f, - -0.366300f, - 0.855300f, - -0.366300f, - 0.875000f, - 0.827600f, - -0.251592f, - 0.398046f, - -0.168108f, - 0.000000f, - -0.504900f, - 0.794500f, - -0.337400f, - 0.906300f, - 0.793100f, - -0.182276f, - 0.428429f, - -0.182276f, - 0.000000f, - -0.366300f, - 0.855300f, - -0.366300f, - 0.875000f, - 0.827600f, - -0.213961f, - 0.398046f, - -0.213961f, - 0.000000f, - -0.429400f, - 0.794500f, - -0.429400f, - 0.875000f, - 0.793100f, - -0.344099f, - -0.280594f, - -0.229919f, - 0.000000f, - -0.689100f, - -0.559600f, - -0.460400f, - 0.906300f, - 0.310300f, - -0.367307f, - -0.234204f, - -0.245427f, - 0.000000f, - -0.735200f, - -0.467000f, - -0.491300f, - 0.906300f, - 0.344800f, - -0.312369f, - -0.234204f, - -0.312369f, - 0.000000f, - -0.625200f, - -0.467000f, - -0.625200f, - 0.875000f, - 0.344800f, - -0.344099f, - -0.280594f, - -0.229919f, - 0.000000f, - -0.689100f, - -0.559600f, - -0.460400f, - 0.906300f, - 0.310300f, - -0.312369f, - -0.234204f, - -0.312369f, - 0.000000f, - -0.625200f, - -0.467000f, - -0.625200f, - 0.875000f, - 0.344800f, - -0.292632f, - -0.280594f, - -0.292632f, - 0.000000f, - -0.586000f, - -0.559600f, - -0.586000f, - 0.875000f, - 0.310300f, - -0.285901f, - 0.362998f, - -0.191032f, - 0.000000f, - -0.573300f, - 0.724300f, - -0.383000f, - 0.906300f, - 0.758600f, - -0.251592f, - 0.398046f, - -0.168108f, - 0.000000f, - -0.504900f, - 0.794500f, - -0.337400f, - 0.906300f, - 0.793100f, - -0.213961f, - 0.398046f, - -0.213961f, - 0.000000f, - -0.429400f, - 0.794500f, - -0.429400f, - 0.875000f, - 0.793100f, - -0.285901f, - 0.362998f, - -0.191032f, - 0.000000f, - -0.573300f, - 0.724300f, - -0.383000f, - 0.906300f, - 0.758600f, - -0.213961f, - 0.398046f, - -0.213961f, - 0.000000f, - -0.429400f, - 0.794500f, - -0.429400f, - 0.875000f, - 0.793100f, - -0.243139f, - 0.362998f, - -0.243138f, - 0.000000f, - -0.487500f, - 0.724300f, - -0.487500f, - 0.875000f, - 0.758600f, - -0.316857f, - -0.323693f, - -0.211717f, - 0.000000f, - -0.634900f, - -0.645700f, - -0.424200f, - 0.906300f, - 0.275900f, - -0.344099f, - -0.280594f, - -0.229919f, - 0.000000f, - -0.689100f, - -0.559600f, - -0.460400f, - 0.906300f, - 0.310300f, - -0.292632f, - -0.280594f, - -0.292632f, - 0.000000f, - -0.586000f, - -0.559600f, - -0.586000f, - 0.875000f, - 0.310300f, - -0.316857f, - -0.323693f, - -0.211717f, - 0.000000f, - -0.634900f, - -0.645700f, - -0.424200f, - 0.906300f, - 0.275900f, - -0.292632f, - -0.280594f, - -0.292632f, - 0.000000f, - -0.586000f, - -0.559600f, - -0.586000f, - 0.875000f, - 0.310300f, - -0.269465f, - -0.323693f, - -0.269464f, - 0.000000f, - -0.539900f, - -0.645700f, - -0.539900f, - 0.875000f, - 0.275900f, - -0.316857f, - 0.323693f, - -0.211717f, - 0.000000f, - -0.634900f, - 0.645700f, - -0.424200f, - 0.906300f, - 0.724100f, - -0.285901f, - 0.362998f, - -0.191032f, - 0.000000f, - -0.573300f, - 0.724300f, - -0.383000f, - 0.906300f, - 0.758600f, - -0.243139f, - 0.362998f, - -0.243138f, - 0.000000f, - -0.487500f, - 0.724300f, - -0.487500f, - 0.875000f, - 0.758600f, - -0.316857f, - 0.323693f, - -0.211717f, - 0.000000f, - -0.634900f, - 0.645700f, - -0.424200f, - 0.906300f, - 0.724100f, - -0.243139f, - 0.362998f, - -0.243138f, - 0.000000f, - -0.487500f, - 0.724300f, - -0.487500f, - 0.875000f, - 0.758600f, - -0.269465f, - 0.323693f, - -0.269464f, - 0.000000f, - -0.539900f, - 0.645700f, - -0.539900f, - 0.875000f, - 0.724100f, - -0.285901f, - -0.362998f, - -0.191032f, - 0.000000f, - -0.573300f, - -0.724300f, - -0.383000f, - 0.906300f, - 0.241400f, - -0.316857f, - -0.323693f, - -0.211717f, - 0.000000f, - -0.634900f, - -0.645700f, - -0.424200f, - 0.906300f, - 0.275900f, - -0.269465f, - -0.323693f, - -0.269464f, - 0.000000f, - -0.539900f, - -0.645700f, - -0.539900f, - 0.875000f, - 0.275900f, - -0.285901f, - -0.362998f, - -0.191032f, - 0.000000f, - -0.573300f, - -0.724300f, - -0.383000f, - 0.906300f, - 0.241400f, - -0.269465f, - -0.323693f, - -0.269464f, - 0.000000f, - -0.539900f, - -0.645700f, - -0.539900f, - 0.875000f, - 0.275900f, - -0.243139f, - -0.362998f, - -0.243138f, - 0.000000f, - -0.487500f, - -0.724300f, - -0.487500f, - 0.875000f, - 0.241400f, - -0.344099f, - 0.280594f, - -0.229919f, - 0.000000f, - -0.689100f, - 0.559600f, - -0.460400f, - 0.906300f, - 0.689700f, - -0.316857f, - 0.323693f, - -0.211717f, - 0.000000f, - -0.634900f, - 0.645700f, - -0.424200f, - 0.906300f, - 0.724100f, - -0.269465f, - 0.323693f, - -0.269464f, - 0.000000f, - -0.539900f, - 0.645700f, - -0.539900f, - 0.875000f, - 0.724100f, - -0.344099f, - 0.280594f, - -0.229919f, - 0.000000f, - -0.689100f, - 0.559600f, - -0.460400f, - 0.906300f, - 0.689700f, - -0.269465f, - 0.323693f, - -0.269464f, - 0.000000f, - -0.539900f, - 0.645700f, - -0.539900f, - 0.875000f, - 0.724100f, - -0.292632f, - 0.280594f, - -0.292632f, - 0.000000f, - -0.586000f, - 0.559600f, - -0.586000f, - 0.875000f, - 0.689700f, - -0.251592f, - -0.398046f, - -0.168108f, - 0.000000f, - -0.505000f, - -0.794500f, - -0.337400f, - 0.906300f, - 0.206900f, - -0.285901f, - -0.362998f, - -0.191032f, - 0.000000f, - -0.573300f, - -0.724300f, - -0.383000f, - 0.906300f, - 0.241400f, - -0.243139f, - -0.362998f, - -0.243138f, - 0.000000f, - -0.487500f, - -0.724300f, - -0.487500f, - 0.875000f, - 0.241400f, - -0.251592f, - -0.398046f, - -0.168108f, - 0.000000f, - -0.505000f, - -0.794500f, - -0.337400f, - 0.906300f, - 0.206900f, - -0.243139f, - -0.362998f, - -0.243138f, - 0.000000f, - -0.487500f, - -0.724300f, - -0.487500f, - 0.875000f, - 0.241400f, - -0.213961f, - -0.398046f, - -0.213961f, - 0.000000f, - -0.429400f, - -0.794500f, - -0.429400f, - 0.875000f, - 0.206900f, - -0.367307f, - 0.234204f, - -0.245426f, - 0.000000f, - -0.735200f, - 0.467000f, - -0.491300f, - 0.906300f, - 0.655200f, - -0.344099f, - 0.280594f, - -0.229919f, - 0.000000f, - -0.689100f, - 0.559600f, - -0.460400f, - 0.906300f, - 0.689700f, - -0.292632f, - 0.280594f, - -0.292632f, - 0.000000f, - -0.586000f, - 0.559600f, - -0.586000f, - 0.875000f, - 0.689700f, - -0.367307f, - 0.234204f, - -0.245426f, - 0.000000f, - -0.735200f, - 0.467000f, - -0.491300f, - 0.906300f, - 0.655200f, - -0.292632f, - 0.280594f, - -0.292632f, - 0.000000f, - -0.586000f, - 0.559600f, - -0.586000f, - 0.875000f, - 0.689700f, - -0.312369f, - 0.234204f, - -0.312369f, - 0.000000f, - -0.625200f, - 0.467000f, - -0.625200f, - 0.875000f, - 0.655200f, - -0.214334f, - -0.428429f, - -0.143213f, - 0.000000f, - -0.430700f, - -0.855300f, - -0.287800f, - 0.906300f, - 0.172400f, - -0.251592f, - -0.398046f, - -0.168108f, - 0.000000f, - -0.505000f, - -0.794500f, - -0.337400f, - 0.906300f, - 0.206900f, - -0.213961f, - -0.398046f, - -0.213961f, - 0.000000f, - -0.429400f, - -0.794500f, - -0.429400f, - 0.875000f, - 0.206900f, - -0.214334f, - -0.428429f, - -0.143213f, - 0.000000f, - -0.430700f, - -0.855300f, - -0.287800f, - 0.906300f, - 0.172400f, - -0.213961f, - -0.398046f, - -0.213961f, - 0.000000f, - -0.429400f, - -0.794500f, - -0.429400f, - 0.875000f, - 0.206900f, - -0.182276f, - -0.428429f, - -0.182276f, - 0.000000f, - -0.366300f, - -0.855300f, - -0.366300f, - 0.875000f, - 0.172400f, - -0.386208f, - 0.185069f, - -0.258056f, - 0.000000f, - -0.772800f, - 0.369000f, - -0.516300f, - 0.906200f, - 0.620700f, - -0.367307f, - 0.234204f, - -0.245426f, - 0.000000f, - -0.735200f, - 0.467000f, - -0.491300f, - 0.906300f, - 0.655200f, - -0.312369f, - 0.234204f, - -0.312369f, - 0.000000f, - -0.625200f, - 0.467000f, - -0.625200f, - 0.875000f, - 0.655200f, - -0.386208f, - 0.185069f, - -0.258056f, - 0.000000f, - -0.772800f, - 0.369000f, - -0.516300f, - 0.906200f, - 0.620700f, - -0.312369f, - 0.234204f, - -0.312369f, - 0.000000f, - -0.625200f, - 0.467000f, - -0.625200f, - 0.875000f, - 0.655200f, - -0.328443f, - 0.185069f, - -0.328443f, - 0.000000f, - -0.657200f, - 0.369000f, - -0.657200f, - 0.875000f, - 0.620700f, - -0.174563f, - -0.453788f, - -0.116639f, - 0.000000f, - -0.351400f, - -0.906300f, - -0.234800f, - 0.906300f, - 0.137900f, - -0.214334f, - -0.428429f, - -0.143213f, - 0.000000f, - -0.430700f, - -0.855300f, - -0.287800f, - 0.906300f, - 0.172400f, - -0.182276f, - -0.428429f, - -0.182276f, - 0.000000f, - -0.366300f, - -0.855300f, - -0.366300f, - 0.875000f, - 0.172400f, - -0.174563f, - -0.453788f, - -0.116639f, - 0.000000f, - -0.351400f, - -0.906300f, - -0.234800f, - 0.906300f, - 0.137900f, - -0.182276f, - -0.428429f, - -0.182276f, - 0.000000f, - -0.366300f, - -0.855300f, - -0.366300f, - 0.875000f, - 0.172400f, - -0.148454f, - -0.453788f, - -0.148453f, - 0.000000f, - -0.298900f, - -0.906300f, - -0.298900f, - 0.875000f, - 0.137900f, - -0.400582f, - 0.133764f, - -0.267659f, - 0.000000f, - -0.801400f, - 0.266600f, - -0.535400f, - 0.906300f, - 0.586200f, - -0.386208f, - 0.185069f, - -0.258056f, - 0.000000f, - -0.772800f, - 0.369000f, - -0.516300f, - 0.906200f, - 0.620700f, - -0.328443f, - 0.185069f, - -0.328443f, - 0.000000f, - -0.657200f, - 0.369000f, - -0.657200f, - 0.875000f, - 0.620700f, - -0.400582f, - 0.133764f, - -0.267659f, - 0.000000f, - -0.801400f, - 0.266600f, - -0.535400f, - 0.906300f, - 0.586200f, - -0.328443f, - 0.185069f, - -0.328443f, - 0.000000f, - -0.657200f, - 0.369000f, - -0.657200f, - 0.875000f, - 0.620700f, - -0.340667f, - 0.133764f, - -0.340666f, - 0.000000f, - -0.681500f, - 0.266600f, - -0.681500f, - 0.875000f, - 0.586200f, - -0.132745f, - -0.473826f, - -0.088697f, - 0.000000f, - -0.268000f, - -0.946600f, - -0.179100f, - 0.906300f, - 0.103400f, - -0.174563f, - -0.453788f, - -0.116639f, - 0.000000f, - -0.351400f, - -0.906300f, - -0.234800f, - 0.906300f, - 0.137900f, - -0.148454f, - -0.453788f, - -0.148453f, - 0.000000f, - -0.298900f, - -0.906300f, - -0.298900f, - 0.875000f, - 0.137900f, - -0.132745f, - -0.473826f, - -0.088697f, - 0.000000f, - -0.268000f, - -0.946600f, - -0.179100f, - 0.906300f, - 0.103400f, - -0.148454f, - -0.453788f, - -0.148453f, - 0.000000f, - -0.298900f, - -0.906300f, - -0.298900f, - 0.875000f, - 0.137900f, - -0.112890f, - -0.473826f, - -0.112890f, - 0.000000f, - -0.227900f, - -0.946600f, - -0.227900f, - 0.875000f, - 0.103400f, - -0.410258f, - 0.080891f, - -0.274125f, - 0.000000f, - -0.820600f, - 0.161200f, - -0.548300f, - 0.906300f, - 0.551700f, - -0.400582f, - 0.133764f, - -0.267659f, - 0.000000f, - -0.801400f, - 0.266600f, - -0.535400f, - 0.906300f, - 0.586200f, - -0.340667f, - 0.133764f, - -0.340666f, - 0.000000f, - -0.681500f, - 0.266600f, - -0.681500f, - 0.875000f, - 0.586200f, - -0.410258f, - 0.080891f, - -0.274125f, - 0.000000f, - -0.820600f, - 0.161200f, - -0.548300f, - 0.906300f, - 0.551700f, - -0.340667f, - 0.133764f, - -0.340666f, - 0.000000f, - -0.681500f, - 0.266600f, - -0.681500f, - 0.875000f, - 0.586200f, - -0.348896f, - 0.080891f, - -0.348895f, - 0.000000f, - -0.697800f, - 0.161200f, - -0.697800f, - 0.875000f, - 0.551700f, - -0.089371f, - -0.488310f, - -0.059715f, - 0.000000f, - -0.181400f, - -0.975900f, - -0.121200f, - 0.906300f, - 0.069000f, - -0.132745f, - -0.473826f, - -0.088697f, - 0.000000f, - -0.268000f, - -0.946600f, - -0.179100f, - 0.906300f, - 0.103400f, - -0.112890f, - -0.473826f, - -0.112890f, - 0.000000f, - -0.227900f, - -0.946600f, - -0.227900f, - 0.875000f, - 0.103400f, - -0.089371f, - -0.488310f, - -0.059715f, - 0.000000f, - -0.181400f, - -0.975900f, - -0.121200f, - 0.906300f, - 0.069000f, - -0.112890f, - -0.473826f, - -0.112890f, - 0.000000f, - -0.227900f, - -0.946600f, - -0.227900f, - 0.875000f, - 0.103400f, - -0.076004f, - -0.488310f, - -0.076003f, - 0.000000f, - -0.154300f, - -0.975900f, - -0.154300f, - 0.875000f, - 0.069000f, - -0.415125f, - 0.027069f, - -0.277377f, - 0.000000f, - -0.830300f, - 0.054000f, - -0.554700f, - 0.906300f, - 0.517200f, - -0.410258f, - 0.080891f, - -0.274125f, - 0.000000f, - -0.820600f, - 0.161200f, - -0.548300f, - 0.906300f, - 0.551700f, - -0.348896f, - 0.080891f, - -0.348895f, - 0.000000f, - -0.697800f, - 0.161200f, - -0.697800f, - 0.875000f, - 0.551700f, - -0.415125f, - 0.027069f, - -0.277377f, - 0.000000f, - -0.830300f, - 0.054000f, - -0.554700f, - 0.906300f, - 0.517200f, - -0.348896f, - 0.080891f, - -0.348895f, - 0.000000f, - -0.697800f, - 0.161200f, - -0.697800f, - 0.875000f, - 0.551700f, - -0.353035f, - 0.027069f, - -0.353034f, - 0.000000f, - -0.706100f, - 0.054000f, - -0.706100f, - 0.875000f, - 0.517200f, - -0.044949f, - 0.497069f, - -0.030034f, - 0.000000f, - -0.092700f, - 0.993700f, - -0.061900f, - 0.432600f, - 0.962300f, - -0.000000f, - 0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - 1.000000f, - 0.000000f, - 0.423900f, - 0.960300f, - -0.038226f, - 0.497069f, - -0.038226f, - 0.000000f, - -0.078800f, - 0.993700f, - -0.078800f, - 0.434400f, - 0.962300f, - -0.044949f, - -0.497069f, - -0.030034f, - 0.000000f, - -0.092700f, - -0.993700f, - -0.061900f, - 0.906300f, - 0.034500f, - -0.089371f, - -0.488310f, - -0.059715f, - 0.000000f, - -0.181400f, - -0.975900f, - -0.121200f, - 0.906300f, - 0.069000f, - -0.076004f, - -0.488310f, - -0.076003f, - 0.000000f, - -0.154300f, - -0.975900f, - -0.154300f, - 0.875000f, - 0.069000f, - -0.044949f, - -0.497069f, - -0.030034f, - 0.000000f, - -0.092700f, - -0.993700f, - -0.061900f, - 0.906300f, - 0.034500f, - -0.076004f, - -0.488310f, - -0.076003f, - 0.000000f, - -0.154300f, - -0.975900f, - -0.154300f, - 0.875000f, - 0.069000f, - -0.038226f, - -0.497069f, - -0.038226f, - 0.000000f, - -0.078800f, - -0.993700f, - -0.078800f, - 0.875000f, - 0.034500f, - -0.415125f, - -0.027069f, - -0.277377f, - 0.000000f, - -0.830300f, - -0.054000f, - -0.554700f, - 0.906300f, - 0.482800f, - -0.415125f, - 0.027069f, - -0.277377f, - 0.000000f, - -0.830300f, - 0.054000f, - -0.554700f, - 0.906300f, - 0.517200f, - -0.353035f, - 0.027069f, - -0.353034f, - 0.000000f, - -0.706100f, - 0.054000f, - -0.706100f, - 0.875000f, - 0.517200f, - -0.415125f, - -0.027069f, - -0.277377f, - 0.000000f, - -0.830300f, - -0.054000f, - -0.554700f, - 0.906300f, - 0.482800f, - -0.353035f, - 0.027069f, - -0.353034f, - 0.000000f, - -0.706100f, - 0.054000f, - -0.706100f, - 0.875000f, - 0.517200f, - -0.353035f, - -0.027069f, - -0.353034f, - 0.000000f, - -0.706100f, - -0.054000f, - -0.706100f, - 0.875000f, - 0.482800f, - -0.089371f, - 0.488310f, - -0.059715f, - 0.000000f, - -0.181400f, - 0.975900f, - -0.121200f, - 0.906300f, - 0.931000f, - -0.044949f, - 0.497069f, - -0.030034f, - 0.000000f, - -0.092700f, - 0.993700f, - -0.061900f, - 0.906300f, - 0.965500f, - -0.038226f, - 0.497069f, - -0.038226f, - 0.000000f, - -0.078800f, - 0.993700f, - -0.078800f, - 0.875000f, - 0.965500f, - -0.089371f, - 0.488310f, - -0.059715f, - 0.000000f, - -0.181400f, - 0.975900f, - -0.121200f, - 0.906300f, - 0.931000f, - -0.038226f, - 0.497069f, - -0.038226f, - 0.000000f, - -0.078800f, - 0.993700f, - -0.078800f, - 0.875000f, - 0.965500f, - -0.076003f, - 0.488310f, - -0.076003f, - 0.000000f, - -0.154300f, - 0.975900f, - -0.154300f, - 0.875000f, - 0.931000f, - -0.000000f, - -0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - -1.000000f, - 0.000000f, - 0.495500f, - 0.051000f, - -0.044949f, - -0.497069f, - -0.030034f, - 0.000000f, - -0.092700f, - -0.993700f, - -0.061900f, - 0.486400f, - 0.053800f, - -0.038226f, - -0.497069f, - -0.038226f, - 0.000000f, - -0.078800f, - -0.993700f, - -0.078800f, - 0.483700f, - 0.053800f, - -0.410258f, - -0.080891f, - -0.274125f, - 0.000000f, - -0.820600f, - -0.161200f, - -0.548300f, - 0.906300f, - 0.448300f, - -0.415125f, - -0.027069f, - -0.277377f, - 0.000000f, - -0.830300f, - -0.054000f, - -0.554700f, - 0.906300f, - 0.482800f, - -0.353035f, - -0.027069f, - -0.353034f, - 0.000000f, - -0.706100f, - -0.054000f, - -0.706100f, - 0.875000f, - 0.482800f, - -0.410258f, - -0.080891f, - -0.274125f, - 0.000000f, - -0.820600f, - -0.161200f, - -0.548300f, - 0.906300f, - 0.448300f, - -0.353035f, - -0.027069f, - -0.353034f, - 0.000000f, - -0.706100f, - -0.054000f, - -0.706100f, - 0.875000f, - 0.482800f, - -0.348896f, - -0.080891f, - -0.348895f, - 0.000000f, - -0.697800f, - -0.161200f, - -0.697800f, - 0.875000f, - 0.448300f, - -0.328443f, - 0.185069f, - -0.328443f, - 0.000000f, - -0.657200f, - 0.369000f, - -0.657200f, - 0.875000f, - 0.620700f, - -0.312369f, - 0.234204f, - -0.312369f, - 0.000000f, - -0.625200f, - 0.467000f, - -0.625200f, - 0.875000f, - 0.655200f, - -0.245427f, - 0.234204f, - -0.367307f, - 0.000000f, - -0.491300f, - 0.467000f, - -0.735200f, - 0.843800f, - 0.655200f, - -0.328443f, - 0.185069f, - -0.328443f, - 0.000000f, - -0.657200f, - 0.369000f, - -0.657200f, - 0.875000f, - 0.620700f, - -0.245427f, - 0.234204f, - -0.367307f, - 0.000000f, - -0.491300f, - 0.467000f, - -0.735200f, - 0.843800f, - 0.655200f, - -0.258056f, - 0.185069f, - -0.386207f, - 0.000000f, - -0.516300f, - 0.369000f, - -0.772800f, - 0.843800f, - 0.620700f, - -0.148454f, - -0.453788f, - -0.148453f, - 0.000000f, - -0.298900f, - -0.906300f, - -0.298900f, - 0.875000f, - 0.137900f, - -0.182276f, - -0.428429f, - -0.182276f, - 0.000000f, - -0.366300f, - -0.855300f, - -0.366300f, - 0.875000f, - 0.172400f, - -0.143213f, - -0.428429f, - -0.214334f, - 0.000000f, - -0.287800f, - -0.855300f, - -0.430700f, - 0.843800f, - 0.172400f, - -0.148454f, - -0.453788f, - -0.148453f, - 0.000000f, - -0.298900f, - -0.906300f, - -0.298900f, - 0.875000f, - 0.137900f, - -0.143213f, - -0.428429f, - -0.214334f, - 0.000000f, - -0.287800f, - -0.855300f, - -0.430700f, - 0.843800f, - 0.172400f, - -0.116640f, - -0.453788f, - -0.174562f, - 0.000000f, - -0.234800f, - -0.906300f, - -0.351400f, - 0.843800f, - 0.137900f, - -0.340667f, - 0.133764f, - -0.340666f, - 0.000000f, - -0.681500f, - 0.266600f, - -0.681500f, - 0.875000f, - 0.586200f, - -0.328443f, - 0.185069f, - -0.328443f, - 0.000000f, - -0.657200f, - 0.369000f, - -0.657200f, - 0.875000f, - 0.620700f, - -0.258056f, - 0.185069f, - -0.386207f, - 0.000000f, - -0.516300f, - 0.369000f, - -0.772800f, - 0.843800f, - 0.620700f, - -0.340667f, - 0.133764f, - -0.340666f, - 0.000000f, - -0.681500f, - 0.266600f, - -0.681500f, - 0.875000f, - 0.586200f, - -0.258056f, - 0.185069f, - -0.386207f, - 0.000000f, - -0.516300f, - 0.369000f, - -0.772800f, - 0.843800f, - 0.620700f, - -0.267660f, - 0.133764f, - -0.400581f, - 0.000000f, - -0.535400f, - 0.266600f, - -0.801400f, - 0.843800f, - 0.586200f, - -0.112890f, - -0.473826f, - -0.112890f, - 0.000000f, - -0.227900f, - -0.946600f, - -0.227900f, - 0.875000f, - 0.103400f, - -0.148454f, - -0.453788f, - -0.148453f, - 0.000000f, - -0.298900f, - -0.906300f, - -0.298900f, - 0.875000f, - 0.137900f, - -0.116640f, - -0.453788f, - -0.174562f, - 0.000000f, - -0.234800f, - -0.906300f, - -0.351400f, - 0.843800f, - 0.137900f, - -0.112890f, - -0.473826f, - -0.112890f, - 0.000000f, - -0.227900f, - -0.946600f, - -0.227900f, - 0.875000f, - 0.103400f, - -0.116640f, - -0.453788f, - -0.174562f, - 0.000000f, - -0.234800f, - -0.906300f, - -0.351400f, - 0.843800f, - 0.137900f, - -0.088698f, - -0.473826f, - -0.132745f, - 0.000000f, - -0.179100f, - -0.946600f, - -0.268000f, - 0.843800f, - 0.103400f, - -0.348896f, - 0.080891f, - -0.348895f, - 0.000000f, - -0.697800f, - 0.161200f, - -0.697800f, - 0.875000f, - 0.551700f, - -0.340667f, - 0.133764f, - -0.340666f, - 0.000000f, - -0.681500f, - 0.266600f, - -0.681500f, - 0.875000f, - 0.586200f, - -0.267660f, - 0.133764f, - -0.400581f, - 0.000000f, - -0.535400f, - 0.266600f, - -0.801400f, - 0.843800f, - 0.586200f, - -0.348896f, - 0.080891f, - -0.348895f, - 0.000000f, - -0.697800f, - 0.161200f, - -0.697800f, - 0.875000f, - 0.551700f, - -0.267660f, - 0.133764f, - -0.400581f, - 0.000000f, - -0.535400f, - 0.266600f, - -0.801400f, - 0.843800f, - 0.586200f, - -0.274126f, - 0.080891f, - -0.410257f, - 0.000000f, - -0.548300f, - 0.161200f, - -0.820600f, - 0.843800f, - 0.551700f, - -0.076004f, - -0.488310f, - -0.076003f, - 0.000000f, - -0.154300f, - -0.975900f, - -0.154300f, - 0.875000f, - 0.069000f, - -0.112890f, - -0.473826f, - -0.112890f, - 0.000000f, - -0.227900f, - -0.946600f, - -0.227900f, - 0.875000f, - 0.103400f, - -0.088698f, - -0.473826f, - -0.132745f, - 0.000000f, - -0.179100f, - -0.946600f, - -0.268000f, - 0.843800f, - 0.103400f, - -0.076004f, - -0.488310f, - -0.076003f, - 0.000000f, - -0.154300f, - -0.975900f, - -0.154300f, - 0.875000f, - 0.069000f, - -0.088698f, - -0.473826f, - -0.132745f, - 0.000000f, - -0.179100f, - -0.946600f, - -0.268000f, - 0.843800f, - 0.103400f, - -0.059716f, - -0.488310f, - -0.089370f, - 0.000000f, - -0.121200f, - -0.975900f, - -0.181400f, - 0.843800f, - 0.069000f, - -0.353035f, - 0.027069f, - -0.353034f, - 0.000000f, - -0.706100f, - 0.054000f, - -0.706100f, - 0.875000f, - 0.517200f, - -0.348896f, - 0.080891f, - -0.348895f, - 0.000000f, - -0.697800f, - 0.161200f, - -0.697800f, - 0.875000f, - 0.551700f, - -0.274126f, - 0.080891f, - -0.410257f, - 0.000000f, - -0.548300f, - 0.161200f, - -0.820600f, - 0.843800f, - 0.551700f, - -0.353035f, - 0.027069f, - -0.353034f, - 0.000000f, - -0.706100f, - 0.054000f, - -0.706100f, - 0.875000f, - 0.517200f, - -0.274126f, - 0.080891f, - -0.410257f, - 0.000000f, - -0.548300f, - 0.161200f, - -0.820600f, - 0.843800f, - 0.551700f, - -0.277378f, - 0.027069f, - -0.415125f, - 0.000000f, - -0.554700f, - 0.054000f, - -0.830300f, - 0.843800f, - 0.517200f, - -0.038226f, - 0.497069f, - -0.038226f, - 0.000000f, - -0.078800f, - 0.993700f, - -0.078800f, - 0.434400f, - 0.962300f, - -0.000000f, - 0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - 1.000000f, - 0.000000f, - 0.423900f, - 0.960300f, - -0.030034f, - 0.497069f, - -0.044948f, - 0.000000f, - -0.061900f, - 0.993700f, - -0.092700f, - 0.436200f, - 0.962300f, - -0.038226f, - -0.497069f, - -0.038226f, - 0.000000f, - -0.078800f, - -0.993700f, - -0.078800f, - 0.875000f, - 0.034500f, - -0.076004f, - -0.488310f, - -0.076003f, - 0.000000f, - -0.154300f, - -0.975900f, - -0.154300f, - 0.875000f, - 0.069000f, - -0.059716f, - -0.488310f, - -0.089370f, - 0.000000f, - -0.121200f, - -0.975900f, - -0.181400f, - 0.843800f, - 0.069000f, - -0.038226f, - -0.497069f, - -0.038226f, - 0.000000f, - -0.078800f, - -0.993700f, - -0.078800f, - 0.875000f, - 0.034500f, - -0.059716f, - -0.488310f, - -0.089370f, - 0.000000f, - -0.121200f, - -0.975900f, - -0.181400f, - 0.843800f, - 0.069000f, - -0.030034f, - -0.497069f, - -0.044949f, - 0.000000f, - -0.061900f, - -0.993700f, - -0.092700f, - 0.843800f, - 0.034500f, - -0.353035f, - -0.027069f, - -0.353034f, - 0.000000f, - -0.706100f, - -0.054000f, - -0.706100f, - 0.875000f, - 0.482800f, - -0.353035f, - 0.027069f, - -0.353034f, - 0.000000f, - -0.706100f, - 0.054000f, - -0.706100f, - 0.875000f, - 0.517200f, - -0.277378f, - 0.027069f, - -0.415125f, - 0.000000f, - -0.554700f, - 0.054000f, - -0.830300f, - 0.843800f, - 0.517200f, - -0.353035f, - -0.027069f, - -0.353034f, - 0.000000f, - -0.706100f, - -0.054000f, - -0.706100f, - 0.875000f, - 0.482800f, - -0.277378f, - 0.027069f, - -0.415125f, - 0.000000f, - -0.554700f, - 0.054000f, - -0.830300f, - 0.843800f, - 0.517200f, - -0.277378f, - -0.027069f, - -0.415125f, - 0.000000f, - -0.554700f, - -0.054000f, - -0.830300f, - 0.843800f, - 0.482800f, - -0.076003f, - 0.488310f, - -0.076003f, - 0.000000f, - -0.154300f, - 0.975900f, - -0.154300f, - 0.875000f, - 0.931000f, - -0.038226f, - 0.497069f, - -0.038226f, - 0.000000f, - -0.078800f, - 0.993700f, - -0.078800f, - 0.875000f, - 0.965500f, - -0.030034f, - 0.497069f, - -0.044948f, - 0.000000f, - -0.061900f, - 0.993700f, - -0.092700f, - 0.843800f, - 0.965500f, - -0.076003f, - 0.488310f, - -0.076003f, - 0.000000f, - -0.154300f, - 0.975900f, - -0.154300f, - 0.875000f, - 0.931000f, - -0.030034f, - 0.497069f, - -0.044948f, - 0.000000f, - -0.061900f, - 0.993700f, - -0.092700f, - 0.843800f, - 0.965500f, - -0.059716f, - 0.488310f, - -0.089370f, - 0.000000f, - -0.121200f, - 0.975900f, - -0.181400f, - 0.843800f, - 0.931000f, - -0.000000f, - -0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - -1.000000f, - 0.000000f, - 0.495500f, - 0.051000f, - -0.038226f, - -0.497069f, - -0.038226f, - 0.000000f, - -0.078800f, - -0.993700f, - -0.078800f, - 0.483700f, - 0.053800f, - -0.030034f, - -0.497069f, - -0.044949f, - 0.000000f, - -0.061900f, - -0.993700f, - -0.092700f, - 0.481100f, - 0.053800f, - -0.348896f, - -0.080891f, - -0.348895f, - 0.000000f, - -0.697800f, - -0.161200f, - -0.697800f, - 0.875000f, - 0.448300f, - -0.353035f, - -0.027069f, - -0.353034f, - 0.000000f, - -0.706100f, - -0.054000f, - -0.706100f, - 0.875000f, - 0.482800f, - -0.277378f, - -0.027069f, - -0.415125f, - 0.000000f, - -0.554700f, - -0.054000f, - -0.830300f, - 0.843800f, - 0.482800f, - -0.348896f, - -0.080891f, - -0.348895f, - 0.000000f, - -0.697800f, - -0.161200f, - -0.697800f, - 0.875000f, - 0.448300f, - -0.277378f, - -0.027069f, - -0.415125f, - 0.000000f, - -0.554700f, - -0.054000f, - -0.830300f, - 0.843800f, - 0.482800f, - -0.274126f, - -0.080891f, - -0.410257f, - 0.000000f, - -0.548300f, - -0.161200f, - -0.820600f, - 0.843800f, - 0.448300f, - -0.112890f, - 0.473826f, - -0.112890f, - 0.000000f, - -0.227900f, - 0.946600f, - -0.227900f, - 0.875000f, - 0.896600f, - -0.076003f, - 0.488310f, - -0.076003f, - 0.000000f, - -0.154300f, - 0.975900f, - -0.154300f, - 0.875000f, - 0.931000f, - -0.059716f, - 0.488310f, - -0.089370f, - 0.000000f, - -0.121200f, - 0.975900f, - -0.181400f, - 0.843800f, - 0.931000f, - -0.112890f, - 0.473826f, - -0.112890f, - 0.000000f, - -0.227900f, - 0.946600f, - -0.227900f, - 0.875000f, - 0.896600f, - -0.059716f, - 0.488310f, - -0.089370f, - 0.000000f, - -0.121200f, - 0.975900f, - -0.181400f, - 0.843800f, - 0.931000f, - -0.088698f, - 0.473826f, - -0.132745f, - 0.000000f, - -0.179100f, - 0.946600f, - -0.268000f, - 0.843800f, - 0.896600f, - -0.340667f, - -0.133764f, - -0.340666f, - 0.000000f, - -0.681500f, - -0.266600f, - -0.681500f, - 0.875000f, - 0.413800f, - -0.348896f, - -0.080891f, - -0.348895f, - 0.000000f, - -0.697800f, - -0.161200f, - -0.697800f, - 0.875000f, - 0.448300f, - -0.274126f, - -0.080891f, - -0.410257f, - 0.000000f, - -0.548300f, - -0.161200f, - -0.820600f, - 0.843800f, - 0.448300f, - -0.340667f, - -0.133764f, - -0.340666f, - 0.000000f, - -0.681500f, - -0.266600f, - -0.681500f, - 0.875000f, - 0.413800f, - -0.274126f, - -0.080891f, - -0.410257f, - 0.000000f, - -0.548300f, - -0.161200f, - -0.820600f, - 0.843800f, - 0.448300f, - -0.267660f, - -0.133764f, - -0.400581f, - 0.000000f, - -0.535400f, - -0.266600f, - -0.801400f, - 0.843800f, - 0.413800f, - -0.148454f, - 0.453788f, - -0.148453f, - 0.000000f, - -0.298900f, - 0.906300f, - -0.298900f, - 0.875000f, - 0.862100f, - -0.112890f, - 0.473826f, - -0.112890f, - 0.000000f, - -0.227900f, - 0.946600f, - -0.227900f, - 0.875000f, - 0.896600f, - -0.088698f, - 0.473826f, - -0.132745f, - 0.000000f, - -0.179100f, - 0.946600f, - -0.268000f, - 0.843800f, - 0.896600f, - -0.148454f, - 0.453788f, - -0.148453f, - 0.000000f, - -0.298900f, - 0.906300f, - -0.298900f, - 0.875000f, - 0.862100f, - -0.088698f, - 0.473826f, - -0.132745f, - 0.000000f, - -0.179100f, - 0.946600f, - -0.268000f, - 0.843800f, - 0.896600f, - -0.116639f, - 0.453788f, - -0.174562f, - 0.000000f, - -0.234800f, - 0.906300f, - -0.351400f, - 0.843800f, - 0.862100f, - -0.328443f, - -0.185069f, - -0.328443f, - 0.000000f, - -0.657200f, - -0.369000f, - -0.657200f, - 0.875000f, - 0.379300f, - -0.340667f, - -0.133764f, - -0.340666f, - 0.000000f, - -0.681500f, - -0.266600f, - -0.681500f, - 0.875000f, - 0.413800f, - -0.267660f, - -0.133764f, - -0.400581f, - 0.000000f, - -0.535400f, - -0.266600f, - -0.801400f, - 0.843800f, - 0.413800f, - -0.328443f, - -0.185069f, - -0.328443f, - 0.000000f, - -0.657200f, - -0.369000f, - -0.657200f, - 0.875000f, - 0.379300f, - -0.267660f, - -0.133764f, - -0.400581f, - 0.000000f, - -0.535400f, - -0.266600f, - -0.801400f, - 0.843800f, - 0.413800f, - -0.258056f, - -0.185069f, - -0.386207f, - 0.000000f, - -0.516300f, - -0.369000f, - -0.772800f, - 0.843800f, - 0.379300f, - -0.182276f, - 0.428429f, - -0.182276f, - 0.000000f, - -0.366300f, - 0.855300f, - -0.366300f, - 0.875000f, - 0.827600f, - -0.148454f, - 0.453788f, - -0.148453f, - 0.000000f, - -0.298900f, - 0.906300f, - -0.298900f, - 0.875000f, - 0.862100f, - -0.116639f, - 0.453788f, - -0.174562f, - 0.000000f, - -0.234800f, - 0.906300f, - -0.351400f, - 0.843800f, - 0.862100f, - -0.182276f, - 0.428429f, - -0.182276f, - 0.000000f, - -0.366300f, - 0.855300f, - -0.366300f, - 0.875000f, - 0.827600f, - -0.116639f, - 0.453788f, - -0.174562f, - 0.000000f, - -0.234800f, - 0.906300f, - -0.351400f, - 0.843800f, - 0.862100f, - -0.143213f, - 0.428429f, - -0.214334f, - 0.000000f, - -0.287800f, - 0.855300f, - -0.430700f, - 0.843800f, - 0.827600f, - -0.312369f, - -0.234204f, - -0.312369f, - 0.000000f, - -0.625200f, - -0.467000f, - -0.625200f, - 0.875000f, - 0.344800f, - -0.328443f, - -0.185069f, - -0.328443f, - 0.000000f, - -0.657200f, - -0.369000f, - -0.657200f, - 0.875000f, - 0.379300f, - -0.258056f, - -0.185069f, - -0.386207f, - 0.000000f, - -0.516300f, - -0.369000f, - -0.772800f, - 0.843800f, - 0.379300f, - -0.312369f, - -0.234204f, - -0.312369f, - 0.000000f, - -0.625200f, - -0.467000f, - -0.625200f, - 0.875000f, - 0.344800f, - -0.258056f, - -0.185069f, - -0.386207f, - 0.000000f, - -0.516300f, - -0.369000f, - -0.772800f, - 0.843800f, - 0.379300f, - -0.245427f, - -0.234204f, - -0.367307f, - 0.000000f, - -0.491300f, - -0.467000f, - -0.735200f, - 0.843800f, - 0.344800f, - -0.213961f, - 0.398046f, - -0.213961f, - 0.000000f, - -0.429400f, - 0.794500f, - -0.429400f, - 0.875000f, - 0.793100f, - -0.182276f, - 0.428429f, - -0.182276f, - 0.000000f, - -0.366300f, - 0.855300f, - -0.366300f, - 0.875000f, - 0.827600f, - -0.143213f, - 0.428429f, - -0.214334f, - 0.000000f, - -0.287800f, - 0.855300f, - -0.430700f, - 0.843800f, - 0.827600f, - -0.213961f, - 0.398046f, - -0.213961f, - 0.000000f, - -0.429400f, - 0.794500f, - -0.429400f, - 0.875000f, - 0.793100f, - -0.143213f, - 0.428429f, - -0.214334f, - 0.000000f, - -0.287800f, - 0.855300f, - -0.430700f, - 0.843800f, - 0.827600f, - -0.168108f, - 0.398046f, - -0.251592f, - 0.000000f, - -0.337400f, - 0.794500f, - -0.504900f, - 0.843800f, - 0.793100f, - -0.292632f, - -0.280594f, - -0.292632f, - 0.000000f, - -0.586000f, - -0.559600f, - -0.586000f, - 0.875000f, - 0.310300f, - -0.312369f, - -0.234204f, - -0.312369f, - 0.000000f, - -0.625200f, - -0.467000f, - -0.625200f, - 0.875000f, - 0.344800f, - -0.245427f, - -0.234204f, - -0.367307f, - 0.000000f, - -0.491300f, - -0.467000f, - -0.735200f, - 0.843800f, - 0.344800f, - -0.292632f, - -0.280594f, - -0.292632f, - 0.000000f, - -0.586000f, - -0.559600f, - -0.586000f, - 0.875000f, - 0.310300f, - -0.245427f, - -0.234204f, - -0.367307f, - 0.000000f, - -0.491300f, - -0.467000f, - -0.735200f, - 0.843800f, - 0.344800f, - -0.229920f, - -0.280594f, - -0.344099f, - 0.000000f, - -0.460400f, - -0.559600f, - -0.689100f, - 0.843800f, - 0.310300f, - -0.243139f, - 0.362998f, - -0.243138f, - 0.000000f, - -0.487500f, - 0.724300f, - -0.487500f, - 0.875000f, - 0.758600f, - -0.213961f, - 0.398046f, - -0.213961f, - 0.000000f, - -0.429400f, - 0.794500f, - -0.429400f, - 0.875000f, - 0.793100f, - -0.168108f, - 0.398046f, - -0.251592f, - 0.000000f, - -0.337400f, - 0.794500f, - -0.504900f, - 0.843800f, - 0.793100f, - -0.243139f, - 0.362998f, - -0.243138f, - 0.000000f, - -0.487500f, - 0.724300f, - -0.487500f, - 0.875000f, - 0.758600f, - -0.168108f, - 0.398046f, - -0.251592f, - 0.000000f, - -0.337400f, - 0.794500f, - -0.504900f, - 0.843800f, - 0.793100f, - -0.191033f, - 0.362998f, - -0.285900f, - 0.000000f, - -0.383000f, - 0.724300f, - -0.573300f, - 0.843800f, - 0.758600f, - -0.269465f, - -0.323693f, - -0.269464f, - 0.000000f, - -0.539900f, - -0.645700f, - -0.539900f, - 0.875000f, - 0.275900f, - -0.292632f, - -0.280594f, - -0.292632f, - 0.000000f, - -0.586000f, - -0.559600f, - -0.586000f, - 0.875000f, - 0.310300f, - -0.229920f, - -0.280594f, - -0.344099f, - 0.000000f, - -0.460400f, - -0.559600f, - -0.689100f, - 0.843800f, - 0.310300f, - -0.269465f, - -0.323693f, - -0.269464f, - 0.000000f, - -0.539900f, - -0.645700f, - -0.539900f, - 0.875000f, - 0.275900f, - -0.229920f, - -0.280594f, - -0.344099f, - 0.000000f, - -0.460400f, - -0.559600f, - -0.689100f, - 0.843800f, - 0.310300f, - -0.211718f, - -0.323693f, - -0.316857f, - 0.000000f, - -0.424200f, - -0.645700f, - -0.634900f, - 0.843800f, - 0.275900f, - -0.269465f, - 0.323693f, - -0.269464f, - 0.000000f, - -0.539900f, - 0.645700f, - -0.539900f, - 0.875000f, - 0.724100f, - -0.243139f, - 0.362998f, - -0.243138f, - 0.000000f, - -0.487500f, - 0.724300f, - -0.487500f, - 0.875000f, - 0.758600f, - -0.191033f, - 0.362998f, - -0.285900f, - 0.000000f, - -0.383000f, - 0.724300f, - -0.573300f, - 0.843800f, - 0.758600f, - -0.269465f, - 0.323693f, - -0.269464f, - 0.000000f, - -0.539900f, - 0.645700f, - -0.539900f, - 0.875000f, - 0.724100f, - -0.191033f, - 0.362998f, - -0.285900f, - 0.000000f, - -0.383000f, - 0.724300f, - -0.573300f, - 0.843800f, - 0.758600f, - -0.211718f, - 0.323693f, - -0.316857f, - 0.000000f, - -0.424200f, - 0.645700f, - -0.634900f, - 0.843800f, - 0.724100f, - -0.243139f, - -0.362998f, - -0.243138f, - 0.000000f, - -0.487500f, - -0.724300f, - -0.487500f, - 0.875000f, - 0.241400f, - -0.269465f, - -0.323693f, - -0.269464f, - 0.000000f, - -0.539900f, - -0.645700f, - -0.539900f, - 0.875000f, - 0.275900f, - -0.211718f, - -0.323693f, - -0.316857f, - 0.000000f, - -0.424200f, - -0.645700f, - -0.634900f, - 0.843800f, - 0.275900f, - -0.243139f, - -0.362998f, - -0.243138f, - 0.000000f, - -0.487500f, - -0.724300f, - -0.487500f, - 0.875000f, - 0.241400f, - -0.211718f, - -0.323693f, - -0.316857f, - 0.000000f, - -0.424200f, - -0.645700f, - -0.634900f, - 0.843800f, - 0.275900f, - -0.191033f, - -0.362998f, - -0.285901f, - 0.000000f, - -0.383000f, - -0.724300f, - -0.573300f, - 0.843800f, - 0.241400f, - -0.292632f, - 0.280594f, - -0.292632f, - 0.000000f, - -0.586000f, - 0.559600f, - -0.586000f, - 0.875000f, - 0.689700f, - -0.269465f, - 0.323693f, - -0.269464f, - 0.000000f, - -0.539900f, - 0.645700f, - -0.539900f, - 0.875000f, - 0.724100f, - -0.211718f, - 0.323693f, - -0.316857f, - 0.000000f, - -0.424200f, - 0.645700f, - -0.634900f, - 0.843800f, - 0.724100f, - -0.292632f, - 0.280594f, - -0.292632f, - 0.000000f, - -0.586000f, - 0.559600f, - -0.586000f, - 0.875000f, - 0.689700f, - -0.211718f, - 0.323693f, - -0.316857f, - 0.000000f, - -0.424200f, - 0.645700f, - -0.634900f, - 0.843800f, - 0.724100f, - -0.229920f, - 0.280594f, - -0.344099f, - 0.000000f, - -0.460400f, - 0.559600f, - -0.689100f, - 0.843800f, - 0.689700f, - -0.213961f, - -0.398046f, - -0.213961f, - 0.000000f, - -0.429400f, - -0.794500f, - -0.429400f, - 0.875000f, - 0.206900f, - -0.243139f, - -0.362998f, - -0.243138f, - 0.000000f, - -0.487500f, - -0.724300f, - -0.487500f, - 0.875000f, - 0.241400f, - -0.191033f, - -0.362998f, - -0.285901f, - 0.000000f, - -0.383000f, - -0.724300f, - -0.573300f, - 0.843800f, - 0.241400f, - -0.213961f, - -0.398046f, - -0.213961f, - 0.000000f, - -0.429400f, - -0.794500f, - -0.429400f, - 0.875000f, - 0.206900f, - -0.191033f, - -0.362998f, - -0.285901f, - 0.000000f, - -0.383000f, - -0.724300f, - -0.573300f, - 0.843800f, - 0.241400f, - -0.168108f, - -0.398046f, - -0.251592f, - 0.000000f, - -0.337400f, - -0.794500f, - -0.505000f, - 0.843800f, - 0.206900f, - -0.312369f, - 0.234204f, - -0.312369f, - 0.000000f, - -0.625200f, - 0.467000f, - -0.625200f, - 0.875000f, - 0.655200f, - -0.292632f, - 0.280594f, - -0.292632f, - 0.000000f, - -0.586000f, - 0.559600f, - -0.586000f, - 0.875000f, - 0.689700f, - -0.229920f, - 0.280594f, - -0.344099f, - 0.000000f, - -0.460400f, - 0.559600f, - -0.689100f, - 0.843800f, - 0.689700f, - -0.312369f, - 0.234204f, - -0.312369f, - 0.000000f, - -0.625200f, - 0.467000f, - -0.625200f, - 0.875000f, - 0.655200f, - -0.229920f, - 0.280594f, - -0.344099f, - 0.000000f, - -0.460400f, - 0.559600f, - -0.689100f, - 0.843800f, - 0.689700f, - -0.245427f, - 0.234204f, - -0.367307f, - 0.000000f, - -0.491300f, - 0.467000f, - -0.735200f, - 0.843800f, - 0.655200f, - -0.182276f, - -0.428429f, - -0.182276f, - 0.000000f, - -0.366300f, - -0.855300f, - -0.366300f, - 0.875000f, - 0.172400f, - -0.213961f, - -0.398046f, - -0.213961f, - 0.000000f, - -0.429400f, - -0.794500f, - -0.429400f, - 0.875000f, - 0.206900f, - -0.168108f, - -0.398046f, - -0.251592f, - 0.000000f, - -0.337400f, - -0.794500f, - -0.505000f, - 0.843800f, - 0.206900f, - -0.182276f, - -0.428429f, - -0.182276f, - 0.000000f, - -0.366300f, - -0.855300f, - -0.366300f, - 0.875000f, - 0.172400f, - -0.168108f, - -0.398046f, - -0.251592f, - 0.000000f, - -0.337400f, - -0.794500f, - -0.505000f, - 0.843800f, - 0.206900f, - -0.143213f, - -0.428429f, - -0.214334f, - 0.000000f, - -0.287800f, - -0.855300f, - -0.430700f, - 0.843800f, - 0.172400f, - -0.245427f, - -0.234204f, - -0.367307f, - 0.000000f, - -0.491300f, - -0.467000f, - -0.735200f, - 0.843800f, - 0.344800f, - -0.258056f, - -0.185069f, - -0.386207f, - 0.000000f, - -0.516300f, - -0.369000f, - -0.772800f, - 0.843800f, - 0.379300f, - -0.177752f, - -0.185069f, - -0.429131f, - 0.000000f, - -0.355700f, - -0.369000f, - -0.858700f, - 0.812500f, - 0.379300f, - -0.245427f, - -0.234204f, - -0.367307f, - 0.000000f, - -0.491300f, - -0.467000f, - -0.735200f, - 0.843800f, - 0.344800f, - -0.177752f, - -0.185069f, - -0.429131f, - 0.000000f, - -0.355700f, - -0.369000f, - -0.858700f, - 0.812500f, - 0.379300f, - -0.169053f, - -0.234204f, - -0.408129f, - 0.000000f, - -0.338400f, - -0.467000f, - -0.816900f, - 0.812500f, - 0.344800f, - -0.168108f, - 0.398046f, - -0.251592f, - 0.000000f, - -0.337400f, - 0.794500f, - -0.504900f, - 0.843800f, - 0.793100f, - -0.143213f, - 0.428429f, - -0.214334f, - 0.000000f, - -0.287800f, - 0.855300f, - -0.430700f, - 0.843800f, - 0.827600f, - -0.098647f, - 0.428429f, - -0.238155f, - 0.000000f, - -0.198200f, - 0.855300f, - -0.478600f, - 0.812500f, - 0.827600f, - -0.168108f, - 0.398046f, - -0.251592f, - 0.000000f, - -0.337400f, - 0.794500f, - -0.504900f, - 0.843800f, - 0.793100f, - -0.098647f, - 0.428429f, - -0.238155f, - 0.000000f, - -0.198200f, - 0.855300f, - -0.478600f, - 0.812500f, - 0.827600f, - -0.115796f, - 0.398046f, - -0.279554f, - 0.000000f, - -0.232400f, - 0.794500f, - -0.561100f, - 0.812500f, - 0.793100f, - -0.229920f, - -0.280594f, - -0.344099f, - 0.000000f, - -0.460400f, - -0.559600f, - -0.689100f, - 0.843800f, - 0.310300f, - -0.245427f, - -0.234204f, - -0.367307f, - 0.000000f, - -0.491300f, - -0.467000f, - -0.735200f, - 0.843800f, - 0.344800f, - -0.169053f, - -0.234204f, - -0.408129f, - 0.000000f, - -0.338400f, - -0.467000f, - -0.816900f, - 0.812500f, - 0.344800f, - -0.229920f, - -0.280594f, - -0.344099f, - 0.000000f, - -0.460400f, - -0.559600f, - -0.689100f, - 0.843800f, - 0.310300f, - -0.169053f, - -0.234204f, - -0.408129f, - 0.000000f, - -0.338400f, - -0.467000f, - -0.816900f, - 0.812500f, - 0.344800f, - -0.158371f, - -0.280594f, - -0.382342f, - 0.000000f, - -0.317100f, - -0.559600f, - -0.765600f, - 0.812500f, - 0.310300f, - -0.191033f, - 0.362998f, - -0.285900f, - 0.000000f, - -0.383000f, - 0.724300f, - -0.573300f, - 0.843800f, - 0.758600f, - -0.168108f, - 0.398046f, - -0.251592f, - 0.000000f, - -0.337400f, - 0.794500f, - -0.504900f, - 0.843800f, - 0.793100f, - -0.115796f, - 0.398046f, - -0.279554f, - 0.000000f, - -0.232400f, - 0.794500f, - -0.561100f, - 0.812500f, - 0.793100f, - -0.191033f, - 0.362998f, - -0.285900f, - 0.000000f, - -0.383000f, - 0.724300f, - -0.573300f, - 0.843800f, - 0.758600f, - -0.115796f, - 0.398046f, - -0.279554f, - 0.000000f, - -0.232400f, - 0.794500f, - -0.561100f, - 0.812500f, - 0.793100f, - -0.131586f, - 0.362998f, - -0.317676f, - 0.000000f, - -0.263800f, - 0.724300f, - -0.637000f, - 0.812500f, - 0.758600f, - -0.211718f, - -0.323693f, - -0.316857f, - 0.000000f, - -0.424200f, - -0.645700f, - -0.634900f, - 0.843800f, - 0.275900f, - -0.229920f, - -0.280594f, - -0.344099f, - 0.000000f, - -0.460400f, - -0.559600f, - -0.689100f, - 0.843800f, - 0.310300f, - -0.158371f, - -0.280594f, - -0.382342f, - 0.000000f, - -0.317100f, - -0.559600f, - -0.765600f, - 0.812500f, - 0.310300f, - -0.211718f, - -0.323693f, - -0.316857f, - 0.000000f, - -0.424200f, - -0.645700f, - -0.634900f, - 0.843800f, - 0.275900f, - -0.158371f, - -0.280594f, - -0.382342f, - 0.000000f, - -0.317100f, - -0.559600f, - -0.765600f, - 0.812500f, - 0.310300f, - -0.145834f, - -0.323693f, - -0.352073f, - 0.000000f, - -0.292200f, - -0.645700f, - -0.705400f, - 0.812500f, - 0.275900f, - -0.211718f, - 0.323693f, - -0.316857f, - 0.000000f, - -0.424200f, - 0.645700f, - -0.634900f, - 0.843800f, - 0.724100f, - -0.191033f, - 0.362998f, - -0.285900f, - 0.000000f, - -0.383000f, - 0.724300f, - -0.573300f, - 0.843800f, - 0.758600f, - -0.131586f, - 0.362998f, - -0.317676f, - 0.000000f, - -0.263800f, - 0.724300f, - -0.637000f, - 0.812500f, - 0.758600f, - -0.211718f, - 0.323693f, - -0.316857f, - 0.000000f, - -0.424200f, - 0.645700f, - -0.634900f, - 0.843800f, - 0.724100f, - -0.131586f, - 0.362998f, - -0.317676f, - 0.000000f, - -0.263800f, - 0.724300f, - -0.637000f, - 0.812500f, - 0.758600f, - -0.145834f, - 0.323693f, - -0.352073f, - 0.000000f, - -0.292200f, - 0.645700f, - -0.705400f, - 0.812500f, - 0.724100f, - -0.191033f, - -0.362998f, - -0.285901f, - 0.000000f, - -0.383000f, - -0.724300f, - -0.573300f, - 0.843800f, - 0.241400f, - -0.211718f, - -0.323693f, - -0.316857f, - 0.000000f, - -0.424200f, - -0.645700f, - -0.634900f, - 0.843800f, - 0.275900f, - -0.145834f, - -0.323693f, - -0.352073f, - 0.000000f, - -0.292200f, - -0.645700f, - -0.705400f, - 0.812500f, - 0.275900f, - -0.191033f, - -0.362998f, - -0.285901f, - 0.000000f, - -0.383000f, - -0.724300f, - -0.573300f, - 0.843800f, - 0.241400f, - -0.145834f, - -0.323693f, - -0.352073f, - 0.000000f, - -0.292200f, - -0.645700f, - -0.705400f, - 0.812500f, - 0.275900f, - -0.131586f, - -0.362998f, - -0.317676f, - 0.000000f, - -0.263800f, - -0.724300f, - -0.637000f, - 0.812500f, - 0.241400f, - -0.229920f, - 0.280594f, - -0.344099f, - 0.000000f, - -0.460400f, - 0.559600f, - -0.689100f, - 0.843800f, - 0.689700f, - -0.211718f, - 0.323693f, - -0.316857f, - 0.000000f, - -0.424200f, - 0.645700f, - -0.634900f, - 0.843800f, - 0.724100f, - -0.145834f, - 0.323693f, - -0.352073f, - 0.000000f, - -0.292200f, - 0.645700f, - -0.705400f, - 0.812500f, - 0.724100f, - -0.229920f, - 0.280594f, - -0.344099f, - 0.000000f, - -0.460400f, - 0.559600f, - -0.689100f, - 0.843800f, - 0.689700f, - -0.145834f, - 0.323693f, - -0.352073f, - 0.000000f, - -0.292200f, - 0.645700f, - -0.705400f, - 0.812500f, - 0.724100f, - -0.158371f, - 0.280594f, - -0.382342f, - 0.000000f, - -0.317100f, - 0.559600f, - -0.765600f, - 0.812500f, - 0.689700f, - -0.168108f, - -0.398046f, - -0.251592f, - 0.000000f, - -0.337400f, - -0.794500f, - -0.505000f, - 0.843800f, - 0.206900f, - -0.191033f, - -0.362998f, - -0.285901f, - 0.000000f, - -0.383000f, - -0.724300f, - -0.573300f, - 0.843800f, - 0.241400f, - -0.131586f, - -0.362998f, - -0.317676f, - 0.000000f, - -0.263800f, - -0.724300f, - -0.637000f, - 0.812500f, - 0.241400f, - -0.168108f, - -0.398046f, - -0.251592f, - 0.000000f, - -0.337400f, - -0.794500f, - -0.505000f, - 0.843800f, - 0.206900f, - -0.131586f, - -0.362998f, - -0.317676f, - 0.000000f, - -0.263800f, - -0.724300f, - -0.637000f, - 0.812500f, - 0.241400f, - -0.115796f, - -0.398046f, - -0.279554f, - 0.000000f, - -0.232400f, - -0.794500f, - -0.561100f, - 0.812500f, - 0.206900f, - -0.245427f, - 0.234204f, - -0.367307f, - 0.000000f, - -0.491300f, - 0.467000f, - -0.735200f, - 0.843800f, - 0.655200f, - -0.229920f, - 0.280594f, - -0.344099f, - 0.000000f, - -0.460400f, - 0.559600f, - -0.689100f, - 0.843800f, - 0.689700f, - -0.158371f, - 0.280594f, - -0.382342f, - 0.000000f, - -0.317100f, - 0.559600f, - -0.765600f, - 0.812500f, - 0.689700f, - -0.245427f, - 0.234204f, - -0.367307f, - 0.000000f, - -0.491300f, - 0.467000f, - -0.735200f, - 0.843800f, - 0.655200f, - -0.158371f, - 0.280594f, - -0.382342f, - 0.000000f, - -0.317100f, - 0.559600f, - -0.765600f, - 0.812500f, - 0.689700f, - -0.169053f, - 0.234204f, - -0.408129f, - 0.000000f, - -0.338400f, - 0.467000f, - -0.816900f, - 0.812500f, - 0.655200f, - -0.143213f, - -0.428429f, - -0.214334f, - 0.000000f, - -0.287800f, - -0.855300f, - -0.430700f, - 0.843800f, - 0.172400f, - -0.168108f, - -0.398046f, - -0.251592f, - 0.000000f, - -0.337400f, - -0.794500f, - -0.505000f, - 0.843800f, - 0.206900f, - -0.115796f, - -0.398046f, - -0.279554f, - 0.000000f, - -0.232400f, - -0.794500f, - -0.561100f, - 0.812500f, - 0.206900f, - -0.143213f, - -0.428429f, - -0.214334f, - 0.000000f, - -0.287800f, - -0.855300f, - -0.430700f, - 0.843800f, - 0.172400f, - -0.115796f, - -0.398046f, - -0.279554f, - 0.000000f, - -0.232400f, - -0.794500f, - -0.561100f, - 0.812500f, - 0.206900f, - -0.098647f, - -0.428429f, - -0.238155f, - 0.000000f, - -0.198200f, - -0.855300f, - -0.478600f, - 0.812500f, - 0.172400f, - -0.258056f, - 0.185069f, - -0.386207f, - 0.000000f, - -0.516300f, - 0.369000f, - -0.772800f, - 0.843800f, - 0.620700f, - -0.245427f, - 0.234204f, - -0.367307f, - 0.000000f, - -0.491300f, - 0.467000f, - -0.735200f, - 0.843800f, - 0.655200f, - -0.169053f, - 0.234204f, - -0.408129f, - 0.000000f, - -0.338400f, - 0.467000f, - -0.816900f, - 0.812500f, - 0.655200f, - -0.258056f, - 0.185069f, - -0.386207f, - 0.000000f, - -0.516300f, - 0.369000f, - -0.772800f, - 0.843800f, - 0.620700f, - -0.169053f, - 0.234204f, - -0.408129f, - 0.000000f, - -0.338400f, - 0.467000f, - -0.816900f, - 0.812500f, - 0.655200f, - -0.177752f, - 0.185069f, - -0.429131f, - 0.000000f, - -0.355700f, - 0.369000f, - -0.858700f, - 0.812500f, - 0.620700f, - -0.116640f, - -0.453788f, - -0.174562f, - 0.000000f, - -0.234800f, - -0.906300f, - -0.351400f, - 0.843800f, - 0.137900f, - -0.143213f, - -0.428429f, - -0.214334f, - 0.000000f, - -0.287800f, - -0.855300f, - -0.430700f, - 0.843800f, - 0.172400f, - -0.098647f, - -0.428429f, - -0.238155f, - 0.000000f, - -0.198200f, - -0.855300f, - -0.478600f, - 0.812500f, - 0.172400f, - -0.116640f, - -0.453788f, - -0.174562f, - 0.000000f, - -0.234800f, - -0.906300f, - -0.351400f, - 0.843800f, - 0.137900f, - -0.098647f, - -0.428429f, - -0.238155f, - 0.000000f, - -0.198200f, - -0.855300f, - -0.478600f, - 0.812500f, - 0.172400f, - -0.080343f, - -0.453788f, - -0.193963f, - 0.000000f, - -0.161700f, - -0.906300f, - -0.390500f, - 0.812500f, - 0.137900f, - -0.267660f, - 0.133764f, - -0.400581f, - 0.000000f, - -0.535400f, - 0.266600f, - -0.801400f, - 0.843800f, - 0.586200f, - -0.258056f, - 0.185069f, - -0.386207f, - 0.000000f, - -0.516300f, - 0.369000f, - -0.772800f, - 0.843800f, - 0.620700f, - -0.177752f, - 0.185069f, - -0.429131f, - 0.000000f, - -0.355700f, - 0.369000f, - -0.858700f, - 0.812500f, - 0.620700f, - -0.267660f, - 0.133764f, - -0.400581f, - 0.000000f, - -0.535400f, - 0.266600f, - -0.801400f, - 0.843800f, - 0.586200f, - -0.177752f, - 0.185069f, - -0.429131f, - 0.000000f, - -0.355700f, - 0.369000f, - -0.858700f, - 0.812500f, - 0.620700f, - -0.184367f, - 0.133764f, - -0.445101f, - 0.000000f, - -0.368800f, - 0.266600f, - -0.890400f, - 0.812500f, - 0.586200f, - -0.088698f, - -0.473826f, - -0.132745f, - 0.000000f, - -0.179100f, - -0.946600f, - -0.268000f, - 0.843800f, - 0.103400f, - -0.116640f, - -0.453788f, - -0.174562f, - 0.000000f, - -0.234800f, - -0.906300f, - -0.351400f, - 0.843800f, - 0.137900f, - -0.080343f, - -0.453788f, - -0.193963f, - 0.000000f, - -0.161700f, - -0.906300f, - -0.390500f, - 0.812500f, - 0.137900f, - -0.088698f, - -0.473826f, - -0.132745f, - 0.000000f, - -0.179100f, - -0.946600f, - -0.268000f, - 0.843800f, - 0.103400f, - -0.080343f, - -0.453788f, - -0.193963f, - 0.000000f, - -0.161700f, - -0.906300f, - -0.390500f, - 0.812500f, - 0.137900f, - -0.061096f, - -0.473826f, - -0.147498f, - 0.000000f, - -0.123300f, - -0.946600f, - -0.297800f, - 0.812500f, - 0.103400f, - -0.274126f, - 0.080891f, - -0.410257f, - 0.000000f, - -0.548300f, - 0.161200f, - -0.820600f, - 0.843800f, - 0.551700f, - -0.267660f, - 0.133764f, - -0.400581f, - 0.000000f, - -0.535400f, - 0.266600f, - -0.801400f, - 0.843800f, - 0.586200f, - -0.184367f, - 0.133764f, - -0.445101f, - 0.000000f, - -0.368800f, - 0.266600f, - -0.890400f, - 0.812500f, - 0.586200f, - -0.274126f, - 0.080891f, - -0.410257f, - 0.000000f, - -0.548300f, - 0.161200f, - -0.820600f, - 0.843800f, - 0.551700f, - -0.184367f, - 0.133764f, - -0.445101f, - 0.000000f, - -0.368800f, - 0.266600f, - -0.890400f, - 0.812500f, - 0.586200f, - -0.188821f, - 0.080891f, - -0.455854f, - 0.000000f, - -0.377700f, - 0.161200f, - -0.911800f, - 0.812500f, - 0.551700f, - -0.059716f, - -0.488310f, - -0.089370f, - 0.000000f, - -0.121200f, - -0.975900f, - -0.181400f, - 0.843800f, - 0.069000f, - -0.088698f, - -0.473826f, - -0.132745f, - 0.000000f, - -0.179100f, - -0.946600f, - -0.268000f, - 0.843800f, - 0.103400f, - -0.061096f, - -0.473826f, - -0.147498f, - 0.000000f, - -0.123300f, - -0.946600f, - -0.297800f, - 0.812500f, - 0.103400f, - -0.059716f, - -0.488310f, - -0.089370f, - 0.000000f, - -0.121200f, - -0.975900f, - -0.181400f, - 0.843800f, - 0.069000f, - -0.061096f, - -0.473826f, - -0.147498f, - 0.000000f, - -0.123300f, - -0.946600f, - -0.297800f, - 0.812500f, - 0.103400f, - -0.041133f, - -0.488310f, - -0.099303f, - 0.000000f, - -0.083500f, - -0.975900f, - -0.201600f, - 0.812500f, - 0.069000f, - -0.277378f, - 0.027069f, - -0.415125f, - 0.000000f, - -0.554700f, - 0.054000f, - -0.830300f, - 0.843800f, - 0.517200f, - -0.274126f, - 0.080891f, - -0.410257f, - 0.000000f, - -0.548300f, - 0.161200f, - -0.820600f, - 0.843800f, - 0.551700f, - -0.188821f, - 0.080891f, - -0.455854f, - 0.000000f, - -0.377700f, - 0.161200f, - -0.911800f, - 0.812500f, - 0.551700f, - -0.277378f, - 0.027069f, - -0.415125f, - 0.000000f, - -0.554700f, - 0.054000f, - -0.830300f, - 0.843800f, - 0.517200f, - -0.188821f, - 0.080891f, - -0.455854f, - 0.000000f, - -0.377700f, - 0.161200f, - -0.911800f, - 0.812500f, - 0.551700f, - -0.191061f, - 0.027069f, - -0.461262f, - 0.000000f, - -0.382100f, - 0.054000f, - -0.922500f, - 0.812500f, - 0.517200f, - -0.030034f, - 0.497069f, - -0.044948f, - 0.000000f, - -0.061900f, - 0.993700f, - -0.092700f, - 0.436200f, - 0.962300f, - -0.000000f, - 0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - 1.000000f, - 0.000000f, - 0.423900f, - 0.960300f, - -0.020688f, - 0.497069f, - -0.049944f, - 0.000000f, - -0.042600f, - 0.993700f, - -0.103000f, - 0.438100f, - 0.962300f, - -0.030034f, - -0.497069f, - -0.044949f, - 0.000000f, - -0.061900f, - -0.993700f, - -0.092700f, - 0.843800f, - 0.034500f, - -0.059716f, - -0.488310f, - -0.089370f, - 0.000000f, - -0.121200f, - -0.975900f, - -0.181400f, - 0.843800f, - 0.069000f, - -0.041133f, - -0.488310f, - -0.099303f, - 0.000000f, - -0.083500f, - -0.975900f, - -0.201600f, - 0.812500f, - 0.069000f, - -0.030034f, - -0.497069f, - -0.044949f, - 0.000000f, - -0.061900f, - -0.993700f, - -0.092700f, - 0.843800f, - 0.034500f, - -0.041133f, - -0.488310f, - -0.099303f, - 0.000000f, - -0.083500f, - -0.975900f, - -0.201600f, - 0.812500f, - 0.069000f, - -0.020688f, - -0.497069f, - -0.049945f, - 0.000000f, - -0.042600f, - -0.993700f, - -0.103000f, - 0.812500f, - 0.034500f, - -0.277378f, - -0.027069f, - -0.415125f, - 0.000000f, - -0.554700f, - -0.054000f, - -0.830300f, - 0.843800f, - 0.482800f, - -0.277378f, - 0.027069f, - -0.415125f, - 0.000000f, - -0.554700f, - 0.054000f, - -0.830300f, - 0.843800f, - 0.517200f, - -0.191061f, - 0.027069f, - -0.461262f, - 0.000000f, - -0.382100f, - 0.054000f, - -0.922500f, - 0.812500f, - 0.517200f, - -0.277378f, - -0.027069f, - -0.415125f, - 0.000000f, - -0.554700f, - -0.054000f, - -0.830300f, - 0.843800f, - 0.482800f, - -0.191061f, - 0.027069f, - -0.461262f, - 0.000000f, - -0.382100f, - 0.054000f, - -0.922500f, - 0.812500f, - 0.517200f, - -0.191061f, - -0.027069f, - -0.461262f, - 0.000000f, - -0.382100f, - -0.054000f, - -0.922500f, - 0.812500f, - 0.482800f, - -0.059716f, - 0.488310f, - -0.089370f, - 0.000000f, - -0.121200f, - 0.975900f, - -0.181400f, - 0.843800f, - 0.931000f, - -0.030034f, - 0.497069f, - -0.044948f, - 0.000000f, - -0.061900f, - 0.993700f, - -0.092700f, - 0.843800f, - 0.965500f, - -0.020688f, - 0.497069f, - -0.049944f, - 0.000000f, - -0.042600f, - 0.993700f, - -0.103000f, - 0.812500f, - 0.965500f, - -0.059716f, - 0.488310f, - -0.089370f, - 0.000000f, - -0.121200f, - 0.975900f, - -0.181400f, - 0.843800f, - 0.931000f, - -0.020688f, - 0.497069f, - -0.049944f, - 0.000000f, - -0.042600f, - 0.993700f, - -0.103000f, - 0.812500f, - 0.965500f, - -0.041133f, - 0.488310f, - -0.099303f, - 0.000000f, - -0.083500f, - 0.975900f, - -0.201600f, - 0.812500f, - 0.931000f, - -0.000000f, - -0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - -1.000000f, - 0.000000f, - 0.495500f, - 0.051000f, - -0.030034f, - -0.497069f, - -0.044949f, - 0.000000f, - -0.061900f, - -0.993700f, - -0.092700f, - 0.481100f, - 0.053800f, - -0.020688f, - -0.497069f, - -0.049945f, - 0.000000f, - -0.042600f, - -0.993700f, - -0.103000f, - 0.478500f, - 0.053800f, - -0.274126f, - -0.080891f, - -0.410257f, - 0.000000f, - -0.548300f, - -0.161200f, - -0.820600f, - 0.843800f, - 0.448300f, - -0.277378f, - -0.027069f, - -0.415125f, - 0.000000f, - -0.554700f, - -0.054000f, - -0.830300f, - 0.843800f, - 0.482800f, - -0.191061f, - -0.027069f, - -0.461262f, - 0.000000f, - -0.382100f, - -0.054000f, - -0.922500f, - 0.812500f, - 0.482800f, - -0.274126f, - -0.080891f, - -0.410257f, - 0.000000f, - -0.548300f, - -0.161200f, - -0.820600f, - 0.843800f, - 0.448300f, - -0.191061f, - -0.027069f, - -0.461262f, - 0.000000f, - -0.382100f, - -0.054000f, - -0.922500f, - 0.812500f, - 0.482800f, - -0.188821f, - -0.080891f, - -0.455854f, - 0.000000f, - -0.377700f, - -0.161200f, - -0.911800f, - 0.812500f, - 0.448300f, - -0.088698f, - 0.473826f, - -0.132745f, - 0.000000f, - -0.179100f, - 0.946600f, - -0.268000f, - 0.843800f, - 0.896600f, - -0.059716f, - 0.488310f, - -0.089370f, - 0.000000f, - -0.121200f, - 0.975900f, - -0.181400f, - 0.843800f, - 0.931000f, - -0.041133f, - 0.488310f, - -0.099303f, - 0.000000f, - -0.083500f, - 0.975900f, - -0.201600f, - 0.812500f, - 0.931000f, - -0.088698f, - 0.473826f, - -0.132745f, - 0.000000f, - -0.179100f, - 0.946600f, - -0.268000f, - 0.843800f, - 0.896600f, - -0.041133f, - 0.488310f, - -0.099303f, - 0.000000f, - -0.083500f, - 0.975900f, - -0.201600f, - 0.812500f, - 0.931000f, - -0.061096f, - 0.473826f, - -0.147498f, - 0.000000f, - -0.123300f, - 0.946600f, - -0.297800f, - 0.812500f, - 0.896600f, - -0.267660f, - -0.133764f, - -0.400581f, - 0.000000f, - -0.535400f, - -0.266600f, - -0.801400f, - 0.843800f, - 0.413800f, - -0.274126f, - -0.080891f, - -0.410257f, - 0.000000f, - -0.548300f, - -0.161200f, - -0.820600f, - 0.843800f, - 0.448300f, - -0.188821f, - -0.080891f, - -0.455854f, - 0.000000f, - -0.377700f, - -0.161200f, - -0.911800f, - 0.812500f, - 0.448300f, - -0.267660f, - -0.133764f, - -0.400581f, - 0.000000f, - -0.535400f, - -0.266600f, - -0.801400f, - 0.843800f, - 0.413800f, - -0.188821f, - -0.080891f, - -0.455854f, - 0.000000f, - -0.377700f, - -0.161200f, - -0.911800f, - 0.812500f, - 0.448300f, - -0.184367f, - -0.133764f, - -0.445101f, - 0.000000f, - -0.368800f, - -0.266600f, - -0.890400f, - 0.812500f, - 0.413800f, - -0.116639f, - 0.453788f, - -0.174562f, - 0.000000f, - -0.234800f, - 0.906300f, - -0.351400f, - 0.843800f, - 0.862100f, - -0.088698f, - 0.473826f, - -0.132745f, - 0.000000f, - -0.179100f, - 0.946600f, - -0.268000f, - 0.843800f, - 0.896600f, - -0.061096f, - 0.473826f, - -0.147498f, - 0.000000f, - -0.123300f, - 0.946600f, - -0.297800f, - 0.812500f, - 0.896600f, - -0.116639f, - 0.453788f, - -0.174562f, - 0.000000f, - -0.234800f, - 0.906300f, - -0.351400f, - 0.843800f, - 0.862100f, - -0.061096f, - 0.473826f, - -0.147498f, - 0.000000f, - -0.123300f, - 0.946600f, - -0.297800f, - 0.812500f, - 0.896600f, - -0.080343f, - 0.453788f, - -0.193963f, - 0.000000f, - -0.161700f, - 0.906300f, - -0.390500f, - 0.812500f, - 0.862100f, - -0.258056f, - -0.185069f, - -0.386207f, - 0.000000f, - -0.516300f, - -0.369000f, - -0.772800f, - 0.843800f, - 0.379300f, - -0.267660f, - -0.133764f, - -0.400581f, - 0.000000f, - -0.535400f, - -0.266600f, - -0.801400f, - 0.843800f, - 0.413800f, - -0.184367f, - -0.133764f, - -0.445101f, - 0.000000f, - -0.368800f, - -0.266600f, - -0.890400f, - 0.812500f, - 0.413800f, - -0.258056f, - -0.185069f, - -0.386207f, - 0.000000f, - -0.516300f, - -0.369000f, - -0.772800f, - 0.843800f, - 0.379300f, - -0.184367f, - -0.133764f, - -0.445101f, - 0.000000f, - -0.368800f, - -0.266600f, - -0.890400f, - 0.812500f, - 0.413800f, - -0.177752f, - -0.185069f, - -0.429131f, - 0.000000f, - -0.355700f, - -0.369000f, - -0.858700f, - 0.812500f, - 0.379300f, - -0.143213f, - 0.428429f, - -0.214334f, - 0.000000f, - -0.287800f, - 0.855300f, - -0.430700f, - 0.843800f, - 0.827600f, - -0.116639f, - 0.453788f, - -0.174562f, - 0.000000f, - -0.234800f, - 0.906300f, - -0.351400f, - 0.843800f, - 0.862100f, - -0.080343f, - 0.453788f, - -0.193963f, - 0.000000f, - -0.161700f, - 0.906300f, - -0.390500f, - 0.812500f, - 0.862100f, - -0.143213f, - 0.428429f, - -0.214334f, - 0.000000f, - -0.287800f, - 0.855300f, - -0.430700f, - 0.843800f, - 0.827600f, - -0.080343f, - 0.453788f, - -0.193963f, - 0.000000f, - -0.161700f, - 0.906300f, - -0.390500f, - 0.812500f, - 0.862100f, - -0.098647f, - 0.428429f, - -0.238155f, - 0.000000f, - -0.198200f, - 0.855300f, - -0.478600f, - 0.812500f, - 0.827600f, - -0.041133f, - -0.488310f, - -0.099303f, - 0.000000f, - -0.083500f, - -0.975900f, - -0.201600f, - 0.812500f, - 0.069000f, - -0.061096f, - -0.473826f, - -0.147498f, - 0.000000f, - -0.123300f, - -0.946600f, - -0.297800f, - 0.812500f, - 0.103400f, - -0.031147f, - -0.473826f, - -0.156583f, - 0.000000f, - -0.062900f, - -0.946600f, - -0.316100f, - 0.781300f, - 0.103400f, - -0.041133f, - -0.488310f, - -0.099303f, - 0.000000f, - -0.083500f, - -0.975900f, - -0.201600f, - 0.812500f, - 0.069000f, - -0.031147f, - -0.473826f, - -0.156583f, - 0.000000f, - -0.062900f, - -0.946600f, - -0.316100f, - 0.781300f, - 0.103400f, - -0.020970f, - -0.488310f, - -0.105420f, - 0.000000f, - -0.042500f, - -0.975900f, - -0.214000f, - 0.781300f, - 0.069000f, - -0.191061f, - 0.027069f, - -0.461262f, - 0.000000f, - -0.382100f, - 0.054000f, - -0.922500f, - 0.812500f, - 0.517200f, - -0.188821f, - 0.080891f, - -0.455854f, - 0.000000f, - -0.377700f, - 0.161200f, - -0.911800f, - 0.812500f, - 0.551700f, - -0.096261f, - 0.080891f, - -0.483932f, - 0.000000f, - -0.192500f, - 0.161200f, - -0.967900f, - 0.781300f, - 0.551700f, - -0.191061f, - 0.027069f, - -0.461262f, - 0.000000f, - -0.382100f, - 0.054000f, - -0.922500f, - 0.812500f, - 0.517200f, - -0.096261f, - 0.080891f, - -0.483932f, - 0.000000f, - -0.192500f, - 0.161200f, - -0.967900f, - 0.781300f, - 0.551700f, - -0.097402f, - 0.027069f, - -0.489673f, - 0.000000f, - -0.194800f, - 0.054000f, - -0.979300f, - 0.781300f, - 0.517200f, - -0.020688f, - 0.497069f, - -0.049944f, - 0.000000f, - -0.042600f, - 0.993700f, - -0.103000f, - 0.438100f, - 0.962300f, - -0.000000f, - 0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - 1.000000f, - 0.000000f, - 0.423900f, - 0.960300f, - -0.010547f, - 0.497069f, - -0.053020f, - 0.000000f, - -0.021700f, - 0.993700f, - -0.109300f, - 0.439900f, - 0.962300f, - -0.020688f, - -0.497069f, - -0.049945f, - 0.000000f, - -0.042600f, - -0.993700f, - -0.103000f, - 0.812500f, - 0.034500f, - -0.041133f, - -0.488310f, - -0.099303f, - 0.000000f, - -0.083500f, - -0.975900f, - -0.201600f, - 0.812500f, - 0.069000f, - -0.020970f, - -0.488310f, - -0.105420f, - 0.000000f, - -0.042500f, - -0.975900f, - -0.214000f, - 0.781300f, - 0.069000f, - -0.020688f, - -0.497069f, - -0.049945f, - 0.000000f, - -0.042600f, - -0.993700f, - -0.103000f, - 0.812500f, - 0.034500f, - -0.020970f, - -0.488310f, - -0.105420f, - 0.000000f, - -0.042500f, - -0.975900f, - -0.214000f, - 0.781300f, - 0.069000f, - -0.010547f, - -0.497069f, - -0.053020f, - 0.000000f, - -0.021700f, - -0.993700f, - -0.109300f, - 0.781300f, - 0.034500f, - -0.191061f, - -0.027069f, - -0.461262f, - 0.000000f, - -0.382100f, - -0.054000f, - -0.922500f, - 0.812500f, - 0.482800f, - -0.191061f, - 0.027069f, - -0.461262f, - 0.000000f, - -0.382100f, - 0.054000f, - -0.922500f, - 0.812500f, - 0.517200f, - -0.097402f, - 0.027069f, - -0.489673f, - 0.000000f, - -0.194800f, - 0.054000f, - -0.979300f, - 0.781300f, - 0.517200f, - -0.191061f, - -0.027069f, - -0.461262f, - 0.000000f, - -0.382100f, - -0.054000f, - -0.922500f, - 0.812500f, - 0.482800f, - -0.097402f, - 0.027069f, - -0.489673f, - 0.000000f, - -0.194800f, - 0.054000f, - -0.979300f, - 0.781300f, - 0.517200f, - -0.097402f, - -0.027069f, - -0.489673f, - 0.000000f, - -0.194800f, - -0.054000f, - -0.979300f, - 0.781300f, - 0.482800f, - -0.041133f, - 0.488310f, - -0.099303f, - 0.000000f, - -0.083500f, - 0.975900f, - -0.201600f, - 0.812500f, - 0.931000f, - -0.020688f, - 0.497069f, - -0.049944f, - 0.000000f, - -0.042600f, - 0.993700f, - -0.103000f, - 0.812500f, - 0.965500f, - -0.010547f, - 0.497069f, - -0.053020f, - 0.000000f, - -0.021700f, - 0.993700f, - -0.109300f, - 0.781300f, - 0.965500f, - -0.041133f, - 0.488310f, - -0.099303f, - 0.000000f, - -0.083500f, - 0.975900f, - -0.201600f, - 0.812500f, - 0.931000f, - -0.010547f, - 0.497069f, - -0.053020f, - 0.000000f, - -0.021700f, - 0.993700f, - -0.109300f, - 0.781300f, - 0.965500f, - -0.020970f, - 0.488310f, - -0.105420f, - 0.000000f, - -0.042500f, - 0.975900f, - -0.214000f, - 0.781300f, - 0.931000f, - -0.000000f, - -0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - -1.000000f, - 0.000000f, - 0.495500f, - 0.051000f, - -0.020688f, - -0.497069f, - -0.049945f, - 0.000000f, - -0.042600f, - -0.993700f, - -0.103000f, - 0.478500f, - 0.053800f, - -0.010547f, - -0.497069f, - -0.053020f, - 0.000000f, - -0.021700f, - -0.993700f, - -0.109300f, - 0.475900f, - 0.053800f, - -0.188821f, - -0.080891f, - -0.455854f, - 0.000000f, - -0.377700f, - -0.161200f, - -0.911800f, - 0.812500f, - 0.448300f, - -0.191061f, - -0.027069f, - -0.461262f, - 0.000000f, - -0.382100f, - -0.054000f, - -0.922500f, - 0.812500f, - 0.482800f, - -0.097402f, - -0.027069f, - -0.489673f, - 0.000000f, - -0.194800f, - -0.054000f, - -0.979300f, - 0.781300f, - 0.482800f, - -0.188821f, - -0.080891f, - -0.455854f, - 0.000000f, - -0.377700f, - -0.161200f, - -0.911800f, - 0.812500f, - 0.448300f, - -0.097402f, - -0.027069f, - -0.489673f, - 0.000000f, - -0.194800f, - -0.054000f, - -0.979300f, - 0.781300f, - 0.482800f, - -0.096261f, - -0.080891f, - -0.483932f, - 0.000000f, - -0.192500f, - -0.161200f, - -0.967900f, - 0.781300f, - 0.448300f, - -0.061096f, - 0.473826f, - -0.147498f, - 0.000000f, - -0.123300f, - 0.946600f, - -0.297800f, - 0.812500f, - 0.896600f, - -0.041133f, - 0.488310f, - -0.099303f, - 0.000000f, - -0.083500f, - 0.975900f, - -0.201600f, - 0.812500f, - 0.931000f, - -0.020970f, - 0.488310f, - -0.105420f, - 0.000000f, - -0.042500f, - 0.975900f, - -0.214000f, - 0.781300f, - 0.931000f, - -0.061096f, - 0.473826f, - -0.147498f, - 0.000000f, - -0.123300f, - 0.946600f, - -0.297800f, - 0.812500f, - 0.896600f, - -0.020970f, - 0.488310f, - -0.105420f, - 0.000000f, - -0.042500f, - 0.975900f, - -0.214000f, - 0.781300f, - 0.931000f, - -0.031147f, - 0.473826f, - -0.156583f, - 0.000000f, - -0.062900f, - 0.946600f, - -0.316100f, - 0.781300f, - 0.896600f, - -0.184367f, - -0.133764f, - -0.445101f, - 0.000000f, - -0.368800f, - -0.266600f, - -0.890400f, - 0.812500f, - 0.413800f, - -0.188821f, - -0.080891f, - -0.455854f, - 0.000000f, - -0.377700f, - -0.161200f, - -0.911800f, - 0.812500f, - 0.448300f, - -0.096261f, - -0.080891f, - -0.483932f, - 0.000000f, - -0.192500f, - -0.161200f, - -0.967900f, - 0.781300f, - 0.448300f, - -0.184367f, - -0.133764f, - -0.445101f, - 0.000000f, - -0.368800f, - -0.266600f, - -0.890400f, - 0.812500f, - 0.413800f, - -0.096261f, - -0.080891f, - -0.483932f, - 0.000000f, - -0.192500f, - -0.161200f, - -0.967900f, - 0.781300f, - 0.448300f, - -0.093990f, - -0.133764f, - -0.472517f, - 0.000000f, - -0.188000f, - -0.266600f, - -0.945200f, - 0.781300f, - 0.413800f, - -0.080343f, - 0.453788f, - -0.193963f, - 0.000000f, - -0.161700f, - 0.906300f, - -0.390500f, - 0.812500f, - 0.862100f, - -0.061096f, - 0.473826f, - -0.147498f, - 0.000000f, - -0.123300f, - 0.946600f, - -0.297800f, - 0.812500f, - 0.896600f, - -0.031147f, - 0.473826f, - -0.156583f, - 0.000000f, - -0.062900f, - 0.946600f, - -0.316100f, - 0.781300f, - 0.896600f, - -0.080343f, - 0.453788f, - -0.193963f, - 0.000000f, - -0.161700f, - 0.906300f, - -0.390500f, - 0.812500f, - 0.862100f, - -0.031147f, - 0.473826f, - -0.156583f, - 0.000000f, - -0.062900f, - 0.946600f, - -0.316100f, - 0.781300f, - 0.896600f, - -0.040959f, - 0.453788f, - -0.205910f, - 0.000000f, - -0.082400f, - 0.906300f, - -0.414500f, - 0.781300f, - 0.862100f, - -0.177752f, - -0.185069f, - -0.429131f, - 0.000000f, - -0.355700f, - -0.369000f, - -0.858700f, - 0.812500f, - 0.379300f, - -0.184367f, - -0.133764f, - -0.445101f, - 0.000000f, - -0.368800f, - -0.266600f, - -0.890400f, - 0.812500f, - 0.413800f, - -0.093990f, - -0.133764f, - -0.472517f, - 0.000000f, - -0.188000f, - -0.266600f, - -0.945200f, - 0.781300f, - 0.413800f, - -0.177752f, - -0.185069f, - -0.429131f, - 0.000000f, - -0.355700f, - -0.369000f, - -0.858700f, - 0.812500f, - 0.379300f, - -0.093990f, - -0.133764f, - -0.472517f, - 0.000000f, - -0.188000f, - -0.266600f, - -0.945200f, - 0.781300f, - 0.413800f, - -0.090618f, - -0.185069f, - -0.455563f, - 0.000000f, - -0.181300f, - -0.369000f, - -0.911600f, - 0.781300f, - 0.379300f, - -0.098647f, - 0.428429f, - -0.238155f, - 0.000000f, - -0.198200f, - 0.855300f, - -0.478600f, - 0.812500f, - 0.827600f, - -0.080343f, - 0.453788f, - -0.193963f, - 0.000000f, - -0.161700f, - 0.906300f, - -0.390500f, - 0.812500f, - 0.862100f, - -0.040959f, - 0.453788f, - -0.205910f, - 0.000000f, - -0.082400f, - 0.906300f, - -0.414500f, - 0.781300f, - 0.862100f, - -0.098647f, - 0.428429f, - -0.238155f, - 0.000000f, - -0.198200f, - 0.855300f, - -0.478600f, - 0.812500f, - 0.827600f, - -0.040959f, - 0.453788f, - -0.205910f, - 0.000000f, - -0.082400f, - 0.906300f, - -0.414500f, - 0.781300f, - 0.862100f, - -0.050290f, - 0.428429f, - -0.252824f, - 0.000000f, - -0.101000f, - 0.855300f, - -0.508100f, - 0.781300f, - 0.827600f, - -0.169053f, - -0.234204f, - -0.408129f, - 0.000000f, - -0.338400f, - -0.467000f, - -0.816900f, - 0.812500f, - 0.344800f, - -0.177752f, - -0.185069f, - -0.429131f, - 0.000000f, - -0.355700f, - -0.369000f, - -0.858700f, - 0.812500f, - 0.379300f, - -0.090618f, - -0.185069f, - -0.455563f, - 0.000000f, - -0.181300f, - -0.369000f, - -0.911600f, - 0.781300f, - 0.379300f, - -0.169053f, - -0.234204f, - -0.408129f, - 0.000000f, - -0.338400f, - -0.467000f, - -0.816900f, - 0.812500f, - 0.344800f, - -0.090618f, - -0.185069f, - -0.455563f, - 0.000000f, - -0.181300f, - -0.369000f, - -0.911600f, - 0.781300f, - 0.379300f, - -0.086182f, - -0.234204f, - -0.433268f, - 0.000000f, - -0.172500f, - -0.467000f, - -0.867200f, - 0.781300f, - 0.344800f, - -0.115796f, - 0.398046f, - -0.279554f, - 0.000000f, - -0.232400f, - 0.794500f, - -0.561100f, - 0.812500f, - 0.793100f, - -0.098647f, - 0.428429f, - -0.238155f, - 0.000000f, - -0.198200f, - 0.855300f, - -0.478600f, - 0.812500f, - 0.827600f, - -0.050290f, - 0.428429f, - -0.252824f, - 0.000000f, - -0.101000f, - 0.855300f, - -0.508100f, - 0.781300f, - 0.827600f, - -0.115796f, - 0.398046f, - -0.279554f, - 0.000000f, - -0.232400f, - 0.794500f, - -0.561100f, - 0.812500f, - 0.793100f, - -0.050290f, - 0.428429f, - -0.252824f, - 0.000000f, - -0.101000f, - 0.855300f, - -0.508100f, - 0.781300f, - 0.827600f, - -0.059032f, - 0.398046f, - -0.296773f, - 0.000000f, - -0.118500f, - 0.794500f, - -0.595600f, - 0.781300f, - 0.793100f, - -0.158371f, - -0.280594f, - -0.382342f, - 0.000000f, - -0.317100f, - -0.559600f, - -0.765600f, - 0.812500f, - 0.310300f, - -0.169053f, - -0.234204f, - -0.408129f, - 0.000000f, - -0.338400f, - -0.467000f, - -0.816900f, - 0.812500f, - 0.344800f, - -0.086182f, - -0.234204f, - -0.433268f, - 0.000000f, - -0.172500f, - -0.467000f, - -0.867200f, - 0.781300f, - 0.344800f, - -0.158371f, - -0.280594f, - -0.382342f, - 0.000000f, - -0.317100f, - -0.559600f, - -0.765600f, - 0.812500f, - 0.310300f, - -0.086182f, - -0.234204f, - -0.433268f, - 0.000000f, - -0.172500f, - -0.467000f, - -0.867200f, - 0.781300f, - 0.344800f, - -0.080738f, - -0.280594f, - -0.405892f, - 0.000000f, - -0.161700f, - -0.559600f, - -0.812800f, - 0.781300f, - 0.310300f, - -0.131586f, - 0.362998f, - -0.317676f, - 0.000000f, - -0.263800f, - 0.724300f, - -0.637000f, - 0.812500f, - 0.758600f, - -0.115796f, - 0.398046f, - -0.279554f, - 0.000000f, - -0.232400f, - 0.794500f, - -0.561100f, - 0.812500f, - 0.793100f, - -0.059032f, - 0.398046f, - -0.296773f, - 0.000000f, - -0.118500f, - 0.794500f, - -0.595600f, - 0.781300f, - 0.793100f, - -0.131586f, - 0.362998f, - -0.317676f, - 0.000000f, - -0.263800f, - 0.724300f, - -0.637000f, - 0.812500f, - 0.758600f, - -0.059032f, - 0.398046f, - -0.296773f, - 0.000000f, - -0.118500f, - 0.794500f, - -0.595600f, - 0.781300f, - 0.793100f, - -0.067082f, - 0.362998f, - -0.337242f, - 0.000000f, - -0.134500f, - 0.724300f, - -0.676200f, - 0.781300f, - 0.758600f, - -0.145834f, - -0.323693f, - -0.352073f, - 0.000000f, - -0.292200f, - -0.645700f, - -0.705400f, - 0.812500f, - 0.275900f, - -0.158371f, - -0.280594f, - -0.382342f, - 0.000000f, - -0.317100f, - -0.559600f, - -0.765600f, - 0.812500f, - 0.310300f, - -0.080738f, - -0.280594f, - -0.405892f, - 0.000000f, - -0.161700f, - -0.559600f, - -0.812800f, - 0.781300f, - 0.310300f, - -0.145834f, - -0.323693f, - -0.352073f, - 0.000000f, - -0.292200f, - -0.645700f, - -0.705400f, - 0.812500f, - 0.275900f, - -0.080738f, - -0.280594f, - -0.405892f, - 0.000000f, - -0.161700f, - -0.559600f, - -0.812800f, - 0.781300f, - 0.310300f, - -0.074345f, - -0.323693f, - -0.373758f, - 0.000000f, - -0.149000f, - -0.645700f, - -0.748900f, - 0.781300f, - 0.275900f, - -0.145834f, - 0.323693f, - -0.352073f, - 0.000000f, - -0.292200f, - 0.645700f, - -0.705400f, - 0.812500f, - 0.724100f, - -0.131586f, - 0.362998f, - -0.317676f, - 0.000000f, - -0.263800f, - 0.724300f, - -0.637000f, - 0.812500f, - 0.758600f, - -0.067082f, - 0.362998f, - -0.337242f, - 0.000000f, - -0.134500f, - 0.724300f, - -0.676200f, - 0.781300f, - 0.758600f, - -0.145834f, - 0.323693f, - -0.352073f, - 0.000000f, - -0.292200f, - 0.645700f, - -0.705400f, - 0.812500f, - 0.724100f, - -0.067082f, - 0.362998f, - -0.337242f, - 0.000000f, - -0.134500f, - 0.724300f, - -0.676200f, - 0.781300f, - 0.758600f, - -0.074345f, - 0.323693f, - -0.373758f, - 0.000000f, - -0.149000f, - 0.645700f, - -0.748900f, - 0.781300f, - 0.724100f, - -0.131586f, - -0.362998f, - -0.317676f, - 0.000000f, - -0.263800f, - -0.724300f, - -0.637000f, - 0.812500f, - 0.241400f, - -0.145834f, - -0.323693f, - -0.352073f, - 0.000000f, - -0.292200f, - -0.645700f, - -0.705400f, - 0.812500f, - 0.275900f, - -0.074345f, - -0.323693f, - -0.373758f, - 0.000000f, - -0.149000f, - -0.645700f, - -0.748900f, - 0.781300f, - 0.275900f, - -0.131586f, - -0.362998f, - -0.317676f, - 0.000000f, - -0.263800f, - -0.724300f, - -0.637000f, - 0.812500f, - 0.241400f, - -0.074345f, - -0.323693f, - -0.373758f, - 0.000000f, - -0.149000f, - -0.645700f, - -0.748900f, - 0.781300f, - 0.275900f, - -0.067082f, - -0.362998f, - -0.337243f, - 0.000000f, - -0.134500f, - -0.724300f, - -0.676200f, - 0.781300f, - 0.241400f, - -0.158371f, - 0.280594f, - -0.382342f, - 0.000000f, - -0.317100f, - 0.559600f, - -0.765600f, - 0.812500f, - 0.689700f, - -0.145834f, - 0.323693f, - -0.352073f, - 0.000000f, - -0.292200f, - 0.645700f, - -0.705400f, - 0.812500f, - 0.724100f, - -0.074345f, - 0.323693f, - -0.373758f, - 0.000000f, - -0.149000f, - 0.645700f, - -0.748900f, - 0.781300f, - 0.724100f, - -0.158371f, - 0.280594f, - -0.382342f, - 0.000000f, - -0.317100f, - 0.559600f, - -0.765600f, - 0.812500f, - 0.689700f, - -0.074345f, - 0.323693f, - -0.373758f, - 0.000000f, - -0.149000f, - 0.645700f, - -0.748900f, - 0.781300f, - 0.724100f, - -0.080738f, - 0.280594f, - -0.405892f, - 0.000000f, - -0.161700f, - 0.559600f, - -0.812800f, - 0.781300f, - 0.689700f, - -0.115796f, - -0.398046f, - -0.279554f, - 0.000000f, - -0.232400f, - -0.794500f, - -0.561100f, - 0.812500f, - 0.206900f, - -0.131586f, - -0.362998f, - -0.317676f, - 0.000000f, - -0.263800f, - -0.724300f, - -0.637000f, - 0.812500f, - 0.241400f, - -0.067082f, - -0.362998f, - -0.337243f, - 0.000000f, - -0.134500f, - -0.724300f, - -0.676200f, - 0.781300f, - 0.241400f, - -0.115796f, - -0.398046f, - -0.279554f, - 0.000000f, - -0.232400f, - -0.794500f, - -0.561100f, - 0.812500f, - 0.206900f, - -0.067082f, - -0.362998f, - -0.337243f, - 0.000000f, - -0.134500f, - -0.724300f, - -0.676200f, - 0.781300f, - 0.241400f, - -0.059032f, - -0.398046f, - -0.296773f, - 0.000000f, - -0.118500f, - -0.794500f, - -0.595600f, - 0.781300f, - 0.206900f, - -0.169053f, - 0.234204f, - -0.408129f, - 0.000000f, - -0.338400f, - 0.467000f, - -0.816900f, - 0.812500f, - 0.655200f, - -0.158371f, - 0.280594f, - -0.382342f, - 0.000000f, - -0.317100f, - 0.559600f, - -0.765600f, - 0.812500f, - 0.689700f, - -0.080738f, - 0.280594f, - -0.405892f, - 0.000000f, - -0.161700f, - 0.559600f, - -0.812800f, - 0.781300f, - 0.689700f, - -0.169053f, - 0.234204f, - -0.408129f, - 0.000000f, - -0.338400f, - 0.467000f, - -0.816900f, - 0.812500f, - 0.655200f, - -0.080738f, - 0.280594f, - -0.405892f, - 0.000000f, - -0.161700f, - 0.559600f, - -0.812800f, - 0.781300f, - 0.689700f, - -0.086182f, - 0.234204f, - -0.433268f, - 0.000000f, - -0.172500f, - 0.467000f, - -0.867200f, - 0.781300f, - 0.655200f, - -0.098647f, - -0.428429f, - -0.238155f, - 0.000000f, - -0.198200f, - -0.855300f, - -0.478600f, - 0.812500f, - 0.172400f, - -0.115796f, - -0.398046f, - -0.279554f, - 0.000000f, - -0.232400f, - -0.794500f, - -0.561100f, - 0.812500f, - 0.206900f, - -0.059032f, - -0.398046f, - -0.296773f, - 0.000000f, - -0.118500f, - -0.794500f, - -0.595600f, - 0.781300f, - 0.206900f, - -0.098647f, - -0.428429f, - -0.238155f, - 0.000000f, - -0.198200f, - -0.855300f, - -0.478600f, - 0.812500f, - 0.172400f, - -0.059032f, - -0.398046f, - -0.296773f, - 0.000000f, - -0.118500f, - -0.794500f, - -0.595600f, - 0.781300f, - 0.206900f, - -0.050290f, - -0.428429f, - -0.252824f, - 0.000000f, - -0.101000f, - -0.855300f, - -0.508100f, - 0.781300f, - 0.172400f, - -0.177752f, - 0.185069f, - -0.429131f, - 0.000000f, - -0.355700f, - 0.369000f, - -0.858700f, - 0.812500f, - 0.620700f, - -0.169053f, - 0.234204f, - -0.408129f, - 0.000000f, - -0.338400f, - 0.467000f, - -0.816900f, - 0.812500f, - 0.655200f, - -0.086182f, - 0.234204f, - -0.433268f, - 0.000000f, - -0.172500f, - 0.467000f, - -0.867200f, - 0.781300f, - 0.655200f, - -0.177752f, - 0.185069f, - -0.429131f, - 0.000000f, - -0.355700f, - 0.369000f, - -0.858700f, - 0.812500f, - 0.620700f, - -0.086182f, - 0.234204f, - -0.433268f, - 0.000000f, - -0.172500f, - 0.467000f, - -0.867200f, - 0.781300f, - 0.655200f, - -0.090618f, - 0.185069f, - -0.455563f, - 0.000000f, - -0.181300f, - 0.369000f, - -0.911600f, - 0.781300f, - 0.620700f, - -0.080343f, - -0.453788f, - -0.193963f, - 0.000000f, - -0.161700f, - -0.906300f, - -0.390500f, - 0.812500f, - 0.137900f, - -0.098647f, - -0.428429f, - -0.238155f, - 0.000000f, - -0.198200f, - -0.855300f, - -0.478600f, - 0.812500f, - 0.172400f, - -0.050290f, - -0.428429f, - -0.252824f, - 0.000000f, - -0.101000f, - -0.855300f, - -0.508100f, - 0.781300f, - 0.172400f, - -0.080343f, - -0.453788f, - -0.193963f, - 0.000000f, - -0.161700f, - -0.906300f, - -0.390500f, - 0.812500f, - 0.137900f, - -0.050290f, - -0.428429f, - -0.252824f, - 0.000000f, - -0.101000f, - -0.855300f, - -0.508100f, - 0.781300f, - 0.172400f, - -0.040959f, - -0.453788f, - -0.205911f, - 0.000000f, - -0.082400f, - -0.906300f, - -0.414500f, - 0.781300f, - 0.137900f, - -0.184367f, - 0.133764f, - -0.445101f, - 0.000000f, - -0.368800f, - 0.266600f, - -0.890400f, - 0.812500f, - 0.586200f, - -0.177752f, - 0.185069f, - -0.429131f, - 0.000000f, - -0.355700f, - 0.369000f, - -0.858700f, - 0.812500f, - 0.620700f, - -0.090618f, - 0.185069f, - -0.455563f, - 0.000000f, - -0.181300f, - 0.369000f, - -0.911600f, - 0.781300f, - 0.620700f, - -0.184367f, - 0.133764f, - -0.445101f, - 0.000000f, - -0.368800f, - 0.266600f, - -0.890400f, - 0.812500f, - 0.586200f, - -0.090618f, - 0.185069f, - -0.455563f, - 0.000000f, - -0.181300f, - 0.369000f, - -0.911600f, - 0.781300f, - 0.620700f, - -0.093990f, - 0.133764f, - -0.472517f, - 0.000000f, - -0.188000f, - 0.266600f, - -0.945200f, - 0.781300f, - 0.586200f, - -0.061096f, - -0.473826f, - -0.147498f, - 0.000000f, - -0.123300f, - -0.946600f, - -0.297800f, - 0.812500f, - 0.103400f, - -0.080343f, - -0.453788f, - -0.193963f, - 0.000000f, - -0.161700f, - -0.906300f, - -0.390500f, - 0.812500f, - 0.137900f, - -0.040959f, - -0.453788f, - -0.205911f, - 0.000000f, - -0.082400f, - -0.906300f, - -0.414500f, - 0.781300f, - 0.137900f, - -0.061096f, - -0.473826f, - -0.147498f, - 0.000000f, - -0.123300f, - -0.946600f, - -0.297800f, - 0.812500f, - 0.103400f, - -0.040959f, - -0.453788f, - -0.205911f, - 0.000000f, - -0.082400f, - -0.906300f, - -0.414500f, - 0.781300f, - 0.137900f, - -0.031147f, - -0.473826f, - -0.156583f, - 0.000000f, - -0.062900f, - -0.946600f, - -0.316100f, - 0.781300f, - 0.103400f, - -0.188821f, - 0.080891f, - -0.455854f, - 0.000000f, - -0.377700f, - 0.161200f, - -0.911800f, - 0.812500f, - 0.551700f, - -0.184367f, - 0.133764f, - -0.445101f, - 0.000000f, - -0.368800f, - 0.266600f, - -0.890400f, - 0.812500f, - 0.586200f, - -0.093990f, - 0.133764f, - -0.472517f, - 0.000000f, - -0.188000f, - 0.266600f, - -0.945200f, - 0.781300f, - 0.586200f, - -0.188821f, - 0.080891f, - -0.455854f, - 0.000000f, - -0.377700f, - 0.161200f, - -0.911800f, - 0.812500f, - 0.551700f, - -0.093990f, - 0.133764f, - -0.472517f, - 0.000000f, - -0.188000f, - 0.266600f, - -0.945200f, - 0.781300f, - 0.586200f, - -0.096261f, - 0.080891f, - -0.483932f, - 0.000000f, - -0.192500f, - 0.161200f, - -0.967900f, - 0.781300f, - 0.551700f, - -0.067082f, - -0.362998f, - -0.337243f, - 0.000000f, - -0.134500f, - -0.724300f, - -0.676200f, - 0.781300f, - 0.241400f, - -0.074345f, - -0.323693f, - -0.373758f, - 0.000000f, - -0.149000f, - -0.645700f, - -0.748900f, - 0.781300f, - 0.275900f, - -0.000000f, - -0.323693f, - -0.381081f, - 0.000000f, - 0.000000f, - -0.645700f, - -0.763500f, - 0.750000f, - 0.275900f, - -0.067082f, - -0.362998f, - -0.337243f, - 0.000000f, - -0.134500f, - -0.724300f, - -0.676200f, - 0.781300f, - 0.241400f, - -0.000000f, - -0.323693f, - -0.381081f, - 0.000000f, - 0.000000f, - -0.645700f, - -0.763500f, - 0.750000f, - 0.275900f, - -0.000000f, - -0.362998f, - -0.343850f, - 0.000000f, - 0.000000f, - -0.724300f, - -0.689400f, - 0.750000f, - 0.241400f, - -0.080738f, - 0.280594f, - -0.405892f, - 0.000000f, - -0.161700f, - 0.559600f, - -0.812800f, - 0.781300f, - 0.689700f, - -0.074345f, - 0.323693f, - -0.373758f, - 0.000000f, - -0.149000f, - 0.645700f, - -0.748900f, - 0.781300f, - 0.724100f, - -0.000000f, - 0.323693f, - -0.381081f, - 0.000000f, - 0.000000f, - 0.645700f, - -0.763500f, - 0.750000f, - 0.724100f, - -0.080738f, - 0.280594f, - -0.405892f, - 0.000000f, - -0.161700f, - 0.559600f, - -0.812800f, - 0.781300f, - 0.689700f, - -0.000000f, - 0.323693f, - -0.381081f, - 0.000000f, - 0.000000f, - 0.645700f, - -0.763500f, - 0.750000f, - 0.724100f, - -0.000000f, - 0.280594f, - -0.413844f, - 0.000000f, - 0.000000f, - 0.559600f, - -0.828700f, - 0.750000f, - 0.689700f, - -0.059032f, - -0.398046f, - -0.296773f, - 0.000000f, - -0.118500f, - -0.794500f, - -0.595600f, - 0.781300f, - 0.206900f, - -0.067082f, - -0.362998f, - -0.337243f, - 0.000000f, - -0.134500f, - -0.724300f, - -0.676200f, - 0.781300f, - 0.241400f, - -0.000000f, - -0.362998f, - -0.343850f, - 0.000000f, - 0.000000f, - -0.724300f, - -0.689400f, - 0.750000f, - 0.241400f, - -0.059032f, - -0.398046f, - -0.296773f, - 0.000000f, - -0.118500f, - -0.794500f, - -0.595600f, - 0.781300f, - 0.206900f, - -0.000000f, - -0.362998f, - -0.343850f, - 0.000000f, - 0.000000f, - -0.724300f, - -0.689400f, - 0.750000f, - 0.241400f, - -0.000000f, - -0.398046f, - -0.302587f, - 0.000000f, - 0.000000f, - -0.794500f, - -0.607300f, - 0.750000f, - 0.206900f, - -0.086182f, - 0.234204f, - -0.433268f, - 0.000000f, - -0.172500f, - 0.467000f, - -0.867200f, - 0.781300f, - 0.655200f, - -0.080738f, - 0.280594f, - -0.405892f, - 0.000000f, - -0.161700f, - 0.559600f, - -0.812800f, - 0.781300f, - 0.689700f, - -0.000000f, - 0.280594f, - -0.413844f, - 0.000000f, - 0.000000f, - 0.559600f, - -0.828700f, - 0.750000f, - 0.689700f, - -0.086182f, - 0.234204f, - -0.433268f, - 0.000000f, - -0.172500f, - 0.467000f, - -0.867200f, - 0.781300f, - 0.655200f, - -0.000000f, - 0.280594f, - -0.413844f, - 0.000000f, - 0.000000f, - 0.559600f, - -0.828700f, - 0.750000f, - 0.689700f, - -0.000000f, - 0.234204f, - -0.441756f, - 0.000000f, - 0.000000f, - 0.467000f, - -0.884200f, - 0.750000f, - 0.655200f, - -0.050290f, - -0.428429f, - -0.252824f, - 0.000000f, - -0.101000f, - -0.855300f, - -0.508100f, - 0.781300f, - 0.172400f, - -0.059032f, - -0.398046f, - -0.296773f, - 0.000000f, - -0.118500f, - -0.794500f, - -0.595600f, - 0.781300f, - 0.206900f, - -0.000000f, - -0.398046f, - -0.302587f, - 0.000000f, - 0.000000f, - -0.794500f, - -0.607300f, - 0.750000f, - 0.206900f, - -0.050290f, - -0.428429f, - -0.252824f, - 0.000000f, - -0.101000f, - -0.855300f, - -0.508100f, - 0.781300f, - 0.172400f, - -0.000000f, - -0.398046f, - -0.302587f, - 0.000000f, - 0.000000f, - -0.794500f, - -0.607300f, - 0.750000f, - 0.206900f, - -0.000000f, - -0.428429f, - -0.257776f, - 0.000000f, - 0.000000f, - -0.855300f, - -0.518000f, - 0.750000f, - 0.172400f, - -0.090618f, - 0.185069f, - -0.455563f, - 0.000000f, - -0.181300f, - 0.369000f, - -0.911600f, - 0.781300f, - 0.620700f, - -0.086182f, - 0.234204f, - -0.433268f, - 0.000000f, - -0.172500f, - 0.467000f, - -0.867200f, - 0.781300f, - 0.655200f, - -0.000000f, - 0.234204f, - -0.441756f, - 0.000000f, - 0.000000f, - 0.467000f, - -0.884200f, - 0.750000f, - 0.655200f, - -0.090618f, - 0.185069f, - -0.455563f, - 0.000000f, - -0.181300f, - 0.369000f, - -0.911600f, - 0.781300f, - 0.620700f, - -0.000000f, - 0.234204f, - -0.441756f, - 0.000000f, - 0.000000f, - 0.467000f, - -0.884200f, - 0.750000f, - 0.655200f, - -0.000000f, - 0.185069f, - -0.464488f, - 0.000000f, - 0.000000f, - 0.369000f, - -0.929400f, - 0.750000f, - 0.620700f, - -0.040959f, - -0.453788f, - -0.205911f, - 0.000000f, - -0.082400f, - -0.906300f, - -0.414500f, - 0.781300f, - 0.137900f, - -0.050290f, - -0.428429f, - -0.252824f, - 0.000000f, - -0.101000f, - -0.855300f, - -0.508100f, - 0.781300f, - 0.172400f, - -0.000000f, - -0.428429f, - -0.257776f, - 0.000000f, - 0.000000f, - -0.855300f, - -0.518000f, - 0.750000f, - 0.172400f, - -0.040959f, - -0.453788f, - -0.205911f, - 0.000000f, - -0.082400f, - -0.906300f, - -0.414500f, - 0.781300f, - 0.137900f, - -0.000000f, - -0.428429f, - -0.257776f, - 0.000000f, - 0.000000f, - -0.855300f, - -0.518000f, - 0.750000f, - 0.172400f, - -0.000000f, - -0.453788f, - -0.209945f, - 0.000000f, - 0.000000f, - -0.906300f, - -0.422700f, - 0.750000f, - 0.137900f, - -0.093990f, - 0.133764f, - -0.472517f, - 0.000000f, - -0.188000f, - 0.266600f, - -0.945200f, - 0.781300f, - 0.586200f, - -0.090618f, - 0.185069f, - -0.455563f, - 0.000000f, - -0.181300f, - 0.369000f, - -0.911600f, - 0.781300f, - 0.620700f, - -0.000000f, - 0.185069f, - -0.464488f, - 0.000000f, - 0.000000f, - 0.369000f, - -0.929400f, - 0.750000f, - 0.620700f, - -0.093990f, - 0.133764f, - -0.472517f, - 0.000000f, - -0.188000f, - 0.266600f, - -0.945200f, - 0.781300f, - 0.586200f, - -0.000000f, - 0.185069f, - -0.464488f, - 0.000000f, - 0.000000f, - 0.369000f, - -0.929400f, - 0.750000f, - 0.620700f, - -0.000000f, - 0.133764f, - -0.481775f, - 0.000000f, - 0.000000f, - 0.266600f, - -0.963800f, - 0.750000f, - 0.586200f, - -0.031147f, - -0.473826f, - -0.156583f, - 0.000000f, - -0.062900f, - -0.946600f, - -0.316100f, - 0.781300f, - 0.103400f, - -0.040959f, - -0.453788f, - -0.205911f, - 0.000000f, - -0.082400f, - -0.906300f, - -0.414500f, - 0.781300f, - 0.137900f, - -0.000000f, - -0.453788f, - -0.209945f, - 0.000000f, - 0.000000f, - -0.906300f, - -0.422700f, - 0.750000f, - 0.137900f, - -0.031147f, - -0.473826f, - -0.156583f, - 0.000000f, - -0.062900f, - -0.946600f, - -0.316100f, - 0.781300f, - 0.103400f, - -0.000000f, - -0.453788f, - -0.209945f, - 0.000000f, - 0.000000f, - -0.906300f, - -0.422700f, - 0.750000f, - 0.137900f, - -0.000000f, - -0.473826f, - -0.159651f, - 0.000000f, - 0.000000f, - -0.946600f, - -0.322300f, - 0.750000f, - 0.103400f, - -0.096261f, - 0.080891f, - -0.483932f, - 0.000000f, - -0.192500f, - 0.161200f, - -0.967900f, - 0.781300f, - 0.551700f, - -0.093990f, - 0.133764f, - -0.472517f, - 0.000000f, - -0.188000f, - 0.266600f, - -0.945200f, - 0.781300f, - 0.586200f, - -0.000000f, - 0.133764f, - -0.481775f, - 0.000000f, - 0.000000f, - 0.266600f, - -0.963800f, - 0.750000f, - 0.586200f, - -0.096261f, - 0.080891f, - -0.483932f, - 0.000000f, - -0.192500f, - 0.161200f, - -0.967900f, - 0.781300f, - 0.551700f, - -0.000000f, - 0.133764f, - -0.481775f, - 0.000000f, - 0.000000f, - 0.266600f, - -0.963800f, - 0.750000f, - 0.586200f, - -0.000000f, - 0.080891f, - -0.493412f, - 0.000000f, - 0.000000f, - 0.161200f, - -0.986900f, - 0.750000f, - 0.551700f, - -0.020970f, - -0.488310f, - -0.105420f, - 0.000000f, - -0.042500f, - -0.975900f, - -0.214000f, - 0.781300f, - 0.069000f, - -0.031147f, - -0.473826f, - -0.156583f, - 0.000000f, - -0.062900f, - -0.946600f, - -0.316100f, - 0.781300f, - 0.103400f, - -0.000000f, - -0.473826f, - -0.159651f, - 0.000000f, - 0.000000f, - -0.946600f, - -0.322300f, - 0.750000f, - 0.103400f, - -0.020970f, - -0.488310f, - -0.105420f, - 0.000000f, - -0.042500f, - -0.975900f, - -0.214000f, - 0.781300f, - 0.069000f, - -0.000000f, - -0.473826f, - -0.159651f, - 0.000000f, - 0.000000f, - -0.946600f, - -0.322300f, - 0.750000f, - 0.103400f, - -0.000000f, - -0.488310f, - -0.107485f, - 0.000000f, - 0.000000f, - -0.975900f, - -0.218200f, - 0.750000f, - 0.069000f, - -0.097402f, - 0.027069f, - -0.489673f, - 0.000000f, - -0.194800f, - 0.054000f, - -0.979300f, - 0.781300f, - 0.517200f, - -0.096261f, - 0.080891f, - -0.483932f, - 0.000000f, - -0.192500f, - 0.161200f, - -0.967900f, - 0.781300f, - 0.551700f, - -0.000000f, - 0.080891f, - -0.493412f, - 0.000000f, - 0.000000f, - 0.161200f, - -0.986900f, - 0.750000f, - 0.551700f, - -0.097402f, - 0.027069f, - -0.489673f, - 0.000000f, - -0.194800f, - 0.054000f, - -0.979300f, - 0.781300f, - 0.517200f, - -0.000000f, - 0.080891f, - -0.493412f, - 0.000000f, - 0.000000f, - 0.161200f, - -0.986900f, - 0.750000f, - 0.551700f, - -0.000000f, - 0.027069f, - -0.499266f, - 0.000000f, - 0.000000f, - 0.054000f, - -0.998500f, - 0.750000f, - 0.517200f, - -0.010547f, - 0.497069f, - -0.053020f, - 0.000000f, - -0.021700f, - 0.993700f, - -0.109300f, - 0.439900f, - 0.962300f, - -0.000000f, - 0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - 1.000000f, - 0.000000f, - 0.423900f, - 0.960300f, - -0.000000f, - 0.497069f, - -0.054059f, - 0.000000f, - 0.000000f, - 0.993700f, - -0.111500f, - 0.441700f, - 0.962300f, - -0.010547f, - -0.497069f, - -0.053020f, - 0.000000f, - -0.021700f, - -0.993700f, - -0.109300f, - 0.781300f, - 0.034500f, - -0.020970f, - -0.488310f, - -0.105420f, - 0.000000f, - -0.042500f, - -0.975900f, - -0.214000f, - 0.781300f, - 0.069000f, - -0.000000f, - -0.488310f, - -0.107485f, - 0.000000f, - 0.000000f, - -0.975900f, - -0.218200f, - 0.750000f, - 0.069000f, - -0.010547f, - -0.497069f, - -0.053020f, - 0.000000f, - -0.021700f, - -0.993700f, - -0.109300f, - 0.781300f, - 0.034500f, - -0.000000f, - -0.488310f, - -0.107485f, - 0.000000f, - 0.000000f, - -0.975900f, - -0.218200f, - 0.750000f, - 0.069000f, - -0.000000f, - -0.497069f, - -0.054060f, - 0.000000f, - 0.000000f, - -0.993700f, - -0.111500f, - 0.750000f, - 0.034500f, - -0.097402f, - -0.027069f, - -0.489673f, - 0.000000f, - -0.194800f, - -0.054000f, - -0.979300f, - 0.781300f, - 0.482800f, - -0.097402f, - 0.027069f, - -0.489673f, - 0.000000f, - -0.194800f, - 0.054000f, - -0.979300f, - 0.781300f, - 0.517200f, - -0.000000f, - 0.027069f, - -0.499266f, - 0.000000f, - 0.000000f, - 0.054000f, - -0.998500f, - 0.750000f, - 0.517200f, - -0.097402f, - -0.027069f, - -0.489673f, - 0.000000f, - -0.194800f, - -0.054000f, - -0.979300f, - 0.781300f, - 0.482800f, - -0.000000f, - 0.027069f, - -0.499266f, - 0.000000f, - 0.000000f, - 0.054000f, - -0.998500f, - 0.750000f, - 0.517200f, - -0.000000f, - -0.027069f, - -0.499266f, - 0.000000f, - 0.000000f, - -0.054000f, - -0.998500f, - 0.750000f, - 0.482800f, - -0.020970f, - 0.488310f, - -0.105420f, - 0.000000f, - -0.042500f, - 0.975900f, - -0.214000f, - 0.781300f, - 0.931000f, - -0.010547f, - 0.497069f, - -0.053020f, - 0.000000f, - -0.021700f, - 0.993700f, - -0.109300f, - 0.781300f, - 0.965500f, - -0.000000f, - 0.497069f, - -0.054059f, - 0.000000f, - 0.000000f, - 0.993700f, - -0.111500f, - 0.750000f, - 0.965500f, - -0.020970f, - 0.488310f, - -0.105420f, - 0.000000f, - -0.042500f, - 0.975900f, - -0.214000f, - 0.781300f, - 0.931000f, - -0.000000f, - 0.497069f, - -0.054059f, - 0.000000f, - 0.000000f, - 0.993700f, - -0.111500f, - 0.750000f, - 0.965500f, - -0.000000f, - 0.488310f, - -0.107485f, - 0.000000f, - 0.000000f, - 0.975900f, - -0.218200f, - 0.750000f, - 0.931000f, - -0.000000f, - -0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - -1.000000f, - 0.000000f, - 0.495500f, - 0.051000f, - -0.010547f, - -0.497069f, - -0.053020f, - 0.000000f, - -0.021700f, - -0.993700f, - -0.109300f, - 0.475900f, - 0.053800f, - -0.000000f, - -0.497069f, - -0.054060f, - 0.000000f, - 0.000000f, - -0.993700f, - -0.111500f, - 0.473300f, - 0.053800f, - -0.096261f, - -0.080891f, - -0.483932f, - 0.000000f, - -0.192500f, - -0.161200f, - -0.967900f, - 0.781300f, - 0.448300f, - -0.097402f, - -0.027069f, - -0.489673f, - 0.000000f, - -0.194800f, - -0.054000f, - -0.979300f, - 0.781300f, - 0.482800f, - -0.000000f, - -0.027069f, - -0.499266f, - 0.000000f, - 0.000000f, - -0.054000f, - -0.998500f, - 0.750000f, - 0.482800f, - -0.096261f, - -0.080891f, - -0.483932f, - 0.000000f, - -0.192500f, - -0.161200f, - -0.967900f, - 0.781300f, - 0.448300f, - -0.000000f, - -0.027069f, - -0.499266f, - 0.000000f, - 0.000000f, - -0.054000f, - -0.998500f, - 0.750000f, - 0.482800f, - -0.000000f, - -0.080891f, - -0.493412f, - 0.000000f, - 0.000000f, - -0.161200f, - -0.986900f, - 0.750000f, - 0.448300f, - -0.031147f, - 0.473826f, - -0.156583f, - 0.000000f, - -0.062900f, - 0.946600f, - -0.316100f, - 0.781300f, - 0.896600f, - -0.020970f, - 0.488310f, - -0.105420f, - 0.000000f, - -0.042500f, - 0.975900f, - -0.214000f, - 0.781300f, - 0.931000f, - -0.000000f, - 0.488310f, - -0.107485f, - 0.000000f, - 0.000000f, - 0.975900f, - -0.218200f, - 0.750000f, - 0.931000f, - -0.031147f, - 0.473826f, - -0.156583f, - 0.000000f, - -0.062900f, - 0.946600f, - -0.316100f, - 0.781300f, - 0.896600f, - -0.000000f, - 0.488310f, - -0.107485f, - 0.000000f, - 0.000000f, - 0.975900f, - -0.218200f, - 0.750000f, - 0.931000f, - -0.000000f, - 0.473826f, - -0.159651f, - 0.000000f, - 0.000000f, - 0.946600f, - -0.322300f, - 0.750000f, - 0.896600f, - -0.093990f, - -0.133764f, - -0.472517f, - 0.000000f, - -0.188000f, - -0.266600f, - -0.945200f, - 0.781300f, - 0.413800f, - -0.096261f, - -0.080891f, - -0.483932f, - 0.000000f, - -0.192500f, - -0.161200f, - -0.967900f, - 0.781300f, - 0.448300f, - -0.000000f, - -0.080891f, - -0.493412f, - 0.000000f, - 0.000000f, - -0.161200f, - -0.986900f, - 0.750000f, - 0.448300f, - -0.093990f, - -0.133764f, - -0.472517f, - 0.000000f, - -0.188000f, - -0.266600f, - -0.945200f, - 0.781300f, - 0.413800f, - -0.000000f, - -0.080891f, - -0.493412f, - 0.000000f, - 0.000000f, - -0.161200f, - -0.986900f, - 0.750000f, - 0.448300f, - -0.000000f, - -0.133764f, - -0.481775f, - 0.000000f, - 0.000000f, - -0.266600f, - -0.963800f, - 0.750000f, - 0.413800f, - -0.040959f, - 0.453788f, - -0.205910f, - 0.000000f, - -0.082400f, - 0.906300f, - -0.414500f, - 0.781300f, - 0.862100f, - -0.031147f, - 0.473826f, - -0.156583f, - 0.000000f, - -0.062900f, - 0.946600f, - -0.316100f, - 0.781300f, - 0.896600f, - -0.000000f, - 0.473826f, - -0.159651f, - 0.000000f, - 0.000000f, - 0.946600f, - -0.322300f, - 0.750000f, - 0.896600f, - -0.040959f, - 0.453788f, - -0.205910f, - 0.000000f, - -0.082400f, - 0.906300f, - -0.414500f, - 0.781300f, - 0.862100f, - -0.000000f, - 0.473826f, - -0.159651f, - 0.000000f, - 0.000000f, - 0.946600f, - -0.322300f, - 0.750000f, - 0.896600f, - -0.000000f, - 0.453788f, - -0.209944f, - 0.000000f, - 0.000000f, - 0.906300f, - -0.422700f, - 0.750000f, - 0.862100f, - -0.090618f, - -0.185069f, - -0.455563f, - 0.000000f, - -0.181300f, - -0.369000f, - -0.911600f, - 0.781300f, - 0.379300f, - -0.093990f, - -0.133764f, - -0.472517f, - 0.000000f, - -0.188000f, - -0.266600f, - -0.945200f, - 0.781300f, - 0.413800f, - -0.000000f, - -0.133764f, - -0.481775f, - 0.000000f, - 0.000000f, - -0.266600f, - -0.963800f, - 0.750000f, - 0.413800f, - -0.090618f, - -0.185069f, - -0.455563f, - 0.000000f, - -0.181300f, - -0.369000f, - -0.911600f, - 0.781300f, - 0.379300f, - -0.000000f, - -0.133764f, - -0.481775f, - 0.000000f, - 0.000000f, - -0.266600f, - -0.963800f, - 0.750000f, - 0.413800f, - -0.000000f, - -0.185069f, - -0.464488f, - 0.000000f, - 0.000000f, - -0.369000f, - -0.929400f, - 0.750000f, - 0.379300f, - -0.050290f, - 0.428429f, - -0.252824f, - 0.000000f, - -0.101000f, - 0.855300f, - -0.508100f, - 0.781300f, - 0.827600f, - -0.040959f, - 0.453788f, - -0.205910f, - 0.000000f, - -0.082400f, - 0.906300f, - -0.414500f, - 0.781300f, - 0.862100f, - -0.000000f, - 0.453788f, - -0.209944f, - 0.000000f, - 0.000000f, - 0.906300f, - -0.422700f, - 0.750000f, - 0.862100f, - -0.050290f, - 0.428429f, - -0.252824f, - 0.000000f, - -0.101000f, - 0.855300f, - -0.508100f, - 0.781300f, - 0.827600f, - -0.000000f, - 0.453788f, - -0.209944f, - 0.000000f, - 0.000000f, - 0.906300f, - -0.422700f, - 0.750000f, - 0.862100f, - -0.000000f, - 0.428429f, - -0.257776f, - 0.000000f, - 0.000000f, - 0.855300f, - -0.518000f, - 0.750000f, - 0.827600f, - -0.086182f, - -0.234204f, - -0.433268f, - 0.000000f, - -0.172500f, - -0.467000f, - -0.867200f, - 0.781300f, - 0.344800f, - -0.090618f, - -0.185069f, - -0.455563f, - 0.000000f, - -0.181300f, - -0.369000f, - -0.911600f, - 0.781300f, - 0.379300f, - -0.000000f, - -0.185069f, - -0.464488f, - 0.000000f, - 0.000000f, - -0.369000f, - -0.929400f, - 0.750000f, - 0.379300f, - -0.086182f, - -0.234204f, - -0.433268f, - 0.000000f, - -0.172500f, - -0.467000f, - -0.867200f, - 0.781300f, - 0.344800f, - -0.000000f, - -0.185069f, - -0.464488f, - 0.000000f, - 0.000000f, - -0.369000f, - -0.929400f, - 0.750000f, - 0.379300f, - -0.000000f, - -0.234204f, - -0.441756f, - 0.000000f, - 0.000000f, - -0.467000f, - -0.884200f, - 0.750000f, - 0.344800f, - -0.059032f, - 0.398046f, - -0.296773f, - 0.000000f, - -0.118500f, - 0.794500f, - -0.595600f, - 0.781300f, - 0.793100f, - -0.050290f, - 0.428429f, - -0.252824f, - 0.000000f, - -0.101000f, - 0.855300f, - -0.508100f, - 0.781300f, - 0.827600f, - -0.000000f, - 0.428429f, - -0.257776f, - 0.000000f, - 0.000000f, - 0.855300f, - -0.518000f, - 0.750000f, - 0.827600f, - -0.059032f, - 0.398046f, - -0.296773f, - 0.000000f, - -0.118500f, - 0.794500f, - -0.595600f, - 0.781300f, - 0.793100f, - -0.000000f, - 0.428429f, - -0.257776f, - 0.000000f, - 0.000000f, - 0.855300f, - -0.518000f, - 0.750000f, - 0.827600f, - -0.000000f, - 0.398046f, - -0.302586f, - 0.000000f, - 0.000000f, - 0.794500f, - -0.607300f, - 0.750000f, - 0.793100f, - -0.080738f, - -0.280594f, - -0.405892f, - 0.000000f, - -0.161700f, - -0.559600f, - -0.812800f, - 0.781300f, - 0.310300f, - -0.086182f, - -0.234204f, - -0.433268f, - 0.000000f, - -0.172500f, - -0.467000f, - -0.867200f, - 0.781300f, - 0.344800f, - -0.000000f, - -0.234204f, - -0.441756f, - 0.000000f, - 0.000000f, - -0.467000f, - -0.884200f, - 0.750000f, - 0.344800f, - -0.080738f, - -0.280594f, - -0.405892f, - 0.000000f, - -0.161700f, - -0.559600f, - -0.812800f, - 0.781300f, - 0.310300f, - -0.000000f, - -0.234204f, - -0.441756f, - 0.000000f, - 0.000000f, - -0.467000f, - -0.884200f, - 0.750000f, - 0.344800f, - -0.000000f, - -0.280594f, - -0.413844f, - 0.000000f, - 0.000000f, - -0.559600f, - -0.828700f, - 0.750000f, - 0.310300f, - -0.067082f, - 0.362998f, - -0.337242f, - 0.000000f, - -0.134500f, - 0.724300f, - -0.676200f, - 0.781300f, - 0.758600f, - -0.059032f, - 0.398046f, - -0.296773f, - 0.000000f, - -0.118500f, - 0.794500f, - -0.595600f, - 0.781300f, - 0.793100f, - -0.000000f, - 0.398046f, - -0.302586f, - 0.000000f, - 0.000000f, - 0.794500f, - -0.607300f, - 0.750000f, - 0.793100f, - -0.067082f, - 0.362998f, - -0.337242f, - 0.000000f, - -0.134500f, - 0.724300f, - -0.676200f, - 0.781300f, - 0.758600f, - -0.000000f, - 0.398046f, - -0.302586f, - 0.000000f, - 0.000000f, - 0.794500f, - -0.607300f, - 0.750000f, - 0.793100f, - -0.000000f, - 0.362998f, - -0.343849f, - 0.000000f, - 0.000000f, - 0.724300f, - -0.689400f, - 0.750000f, - 0.758600f, - -0.074345f, - -0.323693f, - -0.373758f, - 0.000000f, - -0.149000f, - -0.645700f, - -0.748900f, - 0.781300f, - 0.275900f, - -0.080738f, - -0.280594f, - -0.405892f, - 0.000000f, - -0.161700f, - -0.559600f, - -0.812800f, - 0.781300f, - 0.310300f, - -0.000000f, - -0.280594f, - -0.413844f, - 0.000000f, - 0.000000f, - -0.559600f, - -0.828700f, - 0.750000f, - 0.310300f, - -0.074345f, - -0.323693f, - -0.373758f, - 0.000000f, - -0.149000f, - -0.645700f, - -0.748900f, - 0.781300f, - 0.275900f, - -0.000000f, - -0.280594f, - -0.413844f, - 0.000000f, - 0.000000f, - -0.559600f, - -0.828700f, - 0.750000f, - 0.310300f, - -0.000000f, - -0.323693f, - -0.381081f, - 0.000000f, - 0.000000f, - -0.645700f, - -0.763500f, - 0.750000f, - 0.275900f, - -0.074345f, - 0.323693f, - -0.373758f, - 0.000000f, - -0.149000f, - 0.645700f, - -0.748900f, - 0.781300f, - 0.724100f, - -0.067082f, - 0.362998f, - -0.337242f, - 0.000000f, - -0.134500f, - 0.724300f, - -0.676200f, - 0.781300f, - 0.758600f, - -0.000000f, - 0.362998f, - -0.343849f, - 0.000000f, - 0.000000f, - 0.724300f, - -0.689400f, - 0.750000f, - 0.758600f, - -0.074345f, - 0.323693f, - -0.373758f, - 0.000000f, - -0.149000f, - 0.645700f, - -0.748900f, - 0.781300f, - 0.724100f, - -0.000000f, - 0.362998f, - -0.343849f, - 0.000000f, - 0.000000f, - 0.724300f, - -0.689400f, - 0.750000f, - 0.758600f, - -0.000000f, - 0.323693f, - -0.381081f, - 0.000000f, - 0.000000f, - 0.645700f, - -0.763500f, - 0.750000f, - 0.724100f, - -0.000000f, - 0.473826f, - -0.159651f, - 0.000000f, - 0.000000f, - 0.946600f, - -0.322300f, - 0.750000f, - 0.896600f, - -0.000000f, - 0.488310f, - -0.107485f, - 0.000000f, - 0.000000f, - 0.975900f, - -0.218200f, - 0.750000f, - 0.931000f, - 0.020969f, - 0.488310f, - -0.105420f, - 0.000000f, - 0.042500f, - 0.975900f, - -0.214000f, - 0.718800f, - 0.931000f, - -0.000000f, - 0.473826f, - -0.159651f, - 0.000000f, - 0.000000f, - 0.946600f, - -0.322300f, - 0.750000f, - 0.896600f, - 0.020969f, - 0.488310f, - -0.105420f, - 0.000000f, - 0.042500f, - 0.975900f, - -0.214000f, - 0.718800f, - 0.931000f, - 0.031146f, - 0.473826f, - -0.156583f, - 0.000000f, - 0.062900f, - 0.946600f, - -0.316100f, - 0.718800f, - 0.896600f, - -0.000000f, - -0.133764f, - -0.481775f, - 0.000000f, - 0.000000f, - -0.266600f, - -0.963800f, - 0.750000f, - 0.413800f, - -0.000000f, - -0.080891f, - -0.493412f, - 0.000000f, - 0.000000f, - -0.161200f, - -0.986900f, - 0.750000f, - 0.448300f, - 0.096259f, - -0.080891f, - -0.483932f, - 0.000000f, - 0.192500f, - -0.161200f, - -0.967900f, - 0.718800f, - 0.448300f, - -0.000000f, - -0.133764f, - -0.481775f, - 0.000000f, - 0.000000f, - -0.266600f, - -0.963800f, - 0.750000f, - 0.413800f, - 0.096259f, - -0.080891f, - -0.483932f, - 0.000000f, - 0.192500f, - -0.161200f, - -0.967900f, - 0.718800f, - 0.448300f, - 0.093989f, - -0.133764f, - -0.472517f, - 0.000000f, - 0.188000f, - -0.266600f, - -0.945200f, - 0.718800f, - 0.413800f, - -0.000000f, - 0.453788f, - -0.209944f, - 0.000000f, - 0.000000f, - 0.906300f, - -0.422700f, - 0.750000f, - 0.862100f, - -0.000000f, - 0.473826f, - -0.159651f, - 0.000000f, - 0.000000f, - 0.946600f, - -0.322300f, - 0.750000f, - 0.896600f, - 0.031146f, - 0.473826f, - -0.156583f, - 0.000000f, - 0.062900f, - 0.946600f, - -0.316100f, - 0.718800f, - 0.896600f, - -0.000000f, - 0.453788f, - -0.209944f, - 0.000000f, - 0.000000f, - 0.906300f, - -0.422700f, - 0.750000f, - 0.862100f, - 0.031146f, - 0.473826f, - -0.156583f, - 0.000000f, - 0.062900f, - 0.946600f, - -0.316100f, - 0.718800f, - 0.896600f, - 0.040957f, - 0.453788f, - -0.205910f, - 0.000000f, - 0.082400f, - 0.906300f, - -0.414500f, - 0.718800f, - 0.862100f, - -0.000000f, - -0.185069f, - -0.464488f, - 0.000000f, - 0.000000f, - -0.369000f, - -0.929400f, - 0.750000f, - 0.379300f, - -0.000000f, - -0.133764f, - -0.481775f, - 0.000000f, - 0.000000f, - -0.266600f, - -0.963800f, - 0.750000f, - 0.413800f, - 0.093989f, - -0.133764f, - -0.472517f, - 0.000000f, - 0.188000f, - -0.266600f, - -0.945200f, - 0.718800f, - 0.413800f, - -0.000000f, - -0.185069f, - -0.464488f, - 0.000000f, - 0.000000f, - -0.369000f, - -0.929400f, - 0.750000f, - 0.379300f, - 0.093989f, - -0.133764f, - -0.472517f, - 0.000000f, - 0.188000f, - -0.266600f, - -0.945200f, - 0.718800f, - 0.413800f, - 0.090617f, - -0.185069f, - -0.455563f, - 0.000000f, - 0.181300f, - -0.369000f, - -0.911600f, - 0.718800f, - 0.379300f, - -0.000000f, - 0.428429f, - -0.257776f, - 0.000000f, - 0.000000f, - 0.855300f, - -0.518000f, - 0.750000f, - 0.827600f, - -0.000000f, - 0.453788f, - -0.209944f, - 0.000000f, - 0.000000f, - 0.906300f, - -0.422700f, - 0.750000f, - 0.862100f, - 0.040957f, - 0.453788f, - -0.205910f, - 0.000000f, - 0.082400f, - 0.906300f, - -0.414500f, - 0.718800f, - 0.862100f, - -0.000000f, - 0.428429f, - -0.257776f, - 0.000000f, - 0.000000f, - 0.855300f, - -0.518000f, - 0.750000f, - 0.827600f, - 0.040957f, - 0.453788f, - -0.205910f, - 0.000000f, - 0.082400f, - 0.906300f, - -0.414500f, - 0.718800f, - 0.862100f, - 0.050290f, - 0.428429f, - -0.252824f, - 0.000000f, - 0.101000f, - 0.855300f, - -0.508100f, - 0.718800f, - 0.827600f, - -0.000000f, - -0.234204f, - -0.441756f, - 0.000000f, - 0.000000f, - -0.467000f, - -0.884200f, - 0.750000f, - 0.344800f, - -0.000000f, - -0.185069f, - -0.464488f, - 0.000000f, - 0.000000f, - -0.369000f, - -0.929400f, - 0.750000f, - 0.379300f, - 0.090617f, - -0.185069f, - -0.455563f, - 0.000000f, - 0.181300f, - -0.369000f, - -0.911600f, - 0.718800f, - 0.379300f, - -0.000000f, - -0.234204f, - -0.441756f, - 0.000000f, - 0.000000f, - -0.467000f, - -0.884200f, - 0.750000f, - 0.344800f, - 0.090617f, - -0.185069f, - -0.455563f, - 0.000000f, - 0.181300f, - -0.369000f, - -0.911600f, - 0.718800f, - 0.379300f, - 0.086182f, - -0.234204f, - -0.433268f, - 0.000000f, - 0.172500f, - -0.467000f, - -0.867200f, - 0.718800f, - 0.344800f, - -0.000000f, - 0.398046f, - -0.302586f, - 0.000000f, - 0.000000f, - 0.794500f, - -0.607300f, - 0.750000f, - 0.793100f, - -0.000000f, - 0.428429f, - -0.257776f, - 0.000000f, - 0.000000f, - 0.855300f, - -0.518000f, - 0.750000f, - 0.827600f, - 0.050290f, - 0.428429f, - -0.252824f, - 0.000000f, - 0.101000f, - 0.855300f, - -0.508100f, - 0.718800f, - 0.827600f, - -0.000000f, - 0.398046f, - -0.302586f, - 0.000000f, - 0.000000f, - 0.794500f, - -0.607300f, - 0.750000f, - 0.793100f, - 0.050290f, - 0.428429f, - -0.252824f, - 0.000000f, - 0.101000f, - 0.855300f, - -0.508100f, - 0.718800f, - 0.827600f, - 0.059032f, - 0.398046f, - -0.296773f, - 0.000000f, - 0.118500f, - 0.794500f, - -0.595600f, - 0.718800f, - 0.793100f, - -0.000000f, - -0.280594f, - -0.413844f, - 0.000000f, - 0.000000f, - -0.559600f, - -0.828700f, - 0.750000f, - 0.310300f, - -0.000000f, - -0.234204f, - -0.441756f, - 0.000000f, - 0.000000f, - -0.467000f, - -0.884200f, - 0.750000f, - 0.344800f, - 0.086182f, - -0.234204f, - -0.433268f, - 0.000000f, - 0.172500f, - -0.467000f, - -0.867200f, - 0.718800f, - 0.344800f, - -0.000000f, - -0.280594f, - -0.413844f, - 0.000000f, - 0.000000f, - -0.559600f, - -0.828700f, - 0.750000f, - 0.310300f, - 0.086182f, - -0.234204f, - -0.433268f, - 0.000000f, - 0.172500f, - -0.467000f, - -0.867200f, - 0.718800f, - 0.344800f, - 0.080737f, - -0.280594f, - -0.405892f, - 0.000000f, - 0.161700f, - -0.559600f, - -0.812800f, - 0.718800f, - 0.310300f, - -0.000000f, - 0.362998f, - -0.343849f, - 0.000000f, - 0.000000f, - 0.724300f, - -0.689400f, - 0.750000f, - 0.758600f, - -0.000000f, - 0.398046f, - -0.302586f, - 0.000000f, - 0.000000f, - 0.794500f, - -0.607300f, - 0.750000f, - 0.793100f, - 0.059032f, - 0.398046f, - -0.296773f, - 0.000000f, - 0.118500f, - 0.794500f, - -0.595600f, - 0.718800f, - 0.793100f, - -0.000000f, - 0.362998f, - -0.343849f, - 0.000000f, - 0.000000f, - 0.724300f, - -0.689400f, - 0.750000f, - 0.758600f, - 0.059032f, - 0.398046f, - -0.296773f, - 0.000000f, - 0.118500f, - 0.794500f, - -0.595600f, - 0.718800f, - 0.793100f, - 0.067081f, - 0.362998f, - -0.337242f, - 0.000000f, - 0.134500f, - 0.724300f, - -0.676200f, - 0.718800f, - 0.758600f, - -0.000000f, - -0.323693f, - -0.381081f, - 0.000000f, - 0.000000f, - -0.645700f, - -0.763500f, - 0.750000f, - 0.275900f, - -0.000000f, - -0.280594f, - -0.413844f, - 0.000000f, - 0.000000f, - -0.559600f, - -0.828700f, - 0.750000f, - 0.310300f, - 0.080737f, - -0.280594f, - -0.405892f, - 0.000000f, - 0.161700f, - -0.559600f, - -0.812800f, - 0.718800f, - 0.310300f, - -0.000000f, - -0.323693f, - -0.381081f, - 0.000000f, - 0.000000f, - -0.645700f, - -0.763500f, - 0.750000f, - 0.275900f, - 0.080737f, - -0.280594f, - -0.405892f, - 0.000000f, - 0.161700f, - -0.559600f, - -0.812800f, - 0.718800f, - 0.310300f, - 0.074345f, - -0.323693f, - -0.373758f, - 0.000000f, - 0.149000f, - -0.645700f, - -0.748900f, - 0.718800f, - 0.275900f, - -0.000000f, - 0.323693f, - -0.381081f, - 0.000000f, - 0.000000f, - 0.645700f, - -0.763500f, - 0.750000f, - 0.724100f, - -0.000000f, - 0.362998f, - -0.343849f, - 0.000000f, - 0.000000f, - 0.724300f, - -0.689400f, - 0.750000f, - 0.758600f, - 0.067081f, - 0.362998f, - -0.337242f, - 0.000000f, - 0.134500f, - 0.724300f, - -0.676200f, - 0.718800f, - 0.758600f, - -0.000000f, - 0.323693f, - -0.381081f, - 0.000000f, - 0.000000f, - 0.645700f, - -0.763500f, - 0.750000f, - 0.724100f, - 0.067081f, - 0.362998f, - -0.337242f, - 0.000000f, - 0.134500f, - 0.724300f, - -0.676200f, - 0.718800f, - 0.758600f, - 0.074345f, - 0.323693f, - -0.373758f, - 0.000000f, - 0.149000f, - 0.645700f, - -0.748900f, - 0.718800f, - 0.724100f, - -0.000000f, - -0.362998f, - -0.343850f, - 0.000000f, - 0.000000f, - -0.724300f, - -0.689400f, - 0.750000f, - 0.241400f, - -0.000000f, - -0.323693f, - -0.381081f, - 0.000000f, - 0.000000f, - -0.645700f, - -0.763500f, - 0.750000f, - 0.275900f, - 0.074345f, - -0.323693f, - -0.373758f, - 0.000000f, - 0.149000f, - -0.645700f, - -0.748900f, - 0.718800f, - 0.275900f, - -0.000000f, - -0.362998f, - -0.343850f, - 0.000000f, - 0.000000f, - -0.724300f, - -0.689400f, - 0.750000f, - 0.241400f, - 0.074345f, - -0.323693f, - -0.373758f, - 0.000000f, - 0.149000f, - -0.645700f, - -0.748900f, - 0.718800f, - 0.275900f, - 0.067081f, - -0.362998f, - -0.337243f, - 0.000000f, - 0.134500f, - -0.724300f, - -0.676200f, - 0.718800f, - 0.241400f, - -0.000000f, - 0.280594f, - -0.413844f, - 0.000000f, - 0.000000f, - 0.559600f, - -0.828700f, - 0.750000f, - 0.689700f, - -0.000000f, - 0.323693f, - -0.381081f, - 0.000000f, - 0.000000f, - 0.645700f, - -0.763500f, - 0.750000f, - 0.724100f, - 0.074345f, - 0.323693f, - -0.373758f, - 0.000000f, - 0.149000f, - 0.645700f, - -0.748900f, - 0.718800f, - 0.724100f, - -0.000000f, - 0.280594f, - -0.413844f, - 0.000000f, - 0.000000f, - 0.559600f, - -0.828700f, - 0.750000f, - 0.689700f, - 0.074345f, - 0.323693f, - -0.373758f, - 0.000000f, - 0.149000f, - 0.645700f, - -0.748900f, - 0.718800f, - 0.724100f, - 0.080737f, - 0.280594f, - -0.405892f, - 0.000000f, - 0.161700f, - 0.559600f, - -0.812800f, - 0.718800f, - 0.689700f, - -0.000000f, - -0.398046f, - -0.302587f, - 0.000000f, - 0.000000f, - -0.794500f, - -0.607300f, - 0.750000f, - 0.206900f, - -0.000000f, - -0.362998f, - -0.343850f, - 0.000000f, - 0.000000f, - -0.724300f, - -0.689400f, - 0.750000f, - 0.241400f, - 0.067081f, - -0.362998f, - -0.337243f, - 0.000000f, - 0.134500f, - -0.724300f, - -0.676200f, - 0.718800f, - 0.241400f, - -0.000000f, - -0.398046f, - -0.302587f, - 0.000000f, - 0.000000f, - -0.794500f, - -0.607300f, - 0.750000f, - 0.206900f, - 0.067081f, - -0.362998f, - -0.337243f, - 0.000000f, - 0.134500f, - -0.724300f, - -0.676200f, - 0.718800f, - 0.241400f, - 0.059032f, - -0.398046f, - -0.296773f, - 0.000000f, - 0.118500f, - -0.794500f, - -0.595600f, - 0.718800f, - 0.206900f, - -0.000000f, - 0.234204f, - -0.441756f, - 0.000000f, - 0.000000f, - 0.467000f, - -0.884200f, - 0.750000f, - 0.655200f, - -0.000000f, - 0.280594f, - -0.413844f, - 0.000000f, - 0.000000f, - 0.559600f, - -0.828700f, - 0.750000f, - 0.689700f, - 0.080737f, - 0.280594f, - -0.405892f, - 0.000000f, - 0.161700f, - 0.559600f, - -0.812800f, - 0.718800f, - 0.689700f, - -0.000000f, - 0.234204f, - -0.441756f, - 0.000000f, - 0.000000f, - 0.467000f, - -0.884200f, - 0.750000f, - 0.655200f, - 0.080737f, - 0.280594f, - -0.405892f, - 0.000000f, - 0.161700f, - 0.559600f, - -0.812800f, - 0.718800f, - 0.689700f, - 0.086182f, - 0.234204f, - -0.433268f, - 0.000000f, - 0.172500f, - 0.467000f, - -0.867200f, - 0.718800f, - 0.655200f, - -0.000000f, - -0.428429f, - -0.257776f, - 0.000000f, - 0.000000f, - -0.855300f, - -0.518000f, - 0.750000f, - 0.172400f, - -0.000000f, - -0.398046f, - -0.302587f, - 0.000000f, - 0.000000f, - -0.794500f, - -0.607300f, - 0.750000f, - 0.206900f, - 0.059032f, - -0.398046f, - -0.296773f, - 0.000000f, - 0.118500f, - -0.794500f, - -0.595600f, - 0.718800f, - 0.206900f, - -0.000000f, - -0.428429f, - -0.257776f, - 0.000000f, - 0.000000f, - -0.855300f, - -0.518000f, - 0.750000f, - 0.172400f, - 0.059032f, - -0.398046f, - -0.296773f, - 0.000000f, - 0.118500f, - -0.794500f, - -0.595600f, - 0.718800f, - 0.206900f, - 0.050290f, - -0.428429f, - -0.252824f, - 0.000000f, - 0.101000f, - -0.855300f, - -0.508100f, - 0.718800f, - 0.172400f, - -0.000000f, - 0.185069f, - -0.464488f, - 0.000000f, - 0.000000f, - 0.369000f, - -0.929400f, - 0.750000f, - 0.620700f, - -0.000000f, - 0.234204f, - -0.441756f, - 0.000000f, - 0.000000f, - 0.467000f, - -0.884200f, - 0.750000f, - 0.655200f, - 0.086182f, - 0.234204f, - -0.433268f, - 0.000000f, - 0.172500f, - 0.467000f, - -0.867200f, - 0.718800f, - 0.655200f, - -0.000000f, - 0.185069f, - -0.464488f, - 0.000000f, - 0.000000f, - 0.369000f, - -0.929400f, - 0.750000f, - 0.620700f, - 0.086182f, - 0.234204f, - -0.433268f, - 0.000000f, - 0.172500f, - 0.467000f, - -0.867200f, - 0.718800f, - 0.655200f, - 0.090617f, - 0.185069f, - -0.455563f, - 0.000000f, - 0.181300f, - 0.369000f, - -0.911600f, - 0.718800f, - 0.620700f, - -0.000000f, - -0.453788f, - -0.209945f, - 0.000000f, - 0.000000f, - -0.906300f, - -0.422700f, - 0.750000f, - 0.137900f, - -0.000000f, - -0.428429f, - -0.257776f, - 0.000000f, - 0.000000f, - -0.855300f, - -0.518000f, - 0.750000f, - 0.172400f, - 0.050290f, - -0.428429f, - -0.252824f, - 0.000000f, - 0.101000f, - -0.855300f, - -0.508100f, - 0.718800f, - 0.172400f, - -0.000000f, - -0.453788f, - -0.209945f, - 0.000000f, - 0.000000f, - -0.906300f, - -0.422700f, - 0.750000f, - 0.137900f, - 0.050290f, - -0.428429f, - -0.252824f, - 0.000000f, - 0.101000f, - -0.855300f, - -0.508100f, - 0.718800f, - 0.172400f, - 0.040957f, - -0.453788f, - -0.205911f, - 0.000000f, - 0.082400f, - -0.906300f, - -0.414500f, - 0.718800f, - 0.137900f, - -0.000000f, - 0.133764f, - -0.481775f, - 0.000000f, - 0.000000f, - 0.266600f, - -0.963800f, - 0.750000f, - 0.586200f, - -0.000000f, - 0.185069f, - -0.464488f, - 0.000000f, - 0.000000f, - 0.369000f, - -0.929400f, - 0.750000f, - 0.620700f, - 0.090617f, - 0.185069f, - -0.455563f, - 0.000000f, - 0.181300f, - 0.369000f, - -0.911600f, - 0.718800f, - 0.620700f, - -0.000000f, - 0.133764f, - -0.481775f, - 0.000000f, - 0.000000f, - 0.266600f, - -0.963800f, - 0.750000f, - 0.586200f, - 0.090617f, - 0.185069f, - -0.455563f, - 0.000000f, - 0.181300f, - 0.369000f, - -0.911600f, - 0.718800f, - 0.620700f, - 0.093989f, - 0.133764f, - -0.472517f, - 0.000000f, - 0.188000f, - 0.266600f, - -0.945200f, - 0.718800f, - 0.586200f, - -0.000000f, - -0.473826f, - -0.159651f, - 0.000000f, - 0.000000f, - -0.946600f, - -0.322300f, - 0.750000f, - 0.103400f, - -0.000000f, - -0.453788f, - -0.209945f, - 0.000000f, - 0.000000f, - -0.906300f, - -0.422700f, - 0.750000f, - 0.137900f, - 0.040957f, - -0.453788f, - -0.205911f, - 0.000000f, - 0.082400f, - -0.906300f, - -0.414500f, - 0.718800f, - 0.137900f, - -0.000000f, - -0.473826f, - -0.159651f, - 0.000000f, - 0.000000f, - -0.946600f, - -0.322300f, - 0.750000f, - 0.103400f, - 0.040957f, - -0.453788f, - -0.205911f, - 0.000000f, - 0.082400f, - -0.906300f, - -0.414500f, - 0.718800f, - 0.137900f, - 0.031146f, - -0.473826f, - -0.156583f, - 0.000000f, - 0.062900f, - -0.946600f, - -0.316100f, - 0.718800f, - 0.103400f, - -0.000000f, - 0.080891f, - -0.493412f, - 0.000000f, - 0.000000f, - 0.161200f, - -0.986900f, - 0.750000f, - 0.551700f, - -0.000000f, - 0.133764f, - -0.481775f, - 0.000000f, - 0.000000f, - 0.266600f, - -0.963800f, - 0.750000f, - 0.586200f, - 0.093989f, - 0.133764f, - -0.472517f, - 0.000000f, - 0.188000f, - 0.266600f, - -0.945200f, - 0.718800f, - 0.586200f, - -0.000000f, - 0.080891f, - -0.493412f, - 0.000000f, - 0.000000f, - 0.161200f, - -0.986900f, - 0.750000f, - 0.551700f, - 0.093989f, - 0.133764f, - -0.472517f, - 0.000000f, - 0.188000f, - 0.266600f, - -0.945200f, - 0.718800f, - 0.586200f, - 0.096259f, - 0.080891f, - -0.483932f, - 0.000000f, - 0.192500f, - 0.161200f, - -0.967900f, - 0.718800f, - 0.551700f, - -0.000000f, - -0.488310f, - -0.107485f, - 0.000000f, - 0.000000f, - -0.975900f, - -0.218200f, - 0.750000f, - 0.069000f, - -0.000000f, - -0.473826f, - -0.159651f, - 0.000000f, - 0.000000f, - -0.946600f, - -0.322300f, - 0.750000f, - 0.103400f, - 0.031146f, - -0.473826f, - -0.156583f, - 0.000000f, - 0.062900f, - -0.946600f, - -0.316100f, - 0.718800f, - 0.103400f, - -0.000000f, - -0.488310f, - -0.107485f, - 0.000000f, - 0.000000f, - -0.975900f, - -0.218200f, - 0.750000f, - 0.069000f, - 0.031146f, - -0.473826f, - -0.156583f, - 0.000000f, - 0.062900f, - -0.946600f, - -0.316100f, - 0.718800f, - 0.103400f, - 0.020969f, - -0.488310f, - -0.105420f, - 0.000000f, - 0.042500f, - -0.975900f, - -0.214000f, - 0.718800f, - 0.069000f, - -0.000000f, - 0.027069f, - -0.499266f, - 0.000000f, - 0.000000f, - 0.054000f, - -0.998500f, - 0.750000f, - 0.517200f, - -0.000000f, - 0.080891f, - -0.493412f, - 0.000000f, - 0.000000f, - 0.161200f, - -0.986900f, - 0.750000f, - 0.551700f, - 0.096259f, - 0.080891f, - -0.483932f, - 0.000000f, - 0.192500f, - 0.161200f, - -0.967900f, - 0.718800f, - 0.551700f, - -0.000000f, - 0.027069f, - -0.499266f, - 0.000000f, - 0.000000f, - 0.054000f, - -0.998500f, - 0.750000f, - 0.517200f, - 0.096259f, - 0.080891f, - -0.483932f, - 0.000000f, - 0.192500f, - 0.161200f, - -0.967900f, - 0.718800f, - 0.551700f, - 0.097401f, - 0.027069f, - -0.489673f, - 0.000000f, - 0.194800f, - 0.054000f, - -0.979300f, - 0.718800f, - 0.517200f, - -0.000000f, - 0.497069f, - -0.054059f, - 0.000000f, - 0.000000f, - 0.993700f, - -0.111500f, - 0.441700f, - 0.962300f, - -0.000000f, - 0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - 1.000000f, - 0.000000f, - 0.423900f, - 0.960300f, - 0.010546f, - 0.497069f, - -0.053020f, - 0.000000f, - 0.021700f, - 0.993700f, - -0.109300f, - 0.443500f, - 0.962300f, - -0.000000f, - -0.497069f, - -0.054060f, - 0.000000f, - 0.000000f, - -0.993700f, - -0.111500f, - 0.750000f, - 0.034500f, - -0.000000f, - -0.488310f, - -0.107485f, - 0.000000f, - 0.000000f, - -0.975900f, - -0.218200f, - 0.750000f, - 0.069000f, - 0.020969f, - -0.488310f, - -0.105420f, - 0.000000f, - 0.042500f, - -0.975900f, - -0.214000f, - 0.718800f, - 0.069000f, - -0.000000f, - -0.497069f, - -0.054060f, - 0.000000f, - 0.000000f, - -0.993700f, - -0.111500f, - 0.750000f, - 0.034500f, - 0.020969f, - -0.488310f, - -0.105420f, - 0.000000f, - 0.042500f, - -0.975900f, - -0.214000f, - 0.718800f, - 0.069000f, - 0.010546f, - -0.497069f, - -0.053020f, - 0.000000f, - 0.021700f, - -0.993700f, - -0.109300f, - 0.718800f, - 0.034500f, - -0.000000f, - -0.027069f, - -0.499266f, - 0.000000f, - 0.000000f, - -0.054000f, - -0.998500f, - 0.750000f, - 0.482800f, - -0.000000f, - 0.027069f, - -0.499266f, - 0.000000f, - 0.000000f, - 0.054000f, - -0.998500f, - 0.750000f, - 0.517200f, - 0.097401f, - 0.027069f, - -0.489673f, - 0.000000f, - 0.194800f, - 0.054000f, - -0.979300f, - 0.718800f, - 0.517200f, - -0.000000f, - -0.027069f, - -0.499266f, - 0.000000f, - 0.000000f, - -0.054000f, - -0.998500f, - 0.750000f, - 0.482800f, - 0.097401f, - 0.027069f, - -0.489673f, - 0.000000f, - 0.194800f, - 0.054000f, - -0.979300f, - 0.718800f, - 0.517200f, - 0.097401f, - -0.027069f, - -0.489673f, - 0.000000f, - 0.194800f, - -0.054000f, - -0.979300f, - 0.718800f, - 0.482800f, - -0.000000f, - 0.488310f, - -0.107485f, - 0.000000f, - 0.000000f, - 0.975900f, - -0.218200f, - 0.750000f, - 0.931000f, - -0.000000f, - 0.497069f, - -0.054059f, - 0.000000f, - 0.000000f, - 0.993700f, - -0.111500f, - 0.750000f, - 0.965500f, - 0.010546f, - 0.497069f, - -0.053020f, - 0.000000f, - 0.021700f, - 0.993700f, - -0.109300f, - 0.718800f, - 0.965500f, - -0.000000f, - 0.488310f, - -0.107485f, - 0.000000f, - 0.000000f, - 0.975900f, - -0.218200f, - 0.750000f, - 0.931000f, - 0.010546f, - 0.497069f, - -0.053020f, - 0.000000f, - 0.021700f, - 0.993700f, - -0.109300f, - 0.718800f, - 0.965500f, - 0.020969f, - 0.488310f, - -0.105420f, - 0.000000f, - 0.042500f, - 0.975900f, - -0.214000f, - 0.718800f, - 0.931000f, - -0.000000f, - -0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - -1.000000f, - 0.000000f, - 0.495500f, - 0.051000f, - -0.000000f, - -0.497069f, - -0.054060f, - 0.000000f, - 0.000000f, - -0.993700f, - -0.111500f, - 0.473300f, - 0.053800f, - 0.010546f, - -0.497069f, - -0.053020f, - 0.000000f, - 0.021700f, - -0.993700f, - -0.109300f, - 0.470600f, - 0.053800f, - -0.000000f, - -0.080891f, - -0.493412f, - 0.000000f, - 0.000000f, - -0.161200f, - -0.986900f, - 0.750000f, - 0.448300f, - -0.000000f, - -0.027069f, - -0.499266f, - 0.000000f, - 0.000000f, - -0.054000f, - -0.998500f, - 0.750000f, - 0.482800f, - 0.097401f, - -0.027069f, - -0.489673f, - 0.000000f, - 0.194800f, - -0.054000f, - -0.979300f, - 0.718800f, - 0.482800f, - -0.000000f, - -0.080891f, - -0.493412f, - 0.000000f, - 0.000000f, - -0.161200f, - -0.986900f, - 0.750000f, - 0.448300f, - 0.097401f, - -0.027069f, - -0.489673f, - 0.000000f, - 0.194800f, - -0.054000f, - -0.979300f, - 0.718800f, - 0.482800f, - 0.096259f, - -0.080891f, - -0.483932f, - 0.000000f, - 0.192500f, - -0.161200f, - -0.967900f, - 0.718800f, - 0.448300f, - 0.090617f, - 0.185069f, - -0.455563f, - 0.000000f, - 0.181300f, - 0.369000f, - -0.911600f, - 0.718800f, - 0.620700f, - 0.086182f, - 0.234204f, - -0.433268f, - 0.000000f, - 0.172500f, - 0.467000f, - -0.867200f, - 0.718800f, - 0.655200f, - 0.169052f, - 0.234204f, - -0.408129f, - 0.000000f, - 0.338400f, - 0.467000f, - -0.816900f, - 0.687500f, - 0.655200f, - 0.090617f, - 0.185069f, - -0.455563f, - 0.000000f, - 0.181300f, - 0.369000f, - -0.911600f, - 0.718800f, - 0.620700f, - 0.169052f, - 0.234204f, - -0.408129f, - 0.000000f, - 0.338400f, - 0.467000f, - -0.816900f, - 0.687500f, - 0.655200f, - 0.177751f, - 0.185069f, - -0.429130f, - 0.000000f, - 0.355700f, - 0.369000f, - -0.858700f, - 0.687500f, - 0.620700f, - 0.040957f, - -0.453788f, - -0.205911f, - 0.000000f, - 0.082400f, - -0.906300f, - -0.414500f, - 0.718800f, - 0.137900f, - 0.050290f, - -0.428429f, - -0.252824f, - 0.000000f, - 0.101000f, - -0.855300f, - -0.508100f, - 0.718800f, - 0.172400f, - 0.098646f, - -0.428429f, - -0.238155f, - 0.000000f, - 0.198200f, - -0.855300f, - -0.478600f, - 0.687500f, - 0.172400f, - 0.040957f, - -0.453788f, - -0.205911f, - 0.000000f, - 0.082400f, - -0.906300f, - -0.414500f, - 0.718800f, - 0.137900f, - 0.098646f, - -0.428429f, - -0.238155f, - 0.000000f, - 0.198200f, - -0.855300f, - -0.478600f, - 0.687500f, - 0.172400f, - 0.080342f, - -0.453788f, - -0.193963f, - 0.000000f, - 0.161700f, - -0.906300f, - -0.390500f, - 0.687500f, - 0.137900f, - 0.093989f, - 0.133764f, - -0.472517f, - 0.000000f, - 0.188000f, - 0.266600f, - -0.945200f, - 0.718800f, - 0.586200f, - 0.090617f, - 0.185069f, - -0.455563f, - 0.000000f, - 0.181300f, - 0.369000f, - -0.911600f, - 0.718800f, - 0.620700f, - 0.177751f, - 0.185069f, - -0.429130f, - 0.000000f, - 0.355700f, - 0.369000f, - -0.858700f, - 0.687500f, - 0.620700f, - 0.093989f, - 0.133764f, - -0.472517f, - 0.000000f, - 0.188000f, - 0.266600f, - -0.945200f, - 0.718800f, - 0.586200f, - 0.177751f, - 0.185069f, - -0.429130f, - 0.000000f, - 0.355700f, - 0.369000f, - -0.858700f, - 0.687500f, - 0.620700f, - 0.184366f, - 0.133764f, - -0.445101f, - 0.000000f, - 0.368800f, - 0.266600f, - -0.890400f, - 0.687500f, - 0.586200f, - 0.031146f, - -0.473826f, - -0.156583f, - 0.000000f, - 0.062900f, - -0.946600f, - -0.316100f, - 0.718800f, - 0.103400f, - 0.040957f, - -0.453788f, - -0.205911f, - 0.000000f, - 0.082400f, - -0.906300f, - -0.414500f, - 0.718800f, - 0.137900f, - 0.080342f, - -0.453788f, - -0.193963f, - 0.000000f, - 0.161700f, - -0.906300f, - -0.390500f, - 0.687500f, - 0.137900f, - 0.031146f, - -0.473826f, - -0.156583f, - 0.000000f, - 0.062900f, - -0.946600f, - -0.316100f, - 0.718800f, - 0.103400f, - 0.080342f, - -0.453788f, - -0.193963f, - 0.000000f, - 0.161700f, - -0.906300f, - -0.390500f, - 0.687500f, - 0.137900f, - 0.061095f, - -0.473826f, - -0.147498f, - 0.000000f, - 0.123300f, - -0.946600f, - -0.297800f, - 0.687500f, - 0.103400f, - 0.096259f, - 0.080891f, - -0.483932f, - 0.000000f, - 0.192500f, - 0.161200f, - -0.967900f, - 0.718800f, - 0.551700f, - 0.093989f, - 0.133764f, - -0.472517f, - 0.000000f, - 0.188000f, - 0.266600f, - -0.945200f, - 0.718800f, - 0.586200f, - 0.184366f, - 0.133764f, - -0.445101f, - 0.000000f, - 0.368800f, - 0.266600f, - -0.890400f, - 0.687500f, - 0.586200f, - 0.096259f, - 0.080891f, - -0.483932f, - 0.000000f, - 0.192500f, - 0.161200f, - -0.967900f, - 0.718800f, - 0.551700f, - 0.184366f, - 0.133764f, - -0.445101f, - 0.000000f, - 0.368800f, - 0.266600f, - -0.890400f, - 0.687500f, - 0.586200f, - 0.188820f, - 0.080891f, - -0.455854f, - 0.000000f, - 0.377700f, - 0.161200f, - -0.911800f, - 0.687500f, - 0.551700f, - 0.020969f, - -0.488310f, - -0.105420f, - 0.000000f, - 0.042500f, - -0.975900f, - -0.214000f, - 0.718800f, - 0.069000f, - 0.031146f, - -0.473826f, - -0.156583f, - 0.000000f, - 0.062900f, - -0.946600f, - -0.316100f, - 0.718800f, - 0.103400f, - 0.061095f, - -0.473826f, - -0.147498f, - 0.000000f, - 0.123300f, - -0.946600f, - -0.297800f, - 0.687500f, - 0.103400f, - 0.020969f, - -0.488310f, - -0.105420f, - 0.000000f, - 0.042500f, - -0.975900f, - -0.214000f, - 0.718800f, - 0.069000f, - 0.061095f, - -0.473826f, - -0.147498f, - 0.000000f, - 0.123300f, - -0.946600f, - -0.297800f, - 0.687500f, - 0.103400f, - 0.041132f, - -0.488310f, - -0.099303f, - 0.000000f, - 0.083500f, - -0.975900f, - -0.201600f, - 0.687500f, - 0.069000f, - 0.097401f, - 0.027069f, - -0.489673f, - 0.000000f, - 0.194800f, - 0.054000f, - -0.979300f, - 0.718800f, - 0.517200f, - 0.096259f, - 0.080891f, - -0.483932f, - 0.000000f, - 0.192500f, - 0.161200f, - -0.967900f, - 0.718800f, - 0.551700f, - 0.188820f, - 0.080891f, - -0.455854f, - 0.000000f, - 0.377700f, - 0.161200f, - -0.911800f, - 0.687500f, - 0.551700f, - 0.097401f, - 0.027069f, - -0.489673f, - 0.000000f, - 0.194800f, - 0.054000f, - -0.979300f, - 0.718800f, - 0.517200f, - 0.188820f, - 0.080891f, - -0.455854f, - 0.000000f, - 0.377700f, - 0.161200f, - -0.911800f, - 0.687500f, - 0.551700f, - 0.191060f, - 0.027069f, - -0.461262f, - 0.000000f, - 0.382100f, - 0.054000f, - -0.922500f, - 0.687500f, - 0.517200f, - 0.010546f, - 0.497069f, - -0.053020f, - 0.000000f, - 0.021700f, - 0.993700f, - -0.109300f, - 0.443500f, - 0.962300f, - -0.000000f, - 0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - 1.000000f, - 0.000000f, - 0.423900f, - 0.960300f, - 0.020687f, - 0.497069f, - -0.049944f, - 0.000000f, - 0.042600f, - 0.993700f, - -0.103000f, - 0.445300f, - 0.962300f, - 0.010546f, - -0.497069f, - -0.053020f, - 0.000000f, - 0.021700f, - -0.993700f, - -0.109300f, - 0.718800f, - 0.034500f, - 0.020969f, - -0.488310f, - -0.105420f, - 0.000000f, - 0.042500f, - -0.975900f, - -0.214000f, - 0.718800f, - 0.069000f, - 0.041132f, - -0.488310f, - -0.099303f, - 0.000000f, - 0.083500f, - -0.975900f, - -0.201600f, - 0.687500f, - 0.069000f, - 0.010546f, - -0.497069f, - -0.053020f, - 0.000000f, - 0.021700f, - -0.993700f, - -0.109300f, - 0.718800f, - 0.034500f, - 0.041132f, - -0.488310f, - -0.099303f, - 0.000000f, - 0.083500f, - -0.975900f, - -0.201600f, - 0.687500f, - 0.069000f, - 0.020687f, - -0.497069f, - -0.049945f, - 0.000000f, - 0.042600f, - -0.993700f, - -0.103000f, - 0.687500f, - 0.034500f, - 0.097401f, - -0.027069f, - -0.489673f, - 0.000000f, - 0.194800f, - -0.054000f, - -0.979300f, - 0.718800f, - 0.482800f, - 0.097401f, - 0.027069f, - -0.489673f, - 0.000000f, - 0.194800f, - 0.054000f, - -0.979300f, - 0.718800f, - 0.517200f, - 0.191060f, - 0.027069f, - -0.461262f, - 0.000000f, - 0.382100f, - 0.054000f, - -0.922500f, - 0.687500f, - 0.517200f, - 0.097401f, - -0.027069f, - -0.489673f, - 0.000000f, - 0.194800f, - -0.054000f, - -0.979300f, - 0.718800f, - 0.482800f, - 0.191060f, - 0.027069f, - -0.461262f, - 0.000000f, - 0.382100f, - 0.054000f, - -0.922500f, - 0.687500f, - 0.517200f, - 0.191060f, - -0.027069f, - -0.461262f, - 0.000000f, - 0.382100f, - -0.054000f, - -0.922500f, - 0.687500f, - 0.482800f, - 0.020969f, - 0.488310f, - -0.105420f, - 0.000000f, - 0.042500f, - 0.975900f, - -0.214000f, - 0.718800f, - 0.931000f, - 0.010546f, - 0.497069f, - -0.053020f, - 0.000000f, - 0.021700f, - 0.993700f, - -0.109300f, - 0.718800f, - 0.965500f, - 0.020687f, - 0.497069f, - -0.049944f, - 0.000000f, - 0.042600f, - 0.993700f, - -0.103000f, - 0.687500f, - 0.965500f, - 0.020969f, - 0.488310f, - -0.105420f, - 0.000000f, - 0.042500f, - 0.975900f, - -0.214000f, - 0.718800f, - 0.931000f, - 0.020687f, - 0.497069f, - -0.049944f, - 0.000000f, - 0.042600f, - 0.993700f, - -0.103000f, - 0.687500f, - 0.965500f, - 0.041132f, - 0.488310f, - -0.099303f, - 0.000000f, - 0.083500f, - 0.975900f, - -0.201600f, - 0.687500f, - 0.931000f, - -0.000000f, - -0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - -1.000000f, - 0.000000f, - 0.495500f, - 0.051000f, - 0.010546f, - -0.497069f, - -0.053020f, - 0.000000f, - 0.021700f, - -0.993700f, - -0.109300f, - 0.470600f, - 0.053800f, - 0.020687f, - -0.497069f, - -0.049945f, - 0.000000f, - 0.042600f, - -0.993700f, - -0.103000f, - 0.468000f, - 0.053800f, - 0.096259f, - -0.080891f, - -0.483932f, - 0.000000f, - 0.192500f, - -0.161200f, - -0.967900f, - 0.718800f, - 0.448300f, - 0.097401f, - -0.027069f, - -0.489673f, - 0.000000f, - 0.194800f, - -0.054000f, - -0.979300f, - 0.718800f, - 0.482800f, - 0.191060f, - -0.027069f, - -0.461262f, - 0.000000f, - 0.382100f, - -0.054000f, - -0.922500f, - 0.687500f, - 0.482800f, - 0.096259f, - -0.080891f, - -0.483932f, - 0.000000f, - 0.192500f, - -0.161200f, - -0.967900f, - 0.718800f, - 0.448300f, - 0.191060f, - -0.027069f, - -0.461262f, - 0.000000f, - 0.382100f, - -0.054000f, - -0.922500f, - 0.687500f, - 0.482800f, - 0.188820f, - -0.080891f, - -0.455854f, - 0.000000f, - 0.377700f, - -0.161200f, - -0.911800f, - 0.687500f, - 0.448300f, - 0.031146f, - 0.473826f, - -0.156583f, - 0.000000f, - 0.062900f, - 0.946600f, - -0.316100f, - 0.718800f, - 0.896600f, - 0.020969f, - 0.488310f, - -0.105420f, - 0.000000f, - 0.042500f, - 0.975900f, - -0.214000f, - 0.718800f, - 0.931000f, - 0.041132f, - 0.488310f, - -0.099303f, - 0.000000f, - 0.083500f, - 0.975900f, - -0.201600f, - 0.687500f, - 0.931000f, - 0.031146f, - 0.473826f, - -0.156583f, - 0.000000f, - 0.062900f, - 0.946600f, - -0.316100f, - 0.718800f, - 0.896600f, - 0.041132f, - 0.488310f, - -0.099303f, - 0.000000f, - 0.083500f, - 0.975900f, - -0.201600f, - 0.687500f, - 0.931000f, - 0.061095f, - 0.473826f, - -0.147498f, - 0.000000f, - 0.123300f, - 0.946600f, - -0.297800f, - 0.687500f, - 0.896600f, - 0.093989f, - -0.133764f, - -0.472517f, - 0.000000f, - 0.188000f, - -0.266600f, - -0.945200f, - 0.718800f, - 0.413800f, - 0.096259f, - -0.080891f, - -0.483932f, - 0.000000f, - 0.192500f, - -0.161200f, - -0.967900f, - 0.718800f, - 0.448300f, - 0.188820f, - -0.080891f, - -0.455854f, - 0.000000f, - 0.377700f, - -0.161200f, - -0.911800f, - 0.687500f, - 0.448300f, - 0.093989f, - -0.133764f, - -0.472517f, - 0.000000f, - 0.188000f, - -0.266600f, - -0.945200f, - 0.718800f, - 0.413800f, - 0.188820f, - -0.080891f, - -0.455854f, - 0.000000f, - 0.377700f, - -0.161200f, - -0.911800f, - 0.687500f, - 0.448300f, - 0.184366f, - -0.133764f, - -0.445101f, - 0.000000f, - 0.368800f, - -0.266600f, - -0.890400f, - 0.687500f, - 0.413800f, - 0.040957f, - 0.453788f, - -0.205910f, - 0.000000f, - 0.082400f, - 0.906300f, - -0.414500f, - 0.718800f, - 0.862100f, - 0.031146f, - 0.473826f, - -0.156583f, - 0.000000f, - 0.062900f, - 0.946600f, - -0.316100f, - 0.718800f, - 0.896600f, - 0.061095f, - 0.473826f, - -0.147498f, - 0.000000f, - 0.123300f, - 0.946600f, - -0.297800f, - 0.687500f, - 0.896600f, - 0.040957f, - 0.453788f, - -0.205910f, - 0.000000f, - 0.082400f, - 0.906300f, - -0.414500f, - 0.718800f, - 0.862100f, - 0.061095f, - 0.473826f, - -0.147498f, - 0.000000f, - 0.123300f, - 0.946600f, - -0.297800f, - 0.687500f, - 0.896600f, - 0.080342f, - 0.453788f, - -0.193963f, - 0.000000f, - 0.161700f, - 0.906300f, - -0.390500f, - 0.687500f, - 0.862100f, - 0.090617f, - -0.185069f, - -0.455563f, - 0.000000f, - 0.181300f, - -0.369000f, - -0.911600f, - 0.718800f, - 0.379300f, - 0.093989f, - -0.133764f, - -0.472517f, - 0.000000f, - 0.188000f, - -0.266600f, - -0.945200f, - 0.718800f, - 0.413800f, - 0.184366f, - -0.133764f, - -0.445101f, - 0.000000f, - 0.368800f, - -0.266600f, - -0.890400f, - 0.687500f, - 0.413800f, - 0.090617f, - -0.185069f, - -0.455563f, - 0.000000f, - 0.181300f, - -0.369000f, - -0.911600f, - 0.718800f, - 0.379300f, - 0.184366f, - -0.133764f, - -0.445101f, - 0.000000f, - 0.368800f, - -0.266600f, - -0.890400f, - 0.687500f, - 0.413800f, - 0.177751f, - -0.185069f, - -0.429130f, - 0.000000f, - 0.355700f, - -0.369000f, - -0.858700f, - 0.687500f, - 0.379300f, - 0.050290f, - 0.428429f, - -0.252824f, - 0.000000f, - 0.101000f, - 0.855300f, - -0.508100f, - 0.718800f, - 0.827600f, - 0.040957f, - 0.453788f, - -0.205910f, - 0.000000f, - 0.082400f, - 0.906300f, - -0.414500f, - 0.718800f, - 0.862100f, - 0.080342f, - 0.453788f, - -0.193963f, - 0.000000f, - 0.161700f, - 0.906300f, - -0.390500f, - 0.687500f, - 0.862100f, - 0.050290f, - 0.428429f, - -0.252824f, - 0.000000f, - 0.101000f, - 0.855300f, - -0.508100f, - 0.718800f, - 0.827600f, - 0.080342f, - 0.453788f, - -0.193963f, - 0.000000f, - 0.161700f, - 0.906300f, - -0.390500f, - 0.687500f, - 0.862100f, - 0.098646f, - 0.428429f, - -0.238155f, - 0.000000f, - 0.198200f, - 0.855300f, - -0.478600f, - 0.687500f, - 0.827600f, - 0.086182f, - -0.234204f, - -0.433268f, - 0.000000f, - 0.172500f, - -0.467000f, - -0.867200f, - 0.718800f, - 0.344800f, - 0.090617f, - -0.185069f, - -0.455563f, - 0.000000f, - 0.181300f, - -0.369000f, - -0.911600f, - 0.718800f, - 0.379300f, - 0.177751f, - -0.185069f, - -0.429130f, - 0.000000f, - 0.355700f, - -0.369000f, - -0.858700f, - 0.687500f, - 0.379300f, - 0.086182f, - -0.234204f, - -0.433268f, - 0.000000f, - 0.172500f, - -0.467000f, - -0.867200f, - 0.718800f, - 0.344800f, - 0.177751f, - -0.185069f, - -0.429130f, - 0.000000f, - 0.355700f, - -0.369000f, - -0.858700f, - 0.687500f, - 0.379300f, - 0.169052f, - -0.234204f, - -0.408129f, - 0.000000f, - 0.338400f, - -0.467000f, - -0.816900f, - 0.687500f, - 0.344800f, - 0.059032f, - 0.398046f, - -0.296773f, - 0.000000f, - 0.118500f, - 0.794500f, - -0.595600f, - 0.718800f, - 0.793100f, - 0.050290f, - 0.428429f, - -0.252824f, - 0.000000f, - 0.101000f, - 0.855300f, - -0.508100f, - 0.718800f, - 0.827600f, - 0.098646f, - 0.428429f, - -0.238155f, - 0.000000f, - 0.198200f, - 0.855300f, - -0.478600f, - 0.687500f, - 0.827600f, - 0.059032f, - 0.398046f, - -0.296773f, - 0.000000f, - 0.118500f, - 0.794500f, - -0.595600f, - 0.718800f, - 0.793100f, - 0.098646f, - 0.428429f, - -0.238155f, - 0.000000f, - 0.198200f, - 0.855300f, - -0.478600f, - 0.687500f, - 0.827600f, - 0.115795f, - 0.398046f, - -0.279554f, - 0.000000f, - 0.232400f, - 0.794500f, - -0.561100f, - 0.687500f, - 0.793100f, - 0.080737f, - -0.280594f, - -0.405892f, - 0.000000f, - 0.161700f, - -0.559600f, - -0.812800f, - 0.718800f, - 0.310300f, - 0.086182f, - -0.234204f, - -0.433268f, - 0.000000f, - 0.172500f, - -0.467000f, - -0.867200f, - 0.718800f, - 0.344800f, - 0.169052f, - -0.234204f, - -0.408129f, - 0.000000f, - 0.338400f, - -0.467000f, - -0.816900f, - 0.687500f, - 0.344800f, - 0.080737f, - -0.280594f, - -0.405892f, - 0.000000f, - 0.161700f, - -0.559600f, - -0.812800f, - 0.718800f, - 0.310300f, - 0.169052f, - -0.234204f, - -0.408129f, - 0.000000f, - 0.338400f, - -0.467000f, - -0.816900f, - 0.687500f, - 0.344800f, - 0.158371f, - -0.280594f, - -0.382342f, - 0.000000f, - 0.317100f, - -0.559600f, - -0.765600f, - 0.687500f, - 0.310300f, - 0.067081f, - 0.362998f, - -0.337242f, - 0.000000f, - 0.134500f, - 0.724300f, - -0.676200f, - 0.718800f, - 0.758600f, - 0.059032f, - 0.398046f, - -0.296773f, - 0.000000f, - 0.118500f, - 0.794500f, - -0.595600f, - 0.718800f, - 0.793100f, - 0.115795f, - 0.398046f, - -0.279554f, - 0.000000f, - 0.232400f, - 0.794500f, - -0.561100f, - 0.687500f, - 0.793100f, - 0.067081f, - 0.362998f, - -0.337242f, - 0.000000f, - 0.134500f, - 0.724300f, - -0.676200f, - 0.718800f, - 0.758600f, - 0.115795f, - 0.398046f, - -0.279554f, - 0.000000f, - 0.232400f, - 0.794500f, - -0.561100f, - 0.687500f, - 0.793100f, - 0.131585f, - 0.362998f, - -0.317675f, - 0.000000f, - 0.263800f, - 0.724300f, - -0.637000f, - 0.687500f, - 0.758600f, - 0.074345f, - -0.323693f, - -0.373758f, - 0.000000f, - 0.149000f, - -0.645700f, - -0.748900f, - 0.718800f, - 0.275900f, - 0.080737f, - -0.280594f, - -0.405892f, - 0.000000f, - 0.161700f, - -0.559600f, - -0.812800f, - 0.718800f, - 0.310300f, - 0.158371f, - -0.280594f, - -0.382342f, - 0.000000f, - 0.317100f, - -0.559600f, - -0.765600f, - 0.687500f, - 0.310300f, - 0.074345f, - -0.323693f, - -0.373758f, - 0.000000f, - 0.149000f, - -0.645700f, - -0.748900f, - 0.718800f, - 0.275900f, - 0.158371f, - -0.280594f, - -0.382342f, - 0.000000f, - 0.317100f, - -0.559600f, - -0.765600f, - 0.687500f, - 0.310300f, - 0.145833f, - -0.323693f, - -0.352073f, - 0.000000f, - 0.292200f, - -0.645700f, - -0.705400f, - 0.687500f, - 0.275900f, - 0.074345f, - 0.323693f, - -0.373758f, - 0.000000f, - 0.149000f, - 0.645700f, - -0.748900f, - 0.718800f, - 0.724100f, - 0.067081f, - 0.362998f, - -0.337242f, - 0.000000f, - 0.134500f, - 0.724300f, - -0.676200f, - 0.718800f, - 0.758600f, - 0.131585f, - 0.362998f, - -0.317675f, - 0.000000f, - 0.263800f, - 0.724300f, - -0.637000f, - 0.687500f, - 0.758600f, - 0.074345f, - 0.323693f, - -0.373758f, - 0.000000f, - 0.149000f, - 0.645700f, - -0.748900f, - 0.718800f, - 0.724100f, - 0.131585f, - 0.362998f, - -0.317675f, - 0.000000f, - 0.263800f, - 0.724300f, - -0.637000f, - 0.687500f, - 0.758600f, - 0.145832f, - 0.323693f, - -0.352073f, - 0.000000f, - 0.292200f, - 0.645700f, - -0.705400f, - 0.687500f, - 0.724100f, - 0.067081f, - -0.362998f, - -0.337243f, - 0.000000f, - 0.134500f, - -0.724300f, - -0.676200f, - 0.718800f, - 0.241400f, - 0.074345f, - -0.323693f, - -0.373758f, - 0.000000f, - 0.149000f, - -0.645700f, - -0.748900f, - 0.718800f, - 0.275900f, - 0.145833f, - -0.323693f, - -0.352073f, - 0.000000f, - 0.292200f, - -0.645700f, - -0.705400f, - 0.687500f, - 0.275900f, - 0.067081f, - -0.362998f, - -0.337243f, - 0.000000f, - 0.134500f, - -0.724300f, - -0.676200f, - 0.718800f, - 0.241400f, - 0.145833f, - -0.323693f, - -0.352073f, - 0.000000f, - 0.292200f, - -0.645700f, - -0.705400f, - 0.687500f, - 0.275900f, - 0.131585f, - -0.362998f, - -0.317676f, - 0.000000f, - 0.263800f, - -0.724300f, - -0.637000f, - 0.687500f, - 0.241400f, - 0.080737f, - 0.280594f, - -0.405892f, - 0.000000f, - 0.161700f, - 0.559600f, - -0.812800f, - 0.718800f, - 0.689700f, - 0.074345f, - 0.323693f, - -0.373758f, - 0.000000f, - 0.149000f, - 0.645700f, - -0.748900f, - 0.718800f, - 0.724100f, - 0.145832f, - 0.323693f, - -0.352073f, - 0.000000f, - 0.292200f, - 0.645700f, - -0.705400f, - 0.687500f, - 0.724100f, - 0.080737f, - 0.280594f, - -0.405892f, - 0.000000f, - 0.161700f, - 0.559600f, - -0.812800f, - 0.718800f, - 0.689700f, - 0.145832f, - 0.323693f, - -0.352073f, - 0.000000f, - 0.292200f, - 0.645700f, - -0.705400f, - 0.687500f, - 0.724100f, - 0.158371f, - 0.280594f, - -0.382342f, - 0.000000f, - 0.317100f, - 0.559600f, - -0.765600f, - 0.687500f, - 0.689700f, - 0.059032f, - -0.398046f, - -0.296773f, - 0.000000f, - 0.118500f, - -0.794500f, - -0.595600f, - 0.718800f, - 0.206900f, - 0.067081f, - -0.362998f, - -0.337243f, - 0.000000f, - 0.134500f, - -0.724300f, - -0.676200f, - 0.718800f, - 0.241400f, - 0.131585f, - -0.362998f, - -0.317676f, - 0.000000f, - 0.263800f, - -0.724300f, - -0.637000f, - 0.687500f, - 0.241400f, - 0.059032f, - -0.398046f, - -0.296773f, - 0.000000f, - 0.118500f, - -0.794500f, - -0.595600f, - 0.718800f, - 0.206900f, - 0.131585f, - -0.362998f, - -0.317676f, - 0.000000f, - 0.263800f, - -0.724300f, - -0.637000f, - 0.687500f, - 0.241400f, - 0.115795f, - -0.398046f, - -0.279554f, - 0.000000f, - 0.232400f, - -0.794500f, - -0.561100f, - 0.687500f, - 0.206900f, - 0.086182f, - 0.234204f, - -0.433268f, - 0.000000f, - 0.172500f, - 0.467000f, - -0.867200f, - 0.718800f, - 0.655200f, - 0.080737f, - 0.280594f, - -0.405892f, - 0.000000f, - 0.161700f, - 0.559600f, - -0.812800f, - 0.718800f, - 0.689700f, - 0.158371f, - 0.280594f, - -0.382342f, - 0.000000f, - 0.317100f, - 0.559600f, - -0.765600f, - 0.687500f, - 0.689700f, - 0.086182f, - 0.234204f, - -0.433268f, - 0.000000f, - 0.172500f, - 0.467000f, - -0.867200f, - 0.718800f, - 0.655200f, - 0.158371f, - 0.280594f, - -0.382342f, - 0.000000f, - 0.317100f, - 0.559600f, - -0.765600f, - 0.687500f, - 0.689700f, - 0.169052f, - 0.234204f, - -0.408129f, - 0.000000f, - 0.338400f, - 0.467000f, - -0.816900f, - 0.687500f, - 0.655200f, - 0.050290f, - -0.428429f, - -0.252824f, - 0.000000f, - 0.101000f, - -0.855300f, - -0.508100f, - 0.718800f, - 0.172400f, - 0.059032f, - -0.398046f, - -0.296773f, - 0.000000f, - 0.118500f, - -0.794500f, - -0.595600f, - 0.718800f, - 0.206900f, - 0.115795f, - -0.398046f, - -0.279554f, - 0.000000f, - 0.232400f, - -0.794500f, - -0.561100f, - 0.687500f, - 0.206900f, - 0.050290f, - -0.428429f, - -0.252824f, - 0.000000f, - 0.101000f, - -0.855300f, - -0.508100f, - 0.718800f, - 0.172400f, - 0.115795f, - -0.398046f, - -0.279554f, - 0.000000f, - 0.232400f, - -0.794500f, - -0.561100f, - 0.687500f, - 0.206900f, - 0.098646f, - -0.428429f, - -0.238155f, - 0.000000f, - 0.198200f, - -0.855300f, - -0.478600f, - 0.687500f, - 0.172400f, - 0.169052f, - -0.234204f, - -0.408129f, - 0.000000f, - 0.338400f, - -0.467000f, - -0.816900f, - 0.687500f, - 0.344800f, - 0.177751f, - -0.185069f, - -0.429130f, - 0.000000f, - 0.355700f, - -0.369000f, - -0.858700f, - 0.687500f, - 0.379300f, - 0.258055f, - -0.185069f, - -0.386207f, - 0.000000f, - 0.516300f, - -0.369000f, - -0.772800f, - 0.656300f, - 0.379300f, - 0.169052f, - -0.234204f, - -0.408129f, - 0.000000f, - 0.338400f, - -0.467000f, - -0.816900f, - 0.687500f, - 0.344800f, - 0.258055f, - -0.185069f, - -0.386207f, - 0.000000f, - 0.516300f, - -0.369000f, - -0.772800f, - 0.656300f, - 0.379300f, - 0.245426f, - -0.234204f, - -0.367306f, - 0.000000f, - 0.491300f, - -0.467000f, - -0.735200f, - 0.656300f, - 0.344800f, - 0.115795f, - 0.398046f, - -0.279554f, - 0.000000f, - 0.232400f, - 0.794500f, - -0.561100f, - 0.687500f, - 0.793100f, - 0.098646f, - 0.428429f, - -0.238155f, - 0.000000f, - 0.198200f, - 0.855300f, - -0.478600f, - 0.687500f, - 0.827600f, - 0.143212f, - 0.428429f, - -0.214334f, - 0.000000f, - 0.287800f, - 0.855300f, - -0.430700f, - 0.656300f, - 0.827600f, - 0.115795f, - 0.398046f, - -0.279554f, - 0.000000f, - 0.232400f, - 0.794500f, - -0.561100f, - 0.687500f, - 0.793100f, - 0.143212f, - 0.428429f, - -0.214334f, - 0.000000f, - 0.287800f, - 0.855300f, - -0.430700f, - 0.656300f, - 0.827600f, - 0.168107f, - 0.398046f, - -0.251592f, - 0.000000f, - 0.337400f, - 0.794500f, - -0.504900f, - 0.656300f, - 0.793100f, - 0.158371f, - -0.280594f, - -0.382342f, - 0.000000f, - 0.317100f, - -0.559600f, - -0.765600f, - 0.687500f, - 0.310300f, - 0.169052f, - -0.234204f, - -0.408129f, - 0.000000f, - 0.338400f, - -0.467000f, - -0.816900f, - 0.687500f, - 0.344800f, - 0.245426f, - -0.234204f, - -0.367306f, - 0.000000f, - 0.491300f, - -0.467000f, - -0.735200f, - 0.656300f, - 0.344800f, - 0.158371f, - -0.280594f, - -0.382342f, - 0.000000f, - 0.317100f, - -0.559600f, - -0.765600f, - 0.687500f, - 0.310300f, - 0.245426f, - -0.234204f, - -0.367306f, - 0.000000f, - 0.491300f, - -0.467000f, - -0.735200f, - 0.656300f, - 0.344800f, - 0.229919f, - -0.280594f, - -0.344099f, - 0.000000f, - 0.460400f, - -0.559600f, - -0.689100f, - 0.656300f, - 0.310300f, - 0.131585f, - 0.362998f, - -0.317675f, - 0.000000f, - 0.263800f, - 0.724300f, - -0.637000f, - 0.687500f, - 0.758600f, - 0.115795f, - 0.398046f, - -0.279554f, - 0.000000f, - 0.232400f, - 0.794500f, - -0.561100f, - 0.687500f, - 0.793100f, - 0.168107f, - 0.398046f, - -0.251592f, - 0.000000f, - 0.337400f, - 0.794500f, - -0.504900f, - 0.656300f, - 0.793100f, - 0.131585f, - 0.362998f, - -0.317675f, - 0.000000f, - 0.263800f, - 0.724300f, - -0.637000f, - 0.687500f, - 0.758600f, - 0.168107f, - 0.398046f, - -0.251592f, - 0.000000f, - 0.337400f, - 0.794500f, - -0.504900f, - 0.656300f, - 0.793100f, - 0.191032f, - 0.362998f, - -0.285900f, - 0.000000f, - 0.383000f, - 0.724300f, - -0.573300f, - 0.656300f, - 0.758600f, - 0.145833f, - -0.323693f, - -0.352073f, - 0.000000f, - 0.292200f, - -0.645700f, - -0.705400f, - 0.687500f, - 0.275900f, - 0.158371f, - -0.280594f, - -0.382342f, - 0.000000f, - 0.317100f, - -0.559600f, - -0.765600f, - 0.687500f, - 0.310300f, - 0.229919f, - -0.280594f, - -0.344099f, - 0.000000f, - 0.460400f, - -0.559600f, - -0.689100f, - 0.656300f, - 0.310300f, - 0.145833f, - -0.323693f, - -0.352073f, - 0.000000f, - 0.292200f, - -0.645700f, - -0.705400f, - 0.687500f, - 0.275900f, - 0.229919f, - -0.280594f, - -0.344099f, - 0.000000f, - 0.460400f, - -0.559600f, - -0.689100f, - 0.656300f, - 0.310300f, - 0.211717f, - -0.323693f, - -0.316857f, - 0.000000f, - 0.424200f, - -0.645700f, - -0.634900f, - 0.656300f, - 0.275900f, - 0.145832f, - 0.323693f, - -0.352073f, - 0.000000f, - 0.292200f, - 0.645700f, - -0.705400f, - 0.687500f, - 0.724100f, - 0.131585f, - 0.362998f, - -0.317675f, - 0.000000f, - 0.263800f, - 0.724300f, - -0.637000f, - 0.687500f, - 0.758600f, - 0.191032f, - 0.362998f, - -0.285900f, - 0.000000f, - 0.383000f, - 0.724300f, - -0.573300f, - 0.656300f, - 0.758600f, - 0.145832f, - 0.323693f, - -0.352073f, - 0.000000f, - 0.292200f, - 0.645700f, - -0.705400f, - 0.687500f, - 0.724100f, - 0.191032f, - 0.362998f, - -0.285900f, - 0.000000f, - 0.383000f, - 0.724300f, - -0.573300f, - 0.656300f, - 0.758600f, - 0.211717f, - 0.323693f, - -0.316857f, - 0.000000f, - 0.424200f, - 0.645700f, - -0.634900f, - 0.656300f, - 0.724100f, - 0.131585f, - -0.362998f, - -0.317676f, - 0.000000f, - 0.263800f, - -0.724300f, - -0.637000f, - 0.687500f, - 0.241400f, - 0.145833f, - -0.323693f, - -0.352073f, - 0.000000f, - 0.292200f, - -0.645700f, - -0.705400f, - 0.687500f, - 0.275900f, - 0.211717f, - -0.323693f, - -0.316857f, - 0.000000f, - 0.424200f, - -0.645700f, - -0.634900f, - 0.656300f, - 0.275900f, - 0.131585f, - -0.362998f, - -0.317676f, - 0.000000f, - 0.263800f, - -0.724300f, - -0.637000f, - 0.687500f, - 0.241400f, - 0.211717f, - -0.323693f, - -0.316857f, - 0.000000f, - 0.424200f, - -0.645700f, - -0.634900f, - 0.656300f, - 0.275900f, - 0.191032f, - -0.362998f, - -0.285900f, - 0.000000f, - 0.383000f, - -0.724300f, - -0.573300f, - 0.656300f, - 0.241400f, - 0.158371f, - 0.280594f, - -0.382342f, - 0.000000f, - 0.317100f, - 0.559600f, - -0.765600f, - 0.687500f, - 0.689700f, - 0.145832f, - 0.323693f, - -0.352073f, - 0.000000f, - 0.292200f, - 0.645700f, - -0.705400f, - 0.687500f, - 0.724100f, - 0.211717f, - 0.323693f, - -0.316857f, - 0.000000f, - 0.424200f, - 0.645700f, - -0.634900f, - 0.656300f, - 0.724100f, - 0.158371f, - 0.280594f, - -0.382342f, - 0.000000f, - 0.317100f, - 0.559600f, - -0.765600f, - 0.687500f, - 0.689700f, - 0.211717f, - 0.323693f, - -0.316857f, - 0.000000f, - 0.424200f, - 0.645700f, - -0.634900f, - 0.656300f, - 0.724100f, - 0.229919f, - 0.280594f, - -0.344099f, - 0.000000f, - 0.460400f, - 0.559600f, - -0.689100f, - 0.656300f, - 0.689700f, - 0.115795f, - -0.398046f, - -0.279554f, - 0.000000f, - 0.232400f, - -0.794500f, - -0.561100f, - 0.687500f, - 0.206900f, - 0.131585f, - -0.362998f, - -0.317676f, - 0.000000f, - 0.263800f, - -0.724300f, - -0.637000f, - 0.687500f, - 0.241400f, - 0.191032f, - -0.362998f, - -0.285900f, - 0.000000f, - 0.383000f, - -0.724300f, - -0.573300f, - 0.656300f, - 0.241400f, - 0.115795f, - -0.398046f, - -0.279554f, - 0.000000f, - 0.232400f, - -0.794500f, - -0.561100f, - 0.687500f, - 0.206900f, - 0.191032f, - -0.362998f, - -0.285900f, - 0.000000f, - 0.383000f, - -0.724300f, - -0.573300f, - 0.656300f, - 0.241400f, - 0.168108f, - -0.398046f, - -0.251592f, - 0.000000f, - 0.337400f, - -0.794500f, - -0.505000f, - 0.656300f, - 0.206900f, - 0.169052f, - 0.234204f, - -0.408129f, - 0.000000f, - 0.338400f, - 0.467000f, - -0.816900f, - 0.687500f, - 0.655200f, - 0.158371f, - 0.280594f, - -0.382342f, - 0.000000f, - 0.317100f, - 0.559600f, - -0.765600f, - 0.687500f, - 0.689700f, - 0.229919f, - 0.280594f, - -0.344099f, - 0.000000f, - 0.460400f, - 0.559600f, - -0.689100f, - 0.656300f, - 0.689700f, - 0.169052f, - 0.234204f, - -0.408129f, - 0.000000f, - 0.338400f, - 0.467000f, - -0.816900f, - 0.687500f, - 0.655200f, - 0.229919f, - 0.280594f, - -0.344099f, - 0.000000f, - 0.460400f, - 0.559600f, - -0.689100f, - 0.656300f, - 0.689700f, - 0.245426f, - 0.234204f, - -0.367306f, - 0.000000f, - 0.491300f, - 0.467000f, - -0.735200f, - 0.656300f, - 0.655200f, - 0.098646f, - -0.428429f, - -0.238155f, - 0.000000f, - 0.198200f, - -0.855300f, - -0.478600f, - 0.687500f, - 0.172400f, - 0.115795f, - -0.398046f, - -0.279554f, - 0.000000f, - 0.232400f, - -0.794500f, - -0.561100f, - 0.687500f, - 0.206900f, - 0.168108f, - -0.398046f, - -0.251592f, - 0.000000f, - 0.337400f, - -0.794500f, - -0.505000f, - 0.656300f, - 0.206900f, - 0.098646f, - -0.428429f, - -0.238155f, - 0.000000f, - 0.198200f, - -0.855300f, - -0.478600f, - 0.687500f, - 0.172400f, - 0.168108f, - -0.398046f, - -0.251592f, - 0.000000f, - 0.337400f, - -0.794500f, - -0.505000f, - 0.656300f, - 0.206900f, - 0.143212f, - -0.428429f, - -0.214334f, - 0.000000f, - 0.287800f, - -0.855300f, - -0.430700f, - 0.656300f, - 0.172400f, - 0.177751f, - 0.185069f, - -0.429130f, - 0.000000f, - 0.355700f, - 0.369000f, - -0.858700f, - 0.687500f, - 0.620700f, - 0.169052f, - 0.234204f, - -0.408129f, - 0.000000f, - 0.338400f, - 0.467000f, - -0.816900f, - 0.687500f, - 0.655200f, - 0.245426f, - 0.234204f, - -0.367306f, - 0.000000f, - 0.491300f, - 0.467000f, - -0.735200f, - 0.656300f, - 0.655200f, - 0.177751f, - 0.185069f, - -0.429130f, - 0.000000f, - 0.355700f, - 0.369000f, - -0.858700f, - 0.687500f, - 0.620700f, - 0.245426f, - 0.234204f, - -0.367306f, - 0.000000f, - 0.491300f, - 0.467000f, - -0.735200f, - 0.656300f, - 0.655200f, - 0.258055f, - 0.185069f, - -0.386207f, - 0.000000f, - 0.516300f, - 0.369000f, - -0.772800f, - 0.656300f, - 0.620700f, - 0.080342f, - -0.453788f, - -0.193963f, - 0.000000f, - 0.161700f, - -0.906300f, - -0.390500f, - 0.687500f, - 0.137900f, - 0.098646f, - -0.428429f, - -0.238155f, - 0.000000f, - 0.198200f, - -0.855300f, - -0.478600f, - 0.687500f, - 0.172400f, - 0.143212f, - -0.428429f, - -0.214334f, - 0.000000f, - 0.287800f, - -0.855300f, - -0.430700f, - 0.656300f, - 0.172400f, - 0.080342f, - -0.453788f, - -0.193963f, - 0.000000f, - 0.161700f, - -0.906300f, - -0.390500f, - 0.687500f, - 0.137900f, - 0.143212f, - -0.428429f, - -0.214334f, - 0.000000f, - 0.287800f, - -0.855300f, - -0.430700f, - 0.656300f, - 0.172400f, - 0.116638f, - -0.453788f, - -0.174562f, - 0.000000f, - 0.234800f, - -0.906300f, - -0.351400f, - 0.656300f, - 0.137900f, - 0.184366f, - 0.133764f, - -0.445101f, - 0.000000f, - 0.368800f, - 0.266600f, - -0.890400f, - 0.687500f, - 0.586200f, - 0.177751f, - 0.185069f, - -0.429130f, - 0.000000f, - 0.355700f, - 0.369000f, - -0.858700f, - 0.687500f, - 0.620700f, - 0.258055f, - 0.185069f, - -0.386207f, - 0.000000f, - 0.516300f, - 0.369000f, - -0.772800f, - 0.656300f, - 0.620700f, - 0.184366f, - 0.133764f, - -0.445101f, - 0.000000f, - 0.368800f, - 0.266600f, - -0.890400f, - 0.687500f, - 0.586200f, - 0.258055f, - 0.185069f, - -0.386207f, - 0.000000f, - 0.516300f, - 0.369000f, - -0.772800f, - 0.656300f, - 0.620700f, - 0.267659f, - 0.133764f, - -0.400580f, - 0.000000f, - 0.535400f, - 0.266600f, - -0.801400f, - 0.656300f, - 0.586200f, - 0.061095f, - -0.473826f, - -0.147498f, - 0.000000f, - 0.123300f, - -0.946600f, - -0.297800f, - 0.687500f, - 0.103400f, - 0.080342f, - -0.453788f, - -0.193963f, - 0.000000f, - 0.161700f, - -0.906300f, - -0.390500f, - 0.687500f, - 0.137900f, - 0.116638f, - -0.453788f, - -0.174562f, - 0.000000f, - 0.234800f, - -0.906300f, - -0.351400f, - 0.656300f, - 0.137900f, - 0.061095f, - -0.473826f, - -0.147498f, - 0.000000f, - 0.123300f, - -0.946600f, - -0.297800f, - 0.687500f, - 0.103400f, - 0.116638f, - -0.453788f, - -0.174562f, - 0.000000f, - 0.234800f, - -0.906300f, - -0.351400f, - 0.656300f, - 0.137900f, - 0.088697f, - -0.473826f, - -0.132745f, - 0.000000f, - 0.179100f, - -0.946600f, - -0.268000f, - 0.656300f, - 0.103400f, - 0.188820f, - 0.080891f, - -0.455854f, - 0.000000f, - 0.377700f, - 0.161200f, - -0.911800f, - 0.687500f, - 0.551700f, - 0.184366f, - 0.133764f, - -0.445101f, - 0.000000f, - 0.368800f, - 0.266600f, - -0.890400f, - 0.687500f, - 0.586200f, - 0.267659f, - 0.133764f, - -0.400580f, - 0.000000f, - 0.535400f, - 0.266600f, - -0.801400f, - 0.656300f, - 0.586200f, - 0.188820f, - 0.080891f, - -0.455854f, - 0.000000f, - 0.377700f, - 0.161200f, - -0.911800f, - 0.687500f, - 0.551700f, - 0.267659f, - 0.133764f, - -0.400580f, - 0.000000f, - 0.535400f, - 0.266600f, - -0.801400f, - 0.656300f, - 0.586200f, - 0.274125f, - 0.080891f, - -0.410257f, - 0.000000f, - 0.548300f, - 0.161200f, - -0.820600f, - 0.656300f, - 0.551700f, - 0.041132f, - -0.488310f, - -0.099303f, - 0.000000f, - 0.083500f, - -0.975900f, - -0.201600f, - 0.687500f, - 0.069000f, - 0.061095f, - -0.473826f, - -0.147498f, - 0.000000f, - 0.123300f, - -0.946600f, - -0.297800f, - 0.687500f, - 0.103400f, - 0.088697f, - -0.473826f, - -0.132745f, - 0.000000f, - 0.179100f, - -0.946600f, - -0.268000f, - 0.656300f, - 0.103400f, - 0.041132f, - -0.488310f, - -0.099303f, - 0.000000f, - 0.083500f, - -0.975900f, - -0.201600f, - 0.687500f, - 0.069000f, - 0.088697f, - -0.473826f, - -0.132745f, - 0.000000f, - 0.179100f, - -0.946600f, - -0.268000f, - 0.656300f, - 0.103400f, - 0.059715f, - -0.488310f, - -0.089370f, - 0.000000f, - 0.121200f, - -0.975900f, - -0.181400f, - 0.656300f, - 0.069000f, - 0.191060f, - 0.027069f, - -0.461262f, - 0.000000f, - 0.382100f, - 0.054000f, - -0.922500f, - 0.687500f, - 0.517200f, - 0.188820f, - 0.080891f, - -0.455854f, - 0.000000f, - 0.377700f, - 0.161200f, - -0.911800f, - 0.687500f, - 0.551700f, - 0.274125f, - 0.080891f, - -0.410257f, - 0.000000f, - 0.548300f, - 0.161200f, - -0.820600f, - 0.656300f, - 0.551700f, - 0.191060f, - 0.027069f, - -0.461262f, - 0.000000f, - 0.382100f, - 0.054000f, - -0.922500f, - 0.687500f, - 0.517200f, - 0.274125f, - 0.080891f, - -0.410257f, - 0.000000f, - 0.548300f, - 0.161200f, - -0.820600f, - 0.656300f, - 0.551700f, - 0.277377f, - 0.027069f, - -0.415125f, - 0.000000f, - 0.554700f, - 0.054000f, - -0.830300f, - 0.656300f, - 0.517200f, - 0.020687f, - 0.497069f, - -0.049944f, - 0.000000f, - 0.042600f, - 0.993700f, - -0.103000f, - 0.445300f, - 0.962300f, - -0.000000f, - 0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - 1.000000f, - 0.000000f, - 0.423900f, - 0.960300f, - 0.030033f, - 0.497069f, - -0.044948f, - 0.000000f, - 0.061900f, - 0.993700f, - -0.092700f, - 0.447100f, - 0.962300f, - 0.020687f, - -0.497069f, - -0.049945f, - 0.000000f, - 0.042600f, - -0.993700f, - -0.103000f, - 0.687500f, - 0.034500f, - 0.041132f, - -0.488310f, - -0.099303f, - 0.000000f, - 0.083500f, - -0.975900f, - -0.201600f, - 0.687500f, - 0.069000f, - 0.059715f, - -0.488310f, - -0.089370f, - 0.000000f, - 0.121200f, - -0.975900f, - -0.181400f, - 0.656300f, - 0.069000f, - 0.020687f, - -0.497069f, - -0.049945f, - 0.000000f, - 0.042600f, - -0.993700f, - -0.103000f, - 0.687500f, - 0.034500f, - 0.059715f, - -0.488310f, - -0.089370f, - 0.000000f, - 0.121200f, - -0.975900f, - -0.181400f, - 0.656300f, - 0.069000f, - 0.030034f, - -0.497069f, - -0.044949f, - 0.000000f, - 0.061900f, - -0.993700f, - -0.092700f, - 0.656300f, - 0.034500f, - 0.191060f, - -0.027069f, - -0.461262f, - 0.000000f, - 0.382100f, - -0.054000f, - -0.922500f, - 0.687500f, - 0.482800f, - 0.191060f, - 0.027069f, - -0.461262f, - 0.000000f, - 0.382100f, - 0.054000f, - -0.922500f, - 0.687500f, - 0.517200f, - 0.277377f, - 0.027069f, - -0.415125f, - 0.000000f, - 0.554700f, - 0.054000f, - -0.830300f, - 0.656300f, - 0.517200f, - 0.191060f, - -0.027069f, - -0.461262f, - 0.000000f, - 0.382100f, - -0.054000f, - -0.922500f, - 0.687500f, - 0.482800f, - 0.277377f, - 0.027069f, - -0.415125f, - 0.000000f, - 0.554700f, - 0.054000f, - -0.830300f, - 0.656300f, - 0.517200f, - 0.277377f, - -0.027069f, - -0.415125f, - 0.000000f, - 0.554700f, - -0.054000f, - -0.830300f, - 0.656300f, - 0.482800f, - 0.041132f, - 0.488310f, - -0.099303f, - 0.000000f, - 0.083500f, - 0.975900f, - -0.201600f, - 0.687500f, - 0.931000f, - 0.020687f, - 0.497069f, - -0.049944f, - 0.000000f, - 0.042600f, - 0.993700f, - -0.103000f, - 0.687500f, - 0.965500f, - 0.030033f, - 0.497069f, - -0.044948f, - 0.000000f, - 0.061900f, - 0.993700f, - -0.092700f, - 0.656300f, - 0.965500f, - 0.041132f, - 0.488310f, - -0.099303f, - 0.000000f, - 0.083500f, - 0.975900f, - -0.201600f, - 0.687500f, - 0.931000f, - 0.030033f, - 0.497069f, - -0.044948f, - 0.000000f, - 0.061900f, - 0.993700f, - -0.092700f, - 0.656300f, - 0.965500f, - 0.059715f, - 0.488310f, - -0.089370f, - 0.000000f, - 0.121200f, - 0.975900f, - -0.181400f, - 0.656300f, - 0.931000f, - -0.000000f, - -0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - -1.000000f, - 0.000000f, - 0.495500f, - 0.051000f, - 0.020687f, - -0.497069f, - -0.049945f, - 0.000000f, - 0.042600f, - -0.993700f, - -0.103000f, - 0.468000f, - 0.053800f, - 0.030034f, - -0.497069f, - -0.044949f, - 0.000000f, - 0.061900f, - -0.993700f, - -0.092700f, - 0.465400f, - 0.053800f, - 0.188820f, - -0.080891f, - -0.455854f, - 0.000000f, - 0.377700f, - -0.161200f, - -0.911800f, - 0.687500f, - 0.448300f, - 0.191060f, - -0.027069f, - -0.461262f, - 0.000000f, - 0.382100f, - -0.054000f, - -0.922500f, - 0.687500f, - 0.482800f, - 0.277377f, - -0.027069f, - -0.415125f, - 0.000000f, - 0.554700f, - -0.054000f, - -0.830300f, - 0.656300f, - 0.482800f, - 0.188820f, - -0.080891f, - -0.455854f, - 0.000000f, - 0.377700f, - -0.161200f, - -0.911800f, - 0.687500f, - 0.448300f, - 0.277377f, - -0.027069f, - -0.415125f, - 0.000000f, - 0.554700f, - -0.054000f, - -0.830300f, - 0.656300f, - 0.482800f, - 0.274125f, - -0.080891f, - -0.410257f, - 0.000000f, - 0.548300f, - -0.161200f, - -0.820600f, - 0.656300f, - 0.448300f, - 0.061095f, - 0.473826f, - -0.147498f, - 0.000000f, - 0.123300f, - 0.946600f, - -0.297800f, - 0.687500f, - 0.896600f, - 0.041132f, - 0.488310f, - -0.099303f, - 0.000000f, - 0.083500f, - 0.975900f, - -0.201600f, - 0.687500f, - 0.931000f, - 0.059715f, - 0.488310f, - -0.089370f, - 0.000000f, - 0.121200f, - 0.975900f, - -0.181400f, - 0.656300f, - 0.931000f, - 0.061095f, - 0.473826f, - -0.147498f, - 0.000000f, - 0.123300f, - 0.946600f, - -0.297800f, - 0.687500f, - 0.896600f, - 0.059715f, - 0.488310f, - -0.089370f, - 0.000000f, - 0.121200f, - 0.975900f, - -0.181400f, - 0.656300f, - 0.931000f, - 0.088697f, - 0.473826f, - -0.132745f, - 0.000000f, - 0.179100f, - 0.946600f, - -0.268000f, - 0.656300f, - 0.896600f, - 0.184366f, - -0.133764f, - -0.445101f, - 0.000000f, - 0.368800f, - -0.266600f, - -0.890400f, - 0.687500f, - 0.413800f, - 0.188820f, - -0.080891f, - -0.455854f, - 0.000000f, - 0.377700f, - -0.161200f, - -0.911800f, - 0.687500f, - 0.448300f, - 0.274125f, - -0.080891f, - -0.410257f, - 0.000000f, - 0.548300f, - -0.161200f, - -0.820600f, - 0.656300f, - 0.448300f, - 0.184366f, - -0.133764f, - -0.445101f, - 0.000000f, - 0.368800f, - -0.266600f, - -0.890400f, - 0.687500f, - 0.413800f, - 0.274125f, - -0.080891f, - -0.410257f, - 0.000000f, - 0.548300f, - -0.161200f, - -0.820600f, - 0.656300f, - 0.448300f, - 0.267659f, - -0.133764f, - -0.400580f, - 0.000000f, - 0.535400f, - -0.266600f, - -0.801400f, - 0.656300f, - 0.413800f, - 0.080342f, - 0.453788f, - -0.193963f, - 0.000000f, - 0.161700f, - 0.906300f, - -0.390500f, - 0.687500f, - 0.862100f, - 0.061095f, - 0.473826f, - -0.147498f, - 0.000000f, - 0.123300f, - 0.946600f, - -0.297800f, - 0.687500f, - 0.896600f, - 0.088697f, - 0.473826f, - -0.132745f, - 0.000000f, - 0.179100f, - 0.946600f, - -0.268000f, - 0.656300f, - 0.896600f, - 0.080342f, - 0.453788f, - -0.193963f, - 0.000000f, - 0.161700f, - 0.906300f, - -0.390500f, - 0.687500f, - 0.862100f, - 0.088697f, - 0.473826f, - -0.132745f, - 0.000000f, - 0.179100f, - 0.946600f, - -0.268000f, - 0.656300f, - 0.896600f, - 0.116638f, - 0.453788f, - -0.174562f, - 0.000000f, - 0.234800f, - 0.906300f, - -0.351400f, - 0.656300f, - 0.862100f, - 0.177751f, - -0.185069f, - -0.429130f, - 0.000000f, - 0.355700f, - -0.369000f, - -0.858700f, - 0.687500f, - 0.379300f, - 0.184366f, - -0.133764f, - -0.445101f, - 0.000000f, - 0.368800f, - -0.266600f, - -0.890400f, - 0.687500f, - 0.413800f, - 0.267659f, - -0.133764f, - -0.400580f, - 0.000000f, - 0.535400f, - -0.266600f, - -0.801400f, - 0.656300f, - 0.413800f, - 0.177751f, - -0.185069f, - -0.429130f, - 0.000000f, - 0.355700f, - -0.369000f, - -0.858700f, - 0.687500f, - 0.379300f, - 0.267659f, - -0.133764f, - -0.400580f, - 0.000000f, - 0.535400f, - -0.266600f, - -0.801400f, - 0.656300f, - 0.413800f, - 0.258055f, - -0.185069f, - -0.386207f, - 0.000000f, - 0.516300f, - -0.369000f, - -0.772800f, - 0.656300f, - 0.379300f, - 0.098646f, - 0.428429f, - -0.238155f, - 0.000000f, - 0.198200f, - 0.855300f, - -0.478600f, - 0.687500f, - 0.827600f, - 0.080342f, - 0.453788f, - -0.193963f, - 0.000000f, - 0.161700f, - 0.906300f, - -0.390500f, - 0.687500f, - 0.862100f, - 0.116638f, - 0.453788f, - -0.174562f, - 0.000000f, - 0.234800f, - 0.906300f, - -0.351400f, - 0.656300f, - 0.862100f, - 0.098646f, - 0.428429f, - -0.238155f, - 0.000000f, - 0.198200f, - 0.855300f, - -0.478600f, - 0.687500f, - 0.827600f, - 0.116638f, - 0.453788f, - -0.174562f, - 0.000000f, - 0.234800f, - 0.906300f, - -0.351400f, - 0.656300f, - 0.862100f, - 0.143212f, - 0.428429f, - -0.214334f, - 0.000000f, - 0.287800f, - 0.855300f, - -0.430700f, - 0.656300f, - 0.827600f, - 0.059715f, - -0.488310f, - -0.089370f, - 0.000000f, - 0.121200f, - -0.975900f, - -0.181400f, - 0.656300f, - 0.069000f, - 0.088697f, - -0.473826f, - -0.132745f, - 0.000000f, - 0.179100f, - -0.946600f, - -0.268000f, - 0.656300f, - 0.103400f, - 0.112889f, - -0.473826f, - -0.112890f, - 0.000000f, - 0.227900f, - -0.946600f, - -0.227900f, - 0.625000f, - 0.103400f, - 0.059715f, - -0.488310f, - -0.089370f, - 0.000000f, - 0.121200f, - -0.975900f, - -0.181400f, - 0.656300f, - 0.069000f, - 0.112889f, - -0.473826f, - -0.112890f, - 0.000000f, - 0.227900f, - -0.946600f, - -0.227900f, - 0.625000f, - 0.103400f, - 0.076003f, - -0.488310f, - -0.076003f, - 0.000000f, - 0.154300f, - -0.975900f, - -0.154300f, - 0.625000f, - 0.069000f, - 0.277377f, - 0.027069f, - -0.415125f, - 0.000000f, - 0.554700f, - 0.054000f, - -0.830300f, - 0.656300f, - 0.517200f, - 0.274125f, - 0.080891f, - -0.410257f, - 0.000000f, - 0.548300f, - 0.161200f, - -0.820600f, - 0.656300f, - 0.551700f, - 0.348895f, - 0.080891f, - -0.348895f, - 0.000000f, - 0.697800f, - 0.161200f, - -0.697800f, - 0.625000f, - 0.551700f, - 0.277377f, - 0.027069f, - -0.415125f, - 0.000000f, - 0.554700f, - 0.054000f, - -0.830300f, - 0.656300f, - 0.517200f, - 0.348895f, - 0.080891f, - -0.348895f, - 0.000000f, - 0.697800f, - 0.161200f, - -0.697800f, - 0.625000f, - 0.551700f, - 0.353034f, - 0.027069f, - -0.353034f, - 0.000000f, - 0.706100f, - 0.054000f, - -0.706100f, - 0.625000f, - 0.517200f, - 0.030033f, - 0.497069f, - -0.044948f, - 0.000000f, - 0.061900f, - 0.993700f, - -0.092700f, - 0.447100f, - 0.962300f, - -0.000000f, - 0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - 1.000000f, - 0.000000f, - 0.423900f, - 0.960300f, - 0.038225f, - 0.497069f, - -0.038226f, - 0.000000f, - 0.078800f, - 0.993700f, - -0.078800f, - 0.449000f, - 0.962300f, - 0.030034f, - -0.497069f, - -0.044949f, - 0.000000f, - 0.061900f, - -0.993700f, - -0.092700f, - 0.656300f, - 0.034500f, - 0.059715f, - -0.488310f, - -0.089370f, - 0.000000f, - 0.121200f, - -0.975900f, - -0.181400f, - 0.656300f, - 0.069000f, - 0.076003f, - -0.488310f, - -0.076003f, - 0.000000f, - 0.154300f, - -0.975900f, - -0.154300f, - 0.625000f, - 0.069000f, - 0.030034f, - -0.497069f, - -0.044949f, - 0.000000f, - 0.061900f, - -0.993700f, - -0.092700f, - 0.656300f, - 0.034500f, - 0.076003f, - -0.488310f, - -0.076003f, - 0.000000f, - 0.154300f, - -0.975900f, - -0.154300f, - 0.625000f, - 0.069000f, - 0.038226f, - -0.497069f, - -0.038226f, - 0.000000f, - 0.078800f, - -0.993700f, - -0.078800f, - 0.625000f, - 0.034500f, - 0.277377f, - -0.027069f, - -0.415125f, - 0.000000f, - 0.554700f, - -0.054000f, - -0.830300f, - 0.656300f, - 0.482800f, - 0.277377f, - 0.027069f, - -0.415125f, - 0.000000f, - 0.554700f, - 0.054000f, - -0.830300f, - 0.656300f, - 0.517200f, - 0.353034f, - 0.027069f, - -0.353034f, - 0.000000f, - 0.706100f, - 0.054000f, - -0.706100f, - 0.625000f, - 0.517200f, - 0.277377f, - -0.027069f, - -0.415125f, - 0.000000f, - 0.554700f, - -0.054000f, - -0.830300f, - 0.656300f, - 0.482800f, - 0.353034f, - 0.027069f, - -0.353034f, - 0.000000f, - 0.706100f, - 0.054000f, - -0.706100f, - 0.625000f, - 0.517200f, - 0.353034f, - -0.027069f, - -0.353034f, - 0.000000f, - 0.706100f, - -0.054000f, - -0.706100f, - 0.625000f, - 0.482800f, - 0.059715f, - 0.488310f, - -0.089370f, - 0.000000f, - 0.121200f, - 0.975900f, - -0.181400f, - 0.656300f, - 0.931000f, - 0.030033f, - 0.497069f, - -0.044948f, - 0.000000f, - 0.061900f, - 0.993700f, - -0.092700f, - 0.656300f, - 0.965500f, - 0.038225f, - 0.497069f, - -0.038226f, - 0.000000f, - 0.078800f, - 0.993700f, - -0.078800f, - 0.625000f, - 0.965500f, - 0.059715f, - 0.488310f, - -0.089370f, - 0.000000f, - 0.121200f, - 0.975900f, - -0.181400f, - 0.656300f, - 0.931000f, - 0.038225f, - 0.497069f, - -0.038226f, - 0.000000f, - 0.078800f, - 0.993700f, - -0.078800f, - 0.625000f, - 0.965500f, - 0.076003f, - 0.488310f, - -0.076003f, - 0.000000f, - 0.154300f, - 0.975900f, - -0.154300f, - 0.625000f, - 0.931000f, - -0.000000f, - -0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - -1.000000f, - 0.000000f, - 0.495500f, - 0.051000f, - 0.030034f, - -0.497069f, - -0.044949f, - 0.000000f, - 0.061900f, - -0.993700f, - -0.092700f, - 0.465400f, - 0.053800f, - 0.038226f, - -0.497069f, - -0.038226f, - 0.000000f, - 0.078800f, - -0.993700f, - -0.078800f, - 0.462800f, - 0.053800f, - 0.274125f, - -0.080891f, - -0.410257f, - 0.000000f, - 0.548300f, - -0.161200f, - -0.820600f, - 0.656300f, - 0.448300f, - 0.277377f, - -0.027069f, - -0.415125f, - 0.000000f, - 0.554700f, - -0.054000f, - -0.830300f, - 0.656300f, - 0.482800f, - 0.353034f, - -0.027069f, - -0.353034f, - 0.000000f, - 0.706100f, - -0.054000f, - -0.706100f, - 0.625000f, - 0.482800f, - 0.274125f, - -0.080891f, - -0.410257f, - 0.000000f, - 0.548300f, - -0.161200f, - -0.820600f, - 0.656300f, - 0.448300f, - 0.353034f, - -0.027069f, - -0.353034f, - 0.000000f, - 0.706100f, - -0.054000f, - -0.706100f, - 0.625000f, - 0.482800f, - 0.348895f, - -0.080891f, - -0.348895f, - 0.000000f, - 0.697800f, - -0.161200f, - -0.697800f, - 0.625000f, - 0.448300f, - 0.088697f, - 0.473826f, - -0.132745f, - 0.000000f, - 0.179100f, - 0.946600f, - -0.268000f, - 0.656300f, - 0.896600f, - 0.059715f, - 0.488310f, - -0.089370f, - 0.000000f, - 0.121200f, - 0.975900f, - -0.181400f, - 0.656300f, - 0.931000f, - 0.076003f, - 0.488310f, - -0.076003f, - 0.000000f, - 0.154300f, - 0.975900f, - -0.154300f, - 0.625000f, - 0.931000f, - 0.088697f, - 0.473826f, - -0.132745f, - 0.000000f, - 0.179100f, - 0.946600f, - -0.268000f, - 0.656300f, - 0.896600f, - 0.076003f, - 0.488310f, - -0.076003f, - 0.000000f, - 0.154300f, - 0.975900f, - -0.154300f, - 0.625000f, - 0.931000f, - 0.112889f, - 0.473826f, - -0.112890f, - 0.000000f, - 0.227900f, - 0.946600f, - -0.227900f, - 0.625000f, - 0.896600f, - 0.267659f, - -0.133764f, - -0.400580f, - 0.000000f, - 0.535400f, - -0.266600f, - -0.801400f, - 0.656300f, - 0.413800f, - 0.274125f, - -0.080891f, - -0.410257f, - 0.000000f, - 0.548300f, - -0.161200f, - -0.820600f, - 0.656300f, - 0.448300f, - 0.348895f, - -0.080891f, - -0.348895f, - 0.000000f, - 0.697800f, - -0.161200f, - -0.697800f, - 0.625000f, - 0.448300f, - 0.267659f, - -0.133764f, - -0.400580f, - 0.000000f, - 0.535400f, - -0.266600f, - -0.801400f, - 0.656300f, - 0.413800f, - 0.348895f, - -0.080891f, - -0.348895f, - 0.000000f, - 0.697800f, - -0.161200f, - -0.697800f, - 0.625000f, - 0.448300f, - 0.340665f, - -0.133764f, - -0.340666f, - 0.000000f, - 0.681500f, - -0.266600f, - -0.681500f, - 0.625000f, - 0.413800f, - 0.116638f, - 0.453788f, - -0.174562f, - 0.000000f, - 0.234800f, - 0.906300f, - -0.351400f, - 0.656300f, - 0.862100f, - 0.088697f, - 0.473826f, - -0.132745f, - 0.000000f, - 0.179100f, - 0.946600f, - -0.268000f, - 0.656300f, - 0.896600f, - 0.112889f, - 0.473826f, - -0.112890f, - 0.000000f, - 0.227900f, - 0.946600f, - -0.227900f, - 0.625000f, - 0.896600f, - 0.116638f, - 0.453788f, - -0.174562f, - 0.000000f, - 0.234800f, - 0.906300f, - -0.351400f, - 0.656300f, - 0.862100f, - 0.112889f, - 0.473826f, - -0.112890f, - 0.000000f, - 0.227900f, - 0.946600f, - -0.227900f, - 0.625000f, - 0.896600f, - 0.148453f, - 0.453788f, - -0.148453f, - 0.000000f, - 0.298900f, - 0.906300f, - -0.298900f, - 0.625000f, - 0.862100f, - 0.258055f, - -0.185069f, - -0.386207f, - 0.000000f, - 0.516300f, - -0.369000f, - -0.772800f, - 0.656300f, - 0.379300f, - 0.267659f, - -0.133764f, - -0.400580f, - 0.000000f, - 0.535400f, - -0.266600f, - -0.801400f, - 0.656300f, - 0.413800f, - 0.340665f, - -0.133764f, - -0.340666f, - 0.000000f, - 0.681500f, - -0.266600f, - -0.681500f, - 0.625000f, - 0.413800f, - 0.258055f, - -0.185069f, - -0.386207f, - 0.000000f, - 0.516300f, - -0.369000f, - -0.772800f, - 0.656300f, - 0.379300f, - 0.340665f, - -0.133764f, - -0.340666f, - 0.000000f, - 0.681500f, - -0.266600f, - -0.681500f, - 0.625000f, - 0.413800f, - 0.328442f, - -0.185069f, - -0.328443f, - 0.000000f, - 0.657200f, - -0.369000f, - -0.657200f, - 0.625000f, - 0.379300f, - 0.143212f, - 0.428429f, - -0.214334f, - 0.000000f, - 0.287800f, - 0.855300f, - -0.430700f, - 0.656300f, - 0.827600f, - 0.116638f, - 0.453788f, - -0.174562f, - 0.000000f, - 0.234800f, - 0.906300f, - -0.351400f, - 0.656300f, - 0.862100f, - 0.148453f, - 0.453788f, - -0.148453f, - 0.000000f, - 0.298900f, - 0.906300f, - -0.298900f, - 0.625000f, - 0.862100f, - 0.143212f, - 0.428429f, - -0.214334f, - 0.000000f, - 0.287800f, - 0.855300f, - -0.430700f, - 0.656300f, - 0.827600f, - 0.148453f, - 0.453788f, - -0.148453f, - 0.000000f, - 0.298900f, - 0.906300f, - -0.298900f, - 0.625000f, - 0.862100f, - 0.182275f, - 0.428429f, - -0.182276f, - 0.000000f, - 0.366300f, - 0.855300f, - -0.366300f, - 0.625000f, - 0.827600f, - 0.245426f, - -0.234204f, - -0.367306f, - 0.000000f, - 0.491300f, - -0.467000f, - -0.735200f, - 0.656300f, - 0.344800f, - 0.258055f, - -0.185069f, - -0.386207f, - 0.000000f, - 0.516300f, - -0.369000f, - -0.772800f, - 0.656300f, - 0.379300f, - 0.328442f, - -0.185069f, - -0.328443f, - 0.000000f, - 0.657200f, - -0.369000f, - -0.657200f, - 0.625000f, - 0.379300f, - 0.245426f, - -0.234204f, - -0.367306f, - 0.000000f, - 0.491300f, - -0.467000f, - -0.735200f, - 0.656300f, - 0.344800f, - 0.328442f, - -0.185069f, - -0.328443f, - 0.000000f, - 0.657200f, - -0.369000f, - -0.657200f, - 0.625000f, - 0.379300f, - 0.312368f, - -0.234204f, - -0.312368f, - 0.000000f, - 0.625200f, - -0.467000f, - -0.625200f, - 0.625000f, - 0.344800f, - 0.168107f, - 0.398046f, - -0.251592f, - 0.000000f, - 0.337400f, - 0.794500f, - -0.504900f, - 0.656300f, - 0.793100f, - 0.143212f, - 0.428429f, - -0.214334f, - 0.000000f, - 0.287800f, - 0.855300f, - -0.430700f, - 0.656300f, - 0.827600f, - 0.182275f, - 0.428429f, - -0.182276f, - 0.000000f, - 0.366300f, - 0.855300f, - -0.366300f, - 0.625000f, - 0.827600f, - 0.168107f, - 0.398046f, - -0.251592f, - 0.000000f, - 0.337400f, - 0.794500f, - -0.504900f, - 0.656300f, - 0.793100f, - 0.182275f, - 0.428429f, - -0.182276f, - 0.000000f, - 0.366300f, - 0.855300f, - -0.366300f, - 0.625000f, - 0.827600f, - 0.213960f, - 0.398046f, - -0.213961f, - 0.000000f, - 0.429400f, - 0.794500f, - -0.429400f, - 0.625000f, - 0.793100f, - 0.229919f, - -0.280594f, - -0.344099f, - 0.000000f, - 0.460400f, - -0.559600f, - -0.689100f, - 0.656300f, - 0.310300f, - 0.245426f, - -0.234204f, - -0.367306f, - 0.000000f, - 0.491300f, - -0.467000f, - -0.735200f, - 0.656300f, - 0.344800f, - 0.312368f, - -0.234204f, - -0.312368f, - 0.000000f, - 0.625200f, - -0.467000f, - -0.625200f, - 0.625000f, - 0.344800f, - 0.229919f, - -0.280594f, - -0.344099f, - 0.000000f, - 0.460400f, - -0.559600f, - -0.689100f, - 0.656300f, - 0.310300f, - 0.312368f, - -0.234204f, - -0.312368f, - 0.000000f, - 0.625200f, - -0.467000f, - -0.625200f, - 0.625000f, - 0.344800f, - 0.292632f, - -0.280594f, - -0.292632f, - 0.000000f, - 0.586000f, - -0.559600f, - -0.586000f, - 0.625000f, - 0.310300f, - 0.191032f, - 0.362998f, - -0.285900f, - 0.000000f, - 0.383000f, - 0.724300f, - -0.573300f, - 0.656300f, - 0.758600f, - 0.168107f, - 0.398046f, - -0.251592f, - 0.000000f, - 0.337400f, - 0.794500f, - -0.504900f, - 0.656300f, - 0.793100f, - 0.213960f, - 0.398046f, - -0.213961f, - 0.000000f, - 0.429400f, - 0.794500f, - -0.429400f, - 0.625000f, - 0.793100f, - 0.191032f, - 0.362998f, - -0.285900f, - 0.000000f, - 0.383000f, - 0.724300f, - -0.573300f, - 0.656300f, - 0.758600f, - 0.213960f, - 0.398046f, - -0.213961f, - 0.000000f, - 0.429400f, - 0.794500f, - -0.429400f, - 0.625000f, - 0.793100f, - 0.243137f, - 0.362998f, - -0.243138f, - 0.000000f, - 0.487500f, - 0.724300f, - -0.487500f, - 0.625000f, - 0.758600f, - 0.211717f, - -0.323693f, - -0.316857f, - 0.000000f, - 0.424200f, - -0.645700f, - -0.634900f, - 0.656300f, - 0.275900f, - 0.229919f, - -0.280594f, - -0.344099f, - 0.000000f, - 0.460400f, - -0.559600f, - -0.689100f, - 0.656300f, - 0.310300f, - 0.292632f, - -0.280594f, - -0.292632f, - 0.000000f, - 0.586000f, - -0.559600f, - -0.586000f, - 0.625000f, - 0.310300f, - 0.211717f, - -0.323693f, - -0.316857f, - 0.000000f, - 0.424200f, - -0.645700f, - -0.634900f, - 0.656300f, - 0.275900f, - 0.292632f, - -0.280594f, - -0.292632f, - 0.000000f, - 0.586000f, - -0.559600f, - -0.586000f, - 0.625000f, - 0.310300f, - 0.269464f, - -0.323693f, - -0.269464f, - 0.000000f, - 0.539900f, - -0.645700f, - -0.539900f, - 0.625000f, - 0.275900f, - 0.211717f, - 0.323693f, - -0.316857f, - 0.000000f, - 0.424200f, - 0.645700f, - -0.634900f, - 0.656300f, - 0.724100f, - 0.191032f, - 0.362998f, - -0.285900f, - 0.000000f, - 0.383000f, - 0.724300f, - -0.573300f, - 0.656300f, - 0.758600f, - 0.243137f, - 0.362998f, - -0.243138f, - 0.000000f, - 0.487500f, - 0.724300f, - -0.487500f, - 0.625000f, - 0.758600f, - 0.211717f, - 0.323693f, - -0.316857f, - 0.000000f, - 0.424200f, - 0.645700f, - -0.634900f, - 0.656300f, - 0.724100f, - 0.243137f, - 0.362998f, - -0.243138f, - 0.000000f, - 0.487500f, - 0.724300f, - -0.487500f, - 0.625000f, - 0.758600f, - 0.269464f, - 0.323693f, - -0.269464f, - 0.000000f, - 0.539900f, - 0.645700f, - -0.539900f, - 0.625000f, - 0.724100f, - 0.191032f, - -0.362998f, - -0.285900f, - 0.000000f, - 0.383000f, - -0.724300f, - -0.573300f, - 0.656300f, - 0.241400f, - 0.211717f, - -0.323693f, - -0.316857f, - 0.000000f, - 0.424200f, - -0.645700f, - -0.634900f, - 0.656300f, - 0.275900f, - 0.269464f, - -0.323693f, - -0.269464f, - 0.000000f, - 0.539900f, - -0.645700f, - -0.539900f, - 0.625000f, - 0.275900f, - 0.191032f, - -0.362998f, - -0.285900f, - 0.000000f, - 0.383000f, - -0.724300f, - -0.573300f, - 0.656300f, - 0.241400f, - 0.269464f, - -0.323693f, - -0.269464f, - 0.000000f, - 0.539900f, - -0.645700f, - -0.539900f, - 0.625000f, - 0.275900f, - 0.243137f, - -0.362998f, - -0.243138f, - 0.000000f, - 0.487500f, - -0.724300f, - -0.487500f, - 0.625000f, - 0.241400f, - 0.229919f, - 0.280594f, - -0.344099f, - 0.000000f, - 0.460400f, - 0.559600f, - -0.689100f, - 0.656300f, - 0.689700f, - 0.211717f, - 0.323693f, - -0.316857f, - 0.000000f, - 0.424200f, - 0.645700f, - -0.634900f, - 0.656300f, - 0.724100f, - 0.269464f, - 0.323693f, - -0.269464f, - 0.000000f, - 0.539900f, - 0.645700f, - -0.539900f, - 0.625000f, - 0.724100f, - 0.229919f, - 0.280594f, - -0.344099f, - 0.000000f, - 0.460400f, - 0.559600f, - -0.689100f, - 0.656300f, - 0.689700f, - 0.269464f, - 0.323693f, - -0.269464f, - 0.000000f, - 0.539900f, - 0.645700f, - -0.539900f, - 0.625000f, - 0.724100f, - 0.292632f, - 0.280594f, - -0.292632f, - 0.000000f, - 0.586000f, - 0.559600f, - -0.586000f, - 0.625000f, - 0.689700f, - 0.168108f, - -0.398046f, - -0.251592f, - 0.000000f, - 0.337400f, - -0.794500f, - -0.505000f, - 0.656300f, - 0.206900f, - 0.191032f, - -0.362998f, - -0.285900f, - 0.000000f, - 0.383000f, - -0.724300f, - -0.573300f, - 0.656300f, - 0.241400f, - 0.243137f, - -0.362998f, - -0.243138f, - 0.000000f, - 0.487500f, - -0.724300f, - -0.487500f, - 0.625000f, - 0.241400f, - 0.168108f, - -0.398046f, - -0.251592f, - 0.000000f, - 0.337400f, - -0.794500f, - -0.505000f, - 0.656300f, - 0.206900f, - 0.243137f, - -0.362998f, - -0.243138f, - 0.000000f, - 0.487500f, - -0.724300f, - -0.487500f, - 0.625000f, - 0.241400f, - 0.213960f, - -0.398046f, - -0.213961f, - 0.000000f, - 0.429400f, - -0.794500f, - -0.429400f, - 0.625000f, - 0.206900f, - 0.245426f, - 0.234204f, - -0.367306f, - 0.000000f, - 0.491300f, - 0.467000f, - -0.735200f, - 0.656300f, - 0.655200f, - 0.229919f, - 0.280594f, - -0.344099f, - 0.000000f, - 0.460400f, - 0.559600f, - -0.689100f, - 0.656300f, - 0.689700f, - 0.292632f, - 0.280594f, - -0.292632f, - 0.000000f, - 0.586000f, - 0.559600f, - -0.586000f, - 0.625000f, - 0.689700f, - 0.245426f, - 0.234204f, - -0.367306f, - 0.000000f, - 0.491300f, - 0.467000f, - -0.735200f, - 0.656300f, - 0.655200f, - 0.292632f, - 0.280594f, - -0.292632f, - 0.000000f, - 0.586000f, - 0.559600f, - -0.586000f, - 0.625000f, - 0.689700f, - 0.312368f, - 0.234204f, - -0.312368f, - 0.000000f, - 0.625200f, - 0.467000f, - -0.625200f, - 0.625000f, - 0.655200f, - 0.143212f, - -0.428429f, - -0.214334f, - 0.000000f, - 0.287800f, - -0.855300f, - -0.430700f, - 0.656300f, - 0.172400f, - 0.168108f, - -0.398046f, - -0.251592f, - 0.000000f, - 0.337400f, - -0.794500f, - -0.505000f, - 0.656300f, - 0.206900f, - 0.213960f, - -0.398046f, - -0.213961f, - 0.000000f, - 0.429400f, - -0.794500f, - -0.429400f, - 0.625000f, - 0.206900f, - 0.143212f, - -0.428429f, - -0.214334f, - 0.000000f, - 0.287800f, - -0.855300f, - -0.430700f, - 0.656300f, - 0.172400f, - 0.213960f, - -0.398046f, - -0.213961f, - 0.000000f, - 0.429400f, - -0.794500f, - -0.429400f, - 0.625000f, - 0.206900f, - 0.182275f, - -0.428429f, - -0.182276f, - 0.000000f, - 0.366300f, - -0.855300f, - -0.366300f, - 0.625000f, - 0.172400f, - 0.258055f, - 0.185069f, - -0.386207f, - 0.000000f, - 0.516300f, - 0.369000f, - -0.772800f, - 0.656300f, - 0.620700f, - 0.245426f, - 0.234204f, - -0.367306f, - 0.000000f, - 0.491300f, - 0.467000f, - -0.735200f, - 0.656300f, - 0.655200f, - 0.312368f, - 0.234204f, - -0.312368f, - 0.000000f, - 0.625200f, - 0.467000f, - -0.625200f, - 0.625000f, - 0.655200f, - 0.258055f, - 0.185069f, - -0.386207f, - 0.000000f, - 0.516300f, - 0.369000f, - -0.772800f, - 0.656300f, - 0.620700f, - 0.312368f, - 0.234204f, - -0.312368f, - 0.000000f, - 0.625200f, - 0.467000f, - -0.625200f, - 0.625000f, - 0.655200f, - 0.328442f, - 0.185069f, - -0.328443f, - 0.000000f, - 0.657200f, - 0.369000f, - -0.657200f, - 0.625000f, - 0.620700f, - 0.116638f, - -0.453788f, - -0.174562f, - 0.000000f, - 0.234800f, - -0.906300f, - -0.351400f, - 0.656300f, - 0.137900f, - 0.143212f, - -0.428429f, - -0.214334f, - 0.000000f, - 0.287800f, - -0.855300f, - -0.430700f, - 0.656300f, - 0.172400f, - 0.182275f, - -0.428429f, - -0.182276f, - 0.000000f, - 0.366300f, - -0.855300f, - -0.366300f, - 0.625000f, - 0.172400f, - 0.116638f, - -0.453788f, - -0.174562f, - 0.000000f, - 0.234800f, - -0.906300f, - -0.351400f, - 0.656300f, - 0.137900f, - 0.182275f, - -0.428429f, - -0.182276f, - 0.000000f, - 0.366300f, - -0.855300f, - -0.366300f, - 0.625000f, - 0.172400f, - 0.148453f, - -0.453788f, - -0.148453f, - 0.000000f, - 0.298900f, - -0.906300f, - -0.298900f, - 0.625000f, - 0.137900f, - 0.267659f, - 0.133764f, - -0.400580f, - 0.000000f, - 0.535400f, - 0.266600f, - -0.801400f, - 0.656300f, - 0.586200f, - 0.258055f, - 0.185069f, - -0.386207f, - 0.000000f, - 0.516300f, - 0.369000f, - -0.772800f, - 0.656300f, - 0.620700f, - 0.328442f, - 0.185069f, - -0.328443f, - 0.000000f, - 0.657200f, - 0.369000f, - -0.657200f, - 0.625000f, - 0.620700f, - 0.267659f, - 0.133764f, - -0.400580f, - 0.000000f, - 0.535400f, - 0.266600f, - -0.801400f, - 0.656300f, - 0.586200f, - 0.328442f, - 0.185069f, - -0.328443f, - 0.000000f, - 0.657200f, - 0.369000f, - -0.657200f, - 0.625000f, - 0.620700f, - 0.340665f, - 0.133764f, - -0.340666f, - 0.000000f, - 0.681500f, - 0.266600f, - -0.681500f, - 0.625000f, - 0.586200f, - 0.088697f, - -0.473826f, - -0.132745f, - 0.000000f, - 0.179100f, - -0.946600f, - -0.268000f, - 0.656300f, - 0.103400f, - 0.116638f, - -0.453788f, - -0.174562f, - 0.000000f, - 0.234800f, - -0.906300f, - -0.351400f, - 0.656300f, - 0.137900f, - 0.148453f, - -0.453788f, - -0.148453f, - 0.000000f, - 0.298900f, - -0.906300f, - -0.298900f, - 0.625000f, - 0.137900f, - 0.088697f, - -0.473826f, - -0.132745f, - 0.000000f, - 0.179100f, - -0.946600f, - -0.268000f, - 0.656300f, - 0.103400f, - 0.148453f, - -0.453788f, - -0.148453f, - 0.000000f, - 0.298900f, - -0.906300f, - -0.298900f, - 0.625000f, - 0.137900f, - 0.112889f, - -0.473826f, - -0.112890f, - 0.000000f, - 0.227900f, - -0.946600f, - -0.227900f, - 0.625000f, - 0.103400f, - 0.274125f, - 0.080891f, - -0.410257f, - 0.000000f, - 0.548300f, - 0.161200f, - -0.820600f, - 0.656300f, - 0.551700f, - 0.267659f, - 0.133764f, - -0.400580f, - 0.000000f, - 0.535400f, - 0.266600f, - -0.801400f, - 0.656300f, - 0.586200f, - 0.340665f, - 0.133764f, - -0.340666f, - 0.000000f, - 0.681500f, - 0.266600f, - -0.681500f, - 0.625000f, - 0.586200f, - 0.274125f, - 0.080891f, - -0.410257f, - 0.000000f, - 0.548300f, - 0.161200f, - -0.820600f, - 0.656300f, - 0.551700f, - 0.340665f, - 0.133764f, - -0.340666f, - 0.000000f, - 0.681500f, - 0.266600f, - -0.681500f, - 0.625000f, - 0.586200f, - 0.348895f, - 0.080891f, - -0.348895f, - 0.000000f, - 0.697800f, - 0.161200f, - -0.697800f, - 0.625000f, - 0.551700f, - 0.269464f, - 0.323693f, - -0.269464f, - 0.000000f, - 0.539900f, - 0.645700f, - -0.539900f, - 0.625000f, - 0.724100f, - 0.243137f, - 0.362998f, - -0.243138f, - 0.000000f, - 0.487500f, - 0.724300f, - -0.487500f, - 0.625000f, - 0.758600f, - 0.285899f, - 0.362998f, - -0.191032f, - 0.000000f, - 0.573300f, - 0.724300f, - -0.383000f, - 0.593800f, - 0.758600f, - 0.269464f, - 0.323693f, - -0.269464f, - 0.000000f, - 0.539900f, - 0.645700f, - -0.539900f, - 0.625000f, - 0.724100f, - 0.285899f, - 0.362998f, - -0.191032f, - 0.000000f, - 0.573300f, - 0.724300f, - -0.383000f, - 0.593800f, - 0.758600f, - 0.316857f, - 0.323693f, - -0.211717f, - 0.000000f, - 0.634900f, - 0.645700f, - -0.424200f, - 0.593800f, - 0.724100f, - 0.243137f, - -0.362998f, - -0.243138f, - 0.000000f, - 0.487500f, - -0.724300f, - -0.487500f, - 0.625000f, - 0.241400f, - 0.269464f, - -0.323693f, - -0.269464f, - 0.000000f, - 0.539900f, - -0.645700f, - -0.539900f, - 0.625000f, - 0.275900f, - 0.316857f, - -0.323693f, - -0.211717f, - 0.000000f, - 0.634900f, - -0.645700f, - -0.424200f, - 0.593800f, - 0.275900f, - 0.243137f, - -0.362998f, - -0.243138f, - 0.000000f, - 0.487500f, - -0.724300f, - -0.487500f, - 0.625000f, - 0.241400f, - 0.316857f, - -0.323693f, - -0.211717f, - 0.000000f, - 0.634900f, - -0.645700f, - -0.424200f, - 0.593800f, - 0.275900f, - 0.285900f, - -0.362998f, - -0.191032f, - 0.000000f, - 0.573300f, - -0.724300f, - -0.383000f, - 0.593800f, - 0.241400f, - 0.292632f, - 0.280594f, - -0.292632f, - 0.000000f, - 0.586000f, - 0.559600f, - -0.586000f, - 0.625000f, - 0.689700f, - 0.269464f, - 0.323693f, - -0.269464f, - 0.000000f, - 0.539900f, - 0.645700f, - -0.539900f, - 0.625000f, - 0.724100f, - 0.316857f, - 0.323693f, - -0.211717f, - 0.000000f, - 0.634900f, - 0.645700f, - -0.424200f, - 0.593800f, - 0.724100f, - 0.292632f, - 0.280594f, - -0.292632f, - 0.000000f, - 0.586000f, - 0.559600f, - -0.586000f, - 0.625000f, - 0.689700f, - 0.316857f, - 0.323693f, - -0.211717f, - 0.000000f, - 0.634900f, - 0.645700f, - -0.424200f, - 0.593800f, - 0.724100f, - 0.344098f, - 0.280594f, - -0.229919f, - 0.000000f, - 0.689100f, - 0.559600f, - -0.460400f, - 0.593800f, - 0.689700f, - 0.213960f, - -0.398046f, - -0.213961f, - 0.000000f, - 0.429400f, - -0.794500f, - -0.429400f, - 0.625000f, - 0.206900f, - 0.243137f, - -0.362998f, - -0.243138f, - 0.000000f, - 0.487500f, - -0.724300f, - -0.487500f, - 0.625000f, - 0.241400f, - 0.285900f, - -0.362998f, - -0.191032f, - 0.000000f, - 0.573300f, - -0.724300f, - -0.383000f, - 0.593800f, - 0.241400f, - 0.213960f, - -0.398046f, - -0.213961f, - 0.000000f, - 0.429400f, - -0.794500f, - -0.429400f, - 0.625000f, - 0.206900f, - 0.285900f, - -0.362998f, - -0.191032f, - 0.000000f, - 0.573300f, - -0.724300f, - -0.383000f, - 0.593800f, - 0.241400f, - 0.251591f, - -0.398046f, - -0.168108f, - 0.000000f, - 0.505000f, - -0.794500f, - -0.337400f, - 0.593800f, - 0.206900f, - 0.312368f, - 0.234204f, - -0.312368f, - 0.000000f, - 0.625200f, - 0.467000f, - -0.625200f, - 0.625000f, - 0.655200f, - 0.292632f, - 0.280594f, - -0.292632f, - 0.000000f, - 0.586000f, - 0.559600f, - -0.586000f, - 0.625000f, - 0.689700f, - 0.344098f, - 0.280594f, - -0.229919f, - 0.000000f, - 0.689100f, - 0.559600f, - -0.460400f, - 0.593800f, - 0.689700f, - 0.312368f, - 0.234204f, - -0.312368f, - 0.000000f, - 0.625200f, - 0.467000f, - -0.625200f, - 0.625000f, - 0.655200f, - 0.344098f, - 0.280594f, - -0.229919f, - 0.000000f, - 0.689100f, - 0.559600f, - -0.460400f, - 0.593800f, - 0.689700f, - 0.367306f, - 0.234204f, - -0.245426f, - 0.000000f, - 0.735200f, - 0.467000f, - -0.491300f, - 0.593800f, - 0.655200f, - 0.182275f, - -0.428429f, - -0.182276f, - 0.000000f, - 0.366300f, - -0.855300f, - -0.366300f, - 0.625000f, - 0.172400f, - 0.213960f, - -0.398046f, - -0.213961f, - 0.000000f, - 0.429400f, - -0.794500f, - -0.429400f, - 0.625000f, - 0.206900f, - 0.251591f, - -0.398046f, - -0.168108f, - 0.000000f, - 0.505000f, - -0.794500f, - -0.337400f, - 0.593800f, - 0.206900f, - 0.182275f, - -0.428429f, - -0.182276f, - 0.000000f, - 0.366300f, - -0.855300f, - -0.366300f, - 0.625000f, - 0.172400f, - 0.251591f, - -0.398046f, - -0.168108f, - 0.000000f, - 0.505000f, - -0.794500f, - -0.337400f, - 0.593800f, - 0.206900f, - 0.214333f, - -0.428429f, - -0.143213f, - 0.000000f, - 0.430700f, - -0.855300f, - -0.287800f, - 0.593800f, - 0.172400f, - 0.328442f, - 0.185069f, - -0.328443f, - 0.000000f, - 0.657200f, - 0.369000f, - -0.657200f, - 0.625000f, - 0.620700f, - 0.312368f, - 0.234204f, - -0.312368f, - 0.000000f, - 0.625200f, - 0.467000f, - -0.625200f, - 0.625000f, - 0.655200f, - 0.367306f, - 0.234204f, - -0.245426f, - 0.000000f, - 0.735200f, - 0.467000f, - -0.491300f, - 0.593800f, - 0.655200f, - 0.328442f, - 0.185069f, - -0.328443f, - 0.000000f, - 0.657200f, - 0.369000f, - -0.657200f, - 0.625000f, - 0.620700f, - 0.367306f, - 0.234204f, - -0.245426f, - 0.000000f, - 0.735200f, - 0.467000f, - -0.491300f, - 0.593800f, - 0.655200f, - 0.386207f, - 0.185069f, - -0.258056f, - 0.000000f, - 0.772800f, - 0.369000f, - -0.516300f, - 0.593800f, - 0.620700f, - 0.148453f, - -0.453788f, - -0.148453f, - 0.000000f, - 0.298900f, - -0.906300f, - -0.298900f, - 0.625000f, - 0.137900f, - 0.182275f, - -0.428429f, - -0.182276f, - 0.000000f, - 0.366300f, - -0.855300f, - -0.366300f, - 0.625000f, - 0.172400f, - 0.214333f, - -0.428429f, - -0.143213f, - 0.000000f, - 0.430700f, - -0.855300f, - -0.287800f, - 0.593800f, - 0.172400f, - 0.148453f, - -0.453788f, - -0.148453f, - 0.000000f, - 0.298900f, - -0.906300f, - -0.298900f, - 0.625000f, - 0.137900f, - 0.214333f, - -0.428429f, - -0.143213f, - 0.000000f, - 0.430700f, - -0.855300f, - -0.287800f, - 0.593800f, - 0.172400f, - 0.174562f, - -0.453788f, - -0.116639f, - 0.000000f, - 0.351400f, - -0.906300f, - -0.234800f, - 0.593800f, - 0.137900f, - 0.340665f, - 0.133764f, - -0.340666f, - 0.000000f, - 0.681500f, - 0.266600f, - -0.681500f, - 0.625000f, - 0.586200f, - 0.328442f, - 0.185069f, - -0.328443f, - 0.000000f, - 0.657200f, - 0.369000f, - -0.657200f, - 0.625000f, - 0.620700f, - 0.386207f, - 0.185069f, - -0.258056f, - 0.000000f, - 0.772800f, - 0.369000f, - -0.516300f, - 0.593800f, - 0.620700f, - 0.340665f, - 0.133764f, - -0.340666f, - 0.000000f, - 0.681500f, - 0.266600f, - -0.681500f, - 0.625000f, - 0.586200f, - 0.386207f, - 0.185069f, - -0.258056f, - 0.000000f, - 0.772800f, - 0.369000f, - -0.516300f, - 0.593800f, - 0.620700f, - 0.400580f, - 0.133764f, - -0.267659f, - 0.000000f, - 0.801400f, - 0.266600f, - -0.535400f, - 0.593800f, - 0.586200f, - 0.112889f, - -0.473826f, - -0.112890f, - 0.000000f, - 0.227900f, - -0.946600f, - -0.227900f, - 0.625000f, - 0.103400f, - 0.148453f, - -0.453788f, - -0.148453f, - 0.000000f, - 0.298900f, - -0.906300f, - -0.298900f, - 0.625000f, - 0.137900f, - 0.174562f, - -0.453788f, - -0.116639f, - 0.000000f, - 0.351400f, - -0.906300f, - -0.234800f, - 0.593800f, - 0.137900f, - 0.112889f, - -0.473826f, - -0.112890f, - 0.000000f, - 0.227900f, - -0.946600f, - -0.227900f, - 0.625000f, - 0.103400f, - 0.174562f, - -0.453788f, - -0.116639f, - 0.000000f, - 0.351400f, - -0.906300f, - -0.234800f, - 0.593800f, - 0.137900f, - 0.132744f, - -0.473826f, - -0.088697f, - 0.000000f, - 0.268000f, - -0.946600f, - -0.179100f, - 0.593800f, - 0.103400f, - 0.348895f, - 0.080891f, - -0.348895f, - 0.000000f, - 0.697800f, - 0.161200f, - -0.697800f, - 0.625000f, - 0.551700f, - 0.340665f, - 0.133764f, - -0.340666f, - 0.000000f, - 0.681500f, - 0.266600f, - -0.681500f, - 0.625000f, - 0.586200f, - 0.400580f, - 0.133764f, - -0.267659f, - 0.000000f, - 0.801400f, - 0.266600f, - -0.535400f, - 0.593800f, - 0.586200f, - 0.348895f, - 0.080891f, - -0.348895f, - 0.000000f, - 0.697800f, - 0.161200f, - -0.697800f, - 0.625000f, - 0.551700f, - 0.400580f, - 0.133764f, - -0.267659f, - 0.000000f, - 0.801400f, - 0.266600f, - -0.535400f, - 0.593800f, - 0.586200f, - 0.410257f, - 0.080891f, - -0.274125f, - 0.000000f, - 0.820600f, - 0.161200f, - -0.548300f, - 0.593800f, - 0.551700f, - 0.076003f, - -0.488310f, - -0.076003f, - 0.000000f, - 0.154300f, - -0.975900f, - -0.154300f, - 0.625000f, - 0.069000f, - 0.112889f, - -0.473826f, - -0.112890f, - 0.000000f, - 0.227900f, - -0.946600f, - -0.227900f, - 0.625000f, - 0.103400f, - 0.132744f, - -0.473826f, - -0.088697f, - 0.000000f, - 0.268000f, - -0.946600f, - -0.179100f, - 0.593800f, - 0.103400f, - 0.076003f, - -0.488310f, - -0.076003f, - 0.000000f, - 0.154300f, - -0.975900f, - -0.154300f, - 0.625000f, - 0.069000f, - 0.132744f, - -0.473826f, - -0.088697f, - 0.000000f, - 0.268000f, - -0.946600f, - -0.179100f, - 0.593800f, - 0.103400f, - 0.089370f, - -0.488310f, - -0.059715f, - 0.000000f, - 0.181400f, - -0.975900f, - -0.121200f, - 0.593800f, - 0.069000f, - 0.353034f, - 0.027069f, - -0.353034f, - 0.000000f, - 0.706100f, - 0.054000f, - -0.706100f, - 0.625000f, - 0.517200f, - 0.348895f, - 0.080891f, - -0.348895f, - 0.000000f, - 0.697800f, - 0.161200f, - -0.697800f, - 0.625000f, - 0.551700f, - 0.410257f, - 0.080891f, - -0.274125f, - 0.000000f, - 0.820600f, - 0.161200f, - -0.548300f, - 0.593800f, - 0.551700f, - 0.353034f, - 0.027069f, - -0.353034f, - 0.000000f, - 0.706100f, - 0.054000f, - -0.706100f, - 0.625000f, - 0.517200f, - 0.410257f, - 0.080891f, - -0.274125f, - 0.000000f, - 0.820600f, - 0.161200f, - -0.548300f, - 0.593800f, - 0.551700f, - 0.415124f, - 0.027069f, - -0.277377f, - 0.000000f, - 0.830300f, - 0.054000f, - -0.554700f, - 0.593800f, - 0.517200f, - 0.038225f, - 0.497069f, - -0.038226f, - 0.000000f, - 0.078800f, - 0.993700f, - -0.078800f, - 0.449000f, - 0.962300f, - -0.000000f, - 0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - 1.000000f, - 0.000000f, - 0.423900f, - 0.960300f, - 0.044948f, - 0.497069f, - -0.030034f, - 0.000000f, - 0.092700f, - 0.993700f, - -0.061900f, - 0.450800f, - 0.962300f, - 0.038226f, - -0.497069f, - -0.038226f, - 0.000000f, - 0.078800f, - -0.993700f, - -0.078800f, - 0.625000f, - 0.034500f, - 0.076003f, - -0.488310f, - -0.076003f, - 0.000000f, - 0.154300f, - -0.975900f, - -0.154300f, - 0.625000f, - 0.069000f, - 0.089370f, - -0.488310f, - -0.059715f, - 0.000000f, - 0.181400f, - -0.975900f, - -0.121200f, - 0.593800f, - 0.069000f, - 0.038226f, - -0.497069f, - -0.038226f, - 0.000000f, - 0.078800f, - -0.993700f, - -0.078800f, - 0.625000f, - 0.034500f, - 0.089370f, - -0.488310f, - -0.059715f, - 0.000000f, - 0.181400f, - -0.975900f, - -0.121200f, - 0.593800f, - 0.069000f, - 0.044948f, - -0.497069f, - -0.030034f, - 0.000000f, - 0.092700f, - -0.993700f, - -0.061900f, - 0.593800f, - 0.034500f, - 0.353034f, - -0.027069f, - -0.353034f, - 0.000000f, - 0.706100f, - -0.054000f, - -0.706100f, - 0.625000f, - 0.482800f, - 0.353034f, - 0.027069f, - -0.353034f, - 0.000000f, - 0.706100f, - 0.054000f, - -0.706100f, - 0.625000f, - 0.517200f, - 0.415124f, - 0.027069f, - -0.277377f, - 0.000000f, - 0.830300f, - 0.054000f, - -0.554700f, - 0.593800f, - 0.517200f, - 0.353034f, - -0.027069f, - -0.353034f, - 0.000000f, - 0.706100f, - -0.054000f, - -0.706100f, - 0.625000f, - 0.482800f, - 0.415124f, - 0.027069f, - -0.277377f, - 0.000000f, - 0.830300f, - 0.054000f, - -0.554700f, - 0.593800f, - 0.517200f, - 0.415124f, - -0.027069f, - -0.277377f, - 0.000000f, - 0.830300f, - -0.054000f, - -0.554700f, - 0.593800f, - 0.482800f, - 0.076003f, - 0.488310f, - -0.076003f, - 0.000000f, - 0.154300f, - 0.975900f, - -0.154300f, - 0.625000f, - 0.931000f, - 0.038225f, - 0.497069f, - -0.038226f, - 0.000000f, - 0.078800f, - 0.993700f, - -0.078800f, - 0.625000f, - 0.965500f, - 0.044948f, - 0.497069f, - -0.030034f, - 0.000000f, - 0.092700f, - 0.993700f, - -0.061900f, - 0.593800f, - 0.965500f, - 0.076003f, - 0.488310f, - -0.076003f, - 0.000000f, - 0.154300f, - 0.975900f, - -0.154300f, - 0.625000f, - 0.931000f, - 0.044948f, - 0.497069f, - -0.030034f, - 0.000000f, - 0.092700f, - 0.993700f, - -0.061900f, - 0.593800f, - 0.965500f, - 0.089370f, - 0.488310f, - -0.059715f, - 0.000000f, - 0.181400f, - 0.975900f, - -0.121200f, - 0.593800f, - 0.931000f, - -0.000000f, - -0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - -1.000000f, - 0.000000f, - 0.495500f, - 0.051000f, - 0.038226f, - -0.497069f, - -0.038226f, - 0.000000f, - 0.078800f, - -0.993700f, - -0.078800f, - 0.462800f, - 0.053800f, - 0.044948f, - -0.497069f, - -0.030034f, - 0.000000f, - 0.092700f, - -0.993700f, - -0.061900f, - 0.460200f, - 0.053800f, - 0.348895f, - -0.080891f, - -0.348895f, - 0.000000f, - 0.697800f, - -0.161200f, - -0.697800f, - 0.625000f, - 0.448300f, - 0.353034f, - -0.027069f, - -0.353034f, - 0.000000f, - 0.706100f, - -0.054000f, - -0.706100f, - 0.625000f, - 0.482800f, - 0.415124f, - -0.027069f, - -0.277377f, - 0.000000f, - 0.830300f, - -0.054000f, - -0.554700f, - 0.593800f, - 0.482800f, - 0.348895f, - -0.080891f, - -0.348895f, - 0.000000f, - 0.697800f, - -0.161200f, - -0.697800f, - 0.625000f, - 0.448300f, - 0.415124f, - -0.027069f, - -0.277377f, - 0.000000f, - 0.830300f, - -0.054000f, - -0.554700f, - 0.593800f, - 0.482800f, - 0.410257f, - -0.080891f, - -0.274125f, - 0.000000f, - 0.820600f, - -0.161200f, - -0.548300f, - 0.593800f, - 0.448300f, - 0.112889f, - 0.473826f, - -0.112890f, - 0.000000f, - 0.227900f, - 0.946600f, - -0.227900f, - 0.625000f, - 0.896600f, - 0.076003f, - 0.488310f, - -0.076003f, - 0.000000f, - 0.154300f, - 0.975900f, - -0.154300f, - 0.625000f, - 0.931000f, - 0.089370f, - 0.488310f, - -0.059715f, - 0.000000f, - 0.181400f, - 0.975900f, - -0.121200f, - 0.593800f, - 0.931000f, - 0.112889f, - 0.473826f, - -0.112890f, - 0.000000f, - 0.227900f, - 0.946600f, - -0.227900f, - 0.625000f, - 0.896600f, - 0.089370f, - 0.488310f, - -0.059715f, - 0.000000f, - 0.181400f, - 0.975900f, - -0.121200f, - 0.593800f, - 0.931000f, - 0.132744f, - 0.473826f, - -0.088697f, - 0.000000f, - 0.268000f, - 0.946600f, - -0.179100f, - 0.593800f, - 0.896600f, - 0.340665f, - -0.133764f, - -0.340666f, - 0.000000f, - 0.681500f, - -0.266600f, - -0.681500f, - 0.625000f, - 0.413800f, - 0.348895f, - -0.080891f, - -0.348895f, - 0.000000f, - 0.697800f, - -0.161200f, - -0.697800f, - 0.625000f, - 0.448300f, - 0.410257f, - -0.080891f, - -0.274125f, - 0.000000f, - 0.820600f, - -0.161200f, - -0.548300f, - 0.593800f, - 0.448300f, - 0.340665f, - -0.133764f, - -0.340666f, - 0.000000f, - 0.681500f, - -0.266600f, - -0.681500f, - 0.625000f, - 0.413800f, - 0.410257f, - -0.080891f, - -0.274125f, - 0.000000f, - 0.820600f, - -0.161200f, - -0.548300f, - 0.593800f, - 0.448300f, - 0.400580f, - -0.133764f, - -0.267659f, - 0.000000f, - 0.801400f, - -0.266600f, - -0.535400f, - 0.593800f, - 0.413800f, - 0.148453f, - 0.453788f, - -0.148453f, - 0.000000f, - 0.298900f, - 0.906300f, - -0.298900f, - 0.625000f, - 0.862100f, - 0.112889f, - 0.473826f, - -0.112890f, - 0.000000f, - 0.227900f, - 0.946600f, - -0.227900f, - 0.625000f, - 0.896600f, - 0.132744f, - 0.473826f, - -0.088697f, - 0.000000f, - 0.268000f, - 0.946600f, - -0.179100f, - 0.593800f, - 0.896600f, - 0.148453f, - 0.453788f, - -0.148453f, - 0.000000f, - 0.298900f, - 0.906300f, - -0.298900f, - 0.625000f, - 0.862100f, - 0.132744f, - 0.473826f, - -0.088697f, - 0.000000f, - 0.268000f, - 0.946600f, - -0.179100f, - 0.593800f, - 0.896600f, - 0.174562f, - 0.453788f, - -0.116638f, - 0.000000f, - 0.351400f, - 0.906300f, - -0.234800f, - 0.593800f, - 0.862100f, - 0.328442f, - -0.185069f, - -0.328443f, - 0.000000f, - 0.657200f, - -0.369000f, - -0.657200f, - 0.625000f, - 0.379300f, - 0.340665f, - -0.133764f, - -0.340666f, - 0.000000f, - 0.681500f, - -0.266600f, - -0.681500f, - 0.625000f, - 0.413800f, - 0.400580f, - -0.133764f, - -0.267659f, - 0.000000f, - 0.801400f, - -0.266600f, - -0.535400f, - 0.593800f, - 0.413800f, - 0.328442f, - -0.185069f, - -0.328443f, - 0.000000f, - 0.657200f, - -0.369000f, - -0.657200f, - 0.625000f, - 0.379300f, - 0.400580f, - -0.133764f, - -0.267659f, - 0.000000f, - 0.801400f, - -0.266600f, - -0.535400f, - 0.593800f, - 0.413800f, - 0.386207f, - -0.185069f, - -0.258056f, - 0.000000f, - 0.772800f, - -0.369000f, - -0.516300f, - 0.593800f, - 0.379300f, - 0.182275f, - 0.428429f, - -0.182276f, - 0.000000f, - 0.366300f, - 0.855300f, - -0.366300f, - 0.625000f, - 0.827600f, - 0.148453f, - 0.453788f, - -0.148453f, - 0.000000f, - 0.298900f, - 0.906300f, - -0.298900f, - 0.625000f, - 0.862100f, - 0.174562f, - 0.453788f, - -0.116638f, - 0.000000f, - 0.351400f, - 0.906300f, - -0.234800f, - 0.593800f, - 0.862100f, - 0.182275f, - 0.428429f, - -0.182276f, - 0.000000f, - 0.366300f, - 0.855300f, - -0.366300f, - 0.625000f, - 0.827600f, - 0.174562f, - 0.453788f, - -0.116638f, - 0.000000f, - 0.351400f, - 0.906300f, - -0.234800f, - 0.593800f, - 0.862100f, - 0.214333f, - 0.428429f, - -0.143213f, - 0.000000f, - 0.430700f, - 0.855300f, - -0.287800f, - 0.593800f, - 0.827600f, - 0.312368f, - -0.234204f, - -0.312368f, - 0.000000f, - 0.625200f, - -0.467000f, - -0.625200f, - 0.625000f, - 0.344800f, - 0.328442f, - -0.185069f, - -0.328443f, - 0.000000f, - 0.657200f, - -0.369000f, - -0.657200f, - 0.625000f, - 0.379300f, - 0.386207f, - -0.185069f, - -0.258056f, - 0.000000f, - 0.772800f, - -0.369000f, - -0.516300f, - 0.593800f, - 0.379300f, - 0.312368f, - -0.234204f, - -0.312368f, - 0.000000f, - 0.625200f, - -0.467000f, - -0.625200f, - 0.625000f, - 0.344800f, - 0.386207f, - -0.185069f, - -0.258056f, - 0.000000f, - 0.772800f, - -0.369000f, - -0.516300f, - 0.593800f, - 0.379300f, - 0.367306f, - -0.234204f, - -0.245426f, - 0.000000f, - 0.735200f, - -0.467000f, - -0.491300f, - 0.593800f, - 0.344800f, - 0.213960f, - 0.398046f, - -0.213961f, - 0.000000f, - 0.429400f, - 0.794500f, - -0.429400f, - 0.625000f, - 0.793100f, - 0.182275f, - 0.428429f, - -0.182276f, - 0.000000f, - 0.366300f, - 0.855300f, - -0.366300f, - 0.625000f, - 0.827600f, - 0.214333f, - 0.428429f, - -0.143213f, - 0.000000f, - 0.430700f, - 0.855300f, - -0.287800f, - 0.593800f, - 0.827600f, - 0.213960f, - 0.398046f, - -0.213961f, - 0.000000f, - 0.429400f, - 0.794500f, - -0.429400f, - 0.625000f, - 0.793100f, - 0.214333f, - 0.428429f, - -0.143213f, - 0.000000f, - 0.430700f, - 0.855300f, - -0.287800f, - 0.593800f, - 0.827600f, - 0.251591f, - 0.398046f, - -0.168108f, - 0.000000f, - 0.504900f, - 0.794500f, - -0.337400f, - 0.593800f, - 0.793100f, - 0.292632f, - -0.280594f, - -0.292632f, - 0.000000f, - 0.586000f, - -0.559600f, - -0.586000f, - 0.625000f, - 0.310300f, - 0.312368f, - -0.234204f, - -0.312368f, - 0.000000f, - 0.625200f, - -0.467000f, - -0.625200f, - 0.625000f, - 0.344800f, - 0.367306f, - -0.234204f, - -0.245426f, - 0.000000f, - 0.735200f, - -0.467000f, - -0.491300f, - 0.593800f, - 0.344800f, - 0.292632f, - -0.280594f, - -0.292632f, - 0.000000f, - 0.586000f, - -0.559600f, - -0.586000f, - 0.625000f, - 0.310300f, - 0.367306f, - -0.234204f, - -0.245426f, - 0.000000f, - 0.735200f, - -0.467000f, - -0.491300f, - 0.593800f, - 0.344800f, - 0.344099f, - -0.280594f, - -0.229919f, - 0.000000f, - 0.689100f, - -0.559600f, - -0.460400f, - 0.593800f, - 0.310300f, - 0.243137f, - 0.362998f, - -0.243138f, - 0.000000f, - 0.487500f, - 0.724300f, - -0.487500f, - 0.625000f, - 0.758600f, - 0.213960f, - 0.398046f, - -0.213961f, - 0.000000f, - 0.429400f, - 0.794500f, - -0.429400f, - 0.625000f, - 0.793100f, - 0.251591f, - 0.398046f, - -0.168108f, - 0.000000f, - 0.504900f, - 0.794500f, - -0.337400f, - 0.593800f, - 0.793100f, - 0.243137f, - 0.362998f, - -0.243138f, - 0.000000f, - 0.487500f, - 0.724300f, - -0.487500f, - 0.625000f, - 0.758600f, - 0.251591f, - 0.398046f, - -0.168108f, - 0.000000f, - 0.504900f, - 0.794500f, - -0.337400f, - 0.593800f, - 0.793100f, - 0.285899f, - 0.362998f, - -0.191032f, - 0.000000f, - 0.573300f, - 0.724300f, - -0.383000f, - 0.593800f, - 0.758600f, - 0.269464f, - -0.323693f, - -0.269464f, - 0.000000f, - 0.539900f, - -0.645700f, - -0.539900f, - 0.625000f, - 0.275900f, - 0.292632f, - -0.280594f, - -0.292632f, - 0.000000f, - 0.586000f, - -0.559600f, - -0.586000f, - 0.625000f, - 0.310300f, - 0.344099f, - -0.280594f, - -0.229919f, - 0.000000f, - 0.689100f, - -0.559600f, - -0.460400f, - 0.593800f, - 0.310300f, - 0.269464f, - -0.323693f, - -0.269464f, - 0.000000f, - 0.539900f, - -0.645700f, - -0.539900f, - 0.625000f, - 0.275900f, - 0.344099f, - -0.280594f, - -0.229919f, - 0.000000f, - 0.689100f, - -0.559600f, - -0.460400f, - 0.593800f, - 0.310300f, - 0.316857f, - -0.323693f, - -0.211717f, - 0.000000f, - 0.634900f, - -0.645700f, - -0.424200f, - 0.593800f, - 0.275900f, - 0.410257f, - -0.080891f, - -0.274125f, - 0.000000f, - 0.820600f, - -0.161200f, - -0.548300f, - 0.593800f, - 0.448300f, - 0.415124f, - -0.027069f, - -0.277377f, - 0.000000f, - 0.830300f, - -0.054000f, - -0.554700f, - 0.593800f, - 0.482800f, - 0.461262f, - -0.027069f, - -0.191061f, - 0.000000f, - 0.922500f, - -0.054000f, - -0.382100f, - 0.562500f, - 0.482800f, - 0.410257f, - -0.080891f, - -0.274125f, - 0.000000f, - 0.820600f, - -0.161200f, - -0.548300f, - 0.593800f, - 0.448300f, - 0.461262f, - -0.027069f, - -0.191061f, - 0.000000f, - 0.922500f, - -0.054000f, - -0.382100f, - 0.562500f, - 0.482800f, - 0.455853f, - -0.080891f, - -0.188821f, - 0.000000f, - 0.911800f, - -0.161200f, - -0.377700f, - 0.562500f, - 0.448300f, - 0.132744f, - 0.473826f, - -0.088697f, - 0.000000f, - 0.268000f, - 0.946600f, - -0.179100f, - 0.593800f, - 0.896600f, - 0.089370f, - 0.488310f, - -0.059715f, - 0.000000f, - 0.181400f, - 0.975900f, - -0.121200f, - 0.593800f, - 0.931000f, - 0.099303f, - 0.488310f, - -0.041132f, - 0.000000f, - 0.201600f, - 0.975900f, - -0.083500f, - 0.562500f, - 0.931000f, - 0.132744f, - 0.473826f, - -0.088697f, - 0.000000f, - 0.268000f, - 0.946600f, - -0.179100f, - 0.593800f, - 0.896600f, - 0.099303f, - 0.488310f, - -0.041132f, - 0.000000f, - 0.201600f, - 0.975900f, - -0.083500f, - 0.562500f, - 0.931000f, - 0.147497f, - 0.473826f, - -0.061095f, - 0.000000f, - 0.297800f, - 0.946600f, - -0.123300f, - 0.562500f, - 0.896600f, - 0.400580f, - -0.133764f, - -0.267659f, - 0.000000f, - 0.801400f, - -0.266600f, - -0.535400f, - 0.593800f, - 0.413800f, - 0.410257f, - -0.080891f, - -0.274125f, - 0.000000f, - 0.820600f, - -0.161200f, - -0.548300f, - 0.593800f, - 0.448300f, - 0.455853f, - -0.080891f, - -0.188821f, - 0.000000f, - 0.911800f, - -0.161200f, - -0.377700f, - 0.562500f, - 0.448300f, - 0.400580f, - -0.133764f, - -0.267659f, - 0.000000f, - 0.801400f, - -0.266600f, - -0.535400f, - 0.593800f, - 0.413800f, - 0.455853f, - -0.080891f, - -0.188821f, - 0.000000f, - 0.911800f, - -0.161200f, - -0.377700f, - 0.562500f, - 0.448300f, - 0.445101f, - -0.133764f, - -0.184367f, - 0.000000f, - 0.890400f, - -0.266600f, - -0.368800f, - 0.562500f, - 0.413800f, - 0.174562f, - 0.453788f, - -0.116638f, - 0.000000f, - 0.351400f, - 0.906300f, - -0.234800f, - 0.593800f, - 0.862100f, - 0.132744f, - 0.473826f, - -0.088697f, - 0.000000f, - 0.268000f, - 0.946600f, - -0.179100f, - 0.593800f, - 0.896600f, - 0.147497f, - 0.473826f, - -0.061095f, - 0.000000f, - 0.297800f, - 0.946600f, - -0.123300f, - 0.562500f, - 0.896600f, - 0.174562f, - 0.453788f, - -0.116638f, - 0.000000f, - 0.351400f, - 0.906300f, - -0.234800f, - 0.593800f, - 0.862100f, - 0.147497f, - 0.473826f, - -0.061095f, - 0.000000f, - 0.297800f, - 0.946600f, - -0.123300f, - 0.562500f, - 0.896600f, - 0.193962f, - 0.453788f, - -0.080342f, - 0.000000f, - 0.390500f, - 0.906300f, - -0.161700f, - 0.562500f, - 0.862100f, - 0.386207f, - -0.185069f, - -0.258056f, - 0.000000f, - 0.772800f, - -0.369000f, - -0.516300f, - 0.593800f, - 0.379300f, - 0.400580f, - -0.133764f, - -0.267659f, - 0.000000f, - 0.801400f, - -0.266600f, - -0.535400f, - 0.593800f, - 0.413800f, - 0.445101f, - -0.133764f, - -0.184367f, - 0.000000f, - 0.890400f, - -0.266600f, - -0.368800f, - 0.562500f, - 0.413800f, - 0.386207f, - -0.185069f, - -0.258056f, - 0.000000f, - 0.772800f, - -0.369000f, - -0.516300f, - 0.593800f, - 0.379300f, - 0.445101f, - -0.133764f, - -0.184367f, - 0.000000f, - 0.890400f, - -0.266600f, - -0.368800f, - 0.562500f, - 0.413800f, - 0.429130f, - -0.185069f, - -0.177751f, - 0.000000f, - 0.858700f, - -0.369000f, - -0.355700f, - 0.562500f, - 0.379300f, - 0.214333f, - 0.428429f, - -0.143213f, - 0.000000f, - 0.430700f, - 0.855300f, - -0.287800f, - 0.593800f, - 0.827600f, - 0.174562f, - 0.453788f, - -0.116638f, - 0.000000f, - 0.351400f, - 0.906300f, - -0.234800f, - 0.593800f, - 0.862100f, - 0.193962f, - 0.453788f, - -0.080342f, - 0.000000f, - 0.390500f, - 0.906300f, - -0.161700f, - 0.562500f, - 0.862100f, - 0.214333f, - 0.428429f, - -0.143213f, - 0.000000f, - 0.430700f, - 0.855300f, - -0.287800f, - 0.593800f, - 0.827600f, - 0.193962f, - 0.453788f, - -0.080342f, - 0.000000f, - 0.390500f, - 0.906300f, - -0.161700f, - 0.562500f, - 0.862100f, - 0.238154f, - 0.428429f, - -0.098647f, - 0.000000f, - 0.478600f, - 0.855300f, - -0.198200f, - 0.562500f, - 0.827600f, - 0.367306f, - -0.234204f, - -0.245426f, - 0.000000f, - 0.735200f, - -0.467000f, - -0.491300f, - 0.593800f, - 0.344800f, - 0.386207f, - -0.185069f, - -0.258056f, - 0.000000f, - 0.772800f, - -0.369000f, - -0.516300f, - 0.593800f, - 0.379300f, - 0.429130f, - -0.185069f, - -0.177751f, - 0.000000f, - 0.858700f, - -0.369000f, - -0.355700f, - 0.562500f, - 0.379300f, - 0.367306f, - -0.234204f, - -0.245426f, - 0.000000f, - 0.735200f, - -0.467000f, - -0.491300f, - 0.593800f, - 0.344800f, - 0.429130f, - -0.185069f, - -0.177751f, - 0.000000f, - 0.858700f, - -0.369000f, - -0.355700f, - 0.562500f, - 0.379300f, - 0.408128f, - -0.234204f, - -0.169052f, - 0.000000f, - 0.816900f, - -0.467000f, - -0.338400f, - 0.562500f, - 0.344800f, - 0.251591f, - 0.398046f, - -0.168108f, - 0.000000f, - 0.504900f, - 0.794500f, - -0.337400f, - 0.593800f, - 0.793100f, - 0.214333f, - 0.428429f, - -0.143213f, - 0.000000f, - 0.430700f, - 0.855300f, - -0.287800f, - 0.593800f, - 0.827600f, - 0.238154f, - 0.428429f, - -0.098647f, - 0.000000f, - 0.478600f, - 0.855300f, - -0.198200f, - 0.562500f, - 0.827600f, - 0.251591f, - 0.398046f, - -0.168108f, - 0.000000f, - 0.504900f, - 0.794500f, - -0.337400f, - 0.593800f, - 0.793100f, - 0.238154f, - 0.428429f, - -0.098647f, - 0.000000f, - 0.478600f, - 0.855300f, - -0.198200f, - 0.562500f, - 0.827600f, - 0.279553f, - 0.398046f, - -0.115795f, - 0.000000f, - 0.561100f, - 0.794500f, - -0.232400f, - 0.562500f, - 0.793100f, - 0.344099f, - -0.280594f, - -0.229919f, - 0.000000f, - 0.689100f, - -0.559600f, - -0.460400f, - 0.593800f, - 0.310300f, - 0.367306f, - -0.234204f, - -0.245426f, - 0.000000f, - 0.735200f, - -0.467000f, - -0.491300f, - 0.593800f, - 0.344800f, - 0.408128f, - -0.234204f, - -0.169052f, - 0.000000f, - 0.816900f, - -0.467000f, - -0.338400f, - 0.562500f, - 0.344800f, - 0.344099f, - -0.280594f, - -0.229919f, - 0.000000f, - 0.689100f, - -0.559600f, - -0.460400f, - 0.593800f, - 0.310300f, - 0.408128f, - -0.234204f, - -0.169052f, - 0.000000f, - 0.816900f, - -0.467000f, - -0.338400f, - 0.562500f, - 0.344800f, - 0.382342f, - -0.280594f, - -0.158371f, - 0.000000f, - 0.765600f, - -0.559600f, - -0.317100f, - 0.562500f, - 0.310300f, - 0.285899f, - 0.362998f, - -0.191032f, - 0.000000f, - 0.573300f, - 0.724300f, - -0.383000f, - 0.593800f, - 0.758600f, - 0.251591f, - 0.398046f, - -0.168108f, - 0.000000f, - 0.504900f, - 0.794500f, - -0.337400f, - 0.593800f, - 0.793100f, - 0.279553f, - 0.398046f, - -0.115795f, - 0.000000f, - 0.561100f, - 0.794500f, - -0.232400f, - 0.562500f, - 0.793100f, - 0.285899f, - 0.362998f, - -0.191032f, - 0.000000f, - 0.573300f, - 0.724300f, - -0.383000f, - 0.593800f, - 0.758600f, - 0.279553f, - 0.398046f, - -0.115795f, - 0.000000f, - 0.561100f, - 0.794500f, - -0.232400f, - 0.562500f, - 0.793100f, - 0.317674f, - 0.362998f, - -0.131585f, - 0.000000f, - 0.637000f, - 0.724300f, - -0.263800f, - 0.562500f, - 0.758600f, - 0.316857f, - -0.323693f, - -0.211717f, - 0.000000f, - 0.634900f, - -0.645700f, - -0.424200f, - 0.593800f, - 0.275900f, - 0.344099f, - -0.280594f, - -0.229919f, - 0.000000f, - 0.689100f, - -0.559600f, - -0.460400f, - 0.593800f, - 0.310300f, - 0.382342f, - -0.280594f, - -0.158371f, - 0.000000f, - 0.765600f, - -0.559600f, - -0.317100f, - 0.562500f, - 0.310300f, - 0.316857f, - -0.323693f, - -0.211717f, - 0.000000f, - 0.634900f, - -0.645700f, - -0.424200f, - 0.593800f, - 0.275900f, - 0.382342f, - -0.280594f, - -0.158371f, - 0.000000f, - 0.765600f, - -0.559600f, - -0.317100f, - 0.562500f, - 0.310300f, - 0.352072f, - -0.323693f, - -0.145833f, - 0.000000f, - 0.705400f, - -0.645700f, - -0.292200f, - 0.562500f, - 0.275900f, - 0.316857f, - 0.323693f, - -0.211717f, - 0.000000f, - 0.634900f, - 0.645700f, - -0.424200f, - 0.593800f, - 0.724100f, - 0.285899f, - 0.362998f, - -0.191032f, - 0.000000f, - 0.573300f, - 0.724300f, - -0.383000f, - 0.593800f, - 0.758600f, - 0.317674f, - 0.362998f, - -0.131585f, - 0.000000f, - 0.637000f, - 0.724300f, - -0.263800f, - 0.562500f, - 0.758600f, - 0.316857f, - 0.323693f, - -0.211717f, - 0.000000f, - 0.634900f, - 0.645700f, - -0.424200f, - 0.593800f, - 0.724100f, - 0.317674f, - 0.362998f, - -0.131585f, - 0.000000f, - 0.637000f, - 0.724300f, - -0.263800f, - 0.562500f, - 0.758600f, - 0.352072f, - 0.323693f, - -0.145833f, - 0.000000f, - 0.705400f, - 0.645700f, - -0.292200f, - 0.562500f, - 0.724100f, - 0.285900f, - -0.362998f, - -0.191032f, - 0.000000f, - 0.573300f, - -0.724300f, - -0.383000f, - 0.593800f, - 0.241400f, - 0.316857f, - -0.323693f, - -0.211717f, - 0.000000f, - 0.634900f, - -0.645700f, - -0.424200f, - 0.593800f, - 0.275900f, - 0.352072f, - -0.323693f, - -0.145833f, - 0.000000f, - 0.705400f, - -0.645700f, - -0.292200f, - 0.562500f, - 0.275900f, - 0.285900f, - -0.362998f, - -0.191032f, - 0.000000f, - 0.573300f, - -0.724300f, - -0.383000f, - 0.593800f, - 0.241400f, - 0.352072f, - -0.323693f, - -0.145833f, - 0.000000f, - 0.705400f, - -0.645700f, - -0.292200f, - 0.562500f, - 0.275900f, - 0.317675f, - -0.362998f, - -0.131585f, - 0.000000f, - 0.637000f, - -0.724300f, - -0.263800f, - 0.562500f, - 0.241400f, - 0.344098f, - 0.280594f, - -0.229919f, - 0.000000f, - 0.689100f, - 0.559600f, - -0.460400f, - 0.593800f, - 0.689700f, - 0.316857f, - 0.323693f, - -0.211717f, - 0.000000f, - 0.634900f, - 0.645700f, - -0.424200f, - 0.593800f, - 0.724100f, - 0.352072f, - 0.323693f, - -0.145833f, - 0.000000f, - 0.705400f, - 0.645700f, - -0.292200f, - 0.562500f, - 0.724100f, - 0.344098f, - 0.280594f, - -0.229919f, - 0.000000f, - 0.689100f, - 0.559600f, - -0.460400f, - 0.593800f, - 0.689700f, - 0.352072f, - 0.323693f, - -0.145833f, - 0.000000f, - 0.705400f, - 0.645700f, - -0.292200f, - 0.562500f, - 0.724100f, - 0.382342f, - 0.280594f, - -0.158371f, - 0.000000f, - 0.765600f, - 0.559600f, - -0.317100f, - 0.562500f, - 0.689700f, - 0.251591f, - -0.398046f, - -0.168108f, - 0.000000f, - 0.505000f, - -0.794500f, - -0.337400f, - 0.593800f, - 0.206900f, - 0.285900f, - -0.362998f, - -0.191032f, - 0.000000f, - 0.573300f, - -0.724300f, - -0.383000f, - 0.593800f, - 0.241400f, - 0.317675f, - -0.362998f, - -0.131585f, - 0.000000f, - 0.637000f, - -0.724300f, - -0.263800f, - 0.562500f, - 0.241400f, - 0.251591f, - -0.398046f, - -0.168108f, - 0.000000f, - 0.505000f, - -0.794500f, - -0.337400f, - 0.593800f, - 0.206900f, - 0.317675f, - -0.362998f, - -0.131585f, - 0.000000f, - 0.637000f, - -0.724300f, - -0.263800f, - 0.562500f, - 0.241400f, - 0.279553f, - -0.398046f, - -0.115795f, - 0.000000f, - 0.561100f, - -0.794500f, - -0.232400f, - 0.562500f, - 0.206900f, - 0.367306f, - 0.234204f, - -0.245426f, - 0.000000f, - 0.735200f, - 0.467000f, - -0.491300f, - 0.593800f, - 0.655200f, - 0.344098f, - 0.280594f, - -0.229919f, - 0.000000f, - 0.689100f, - 0.559600f, - -0.460400f, - 0.593800f, - 0.689700f, - 0.382342f, - 0.280594f, - -0.158371f, - 0.000000f, - 0.765600f, - 0.559600f, - -0.317100f, - 0.562500f, - 0.689700f, - 0.367306f, - 0.234204f, - -0.245426f, - 0.000000f, - 0.735200f, - 0.467000f, - -0.491300f, - 0.593800f, - 0.655200f, - 0.382342f, - 0.280594f, - -0.158371f, - 0.000000f, - 0.765600f, - 0.559600f, - -0.317100f, - 0.562500f, - 0.689700f, - 0.408128f, - 0.234204f, - -0.169052f, - 0.000000f, - 0.816900f, - 0.467000f, - -0.338400f, - 0.562500f, - 0.655200f, - 0.214333f, - -0.428429f, - -0.143213f, - 0.000000f, - 0.430700f, - -0.855300f, - -0.287800f, - 0.593800f, - 0.172400f, - 0.251591f, - -0.398046f, - -0.168108f, - 0.000000f, - 0.505000f, - -0.794500f, - -0.337400f, - 0.593800f, - 0.206900f, - 0.279553f, - -0.398046f, - -0.115795f, - 0.000000f, - 0.561100f, - -0.794500f, - -0.232400f, - 0.562500f, - 0.206900f, - 0.214333f, - -0.428429f, - -0.143213f, - 0.000000f, - 0.430700f, - -0.855300f, - -0.287800f, - 0.593800f, - 0.172400f, - 0.279553f, - -0.398046f, - -0.115795f, - 0.000000f, - 0.561100f, - -0.794500f, - -0.232400f, - 0.562500f, - 0.206900f, - 0.238154f, - -0.428429f, - -0.098647f, - 0.000000f, - 0.478600f, - -0.855300f, - -0.198200f, - 0.562500f, - 0.172400f, - 0.386207f, - 0.185069f, - -0.258056f, - 0.000000f, - 0.772800f, - 0.369000f, - -0.516300f, - 0.593800f, - 0.620700f, - 0.367306f, - 0.234204f, - -0.245426f, - 0.000000f, - 0.735200f, - 0.467000f, - -0.491300f, - 0.593800f, - 0.655200f, - 0.408128f, - 0.234204f, - -0.169052f, - 0.000000f, - 0.816900f, - 0.467000f, - -0.338400f, - 0.562500f, - 0.655200f, - 0.386207f, - 0.185069f, - -0.258056f, - 0.000000f, - 0.772800f, - 0.369000f, - -0.516300f, - 0.593800f, - 0.620700f, - 0.408128f, - 0.234204f, - -0.169052f, - 0.000000f, - 0.816900f, - 0.467000f, - -0.338400f, - 0.562500f, - 0.655200f, - 0.429130f, - 0.185069f, - -0.177751f, - 0.000000f, - 0.858700f, - 0.369000f, - -0.355700f, - 0.562500f, - 0.620700f, - 0.174562f, - -0.453788f, - -0.116639f, - 0.000000f, - 0.351400f, - -0.906300f, - -0.234800f, - 0.593800f, - 0.137900f, - 0.214333f, - -0.428429f, - -0.143213f, - 0.000000f, - 0.430700f, - -0.855300f, - -0.287800f, - 0.593800f, - 0.172400f, - 0.238154f, - -0.428429f, - -0.098647f, - 0.000000f, - 0.478600f, - -0.855300f, - -0.198200f, - 0.562500f, - 0.172400f, - 0.174562f, - -0.453788f, - -0.116639f, - 0.000000f, - 0.351400f, - -0.906300f, - -0.234800f, - 0.593800f, - 0.137900f, - 0.238154f, - -0.428429f, - -0.098647f, - 0.000000f, - 0.478600f, - -0.855300f, - -0.198200f, - 0.562500f, - 0.172400f, - 0.193963f, - -0.453788f, - -0.080342f, - 0.000000f, - 0.390500f, - -0.906300f, - -0.161700f, - 0.562500f, - 0.137900f, - 0.400580f, - 0.133764f, - -0.267659f, - 0.000000f, - 0.801400f, - 0.266600f, - -0.535400f, - 0.593800f, - 0.586200f, - 0.386207f, - 0.185069f, - -0.258056f, - 0.000000f, - 0.772800f, - 0.369000f, - -0.516300f, - 0.593800f, - 0.620700f, - 0.429130f, - 0.185069f, - -0.177751f, - 0.000000f, - 0.858700f, - 0.369000f, - -0.355700f, - 0.562500f, - 0.620700f, - 0.400580f, - 0.133764f, - -0.267659f, - 0.000000f, - 0.801400f, - 0.266600f, - -0.535400f, - 0.593800f, - 0.586200f, - 0.429130f, - 0.185069f, - -0.177751f, - 0.000000f, - 0.858700f, - 0.369000f, - -0.355700f, - 0.562500f, - 0.620700f, - 0.445101f, - 0.133764f, - -0.184367f, - 0.000000f, - 0.890400f, - 0.266600f, - -0.368800f, - 0.562500f, - 0.586200f, - 0.132744f, - -0.473826f, - -0.088697f, - 0.000000f, - 0.268000f, - -0.946600f, - -0.179100f, - 0.593800f, - 0.103400f, - 0.174562f, - -0.453788f, - -0.116639f, - 0.000000f, - 0.351400f, - -0.906300f, - -0.234800f, - 0.593800f, - 0.137900f, - 0.193963f, - -0.453788f, - -0.080342f, - 0.000000f, - 0.390500f, - -0.906300f, - -0.161700f, - 0.562500f, - 0.137900f, - 0.132744f, - -0.473826f, - -0.088697f, - 0.000000f, - 0.268000f, - -0.946600f, - -0.179100f, - 0.593800f, - 0.103400f, - 0.193963f, - -0.453788f, - -0.080342f, - 0.000000f, - 0.390500f, - -0.906300f, - -0.161700f, - 0.562500f, - 0.137900f, - 0.147498f, - -0.473826f, - -0.061095f, - 0.000000f, - 0.297800f, - -0.946600f, - -0.123300f, - 0.562500f, - 0.103400f, - 0.410257f, - 0.080891f, - -0.274125f, - 0.000000f, - 0.820600f, - 0.161200f, - -0.548300f, - 0.593800f, - 0.551700f, - 0.400580f, - 0.133764f, - -0.267659f, - 0.000000f, - 0.801400f, - 0.266600f, - -0.535400f, - 0.593800f, - 0.586200f, - 0.445101f, - 0.133764f, - -0.184367f, - 0.000000f, - 0.890400f, - 0.266600f, - -0.368800f, - 0.562500f, - 0.586200f, - 0.410257f, - 0.080891f, - -0.274125f, - 0.000000f, - 0.820600f, - 0.161200f, - -0.548300f, - 0.593800f, - 0.551700f, - 0.445101f, - 0.133764f, - -0.184367f, - 0.000000f, - 0.890400f, - 0.266600f, - -0.368800f, - 0.562500f, - 0.586200f, - 0.455853f, - 0.080891f, - -0.188821f, - 0.000000f, - 0.911800f, - 0.161200f, - -0.377700f, - 0.562500f, - 0.551700f, - 0.089370f, - -0.488310f, - -0.059715f, - 0.000000f, - 0.181400f, - -0.975900f, - -0.121200f, - 0.593800f, - 0.069000f, - 0.132744f, - -0.473826f, - -0.088697f, - 0.000000f, - 0.268000f, - -0.946600f, - -0.179100f, - 0.593800f, - 0.103400f, - 0.147498f, - -0.473826f, - -0.061095f, - 0.000000f, - 0.297800f, - -0.946600f, - -0.123300f, - 0.562500f, - 0.103400f, - 0.089370f, - -0.488310f, - -0.059715f, - 0.000000f, - 0.181400f, - -0.975900f, - -0.121200f, - 0.593800f, - 0.069000f, - 0.147498f, - -0.473826f, - -0.061095f, - 0.000000f, - 0.297800f, - -0.946600f, - -0.123300f, - 0.562500f, - 0.103400f, - 0.099303f, - -0.488310f, - -0.041133f, - 0.000000f, - 0.201600f, - -0.975900f, - -0.083500f, - 0.562500f, - 0.069000f, - 0.415124f, - 0.027069f, - -0.277377f, - 0.000000f, - 0.830300f, - 0.054000f, - -0.554700f, - 0.593800f, - 0.517200f, - 0.410257f, - 0.080891f, - -0.274125f, - 0.000000f, - 0.820600f, - 0.161200f, - -0.548300f, - 0.593800f, - 0.551700f, - 0.455853f, - 0.080891f, - -0.188821f, - 0.000000f, - 0.911800f, - 0.161200f, - -0.377700f, - 0.562500f, - 0.551700f, - 0.415124f, - 0.027069f, - -0.277377f, - 0.000000f, - 0.830300f, - 0.054000f, - -0.554700f, - 0.593800f, - 0.517200f, - 0.455853f, - 0.080891f, - -0.188821f, - 0.000000f, - 0.911800f, - 0.161200f, - -0.377700f, - 0.562500f, - 0.551700f, - 0.461262f, - 0.027069f, - -0.191061f, - 0.000000f, - 0.922500f, - 0.054000f, - -0.382100f, - 0.562500f, - 0.517200f, - 0.044948f, - 0.497069f, - -0.030034f, - 0.000000f, - 0.092700f, - 0.993700f, - -0.061900f, - 0.450800f, - 0.962300f, - -0.000000f, - 0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - 1.000000f, - 0.000000f, - 0.423900f, - 0.960300f, - 0.049943f, - 0.497069f, - -0.020688f, - 0.000000f, - 0.103000f, - 0.993700f, - -0.042600f, - 0.452600f, - 0.962300f, - 0.044948f, - -0.497069f, - -0.030034f, - 0.000000f, - 0.092700f, - -0.993700f, - -0.061900f, - 0.593800f, - 0.034500f, - 0.089370f, - -0.488310f, - -0.059715f, - 0.000000f, - 0.181400f, - -0.975900f, - -0.121200f, - 0.593800f, - 0.069000f, - 0.099303f, - -0.488310f, - -0.041133f, - 0.000000f, - 0.201600f, - -0.975900f, - -0.083500f, - 0.562500f, - 0.069000f, - 0.044948f, - -0.497069f, - -0.030034f, - 0.000000f, - 0.092700f, - -0.993700f, - -0.061900f, - 0.593800f, - 0.034500f, - 0.099303f, - -0.488310f, - -0.041133f, - 0.000000f, - 0.201600f, - -0.975900f, - -0.083500f, - 0.562500f, - 0.069000f, - 0.049944f, - -0.497069f, - -0.020688f, - 0.000000f, - 0.103000f, - -0.993700f, - -0.042600f, - 0.562500f, - 0.034500f, - 0.415124f, - -0.027069f, - -0.277377f, - 0.000000f, - 0.830300f, - -0.054000f, - -0.554700f, - 0.593800f, - 0.482800f, - 0.415124f, - 0.027069f, - -0.277377f, - 0.000000f, - 0.830300f, - 0.054000f, - -0.554700f, - 0.593800f, - 0.517200f, - 0.461262f, - 0.027069f, - -0.191061f, - 0.000000f, - 0.922500f, - 0.054000f, - -0.382100f, - 0.562500f, - 0.517200f, - 0.415124f, - -0.027069f, - -0.277377f, - 0.000000f, - 0.830300f, - -0.054000f, - -0.554700f, - 0.593800f, - 0.482800f, - 0.461262f, - 0.027069f, - -0.191061f, - 0.000000f, - 0.922500f, - 0.054000f, - -0.382100f, - 0.562500f, - 0.517200f, - 0.461262f, - -0.027069f, - -0.191061f, - 0.000000f, - 0.922500f, - -0.054000f, - -0.382100f, - 0.562500f, - 0.482800f, - 0.089370f, - 0.488310f, - -0.059715f, - 0.000000f, - 0.181400f, - 0.975900f, - -0.121200f, - 0.593800f, - 0.931000f, - 0.044948f, - 0.497069f, - -0.030034f, - 0.000000f, - 0.092700f, - 0.993700f, - -0.061900f, - 0.593800f, - 0.965500f, - 0.049943f, - 0.497069f, - -0.020688f, - 0.000000f, - 0.103000f, - 0.993700f, - -0.042600f, - 0.562500f, - 0.965500f, - 0.089370f, - 0.488310f, - -0.059715f, - 0.000000f, - 0.181400f, - 0.975900f, - -0.121200f, - 0.593800f, - 0.931000f, - 0.049943f, - 0.497069f, - -0.020688f, - 0.000000f, - 0.103000f, - 0.993700f, - -0.042600f, - 0.562500f, - 0.965500f, - 0.099303f, - 0.488310f, - -0.041132f, - 0.000000f, - 0.201600f, - 0.975900f, - -0.083500f, - 0.562500f, - 0.931000f, - -0.000000f, - -0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - -1.000000f, - 0.000000f, - 0.495500f, - 0.051000f, - 0.044948f, - -0.497069f, - -0.030034f, - 0.000000f, - 0.092700f, - -0.993700f, - -0.061900f, - 0.460200f, - 0.053800f, - 0.049944f, - -0.497069f, - -0.020688f, - 0.000000f, - 0.103000f, - -0.993700f, - -0.042600f, - 0.457500f, - 0.053800f, - 0.238154f, - -0.428429f, - -0.098647f, - 0.000000f, - 0.478600f, - -0.855300f, - -0.198200f, - 0.562500f, - 0.172400f, - 0.279553f, - -0.398046f, - -0.115795f, - 0.000000f, - 0.561100f, - -0.794500f, - -0.232400f, - 0.562500f, - 0.206900f, - 0.296772f, - -0.398046f, - -0.059032f, - 0.000000f, - 0.595600f, - -0.794500f, - -0.118500f, - 0.531200f, - 0.206900f, - 0.238154f, - -0.428429f, - -0.098647f, - 0.000000f, - 0.478600f, - -0.855300f, - -0.198200f, - 0.562500f, - 0.172400f, - 0.296772f, - -0.398046f, - -0.059032f, - 0.000000f, - 0.595600f, - -0.794500f, - -0.118500f, - 0.531200f, - 0.206900f, - 0.252823f, - -0.428429f, - -0.050290f, - 0.000000f, - 0.508100f, - -0.855300f, - -0.101000f, - 0.531200f, - 0.172400f, - 0.429130f, - 0.185069f, - -0.177751f, - 0.000000f, - 0.858700f, - 0.369000f, - -0.355700f, - 0.562500f, - 0.620700f, - 0.408128f, - 0.234204f, - -0.169052f, - 0.000000f, - 0.816900f, - 0.467000f, - -0.338400f, - 0.562500f, - 0.655200f, - 0.433267f, - 0.234204f, - -0.086182f, - 0.000000f, - 0.867200f, - 0.467000f, - -0.172500f, - 0.531200f, - 0.655200f, - 0.429130f, - 0.185069f, - -0.177751f, - 0.000000f, - 0.858700f, - 0.369000f, - -0.355700f, - 0.562500f, - 0.620700f, - 0.433267f, - 0.234204f, - -0.086182f, - 0.000000f, - 0.867200f, - 0.467000f, - -0.172500f, - 0.531200f, - 0.655200f, - 0.455563f, - 0.185069f, - -0.090617f, - 0.000000f, - 0.911600f, - 0.369000f, - -0.181300f, - 0.531200f, - 0.620700f, - 0.193963f, - -0.453788f, - -0.080342f, - 0.000000f, - 0.390500f, - -0.906300f, - -0.161700f, - 0.562500f, - 0.137900f, - 0.238154f, - -0.428429f, - -0.098647f, - 0.000000f, - 0.478600f, - -0.855300f, - -0.198200f, - 0.562500f, - 0.172400f, - 0.252823f, - -0.428429f, - -0.050290f, - 0.000000f, - 0.508100f, - -0.855300f, - -0.101000f, - 0.531200f, - 0.172400f, - 0.193963f, - -0.453788f, - -0.080342f, - 0.000000f, - 0.390500f, - -0.906300f, - -0.161700f, - 0.562500f, - 0.137900f, - 0.252823f, - -0.428429f, - -0.050290f, - 0.000000f, - 0.508100f, - -0.855300f, - -0.101000f, - 0.531200f, - 0.172400f, - 0.205910f, - -0.453788f, - -0.040958f, - 0.000000f, - 0.414500f, - -0.906300f, - -0.082400f, - 0.531200f, - 0.137900f, - 0.445101f, - 0.133764f, - -0.184367f, - 0.000000f, - 0.890400f, - 0.266600f, - -0.368800f, - 0.562500f, - 0.586200f, - 0.429130f, - 0.185069f, - -0.177751f, - 0.000000f, - 0.858700f, - 0.369000f, - -0.355700f, - 0.562500f, - 0.620700f, - 0.455563f, - 0.185069f, - -0.090617f, - 0.000000f, - 0.911600f, - 0.369000f, - -0.181300f, - 0.531200f, - 0.620700f, - 0.445101f, - 0.133764f, - -0.184367f, - 0.000000f, - 0.890400f, - 0.266600f, - -0.368800f, - 0.562500f, - 0.586200f, - 0.455563f, - 0.185069f, - -0.090617f, - 0.000000f, - 0.911600f, - 0.369000f, - -0.181300f, - 0.531200f, - 0.620700f, - 0.472517f, - 0.133764f, - -0.093989f, - 0.000000f, - 0.945200f, - 0.266600f, - -0.188000f, - 0.531200f, - 0.586200f, - 0.147498f, - -0.473826f, - -0.061095f, - 0.000000f, - 0.297800f, - -0.946600f, - -0.123300f, - 0.562500f, - 0.103400f, - 0.193963f, - -0.453788f, - -0.080342f, - 0.000000f, - 0.390500f, - -0.906300f, - -0.161700f, - 0.562500f, - 0.137900f, - 0.205910f, - -0.453788f, - -0.040958f, - 0.000000f, - 0.414500f, - -0.906300f, - -0.082400f, - 0.531200f, - 0.137900f, - 0.147498f, - -0.473826f, - -0.061095f, - 0.000000f, - 0.297800f, - -0.946600f, - -0.123300f, - 0.562500f, - 0.103400f, - 0.205910f, - -0.453788f, - -0.040958f, - 0.000000f, - 0.414500f, - -0.906300f, - -0.082400f, - 0.531200f, - 0.137900f, - 0.156583f, - -0.473826f, - -0.031147f, - 0.000000f, - 0.316100f, - -0.946600f, - -0.062900f, - 0.531300f, - 0.103400f, - 0.455853f, - 0.080891f, - -0.188821f, - 0.000000f, - 0.911800f, - 0.161200f, - -0.377700f, - 0.562500f, - 0.551700f, - 0.445101f, - 0.133764f, - -0.184367f, - 0.000000f, - 0.890400f, - 0.266600f, - -0.368800f, - 0.562500f, - 0.586200f, - 0.472517f, - 0.133764f, - -0.093989f, - 0.000000f, - 0.945200f, - 0.266600f, - -0.188000f, - 0.531200f, - 0.586200f, - 0.455853f, - 0.080891f, - -0.188821f, - 0.000000f, - 0.911800f, - 0.161200f, - -0.377700f, - 0.562500f, - 0.551700f, - 0.472517f, - 0.133764f, - -0.093989f, - 0.000000f, - 0.945200f, - 0.266600f, - -0.188000f, - 0.531200f, - 0.586200f, - 0.483932f, - 0.080891f, - -0.096260f, - 0.000000f, - 0.967900f, - 0.161200f, - -0.192500f, - 0.531200f, - 0.551700f, - 0.099303f, - -0.488310f, - -0.041133f, - 0.000000f, - 0.201600f, - -0.975900f, - -0.083500f, - 0.562500f, - 0.069000f, - 0.147498f, - -0.473826f, - -0.061095f, - 0.000000f, - 0.297800f, - -0.946600f, - -0.123300f, - 0.562500f, - 0.103400f, - 0.156583f, - -0.473826f, - -0.031147f, - 0.000000f, - 0.316100f, - -0.946600f, - -0.062900f, - 0.531300f, - 0.103400f, - 0.099303f, - -0.488310f, - -0.041133f, - 0.000000f, - 0.201600f, - -0.975900f, - -0.083500f, - 0.562500f, - 0.069000f, - 0.156583f, - -0.473826f, - -0.031147f, - 0.000000f, - 0.316100f, - -0.946600f, - -0.062900f, - 0.531300f, - 0.103400f, - 0.105420f, - -0.488310f, - -0.020970f, - 0.000000f, - 0.214000f, - -0.975900f, - -0.042500f, - 0.531300f, - 0.069000f, - 0.461262f, - 0.027069f, - -0.191061f, - 0.000000f, - 0.922500f, - 0.054000f, - -0.382100f, - 0.562500f, - 0.517200f, - 0.455853f, - 0.080891f, - -0.188821f, - 0.000000f, - 0.911800f, - 0.161200f, - -0.377700f, - 0.562500f, - 0.551700f, - 0.483932f, - 0.080891f, - -0.096260f, - 0.000000f, - 0.967900f, - 0.161200f, - -0.192500f, - 0.531200f, - 0.551700f, - 0.461262f, - 0.027069f, - -0.191061f, - 0.000000f, - 0.922500f, - 0.054000f, - -0.382100f, - 0.562500f, - 0.517200f, - 0.483932f, - 0.080891f, - -0.096260f, - 0.000000f, - 0.967900f, - 0.161200f, - -0.192500f, - 0.531200f, - 0.551700f, - 0.489673f, - 0.027069f, - -0.097402f, - 0.000000f, - 0.979300f, - 0.054000f, - -0.194800f, - 0.531200f, - 0.517200f, - 0.049943f, - 0.497069f, - -0.020688f, - 0.000000f, - 0.103000f, - 0.993700f, - -0.042600f, - 0.452600f, - 0.962300f, - -0.000000f, - 0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - 1.000000f, - 0.000000f, - 0.423900f, - 0.960300f, - 0.053020f, - 0.497069f, - -0.010546f, - 0.000000f, - 0.109300f, - 0.993700f, - -0.021700f, - 0.454400f, - 0.962300f, - 0.049944f, - -0.497069f, - -0.020688f, - 0.000000f, - 0.103000f, - -0.993700f, - -0.042600f, - 0.562500f, - 0.034500f, - 0.099303f, - -0.488310f, - -0.041133f, - 0.000000f, - 0.201600f, - -0.975900f, - -0.083500f, - 0.562500f, - 0.069000f, - 0.105420f, - -0.488310f, - -0.020970f, - 0.000000f, - 0.214000f, - -0.975900f, - -0.042500f, - 0.531300f, - 0.069000f, - 0.049944f, - -0.497069f, - -0.020688f, - 0.000000f, - 0.103000f, - -0.993700f, - -0.042600f, - 0.562500f, - 0.034500f, - 0.105420f, - -0.488310f, - -0.020970f, - 0.000000f, - 0.214000f, - -0.975900f, - -0.042500f, - 0.531300f, - 0.069000f, - 0.053020f, - -0.497069f, - -0.010546f, - 0.000000f, - 0.109300f, - -0.993700f, - -0.021700f, - 0.531300f, - 0.034500f, - 0.461262f, - -0.027069f, - -0.191061f, - 0.000000f, - 0.922500f, - -0.054000f, - -0.382100f, - 0.562500f, - 0.482800f, - 0.461262f, - 0.027069f, - -0.191061f, - 0.000000f, - 0.922500f, - 0.054000f, - -0.382100f, - 0.562500f, - 0.517200f, - 0.489673f, - 0.027069f, - -0.097402f, - 0.000000f, - 0.979300f, - 0.054000f, - -0.194800f, - 0.531200f, - 0.517200f, - 0.461262f, - -0.027069f, - -0.191061f, - 0.000000f, - 0.922500f, - -0.054000f, - -0.382100f, - 0.562500f, - 0.482800f, - 0.489673f, - 0.027069f, - -0.097402f, - 0.000000f, - 0.979300f, - 0.054000f, - -0.194800f, - 0.531200f, - 0.517200f, - 0.489673f, - -0.027069f, - -0.097402f, - 0.000000f, - 0.979300f, - -0.054000f, - -0.194800f, - 0.531200f, - 0.482800f, - 0.099303f, - 0.488310f, - -0.041132f, - 0.000000f, - 0.201600f, - 0.975900f, - -0.083500f, - 0.562500f, - 0.931000f, - 0.049943f, - 0.497069f, - -0.020688f, - 0.000000f, - 0.103000f, - 0.993700f, - -0.042600f, - 0.562500f, - 0.965500f, - 0.053020f, - 0.497069f, - -0.010546f, - 0.000000f, - 0.109300f, - 0.993700f, - -0.021700f, - 0.531300f, - 0.965500f, - 0.099303f, - 0.488310f, - -0.041132f, - 0.000000f, - 0.201600f, - 0.975900f, - -0.083500f, - 0.562500f, - 0.931000f, - 0.053020f, - 0.497069f, - -0.010546f, - 0.000000f, - 0.109300f, - 0.993700f, - -0.021700f, - 0.531300f, - 0.965500f, - 0.105419f, - 0.488310f, - -0.020969f, - 0.000000f, - 0.214000f, - 0.975900f, - -0.042500f, - 0.531300f, - 0.931000f, - -0.000000f, - -0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - -1.000000f, - 0.000000f, - 0.495500f, - 0.051000f, - 0.049944f, - -0.497069f, - -0.020688f, - 0.000000f, - 0.103000f, - -0.993700f, - -0.042600f, - 0.457500f, - 0.053800f, - 0.053020f, - -0.497069f, - -0.010546f, - 0.000000f, - 0.109300f, - -0.993700f, - -0.021700f, - 0.454900f, - 0.053800f, - 0.455853f, - -0.080891f, - -0.188821f, - 0.000000f, - 0.911800f, - -0.161200f, - -0.377700f, - 0.562500f, - 0.448300f, - 0.461262f, - -0.027069f, - -0.191061f, - 0.000000f, - 0.922500f, - -0.054000f, - -0.382100f, - 0.562500f, - 0.482800f, - 0.489673f, - -0.027069f, - -0.097402f, - 0.000000f, - 0.979300f, - -0.054000f, - -0.194800f, - 0.531200f, - 0.482800f, - 0.455853f, - -0.080891f, - -0.188821f, - 0.000000f, - 0.911800f, - -0.161200f, - -0.377700f, - 0.562500f, - 0.448300f, - 0.489673f, - -0.027069f, - -0.097402f, - 0.000000f, - 0.979300f, - -0.054000f, - -0.194800f, - 0.531200f, - 0.482800f, - 0.483932f, - -0.080891f, - -0.096260f, - 0.000000f, - 0.967900f, - -0.161200f, - -0.192500f, - 0.531200f, - 0.448300f, - 0.147497f, - 0.473826f, - -0.061095f, - 0.000000f, - 0.297800f, - 0.946600f, - -0.123300f, - 0.562500f, - 0.896600f, - 0.099303f, - 0.488310f, - -0.041132f, - 0.000000f, - 0.201600f, - 0.975900f, - -0.083500f, - 0.562500f, - 0.931000f, - 0.105419f, - 0.488310f, - -0.020969f, - 0.000000f, - 0.214000f, - 0.975900f, - -0.042500f, - 0.531300f, - 0.931000f, - 0.147497f, - 0.473826f, - -0.061095f, - 0.000000f, - 0.297800f, - 0.946600f, - -0.123300f, - 0.562500f, - 0.896600f, - 0.105419f, - 0.488310f, - -0.020969f, - 0.000000f, - 0.214000f, - 0.975900f, - -0.042500f, - 0.531300f, - 0.931000f, - 0.156582f, - 0.473826f, - -0.031146f, - 0.000000f, - 0.316100f, - 0.946600f, - -0.062900f, - 0.531300f, - 0.896600f, - 0.445101f, - -0.133764f, - -0.184367f, - 0.000000f, - 0.890400f, - -0.266600f, - -0.368800f, - 0.562500f, - 0.413800f, - 0.455853f, - -0.080891f, - -0.188821f, - 0.000000f, - 0.911800f, - -0.161200f, - -0.377700f, - 0.562500f, - 0.448300f, - 0.483932f, - -0.080891f, - -0.096260f, - 0.000000f, - 0.967900f, - -0.161200f, - -0.192500f, - 0.531200f, - 0.448300f, - 0.445101f, - -0.133764f, - -0.184367f, - 0.000000f, - 0.890400f, - -0.266600f, - -0.368800f, - 0.562500f, - 0.413800f, - 0.483932f, - -0.080891f, - -0.096260f, - 0.000000f, - 0.967900f, - -0.161200f, - -0.192500f, - 0.531200f, - 0.448300f, - 0.472517f, - -0.133764f, - -0.093989f, - 0.000000f, - 0.945200f, - -0.266600f, - -0.188000f, - 0.531200f, - 0.413800f, - 0.193962f, - 0.453788f, - -0.080342f, - 0.000000f, - 0.390500f, - 0.906300f, - -0.161700f, - 0.562500f, - 0.862100f, - 0.147497f, - 0.473826f, - -0.061095f, - 0.000000f, - 0.297800f, - 0.946600f, - -0.123300f, - 0.562500f, - 0.896600f, - 0.156582f, - 0.473826f, - -0.031146f, - 0.000000f, - 0.316100f, - 0.946600f, - -0.062900f, - 0.531300f, - 0.896600f, - 0.193962f, - 0.453788f, - -0.080342f, - 0.000000f, - 0.390500f, - 0.906300f, - -0.161700f, - 0.562500f, - 0.862100f, - 0.156582f, - 0.473826f, - -0.031146f, - 0.000000f, - 0.316100f, - 0.946600f, - -0.062900f, - 0.531300f, - 0.896600f, - 0.205910f, - 0.453788f, - -0.040958f, - 0.000000f, - 0.414500f, - 0.906300f, - -0.082400f, - 0.531300f, - 0.862100f, - 0.429130f, - -0.185069f, - -0.177751f, - 0.000000f, - 0.858700f, - -0.369000f, - -0.355700f, - 0.562500f, - 0.379300f, - 0.445101f, - -0.133764f, - -0.184367f, - 0.000000f, - 0.890400f, - -0.266600f, - -0.368800f, - 0.562500f, - 0.413800f, - 0.472517f, - -0.133764f, - -0.093989f, - 0.000000f, - 0.945200f, - -0.266600f, - -0.188000f, - 0.531200f, - 0.413800f, - 0.429130f, - -0.185069f, - -0.177751f, - 0.000000f, - 0.858700f, - -0.369000f, - -0.355700f, - 0.562500f, - 0.379300f, - 0.472517f, - -0.133764f, - -0.093989f, - 0.000000f, - 0.945200f, - -0.266600f, - -0.188000f, - 0.531200f, - 0.413800f, - 0.455563f, - -0.185069f, - -0.090617f, - 0.000000f, - 0.911600f, - -0.369000f, - -0.181300f, - 0.531200f, - 0.379300f, - 0.238154f, - 0.428429f, - -0.098647f, - 0.000000f, - 0.478600f, - 0.855300f, - -0.198200f, - 0.562500f, - 0.827600f, - 0.193962f, - 0.453788f, - -0.080342f, - 0.000000f, - 0.390500f, - 0.906300f, - -0.161700f, - 0.562500f, - 0.862100f, - 0.205910f, - 0.453788f, - -0.040958f, - 0.000000f, - 0.414500f, - 0.906300f, - -0.082400f, - 0.531300f, - 0.862100f, - 0.238154f, - 0.428429f, - -0.098647f, - 0.000000f, - 0.478600f, - 0.855300f, - -0.198200f, - 0.562500f, - 0.827600f, - 0.205910f, - 0.453788f, - -0.040958f, - 0.000000f, - 0.414500f, - 0.906300f, - -0.082400f, - 0.531300f, - 0.862100f, - 0.252823f, - 0.428429f, - -0.050290f, - 0.000000f, - 0.508100f, - 0.855300f, - -0.101000f, - 0.531300f, - 0.827600f, - 0.408128f, - -0.234204f, - -0.169052f, - 0.000000f, - 0.816900f, - -0.467000f, - -0.338400f, - 0.562500f, - 0.344800f, - 0.429130f, - -0.185069f, - -0.177751f, - 0.000000f, - 0.858700f, - -0.369000f, - -0.355700f, - 0.562500f, - 0.379300f, - 0.455563f, - -0.185069f, - -0.090617f, - 0.000000f, - 0.911600f, - -0.369000f, - -0.181300f, - 0.531200f, - 0.379300f, - 0.408128f, - -0.234204f, - -0.169052f, - 0.000000f, - 0.816900f, - -0.467000f, - -0.338400f, - 0.562500f, - 0.344800f, - 0.455563f, - -0.185069f, - -0.090617f, - 0.000000f, - 0.911600f, - -0.369000f, - -0.181300f, - 0.531200f, - 0.379300f, - 0.433267f, - -0.234204f, - -0.086182f, - 0.000000f, - 0.867200f, - -0.467000f, - -0.172500f, - 0.531200f, - 0.344800f, - 0.279553f, - 0.398046f, - -0.115795f, - 0.000000f, - 0.561100f, - 0.794500f, - -0.232400f, - 0.562500f, - 0.793100f, - 0.238154f, - 0.428429f, - -0.098647f, - 0.000000f, - 0.478600f, - 0.855300f, - -0.198200f, - 0.562500f, - 0.827600f, - 0.252823f, - 0.428429f, - -0.050290f, - 0.000000f, - 0.508100f, - 0.855300f, - -0.101000f, - 0.531300f, - 0.827600f, - 0.279553f, - 0.398046f, - -0.115795f, - 0.000000f, - 0.561100f, - 0.794500f, - -0.232400f, - 0.562500f, - 0.793100f, - 0.252823f, - 0.428429f, - -0.050290f, - 0.000000f, - 0.508100f, - 0.855300f, - -0.101000f, - 0.531300f, - 0.827600f, - 0.296772f, - 0.398046f, - -0.059032f, - 0.000000f, - 0.595600f, - 0.794500f, - -0.118500f, - 0.531300f, - 0.793100f, - 0.382342f, - -0.280594f, - -0.158371f, - 0.000000f, - 0.765600f, - -0.559600f, - -0.317100f, - 0.562500f, - 0.310300f, - 0.408128f, - -0.234204f, - -0.169052f, - 0.000000f, - 0.816900f, - -0.467000f, - -0.338400f, - 0.562500f, - 0.344800f, - 0.433267f, - -0.234204f, - -0.086182f, - 0.000000f, - 0.867200f, - -0.467000f, - -0.172500f, - 0.531200f, - 0.344800f, - 0.382342f, - -0.280594f, - -0.158371f, - 0.000000f, - 0.765600f, - -0.559600f, - -0.317100f, - 0.562500f, - 0.310300f, - 0.433267f, - -0.234204f, - -0.086182f, - 0.000000f, - 0.867200f, - -0.467000f, - -0.172500f, - 0.531200f, - 0.344800f, - 0.405892f, - -0.280594f, - -0.080737f, - 0.000000f, - 0.812800f, - -0.559600f, - -0.161700f, - 0.531200f, - 0.310300f, - 0.317674f, - 0.362998f, - -0.131585f, - 0.000000f, - 0.637000f, - 0.724300f, - -0.263800f, - 0.562500f, - 0.758600f, - 0.279553f, - 0.398046f, - -0.115795f, - 0.000000f, - 0.561100f, - 0.794500f, - -0.232400f, - 0.562500f, - 0.793100f, - 0.296772f, - 0.398046f, - -0.059032f, - 0.000000f, - 0.595600f, - 0.794500f, - -0.118500f, - 0.531300f, - 0.793100f, - 0.317674f, - 0.362998f, - -0.131585f, - 0.000000f, - 0.637000f, - 0.724300f, - -0.263800f, - 0.562500f, - 0.758600f, - 0.296772f, - 0.398046f, - -0.059032f, - 0.000000f, - 0.595600f, - 0.794500f, - -0.118500f, - 0.531300f, - 0.793100f, - 0.337242f, - 0.362998f, - -0.067082f, - 0.000000f, - 0.676200f, - 0.724300f, - -0.134500f, - 0.531300f, - 0.758600f, - 0.352072f, - -0.323693f, - -0.145833f, - 0.000000f, - 0.705400f, - -0.645700f, - -0.292200f, - 0.562500f, - 0.275900f, - 0.382342f, - -0.280594f, - -0.158371f, - 0.000000f, - 0.765600f, - -0.559600f, - -0.317100f, - 0.562500f, - 0.310300f, - 0.405892f, - -0.280594f, - -0.080737f, - 0.000000f, - 0.812800f, - -0.559600f, - -0.161700f, - 0.531200f, - 0.310300f, - 0.352072f, - -0.323693f, - -0.145833f, - 0.000000f, - 0.705400f, - -0.645700f, - -0.292200f, - 0.562500f, - 0.275900f, - 0.405892f, - -0.280594f, - -0.080737f, - 0.000000f, - 0.812800f, - -0.559600f, - -0.161700f, - 0.531200f, - 0.310300f, - 0.373758f, - -0.323693f, - -0.074345f, - 0.000000f, - 0.748900f, - -0.645700f, - -0.149000f, - 0.531200f, - 0.275900f, - 0.352072f, - 0.323693f, - -0.145833f, - 0.000000f, - 0.705400f, - 0.645700f, - -0.292200f, - 0.562500f, - 0.724100f, - 0.317674f, - 0.362998f, - -0.131585f, - 0.000000f, - 0.637000f, - 0.724300f, - -0.263800f, - 0.562500f, - 0.758600f, - 0.337242f, - 0.362998f, - -0.067082f, - 0.000000f, - 0.676200f, - 0.724300f, - -0.134500f, - 0.531300f, - 0.758600f, - 0.352072f, - 0.323693f, - -0.145833f, - 0.000000f, - 0.705400f, - 0.645700f, - -0.292200f, - 0.562500f, - 0.724100f, - 0.337242f, - 0.362998f, - -0.067082f, - 0.000000f, - 0.676200f, - 0.724300f, - -0.134500f, - 0.531300f, - 0.758600f, - 0.373758f, - 0.323693f, - -0.074345f, - 0.000000f, - 0.748900f, - 0.645700f, - -0.149000f, - 0.531200f, - 0.724100f, - 0.317675f, - -0.362998f, - -0.131585f, - 0.000000f, - 0.637000f, - -0.724300f, - -0.263800f, - 0.562500f, - 0.241400f, - 0.352072f, - -0.323693f, - -0.145833f, - 0.000000f, - 0.705400f, - -0.645700f, - -0.292200f, - 0.562500f, - 0.275900f, - 0.373758f, - -0.323693f, - -0.074345f, - 0.000000f, - 0.748900f, - -0.645700f, - -0.149000f, - 0.531200f, - 0.275900f, - 0.317675f, - -0.362998f, - -0.131585f, - 0.000000f, - 0.637000f, - -0.724300f, - -0.263800f, - 0.562500f, - 0.241400f, - 0.373758f, - -0.323693f, - -0.074345f, - 0.000000f, - 0.748900f, - -0.645700f, - -0.149000f, - 0.531200f, - 0.275900f, - 0.337242f, - -0.362998f, - -0.067082f, - 0.000000f, - 0.676200f, - -0.724300f, - -0.134500f, - 0.531200f, - 0.241400f, - 0.382342f, - 0.280594f, - -0.158371f, - 0.000000f, - 0.765600f, - 0.559600f, - -0.317100f, - 0.562500f, - 0.689700f, - 0.352072f, - 0.323693f, - -0.145833f, - 0.000000f, - 0.705400f, - 0.645700f, - -0.292200f, - 0.562500f, - 0.724100f, - 0.373758f, - 0.323693f, - -0.074345f, - 0.000000f, - 0.748900f, - 0.645700f, - -0.149000f, - 0.531200f, - 0.724100f, - 0.382342f, - 0.280594f, - -0.158371f, - 0.000000f, - 0.765600f, - 0.559600f, - -0.317100f, - 0.562500f, - 0.689700f, - 0.373758f, - 0.323693f, - -0.074345f, - 0.000000f, - 0.748900f, - 0.645700f, - -0.149000f, - 0.531200f, - 0.724100f, - 0.405892f, - 0.280594f, - -0.080737f, - 0.000000f, - 0.812800f, - 0.559600f, - -0.161700f, - 0.531300f, - 0.689700f, - 0.279553f, - -0.398046f, - -0.115795f, - 0.000000f, - 0.561100f, - -0.794500f, - -0.232400f, - 0.562500f, - 0.206900f, - 0.317675f, - -0.362998f, - -0.131585f, - 0.000000f, - 0.637000f, - -0.724300f, - -0.263800f, - 0.562500f, - 0.241400f, - 0.337242f, - -0.362998f, - -0.067082f, - 0.000000f, - 0.676200f, - -0.724300f, - -0.134500f, - 0.531200f, - 0.241400f, - 0.279553f, - -0.398046f, - -0.115795f, - 0.000000f, - 0.561100f, - -0.794500f, - -0.232400f, - 0.562500f, - 0.206900f, - 0.337242f, - -0.362998f, - -0.067082f, - 0.000000f, - 0.676200f, - -0.724300f, - -0.134500f, - 0.531200f, - 0.241400f, - 0.296772f, - -0.398046f, - -0.059032f, - 0.000000f, - 0.595600f, - -0.794500f, - -0.118500f, - 0.531200f, - 0.206900f, - 0.408128f, - 0.234204f, - -0.169052f, - 0.000000f, - 0.816900f, - 0.467000f, - -0.338400f, - 0.562500f, - 0.655200f, - 0.382342f, - 0.280594f, - -0.158371f, - 0.000000f, - 0.765600f, - 0.559600f, - -0.317100f, - 0.562500f, - 0.689700f, - 0.405892f, - 0.280594f, - -0.080737f, - 0.000000f, - 0.812800f, - 0.559600f, - -0.161700f, - 0.531300f, - 0.689700f, - 0.408128f, - 0.234204f, - -0.169052f, - 0.000000f, - 0.816900f, - 0.467000f, - -0.338400f, - 0.562500f, - 0.655200f, - 0.405892f, - 0.280594f, - -0.080737f, - 0.000000f, - 0.812800f, - 0.559600f, - -0.161700f, - 0.531300f, - 0.689700f, - 0.433267f, - 0.234204f, - -0.086182f, - 0.000000f, - 0.867200f, - 0.467000f, - -0.172500f, - 0.531200f, - 0.655200f, - 0.433267f, - -0.234204f, - -0.086182f, - 0.000000f, - 0.867200f, - -0.467000f, - -0.172500f, - 0.531200f, - 0.344800f, - 0.455563f, - -0.185069f, - -0.090617f, - 0.000000f, - 0.911600f, - -0.369000f, - -0.181300f, - 0.531200f, - 0.379300f, - 0.464487f, - -0.185069f, - 0.000000f, - 0.000000f, - 0.929400f, - -0.369000f, - 0.000000f, - 0.500000f, - 0.379300f, - 0.433267f, - -0.234204f, - -0.086182f, - 0.000000f, - 0.867200f, - -0.467000f, - -0.172500f, - 0.531200f, - 0.344800f, - 0.464487f, - -0.185069f, - 0.000000f, - 0.000000f, - 0.929400f, - -0.369000f, - 0.000000f, - 0.500000f, - 0.379300f, - 0.441755f, - -0.234204f, - 0.000000f, - 0.000000f, - 0.884200f, - -0.467000f, - 0.000000f, - 0.500000f, - 0.344800f, - 0.296772f, - 0.398046f, - -0.059032f, - 0.000000f, - 0.595600f, - 0.794500f, - -0.118500f, - 0.531300f, - 0.793100f, - 0.252823f, - 0.428429f, - -0.050290f, - 0.000000f, - 0.508100f, - 0.855300f, - -0.101000f, - 0.531300f, - 0.827600f, - 0.257776f, - 0.428429f, - -0.000000f, - 0.000000f, - 0.518000f, - 0.855300f, - 0.000000f, - 0.500000f, - 0.827600f, - 0.296772f, - 0.398046f, - -0.059032f, - 0.000000f, - 0.595600f, - 0.794500f, - -0.118500f, - 0.531300f, - 0.793100f, - 0.257776f, - 0.428429f, - -0.000000f, - 0.000000f, - 0.518000f, - 0.855300f, - 0.000000f, - 0.500000f, - 0.827600f, - 0.302586f, - 0.398046f, - 0.000000f, - 0.000000f, - 0.607300f, - 0.794500f, - 0.000000f, - 0.500000f, - 0.793100f, - 0.405892f, - -0.280594f, - -0.080737f, - 0.000000f, - 0.812800f, - -0.559600f, - -0.161700f, - 0.531200f, - 0.310300f, - 0.433267f, - -0.234204f, - -0.086182f, - 0.000000f, - 0.867200f, - -0.467000f, - -0.172500f, - 0.531200f, - 0.344800f, - 0.441755f, - -0.234204f, - 0.000000f, - 0.000000f, - 0.884200f, - -0.467000f, - 0.000000f, - 0.500000f, - 0.344800f, - 0.405892f, - -0.280594f, - -0.080737f, - 0.000000f, - 0.812800f, - -0.559600f, - -0.161700f, - 0.531200f, - 0.310300f, - 0.441755f, - -0.234204f, - 0.000000f, - 0.000000f, - 0.884200f, - -0.467000f, - 0.000000f, - 0.500000f, - 0.344800f, - 0.413844f, - -0.280594f, - 0.000000f, - 0.000000f, - 0.828700f, - -0.559600f, - 0.000000f, - 0.500000f, - 0.310300f, - 0.337242f, - 0.362998f, - -0.067082f, - 0.000000f, - 0.676200f, - 0.724300f, - -0.134500f, - 0.531300f, - 0.758600f, - 0.296772f, - 0.398046f, - -0.059032f, - 0.000000f, - 0.595600f, - 0.794500f, - -0.118500f, - 0.531300f, - 0.793100f, - 0.302586f, - 0.398046f, - 0.000000f, - 0.000000f, - 0.607300f, - 0.794500f, - 0.000000f, - 0.500000f, - 0.793100f, - 0.337242f, - 0.362998f, - -0.067082f, - 0.000000f, - 0.676200f, - 0.724300f, - -0.134500f, - 0.531300f, - 0.758600f, - 0.302586f, - 0.398046f, - 0.000000f, - 0.000000f, - 0.607300f, - 0.794500f, - 0.000000f, - 0.500000f, - 0.793100f, - 0.343848f, - 0.362998f, - -0.000000f, - 0.000000f, - 0.689400f, - 0.724300f, - 0.000000f, - 0.500000f, - 0.758600f, - 0.373758f, - -0.323693f, - -0.074345f, - 0.000000f, - 0.748900f, - -0.645700f, - -0.149000f, - 0.531200f, - 0.275900f, - 0.405892f, - -0.280594f, - -0.080737f, - 0.000000f, - 0.812800f, - -0.559600f, - -0.161700f, - 0.531200f, - 0.310300f, - 0.413844f, - -0.280594f, - 0.000000f, - 0.000000f, - 0.828700f, - -0.559600f, - 0.000000f, - 0.500000f, - 0.310300f, - 0.373758f, - -0.323693f, - -0.074345f, - 0.000000f, - 0.748900f, - -0.645700f, - -0.149000f, - 0.531200f, - 0.275900f, - 0.413844f, - -0.280594f, - 0.000000f, - 0.000000f, - 0.828700f, - -0.559600f, - 0.000000f, - 0.500000f, - 0.310300f, - 0.381080f, - -0.323693f, - 0.000000f, - 0.000000f, - 0.763500f, - -0.645700f, - 0.000000f, - 0.500000f, - 0.275900f, - 0.373758f, - 0.323693f, - -0.074345f, - 0.000000f, - 0.748900f, - 0.645700f, - -0.149000f, - 0.531200f, - 0.724100f, - 0.337242f, - 0.362998f, - -0.067082f, - 0.000000f, - 0.676200f, - 0.724300f, - -0.134500f, - 0.531300f, - 0.758600f, - 0.343848f, - 0.362998f, - -0.000000f, - 0.000000f, - 0.689400f, - 0.724300f, - 0.000000f, - 0.500000f, - 0.758600f, - 0.373758f, - 0.323693f, - -0.074345f, - 0.000000f, - 0.748900f, - 0.645700f, - -0.149000f, - 0.531200f, - 0.724100f, - 0.343848f, - 0.362998f, - -0.000000f, - 0.000000f, - 0.689400f, - 0.724300f, - 0.000000f, - 0.500000f, - 0.758600f, - 0.381080f, - 0.323693f, - 0.000000f, - 0.000000f, - 0.763500f, - 0.645700f, - 0.000000f, - 0.500000f, - 0.724100f, - 0.337242f, - -0.362998f, - -0.067082f, - 0.000000f, - 0.676200f, - -0.724300f, - -0.134500f, - 0.531200f, - 0.241400f, - 0.373758f, - -0.323693f, - -0.074345f, - 0.000000f, - 0.748900f, - -0.645700f, - -0.149000f, - 0.531200f, - 0.275900f, - 0.381080f, - -0.323693f, - 0.000000f, - 0.000000f, - 0.763500f, - -0.645700f, - 0.000000f, - 0.500000f, - 0.275900f, - 0.337242f, - -0.362998f, - -0.067082f, - 0.000000f, - 0.676200f, - -0.724300f, - -0.134500f, - 0.531200f, - 0.241400f, - 0.381080f, - -0.323693f, - 0.000000f, - 0.000000f, - 0.763500f, - -0.645700f, - 0.000000f, - 0.500000f, - 0.275900f, - 0.343849f, - -0.362998f, - 0.000000f, - 0.000000f, - 0.689400f, - -0.724300f, - 0.000000f, - 0.500000f, - 0.241400f, - 0.405892f, - 0.280594f, - -0.080737f, - 0.000000f, - 0.812800f, - 0.559600f, - -0.161700f, - 0.531300f, - 0.689700f, - 0.373758f, - 0.323693f, - -0.074345f, - 0.000000f, - 0.748900f, - 0.645700f, - -0.149000f, - 0.531200f, - 0.724100f, - 0.381080f, - 0.323693f, - 0.000000f, - 0.000000f, - 0.763500f, - 0.645700f, - 0.000000f, - 0.500000f, - 0.724100f, - 0.405892f, - 0.280594f, - -0.080737f, - 0.000000f, - 0.812800f, - 0.559600f, - -0.161700f, - 0.531300f, - 0.689700f, - 0.381080f, - 0.323693f, - 0.000000f, - 0.000000f, - 0.763500f, - 0.645700f, - 0.000000f, - 0.500000f, - 0.724100f, - 0.413844f, - 0.280594f, - 0.000000f, - 0.000000f, - 0.828700f, - 0.559600f, - 0.000000f, - 0.500000f, - 0.689700f, - 0.296772f, - -0.398046f, - -0.059032f, - 0.000000f, - 0.595600f, - -0.794500f, - -0.118500f, - 0.531200f, - 0.206900f, - 0.337242f, - -0.362998f, - -0.067082f, - 0.000000f, - 0.676200f, - -0.724300f, - -0.134500f, - 0.531200f, - 0.241400f, - 0.343849f, - -0.362998f, - 0.000000f, - 0.000000f, - 0.689400f, - -0.724300f, - 0.000000f, - 0.500000f, - 0.241400f, - 0.296772f, - -0.398046f, - -0.059032f, - 0.000000f, - 0.595600f, - -0.794500f, - -0.118500f, - 0.531200f, - 0.206900f, - 0.343849f, - -0.362998f, - 0.000000f, - 0.000000f, - 0.689400f, - -0.724300f, - 0.000000f, - 0.500000f, - 0.241400f, - 0.302586f, - -0.398046f, - 0.000000f, - 0.000000f, - 0.607300f, - -0.794500f, - 0.000000f, - 0.500000f, - 0.206900f, - 0.433267f, - 0.234204f, - -0.086182f, - 0.000000f, - 0.867200f, - 0.467000f, - -0.172500f, - 0.531200f, - 0.655200f, - 0.405892f, - 0.280594f, - -0.080737f, - 0.000000f, - 0.812800f, - 0.559600f, - -0.161700f, - 0.531300f, - 0.689700f, - 0.413844f, - 0.280594f, - 0.000000f, - 0.000000f, - 0.828700f, - 0.559600f, - 0.000000f, - 0.500000f, - 0.689700f, - 0.433267f, - 0.234204f, - -0.086182f, - 0.000000f, - 0.867200f, - 0.467000f, - -0.172500f, - 0.531200f, - 0.655200f, - 0.413844f, - 0.280594f, - 0.000000f, - 0.000000f, - 0.828700f, - 0.559600f, - 0.000000f, - 0.500000f, - 0.689700f, - 0.441755f, - 0.234204f, - 0.000000f, - 0.000000f, - 0.884200f, - 0.467000f, - 0.000000f, - 0.500000f, - 0.655200f, - 0.252823f, - -0.428429f, - -0.050290f, - 0.000000f, - 0.508100f, - -0.855300f, - -0.101000f, - 0.531200f, - 0.172400f, - 0.296772f, - -0.398046f, - -0.059032f, - 0.000000f, - 0.595600f, - -0.794500f, - -0.118500f, - 0.531200f, - 0.206900f, - 0.302586f, - -0.398046f, - 0.000000f, - 0.000000f, - 0.607300f, - -0.794500f, - 0.000000f, - 0.500000f, - 0.206900f, - 0.252823f, - -0.428429f, - -0.050290f, - 0.000000f, - 0.508100f, - -0.855300f, - -0.101000f, - 0.531200f, - 0.172400f, - 0.302586f, - -0.398046f, - 0.000000f, - 0.000000f, - 0.607300f, - -0.794500f, - 0.000000f, - 0.500000f, - 0.206900f, - 0.257776f, - -0.428429f, - 0.000000f, - 0.000000f, - 0.518000f, - -0.855300f, - 0.000000f, - 0.500000f, - 0.172400f, - 0.455563f, - 0.185069f, - -0.090617f, - 0.000000f, - 0.911600f, - 0.369000f, - -0.181300f, - 0.531200f, - 0.620700f, - 0.433267f, - 0.234204f, - -0.086182f, - 0.000000f, - 0.867200f, - 0.467000f, - -0.172500f, - 0.531200f, - 0.655200f, - 0.441755f, - 0.234204f, - 0.000000f, - 0.000000f, - 0.884200f, - 0.467000f, - 0.000000f, - 0.500000f, - 0.655200f, - 0.455563f, - 0.185069f, - -0.090617f, - 0.000000f, - 0.911600f, - 0.369000f, - -0.181300f, - 0.531200f, - 0.620700f, - 0.441755f, - 0.234204f, - 0.000000f, - 0.000000f, - 0.884200f, - 0.467000f, - 0.000000f, - 0.500000f, - 0.655200f, - 0.464487f, - 0.185069f, - 0.000000f, - 0.000000f, - 0.929400f, - 0.369000f, - 0.000000f, - 0.500000f, - 0.620700f, - 0.205910f, - -0.453788f, - -0.040958f, - 0.000000f, - 0.414500f, - -0.906300f, - -0.082400f, - 0.531200f, - 0.137900f, - 0.252823f, - -0.428429f, - -0.050290f, - 0.000000f, - 0.508100f, - -0.855300f, - -0.101000f, - 0.531200f, - 0.172400f, - 0.257776f, - -0.428429f, - 0.000000f, - 0.000000f, - 0.518000f, - -0.855300f, - 0.000000f, - 0.500000f, - 0.172400f, - 0.205910f, - -0.453788f, - -0.040958f, - 0.000000f, - 0.414500f, - -0.906300f, - -0.082400f, - 0.531200f, - 0.137900f, - 0.257776f, - -0.428429f, - 0.000000f, - 0.000000f, - 0.518000f, - -0.855300f, - 0.000000f, - 0.500000f, - 0.172400f, - 0.209944f, - -0.453788f, - 0.000000f, - 0.000000f, - 0.422700f, - -0.906300f, - 0.000000f, - 0.500000f, - 0.137900f, - 0.472517f, - 0.133764f, - -0.093989f, - 0.000000f, - 0.945200f, - 0.266600f, - -0.188000f, - 0.531200f, - 0.586200f, - 0.455563f, - 0.185069f, - -0.090617f, - 0.000000f, - 0.911600f, - 0.369000f, - -0.181300f, - 0.531200f, - 0.620700f, - 0.464487f, - 0.185069f, - 0.000000f, - 0.000000f, - 0.929400f, - 0.369000f, - 0.000000f, - 0.500000f, - 0.620700f, - 0.472517f, - 0.133764f, - -0.093989f, - 0.000000f, - 0.945200f, - 0.266600f, - -0.188000f, - 0.531200f, - 0.586200f, - 0.464487f, - 0.185069f, - 0.000000f, - 0.000000f, - 0.929400f, - 0.369000f, - 0.000000f, - 0.500000f, - 0.620700f, - 0.481774f, - 0.133764f, - 0.000000f, - 0.000000f, - 0.963800f, - 0.266600f, - 0.000000f, - 0.500000f, - 0.586200f, - 0.156583f, - -0.473826f, - -0.031147f, - 0.000000f, - 0.316100f, - -0.946600f, - -0.062900f, - 0.531300f, - 0.103400f, - 0.205910f, - -0.453788f, - -0.040958f, - 0.000000f, - 0.414500f, - -0.906300f, - -0.082400f, - 0.531200f, - 0.137900f, - 0.209944f, - -0.453788f, - 0.000000f, - 0.000000f, - 0.422700f, - -0.906300f, - 0.000000f, - 0.500000f, - 0.137900f, - 0.156583f, - -0.473826f, - -0.031147f, - 0.000000f, - 0.316100f, - -0.946600f, - -0.062900f, - 0.531300f, - 0.103400f, - 0.209944f, - -0.453788f, - 0.000000f, - 0.000000f, - 0.422700f, - -0.906300f, - 0.000000f, - 0.500000f, - 0.137900f, - 0.159650f, - -0.473826f, - -0.000000f, - 0.000000f, - 0.322300f, - -0.946600f, - 0.000000f, - 0.500000f, - 0.103400f, - 0.483932f, - 0.080891f, - -0.096260f, - 0.000000f, - 0.967900f, - 0.161200f, - -0.192500f, - 0.531200f, - 0.551700f, - 0.472517f, - 0.133764f, - -0.093989f, - 0.000000f, - 0.945200f, - 0.266600f, - -0.188000f, - 0.531200f, - 0.586200f, - 0.481774f, - 0.133764f, - 0.000000f, - 0.000000f, - 0.963800f, - 0.266600f, - 0.000000f, - 0.500000f, - 0.586200f, - 0.483932f, - 0.080891f, - -0.096260f, - 0.000000f, - 0.967900f, - 0.161200f, - -0.192500f, - 0.531200f, - 0.551700f, - 0.481774f, - 0.133764f, - 0.000000f, - 0.000000f, - 0.963800f, - 0.266600f, - 0.000000f, - 0.500000f, - 0.586200f, - 0.493412f, - 0.080891f, - 0.000000f, - 0.000000f, - 0.986900f, - 0.161200f, - 0.000000f, - 0.500000f, - 0.551700f, - 0.105420f, - -0.488310f, - -0.020970f, - 0.000000f, - 0.214000f, - -0.975900f, - -0.042500f, - 0.531300f, - 0.069000f, - 0.156583f, - -0.473826f, - -0.031147f, - 0.000000f, - 0.316100f, - -0.946600f, - -0.062900f, - 0.531300f, - 0.103400f, - 0.159650f, - -0.473826f, - -0.000000f, - 0.000000f, - 0.322300f, - -0.946600f, - 0.000000f, - 0.500000f, - 0.103400f, - 0.105420f, - -0.488310f, - -0.020970f, - 0.000000f, - 0.214000f, - -0.975900f, - -0.042500f, - 0.531300f, - 0.069000f, - 0.159650f, - -0.473826f, - -0.000000f, - 0.000000f, - 0.322300f, - -0.946600f, - 0.000000f, - 0.500000f, - 0.103400f, - 0.107484f, - -0.488310f, - 0.000000f, - 0.000000f, - 0.218200f, - -0.975900f, - 0.000000f, - 0.500000f, - 0.069000f, - 0.489673f, - 0.027069f, - -0.097402f, - 0.000000f, - 0.979300f, - 0.054000f, - -0.194800f, - 0.531200f, - 0.517200f, - 0.483932f, - 0.080891f, - -0.096260f, - 0.000000f, - 0.967900f, - 0.161200f, - -0.192500f, - 0.531200f, - 0.551700f, - 0.493412f, - 0.080891f, - 0.000000f, - 0.000000f, - 0.986900f, - 0.161200f, - 0.000000f, - 0.500000f, - 0.551700f, - 0.489673f, - 0.027069f, - -0.097402f, - 0.000000f, - 0.979300f, - 0.054000f, - -0.194800f, - 0.531200f, - 0.517200f, - 0.493412f, - 0.080891f, - 0.000000f, - 0.000000f, - 0.986900f, - 0.161200f, - 0.000000f, - 0.500000f, - 0.551700f, - 0.499265f, - 0.027069f, - 0.000000f, - 0.000000f, - 0.998500f, - 0.054000f, - 0.000000f, - 0.500000f, - 0.517200f, - 0.053020f, - 0.497069f, - -0.010546f, - 0.000000f, - 0.109300f, - 0.993700f, - -0.021700f, - 0.454400f, - 0.962300f, - -0.000000f, - 0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - 1.000000f, - 0.000000f, - 0.482000f, - 0.960300f, - 0.054058f, - 0.497069f, - 0.000000f, - 0.000000f, - 0.111500f, - 0.993700f, - 0.000000f, - 0.456200f, - 0.962300f, - 0.053020f, - -0.497069f, - -0.010546f, - 0.000000f, - 0.109300f, - -0.993700f, - -0.021700f, - 0.531300f, - 0.034500f, - 0.105420f, - -0.488310f, - -0.020970f, - 0.000000f, - 0.214000f, - -0.975900f, - -0.042500f, - 0.531300f, - 0.069000f, - 0.107484f, - -0.488310f, - 0.000000f, - 0.000000f, - 0.218200f, - -0.975900f, - 0.000000f, - 0.500000f, - 0.069000f, - 0.053020f, - -0.497069f, - -0.010546f, - 0.000000f, - 0.109300f, - -0.993700f, - -0.021700f, - 0.531300f, - 0.034500f, - 0.107484f, - -0.488310f, - 0.000000f, - 0.000000f, - 0.218200f, - -0.975900f, - 0.000000f, - 0.500000f, - 0.069000f, - 0.054059f, - -0.497069f, - 0.000000f, - 0.000000f, - 0.111500f, - -0.993700f, - 0.000000f, - 0.500000f, - 0.034500f, - 0.489673f, - -0.027069f, - -0.097402f, - 0.000000f, - 0.979300f, - -0.054000f, - -0.194800f, - 0.531200f, - 0.482800f, - 0.489673f, - 0.027069f, - -0.097402f, - 0.000000f, - 0.979300f, - 0.054000f, - -0.194800f, - 0.531200f, - 0.517200f, - 0.499265f, - 0.027069f, - 0.000000f, - 0.000000f, - 0.998500f, - 0.054000f, - 0.000000f, - 0.500000f, - 0.517200f, - 0.489673f, - -0.027069f, - -0.097402f, - 0.000000f, - 0.979300f, - -0.054000f, - -0.194800f, - 0.531200f, - 0.482800f, - 0.499265f, - 0.027069f, - 0.000000f, - 0.000000f, - 0.998500f, - 0.054000f, - 0.000000f, - 0.500000f, - 0.517200f, - 0.499265f, - -0.027069f, - 0.000000f, - 0.000000f, - 0.998500f, - -0.054000f, - 0.000000f, - 0.500000f, - 0.482800f, - 0.105419f, - 0.488310f, - -0.020969f, - 0.000000f, - 0.214000f, - 0.975900f, - -0.042500f, - 0.531300f, - 0.931000f, - 0.053020f, - 0.497069f, - -0.010546f, - 0.000000f, - 0.109300f, - 0.993700f, - -0.021700f, - 0.531300f, - 0.965500f, - 0.054058f, - 0.497069f, - 0.000000f, - 0.000000f, - 0.111500f, - 0.993700f, - 0.000000f, - 0.500000f, - 0.965500f, - 0.105419f, - 0.488310f, - -0.020969f, - 0.000000f, - 0.214000f, - 0.975900f, - -0.042500f, - 0.531300f, - 0.931000f, - 0.054058f, - 0.497069f, - 0.000000f, - 0.000000f, - 0.111500f, - 0.993700f, - 0.000000f, - 0.500000f, - 0.965500f, - 0.107484f, - 0.488310f, - 0.000000f, - 0.000000f, - 0.218200f, - 0.975900f, - 0.000000f, - 0.500000f, - 0.931000f, - -0.000000f, - -0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - -1.000000f, - 0.000000f, - 0.495500f, - 0.051000f, - 0.053020f, - -0.497069f, - -0.010546f, - 0.000000f, - 0.109300f, - -0.993700f, - -0.021700f, - 0.454900f, - 0.053800f, - 0.054059f, - -0.497069f, - 0.000000f, - 0.000000f, - 0.111500f, - -0.993700f, - 0.000000f, - 0.452300f, - 0.053800f, - 0.483932f, - -0.080891f, - -0.096260f, - 0.000000f, - 0.967900f, - -0.161200f, - -0.192500f, - 0.531200f, - 0.448300f, - 0.489673f, - -0.027069f, - -0.097402f, - 0.000000f, - 0.979300f, - -0.054000f, - -0.194800f, - 0.531200f, - 0.482800f, - 0.499265f, - -0.027069f, - 0.000000f, - 0.000000f, - 0.998500f, - -0.054000f, - 0.000000f, - 0.500000f, - 0.482800f, - 0.483932f, - -0.080891f, - -0.096260f, - 0.000000f, - 0.967900f, - -0.161200f, - -0.192500f, - 0.531200f, - 0.448300f, - 0.499265f, - -0.027069f, - 0.000000f, - 0.000000f, - 0.998500f, - -0.054000f, - 0.000000f, - 0.500000f, - 0.482800f, - 0.493412f, - -0.080891f, - 0.000000f, - 0.000000f, - 0.986900f, - -0.161200f, - 0.000000f, - 0.500000f, - 0.448300f, - 0.156582f, - 0.473826f, - -0.031146f, - 0.000000f, - 0.316100f, - 0.946600f, - -0.062900f, - 0.531300f, - 0.896600f, - 0.105419f, - 0.488310f, - -0.020969f, - 0.000000f, - 0.214000f, - 0.975900f, - -0.042500f, - 0.531300f, - 0.931000f, - 0.107484f, - 0.488310f, - 0.000000f, - 0.000000f, - 0.218200f, - 0.975900f, - 0.000000f, - 0.500000f, - 0.931000f, - 0.156582f, - 0.473826f, - -0.031146f, - 0.000000f, - 0.316100f, - 0.946600f, - -0.062900f, - 0.531300f, - 0.896600f, - 0.107484f, - 0.488310f, - 0.000000f, - 0.000000f, - 0.218200f, - 0.975900f, - 0.000000f, - 0.500000f, - 0.931000f, - 0.159650f, - 0.473826f, - 0.000000f, - 0.000000f, - 0.322300f, - 0.946600f, - 0.000000f, - 0.500000f, - 0.896600f, - 0.472517f, - -0.133764f, - -0.093989f, - 0.000000f, - 0.945200f, - -0.266600f, - -0.188000f, - 0.531200f, - 0.413800f, - 0.483932f, - -0.080891f, - -0.096260f, - 0.000000f, - 0.967900f, - -0.161200f, - -0.192500f, - 0.531200f, - 0.448300f, - 0.493412f, - -0.080891f, - 0.000000f, - 0.000000f, - 0.986900f, - -0.161200f, - 0.000000f, - 0.500000f, - 0.448300f, - 0.472517f, - -0.133764f, - -0.093989f, - 0.000000f, - 0.945200f, - -0.266600f, - -0.188000f, - 0.531200f, - 0.413800f, - 0.493412f, - -0.080891f, - 0.000000f, - 0.000000f, - 0.986900f, - -0.161200f, - 0.000000f, - 0.500000f, - 0.448300f, - 0.481774f, - -0.133764f, - 0.000000f, - 0.000000f, - 0.963800f, - -0.266600f, - 0.000000f, - 0.500000f, - 0.413800f, - 0.205910f, - 0.453788f, - -0.040958f, - 0.000000f, - 0.414500f, - 0.906300f, - -0.082400f, - 0.531300f, - 0.862100f, - 0.156582f, - 0.473826f, - -0.031146f, - 0.000000f, - 0.316100f, - 0.946600f, - -0.062900f, - 0.531300f, - 0.896600f, - 0.159650f, - 0.473826f, - 0.000000f, - 0.000000f, - 0.322300f, - 0.946600f, - 0.000000f, - 0.500000f, - 0.896600f, - 0.205910f, - 0.453788f, - -0.040958f, - 0.000000f, - 0.414500f, - 0.906300f, - -0.082400f, - 0.531300f, - 0.862100f, - 0.159650f, - 0.473826f, - 0.000000f, - 0.000000f, - 0.322300f, - 0.946600f, - 0.000000f, - 0.500000f, - 0.896600f, - 0.209944f, - 0.453788f, - 0.000000f, - 0.000000f, - 0.422700f, - 0.906300f, - 0.000000f, - 0.500000f, - 0.862100f, - 0.455563f, - -0.185069f, - -0.090617f, - 0.000000f, - 0.911600f, - -0.369000f, - -0.181300f, - 0.531200f, - 0.379300f, - 0.472517f, - -0.133764f, - -0.093989f, - 0.000000f, - 0.945200f, - -0.266600f, - -0.188000f, - 0.531200f, - 0.413800f, - 0.481774f, - -0.133764f, - 0.000000f, - 0.000000f, - 0.963800f, - -0.266600f, - 0.000000f, - 0.500000f, - 0.413800f, - 0.455563f, - -0.185069f, - -0.090617f, - 0.000000f, - 0.911600f, - -0.369000f, - -0.181300f, - 0.531200f, - 0.379300f, - 0.481774f, - -0.133764f, - 0.000000f, - 0.000000f, - 0.963800f, - -0.266600f, - 0.000000f, - 0.500000f, - 0.413800f, - 0.464487f, - -0.185069f, - 0.000000f, - 0.000000f, - 0.929400f, - -0.369000f, - 0.000000f, - 0.500000f, - 0.379300f, - 0.252823f, - 0.428429f, - -0.050290f, - 0.000000f, - 0.508100f, - 0.855300f, - -0.101000f, - 0.531300f, - 0.827600f, - 0.205910f, - 0.453788f, - -0.040958f, - 0.000000f, - 0.414500f, - 0.906300f, - -0.082400f, - 0.531300f, - 0.862100f, - 0.209944f, - 0.453788f, - 0.000000f, - 0.000000f, - 0.422700f, - 0.906300f, - 0.000000f, - 0.500000f, - 0.862100f, - 0.252823f, - 0.428429f, - -0.050290f, - 0.000000f, - 0.508100f, - 0.855300f, - -0.101000f, - 0.531300f, - 0.827600f, - 0.209944f, - 0.453788f, - 0.000000f, - 0.000000f, - 0.422700f, - 0.906300f, - 0.000000f, - 0.500000f, - 0.862100f, - 0.257776f, - 0.428429f, - -0.000000f, - 0.000000f, - 0.518000f, - 0.855300f, - 0.000000f, - 0.500000f, - 0.827600f, - 0.107484f, - -0.488310f, - 0.000000f, - 0.000000f, - 0.218200f, - -0.975900f, - 0.000000f, - 0.500000f, - 0.069000f, - 0.159650f, - -0.473826f, - -0.000000f, - 0.000000f, - 0.322300f, - -0.946600f, - 0.000000f, - 0.500000f, - 0.103400f, - 0.156583f, - -0.473826f, - 0.031147f, - 0.000000f, - 0.316100f, - -0.946600f, - 0.062900f, - 0.468700f, - 0.103400f, - 0.107484f, - -0.488310f, - 0.000000f, - 0.000000f, - 0.218200f, - -0.975900f, - 0.000000f, - 0.500000f, - 0.069000f, - 0.156583f, - -0.473826f, - 0.031147f, - 0.000000f, - 0.316100f, - -0.946600f, - 0.062900f, - 0.468700f, - 0.103400f, - 0.105420f, - -0.488310f, - 0.020970f, - 0.000000f, - 0.214000f, - -0.975900f, - 0.042500f, - 0.468700f, - 0.069000f, - 0.499265f, - 0.027069f, - 0.000000f, - 0.000000f, - 0.998500f, - 0.054000f, - 0.000000f, - 0.500000f, - 0.517200f, - 0.493412f, - 0.080891f, - 0.000000f, - 0.000000f, - 0.986900f, - 0.161200f, - 0.000000f, - 0.500000f, - 0.551700f, - 0.483932f, - 0.080891f, - 0.096260f, - 0.000000f, - 0.967900f, - 0.161200f, - 0.192500f, - 0.468700f, - 0.551700f, - 0.499265f, - 0.027069f, - 0.000000f, - 0.000000f, - 0.998500f, - 0.054000f, - 0.000000f, - 0.500000f, - 0.517200f, - 0.483932f, - 0.080891f, - 0.096260f, - 0.000000f, - 0.967900f, - 0.161200f, - 0.192500f, - 0.468700f, - 0.551700f, - 0.489673f, - 0.027069f, - 0.097402f, - 0.000000f, - 0.979300f, - 0.054000f, - 0.194800f, - 0.468700f, - 0.517200f, - 0.054058f, - 0.497069f, - 0.000000f, - 0.000000f, - 0.111500f, - 0.993700f, - 0.000000f, - 0.456200f, - 0.962300f, - -0.000000f, - 0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - 1.000000f, - 0.000000f, - 0.482000f, - 0.960300f, - 0.053020f, - 0.497069f, - 0.010546f, - 0.000000f, - 0.109300f, - 0.993700f, - 0.021700f, - 0.458000f, - 0.962300f, - 0.054059f, - -0.497069f, - 0.000000f, - 0.000000f, - 0.111500f, - -0.993700f, - 0.000000f, - 0.500000f, - 0.034500f, - 0.107484f, - -0.488310f, - 0.000000f, - 0.000000f, - 0.218200f, - -0.975900f, - 0.000000f, - 0.500000f, - 0.069000f, - 0.105420f, - -0.488310f, - 0.020970f, - 0.000000f, - 0.214000f, - -0.975900f, - 0.042500f, - 0.468700f, - 0.069000f, - 0.054059f, - -0.497069f, - 0.000000f, - 0.000000f, - 0.111500f, - -0.993700f, - 0.000000f, - 0.500000f, - 0.034500f, - 0.105420f, - -0.488310f, - 0.020970f, - 0.000000f, - 0.214000f, - -0.975900f, - 0.042500f, - 0.468700f, - 0.069000f, - 0.053020f, - -0.497069f, - 0.010546f, - 0.000000f, - 0.109300f, - -0.993700f, - 0.021700f, - 0.468700f, - 0.034500f, - 0.499265f, - -0.027069f, - 0.000000f, - 0.000000f, - 0.998500f, - -0.054000f, - 0.000000f, - 0.500000f, - 0.482800f, - 0.499265f, - 0.027069f, - 0.000000f, - 0.000000f, - 0.998500f, - 0.054000f, - 0.000000f, - 0.500000f, - 0.517200f, - 0.489673f, - 0.027069f, - 0.097402f, - 0.000000f, - 0.979300f, - 0.054000f, - 0.194800f, - 0.468700f, - 0.517200f, - 0.499265f, - -0.027069f, - 0.000000f, - 0.000000f, - 0.998500f, - -0.054000f, - 0.000000f, - 0.500000f, - 0.482800f, - 0.489673f, - 0.027069f, - 0.097402f, - 0.000000f, - 0.979300f, - 0.054000f, - 0.194800f, - 0.468700f, - 0.517200f, - 0.489673f, - -0.027069f, - 0.097402f, - 0.000000f, - 0.979300f, - -0.054000f, - 0.194800f, - 0.468700f, - 0.482800f, - 0.107484f, - 0.488310f, - 0.000000f, - 0.000000f, - 0.218200f, - 0.975900f, - 0.000000f, - 0.500000f, - 0.931000f, - 0.054058f, - 0.497069f, - 0.000000f, - 0.000000f, - 0.111500f, - 0.993700f, - 0.000000f, - 0.500000f, - 0.965500f, - 0.053020f, - 0.497069f, - 0.010546f, - 0.000000f, - 0.109300f, - 0.993700f, - 0.021700f, - 0.468700f, - 0.965500f, - 0.107484f, - 0.488310f, - 0.000000f, - 0.000000f, - 0.218200f, - 0.975900f, - 0.000000f, - 0.500000f, - 0.931000f, - 0.053020f, - 0.497069f, - 0.010546f, - 0.000000f, - 0.109300f, - 0.993700f, - 0.021700f, - 0.468700f, - 0.965500f, - 0.105419f, - 0.488310f, - 0.020970f, - 0.000000f, - 0.214000f, - 0.975900f, - 0.042500f, - 0.468700f, - 0.931000f, - -0.000000f, - -0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - -1.000000f, - 0.000000f, - 0.411700f, - 0.051000f, - 0.054059f, - -0.497069f, - 0.000000f, - 0.000000f, - 0.111500f, - -0.993700f, - 0.000000f, - 0.452300f, - 0.053800f, - 0.053020f, - -0.497069f, - 0.010546f, - 0.000000f, - 0.109300f, - -0.993700f, - 0.021700f, - 0.449700f, - 0.053800f, - 0.493412f, - -0.080891f, - 0.000000f, - 0.000000f, - 0.986900f, - -0.161200f, - 0.000000f, - 0.500000f, - 0.448300f, - 0.499265f, - -0.027069f, - 0.000000f, - 0.000000f, - 0.998500f, - -0.054000f, - 0.000000f, - 0.500000f, - 0.482800f, - 0.489673f, - -0.027069f, - 0.097402f, - 0.000000f, - 0.979300f, - -0.054000f, - 0.194800f, - 0.468700f, - 0.482800f, - 0.493412f, - -0.080891f, - 0.000000f, - 0.000000f, - 0.986900f, - -0.161200f, - 0.000000f, - 0.500000f, - 0.448300f, - 0.489673f, - -0.027069f, - 0.097402f, - 0.000000f, - 0.979300f, - -0.054000f, - 0.194800f, - 0.468700f, - 0.482800f, - 0.483932f, - -0.080891f, - 0.096260f, - 0.000000f, - 0.967900f, - -0.161200f, - 0.192500f, - 0.468700f, - 0.448300f, - 0.159650f, - 0.473826f, - 0.000000f, - 0.000000f, - 0.322300f, - 0.946600f, - 0.000000f, - 0.500000f, - 0.896600f, - 0.107484f, - 0.488310f, - 0.000000f, - 0.000000f, - 0.218200f, - 0.975900f, - 0.000000f, - 0.500000f, - 0.931000f, - 0.105419f, - 0.488310f, - 0.020970f, - 0.000000f, - 0.214000f, - 0.975900f, - 0.042500f, - 0.468700f, - 0.931000f, - 0.159650f, - 0.473826f, - 0.000000f, - 0.000000f, - 0.322300f, - 0.946600f, - 0.000000f, - 0.500000f, - 0.896600f, - 0.105419f, - 0.488310f, - 0.020970f, - 0.000000f, - 0.214000f, - 0.975900f, - 0.042500f, - 0.468700f, - 0.931000f, - 0.156582f, - 0.473826f, - 0.031146f, - 0.000000f, - 0.316100f, - 0.946600f, - 0.062900f, - 0.468700f, - 0.896600f, - 0.481774f, - -0.133764f, - 0.000000f, - 0.000000f, - 0.963800f, - -0.266600f, - 0.000000f, - 0.500000f, - 0.413800f, - 0.493412f, - -0.080891f, - 0.000000f, - 0.000000f, - 0.986900f, - -0.161200f, - 0.000000f, - 0.500000f, - 0.448300f, - 0.483932f, - -0.080891f, - 0.096260f, - 0.000000f, - 0.967900f, - -0.161200f, - 0.192500f, - 0.468700f, - 0.448300f, - 0.481774f, - -0.133764f, - 0.000000f, - 0.000000f, - 0.963800f, - -0.266600f, - 0.000000f, - 0.500000f, - 0.413800f, - 0.483932f, - -0.080891f, - 0.096260f, - 0.000000f, - 0.967900f, - -0.161200f, - 0.192500f, - 0.468700f, - 0.448300f, - 0.472517f, - -0.133764f, - 0.093989f, - 0.000000f, - 0.945200f, - -0.266600f, - 0.188000f, - 0.468700f, - 0.413800f, - 0.209944f, - 0.453788f, - 0.000000f, - 0.000000f, - 0.422700f, - 0.906300f, - 0.000000f, - 0.500000f, - 0.862100f, - 0.159650f, - 0.473826f, - 0.000000f, - 0.000000f, - 0.322300f, - 0.946600f, - 0.000000f, - 0.500000f, - 0.896600f, - 0.156582f, - 0.473826f, - 0.031146f, - 0.000000f, - 0.316100f, - 0.946600f, - 0.062900f, - 0.468700f, - 0.896600f, - 0.209944f, - 0.453788f, - 0.000000f, - 0.000000f, - 0.422700f, - 0.906300f, - 0.000000f, - 0.500000f, - 0.862100f, - 0.156582f, - 0.473826f, - 0.031146f, - 0.000000f, - 0.316100f, - 0.946600f, - 0.062900f, - 0.468700f, - 0.896600f, - 0.205910f, - 0.453788f, - 0.040958f, - 0.000000f, - 0.414500f, - 0.906300f, - 0.082400f, - 0.468700f, - 0.862100f, - 0.464487f, - -0.185069f, - 0.000000f, - 0.000000f, - 0.929400f, - -0.369000f, - 0.000000f, - 0.500000f, - 0.379300f, - 0.481774f, - -0.133764f, - 0.000000f, - 0.000000f, - 0.963800f, - -0.266600f, - 0.000000f, - 0.500000f, - 0.413800f, - 0.472517f, - -0.133764f, - 0.093989f, - 0.000000f, - 0.945200f, - -0.266600f, - 0.188000f, - 0.468700f, - 0.413800f, - 0.464487f, - -0.185069f, - 0.000000f, - 0.000000f, - 0.929400f, - -0.369000f, - 0.000000f, - 0.500000f, - 0.379300f, - 0.472517f, - -0.133764f, - 0.093989f, - 0.000000f, - 0.945200f, - -0.266600f, - 0.188000f, - 0.468700f, - 0.413800f, - 0.455563f, - -0.185069f, - 0.090617f, - 0.000000f, - 0.911600f, - -0.369000f, - 0.181300f, - 0.468700f, - 0.379300f, - 0.257776f, - 0.428429f, - -0.000000f, - 0.000000f, - 0.518000f, - 0.855300f, - 0.000000f, - 0.500000f, - 0.827600f, - 0.209944f, - 0.453788f, - 0.000000f, - 0.000000f, - 0.422700f, - 0.906300f, - 0.000000f, - 0.500000f, - 0.862100f, - 0.205910f, - 0.453788f, - 0.040958f, - 0.000000f, - 0.414500f, - 0.906300f, - 0.082400f, - 0.468700f, - 0.862100f, - 0.257776f, - 0.428429f, - -0.000000f, - 0.000000f, - 0.518000f, - 0.855300f, - 0.000000f, - 0.500000f, - 0.827600f, - 0.205910f, - 0.453788f, - 0.040958f, - 0.000000f, - 0.414500f, - 0.906300f, - 0.082400f, - 0.468700f, - 0.862100f, - 0.252823f, - 0.428429f, - 0.050290f, - 0.000000f, - 0.508100f, - 0.855300f, - 0.101000f, - 0.468700f, - 0.827600f, - 0.441755f, - -0.234204f, - 0.000000f, - 0.000000f, - 0.884200f, - -0.467000f, - 0.000000f, - 0.500000f, - 0.344800f, - 0.464487f, - -0.185069f, - 0.000000f, - 0.000000f, - 0.929400f, - -0.369000f, - 0.000000f, - 0.500000f, - 0.379300f, - 0.455563f, - -0.185069f, - 0.090617f, - 0.000000f, - 0.911600f, - -0.369000f, - 0.181300f, - 0.468700f, - 0.379300f, - 0.441755f, - -0.234204f, - 0.000000f, - 0.000000f, - 0.884200f, - -0.467000f, - 0.000000f, - 0.500000f, - 0.344800f, - 0.455563f, - -0.185069f, - 0.090617f, - 0.000000f, - 0.911600f, - -0.369000f, - 0.181300f, - 0.468700f, - 0.379300f, - 0.433267f, - -0.234204f, - 0.086182f, - 0.000000f, - 0.867200f, - -0.467000f, - 0.172500f, - 0.468700f, - 0.344800f, - 0.302586f, - 0.398046f, - 0.000000f, - 0.000000f, - 0.607300f, - 0.794500f, - 0.000000f, - 0.500000f, - 0.793100f, - 0.257776f, - 0.428429f, - -0.000000f, - 0.000000f, - 0.518000f, - 0.855300f, - 0.000000f, - 0.500000f, - 0.827600f, - 0.252823f, - 0.428429f, - 0.050290f, - 0.000000f, - 0.508100f, - 0.855300f, - 0.101000f, - 0.468700f, - 0.827600f, - 0.302586f, - 0.398046f, - 0.000000f, - 0.000000f, - 0.607300f, - 0.794500f, - 0.000000f, - 0.500000f, - 0.793100f, - 0.252823f, - 0.428429f, - 0.050290f, - 0.000000f, - 0.508100f, - 0.855300f, - 0.101000f, - 0.468700f, - 0.827600f, - 0.296772f, - 0.398046f, - 0.059032f, - 0.000000f, - 0.595600f, - 0.794500f, - 0.118500f, - 0.468700f, - 0.793100f, - 0.413844f, - -0.280594f, - 0.000000f, - 0.000000f, - 0.828700f, - -0.559600f, - 0.000000f, - 0.500000f, - 0.310300f, - 0.441755f, - -0.234204f, - 0.000000f, - 0.000000f, - 0.884200f, - -0.467000f, - 0.000000f, - 0.500000f, - 0.344800f, - 0.433267f, - -0.234204f, - 0.086182f, - 0.000000f, - 0.867200f, - -0.467000f, - 0.172500f, - 0.468700f, - 0.344800f, - 0.413844f, - -0.280594f, - 0.000000f, - 0.000000f, - 0.828700f, - -0.559600f, - 0.000000f, - 0.500000f, - 0.310300f, - 0.433267f, - -0.234204f, - 0.086182f, - 0.000000f, - 0.867200f, - -0.467000f, - 0.172500f, - 0.468700f, - 0.344800f, - 0.405892f, - -0.280594f, - 0.080737f, - 0.000000f, - 0.812800f, - -0.559600f, - 0.161700f, - 0.468700f, - 0.310300f, - 0.343848f, - 0.362998f, - -0.000000f, - 0.000000f, - 0.689400f, - 0.724300f, - 0.000000f, - 0.500000f, - 0.758600f, - 0.302586f, - 0.398046f, - 0.000000f, - 0.000000f, - 0.607300f, - 0.794500f, - 0.000000f, - 0.500000f, - 0.793100f, - 0.296772f, - 0.398046f, - 0.059032f, - 0.000000f, - 0.595600f, - 0.794500f, - 0.118500f, - 0.468700f, - 0.793100f, - 0.343848f, - 0.362998f, - -0.000000f, - 0.000000f, - 0.689400f, - 0.724300f, - 0.000000f, - 0.500000f, - 0.758600f, - 0.296772f, - 0.398046f, - 0.059032f, - 0.000000f, - 0.595600f, - 0.794500f, - 0.118500f, - 0.468700f, - 0.793100f, - 0.337242f, - 0.362998f, - 0.067082f, - 0.000000f, - 0.676200f, - 0.724300f, - 0.134500f, - 0.468800f, - 0.758600f, - 0.381080f, - -0.323693f, - 0.000000f, - 0.000000f, - 0.763500f, - -0.645700f, - 0.000000f, - 0.500000f, - 0.275900f, - 0.413844f, - -0.280594f, - 0.000000f, - 0.000000f, - 0.828700f, - -0.559600f, - 0.000000f, - 0.500000f, - 0.310300f, - 0.405892f, - -0.280594f, - 0.080737f, - 0.000000f, - 0.812800f, - -0.559600f, - 0.161700f, - 0.468700f, - 0.310300f, - 0.381080f, - -0.323693f, - 0.000000f, - 0.000000f, - 0.763500f, - -0.645700f, - 0.000000f, - 0.500000f, - 0.275900f, - 0.405892f, - -0.280594f, - 0.080737f, - 0.000000f, - 0.812800f, - -0.559600f, - 0.161700f, - 0.468700f, - 0.310300f, - 0.373758f, - -0.323693f, - 0.074345f, - 0.000000f, - 0.748900f, - -0.645700f, - 0.149000f, - 0.468700f, - 0.275900f, - 0.381080f, - 0.323693f, - 0.000000f, - 0.000000f, - 0.763500f, - 0.645700f, - 0.000000f, - 0.500000f, - 0.724100f, - 0.343848f, - 0.362998f, - -0.000000f, - 0.000000f, - 0.689400f, - 0.724300f, - 0.000000f, - 0.500000f, - 0.758600f, - 0.337242f, - 0.362998f, - 0.067082f, - 0.000000f, - 0.676200f, - 0.724300f, - 0.134500f, - 0.468800f, - 0.758600f, - 0.381080f, - 0.323693f, - 0.000000f, - 0.000000f, - 0.763500f, - 0.645700f, - 0.000000f, - 0.500000f, - 0.724100f, - 0.337242f, - 0.362998f, - 0.067082f, - 0.000000f, - 0.676200f, - 0.724300f, - 0.134500f, - 0.468800f, - 0.758600f, - 0.373758f, - 0.323693f, - 0.074345f, - 0.000000f, - 0.748900f, - 0.645700f, - 0.149000f, - 0.468700f, - 0.724100f, - 0.343849f, - -0.362998f, - 0.000000f, - 0.000000f, - 0.689400f, - -0.724300f, - 0.000000f, - 0.500000f, - 0.241400f, - 0.381080f, - -0.323693f, - 0.000000f, - 0.000000f, - 0.763500f, - -0.645700f, - 0.000000f, - 0.500000f, - 0.275900f, - 0.373758f, - -0.323693f, - 0.074345f, - 0.000000f, - 0.748900f, - -0.645700f, - 0.149000f, - 0.468700f, - 0.275900f, - 0.343849f, - -0.362998f, - 0.000000f, - 0.000000f, - 0.689400f, - -0.724300f, - 0.000000f, - 0.500000f, - 0.241400f, - 0.373758f, - -0.323693f, - 0.074345f, - 0.000000f, - 0.748900f, - -0.645700f, - 0.149000f, - 0.468700f, - 0.275900f, - 0.337242f, - -0.362998f, - 0.067082f, - 0.000000f, - 0.676200f, - -0.724300f, - 0.134500f, - 0.468700f, - 0.241400f, - 0.413844f, - 0.280594f, - 0.000000f, - 0.000000f, - 0.828700f, - 0.559600f, - 0.000000f, - 0.500000f, - 0.689700f, - 0.381080f, - 0.323693f, - 0.000000f, - 0.000000f, - 0.763500f, - 0.645700f, - 0.000000f, - 0.500000f, - 0.724100f, - 0.373758f, - 0.323693f, - 0.074345f, - 0.000000f, - 0.748900f, - 0.645700f, - 0.149000f, - 0.468700f, - 0.724100f, - 0.413844f, - 0.280594f, - 0.000000f, - 0.000000f, - 0.828700f, - 0.559600f, - 0.000000f, - 0.500000f, - 0.689700f, - 0.373758f, - 0.323693f, - 0.074345f, - 0.000000f, - 0.748900f, - 0.645700f, - 0.149000f, - 0.468700f, - 0.724100f, - 0.405892f, - 0.280594f, - 0.080737f, - 0.000000f, - 0.812800f, - 0.559600f, - 0.161700f, - 0.468700f, - 0.689700f, - 0.302586f, - -0.398046f, - 0.000000f, - 0.000000f, - 0.607300f, - -0.794500f, - 0.000000f, - 0.500000f, - 0.206900f, - 0.343849f, - -0.362998f, - 0.000000f, - 0.000000f, - 0.689400f, - -0.724300f, - 0.000000f, - 0.500000f, - 0.241400f, - 0.337242f, - -0.362998f, - 0.067082f, - 0.000000f, - 0.676200f, - -0.724300f, - 0.134500f, - 0.468700f, - 0.241400f, - 0.302586f, - -0.398046f, - 0.000000f, - 0.000000f, - 0.607300f, - -0.794500f, - 0.000000f, - 0.500000f, - 0.206900f, - 0.337242f, - -0.362998f, - 0.067082f, - 0.000000f, - 0.676200f, - -0.724300f, - 0.134500f, - 0.468700f, - 0.241400f, - 0.296772f, - -0.398046f, - 0.059032f, - 0.000000f, - 0.595600f, - -0.794500f, - 0.118500f, - 0.468700f, - 0.206900f, - 0.441755f, - 0.234204f, - 0.000000f, - 0.000000f, - 0.884200f, - 0.467000f, - 0.000000f, - 0.500000f, - 0.655200f, - 0.413844f, - 0.280594f, - 0.000000f, - 0.000000f, - 0.828700f, - 0.559600f, - 0.000000f, - 0.500000f, - 0.689700f, - 0.405892f, - 0.280594f, - 0.080737f, - 0.000000f, - 0.812800f, - 0.559600f, - 0.161700f, - 0.468700f, - 0.689700f, - 0.441755f, - 0.234204f, - 0.000000f, - 0.000000f, - 0.884200f, - 0.467000f, - 0.000000f, - 0.500000f, - 0.655200f, - 0.405892f, - 0.280594f, - 0.080737f, - 0.000000f, - 0.812800f, - 0.559600f, - 0.161700f, - 0.468700f, - 0.689700f, - 0.433267f, - 0.234204f, - 0.086182f, - 0.000000f, - 0.867200f, - 0.467000f, - 0.172500f, - 0.468700f, - 0.655200f, - 0.257776f, - -0.428429f, - 0.000000f, - 0.000000f, - 0.518000f, - -0.855300f, - 0.000000f, - 0.500000f, - 0.172400f, - 0.302586f, - -0.398046f, - 0.000000f, - 0.000000f, - 0.607300f, - -0.794500f, - 0.000000f, - 0.500000f, - 0.206900f, - 0.296772f, - -0.398046f, - 0.059032f, - 0.000000f, - 0.595600f, - -0.794500f, - 0.118500f, - 0.468700f, - 0.206900f, - 0.257776f, - -0.428429f, - 0.000000f, - 0.000000f, - 0.518000f, - -0.855300f, - 0.000000f, - 0.500000f, - 0.172400f, - 0.296772f, - -0.398046f, - 0.059032f, - 0.000000f, - 0.595600f, - -0.794500f, - 0.118500f, - 0.468700f, - 0.206900f, - 0.252823f, - -0.428429f, - 0.050290f, - 0.000000f, - 0.508100f, - -0.855300f, - 0.101000f, - 0.468700f, - 0.172400f, - 0.464487f, - 0.185069f, - 0.000000f, - 0.000000f, - 0.929400f, - 0.369000f, - 0.000000f, - 0.500000f, - 0.620700f, - 0.441755f, - 0.234204f, - 0.000000f, - 0.000000f, - 0.884200f, - 0.467000f, - 0.000000f, - 0.500000f, - 0.655200f, - 0.433267f, - 0.234204f, - 0.086182f, - 0.000000f, - 0.867200f, - 0.467000f, - 0.172500f, - 0.468700f, - 0.655200f, - 0.464487f, - 0.185069f, - 0.000000f, - 0.000000f, - 0.929400f, - 0.369000f, - 0.000000f, - 0.500000f, - 0.620700f, - 0.433267f, - 0.234204f, - 0.086182f, - 0.000000f, - 0.867200f, - 0.467000f, - 0.172500f, - 0.468700f, - 0.655200f, - 0.455563f, - 0.185069f, - 0.090617f, - 0.000000f, - 0.911600f, - 0.369000f, - 0.181300f, - 0.468700f, - 0.620700f, - 0.209944f, - -0.453788f, - 0.000000f, - 0.000000f, - 0.422700f, - -0.906300f, - 0.000000f, - 0.500000f, - 0.137900f, - 0.257776f, - -0.428429f, - 0.000000f, - 0.000000f, - 0.518000f, - -0.855300f, - 0.000000f, - 0.500000f, - 0.172400f, - 0.252823f, - -0.428429f, - 0.050290f, - 0.000000f, - 0.508100f, - -0.855300f, - 0.101000f, - 0.468700f, - 0.172400f, - 0.209944f, - -0.453788f, - 0.000000f, - 0.000000f, - 0.422700f, - -0.906300f, - 0.000000f, - 0.500000f, - 0.137900f, - 0.252823f, - -0.428429f, - 0.050290f, - 0.000000f, - 0.508100f, - -0.855300f, - 0.101000f, - 0.468700f, - 0.172400f, - 0.205910f, - -0.453788f, - 0.040958f, - 0.000000f, - 0.414500f, - -0.906300f, - 0.082400f, - 0.468700f, - 0.137900f, - 0.481774f, - 0.133764f, - 0.000000f, - 0.000000f, - 0.963800f, - 0.266600f, - 0.000000f, - 0.500000f, - 0.586200f, - 0.464487f, - 0.185069f, - 0.000000f, - 0.000000f, - 0.929400f, - 0.369000f, - 0.000000f, - 0.500000f, - 0.620700f, - 0.455563f, - 0.185069f, - 0.090617f, - 0.000000f, - 0.911600f, - 0.369000f, - 0.181300f, - 0.468700f, - 0.620700f, - 0.481774f, - 0.133764f, - 0.000000f, - 0.000000f, - 0.963800f, - 0.266600f, - 0.000000f, - 0.500000f, - 0.586200f, - 0.455563f, - 0.185069f, - 0.090617f, - 0.000000f, - 0.911600f, - 0.369000f, - 0.181300f, - 0.468700f, - 0.620700f, - 0.472517f, - 0.133764f, - 0.093989f, - 0.000000f, - 0.945200f, - 0.266600f, - 0.188000f, - 0.468700f, - 0.586200f, - 0.159650f, - -0.473826f, - -0.000000f, - 0.000000f, - 0.322300f, - -0.946600f, - 0.000000f, - 0.500000f, - 0.103400f, - 0.209944f, - -0.453788f, - 0.000000f, - 0.000000f, - 0.422700f, - -0.906300f, - 0.000000f, - 0.500000f, - 0.137900f, - 0.205910f, - -0.453788f, - 0.040958f, - 0.000000f, - 0.414500f, - -0.906300f, - 0.082400f, - 0.468700f, - 0.137900f, - 0.159650f, - -0.473826f, - -0.000000f, - 0.000000f, - 0.322300f, - -0.946600f, - 0.000000f, - 0.500000f, - 0.103400f, - 0.205910f, - -0.453788f, - 0.040958f, - 0.000000f, - 0.414500f, - -0.906300f, - 0.082400f, - 0.468700f, - 0.137900f, - 0.156583f, - -0.473826f, - 0.031147f, - 0.000000f, - 0.316100f, - -0.946600f, - 0.062900f, - 0.468700f, - 0.103400f, - 0.493412f, - 0.080891f, - 0.000000f, - 0.000000f, - 0.986900f, - 0.161200f, - 0.000000f, - 0.500000f, - 0.551700f, - 0.481774f, - 0.133764f, - 0.000000f, - 0.000000f, - 0.963800f, - 0.266600f, - 0.000000f, - 0.500000f, - 0.586200f, - 0.472517f, - 0.133764f, - 0.093989f, - 0.000000f, - 0.945200f, - 0.266600f, - 0.188000f, - 0.468700f, - 0.586200f, - 0.493412f, - 0.080891f, - 0.000000f, - 0.000000f, - 0.986900f, - 0.161200f, - 0.000000f, - 0.500000f, - 0.551700f, - 0.472517f, - 0.133764f, - 0.093989f, - 0.000000f, - 0.945200f, - 0.266600f, - 0.188000f, - 0.468700f, - 0.586200f, - 0.483932f, - 0.080891f, - 0.096260f, - 0.000000f, - 0.967900f, - 0.161200f, - 0.192500f, - 0.468700f, - 0.551700f, - 0.373758f, - 0.323693f, - 0.074345f, - 0.000000f, - 0.748900f, - 0.645700f, - 0.149000f, - 0.468700f, - 0.724100f, - 0.337242f, - 0.362998f, - 0.067082f, - 0.000000f, - 0.676200f, - 0.724300f, - 0.134500f, - 0.468800f, - 0.758600f, - 0.317674f, - 0.362998f, - 0.131585f, - 0.000000f, - 0.637000f, - 0.724300f, - 0.263800f, - 0.437500f, - 0.758600f, - 0.373758f, - 0.323693f, - 0.074345f, - 0.000000f, - 0.748900f, - 0.645700f, - 0.149000f, - 0.468700f, - 0.724100f, - 0.317674f, - 0.362998f, - 0.131585f, - 0.000000f, - 0.637000f, - 0.724300f, - 0.263800f, - 0.437500f, - 0.758600f, - 0.352072f, - 0.323693f, - 0.145833f, - 0.000000f, - 0.705400f, - 0.645700f, - 0.292200f, - 0.437500f, - 0.724100f, - 0.337242f, - -0.362998f, - 0.067082f, - 0.000000f, - 0.676200f, - -0.724300f, - 0.134500f, - 0.468700f, - 0.241400f, - 0.373758f, - -0.323693f, - 0.074345f, - 0.000000f, - 0.748900f, - -0.645700f, - 0.149000f, - 0.468700f, - 0.275900f, - 0.352072f, - -0.323693f, - 0.145834f, - 0.000000f, - 0.705400f, - -0.645700f, - 0.292200f, - 0.437500f, - 0.275900f, - 0.337242f, - -0.362998f, - 0.067082f, - 0.000000f, - 0.676200f, - -0.724300f, - 0.134500f, - 0.468700f, - 0.241400f, - 0.352072f, - -0.323693f, - 0.145834f, - 0.000000f, - 0.705400f, - -0.645700f, - 0.292200f, - 0.437500f, - 0.275900f, - 0.317675f, - -0.362998f, - 0.131585f, - 0.000000f, - 0.637000f, - -0.724300f, - 0.263800f, - 0.437500f, - 0.241400f, - 0.405892f, - 0.280594f, - 0.080737f, - 0.000000f, - 0.812800f, - 0.559600f, - 0.161700f, - 0.468700f, - 0.689700f, - 0.373758f, - 0.323693f, - 0.074345f, - 0.000000f, - 0.748900f, - 0.645700f, - 0.149000f, - 0.468700f, - 0.724100f, - 0.352072f, - 0.323693f, - 0.145833f, - 0.000000f, - 0.705400f, - 0.645700f, - 0.292200f, - 0.437500f, - 0.724100f, - 0.405892f, - 0.280594f, - 0.080737f, - 0.000000f, - 0.812800f, - 0.559600f, - 0.161700f, - 0.468700f, - 0.689700f, - 0.352072f, - 0.323693f, - 0.145833f, - 0.000000f, - 0.705400f, - 0.645700f, - 0.292200f, - 0.437500f, - 0.724100f, - 0.382342f, - 0.280594f, - 0.158371f, - 0.000000f, - 0.765600f, - 0.559600f, - 0.317100f, - 0.437500f, - 0.689700f, - 0.296772f, - -0.398046f, - 0.059032f, - 0.000000f, - 0.595600f, - -0.794500f, - 0.118500f, - 0.468700f, - 0.206900f, - 0.337242f, - -0.362998f, - 0.067082f, - 0.000000f, - 0.676200f, - -0.724300f, - 0.134500f, - 0.468700f, - 0.241400f, - 0.317675f, - -0.362998f, - 0.131585f, - 0.000000f, - 0.637000f, - -0.724300f, - 0.263800f, - 0.437500f, - 0.241400f, - 0.296772f, - -0.398046f, - 0.059032f, - 0.000000f, - 0.595600f, - -0.794500f, - 0.118500f, - 0.468700f, - 0.206900f, - 0.317675f, - -0.362998f, - 0.131585f, - 0.000000f, - 0.637000f, - -0.724300f, - 0.263800f, - 0.437500f, - 0.241400f, - 0.279553f, - -0.398046f, - 0.115795f, - 0.000000f, - 0.561100f, - -0.794500f, - 0.232400f, - 0.437500f, - 0.206900f, - 0.433267f, - 0.234204f, - 0.086182f, - 0.000000f, - 0.867200f, - 0.467000f, - 0.172500f, - 0.468700f, - 0.655200f, - 0.405892f, - 0.280594f, - 0.080737f, - 0.000000f, - 0.812800f, - 0.559600f, - 0.161700f, - 0.468700f, - 0.689700f, - 0.382342f, - 0.280594f, - 0.158371f, - 0.000000f, - 0.765600f, - 0.559600f, - 0.317100f, - 0.437500f, - 0.689700f, - 0.433267f, - 0.234204f, - 0.086182f, - 0.000000f, - 0.867200f, - 0.467000f, - 0.172500f, - 0.468700f, - 0.655200f, - 0.382342f, - 0.280594f, - 0.158371f, - 0.000000f, - 0.765600f, - 0.559600f, - 0.317100f, - 0.437500f, - 0.689700f, - 0.408128f, - 0.234204f, - 0.169052f, - 0.000000f, - 0.816900f, - 0.467000f, - 0.338400f, - 0.437500f, - 0.655200f, - 0.252823f, - -0.428429f, - 0.050290f, - 0.000000f, - 0.508100f, - -0.855300f, - 0.101000f, - 0.468700f, - 0.172400f, - 0.296772f, - -0.398046f, - 0.059032f, - 0.000000f, - 0.595600f, - -0.794500f, - 0.118500f, - 0.468700f, - 0.206900f, - 0.279553f, - -0.398046f, - 0.115795f, - 0.000000f, - 0.561100f, - -0.794500f, - 0.232400f, - 0.437500f, - 0.206900f, - 0.252823f, - -0.428429f, - 0.050290f, - 0.000000f, - 0.508100f, - -0.855300f, - 0.101000f, - 0.468700f, - 0.172400f, - 0.279553f, - -0.398046f, - 0.115795f, - 0.000000f, - 0.561100f, - -0.794500f, - 0.232400f, - 0.437500f, - 0.206900f, - 0.238154f, - -0.428429f, - 0.098647f, - 0.000000f, - 0.478600f, - -0.855300f, - 0.198200f, - 0.437500f, - 0.172400f, - 0.455563f, - 0.185069f, - 0.090617f, - 0.000000f, - 0.911600f, - 0.369000f, - 0.181300f, - 0.468700f, - 0.620700f, - 0.433267f, - 0.234204f, - 0.086182f, - 0.000000f, - 0.867200f, - 0.467000f, - 0.172500f, - 0.468700f, - 0.655200f, - 0.408128f, - 0.234204f, - 0.169052f, - 0.000000f, - 0.816900f, - 0.467000f, - 0.338400f, - 0.437500f, - 0.655200f, - 0.455563f, - 0.185069f, - 0.090617f, - 0.000000f, - 0.911600f, - 0.369000f, - 0.181300f, - 0.468700f, - 0.620700f, - 0.408128f, - 0.234204f, - 0.169052f, - 0.000000f, - 0.816900f, - 0.467000f, - 0.338400f, - 0.437500f, - 0.655200f, - 0.429130f, - 0.185069f, - 0.177752f, - 0.000000f, - 0.858700f, - 0.369000f, - 0.355700f, - 0.437500f, - 0.620700f, - 0.205910f, - -0.453788f, - 0.040958f, - 0.000000f, - 0.414500f, - -0.906300f, - 0.082400f, - 0.468700f, - 0.137900f, - 0.252823f, - -0.428429f, - 0.050290f, - 0.000000f, - 0.508100f, - -0.855300f, - 0.101000f, - 0.468700f, - 0.172400f, - 0.238154f, - -0.428429f, - 0.098647f, - 0.000000f, - 0.478600f, - -0.855300f, - 0.198200f, - 0.437500f, - 0.172400f, - 0.205910f, - -0.453788f, - 0.040958f, - 0.000000f, - 0.414500f, - -0.906300f, - 0.082400f, - 0.468700f, - 0.137900f, - 0.238154f, - -0.428429f, - 0.098647f, - 0.000000f, - 0.478600f, - -0.855300f, - 0.198200f, - 0.437500f, - 0.172400f, - 0.193963f, - -0.453788f, - 0.080342f, - 0.000000f, - 0.390500f, - -0.906300f, - 0.161700f, - 0.437500f, - 0.137900f, - 0.472517f, - 0.133764f, - 0.093989f, - 0.000000f, - 0.945200f, - 0.266600f, - 0.188000f, - 0.468700f, - 0.586200f, - 0.455563f, - 0.185069f, - 0.090617f, - 0.000000f, - 0.911600f, - 0.369000f, - 0.181300f, - 0.468700f, - 0.620700f, - 0.429130f, - 0.185069f, - 0.177752f, - 0.000000f, - 0.858700f, - 0.369000f, - 0.355700f, - 0.437500f, - 0.620700f, - 0.472517f, - 0.133764f, - 0.093989f, - 0.000000f, - 0.945200f, - 0.266600f, - 0.188000f, - 0.468700f, - 0.586200f, - 0.429130f, - 0.185069f, - 0.177752f, - 0.000000f, - 0.858700f, - 0.369000f, - 0.355700f, - 0.437500f, - 0.620700f, - 0.445101f, - 0.133764f, - 0.184367f, - 0.000000f, - 0.890400f, - 0.266600f, - 0.368800f, - 0.437500f, - 0.586200f, - 0.156583f, - -0.473826f, - 0.031147f, - 0.000000f, - 0.316100f, - -0.946600f, - 0.062900f, - 0.468700f, - 0.103400f, - 0.205910f, - -0.453788f, - 0.040958f, - 0.000000f, - 0.414500f, - -0.906300f, - 0.082400f, - 0.468700f, - 0.137900f, - 0.193963f, - -0.453788f, - 0.080342f, - 0.000000f, - 0.390500f, - -0.906300f, - 0.161700f, - 0.437500f, - 0.137900f, - 0.156583f, - -0.473826f, - 0.031147f, - 0.000000f, - 0.316100f, - -0.946600f, - 0.062900f, - 0.468700f, - 0.103400f, - 0.193963f, - -0.453788f, - 0.080342f, - 0.000000f, - 0.390500f, - -0.906300f, - 0.161700f, - 0.437500f, - 0.137900f, - 0.147498f, - -0.473826f, - 0.061095f, - 0.000000f, - 0.297800f, - -0.946600f, - 0.123300f, - 0.437500f, - 0.103400f, - 0.483932f, - 0.080891f, - 0.096260f, - 0.000000f, - 0.967900f, - 0.161200f, - 0.192500f, - 0.468700f, - 0.551700f, - 0.472517f, - 0.133764f, - 0.093989f, - 0.000000f, - 0.945200f, - 0.266600f, - 0.188000f, - 0.468700f, - 0.586200f, - 0.445101f, - 0.133764f, - 0.184367f, - 0.000000f, - 0.890400f, - 0.266600f, - 0.368800f, - 0.437500f, - 0.586200f, - 0.483932f, - 0.080891f, - 0.096260f, - 0.000000f, - 0.967900f, - 0.161200f, - 0.192500f, - 0.468700f, - 0.551700f, - 0.445101f, - 0.133764f, - 0.184367f, - 0.000000f, - 0.890400f, - 0.266600f, - 0.368800f, - 0.437500f, - 0.586200f, - 0.455853f, - 0.080891f, - 0.188821f, - 0.000000f, - 0.911800f, - 0.161200f, - 0.377700f, - 0.437500f, - 0.551700f, - 0.105420f, - -0.488310f, - 0.020970f, - 0.000000f, - 0.214000f, - -0.975900f, - 0.042500f, - 0.468700f, - 0.069000f, - 0.156583f, - -0.473826f, - 0.031147f, - 0.000000f, - 0.316100f, - -0.946600f, - 0.062900f, - 0.468700f, - 0.103400f, - 0.147498f, - -0.473826f, - 0.061095f, - 0.000000f, - 0.297800f, - -0.946600f, - 0.123300f, - 0.437500f, - 0.103400f, - 0.105420f, - -0.488310f, - 0.020970f, - 0.000000f, - 0.214000f, - -0.975900f, - 0.042500f, - 0.468700f, - 0.069000f, - 0.147498f, - -0.473826f, - 0.061095f, - 0.000000f, - 0.297800f, - -0.946600f, - 0.123300f, - 0.437500f, - 0.103400f, - 0.099303f, - -0.488310f, - 0.041133f, - 0.000000f, - 0.201600f, - -0.975900f, - 0.083500f, - 0.437500f, - 0.069000f, - 0.489673f, - 0.027069f, - 0.097402f, - 0.000000f, - 0.979300f, - 0.054000f, - 0.194800f, - 0.468700f, - 0.517200f, - 0.483932f, - 0.080891f, - 0.096260f, - 0.000000f, - 0.967900f, - 0.161200f, - 0.192500f, - 0.468700f, - 0.551700f, - 0.455853f, - 0.080891f, - 0.188821f, - 0.000000f, - 0.911800f, - 0.161200f, - 0.377700f, - 0.437500f, - 0.551700f, - 0.489673f, - 0.027069f, - 0.097402f, - 0.000000f, - 0.979300f, - 0.054000f, - 0.194800f, - 0.468700f, - 0.517200f, - 0.455853f, - 0.080891f, - 0.188821f, - 0.000000f, - 0.911800f, - 0.161200f, - 0.377700f, - 0.437500f, - 0.551700f, - 0.461261f, - 0.027069f, - 0.191061f, - 0.000000f, - 0.922500f, - 0.054000f, - 0.382100f, - 0.437500f, - 0.517200f, - 0.053020f, - 0.497069f, - 0.010546f, - 0.000000f, - 0.109300f, - 0.993700f, - 0.021700f, - 0.458000f, - 0.962300f, - -0.000000f, - 0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - 1.000000f, - 0.000000f, - 0.482000f, - 0.960300f, - 0.049943f, - 0.497069f, - 0.020688f, - 0.000000f, - 0.103000f, - 0.993700f, - 0.042600f, - 0.459900f, - 0.962300f, - 0.053020f, - -0.497069f, - 0.010546f, - 0.000000f, - 0.109300f, - -0.993700f, - 0.021700f, - 0.468700f, - 0.034500f, - 0.105420f, - -0.488310f, - 0.020970f, - 0.000000f, - 0.214000f, - -0.975900f, - 0.042500f, - 0.468700f, - 0.069000f, - 0.099303f, - -0.488310f, - 0.041133f, - 0.000000f, - 0.201600f, - -0.975900f, - 0.083500f, - 0.437500f, - 0.069000f, - 0.053020f, - -0.497069f, - 0.010546f, - 0.000000f, - 0.109300f, - -0.993700f, - 0.021700f, - 0.468700f, - 0.034500f, - 0.099303f, - -0.488310f, - 0.041133f, - 0.000000f, - 0.201600f, - -0.975900f, - 0.083500f, - 0.437500f, - 0.069000f, - 0.049944f, - -0.497069f, - 0.020688f, - 0.000000f, - 0.103000f, - -0.993700f, - 0.042600f, - 0.437500f, - 0.034500f, - 0.489673f, - -0.027069f, - 0.097402f, - 0.000000f, - 0.979300f, - -0.054000f, - 0.194800f, - 0.468700f, - 0.482800f, - 0.489673f, - 0.027069f, - 0.097402f, - 0.000000f, - 0.979300f, - 0.054000f, - 0.194800f, - 0.468700f, - 0.517200f, - 0.461261f, - 0.027069f, - 0.191061f, - 0.000000f, - 0.922500f, - 0.054000f, - 0.382100f, - 0.437500f, - 0.517200f, - 0.489673f, - -0.027069f, - 0.097402f, - 0.000000f, - 0.979300f, - -0.054000f, - 0.194800f, - 0.468700f, - 0.482800f, - 0.461261f, - 0.027069f, - 0.191061f, - 0.000000f, - 0.922500f, - 0.054000f, - 0.382100f, - 0.437500f, - 0.517200f, - 0.461261f, - -0.027069f, - 0.191061f, - 0.000000f, - 0.922500f, - -0.054000f, - 0.382100f, - 0.437500f, - 0.482800f, - 0.105419f, - 0.488310f, - 0.020970f, - 0.000000f, - 0.214000f, - 0.975900f, - 0.042500f, - 0.468700f, - 0.931000f, - 0.053020f, - 0.497069f, - 0.010546f, - 0.000000f, - 0.109300f, - 0.993700f, - 0.021700f, - 0.468700f, - 0.965500f, - 0.049943f, - 0.497069f, - 0.020688f, - 0.000000f, - 0.103000f, - 0.993700f, - 0.042600f, - 0.437500f, - 0.965500f, - 0.105419f, - 0.488310f, - 0.020970f, - 0.000000f, - 0.214000f, - 0.975900f, - 0.042500f, - 0.468700f, - 0.931000f, - 0.049943f, - 0.497069f, - 0.020688f, - 0.000000f, - 0.103000f, - 0.993700f, - 0.042600f, - 0.437500f, - 0.965500f, - 0.099303f, - 0.488310f, - 0.041132f, - 0.000000f, - 0.201600f, - 0.975900f, - 0.083500f, - 0.437500f, - 0.931000f, - -0.000000f, - -0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - -1.000000f, - 0.000000f, - 0.411700f, - 0.051000f, - 0.053020f, - -0.497069f, - 0.010546f, - 0.000000f, - 0.109300f, - -0.993700f, - 0.021700f, - 0.449700f, - 0.053800f, - 0.049944f, - -0.497069f, - 0.020688f, - 0.000000f, - 0.103000f, - -0.993700f, - 0.042600f, - 0.447100f, - 0.053800f, - 0.483932f, - -0.080891f, - 0.096260f, - 0.000000f, - 0.967900f, - -0.161200f, - 0.192500f, - 0.468700f, - 0.448300f, - 0.489673f, - -0.027069f, - 0.097402f, - 0.000000f, - 0.979300f, - -0.054000f, - 0.194800f, - 0.468700f, - 0.482800f, - 0.461261f, - -0.027069f, - 0.191061f, - 0.000000f, - 0.922500f, - -0.054000f, - 0.382100f, - 0.437500f, - 0.482800f, - 0.483932f, - -0.080891f, - 0.096260f, - 0.000000f, - 0.967900f, - -0.161200f, - 0.192500f, - 0.468700f, - 0.448300f, - 0.461261f, - -0.027069f, - 0.191061f, - 0.000000f, - 0.922500f, - -0.054000f, - 0.382100f, - 0.437500f, - 0.482800f, - 0.455853f, - -0.080891f, - 0.188821f, - 0.000000f, - 0.911800f, - -0.161200f, - 0.377700f, - 0.437500f, - 0.448300f, - 0.156582f, - 0.473826f, - 0.031146f, - 0.000000f, - 0.316100f, - 0.946600f, - 0.062900f, - 0.468700f, - 0.896600f, - 0.105419f, - 0.488310f, - 0.020970f, - 0.000000f, - 0.214000f, - 0.975900f, - 0.042500f, - 0.468700f, - 0.931000f, - 0.099303f, - 0.488310f, - 0.041132f, - 0.000000f, - 0.201600f, - 0.975900f, - 0.083500f, - 0.437500f, - 0.931000f, - 0.156582f, - 0.473826f, - 0.031146f, - 0.000000f, - 0.316100f, - 0.946600f, - 0.062900f, - 0.468700f, - 0.896600f, - 0.099303f, - 0.488310f, - 0.041132f, - 0.000000f, - 0.201600f, - 0.975900f, - 0.083500f, - 0.437500f, - 0.931000f, - 0.147497f, - 0.473826f, - 0.061095f, - 0.000000f, - 0.297800f, - 0.946600f, - 0.123300f, - 0.437500f, - 0.896600f, - 0.472517f, - -0.133764f, - 0.093989f, - 0.000000f, - 0.945200f, - -0.266600f, - 0.188000f, - 0.468700f, - 0.413800f, - 0.483932f, - -0.080891f, - 0.096260f, - 0.000000f, - 0.967900f, - -0.161200f, - 0.192500f, - 0.468700f, - 0.448300f, - 0.455853f, - -0.080891f, - 0.188821f, - 0.000000f, - 0.911800f, - -0.161200f, - 0.377700f, - 0.437500f, - 0.448300f, - 0.472517f, - -0.133764f, - 0.093989f, - 0.000000f, - 0.945200f, - -0.266600f, - 0.188000f, - 0.468700f, - 0.413800f, - 0.455853f, - -0.080891f, - 0.188821f, - 0.000000f, - 0.911800f, - -0.161200f, - 0.377700f, - 0.437500f, - 0.448300f, - 0.445101f, - -0.133764f, - 0.184367f, - 0.000000f, - 0.890400f, - -0.266600f, - 0.368800f, - 0.437500f, - 0.413800f, - 0.205910f, - 0.453788f, - 0.040958f, - 0.000000f, - 0.414500f, - 0.906300f, - 0.082400f, - 0.468700f, - 0.862100f, - 0.156582f, - 0.473826f, - 0.031146f, - 0.000000f, - 0.316100f, - 0.946600f, - 0.062900f, - 0.468700f, - 0.896600f, - 0.147497f, - 0.473826f, - 0.061095f, - 0.000000f, - 0.297800f, - 0.946600f, - 0.123300f, - 0.437500f, - 0.896600f, - 0.205910f, - 0.453788f, - 0.040958f, - 0.000000f, - 0.414500f, - 0.906300f, - 0.082400f, - 0.468700f, - 0.862100f, - 0.147497f, - 0.473826f, - 0.061095f, - 0.000000f, - 0.297800f, - 0.946600f, - 0.123300f, - 0.437500f, - 0.896600f, - 0.193962f, - 0.453788f, - 0.080342f, - 0.000000f, - 0.390500f, - 0.906300f, - 0.161700f, - 0.437500f, - 0.862100f, - 0.455563f, - -0.185069f, - 0.090617f, - 0.000000f, - 0.911600f, - -0.369000f, - 0.181300f, - 0.468700f, - 0.379300f, - 0.472517f, - -0.133764f, - 0.093989f, - 0.000000f, - 0.945200f, - -0.266600f, - 0.188000f, - 0.468700f, - 0.413800f, - 0.445101f, - -0.133764f, - 0.184367f, - 0.000000f, - 0.890400f, - -0.266600f, - 0.368800f, - 0.437500f, - 0.413800f, - 0.455563f, - -0.185069f, - 0.090617f, - 0.000000f, - 0.911600f, - -0.369000f, - 0.181300f, - 0.468700f, - 0.379300f, - 0.445101f, - -0.133764f, - 0.184367f, - 0.000000f, - 0.890400f, - -0.266600f, - 0.368800f, - 0.437500f, - 0.413800f, - 0.429130f, - -0.185069f, - 0.177752f, - 0.000000f, - 0.858700f, - -0.369000f, - 0.355700f, - 0.437500f, - 0.379300f, - 0.252823f, - 0.428429f, - 0.050290f, - 0.000000f, - 0.508100f, - 0.855300f, - 0.101000f, - 0.468700f, - 0.827600f, - 0.205910f, - 0.453788f, - 0.040958f, - 0.000000f, - 0.414500f, - 0.906300f, - 0.082400f, - 0.468700f, - 0.862100f, - 0.193962f, - 0.453788f, - 0.080342f, - 0.000000f, - 0.390500f, - 0.906300f, - 0.161700f, - 0.437500f, - 0.862100f, - 0.252823f, - 0.428429f, - 0.050290f, - 0.000000f, - 0.508100f, - 0.855300f, - 0.101000f, - 0.468700f, - 0.827600f, - 0.193962f, - 0.453788f, - 0.080342f, - 0.000000f, - 0.390500f, - 0.906300f, - 0.161700f, - 0.437500f, - 0.862100f, - 0.238154f, - 0.428429f, - 0.098646f, - 0.000000f, - 0.478600f, - 0.855300f, - 0.198200f, - 0.437500f, - 0.827600f, - 0.433267f, - -0.234204f, - 0.086182f, - 0.000000f, - 0.867200f, - -0.467000f, - 0.172500f, - 0.468700f, - 0.344800f, - 0.455563f, - -0.185069f, - 0.090617f, - 0.000000f, - 0.911600f, - -0.369000f, - 0.181300f, - 0.468700f, - 0.379300f, - 0.429130f, - -0.185069f, - 0.177752f, - 0.000000f, - 0.858700f, - -0.369000f, - 0.355700f, - 0.437500f, - 0.379300f, - 0.433267f, - -0.234204f, - 0.086182f, - 0.000000f, - 0.867200f, - -0.467000f, - 0.172500f, - 0.468700f, - 0.344800f, - 0.429130f, - -0.185069f, - 0.177752f, - 0.000000f, - 0.858700f, - -0.369000f, - 0.355700f, - 0.437500f, - 0.379300f, - 0.408128f, - -0.234204f, - 0.169052f, - 0.000000f, - 0.816900f, - -0.467000f, - 0.338400f, - 0.437500f, - 0.344800f, - 0.296772f, - 0.398046f, - 0.059032f, - 0.000000f, - 0.595600f, - 0.794500f, - 0.118500f, - 0.468700f, - 0.793100f, - 0.252823f, - 0.428429f, - 0.050290f, - 0.000000f, - 0.508100f, - 0.855300f, - 0.101000f, - 0.468700f, - 0.827600f, - 0.238154f, - 0.428429f, - 0.098646f, - 0.000000f, - 0.478600f, - 0.855300f, - 0.198200f, - 0.437500f, - 0.827600f, - 0.296772f, - 0.398046f, - 0.059032f, - 0.000000f, - 0.595600f, - 0.794500f, - 0.118500f, - 0.468700f, - 0.793100f, - 0.238154f, - 0.428429f, - 0.098646f, - 0.000000f, - 0.478600f, - 0.855300f, - 0.198200f, - 0.437500f, - 0.827600f, - 0.279553f, - 0.398046f, - 0.115795f, - 0.000000f, - 0.561100f, - 0.794500f, - 0.232400f, - 0.437500f, - 0.793100f, - 0.405892f, - -0.280594f, - 0.080737f, - 0.000000f, - 0.812800f, - -0.559600f, - 0.161700f, - 0.468700f, - 0.310300f, - 0.433267f, - -0.234204f, - 0.086182f, - 0.000000f, - 0.867200f, - -0.467000f, - 0.172500f, - 0.468700f, - 0.344800f, - 0.408128f, - -0.234204f, - 0.169052f, - 0.000000f, - 0.816900f, - -0.467000f, - 0.338400f, - 0.437500f, - 0.344800f, - 0.405892f, - -0.280594f, - 0.080737f, - 0.000000f, - 0.812800f, - -0.559600f, - 0.161700f, - 0.468700f, - 0.310300f, - 0.408128f, - -0.234204f, - 0.169052f, - 0.000000f, - 0.816900f, - -0.467000f, - 0.338400f, - 0.437500f, - 0.344800f, - 0.382342f, - -0.280594f, - 0.158371f, - 0.000000f, - 0.765600f, - -0.559600f, - 0.317100f, - 0.437500f, - 0.310300f, - 0.337242f, - 0.362998f, - 0.067082f, - 0.000000f, - 0.676200f, - 0.724300f, - 0.134500f, - 0.468800f, - 0.758600f, - 0.296772f, - 0.398046f, - 0.059032f, - 0.000000f, - 0.595600f, - 0.794500f, - 0.118500f, - 0.468700f, - 0.793100f, - 0.279553f, - 0.398046f, - 0.115795f, - 0.000000f, - 0.561100f, - 0.794500f, - 0.232400f, - 0.437500f, - 0.793100f, - 0.337242f, - 0.362998f, - 0.067082f, - 0.000000f, - 0.676200f, - 0.724300f, - 0.134500f, - 0.468800f, - 0.758600f, - 0.279553f, - 0.398046f, - 0.115795f, - 0.000000f, - 0.561100f, - 0.794500f, - 0.232400f, - 0.437500f, - 0.793100f, - 0.317674f, - 0.362998f, - 0.131585f, - 0.000000f, - 0.637000f, - 0.724300f, - 0.263800f, - 0.437500f, - 0.758600f, - 0.373758f, - -0.323693f, - 0.074345f, - 0.000000f, - 0.748900f, - -0.645700f, - 0.149000f, - 0.468700f, - 0.275900f, - 0.405892f, - -0.280594f, - 0.080737f, - 0.000000f, - 0.812800f, - -0.559600f, - 0.161700f, - 0.468700f, - 0.310300f, - 0.382342f, - -0.280594f, - 0.158371f, - 0.000000f, - 0.765600f, - -0.559600f, - 0.317100f, - 0.437500f, - 0.310300f, - 0.373758f, - -0.323693f, - 0.074345f, - 0.000000f, - 0.748900f, - -0.645700f, - 0.149000f, - 0.468700f, - 0.275900f, - 0.382342f, - -0.280594f, - 0.158371f, - 0.000000f, - 0.765600f, - -0.559600f, - 0.317100f, - 0.437500f, - 0.310300f, - 0.352072f, - -0.323693f, - 0.145834f, - 0.000000f, - 0.705400f, - -0.645700f, - 0.292200f, - 0.437500f, - 0.275900f, - 0.455853f, - -0.080891f, - 0.188821f, - 0.000000f, - 0.911800f, - -0.161200f, - 0.377700f, - 0.437500f, - 0.448300f, - 0.461261f, - -0.027069f, - 0.191061f, - 0.000000f, - 0.922500f, - -0.054000f, - 0.382100f, - 0.437500f, - 0.482800f, - 0.415124f, - -0.027069f, - 0.277377f, - 0.000000f, - 0.830300f, - -0.054000f, - 0.554700f, - 0.406200f, - 0.482800f, - 0.455853f, - -0.080891f, - 0.188821f, - 0.000000f, - 0.911800f, - -0.161200f, - 0.377700f, - 0.437500f, - 0.448300f, - 0.415124f, - -0.027069f, - 0.277377f, - 0.000000f, - 0.830300f, - -0.054000f, - 0.554700f, - 0.406200f, - 0.482800f, - 0.410257f, - -0.080891f, - 0.274125f, - 0.000000f, - 0.820600f, - -0.161200f, - 0.548300f, - 0.406200f, - 0.448300f, - 0.147497f, - 0.473826f, - 0.061095f, - 0.000000f, - 0.297800f, - 0.946600f, - 0.123300f, - 0.437500f, - 0.896600f, - 0.099303f, - 0.488310f, - 0.041132f, - 0.000000f, - 0.201600f, - 0.975900f, - 0.083500f, - 0.437500f, - 0.931000f, - 0.089370f, - 0.488310f, - 0.059715f, - 0.000000f, - 0.181400f, - 0.975900f, - 0.121200f, - 0.406200f, - 0.931000f, - 0.147497f, - 0.473826f, - 0.061095f, - 0.000000f, - 0.297800f, - 0.946600f, - 0.123300f, - 0.437500f, - 0.896600f, - 0.089370f, - 0.488310f, - 0.059715f, - 0.000000f, - 0.181400f, - 0.975900f, - 0.121200f, - 0.406200f, - 0.931000f, - 0.132744f, - 0.473826f, - 0.088697f, - 0.000000f, - 0.268000f, - 0.946600f, - 0.179100f, - 0.406200f, - 0.896600f, - 0.445101f, - -0.133764f, - 0.184367f, - 0.000000f, - 0.890400f, - -0.266600f, - 0.368800f, - 0.437500f, - 0.413800f, - 0.455853f, - -0.080891f, - 0.188821f, - 0.000000f, - 0.911800f, - -0.161200f, - 0.377700f, - 0.437500f, - 0.448300f, - 0.410257f, - -0.080891f, - 0.274125f, - 0.000000f, - 0.820600f, - -0.161200f, - 0.548300f, - 0.406200f, - 0.448300f, - 0.445101f, - -0.133764f, - 0.184367f, - 0.000000f, - 0.890400f, - -0.266600f, - 0.368800f, - 0.437500f, - 0.413800f, - 0.410257f, - -0.080891f, - 0.274125f, - 0.000000f, - 0.820600f, - -0.161200f, - 0.548300f, - 0.406200f, - 0.448300f, - 0.400580f, - -0.133764f, - 0.267659f, - 0.000000f, - 0.801400f, - -0.266600f, - 0.535400f, - 0.406200f, - 0.413800f, - 0.193962f, - 0.453788f, - 0.080342f, - 0.000000f, - 0.390500f, - 0.906300f, - 0.161700f, - 0.437500f, - 0.862100f, - 0.147497f, - 0.473826f, - 0.061095f, - 0.000000f, - 0.297800f, - 0.946600f, - 0.123300f, - 0.437500f, - 0.896600f, - 0.132744f, - 0.473826f, - 0.088697f, - 0.000000f, - 0.268000f, - 0.946600f, - 0.179100f, - 0.406200f, - 0.896600f, - 0.193962f, - 0.453788f, - 0.080342f, - 0.000000f, - 0.390500f, - 0.906300f, - 0.161700f, - 0.437500f, - 0.862100f, - 0.132744f, - 0.473826f, - 0.088697f, - 0.000000f, - 0.268000f, - 0.946600f, - 0.179100f, - 0.406200f, - 0.896600f, - 0.174562f, - 0.453788f, - 0.116638f, - 0.000000f, - 0.351400f, - 0.906300f, - 0.234800f, - 0.406200f, - 0.862100f, - 0.429130f, - -0.185069f, - 0.177752f, - 0.000000f, - 0.858700f, - -0.369000f, - 0.355700f, - 0.437500f, - 0.379300f, - 0.445101f, - -0.133764f, - 0.184367f, - 0.000000f, - 0.890400f, - -0.266600f, - 0.368800f, - 0.437500f, - 0.413800f, - 0.400580f, - -0.133764f, - 0.267659f, - 0.000000f, - 0.801400f, - -0.266600f, - 0.535400f, - 0.406200f, - 0.413800f, - 0.429130f, - -0.185069f, - 0.177752f, - 0.000000f, - 0.858700f, - -0.369000f, - 0.355700f, - 0.437500f, - 0.379300f, - 0.400580f, - -0.133764f, - 0.267659f, - 0.000000f, - 0.801400f, - -0.266600f, - 0.535400f, - 0.406200f, - 0.413800f, - 0.386207f, - -0.185069f, - 0.258056f, - 0.000000f, - 0.772800f, - -0.369000f, - 0.516300f, - 0.406200f, - 0.379300f, - 0.238154f, - 0.428429f, - 0.098646f, - 0.000000f, - 0.478600f, - 0.855300f, - 0.198200f, - 0.437500f, - 0.827600f, - 0.193962f, - 0.453788f, - 0.080342f, - 0.000000f, - 0.390500f, - 0.906300f, - 0.161700f, - 0.437500f, - 0.862100f, - 0.174562f, - 0.453788f, - 0.116638f, - 0.000000f, - 0.351400f, - 0.906300f, - 0.234800f, - 0.406200f, - 0.862100f, - 0.238154f, - 0.428429f, - 0.098646f, - 0.000000f, - 0.478600f, - 0.855300f, - 0.198200f, - 0.437500f, - 0.827600f, - 0.174562f, - 0.453788f, - 0.116638f, - 0.000000f, - 0.351400f, - 0.906300f, - 0.234800f, - 0.406200f, - 0.862100f, - 0.214333f, - 0.428429f, - 0.143213f, - 0.000000f, - 0.430700f, - 0.855300f, - 0.287800f, - 0.406200f, - 0.827600f, - 0.408128f, - -0.234204f, - 0.169052f, - 0.000000f, - 0.816900f, - -0.467000f, - 0.338400f, - 0.437500f, - 0.344800f, - 0.429130f, - -0.185069f, - 0.177752f, - 0.000000f, - 0.858700f, - -0.369000f, - 0.355700f, - 0.437500f, - 0.379300f, - 0.386207f, - -0.185069f, - 0.258056f, - 0.000000f, - 0.772800f, - -0.369000f, - 0.516300f, - 0.406200f, - 0.379300f, - 0.408128f, - -0.234204f, - 0.169052f, - 0.000000f, - 0.816900f, - -0.467000f, - 0.338400f, - 0.437500f, - 0.344800f, - 0.386207f, - -0.185069f, - 0.258056f, - 0.000000f, - 0.772800f, - -0.369000f, - 0.516300f, - 0.406200f, - 0.379300f, - 0.367306f, - -0.234204f, - 0.245426f, - 0.000000f, - 0.735200f, - -0.467000f, - 0.491300f, - 0.406200f, - 0.344800f, - 0.279553f, - 0.398046f, - 0.115795f, - 0.000000f, - 0.561100f, - 0.794500f, - 0.232400f, - 0.437500f, - 0.793100f, - 0.238154f, - 0.428429f, - 0.098646f, - 0.000000f, - 0.478600f, - 0.855300f, - 0.198200f, - 0.437500f, - 0.827600f, - 0.214333f, - 0.428429f, - 0.143213f, - 0.000000f, - 0.430700f, - 0.855300f, - 0.287800f, - 0.406200f, - 0.827600f, - 0.279553f, - 0.398046f, - 0.115795f, - 0.000000f, - 0.561100f, - 0.794500f, - 0.232400f, - 0.437500f, - 0.793100f, - 0.214333f, - 0.428429f, - 0.143213f, - 0.000000f, - 0.430700f, - 0.855300f, - 0.287800f, - 0.406200f, - 0.827600f, - 0.251591f, - 0.398046f, - 0.168108f, - 0.000000f, - 0.505000f, - 0.794500f, - 0.337400f, - 0.406200f, - 0.793100f, - 0.382342f, - -0.280594f, - 0.158371f, - 0.000000f, - 0.765600f, - -0.559600f, - 0.317100f, - 0.437500f, - 0.310300f, - 0.408128f, - -0.234204f, - 0.169052f, - 0.000000f, - 0.816900f, - -0.467000f, - 0.338400f, - 0.437500f, - 0.344800f, - 0.367306f, - -0.234204f, - 0.245426f, - 0.000000f, - 0.735200f, - -0.467000f, - 0.491300f, - 0.406200f, - 0.344800f, - 0.382342f, - -0.280594f, - 0.158371f, - 0.000000f, - 0.765600f, - -0.559600f, - 0.317100f, - 0.437500f, - 0.310300f, - 0.367306f, - -0.234204f, - 0.245426f, - 0.000000f, - 0.735200f, - -0.467000f, - 0.491300f, - 0.406200f, - 0.344800f, - 0.344098f, - -0.280594f, - 0.229919f, - 0.000000f, - 0.689100f, - -0.559600f, - 0.460400f, - 0.406200f, - 0.310300f, - 0.317674f, - 0.362998f, - 0.131585f, - 0.000000f, - 0.637000f, - 0.724300f, - 0.263800f, - 0.437500f, - 0.758600f, - 0.279553f, - 0.398046f, - 0.115795f, - 0.000000f, - 0.561100f, - 0.794500f, - 0.232400f, - 0.437500f, - 0.793100f, - 0.251591f, - 0.398046f, - 0.168108f, - 0.000000f, - 0.505000f, - 0.794500f, - 0.337400f, - 0.406200f, - 0.793100f, - 0.317674f, - 0.362998f, - 0.131585f, - 0.000000f, - 0.637000f, - 0.724300f, - 0.263800f, - 0.437500f, - 0.758600f, - 0.251591f, - 0.398046f, - 0.168108f, - 0.000000f, - 0.505000f, - 0.794500f, - 0.337400f, - 0.406200f, - 0.793100f, - 0.285899f, - 0.362998f, - 0.191032f, - 0.000000f, - 0.573300f, - 0.724300f, - 0.383000f, - 0.406200f, - 0.758600f, - 0.352072f, - -0.323693f, - 0.145834f, - 0.000000f, - 0.705400f, - -0.645700f, - 0.292200f, - 0.437500f, - 0.275900f, - 0.382342f, - -0.280594f, - 0.158371f, - 0.000000f, - 0.765600f, - -0.559600f, - 0.317100f, - 0.437500f, - 0.310300f, - 0.344098f, - -0.280594f, - 0.229919f, - 0.000000f, - 0.689100f, - -0.559600f, - 0.460400f, - 0.406200f, - 0.310300f, - 0.352072f, - -0.323693f, - 0.145834f, - 0.000000f, - 0.705400f, - -0.645700f, - 0.292200f, - 0.437500f, - 0.275900f, - 0.344098f, - -0.280594f, - 0.229919f, - 0.000000f, - 0.689100f, - -0.559600f, - 0.460400f, - 0.406200f, - 0.310300f, - 0.316857f, - -0.323693f, - 0.211717f, - 0.000000f, - 0.634900f, - -0.645700f, - 0.424200f, - 0.406200f, - 0.275900f, - 0.352072f, - 0.323693f, - 0.145833f, - 0.000000f, - 0.705400f, - 0.645700f, - 0.292200f, - 0.437500f, - 0.724100f, - 0.317674f, - 0.362998f, - 0.131585f, - 0.000000f, - 0.637000f, - 0.724300f, - 0.263800f, - 0.437500f, - 0.758600f, - 0.285899f, - 0.362998f, - 0.191032f, - 0.000000f, - 0.573300f, - 0.724300f, - 0.383000f, - 0.406200f, - 0.758600f, - 0.352072f, - 0.323693f, - 0.145833f, - 0.000000f, - 0.705400f, - 0.645700f, - 0.292200f, - 0.437500f, - 0.724100f, - 0.285899f, - 0.362998f, - 0.191032f, - 0.000000f, - 0.573300f, - 0.724300f, - 0.383000f, - 0.406200f, - 0.758600f, - 0.316857f, - 0.323693f, - 0.211717f, - 0.000000f, - 0.634900f, - 0.645700f, - 0.424200f, - 0.406200f, - 0.724100f, - 0.317675f, - -0.362998f, - 0.131585f, - 0.000000f, - 0.637000f, - -0.724300f, - 0.263800f, - 0.437500f, - 0.241400f, - 0.352072f, - -0.323693f, - 0.145834f, - 0.000000f, - 0.705400f, - -0.645700f, - 0.292200f, - 0.437500f, - 0.275900f, - 0.316857f, - -0.323693f, - 0.211717f, - 0.000000f, - 0.634900f, - -0.645700f, - 0.424200f, - 0.406200f, - 0.275900f, - 0.317675f, - -0.362998f, - 0.131585f, - 0.000000f, - 0.637000f, - -0.724300f, - 0.263800f, - 0.437500f, - 0.241400f, - 0.316857f, - -0.323693f, - 0.211717f, - 0.000000f, - 0.634900f, - -0.645700f, - 0.424200f, - 0.406200f, - 0.275900f, - 0.285900f, - -0.362998f, - 0.191032f, - 0.000000f, - 0.573300f, - -0.724300f, - 0.383000f, - 0.406200f, - 0.241400f, - 0.382342f, - 0.280594f, - 0.158371f, - 0.000000f, - 0.765600f, - 0.559600f, - 0.317100f, - 0.437500f, - 0.689700f, - 0.352072f, - 0.323693f, - 0.145833f, - 0.000000f, - 0.705400f, - 0.645700f, - 0.292200f, - 0.437500f, - 0.724100f, - 0.316857f, - 0.323693f, - 0.211717f, - 0.000000f, - 0.634900f, - 0.645700f, - 0.424200f, - 0.406200f, - 0.724100f, - 0.382342f, - 0.280594f, - 0.158371f, - 0.000000f, - 0.765600f, - 0.559600f, - 0.317100f, - 0.437500f, - 0.689700f, - 0.316857f, - 0.323693f, - 0.211717f, - 0.000000f, - 0.634900f, - 0.645700f, - 0.424200f, - 0.406200f, - 0.724100f, - 0.344098f, - 0.280594f, - 0.229919f, - 0.000000f, - 0.689100f, - 0.559600f, - 0.460400f, - 0.406200f, - 0.689700f, - 0.279553f, - -0.398046f, - 0.115795f, - 0.000000f, - 0.561100f, - -0.794500f, - 0.232400f, - 0.437500f, - 0.206900f, - 0.317675f, - -0.362998f, - 0.131585f, - 0.000000f, - 0.637000f, - -0.724300f, - 0.263800f, - 0.437500f, - 0.241400f, - 0.285900f, - -0.362998f, - 0.191032f, - 0.000000f, - 0.573300f, - -0.724300f, - 0.383000f, - 0.406200f, - 0.241400f, - 0.279553f, - -0.398046f, - 0.115795f, - 0.000000f, - 0.561100f, - -0.794500f, - 0.232400f, - 0.437500f, - 0.206900f, - 0.285900f, - -0.362998f, - 0.191032f, - 0.000000f, - 0.573300f, - -0.724300f, - 0.383000f, - 0.406200f, - 0.241400f, - 0.251591f, - -0.398046f, - 0.168108f, - 0.000000f, - 0.504900f, - -0.794500f, - 0.337400f, - 0.406200f, - 0.206900f, - 0.408128f, - 0.234204f, - 0.169052f, - 0.000000f, - 0.816900f, - 0.467000f, - 0.338400f, - 0.437500f, - 0.655200f, - 0.382342f, - 0.280594f, - 0.158371f, - 0.000000f, - 0.765600f, - 0.559600f, - 0.317100f, - 0.437500f, - 0.689700f, - 0.344098f, - 0.280594f, - 0.229919f, - 0.000000f, - 0.689100f, - 0.559600f, - 0.460400f, - 0.406200f, - 0.689700f, - 0.408128f, - 0.234204f, - 0.169052f, - 0.000000f, - 0.816900f, - 0.467000f, - 0.338400f, - 0.437500f, - 0.655200f, - 0.344098f, - 0.280594f, - 0.229919f, - 0.000000f, - 0.689100f, - 0.559600f, - 0.460400f, - 0.406200f, - 0.689700f, - 0.367306f, - 0.234204f, - 0.245426f, - 0.000000f, - 0.735200f, - 0.467000f, - 0.491300f, - 0.406200f, - 0.655200f, - 0.238154f, - -0.428429f, - 0.098647f, - 0.000000f, - 0.478600f, - -0.855300f, - 0.198200f, - 0.437500f, - 0.172400f, - 0.279553f, - -0.398046f, - 0.115795f, - 0.000000f, - 0.561100f, - -0.794500f, - 0.232400f, - 0.437500f, - 0.206900f, - 0.251591f, - -0.398046f, - 0.168108f, - 0.000000f, - 0.504900f, - -0.794500f, - 0.337400f, - 0.406200f, - 0.206900f, - 0.238154f, - -0.428429f, - 0.098647f, - 0.000000f, - 0.478600f, - -0.855300f, - 0.198200f, - 0.437500f, - 0.172400f, - 0.251591f, - -0.398046f, - 0.168108f, - 0.000000f, - 0.504900f, - -0.794500f, - 0.337400f, - 0.406200f, - 0.206900f, - 0.214333f, - -0.428429f, - 0.143213f, - 0.000000f, - 0.430700f, - -0.855300f, - 0.287800f, - 0.406200f, - 0.172400f, - 0.429130f, - 0.185069f, - 0.177752f, - 0.000000f, - 0.858700f, - 0.369000f, - 0.355700f, - 0.437500f, - 0.620700f, - 0.408128f, - 0.234204f, - 0.169052f, - 0.000000f, - 0.816900f, - 0.467000f, - 0.338400f, - 0.437500f, - 0.655200f, - 0.367306f, - 0.234204f, - 0.245426f, - 0.000000f, - 0.735200f, - 0.467000f, - 0.491300f, - 0.406200f, - 0.655200f, - 0.429130f, - 0.185069f, - 0.177752f, - 0.000000f, - 0.858700f, - 0.369000f, - 0.355700f, - 0.437500f, - 0.620700f, - 0.367306f, - 0.234204f, - 0.245426f, - 0.000000f, - 0.735200f, - 0.467000f, - 0.491300f, - 0.406200f, - 0.655200f, - 0.386207f, - 0.185069f, - 0.258056f, - 0.000000f, - 0.772800f, - 0.369000f, - 0.516300f, - 0.406200f, - 0.620700f, - 0.193963f, - -0.453788f, - 0.080342f, - 0.000000f, - 0.390500f, - -0.906300f, - 0.161700f, - 0.437500f, - 0.137900f, - 0.238154f, - -0.428429f, - 0.098647f, - 0.000000f, - 0.478600f, - -0.855300f, - 0.198200f, - 0.437500f, - 0.172400f, - 0.214333f, - -0.428429f, - 0.143213f, - 0.000000f, - 0.430700f, - -0.855300f, - 0.287800f, - 0.406200f, - 0.172400f, - 0.193963f, - -0.453788f, - 0.080342f, - 0.000000f, - 0.390500f, - -0.906300f, - 0.161700f, - 0.437500f, - 0.137900f, - 0.214333f, - -0.428429f, - 0.143213f, - 0.000000f, - 0.430700f, - -0.855300f, - 0.287800f, - 0.406200f, - 0.172400f, - 0.174562f, - -0.453788f, - 0.116639f, - 0.000000f, - 0.351400f, - -0.906300f, - 0.234800f, - 0.406200f, - 0.137900f, - 0.445101f, - 0.133764f, - 0.184367f, - 0.000000f, - 0.890400f, - 0.266600f, - 0.368800f, - 0.437500f, - 0.586200f, - 0.429130f, - 0.185069f, - 0.177752f, - 0.000000f, - 0.858700f, - 0.369000f, - 0.355700f, - 0.437500f, - 0.620700f, - 0.386207f, - 0.185069f, - 0.258056f, - 0.000000f, - 0.772800f, - 0.369000f, - 0.516300f, - 0.406200f, - 0.620700f, - 0.445101f, - 0.133764f, - 0.184367f, - 0.000000f, - 0.890400f, - 0.266600f, - 0.368800f, - 0.437500f, - 0.586200f, - 0.386207f, - 0.185069f, - 0.258056f, - 0.000000f, - 0.772800f, - 0.369000f, - 0.516300f, - 0.406200f, - 0.620700f, - 0.400580f, - 0.133764f, - 0.267659f, - 0.000000f, - 0.801400f, - 0.266600f, - 0.535400f, - 0.406200f, - 0.586200f, - 0.147498f, - -0.473826f, - 0.061095f, - 0.000000f, - 0.297800f, - -0.946600f, - 0.123300f, - 0.437500f, - 0.103400f, - 0.193963f, - -0.453788f, - 0.080342f, - 0.000000f, - 0.390500f, - -0.906300f, - 0.161700f, - 0.437500f, - 0.137900f, - 0.174562f, - -0.453788f, - 0.116639f, - 0.000000f, - 0.351400f, - -0.906300f, - 0.234800f, - 0.406200f, - 0.137900f, - 0.147498f, - -0.473826f, - 0.061095f, - 0.000000f, - 0.297800f, - -0.946600f, - 0.123300f, - 0.437500f, - 0.103400f, - 0.174562f, - -0.453788f, - 0.116639f, - 0.000000f, - 0.351400f, - -0.906300f, - 0.234800f, - 0.406200f, - 0.137900f, - 0.132744f, - -0.473826f, - 0.088697f, - 0.000000f, - 0.268000f, - -0.946600f, - 0.179100f, - 0.406200f, - 0.103400f, - 0.455853f, - 0.080891f, - 0.188821f, - 0.000000f, - 0.911800f, - 0.161200f, - 0.377700f, - 0.437500f, - 0.551700f, - 0.445101f, - 0.133764f, - 0.184367f, - 0.000000f, - 0.890400f, - 0.266600f, - 0.368800f, - 0.437500f, - 0.586200f, - 0.400580f, - 0.133764f, - 0.267659f, - 0.000000f, - 0.801400f, - 0.266600f, - 0.535400f, - 0.406200f, - 0.586200f, - 0.455853f, - 0.080891f, - 0.188821f, - 0.000000f, - 0.911800f, - 0.161200f, - 0.377700f, - 0.437500f, - 0.551700f, - 0.400580f, - 0.133764f, - 0.267659f, - 0.000000f, - 0.801400f, - 0.266600f, - 0.535400f, - 0.406200f, - 0.586200f, - 0.410257f, - 0.080891f, - 0.274125f, - 0.000000f, - 0.820600f, - 0.161200f, - 0.548300f, - 0.406200f, - 0.551700f, - 0.099303f, - -0.488310f, - 0.041133f, - 0.000000f, - 0.201600f, - -0.975900f, - 0.083500f, - 0.437500f, - 0.069000f, - 0.147498f, - -0.473826f, - 0.061095f, - 0.000000f, - 0.297800f, - -0.946600f, - 0.123300f, - 0.437500f, - 0.103400f, - 0.132744f, - -0.473826f, - 0.088697f, - 0.000000f, - 0.268000f, - -0.946600f, - 0.179100f, - 0.406200f, - 0.103400f, - 0.099303f, - -0.488310f, - 0.041133f, - 0.000000f, - 0.201600f, - -0.975900f, - 0.083500f, - 0.437500f, - 0.069000f, - 0.132744f, - -0.473826f, - 0.088697f, - 0.000000f, - 0.268000f, - -0.946600f, - 0.179100f, - 0.406200f, - 0.103400f, - 0.089370f, - -0.488310f, - 0.059715f, - 0.000000f, - 0.181400f, - -0.975900f, - 0.121200f, - 0.406200f, - 0.069000f, - 0.461261f, - 0.027069f, - 0.191061f, - 0.000000f, - 0.922500f, - 0.054000f, - 0.382100f, - 0.437500f, - 0.517200f, - 0.455853f, - 0.080891f, - 0.188821f, - 0.000000f, - 0.911800f, - 0.161200f, - 0.377700f, - 0.437500f, - 0.551700f, - 0.410257f, - 0.080891f, - 0.274125f, - 0.000000f, - 0.820600f, - 0.161200f, - 0.548300f, - 0.406200f, - 0.551700f, - 0.461261f, - 0.027069f, - 0.191061f, - 0.000000f, - 0.922500f, - 0.054000f, - 0.382100f, - 0.437500f, - 0.517200f, - 0.410257f, - 0.080891f, - 0.274125f, - 0.000000f, - 0.820600f, - 0.161200f, - 0.548300f, - 0.406200f, - 0.551700f, - 0.415124f, - 0.027069f, - 0.277377f, - 0.000000f, - 0.830300f, - 0.054000f, - 0.554700f, - 0.406200f, - 0.517200f, - 0.049943f, - 0.497069f, - 0.020688f, - 0.000000f, - 0.103000f, - 0.993700f, - 0.042600f, - 0.459900f, - 0.962300f, - -0.000000f, - 0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - 1.000000f, - 0.000000f, - 0.482000f, - 0.960300f, - 0.044948f, - 0.497069f, - 0.030034f, - 0.000000f, - 0.092700f, - 0.993700f, - 0.061900f, - 0.461700f, - 0.962300f, - 0.049944f, - -0.497069f, - 0.020688f, - 0.000000f, - 0.103000f, - -0.993700f, - 0.042600f, - 0.437500f, - 0.034500f, - 0.099303f, - -0.488310f, - 0.041133f, - 0.000000f, - 0.201600f, - -0.975900f, - 0.083500f, - 0.437500f, - 0.069000f, - 0.089370f, - -0.488310f, - 0.059715f, - 0.000000f, - 0.181400f, - -0.975900f, - 0.121200f, - 0.406200f, - 0.069000f, - 0.049944f, - -0.497069f, - 0.020688f, - 0.000000f, - 0.103000f, - -0.993700f, - 0.042600f, - 0.437500f, - 0.034500f, - 0.089370f, - -0.488310f, - 0.059715f, - 0.000000f, - 0.181400f, - -0.975900f, - 0.121200f, - 0.406200f, - 0.069000f, - 0.044948f, - -0.497069f, - 0.030034f, - 0.000000f, - 0.092700f, - -0.993700f, - 0.061900f, - 0.406200f, - 0.034500f, - 0.461261f, - -0.027069f, - 0.191061f, - 0.000000f, - 0.922500f, - -0.054000f, - 0.382100f, - 0.437500f, - 0.482800f, - 0.461261f, - 0.027069f, - 0.191061f, - 0.000000f, - 0.922500f, - 0.054000f, - 0.382100f, - 0.437500f, - 0.517200f, - 0.415124f, - 0.027069f, - 0.277377f, - 0.000000f, - 0.830300f, - 0.054000f, - 0.554700f, - 0.406200f, - 0.517200f, - 0.461261f, - -0.027069f, - 0.191061f, - 0.000000f, - 0.922500f, - -0.054000f, - 0.382100f, - 0.437500f, - 0.482800f, - 0.415124f, - 0.027069f, - 0.277377f, - 0.000000f, - 0.830300f, - 0.054000f, - 0.554700f, - 0.406200f, - 0.517200f, - 0.415124f, - -0.027069f, - 0.277377f, - 0.000000f, - 0.830300f, - -0.054000f, - 0.554700f, - 0.406200f, - 0.482800f, - 0.099303f, - 0.488310f, - 0.041132f, - 0.000000f, - 0.201600f, - 0.975900f, - 0.083500f, - 0.437500f, - 0.931000f, - 0.049943f, - 0.497069f, - 0.020688f, - 0.000000f, - 0.103000f, - 0.993700f, - 0.042600f, - 0.437500f, - 0.965500f, - 0.044948f, - 0.497069f, - 0.030034f, - 0.000000f, - 0.092700f, - 0.993700f, - 0.061900f, - 0.406200f, - 0.965500f, - 0.099303f, - 0.488310f, - 0.041132f, - 0.000000f, - 0.201600f, - 0.975900f, - 0.083500f, - 0.437500f, - 0.931000f, - 0.044948f, - 0.497069f, - 0.030034f, - 0.000000f, - 0.092700f, - 0.993700f, - 0.061900f, - 0.406200f, - 0.965500f, - 0.089370f, - 0.488310f, - 0.059715f, - 0.000000f, - 0.181400f, - 0.975900f, - 0.121200f, - 0.406200f, - 0.931000f, - -0.000000f, - -0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - -1.000000f, - 0.000000f, - 0.411700f, - 0.051000f, - 0.049944f, - -0.497069f, - 0.020688f, - 0.000000f, - 0.103000f, - -0.993700f, - 0.042600f, - 0.447100f, - 0.053800f, - 0.044948f, - -0.497069f, - 0.030034f, - 0.000000f, - 0.092700f, - -0.993700f, - 0.061900f, - 0.444400f, - 0.053800f, - 0.214333f, - -0.428429f, - 0.143213f, - 0.000000f, - 0.430700f, - -0.855300f, - 0.287800f, - 0.406200f, - 0.172400f, - 0.251591f, - -0.398046f, - 0.168108f, - 0.000000f, - 0.504900f, - -0.794500f, - 0.337400f, - 0.406200f, - 0.206900f, - 0.213960f, - -0.398046f, - 0.213961f, - 0.000000f, - 0.429400f, - -0.794500f, - 0.429400f, - 0.375000f, - 0.206900f, - 0.214333f, - -0.428429f, - 0.143213f, - 0.000000f, - 0.430700f, - -0.855300f, - 0.287800f, - 0.406200f, - 0.172400f, - 0.213960f, - -0.398046f, - 0.213961f, - 0.000000f, - 0.429400f, - -0.794500f, - 0.429400f, - 0.375000f, - 0.206900f, - 0.182275f, - -0.428429f, - 0.182276f, - 0.000000f, - 0.366300f, - -0.855300f, - 0.366300f, - 0.375000f, - 0.172400f, - 0.386207f, - 0.185069f, - 0.258056f, - 0.000000f, - 0.772800f, - 0.369000f, - 0.516300f, - 0.406200f, - 0.620700f, - 0.367306f, - 0.234204f, - 0.245426f, - 0.000000f, - 0.735200f, - 0.467000f, - 0.491300f, - 0.406200f, - 0.655200f, - 0.312368f, - 0.234204f, - 0.312368f, - 0.000000f, - 0.625200f, - 0.467000f, - 0.625200f, - 0.375000f, - 0.655200f, - 0.386207f, - 0.185069f, - 0.258056f, - 0.000000f, - 0.772800f, - 0.369000f, - 0.516300f, - 0.406200f, - 0.620700f, - 0.312368f, - 0.234204f, - 0.312368f, - 0.000000f, - 0.625200f, - 0.467000f, - 0.625200f, - 0.375000f, - 0.655200f, - 0.328442f, - 0.185069f, - 0.328443f, - 0.000000f, - 0.657200f, - 0.369000f, - 0.657200f, - 0.375000f, - 0.620700f, - 0.174562f, - -0.453788f, - 0.116639f, - 0.000000f, - 0.351400f, - -0.906300f, - 0.234800f, - 0.406200f, - 0.137900f, - 0.214333f, - -0.428429f, - 0.143213f, - 0.000000f, - 0.430700f, - -0.855300f, - 0.287800f, - 0.406200f, - 0.172400f, - 0.182275f, - -0.428429f, - 0.182276f, - 0.000000f, - 0.366300f, - -0.855300f, - 0.366300f, - 0.375000f, - 0.172400f, - 0.174562f, - -0.453788f, - 0.116639f, - 0.000000f, - 0.351400f, - -0.906300f, - 0.234800f, - 0.406200f, - 0.137900f, - 0.182275f, - -0.428429f, - 0.182276f, - 0.000000f, - 0.366300f, - -0.855300f, - 0.366300f, - 0.375000f, - 0.172400f, - 0.148453f, - -0.453788f, - 0.148453f, - 0.000000f, - 0.298900f, - -0.906300f, - 0.298900f, - 0.375000f, - 0.137900f, - 0.400580f, - 0.133764f, - 0.267659f, - 0.000000f, - 0.801400f, - 0.266600f, - 0.535400f, - 0.406200f, - 0.586200f, - 0.386207f, - 0.185069f, - 0.258056f, - 0.000000f, - 0.772800f, - 0.369000f, - 0.516300f, - 0.406200f, - 0.620700f, - 0.328442f, - 0.185069f, - 0.328443f, - 0.000000f, - 0.657200f, - 0.369000f, - 0.657200f, - 0.375000f, - 0.620700f, - 0.400580f, - 0.133764f, - 0.267659f, - 0.000000f, - 0.801400f, - 0.266600f, - 0.535400f, - 0.406200f, - 0.586200f, - 0.328442f, - 0.185069f, - 0.328443f, - 0.000000f, - 0.657200f, - 0.369000f, - 0.657200f, - 0.375000f, - 0.620700f, - 0.340665f, - 0.133764f, - 0.340666f, - 0.000000f, - 0.681500f, - 0.266600f, - 0.681500f, - 0.375000f, - 0.586200f, - 0.132744f, - -0.473826f, - 0.088697f, - 0.000000f, - 0.268000f, - -0.946600f, - 0.179100f, - 0.406200f, - 0.103400f, - 0.174562f, - -0.453788f, - 0.116639f, - 0.000000f, - 0.351400f, - -0.906300f, - 0.234800f, - 0.406200f, - 0.137900f, - 0.148453f, - -0.453788f, - 0.148453f, - 0.000000f, - 0.298900f, - -0.906300f, - 0.298900f, - 0.375000f, - 0.137900f, - 0.132744f, - -0.473826f, - 0.088697f, - 0.000000f, - 0.268000f, - -0.946600f, - 0.179100f, - 0.406200f, - 0.103400f, - 0.148453f, - -0.453788f, - 0.148453f, - 0.000000f, - 0.298900f, - -0.906300f, - 0.298900f, - 0.375000f, - 0.137900f, - 0.112889f, - -0.473826f, - 0.112890f, - 0.000000f, - 0.227900f, - -0.946600f, - 0.227900f, - 0.375000f, - 0.103400f, - 0.410257f, - 0.080891f, - 0.274125f, - 0.000000f, - 0.820600f, - 0.161200f, - 0.548300f, - 0.406200f, - 0.551700f, - 0.400580f, - 0.133764f, - 0.267659f, - 0.000000f, - 0.801400f, - 0.266600f, - 0.535400f, - 0.406200f, - 0.586200f, - 0.340665f, - 0.133764f, - 0.340666f, - 0.000000f, - 0.681500f, - 0.266600f, - 0.681500f, - 0.375000f, - 0.586200f, - 0.410257f, - 0.080891f, - 0.274125f, - 0.000000f, - 0.820600f, - 0.161200f, - 0.548300f, - 0.406200f, - 0.551700f, - 0.340665f, - 0.133764f, - 0.340666f, - 0.000000f, - 0.681500f, - 0.266600f, - 0.681500f, - 0.375000f, - 0.586200f, - 0.348895f, - 0.080891f, - 0.348895f, - 0.000000f, - 0.697800f, - 0.161200f, - 0.697800f, - 0.375000f, - 0.551700f, - 0.089370f, - -0.488310f, - 0.059715f, - 0.000000f, - 0.181400f, - -0.975900f, - 0.121200f, - 0.406200f, - 0.069000f, - 0.132744f, - -0.473826f, - 0.088697f, - 0.000000f, - 0.268000f, - -0.946600f, - 0.179100f, - 0.406200f, - 0.103400f, - 0.112889f, - -0.473826f, - 0.112890f, - 0.000000f, - 0.227900f, - -0.946600f, - 0.227900f, - 0.375000f, - 0.103400f, - 0.089370f, - -0.488310f, - 0.059715f, - 0.000000f, - 0.181400f, - -0.975900f, - 0.121200f, - 0.406200f, - 0.069000f, - 0.112889f, - -0.473826f, - 0.112890f, - 0.000000f, - 0.227900f, - -0.946600f, - 0.227900f, - 0.375000f, - 0.103400f, - 0.076003f, - -0.488310f, - 0.076003f, - 0.000000f, - 0.154300f, - -0.975900f, - 0.154300f, - 0.375000f, - 0.069000f, - 0.415124f, - 0.027069f, - 0.277377f, - 0.000000f, - 0.830300f, - 0.054000f, - 0.554700f, - 0.406200f, - 0.517200f, - 0.410257f, - 0.080891f, - 0.274125f, - 0.000000f, - 0.820600f, - 0.161200f, - 0.548300f, - 0.406200f, - 0.551700f, - 0.348895f, - 0.080891f, - 0.348895f, - 0.000000f, - 0.697800f, - 0.161200f, - 0.697800f, - 0.375000f, - 0.551700f, - 0.415124f, - 0.027069f, - 0.277377f, - 0.000000f, - 0.830300f, - 0.054000f, - 0.554700f, - 0.406200f, - 0.517200f, - 0.348895f, - 0.080891f, - 0.348895f, - 0.000000f, - 0.697800f, - 0.161200f, - 0.697800f, - 0.375000f, - 0.551700f, - 0.353034f, - 0.027069f, - 0.353034f, - 0.000000f, - 0.706100f, - 0.054000f, - 0.706100f, - 0.375000f, - 0.517200f, - 0.044948f, - 0.497069f, - 0.030034f, - 0.000000f, - 0.092700f, - 0.993700f, - 0.061900f, - 0.461700f, - 0.962300f, - -0.000000f, - 0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - 1.000000f, - 0.000000f, - 0.482000f, - 0.960300f, - 0.038225f, - 0.497069f, - 0.038226f, - 0.000000f, - 0.078800f, - 0.993700f, - 0.078800f, - 0.463500f, - 0.962300f, - 0.044948f, - -0.497069f, - 0.030034f, - 0.000000f, - 0.092700f, - -0.993700f, - 0.061900f, - 0.406200f, - 0.034500f, - 0.089370f, - -0.488310f, - 0.059715f, - 0.000000f, - 0.181400f, - -0.975900f, - 0.121200f, - 0.406200f, - 0.069000f, - 0.076003f, - -0.488310f, - 0.076003f, - 0.000000f, - 0.154300f, - -0.975900f, - 0.154300f, - 0.375000f, - 0.069000f, - 0.044948f, - -0.497069f, - 0.030034f, - 0.000000f, - 0.092700f, - -0.993700f, - 0.061900f, - 0.406200f, - 0.034500f, - 0.076003f, - -0.488310f, - 0.076003f, - 0.000000f, - 0.154300f, - -0.975900f, - 0.154300f, - 0.375000f, - 0.069000f, - 0.038226f, - -0.497069f, - 0.038226f, - 0.000000f, - 0.078800f, - -0.993700f, - 0.078800f, - 0.375000f, - 0.034500f, - 0.415124f, - -0.027069f, - 0.277377f, - 0.000000f, - 0.830300f, - -0.054000f, - 0.554700f, - 0.406200f, - 0.482800f, - 0.415124f, - 0.027069f, - 0.277377f, - 0.000000f, - 0.830300f, - 0.054000f, - 0.554700f, - 0.406200f, - 0.517200f, - 0.353034f, - 0.027069f, - 0.353034f, - 0.000000f, - 0.706100f, - 0.054000f, - 0.706100f, - 0.375000f, - 0.517200f, - 0.415124f, - -0.027069f, - 0.277377f, - 0.000000f, - 0.830300f, - -0.054000f, - 0.554700f, - 0.406200f, - 0.482800f, - 0.353034f, - 0.027069f, - 0.353034f, - 0.000000f, - 0.706100f, - 0.054000f, - 0.706100f, - 0.375000f, - 0.517200f, - 0.353034f, - -0.027069f, - 0.353034f, - 0.000000f, - 0.706100f, - -0.054000f, - 0.706100f, - 0.375000f, - 0.482800f, - 0.089370f, - 0.488310f, - 0.059715f, - 0.000000f, - 0.181400f, - 0.975900f, - 0.121200f, - 0.406200f, - 0.931000f, - 0.044948f, - 0.497069f, - 0.030034f, - 0.000000f, - 0.092700f, - 0.993700f, - 0.061900f, - 0.406200f, - 0.965500f, - 0.038225f, - 0.497069f, - 0.038226f, - 0.000000f, - 0.078800f, - 0.993700f, - 0.078800f, - 0.375000f, - 0.965500f, - 0.089370f, - 0.488310f, - 0.059715f, - 0.000000f, - 0.181400f, - 0.975900f, - 0.121200f, - 0.406200f, - 0.931000f, - 0.038225f, - 0.497069f, - 0.038226f, - 0.000000f, - 0.078800f, - 0.993700f, - 0.078800f, - 0.375000f, - 0.965500f, - 0.076003f, - 0.488310f, - 0.076003f, - 0.000000f, - 0.154300f, - 0.975900f, - 0.154300f, - 0.375000f, - 0.931000f, - -0.000000f, - -0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - -1.000000f, - 0.000000f, - 0.411700f, - 0.051000f, - 0.044948f, - -0.497069f, - 0.030034f, - 0.000000f, - 0.092700f, - -0.993700f, - 0.061900f, - 0.444400f, - 0.053800f, - 0.038226f, - -0.497069f, - 0.038226f, - 0.000000f, - 0.078800f, - -0.993700f, - 0.078800f, - 0.441800f, - 0.053800f, - 0.410257f, - -0.080891f, - 0.274125f, - 0.000000f, - 0.820600f, - -0.161200f, - 0.548300f, - 0.406200f, - 0.448300f, - 0.415124f, - -0.027069f, - 0.277377f, - 0.000000f, - 0.830300f, - -0.054000f, - 0.554700f, - 0.406200f, - 0.482800f, - 0.353034f, - -0.027069f, - 0.353034f, - 0.000000f, - 0.706100f, - -0.054000f, - 0.706100f, - 0.375000f, - 0.482800f, - 0.410257f, - -0.080891f, - 0.274125f, - 0.000000f, - 0.820600f, - -0.161200f, - 0.548300f, - 0.406200f, - 0.448300f, - 0.353034f, - -0.027069f, - 0.353034f, - 0.000000f, - 0.706100f, - -0.054000f, - 0.706100f, - 0.375000f, - 0.482800f, - 0.348895f, - -0.080891f, - 0.348895f, - 0.000000f, - 0.697800f, - -0.161200f, - 0.697800f, - 0.375000f, - 0.448300f, - 0.132744f, - 0.473826f, - 0.088697f, - 0.000000f, - 0.268000f, - 0.946600f, - 0.179100f, - 0.406200f, - 0.896600f, - 0.089370f, - 0.488310f, - 0.059715f, - 0.000000f, - 0.181400f, - 0.975900f, - 0.121200f, - 0.406200f, - 0.931000f, - 0.076003f, - 0.488310f, - 0.076003f, - 0.000000f, - 0.154300f, - 0.975900f, - 0.154300f, - 0.375000f, - 0.931000f, - 0.132744f, - 0.473826f, - 0.088697f, - 0.000000f, - 0.268000f, - 0.946600f, - 0.179100f, - 0.406200f, - 0.896600f, - 0.076003f, - 0.488310f, - 0.076003f, - 0.000000f, - 0.154300f, - 0.975900f, - 0.154300f, - 0.375000f, - 0.931000f, - 0.112889f, - 0.473826f, - 0.112889f, - 0.000000f, - 0.227900f, - 0.946600f, - 0.227900f, - 0.375000f, - 0.896600f, - 0.400580f, - -0.133764f, - 0.267659f, - 0.000000f, - 0.801400f, - -0.266600f, - 0.535400f, - 0.406200f, - 0.413800f, - 0.410257f, - -0.080891f, - 0.274125f, - 0.000000f, - 0.820600f, - -0.161200f, - 0.548300f, - 0.406200f, - 0.448300f, - 0.348895f, - -0.080891f, - 0.348895f, - 0.000000f, - 0.697800f, - -0.161200f, - 0.697800f, - 0.375000f, - 0.448300f, - 0.400580f, - -0.133764f, - 0.267659f, - 0.000000f, - 0.801400f, - -0.266600f, - 0.535400f, - 0.406200f, - 0.413800f, - 0.348895f, - -0.080891f, - 0.348895f, - 0.000000f, - 0.697800f, - -0.161200f, - 0.697800f, - 0.375000f, - 0.448300f, - 0.340665f, - -0.133764f, - 0.340666f, - 0.000000f, - 0.681500f, - -0.266600f, - 0.681500f, - 0.375000f, - 0.413800f, - 0.174562f, - 0.453788f, - 0.116638f, - 0.000000f, - 0.351400f, - 0.906300f, - 0.234800f, - 0.406200f, - 0.862100f, - 0.132744f, - 0.473826f, - 0.088697f, - 0.000000f, - 0.268000f, - 0.946600f, - 0.179100f, - 0.406200f, - 0.896600f, - 0.112889f, - 0.473826f, - 0.112889f, - 0.000000f, - 0.227900f, - 0.946600f, - 0.227900f, - 0.375000f, - 0.896600f, - 0.174562f, - 0.453788f, - 0.116638f, - 0.000000f, - 0.351400f, - 0.906300f, - 0.234800f, - 0.406200f, - 0.862100f, - 0.112889f, - 0.473826f, - 0.112889f, - 0.000000f, - 0.227900f, - 0.946600f, - 0.227900f, - 0.375000f, - 0.896600f, - 0.148453f, - 0.453788f, - 0.148453f, - 0.000000f, - 0.298900f, - 0.906300f, - 0.298900f, - 0.375000f, - 0.862100f, - 0.386207f, - -0.185069f, - 0.258056f, - 0.000000f, - 0.772800f, - -0.369000f, - 0.516300f, - 0.406200f, - 0.379300f, - 0.400580f, - -0.133764f, - 0.267659f, - 0.000000f, - 0.801400f, - -0.266600f, - 0.535400f, - 0.406200f, - 0.413800f, - 0.340665f, - -0.133764f, - 0.340666f, - 0.000000f, - 0.681500f, - -0.266600f, - 0.681500f, - 0.375000f, - 0.413800f, - 0.386207f, - -0.185069f, - 0.258056f, - 0.000000f, - 0.772800f, - -0.369000f, - 0.516300f, - 0.406200f, - 0.379300f, - 0.340665f, - -0.133764f, - 0.340666f, - 0.000000f, - 0.681500f, - -0.266600f, - 0.681500f, - 0.375000f, - 0.413800f, - 0.328442f, - -0.185069f, - 0.328443f, - 0.000000f, - 0.657200f, - -0.369000f, - 0.657200f, - 0.375000f, - 0.379300f, - 0.214333f, - 0.428429f, - 0.143213f, - 0.000000f, - 0.430700f, - 0.855300f, - 0.287800f, - 0.406200f, - 0.827600f, - 0.174562f, - 0.453788f, - 0.116638f, - 0.000000f, - 0.351400f, - 0.906300f, - 0.234800f, - 0.406200f, - 0.862100f, - 0.148453f, - 0.453788f, - 0.148453f, - 0.000000f, - 0.298900f, - 0.906300f, - 0.298900f, - 0.375000f, - 0.862100f, - 0.214333f, - 0.428429f, - 0.143213f, - 0.000000f, - 0.430700f, - 0.855300f, - 0.287800f, - 0.406200f, - 0.827600f, - 0.148453f, - 0.453788f, - 0.148453f, - 0.000000f, - 0.298900f, - 0.906300f, - 0.298900f, - 0.375000f, - 0.862100f, - 0.182275f, - 0.428429f, - 0.182276f, - 0.000000f, - 0.366300f, - 0.855300f, - 0.366300f, - 0.375000f, - 0.827600f, - 0.367306f, - -0.234204f, - 0.245426f, - 0.000000f, - 0.735200f, - -0.467000f, - 0.491300f, - 0.406200f, - 0.344800f, - 0.386207f, - -0.185069f, - 0.258056f, - 0.000000f, - 0.772800f, - -0.369000f, - 0.516300f, - 0.406200f, - 0.379300f, - 0.328442f, - -0.185069f, - 0.328443f, - 0.000000f, - 0.657200f, - -0.369000f, - 0.657200f, - 0.375000f, - 0.379300f, - 0.367306f, - -0.234204f, - 0.245426f, - 0.000000f, - 0.735200f, - -0.467000f, - 0.491300f, - 0.406200f, - 0.344800f, - 0.328442f, - -0.185069f, - 0.328443f, - 0.000000f, - 0.657200f, - -0.369000f, - 0.657200f, - 0.375000f, - 0.379300f, - 0.312368f, - -0.234204f, - 0.312368f, - 0.000000f, - 0.625200f, - -0.467000f, - 0.625200f, - 0.375000f, - 0.344800f, - 0.251591f, - 0.398046f, - 0.168108f, - 0.000000f, - 0.505000f, - 0.794500f, - 0.337400f, - 0.406200f, - 0.793100f, - 0.214333f, - 0.428429f, - 0.143213f, - 0.000000f, - 0.430700f, - 0.855300f, - 0.287800f, - 0.406200f, - 0.827600f, - 0.182275f, - 0.428429f, - 0.182276f, - 0.000000f, - 0.366300f, - 0.855300f, - 0.366300f, - 0.375000f, - 0.827600f, - 0.251591f, - 0.398046f, - 0.168108f, - 0.000000f, - 0.505000f, - 0.794500f, - 0.337400f, - 0.406200f, - 0.793100f, - 0.182275f, - 0.428429f, - 0.182276f, - 0.000000f, - 0.366300f, - 0.855300f, - 0.366300f, - 0.375000f, - 0.827600f, - 0.213960f, - 0.398046f, - 0.213961f, - 0.000000f, - 0.429400f, - 0.794500f, - 0.429400f, - 0.375000f, - 0.793100f, - 0.344098f, - -0.280594f, - 0.229919f, - 0.000000f, - 0.689100f, - -0.559600f, - 0.460400f, - 0.406200f, - 0.310300f, - 0.367306f, - -0.234204f, - 0.245426f, - 0.000000f, - 0.735200f, - -0.467000f, - 0.491300f, - 0.406200f, - 0.344800f, - 0.312368f, - -0.234204f, - 0.312368f, - 0.000000f, - 0.625200f, - -0.467000f, - 0.625200f, - 0.375000f, - 0.344800f, - 0.344098f, - -0.280594f, - 0.229919f, - 0.000000f, - 0.689100f, - -0.559600f, - 0.460400f, - 0.406200f, - 0.310300f, - 0.312368f, - -0.234204f, - 0.312368f, - 0.000000f, - 0.625200f, - -0.467000f, - 0.625200f, - 0.375000f, - 0.344800f, - 0.292632f, - -0.280594f, - 0.292632f, - 0.000000f, - 0.586000f, - -0.559600f, - 0.586000f, - 0.375000f, - 0.310300f, - 0.285899f, - 0.362998f, - 0.191032f, - 0.000000f, - 0.573300f, - 0.724300f, - 0.383000f, - 0.406200f, - 0.758600f, - 0.251591f, - 0.398046f, - 0.168108f, - 0.000000f, - 0.505000f, - 0.794500f, - 0.337400f, - 0.406200f, - 0.793100f, - 0.213960f, - 0.398046f, - 0.213961f, - 0.000000f, - 0.429400f, - 0.794500f, - 0.429400f, - 0.375000f, - 0.793100f, - 0.285899f, - 0.362998f, - 0.191032f, - 0.000000f, - 0.573300f, - 0.724300f, - 0.383000f, - 0.406200f, - 0.758600f, - 0.213960f, - 0.398046f, - 0.213961f, - 0.000000f, - 0.429400f, - 0.794500f, - 0.429400f, - 0.375000f, - 0.793100f, - 0.243137f, - 0.362998f, - 0.243138f, - 0.000000f, - 0.487500f, - 0.724300f, - 0.487500f, - 0.375000f, - 0.758600f, - 0.316857f, - -0.323693f, - 0.211717f, - 0.000000f, - 0.634900f, - -0.645700f, - 0.424200f, - 0.406200f, - 0.275900f, - 0.344098f, - -0.280594f, - 0.229919f, - 0.000000f, - 0.689100f, - -0.559600f, - 0.460400f, - 0.406200f, - 0.310300f, - 0.292632f, - -0.280594f, - 0.292632f, - 0.000000f, - 0.586000f, - -0.559600f, - 0.586000f, - 0.375000f, - 0.310300f, - 0.316857f, - -0.323693f, - 0.211717f, - 0.000000f, - 0.634900f, - -0.645700f, - 0.424200f, - 0.406200f, - 0.275900f, - 0.292632f, - -0.280594f, - 0.292632f, - 0.000000f, - 0.586000f, - -0.559600f, - 0.586000f, - 0.375000f, - 0.310300f, - 0.269464f, - -0.323693f, - 0.269464f, - 0.000000f, - 0.539900f, - -0.645700f, - 0.539900f, - 0.375000f, - 0.275900f, - 0.316857f, - 0.323693f, - 0.211717f, - 0.000000f, - 0.634900f, - 0.645700f, - 0.424200f, - 0.406200f, - 0.724100f, - 0.285899f, - 0.362998f, - 0.191032f, - 0.000000f, - 0.573300f, - 0.724300f, - 0.383000f, - 0.406200f, - 0.758600f, - 0.243137f, - 0.362998f, - 0.243138f, - 0.000000f, - 0.487500f, - 0.724300f, - 0.487500f, - 0.375000f, - 0.758600f, - 0.316857f, - 0.323693f, - 0.211717f, - 0.000000f, - 0.634900f, - 0.645700f, - 0.424200f, - 0.406200f, - 0.724100f, - 0.243137f, - 0.362998f, - 0.243138f, - 0.000000f, - 0.487500f, - 0.724300f, - 0.487500f, - 0.375000f, - 0.758600f, - 0.269464f, - 0.323693f, - 0.269464f, - 0.000000f, - 0.539900f, - 0.645700f, - 0.539900f, - 0.375000f, - 0.724100f, - 0.285900f, - -0.362998f, - 0.191032f, - 0.000000f, - 0.573300f, - -0.724300f, - 0.383000f, - 0.406200f, - 0.241400f, - 0.316857f, - -0.323693f, - 0.211717f, - 0.000000f, - 0.634900f, - -0.645700f, - 0.424200f, - 0.406200f, - 0.275900f, - 0.269464f, - -0.323693f, - 0.269464f, - 0.000000f, - 0.539900f, - -0.645700f, - 0.539900f, - 0.375000f, - 0.275900f, - 0.285900f, - -0.362998f, - 0.191032f, - 0.000000f, - 0.573300f, - -0.724300f, - 0.383000f, - 0.406200f, - 0.241400f, - 0.269464f, - -0.323693f, - 0.269464f, - 0.000000f, - 0.539900f, - -0.645700f, - 0.539900f, - 0.375000f, - 0.275900f, - 0.243137f, - -0.362998f, - 0.243138f, - 0.000000f, - 0.487500f, - -0.724300f, - 0.487500f, - 0.375000f, - 0.241400f, - 0.344098f, - 0.280594f, - 0.229919f, - 0.000000f, - 0.689100f, - 0.559600f, - 0.460400f, - 0.406200f, - 0.689700f, - 0.316857f, - 0.323693f, - 0.211717f, - 0.000000f, - 0.634900f, - 0.645700f, - 0.424200f, - 0.406200f, - 0.724100f, - 0.269464f, - 0.323693f, - 0.269464f, - 0.000000f, - 0.539900f, - 0.645700f, - 0.539900f, - 0.375000f, - 0.724100f, - 0.344098f, - 0.280594f, - 0.229919f, - 0.000000f, - 0.689100f, - 0.559600f, - 0.460400f, - 0.406200f, - 0.689700f, - 0.269464f, - 0.323693f, - 0.269464f, - 0.000000f, - 0.539900f, - 0.645700f, - 0.539900f, - 0.375000f, - 0.724100f, - 0.292632f, - 0.280594f, - 0.292632f, - 0.000000f, - 0.586000f, - 0.559600f, - 0.586000f, - 0.375000f, - 0.689700f, - 0.251591f, - -0.398046f, - 0.168108f, - 0.000000f, - 0.504900f, - -0.794500f, - 0.337400f, - 0.406200f, - 0.206900f, - 0.285900f, - -0.362998f, - 0.191032f, - 0.000000f, - 0.573300f, - -0.724300f, - 0.383000f, - 0.406200f, - 0.241400f, - 0.243137f, - -0.362998f, - 0.243138f, - 0.000000f, - 0.487500f, - -0.724300f, - 0.487500f, - 0.375000f, - 0.241400f, - 0.251591f, - -0.398046f, - 0.168108f, - 0.000000f, - 0.504900f, - -0.794500f, - 0.337400f, - 0.406200f, - 0.206900f, - 0.243137f, - -0.362998f, - 0.243138f, - 0.000000f, - 0.487500f, - -0.724300f, - 0.487500f, - 0.375000f, - 0.241400f, - 0.213960f, - -0.398046f, - 0.213961f, - 0.000000f, - 0.429400f, - -0.794500f, - 0.429400f, - 0.375000f, - 0.206900f, - 0.367306f, - 0.234204f, - 0.245426f, - 0.000000f, - 0.735200f, - 0.467000f, - 0.491300f, - 0.406200f, - 0.655200f, - 0.344098f, - 0.280594f, - 0.229919f, - 0.000000f, - 0.689100f, - 0.559600f, - 0.460400f, - 0.406200f, - 0.689700f, - 0.292632f, - 0.280594f, - 0.292632f, - 0.000000f, - 0.586000f, - 0.559600f, - 0.586000f, - 0.375000f, - 0.689700f, - 0.367306f, - 0.234204f, - 0.245426f, - 0.000000f, - 0.735200f, - 0.467000f, - 0.491300f, - 0.406200f, - 0.655200f, - 0.292632f, - 0.280594f, - 0.292632f, - 0.000000f, - 0.586000f, - 0.559600f, - 0.586000f, - 0.375000f, - 0.689700f, - 0.312368f, - 0.234204f, - 0.312368f, - 0.000000f, - 0.625200f, - 0.467000f, - 0.625200f, - 0.375000f, - 0.655200f, - 0.182275f, - 0.428429f, - 0.182276f, - 0.000000f, - 0.366300f, - 0.855300f, - 0.366300f, - 0.375000f, - 0.827600f, - 0.148453f, - 0.453788f, - 0.148453f, - 0.000000f, - 0.298900f, - 0.906300f, - 0.298900f, - 0.375000f, - 0.862100f, - 0.116638f, - 0.453788f, - 0.174562f, - 0.000000f, - 0.234800f, - 0.906300f, - 0.351400f, - 0.343700f, - 0.862100f, - 0.182275f, - 0.428429f, - 0.182276f, - 0.000000f, - 0.366300f, - 0.855300f, - 0.366300f, - 0.375000f, - 0.827600f, - 0.116638f, - 0.453788f, - 0.174562f, - 0.000000f, - 0.234800f, - 0.906300f, - 0.351400f, - 0.343700f, - 0.862100f, - 0.143212f, - 0.428429f, - 0.214333f, - 0.000000f, - 0.287800f, - 0.855300f, - 0.430700f, - 0.343700f, - 0.827600f, - 0.312368f, - -0.234204f, - 0.312368f, - 0.000000f, - 0.625200f, - -0.467000f, - 0.625200f, - 0.375000f, - 0.344800f, - 0.328442f, - -0.185069f, - 0.328443f, - 0.000000f, - 0.657200f, - -0.369000f, - 0.657200f, - 0.375000f, - 0.379300f, - 0.258055f, - -0.185069f, - 0.386207f, - 0.000000f, - 0.516300f, - -0.369000f, - 0.772800f, - 0.343700f, - 0.379300f, - 0.312368f, - -0.234204f, - 0.312368f, - 0.000000f, - 0.625200f, - -0.467000f, - 0.625200f, - 0.375000f, - 0.344800f, - 0.258055f, - -0.185069f, - 0.386207f, - 0.000000f, - 0.516300f, - -0.369000f, - 0.772800f, - 0.343700f, - 0.379300f, - 0.245426f, - -0.234204f, - 0.367306f, - 0.000000f, - 0.491300f, - -0.467000f, - 0.735200f, - 0.343700f, - 0.344800f, - 0.213960f, - 0.398046f, - 0.213961f, - 0.000000f, - 0.429400f, - 0.794500f, - 0.429400f, - 0.375000f, - 0.793100f, - 0.182275f, - 0.428429f, - 0.182276f, - 0.000000f, - 0.366300f, - 0.855300f, - 0.366300f, - 0.375000f, - 0.827600f, - 0.143212f, - 0.428429f, - 0.214333f, - 0.000000f, - 0.287800f, - 0.855300f, - 0.430700f, - 0.343700f, - 0.827600f, - 0.213960f, - 0.398046f, - 0.213961f, - 0.000000f, - 0.429400f, - 0.794500f, - 0.429400f, - 0.375000f, - 0.793100f, - 0.143212f, - 0.428429f, - 0.214333f, - 0.000000f, - 0.287800f, - 0.855300f, - 0.430700f, - 0.343700f, - 0.827600f, - 0.168107f, - 0.398046f, - 0.251592f, - 0.000000f, - 0.337400f, - 0.794500f, - 0.505000f, - 0.343700f, - 0.793100f, - 0.292632f, - -0.280594f, - 0.292632f, - 0.000000f, - 0.586000f, - -0.559600f, - 0.586000f, - 0.375000f, - 0.310300f, - 0.312368f, - -0.234204f, - 0.312368f, - 0.000000f, - 0.625200f, - -0.467000f, - 0.625200f, - 0.375000f, - 0.344800f, - 0.245426f, - -0.234204f, - 0.367306f, - 0.000000f, - 0.491300f, - -0.467000f, - 0.735200f, - 0.343700f, - 0.344800f, - 0.292632f, - -0.280594f, - 0.292632f, - 0.000000f, - 0.586000f, - -0.559600f, - 0.586000f, - 0.375000f, - 0.310300f, - 0.245426f, - -0.234204f, - 0.367306f, - 0.000000f, - 0.491300f, - -0.467000f, - 0.735200f, - 0.343700f, - 0.344800f, - 0.229919f, - -0.280594f, - 0.344099f, - 0.000000f, - 0.460400f, - -0.559600f, - 0.689100f, - 0.343700f, - 0.310300f, - 0.243137f, - 0.362998f, - 0.243138f, - 0.000000f, - 0.487500f, - 0.724300f, - 0.487500f, - 0.375000f, - 0.758600f, - 0.213960f, - 0.398046f, - 0.213961f, - 0.000000f, - 0.429400f, - 0.794500f, - 0.429400f, - 0.375000f, - 0.793100f, - 0.168107f, - 0.398046f, - 0.251592f, - 0.000000f, - 0.337400f, - 0.794500f, - 0.505000f, - 0.343700f, - 0.793100f, - 0.243137f, - 0.362998f, - 0.243138f, - 0.000000f, - 0.487500f, - 0.724300f, - 0.487500f, - 0.375000f, - 0.758600f, - 0.168107f, - 0.398046f, - 0.251592f, - 0.000000f, - 0.337400f, - 0.794500f, - 0.505000f, - 0.343700f, - 0.793100f, - 0.191032f, - 0.362998f, - 0.285900f, - 0.000000f, - 0.383000f, - 0.724300f, - 0.573300f, - 0.343700f, - 0.758600f, - 0.269464f, - -0.323693f, - 0.269464f, - 0.000000f, - 0.539900f, - -0.645700f, - 0.539900f, - 0.375000f, - 0.275900f, - 0.292632f, - -0.280594f, - 0.292632f, - 0.000000f, - 0.586000f, - -0.559600f, - 0.586000f, - 0.375000f, - 0.310300f, - 0.229919f, - -0.280594f, - 0.344099f, - 0.000000f, - 0.460400f, - -0.559600f, - 0.689100f, - 0.343700f, - 0.310300f, - 0.269464f, - -0.323693f, - 0.269464f, - 0.000000f, - 0.539900f, - -0.645700f, - 0.539900f, - 0.375000f, - 0.275900f, - 0.229919f, - -0.280594f, - 0.344099f, - 0.000000f, - 0.460400f, - -0.559600f, - 0.689100f, - 0.343700f, - 0.310300f, - 0.211717f, - -0.323693f, - 0.316857f, - 0.000000f, - 0.424200f, - -0.645700f, - 0.634900f, - 0.343700f, - 0.275900f, - 0.269464f, - 0.323693f, - 0.269464f, - 0.000000f, - 0.539900f, - 0.645700f, - 0.539900f, - 0.375000f, - 0.724100f, - 0.243137f, - 0.362998f, - 0.243138f, - 0.000000f, - 0.487500f, - 0.724300f, - 0.487500f, - 0.375000f, - 0.758600f, - 0.191032f, - 0.362998f, - 0.285900f, - 0.000000f, - 0.383000f, - 0.724300f, - 0.573300f, - 0.343700f, - 0.758600f, - 0.269464f, - 0.323693f, - 0.269464f, - 0.000000f, - 0.539900f, - 0.645700f, - 0.539900f, - 0.375000f, - 0.724100f, - 0.191032f, - 0.362998f, - 0.285900f, - 0.000000f, - 0.383000f, - 0.724300f, - 0.573300f, - 0.343700f, - 0.758600f, - 0.211717f, - 0.323693f, - 0.316857f, - 0.000000f, - 0.424200f, - 0.645700f, - 0.634900f, - 0.343700f, - 0.724100f, - 0.243137f, - -0.362998f, - 0.243138f, - 0.000000f, - 0.487500f, - -0.724300f, - 0.487500f, - 0.375000f, - 0.241400f, - 0.269464f, - -0.323693f, - 0.269464f, - 0.000000f, - 0.539900f, - -0.645700f, - 0.539900f, - 0.375000f, - 0.275900f, - 0.211717f, - -0.323693f, - 0.316857f, - 0.000000f, - 0.424200f, - -0.645700f, - 0.634900f, - 0.343700f, - 0.275900f, - 0.243137f, - -0.362998f, - 0.243138f, - 0.000000f, - 0.487500f, - -0.724300f, - 0.487500f, - 0.375000f, - 0.241400f, - 0.211717f, - -0.323693f, - 0.316857f, - 0.000000f, - 0.424200f, - -0.645700f, - 0.634900f, - 0.343700f, - 0.275900f, - 0.191032f, - -0.362998f, - 0.285900f, - 0.000000f, - 0.383000f, - -0.724300f, - 0.573300f, - 0.343700f, - 0.241400f, - 0.292632f, - 0.280594f, - 0.292632f, - 0.000000f, - 0.586000f, - 0.559600f, - 0.586000f, - 0.375000f, - 0.689700f, - 0.269464f, - 0.323693f, - 0.269464f, - 0.000000f, - 0.539900f, - 0.645700f, - 0.539900f, - 0.375000f, - 0.724100f, - 0.211717f, - 0.323693f, - 0.316857f, - 0.000000f, - 0.424200f, - 0.645700f, - 0.634900f, - 0.343700f, - 0.724100f, - 0.292632f, - 0.280594f, - 0.292632f, - 0.000000f, - 0.586000f, - 0.559600f, - 0.586000f, - 0.375000f, - 0.689700f, - 0.211717f, - 0.323693f, - 0.316857f, - 0.000000f, - 0.424200f, - 0.645700f, - 0.634900f, - 0.343700f, - 0.724100f, - 0.229919f, - 0.280594f, - 0.344099f, - 0.000000f, - 0.460400f, - 0.559600f, - 0.689100f, - 0.343700f, - 0.689700f, - 0.213960f, - -0.398046f, - 0.213961f, - 0.000000f, - 0.429400f, - -0.794500f, - 0.429400f, - 0.375000f, - 0.206900f, - 0.243137f, - -0.362998f, - 0.243138f, - 0.000000f, - 0.487500f, - -0.724300f, - 0.487500f, - 0.375000f, - 0.241400f, - 0.191032f, - -0.362998f, - 0.285900f, - 0.000000f, - 0.383000f, - -0.724300f, - 0.573300f, - 0.343700f, - 0.241400f, - 0.213960f, - -0.398046f, - 0.213961f, - 0.000000f, - 0.429400f, - -0.794500f, - 0.429400f, - 0.375000f, - 0.206900f, - 0.191032f, - -0.362998f, - 0.285900f, - 0.000000f, - 0.383000f, - -0.724300f, - 0.573300f, - 0.343700f, - 0.241400f, - 0.168107f, - -0.398046f, - 0.251592f, - 0.000000f, - 0.337400f, - -0.794500f, - 0.505000f, - 0.343700f, - 0.206900f, - 0.312368f, - 0.234204f, - 0.312368f, - 0.000000f, - 0.625200f, - 0.467000f, - 0.625200f, - 0.375000f, - 0.655200f, - 0.292632f, - 0.280594f, - 0.292632f, - 0.000000f, - 0.586000f, - 0.559600f, - 0.586000f, - 0.375000f, - 0.689700f, - 0.229919f, - 0.280594f, - 0.344099f, - 0.000000f, - 0.460400f, - 0.559600f, - 0.689100f, - 0.343700f, - 0.689700f, - 0.312368f, - 0.234204f, - 0.312368f, - 0.000000f, - 0.625200f, - 0.467000f, - 0.625200f, - 0.375000f, - 0.655200f, - 0.229919f, - 0.280594f, - 0.344099f, - 0.000000f, - 0.460400f, - 0.559600f, - 0.689100f, - 0.343700f, - 0.689700f, - 0.245426f, - 0.234204f, - 0.367306f, - 0.000000f, - 0.491300f, - 0.467000f, - 0.735200f, - 0.343700f, - 0.655200f, - 0.182275f, - -0.428429f, - 0.182276f, - 0.000000f, - 0.366300f, - -0.855300f, - 0.366300f, - 0.375000f, - 0.172400f, - 0.213960f, - -0.398046f, - 0.213961f, - 0.000000f, - 0.429400f, - -0.794500f, - 0.429400f, - 0.375000f, - 0.206900f, - 0.168107f, - -0.398046f, - 0.251592f, - 0.000000f, - 0.337400f, - -0.794500f, - 0.505000f, - 0.343700f, - 0.206900f, - 0.182275f, - -0.428429f, - 0.182276f, - 0.000000f, - 0.366300f, - -0.855300f, - 0.366300f, - 0.375000f, - 0.172400f, - 0.168107f, - -0.398046f, - 0.251592f, - 0.000000f, - 0.337400f, - -0.794500f, - 0.505000f, - 0.343700f, - 0.206900f, - 0.143212f, - -0.428429f, - 0.214334f, - 0.000000f, - 0.287800f, - -0.855300f, - 0.430700f, - 0.343700f, - 0.172400f, - 0.328442f, - 0.185069f, - 0.328443f, - 0.000000f, - 0.657200f, - 0.369000f, - 0.657200f, - 0.375000f, - 0.620700f, - 0.312368f, - 0.234204f, - 0.312368f, - 0.000000f, - 0.625200f, - 0.467000f, - 0.625200f, - 0.375000f, - 0.655200f, - 0.245426f, - 0.234204f, - 0.367306f, - 0.000000f, - 0.491300f, - 0.467000f, - 0.735200f, - 0.343700f, - 0.655200f, - 0.328442f, - 0.185069f, - 0.328443f, - 0.000000f, - 0.657200f, - 0.369000f, - 0.657200f, - 0.375000f, - 0.620700f, - 0.245426f, - 0.234204f, - 0.367306f, - 0.000000f, - 0.491300f, - 0.467000f, - 0.735200f, - 0.343700f, - 0.655200f, - 0.258055f, - 0.185069f, - 0.386207f, - 0.000000f, - 0.516300f, - 0.369000f, - 0.772800f, - 0.343700f, - 0.620700f, - 0.148453f, - -0.453788f, - 0.148453f, - 0.000000f, - 0.298900f, - -0.906300f, - 0.298900f, - 0.375000f, - 0.137900f, - 0.182275f, - -0.428429f, - 0.182276f, - 0.000000f, - 0.366300f, - -0.855300f, - 0.366300f, - 0.375000f, - 0.172400f, - 0.143212f, - -0.428429f, - 0.214334f, - 0.000000f, - 0.287800f, - -0.855300f, - 0.430700f, - 0.343700f, - 0.172400f, - 0.148453f, - -0.453788f, - 0.148453f, - 0.000000f, - 0.298900f, - -0.906300f, - 0.298900f, - 0.375000f, - 0.137900f, - 0.143212f, - -0.428429f, - 0.214334f, - 0.000000f, - 0.287800f, - -0.855300f, - 0.430700f, - 0.343700f, - 0.172400f, - 0.116638f, - -0.453788f, - 0.174562f, - 0.000000f, - 0.234800f, - -0.906300f, - 0.351400f, - 0.343700f, - 0.137900f, - 0.340665f, - 0.133764f, - 0.340666f, - 0.000000f, - 0.681500f, - 0.266600f, - 0.681500f, - 0.375000f, - 0.586200f, - 0.328442f, - 0.185069f, - 0.328443f, - 0.000000f, - 0.657200f, - 0.369000f, - 0.657200f, - 0.375000f, - 0.620700f, - 0.258055f, - 0.185069f, - 0.386207f, - 0.000000f, - 0.516300f, - 0.369000f, - 0.772800f, - 0.343700f, - 0.620700f, - 0.340665f, - 0.133764f, - 0.340666f, - 0.000000f, - 0.681500f, - 0.266600f, - 0.681500f, - 0.375000f, - 0.586200f, - 0.258055f, - 0.185069f, - 0.386207f, - 0.000000f, - 0.516300f, - 0.369000f, - 0.772800f, - 0.343700f, - 0.620700f, - 0.267659f, - 0.133764f, - 0.400581f, - 0.000000f, - 0.535400f, - 0.266600f, - 0.801400f, - 0.343700f, - 0.586200f, - 0.112889f, - -0.473826f, - 0.112890f, - 0.000000f, - 0.227900f, - -0.946600f, - 0.227900f, - 0.375000f, - 0.103400f, - 0.148453f, - -0.453788f, - 0.148453f, - 0.000000f, - 0.298900f, - -0.906300f, - 0.298900f, - 0.375000f, - 0.137900f, - 0.116638f, - -0.453788f, - 0.174562f, - 0.000000f, - 0.234800f, - -0.906300f, - 0.351400f, - 0.343700f, - 0.137900f, - 0.112889f, - -0.473826f, - 0.112890f, - 0.000000f, - 0.227900f, - -0.946600f, - 0.227900f, - 0.375000f, - 0.103400f, - 0.116638f, - -0.453788f, - 0.174562f, - 0.000000f, - 0.234800f, - -0.906300f, - 0.351400f, - 0.343700f, - 0.137900f, - 0.088697f, - -0.473826f, - 0.132745f, - 0.000000f, - 0.179100f, - -0.946600f, - 0.268000f, - 0.343700f, - 0.103400f, - 0.348895f, - 0.080891f, - 0.348895f, - 0.000000f, - 0.697800f, - 0.161200f, - 0.697800f, - 0.375000f, - 0.551700f, - 0.340665f, - 0.133764f, - 0.340666f, - 0.000000f, - 0.681500f, - 0.266600f, - 0.681500f, - 0.375000f, - 0.586200f, - 0.267659f, - 0.133764f, - 0.400581f, - 0.000000f, - 0.535400f, - 0.266600f, - 0.801400f, - 0.343700f, - 0.586200f, - 0.348895f, - 0.080891f, - 0.348895f, - 0.000000f, - 0.697800f, - 0.161200f, - 0.697800f, - 0.375000f, - 0.551700f, - 0.267659f, - 0.133764f, - 0.400581f, - 0.000000f, - 0.535400f, - 0.266600f, - 0.801400f, - 0.343700f, - 0.586200f, - 0.274125f, - 0.080891f, - 0.410257f, - 0.000000f, - 0.548300f, - 0.161200f, - 0.820600f, - 0.343700f, - 0.551700f, - 0.076003f, - -0.488310f, - 0.076003f, - 0.000000f, - 0.154300f, - -0.975900f, - 0.154300f, - 0.375000f, - 0.069000f, - 0.112889f, - -0.473826f, - 0.112890f, - 0.000000f, - 0.227900f, - -0.946600f, - 0.227900f, - 0.375000f, - 0.103400f, - 0.088697f, - -0.473826f, - 0.132745f, - 0.000000f, - 0.179100f, - -0.946600f, - 0.268000f, - 0.343700f, - 0.103400f, - 0.076003f, - -0.488310f, - 0.076003f, - 0.000000f, - 0.154300f, - -0.975900f, - 0.154300f, - 0.375000f, - 0.069000f, - 0.088697f, - -0.473826f, - 0.132745f, - 0.000000f, - 0.179100f, - -0.946600f, - 0.268000f, - 0.343700f, - 0.103400f, - 0.059715f, - -0.488310f, - 0.089370f, - 0.000000f, - 0.121200f, - -0.975900f, - 0.181400f, - 0.343700f, - 0.069000f, - 0.353034f, - 0.027069f, - 0.353034f, - 0.000000f, - 0.706100f, - 0.054000f, - 0.706100f, - 0.375000f, - 0.517200f, - 0.348895f, - 0.080891f, - 0.348895f, - 0.000000f, - 0.697800f, - 0.161200f, - 0.697800f, - 0.375000f, - 0.551700f, - 0.274125f, - 0.080891f, - 0.410257f, - 0.000000f, - 0.548300f, - 0.161200f, - 0.820600f, - 0.343700f, - 0.551700f, - 0.353034f, - 0.027069f, - 0.353034f, - 0.000000f, - 0.706100f, - 0.054000f, - 0.706100f, - 0.375000f, - 0.517200f, - 0.274125f, - 0.080891f, - 0.410257f, - 0.000000f, - 0.548300f, - 0.161200f, - 0.820600f, - 0.343700f, - 0.551700f, - 0.277377f, - 0.027069f, - 0.415125f, - 0.000000f, - 0.554700f, - 0.054000f, - 0.830300f, - 0.343700f, - 0.517200f, - 0.038225f, - 0.497069f, - 0.038226f, - 0.000000f, - 0.078800f, - 0.993700f, - 0.078800f, - 0.463500f, - 0.962300f, - -0.000000f, - 0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - 1.000000f, - 0.000000f, - 0.482000f, - 0.960300f, - 0.030033f, - 0.497069f, - 0.044948f, - 0.000000f, - 0.061900f, - 0.993700f, - 0.092700f, - 0.465300f, - 0.962300f, - 0.038226f, - -0.497069f, - 0.038226f, - 0.000000f, - 0.078800f, - -0.993700f, - 0.078800f, - 0.375000f, - 0.034500f, - 0.076003f, - -0.488310f, - 0.076003f, - 0.000000f, - 0.154300f, - -0.975900f, - 0.154300f, - 0.375000f, - 0.069000f, - 0.059715f, - -0.488310f, - 0.089370f, - 0.000000f, - 0.121200f, - -0.975900f, - 0.181400f, - 0.343700f, - 0.069000f, - 0.038226f, - -0.497069f, - 0.038226f, - 0.000000f, - 0.078800f, - -0.993700f, - 0.078800f, - 0.375000f, - 0.034500f, - 0.059715f, - -0.488310f, - 0.089370f, - 0.000000f, - 0.121200f, - -0.975900f, - 0.181400f, - 0.343700f, - 0.069000f, - 0.030034f, - -0.497069f, - 0.044949f, - 0.000000f, - 0.061900f, - -0.993700f, - 0.092700f, - 0.343700f, - 0.034500f, - 0.353034f, - -0.027069f, - 0.353034f, - 0.000000f, - 0.706100f, - -0.054000f, - 0.706100f, - 0.375000f, - 0.482800f, - 0.353034f, - 0.027069f, - 0.353034f, - 0.000000f, - 0.706100f, - 0.054000f, - 0.706100f, - 0.375000f, - 0.517200f, - 0.277377f, - 0.027069f, - 0.415125f, - 0.000000f, - 0.554700f, - 0.054000f, - 0.830300f, - 0.343700f, - 0.517200f, - 0.353034f, - -0.027069f, - 0.353034f, - 0.000000f, - 0.706100f, - -0.054000f, - 0.706100f, - 0.375000f, - 0.482800f, - 0.277377f, - 0.027069f, - 0.415125f, - 0.000000f, - 0.554700f, - 0.054000f, - 0.830300f, - 0.343700f, - 0.517200f, - 0.277377f, - -0.027069f, - 0.415125f, - 0.000000f, - 0.554700f, - -0.054000f, - 0.830300f, - 0.343700f, - 0.482800f, - 0.076003f, - 0.488310f, - 0.076003f, - 0.000000f, - 0.154300f, - 0.975900f, - 0.154300f, - 0.375000f, - 0.931000f, - 0.038225f, - 0.497069f, - 0.038226f, - 0.000000f, - 0.078800f, - 0.993700f, - 0.078800f, - 0.375000f, - 0.965500f, - 0.030033f, - 0.497069f, - 0.044948f, - 0.000000f, - 0.061900f, - 0.993700f, - 0.092700f, - 0.343700f, - 0.965500f, - 0.076003f, - 0.488310f, - 0.076003f, - 0.000000f, - 0.154300f, - 0.975900f, - 0.154300f, - 0.375000f, - 0.931000f, - 0.030033f, - 0.497069f, - 0.044948f, - 0.000000f, - 0.061900f, - 0.993700f, - 0.092700f, - 0.343700f, - 0.965500f, - 0.059715f, - 0.488310f, - 0.089370f, - 0.000000f, - 0.121200f, - 0.975900f, - 0.181400f, - 0.343700f, - 0.931000f, - -0.000000f, - -0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - -1.000000f, - 0.000000f, - 0.411700f, - 0.051000f, - 0.038226f, - -0.497069f, - 0.038226f, - 0.000000f, - 0.078800f, - -0.993700f, - 0.078800f, - 0.441800f, - 0.053800f, - 0.030034f, - -0.497069f, - 0.044949f, - 0.000000f, - 0.061900f, - -0.993700f, - 0.092700f, - 0.439200f, - 0.053800f, - 0.348895f, - -0.080891f, - 0.348895f, - 0.000000f, - 0.697800f, - -0.161200f, - 0.697800f, - 0.375000f, - 0.448300f, - 0.353034f, - -0.027069f, - 0.353034f, - 0.000000f, - 0.706100f, - -0.054000f, - 0.706100f, - 0.375000f, - 0.482800f, - 0.277377f, - -0.027069f, - 0.415125f, - 0.000000f, - 0.554700f, - -0.054000f, - 0.830300f, - 0.343700f, - 0.482800f, - 0.348895f, - -0.080891f, - 0.348895f, - 0.000000f, - 0.697800f, - -0.161200f, - 0.697800f, - 0.375000f, - 0.448300f, - 0.277377f, - -0.027069f, - 0.415125f, - 0.000000f, - 0.554700f, - -0.054000f, - 0.830300f, - 0.343700f, - 0.482800f, - 0.274125f, - -0.080891f, - 0.410257f, - 0.000000f, - 0.548300f, - -0.161200f, - 0.820600f, - 0.343700f, - 0.448300f, - 0.112889f, - 0.473826f, - 0.112889f, - 0.000000f, - 0.227900f, - 0.946600f, - 0.227900f, - 0.375000f, - 0.896600f, - 0.076003f, - 0.488310f, - 0.076003f, - 0.000000f, - 0.154300f, - 0.975900f, - 0.154300f, - 0.375000f, - 0.931000f, - 0.059715f, - 0.488310f, - 0.089370f, - 0.000000f, - 0.121200f, - 0.975900f, - 0.181400f, - 0.343700f, - 0.931000f, - 0.112889f, - 0.473826f, - 0.112889f, - 0.000000f, - 0.227900f, - 0.946600f, - 0.227900f, - 0.375000f, - 0.896600f, - 0.059715f, - 0.488310f, - 0.089370f, - 0.000000f, - 0.121200f, - 0.975900f, - 0.181400f, - 0.343700f, - 0.931000f, - 0.088697f, - 0.473826f, - 0.132745f, - 0.000000f, - 0.179100f, - 0.946600f, - 0.268000f, - 0.343700f, - 0.896600f, - 0.340665f, - -0.133764f, - 0.340666f, - 0.000000f, - 0.681500f, - -0.266600f, - 0.681500f, - 0.375000f, - 0.413800f, - 0.348895f, - -0.080891f, - 0.348895f, - 0.000000f, - 0.697800f, - -0.161200f, - 0.697800f, - 0.375000f, - 0.448300f, - 0.274125f, - -0.080891f, - 0.410257f, - 0.000000f, - 0.548300f, - -0.161200f, - 0.820600f, - 0.343700f, - 0.448300f, - 0.340665f, - -0.133764f, - 0.340666f, - 0.000000f, - 0.681500f, - -0.266600f, - 0.681500f, - 0.375000f, - 0.413800f, - 0.274125f, - -0.080891f, - 0.410257f, - 0.000000f, - 0.548300f, - -0.161200f, - 0.820600f, - 0.343700f, - 0.448300f, - 0.267659f, - -0.133764f, - 0.400581f, - 0.000000f, - 0.535400f, - -0.266600f, - 0.801400f, - 0.343700f, - 0.413800f, - 0.148453f, - 0.453788f, - 0.148453f, - 0.000000f, - 0.298900f, - 0.906300f, - 0.298900f, - 0.375000f, - 0.862100f, - 0.112889f, - 0.473826f, - 0.112889f, - 0.000000f, - 0.227900f, - 0.946600f, - 0.227900f, - 0.375000f, - 0.896600f, - 0.088697f, - 0.473826f, - 0.132745f, - 0.000000f, - 0.179100f, - 0.946600f, - 0.268000f, - 0.343700f, - 0.896600f, - 0.148453f, - 0.453788f, - 0.148453f, - 0.000000f, - 0.298900f, - 0.906300f, - 0.298900f, - 0.375000f, - 0.862100f, - 0.088697f, - 0.473826f, - 0.132745f, - 0.000000f, - 0.179100f, - 0.946600f, - 0.268000f, - 0.343700f, - 0.896600f, - 0.116638f, - 0.453788f, - 0.174562f, - 0.000000f, - 0.234800f, - 0.906300f, - 0.351400f, - 0.343700f, - 0.862100f, - 0.328442f, - -0.185069f, - 0.328443f, - 0.000000f, - 0.657200f, - -0.369000f, - 0.657200f, - 0.375000f, - 0.379300f, - 0.340665f, - -0.133764f, - 0.340666f, - 0.000000f, - 0.681500f, - -0.266600f, - 0.681500f, - 0.375000f, - 0.413800f, - 0.267659f, - -0.133764f, - 0.400581f, - 0.000000f, - 0.535400f, - -0.266600f, - 0.801400f, - 0.343700f, - 0.413800f, - 0.328442f, - -0.185069f, - 0.328443f, - 0.000000f, - 0.657200f, - -0.369000f, - 0.657200f, - 0.375000f, - 0.379300f, - 0.267659f, - -0.133764f, - 0.400581f, - 0.000000f, - 0.535400f, - -0.266600f, - 0.801400f, - 0.343700f, - 0.413800f, - 0.258055f, - -0.185069f, - 0.386207f, - 0.000000f, - 0.516300f, - -0.369000f, - 0.772800f, - 0.343700f, - 0.379300f, - 0.274125f, - 0.080891f, - 0.410257f, - 0.000000f, - 0.548300f, - 0.161200f, - 0.820600f, - 0.343700f, - 0.551700f, - 0.267659f, - 0.133764f, - 0.400581f, - 0.000000f, - 0.535400f, - 0.266600f, - 0.801400f, - 0.343700f, - 0.586200f, - 0.184366f, - 0.133764f, - 0.445101f, - 0.000000f, - 0.368800f, - 0.266600f, - 0.890400f, - 0.312500f, - 0.586200f, - 0.274125f, - 0.080891f, - 0.410257f, - 0.000000f, - 0.548300f, - 0.161200f, - 0.820600f, - 0.343700f, - 0.551700f, - 0.184366f, - 0.133764f, - 0.445101f, - 0.000000f, - 0.368800f, - 0.266600f, - 0.890400f, - 0.312500f, - 0.586200f, - 0.188820f, - 0.080891f, - 0.455853f, - 0.000000f, - 0.377700f, - 0.161200f, - 0.911800f, - 0.312500f, - 0.551700f, - 0.059715f, - -0.488310f, - 0.089370f, - 0.000000f, - 0.121200f, - -0.975900f, - 0.181400f, - 0.343700f, - 0.069000f, - 0.088697f, - -0.473826f, - 0.132745f, - 0.000000f, - 0.179100f, - -0.946600f, - 0.268000f, - 0.343700f, - 0.103400f, - 0.061095f, - -0.473826f, - 0.147498f, - 0.000000f, - 0.123300f, - -0.946600f, - 0.297800f, - 0.312500f, - 0.103400f, - 0.059715f, - -0.488310f, - 0.089370f, - 0.000000f, - 0.121200f, - -0.975900f, - 0.181400f, - 0.343700f, - 0.069000f, - 0.061095f, - -0.473826f, - 0.147498f, - 0.000000f, - 0.123300f, - -0.946600f, - 0.297800f, - 0.312500f, - 0.103400f, - 0.041132f, - -0.488310f, - 0.099303f, - 0.000000f, - 0.083500f, - -0.975900f, - 0.201600f, - 0.312500f, - 0.069000f, - 0.277377f, - 0.027069f, - 0.415125f, - 0.000000f, - 0.554700f, - 0.054000f, - 0.830300f, - 0.343700f, - 0.517200f, - 0.274125f, - 0.080891f, - 0.410257f, - 0.000000f, - 0.548300f, - 0.161200f, - 0.820600f, - 0.343700f, - 0.551700f, - 0.188820f, - 0.080891f, - 0.455853f, - 0.000000f, - 0.377700f, - 0.161200f, - 0.911800f, - 0.312500f, - 0.551700f, - 0.277377f, - 0.027069f, - 0.415125f, - 0.000000f, - 0.554700f, - 0.054000f, - 0.830300f, - 0.343700f, - 0.517200f, - 0.188820f, - 0.080891f, - 0.455853f, - 0.000000f, - 0.377700f, - 0.161200f, - 0.911800f, - 0.312500f, - 0.551700f, - 0.191060f, - 0.027069f, - 0.461262f, - 0.000000f, - 0.382100f, - 0.054000f, - 0.922500f, - 0.312500f, - 0.517200f, - 0.030033f, - 0.497069f, - 0.044948f, - 0.000000f, - 0.061900f, - 0.993700f, - 0.092700f, - 0.465300f, - 0.962300f, - -0.000000f, - 0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - 1.000000f, - 0.000000f, - 0.482000f, - 0.960300f, - 0.020687f, - 0.497069f, - 0.049944f, - 0.000000f, - 0.042600f, - 0.993700f, - 0.103000f, - 0.467100f, - 0.962300f, - 0.030034f, - -0.497069f, - 0.044949f, - 0.000000f, - 0.061900f, - -0.993700f, - 0.092700f, - 0.343700f, - 0.034500f, - 0.059715f, - -0.488310f, - 0.089370f, - 0.000000f, - 0.121200f, - -0.975900f, - 0.181400f, - 0.343700f, - 0.069000f, - 0.041132f, - -0.488310f, - 0.099303f, - 0.000000f, - 0.083500f, - -0.975900f, - 0.201600f, - 0.312500f, - 0.069000f, - 0.030034f, - -0.497069f, - 0.044949f, - 0.000000f, - 0.061900f, - -0.993700f, - 0.092700f, - 0.343700f, - 0.034500f, - 0.041132f, - -0.488310f, - 0.099303f, - 0.000000f, - 0.083500f, - -0.975900f, - 0.201600f, - 0.312500f, - 0.069000f, - 0.020687f, - -0.497069f, - 0.049945f, - 0.000000f, - 0.042600f, - -0.993700f, - 0.103000f, - 0.312500f, - 0.034500f, - 0.277377f, - -0.027069f, - 0.415125f, - 0.000000f, - 0.554700f, - -0.054000f, - 0.830300f, - 0.343700f, - 0.482800f, - 0.277377f, - 0.027069f, - 0.415125f, - 0.000000f, - 0.554700f, - 0.054000f, - 0.830300f, - 0.343700f, - 0.517200f, - 0.191060f, - 0.027069f, - 0.461262f, - 0.000000f, - 0.382100f, - 0.054000f, - 0.922500f, - 0.312500f, - 0.517200f, - 0.277377f, - -0.027069f, - 0.415125f, - 0.000000f, - 0.554700f, - -0.054000f, - 0.830300f, - 0.343700f, - 0.482800f, - 0.191060f, - 0.027069f, - 0.461262f, - 0.000000f, - 0.382100f, - 0.054000f, - 0.922500f, - 0.312500f, - 0.517200f, - 0.191060f, - -0.027069f, - 0.461262f, - 0.000000f, - 0.382100f, - -0.054000f, - 0.922500f, - 0.312500f, - 0.482800f, - 0.059715f, - 0.488310f, - 0.089370f, - 0.000000f, - 0.121200f, - 0.975900f, - 0.181400f, - 0.343700f, - 0.931000f, - 0.030033f, - 0.497069f, - 0.044948f, - 0.000000f, - 0.061900f, - 0.993700f, - 0.092700f, - 0.343700f, - 0.965500f, - 0.020687f, - 0.497069f, - 0.049944f, - 0.000000f, - 0.042600f, - 0.993700f, - 0.103000f, - 0.312500f, - 0.965500f, - 0.059715f, - 0.488310f, - 0.089370f, - 0.000000f, - 0.121200f, - 0.975900f, - 0.181400f, - 0.343700f, - 0.931000f, - 0.020687f, - 0.497069f, - 0.049944f, - 0.000000f, - 0.042600f, - 0.993700f, - 0.103000f, - 0.312500f, - 0.965500f, - 0.041132f, - 0.488310f, - 0.099303f, - 0.000000f, - 0.083500f, - 0.975900f, - 0.201600f, - 0.312500f, - 0.931000f, - -0.000000f, - -0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - -1.000000f, - 0.000000f, - 0.411700f, - 0.051000f, - 0.030034f, - -0.497069f, - 0.044949f, - 0.000000f, - 0.061900f, - -0.993700f, - 0.092700f, - 0.439200f, - 0.053800f, - 0.020687f, - -0.497069f, - 0.049945f, - 0.000000f, - 0.042600f, - -0.993700f, - 0.103000f, - 0.436600f, - 0.053800f, - 0.274125f, - -0.080891f, - 0.410257f, - 0.000000f, - 0.548300f, - -0.161200f, - 0.820600f, - 0.343700f, - 0.448300f, - 0.277377f, - -0.027069f, - 0.415125f, - 0.000000f, - 0.554700f, - -0.054000f, - 0.830300f, - 0.343700f, - 0.482800f, - 0.191060f, - -0.027069f, - 0.461262f, - 0.000000f, - 0.382100f, - -0.054000f, - 0.922500f, - 0.312500f, - 0.482800f, - 0.274125f, - -0.080891f, - 0.410257f, - 0.000000f, - 0.548300f, - -0.161200f, - 0.820600f, - 0.343700f, - 0.448300f, - 0.191060f, - -0.027069f, - 0.461262f, - 0.000000f, - 0.382100f, - -0.054000f, - 0.922500f, - 0.312500f, - 0.482800f, - 0.188820f, - -0.080891f, - 0.455853f, - 0.000000f, - 0.377700f, - -0.161200f, - 0.911800f, - 0.312500f, - 0.448300f, - 0.088697f, - 0.473826f, - 0.132745f, - 0.000000f, - 0.179100f, - 0.946600f, - 0.268000f, - 0.343700f, - 0.896600f, - 0.059715f, - 0.488310f, - 0.089370f, - 0.000000f, - 0.121200f, - 0.975900f, - 0.181400f, - 0.343700f, - 0.931000f, - 0.041132f, - 0.488310f, - 0.099303f, - 0.000000f, - 0.083500f, - 0.975900f, - 0.201600f, - 0.312500f, - 0.931000f, - 0.088697f, - 0.473826f, - 0.132745f, - 0.000000f, - 0.179100f, - 0.946600f, - 0.268000f, - 0.343700f, - 0.896600f, - 0.041132f, - 0.488310f, - 0.099303f, - 0.000000f, - 0.083500f, - 0.975900f, - 0.201600f, - 0.312500f, - 0.931000f, - 0.061095f, - 0.473826f, - 0.147498f, - 0.000000f, - 0.123300f, - 0.946600f, - 0.297800f, - 0.312500f, - 0.896600f, - 0.267659f, - -0.133764f, - 0.400581f, - 0.000000f, - 0.535400f, - -0.266600f, - 0.801400f, - 0.343700f, - 0.413800f, - 0.274125f, - -0.080891f, - 0.410257f, - 0.000000f, - 0.548300f, - -0.161200f, - 0.820600f, - 0.343700f, - 0.448300f, - 0.188820f, - -0.080891f, - 0.455853f, - 0.000000f, - 0.377700f, - -0.161200f, - 0.911800f, - 0.312500f, - 0.448300f, - 0.267659f, - -0.133764f, - 0.400581f, - 0.000000f, - 0.535400f, - -0.266600f, - 0.801400f, - 0.343700f, - 0.413800f, - 0.188820f, - -0.080891f, - 0.455853f, - 0.000000f, - 0.377700f, - -0.161200f, - 0.911800f, - 0.312500f, - 0.448300f, - 0.184366f, - -0.133764f, - 0.445101f, - 0.000000f, - 0.368800f, - -0.266600f, - 0.890400f, - 0.312500f, - 0.413800f, - 0.116638f, - 0.453788f, - 0.174562f, - 0.000000f, - 0.234800f, - 0.906300f, - 0.351400f, - 0.343700f, - 0.862100f, - 0.088697f, - 0.473826f, - 0.132745f, - 0.000000f, - 0.179100f, - 0.946600f, - 0.268000f, - 0.343700f, - 0.896600f, - 0.061095f, - 0.473826f, - 0.147498f, - 0.000000f, - 0.123300f, - 0.946600f, - 0.297800f, - 0.312500f, - 0.896600f, - 0.116638f, - 0.453788f, - 0.174562f, - 0.000000f, - 0.234800f, - 0.906300f, - 0.351400f, - 0.343700f, - 0.862100f, - 0.061095f, - 0.473826f, - 0.147498f, - 0.000000f, - 0.123300f, - 0.946600f, - 0.297800f, - 0.312500f, - 0.896600f, - 0.080342f, - 0.453788f, - 0.193963f, - 0.000000f, - 0.161700f, - 0.906300f, - 0.390500f, - 0.312500f, - 0.862100f, - 0.258055f, - -0.185069f, - 0.386207f, - 0.000000f, - 0.516300f, - -0.369000f, - 0.772800f, - 0.343700f, - 0.379300f, - 0.267659f, - -0.133764f, - 0.400581f, - 0.000000f, - 0.535400f, - -0.266600f, - 0.801400f, - 0.343700f, - 0.413800f, - 0.184366f, - -0.133764f, - 0.445101f, - 0.000000f, - 0.368800f, - -0.266600f, - 0.890400f, - 0.312500f, - 0.413800f, - 0.258055f, - -0.185069f, - 0.386207f, - 0.000000f, - 0.516300f, - -0.369000f, - 0.772800f, - 0.343700f, - 0.379300f, - 0.184366f, - -0.133764f, - 0.445101f, - 0.000000f, - 0.368800f, - -0.266600f, - 0.890400f, - 0.312500f, - 0.413800f, - 0.177751f, - -0.185069f, - 0.429130f, - 0.000000f, - 0.355700f, - -0.369000f, - 0.858700f, - 0.312500f, - 0.379300f, - 0.143212f, - 0.428429f, - 0.214333f, - 0.000000f, - 0.287800f, - 0.855300f, - 0.430700f, - 0.343700f, - 0.827600f, - 0.116638f, - 0.453788f, - 0.174562f, - 0.000000f, - 0.234800f, - 0.906300f, - 0.351400f, - 0.343700f, - 0.862100f, - 0.080342f, - 0.453788f, - 0.193963f, - 0.000000f, - 0.161700f, - 0.906300f, - 0.390500f, - 0.312500f, - 0.862100f, - 0.143212f, - 0.428429f, - 0.214333f, - 0.000000f, - 0.287800f, - 0.855300f, - 0.430700f, - 0.343700f, - 0.827600f, - 0.080342f, - 0.453788f, - 0.193963f, - 0.000000f, - 0.161700f, - 0.906300f, - 0.390500f, - 0.312500f, - 0.862100f, - 0.098646f, - 0.428429f, - 0.238155f, - 0.000000f, - 0.198200f, - 0.855300f, - 0.478600f, - 0.312500f, - 0.827600f, - 0.245426f, - -0.234204f, - 0.367306f, - 0.000000f, - 0.491300f, - -0.467000f, - 0.735200f, - 0.343700f, - 0.344800f, - 0.258055f, - -0.185069f, - 0.386207f, - 0.000000f, - 0.516300f, - -0.369000f, - 0.772800f, - 0.343700f, - 0.379300f, - 0.177751f, - -0.185069f, - 0.429130f, - 0.000000f, - 0.355700f, - -0.369000f, - 0.858700f, - 0.312500f, - 0.379300f, - 0.245426f, - -0.234204f, - 0.367306f, - 0.000000f, - 0.491300f, - -0.467000f, - 0.735200f, - 0.343700f, - 0.344800f, - 0.177751f, - -0.185069f, - 0.429130f, - 0.000000f, - 0.355700f, - -0.369000f, - 0.858700f, - 0.312500f, - 0.379300f, - 0.169052f, - -0.234204f, - 0.408129f, - 0.000000f, - 0.338400f, - -0.467000f, - 0.816900f, - 0.312500f, - 0.344800f, - 0.168107f, - 0.398046f, - 0.251592f, - 0.000000f, - 0.337400f, - 0.794500f, - 0.505000f, - 0.343700f, - 0.793100f, - 0.143212f, - 0.428429f, - 0.214333f, - 0.000000f, - 0.287800f, - 0.855300f, - 0.430700f, - 0.343700f, - 0.827600f, - 0.098646f, - 0.428429f, - 0.238155f, - 0.000000f, - 0.198200f, - 0.855300f, - 0.478600f, - 0.312500f, - 0.827600f, - 0.168107f, - 0.398046f, - 0.251592f, - 0.000000f, - 0.337400f, - 0.794500f, - 0.505000f, - 0.343700f, - 0.793100f, - 0.098646f, - 0.428429f, - 0.238155f, - 0.000000f, - 0.198200f, - 0.855300f, - 0.478600f, - 0.312500f, - 0.827600f, - 0.115795f, - 0.398046f, - 0.279554f, - 0.000000f, - 0.232400f, - 0.794500f, - 0.561100f, - 0.312500f, - 0.793100f, - 0.229919f, - -0.280594f, - 0.344099f, - 0.000000f, - 0.460400f, - -0.559600f, - 0.689100f, - 0.343700f, - 0.310300f, - 0.245426f, - -0.234204f, - 0.367306f, - 0.000000f, - 0.491300f, - -0.467000f, - 0.735200f, - 0.343700f, - 0.344800f, - 0.169052f, - -0.234204f, - 0.408129f, - 0.000000f, - 0.338400f, - -0.467000f, - 0.816900f, - 0.312500f, - 0.344800f, - 0.229919f, - -0.280594f, - 0.344099f, - 0.000000f, - 0.460400f, - -0.559600f, - 0.689100f, - 0.343700f, - 0.310300f, - 0.169052f, - -0.234204f, - 0.408129f, - 0.000000f, - 0.338400f, - -0.467000f, - 0.816900f, - 0.312500f, - 0.344800f, - 0.158370f, - -0.280594f, - 0.382342f, - 0.000000f, - 0.317100f, - -0.559600f, - 0.765600f, - 0.312500f, - 0.310300f, - 0.191032f, - 0.362998f, - 0.285900f, - 0.000000f, - 0.383000f, - 0.724300f, - 0.573300f, - 0.343700f, - 0.758600f, - 0.168107f, - 0.398046f, - 0.251592f, - 0.000000f, - 0.337400f, - 0.794500f, - 0.505000f, - 0.343700f, - 0.793100f, - 0.115795f, - 0.398046f, - 0.279554f, - 0.000000f, - 0.232400f, - 0.794500f, - 0.561100f, - 0.312500f, - 0.793100f, - 0.191032f, - 0.362998f, - 0.285900f, - 0.000000f, - 0.383000f, - 0.724300f, - 0.573300f, - 0.343700f, - 0.758600f, - 0.115795f, - 0.398046f, - 0.279554f, - 0.000000f, - 0.232400f, - 0.794500f, - 0.561100f, - 0.312500f, - 0.793100f, - 0.131585f, - 0.362998f, - 0.317675f, - 0.000000f, - 0.263800f, - 0.724300f, - 0.637000f, - 0.312500f, - 0.758600f, - 0.211717f, - -0.323693f, - 0.316857f, - 0.000000f, - 0.424200f, - -0.645700f, - 0.634900f, - 0.343700f, - 0.275900f, - 0.229919f, - -0.280594f, - 0.344099f, - 0.000000f, - 0.460400f, - -0.559600f, - 0.689100f, - 0.343700f, - 0.310300f, - 0.158370f, - -0.280594f, - 0.382342f, - 0.000000f, - 0.317100f, - -0.559600f, - 0.765600f, - 0.312500f, - 0.310300f, - 0.211717f, - -0.323693f, - 0.316857f, - 0.000000f, - 0.424200f, - -0.645700f, - 0.634900f, - 0.343700f, - 0.275900f, - 0.158370f, - -0.280594f, - 0.382342f, - 0.000000f, - 0.317100f, - -0.559600f, - 0.765600f, - 0.312500f, - 0.310300f, - 0.145832f, - -0.323693f, - 0.352073f, - 0.000000f, - 0.292200f, - -0.645700f, - 0.705400f, - 0.312500f, - 0.275900f, - 0.211717f, - 0.323693f, - 0.316857f, - 0.000000f, - 0.424200f, - 0.645700f, - 0.634900f, - 0.343700f, - 0.724100f, - 0.191032f, - 0.362998f, - 0.285900f, - 0.000000f, - 0.383000f, - 0.724300f, - 0.573300f, - 0.343700f, - 0.758600f, - 0.131585f, - 0.362998f, - 0.317675f, - 0.000000f, - 0.263800f, - 0.724300f, - 0.637000f, - 0.312500f, - 0.758600f, - 0.211717f, - 0.323693f, - 0.316857f, - 0.000000f, - 0.424200f, - 0.645700f, - 0.634900f, - 0.343700f, - 0.724100f, - 0.131585f, - 0.362998f, - 0.317675f, - 0.000000f, - 0.263800f, - 0.724300f, - 0.637000f, - 0.312500f, - 0.758600f, - 0.145832f, - 0.323693f, - 0.352073f, - 0.000000f, - 0.292200f, - 0.645700f, - 0.705400f, - 0.312500f, - 0.724100f, - 0.191032f, - -0.362998f, - 0.285900f, - 0.000000f, - 0.383000f, - -0.724300f, - 0.573300f, - 0.343700f, - 0.241400f, - 0.211717f, - -0.323693f, - 0.316857f, - 0.000000f, - 0.424200f, - -0.645700f, - 0.634900f, - 0.343700f, - 0.275900f, - 0.145832f, - -0.323693f, - 0.352073f, - 0.000000f, - 0.292200f, - -0.645700f, - 0.705400f, - 0.312500f, - 0.275900f, - 0.191032f, - -0.362998f, - 0.285900f, - 0.000000f, - 0.383000f, - -0.724300f, - 0.573300f, - 0.343700f, - 0.241400f, - 0.145832f, - -0.323693f, - 0.352073f, - 0.000000f, - 0.292200f, - -0.645700f, - 0.705400f, - 0.312500f, - 0.275900f, - 0.131585f, - -0.362998f, - 0.317676f, - 0.000000f, - 0.263800f, - -0.724300f, - 0.637000f, - 0.312500f, - 0.241400f, - 0.229919f, - 0.280594f, - 0.344099f, - 0.000000f, - 0.460400f, - 0.559600f, - 0.689100f, - 0.343700f, - 0.689700f, - 0.211717f, - 0.323693f, - 0.316857f, - 0.000000f, - 0.424200f, - 0.645700f, - 0.634900f, - 0.343700f, - 0.724100f, - 0.145832f, - 0.323693f, - 0.352073f, - 0.000000f, - 0.292200f, - 0.645700f, - 0.705400f, - 0.312500f, - 0.724100f, - 0.229919f, - 0.280594f, - 0.344099f, - 0.000000f, - 0.460400f, - 0.559600f, - 0.689100f, - 0.343700f, - 0.689700f, - 0.145832f, - 0.323693f, - 0.352073f, - 0.000000f, - 0.292200f, - 0.645700f, - 0.705400f, - 0.312500f, - 0.724100f, - 0.158370f, - 0.280594f, - 0.382342f, - 0.000000f, - 0.317100f, - 0.559600f, - 0.765600f, - 0.312500f, - 0.689700f, - 0.168107f, - -0.398046f, - 0.251592f, - 0.000000f, - 0.337400f, - -0.794500f, - 0.505000f, - 0.343700f, - 0.206900f, - 0.191032f, - -0.362998f, - 0.285900f, - 0.000000f, - 0.383000f, - -0.724300f, - 0.573300f, - 0.343700f, - 0.241400f, - 0.131585f, - -0.362998f, - 0.317676f, - 0.000000f, - 0.263800f, - -0.724300f, - 0.637000f, - 0.312500f, - 0.241400f, - 0.168107f, - -0.398046f, - 0.251592f, - 0.000000f, - 0.337400f, - -0.794500f, - 0.505000f, - 0.343700f, - 0.206900f, - 0.131585f, - -0.362998f, - 0.317676f, - 0.000000f, - 0.263800f, - -0.724300f, - 0.637000f, - 0.312500f, - 0.241400f, - 0.115795f, - -0.398046f, - 0.279554f, - 0.000000f, - 0.232400f, - -0.794500f, - 0.561100f, - 0.312500f, - 0.206900f, - 0.245426f, - 0.234204f, - 0.367306f, - 0.000000f, - 0.491300f, - 0.467000f, - 0.735200f, - 0.343700f, - 0.655200f, - 0.229919f, - 0.280594f, - 0.344099f, - 0.000000f, - 0.460400f, - 0.559600f, - 0.689100f, - 0.343700f, - 0.689700f, - 0.158370f, - 0.280594f, - 0.382342f, - 0.000000f, - 0.317100f, - 0.559600f, - 0.765600f, - 0.312500f, - 0.689700f, - 0.245426f, - 0.234204f, - 0.367306f, - 0.000000f, - 0.491300f, - 0.467000f, - 0.735200f, - 0.343700f, - 0.655200f, - 0.158370f, - 0.280594f, - 0.382342f, - 0.000000f, - 0.317100f, - 0.559600f, - 0.765600f, - 0.312500f, - 0.689700f, - 0.169052f, - 0.234204f, - 0.408129f, - 0.000000f, - 0.338400f, - 0.467000f, - 0.816900f, - 0.312500f, - 0.655200f, - 0.143212f, - -0.428429f, - 0.214334f, - 0.000000f, - 0.287800f, - -0.855300f, - 0.430700f, - 0.343700f, - 0.172400f, - 0.168107f, - -0.398046f, - 0.251592f, - 0.000000f, - 0.337400f, - -0.794500f, - 0.505000f, - 0.343700f, - 0.206900f, - 0.115795f, - -0.398046f, - 0.279554f, - 0.000000f, - 0.232400f, - -0.794500f, - 0.561100f, - 0.312500f, - 0.206900f, - 0.143212f, - -0.428429f, - 0.214334f, - 0.000000f, - 0.287800f, - -0.855300f, - 0.430700f, - 0.343700f, - 0.172400f, - 0.115795f, - -0.398046f, - 0.279554f, - 0.000000f, - 0.232400f, - -0.794500f, - 0.561100f, - 0.312500f, - 0.206900f, - 0.098646f, - -0.428429f, - 0.238155f, - 0.000000f, - 0.198200f, - -0.855300f, - 0.478600f, - 0.312500f, - 0.172400f, - 0.258055f, - 0.185069f, - 0.386207f, - 0.000000f, - 0.516300f, - 0.369000f, - 0.772800f, - 0.343700f, - 0.620700f, - 0.245426f, - 0.234204f, - 0.367306f, - 0.000000f, - 0.491300f, - 0.467000f, - 0.735200f, - 0.343700f, - 0.655200f, - 0.169052f, - 0.234204f, - 0.408129f, - 0.000000f, - 0.338400f, - 0.467000f, - 0.816900f, - 0.312500f, - 0.655200f, - 0.258055f, - 0.185069f, - 0.386207f, - 0.000000f, - 0.516300f, - 0.369000f, - 0.772800f, - 0.343700f, - 0.620700f, - 0.169052f, - 0.234204f, - 0.408129f, - 0.000000f, - 0.338400f, - 0.467000f, - 0.816900f, - 0.312500f, - 0.655200f, - 0.177751f, - 0.185069f, - 0.429130f, - 0.000000f, - 0.355700f, - 0.369000f, - 0.858700f, - 0.312500f, - 0.620700f, - 0.116638f, - -0.453788f, - 0.174562f, - 0.000000f, - 0.234800f, - -0.906300f, - 0.351400f, - 0.343700f, - 0.137900f, - 0.143212f, - -0.428429f, - 0.214334f, - 0.000000f, - 0.287800f, - -0.855300f, - 0.430700f, - 0.343700f, - 0.172400f, - 0.098646f, - -0.428429f, - 0.238155f, - 0.000000f, - 0.198200f, - -0.855300f, - 0.478600f, - 0.312500f, - 0.172400f, - 0.116638f, - -0.453788f, - 0.174562f, - 0.000000f, - 0.234800f, - -0.906300f, - 0.351400f, - 0.343700f, - 0.137900f, - 0.098646f, - -0.428429f, - 0.238155f, - 0.000000f, - 0.198200f, - -0.855300f, - 0.478600f, - 0.312500f, - 0.172400f, - 0.080342f, - -0.453788f, - 0.193963f, - 0.000000f, - 0.161700f, - -0.906300f, - 0.390500f, - 0.312500f, - 0.137900f, - 0.267659f, - 0.133764f, - 0.400581f, - 0.000000f, - 0.535400f, - 0.266600f, - 0.801400f, - 0.343700f, - 0.586200f, - 0.258055f, - 0.185069f, - 0.386207f, - 0.000000f, - 0.516300f, - 0.369000f, - 0.772800f, - 0.343700f, - 0.620700f, - 0.177751f, - 0.185069f, - 0.429130f, - 0.000000f, - 0.355700f, - 0.369000f, - 0.858700f, - 0.312500f, - 0.620700f, - 0.267659f, - 0.133764f, - 0.400581f, - 0.000000f, - 0.535400f, - 0.266600f, - 0.801400f, - 0.343700f, - 0.586200f, - 0.177751f, - 0.185069f, - 0.429130f, - 0.000000f, - 0.355700f, - 0.369000f, - 0.858700f, - 0.312500f, - 0.620700f, - 0.184366f, - 0.133764f, - 0.445101f, - 0.000000f, - 0.368800f, - 0.266600f, - 0.890400f, - 0.312500f, - 0.586200f, - 0.088697f, - -0.473826f, - 0.132745f, - 0.000000f, - 0.179100f, - -0.946600f, - 0.268000f, - 0.343700f, - 0.103400f, - 0.116638f, - -0.453788f, - 0.174562f, - 0.000000f, - 0.234800f, - -0.906300f, - 0.351400f, - 0.343700f, - 0.137900f, - 0.080342f, - -0.453788f, - 0.193963f, - 0.000000f, - 0.161700f, - -0.906300f, - 0.390500f, - 0.312500f, - 0.137900f, - 0.088697f, - -0.473826f, - 0.132745f, - 0.000000f, - 0.179100f, - -0.946600f, - 0.268000f, - 0.343700f, - 0.103400f, - 0.080342f, - -0.453788f, - 0.193963f, - 0.000000f, - 0.161700f, - -0.906300f, - 0.390500f, - 0.312500f, - 0.137900f, - 0.061095f, - -0.473826f, - 0.147498f, - 0.000000f, - 0.123300f, - -0.946600f, - 0.297800f, - 0.312500f, - 0.103400f, - 0.145832f, - -0.323693f, - 0.352073f, - 0.000000f, - 0.292200f, - -0.645700f, - 0.705400f, - 0.312500f, - 0.275900f, - 0.158370f, - -0.280594f, - 0.382342f, - 0.000000f, - 0.317100f, - -0.559600f, - 0.765600f, - 0.312500f, - 0.310300f, - 0.080737f, - -0.280594f, - 0.405892f, - 0.000000f, - 0.161700f, - -0.559600f, - 0.812800f, - 0.281200f, - 0.310300f, - 0.145832f, - -0.323693f, - 0.352073f, - 0.000000f, - 0.292200f, - -0.645700f, - 0.705400f, - 0.312500f, - 0.275900f, - 0.080737f, - -0.280594f, - 0.405892f, - 0.000000f, - 0.161700f, - -0.559600f, - 0.812800f, - 0.281200f, - 0.310300f, - 0.074345f, - -0.323693f, - 0.373758f, - 0.000000f, - 0.149000f, - -0.645700f, - 0.748900f, - 0.281200f, - 0.275900f, - 0.145832f, - 0.323693f, - 0.352073f, - 0.000000f, - 0.292200f, - 0.645700f, - 0.705400f, - 0.312500f, - 0.724100f, - 0.131585f, - 0.362998f, - 0.317675f, - 0.000000f, - 0.263800f, - 0.724300f, - 0.637000f, - 0.312500f, - 0.758600f, - 0.067081f, - 0.362998f, - 0.337242f, - 0.000000f, - 0.134500f, - 0.724300f, - 0.676200f, - 0.281200f, - 0.758600f, - 0.145832f, - 0.323693f, - 0.352073f, - 0.000000f, - 0.292200f, - 0.645700f, - 0.705400f, - 0.312500f, - 0.724100f, - 0.067081f, - 0.362998f, - 0.337242f, - 0.000000f, - 0.134500f, - 0.724300f, - 0.676200f, - 0.281200f, - 0.758600f, - 0.074345f, - 0.323693f, - 0.373758f, - 0.000000f, - 0.149000f, - 0.645700f, - 0.748900f, - 0.281200f, - 0.724100f, - 0.131585f, - -0.362998f, - 0.317676f, - 0.000000f, - 0.263800f, - -0.724300f, - 0.637000f, - 0.312500f, - 0.241400f, - 0.145832f, - -0.323693f, - 0.352073f, - 0.000000f, - 0.292200f, - -0.645700f, - 0.705400f, - 0.312500f, - 0.275900f, - 0.074345f, - -0.323693f, - 0.373758f, - 0.000000f, - 0.149000f, - -0.645700f, - 0.748900f, - 0.281200f, - 0.275900f, - 0.131585f, - -0.362998f, - 0.317676f, - 0.000000f, - 0.263800f, - -0.724300f, - 0.637000f, - 0.312500f, - 0.241400f, - 0.074345f, - -0.323693f, - 0.373758f, - 0.000000f, - 0.149000f, - -0.645700f, - 0.748900f, - 0.281200f, - 0.275900f, - 0.067081f, - -0.362998f, - 0.337243f, - 0.000000f, - 0.134500f, - -0.724300f, - 0.676200f, - 0.281200f, - 0.241400f, - 0.158370f, - 0.280594f, - 0.382342f, - 0.000000f, - 0.317100f, - 0.559600f, - 0.765600f, - 0.312500f, - 0.689700f, - 0.145832f, - 0.323693f, - 0.352073f, - 0.000000f, - 0.292200f, - 0.645700f, - 0.705400f, - 0.312500f, - 0.724100f, - 0.074345f, - 0.323693f, - 0.373758f, - 0.000000f, - 0.149000f, - 0.645700f, - 0.748900f, - 0.281200f, - 0.724100f, - 0.158370f, - 0.280594f, - 0.382342f, - 0.000000f, - 0.317100f, - 0.559600f, - 0.765600f, - 0.312500f, - 0.689700f, - 0.074345f, - 0.323693f, - 0.373758f, - 0.000000f, - 0.149000f, - 0.645700f, - 0.748900f, - 0.281200f, - 0.724100f, - 0.080737f, - 0.280594f, - 0.405892f, - 0.000000f, - 0.161700f, - 0.559600f, - 0.812800f, - 0.281200f, - 0.689700f, - 0.115795f, - -0.398046f, - 0.279554f, - 0.000000f, - 0.232400f, - -0.794500f, - 0.561100f, - 0.312500f, - 0.206900f, - 0.131585f, - -0.362998f, - 0.317676f, - 0.000000f, - 0.263800f, - -0.724300f, - 0.637000f, - 0.312500f, - 0.241400f, - 0.067081f, - -0.362998f, - 0.337243f, - 0.000000f, - 0.134500f, - -0.724300f, - 0.676200f, - 0.281200f, - 0.241400f, - 0.115795f, - -0.398046f, - 0.279554f, - 0.000000f, - 0.232400f, - -0.794500f, - 0.561100f, - 0.312500f, - 0.206900f, - 0.067081f, - -0.362998f, - 0.337243f, - 0.000000f, - 0.134500f, - -0.724300f, - 0.676200f, - 0.281200f, - 0.241400f, - 0.059031f, - -0.398046f, - 0.296773f, - 0.000000f, - 0.118500f, - -0.794500f, - 0.595600f, - 0.281200f, - 0.206900f, - 0.169052f, - 0.234204f, - 0.408129f, - 0.000000f, - 0.338400f, - 0.467000f, - 0.816900f, - 0.312500f, - 0.655200f, - 0.158370f, - 0.280594f, - 0.382342f, - 0.000000f, - 0.317100f, - 0.559600f, - 0.765600f, - 0.312500f, - 0.689700f, - 0.080737f, - 0.280594f, - 0.405892f, - 0.000000f, - 0.161700f, - 0.559600f, - 0.812800f, - 0.281200f, - 0.689700f, - 0.169052f, - 0.234204f, - 0.408129f, - 0.000000f, - 0.338400f, - 0.467000f, - 0.816900f, - 0.312500f, - 0.655200f, - 0.080737f, - 0.280594f, - 0.405892f, - 0.000000f, - 0.161700f, - 0.559600f, - 0.812800f, - 0.281200f, - 0.689700f, - 0.086181f, - 0.234204f, - 0.433267f, - 0.000000f, - 0.172500f, - 0.467000f, - 0.867200f, - 0.281200f, - 0.655200f, - 0.098646f, - -0.428429f, - 0.238155f, - 0.000000f, - 0.198200f, - -0.855300f, - 0.478600f, - 0.312500f, - 0.172400f, - 0.115795f, - -0.398046f, - 0.279554f, - 0.000000f, - 0.232400f, - -0.794500f, - 0.561100f, - 0.312500f, - 0.206900f, - 0.059031f, - -0.398046f, - 0.296773f, - 0.000000f, - 0.118500f, - -0.794500f, - 0.595600f, - 0.281200f, - 0.206900f, - 0.098646f, - -0.428429f, - 0.238155f, - 0.000000f, - 0.198200f, - -0.855300f, - 0.478600f, - 0.312500f, - 0.172400f, - 0.059031f, - -0.398046f, - 0.296773f, - 0.000000f, - 0.118500f, - -0.794500f, - 0.595600f, - 0.281200f, - 0.206900f, - 0.050289f, - -0.428429f, - 0.252824f, - 0.000000f, - 0.101000f, - -0.855300f, - 0.508100f, - 0.281200f, - 0.172400f, - 0.177751f, - 0.185069f, - 0.429130f, - 0.000000f, - 0.355700f, - 0.369000f, - 0.858700f, - 0.312500f, - 0.620700f, - 0.169052f, - 0.234204f, - 0.408129f, - 0.000000f, - 0.338400f, - 0.467000f, - 0.816900f, - 0.312500f, - 0.655200f, - 0.086181f, - 0.234204f, - 0.433267f, - 0.000000f, - 0.172500f, - 0.467000f, - 0.867200f, - 0.281200f, - 0.655200f, - 0.177751f, - 0.185069f, - 0.429130f, - 0.000000f, - 0.355700f, - 0.369000f, - 0.858700f, - 0.312500f, - 0.620700f, - 0.086181f, - 0.234204f, - 0.433267f, - 0.000000f, - 0.172500f, - 0.467000f, - 0.867200f, - 0.281200f, - 0.655200f, - 0.090617f, - 0.185069f, - 0.455563f, - 0.000000f, - 0.181300f, - 0.369000f, - 0.911600f, - 0.281200f, - 0.620700f, - 0.080342f, - -0.453788f, - 0.193963f, - 0.000000f, - 0.161700f, - -0.906300f, - 0.390500f, - 0.312500f, - 0.137900f, - 0.098646f, - -0.428429f, - 0.238155f, - 0.000000f, - 0.198200f, - -0.855300f, - 0.478600f, - 0.312500f, - 0.172400f, - 0.050289f, - -0.428429f, - 0.252824f, - 0.000000f, - 0.101000f, - -0.855300f, - 0.508100f, - 0.281200f, - 0.172400f, - 0.080342f, - -0.453788f, - 0.193963f, - 0.000000f, - 0.161700f, - -0.906300f, - 0.390500f, - 0.312500f, - 0.137900f, - 0.050289f, - -0.428429f, - 0.252824f, - 0.000000f, - 0.101000f, - -0.855300f, - 0.508100f, - 0.281200f, - 0.172400f, - 0.040957f, - -0.453788f, - 0.205910f, - 0.000000f, - 0.082400f, - -0.906300f, - 0.414500f, - 0.281200f, - 0.137900f, - 0.184366f, - 0.133764f, - 0.445101f, - 0.000000f, - 0.368800f, - 0.266600f, - 0.890400f, - 0.312500f, - 0.586200f, - 0.177751f, - 0.185069f, - 0.429130f, - 0.000000f, - 0.355700f, - 0.369000f, - 0.858700f, - 0.312500f, - 0.620700f, - 0.090617f, - 0.185069f, - 0.455563f, - 0.000000f, - 0.181300f, - 0.369000f, - 0.911600f, - 0.281200f, - 0.620700f, - 0.184366f, - 0.133764f, - 0.445101f, - 0.000000f, - 0.368800f, - 0.266600f, - 0.890400f, - 0.312500f, - 0.586200f, - 0.090617f, - 0.185069f, - 0.455563f, - 0.000000f, - 0.181300f, - 0.369000f, - 0.911600f, - 0.281200f, - 0.620700f, - 0.093989f, - 0.133764f, - 0.472517f, - 0.000000f, - 0.188000f, - 0.266600f, - 0.945200f, - 0.281200f, - 0.586200f, - 0.061095f, - -0.473826f, - 0.147498f, - 0.000000f, - 0.123300f, - -0.946600f, - 0.297800f, - 0.312500f, - 0.103400f, - 0.080342f, - -0.453788f, - 0.193963f, - 0.000000f, - 0.161700f, - -0.906300f, - 0.390500f, - 0.312500f, - 0.137900f, - 0.040957f, - -0.453788f, - 0.205910f, - 0.000000f, - 0.082400f, - -0.906300f, - 0.414500f, - 0.281200f, - 0.137900f, - 0.061095f, - -0.473826f, - 0.147498f, - 0.000000f, - 0.123300f, - -0.946600f, - 0.297800f, - 0.312500f, - 0.103400f, - 0.040957f, - -0.453788f, - 0.205910f, - 0.000000f, - 0.082400f, - -0.906300f, - 0.414500f, - 0.281200f, - 0.137900f, - 0.031146f, - -0.473826f, - 0.156583f, - 0.000000f, - 0.062900f, - -0.946600f, - 0.316100f, - 0.281200f, - 0.103400f, - 0.188820f, - 0.080891f, - 0.455853f, - 0.000000f, - 0.377700f, - 0.161200f, - 0.911800f, - 0.312500f, - 0.551700f, - 0.184366f, - 0.133764f, - 0.445101f, - 0.000000f, - 0.368800f, - 0.266600f, - 0.890400f, - 0.312500f, - 0.586200f, - 0.093989f, - 0.133764f, - 0.472517f, - 0.000000f, - 0.188000f, - 0.266600f, - 0.945200f, - 0.281200f, - 0.586200f, - 0.188820f, - 0.080891f, - 0.455853f, - 0.000000f, - 0.377700f, - 0.161200f, - 0.911800f, - 0.312500f, - 0.551700f, - 0.093989f, - 0.133764f, - 0.472517f, - 0.000000f, - 0.188000f, - 0.266600f, - 0.945200f, - 0.281200f, - 0.586200f, - 0.096259f, - 0.080891f, - 0.483932f, - 0.000000f, - 0.192500f, - 0.161200f, - 0.967900f, - 0.281200f, - 0.551700f, - 0.041132f, - -0.488310f, - 0.099303f, - 0.000000f, - 0.083500f, - -0.975900f, - 0.201600f, - 0.312500f, - 0.069000f, - 0.061095f, - -0.473826f, - 0.147498f, - 0.000000f, - 0.123300f, - -0.946600f, - 0.297800f, - 0.312500f, - 0.103400f, - 0.031146f, - -0.473826f, - 0.156583f, - 0.000000f, - 0.062900f, - -0.946600f, - 0.316100f, - 0.281200f, - 0.103400f, - 0.041132f, - -0.488310f, - 0.099303f, - 0.000000f, - 0.083500f, - -0.975900f, - 0.201600f, - 0.312500f, - 0.069000f, - 0.031146f, - -0.473826f, - 0.156583f, - 0.000000f, - 0.062900f, - -0.946600f, - 0.316100f, - 0.281200f, - 0.103400f, - 0.020969f, - -0.488310f, - 0.105420f, - 0.000000f, - 0.042500f, - -0.975900f, - 0.214000f, - 0.281200f, - 0.069000f, - 0.191060f, - 0.027069f, - 0.461262f, - 0.000000f, - 0.382100f, - 0.054000f, - 0.922500f, - 0.312500f, - 0.517200f, - 0.188820f, - 0.080891f, - 0.455853f, - 0.000000f, - 0.377700f, - 0.161200f, - 0.911800f, - 0.312500f, - 0.551700f, - 0.096259f, - 0.080891f, - 0.483932f, - 0.000000f, - 0.192500f, - 0.161200f, - 0.967900f, - 0.281200f, - 0.551700f, - 0.191060f, - 0.027069f, - 0.461262f, - 0.000000f, - 0.382100f, - 0.054000f, - 0.922500f, - 0.312500f, - 0.517200f, - 0.096259f, - 0.080891f, - 0.483932f, - 0.000000f, - 0.192500f, - 0.161200f, - 0.967900f, - 0.281200f, - 0.551700f, - 0.097401f, - 0.027069f, - 0.489673f, - 0.000000f, - 0.194800f, - 0.054000f, - 0.979300f, - 0.281200f, - 0.517200f, - 0.020687f, - 0.497069f, - 0.049944f, - 0.000000f, - 0.042600f, - 0.993700f, - 0.103000f, - 0.467100f, - 0.962300f, - -0.000000f, - 0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - 1.000000f, - 0.000000f, - 0.482000f, - 0.960300f, - 0.010546f, - 0.497069f, - 0.053020f, - 0.000000f, - 0.021700f, - 0.993700f, - 0.109300f, - 0.468900f, - 0.962300f, - 0.020687f, - -0.497069f, - 0.049945f, - 0.000000f, - 0.042600f, - -0.993700f, - 0.103000f, - 0.312500f, - 0.034500f, - 0.041132f, - -0.488310f, - 0.099303f, - 0.000000f, - 0.083500f, - -0.975900f, - 0.201600f, - 0.312500f, - 0.069000f, - 0.020969f, - -0.488310f, - 0.105420f, - 0.000000f, - 0.042500f, - -0.975900f, - 0.214000f, - 0.281200f, - 0.069000f, - 0.020687f, - -0.497069f, - 0.049945f, - 0.000000f, - 0.042600f, - -0.993700f, - 0.103000f, - 0.312500f, - 0.034500f, - 0.020969f, - -0.488310f, - 0.105420f, - 0.000000f, - 0.042500f, - -0.975900f, - 0.214000f, - 0.281200f, - 0.069000f, - 0.010546f, - -0.497069f, - 0.053020f, - 0.000000f, - 0.021700f, - -0.993700f, - 0.109300f, - 0.281200f, - 0.034500f, - 0.191060f, - -0.027069f, - 0.461262f, - 0.000000f, - 0.382100f, - -0.054000f, - 0.922500f, - 0.312500f, - 0.482800f, - 0.191060f, - 0.027069f, - 0.461262f, - 0.000000f, - 0.382100f, - 0.054000f, - 0.922500f, - 0.312500f, - 0.517200f, - 0.097401f, - 0.027069f, - 0.489673f, - 0.000000f, - 0.194800f, - 0.054000f, - 0.979300f, - 0.281200f, - 0.517200f, - 0.191060f, - -0.027069f, - 0.461262f, - 0.000000f, - 0.382100f, - -0.054000f, - 0.922500f, - 0.312500f, - 0.482800f, - 0.097401f, - 0.027069f, - 0.489673f, - 0.000000f, - 0.194800f, - 0.054000f, - 0.979300f, - 0.281200f, - 0.517200f, - 0.097401f, - -0.027069f, - 0.489673f, - 0.000000f, - 0.194800f, - -0.054000f, - 0.979300f, - 0.281200f, - 0.482800f, - 0.041132f, - 0.488310f, - 0.099303f, - 0.000000f, - 0.083500f, - 0.975900f, - 0.201600f, - 0.312500f, - 0.931000f, - 0.020687f, - 0.497069f, - 0.049944f, - 0.000000f, - 0.042600f, - 0.993700f, - 0.103000f, - 0.312500f, - 0.965500f, - 0.010546f, - 0.497069f, - 0.053020f, - 0.000000f, - 0.021700f, - 0.993700f, - 0.109300f, - 0.281200f, - 0.965500f, - 0.041132f, - 0.488310f, - 0.099303f, - 0.000000f, - 0.083500f, - 0.975900f, - 0.201600f, - 0.312500f, - 0.931000f, - 0.010546f, - 0.497069f, - 0.053020f, - 0.000000f, - 0.021700f, - 0.993700f, - 0.109300f, - 0.281200f, - 0.965500f, - 0.020969f, - 0.488310f, - 0.105420f, - 0.000000f, - 0.042500f, - 0.975900f, - 0.214000f, - 0.281200f, - 0.931000f, - -0.000000f, - -0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - -1.000000f, - 0.000000f, - 0.411700f, - 0.051000f, - 0.020687f, - -0.497069f, - 0.049945f, - 0.000000f, - 0.042600f, - -0.993700f, - 0.103000f, - 0.436600f, - 0.053800f, - 0.010546f, - -0.497069f, - 0.053020f, - 0.000000f, - 0.021700f, - -0.993700f, - 0.109300f, - 0.434000f, - 0.053800f, - 0.188820f, - -0.080891f, - 0.455853f, - 0.000000f, - 0.377700f, - -0.161200f, - 0.911800f, - 0.312500f, - 0.448300f, - 0.191060f, - -0.027069f, - 0.461262f, - 0.000000f, - 0.382100f, - -0.054000f, - 0.922500f, - 0.312500f, - 0.482800f, - 0.097401f, - -0.027069f, - 0.489673f, - 0.000000f, - 0.194800f, - -0.054000f, - 0.979300f, - 0.281200f, - 0.482800f, - 0.188820f, - -0.080891f, - 0.455853f, - 0.000000f, - 0.377700f, - -0.161200f, - 0.911800f, - 0.312500f, - 0.448300f, - 0.097401f, - -0.027069f, - 0.489673f, - 0.000000f, - 0.194800f, - -0.054000f, - 0.979300f, - 0.281200f, - 0.482800f, - 0.096259f, - -0.080891f, - 0.483932f, - 0.000000f, - 0.192500f, - -0.161200f, - 0.967900f, - 0.281200f, - 0.448300f, - 0.061095f, - 0.473826f, - 0.147498f, - 0.000000f, - 0.123300f, - 0.946600f, - 0.297800f, - 0.312500f, - 0.896600f, - 0.041132f, - 0.488310f, - 0.099303f, - 0.000000f, - 0.083500f, - 0.975900f, - 0.201600f, - 0.312500f, - 0.931000f, - 0.020969f, - 0.488310f, - 0.105420f, - 0.000000f, - 0.042500f, - 0.975900f, - 0.214000f, - 0.281200f, - 0.931000f, - 0.061095f, - 0.473826f, - 0.147498f, - 0.000000f, - 0.123300f, - 0.946600f, - 0.297800f, - 0.312500f, - 0.896600f, - 0.020969f, - 0.488310f, - 0.105420f, - 0.000000f, - 0.042500f, - 0.975900f, - 0.214000f, - 0.281200f, - 0.931000f, - 0.031146f, - 0.473826f, - 0.156583f, - 0.000000f, - 0.062900f, - 0.946600f, - 0.316100f, - 0.281200f, - 0.896600f, - 0.184366f, - -0.133764f, - 0.445101f, - 0.000000f, - 0.368800f, - -0.266600f, - 0.890400f, - 0.312500f, - 0.413800f, - 0.188820f, - -0.080891f, - 0.455853f, - 0.000000f, - 0.377700f, - -0.161200f, - 0.911800f, - 0.312500f, - 0.448300f, - 0.096259f, - -0.080891f, - 0.483932f, - 0.000000f, - 0.192500f, - -0.161200f, - 0.967900f, - 0.281200f, - 0.448300f, - 0.184366f, - -0.133764f, - 0.445101f, - 0.000000f, - 0.368800f, - -0.266600f, - 0.890400f, - 0.312500f, - 0.413800f, - 0.096259f, - -0.080891f, - 0.483932f, - 0.000000f, - 0.192500f, - -0.161200f, - 0.967900f, - 0.281200f, - 0.448300f, - 0.093989f, - -0.133764f, - 0.472517f, - 0.000000f, - 0.188000f, - -0.266600f, - 0.945200f, - 0.281200f, - 0.413800f, - 0.080342f, - 0.453788f, - 0.193963f, - 0.000000f, - 0.161700f, - 0.906300f, - 0.390500f, - 0.312500f, - 0.862100f, - 0.061095f, - 0.473826f, - 0.147498f, - 0.000000f, - 0.123300f, - 0.946600f, - 0.297800f, - 0.312500f, - 0.896600f, - 0.031146f, - 0.473826f, - 0.156583f, - 0.000000f, - 0.062900f, - 0.946600f, - 0.316100f, - 0.281200f, - 0.896600f, - 0.080342f, - 0.453788f, - 0.193963f, - 0.000000f, - 0.161700f, - 0.906300f, - 0.390500f, - 0.312500f, - 0.862100f, - 0.031146f, - 0.473826f, - 0.156583f, - 0.000000f, - 0.062900f, - 0.946600f, - 0.316100f, - 0.281200f, - 0.896600f, - 0.040957f, - 0.453788f, - 0.205910f, - 0.000000f, - 0.082400f, - 0.906300f, - 0.414500f, - 0.281200f, - 0.862100f, - 0.177751f, - -0.185069f, - 0.429130f, - 0.000000f, - 0.355700f, - -0.369000f, - 0.858700f, - 0.312500f, - 0.379300f, - 0.184366f, - -0.133764f, - 0.445101f, - 0.000000f, - 0.368800f, - -0.266600f, - 0.890400f, - 0.312500f, - 0.413800f, - 0.093989f, - -0.133764f, - 0.472517f, - 0.000000f, - 0.188000f, - -0.266600f, - 0.945200f, - 0.281200f, - 0.413800f, - 0.177751f, - -0.185069f, - 0.429130f, - 0.000000f, - 0.355700f, - -0.369000f, - 0.858700f, - 0.312500f, - 0.379300f, - 0.093989f, - -0.133764f, - 0.472517f, - 0.000000f, - 0.188000f, - -0.266600f, - 0.945200f, - 0.281200f, - 0.413800f, - 0.090617f, - -0.185069f, - 0.455563f, - 0.000000f, - 0.181300f, - -0.369000f, - 0.911600f, - 0.281200f, - 0.379300f, - 0.098646f, - 0.428429f, - 0.238155f, - 0.000000f, - 0.198200f, - 0.855300f, - 0.478600f, - 0.312500f, - 0.827600f, - 0.080342f, - 0.453788f, - 0.193963f, - 0.000000f, - 0.161700f, - 0.906300f, - 0.390500f, - 0.312500f, - 0.862100f, - 0.040957f, - 0.453788f, - 0.205910f, - 0.000000f, - 0.082400f, - 0.906300f, - 0.414500f, - 0.281200f, - 0.862100f, - 0.098646f, - 0.428429f, - 0.238155f, - 0.000000f, - 0.198200f, - 0.855300f, - 0.478600f, - 0.312500f, - 0.827600f, - 0.040957f, - 0.453788f, - 0.205910f, - 0.000000f, - 0.082400f, - 0.906300f, - 0.414500f, - 0.281200f, - 0.862100f, - 0.050289f, - 0.428429f, - 0.252823f, - 0.000000f, - 0.101000f, - 0.855300f, - 0.508100f, - 0.281200f, - 0.827600f, - 0.169052f, - -0.234204f, - 0.408129f, - 0.000000f, - 0.338400f, - -0.467000f, - 0.816900f, - 0.312500f, - 0.344800f, - 0.177751f, - -0.185069f, - 0.429130f, - 0.000000f, - 0.355700f, - -0.369000f, - 0.858700f, - 0.312500f, - 0.379300f, - 0.090617f, - -0.185069f, - 0.455563f, - 0.000000f, - 0.181300f, - -0.369000f, - 0.911600f, - 0.281200f, - 0.379300f, - 0.169052f, - -0.234204f, - 0.408129f, - 0.000000f, - 0.338400f, - -0.467000f, - 0.816900f, - 0.312500f, - 0.344800f, - 0.090617f, - -0.185069f, - 0.455563f, - 0.000000f, - 0.181300f, - -0.369000f, - 0.911600f, - 0.281200f, - 0.379300f, - 0.086181f, - -0.234204f, - 0.433267f, - 0.000000f, - 0.172500f, - -0.467000f, - 0.867200f, - 0.281200f, - 0.344800f, - 0.115795f, - 0.398046f, - 0.279554f, - 0.000000f, - 0.232400f, - 0.794500f, - 0.561100f, - 0.312500f, - 0.793100f, - 0.098646f, - 0.428429f, - 0.238155f, - 0.000000f, - 0.198200f, - 0.855300f, - 0.478600f, - 0.312500f, - 0.827600f, - 0.050289f, - 0.428429f, - 0.252823f, - 0.000000f, - 0.101000f, - 0.855300f, - 0.508100f, - 0.281200f, - 0.827600f, - 0.115795f, - 0.398046f, - 0.279554f, - 0.000000f, - 0.232400f, - 0.794500f, - 0.561100f, - 0.312500f, - 0.793100f, - 0.050289f, - 0.428429f, - 0.252823f, - 0.000000f, - 0.101000f, - 0.855300f, - 0.508100f, - 0.281200f, - 0.827600f, - 0.059032f, - 0.398046f, - 0.296773f, - 0.000000f, - 0.118500f, - 0.794500f, - 0.595600f, - 0.281200f, - 0.793100f, - 0.158370f, - -0.280594f, - 0.382342f, - 0.000000f, - 0.317100f, - -0.559600f, - 0.765600f, - 0.312500f, - 0.310300f, - 0.169052f, - -0.234204f, - 0.408129f, - 0.000000f, - 0.338400f, - -0.467000f, - 0.816900f, - 0.312500f, - 0.344800f, - 0.086181f, - -0.234204f, - 0.433267f, - 0.000000f, - 0.172500f, - -0.467000f, - 0.867200f, - 0.281200f, - 0.344800f, - 0.158370f, - -0.280594f, - 0.382342f, - 0.000000f, - 0.317100f, - -0.559600f, - 0.765600f, - 0.312500f, - 0.310300f, - 0.086181f, - -0.234204f, - 0.433267f, - 0.000000f, - 0.172500f, - -0.467000f, - 0.867200f, - 0.281200f, - 0.344800f, - 0.080737f, - -0.280594f, - 0.405892f, - 0.000000f, - 0.161700f, - -0.559600f, - 0.812800f, - 0.281200f, - 0.310300f, - 0.131585f, - 0.362998f, - 0.317675f, - 0.000000f, - 0.263800f, - 0.724300f, - 0.637000f, - 0.312500f, - 0.758600f, - 0.115795f, - 0.398046f, - 0.279554f, - 0.000000f, - 0.232400f, - 0.794500f, - 0.561100f, - 0.312500f, - 0.793100f, - 0.059032f, - 0.398046f, - 0.296773f, - 0.000000f, - 0.118500f, - 0.794500f, - 0.595600f, - 0.281200f, - 0.793100f, - 0.131585f, - 0.362998f, - 0.317675f, - 0.000000f, - 0.263800f, - 0.724300f, - 0.637000f, - 0.312500f, - 0.758600f, - 0.059032f, - 0.398046f, - 0.296773f, - 0.000000f, - 0.118500f, - 0.794500f, - 0.595600f, - 0.281200f, - 0.793100f, - 0.067081f, - 0.362998f, - 0.337242f, - 0.000000f, - 0.134500f, - 0.724300f, - 0.676200f, - 0.281200f, - 0.758600f, - -0.000000f, - -0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - -1.000000f, - 0.000000f, - 0.411700f, - 0.051000f, - 0.010546f, - -0.497069f, - 0.053020f, - 0.000000f, - 0.021700f, - -0.993700f, - 0.109300f, - 0.434000f, - 0.053800f, - -0.000000f, - -0.497069f, - 0.054060f, - 0.000000f, - 0.000000f, - -0.993700f, - 0.111500f, - 0.431300f, - 0.053800f, - 0.096259f, - -0.080891f, - 0.483932f, - 0.000000f, - 0.192500f, - -0.161200f, - 0.967900f, - 0.281200f, - 0.448300f, - 0.097401f, - -0.027069f, - 0.489673f, - 0.000000f, - 0.194800f, - -0.054000f, - 0.979300f, - 0.281200f, - 0.482800f, - -0.000000f, - -0.027069f, - 0.499266f, - 0.000000f, - 0.000000f, - -0.054000f, - 0.998500f, - 0.250000f, - 0.482800f, - 0.096259f, - -0.080891f, - 0.483932f, - 0.000000f, - 0.192500f, - -0.161200f, - 0.967900f, - 0.281200f, - 0.448300f, - -0.000000f, - -0.027069f, - 0.499266f, - 0.000000f, - 0.000000f, - -0.054000f, - 0.998500f, - 0.250000f, - 0.482800f, - -0.000000f, - -0.080891f, - 0.493412f, - 0.000000f, - 0.000000f, - -0.161200f, - 0.986900f, - 0.250000f, - 0.448300f, - 0.031146f, - 0.473826f, - 0.156583f, - 0.000000f, - 0.062900f, - 0.946600f, - 0.316100f, - 0.281200f, - 0.896600f, - 0.020969f, - 0.488310f, - 0.105420f, - 0.000000f, - 0.042500f, - 0.975900f, - 0.214000f, - 0.281200f, - 0.931000f, - -0.000000f, - 0.488310f, - 0.107484f, - 0.000000f, - 0.000000f, - 0.975900f, - 0.218200f, - 0.250000f, - 0.931000f, - 0.031146f, - 0.473826f, - 0.156583f, - 0.000000f, - 0.062900f, - 0.946600f, - 0.316100f, - 0.281200f, - 0.896600f, - -0.000000f, - 0.488310f, - 0.107484f, - 0.000000f, - 0.000000f, - 0.975900f, - 0.218200f, - 0.250000f, - 0.931000f, - -0.000000f, - 0.473826f, - 0.159650f, - 0.000000f, - 0.000000f, - 0.946600f, - 0.322300f, - 0.250000f, - 0.896600f, - 0.093989f, - -0.133764f, - 0.472517f, - 0.000000f, - 0.188000f, - -0.266600f, - 0.945200f, - 0.281200f, - 0.413800f, - 0.096259f, - -0.080891f, - 0.483932f, - 0.000000f, - 0.192500f, - -0.161200f, - 0.967900f, - 0.281200f, - 0.448300f, - -0.000000f, - -0.080891f, - 0.493412f, - 0.000000f, - 0.000000f, - -0.161200f, - 0.986900f, - 0.250000f, - 0.448300f, - 0.093989f, - -0.133764f, - 0.472517f, - 0.000000f, - 0.188000f, - -0.266600f, - 0.945200f, - 0.281200f, - 0.413800f, - -0.000000f, - -0.080891f, - 0.493412f, - 0.000000f, - 0.000000f, - -0.161200f, - 0.986900f, - 0.250000f, - 0.448300f, - -0.000000f, - -0.133764f, - 0.481775f, - 0.000000f, - 0.000000f, - -0.266600f, - 0.963800f, - 0.250000f, - 0.413800f, - 0.040957f, - 0.453788f, - 0.205910f, - 0.000000f, - 0.082400f, - 0.906300f, - 0.414500f, - 0.281200f, - 0.862100f, - 0.031146f, - 0.473826f, - 0.156583f, - 0.000000f, - 0.062900f, - 0.946600f, - 0.316100f, - 0.281200f, - 0.896600f, - -0.000000f, - 0.473826f, - 0.159650f, - 0.000000f, - 0.000000f, - 0.946600f, - 0.322300f, - 0.250000f, - 0.896600f, - 0.040957f, - 0.453788f, - 0.205910f, - 0.000000f, - 0.082400f, - 0.906300f, - 0.414500f, - 0.281200f, - 0.862100f, - -0.000000f, - 0.473826f, - 0.159650f, - 0.000000f, - 0.000000f, - 0.946600f, - 0.322300f, - 0.250000f, - 0.896600f, - -0.000000f, - 0.453788f, - 0.209944f, - 0.000000f, - 0.000000f, - 0.906300f, - 0.422700f, - 0.250000f, - 0.862100f, - 0.090617f, - -0.185069f, - 0.455563f, - 0.000000f, - 0.181300f, - -0.369000f, - 0.911600f, - 0.281200f, - 0.379300f, - 0.093989f, - -0.133764f, - 0.472517f, - 0.000000f, - 0.188000f, - -0.266600f, - 0.945200f, - 0.281200f, - 0.413800f, - -0.000000f, - -0.133764f, - 0.481775f, - 0.000000f, - 0.000000f, - -0.266600f, - 0.963800f, - 0.250000f, - 0.413800f, - 0.090617f, - -0.185069f, - 0.455563f, - 0.000000f, - 0.181300f, - -0.369000f, - 0.911600f, - 0.281200f, - 0.379300f, - -0.000000f, - -0.133764f, - 0.481775f, - 0.000000f, - 0.000000f, - -0.266600f, - 0.963800f, - 0.250000f, - 0.413800f, - -0.000000f, - -0.185069f, - 0.464487f, - 0.000000f, - 0.000000f, - -0.369000f, - 0.929400f, - 0.250000f, - 0.379300f, - 0.050289f, - 0.428429f, - 0.252823f, - 0.000000f, - 0.101000f, - 0.855300f, - 0.508100f, - 0.281200f, - 0.827600f, - 0.040957f, - 0.453788f, - 0.205910f, - 0.000000f, - 0.082400f, - 0.906300f, - 0.414500f, - 0.281200f, - 0.862100f, - -0.000000f, - 0.453788f, - 0.209944f, - 0.000000f, - 0.000000f, - 0.906300f, - 0.422700f, - 0.250000f, - 0.862100f, - 0.050289f, - 0.428429f, - 0.252823f, - 0.000000f, - 0.101000f, - 0.855300f, - 0.508100f, - 0.281200f, - 0.827600f, - -0.000000f, - 0.453788f, - 0.209944f, - 0.000000f, - 0.000000f, - 0.906300f, - 0.422700f, - 0.250000f, - 0.862100f, - -0.000000f, - 0.428429f, - 0.257776f, - 0.000000f, - 0.000000f, - 0.855300f, - 0.518000f, - 0.250000f, - 0.827600f, - 0.086181f, - -0.234204f, - 0.433267f, - 0.000000f, - 0.172500f, - -0.467000f, - 0.867200f, - 0.281200f, - 0.344800f, - 0.090617f, - -0.185069f, - 0.455563f, - 0.000000f, - 0.181300f, - -0.369000f, - 0.911600f, - 0.281200f, - 0.379300f, - -0.000000f, - -0.185069f, - 0.464487f, - 0.000000f, - 0.000000f, - -0.369000f, - 0.929400f, - 0.250000f, - 0.379300f, - 0.086181f, - -0.234204f, - 0.433267f, - 0.000000f, - 0.172500f, - -0.467000f, - 0.867200f, - 0.281200f, - 0.344800f, - -0.000000f, - -0.185069f, - 0.464487f, - 0.000000f, - 0.000000f, - -0.369000f, - 0.929400f, - 0.250000f, - 0.379300f, - -0.000000f, - -0.234204f, - 0.441756f, - 0.000000f, - 0.000000f, - -0.467000f, - 0.884200f, - 0.250000f, - 0.344800f, - 0.059032f, - 0.398046f, - 0.296773f, - 0.000000f, - 0.118500f, - 0.794500f, - 0.595600f, - 0.281200f, - 0.793100f, - 0.050289f, - 0.428429f, - 0.252823f, - 0.000000f, - 0.101000f, - 0.855300f, - 0.508100f, - 0.281200f, - 0.827600f, - -0.000000f, - 0.428429f, - 0.257776f, - 0.000000f, - 0.000000f, - 0.855300f, - 0.518000f, - 0.250000f, - 0.827600f, - 0.059032f, - 0.398046f, - 0.296773f, - 0.000000f, - 0.118500f, - 0.794500f, - 0.595600f, - 0.281200f, - 0.793100f, - -0.000000f, - 0.428429f, - 0.257776f, - 0.000000f, - 0.000000f, - 0.855300f, - 0.518000f, - 0.250000f, - 0.827600f, - -0.000000f, - 0.398046f, - 0.302586f, - 0.000000f, - 0.000000f, - 0.794500f, - 0.607300f, - 0.250000f, - 0.793100f, - 0.080737f, - -0.280594f, - 0.405892f, - 0.000000f, - 0.161700f, - -0.559600f, - 0.812800f, - 0.281200f, - 0.310300f, - 0.086181f, - -0.234204f, - 0.433267f, - 0.000000f, - 0.172500f, - -0.467000f, - 0.867200f, - 0.281200f, - 0.344800f, - -0.000000f, - -0.234204f, - 0.441756f, - 0.000000f, - 0.000000f, - -0.467000f, - 0.884200f, - 0.250000f, - 0.344800f, - 0.080737f, - -0.280594f, - 0.405892f, - 0.000000f, - 0.161700f, - -0.559600f, - 0.812800f, - 0.281200f, - 0.310300f, - -0.000000f, - -0.234204f, - 0.441756f, - 0.000000f, - 0.000000f, - -0.467000f, - 0.884200f, - 0.250000f, - 0.344800f, - -0.000000f, - -0.280594f, - 0.413844f, - 0.000000f, - 0.000000f, - -0.559600f, - 0.828700f, - 0.250000f, - 0.310300f, - 0.067081f, - 0.362998f, - 0.337242f, - 0.000000f, - 0.134500f, - 0.724300f, - 0.676200f, - 0.281200f, - 0.758600f, - 0.059032f, - 0.398046f, - 0.296773f, - 0.000000f, - 0.118500f, - 0.794500f, - 0.595600f, - 0.281200f, - 0.793100f, - -0.000000f, - 0.398046f, - 0.302586f, - 0.000000f, - 0.000000f, - 0.794500f, - 0.607300f, - 0.250000f, - 0.793100f, - 0.067081f, - 0.362998f, - 0.337242f, - 0.000000f, - 0.134500f, - 0.724300f, - 0.676200f, - 0.281200f, - 0.758600f, - -0.000000f, - 0.398046f, - 0.302586f, - 0.000000f, - 0.000000f, - 0.794500f, - 0.607300f, - 0.250000f, - 0.793100f, - -0.000000f, - 0.362998f, - 0.343849f, - 0.000000f, - 0.000000f, - 0.724300f, - 0.689400f, - 0.250000f, - 0.758600f, - 0.074345f, - -0.323693f, - 0.373758f, - 0.000000f, - 0.149000f, - -0.645700f, - 0.748900f, - 0.281200f, - 0.275900f, - 0.080737f, - -0.280594f, - 0.405892f, - 0.000000f, - 0.161700f, - -0.559600f, - 0.812800f, - 0.281200f, - 0.310300f, - -0.000000f, - -0.280594f, - 0.413844f, - 0.000000f, - 0.000000f, - -0.559600f, - 0.828700f, - 0.250000f, - 0.310300f, - 0.074345f, - -0.323693f, - 0.373758f, - 0.000000f, - 0.149000f, - -0.645700f, - 0.748900f, - 0.281200f, - 0.275900f, - -0.000000f, - -0.280594f, - 0.413844f, - 0.000000f, - 0.000000f, - -0.559600f, - 0.828700f, - 0.250000f, - 0.310300f, - -0.000000f, - -0.323693f, - 0.381081f, - 0.000000f, - 0.000000f, - -0.645700f, - 0.763500f, - 0.250000f, - 0.275900f, - 0.074345f, - 0.323693f, - 0.373758f, - 0.000000f, - 0.149000f, - 0.645700f, - 0.748900f, - 0.281200f, - 0.724100f, - 0.067081f, - 0.362998f, - 0.337242f, - 0.000000f, - 0.134500f, - 0.724300f, - 0.676200f, - 0.281200f, - 0.758600f, - -0.000000f, - 0.362998f, - 0.343849f, - 0.000000f, - 0.000000f, - 0.724300f, - 0.689400f, - 0.250000f, - 0.758600f, - 0.074345f, - 0.323693f, - 0.373758f, - 0.000000f, - 0.149000f, - 0.645700f, - 0.748900f, - 0.281200f, - 0.724100f, - -0.000000f, - 0.362998f, - 0.343849f, - 0.000000f, - 0.000000f, - 0.724300f, - 0.689400f, - 0.250000f, - 0.758600f, - -0.000000f, - 0.323693f, - 0.381081f, - 0.000000f, - 0.000000f, - 0.645700f, - 0.763500f, - 0.250000f, - 0.724100f, - 0.067081f, - -0.362998f, - 0.337243f, - 0.000000f, - 0.134500f, - -0.724300f, - 0.676200f, - 0.281200f, - 0.241400f, - 0.074345f, - -0.323693f, - 0.373758f, - 0.000000f, - 0.149000f, - -0.645700f, - 0.748900f, - 0.281200f, - 0.275900f, - -0.000000f, - -0.323693f, - 0.381081f, - 0.000000f, - 0.000000f, - -0.645700f, - 0.763500f, - 0.250000f, - 0.275900f, - 0.067081f, - -0.362998f, - 0.337243f, - 0.000000f, - 0.134500f, - -0.724300f, - 0.676200f, - 0.281200f, - 0.241400f, - -0.000000f, - -0.323693f, - 0.381081f, - 0.000000f, - 0.000000f, - -0.645700f, - 0.763500f, - 0.250000f, - 0.275900f, - -0.000000f, - -0.362998f, - 0.343849f, - 0.000000f, - 0.000000f, - -0.724300f, - 0.689500f, - 0.250000f, - 0.241400f, - 0.080737f, - 0.280594f, - 0.405892f, - 0.000000f, - 0.161700f, - 0.559600f, - 0.812800f, - 0.281200f, - 0.689700f, - 0.074345f, - 0.323693f, - 0.373758f, - 0.000000f, - 0.149000f, - 0.645700f, - 0.748900f, - 0.281200f, - 0.724100f, - -0.000000f, - 0.323693f, - 0.381081f, - 0.000000f, - 0.000000f, - 0.645700f, - 0.763500f, - 0.250000f, - 0.724100f, - 0.080737f, - 0.280594f, - 0.405892f, - 0.000000f, - 0.161700f, - 0.559600f, - 0.812800f, - 0.281200f, - 0.689700f, - -0.000000f, - 0.323693f, - 0.381081f, - 0.000000f, - 0.000000f, - 0.645700f, - 0.763500f, - 0.250000f, - 0.724100f, - -0.000000f, - 0.280594f, - 0.413844f, - 0.000000f, - 0.000000f, - 0.559600f, - 0.828700f, - 0.250000f, - 0.689700f, - 0.059031f, - -0.398046f, - 0.296773f, - 0.000000f, - 0.118500f, - -0.794500f, - 0.595600f, - 0.281200f, - 0.206900f, - 0.067081f, - -0.362998f, - 0.337243f, - 0.000000f, - 0.134500f, - -0.724300f, - 0.676200f, - 0.281200f, - 0.241400f, - -0.000000f, - -0.362998f, - 0.343849f, - 0.000000f, - 0.000000f, - -0.724300f, - 0.689500f, - 0.250000f, - 0.241400f, - 0.059031f, - -0.398046f, - 0.296773f, - 0.000000f, - 0.118500f, - -0.794500f, - 0.595600f, - 0.281200f, - 0.206900f, - -0.000000f, - -0.362998f, - 0.343849f, - 0.000000f, - 0.000000f, - -0.724300f, - 0.689500f, - 0.250000f, - 0.241400f, - -0.000000f, - -0.398046f, - 0.302586f, - 0.000000f, - 0.000000f, - -0.794500f, - 0.607300f, - 0.250000f, - 0.206900f, - 0.086181f, - 0.234204f, - 0.433267f, - 0.000000f, - 0.172500f, - 0.467000f, - 0.867200f, - 0.281200f, - 0.655200f, - 0.080737f, - 0.280594f, - 0.405892f, - 0.000000f, - 0.161700f, - 0.559600f, - 0.812800f, - 0.281200f, - 0.689700f, - -0.000000f, - 0.280594f, - 0.413844f, - 0.000000f, - 0.000000f, - 0.559600f, - 0.828700f, - 0.250000f, - 0.689700f, - 0.086181f, - 0.234204f, - 0.433267f, - 0.000000f, - 0.172500f, - 0.467000f, - 0.867200f, - 0.281200f, - 0.655200f, - -0.000000f, - 0.280594f, - 0.413844f, - 0.000000f, - 0.000000f, - 0.559600f, - 0.828700f, - 0.250000f, - 0.689700f, - -0.000000f, - 0.234204f, - 0.441756f, - 0.000000f, - 0.000000f, - 0.467000f, - 0.884200f, - 0.250000f, - 0.655200f, - 0.050289f, - -0.428429f, - 0.252824f, - 0.000000f, - 0.101000f, - -0.855300f, - 0.508100f, - 0.281200f, - 0.172400f, - 0.059031f, - -0.398046f, - 0.296773f, - 0.000000f, - 0.118500f, - -0.794500f, - 0.595600f, - 0.281200f, - 0.206900f, - -0.000000f, - -0.398046f, - 0.302586f, - 0.000000f, - 0.000000f, - -0.794500f, - 0.607300f, - 0.250000f, - 0.206900f, - 0.050289f, - -0.428429f, - 0.252824f, - 0.000000f, - 0.101000f, - -0.855300f, - 0.508100f, - 0.281200f, - 0.172400f, - -0.000000f, - -0.398046f, - 0.302586f, - 0.000000f, - 0.000000f, - -0.794500f, - 0.607300f, - 0.250000f, - 0.206900f, - -0.000000f, - -0.428429f, - 0.257776f, - 0.000000f, - 0.000000f, - -0.855300f, - 0.518000f, - 0.250000f, - 0.172400f, - 0.090617f, - 0.185069f, - 0.455563f, - 0.000000f, - 0.181300f, - 0.369000f, - 0.911600f, - 0.281200f, - 0.620700f, - 0.086181f, - 0.234204f, - 0.433267f, - 0.000000f, - 0.172500f, - 0.467000f, - 0.867200f, - 0.281200f, - 0.655200f, - -0.000000f, - 0.234204f, - 0.441756f, - 0.000000f, - 0.000000f, - 0.467000f, - 0.884200f, - 0.250000f, - 0.655200f, - 0.090617f, - 0.185069f, - 0.455563f, - 0.000000f, - 0.181300f, - 0.369000f, - 0.911600f, - 0.281200f, - 0.620700f, - -0.000000f, - 0.234204f, - 0.441756f, - 0.000000f, - 0.000000f, - 0.467000f, - 0.884200f, - 0.250000f, - 0.655200f, - -0.000000f, - 0.185069f, - 0.464487f, - 0.000000f, - 0.000000f, - 0.369000f, - 0.929400f, - 0.250000f, - 0.620700f, - 0.040957f, - -0.453788f, - 0.205910f, - 0.000000f, - 0.082400f, - -0.906300f, - 0.414500f, - 0.281200f, - 0.137900f, - 0.050289f, - -0.428429f, - 0.252824f, - 0.000000f, - 0.101000f, - -0.855300f, - 0.508100f, - 0.281200f, - 0.172400f, - -0.000000f, - -0.428429f, - 0.257776f, - 0.000000f, - 0.000000f, - -0.855300f, - 0.518000f, - 0.250000f, - 0.172400f, - 0.040957f, - -0.453788f, - 0.205910f, - 0.000000f, - 0.082400f, - -0.906300f, - 0.414500f, - 0.281200f, - 0.137900f, - -0.000000f, - -0.428429f, - 0.257776f, - 0.000000f, - 0.000000f, - -0.855300f, - 0.518000f, - 0.250000f, - 0.172400f, - -0.000000f, - -0.453788f, - 0.209944f, - 0.000000f, - 0.000000f, - -0.906300f, - 0.422700f, - 0.250000f, - 0.137900f, - 0.093989f, - 0.133764f, - 0.472517f, - 0.000000f, - 0.188000f, - 0.266600f, - 0.945200f, - 0.281200f, - 0.586200f, - 0.090617f, - 0.185069f, - 0.455563f, - 0.000000f, - 0.181300f, - 0.369000f, - 0.911600f, - 0.281200f, - 0.620700f, - -0.000000f, - 0.185069f, - 0.464487f, - 0.000000f, - 0.000000f, - 0.369000f, - 0.929400f, - 0.250000f, - 0.620700f, - 0.093989f, - 0.133764f, - 0.472517f, - 0.000000f, - 0.188000f, - 0.266600f, - 0.945200f, - 0.281200f, - 0.586200f, - -0.000000f, - 0.185069f, - 0.464487f, - 0.000000f, - 0.000000f, - 0.369000f, - 0.929400f, - 0.250000f, - 0.620700f, - -0.000000f, - 0.133764f, - 0.481775f, - 0.000000f, - 0.000000f, - 0.266600f, - 0.963800f, - 0.250000f, - 0.586200f, - 0.031146f, - -0.473826f, - 0.156583f, - 0.000000f, - 0.062900f, - -0.946600f, - 0.316100f, - 0.281200f, - 0.103400f, - 0.040957f, - -0.453788f, - 0.205910f, - 0.000000f, - 0.082400f, - -0.906300f, - 0.414500f, - 0.281200f, - 0.137900f, - -0.000000f, - -0.453788f, - 0.209944f, - 0.000000f, - 0.000000f, - -0.906300f, - 0.422700f, - 0.250000f, - 0.137900f, - 0.031146f, - -0.473826f, - 0.156583f, - 0.000000f, - 0.062900f, - -0.946600f, - 0.316100f, - 0.281200f, - 0.103400f, - -0.000000f, - -0.453788f, - 0.209944f, - 0.000000f, - 0.000000f, - -0.906300f, - 0.422700f, - 0.250000f, - 0.137900f, - -0.000000f, - -0.473826f, - 0.159651f, - 0.000000f, - 0.000000f, - -0.946600f, - 0.322300f, - 0.250000f, - 0.103400f, - 0.096259f, - 0.080891f, - 0.483932f, - 0.000000f, - 0.192500f, - 0.161200f, - 0.967900f, - 0.281200f, - 0.551700f, - 0.093989f, - 0.133764f, - 0.472517f, - 0.000000f, - 0.188000f, - 0.266600f, - 0.945200f, - 0.281200f, - 0.586200f, - -0.000000f, - 0.133764f, - 0.481775f, - 0.000000f, - 0.000000f, - 0.266600f, - 0.963800f, - 0.250000f, - 0.586200f, - 0.096259f, - 0.080891f, - 0.483932f, - 0.000000f, - 0.192500f, - 0.161200f, - 0.967900f, - 0.281200f, - 0.551700f, - -0.000000f, - 0.133764f, - 0.481775f, - 0.000000f, - 0.000000f, - 0.266600f, - 0.963800f, - 0.250000f, - 0.586200f, - -0.000000f, - 0.080891f, - 0.493412f, - 0.000000f, - 0.000000f, - 0.161200f, - 0.986900f, - 0.250000f, - 0.551700f, - 0.020969f, - -0.488310f, - 0.105420f, - 0.000000f, - 0.042500f, - -0.975900f, - 0.214000f, - 0.281200f, - 0.069000f, - 0.031146f, - -0.473826f, - 0.156583f, - 0.000000f, - 0.062900f, - -0.946600f, - 0.316100f, - 0.281200f, - 0.103400f, - -0.000000f, - -0.473826f, - 0.159651f, - 0.000000f, - 0.000000f, - -0.946600f, - 0.322300f, - 0.250000f, - 0.103400f, - 0.020969f, - -0.488310f, - 0.105420f, - 0.000000f, - 0.042500f, - -0.975900f, - 0.214000f, - 0.281200f, - 0.069000f, - -0.000000f, - -0.473826f, - 0.159651f, - 0.000000f, - 0.000000f, - -0.946600f, - 0.322300f, - 0.250000f, - 0.103400f, - -0.000000f, - -0.488310f, - 0.107485f, - 0.000000f, - 0.000000f, - -0.975900f, - 0.218200f, - 0.250000f, - 0.069000f, - 0.097401f, - 0.027069f, - 0.489673f, - 0.000000f, - 0.194800f, - 0.054000f, - 0.979300f, - 0.281200f, - 0.517200f, - 0.096259f, - 0.080891f, - 0.483932f, - 0.000000f, - 0.192500f, - 0.161200f, - 0.967900f, - 0.281200f, - 0.551700f, - -0.000000f, - 0.080891f, - 0.493412f, - 0.000000f, - 0.000000f, - 0.161200f, - 0.986900f, - 0.250000f, - 0.551700f, - 0.097401f, - 0.027069f, - 0.489673f, - 0.000000f, - 0.194800f, - 0.054000f, - 0.979300f, - 0.281200f, - 0.517200f, - -0.000000f, - 0.080891f, - 0.493412f, - 0.000000f, - 0.000000f, - 0.161200f, - 0.986900f, - 0.250000f, - 0.551700f, - -0.000000f, - 0.027069f, - 0.499266f, - 0.000000f, - 0.000000f, - 0.054000f, - 0.998500f, - 0.250000f, - 0.517200f, - 0.010546f, - 0.497069f, - 0.053020f, - 0.000000f, - 0.021700f, - 0.993700f, - 0.109300f, - 0.468900f, - 0.962300f, - -0.000000f, - 0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - 1.000000f, - 0.000000f, - 0.482000f, - 0.960300f, - -0.000000f, - 0.497069f, - 0.054059f, - 0.000000f, - 0.000000f, - 0.993700f, - 0.111500f, - 0.470800f, - 0.962300f, - 0.010546f, - -0.497069f, - 0.053020f, - 0.000000f, - 0.021700f, - -0.993700f, - 0.109300f, - 0.281200f, - 0.034500f, - 0.020969f, - -0.488310f, - 0.105420f, - 0.000000f, - 0.042500f, - -0.975900f, - 0.214000f, - 0.281200f, - 0.069000f, - -0.000000f, - -0.488310f, - 0.107485f, - 0.000000f, - 0.000000f, - -0.975900f, - 0.218200f, - 0.250000f, - 0.069000f, - 0.010546f, - -0.497069f, - 0.053020f, - 0.000000f, - 0.021700f, - -0.993700f, - 0.109300f, - 0.281200f, - 0.034500f, - -0.000000f, - -0.488310f, - 0.107485f, - 0.000000f, - 0.000000f, - -0.975900f, - 0.218200f, - 0.250000f, - 0.069000f, - -0.000000f, - -0.497069f, - 0.054060f, - 0.000000f, - 0.000000f, - -0.993700f, - 0.111500f, - 0.250000f, - 0.034500f, - 0.097401f, - -0.027069f, - 0.489673f, - 0.000000f, - 0.194800f, - -0.054000f, - 0.979300f, - 0.281200f, - 0.482800f, - 0.097401f, - 0.027069f, - 0.489673f, - 0.000000f, - 0.194800f, - 0.054000f, - 0.979300f, - 0.281200f, - 0.517200f, - -0.000000f, - 0.027069f, - 0.499266f, - 0.000000f, - 0.000000f, - 0.054000f, - 0.998500f, - 0.250000f, - 0.517200f, - 0.097401f, - -0.027069f, - 0.489673f, - 0.000000f, - 0.194800f, - -0.054000f, - 0.979300f, - 0.281200f, - 0.482800f, - -0.000000f, - 0.027069f, - 0.499266f, - 0.000000f, - 0.000000f, - 0.054000f, - 0.998500f, - 0.250000f, - 0.517200f, - -0.000000f, - -0.027069f, - 0.499266f, - 0.000000f, - 0.000000f, - -0.054000f, - 0.998500f, - 0.250000f, - 0.482800f, - 0.020969f, - 0.488310f, - 0.105420f, - 0.000000f, - 0.042500f, - 0.975900f, - 0.214000f, - 0.281200f, - 0.931000f, - 0.010546f, - 0.497069f, - 0.053020f, - 0.000000f, - 0.021700f, - 0.993700f, - 0.109300f, - 0.281200f, - 0.965500f, - -0.000000f, - 0.497069f, - 0.054059f, - 0.000000f, - 0.000000f, - 0.993700f, - 0.111500f, - 0.250000f, - 0.965500f, - 0.020969f, - 0.488310f, - 0.105420f, - 0.000000f, - 0.042500f, - 0.975900f, - 0.214000f, - 0.281200f, - 0.931000f, - -0.000000f, - 0.497069f, - 0.054059f, - 0.000000f, - 0.000000f, - 0.993700f, - 0.111500f, - 0.250000f, - 0.965500f, - -0.000000f, - 0.488310f, - 0.107484f, - 0.000000f, - 0.000000f, - 0.975900f, - 0.218200f, - 0.250000f, - 0.931000f, - -0.000000f, - -0.428429f, - 0.257776f, - 0.000000f, - 0.000000f, - -0.855300f, - 0.518000f, - 0.250000f, - 0.172400f, - -0.000000f, - -0.398046f, - 0.302586f, - 0.000000f, - 0.000000f, - -0.794500f, - 0.607300f, - 0.250000f, - 0.206900f, - -0.059032f, - -0.398046f, - 0.296773f, - 0.000000f, - -0.118500f, - -0.794500f, - 0.595600f, - 0.218700f, - 0.206900f, - -0.000000f, - -0.428429f, - 0.257776f, - 0.000000f, - 0.000000f, - -0.855300f, - 0.518000f, - 0.250000f, - 0.172400f, - -0.059032f, - -0.398046f, - 0.296773f, - 0.000000f, - -0.118500f, - -0.794500f, - 0.595600f, - 0.218700f, - 0.206900f, - -0.050290f, - -0.428429f, - 0.252824f, - 0.000000f, - -0.101000f, - -0.855300f, - 0.508100f, - 0.218700f, - 0.172400f, - -0.000000f, - 0.185069f, - 0.464487f, - 0.000000f, - 0.000000f, - 0.369000f, - 0.929400f, - 0.250000f, - 0.620700f, - -0.000000f, - 0.234204f, - 0.441756f, - 0.000000f, - 0.000000f, - 0.467000f, - 0.884200f, - 0.250000f, - 0.655200f, - -0.086182f, - 0.234204f, - 0.433267f, - 0.000000f, - -0.172500f, - 0.467000f, - 0.867200f, - 0.218700f, - 0.655200f, - -0.000000f, - 0.185069f, - 0.464487f, - 0.000000f, - 0.000000f, - 0.369000f, - 0.929400f, - 0.250000f, - 0.620700f, - -0.086182f, - 0.234204f, - 0.433267f, - 0.000000f, - -0.172500f, - 0.467000f, - 0.867200f, - 0.218700f, - 0.655200f, - -0.090618f, - 0.185069f, - 0.455563f, - 0.000000f, - -0.181300f, - 0.369000f, - 0.911600f, - 0.218700f, - 0.620700f, - -0.000000f, - -0.453788f, - 0.209944f, - 0.000000f, - 0.000000f, - -0.906300f, - 0.422700f, - 0.250000f, - 0.137900f, - -0.000000f, - -0.428429f, - 0.257776f, - 0.000000f, - 0.000000f, - -0.855300f, - 0.518000f, - 0.250000f, - 0.172400f, - -0.050290f, - -0.428429f, - 0.252824f, - 0.000000f, - -0.101000f, - -0.855300f, - 0.508100f, - 0.218700f, - 0.172400f, - -0.000000f, - -0.453788f, - 0.209944f, - 0.000000f, - 0.000000f, - -0.906300f, - 0.422700f, - 0.250000f, - 0.137900f, - -0.050290f, - -0.428429f, - 0.252824f, - 0.000000f, - -0.101000f, - -0.855300f, - 0.508100f, - 0.218700f, - 0.172400f, - -0.040959f, - -0.453788f, - 0.205910f, - 0.000000f, - -0.082400f, - -0.906300f, - 0.414500f, - 0.218700f, - 0.137900f, - -0.000000f, - 0.133764f, - 0.481775f, - 0.000000f, - 0.000000f, - 0.266600f, - 0.963800f, - 0.250000f, - 0.586200f, - -0.000000f, - 0.185069f, - 0.464487f, - 0.000000f, - 0.000000f, - 0.369000f, - 0.929400f, - 0.250000f, - 0.620700f, - -0.090618f, - 0.185069f, - 0.455563f, - 0.000000f, - -0.181300f, - 0.369000f, - 0.911600f, - 0.218700f, - 0.620700f, - -0.000000f, - 0.133764f, - 0.481775f, - 0.000000f, - 0.000000f, - 0.266600f, - 0.963800f, - 0.250000f, - 0.586200f, - -0.090618f, - 0.185069f, - 0.455563f, - 0.000000f, - -0.181300f, - 0.369000f, - 0.911600f, - 0.218700f, - 0.620700f, - -0.093990f, - 0.133764f, - 0.472517f, - 0.000000f, - -0.188000f, - 0.266600f, - 0.945200f, - 0.218700f, - 0.586200f, - -0.000000f, - -0.473826f, - 0.159651f, - 0.000000f, - 0.000000f, - -0.946600f, - 0.322300f, - 0.250000f, - 0.103400f, - -0.000000f, - -0.453788f, - 0.209944f, - 0.000000f, - 0.000000f, - -0.906300f, - 0.422700f, - 0.250000f, - 0.137900f, - -0.040959f, - -0.453788f, - 0.205910f, - 0.000000f, - -0.082400f, - -0.906300f, - 0.414500f, - 0.218700f, - 0.137900f, - -0.000000f, - -0.473826f, - 0.159651f, - 0.000000f, - 0.000000f, - -0.946600f, - 0.322300f, - 0.250000f, - 0.103400f, - -0.040959f, - -0.453788f, - 0.205910f, - 0.000000f, - -0.082400f, - -0.906300f, - 0.414500f, - 0.218700f, - 0.137900f, - -0.031147f, - -0.473826f, - 0.156583f, - 0.000000f, - -0.062900f, - -0.946600f, - 0.316100f, - 0.218700f, - 0.103400f, - -0.000000f, - 0.080891f, - 0.493412f, - 0.000000f, - 0.000000f, - 0.161200f, - 0.986900f, - 0.250000f, - 0.551700f, - -0.000000f, - 0.133764f, - 0.481775f, - 0.000000f, - 0.000000f, - 0.266600f, - 0.963800f, - 0.250000f, - 0.586200f, - -0.093990f, - 0.133764f, - 0.472517f, - 0.000000f, - -0.188000f, - 0.266600f, - 0.945200f, - 0.218700f, - 0.586200f, - -0.000000f, - 0.080891f, - 0.493412f, - 0.000000f, - 0.000000f, - 0.161200f, - 0.986900f, - 0.250000f, - 0.551700f, - -0.093990f, - 0.133764f, - 0.472517f, - 0.000000f, - -0.188000f, - 0.266600f, - 0.945200f, - 0.218700f, - 0.586200f, - -0.096261f, - 0.080891f, - 0.483932f, - 0.000000f, - -0.192500f, - 0.161200f, - 0.967900f, - 0.218700f, - 0.551700f, - -0.000000f, - -0.488310f, - 0.107485f, - 0.000000f, - 0.000000f, - -0.975900f, - 0.218200f, - 0.250000f, - 0.069000f, - -0.000000f, - -0.473826f, - 0.159651f, - 0.000000f, - 0.000000f, - -0.946600f, - 0.322300f, - 0.250000f, - 0.103400f, - -0.031147f, - -0.473826f, - 0.156583f, - 0.000000f, - -0.062900f, - -0.946600f, - 0.316100f, - 0.218700f, - 0.103400f, - -0.000000f, - -0.488310f, - 0.107485f, - 0.000000f, - 0.000000f, - -0.975900f, - 0.218200f, - 0.250000f, - 0.069000f, - -0.031147f, - -0.473826f, - 0.156583f, - 0.000000f, - -0.062900f, - -0.946600f, - 0.316100f, - 0.218700f, - 0.103400f, - -0.020970f, - -0.488310f, - 0.105420f, - 0.000000f, - -0.042500f, - -0.975900f, - 0.214000f, - 0.218700f, - 0.069000f, - -0.000000f, - 0.027069f, - 0.499266f, - 0.000000f, - 0.000000f, - 0.054000f, - 0.998500f, - 0.250000f, - 0.517200f, - -0.000000f, - 0.080891f, - 0.493412f, - 0.000000f, - 0.000000f, - 0.161200f, - 0.986900f, - 0.250000f, - 0.551700f, - -0.096261f, - 0.080891f, - 0.483932f, - 0.000000f, - -0.192500f, - 0.161200f, - 0.967900f, - 0.218700f, - 0.551700f, - -0.000000f, - 0.027069f, - 0.499266f, - 0.000000f, - 0.000000f, - 0.054000f, - 0.998500f, - 0.250000f, - 0.517200f, - -0.096261f, - 0.080891f, - 0.483932f, - 0.000000f, - -0.192500f, - 0.161200f, - 0.967900f, - 0.218700f, - 0.551700f, - -0.097402f, - 0.027069f, - 0.489673f, - 0.000000f, - -0.194800f, - 0.054000f, - 0.979300f, - 0.218700f, - 0.517200f, - -0.000000f, - 0.497069f, - 0.054059f, - 0.000000f, - 0.000000f, - 0.993700f, - 0.111500f, - 0.470800f, - 0.962300f, - -0.000000f, - 0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - 1.000000f, - 0.000000f, - 0.482000f, - 0.960300f, - -0.010547f, - 0.497069f, - 0.053020f, - 0.000000f, - -0.021700f, - 0.993700f, - 0.109300f, - 0.472600f, - 0.962300f, - -0.000000f, - -0.497069f, - 0.054060f, - 0.000000f, - 0.000000f, - -0.993700f, - 0.111500f, - 0.250000f, - 0.034500f, - -0.000000f, - -0.488310f, - 0.107485f, - 0.000000f, - 0.000000f, - -0.975900f, - 0.218200f, - 0.250000f, - 0.069000f, - -0.020970f, - -0.488310f, - 0.105420f, - 0.000000f, - -0.042500f, - -0.975900f, - 0.214000f, - 0.218700f, - 0.069000f, - -0.000000f, - -0.497069f, - 0.054060f, - 0.000000f, - 0.000000f, - -0.993700f, - 0.111500f, - 0.250000f, - 0.034500f, - -0.020970f, - -0.488310f, - 0.105420f, - 0.000000f, - -0.042500f, - -0.975900f, - 0.214000f, - 0.218700f, - 0.069000f, - -0.010547f, - -0.497069f, - 0.053020f, - 0.000000f, - -0.021700f, - -0.993700f, - 0.109300f, - 0.218700f, - 0.034500f, - -0.000000f, - -0.027069f, - 0.499266f, - 0.000000f, - 0.000000f, - -0.054000f, - 0.998500f, - 0.250000f, - 0.482800f, - -0.000000f, - 0.027069f, - 0.499266f, - 0.000000f, - 0.000000f, - 0.054000f, - 0.998500f, - 0.250000f, - 0.517200f, - -0.097402f, - 0.027069f, - 0.489673f, - 0.000000f, - -0.194800f, - 0.054000f, - 0.979300f, - 0.218700f, - 0.517200f, - -0.000000f, - -0.027069f, - 0.499266f, - 0.000000f, - 0.000000f, - -0.054000f, - 0.998500f, - 0.250000f, - 0.482800f, - -0.097402f, - 0.027069f, - 0.489673f, - 0.000000f, - -0.194800f, - 0.054000f, - 0.979300f, - 0.218700f, - 0.517200f, - -0.097402f, - -0.027069f, - 0.489673f, - 0.000000f, - -0.194800f, - -0.054000f, - 0.979300f, - 0.218700f, - 0.482800f, - -0.000000f, - 0.488310f, - 0.107484f, - 0.000000f, - 0.000000f, - 0.975900f, - 0.218200f, - 0.250000f, - 0.931000f, - -0.000000f, - 0.497069f, - 0.054059f, - 0.000000f, - 0.000000f, - 0.993700f, - 0.111500f, - 0.250000f, - 0.965500f, - -0.010547f, - 0.497069f, - 0.053020f, - 0.000000f, - -0.021700f, - 0.993700f, - 0.109300f, - 0.218700f, - 0.965500f, - -0.000000f, - 0.488310f, - 0.107484f, - 0.000000f, - 0.000000f, - 0.975900f, - 0.218200f, - 0.250000f, - 0.931000f, - -0.010547f, - 0.497069f, - 0.053020f, - 0.000000f, - -0.021700f, - 0.993700f, - 0.109300f, - 0.218700f, - 0.965500f, - -0.020970f, - 0.488310f, - 0.105420f, - 0.000000f, - -0.042500f, - 0.975900f, - 0.214000f, - 0.218700f, - 0.931000f, - -0.000000f, - -0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - -1.000000f, - 0.000000f, - 0.411700f, - 0.051000f, - -0.000000f, - -0.497069f, - 0.054060f, - 0.000000f, - 0.000000f, - -0.993700f, - 0.111500f, - 0.431300f, - 0.053800f, - -0.010547f, - -0.497069f, - 0.053020f, - 0.000000f, - -0.021700f, - -0.993700f, - 0.109300f, - 0.428700f, - 0.053800f, - -0.000000f, - -0.080891f, - 0.493412f, - 0.000000f, - 0.000000f, - -0.161200f, - 0.986900f, - 0.250000f, - 0.448300f, - -0.000000f, - -0.027069f, - 0.499266f, - 0.000000f, - 0.000000f, - -0.054000f, - 0.998500f, - 0.250000f, - 0.482800f, - -0.097402f, - -0.027069f, - 0.489673f, - 0.000000f, - -0.194800f, - -0.054000f, - 0.979300f, - 0.218700f, - 0.482800f, - -0.000000f, - -0.080891f, - 0.493412f, - 0.000000f, - 0.000000f, - -0.161200f, - 0.986900f, - 0.250000f, - 0.448300f, - -0.097402f, - -0.027069f, - 0.489673f, - 0.000000f, - -0.194800f, - -0.054000f, - 0.979300f, - 0.218700f, - 0.482800f, - -0.096261f, - -0.080891f, - 0.483932f, - 0.000000f, - -0.192500f, - -0.161200f, - 0.967900f, - 0.218700f, - 0.448300f, - -0.000000f, - 0.473826f, - 0.159650f, - 0.000000f, - 0.000000f, - 0.946600f, - 0.322300f, - 0.250000f, - 0.896600f, - -0.000000f, - 0.488310f, - 0.107484f, - 0.000000f, - 0.000000f, - 0.975900f, - 0.218200f, - 0.250000f, - 0.931000f, - -0.020970f, - 0.488310f, - 0.105420f, - 0.000000f, - -0.042500f, - 0.975900f, - 0.214000f, - 0.218700f, - 0.931000f, - -0.000000f, - 0.473826f, - 0.159650f, - 0.000000f, - 0.000000f, - 0.946600f, - 0.322300f, - 0.250000f, - 0.896600f, - -0.020970f, - 0.488310f, - 0.105420f, - 0.000000f, - -0.042500f, - 0.975900f, - 0.214000f, - 0.218700f, - 0.931000f, - -0.031147f, - 0.473826f, - 0.156583f, - 0.000000f, - -0.062900f, - 0.946600f, - 0.316100f, - 0.218700f, - 0.896600f, - -0.000000f, - -0.133764f, - 0.481775f, - 0.000000f, - 0.000000f, - -0.266600f, - 0.963800f, - 0.250000f, - 0.413800f, - -0.000000f, - -0.080891f, - 0.493412f, - 0.000000f, - 0.000000f, - -0.161200f, - 0.986900f, - 0.250000f, - 0.448300f, - -0.096261f, - -0.080891f, - 0.483932f, - 0.000000f, - -0.192500f, - -0.161200f, - 0.967900f, - 0.218700f, - 0.448300f, - -0.000000f, - -0.133764f, - 0.481775f, - 0.000000f, - 0.000000f, - -0.266600f, - 0.963800f, - 0.250000f, - 0.413800f, - -0.096261f, - -0.080891f, - 0.483932f, - 0.000000f, - -0.192500f, - -0.161200f, - 0.967900f, - 0.218700f, - 0.448300f, - -0.093990f, - -0.133764f, - 0.472517f, - 0.000000f, - -0.188000f, - -0.266600f, - 0.945200f, - 0.218700f, - 0.413800f, - -0.000000f, - 0.453788f, - 0.209944f, - 0.000000f, - 0.000000f, - 0.906300f, - 0.422700f, - 0.250000f, - 0.862100f, - -0.000000f, - 0.473826f, - 0.159650f, - 0.000000f, - 0.000000f, - 0.946600f, - 0.322300f, - 0.250000f, - 0.896600f, - -0.031147f, - 0.473826f, - 0.156583f, - 0.000000f, - -0.062900f, - 0.946600f, - 0.316100f, - 0.218700f, - 0.896600f, - -0.000000f, - 0.453788f, - 0.209944f, - 0.000000f, - 0.000000f, - 0.906300f, - 0.422700f, - 0.250000f, - 0.862100f, - -0.031147f, - 0.473826f, - 0.156583f, - 0.000000f, - -0.062900f, - 0.946600f, - 0.316100f, - 0.218700f, - 0.896600f, - -0.040959f, - 0.453788f, - 0.205910f, - 0.000000f, - -0.082400f, - 0.906300f, - 0.414500f, - 0.218700f, - 0.862100f, - -0.000000f, - -0.185069f, - 0.464487f, - 0.000000f, - 0.000000f, - -0.369000f, - 0.929400f, - 0.250000f, - 0.379300f, - -0.000000f, - -0.133764f, - 0.481775f, - 0.000000f, - 0.000000f, - -0.266600f, - 0.963800f, - 0.250000f, - 0.413800f, - -0.093990f, - -0.133764f, - 0.472517f, - 0.000000f, - -0.188000f, - -0.266600f, - 0.945200f, - 0.218700f, - 0.413800f, - -0.000000f, - -0.185069f, - 0.464487f, - 0.000000f, - 0.000000f, - -0.369000f, - 0.929400f, - 0.250000f, - 0.379300f, - -0.093990f, - -0.133764f, - 0.472517f, - 0.000000f, - -0.188000f, - -0.266600f, - 0.945200f, - 0.218700f, - 0.413800f, - -0.090618f, - -0.185069f, - 0.455563f, - 0.000000f, - -0.181300f, - -0.369000f, - 0.911600f, - 0.218700f, - 0.379300f, - -0.000000f, - 0.428429f, - 0.257776f, - 0.000000f, - 0.000000f, - 0.855300f, - 0.518000f, - 0.250000f, - 0.827600f, - -0.000000f, - 0.453788f, - 0.209944f, - 0.000000f, - 0.000000f, - 0.906300f, - 0.422700f, - 0.250000f, - 0.862100f, - -0.040959f, - 0.453788f, - 0.205910f, - 0.000000f, - -0.082400f, - 0.906300f, - 0.414500f, - 0.218700f, - 0.862100f, - -0.000000f, - 0.428429f, - 0.257776f, - 0.000000f, - 0.000000f, - 0.855300f, - 0.518000f, - 0.250000f, - 0.827600f, - -0.040959f, - 0.453788f, - 0.205910f, - 0.000000f, - -0.082400f, - 0.906300f, - 0.414500f, - 0.218700f, - 0.862100f, - -0.050290f, - 0.428429f, - 0.252823f, - 0.000000f, - -0.101000f, - 0.855300f, - 0.508100f, - 0.218700f, - 0.827600f, - -0.000000f, - -0.234204f, - 0.441756f, - 0.000000f, - 0.000000f, - -0.467000f, - 0.884200f, - 0.250000f, - 0.344800f, - -0.000000f, - -0.185069f, - 0.464487f, - 0.000000f, - 0.000000f, - -0.369000f, - 0.929400f, - 0.250000f, - 0.379300f, - -0.090618f, - -0.185069f, - 0.455563f, - 0.000000f, - -0.181300f, - -0.369000f, - 0.911600f, - 0.218700f, - 0.379300f, - -0.000000f, - -0.234204f, - 0.441756f, - 0.000000f, - 0.000000f, - -0.467000f, - 0.884200f, - 0.250000f, - 0.344800f, - -0.090618f, - -0.185069f, - 0.455563f, - 0.000000f, - -0.181300f, - -0.369000f, - 0.911600f, - 0.218700f, - 0.379300f, - -0.086182f, - -0.234204f, - 0.433267f, - 0.000000f, - -0.172500f, - -0.467000f, - 0.867200f, - 0.218700f, - 0.344800f, - -0.000000f, - 0.398046f, - 0.302586f, - 0.000000f, - 0.000000f, - 0.794500f, - 0.607300f, - 0.250000f, - 0.793100f, - -0.000000f, - 0.428429f, - 0.257776f, - 0.000000f, - 0.000000f, - 0.855300f, - 0.518000f, - 0.250000f, - 0.827600f, - -0.050290f, - 0.428429f, - 0.252823f, - 0.000000f, - -0.101000f, - 0.855300f, - 0.508100f, - 0.218700f, - 0.827600f, - -0.000000f, - 0.398046f, - 0.302586f, - 0.000000f, - 0.000000f, - 0.794500f, - 0.607300f, - 0.250000f, - 0.793100f, - -0.050290f, - 0.428429f, - 0.252823f, - 0.000000f, - -0.101000f, - 0.855300f, - 0.508100f, - 0.218700f, - 0.827600f, - -0.059032f, - 0.398046f, - 0.296773f, - 0.000000f, - -0.118500f, - 0.794500f, - 0.595600f, - 0.218700f, - 0.793100f, - -0.000000f, - -0.280594f, - 0.413844f, - 0.000000f, - 0.000000f, - -0.559600f, - 0.828700f, - 0.250000f, - 0.310300f, - -0.000000f, - -0.234204f, - 0.441756f, - 0.000000f, - 0.000000f, - -0.467000f, - 0.884200f, - 0.250000f, - 0.344800f, - -0.086182f, - -0.234204f, - 0.433267f, - 0.000000f, - -0.172500f, - -0.467000f, - 0.867200f, - 0.218700f, - 0.344800f, - -0.000000f, - -0.280594f, - 0.413844f, - 0.000000f, - 0.000000f, - -0.559600f, - 0.828700f, - 0.250000f, - 0.310300f, - -0.086182f, - -0.234204f, - 0.433267f, - 0.000000f, - -0.172500f, - -0.467000f, - 0.867200f, - 0.218700f, - 0.344800f, - -0.080738f, - -0.280594f, - 0.405892f, - 0.000000f, - -0.161700f, - -0.559600f, - 0.812800f, - 0.218700f, - 0.310300f, - -0.000000f, - 0.362998f, - 0.343849f, - 0.000000f, - 0.000000f, - 0.724300f, - 0.689400f, - 0.250000f, - 0.758600f, - -0.000000f, - 0.398046f, - 0.302586f, - 0.000000f, - 0.000000f, - 0.794500f, - 0.607300f, - 0.250000f, - 0.793100f, - -0.059032f, - 0.398046f, - 0.296773f, - 0.000000f, - -0.118500f, - 0.794500f, - 0.595600f, - 0.218700f, - 0.793100f, - -0.000000f, - 0.362998f, - 0.343849f, - 0.000000f, - 0.000000f, - 0.724300f, - 0.689400f, - 0.250000f, - 0.758600f, - -0.059032f, - 0.398046f, - 0.296773f, - 0.000000f, - -0.118500f, - 0.794500f, - 0.595600f, - 0.218700f, - 0.793100f, - -0.067082f, - 0.362998f, - 0.337242f, - 0.000000f, - -0.134500f, - 0.724300f, - 0.676200f, - 0.218700f, - 0.758600f, - -0.000000f, - -0.323693f, - 0.381081f, - 0.000000f, - 0.000000f, - -0.645700f, - 0.763500f, - 0.250000f, - 0.275900f, - -0.000000f, - -0.280594f, - 0.413844f, - 0.000000f, - 0.000000f, - -0.559600f, - 0.828700f, - 0.250000f, - 0.310300f, - -0.080738f, - -0.280594f, - 0.405892f, - 0.000000f, - -0.161700f, - -0.559600f, - 0.812800f, - 0.218700f, - 0.310300f, - -0.000000f, - -0.323693f, - 0.381081f, - 0.000000f, - 0.000000f, - -0.645700f, - 0.763500f, - 0.250000f, - 0.275900f, - -0.080738f, - -0.280594f, - 0.405892f, - 0.000000f, - -0.161700f, - -0.559600f, - 0.812800f, - 0.218700f, - 0.310300f, - -0.074345f, - -0.323693f, - 0.373758f, - 0.000000f, - -0.149000f, - -0.645700f, - 0.748900f, - 0.218700f, - 0.275900f, - -0.000000f, - 0.323693f, - 0.381081f, - 0.000000f, - 0.000000f, - 0.645700f, - 0.763500f, - 0.250000f, - 0.724100f, - -0.000000f, - 0.362998f, - 0.343849f, - 0.000000f, - 0.000000f, - 0.724300f, - 0.689400f, - 0.250000f, - 0.758600f, - -0.067082f, - 0.362998f, - 0.337242f, - 0.000000f, - -0.134500f, - 0.724300f, - 0.676200f, - 0.218700f, - 0.758600f, - -0.000000f, - 0.323693f, - 0.381081f, - 0.000000f, - 0.000000f, - 0.645700f, - 0.763500f, - 0.250000f, - 0.724100f, - -0.067082f, - 0.362998f, - 0.337242f, - 0.000000f, - -0.134500f, - 0.724300f, - 0.676200f, - 0.218700f, - 0.758600f, - -0.074345f, - 0.323693f, - 0.373758f, - 0.000000f, - -0.149000f, - 0.645700f, - 0.748900f, - 0.218700f, - 0.724100f, - -0.000000f, - -0.362998f, - 0.343849f, - 0.000000f, - 0.000000f, - -0.724300f, - 0.689500f, - 0.250000f, - 0.241400f, - -0.000000f, - -0.323693f, - 0.381081f, - 0.000000f, - 0.000000f, - -0.645700f, - 0.763500f, - 0.250000f, - 0.275900f, - -0.074345f, - -0.323693f, - 0.373758f, - 0.000000f, - -0.149000f, - -0.645700f, - 0.748900f, - 0.218700f, - 0.275900f, - -0.000000f, - -0.362998f, - 0.343849f, - 0.000000f, - 0.000000f, - -0.724300f, - 0.689500f, - 0.250000f, - 0.241400f, - -0.074345f, - -0.323693f, - 0.373758f, - 0.000000f, - -0.149000f, - -0.645700f, - 0.748900f, - 0.218700f, - 0.275900f, - -0.067082f, - -0.362998f, - 0.337242f, - 0.000000f, - -0.134500f, - -0.724300f, - 0.676200f, - 0.218700f, - 0.241400f, - -0.000000f, - 0.280594f, - 0.413844f, - 0.000000f, - 0.000000f, - 0.559600f, - 0.828700f, - 0.250000f, - 0.689700f, - -0.000000f, - 0.323693f, - 0.381081f, - 0.000000f, - 0.000000f, - 0.645700f, - 0.763500f, - 0.250000f, - 0.724100f, - -0.074345f, - 0.323693f, - 0.373758f, - 0.000000f, - -0.149000f, - 0.645700f, - 0.748900f, - 0.218700f, - 0.724100f, - -0.000000f, - 0.280594f, - 0.413844f, - 0.000000f, - 0.000000f, - 0.559600f, - 0.828700f, - 0.250000f, - 0.689700f, - -0.074345f, - 0.323693f, - 0.373758f, - 0.000000f, - -0.149000f, - 0.645700f, - 0.748900f, - 0.218700f, - 0.724100f, - -0.080738f, - 0.280594f, - 0.405892f, - 0.000000f, - -0.161700f, - 0.559600f, - 0.812800f, - 0.218700f, - 0.689700f, - -0.000000f, - -0.398046f, - 0.302586f, - 0.000000f, - 0.000000f, - -0.794500f, - 0.607300f, - 0.250000f, - 0.206900f, - -0.000000f, - -0.362998f, - 0.343849f, - 0.000000f, - 0.000000f, - -0.724300f, - 0.689500f, - 0.250000f, - 0.241400f, - -0.067082f, - -0.362998f, - 0.337242f, - 0.000000f, - -0.134500f, - -0.724300f, - 0.676200f, - 0.218700f, - 0.241400f, - -0.000000f, - -0.398046f, - 0.302586f, - 0.000000f, - 0.000000f, - -0.794500f, - 0.607300f, - 0.250000f, - 0.206900f, - -0.067082f, - -0.362998f, - 0.337242f, - 0.000000f, - -0.134500f, - -0.724300f, - 0.676200f, - 0.218700f, - 0.241400f, - -0.059032f, - -0.398046f, - 0.296773f, - 0.000000f, - -0.118500f, - -0.794500f, - 0.595600f, - 0.218700f, - 0.206900f, - -0.000000f, - 0.234204f, - 0.441756f, - 0.000000f, - 0.000000f, - 0.467000f, - 0.884200f, - 0.250000f, - 0.655200f, - -0.000000f, - 0.280594f, - 0.413844f, - 0.000000f, - 0.000000f, - 0.559600f, - 0.828700f, - 0.250000f, - 0.689700f, - -0.080738f, - 0.280594f, - 0.405892f, - 0.000000f, - -0.161700f, - 0.559600f, - 0.812800f, - 0.218700f, - 0.689700f, - -0.000000f, - 0.234204f, - 0.441756f, - 0.000000f, - 0.000000f, - 0.467000f, - 0.884200f, - 0.250000f, - 0.655200f, - -0.080738f, - 0.280594f, - 0.405892f, - 0.000000f, - -0.161700f, - 0.559600f, - 0.812800f, - 0.218700f, - 0.689700f, - -0.086182f, - 0.234204f, - 0.433267f, - 0.000000f, - -0.172500f, - 0.467000f, - 0.867200f, - 0.218700f, - 0.655200f, - -0.050290f, - 0.428429f, - 0.252823f, - 0.000000f, - -0.101000f, - 0.855300f, - 0.508100f, - 0.218700f, - 0.827600f, - -0.040959f, - 0.453788f, - 0.205910f, - 0.000000f, - -0.082400f, - 0.906300f, - 0.414500f, - 0.218700f, - 0.862100f, - -0.080343f, - 0.453788f, - 0.193963f, - 0.000000f, - -0.161700f, - 0.906300f, - 0.390500f, - 0.187500f, - 0.862100f, - -0.050290f, - 0.428429f, - 0.252823f, - 0.000000f, - -0.101000f, - 0.855300f, - 0.508100f, - 0.218700f, - 0.827600f, - -0.080343f, - 0.453788f, - 0.193963f, - 0.000000f, - -0.161700f, - 0.906300f, - 0.390500f, - 0.187500f, - 0.862100f, - -0.098647f, - 0.428429f, - 0.238154f, - 0.000000f, - -0.198200f, - 0.855300f, - 0.478600f, - 0.187500f, - 0.827600f, - -0.086182f, - -0.234204f, - 0.433267f, - 0.000000f, - -0.172500f, - -0.467000f, - 0.867200f, - 0.218700f, - 0.344800f, - -0.090618f, - -0.185069f, - 0.455563f, - 0.000000f, - -0.181300f, - -0.369000f, - 0.911600f, - 0.218700f, - 0.379300f, - -0.177752f, - -0.185069f, - 0.429130f, - 0.000000f, - -0.355700f, - -0.369000f, - 0.858700f, - 0.187500f, - 0.379300f, - -0.086182f, - -0.234204f, - 0.433267f, - 0.000000f, - -0.172500f, - -0.467000f, - 0.867200f, - 0.218700f, - 0.344800f, - -0.177752f, - -0.185069f, - 0.429130f, - 0.000000f, - -0.355700f, - -0.369000f, - 0.858700f, - 0.187500f, - 0.379300f, - -0.169053f, - -0.234204f, - 0.408128f, - 0.000000f, - -0.338400f, - -0.467000f, - 0.816900f, - 0.187500f, - 0.344800f, - -0.059032f, - 0.398046f, - 0.296773f, - 0.000000f, - -0.118500f, - 0.794500f, - 0.595600f, - 0.218700f, - 0.793100f, - -0.050290f, - 0.428429f, - 0.252823f, - 0.000000f, - -0.101000f, - 0.855300f, - 0.508100f, - 0.218700f, - 0.827600f, - -0.098647f, - 0.428429f, - 0.238154f, - 0.000000f, - -0.198200f, - 0.855300f, - 0.478600f, - 0.187500f, - 0.827600f, - -0.059032f, - 0.398046f, - 0.296773f, - 0.000000f, - -0.118500f, - 0.794500f, - 0.595600f, - 0.218700f, - 0.793100f, - -0.098647f, - 0.428429f, - 0.238154f, - 0.000000f, - -0.198200f, - 0.855300f, - 0.478600f, - 0.187500f, - 0.827600f, - -0.115796f, - 0.398046f, - 0.279554f, - 0.000000f, - -0.232400f, - 0.794500f, - 0.561100f, - 0.187500f, - 0.793100f, - -0.080738f, - -0.280594f, - 0.405892f, - 0.000000f, - -0.161700f, - -0.559600f, - 0.812800f, - 0.218700f, - 0.310300f, - -0.086182f, - -0.234204f, - 0.433267f, - 0.000000f, - -0.172500f, - -0.467000f, - 0.867200f, - 0.218700f, - 0.344800f, - -0.169053f, - -0.234204f, - 0.408128f, - 0.000000f, - -0.338400f, - -0.467000f, - 0.816900f, - 0.187500f, - 0.344800f, - -0.080738f, - -0.280594f, - 0.405892f, - 0.000000f, - -0.161700f, - -0.559600f, - 0.812800f, - 0.218700f, - 0.310300f, - -0.169053f, - -0.234204f, - 0.408128f, - 0.000000f, - -0.338400f, - -0.467000f, - 0.816900f, - 0.187500f, - 0.344800f, - -0.158371f, - -0.280594f, - 0.382342f, - 0.000000f, - -0.317100f, - -0.559600f, - 0.765600f, - 0.187500f, - 0.310300f, - -0.067082f, - 0.362998f, - 0.337242f, - 0.000000f, - -0.134500f, - 0.724300f, - 0.676200f, - 0.218700f, - 0.758600f, - -0.059032f, - 0.398046f, - 0.296773f, - 0.000000f, - -0.118500f, - 0.794500f, - 0.595600f, - 0.218700f, - 0.793100f, - -0.115796f, - 0.398046f, - 0.279554f, - 0.000000f, - -0.232400f, - 0.794500f, - 0.561100f, - 0.187500f, - 0.793100f, - -0.067082f, - 0.362998f, - 0.337242f, - 0.000000f, - -0.134500f, - 0.724300f, - 0.676200f, - 0.218700f, - 0.758600f, - -0.115796f, - 0.398046f, - 0.279554f, - 0.000000f, - -0.232400f, - 0.794500f, - 0.561100f, - 0.187500f, - 0.793100f, - -0.131586f, - 0.362998f, - 0.317675f, - 0.000000f, - -0.263800f, - 0.724300f, - 0.637000f, - 0.187500f, - 0.758600f, - -0.074345f, - -0.323693f, - 0.373758f, - 0.000000f, - -0.149000f, - -0.645700f, - 0.748900f, - 0.218700f, - 0.275900f, - -0.080738f, - -0.280594f, - 0.405892f, - 0.000000f, - -0.161700f, - -0.559600f, - 0.812800f, - 0.218700f, - 0.310300f, - -0.158371f, - -0.280594f, - 0.382342f, - 0.000000f, - -0.317100f, - -0.559600f, - 0.765600f, - 0.187500f, - 0.310300f, - -0.074345f, - -0.323693f, - 0.373758f, - 0.000000f, - -0.149000f, - -0.645700f, - 0.748900f, - 0.218700f, - 0.275900f, - -0.158371f, - -0.280594f, - 0.382342f, - 0.000000f, - -0.317100f, - -0.559600f, - 0.765600f, - 0.187500f, - 0.310300f, - -0.145834f, - -0.323693f, - 0.352073f, - 0.000000f, - -0.292200f, - -0.645700f, - 0.705400f, - 0.187500f, - 0.275900f, - -0.074345f, - 0.323693f, - 0.373758f, - 0.000000f, - -0.149000f, - 0.645700f, - 0.748900f, - 0.218700f, - 0.724100f, - -0.067082f, - 0.362998f, - 0.337242f, - 0.000000f, - -0.134500f, - 0.724300f, - 0.676200f, - 0.218700f, - 0.758600f, - -0.131586f, - 0.362998f, - 0.317675f, - 0.000000f, - -0.263800f, - 0.724300f, - 0.637000f, - 0.187500f, - 0.758600f, - -0.074345f, - 0.323693f, - 0.373758f, - 0.000000f, - -0.149000f, - 0.645700f, - 0.748900f, - 0.218700f, - 0.724100f, - -0.131586f, - 0.362998f, - 0.317675f, - 0.000000f, - -0.263800f, - 0.724300f, - 0.637000f, - 0.187500f, - 0.758600f, - -0.145834f, - 0.323693f, - 0.352073f, - 0.000000f, - -0.292200f, - 0.645700f, - 0.705400f, - 0.187500f, - 0.724100f, - -0.067082f, - -0.362998f, - 0.337242f, - 0.000000f, - -0.134500f, - -0.724300f, - 0.676200f, - 0.218700f, - 0.241400f, - -0.074345f, - -0.323693f, - 0.373758f, - 0.000000f, - -0.149000f, - -0.645700f, - 0.748900f, - 0.218700f, - 0.275900f, - -0.145834f, - -0.323693f, - 0.352073f, - 0.000000f, - -0.292200f, - -0.645700f, - 0.705400f, - 0.187500f, - 0.275900f, - -0.067082f, - -0.362998f, - 0.337242f, - 0.000000f, - -0.134500f, - -0.724300f, - 0.676200f, - 0.218700f, - 0.241400f, - -0.145834f, - -0.323693f, - 0.352073f, - 0.000000f, - -0.292200f, - -0.645700f, - 0.705400f, - 0.187500f, - 0.275900f, - -0.131586f, - -0.362998f, - 0.317675f, - 0.000000f, - -0.263800f, - -0.724300f, - 0.637000f, - 0.187500f, - 0.241400f, - -0.080738f, - 0.280594f, - 0.405892f, - 0.000000f, - -0.161700f, - 0.559600f, - 0.812800f, - 0.218700f, - 0.689700f, - -0.074345f, - 0.323693f, - 0.373758f, - 0.000000f, - -0.149000f, - 0.645700f, - 0.748900f, - 0.218700f, - 0.724100f, - -0.145834f, - 0.323693f, - 0.352073f, - 0.000000f, - -0.292200f, - 0.645700f, - 0.705400f, - 0.187500f, - 0.724100f, - -0.080738f, - 0.280594f, - 0.405892f, - 0.000000f, - -0.161700f, - 0.559600f, - 0.812800f, - 0.218700f, - 0.689700f, - -0.145834f, - 0.323693f, - 0.352073f, - 0.000000f, - -0.292200f, - 0.645700f, - 0.705400f, - 0.187500f, - 0.724100f, - -0.158371f, - 0.280594f, - 0.382342f, - 0.000000f, - -0.317100f, - 0.559600f, - 0.765600f, - 0.187500f, - 0.689700f, - -0.059032f, - -0.398046f, - 0.296773f, - 0.000000f, - -0.118500f, - -0.794500f, - 0.595600f, - 0.218700f, - 0.206900f, - -0.067082f, - -0.362998f, - 0.337242f, - 0.000000f, - -0.134500f, - -0.724300f, - 0.676200f, - 0.218700f, - 0.241400f, - -0.131586f, - -0.362998f, - 0.317675f, - 0.000000f, - -0.263800f, - -0.724300f, - 0.637000f, - 0.187500f, - 0.241400f, - -0.059032f, - -0.398046f, - 0.296773f, - 0.000000f, - -0.118500f, - -0.794500f, - 0.595600f, - 0.218700f, - 0.206900f, - -0.131586f, - -0.362998f, - 0.317675f, - 0.000000f, - -0.263800f, - -0.724300f, - 0.637000f, - 0.187500f, - 0.241400f, - -0.115796f, - -0.398046f, - 0.279554f, - 0.000000f, - -0.232400f, - -0.794500f, - 0.561100f, - 0.187500f, - 0.206900f, - -0.086182f, - 0.234204f, - 0.433267f, - 0.000000f, - -0.172500f, - 0.467000f, - 0.867200f, - 0.218700f, - 0.655200f, - -0.080738f, - 0.280594f, - 0.405892f, - 0.000000f, - -0.161700f, - 0.559600f, - 0.812800f, - 0.218700f, - 0.689700f, - -0.158371f, - 0.280594f, - 0.382342f, - 0.000000f, - -0.317100f, - 0.559600f, - 0.765600f, - 0.187500f, - 0.689700f, - -0.086182f, - 0.234204f, - 0.433267f, - 0.000000f, - -0.172500f, - 0.467000f, - 0.867200f, - 0.218700f, - 0.655200f, - -0.158371f, - 0.280594f, - 0.382342f, - 0.000000f, - -0.317100f, - 0.559600f, - 0.765600f, - 0.187500f, - 0.689700f, - -0.169053f, - 0.234204f, - 0.408128f, - 0.000000f, - -0.338400f, - 0.467000f, - 0.816900f, - 0.187500f, - 0.655200f, - -0.050290f, - -0.428429f, - 0.252824f, - 0.000000f, - -0.101000f, - -0.855300f, - 0.508100f, - 0.218700f, - 0.172400f, - -0.059032f, - -0.398046f, - 0.296773f, - 0.000000f, - -0.118500f, - -0.794500f, - 0.595600f, - 0.218700f, - 0.206900f, - -0.115796f, - -0.398046f, - 0.279554f, - 0.000000f, - -0.232400f, - -0.794500f, - 0.561100f, - 0.187500f, - 0.206900f, - -0.050290f, - -0.428429f, - 0.252824f, - 0.000000f, - -0.101000f, - -0.855300f, - 0.508100f, - 0.218700f, - 0.172400f, - -0.115796f, - -0.398046f, - 0.279554f, - 0.000000f, - -0.232400f, - -0.794500f, - 0.561100f, - 0.187500f, - 0.206900f, - -0.098647f, - -0.428429f, - 0.238155f, - 0.000000f, - -0.198200f, - -0.855300f, - 0.478600f, - 0.187500f, - 0.172400f, - -0.090618f, - 0.185069f, - 0.455563f, - 0.000000f, - -0.181300f, - 0.369000f, - 0.911600f, - 0.218700f, - 0.620700f, - -0.086182f, - 0.234204f, - 0.433267f, - 0.000000f, - -0.172500f, - 0.467000f, - 0.867200f, - 0.218700f, - 0.655200f, - -0.169053f, - 0.234204f, - 0.408128f, - 0.000000f, - -0.338400f, - 0.467000f, - 0.816900f, - 0.187500f, - 0.655200f, - -0.090618f, - 0.185069f, - 0.455563f, - 0.000000f, - -0.181300f, - 0.369000f, - 0.911600f, - 0.218700f, - 0.620700f, - -0.169053f, - 0.234204f, - 0.408128f, - 0.000000f, - -0.338400f, - 0.467000f, - 0.816900f, - 0.187500f, - 0.655200f, - -0.177752f, - 0.185069f, - 0.429130f, - 0.000000f, - -0.355700f, - 0.369000f, - 0.858700f, - 0.187500f, - 0.620700f, - -0.040959f, - -0.453788f, - 0.205910f, - 0.000000f, - -0.082400f, - -0.906300f, - 0.414500f, - 0.218700f, - 0.137900f, - -0.050290f, - -0.428429f, - 0.252824f, - 0.000000f, - -0.101000f, - -0.855300f, - 0.508100f, - 0.218700f, - 0.172400f, - -0.098647f, - -0.428429f, - 0.238155f, - 0.000000f, - -0.198200f, - -0.855300f, - 0.478600f, - 0.187500f, - 0.172400f, - -0.040959f, - -0.453788f, - 0.205910f, - 0.000000f, - -0.082400f, - -0.906300f, - 0.414500f, - 0.218700f, - 0.137900f, - -0.098647f, - -0.428429f, - 0.238155f, - 0.000000f, - -0.198200f, - -0.855300f, - 0.478600f, - 0.187500f, - 0.172400f, - -0.080343f, - -0.453788f, - 0.193963f, - 0.000000f, - -0.161700f, - -0.906300f, - 0.390500f, - 0.187500f, - 0.137900f, - -0.093990f, - 0.133764f, - 0.472517f, - 0.000000f, - -0.188000f, - 0.266600f, - 0.945200f, - 0.218700f, - 0.586200f, - -0.090618f, - 0.185069f, - 0.455563f, - 0.000000f, - -0.181300f, - 0.369000f, - 0.911600f, - 0.218700f, - 0.620700f, - -0.177752f, - 0.185069f, - 0.429130f, - 0.000000f, - -0.355700f, - 0.369000f, - 0.858700f, - 0.187500f, - 0.620700f, - -0.093990f, - 0.133764f, - 0.472517f, - 0.000000f, - -0.188000f, - 0.266600f, - 0.945200f, - 0.218700f, - 0.586200f, - -0.177752f, - 0.185069f, - 0.429130f, - 0.000000f, - -0.355700f, - 0.369000f, - 0.858700f, - 0.187500f, - 0.620700f, - -0.184367f, - 0.133764f, - 0.445101f, - 0.000000f, - -0.368800f, - 0.266600f, - 0.890400f, - 0.187500f, - 0.586200f, - -0.031147f, - -0.473826f, - 0.156583f, - 0.000000f, - -0.062900f, - -0.946600f, - 0.316100f, - 0.218700f, - 0.103400f, - -0.040959f, - -0.453788f, - 0.205910f, - 0.000000f, - -0.082400f, - -0.906300f, - 0.414500f, - 0.218700f, - 0.137900f, - -0.080343f, - -0.453788f, - 0.193963f, - 0.000000f, - -0.161700f, - -0.906300f, - 0.390500f, - 0.187500f, - 0.137900f, - -0.031147f, - -0.473826f, - 0.156583f, - 0.000000f, - -0.062900f, - -0.946600f, - 0.316100f, - 0.218700f, - 0.103400f, - -0.080343f, - -0.453788f, - 0.193963f, - 0.000000f, - -0.161700f, - -0.906300f, - 0.390500f, - 0.187500f, - 0.137900f, - -0.061096f, - -0.473826f, - 0.147498f, - 0.000000f, - -0.123300f, - -0.946600f, - 0.297800f, - 0.187500f, - 0.103400f, - -0.096261f, - 0.080891f, - 0.483932f, - 0.000000f, - -0.192500f, - 0.161200f, - 0.967900f, - 0.218700f, - 0.551700f, - -0.093990f, - 0.133764f, - 0.472517f, - 0.000000f, - -0.188000f, - 0.266600f, - 0.945200f, - 0.218700f, - 0.586200f, - -0.184367f, - 0.133764f, - 0.445101f, - 0.000000f, - -0.368800f, - 0.266600f, - 0.890400f, - 0.187500f, - 0.586200f, - -0.096261f, - 0.080891f, - 0.483932f, - 0.000000f, - -0.192500f, - 0.161200f, - 0.967900f, - 0.218700f, - 0.551700f, - -0.184367f, - 0.133764f, - 0.445101f, - 0.000000f, - -0.368800f, - 0.266600f, - 0.890400f, - 0.187500f, - 0.586200f, - -0.188821f, - 0.080891f, - 0.455853f, - 0.000000f, - -0.377700f, - 0.161200f, - 0.911800f, - 0.187500f, - 0.551700f, - -0.020970f, - -0.488310f, - 0.105420f, - 0.000000f, - -0.042500f, - -0.975900f, - 0.214000f, - 0.218700f, - 0.069000f, - -0.031147f, - -0.473826f, - 0.156583f, - 0.000000f, - -0.062900f, - -0.946600f, - 0.316100f, - 0.218700f, - 0.103400f, - -0.061096f, - -0.473826f, - 0.147498f, - 0.000000f, - -0.123300f, - -0.946600f, - 0.297800f, - 0.187500f, - 0.103400f, - -0.020970f, - -0.488310f, - 0.105420f, - 0.000000f, - -0.042500f, - -0.975900f, - 0.214000f, - 0.218700f, - 0.069000f, - -0.061096f, - -0.473826f, - 0.147498f, - 0.000000f, - -0.123300f, - -0.946600f, - 0.297800f, - 0.187500f, - 0.103400f, - -0.041133f, - -0.488310f, - 0.099303f, - 0.000000f, - -0.083500f, - -0.975900f, - 0.201600f, - 0.187500f, - 0.069000f, - -0.097402f, - 0.027069f, - 0.489673f, - 0.000000f, - -0.194800f, - 0.054000f, - 0.979300f, - 0.218700f, - 0.517200f, - -0.096261f, - 0.080891f, - 0.483932f, - 0.000000f, - -0.192500f, - 0.161200f, - 0.967900f, - 0.218700f, - 0.551700f, - -0.188821f, - 0.080891f, - 0.455853f, - 0.000000f, - -0.377700f, - 0.161200f, - 0.911800f, - 0.187500f, - 0.551700f, - -0.097402f, - 0.027069f, - 0.489673f, - 0.000000f, - -0.194800f, - 0.054000f, - 0.979300f, - 0.218700f, - 0.517200f, - -0.188821f, - 0.080891f, - 0.455853f, - 0.000000f, - -0.377700f, - 0.161200f, - 0.911800f, - 0.187500f, - 0.551700f, - -0.191061f, - 0.027069f, - 0.461262f, - 0.000000f, - -0.382100f, - 0.054000f, - 0.922500f, - 0.187500f, - 0.517200f, - -0.010547f, - 0.497069f, - 0.053020f, - 0.000000f, - -0.021700f, - 0.993700f, - 0.109300f, - 0.472600f, - 0.962300f, - -0.000000f, - 0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - 1.000000f, - 0.000000f, - 0.482000f, - 0.960300f, - -0.020688f, - 0.497069f, - 0.049944f, - 0.000000f, - -0.042600f, - 0.993700f, - 0.103000f, - 0.474400f, - 0.962300f, - -0.010547f, - -0.497069f, - 0.053020f, - 0.000000f, - -0.021700f, - -0.993700f, - 0.109300f, - 0.218700f, - 0.034500f, - -0.020970f, - -0.488310f, - 0.105420f, - 0.000000f, - -0.042500f, - -0.975900f, - 0.214000f, - 0.218700f, - 0.069000f, - -0.041133f, - -0.488310f, - 0.099303f, - 0.000000f, - -0.083500f, - -0.975900f, - 0.201600f, - 0.187500f, - 0.069000f, - -0.010547f, - -0.497069f, - 0.053020f, - 0.000000f, - -0.021700f, - -0.993700f, - 0.109300f, - 0.218700f, - 0.034500f, - -0.041133f, - -0.488310f, - 0.099303f, - 0.000000f, - -0.083500f, - -0.975900f, - 0.201600f, - 0.187500f, - 0.069000f, - -0.020688f, - -0.497069f, - 0.049945f, - 0.000000f, - -0.042600f, - -0.993700f, - 0.103000f, - 0.187500f, - 0.034500f, - -0.097402f, - -0.027069f, - 0.489673f, - 0.000000f, - -0.194800f, - -0.054000f, - 0.979300f, - 0.218700f, - 0.482800f, - -0.097402f, - 0.027069f, - 0.489673f, - 0.000000f, - -0.194800f, - 0.054000f, - 0.979300f, - 0.218700f, - 0.517200f, - -0.191061f, - 0.027069f, - 0.461262f, - 0.000000f, - -0.382100f, - 0.054000f, - 0.922500f, - 0.187500f, - 0.517200f, - -0.097402f, - -0.027069f, - 0.489673f, - 0.000000f, - -0.194800f, - -0.054000f, - 0.979300f, - 0.218700f, - 0.482800f, - -0.191061f, - 0.027069f, - 0.461262f, - 0.000000f, - -0.382100f, - 0.054000f, - 0.922500f, - 0.187500f, - 0.517200f, - -0.191061f, - -0.027069f, - 0.461262f, - 0.000000f, - -0.382100f, - -0.054000f, - 0.922500f, - 0.187500f, - 0.482800f, - -0.020970f, - 0.488310f, - 0.105420f, - 0.000000f, - -0.042500f, - 0.975900f, - 0.214000f, - 0.218700f, - 0.931000f, - -0.010547f, - 0.497069f, - 0.053020f, - 0.000000f, - -0.021700f, - 0.993700f, - 0.109300f, - 0.218700f, - 0.965500f, - -0.020688f, - 0.497069f, - 0.049944f, - 0.000000f, - -0.042600f, - 0.993700f, - 0.103000f, - 0.187500f, - 0.965500f, - -0.020970f, - 0.488310f, - 0.105420f, - 0.000000f, - -0.042500f, - 0.975900f, - 0.214000f, - 0.218700f, - 0.931000f, - -0.020688f, - 0.497069f, - 0.049944f, - 0.000000f, - -0.042600f, - 0.993700f, - 0.103000f, - 0.187500f, - 0.965500f, - -0.041133f, - 0.488310f, - 0.099303f, - 0.000000f, - -0.083500f, - 0.975900f, - 0.201600f, - 0.187500f, - 0.931000f, - -0.000000f, - -0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - -1.000000f, - 0.000000f, - 0.411700f, - 0.051000f, - -0.010547f, - -0.497069f, - 0.053020f, - 0.000000f, - -0.021700f, - -0.993700f, - 0.109300f, - 0.428700f, - 0.053800f, - -0.020688f, - -0.497069f, - 0.049945f, - 0.000000f, - -0.042600f, - -0.993700f, - 0.103000f, - 0.426100f, - 0.053800f, - -0.096261f, - -0.080891f, - 0.483932f, - 0.000000f, - -0.192500f, - -0.161200f, - 0.967900f, - 0.218700f, - 0.448300f, - -0.097402f, - -0.027069f, - 0.489673f, - 0.000000f, - -0.194800f, - -0.054000f, - 0.979300f, - 0.218700f, - 0.482800f, - -0.191061f, - -0.027069f, - 0.461262f, - 0.000000f, - -0.382100f, - -0.054000f, - 0.922500f, - 0.187500f, - 0.482800f, - -0.096261f, - -0.080891f, - 0.483932f, - 0.000000f, - -0.192500f, - -0.161200f, - 0.967900f, - 0.218700f, - 0.448300f, - -0.191061f, - -0.027069f, - 0.461262f, - 0.000000f, - -0.382100f, - -0.054000f, - 0.922500f, - 0.187500f, - 0.482800f, - -0.188821f, - -0.080891f, - 0.455853f, - 0.000000f, - -0.377700f, - -0.161200f, - 0.911800f, - 0.187500f, - 0.448300f, - -0.031147f, - 0.473826f, - 0.156583f, - 0.000000f, - -0.062900f, - 0.946600f, - 0.316100f, - 0.218700f, - 0.896600f, - -0.020970f, - 0.488310f, - 0.105420f, - 0.000000f, - -0.042500f, - 0.975900f, - 0.214000f, - 0.218700f, - 0.931000f, - -0.041133f, - 0.488310f, - 0.099303f, - 0.000000f, - -0.083500f, - 0.975900f, - 0.201600f, - 0.187500f, - 0.931000f, - -0.031147f, - 0.473826f, - 0.156583f, - 0.000000f, - -0.062900f, - 0.946600f, - 0.316100f, - 0.218700f, - 0.896600f, - -0.041133f, - 0.488310f, - 0.099303f, - 0.000000f, - -0.083500f, - 0.975900f, - 0.201600f, - 0.187500f, - 0.931000f, - -0.061096f, - 0.473826f, - 0.147498f, - 0.000000f, - -0.123300f, - 0.946600f, - 0.297800f, - 0.187500f, - 0.896600f, - -0.093990f, - -0.133764f, - 0.472517f, - 0.000000f, - -0.188000f, - -0.266600f, - 0.945200f, - 0.218700f, - 0.413800f, - -0.096261f, - -0.080891f, - 0.483932f, - 0.000000f, - -0.192500f, - -0.161200f, - 0.967900f, - 0.218700f, - 0.448300f, - -0.188821f, - -0.080891f, - 0.455853f, - 0.000000f, - -0.377700f, - -0.161200f, - 0.911800f, - 0.187500f, - 0.448300f, - -0.093990f, - -0.133764f, - 0.472517f, - 0.000000f, - -0.188000f, - -0.266600f, - 0.945200f, - 0.218700f, - 0.413800f, - -0.188821f, - -0.080891f, - 0.455853f, - 0.000000f, - -0.377700f, - -0.161200f, - 0.911800f, - 0.187500f, - 0.448300f, - -0.184367f, - -0.133764f, - 0.445101f, - 0.000000f, - -0.368800f, - -0.266600f, - 0.890400f, - 0.187500f, - 0.413800f, - -0.040959f, - 0.453788f, - 0.205910f, - 0.000000f, - -0.082400f, - 0.906300f, - 0.414500f, - 0.218700f, - 0.862100f, - -0.031147f, - 0.473826f, - 0.156583f, - 0.000000f, - -0.062900f, - 0.946600f, - 0.316100f, - 0.218700f, - 0.896600f, - -0.061096f, - 0.473826f, - 0.147498f, - 0.000000f, - -0.123300f, - 0.946600f, - 0.297800f, - 0.187500f, - 0.896600f, - -0.040959f, - 0.453788f, - 0.205910f, - 0.000000f, - -0.082400f, - 0.906300f, - 0.414500f, - 0.218700f, - 0.862100f, - -0.061096f, - 0.473826f, - 0.147498f, - 0.000000f, - -0.123300f, - 0.946600f, - 0.297800f, - 0.187500f, - 0.896600f, - -0.080343f, - 0.453788f, - 0.193963f, - 0.000000f, - -0.161700f, - 0.906300f, - 0.390500f, - 0.187500f, - 0.862100f, - -0.090618f, - -0.185069f, - 0.455563f, - 0.000000f, - -0.181300f, - -0.369000f, - 0.911600f, - 0.218700f, - 0.379300f, - -0.093990f, - -0.133764f, - 0.472517f, - 0.000000f, - -0.188000f, - -0.266600f, - 0.945200f, - 0.218700f, - 0.413800f, - -0.184367f, - -0.133764f, - 0.445101f, - 0.000000f, - -0.368800f, - -0.266600f, - 0.890400f, - 0.187500f, - 0.413800f, - -0.090618f, - -0.185069f, - 0.455563f, - 0.000000f, - -0.181300f, - -0.369000f, - 0.911600f, - 0.218700f, - 0.379300f, - -0.184367f, - -0.133764f, - 0.445101f, - 0.000000f, - -0.368800f, - -0.266600f, - 0.890400f, - 0.187500f, - 0.413800f, - -0.177752f, - -0.185069f, - 0.429130f, - 0.000000f, - -0.355700f, - -0.369000f, - 0.858700f, - 0.187500f, - 0.379300f, - -0.188821f, - 0.080891f, - 0.455853f, - 0.000000f, - -0.377700f, - 0.161200f, - 0.911800f, - 0.187500f, - 0.551700f, - -0.184367f, - 0.133764f, - 0.445101f, - 0.000000f, - -0.368800f, - 0.266600f, - 0.890400f, - 0.187500f, - 0.586200f, - -0.267660f, - 0.133764f, - 0.400580f, - 0.000000f, - -0.535400f, - 0.266600f, - 0.801400f, - 0.156200f, - 0.586200f, - -0.188821f, - 0.080891f, - 0.455853f, - 0.000000f, - -0.377700f, - 0.161200f, - 0.911800f, - 0.187500f, - 0.551700f, - -0.267660f, - 0.133764f, - 0.400580f, - 0.000000f, - -0.535400f, - 0.266600f, - 0.801400f, - 0.156200f, - 0.586200f, - -0.274125f, - 0.080891f, - 0.410257f, - 0.000000f, - -0.548300f, - 0.161200f, - 0.820600f, - 0.156200f, - 0.551700f, - -0.041133f, - -0.488310f, - 0.099303f, - 0.000000f, - -0.083500f, - -0.975900f, - 0.201600f, - 0.187500f, - 0.069000f, - -0.061096f, - -0.473826f, - 0.147498f, - 0.000000f, - -0.123300f, - -0.946600f, - 0.297800f, - 0.187500f, - 0.103400f, - -0.088698f, - -0.473826f, - 0.132745f, - 0.000000f, - -0.179100f, - -0.946600f, - 0.268000f, - 0.156200f, - 0.103400f, - -0.041133f, - -0.488310f, - 0.099303f, - 0.000000f, - -0.083500f, - -0.975900f, - 0.201600f, - 0.187500f, - 0.069000f, - -0.088698f, - -0.473826f, - 0.132745f, - 0.000000f, - -0.179100f, - -0.946600f, - 0.268000f, - 0.156200f, - 0.103400f, - -0.059716f, - -0.488310f, - 0.089370f, - 0.000000f, - -0.121200f, - -0.975900f, - 0.181400f, - 0.156200f, - 0.069000f, - -0.191061f, - 0.027069f, - 0.461262f, - 0.000000f, - -0.382100f, - 0.054000f, - 0.922500f, - 0.187500f, - 0.517200f, - -0.188821f, - 0.080891f, - 0.455853f, - 0.000000f, - -0.377700f, - 0.161200f, - 0.911800f, - 0.187500f, - 0.551700f, - -0.274125f, - 0.080891f, - 0.410257f, - 0.000000f, - -0.548300f, - 0.161200f, - 0.820600f, - 0.156200f, - 0.551700f, - -0.191061f, - 0.027069f, - 0.461262f, - 0.000000f, - -0.382100f, - 0.054000f, - 0.922500f, - 0.187500f, - 0.517200f, - -0.274125f, - 0.080891f, - 0.410257f, - 0.000000f, - -0.548300f, - 0.161200f, - 0.820600f, - 0.156200f, - 0.551700f, - -0.277378f, - 0.027069f, - 0.415125f, - 0.000000f, - -0.554700f, - 0.054000f, - 0.830300f, - 0.156200f, - 0.517200f, - -0.020688f, - 0.497069f, - 0.049944f, - 0.000000f, - -0.042600f, - 0.993700f, - 0.103000f, - 0.474400f, - 0.962300f, - -0.000000f, - 0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - 1.000000f, - 0.000000f, - 0.482000f, - 0.960300f, - -0.030034f, - 0.497069f, - 0.044948f, - 0.000000f, - -0.061900f, - 0.993700f, - 0.092700f, - 0.476200f, - 0.962300f, - -0.020688f, - -0.497069f, - 0.049945f, - 0.000000f, - -0.042600f, - -0.993700f, - 0.103000f, - 0.187500f, - 0.034500f, - -0.041133f, - -0.488310f, - 0.099303f, - 0.000000f, - -0.083500f, - -0.975900f, - 0.201600f, - 0.187500f, - 0.069000f, - -0.059716f, - -0.488310f, - 0.089370f, - 0.000000f, - -0.121200f, - -0.975900f, - 0.181400f, - 0.156200f, - 0.069000f, - -0.020688f, - -0.497069f, - 0.049945f, - 0.000000f, - -0.042600f, - -0.993700f, - 0.103000f, - 0.187500f, - 0.034500f, - -0.059716f, - -0.488310f, - 0.089370f, - 0.000000f, - -0.121200f, - -0.975900f, - 0.181400f, - 0.156200f, - 0.069000f, - -0.030034f, - -0.497069f, - 0.044949f, - 0.000000f, - -0.061900f, - -0.993700f, - 0.092700f, - 0.156200f, - 0.034500f, - -0.191061f, - -0.027069f, - 0.461262f, - 0.000000f, - -0.382100f, - -0.054000f, - 0.922500f, - 0.187500f, - 0.482800f, - -0.191061f, - 0.027069f, - 0.461262f, - 0.000000f, - -0.382100f, - 0.054000f, - 0.922500f, - 0.187500f, - 0.517200f, - -0.277378f, - 0.027069f, - 0.415125f, - 0.000000f, - -0.554700f, - 0.054000f, - 0.830300f, - 0.156200f, - 0.517200f, - -0.191061f, - -0.027069f, - 0.461262f, - 0.000000f, - -0.382100f, - -0.054000f, - 0.922500f, - 0.187500f, - 0.482800f, - -0.277378f, - 0.027069f, - 0.415125f, - 0.000000f, - -0.554700f, - 0.054000f, - 0.830300f, - 0.156200f, - 0.517200f, - -0.277378f, - -0.027069f, - 0.415125f, - 0.000000f, - -0.554700f, - -0.054000f, - 0.830300f, - 0.156200f, - 0.482800f, - -0.041133f, - 0.488310f, - 0.099303f, - 0.000000f, - -0.083500f, - 0.975900f, - 0.201600f, - 0.187500f, - 0.931000f, - -0.020688f, - 0.497069f, - 0.049944f, - 0.000000f, - -0.042600f, - 0.993700f, - 0.103000f, - 0.187500f, - 0.965500f, - -0.030034f, - 0.497069f, - 0.044948f, - 0.000000f, - -0.061900f, - 0.993700f, - 0.092700f, - 0.156200f, - 0.965500f, - -0.041133f, - 0.488310f, - 0.099303f, - 0.000000f, - -0.083500f, - 0.975900f, - 0.201600f, - 0.187500f, - 0.931000f, - -0.030034f, - 0.497069f, - 0.044948f, - 0.000000f, - -0.061900f, - 0.993700f, - 0.092700f, - 0.156200f, - 0.965500f, - -0.059716f, - 0.488310f, - 0.089370f, - 0.000000f, - -0.121200f, - 0.975900f, - 0.181400f, - 0.156200f, - 0.931000f, - -0.000000f, - -0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - -1.000000f, - 0.000000f, - 0.411700f, - 0.051000f, - -0.020688f, - -0.497069f, - 0.049945f, - 0.000000f, - -0.042600f, - -0.993700f, - 0.103000f, - 0.426100f, - 0.053800f, - -0.030034f, - -0.497069f, - 0.044949f, - 0.000000f, - -0.061900f, - -0.993700f, - 0.092700f, - 0.423500f, - 0.053800f, - -0.188821f, - -0.080891f, - 0.455853f, - 0.000000f, - -0.377700f, - -0.161200f, - 0.911800f, - 0.187500f, - 0.448300f, - -0.191061f, - -0.027069f, - 0.461262f, - 0.000000f, - -0.382100f, - -0.054000f, - 0.922500f, - 0.187500f, - 0.482800f, - -0.277378f, - -0.027069f, - 0.415125f, - 0.000000f, - -0.554700f, - -0.054000f, - 0.830300f, - 0.156200f, - 0.482800f, - -0.188821f, - -0.080891f, - 0.455853f, - 0.000000f, - -0.377700f, - -0.161200f, - 0.911800f, - 0.187500f, - 0.448300f, - -0.277378f, - -0.027069f, - 0.415125f, - 0.000000f, - -0.554700f, - -0.054000f, - 0.830300f, - 0.156200f, - 0.482800f, - -0.274125f, - -0.080891f, - 0.410257f, - 0.000000f, - -0.548300f, - -0.161200f, - 0.820600f, - 0.156200f, - 0.448300f, - -0.061096f, - 0.473826f, - 0.147498f, - 0.000000f, - -0.123300f, - 0.946600f, - 0.297800f, - 0.187500f, - 0.896600f, - -0.041133f, - 0.488310f, - 0.099303f, - 0.000000f, - -0.083500f, - 0.975900f, - 0.201600f, - 0.187500f, - 0.931000f, - -0.059716f, - 0.488310f, - 0.089370f, - 0.000000f, - -0.121200f, - 0.975900f, - 0.181400f, - 0.156200f, - 0.931000f, - -0.061096f, - 0.473826f, - 0.147498f, - 0.000000f, - -0.123300f, - 0.946600f, - 0.297800f, - 0.187500f, - 0.896600f, - -0.059716f, - 0.488310f, - 0.089370f, - 0.000000f, - -0.121200f, - 0.975900f, - 0.181400f, - 0.156200f, - 0.931000f, - -0.088698f, - 0.473826f, - 0.132745f, - 0.000000f, - -0.179100f, - 0.946600f, - 0.268000f, - 0.156200f, - 0.896600f, - -0.184367f, - -0.133764f, - 0.445101f, - 0.000000f, - -0.368800f, - -0.266600f, - 0.890400f, - 0.187500f, - 0.413800f, - -0.188821f, - -0.080891f, - 0.455853f, - 0.000000f, - -0.377700f, - -0.161200f, - 0.911800f, - 0.187500f, - 0.448300f, - -0.274125f, - -0.080891f, - 0.410257f, - 0.000000f, - -0.548300f, - -0.161200f, - 0.820600f, - 0.156200f, - 0.448300f, - -0.184367f, - -0.133764f, - 0.445101f, - 0.000000f, - -0.368800f, - -0.266600f, - 0.890400f, - 0.187500f, - 0.413800f, - -0.274125f, - -0.080891f, - 0.410257f, - 0.000000f, - -0.548300f, - -0.161200f, - 0.820600f, - 0.156200f, - 0.448300f, - -0.267660f, - -0.133764f, - 0.400580f, - 0.000000f, - -0.535400f, - -0.266600f, - 0.801400f, - 0.156200f, - 0.413800f, - -0.080343f, - 0.453788f, - 0.193963f, - 0.000000f, - -0.161700f, - 0.906300f, - 0.390500f, - 0.187500f, - 0.862100f, - -0.061096f, - 0.473826f, - 0.147498f, - 0.000000f, - -0.123300f, - 0.946600f, - 0.297800f, - 0.187500f, - 0.896600f, - -0.088698f, - 0.473826f, - 0.132745f, - 0.000000f, - -0.179100f, - 0.946600f, - 0.268000f, - 0.156200f, - 0.896600f, - -0.080343f, - 0.453788f, - 0.193963f, - 0.000000f, - -0.161700f, - 0.906300f, - 0.390500f, - 0.187500f, - 0.862100f, - -0.088698f, - 0.473826f, - 0.132745f, - 0.000000f, - -0.179100f, - 0.946600f, - 0.268000f, - 0.156200f, - 0.896600f, - -0.116639f, - 0.453788f, - 0.174562f, - 0.000000f, - -0.234800f, - 0.906300f, - 0.351400f, - 0.156200f, - 0.862100f, - -0.177752f, - -0.185069f, - 0.429130f, - 0.000000f, - -0.355700f, - -0.369000f, - 0.858700f, - 0.187500f, - 0.379300f, - -0.184367f, - -0.133764f, - 0.445101f, - 0.000000f, - -0.368800f, - -0.266600f, - 0.890400f, - 0.187500f, - 0.413800f, - -0.267660f, - -0.133764f, - 0.400580f, - 0.000000f, - -0.535400f, - -0.266600f, - 0.801400f, - 0.156200f, - 0.413800f, - -0.177752f, - -0.185069f, - 0.429130f, - 0.000000f, - -0.355700f, - -0.369000f, - 0.858700f, - 0.187500f, - 0.379300f, - -0.267660f, - -0.133764f, - 0.400580f, - 0.000000f, - -0.535400f, - -0.266600f, - 0.801400f, - 0.156200f, - 0.413800f, - -0.258056f, - -0.185069f, - 0.386207f, - 0.000000f, - -0.516300f, - -0.369000f, - 0.772800f, - 0.156200f, - 0.379300f, - -0.098647f, - 0.428429f, - 0.238154f, - 0.000000f, - -0.198200f, - 0.855300f, - 0.478600f, - 0.187500f, - 0.827600f, - -0.080343f, - 0.453788f, - 0.193963f, - 0.000000f, - -0.161700f, - 0.906300f, - 0.390500f, - 0.187500f, - 0.862100f, - -0.116639f, - 0.453788f, - 0.174562f, - 0.000000f, - -0.234800f, - 0.906300f, - 0.351400f, - 0.156200f, - 0.862100f, - -0.098647f, - 0.428429f, - 0.238154f, - 0.000000f, - -0.198200f, - 0.855300f, - 0.478600f, - 0.187500f, - 0.827600f, - -0.116639f, - 0.453788f, - 0.174562f, - 0.000000f, - -0.234800f, - 0.906300f, - 0.351400f, - 0.156200f, - 0.862100f, - -0.143213f, - 0.428429f, - 0.214333f, - 0.000000f, - -0.287800f, - 0.855300f, - 0.430700f, - 0.156200f, - 0.827600f, - -0.169053f, - -0.234204f, - 0.408128f, - 0.000000f, - -0.338400f, - -0.467000f, - 0.816900f, - 0.187500f, - 0.344800f, - -0.177752f, - -0.185069f, - 0.429130f, - 0.000000f, - -0.355700f, - -0.369000f, - 0.858700f, - 0.187500f, - 0.379300f, - -0.258056f, - -0.185069f, - 0.386207f, - 0.000000f, - -0.516300f, - -0.369000f, - 0.772800f, - 0.156200f, - 0.379300f, - -0.169053f, - -0.234204f, - 0.408128f, - 0.000000f, - -0.338400f, - -0.467000f, - 0.816900f, - 0.187500f, - 0.344800f, - -0.258056f, - -0.185069f, - 0.386207f, - 0.000000f, - -0.516300f, - -0.369000f, - 0.772800f, - 0.156200f, - 0.379300f, - -0.245427f, - -0.234204f, - 0.367306f, - 0.000000f, - -0.491300f, - -0.467000f, - 0.735200f, - 0.156200f, - 0.344800f, - -0.115796f, - 0.398046f, - 0.279554f, - 0.000000f, - -0.232400f, - 0.794500f, - 0.561100f, - 0.187500f, - 0.793100f, - -0.098647f, - 0.428429f, - 0.238154f, - 0.000000f, - -0.198200f, - 0.855300f, - 0.478600f, - 0.187500f, - 0.827600f, - -0.143213f, - 0.428429f, - 0.214333f, - 0.000000f, - -0.287800f, - 0.855300f, - 0.430700f, - 0.156200f, - 0.827600f, - -0.115796f, - 0.398046f, - 0.279554f, - 0.000000f, - -0.232400f, - 0.794500f, - 0.561100f, - 0.187500f, - 0.793100f, - -0.143213f, - 0.428429f, - 0.214333f, - 0.000000f, - -0.287800f, - 0.855300f, - 0.430700f, - 0.156200f, - 0.827600f, - -0.168108f, - 0.398046f, - 0.251592f, - 0.000000f, - -0.337400f, - 0.794500f, - 0.505000f, - 0.156200f, - 0.793100f, - -0.158371f, - -0.280594f, - 0.382342f, - 0.000000f, - -0.317100f, - -0.559600f, - 0.765600f, - 0.187500f, - 0.310300f, - -0.169053f, - -0.234204f, - 0.408128f, - 0.000000f, - -0.338400f, - -0.467000f, - 0.816900f, - 0.187500f, - 0.344800f, - -0.245427f, - -0.234204f, - 0.367306f, - 0.000000f, - -0.491300f, - -0.467000f, - 0.735200f, - 0.156200f, - 0.344800f, - -0.158371f, - -0.280594f, - 0.382342f, - 0.000000f, - -0.317100f, - -0.559600f, - 0.765600f, - 0.187500f, - 0.310300f, - -0.245427f, - -0.234204f, - 0.367306f, - 0.000000f, - -0.491300f, - -0.467000f, - 0.735200f, - 0.156200f, - 0.344800f, - -0.229920f, - -0.280594f, - 0.344099f, - 0.000000f, - -0.460400f, - -0.559600f, - 0.689100f, - 0.156200f, - 0.310300f, - -0.131586f, - 0.362998f, - 0.317675f, - 0.000000f, - -0.263800f, - 0.724300f, - 0.637000f, - 0.187500f, - 0.758600f, - -0.115796f, - 0.398046f, - 0.279554f, - 0.000000f, - -0.232400f, - 0.794500f, - 0.561100f, - 0.187500f, - 0.793100f, - -0.168108f, - 0.398046f, - 0.251592f, - 0.000000f, - -0.337400f, - 0.794500f, - 0.505000f, - 0.156200f, - 0.793100f, - -0.131586f, - 0.362998f, - 0.317675f, - 0.000000f, - -0.263800f, - 0.724300f, - 0.637000f, - 0.187500f, - 0.758600f, - -0.168108f, - 0.398046f, - 0.251592f, - 0.000000f, - -0.337400f, - 0.794500f, - 0.505000f, - 0.156200f, - 0.793100f, - -0.191033f, - 0.362998f, - 0.285900f, - 0.000000f, - -0.383000f, - 0.724300f, - 0.573300f, - 0.156200f, - 0.758600f, - -0.145834f, - -0.323693f, - 0.352073f, - 0.000000f, - -0.292200f, - -0.645700f, - 0.705400f, - 0.187500f, - 0.275900f, - -0.158371f, - -0.280594f, - 0.382342f, - 0.000000f, - -0.317100f, - -0.559600f, - 0.765600f, - 0.187500f, - 0.310300f, - -0.229920f, - -0.280594f, - 0.344099f, - 0.000000f, - -0.460400f, - -0.559600f, - 0.689100f, - 0.156200f, - 0.310300f, - -0.145834f, - -0.323693f, - 0.352073f, - 0.000000f, - -0.292200f, - -0.645700f, - 0.705400f, - 0.187500f, - 0.275900f, - -0.229920f, - -0.280594f, - 0.344099f, - 0.000000f, - -0.460400f, - -0.559600f, - 0.689100f, - 0.156200f, - 0.310300f, - -0.211718f, - -0.323693f, - 0.316857f, - 0.000000f, - -0.424200f, - -0.645700f, - 0.634900f, - 0.156200f, - 0.275900f, - -0.145834f, - 0.323693f, - 0.352073f, - 0.000000f, - -0.292200f, - 0.645700f, - 0.705400f, - 0.187500f, - 0.724100f, - -0.131586f, - 0.362998f, - 0.317675f, - 0.000000f, - -0.263800f, - 0.724300f, - 0.637000f, - 0.187500f, - 0.758600f, - -0.191033f, - 0.362998f, - 0.285900f, - 0.000000f, - -0.383000f, - 0.724300f, - 0.573300f, - 0.156200f, - 0.758600f, - -0.145834f, - 0.323693f, - 0.352073f, - 0.000000f, - -0.292200f, - 0.645700f, - 0.705400f, - 0.187500f, - 0.724100f, - -0.191033f, - 0.362998f, - 0.285900f, - 0.000000f, - -0.383000f, - 0.724300f, - 0.573300f, - 0.156200f, - 0.758600f, - -0.211718f, - 0.323693f, - 0.316857f, - 0.000000f, - -0.424200f, - 0.645700f, - 0.634900f, - 0.156200f, - 0.724100f, - -0.131586f, - -0.362998f, - 0.317675f, - 0.000000f, - -0.263800f, - -0.724300f, - 0.637000f, - 0.187500f, - 0.241400f, - -0.145834f, - -0.323693f, - 0.352073f, - 0.000000f, - -0.292200f, - -0.645700f, - 0.705400f, - 0.187500f, - 0.275900f, - -0.211718f, - -0.323693f, - 0.316857f, - 0.000000f, - -0.424200f, - -0.645700f, - 0.634900f, - 0.156200f, - 0.275900f, - -0.131586f, - -0.362998f, - 0.317675f, - 0.000000f, - -0.263800f, - -0.724300f, - 0.637000f, - 0.187500f, - 0.241400f, - -0.211718f, - -0.323693f, - 0.316857f, - 0.000000f, - -0.424200f, - -0.645700f, - 0.634900f, - 0.156200f, - 0.275900f, - -0.191033f, - -0.362998f, - 0.285900f, - 0.000000f, - -0.383000f, - -0.724300f, - 0.573300f, - 0.156200f, - 0.241400f, - -0.158371f, - 0.280594f, - 0.382342f, - 0.000000f, - -0.317100f, - 0.559600f, - 0.765600f, - 0.187500f, - 0.689700f, - -0.145834f, - 0.323693f, - 0.352073f, - 0.000000f, - -0.292200f, - 0.645700f, - 0.705400f, - 0.187500f, - 0.724100f, - -0.211718f, - 0.323693f, - 0.316857f, - 0.000000f, - -0.424200f, - 0.645700f, - 0.634900f, - 0.156200f, - 0.724100f, - -0.158371f, - 0.280594f, - 0.382342f, - 0.000000f, - -0.317100f, - 0.559600f, - 0.765600f, - 0.187500f, - 0.689700f, - -0.211718f, - 0.323693f, - 0.316857f, - 0.000000f, - -0.424200f, - 0.645700f, - 0.634900f, - 0.156200f, - 0.724100f, - -0.229920f, - 0.280594f, - 0.344099f, - 0.000000f, - -0.460400f, - 0.559600f, - 0.689100f, - 0.156200f, - 0.689700f, - -0.115796f, - -0.398046f, - 0.279554f, - 0.000000f, - -0.232400f, - -0.794500f, - 0.561100f, - 0.187500f, - 0.206900f, - -0.131586f, - -0.362998f, - 0.317675f, - 0.000000f, - -0.263800f, - -0.724300f, - 0.637000f, - 0.187500f, - 0.241400f, - -0.191033f, - -0.362998f, - 0.285900f, - 0.000000f, - -0.383000f, - -0.724300f, - 0.573300f, - 0.156200f, - 0.241400f, - -0.115796f, - -0.398046f, - 0.279554f, - 0.000000f, - -0.232400f, - -0.794500f, - 0.561100f, - 0.187500f, - 0.206900f, - -0.191033f, - -0.362998f, - 0.285900f, - 0.000000f, - -0.383000f, - -0.724300f, - 0.573300f, - 0.156200f, - 0.241400f, - -0.168108f, - -0.398046f, - 0.251592f, - 0.000000f, - -0.337400f, - -0.794500f, - 0.504900f, - 0.156200f, - 0.206900f, - -0.169053f, - 0.234204f, - 0.408128f, - 0.000000f, - -0.338400f, - 0.467000f, - 0.816900f, - 0.187500f, - 0.655200f, - -0.158371f, - 0.280594f, - 0.382342f, - 0.000000f, - -0.317100f, - 0.559600f, - 0.765600f, - 0.187500f, - 0.689700f, - -0.229920f, - 0.280594f, - 0.344099f, - 0.000000f, - -0.460400f, - 0.559600f, - 0.689100f, - 0.156200f, - 0.689700f, - -0.169053f, - 0.234204f, - 0.408128f, - 0.000000f, - -0.338400f, - 0.467000f, - 0.816900f, - 0.187500f, - 0.655200f, - -0.229920f, - 0.280594f, - 0.344099f, - 0.000000f, - -0.460400f, - 0.559600f, - 0.689100f, - 0.156200f, - 0.689700f, - -0.245427f, - 0.234204f, - 0.367306f, - 0.000000f, - -0.491300f, - 0.467000f, - 0.735200f, - 0.156200f, - 0.655200f, - -0.098647f, - -0.428429f, - 0.238155f, - 0.000000f, - -0.198200f, - -0.855300f, - 0.478600f, - 0.187500f, - 0.172400f, - -0.115796f, - -0.398046f, - 0.279554f, - 0.000000f, - -0.232400f, - -0.794500f, - 0.561100f, - 0.187500f, - 0.206900f, - -0.168108f, - -0.398046f, - 0.251592f, - 0.000000f, - -0.337400f, - -0.794500f, - 0.504900f, - 0.156200f, - 0.206900f, - -0.098647f, - -0.428429f, - 0.238155f, - 0.000000f, - -0.198200f, - -0.855300f, - 0.478600f, - 0.187500f, - 0.172400f, - -0.168108f, - -0.398046f, - 0.251592f, - 0.000000f, - -0.337400f, - -0.794500f, - 0.504900f, - 0.156200f, - 0.206900f, - -0.143213f, - -0.428429f, - 0.214334f, - 0.000000f, - -0.287800f, - -0.855300f, - 0.430700f, - 0.156200f, - 0.172400f, - -0.177752f, - 0.185069f, - 0.429130f, - 0.000000f, - -0.355700f, - 0.369000f, - 0.858700f, - 0.187500f, - 0.620700f, - -0.169053f, - 0.234204f, - 0.408128f, - 0.000000f, - -0.338400f, - 0.467000f, - 0.816900f, - 0.187500f, - 0.655200f, - -0.245427f, - 0.234204f, - 0.367306f, - 0.000000f, - -0.491300f, - 0.467000f, - 0.735200f, - 0.156200f, - 0.655200f, - -0.177752f, - 0.185069f, - 0.429130f, - 0.000000f, - -0.355700f, - 0.369000f, - 0.858700f, - 0.187500f, - 0.620700f, - -0.245427f, - 0.234204f, - 0.367306f, - 0.000000f, - -0.491300f, - 0.467000f, - 0.735200f, - 0.156200f, - 0.655200f, - -0.258056f, - 0.185069f, - 0.386207f, - 0.000000f, - -0.516300f, - 0.369000f, - 0.772800f, - 0.156200f, - 0.620700f, - -0.080343f, - -0.453788f, - 0.193963f, - 0.000000f, - -0.161700f, - -0.906300f, - 0.390500f, - 0.187500f, - 0.137900f, - -0.098647f, - -0.428429f, - 0.238155f, - 0.000000f, - -0.198200f, - -0.855300f, - 0.478600f, - 0.187500f, - 0.172400f, - -0.143213f, - -0.428429f, - 0.214334f, - 0.000000f, - -0.287800f, - -0.855300f, - 0.430700f, - 0.156200f, - 0.172400f, - -0.080343f, - -0.453788f, - 0.193963f, - 0.000000f, - -0.161700f, - -0.906300f, - 0.390500f, - 0.187500f, - 0.137900f, - -0.143213f, - -0.428429f, - 0.214334f, - 0.000000f, - -0.287800f, - -0.855300f, - 0.430700f, - 0.156200f, - 0.172400f, - -0.116639f, - -0.453788f, - 0.174562f, - 0.000000f, - -0.234800f, - -0.906300f, - 0.351400f, - 0.156200f, - 0.137900f, - -0.184367f, - 0.133764f, - 0.445101f, - 0.000000f, - -0.368800f, - 0.266600f, - 0.890400f, - 0.187500f, - 0.586200f, - -0.177752f, - 0.185069f, - 0.429130f, - 0.000000f, - -0.355700f, - 0.369000f, - 0.858700f, - 0.187500f, - 0.620700f, - -0.258056f, - 0.185069f, - 0.386207f, - 0.000000f, - -0.516300f, - 0.369000f, - 0.772800f, - 0.156200f, - 0.620700f, - -0.184367f, - 0.133764f, - 0.445101f, - 0.000000f, - -0.368800f, - 0.266600f, - 0.890400f, - 0.187500f, - 0.586200f, - -0.258056f, - 0.185069f, - 0.386207f, - 0.000000f, - -0.516300f, - 0.369000f, - 0.772800f, - 0.156200f, - 0.620700f, - -0.267660f, - 0.133764f, - 0.400580f, - 0.000000f, - -0.535400f, - 0.266600f, - 0.801400f, - 0.156200f, - 0.586200f, - -0.061096f, - -0.473826f, - 0.147498f, - 0.000000f, - -0.123300f, - -0.946600f, - 0.297800f, - 0.187500f, - 0.103400f, - -0.080343f, - -0.453788f, - 0.193963f, - 0.000000f, - -0.161700f, - -0.906300f, - 0.390500f, - 0.187500f, - 0.137900f, - -0.116639f, - -0.453788f, - 0.174562f, - 0.000000f, - -0.234800f, - -0.906300f, - 0.351400f, - 0.156200f, - 0.137900f, - -0.061096f, - -0.473826f, - 0.147498f, - 0.000000f, - -0.123300f, - -0.946600f, - 0.297800f, - 0.187500f, - 0.103400f, - -0.116639f, - -0.453788f, - 0.174562f, - 0.000000f, - -0.234800f, - -0.906300f, - 0.351400f, - 0.156200f, - 0.137900f, - -0.088698f, - -0.473826f, - 0.132745f, - 0.000000f, - -0.179100f, - -0.946600f, - 0.268000f, - 0.156200f, - 0.103400f, - -0.211718f, - -0.323693f, - 0.316857f, - 0.000000f, - -0.424200f, - -0.645700f, - 0.634900f, - 0.156200f, - 0.275900f, - -0.229920f, - -0.280594f, - 0.344099f, - 0.000000f, - -0.460400f, - -0.559600f, - 0.689100f, - 0.156200f, - 0.310300f, - -0.292632f, - -0.280594f, - 0.292632f, - 0.000000f, - -0.586000f, - -0.559600f, - 0.586000f, - 0.125000f, - 0.310300f, - -0.211718f, - -0.323693f, - 0.316857f, - 0.000000f, - -0.424200f, - -0.645700f, - 0.634900f, - 0.156200f, - 0.275900f, - -0.292632f, - -0.280594f, - 0.292632f, - 0.000000f, - -0.586000f, - -0.559600f, - 0.586000f, - 0.125000f, - 0.310300f, - -0.269465f, - -0.323693f, - 0.269464f, - 0.000000f, - -0.539900f, - -0.645700f, - 0.539900f, - 0.125000f, - 0.275900f, - -0.211718f, - 0.323693f, - 0.316857f, - 0.000000f, - -0.424200f, - 0.645700f, - 0.634900f, - 0.156200f, - 0.724100f, - -0.191033f, - 0.362998f, - 0.285900f, - 0.000000f, - -0.383000f, - 0.724300f, - 0.573300f, - 0.156200f, - 0.758600f, - -0.243139f, - 0.362998f, - 0.243138f, - 0.000000f, - -0.487500f, - 0.724300f, - 0.487500f, - 0.125000f, - 0.758600f, - -0.211718f, - 0.323693f, - 0.316857f, - 0.000000f, - -0.424200f, - 0.645700f, - 0.634900f, - 0.156200f, - 0.724100f, - -0.243139f, - 0.362998f, - 0.243138f, - 0.000000f, - -0.487500f, - 0.724300f, - 0.487500f, - 0.125000f, - 0.758600f, - -0.269465f, - 0.323693f, - 0.269464f, - 0.000000f, - -0.539900f, - 0.645700f, - 0.539900f, - 0.125000f, - 0.724100f, - -0.191033f, - -0.362998f, - 0.285900f, - 0.000000f, - -0.383000f, - -0.724300f, - 0.573300f, - 0.156200f, - 0.241400f, - -0.211718f, - -0.323693f, - 0.316857f, - 0.000000f, - -0.424200f, - -0.645700f, - 0.634900f, - 0.156200f, - 0.275900f, - -0.269465f, - -0.323693f, - 0.269464f, - 0.000000f, - -0.539900f, - -0.645700f, - 0.539900f, - 0.125000f, - 0.275900f, - -0.191033f, - -0.362998f, - 0.285900f, - 0.000000f, - -0.383000f, - -0.724300f, - 0.573300f, - 0.156200f, - 0.241400f, - -0.269465f, - -0.323693f, - 0.269464f, - 0.000000f, - -0.539900f, - -0.645700f, - 0.539900f, - 0.125000f, - 0.275900f, - -0.243139f, - -0.362998f, - 0.243138f, - 0.000000f, - -0.487500f, - -0.724300f, - 0.487500f, - 0.125000f, - 0.241400f, - -0.229920f, - 0.280594f, - 0.344099f, - 0.000000f, - -0.460400f, - 0.559600f, - 0.689100f, - 0.156200f, - 0.689700f, - -0.211718f, - 0.323693f, - 0.316857f, - 0.000000f, - -0.424200f, - 0.645700f, - 0.634900f, - 0.156200f, - 0.724100f, - -0.269465f, - 0.323693f, - 0.269464f, - 0.000000f, - -0.539900f, - 0.645700f, - 0.539900f, - 0.125000f, - 0.724100f, - -0.229920f, - 0.280594f, - 0.344099f, - 0.000000f, - -0.460400f, - 0.559600f, - 0.689100f, - 0.156200f, - 0.689700f, - -0.269465f, - 0.323693f, - 0.269464f, - 0.000000f, - -0.539900f, - 0.645700f, - 0.539900f, - 0.125000f, - 0.724100f, - -0.292632f, - 0.280594f, - 0.292632f, - 0.000000f, - -0.586000f, - 0.559600f, - 0.586000f, - 0.125000f, - 0.689700f, - -0.168108f, - -0.398046f, - 0.251592f, - 0.000000f, - -0.337400f, - -0.794500f, - 0.504900f, - 0.156200f, - 0.206900f, - -0.191033f, - -0.362998f, - 0.285900f, - 0.000000f, - -0.383000f, - -0.724300f, - 0.573300f, - 0.156200f, - 0.241400f, - -0.243139f, - -0.362998f, - 0.243138f, - 0.000000f, - -0.487500f, - -0.724300f, - 0.487500f, - 0.125000f, - 0.241400f, - -0.168108f, - -0.398046f, - 0.251592f, - 0.000000f, - -0.337400f, - -0.794500f, - 0.504900f, - 0.156200f, - 0.206900f, - -0.243139f, - -0.362998f, - 0.243138f, - 0.000000f, - -0.487500f, - -0.724300f, - 0.487500f, - 0.125000f, - 0.241400f, - -0.213961f, - -0.398046f, - 0.213961f, - 0.000000f, - -0.429400f, - -0.794500f, - 0.429400f, - 0.125000f, - 0.206900f, - -0.245427f, - 0.234204f, - 0.367306f, - 0.000000f, - -0.491300f, - 0.467000f, - 0.735200f, - 0.156200f, - 0.655200f, - -0.229920f, - 0.280594f, - 0.344099f, - 0.000000f, - -0.460400f, - 0.559600f, - 0.689100f, - 0.156200f, - 0.689700f, - -0.292632f, - 0.280594f, - 0.292632f, - 0.000000f, - -0.586000f, - 0.559600f, - 0.586000f, - 0.125000f, - 0.689700f, - -0.245427f, - 0.234204f, - 0.367306f, - 0.000000f, - -0.491300f, - 0.467000f, - 0.735200f, - 0.156200f, - 0.655200f, - -0.292632f, - 0.280594f, - 0.292632f, - 0.000000f, - -0.586000f, - 0.559600f, - 0.586000f, - 0.125000f, - 0.689700f, - -0.312369f, - 0.234204f, - 0.312368f, - 0.000000f, - -0.625200f, - 0.467000f, - 0.625200f, - 0.125000f, - 0.655200f, - -0.143213f, - -0.428429f, - 0.214334f, - 0.000000f, - -0.287800f, - -0.855300f, - 0.430700f, - 0.156200f, - 0.172400f, - -0.168108f, - -0.398046f, - 0.251592f, - 0.000000f, - -0.337400f, - -0.794500f, - 0.504900f, - 0.156200f, - 0.206900f, - -0.213961f, - -0.398046f, - 0.213961f, - 0.000000f, - -0.429400f, - -0.794500f, - 0.429400f, - 0.125000f, - 0.206900f, - -0.143213f, - -0.428429f, - 0.214334f, - 0.000000f, - -0.287800f, - -0.855300f, - 0.430700f, - 0.156200f, - 0.172400f, - -0.213961f, - -0.398046f, - 0.213961f, - 0.000000f, - -0.429400f, - -0.794500f, - 0.429400f, - 0.125000f, - 0.206900f, - -0.182276f, - -0.428429f, - 0.182276f, - 0.000000f, - -0.366300f, - -0.855300f, - 0.366300f, - 0.125000f, - 0.172400f, - -0.258056f, - 0.185069f, - 0.386207f, - 0.000000f, - -0.516300f, - 0.369000f, - 0.772800f, - 0.156200f, - 0.620700f, - -0.245427f, - 0.234204f, - 0.367306f, - 0.000000f, - -0.491300f, - 0.467000f, - 0.735200f, - 0.156200f, - 0.655200f, - -0.312369f, - 0.234204f, - 0.312368f, - 0.000000f, - -0.625200f, - 0.467000f, - 0.625200f, - 0.125000f, - 0.655200f, - -0.258056f, - 0.185069f, - 0.386207f, - 0.000000f, - -0.516300f, - 0.369000f, - 0.772800f, - 0.156200f, - 0.620700f, - -0.312369f, - 0.234204f, - 0.312368f, - 0.000000f, - -0.625200f, - 0.467000f, - 0.625200f, - 0.125000f, - 0.655200f, - -0.328443f, - 0.185069f, - 0.328443f, - 0.000000f, - -0.657200f, - 0.369000f, - 0.657200f, - 0.125000f, - 0.620700f, - -0.116639f, - -0.453788f, - 0.174562f, - 0.000000f, - -0.234800f, - -0.906300f, - 0.351400f, - 0.156200f, - 0.137900f, - -0.143213f, - -0.428429f, - 0.214334f, - 0.000000f, - -0.287800f, - -0.855300f, - 0.430700f, - 0.156200f, - 0.172400f, - -0.182276f, - -0.428429f, - 0.182276f, - 0.000000f, - -0.366300f, - -0.855300f, - 0.366300f, - 0.125000f, - 0.172400f, - -0.116639f, - -0.453788f, - 0.174562f, - 0.000000f, - -0.234800f, - -0.906300f, - 0.351400f, - 0.156200f, - 0.137900f, - -0.182276f, - -0.428429f, - 0.182276f, - 0.000000f, - -0.366300f, - -0.855300f, - 0.366300f, - 0.125000f, - 0.172400f, - -0.148454f, - -0.453788f, - 0.148453f, - 0.000000f, - -0.298900f, - -0.906300f, - 0.298900f, - 0.125000f, - 0.137900f, - -0.267660f, - 0.133764f, - 0.400580f, - 0.000000f, - -0.535400f, - 0.266600f, - 0.801400f, - 0.156200f, - 0.586200f, - -0.258056f, - 0.185069f, - 0.386207f, - 0.000000f, - -0.516300f, - 0.369000f, - 0.772800f, - 0.156200f, - 0.620700f, - -0.328443f, - 0.185069f, - 0.328443f, - 0.000000f, - -0.657200f, - 0.369000f, - 0.657200f, - 0.125000f, - 0.620700f, - -0.267660f, - 0.133764f, - 0.400580f, - 0.000000f, - -0.535400f, - 0.266600f, - 0.801400f, - 0.156200f, - 0.586200f, - -0.328443f, - 0.185069f, - 0.328443f, - 0.000000f, - -0.657200f, - 0.369000f, - 0.657200f, - 0.125000f, - 0.620700f, - -0.340667f, - 0.133764f, - 0.340666f, - 0.000000f, - -0.681500f, - 0.266600f, - 0.681500f, - 0.125000f, - 0.586200f, - -0.088698f, - -0.473826f, - 0.132745f, - 0.000000f, - -0.179100f, - -0.946600f, - 0.268000f, - 0.156200f, - 0.103400f, - -0.116639f, - -0.453788f, - 0.174562f, - 0.000000f, - -0.234800f, - -0.906300f, - 0.351400f, - 0.156200f, - 0.137900f, - -0.148454f, - -0.453788f, - 0.148453f, - 0.000000f, - -0.298900f, - -0.906300f, - 0.298900f, - 0.125000f, - 0.137900f, - -0.088698f, - -0.473826f, - 0.132745f, - 0.000000f, - -0.179100f, - -0.946600f, - 0.268000f, - 0.156200f, - 0.103400f, - -0.148454f, - -0.453788f, - 0.148453f, - 0.000000f, - -0.298900f, - -0.906300f, - 0.298900f, - 0.125000f, - 0.137900f, - -0.112890f, - -0.473826f, - 0.112890f, - 0.000000f, - -0.227900f, - -0.946600f, - 0.227900f, - 0.125000f, - 0.103400f, - -0.274125f, - 0.080891f, - 0.410257f, - 0.000000f, - -0.548300f, - 0.161200f, - 0.820600f, - 0.156200f, - 0.551700f, - -0.267660f, - 0.133764f, - 0.400580f, - 0.000000f, - -0.535400f, - 0.266600f, - 0.801400f, - 0.156200f, - 0.586200f, - -0.340667f, - 0.133764f, - 0.340666f, - 0.000000f, - -0.681500f, - 0.266600f, - 0.681500f, - 0.125000f, - 0.586200f, - -0.274125f, - 0.080891f, - 0.410257f, - 0.000000f, - -0.548300f, - 0.161200f, - 0.820600f, - 0.156200f, - 0.551700f, - -0.340667f, - 0.133764f, - 0.340666f, - 0.000000f, - -0.681500f, - 0.266600f, - 0.681500f, - 0.125000f, - 0.586200f, - -0.348895f, - 0.080891f, - 0.348895f, - 0.000000f, - -0.697800f, - 0.161200f, - 0.697800f, - 0.125000f, - 0.551700f, - -0.059716f, - -0.488310f, - 0.089370f, - 0.000000f, - -0.121200f, - -0.975900f, - 0.181400f, - 0.156200f, - 0.069000f, - -0.088698f, - -0.473826f, - 0.132745f, - 0.000000f, - -0.179100f, - -0.946600f, - 0.268000f, - 0.156200f, - 0.103400f, - -0.112890f, - -0.473826f, - 0.112890f, - 0.000000f, - -0.227900f, - -0.946600f, - 0.227900f, - 0.125000f, - 0.103400f, - -0.059716f, - -0.488310f, - 0.089370f, - 0.000000f, - -0.121200f, - -0.975900f, - 0.181400f, - 0.156200f, - 0.069000f, - -0.112890f, - -0.473826f, - 0.112890f, - 0.000000f, - -0.227900f, - -0.946600f, - 0.227900f, - 0.125000f, - 0.103400f, - -0.076004f, - -0.488310f, - 0.076003f, - 0.000000f, - -0.154300f, - -0.975900f, - 0.154300f, - 0.125000f, - 0.069000f, - -0.277378f, - 0.027069f, - 0.415125f, - 0.000000f, - -0.554700f, - 0.054000f, - 0.830300f, - 0.156200f, - 0.517200f, - -0.274125f, - 0.080891f, - 0.410257f, - 0.000000f, - -0.548300f, - 0.161200f, - 0.820600f, - 0.156200f, - 0.551700f, - -0.348895f, - 0.080891f, - 0.348895f, - 0.000000f, - -0.697800f, - 0.161200f, - 0.697800f, - 0.125000f, - 0.551700f, - -0.277378f, - 0.027069f, - 0.415125f, - 0.000000f, - -0.554700f, - 0.054000f, - 0.830300f, - 0.156200f, - 0.517200f, - -0.348895f, - 0.080891f, - 0.348895f, - 0.000000f, - -0.697800f, - 0.161200f, - 0.697800f, - 0.125000f, - 0.551700f, - -0.353035f, - 0.027069f, - 0.353034f, - 0.000000f, - -0.706100f, - 0.054000f, - 0.706100f, - 0.125000f, - 0.517200f, - -0.030034f, - 0.497069f, - 0.044948f, - 0.000000f, - -0.061900f, - 0.993700f, - 0.092700f, - 0.476200f, - 0.962300f, - -0.000000f, - 0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - 1.000000f, - 0.000000f, - 0.482000f, - 0.960300f, - -0.038226f, - 0.497069f, - 0.038226f, - 0.000000f, - -0.078800f, - 0.993700f, - 0.078800f, - 0.478000f, - 0.962300f, - -0.030034f, - -0.497069f, - 0.044949f, - 0.000000f, - -0.061900f, - -0.993700f, - 0.092700f, - 0.156200f, - 0.034500f, - -0.059716f, - -0.488310f, - 0.089370f, - 0.000000f, - -0.121200f, - -0.975900f, - 0.181400f, - 0.156200f, - 0.069000f, - -0.076004f, - -0.488310f, - 0.076003f, - 0.000000f, - -0.154300f, - -0.975900f, - 0.154300f, - 0.125000f, - 0.069000f, - -0.030034f, - -0.497069f, - 0.044949f, - 0.000000f, - -0.061900f, - -0.993700f, - 0.092700f, - 0.156200f, - 0.034500f, - -0.076004f, - -0.488310f, - 0.076003f, - 0.000000f, - -0.154300f, - -0.975900f, - 0.154300f, - 0.125000f, - 0.069000f, - -0.038226f, - -0.497069f, - 0.038226f, - 0.000000f, - -0.078800f, - -0.993700f, - 0.078800f, - 0.125000f, - 0.034500f, - -0.277378f, - -0.027069f, - 0.415125f, - 0.000000f, - -0.554700f, - -0.054000f, - 0.830300f, - 0.156200f, - 0.482800f, - -0.277378f, - 0.027069f, - 0.415125f, - 0.000000f, - -0.554700f, - 0.054000f, - 0.830300f, - 0.156200f, - 0.517200f, - -0.353035f, - 0.027069f, - 0.353034f, - 0.000000f, - -0.706100f, - 0.054000f, - 0.706100f, - 0.125000f, - 0.517200f, - -0.277378f, - -0.027069f, - 0.415125f, - 0.000000f, - -0.554700f, - -0.054000f, - 0.830300f, - 0.156200f, - 0.482800f, - -0.353035f, - 0.027069f, - 0.353034f, - 0.000000f, - -0.706100f, - 0.054000f, - 0.706100f, - 0.125000f, - 0.517200f, - -0.353035f, - -0.027069f, - 0.353034f, - 0.000000f, - -0.706100f, - -0.054000f, - 0.706100f, - 0.125000f, - 0.482800f, - -0.059716f, - 0.488310f, - 0.089370f, - 0.000000f, - -0.121200f, - 0.975900f, - 0.181400f, - 0.156200f, - 0.931000f, - -0.030034f, - 0.497069f, - 0.044948f, - 0.000000f, - -0.061900f, - 0.993700f, - 0.092700f, - 0.156200f, - 0.965500f, - -0.038226f, - 0.497069f, - 0.038226f, - 0.000000f, - -0.078800f, - 0.993700f, - 0.078800f, - 0.125000f, - 0.965500f, - -0.059716f, - 0.488310f, - 0.089370f, - 0.000000f, - -0.121200f, - 0.975900f, - 0.181400f, - 0.156200f, - 0.931000f, - -0.038226f, - 0.497069f, - 0.038226f, - 0.000000f, - -0.078800f, - 0.993700f, - 0.078800f, - 0.125000f, - 0.965500f, - -0.076003f, - 0.488310f, - 0.076003f, - 0.000000f, - -0.154300f, - 0.975900f, - 0.154300f, - 0.125000f, - 0.931000f, - -0.000000f, - -0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - -1.000000f, - 0.000000f, - 0.411700f, - 0.051000f, - -0.030034f, - -0.497069f, - 0.044949f, - 0.000000f, - -0.061900f, - -0.993700f, - 0.092700f, - 0.423500f, - 0.053800f, - -0.038226f, - -0.497069f, - 0.038226f, - 0.000000f, - -0.078800f, - -0.993700f, - 0.078800f, - 0.420900f, - 0.053800f, - -0.274125f, - -0.080891f, - 0.410257f, - 0.000000f, - -0.548300f, - -0.161200f, - 0.820600f, - 0.156200f, - 0.448300f, - -0.277378f, - -0.027069f, - 0.415125f, - 0.000000f, - -0.554700f, - -0.054000f, - 0.830300f, - 0.156200f, - 0.482800f, - -0.353035f, - -0.027069f, - 0.353034f, - 0.000000f, - -0.706100f, - -0.054000f, - 0.706100f, - 0.125000f, - 0.482800f, - -0.274125f, - -0.080891f, - 0.410257f, - 0.000000f, - -0.548300f, - -0.161200f, - 0.820600f, - 0.156200f, - 0.448300f, - -0.353035f, - -0.027069f, - 0.353034f, - 0.000000f, - -0.706100f, - -0.054000f, - 0.706100f, - 0.125000f, - 0.482800f, - -0.348895f, - -0.080891f, - 0.348895f, - 0.000000f, - -0.697800f, - -0.161200f, - 0.697800f, - 0.125000f, - 0.448300f, - -0.088698f, - 0.473826f, - 0.132745f, - 0.000000f, - -0.179100f, - 0.946600f, - 0.268000f, - 0.156200f, - 0.896600f, - -0.059716f, - 0.488310f, - 0.089370f, - 0.000000f, - -0.121200f, - 0.975900f, - 0.181400f, - 0.156200f, - 0.931000f, - -0.076003f, - 0.488310f, - 0.076003f, - 0.000000f, - -0.154300f, - 0.975900f, - 0.154300f, - 0.125000f, - 0.931000f, - -0.088698f, - 0.473826f, - 0.132745f, - 0.000000f, - -0.179100f, - 0.946600f, - 0.268000f, - 0.156200f, - 0.896600f, - -0.076003f, - 0.488310f, - 0.076003f, - 0.000000f, - -0.154300f, - 0.975900f, - 0.154300f, - 0.125000f, - 0.931000f, - -0.112890f, - 0.473826f, - 0.112889f, - 0.000000f, - -0.227900f, - 0.946600f, - 0.227900f, - 0.125000f, - 0.896600f, - -0.267660f, - -0.133764f, - 0.400580f, - 0.000000f, - -0.535400f, - -0.266600f, - 0.801400f, - 0.156200f, - 0.413800f, - -0.274125f, - -0.080891f, - 0.410257f, - 0.000000f, - -0.548300f, - -0.161200f, - 0.820600f, - 0.156200f, - 0.448300f, - -0.348895f, - -0.080891f, - 0.348895f, - 0.000000f, - -0.697800f, - -0.161200f, - 0.697800f, - 0.125000f, - 0.448300f, - -0.267660f, - -0.133764f, - 0.400580f, - 0.000000f, - -0.535400f, - -0.266600f, - 0.801400f, - 0.156200f, - 0.413800f, - -0.348895f, - -0.080891f, - 0.348895f, - 0.000000f, - -0.697800f, - -0.161200f, - 0.697800f, - 0.125000f, - 0.448300f, - -0.340667f, - -0.133764f, - 0.340666f, - 0.000000f, - -0.681500f, - -0.266600f, - 0.681500f, - 0.125000f, - 0.413800f, - -0.116639f, - 0.453788f, - 0.174562f, - 0.000000f, - -0.234800f, - 0.906300f, - 0.351400f, - 0.156200f, - 0.862100f, - -0.088698f, - 0.473826f, - 0.132745f, - 0.000000f, - -0.179100f, - 0.946600f, - 0.268000f, - 0.156200f, - 0.896600f, - -0.112890f, - 0.473826f, - 0.112889f, - 0.000000f, - -0.227900f, - 0.946600f, - 0.227900f, - 0.125000f, - 0.896600f, - -0.116639f, - 0.453788f, - 0.174562f, - 0.000000f, - -0.234800f, - 0.906300f, - 0.351400f, - 0.156200f, - 0.862100f, - -0.112890f, - 0.473826f, - 0.112889f, - 0.000000f, - -0.227900f, - 0.946600f, - 0.227900f, - 0.125000f, - 0.896600f, - -0.148454f, - 0.453788f, - 0.148453f, - 0.000000f, - -0.298900f, - 0.906300f, - 0.298900f, - 0.125000f, - 0.862100f, - -0.258056f, - -0.185069f, - 0.386207f, - 0.000000f, - -0.516300f, - -0.369000f, - 0.772800f, - 0.156200f, - 0.379300f, - -0.267660f, - -0.133764f, - 0.400580f, - 0.000000f, - -0.535400f, - -0.266600f, - 0.801400f, - 0.156200f, - 0.413800f, - -0.340667f, - -0.133764f, - 0.340666f, - 0.000000f, - -0.681500f, - -0.266600f, - 0.681500f, - 0.125000f, - 0.413800f, - -0.258056f, - -0.185069f, - 0.386207f, - 0.000000f, - -0.516300f, - -0.369000f, - 0.772800f, - 0.156200f, - 0.379300f, - -0.340667f, - -0.133764f, - 0.340666f, - 0.000000f, - -0.681500f, - -0.266600f, - 0.681500f, - 0.125000f, - 0.413800f, - -0.328443f, - -0.185069f, - 0.328443f, - 0.000000f, - -0.657200f, - -0.369000f, - 0.657200f, - 0.125000f, - 0.379300f, - -0.143213f, - 0.428429f, - 0.214333f, - 0.000000f, - -0.287800f, - 0.855300f, - 0.430700f, - 0.156200f, - 0.827600f, - -0.116639f, - 0.453788f, - 0.174562f, - 0.000000f, - -0.234800f, - 0.906300f, - 0.351400f, - 0.156200f, - 0.862100f, - -0.148454f, - 0.453788f, - 0.148453f, - 0.000000f, - -0.298900f, - 0.906300f, - 0.298900f, - 0.125000f, - 0.862100f, - -0.143213f, - 0.428429f, - 0.214333f, - 0.000000f, - -0.287800f, - 0.855300f, - 0.430700f, - 0.156200f, - 0.827600f, - -0.148454f, - 0.453788f, - 0.148453f, - 0.000000f, - -0.298900f, - 0.906300f, - 0.298900f, - 0.125000f, - 0.862100f, - -0.182276f, - 0.428429f, - 0.182276f, - 0.000000f, - -0.366300f, - 0.855300f, - 0.366300f, - 0.125000f, - 0.827600f, - -0.245427f, - -0.234204f, - 0.367306f, - 0.000000f, - -0.491300f, - -0.467000f, - 0.735200f, - 0.156200f, - 0.344800f, - -0.258056f, - -0.185069f, - 0.386207f, - 0.000000f, - -0.516300f, - -0.369000f, - 0.772800f, - 0.156200f, - 0.379300f, - -0.328443f, - -0.185069f, - 0.328443f, - 0.000000f, - -0.657200f, - -0.369000f, - 0.657200f, - 0.125000f, - 0.379300f, - -0.245427f, - -0.234204f, - 0.367306f, - 0.000000f, - -0.491300f, - -0.467000f, - 0.735200f, - 0.156200f, - 0.344800f, - -0.328443f, - -0.185069f, - 0.328443f, - 0.000000f, - -0.657200f, - -0.369000f, - 0.657200f, - 0.125000f, - 0.379300f, - -0.312369f, - -0.234204f, - 0.312368f, - 0.000000f, - -0.625200f, - -0.467000f, - 0.625200f, - 0.125000f, - 0.344800f, - -0.168108f, - 0.398046f, - 0.251592f, - 0.000000f, - -0.337400f, - 0.794500f, - 0.505000f, - 0.156200f, - 0.793100f, - -0.143213f, - 0.428429f, - 0.214333f, - 0.000000f, - -0.287800f, - 0.855300f, - 0.430700f, - 0.156200f, - 0.827600f, - -0.182276f, - 0.428429f, - 0.182276f, - 0.000000f, - -0.366300f, - 0.855300f, - 0.366300f, - 0.125000f, - 0.827600f, - -0.168108f, - 0.398046f, - 0.251592f, - 0.000000f, - -0.337400f, - 0.794500f, - 0.505000f, - 0.156200f, - 0.793100f, - -0.182276f, - 0.428429f, - 0.182276f, - 0.000000f, - -0.366300f, - 0.855300f, - 0.366300f, - 0.125000f, - 0.827600f, - -0.213961f, - 0.398046f, - 0.213961f, - 0.000000f, - -0.429400f, - 0.794500f, - 0.429400f, - 0.125000f, - 0.793100f, - -0.229920f, - -0.280594f, - 0.344099f, - 0.000000f, - -0.460400f, - -0.559600f, - 0.689100f, - 0.156200f, - 0.310300f, - -0.245427f, - -0.234204f, - 0.367306f, - 0.000000f, - -0.491300f, - -0.467000f, - 0.735200f, - 0.156200f, - 0.344800f, - -0.312369f, - -0.234204f, - 0.312368f, - 0.000000f, - -0.625200f, - -0.467000f, - 0.625200f, - 0.125000f, - 0.344800f, - -0.229920f, - -0.280594f, - 0.344099f, - 0.000000f, - -0.460400f, - -0.559600f, - 0.689100f, - 0.156200f, - 0.310300f, - -0.312369f, - -0.234204f, - 0.312368f, - 0.000000f, - -0.625200f, - -0.467000f, - 0.625200f, - 0.125000f, - 0.344800f, - -0.292632f, - -0.280594f, - 0.292632f, - 0.000000f, - -0.586000f, - -0.559600f, - 0.586000f, - 0.125000f, - 0.310300f, - -0.191033f, - 0.362998f, - 0.285900f, - 0.000000f, - -0.383000f, - 0.724300f, - 0.573300f, - 0.156200f, - 0.758600f, - -0.168108f, - 0.398046f, - 0.251592f, - 0.000000f, - -0.337400f, - 0.794500f, - 0.505000f, - 0.156200f, - 0.793100f, - -0.213961f, - 0.398046f, - 0.213961f, - 0.000000f, - -0.429400f, - 0.794500f, - 0.429400f, - 0.125000f, - 0.793100f, - -0.191033f, - 0.362998f, - 0.285900f, - 0.000000f, - -0.383000f, - 0.724300f, - 0.573300f, - 0.156200f, - 0.758600f, - -0.213961f, - 0.398046f, - 0.213961f, - 0.000000f, - -0.429400f, - 0.794500f, - 0.429400f, - 0.125000f, - 0.793100f, - -0.243139f, - 0.362998f, - 0.243138f, - 0.000000f, - -0.487500f, - 0.724300f, - 0.487500f, - 0.125000f, - 0.758600f, - -0.076003f, - 0.488310f, - 0.076003f, - 0.000000f, - -0.154300f, - 0.975900f, - 0.154300f, - 0.125000f, - 0.931000f, - -0.038226f, - 0.497069f, - 0.038226f, - 0.000000f, - -0.078800f, - 0.993700f, - 0.078800f, - 0.125000f, - 0.965500f, - -0.044949f, - 0.497069f, - 0.030034f, - 0.000000f, - -0.092700f, - 0.993700f, - 0.061900f, - 0.093700f, - 0.965500f, - -0.076003f, - 0.488310f, - 0.076003f, - 0.000000f, - -0.154300f, - 0.975900f, - 0.154300f, - 0.125000f, - 0.931000f, - -0.044949f, - 0.497069f, - 0.030034f, - 0.000000f, - -0.092700f, - 0.993700f, - 0.061900f, - 0.093700f, - 0.965500f, - -0.089370f, - 0.488310f, - 0.059715f, - 0.000000f, - -0.181400f, - 0.975900f, - 0.121200f, - 0.093700f, - 0.931000f, - -0.348895f, - -0.080891f, - 0.348895f, - 0.000000f, - -0.697800f, - -0.161200f, - 0.697800f, - 0.125000f, - 0.448300f, - -0.353035f, - -0.027069f, - 0.353034f, - 0.000000f, - -0.706100f, - -0.054000f, - 0.706100f, - 0.125000f, - 0.482800f, - -0.415125f, - -0.027069f, - 0.277377f, - 0.000000f, - -0.830300f, - -0.054000f, - 0.554700f, - 0.093700f, - 0.482800f, - -0.348895f, - -0.080891f, - 0.348895f, - 0.000000f, - -0.697800f, - -0.161200f, - 0.697800f, - 0.125000f, - 0.448300f, - -0.415125f, - -0.027069f, - 0.277377f, - 0.000000f, - -0.830300f, - -0.054000f, - 0.554700f, - 0.093700f, - 0.482800f, - -0.410258f, - -0.080891f, - 0.274125f, - 0.000000f, - -0.820600f, - -0.161200f, - 0.548300f, - 0.093700f, - 0.448300f, - -0.038226f, - -0.497069f, - 0.038226f, - 0.000000f, - -0.078800f, - -0.993700f, - 0.078800f, - 0.125000f, - 0.034500f, - -0.076004f, - -0.488310f, - 0.076003f, - 0.000000f, - -0.154300f, - -0.975900f, - 0.154300f, - 0.125000f, - 0.069000f, - -0.089371f, - -0.488310f, - 0.059715f, - 0.000000f, - -0.181400f, - -0.975900f, - 0.121200f, - 0.093700f, - 0.069000f, - -0.038226f, - -0.497069f, - 0.038226f, - 0.000000f, - -0.078800f, - -0.993700f, - 0.078800f, - 0.125000f, - 0.034500f, - -0.089371f, - -0.488310f, - 0.059715f, - 0.000000f, - -0.181400f, - -0.975900f, - 0.121200f, - 0.093700f, - 0.069000f, - -0.044949f, - -0.497069f, - 0.030034f, - 0.000000f, - -0.092700f, - -0.993700f, - 0.061900f, - 0.093700f, - 0.034500f, - -0.112890f, - 0.473826f, - 0.112889f, - 0.000000f, - -0.227900f, - 0.946600f, - 0.227900f, - 0.125000f, - 0.896600f, - -0.076003f, - 0.488310f, - 0.076003f, - 0.000000f, - -0.154300f, - 0.975900f, - 0.154300f, - 0.125000f, - 0.931000f, - -0.089370f, - 0.488310f, - 0.059715f, - 0.000000f, - -0.181400f, - 0.975900f, - 0.121200f, - 0.093700f, - 0.931000f, - -0.112890f, - 0.473826f, - 0.112889f, - 0.000000f, - -0.227900f, - 0.946600f, - 0.227900f, - 0.125000f, - 0.896600f, - -0.089370f, - 0.488310f, - 0.059715f, - 0.000000f, - -0.181400f, - 0.975900f, - 0.121200f, - 0.093700f, - 0.931000f, - -0.132745f, - 0.473826f, - 0.088697f, - 0.000000f, - -0.268000f, - 0.946600f, - 0.179100f, - 0.093700f, - 0.896600f, - -0.000000f, - -0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - -1.000000f, - 0.000000f, - 0.411700f, - 0.051000f, - -0.038226f, - -0.497069f, - 0.038226f, - 0.000000f, - -0.078800f, - -0.993700f, - 0.078800f, - 0.420900f, - 0.053800f, - -0.044949f, - -0.497069f, - 0.030034f, - 0.000000f, - -0.092700f, - -0.993700f, - 0.061900f, - 0.418200f, - 0.053800f, - -0.148454f, - 0.453788f, - 0.148453f, - 0.000000f, - -0.298900f, - 0.906300f, - 0.298900f, - 0.125000f, - 0.862100f, - -0.112890f, - 0.473826f, - 0.112889f, - 0.000000f, - -0.227900f, - 0.946600f, - 0.227900f, - 0.125000f, - 0.896600f, - -0.132745f, - 0.473826f, - 0.088697f, - 0.000000f, - -0.268000f, - 0.946600f, - 0.179100f, - 0.093700f, - 0.896600f, - -0.148454f, - 0.453788f, - 0.148453f, - 0.000000f, - -0.298900f, - 0.906300f, - 0.298900f, - 0.125000f, - 0.862100f, - -0.132745f, - 0.473826f, - 0.088697f, - 0.000000f, - -0.268000f, - 0.946600f, - 0.179100f, - 0.093700f, - 0.896600f, - -0.174562f, - 0.453788f, - 0.116638f, - 0.000000f, - -0.351400f, - 0.906300f, - 0.234800f, - 0.093700f, - 0.862100f, - -0.182276f, - 0.428429f, - 0.182276f, - 0.000000f, - -0.366300f, - 0.855300f, - 0.366300f, - 0.125000f, - 0.827600f, - -0.148454f, - 0.453788f, - 0.148453f, - 0.000000f, - -0.298900f, - 0.906300f, - 0.298900f, - 0.125000f, - 0.862100f, - -0.174562f, - 0.453788f, - 0.116638f, - 0.000000f, - -0.351400f, - 0.906300f, - 0.234800f, - 0.093700f, - 0.862100f, - -0.182276f, - 0.428429f, - 0.182276f, - 0.000000f, - -0.366300f, - 0.855300f, - 0.366300f, - 0.125000f, - 0.827600f, - -0.174562f, - 0.453788f, - 0.116638f, - 0.000000f, - -0.351400f, - 0.906300f, - 0.234800f, - 0.093700f, - 0.862100f, - -0.214334f, - 0.428429f, - 0.143213f, - 0.000000f, - -0.430700f, - 0.855300f, - 0.287800f, - 0.093700f, - 0.827600f, - -0.340667f, - -0.133764f, - 0.340666f, - 0.000000f, - -0.681500f, - -0.266600f, - 0.681500f, - 0.125000f, - 0.413800f, - -0.348895f, - -0.080891f, - 0.348895f, - 0.000000f, - -0.697800f, - -0.161200f, - 0.697800f, - 0.125000f, - 0.448300f, - -0.410258f, - -0.080891f, - 0.274125f, - 0.000000f, - -0.820600f, - -0.161200f, - 0.548300f, - 0.093700f, - 0.448300f, - -0.340667f, - -0.133764f, - 0.340666f, - 0.000000f, - -0.681500f, - -0.266600f, - 0.681500f, - 0.125000f, - 0.413800f, - -0.410258f, - -0.080891f, - 0.274125f, - 0.000000f, - -0.820600f, - -0.161200f, - 0.548300f, - 0.093700f, - 0.448300f, - -0.400581f, - -0.133764f, - 0.267659f, - 0.000000f, - -0.801400f, - -0.266600f, - 0.535400f, - 0.093700f, - 0.413800f, - -0.213961f, - 0.398046f, - 0.213961f, - 0.000000f, - -0.429400f, - 0.794500f, - 0.429400f, - 0.125000f, - 0.793100f, - -0.182276f, - 0.428429f, - 0.182276f, - 0.000000f, - -0.366300f, - 0.855300f, - 0.366300f, - 0.125000f, - 0.827600f, - -0.214334f, - 0.428429f, - 0.143213f, - 0.000000f, - -0.430700f, - 0.855300f, - 0.287800f, - 0.093700f, - 0.827600f, - -0.213961f, - 0.398046f, - 0.213961f, - 0.000000f, - -0.429400f, - 0.794500f, - 0.429400f, - 0.125000f, - 0.793100f, - -0.214334f, - 0.428429f, - 0.143213f, - 0.000000f, - -0.430700f, - 0.855300f, - 0.287800f, - 0.093700f, - 0.827600f, - -0.251592f, - 0.398046f, - 0.168108f, - 0.000000f, - -0.505000f, - 0.794500f, - 0.337400f, - 0.093700f, - 0.793100f, - -0.328443f, - -0.185069f, - 0.328443f, - 0.000000f, - -0.657200f, - -0.369000f, - 0.657200f, - 0.125000f, - 0.379300f, - -0.340667f, - -0.133764f, - 0.340666f, - 0.000000f, - -0.681500f, - -0.266600f, - 0.681500f, - 0.125000f, - 0.413800f, - -0.400581f, - -0.133764f, - 0.267659f, - 0.000000f, - -0.801400f, - -0.266600f, - 0.535400f, - 0.093700f, - 0.413800f, - -0.328443f, - -0.185069f, - 0.328443f, - 0.000000f, - -0.657200f, - -0.369000f, - 0.657200f, - 0.125000f, - 0.379300f, - -0.400581f, - -0.133764f, - 0.267659f, - 0.000000f, - -0.801400f, - -0.266600f, - 0.535400f, - 0.093700f, - 0.413800f, - -0.386208f, - -0.185069f, - 0.258056f, - 0.000000f, - -0.772800f, - -0.369000f, - 0.516300f, - 0.093700f, - 0.379300f, - -0.243139f, - 0.362998f, - 0.243138f, - 0.000000f, - -0.487500f, - 0.724300f, - 0.487500f, - 0.125000f, - 0.758600f, - -0.213961f, - 0.398046f, - 0.213961f, - 0.000000f, - -0.429400f, - 0.794500f, - 0.429400f, - 0.125000f, - 0.793100f, - -0.251592f, - 0.398046f, - 0.168108f, - 0.000000f, - -0.505000f, - 0.794500f, - 0.337400f, - 0.093700f, - 0.793100f, - -0.243139f, - 0.362998f, - 0.243138f, - 0.000000f, - -0.487500f, - 0.724300f, - 0.487500f, - 0.125000f, - 0.758600f, - -0.251592f, - 0.398046f, - 0.168108f, - 0.000000f, - -0.505000f, - 0.794500f, - 0.337400f, - 0.093700f, - 0.793100f, - -0.285901f, - 0.362998f, - 0.191032f, - 0.000000f, - -0.573300f, - 0.724300f, - 0.383000f, - 0.093700f, - 0.758600f, - -0.312369f, - -0.234204f, - 0.312368f, - 0.000000f, - -0.625200f, - -0.467000f, - 0.625200f, - 0.125000f, - 0.344800f, - -0.328443f, - -0.185069f, - 0.328443f, - 0.000000f, - -0.657200f, - -0.369000f, - 0.657200f, - 0.125000f, - 0.379300f, - -0.386208f, - -0.185069f, - 0.258056f, - 0.000000f, - -0.772800f, - -0.369000f, - 0.516300f, - 0.093700f, - 0.379300f, - -0.312369f, - -0.234204f, - 0.312368f, - 0.000000f, - -0.625200f, - -0.467000f, - 0.625200f, - 0.125000f, - 0.344800f, - -0.386208f, - -0.185069f, - 0.258056f, - 0.000000f, - -0.772800f, - -0.369000f, - 0.516300f, - 0.093700f, - 0.379300f, - -0.367307f, - -0.234204f, - 0.245426f, - 0.000000f, - -0.735200f, - -0.467000f, - 0.491300f, - 0.093700f, - 0.344800f, - -0.269465f, - 0.323693f, - 0.269464f, - 0.000000f, - -0.539900f, - 0.645700f, - 0.539900f, - 0.125000f, - 0.724100f, - -0.243139f, - 0.362998f, - 0.243138f, - 0.000000f, - -0.487500f, - 0.724300f, - 0.487500f, - 0.125000f, - 0.758600f, - -0.285901f, - 0.362998f, - 0.191032f, - 0.000000f, - -0.573300f, - 0.724300f, - 0.383000f, - 0.093700f, - 0.758600f, - -0.269465f, - 0.323693f, - 0.269464f, - 0.000000f, - -0.539900f, - 0.645700f, - 0.539900f, - 0.125000f, - 0.724100f, - -0.285901f, - 0.362998f, - 0.191032f, - 0.000000f, - -0.573300f, - 0.724300f, - 0.383000f, - 0.093700f, - 0.758600f, - -0.316857f, - 0.323693f, - 0.211717f, - 0.000000f, - -0.634900f, - 0.645700f, - 0.424200f, - 0.093700f, - 0.724100f, - -0.292632f, - -0.280594f, - 0.292632f, - 0.000000f, - -0.586000f, - -0.559600f, - 0.586000f, - 0.125000f, - 0.310300f, - -0.312369f, - -0.234204f, - 0.312368f, - 0.000000f, - -0.625200f, - -0.467000f, - 0.625200f, - 0.125000f, - 0.344800f, - -0.367307f, - -0.234204f, - 0.245426f, - 0.000000f, - -0.735200f, - -0.467000f, - 0.491300f, - 0.093700f, - 0.344800f, - -0.292632f, - -0.280594f, - 0.292632f, - 0.000000f, - -0.586000f, - -0.559600f, - 0.586000f, - 0.125000f, - 0.310300f, - -0.367307f, - -0.234204f, - 0.245426f, - 0.000000f, - -0.735200f, - -0.467000f, - 0.491300f, - 0.093700f, - 0.344800f, - -0.344099f, - -0.280594f, - 0.229919f, - 0.000000f, - -0.689100f, - -0.559600f, - 0.460400f, - 0.093700f, - 0.310300f, - -0.292632f, - 0.280594f, - 0.292632f, - 0.000000f, - -0.586000f, - 0.559600f, - 0.586000f, - 0.125000f, - 0.689700f, - -0.269465f, - 0.323693f, - 0.269464f, - 0.000000f, - -0.539900f, - 0.645700f, - 0.539900f, - 0.125000f, - 0.724100f, - -0.316857f, - 0.323693f, - 0.211717f, - 0.000000f, - -0.634900f, - 0.645700f, - 0.424200f, - 0.093700f, - 0.724100f, - -0.292632f, - 0.280594f, - 0.292632f, - 0.000000f, - -0.586000f, - 0.559600f, - 0.586000f, - 0.125000f, - 0.689700f, - -0.316857f, - 0.323693f, - 0.211717f, - 0.000000f, - -0.634900f, - 0.645700f, - 0.424200f, - 0.093700f, - 0.724100f, - -0.344099f, - 0.280594f, - 0.229919f, - 0.000000f, - -0.689100f, - 0.559600f, - 0.460400f, - 0.093700f, - 0.689700f, - -0.269465f, - -0.323693f, - 0.269464f, - 0.000000f, - -0.539900f, - -0.645700f, - 0.539900f, - 0.125000f, - 0.275900f, - -0.292632f, - -0.280594f, - 0.292632f, - 0.000000f, - -0.586000f, - -0.559600f, - 0.586000f, - 0.125000f, - 0.310300f, - -0.344099f, - -0.280594f, - 0.229919f, - 0.000000f, - -0.689100f, - -0.559600f, - 0.460400f, - 0.093700f, - 0.310300f, - -0.269465f, - -0.323693f, - 0.269464f, - 0.000000f, - -0.539900f, - -0.645700f, - 0.539900f, - 0.125000f, - 0.275900f, - -0.344099f, - -0.280594f, - 0.229919f, - 0.000000f, - -0.689100f, - -0.559600f, - 0.460400f, - 0.093700f, - 0.310300f, - -0.316857f, - -0.323693f, - 0.211717f, - 0.000000f, - -0.634900f, - -0.645700f, - 0.424200f, - 0.093700f, - 0.275900f, - -0.312369f, - 0.234204f, - 0.312368f, - 0.000000f, - -0.625200f, - 0.467000f, - 0.625200f, - 0.125000f, - 0.655200f, - -0.292632f, - 0.280594f, - 0.292632f, - 0.000000f, - -0.586000f, - 0.559600f, - 0.586000f, - 0.125000f, - 0.689700f, - -0.344099f, - 0.280594f, - 0.229919f, - 0.000000f, - -0.689100f, - 0.559600f, - 0.460400f, - 0.093700f, - 0.689700f, - -0.312369f, - 0.234204f, - 0.312368f, - 0.000000f, - -0.625200f, - 0.467000f, - 0.625200f, - 0.125000f, - 0.655200f, - -0.344099f, - 0.280594f, - 0.229919f, - 0.000000f, - -0.689100f, - 0.559600f, - 0.460400f, - 0.093700f, - 0.689700f, - -0.367307f, - 0.234204f, - 0.245426f, - 0.000000f, - -0.735200f, - 0.467000f, - 0.491300f, - 0.093700f, - 0.655200f, - -0.243139f, - -0.362998f, - 0.243138f, - 0.000000f, - -0.487500f, - -0.724300f, - 0.487500f, - 0.125000f, - 0.241400f, - -0.269465f, - -0.323693f, - 0.269464f, - 0.000000f, - -0.539900f, - -0.645700f, - 0.539900f, - 0.125000f, - 0.275900f, - -0.316857f, - -0.323693f, - 0.211717f, - 0.000000f, - -0.634900f, - -0.645700f, - 0.424200f, - 0.093700f, - 0.275900f, - -0.243139f, - -0.362998f, - 0.243138f, - 0.000000f, - -0.487500f, - -0.724300f, - 0.487500f, - 0.125000f, - 0.241400f, - -0.316857f, - -0.323693f, - 0.211717f, - 0.000000f, - -0.634900f, - -0.645700f, - 0.424200f, - 0.093700f, - 0.275900f, - -0.285901f, - -0.362998f, - 0.191032f, - 0.000000f, - -0.573300f, - -0.724300f, - 0.383000f, - 0.093700f, - 0.241400f, - -0.328443f, - 0.185069f, - 0.328443f, - 0.000000f, - -0.657200f, - 0.369000f, - 0.657200f, - 0.125000f, - 0.620700f, - -0.312369f, - 0.234204f, - 0.312368f, - 0.000000f, - -0.625200f, - 0.467000f, - 0.625200f, - 0.125000f, - 0.655200f, - -0.367307f, - 0.234204f, - 0.245426f, - 0.000000f, - -0.735200f, - 0.467000f, - 0.491300f, - 0.093700f, - 0.655200f, - -0.328443f, - 0.185069f, - 0.328443f, - 0.000000f, - -0.657200f, - 0.369000f, - 0.657200f, - 0.125000f, - 0.620700f, - -0.367307f, - 0.234204f, - 0.245426f, - 0.000000f, - -0.735200f, - 0.467000f, - 0.491300f, - 0.093700f, - 0.655200f, - -0.386208f, - 0.185069f, - 0.258056f, - 0.000000f, - -0.772800f, - 0.369000f, - 0.516300f, - 0.093700f, - 0.620700f, - -0.213961f, - -0.398046f, - 0.213961f, - 0.000000f, - -0.429400f, - -0.794500f, - 0.429400f, - 0.125000f, - 0.206900f, - -0.243139f, - -0.362998f, - 0.243138f, - 0.000000f, - -0.487500f, - -0.724300f, - 0.487500f, - 0.125000f, - 0.241400f, - -0.285901f, - -0.362998f, - 0.191032f, - 0.000000f, - -0.573300f, - -0.724300f, - 0.383000f, - 0.093700f, - 0.241400f, - -0.213961f, - -0.398046f, - 0.213961f, - 0.000000f, - -0.429400f, - -0.794500f, - 0.429400f, - 0.125000f, - 0.206900f, - -0.285901f, - -0.362998f, - 0.191032f, - 0.000000f, - -0.573300f, - -0.724300f, - 0.383000f, - 0.093700f, - 0.241400f, - -0.251592f, - -0.398046f, - 0.168108f, - 0.000000f, - -0.505000f, - -0.794500f, - 0.337400f, - 0.093700f, - 0.206900f, - -0.340667f, - 0.133764f, - 0.340666f, - 0.000000f, - -0.681500f, - 0.266600f, - 0.681500f, - 0.125000f, - 0.586200f, - -0.328443f, - 0.185069f, - 0.328443f, - 0.000000f, - -0.657200f, - 0.369000f, - 0.657200f, - 0.125000f, - 0.620700f, - -0.386208f, - 0.185069f, - 0.258056f, - 0.000000f, - -0.772800f, - 0.369000f, - 0.516300f, - 0.093700f, - 0.620700f, - -0.340667f, - 0.133764f, - 0.340666f, - 0.000000f, - -0.681500f, - 0.266600f, - 0.681500f, - 0.125000f, - 0.586200f, - -0.386208f, - 0.185069f, - 0.258056f, - 0.000000f, - -0.772800f, - 0.369000f, - 0.516300f, - 0.093700f, - 0.620700f, - -0.400581f, - 0.133764f, - 0.267659f, - 0.000000f, - -0.801400f, - 0.266600f, - 0.535400f, - 0.093700f, - 0.586200f, - -0.182276f, - -0.428429f, - 0.182276f, - 0.000000f, - -0.366300f, - -0.855300f, - 0.366300f, - 0.125000f, - 0.172400f, - -0.213961f, - -0.398046f, - 0.213961f, - 0.000000f, - -0.429400f, - -0.794500f, - 0.429400f, - 0.125000f, - 0.206900f, - -0.251592f, - -0.398046f, - 0.168108f, - 0.000000f, - -0.505000f, - -0.794500f, - 0.337400f, - 0.093700f, - 0.206900f, - -0.182276f, - -0.428429f, - 0.182276f, - 0.000000f, - -0.366300f, - -0.855300f, - 0.366300f, - 0.125000f, - 0.172400f, - -0.251592f, - -0.398046f, - 0.168108f, - 0.000000f, - -0.505000f, - -0.794500f, - 0.337400f, - 0.093700f, - 0.206900f, - -0.214334f, - -0.428429f, - 0.143213f, - 0.000000f, - -0.430700f, - -0.855300f, - 0.287800f, - 0.093700f, - 0.172400f, - -0.348895f, - 0.080891f, - 0.348895f, - 0.000000f, - -0.697800f, - 0.161200f, - 0.697800f, - 0.125000f, - 0.551700f, - -0.340667f, - 0.133764f, - 0.340666f, - 0.000000f, - -0.681500f, - 0.266600f, - 0.681500f, - 0.125000f, - 0.586200f, - -0.400581f, - 0.133764f, - 0.267659f, - 0.000000f, - -0.801400f, - 0.266600f, - 0.535400f, - 0.093700f, - 0.586200f, - -0.348895f, - 0.080891f, - 0.348895f, - 0.000000f, - -0.697800f, - 0.161200f, - 0.697800f, - 0.125000f, - 0.551700f, - -0.400581f, - 0.133764f, - 0.267659f, - 0.000000f, - -0.801400f, - 0.266600f, - 0.535400f, - 0.093700f, - 0.586200f, - -0.410258f, - 0.080891f, - 0.274125f, - 0.000000f, - -0.820600f, - 0.161200f, - 0.548300f, - 0.093700f, - 0.551700f, - -0.148454f, - -0.453788f, - 0.148453f, - 0.000000f, - -0.298900f, - -0.906300f, - 0.298900f, - 0.125000f, - 0.137900f, - -0.182276f, - -0.428429f, - 0.182276f, - 0.000000f, - -0.366300f, - -0.855300f, - 0.366300f, - 0.125000f, - 0.172400f, - -0.214334f, - -0.428429f, - 0.143213f, - 0.000000f, - -0.430700f, - -0.855300f, - 0.287800f, - 0.093700f, - 0.172400f, - -0.148454f, - -0.453788f, - 0.148453f, - 0.000000f, - -0.298900f, - -0.906300f, - 0.298900f, - 0.125000f, - 0.137900f, - -0.214334f, - -0.428429f, - 0.143213f, - 0.000000f, - -0.430700f, - -0.855300f, - 0.287800f, - 0.093700f, - 0.172400f, - -0.174562f, - -0.453788f, - 0.116638f, - 0.000000f, - -0.351400f, - -0.906300f, - 0.234800f, - 0.093700f, - 0.137900f, - -0.353035f, - 0.027069f, - 0.353034f, - 0.000000f, - -0.706100f, - 0.054000f, - 0.706100f, - 0.125000f, - 0.517200f, - -0.348895f, - 0.080891f, - 0.348895f, - 0.000000f, - -0.697800f, - 0.161200f, - 0.697800f, - 0.125000f, - 0.551700f, - -0.410258f, - 0.080891f, - 0.274125f, - 0.000000f, - -0.820600f, - 0.161200f, - 0.548300f, - 0.093700f, - 0.551700f, - -0.353035f, - 0.027069f, - 0.353034f, - 0.000000f, - -0.706100f, - 0.054000f, - 0.706100f, - 0.125000f, - 0.517200f, - -0.410258f, - 0.080891f, - 0.274125f, - 0.000000f, - -0.820600f, - 0.161200f, - 0.548300f, - 0.093700f, - 0.551700f, - -0.415125f, - 0.027069f, - 0.277377f, - 0.000000f, - -0.830300f, - 0.054000f, - 0.554700f, - 0.093700f, - 0.517200f, - -0.112890f, - -0.473826f, - 0.112890f, - 0.000000f, - -0.227900f, - -0.946600f, - 0.227900f, - 0.125000f, - 0.103400f, - -0.148454f, - -0.453788f, - 0.148453f, - 0.000000f, - -0.298900f, - -0.906300f, - 0.298900f, - 0.125000f, - 0.137900f, - -0.174562f, - -0.453788f, - 0.116638f, - 0.000000f, - -0.351400f, - -0.906300f, - 0.234800f, - 0.093700f, - 0.137900f, - -0.112890f, - -0.473826f, - 0.112890f, - 0.000000f, - -0.227900f, - -0.946600f, - 0.227900f, - 0.125000f, - 0.103400f, - -0.174562f, - -0.453788f, - 0.116638f, - 0.000000f, - -0.351400f, - -0.906300f, - 0.234800f, - 0.093700f, - 0.137900f, - -0.132745f, - -0.473826f, - 0.088697f, - 0.000000f, - -0.268000f, - -0.946600f, - 0.179100f, - 0.093700f, - 0.103400f, - -0.038226f, - 0.497069f, - 0.038226f, - 0.000000f, - -0.078800f, - 0.993700f, - 0.078800f, - 0.478000f, - 0.962300f, - -0.000000f, - 0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - 1.000000f, - 0.000000f, - 0.482000f, - 0.960300f, - -0.044949f, - 0.497069f, - 0.030034f, - 0.000000f, - -0.092700f, - 0.993700f, - 0.061900f, - 0.479800f, - 0.962300f, - -0.353035f, - -0.027069f, - 0.353034f, - 0.000000f, - -0.706100f, - -0.054000f, - 0.706100f, - 0.125000f, - 0.482800f, - -0.353035f, - 0.027069f, - 0.353034f, - 0.000000f, - -0.706100f, - 0.054000f, - 0.706100f, - 0.125000f, - 0.517200f, - -0.415125f, - 0.027069f, - 0.277377f, - 0.000000f, - -0.830300f, - 0.054000f, - 0.554700f, - 0.093700f, - 0.517200f, - -0.353035f, - -0.027069f, - 0.353034f, - 0.000000f, - -0.706100f, - -0.054000f, - 0.706100f, - 0.125000f, - 0.482800f, - -0.415125f, - 0.027069f, - 0.277377f, - 0.000000f, - -0.830300f, - 0.054000f, - 0.554700f, - 0.093700f, - 0.517200f, - -0.415125f, - -0.027069f, - 0.277377f, - 0.000000f, - -0.830300f, - -0.054000f, - 0.554700f, - 0.093700f, - 0.482800f, - -0.076004f, - -0.488310f, - 0.076003f, - 0.000000f, - -0.154300f, - -0.975900f, - 0.154300f, - 0.125000f, - 0.069000f, - -0.112890f, - -0.473826f, - 0.112890f, - 0.000000f, - -0.227900f, - -0.946600f, - 0.227900f, - 0.125000f, - 0.103400f, - -0.132745f, - -0.473826f, - 0.088697f, - 0.000000f, - -0.268000f, - -0.946600f, - 0.179100f, - 0.093700f, - 0.103400f, - -0.076004f, - -0.488310f, - 0.076003f, - 0.000000f, - -0.154300f, - -0.975900f, - 0.154300f, - 0.125000f, - 0.069000f, - -0.132745f, - -0.473826f, - 0.088697f, - 0.000000f, - -0.268000f, - -0.946600f, - 0.179100f, - 0.093700f, - 0.103400f, - -0.089371f, - -0.488310f, - 0.059715f, - 0.000000f, - -0.181400f, - -0.975900f, - 0.121200f, - 0.093700f, - 0.069000f, - -0.285901f, - -0.362998f, - 0.191032f, - 0.000000f, - -0.573300f, - -0.724300f, - 0.383000f, - 0.093700f, - 0.241400f, - -0.316857f, - -0.323693f, - 0.211717f, - 0.000000f, - -0.634900f, - -0.645700f, - 0.424200f, - 0.093700f, - 0.275900f, - -0.352073f, - -0.323693f, - 0.145833f, - 0.000000f, - -0.705400f, - -0.645700f, - 0.292200f, - 0.062500f, - 0.275900f, - -0.285901f, - -0.362998f, - 0.191032f, - 0.000000f, - -0.573300f, - -0.724300f, - 0.383000f, - 0.093700f, - 0.241400f, - -0.352073f, - -0.323693f, - 0.145833f, - 0.000000f, - -0.705400f, - -0.645700f, - 0.292200f, - 0.062500f, - 0.275900f, - -0.317676f, - -0.362998f, - 0.131585f, - 0.000000f, - -0.637000f, - -0.724300f, - 0.263800f, - 0.062500f, - 0.241400f, - -0.344099f, - 0.280594f, - 0.229919f, - 0.000000f, - -0.689100f, - 0.559600f, - 0.460400f, - 0.093700f, - 0.689700f, - -0.316857f, - 0.323693f, - 0.211717f, - 0.000000f, - -0.634900f, - 0.645700f, - 0.424200f, - 0.093700f, - 0.724100f, - -0.352073f, - 0.323693f, - 0.145833f, - 0.000000f, - -0.705400f, - 0.645700f, - 0.292200f, - 0.062500f, - 0.724100f, - -0.344099f, - 0.280594f, - 0.229919f, - 0.000000f, - -0.689100f, - 0.559600f, - 0.460400f, - 0.093700f, - 0.689700f, - -0.352073f, - 0.323693f, - 0.145833f, - 0.000000f, - -0.705400f, - 0.645700f, - 0.292200f, - 0.062500f, - 0.724100f, - -0.382342f, - 0.280594f, - 0.158371f, - 0.000000f, - -0.765600f, - 0.559600f, - 0.317100f, - 0.062500f, - 0.689700f, - -0.251592f, - -0.398046f, - 0.168108f, - 0.000000f, - -0.505000f, - -0.794500f, - 0.337400f, - 0.093700f, - 0.206900f, - -0.285901f, - -0.362998f, - 0.191032f, - 0.000000f, - -0.573300f, - -0.724300f, - 0.383000f, - 0.093700f, - 0.241400f, - -0.317676f, - -0.362998f, - 0.131585f, - 0.000000f, - -0.637000f, - -0.724300f, - 0.263800f, - 0.062500f, - 0.241400f, - -0.251592f, - -0.398046f, - 0.168108f, - 0.000000f, - -0.505000f, - -0.794500f, - 0.337400f, - 0.093700f, - 0.206900f, - -0.317676f, - -0.362998f, - 0.131585f, - 0.000000f, - -0.637000f, - -0.724300f, - 0.263800f, - 0.062500f, - 0.241400f, - -0.279554f, - -0.398046f, - 0.115795f, - 0.000000f, - -0.561100f, - -0.794500f, - 0.232400f, - 0.062500f, - 0.206900f, - -0.367307f, - 0.234204f, - 0.245426f, - 0.000000f, - -0.735200f, - 0.467000f, - 0.491300f, - 0.093700f, - 0.655200f, - -0.344099f, - 0.280594f, - 0.229919f, - 0.000000f, - -0.689100f, - 0.559600f, - 0.460400f, - 0.093700f, - 0.689700f, - -0.382342f, - 0.280594f, - 0.158371f, - 0.000000f, - -0.765600f, - 0.559600f, - 0.317100f, - 0.062500f, - 0.689700f, - -0.367307f, - 0.234204f, - 0.245426f, - 0.000000f, - -0.735200f, - 0.467000f, - 0.491300f, - 0.093700f, - 0.655200f, - -0.382342f, - 0.280594f, - 0.158371f, - 0.000000f, - -0.765600f, - 0.559600f, - 0.317100f, - 0.062500f, - 0.689700f, - -0.408129f, - 0.234204f, - 0.169052f, - 0.000000f, - -0.816900f, - 0.467000f, - 0.338400f, - 0.062500f, - 0.655200f, - -0.214334f, - -0.428429f, - 0.143213f, - 0.000000f, - -0.430700f, - -0.855300f, - 0.287800f, - 0.093700f, - 0.172400f, - -0.251592f, - -0.398046f, - 0.168108f, - 0.000000f, - -0.505000f, - -0.794500f, - 0.337400f, - 0.093700f, - 0.206900f, - -0.279554f, - -0.398046f, - 0.115795f, - 0.000000f, - -0.561100f, - -0.794500f, - 0.232400f, - 0.062500f, - 0.206900f, - -0.214334f, - -0.428429f, - 0.143213f, - 0.000000f, - -0.430700f, - -0.855300f, - 0.287800f, - 0.093700f, - 0.172400f, - -0.279554f, - -0.398046f, - 0.115795f, - 0.000000f, - -0.561100f, - -0.794500f, - 0.232400f, - 0.062500f, - 0.206900f, - -0.238155f, - -0.428429f, - 0.098646f, - 0.000000f, - -0.478600f, - -0.855300f, - 0.198200f, - 0.062500f, - 0.172400f, - -0.386208f, - 0.185069f, - 0.258056f, - 0.000000f, - -0.772800f, - 0.369000f, - 0.516300f, - 0.093700f, - 0.620700f, - -0.367307f, - 0.234204f, - 0.245426f, - 0.000000f, - -0.735200f, - 0.467000f, - 0.491300f, - 0.093700f, - 0.655200f, - -0.408129f, - 0.234204f, - 0.169052f, - 0.000000f, - -0.816900f, - 0.467000f, - 0.338400f, - 0.062500f, - 0.655200f, - -0.386208f, - 0.185069f, - 0.258056f, - 0.000000f, - -0.772800f, - 0.369000f, - 0.516300f, - 0.093700f, - 0.620700f, - -0.408129f, - 0.234204f, - 0.169052f, - 0.000000f, - -0.816900f, - 0.467000f, - 0.338400f, - 0.062500f, - 0.655200f, - -0.429131f, - 0.185069f, - 0.177751f, - 0.000000f, - -0.858700f, - 0.369000f, - 0.355700f, - 0.062500f, - 0.620700f, - -0.174562f, - -0.453788f, - 0.116638f, - 0.000000f, - -0.351400f, - -0.906300f, - 0.234800f, - 0.093700f, - 0.137900f, - -0.214334f, - -0.428429f, - 0.143213f, - 0.000000f, - -0.430700f, - -0.855300f, - 0.287800f, - 0.093700f, - 0.172400f, - -0.238155f, - -0.428429f, - 0.098646f, - 0.000000f, - -0.478600f, - -0.855300f, - 0.198200f, - 0.062500f, - 0.172400f, - -0.174562f, - -0.453788f, - 0.116638f, - 0.000000f, - -0.351400f, - -0.906300f, - 0.234800f, - 0.093700f, - 0.137900f, - -0.238155f, - -0.428429f, - 0.098646f, - 0.000000f, - -0.478600f, - -0.855300f, - 0.198200f, - 0.062500f, - 0.172400f, - -0.193963f, - -0.453788f, - 0.080342f, - 0.000000f, - -0.390500f, - -0.906300f, - 0.161700f, - 0.062500f, - 0.137900f, - -0.400581f, - 0.133764f, - 0.267659f, - 0.000000f, - -0.801400f, - 0.266600f, - 0.535400f, - 0.093700f, - 0.586200f, - -0.386208f, - 0.185069f, - 0.258056f, - 0.000000f, - -0.772800f, - 0.369000f, - 0.516300f, - 0.093700f, - 0.620700f, - -0.429131f, - 0.185069f, - 0.177751f, - 0.000000f, - -0.858700f, - 0.369000f, - 0.355700f, - 0.062500f, - 0.620700f, - -0.400581f, - 0.133764f, - 0.267659f, - 0.000000f, - -0.801400f, - 0.266600f, - 0.535400f, - 0.093700f, - 0.586200f, - -0.429131f, - 0.185069f, - 0.177751f, - 0.000000f, - -0.858700f, - 0.369000f, - 0.355700f, - 0.062500f, - 0.620700f, - -0.445102f, - 0.133764f, - 0.184367f, - 0.000000f, - -0.890400f, - 0.266600f, - 0.368800f, - 0.062500f, - 0.586200f, - -0.132745f, - -0.473826f, - 0.088697f, - 0.000000f, - -0.268000f, - -0.946600f, - 0.179100f, - 0.093700f, - 0.103400f, - -0.174562f, - -0.453788f, - 0.116638f, - 0.000000f, - -0.351400f, - -0.906300f, - 0.234800f, - 0.093700f, - 0.137900f, - -0.193963f, - -0.453788f, - 0.080342f, - 0.000000f, - -0.390500f, - -0.906300f, - 0.161700f, - 0.062500f, - 0.137900f, - -0.132745f, - -0.473826f, - 0.088697f, - 0.000000f, - -0.268000f, - -0.946600f, - 0.179100f, - 0.093700f, - 0.103400f, - -0.193963f, - -0.453788f, - 0.080342f, - 0.000000f, - -0.390500f, - -0.906300f, - 0.161700f, - 0.062500f, - 0.137900f, - -0.147499f, - -0.473826f, - 0.061095f, - 0.000000f, - -0.297800f, - -0.946600f, - 0.123300f, - 0.062500f, - 0.103400f, - -0.410258f, - 0.080891f, - 0.274125f, - 0.000000f, - -0.820600f, - 0.161200f, - 0.548300f, - 0.093700f, - 0.551700f, - -0.400581f, - 0.133764f, - 0.267659f, - 0.000000f, - -0.801400f, - 0.266600f, - 0.535400f, - 0.093700f, - 0.586200f, - -0.445102f, - 0.133764f, - 0.184367f, - 0.000000f, - -0.890400f, - 0.266600f, - 0.368800f, - 0.062500f, - 0.586200f, - -0.410258f, - 0.080891f, - 0.274125f, - 0.000000f, - -0.820600f, - 0.161200f, - 0.548300f, - 0.093700f, - 0.551700f, - -0.445102f, - 0.133764f, - 0.184367f, - 0.000000f, - -0.890400f, - 0.266600f, - 0.368800f, - 0.062500f, - 0.586200f, - -0.455854f, - 0.080891f, - 0.188820f, - 0.000000f, - -0.911800f, - 0.161200f, - 0.377700f, - 0.062500f, - 0.551700f, - -0.089371f, - -0.488310f, - 0.059715f, - 0.000000f, - -0.181400f, - -0.975900f, - 0.121200f, - 0.093700f, - 0.069000f, - -0.132745f, - -0.473826f, - 0.088697f, - 0.000000f, - -0.268000f, - -0.946600f, - 0.179100f, - 0.093700f, - 0.103400f, - -0.147499f, - -0.473826f, - 0.061095f, - 0.000000f, - -0.297800f, - -0.946600f, - 0.123300f, - 0.062500f, - 0.103400f, - -0.089371f, - -0.488310f, - 0.059715f, - 0.000000f, - -0.181400f, - -0.975900f, - 0.121200f, - 0.093700f, - 0.069000f, - -0.147499f, - -0.473826f, - 0.061095f, - 0.000000f, - -0.297800f, - -0.946600f, - 0.123300f, - 0.062500f, - 0.103400f, - -0.099303f, - -0.488310f, - 0.041132f, - 0.000000f, - -0.201600f, - -0.975900f, - 0.083500f, - 0.062500f, - 0.069000f, - -0.415125f, - 0.027069f, - 0.277377f, - 0.000000f, - -0.830300f, - 0.054000f, - 0.554700f, - 0.093700f, - 0.517200f, - -0.410258f, - 0.080891f, - 0.274125f, - 0.000000f, - -0.820600f, - 0.161200f, - 0.548300f, - 0.093700f, - 0.551700f, - -0.455854f, - 0.080891f, - 0.188820f, - 0.000000f, - -0.911800f, - 0.161200f, - 0.377700f, - 0.062500f, - 0.551700f, - -0.415125f, - 0.027069f, - 0.277377f, - 0.000000f, - -0.830300f, - 0.054000f, - 0.554700f, - 0.093700f, - 0.517200f, - -0.455854f, - 0.080891f, - 0.188820f, - 0.000000f, - -0.911800f, - 0.161200f, - 0.377700f, - 0.062500f, - 0.551700f, - -0.461262f, - 0.027069f, - 0.191060f, - 0.000000f, - -0.922500f, - 0.054000f, - 0.382100f, - 0.062500f, - 0.517200f, - -0.044949f, - 0.497069f, - 0.030034f, - 0.000000f, - -0.092700f, - 0.993700f, - 0.061900f, - 0.479800f, - 0.962300f, - -0.000000f, - 0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - 1.000000f, - 0.000000f, - 0.482000f, - 0.960300f, - -0.049945f, - 0.497069f, - 0.020688f, - 0.000000f, - -0.103000f, - 0.993700f, - 0.042600f, - 0.481700f, - 0.962300f, - -0.044949f, - -0.497069f, - 0.030034f, - 0.000000f, - -0.092700f, - -0.993700f, - 0.061900f, - 0.093700f, - 0.034500f, - -0.089371f, - -0.488310f, - 0.059715f, - 0.000000f, - -0.181400f, - -0.975900f, - 0.121200f, - 0.093700f, - 0.069000f, - -0.099303f, - -0.488310f, - 0.041132f, - 0.000000f, - -0.201600f, - -0.975900f, - 0.083500f, - 0.062500f, - 0.069000f, - -0.044949f, - -0.497069f, - 0.030034f, - 0.000000f, - -0.092700f, - -0.993700f, - 0.061900f, - 0.093700f, - 0.034500f, - -0.099303f, - -0.488310f, - 0.041132f, - 0.000000f, - -0.201600f, - -0.975900f, - 0.083500f, - 0.062500f, - 0.069000f, - -0.049945f, - -0.497069f, - 0.020688f, - 0.000000f, - -0.103000f, - -0.993700f, - 0.042600f, - 0.062500f, - 0.034500f, - -0.415125f, - -0.027069f, - 0.277377f, - 0.000000f, - -0.830300f, - -0.054000f, - 0.554700f, - 0.093700f, - 0.482800f, - -0.415125f, - 0.027069f, - 0.277377f, - 0.000000f, - -0.830300f, - 0.054000f, - 0.554700f, - 0.093700f, - 0.517200f, - -0.461262f, - 0.027069f, - 0.191060f, - 0.000000f, - -0.922500f, - 0.054000f, - 0.382100f, - 0.062500f, - 0.517200f, - -0.415125f, - -0.027069f, - 0.277377f, - 0.000000f, - -0.830300f, - -0.054000f, - 0.554700f, - 0.093700f, - 0.482800f, - -0.461262f, - 0.027069f, - 0.191060f, - 0.000000f, - -0.922500f, - 0.054000f, - 0.382100f, - 0.062500f, - 0.517200f, - -0.461262f, - -0.027069f, - 0.191060f, - 0.000000f, - -0.922500f, - -0.054000f, - 0.382100f, - 0.062500f, - 0.482800f, - -0.089370f, - 0.488310f, - 0.059715f, - 0.000000f, - -0.181400f, - 0.975900f, - 0.121200f, - 0.093700f, - 0.931000f, - -0.044949f, - 0.497069f, - 0.030034f, - 0.000000f, - -0.092700f, - 0.993700f, - 0.061900f, - 0.093700f, - 0.965500f, - -0.049945f, - 0.497069f, - 0.020688f, - 0.000000f, - -0.103000f, - 0.993700f, - 0.042600f, - 0.062500f, - 0.965500f, - -0.089370f, - 0.488310f, - 0.059715f, - 0.000000f, - -0.181400f, - 0.975900f, - 0.121200f, - 0.093700f, - 0.931000f, - -0.049945f, - 0.497069f, - 0.020688f, - 0.000000f, - -0.103000f, - 0.993700f, - 0.042600f, - 0.062500f, - 0.965500f, - -0.099303f, - 0.488310f, - 0.041132f, - 0.000000f, - -0.201600f, - 0.975900f, - 0.083500f, - 0.062500f, - 0.931000f, - -0.000000f, - -0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - -1.000000f, - 0.000000f, - 0.411700f, - 0.051000f, - -0.044949f, - -0.497069f, - 0.030034f, - 0.000000f, - -0.092700f, - -0.993700f, - 0.061900f, - 0.418200f, - 0.053800f, - -0.049945f, - -0.497069f, - 0.020688f, - 0.000000f, - -0.103000f, - -0.993700f, - 0.042600f, - 0.415600f, - 0.053800f, - -0.410258f, - -0.080891f, - 0.274125f, - 0.000000f, - -0.820600f, - -0.161200f, - 0.548300f, - 0.093700f, - 0.448300f, - -0.415125f, - -0.027069f, - 0.277377f, - 0.000000f, - -0.830300f, - -0.054000f, - 0.554700f, - 0.093700f, - 0.482800f, - -0.461262f, - -0.027069f, - 0.191060f, - 0.000000f, - -0.922500f, - -0.054000f, - 0.382100f, - 0.062500f, - 0.482800f, - -0.410258f, - -0.080891f, - 0.274125f, - 0.000000f, - -0.820600f, - -0.161200f, - 0.548300f, - 0.093700f, - 0.448300f, - -0.461262f, - -0.027069f, - 0.191060f, - 0.000000f, - -0.922500f, - -0.054000f, - 0.382100f, - 0.062500f, - 0.482800f, - -0.455854f, - -0.080891f, - 0.188820f, - 0.000000f, - -0.911800f, - -0.161200f, - 0.377700f, - 0.062500f, - 0.448300f, - -0.132745f, - 0.473826f, - 0.088697f, - 0.000000f, - -0.268000f, - 0.946600f, - 0.179100f, - 0.093700f, - 0.896600f, - -0.089370f, - 0.488310f, - 0.059715f, - 0.000000f, - -0.181400f, - 0.975900f, - 0.121200f, - 0.093700f, - 0.931000f, - -0.099303f, - 0.488310f, - 0.041132f, - 0.000000f, - -0.201600f, - 0.975900f, - 0.083500f, - 0.062500f, - 0.931000f, - -0.132745f, - 0.473826f, - 0.088697f, - 0.000000f, - -0.268000f, - 0.946600f, - 0.179100f, - 0.093700f, - 0.896600f, - -0.099303f, - 0.488310f, - 0.041132f, - 0.000000f, - -0.201600f, - 0.975900f, - 0.083500f, - 0.062500f, - 0.931000f, - -0.147498f, - 0.473826f, - 0.061095f, - 0.000000f, - -0.297800f, - 0.946600f, - 0.123300f, - 0.062500f, - 0.896600f, - -0.400581f, - -0.133764f, - 0.267659f, - 0.000000f, - -0.801400f, - -0.266600f, - 0.535400f, - 0.093700f, - 0.413800f, - -0.410258f, - -0.080891f, - 0.274125f, - 0.000000f, - -0.820600f, - -0.161200f, - 0.548300f, - 0.093700f, - 0.448300f, - -0.455854f, - -0.080891f, - 0.188820f, - 0.000000f, - -0.911800f, - -0.161200f, - 0.377700f, - 0.062500f, - 0.448300f, - -0.400581f, - -0.133764f, - 0.267659f, - 0.000000f, - -0.801400f, - -0.266600f, - 0.535400f, - 0.093700f, - 0.413800f, - -0.455854f, - -0.080891f, - 0.188820f, - 0.000000f, - -0.911800f, - -0.161200f, - 0.377700f, - 0.062500f, - 0.448300f, - -0.445102f, - -0.133764f, - 0.184367f, - 0.000000f, - -0.890400f, - -0.266600f, - 0.368800f, - 0.062500f, - 0.413800f, - -0.174562f, - 0.453788f, - 0.116638f, - 0.000000f, - -0.351400f, - 0.906300f, - 0.234800f, - 0.093700f, - 0.862100f, - -0.132745f, - 0.473826f, - 0.088697f, - 0.000000f, - -0.268000f, - 0.946600f, - 0.179100f, - 0.093700f, - 0.896600f, - -0.147498f, - 0.473826f, - 0.061095f, - 0.000000f, - -0.297800f, - 0.946600f, - 0.123300f, - 0.062500f, - 0.896600f, - -0.174562f, - 0.453788f, - 0.116638f, - 0.000000f, - -0.351400f, - 0.906300f, - 0.234800f, - 0.093700f, - 0.862100f, - -0.147498f, - 0.473826f, - 0.061095f, - 0.000000f, - -0.297800f, - 0.946600f, - 0.123300f, - 0.062500f, - 0.896600f, - -0.193963f, - 0.453788f, - 0.080342f, - 0.000000f, - -0.390500f, - 0.906300f, - 0.161700f, - 0.062500f, - 0.862100f, - -0.386208f, - -0.185069f, - 0.258056f, - 0.000000f, - -0.772800f, - -0.369000f, - 0.516300f, - 0.093700f, - 0.379300f, - -0.400581f, - -0.133764f, - 0.267659f, - 0.000000f, - -0.801400f, - -0.266600f, - 0.535400f, - 0.093700f, - 0.413800f, - -0.445102f, - -0.133764f, - 0.184367f, - 0.000000f, - -0.890400f, - -0.266600f, - 0.368800f, - 0.062500f, - 0.413800f, - -0.386208f, - -0.185069f, - 0.258056f, - 0.000000f, - -0.772800f, - -0.369000f, - 0.516300f, - 0.093700f, - 0.379300f, - -0.445102f, - -0.133764f, - 0.184367f, - 0.000000f, - -0.890400f, - -0.266600f, - 0.368800f, - 0.062500f, - 0.413800f, - -0.429131f, - -0.185069f, - 0.177751f, - 0.000000f, - -0.858700f, - -0.369000f, - 0.355700f, - 0.062500f, - 0.379300f, - -0.214334f, - 0.428429f, - 0.143213f, - 0.000000f, - -0.430700f, - 0.855300f, - 0.287800f, - 0.093700f, - 0.827600f, - -0.174562f, - 0.453788f, - 0.116638f, - 0.000000f, - -0.351400f, - 0.906300f, - 0.234800f, - 0.093700f, - 0.862100f, - -0.193963f, - 0.453788f, - 0.080342f, - 0.000000f, - -0.390500f, - 0.906300f, - 0.161700f, - 0.062500f, - 0.862100f, - -0.214334f, - 0.428429f, - 0.143213f, - 0.000000f, - -0.430700f, - 0.855300f, - 0.287800f, - 0.093700f, - 0.827600f, - -0.193963f, - 0.453788f, - 0.080342f, - 0.000000f, - -0.390500f, - 0.906300f, - 0.161700f, - 0.062500f, - 0.862100f, - -0.238155f, - 0.428429f, - 0.098646f, - 0.000000f, - -0.478600f, - 0.855300f, - 0.198200f, - 0.062500f, - 0.827600f, - -0.367307f, - -0.234204f, - 0.245426f, - 0.000000f, - -0.735200f, - -0.467000f, - 0.491300f, - 0.093700f, - 0.344800f, - -0.386208f, - -0.185069f, - 0.258056f, - 0.000000f, - -0.772800f, - -0.369000f, - 0.516300f, - 0.093700f, - 0.379300f, - -0.429131f, - -0.185069f, - 0.177751f, - 0.000000f, - -0.858700f, - -0.369000f, - 0.355700f, - 0.062500f, - 0.379300f, - -0.367307f, - -0.234204f, - 0.245426f, - 0.000000f, - -0.735200f, - -0.467000f, - 0.491300f, - 0.093700f, - 0.344800f, - -0.429131f, - -0.185069f, - 0.177751f, - 0.000000f, - -0.858700f, - -0.369000f, - 0.355700f, - 0.062500f, - 0.379300f, - -0.408129f, - -0.234204f, - 0.169052f, - 0.000000f, - -0.816900f, - -0.467000f, - 0.338400f, - 0.062500f, - 0.344800f, - -0.251592f, - 0.398046f, - 0.168108f, - 0.000000f, - -0.505000f, - 0.794500f, - 0.337400f, - 0.093700f, - 0.793100f, - -0.214334f, - 0.428429f, - 0.143213f, - 0.000000f, - -0.430700f, - 0.855300f, - 0.287800f, - 0.093700f, - 0.827600f, - -0.238155f, - 0.428429f, - 0.098646f, - 0.000000f, - -0.478600f, - 0.855300f, - 0.198200f, - 0.062500f, - 0.827600f, - -0.251592f, - 0.398046f, - 0.168108f, - 0.000000f, - -0.505000f, - 0.794500f, - 0.337400f, - 0.093700f, - 0.793100f, - -0.238155f, - 0.428429f, - 0.098646f, - 0.000000f, - -0.478600f, - 0.855300f, - 0.198200f, - 0.062500f, - 0.827600f, - -0.279554f, - 0.398046f, - 0.115795f, - 0.000000f, - -0.561100f, - 0.794500f, - 0.232400f, - 0.062500f, - 0.793100f, - -0.344099f, - -0.280594f, - 0.229919f, - 0.000000f, - -0.689100f, - -0.559600f, - 0.460400f, - 0.093700f, - 0.310300f, - -0.367307f, - -0.234204f, - 0.245426f, - 0.000000f, - -0.735200f, - -0.467000f, - 0.491300f, - 0.093700f, - 0.344800f, - -0.408129f, - -0.234204f, - 0.169052f, - 0.000000f, - -0.816900f, - -0.467000f, - 0.338400f, - 0.062500f, - 0.344800f, - -0.344099f, - -0.280594f, - 0.229919f, - 0.000000f, - -0.689100f, - -0.559600f, - 0.460400f, - 0.093700f, - 0.310300f, - -0.408129f, - -0.234204f, - 0.169052f, - 0.000000f, - -0.816900f, - -0.467000f, - 0.338400f, - 0.062500f, - 0.344800f, - -0.382342f, - -0.280594f, - 0.158371f, - 0.000000f, - -0.765600f, - -0.559600f, - 0.317100f, - 0.062500f, - 0.310300f, - -0.285901f, - 0.362998f, - 0.191032f, - 0.000000f, - -0.573300f, - 0.724300f, - 0.383000f, - 0.093700f, - 0.758600f, - -0.251592f, - 0.398046f, - 0.168108f, - 0.000000f, - -0.505000f, - 0.794500f, - 0.337400f, - 0.093700f, - 0.793100f, - -0.279554f, - 0.398046f, - 0.115795f, - 0.000000f, - -0.561100f, - 0.794500f, - 0.232400f, - 0.062500f, - 0.793100f, - -0.285901f, - 0.362998f, - 0.191032f, - 0.000000f, - -0.573300f, - 0.724300f, - 0.383000f, - 0.093700f, - 0.758600f, - -0.279554f, - 0.398046f, - 0.115795f, - 0.000000f, - -0.561100f, - 0.794500f, - 0.232400f, - 0.062500f, - 0.793100f, - -0.317676f, - 0.362998f, - 0.131585f, - 0.000000f, - -0.637000f, - 0.724300f, - 0.263800f, - 0.062500f, - 0.758600f, - -0.316857f, - -0.323693f, - 0.211717f, - 0.000000f, - -0.634900f, - -0.645700f, - 0.424200f, - 0.093700f, - 0.275900f, - -0.344099f, - -0.280594f, - 0.229919f, - 0.000000f, - -0.689100f, - -0.559600f, - 0.460400f, - 0.093700f, - 0.310300f, - -0.382342f, - -0.280594f, - 0.158371f, - 0.000000f, - -0.765600f, - -0.559600f, - 0.317100f, - 0.062500f, - 0.310300f, - -0.316857f, - -0.323693f, - 0.211717f, - 0.000000f, - -0.634900f, - -0.645700f, - 0.424200f, - 0.093700f, - 0.275900f, - -0.382342f, - -0.280594f, - 0.158371f, - 0.000000f, - -0.765600f, - -0.559600f, - 0.317100f, - 0.062500f, - 0.310300f, - -0.352073f, - -0.323693f, - 0.145833f, - 0.000000f, - -0.705400f, - -0.645700f, - 0.292200f, - 0.062500f, - 0.275900f, - -0.316857f, - 0.323693f, - 0.211717f, - 0.000000f, - -0.634900f, - 0.645700f, - 0.424200f, - 0.093700f, - 0.724100f, - -0.285901f, - 0.362998f, - 0.191032f, - 0.000000f, - -0.573300f, - 0.724300f, - 0.383000f, - 0.093700f, - 0.758600f, - -0.317676f, - 0.362998f, - 0.131585f, - 0.000000f, - -0.637000f, - 0.724300f, - 0.263800f, - 0.062500f, - 0.758600f, - -0.316857f, - 0.323693f, - 0.211717f, - 0.000000f, - -0.634900f, - 0.645700f, - 0.424200f, - 0.093700f, - 0.724100f, - -0.317676f, - 0.362998f, - 0.131585f, - 0.000000f, - -0.637000f, - 0.724300f, - 0.263800f, - 0.062500f, - 0.758600f, - -0.352073f, - 0.323693f, - 0.145833f, - 0.000000f, - -0.705400f, - 0.645700f, - 0.292200f, - 0.062500f, - 0.724100f, - -0.445102f, - -0.133764f, - 0.184367f, - 0.000000f, - -0.890400f, - -0.266600f, - 0.368800f, - 0.062500f, - 0.413800f, - -0.455854f, - -0.080891f, - 0.188820f, - 0.000000f, - -0.911800f, - -0.161200f, - 0.377700f, - 0.062500f, - 0.448300f, - -0.483932f, - -0.080891f, - 0.096260f, - 0.000000f, - -0.967900f, - -0.161200f, - 0.192500f, - 0.031200f, - 0.448300f, - -0.445102f, - -0.133764f, - 0.184367f, - 0.000000f, - -0.890400f, - -0.266600f, - 0.368800f, - 0.062500f, - 0.413800f, - -0.483932f, - -0.080891f, - 0.096260f, - 0.000000f, - -0.967900f, - -0.161200f, - 0.192500f, - 0.031200f, - 0.448300f, - -0.472517f, - -0.133764f, - 0.093989f, - 0.000000f, - -0.945200f, - -0.266600f, - 0.188000f, - 0.031200f, - 0.413800f, - -0.193963f, - 0.453788f, - 0.080342f, - 0.000000f, - -0.390500f, - 0.906300f, - 0.161700f, - 0.062500f, - 0.862100f, - -0.147498f, - 0.473826f, - 0.061095f, - 0.000000f, - -0.297800f, - 0.946600f, - 0.123300f, - 0.062500f, - 0.896600f, - -0.156583f, - 0.473826f, - 0.031146f, - 0.000000f, - -0.316100f, - 0.946600f, - 0.062900f, - 0.031200f, - 0.896600f, - -0.193963f, - 0.453788f, - 0.080342f, - 0.000000f, - -0.390500f, - 0.906300f, - 0.161700f, - 0.062500f, - 0.862100f, - -0.156583f, - 0.473826f, - 0.031146f, - 0.000000f, - -0.316100f, - 0.946600f, - 0.062900f, - 0.031200f, - 0.896600f, - -0.205911f, - 0.453788f, - 0.040958f, - 0.000000f, - -0.414500f, - 0.906300f, - 0.082400f, - 0.031200f, - 0.862100f, - -0.429131f, - -0.185069f, - 0.177751f, - 0.000000f, - -0.858700f, - -0.369000f, - 0.355700f, - 0.062500f, - 0.379300f, - -0.445102f, - -0.133764f, - 0.184367f, - 0.000000f, - -0.890400f, - -0.266600f, - 0.368800f, - 0.062500f, - 0.413800f, - -0.472517f, - -0.133764f, - 0.093989f, - 0.000000f, - -0.945200f, - -0.266600f, - 0.188000f, - 0.031200f, - 0.413800f, - -0.429131f, - -0.185069f, - 0.177751f, - 0.000000f, - -0.858700f, - -0.369000f, - 0.355700f, - 0.062500f, - 0.379300f, - -0.472517f, - -0.133764f, - 0.093989f, - 0.000000f, - -0.945200f, - -0.266600f, - 0.188000f, - 0.031200f, - 0.413800f, - -0.455563f, - -0.185069f, - 0.090617f, - 0.000000f, - -0.911600f, - -0.369000f, - 0.181300f, - 0.031200f, - 0.379300f, - -0.238155f, - 0.428429f, - 0.098646f, - 0.000000f, - -0.478600f, - 0.855300f, - 0.198200f, - 0.062500f, - 0.827600f, - -0.193963f, - 0.453788f, - 0.080342f, - 0.000000f, - -0.390500f, - 0.906300f, - 0.161700f, - 0.062500f, - 0.862100f, - -0.205911f, - 0.453788f, - 0.040958f, - 0.000000f, - -0.414500f, - 0.906300f, - 0.082400f, - 0.031200f, - 0.862100f, - -0.238155f, - 0.428429f, - 0.098646f, - 0.000000f, - -0.478600f, - 0.855300f, - 0.198200f, - 0.062500f, - 0.827600f, - -0.205911f, - 0.453788f, - 0.040958f, - 0.000000f, - -0.414500f, - 0.906300f, - 0.082400f, - 0.031200f, - 0.862100f, - -0.252824f, - 0.428429f, - 0.050290f, - 0.000000f, - -0.508100f, - 0.855300f, - 0.101000f, - 0.031200f, - 0.827600f, - -0.408129f, - -0.234204f, - 0.169052f, - 0.000000f, - -0.816900f, - -0.467000f, - 0.338400f, - 0.062500f, - 0.344800f, - -0.429131f, - -0.185069f, - 0.177751f, - 0.000000f, - -0.858700f, - -0.369000f, - 0.355700f, - 0.062500f, - 0.379300f, - -0.455563f, - -0.185069f, - 0.090617f, - 0.000000f, - -0.911600f, - -0.369000f, - 0.181300f, - 0.031200f, - 0.379300f, - -0.408129f, - -0.234204f, - 0.169052f, - 0.000000f, - -0.816900f, - -0.467000f, - 0.338400f, - 0.062500f, - 0.344800f, - -0.455563f, - -0.185069f, - 0.090617f, - 0.000000f, - -0.911600f, - -0.369000f, - 0.181300f, - 0.031200f, - 0.379300f, - -0.433268f, - -0.234204f, - 0.086182f, - 0.000000f, - -0.867200f, - -0.467000f, - 0.172500f, - 0.031200f, - 0.344800f, - -0.279554f, - 0.398046f, - 0.115795f, - 0.000000f, - -0.561100f, - 0.794500f, - 0.232400f, - 0.062500f, - 0.793100f, - -0.238155f, - 0.428429f, - 0.098646f, - 0.000000f, - -0.478600f, - 0.855300f, - 0.198200f, - 0.062500f, - 0.827600f, - -0.252824f, - 0.428429f, - 0.050290f, - 0.000000f, - -0.508100f, - 0.855300f, - 0.101000f, - 0.031200f, - 0.827600f, - -0.279554f, - 0.398046f, - 0.115795f, - 0.000000f, - -0.561100f, - 0.794500f, - 0.232400f, - 0.062500f, - 0.793100f, - -0.252824f, - 0.428429f, - 0.050290f, - 0.000000f, - -0.508100f, - 0.855300f, - 0.101000f, - 0.031200f, - 0.827600f, - -0.296773f, - 0.398046f, - 0.059032f, - 0.000000f, - -0.595600f, - 0.794500f, - 0.118500f, - 0.031200f, - 0.793100f, - -0.382342f, - -0.280594f, - 0.158371f, - 0.000000f, - -0.765600f, - -0.559600f, - 0.317100f, - 0.062500f, - 0.310300f, - -0.408129f, - -0.234204f, - 0.169052f, - 0.000000f, - -0.816900f, - -0.467000f, - 0.338400f, - 0.062500f, - 0.344800f, - -0.433268f, - -0.234204f, - 0.086182f, - 0.000000f, - -0.867200f, - -0.467000f, - 0.172500f, - 0.031200f, - 0.344800f, - -0.382342f, - -0.280594f, - 0.158371f, - 0.000000f, - -0.765600f, - -0.559600f, - 0.317100f, - 0.062500f, - 0.310300f, - -0.433268f, - -0.234204f, - 0.086182f, - 0.000000f, - -0.867200f, - -0.467000f, - 0.172500f, - 0.031200f, - 0.344800f, - -0.405892f, - -0.280594f, - 0.080737f, - 0.000000f, - -0.812800f, - -0.559600f, - 0.161700f, - 0.031200f, - 0.310300f, - -0.317676f, - 0.362998f, - 0.131585f, - 0.000000f, - -0.637000f, - 0.724300f, - 0.263800f, - 0.062500f, - 0.758600f, - -0.279554f, - 0.398046f, - 0.115795f, - 0.000000f, - -0.561100f, - 0.794500f, - 0.232400f, - 0.062500f, - 0.793100f, - -0.296773f, - 0.398046f, - 0.059032f, - 0.000000f, - -0.595600f, - 0.794500f, - 0.118500f, - 0.031200f, - 0.793100f, - -0.317676f, - 0.362998f, - 0.131585f, - 0.000000f, - -0.637000f, - 0.724300f, - 0.263800f, - 0.062500f, - 0.758600f, - -0.296773f, - 0.398046f, - 0.059032f, - 0.000000f, - -0.595600f, - 0.794500f, - 0.118500f, - 0.031200f, - 0.793100f, - -0.337243f, - 0.362998f, - 0.067082f, - 0.000000f, - -0.676200f, - 0.724300f, - 0.134500f, - 0.031200f, - 0.758600f, - -0.352073f, - -0.323693f, - 0.145833f, - 0.000000f, - -0.705400f, - -0.645700f, - 0.292200f, - 0.062500f, - 0.275900f, - -0.382342f, - -0.280594f, - 0.158371f, - 0.000000f, - -0.765600f, - -0.559600f, - 0.317100f, - 0.062500f, - 0.310300f, - -0.405892f, - -0.280594f, - 0.080737f, - 0.000000f, - -0.812800f, - -0.559600f, - 0.161700f, - 0.031200f, - 0.310300f, - -0.352073f, - -0.323693f, - 0.145833f, - 0.000000f, - -0.705400f, - -0.645700f, - 0.292200f, - 0.062500f, - 0.275900f, - -0.405892f, - -0.280594f, - 0.080737f, - 0.000000f, - -0.812800f, - -0.559600f, - 0.161700f, - 0.031200f, - 0.310300f, - -0.373758f, - -0.323693f, - 0.074345f, - 0.000000f, - -0.748900f, - -0.645700f, - 0.149000f, - 0.031200f, - 0.275900f, - -0.352073f, - 0.323693f, - 0.145833f, - 0.000000f, - -0.705400f, - 0.645700f, - 0.292200f, - 0.062500f, - 0.724100f, - -0.317676f, - 0.362998f, - 0.131585f, - 0.000000f, - -0.637000f, - 0.724300f, - 0.263800f, - 0.062500f, - 0.758600f, - -0.337243f, - 0.362998f, - 0.067082f, - 0.000000f, - -0.676200f, - 0.724300f, - 0.134500f, - 0.031200f, - 0.758600f, - -0.352073f, - 0.323693f, - 0.145833f, - 0.000000f, - -0.705400f, - 0.645700f, - 0.292200f, - 0.062500f, - 0.724100f, - -0.337243f, - 0.362998f, - 0.067082f, - 0.000000f, - -0.676200f, - 0.724300f, - 0.134500f, - 0.031200f, - 0.758600f, - -0.373758f, - 0.323693f, - 0.074345f, - 0.000000f, - -0.748900f, - 0.645700f, - 0.149000f, - 0.031200f, - 0.724100f, - -0.317676f, - -0.362998f, - 0.131585f, - 0.000000f, - -0.637000f, - -0.724300f, - 0.263800f, - 0.062500f, - 0.241400f, - -0.352073f, - -0.323693f, - 0.145833f, - 0.000000f, - -0.705400f, - -0.645700f, - 0.292200f, - 0.062500f, - 0.275900f, - -0.373758f, - -0.323693f, - 0.074345f, - 0.000000f, - -0.748900f, - -0.645700f, - 0.149000f, - 0.031200f, - 0.275900f, - -0.317676f, - -0.362998f, - 0.131585f, - 0.000000f, - -0.637000f, - -0.724300f, - 0.263800f, - 0.062500f, - 0.241400f, - -0.373758f, - -0.323693f, - 0.074345f, - 0.000000f, - -0.748900f, - -0.645700f, - 0.149000f, - 0.031200f, - 0.275900f, - -0.337243f, - -0.362998f, - 0.067082f, - 0.000000f, - -0.676200f, - -0.724300f, - 0.134500f, - 0.031200f, - 0.241400f, - -0.382342f, - 0.280594f, - 0.158371f, - 0.000000f, - -0.765600f, - 0.559600f, - 0.317100f, - 0.062500f, - 0.689700f, - -0.352073f, - 0.323693f, - 0.145833f, - 0.000000f, - -0.705400f, - 0.645700f, - 0.292200f, - 0.062500f, - 0.724100f, - -0.373758f, - 0.323693f, - 0.074345f, - 0.000000f, - -0.748900f, - 0.645700f, - 0.149000f, - 0.031200f, - 0.724100f, - -0.382342f, - 0.280594f, - 0.158371f, - 0.000000f, - -0.765600f, - 0.559600f, - 0.317100f, - 0.062500f, - 0.689700f, - -0.373758f, - 0.323693f, - 0.074345f, - 0.000000f, - -0.748900f, - 0.645700f, - 0.149000f, - 0.031200f, - 0.724100f, - -0.405892f, - 0.280594f, - 0.080737f, - 0.000000f, - -0.812800f, - 0.559600f, - 0.161700f, - 0.031200f, - 0.689700f, - -0.279554f, - -0.398046f, - 0.115795f, - 0.000000f, - -0.561100f, - -0.794500f, - 0.232400f, - 0.062500f, - 0.206900f, - -0.317676f, - -0.362998f, - 0.131585f, - 0.000000f, - -0.637000f, - -0.724300f, - 0.263800f, - 0.062500f, - 0.241400f, - -0.337243f, - -0.362998f, - 0.067082f, - 0.000000f, - -0.676200f, - -0.724300f, - 0.134500f, - 0.031200f, - 0.241400f, - -0.279554f, - -0.398046f, - 0.115795f, - 0.000000f, - -0.561100f, - -0.794500f, - 0.232400f, - 0.062500f, - 0.206900f, - -0.337243f, - -0.362998f, - 0.067082f, - 0.000000f, - -0.676200f, - -0.724300f, - 0.134500f, - 0.031200f, - 0.241400f, - -0.296773f, - -0.398046f, - 0.059032f, - 0.000000f, - -0.595600f, - -0.794500f, - 0.118500f, - 0.031200f, - 0.206900f, - -0.408129f, - 0.234204f, - 0.169052f, - 0.000000f, - -0.816900f, - 0.467000f, - 0.338400f, - 0.062500f, - 0.655200f, - -0.382342f, - 0.280594f, - 0.158371f, - 0.000000f, - -0.765600f, - 0.559600f, - 0.317100f, - 0.062500f, - 0.689700f, - -0.405892f, - 0.280594f, - 0.080737f, - 0.000000f, - -0.812800f, - 0.559600f, - 0.161700f, - 0.031200f, - 0.689700f, - -0.408129f, - 0.234204f, - 0.169052f, - 0.000000f, - -0.816900f, - 0.467000f, - 0.338400f, - 0.062500f, - 0.655200f, - -0.405892f, - 0.280594f, - 0.080737f, - 0.000000f, - -0.812800f, - 0.559600f, - 0.161700f, - 0.031200f, - 0.689700f, - -0.433268f, - 0.234204f, - 0.086182f, - 0.000000f, - -0.867200f, - 0.467000f, - 0.172500f, - 0.031200f, - 0.655200f, - -0.238155f, - -0.428429f, - 0.098646f, - 0.000000f, - -0.478600f, - -0.855300f, - 0.198200f, - 0.062500f, - 0.172400f, - -0.279554f, - -0.398046f, - 0.115795f, - 0.000000f, - -0.561100f, - -0.794500f, - 0.232400f, - 0.062500f, - 0.206900f, - -0.296773f, - -0.398046f, - 0.059032f, - 0.000000f, - -0.595600f, - -0.794500f, - 0.118500f, - 0.031200f, - 0.206900f, - -0.238155f, - -0.428429f, - 0.098646f, - 0.000000f, - -0.478600f, - -0.855300f, - 0.198200f, - 0.062500f, - 0.172400f, - -0.296773f, - -0.398046f, - 0.059032f, - 0.000000f, - -0.595600f, - -0.794500f, - 0.118500f, - 0.031200f, - 0.206900f, - -0.252824f, - -0.428429f, - 0.050290f, - 0.000000f, - -0.508100f, - -0.855300f, - 0.101000f, - 0.031200f, - 0.172400f, - -0.429131f, - 0.185069f, - 0.177751f, - 0.000000f, - -0.858700f, - 0.369000f, - 0.355700f, - 0.062500f, - 0.620700f, - -0.408129f, - 0.234204f, - 0.169052f, - 0.000000f, - -0.816900f, - 0.467000f, - 0.338400f, - 0.062500f, - 0.655200f, - -0.433268f, - 0.234204f, - 0.086182f, - 0.000000f, - -0.867200f, - 0.467000f, - 0.172500f, - 0.031200f, - 0.655200f, - -0.429131f, - 0.185069f, - 0.177751f, - 0.000000f, - -0.858700f, - 0.369000f, - 0.355700f, - 0.062500f, - 0.620700f, - -0.433268f, - 0.234204f, - 0.086182f, - 0.000000f, - -0.867200f, - 0.467000f, - 0.172500f, - 0.031200f, - 0.655200f, - -0.455563f, - 0.185069f, - 0.090617f, - 0.000000f, - -0.911600f, - 0.369000f, - 0.181300f, - 0.031200f, - 0.620700f, - -0.193963f, - -0.453788f, - 0.080342f, - 0.000000f, - -0.390500f, - -0.906300f, - 0.161700f, - 0.062500f, - 0.137900f, - -0.238155f, - -0.428429f, - 0.098646f, - 0.000000f, - -0.478600f, - -0.855300f, - 0.198200f, - 0.062500f, - 0.172400f, - -0.252824f, - -0.428429f, - 0.050290f, - 0.000000f, - -0.508100f, - -0.855300f, - 0.101000f, - 0.031200f, - 0.172400f, - -0.193963f, - -0.453788f, - 0.080342f, - 0.000000f, - -0.390500f, - -0.906300f, - 0.161700f, - 0.062500f, - 0.137900f, - -0.252824f, - -0.428429f, - 0.050290f, - 0.000000f, - -0.508100f, - -0.855300f, - 0.101000f, - 0.031200f, - 0.172400f, - -0.205911f, - -0.453788f, - 0.040958f, - 0.000000f, - -0.414500f, - -0.906300f, - 0.082400f, - 0.031200f, - 0.137900f, - -0.445102f, - 0.133764f, - 0.184367f, - 0.000000f, - -0.890400f, - 0.266600f, - 0.368800f, - 0.062500f, - 0.586200f, - -0.429131f, - 0.185069f, - 0.177751f, - 0.000000f, - -0.858700f, - 0.369000f, - 0.355700f, - 0.062500f, - 0.620700f, - -0.455563f, - 0.185069f, - 0.090617f, - 0.000000f, - -0.911600f, - 0.369000f, - 0.181300f, - 0.031200f, - 0.620700f, - -0.445102f, - 0.133764f, - 0.184367f, - 0.000000f, - -0.890400f, - 0.266600f, - 0.368800f, - 0.062500f, - 0.586200f, - -0.455563f, - 0.185069f, - 0.090617f, - 0.000000f, - -0.911600f, - 0.369000f, - 0.181300f, - 0.031200f, - 0.620700f, - -0.472517f, - 0.133764f, - 0.093989f, - 0.000000f, - -0.945200f, - 0.266600f, - 0.188000f, - 0.031200f, - 0.586200f, - -0.147499f, - -0.473826f, - 0.061095f, - 0.000000f, - -0.297800f, - -0.946600f, - 0.123300f, - 0.062500f, - 0.103400f, - -0.193963f, - -0.453788f, - 0.080342f, - 0.000000f, - -0.390500f, - -0.906300f, - 0.161700f, - 0.062500f, - 0.137900f, - -0.205911f, - -0.453788f, - 0.040958f, - 0.000000f, - -0.414500f, - -0.906300f, - 0.082400f, - 0.031200f, - 0.137900f, - -0.147499f, - -0.473826f, - 0.061095f, - 0.000000f, - -0.297800f, - -0.946600f, - 0.123300f, - 0.062500f, - 0.103400f, - -0.205911f, - -0.453788f, - 0.040958f, - 0.000000f, - -0.414500f, - -0.906300f, - 0.082400f, - 0.031200f, - 0.137900f, - -0.156584f, - -0.473826f, - 0.031147f, - 0.000000f, - -0.316100f, - -0.946600f, - 0.062900f, - 0.031200f, - 0.103400f, - -0.455854f, - 0.080891f, - 0.188820f, - 0.000000f, - -0.911800f, - 0.161200f, - 0.377700f, - 0.062500f, - 0.551700f, - -0.445102f, - 0.133764f, - 0.184367f, - 0.000000f, - -0.890400f, - 0.266600f, - 0.368800f, - 0.062500f, - 0.586200f, - -0.472517f, - 0.133764f, - 0.093989f, - 0.000000f, - -0.945200f, - 0.266600f, - 0.188000f, - 0.031200f, - 0.586200f, - -0.455854f, - 0.080891f, - 0.188820f, - 0.000000f, - -0.911800f, - 0.161200f, - 0.377700f, - 0.062500f, - 0.551700f, - -0.472517f, - 0.133764f, - 0.093989f, - 0.000000f, - -0.945200f, - 0.266600f, - 0.188000f, - 0.031200f, - 0.586200f, - -0.483932f, - 0.080891f, - 0.096260f, - 0.000000f, - -0.967900f, - 0.161200f, - 0.192500f, - 0.031200f, - 0.551700f, - -0.099303f, - -0.488310f, - 0.041132f, - 0.000000f, - -0.201600f, - -0.975900f, - 0.083500f, - 0.062500f, - 0.069000f, - -0.147499f, - -0.473826f, - 0.061095f, - 0.000000f, - -0.297800f, - -0.946600f, - 0.123300f, - 0.062500f, - 0.103400f, - -0.156584f, - -0.473826f, - 0.031147f, - 0.000000f, - -0.316100f, - -0.946600f, - 0.062900f, - 0.031200f, - 0.103400f, - -0.099303f, - -0.488310f, - 0.041132f, - 0.000000f, - -0.201600f, - -0.975900f, - 0.083500f, - 0.062500f, - 0.069000f, - -0.156584f, - -0.473826f, - 0.031147f, - 0.000000f, - -0.316100f, - -0.946600f, - 0.062900f, - 0.031200f, - 0.103400f, - -0.105420f, - -0.488310f, - 0.020970f, - 0.000000f, - -0.214000f, - -0.975900f, - 0.042500f, - 0.031200f, - 0.069000f, - -0.461262f, - 0.027069f, - 0.191060f, - 0.000000f, - -0.922500f, - 0.054000f, - 0.382100f, - 0.062500f, - 0.517200f, - -0.455854f, - 0.080891f, - 0.188820f, - 0.000000f, - -0.911800f, - 0.161200f, - 0.377700f, - 0.062500f, - 0.551700f, - -0.483932f, - 0.080891f, - 0.096260f, - 0.000000f, - -0.967900f, - 0.161200f, - 0.192500f, - 0.031200f, - 0.551700f, - -0.461262f, - 0.027069f, - 0.191060f, - 0.000000f, - -0.922500f, - 0.054000f, - 0.382100f, - 0.062500f, - 0.517200f, - -0.483932f, - 0.080891f, - 0.096260f, - 0.000000f, - -0.967900f, - 0.161200f, - 0.192500f, - 0.031200f, - 0.551700f, - -0.489673f, - 0.027069f, - 0.097402f, - 0.000000f, - -0.979300f, - 0.054000f, - 0.194800f, - 0.031200f, - 0.517200f, - -0.049945f, - 0.497069f, - 0.020688f, - 0.000000f, - -0.103000f, - 0.993700f, - 0.042600f, - 0.481700f, - 0.962300f, - -0.000000f, - 0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - 1.000000f, - 0.000000f, - 0.482000f, - 0.960300f, - -0.053020f, - 0.497069f, - 0.010546f, - 0.000000f, - -0.109300f, - 0.993700f, - 0.021700f, - 0.483500f, - 0.962300f, - -0.049945f, - -0.497069f, - 0.020688f, - 0.000000f, - -0.103000f, - -0.993700f, - 0.042600f, - 0.062500f, - 0.034500f, - -0.099303f, - -0.488310f, - 0.041132f, - 0.000000f, - -0.201600f, - -0.975900f, - 0.083500f, - 0.062500f, - 0.069000f, - -0.105420f, - -0.488310f, - 0.020970f, - 0.000000f, - -0.214000f, - -0.975900f, - 0.042500f, - 0.031200f, - 0.069000f, - -0.049945f, - -0.497069f, - 0.020688f, - 0.000000f, - -0.103000f, - -0.993700f, - 0.042600f, - 0.062500f, - 0.034500f, - -0.105420f, - -0.488310f, - 0.020970f, - 0.000000f, - -0.214000f, - -0.975900f, - 0.042500f, - 0.031200f, - 0.069000f, - -0.053021f, - -0.497069f, - 0.010546f, - 0.000000f, - -0.109300f, - -0.993700f, - 0.021700f, - 0.031200f, - 0.034500f, - -0.461262f, - -0.027069f, - 0.191060f, - 0.000000f, - -0.922500f, - -0.054000f, - 0.382100f, - 0.062500f, - 0.482800f, - -0.461262f, - 0.027069f, - 0.191060f, - 0.000000f, - -0.922500f, - 0.054000f, - 0.382100f, - 0.062500f, - 0.517200f, - -0.489673f, - 0.027069f, - 0.097402f, - 0.000000f, - -0.979300f, - 0.054000f, - 0.194800f, - 0.031200f, - 0.517200f, - -0.461262f, - -0.027069f, - 0.191060f, - 0.000000f, - -0.922500f, - -0.054000f, - 0.382100f, - 0.062500f, - 0.482800f, - -0.489673f, - 0.027069f, - 0.097402f, - 0.000000f, - -0.979300f, - 0.054000f, - 0.194800f, - 0.031200f, - 0.517200f, - -0.489673f, - -0.027069f, - 0.097402f, - 0.000000f, - -0.979300f, - -0.054000f, - 0.194800f, - 0.031200f, - 0.482800f, - -0.099303f, - 0.488310f, - 0.041132f, - 0.000000f, - -0.201600f, - 0.975900f, - 0.083500f, - 0.062500f, - 0.931000f, - -0.049945f, - 0.497069f, - 0.020688f, - 0.000000f, - -0.103000f, - 0.993700f, - 0.042600f, - 0.062500f, - 0.965500f, - -0.053020f, - 0.497069f, - 0.010546f, - 0.000000f, - -0.109300f, - 0.993700f, - 0.021700f, - 0.031200f, - 0.965500f, - -0.099303f, - 0.488310f, - 0.041132f, - 0.000000f, - -0.201600f, - 0.975900f, - 0.083500f, - 0.062500f, - 0.931000f, - -0.053020f, - 0.497069f, - 0.010546f, - 0.000000f, - -0.109300f, - 0.993700f, - 0.021700f, - 0.031200f, - 0.965500f, - -0.105420f, - 0.488310f, - 0.020969f, - 0.000000f, - -0.214000f, - 0.975900f, - 0.042500f, - 0.031200f, - 0.931000f, - -0.000000f, - -0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - -1.000000f, - 0.000000f, - 0.411700f, - 0.051000f, - -0.049945f, - -0.497069f, - 0.020688f, - 0.000000f, - -0.103000f, - -0.993700f, - 0.042600f, - 0.415600f, - 0.053800f, - -0.053021f, - -0.497069f, - 0.010546f, - 0.000000f, - -0.109300f, - -0.993700f, - 0.021700f, - 0.413000f, - 0.053800f, - -0.455854f, - -0.080891f, - 0.188820f, - 0.000000f, - -0.911800f, - -0.161200f, - 0.377700f, - 0.062500f, - 0.448300f, - -0.461262f, - -0.027069f, - 0.191060f, - 0.000000f, - -0.922500f, - -0.054000f, - 0.382100f, - 0.062500f, - 0.482800f, - -0.489673f, - -0.027069f, - 0.097402f, - 0.000000f, - -0.979300f, - -0.054000f, - 0.194800f, - 0.031200f, - 0.482800f, - -0.455854f, - -0.080891f, - 0.188820f, - 0.000000f, - -0.911800f, - -0.161200f, - 0.377700f, - 0.062500f, - 0.448300f, - -0.489673f, - -0.027069f, - 0.097402f, - 0.000000f, - -0.979300f, - -0.054000f, - 0.194800f, - 0.031200f, - 0.482800f, - -0.483932f, - -0.080891f, - 0.096260f, - 0.000000f, - -0.967900f, - -0.161200f, - 0.192500f, - 0.031200f, - 0.448300f, - -0.147498f, - 0.473826f, - 0.061095f, - 0.000000f, - -0.297800f, - 0.946600f, - 0.123300f, - 0.062500f, - 0.896600f, - -0.099303f, - 0.488310f, - 0.041132f, - 0.000000f, - -0.201600f, - 0.975900f, - 0.083500f, - 0.062500f, - 0.931000f, - -0.105420f, - 0.488310f, - 0.020969f, - 0.000000f, - -0.214000f, - 0.975900f, - 0.042500f, - 0.031200f, - 0.931000f, - -0.147498f, - 0.473826f, - 0.061095f, - 0.000000f, - -0.297800f, - 0.946600f, - 0.123300f, - 0.062500f, - 0.896600f, - -0.105420f, - 0.488310f, - 0.020969f, - 0.000000f, - -0.214000f, - 0.975900f, - 0.042500f, - 0.031200f, - 0.931000f, - -0.156583f, - 0.473826f, - 0.031146f, - 0.000000f, - -0.316100f, - 0.946600f, - 0.062900f, - 0.031200f, - 0.896600f, - -0.205911f, - -0.453788f, - 0.040958f, - 0.000000f, - -0.414500f, - -0.906300f, - 0.082400f, - 0.031200f, - 0.137900f, - -0.252824f, - -0.428429f, - 0.050290f, - 0.000000f, - -0.508100f, - -0.855300f, - 0.101000f, - 0.031200f, - 0.172400f, - -0.257777f, - -0.428429f, - 0.000000f, - 0.000000f, - -0.518000f, - -0.855300f, - 0.000000f, - 0.000000f, - 0.172400f, - -0.205911f, - -0.453788f, - 0.040958f, - 0.000000f, - -0.414500f, - -0.906300f, - 0.082400f, - 0.031200f, - 0.137900f, - -0.257777f, - -0.428429f, - 0.000000f, - 0.000000f, - -0.518000f, - -0.855300f, - 0.000000f, - 0.000000f, - 0.172400f, - -0.209945f, - -0.453788f, - 0.000000f, - 0.000000f, - -0.422700f, - -0.906300f, - 0.000000f, - 0.000000f, - 0.137900f, - -0.472517f, - 0.133764f, - 0.093989f, - 0.000000f, - -0.945200f, - 0.266600f, - 0.188000f, - 0.031200f, - 0.586200f, - -0.455563f, - 0.185069f, - 0.090617f, - 0.000000f, - -0.911600f, - 0.369000f, - 0.181300f, - 0.031200f, - 0.620700f, - -0.464489f, - 0.185069f, - 0.000000f, - 0.000000f, - -0.929400f, - 0.369000f, - 0.000000f, - 0.000000f, - 0.620700f, - -0.472517f, - 0.133764f, - 0.093989f, - 0.000000f, - -0.945200f, - 0.266600f, - 0.188000f, - 0.031200f, - 0.586200f, - -0.464489f, - 0.185069f, - 0.000000f, - 0.000000f, - -0.929400f, - 0.369000f, - 0.000000f, - 0.000000f, - 0.620700f, - -0.481775f, - 0.133764f, - 0.000000f, - 0.000000f, - -0.963800f, - 0.266600f, - 0.000000f, - 0.000000f, - 0.586200f, - -0.156584f, - -0.473826f, - 0.031147f, - 0.000000f, - -0.316100f, - -0.946600f, - 0.062900f, - 0.031200f, - 0.103400f, - -0.205911f, - -0.453788f, - 0.040958f, - 0.000000f, - -0.414500f, - -0.906300f, - 0.082400f, - 0.031200f, - 0.137900f, - -0.209945f, - -0.453788f, - 0.000000f, - 0.000000f, - -0.422700f, - -0.906300f, - 0.000000f, - 0.000000f, - 0.137900f, - -0.156584f, - -0.473826f, - 0.031147f, - 0.000000f, - -0.316100f, - -0.946600f, - 0.062900f, - 0.031200f, - 0.103400f, - -0.209945f, - -0.453788f, - 0.000000f, - 0.000000f, - -0.422700f, - -0.906300f, - 0.000000f, - 0.000000f, - 0.137900f, - -0.159651f, - -0.473826f, - 0.000000f, - 0.000000f, - -0.322300f, - -0.946600f, - 0.000000f, - 0.000000f, - 0.103400f, - -0.483932f, - 0.080891f, - 0.096260f, - 0.000000f, - -0.967900f, - 0.161200f, - 0.192500f, - 0.031200f, - 0.551700f, - -0.472517f, - 0.133764f, - 0.093989f, - 0.000000f, - -0.945200f, - 0.266600f, - 0.188000f, - 0.031200f, - 0.586200f, - -0.481775f, - 0.133764f, - 0.000000f, - 0.000000f, - -0.963800f, - 0.266600f, - 0.000000f, - 0.000000f, - 0.586200f, - -0.483932f, - 0.080891f, - 0.096260f, - 0.000000f, - -0.967900f, - 0.161200f, - 0.192500f, - 0.031200f, - 0.551700f, - -0.481775f, - 0.133764f, - 0.000000f, - 0.000000f, - -0.963800f, - 0.266600f, - 0.000000f, - 0.000000f, - 0.586200f, - -0.493414f, - 0.080891f, - 0.000000f, - 0.000000f, - -0.986900f, - 0.161200f, - 0.000000f, - 0.000000f, - 0.551700f, - -0.105420f, - -0.488310f, - 0.020970f, - 0.000000f, - -0.214000f, - -0.975900f, - 0.042500f, - 0.031200f, - 0.069000f, - -0.156584f, - -0.473826f, - 0.031147f, - 0.000000f, - -0.316100f, - -0.946600f, - 0.062900f, - 0.031200f, - 0.103400f, - -0.159651f, - -0.473826f, - 0.000000f, - 0.000000f, - -0.322300f, - -0.946600f, - 0.000000f, - 0.000000f, - 0.103400f, - -0.105420f, - -0.488310f, - 0.020970f, - 0.000000f, - -0.214000f, - -0.975900f, - 0.042500f, - 0.031200f, - 0.069000f, - -0.159651f, - -0.473826f, - 0.000000f, - 0.000000f, - -0.322300f, - -0.946600f, - 0.000000f, - 0.000000f, - 0.103400f, - -0.107486f, - -0.488310f, - 0.000000f, - 0.000000f, - -0.218200f, - -0.975900f, - 0.000000f, - 0.000000f, - 0.069000f, - -0.489673f, - 0.027069f, - 0.097402f, - 0.000000f, - -0.979300f, - 0.054000f, - 0.194800f, - 0.031200f, - 0.517200f, - -0.483932f, - 0.080891f, - 0.096260f, - 0.000000f, - -0.967900f, - 0.161200f, - 0.192500f, - 0.031200f, - 0.551700f, - -0.493414f, - 0.080891f, - 0.000000f, - 0.000000f, - -0.986900f, - 0.161200f, - 0.000000f, - 0.000000f, - 0.551700f, - -0.489673f, - 0.027069f, - 0.097402f, - 0.000000f, - -0.979300f, - 0.054000f, - 0.194800f, - 0.031200f, - 0.517200f, - -0.493414f, - 0.080891f, - 0.000000f, - 0.000000f, - -0.986900f, - 0.161200f, - 0.000000f, - 0.000000f, - 0.551700f, - -0.499267f, - 0.027069f, - 0.000000f, - 0.000000f, - -0.998500f, - 0.054000f, - 0.000000f, - 0.000000f, - 0.517200f, - -0.053020f, - 0.497069f, - 0.010546f, - 0.000000f, - -0.109300f, - 0.993700f, - 0.021700f, - 0.425300f, - 0.962300f, - -0.000000f, - 0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - 1.000000f, - 0.000000f, - 0.423900f, - 0.960300f, - -0.054060f, - 0.497069f, - 0.000000f, - 0.000000f, - -0.111500f, - 0.993700f, - 0.000000f, - 0.427200f, - 0.962300f, - -0.053021f, - -0.497069f, - 0.010546f, - 0.000000f, - -0.109300f, - -0.993700f, - 0.021700f, - 0.031200f, - 0.034500f, - -0.105420f, - -0.488310f, - 0.020970f, - 0.000000f, - -0.214000f, - -0.975900f, - 0.042500f, - 0.031200f, - 0.069000f, - -0.107486f, - -0.488310f, - 0.000000f, - 0.000000f, - -0.218200f, - -0.975900f, - 0.000000f, - 0.000000f, - 0.069000f, - -0.053021f, - -0.497069f, - 0.010546f, - 0.000000f, - -0.109300f, - -0.993700f, - 0.021700f, - 0.031200f, - 0.034500f, - -0.107486f, - -0.488310f, - 0.000000f, - 0.000000f, - -0.218200f, - -0.975900f, - 0.000000f, - 0.000000f, - 0.069000f, - -0.054060f, - -0.497069f, - 0.000000f, - 0.000000f, - -0.111500f, - -0.993700f, - 0.000000f, - 0.000000f, - 0.034500f, - -0.489673f, - -0.027069f, - 0.097402f, - 0.000000f, - -0.979300f, - -0.054000f, - 0.194800f, - 0.031200f, - 0.482800f, - -0.489673f, - 0.027069f, - 0.097402f, - 0.000000f, - -0.979300f, - 0.054000f, - 0.194800f, - 0.031200f, - 0.517200f, - -0.499267f, - 0.027069f, - 0.000000f, - 0.000000f, - -0.998500f, - 0.054000f, - 0.000000f, - 0.000000f, - 0.517200f, - -0.489673f, - -0.027069f, - 0.097402f, - 0.000000f, - -0.979300f, - -0.054000f, - 0.194800f, - 0.031200f, - 0.482800f, - -0.499267f, - 0.027069f, - 0.000000f, - 0.000000f, - -0.998500f, - 0.054000f, - 0.000000f, - 0.000000f, - 0.517200f, - -0.499267f, - -0.027069f, - 0.000000f, - 0.000000f, - -0.998500f, - -0.054000f, - 0.000000f, - 0.000000f, - 0.482800f, - -0.105420f, - 0.488310f, - 0.020969f, - 0.000000f, - -0.214000f, - 0.975900f, - 0.042500f, - 1.031200f, - 0.931000f, - -0.053020f, - 0.497069f, - 0.010546f, - 0.000000f, - -0.109300f, - 0.993700f, - 0.021700f, - 1.031200f, - 0.965500f, - -0.054060f, - 0.497069f, - 0.000000f, - 0.000000f, - -0.111500f, - 0.993700f, - 0.000000f, - 1.000000f, - 0.965500f, - -0.105420f, - 0.488310f, - 0.020969f, - 0.000000f, - -0.214000f, - 0.975900f, - 0.042500f, - 1.031200f, - 0.931000f, - -0.054060f, - 0.497069f, - 0.000000f, - 0.000000f, - -0.111500f, - 0.993700f, - 0.000000f, - 1.000000f, - 0.965500f, - -0.107485f, - 0.488310f, - 0.000000f, - 0.000000f, - -0.218200f, - 0.975900f, - 0.000000f, - 1.000000f, - 0.931000f, - -0.000000f, - -0.500000f, - 0.000000f, - 0.000000f, - 0.000000f, - -1.000000f, - 0.000000f, - 0.411700f, - 0.051000f, - -0.053021f, - -0.497069f, - 0.010546f, - 0.000000f, - -0.109300f, - -0.993700f, - 0.021700f, - 0.413000f, - 0.053800f, - -0.054060f, - -0.497069f, - 0.000000f, - 0.000000f, - -0.111500f, - -0.993700f, - 0.000000f, - 0.410400f, - 0.053800f, - -0.483932f, - -0.080891f, - 0.096260f, - 0.000000f, - -0.967900f, - -0.161200f, - 0.192500f, - 0.031200f, - 0.448300f, - -0.489673f, - -0.027069f, - 0.097402f, - 0.000000f, - -0.979300f, - -0.054000f, - 0.194800f, - 0.031200f, - 0.482800f, - -0.499267f, - -0.027069f, - 0.000000f, - 0.000000f, - -0.998500f, - -0.054000f, - 0.000000f, - 0.000000f, - 0.482800f, - -0.483932f, - -0.080891f, - 0.096260f, - 0.000000f, - -0.967900f, - -0.161200f, - 0.192500f, - 0.031200f, - 0.448300f, - -0.499267f, - -0.027069f, - 0.000000f, - 0.000000f, - -0.998500f, - -0.054000f, - 0.000000f, - 0.000000f, - 0.482800f, - -0.493414f, - -0.080891f, - 0.000000f, - 0.000000f, - -0.986900f, - -0.161200f, - 0.000000f, - 0.000000f, - 0.448300f, - -0.156583f, - 0.473826f, - 0.031146f, - 0.000000f, - -0.316100f, - 0.946600f, - 0.062900f, - 1.031200f, - 0.896600f, - -0.105420f, - 0.488310f, - 0.020969f, - 0.000000f, - -0.214000f, - 0.975900f, - 0.042500f, - 1.031200f, - 0.931000f, - -0.107485f, - 0.488310f, - 0.000000f, - 0.000000f, - -0.218200f, - 0.975900f, - 0.000000f, - 1.000000f, - 0.931000f, - -0.156583f, - 0.473826f, - 0.031146f, - 0.000000f, - -0.316100f, - 0.946600f, - 0.062900f, - 1.031200f, - 0.896600f, - -0.107485f, - 0.488310f, - 0.000000f, - 0.000000f, - -0.218200f, - 0.975900f, - 0.000000f, - 1.000000f, - 0.931000f, - -0.159651f, - 0.473826f, - 0.000000f, - 0.000000f, - -0.322300f, - 0.946600f, - 0.000000f, - 1.000000f, - 0.896600f, - -0.472517f, - -0.133764f, - 0.093989f, - 0.000000f, - -0.945200f, - -0.266600f, - 0.188000f, - 0.031200f, - 0.413800f, - -0.483932f, - -0.080891f, - 0.096260f, - 0.000000f, - -0.967900f, - -0.161200f, - 0.192500f, - 0.031200f, - 0.448300f, - -0.493414f, - -0.080891f, - 0.000000f, - 0.000000f, - -0.986900f, - -0.161200f, - 0.000000f, - 0.000000f, - 0.448300f, - -0.472517f, - -0.133764f, - 0.093989f, - 0.000000f, - -0.945200f, - -0.266600f, - 0.188000f, - 0.031200f, - 0.413800f, - -0.493414f, - -0.080891f, - 0.000000f, - 0.000000f, - -0.986900f, - -0.161200f, - 0.000000f, - 0.000000f, - 0.448300f, - -0.481775f, - -0.133764f, - 0.000000f, - 0.000000f, - -0.963800f, - -0.266600f, - 0.000000f, - 0.000000f, - 0.413800f, - -0.205911f, - 0.453788f, - 0.040958f, - 0.000000f, - -0.414500f, - 0.906300f, - 0.082400f, - 0.031200f, - 0.862100f, - -0.156583f, - 0.473826f, - 0.031146f, - 0.000000f, - -0.316100f, - 0.946600f, - 0.062900f, - 0.031200f, - 0.896600f, - -0.159651f, - 0.473826f, - 0.000000f, - 0.000000f, - -0.322300f, - 0.946600f, - 0.000000f, - 0.000000f, - 0.896600f, - -0.205911f, - 0.453788f, - 0.040958f, - 0.000000f, - -0.414500f, - 0.906300f, - 0.082400f, - 0.031200f, - 0.862100f, - -0.159651f, - 0.473826f, - 0.000000f, - 0.000000f, - -0.322300f, - 0.946600f, - 0.000000f, - 0.000000f, - 0.896600f, - -0.209945f, - 0.453788f, - 0.000000f, - 0.000000f, - -0.422700f, - 0.906300f, - 0.000000f, - 0.000000f, - 0.862100f, - -0.455563f, - -0.185069f, - 0.090617f, - 0.000000f, - -0.911600f, - -0.369000f, - 0.181300f, - 0.031200f, - 0.379300f, - -0.472517f, - -0.133764f, - 0.093989f, - 0.000000f, - -0.945200f, - -0.266600f, - 0.188000f, - 0.031200f, - 0.413800f, - -0.481775f, - -0.133764f, - 0.000000f, - 0.000000f, - -0.963800f, - -0.266600f, - 0.000000f, - 0.000000f, - 0.413800f, - -0.455563f, - -0.185069f, - 0.090617f, - 0.000000f, - -0.911600f, - -0.369000f, - 0.181300f, - 0.031200f, - 0.379300f, - -0.481775f, - -0.133764f, - 0.000000f, - 0.000000f, - -0.963800f, - -0.266600f, - 0.000000f, - 0.000000f, - 0.413800f, - -0.464489f, - -0.185069f, - 0.000000f, - 0.000000f, - -0.929400f, - -0.369000f, - 0.000000f, - 0.000000f, - 0.379300f, - -0.252824f, - 0.428429f, - 0.050290f, - 0.000000f, - -0.508100f, - 0.855300f, - 0.101000f, - 0.031200f, - 0.827600f, - -0.205911f, - 0.453788f, - 0.040958f, - 0.000000f, - -0.414500f, - 0.906300f, - 0.082400f, - 0.031200f, - 0.862100f, - -0.209945f, - 0.453788f, - 0.000000f, - 0.000000f, - -0.422700f, - 0.906300f, - 0.000000f, - 0.000000f, - 0.862100f, - -0.252824f, - 0.428429f, - 0.050290f, - 0.000000f, - -0.508100f, - 0.855300f, - 0.101000f, - 0.031200f, - 0.827600f, - -0.209945f, - 0.453788f, - 0.000000f, - 0.000000f, - -0.422700f, - 0.906300f, - 0.000000f, - 0.000000f, - 0.862100f, - -0.257777f, - 0.428429f, - 0.000000f, - 0.000000f, - -0.518000f, - 0.855300f, - 0.000000f, - 0.000000f, - 0.827600f, - -0.433268f, - -0.234204f, - 0.086182f, - 0.000000f, - -0.867200f, - -0.467000f, - 0.172500f, - 0.031200f, - 0.344800f, - -0.455563f, - -0.185069f, - 0.090617f, - 0.000000f, - -0.911600f, - -0.369000f, - 0.181300f, - 0.031200f, - 0.379300f, - -0.464489f, - -0.185069f, - 0.000000f, - 0.000000f, - -0.929400f, - -0.369000f, - 0.000000f, - 0.000000f, - 0.379300f, - -0.433268f, - -0.234204f, - 0.086182f, - 0.000000f, - -0.867200f, - -0.467000f, - 0.172500f, - 0.031200f, - 0.344800f, - -0.464489f, - -0.185069f, - 0.000000f, - 0.000000f, - -0.929400f, - -0.369000f, - 0.000000f, - 0.000000f, - 0.379300f, - -0.441756f, - -0.234204f, - 0.000000f, - 0.000000f, - -0.884200f, - -0.467000f, - 0.000000f, - 0.000000f, - 0.344800f, - -0.296773f, - 0.398046f, - 0.059032f, - 0.000000f, - -0.595600f, - 0.794500f, - 0.118500f, - 0.031200f, - 0.793100f, - -0.252824f, - 0.428429f, - 0.050290f, - 0.000000f, - -0.508100f, - 0.855300f, - 0.101000f, - 0.031200f, - 0.827600f, - -0.257777f, - 0.428429f, - 0.000000f, - 0.000000f, - -0.518000f, - 0.855300f, - 0.000000f, - 0.000000f, - 0.827600f, - -0.296773f, - 0.398046f, - 0.059032f, - 0.000000f, - -0.595600f, - 0.794500f, - 0.118500f, - 0.031200f, - 0.793100f, - -0.257777f, - 0.428429f, - 0.000000f, - 0.000000f, - -0.518000f, - 0.855300f, - 0.000000f, - 0.000000f, - 0.827600f, - -0.302587f, - 0.398046f, - 0.000000f, - 0.000000f, - -0.607300f, - 0.794500f, - 0.000000f, - 0.000000f, - 0.793100f, - -0.405892f, - -0.280594f, - 0.080737f, - 0.000000f, - -0.812800f, - -0.559600f, - 0.161700f, - 0.031200f, - 0.310300f, - -0.433268f, - -0.234204f, - 0.086182f, - 0.000000f, - -0.867200f, - -0.467000f, - 0.172500f, - 0.031200f, - 0.344800f, - -0.441756f, - -0.234204f, - 0.000000f, - 0.000000f, - -0.884200f, - -0.467000f, - 0.000000f, - 0.000000f, - 0.344800f, - -0.405892f, - -0.280594f, - 0.080737f, - 0.000000f, - -0.812800f, - -0.559600f, - 0.161700f, - 0.031200f, - 0.310300f, - -0.441756f, - -0.234204f, - 0.000000f, - 0.000000f, - -0.884200f, - -0.467000f, - 0.000000f, - 0.000000f, - 0.344800f, - -0.413844f, - -0.280594f, - 0.000000f, - 0.000000f, - -0.828700f, - -0.559600f, - 0.000000f, - 0.000000f, - 0.310300f, - -0.337243f, - 0.362998f, - 0.067082f, - 0.000000f, - -0.676200f, - 0.724300f, - 0.134500f, - 0.031200f, - 0.758600f, - -0.296773f, - 0.398046f, - 0.059032f, - 0.000000f, - -0.595600f, - 0.794500f, - 0.118500f, - 0.031200f, - 0.793100f, - -0.302587f, - 0.398046f, - 0.000000f, - 0.000000f, - -0.607300f, - 0.794500f, - 0.000000f, - 0.000000f, - 0.793100f, - -0.337243f, - 0.362998f, - 0.067082f, - 0.000000f, - -0.676200f, - 0.724300f, - 0.134500f, - 0.031200f, - 0.758600f, - -0.302587f, - 0.398046f, - 0.000000f, - 0.000000f, - -0.607300f, - 0.794500f, - 0.000000f, - 0.000000f, - 0.793100f, - -0.343850f, - 0.362998f, - 0.000000f, - 0.000000f, - -0.689400f, - 0.724300f, - 0.000000f, - 0.000000f, - 0.758600f, - -0.373758f, - -0.323693f, - 0.074345f, - 0.000000f, - -0.748900f, - -0.645700f, - 0.149000f, - 0.031200f, - 0.275900f, - -0.405892f, - -0.280594f, - 0.080737f, - 0.000000f, - -0.812800f, - -0.559600f, - 0.161700f, - 0.031200f, - 0.310300f, - -0.413844f, - -0.280594f, - 0.000000f, - 0.000000f, - -0.828700f, - -0.559600f, - 0.000000f, - 0.000000f, - 0.310300f, - -0.373758f, - -0.323693f, - 0.074345f, - 0.000000f, - -0.748900f, - -0.645700f, - 0.149000f, - 0.031200f, - 0.275900f, - -0.413844f, - -0.280594f, - 0.000000f, - 0.000000f, - -0.828700f, - -0.559600f, - 0.000000f, - 0.000000f, - 0.310300f, - -0.381081f, - -0.323693f, - 0.000000f, - 0.000000f, - -0.763500f, - -0.645700f, - 0.000000f, - 0.000000f, - 0.275900f, - -0.373758f, - 0.323693f, - 0.074345f, - 0.000000f, - -0.748900f, - 0.645700f, - 0.149000f, - 0.031200f, - 0.724100f, - -0.337243f, - 0.362998f, - 0.067082f, - 0.000000f, - -0.676200f, - 0.724300f, - 0.134500f, - 0.031200f, - 0.758600f, - -0.343850f, - 0.362998f, - 0.000000f, - 0.000000f, - -0.689400f, - 0.724300f, - 0.000000f, - 0.000000f, - 0.758600f, - -0.373758f, - 0.323693f, - 0.074345f, - 0.000000f, - -0.748900f, - 0.645700f, - 0.149000f, - 0.031200f, - 0.724100f, - -0.343850f, - 0.362998f, - 0.000000f, - 0.000000f, - -0.689400f, - 0.724300f, - 0.000000f, - 0.000000f, - 0.758600f, - -0.381081f, - 0.323693f, - 0.000000f, - 0.000000f, - -0.763500f, - 0.645700f, - 0.000000f, - 0.000000f, - 0.724100f, - -0.337243f, - -0.362998f, - 0.067082f, - 0.000000f, - -0.676200f, - -0.724300f, - 0.134500f, - 0.031200f, - 0.241400f, - -0.373758f, - -0.323693f, - 0.074345f, - 0.000000f, - -0.748900f, - -0.645700f, - 0.149000f, - 0.031200f, - 0.275900f, - -0.381081f, - -0.323693f, - 0.000000f, - 0.000000f, - -0.763500f, - -0.645700f, - 0.000000f, - 0.000000f, - 0.275900f, - -0.337243f, - -0.362998f, - 0.067082f, - 0.000000f, - -0.676200f, - -0.724300f, - 0.134500f, - 0.031200f, - 0.241400f, - -0.381081f, - -0.323693f, - 0.000000f, - 0.000000f, - -0.763500f, - -0.645700f, - 0.000000f, - 0.000000f, - 0.275900f, - -0.343850f, - -0.362998f, - 0.000000f, - 0.000000f, - -0.689400f, - -0.724300f, - 0.000000f, - 0.000000f, - 0.241400f, - -0.405892f, - 0.280594f, - 0.080737f, - 0.000000f, - -0.812800f, - 0.559600f, - 0.161700f, - 0.031200f, - 0.689700f, - -0.373758f, - 0.323693f, - 0.074345f, - 0.000000f, - -0.748900f, - 0.645700f, - 0.149000f, - 0.031200f, - 0.724100f, - -0.381081f, - 0.323693f, - 0.000000f, - 0.000000f, - -0.763500f, - 0.645700f, - 0.000000f, - 0.000000f, - 0.724100f, - -0.405892f, - 0.280594f, - 0.080737f, - 0.000000f, - -0.812800f, - 0.559600f, - 0.161700f, - 0.031200f, - 0.689700f, - -0.381081f, - 0.323693f, - 0.000000f, - 0.000000f, - -0.763500f, - 0.645700f, - 0.000000f, - 0.000000f, - 0.724100f, - -0.413844f, - 0.280594f, - 0.000000f, - 0.000000f, - -0.828700f, - 0.559600f, - 0.000000f, - 0.000000f, - 0.689700f, - -0.296773f, - -0.398046f, - 0.059032f, - 0.000000f, - -0.595600f, - -0.794500f, - 0.118500f, - 0.031200f, - 0.206900f, - -0.337243f, - -0.362998f, - 0.067082f, - 0.000000f, - -0.676200f, - -0.724300f, - 0.134500f, - 0.031200f, - 0.241400f, - -0.343850f, - -0.362998f, - 0.000000f, - 0.000000f, - -0.689400f, - -0.724300f, - 0.000000f, - 0.000000f, - 0.241400f, - -0.296773f, - -0.398046f, - 0.059032f, - 0.000000f, - -0.595600f, - -0.794500f, - 0.118500f, - 0.031200f, - 0.206900f, - -0.343850f, - -0.362998f, - 0.000000f, - 0.000000f, - -0.689400f, - -0.724300f, - 0.000000f, - 0.000000f, - 0.241400f, - -0.302588f, - -0.398046f, - 0.000000f, - 0.000000f, - -0.607300f, - -0.794500f, - 0.000000f, - 0.000000f, - 0.206900f, - -0.433268f, - 0.234204f, - 0.086182f, - 0.000000f, - -0.867200f, - 0.467000f, - 0.172500f, - 0.031200f, - 0.655200f, - -0.405892f, - 0.280594f, - 0.080737f, - 0.000000f, - -0.812800f, - 0.559600f, - 0.161700f, - 0.031200f, - 0.689700f, - -0.413844f, - 0.280594f, - 0.000000f, - 0.000000f, - -0.828700f, - 0.559600f, - 0.000000f, - 0.000000f, - 0.689700f, - -0.433268f, - 0.234204f, - 0.086182f, - 0.000000f, - -0.867200f, - 0.467000f, - 0.172500f, - 0.031200f, - 0.655200f, - -0.413844f, - 0.280594f, - 0.000000f, - 0.000000f, - -0.828700f, - 0.559600f, - 0.000000f, - 0.000000f, - 0.689700f, - -0.441756f, - 0.234204f, - 0.000000f, - 0.000000f, - -0.884200f, - 0.467000f, - 0.000000f, - 0.000000f, - 0.655200f, - -0.252824f, - -0.428429f, - 0.050290f, - 0.000000f, - -0.508100f, - -0.855300f, - 0.101000f, - 0.031200f, - 0.172400f, - -0.296773f, - -0.398046f, - 0.059032f, - 0.000000f, - -0.595600f, - -0.794500f, - 0.118500f, - 0.031200f, - 0.206900f, - -0.302588f, - -0.398046f, - 0.000000f, - 0.000000f, - -0.607300f, - -0.794500f, - 0.000000f, - 0.000000f, - 0.206900f, - -0.252824f, - -0.428429f, - 0.050290f, - 0.000000f, - -0.508100f, - -0.855300f, - 0.101000f, - 0.031200f, - 0.172400f, - -0.302588f, - -0.398046f, - 0.000000f, - 0.000000f, - -0.607300f, - -0.794500f, - 0.000000f, - 0.000000f, - 0.206900f, - -0.257777f, - -0.428429f, - 0.000000f, - 0.000000f, - -0.518000f, - -0.855300f, - 0.000000f, - 0.000000f, - 0.172400f, - -0.455563f, - 0.185069f, - 0.090617f, - 0.000000f, - -0.911600f, - 0.369000f, - 0.181300f, - 0.031200f, - 0.620700f, - -0.433268f, - 0.234204f, - 0.086182f, - 0.000000f, - -0.867200f, - 0.467000f, - 0.172500f, - 0.031200f, - 0.655200f, - -0.441756f, - 0.234204f, - 0.000000f, - 0.000000f, - -0.884200f, - 0.467000f, - 0.000000f, - 0.000000f, - 0.655200f, - -0.455563f, - 0.185069f, - 0.090617f, - 0.000000f, - -0.911600f, - 0.369000f, - 0.181300f, - 0.031200f, - 0.620700f, - -0.441756f, - 0.234204f, - 0.000000f, - 0.000000f, - -0.884200f, - 0.467000f, - 0.000000f, - 0.000000f, - 0.655200f, - -0.464489f, - 0.185069f, - 0.000000f, - 0.000000f, - -0.929400f, - 0.369000f, - 0.000000f, - 0.000000f, - 0.620700f, -}; - -const int textured_detailed_sphere_indices[] = - { - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 20, - 21, - 22, - 23, - 24, - 25, - 26, - 27, - 28, - 29, - 30, - 31, - 32, - 33, - 34, - 35, - 36, - 37, - 38, - 39, - 40, - 41, - 42, - 43, - 44, - 45, - 46, - 47, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 57, - 58, - 59, - 60, - 61, - 62, - 63, - 64, - 65, - 66, - 67, - 68, - 69, - 70, - 71, - 72, - 73, - 74, - 75, - 76, - 77, - 78, - 79, - 80, - 81, - 82, - 83, - 84, - 85, - 86, - 87, - 88, - 89, - 90, - 91, - 92, - 93, - 94, - 95, - 96, - 97, - 98, - 99, - 100, - 101, - 102, - 103, - 104, - 105, - 106, - 107, - 108, - 109, - 110, - 111, - 112, - 113, - 114, - 115, - 116, - 117, - 118, - 119, - 120, - 121, - 122, - 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, - 256, - 257, - 258, - 259, - 260, - 261, - 262, - 263, - 264, - 265, - 266, - 267, - 268, - 269, - 270, - 271, - 272, - 273, - 274, - 275, - 276, - 277, - 278, - 279, - 280, - 281, - 282, - 283, - 284, - 285, - 286, - 287, - 288, - 289, - 290, - 291, - 292, - 293, - 294, - 295, - 296, - 297, - 298, - 299, - 300, - 301, - 302, - 303, - 304, - 305, - 306, - 307, - 308, - 309, - 310, - 311, - 312, - 313, - 314, - 315, - 316, - 317, - 318, - 319, - 320, - 321, - 322, - 323, - 324, - 325, - 326, - 327, - 328, - 329, - 330, - 331, - 332, - 333, - 334, - 335, - 336, - 337, - 338, - 339, - 340, - 341, - 342, - 343, - 344, - 345, - 346, - 347, - 348, - 349, - 350, - 351, - 352, - 353, - 354, - 355, - 356, - 357, - 358, - 359, - 360, - 361, - 362, - 363, - 364, - 365, - 366, - 367, - 368, - 369, - 370, - 371, - 372, - 373, - 374, - 375, - 376, - 377, - 378, - 379, - 380, - 381, - 382, - 383, - 384, - 385, - 386, - 387, - 388, - 389, - 390, - 391, - 392, - 393, - 394, - 395, - 396, - 397, - 398, - 399, - 400, - 401, - 402, - 403, - 404, - 405, - 406, - 407, - 408, - 409, - 410, - 411, - 412, - 413, - 414, - 415, - 416, - 417, - 418, - 419, - 420, - 421, - 422, - 423, - 424, - 425, - 426, - 427, - 428, - 429, - 430, - 431, - 432, - 433, - 434, - 435, - 436, - 437, - 438, - 439, - 440, - 441, - 442, - 443, - 444, - 445, - 446, - 447, - 448, - 449, - 450, - 451, - 452, - 453, - 454, - 455, - 456, - 457, - 458, - 459, - 460, - 461, - 462, - 463, - 464, - 465, - 466, - 467, - 468, - 469, - 470, - 471, - 472, - 473, - 474, - 475, - 476, - 477, - 478, - 479, - 480, - 481, - 482, - 483, - 484, - 485, - 486, - 487, - 488, - 489, - 490, - 491, - 492, - 493, - 494, - 495, - 496, - 497, - 498, - 499, - 500, - 501, - 502, - 503, - 504, - 505, - 506, - 507, - 508, - 509, - 510, - 511, - 512, - 513, - 514, - 515, - 516, - 517, - 518, - 519, - 520, - 521, - 522, - 523, - 524, - 525, - 526, - 527, - 528, - 529, - 530, - 531, - 532, - 533, - 534, - 535, - 536, - 537, - 538, - 539, - 540, - 541, - 542, - 543, - 544, - 545, - 546, - 547, - 548, - 549, - 550, - 551, - 552, - 553, - 554, - 555, - 556, - 557, - 558, - 559, - 560, - 561, - 562, - 563, - 564, - 565, - 566, - 567, - 568, - 569, - 570, - 571, - 572, - 573, - 574, - 575, - 576, - 577, - 578, - 579, - 580, - 581, - 582, - 583, - 584, - 585, - 586, - 587, - 588, - 589, - 590, - 591, - 592, - 593, - 594, - 595, - 596, - 597, - 598, - 599, - 600, - 601, - 602, - 603, - 604, - 605, - 606, - 607, - 608, - 609, - 610, - 611, - 612, - 613, - 614, - 615, - 616, - 617, - 618, - 619, - 620, - 621, - 622, - 623, - 624, - 625, - 626, - 627, - 628, - 629, - 630, - 631, - 632, - 633, - 634, - 635, - 636, - 637, - 638, - 639, - 640, - 641, - 642, - 643, - 644, - 645, - 646, - 647, - 648, - 649, - 650, - 651, - 652, - 653, - 654, - 655, - 656, - 657, - 658, - 659, - 660, - 661, - 662, - 663, - 664, - 665, - 666, - 667, - 668, - 669, - 670, - 671, - 672, - 673, - 674, - 675, - 676, - 677, - 678, - 679, - 680, - 681, - 682, - 683, - 684, - 685, - 686, - 687, - 688, - 689, - 690, - 691, - 692, - 693, - 694, - 695, - 696, - 697, - 698, - 699, - 700, - 701, - 702, - 703, - 704, - 705, - 706, - 707, - 708, - 709, - 710, - 711, - 712, - 713, - 714, - 715, - 716, - 717, - 718, - 719, - 720, - 721, - 722, - 723, - 724, - 725, - 726, - 727, - 728, - 729, - 730, - 731, - 732, - 733, - 734, - 735, - 736, - 737, - 738, - 739, - 740, - 741, - 742, - 743, - 744, - 745, - 746, - 747, - 748, - 749, - 750, - 751, - 752, - 753, - 754, - 755, - 756, - 757, - 758, - 759, - 760, - 761, - 762, - 763, - 764, - 765, - 766, - 767, - 768, - 769, - 770, - 771, - 772, - 773, - 774, - 775, - 776, - 777, - 778, - 779, - 780, - 781, - 782, - 783, - 784, - 785, - 786, - 787, - 788, - 789, - 790, - 791, - 792, - 793, - 794, - 795, - 796, - 797, - 798, - 799, - 800, - 801, - 802, - 803, - 804, - 805, - 806, - 807, - 808, - 809, - 810, - 811, - 812, - 813, - 814, - 815, - 816, - 817, - 818, - 819, - 820, - 821, - 822, - 823, - 824, - 825, - 826, - 827, - 828, - 829, - 830, - 831, - 832, - 833, - 834, - 835, - 836, - 837, - 838, - 839, - 840, - 841, - 842, - 843, - 844, - 845, - 846, - 847, - 848, - 849, - 850, - 851, - 852, - 853, - 854, - 855, - 856, - 857, - 858, - 859, - 860, - 861, - 862, - 863, - 864, - 865, - 866, - 867, - 868, - 869, - 870, - 871, - 872, - 873, - 874, - 875, - 876, - 877, - 878, - 879, - 880, - 881, - 882, - 883, - 884, - 885, - 886, - 887, - 888, - 889, - 890, - 891, - 892, - 893, - 894, - 895, - 896, - 897, - 898, - 899, - 900, - 901, - 902, - 903, - 904, - 905, - 906, - 907, - 908, - 909, - 910, - 911, - 912, - 913, - 914, - 915, - 916, - 917, - 918, - 919, - 920, - 921, - 922, - 923, - 924, - 925, - 926, - 927, - 928, - 929, - 930, - 931, - 932, - 933, - 934, - 935, - 936, - 937, - 938, - 939, - 940, - 941, - 942, - 943, - 944, - 945, - 946, - 947, - 948, - 949, - 950, - 951, - 952, - 953, - 954, - 955, - 956, - 957, - 958, - 959, - 960, - 961, - 962, - 963, - 964, - 965, - 966, - 967, - 968, - 969, - 970, - 971, - 972, - 973, - 974, - 975, - 976, - 977, - 978, - 979, - 980, - 981, - 982, - 983, - 984, - 985, - 986, - 987, - 988, - 989, - 990, - 991, - 992, - 993, - 994, - 995, - 996, - 997, - 998, - 999, - 1000, - 1001, - 1002, - 1003, - 1004, - 1005, - 1006, - 1007, - 1008, - 1009, - 1010, - 1011, - 1012, - 1013, - 1014, - 1015, - 1016, - 1017, - 1018, - 1019, - 1020, - 1021, - 1022, - 1023, - 1024, - 1025, - 1026, - 1027, - 1028, - 1029, - 1030, - 1031, - 1032, - 1033, - 1034, - 1035, - 1036, - 1037, - 1038, - 1039, - 1040, - 1041, - 1042, - 1043, - 1044, - 1045, - 1046, - 1047, - 1048, - 1049, - 1050, - 1051, - 1052, - 1053, - 1054, - 1055, - 1056, - 1057, - 1058, - 1059, - 1060, - 1061, - 1062, - 1063, - 1064, - 1065, - 1066, - 1067, - 1068, - 1069, - 1070, - 1071, - 1072, - 1073, - 1074, - 1075, - 1076, - 1077, - 1078, - 1079, - 1080, - 1081, - 1082, - 1083, - 1084, - 1085, - 1086, - 1087, - 1088, - 1089, - 1090, - 1091, - 1092, - 1093, - 1094, - 1095, - 1096, - 1097, - 1098, - 1099, - 1100, - 1101, - 1102, - 1103, - 1104, - 1105, - 1106, - 1107, - 1108, - 1109, - 1110, - 1111, - 1112, - 1113, - 1114, - 1115, - 1116, - 1117, - 1118, - 1119, - 1120, - 1121, - 1122, - 1123, - 1124, - 1125, - 1126, - 1127, - 1128, - 1129, - 1130, - 1131, - 1132, - 1133, - 1134, - 1135, - 1136, - 1137, - 1138, - 1139, - 1140, - 1141, - 1142, - 1143, - 1144, - 1145, - 1146, - 1147, - 1148, - 1149, - 1150, - 1151, - 1152, - 1153, - 1154, - 1155, - 1156, - 1157, - 1158, - 1159, - 1160, - 1161, - 1162, - 1163, - 1164, - 1165, - 1166, - 1167, - 1168, - 1169, - 1170, - 1171, - 1172, - 1173, - 1174, - 1175, - 1176, - 1177, - 1178, - 1179, - 1180, - 1181, - 1182, - 1183, - 1184, - 1185, - 1186, - 1187, - 1188, - 1189, - 1190, - 1191, - 1192, - 1193, - 1194, - 1195, - 1196, - 1197, - 1198, - 1199, - 1200, - 1201, - 1202, - 1203, - 1204, - 1205, - 1206, - 1207, - 1208, - 1209, - 1210, - 1211, - 1212, - 1213, - 1214, - 1215, - 1216, - 1217, - 1218, - 1219, - 1220, - 1221, - 1222, - 1223, - 1224, - 1225, - 1226, - 1227, - 1228, - 1229, - 1230, - 1231, - 1232, - 1233, - 1234, - 1235, - 1236, - 1237, - 1238, - 1239, - 1240, - 1241, - 1242, - 1243, - 1244, - 1245, - 1246, - 1247, - 1248, - 1249, - 1250, - 1251, - 1252, - 1253, - 1254, - 1255, - 1256, - 1257, - 1258, - 1259, - 1260, - 1261, - 1262, - 1263, - 1264, - 1265, - 1266, - 1267, - 1268, - 1269, - 1270, - 1271, - 1272, - 1273, - 1274, - 1275, - 1276, - 1277, - 1278, - 1279, - 1280, - 1281, - 1282, - 1283, - 1284, - 1285, - 1286, - 1287, - 1288, - 1289, - 1290, - 1291, - 1292, - 1293, - 1294, - 1295, - 1296, - 1297, - 1298, - 1299, - 1300, - 1301, - 1302, - 1303, - 1304, - 1305, - 1306, - 1307, - 1308, - 1309, - 1310, - 1311, - 1312, - 1313, - 1314, - 1315, - 1316, - 1317, - 1318, - 1319, - 1320, - 1321, - 1322, - 1323, - 1324, - 1325, - 1326, - 1327, - 1328, - 1329, - 1330, - 1331, - 1332, - 1333, - 1334, - 1335, - 1336, - 1337, - 1338, - 1339, - 1340, - 1341, - 1342, - 1343, - 1344, - 1345, - 1346, - 1347, - 1348, - 1349, - 1350, - 1351, - 1352, - 1353, - 1354, - 1355, - 1356, - 1357, - 1358, - 1359, - 1360, - 1361, - 1362, - 1363, - 1364, - 1365, - 1366, - 1367, - 1368, - 1369, - 1370, - 1371, - 1372, - 1373, - 1374, - 1375, - 1376, - 1377, - 1378, - 1379, - 1380, - 1381, - 1382, - 1383, - 1384, - 1385, - 1386, - 1387, - 1388, - 1389, - 1390, - 1391, - 1392, - 1393, - 1394, - 1395, - 1396, - 1397, - 1398, - 1399, - 1400, - 1401, - 1402, - 1403, - 1404, - 1405, - 1406, - 1407, - 1408, - 1409, - 1410, - 1411, - 1412, - 1413, - 1414, - 1415, - 1416, - 1417, - 1418, - 1419, - 1420, - 1421, - 1422, - 1423, - 1424, - 1425, - 1426, - 1427, - 1428, - 1429, - 1430, - 1431, - 1432, - 1433, - 1434, - 1435, - 1436, - 1437, - 1438, - 1439, - 1440, - 1441, - 1442, - 1443, - 1444, - 1445, - 1446, - 1447, - 1448, - 1449, - 1450, - 1451, - 1452, - 1453, - 1454, - 1455, - 1456, - 1457, - 1458, - 1459, - 1460, - 1461, - 1462, - 1463, - 1464, - 1465, - 1466, - 1467, - 1468, - 1469, - 1470, - 1471, - 1472, - 1473, - 1474, - 1475, - 1476, - 1477, - 1478, - 1479, - 1480, - 1481, - 1482, - 1483, - 1484, - 1485, - 1486, - 1487, - 1488, - 1489, - 1490, - 1491, - 1492, - 1493, - 1494, - 1495, - 1496, - 1497, - 1498, - 1499, - 1500, - 1501, - 1502, - 1503, - 1504, - 1505, - 1506, - 1507, - 1508, - 1509, - 1510, - 1511, - 1512, - 1513, - 1514, - 1515, - 1516, - 1517, - 1518, - 1519, - 1520, - 1521, - 1522, - 1523, - 1524, - 1525, - 1526, - 1527, - 1528, - 1529, - 1530, - 1531, - 1532, - 1533, - 1534, - 1535, - 1536, - 1537, - 1538, - 1539, - 1540, - 1541, - 1542, - 1543, - 1544, - 1545, - 1546, - 1547, - 1548, - 1549, - 1550, - 1551, - 1552, - 1553, - 1554, - 1555, - 1556, - 1557, - 1558, - 1559, - 1560, - 1561, - 1562, - 1563, - 1564, - 1565, - 1566, - 1567, - 1568, - 1569, - 1570, - 1571, - 1572, - 1573, - 1574, - 1575, - 1576, - 1577, - 1578, - 1579, - 1580, - 1581, - 1582, - 1583, - 1584, - 1585, - 1586, - 1587, - 1588, - 1589, - 1590, - 1591, - 1592, - 1593, - 1594, - 1595, - 1596, - 1597, - 1598, - 1599, - 1600, - 1601, - 1602, - 1603, - 1604, - 1605, - 1606, - 1607, - 1608, - 1609, - 1610, - 1611, - 1612, - 1613, - 1614, - 1615, - 1616, - 1617, - 1618, - 1619, - 1620, - 1621, - 1622, - 1623, - 1624, - 1625, - 1626, - 1627, - 1628, - 1629, - 1630, - 1631, - 1632, - 1633, - 1634, - 1635, - 1636, - 1637, - 1638, - 1639, - 1640, - 1641, - 1642, - 1643, - 1644, - 1645, - 1646, - 1647, - 1648, - 1649, - 1650, - 1651, - 1652, - 1653, - 1654, - 1655, - 1656, - 1657, - 1658, - 1659, - 1660, - 1661, - 1662, - 1663, - 1664, - 1665, - 1666, - 1667, - 1668, - 1669, - 1670, - 1671, - 1672, - 1673, - 1674, - 1675, - 1676, - 1677, - 1678, - 1679, - 1680, - 1681, - 1682, - 1683, - 1684, - 1685, - 1686, - 1687, - 1688, - 1689, - 1690, - 1691, - 1692, - 1693, - 1694, - 1695, - 1696, - 1697, - 1698, - 1699, - 1700, - 1701, - 1702, - 1703, - 1704, - 1705, - 1706, - 1707, - 1708, - 1709, - 1710, - 1711, - 1712, - 1713, - 1714, - 1715, - 1716, - 1717, - 1718, - 1719, - 1720, - 1721, - 1722, - 1723, - 1724, - 1725, - 1726, - 1727, - 1728, - 1729, - 1730, - 1731, - 1732, - 1733, - 1734, - 1735, - 1736, - 1737, - 1738, - 1739, - 1740, - 1741, - 1742, - 1743, - 1744, - 1745, - 1746, - 1747, - 1748, - 1749, - 1750, - 1751, - 1752, - 1753, - 1754, - 1755, - 1756, - 1757, - 1758, - 1759, - 1760, - 1761, - 1762, - 1763, - 1764, - 1765, - 1766, - 1767, - 1768, - 1769, - 1770, - 1771, - 1772, - 1773, - 1774, - 1775, - 1776, - 1777, - 1778, - 1779, - 1780, - 1781, - 1782, - 1783, - 1784, - 1785, - 1786, - 1787, - 1788, - 1789, - 1790, - 1791, - 1792, - 1793, - 1794, - 1795, - 1796, - 1797, - 1798, - 1799, - 1800, - 1801, - 1802, - 1803, - 1804, - 1805, - 1806, - 1807, - 1808, - 1809, - 1810, - 1811, - 1812, - 1813, - 1814, - 1815, - 1816, - 1817, - 1818, - 1819, - 1820, - 1821, - 1822, - 1823, - 1824, - 1825, - 1826, - 1827, - 1828, - 1829, - 1830, - 1831, - 1832, - 1833, - 1834, - 1835, - 1836, - 1837, - 1838, - 1839, - 1840, - 1841, - 1842, - 1843, - 1844, - 1845, - 1846, - 1847, - 1848, - 1849, - 1850, - 1851, - 1852, - 1853, - 1854, - 1855, - 1856, - 1857, - 1858, - 1859, - 1860, - 1861, - 1862, - 1863, - 1864, - 1865, - 1866, - 1867, - 1868, - 1869, - 1870, - 1871, - 1872, - 1873, - 1874, - 1875, - 1876, - 1877, - 1878, - 1879, - 1880, - 1881, - 1882, - 1883, - 1884, - 1885, - 1886, - 1887, - 1888, - 1889, - 1890, - 1891, - 1892, - 1893, - 1894, - 1895, - 1896, - 1897, - 1898, - 1899, - 1900, - 1901, - 1902, - 1903, - 1904, - 1905, - 1906, - 1907, - 1908, - 1909, - 1910, - 1911, - 1912, - 1913, - 1914, - 1915, - 1916, - 1917, - 1918, - 1919, - 1920, - 1921, - 1922, - 1923, - 1924, - 1925, - 1926, - 1927, - 1928, - 1929, - 1930, - 1931, - 1932, - 1933, - 1934, - 1935, - 1936, - 1937, - 1938, - 1939, - 1940, - 1941, - 1942, - 1943, - 1944, - 1945, - 1946, - 1947, - 1948, - 1949, - 1950, - 1951, - 1952, - 1953, - 1954, - 1955, - 1956, - 1957, - 1958, - 1959, - 1960, - 1961, - 1962, - 1963, - 1964, - 1965, - 1966, - 1967, - 1968, - 1969, - 1970, - 1971, - 1972, - 1973, - 1974, - 1975, - 1976, - 1977, - 1978, - 1979, - 1980, - 1981, - 1982, - 1983, - 1984, - 1985, - 1986, - 1987, - 1988, - 1989, - 1990, - 1991, - 1992, - 1993, - 1994, - 1995, - 1996, - 1997, - 1998, - 1999, - 2000, - 2001, - 2002, - 2003, - 2004, - 2005, - 2006, - 2007, - 2008, - 2009, - 2010, - 2011, - 2012, - 2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026, - 2027, - 2028, - 2029, - 2030, - 2031, - 2032, - 2033, - 2034, - 2035, - 2036, - 2037, - 2038, - 2039, - 2040, - 2041, - 2042, - 2043, - 2044, - 2045, - 2046, - 2047, - 2048, - 2049, - 2050, - 2051, - 2052, - 2053, - 2054, - 2055, - 2056, - 2057, - 2058, - 2059, - 2060, - 2061, - 2062, - 2063, - 2064, - 2065, - 2066, - 2067, - 2068, - 2069, - 2070, - 2071, - 2072, - 2073, - 2074, - 2075, - 2076, - 2077, - 2078, - 2079, - 2080, - 2081, - 2082, - 2083, - 2084, - 2085, - 2086, - 2087, - 2088, - 2089, - 2090, - 2091, - 2092, - 2093, - 2094, - 2095, - 2096, - 2097, - 2098, - 2099, - 2100, - 2101, - 2102, - 2103, - 2104, - 2105, - 2106, - 2107, - 2108, - 2109, - 2110, - 2111, - 2112, - 2113, - 2114, - 2115, - 2116, - 2117, - 2118, - 2119, - 2120, - 2121, - 2122, - 2123, - 2124, - 2125, - 2126, - 2127, - 2128, - 2129, - 2130, - 2131, - 2132, - 2133, - 2134, - 2135, - 2136, - 2137, - 2138, - 2139, - 2140, - 2141, - 2142, - 2143, - 2144, - 2145, - 2146, - 2147, - 2148, - 2149, - 2150, - 2151, - 2152, - 2153, - 2154, - 2155, - 2156, - 2157, - 2158, - 2159, - 2160, - 2161, - 2162, - 2163, - 2164, - 2165, - 2166, - 2167, - 2168, - 2169, - 2170, - 2171, - 2172, - 2173, - 2174, - 2175, - 2176, - 2177, - 2178, - 2179, - 2180, - 2181, - 2182, - 2183, - 2184, - 2185, - 2186, - 2187, - 2188, - 2189, - 2190, - 2191, - 2192, - 2193, - 2194, - 2195, - 2196, - 2197, - 2198, - 2199, - 2200, - 2201, - 2202, - 2203, - 2204, - 2205, - 2206, - 2207, - 2208, - 2209, - 2210, - 2211, - 2212, - 2213, - 2214, - 2215, - 2216, - 2217, - 2218, - 2219, - 2220, - 2221, - 2222, - 2223, - 2224, - 2225, - 2226, - 2227, - 2228, - 2229, - 2230, - 2231, - 2232, - 2233, - 2234, - 2235, - 2236, - 2237, - 2238, - 2239, - 2240, - 2241, - 2242, - 2243, - 2244, - 2245, - 2246, - 2247, - 2248, - 2249, - 2250, - 2251, - 2252, - 2253, - 2254, - 2255, - 2256, - 2257, - 2258, - 2259, - 2260, - 2261, - 2262, - 2263, - 2264, - 2265, - 2266, - 2267, - 2268, - 2269, - 2270, - 2271, - 2272, - 2273, - 2274, - 2275, - 2276, - 2277, - 2278, - 2279, - 2280, - 2281, - 2282, - 2283, - 2284, - 2285, - 2286, - 2287, - 2288, - 2289, - 2290, - 2291, - 2292, - 2293, - 2294, - 2295, - 2296, - 2297, - 2298, - 2299, - 2300, - 2301, - 2302, - 2303, - 2304, - 2305, - 2306, - 2307, - 2308, - 2309, - 2310, - 2311, - 2312, - 2313, - 2314, - 2315, - 2316, - 2317, - 2318, - 2319, - 2320, - 2321, - 2322, - 2323, - 2324, - 2325, - 2326, - 2327, - 2328, - 2329, - 2330, - 2331, - 2332, - 2333, - 2334, - 2335, - 2336, - 2337, - 2338, - 2339, - 2340, - 2341, - 2342, - 2343, - 2344, - 2345, - 2346, - 2347, - 2348, - 2349, - 2350, - 2351, - 2352, - 2353, - 2354, - 2355, - 2356, - 2357, - 2358, - 2359, - 2360, - 2361, - 2362, - 2363, - 2364, - 2365, - 2366, - 2367, - 2368, - 2369, - 2370, - 2371, - 2372, - 2373, - 2374, - 2375, - 2376, - 2377, - 2378, - 2379, - 2380, - 2381, - 2382, - 2383, - 2384, - 2385, - 2386, - 2387, - 2388, - 2389, - 2390, - 2391, - 2392, - 2393, - 2394, - 2395, - 2396, - 2397, - 2398, - 2399, - 2400, - 2401, - 2402, - 2403, - 2404, - 2405, - 2406, - 2407, - 2408, - 2409, - 2410, - 2411, - 2412, - 2413, - 2414, - 2415, - 2416, - 2417, - 2418, - 2419, - 2420, - 2421, - 2422, - 2423, - 2424, - 2425, - 2426, - 2427, - 2428, - 2429, - 2430, - 2431, - 2432, - 2433, - 2434, - 2435, - 2436, - 2437, - 2438, - 2439, - 2440, - 2441, - 2442, - 2443, - 2444, - 2445, - 2446, - 2447, - 2448, - 2449, - 2450, - 2451, - 2452, - 2453, - 2454, - 2455, - 2456, - 2457, - 2458, - 2459, - 2460, - 2461, - 2462, - 2463, - 2464, - 2465, - 2466, - 2467, - 2468, - 2469, - 2470, - 2471, - 2472, - 2473, - 2474, - 2475, - 2476, - 2477, - 2478, - 2479, - 2480, - 2481, - 2482, - 2483, - 2484, - 2485, - 2486, - 2487, - 2488, - 2489, - 2490, - 2491, - 2492, - 2493, - 2494, - 2495, - 2496, - 2497, - 2498, - 2499, - 2500, - 2501, - 2502, - 2503, - 2504, - 2505, - 2506, - 2507, - 2508, - 2509, - 2510, - 2511, - 2512, - 2513, - 2514, - 2515, - 2516, - 2517, - 2518, - 2519, - 2520, - 2521, - 2522, - 2523, - 2524, - 2525, - 2526, - 2527, - 2528, - 2529, - 2530, - 2531, - 2532, - 2533, - 2534, - 2535, - 2536, - 2537, - 2538, - 2539, - 2540, - 2541, - 2542, - 2543, - 2544, - 2545, - 2546, - 2547, - 2548, - 2549, - 2550, - 2551, - 2552, - 2553, - 2554, - 2555, - 2556, - 2557, - 2558, - 2559, - 2560, - 2561, - 2562, - 2563, - 2564, - 2565, - 2566, - 2567, - 2568, - 2569, - 2570, - 2571, - 2572, - 2573, - 2574, - 2575, - 2576, - 2577, - 2578, - 2579, - 2580, - 2581, - 2582, - 2583, - 2584, - 2585, - 2586, - 2587, - 2588, - 2589, - 2590, - 2591, - 2592, - 2593, - 2594, - 2595, - 2596, - 2597, - 2598, - 2599, - 2600, - 2601, - 2602, - 2603, - 2604, - 2605, - 2606, - 2607, - 2608, - 2609, - 2610, - 2611, - 2612, - 2613, - 2614, - 2615, - 2616, - 2617, - 2618, - 2619, - 2620, - 2621, - 2622, - 2623, - 2624, - 2625, - 2626, - 2627, - 2628, - 2629, - 2630, - 2631, - 2632, - 2633, - 2634, - 2635, - 2636, - 2637, - 2638, - 2639, - 2640, - 2641, - 2642, - 2643, - 2644, - 2645, - 2646, - 2647, - 2648, - 2649, - 2650, - 2651, - 2652, - 2653, - 2654, - 2655, - 2656, - 2657, - 2658, - 2659, - 2660, - 2661, - 2662, - 2663, - 2664, - 2665, - 2666, - 2667, - 2668, - 2669, - 2670, - 2671, - 2672, - 2673, - 2674, - 2675, - 2676, - 2677, - 2678, - 2679, - 2680, - 2681, - 2682, - 2683, - 2684, - 2685, - 2686, - 2687, - 2688, - 2689, - 2690, - 2691, - 2692, - 2693, - 2694, - 2695, - 2696, - 2697, - 2698, - 2699, - 2700, - 2701, - 2702, - 2703, - 2704, - 2705, - 2706, - 2707, - 2708, - 2709, - 2710, - 2711, - 2712, - 2713, - 2714, - 2715, - 2716, - 2717, - 2718, - 2719, - 2720, - 2721, - 2722, - 2723, - 2724, - 2725, - 2726, - 2727, - 2728, - 2729, - 2730, - 2731, - 2732, - 2733, - 2734, - 2735, - 2736, - 2737, - 2738, - 2739, - 2740, - 2741, - 2742, - 2743, - 2744, - 2745, - 2746, - 2747, - 2748, - 2749, - 2750, - 2751, - 2752, - 2753, - 2754, - 2755, - 2756, - 2757, - 2758, - 2759, - 2760, - 2761, - 2762, - 2763, - 2764, - 2765, - 2766, - 2767, - 2768, - 2769, - 2770, - 2771, - 2772, - 2773, - 2774, - 2775, - 2776, - 2777, - 2778, - 2779, - 2780, - 2781, - 2782, - 2783, - 2784, - 2785, - 2786, - 2787, - 2788, - 2789, - 2790, - 2791, - 2792, - 2793, - 2794, - 2795, - 2796, - 2797, - 2798, - 2799, - 2800, - 2801, - 2802, - 2803, - 2804, - 2805, - 2806, - 2807, - 2808, - 2809, - 2810, - 2811, - 2812, - 2813, - 2814, - 2815, - 2816, - 2817, - 2818, - 2819, - 2820, - 2821, - 2822, - 2823, - 2824, - 2825, - 2826, - 2827, - 2828, - 2829, - 2830, - 2831, - 2832, - 2833, - 2834, - 2835, - 2836, - 2837, - 2838, - 2839, - 2840, - 2841, - 2842, - 2843, - 2844, - 2845, - 2846, - 2847, - 2848, - 2849, - 2850, - 2851, - 2852, - 2853, - 2854, - 2855, - 2856, - 2857, - 2858, - 2859, - 2860, - 2861, - 2862, - 2863, - 2864, - 2865, - 2866, - 2867, - 2868, - 2869, - 2870, - 2871, - 2872, - 2873, - 2874, - 2875, - 2876, - 2877, - 2878, - 2879, - 2880, - 2881, - 2882, - 2883, - 2884, - 2885, - 2886, - 2887, - 2888, - 2889, - 2890, - 2891, - 2892, - 2893, - 2894, - 2895, - 2896, - 2897, - 2898, - 2899, - 2900, - 2901, - 2902, - 2903, - 2904, - 2905, - 2906, - 2907, - 2908, - 2909, - 2910, - 2911, - 2912, - 2913, - 2914, - 2915, - 2916, - 2917, - 2918, - 2919, - 2920, - 2921, - 2922, - 2923, - 2924, - 2925, - 2926, - 2927, - 2928, - 2929, - 2930, - 2931, - 2932, - 2933, - 2934, - 2935, - 2936, - 2937, - 2938, - 2939, - 2940, - 2941, - 2942, - 2943, - 2944, - 2945, - 2946, - 2947, - 2948, - 2949, - 2950, - 2951, - 2952, - 2953, - 2954, - 2955, - 2956, - 2957, - 2958, - 2959, - 2960, - 2961, - 2962, - 2963, - 2964, - 2965, - 2966, - 2967, - 2968, - 2969, - 2970, - 2971, - 2972, - 2973, - 2974, - 2975, - 2976, - 2977, - 2978, - 2979, - 2980, - 2981, - 2982, - 2983, - 2984, - 2985, - 2986, - 2987, - 2988, - 2989, - 2990, - 2991, - 2992, - 2993, - 2994, - 2995, - 2996, - 2997, - 2998, - 2999, - 3000, - 3001, - 3002, - 3003, - 3004, - 3005, - 3006, - 3007, - 3008, - 3009, - 3010, - 3011, - 3012, - 3013, - 3014, - 3015, - 3016, - 3017, - 3018, - 3019, - 3020, - 3021, - 3022, - 3023, - 3024, - 3025, - 3026, - 3027, - 3028, - 3029, - 3030, - 3031, - 3032, - 3033, - 3034, - 3035, - 3036, - 3037, - 3038, - 3039, - 3040, - 3041, - 3042, - 3043, - 3044, - 3045, - 3046, - 3047, - 3048, - 3049, - 3050, - 3051, - 3052, - 3053, - 3054, - 3055, - 3056, - 3057, - 3058, - 3059, - 3060, - 3061, - 3062, - 3063, - 3064, - 3065, - 3066, - 3067, - 3068, - 3069, - 3070, - 3071, - 3072, - 3073, - 3074, - 3075, - 3076, - 3077, - 3078, - 3079, - 3080, - 3081, - 3082, - 3083, - 3084, - 3085, - 3086, - 3087, - 3088, - 3089, - 3090, - 3091, - 3092, - 3093, - 3094, - 3095, - 3096, - 3097, - 3098, - 3099, - 3100, - 3101, - 3102, - 3103, - 3104, - 3105, - 3106, - 3107, - 3108, - 3109, - 3110, - 3111, - 3112, - 3113, - 3114, - 3115, - 3116, - 3117, - 3118, - 3119, - 3120, - 3121, - 3122, - 3123, - 3124, - 3125, - 3126, - 3127, - 3128, - 3129, - 3130, - 3131, - 3132, - 3133, - 3134, - 3135, - 3136, - 3137, - 3138, - 3139, - 3140, - 3141, - 3142, - 3143, - 3144, - 3145, - 3146, - 3147, - 3148, - 3149, - 3150, - 3151, - 3152, - 3153, - 3154, - 3155, - 3156, - 3157, - 3158, - 3159, - 3160, - 3161, - 3162, - 3163, - 3164, - 3165, - 3166, - 3167, - 3168, - 3169, - 3170, - 3171, - 3172, - 3173, - 3174, - 3175, - 3176, - 3177, - 3178, - 3179, - 3180, - 3181, - 3182, - 3183, - 3184, - 3185, - 3186, - 3187, - 3188, - 3189, - 3190, - 3191, - 3192, - 3193, - 3194, - 3195, - 3196, - 3197, - 3198, - 3199, - 3200, - 3201, - 3202, - 3203, - 3204, - 3205, - 3206, - 3207, - 3208, - 3209, - 3210, - 3211, - 3212, - 3213, - 3214, - 3215, - 3216, - 3217, - 3218, - 3219, - 3220, - 3221, - 3222, - 3223, - 3224, - 3225, - 3226, - 3227, - 3228, - 3229, - 3230, - 3231, - 3232, - 3233, - 3234, - 3235, - 3236, - 3237, - 3238, - 3239, - 3240, - 3241, - 3242, - 3243, - 3244, - 3245, - 3246, - 3247, - 3248, - 3249, - 3250, - 3251, - 3252, - 3253, - 3254, - 3255, - 3256, - 3257, - 3258, - 3259, - 3260, - 3261, - 3262, - 3263, - 3264, - 3265, - 3266, - 3267, - 3268, - 3269, - 3270, - 3271, - 3272, - 3273, - 3274, - 3275, - 3276, - 3277, - 3278, - 3279, - 3280, - 3281, - 3282, - 3283, - 3284, - 3285, - 3286, - 3287, - 3288, - 3289, - 3290, - 3291, - 3292, - 3293, - 3294, - 3295, - 3296, - 3297, - 3298, - 3299, - 3300, - 3301, - 3302, - 3303, - 3304, - 3305, - 3306, - 3307, - 3308, - 3309, - 3310, - 3311, - 3312, - 3313, - 3314, - 3315, - 3316, - 3317, - 3318, - 3319, - 3320, - 3321, - 3322, - 3323, - 3324, - 3325, - 3326, - 3327, - 3328, - 3329, - 3330, - 3331, - 3332, - 3333, - 3334, - 3335, - 3336, - 3337, - 3338, - 3339, - 3340, - 3341, - 3342, - 3343, - 3344, - 3345, - 3346, - 3347, - 3348, - 3349, - 3350, - 3351, - 3352, - 3353, - 3354, - 3355, - 3356, - 3357, - 3358, - 3359, - 3360, - 3361, - 3362, - 3363, - 3364, - 3365, - 3366, - 3367, - 3368, - 3369, - 3370, - 3371, - 3372, - 3373, - 3374, - 3375, - 3376, - 3377, - 3378, - 3379, - 3380, - 3381, - 3382, - 3383, - 3384, - 3385, - 3386, - 3387, - 3388, - 3389, - 3390, - 3391, - 3392, - 3393, - 3394, - 3395, - 3396, - 3397, - 3398, - 3399, - 3400, - 3401, - 3402, - 3403, - 3404, - 3405, - 3406, - 3407, - 3408, - 3409, - 3410, - 3411, - 3412, - 3413, - 3414, - 3415, - 3416, - 3417, - 3418, - 3419, - 3420, - 3421, - 3422, - 3423, - 3424, - 3425, - 3426, - 3427, - 3428, - 3429, - 3430, - 3431, - 3432, - 3433, - 3434, - 3435, - 3436, - 3437, - 3438, - 3439, - 3440, - 3441, - 3442, - 3443, - 3444, - 3445, - 3446, - 3447, - 3448, - 3449, - 3450, - 3451, - 3452, - 3453, - 3454, - 3455, - 3456, - 3457, - 3458, - 3459, - 3460, - 3461, - 3462, - 3463, - 3464, - 3465, - 3466, - 3467, - 3468, - 3469, - 3470, - 3471, - 3472, - 3473, - 3474, - 3475, - 3476, - 3477, - 3478, - 3479, - 3480, - 3481, - 3482, - 3483, - 3484, - 3485, - 3486, - 3487, - 3488, - 3489, - 3490, - 3491, - 3492, - 3493, - 3494, - 3495, - 3496, - 3497, - 3498, - 3499, - 3500, - 3501, - 3502, - 3503, - 3504, - 3505, - 3506, - 3507, - 3508, - 3509, - 3510, - 3511, - 3512, - 3513, - 3514, - 3515, - 3516, - 3517, - 3518, - 3519, - 3520, - 3521, - 3522, - 3523, - 3524, - 3525, - 3526, - 3527, - 3528, - 3529, - 3530, - 3531, - 3532, - 3533, - 3534, - 3535, - 3536, - 3537, - 3538, - 3539, - 3540, - 3541, - 3542, - 3543, - 3544, - 3545, - 3546, - 3547, - 3548, - 3549, - 3550, - 3551, - 3552, - 3553, - 3554, - 3555, - 3556, - 3557, - 3558, - 3559, - 3560, - 3561, - 3562, - 3563, - 3564, - 3565, - 3566, - 3567, - 3568, - 3569, - 3570, - 3571, - 3572, - 3573, - 3574, - 3575, - 3576, - 3577, - 3578, - 3579, - 3580, - 3581, - 3582, - 3583, - 3584, - 3585, - 3586, - 3587, - 3588, - 3589, - 3590, - 3591, - 3592, - 3593, - 3594, - 3595, - 3596, - 3597, - 3598, - 3599, - 3600, - 3601, - 3602, - 3603, - 3604, - 3605, - 3606, - 3607, - 3608, - 3609, - 3610, - 3611, - 3612, - 3613, - 3614, - 3615, - 3616, - 3617, - 3618, - 3619, - 3620, - 3621, - 3622, - 3623, - 3624, - 3625, - 3626, - 3627, - 3628, - 3629, - 3630, - 3631, - 3632, - 3633, - 3634, - 3635, - 3636, - 3637, - 3638, - 3639, - 3640, - 3641, - 3642, - 3643, - 3644, - 3645, - 3646, - 3647, - 3648, - 3649, - 3650, - 3651, - 3652, - 3653, - 3654, - 3655, - 3656, - 3657, - 3658, - 3659, - 3660, - 3661, - 3662, - 3663, - 3664, - 3665, - 3666, - 3667, - 3668, - 3669, - 3670, - 3671, - 3672, - 3673, - 3674, - 3675, - 3676, - 3677, - 3678, - 3679, - 3680, - 3681, - 3682, - 3683, - 3684, - 3685, - 3686, - 3687, - 3688, - 3689, - 3690, - 3691, - 3692, - 3693, - 3694, - 3695, - 3696, - 3697, - 3698, - 3699, - 3700, - 3701, - 3702, - 3703, - 3704, - 3705, - 3706, - 3707, - 3708, - 3709, - 3710, - 3711, - 3712, - 3713, - 3714, - 3715, - 3716, - 3717, - 3718, - 3719, - 3720, - 3721, - 3722, - 3723, - 3724, - 3725, - 3726, - 3727, - 3728, - 3729, - 3730, - 3731, - 3732, - 3733, - 3734, - 3735, - 3736, - 3737, - 3738, - 3739, - 3740, - 3741, - 3742, - 3743, - 3744, - 3745, - 3746, - 3747, - 3748, - 3749, - 3750, - 3751, - 3752, - 3753, - 3754, - 3755, - 3756, - 3757, - 3758, - 3759, - 3760, - 3761, - 3762, - 3763, - 3764, - 3765, - 3766, - 3767, - 3768, - 3769, - 3770, - 3771, - 3772, - 3773, - 3774, - 3775, - 3776, - 3777, - 3778, - 3779, - 3780, - 3781, - 3782, - 3783, - 3784, - 3785, - 3786, - 3787, - 3788, - 3789, - 3790, - 3791, - 3792, - 3793, - 3794, - 3795, - 3796, - 3797, - 3798, - 3799, - 3800, - 3801, - 3802, - 3803, - 3804, - 3805, - 3806, - 3807, - 3808, - 3809, - 3810, - 3811, - 3812, - 3813, - 3814, - 3815, - 3816, - 3817, - 3818, - 3819, - 3820, - 3821, - 3822, - 3823, - 3824, - 3825, - 3826, - 3827, - 3828, - 3829, - 3830, - 3831, - 3832, - 3833, - 3834, - 3835, - 3836, - 3837, - 3838, - 3839, - 3840, - 3841, - 3842, - 3843, - 3844, - 3845, - 3846, - 3847, - 3848, - 3849, - 3850, - 3851, - 3852, - 3853, - 3854, - 3855, - 3856, - 3857, - 3858, - 3859, - 3860, - 3861, - 3862, - 3863, - 3864, - 3865, - 3866, - 3867, - 3868, - 3869, - 3870, - 3871, - 3872, - 3873, - 3874, - 3875, - 3876, - 3877, - 3878, - 3879, - 3880, - 3881, - 3882, - 3883, - 3884, - 3885, - 3886, - 3887, - 3888, - 3889, - 3890, - 3891, - 3892, - 3893, - 3894, - 3895, - 3896, - 3897, - 3898, - 3899, - 3900, - 3901, - 3902, - 3903, - 3904, - 3905, - 3906, - 3907, - 3908, - 3909, - 3910, - 3911, - 3912, - 3913, - 3914, - 3915, - 3916, - 3917, - 3918, - 3919, - 3920, - 3921, - 3922, - 3923, - 3924, - 3925, - 3926, - 3927, - 3928, - 3929, - 3930, - 3931, - 3932, - 3933, - 3934, - 3935, - 3936, - 3937, - 3938, - 3939, - 3940, - 3941, - 3942, - 3943, - 3944, - 3945, - 3946, - 3947, - 3948, - 3949, - 3950, - 3951, - 3952, - 3953, - 3954, - 3955, - 3956, - 3957, - 3958, - 3959, - 3960, - 3961, - 3962, - 3963, - 3964, - 3965, - 3966, - 3967, - 3968, - 3969, - 3970, - 3971, - 3972, - 3973, - 3974, - 3975, - 3976, - 3977, - 3978, - 3979, - 3980, - 3981, - 3982, - 3983, - 3984, - 3985, - 3986, - 3987, - 3988, - 3989, - 3990, - 3991, - 3992, - 3993, - 3994, - 3995, - 3996, - 3997, - 3998, - 3999, - 4000, - 4001, - 4002, - 4003, - 4004, - 4005, - 4006, - 4007, - 4008, - 4009, - 4010, - 4011, - 4012, - 4013, - 4014, - 4015, - 4016, - 4017, - 4018, - 4019, - 4020, - 4021, - 4022, - 4023, - 4024, - 4025, - 4026, - 4027, - 4028, - 4029, - 4030, - 4031, - 4032, - 4033, - 4034, - 4035, - 4036, - 4037, - 4038, - 4039, - 4040, - 4041, - 4042, - 4043, - 4044, - 4045, - 4046, - 4047, - 4048, - 4049, - 4050, - 4051, - 4052, - 4053, - 4054, - 4055, - 4056, - 4057, - 4058, - 4059, - 4060, - 4061, - 4062, - 4063, - 4064, - 4065, - 4066, - 4067, - 4068, - 4069, - 4070, - 4071, - 4072, - 4073, - 4074, - 4075, - 4076, - 4077, - 4078, - 4079, - 4080, - 4081, - 4082, - 4083, - 4084, - 4085, - 4086, - 4087, - 4088, - 4089, - 4090, - 4091, - 4092, - 4093, - 4094, - 4095, - 4096, - 4097, - 4098, - 4099, - 4100, - 4101, - 4102, - 4103, - 4104, - 4105, - 4106, - 4107, - 4108, - 4109, - 4110, - 4111, - 4112, - 4113, - 4114, - 4115, - 4116, - 4117, - 4118, - 4119, - 4120, - 4121, - 4122, - 4123, - 4124, - 4125, - 4126, - 4127, - 4128, - 4129, - 4130, - 4131, - 4132, - 4133, - 4134, - 4135, - 4136, - 4137, - 4138, - 4139, - 4140, - 4141, - 4142, - 4143, - 4144, - 4145, - 4146, - 4147, - 4148, - 4149, - 4150, - 4151, - 4152, - 4153, - 4154, - 4155, - 4156, - 4157, - 4158, - 4159, - 4160, - 4161, - 4162, - 4163, - 4164, - 4165, - 4166, - 4167, - 4168, - 4169, - 4170, - 4171, - 4172, - 4173, - 4174, - 4175, - 4176, - 4177, - 4178, - 4179, - 4180, - 4181, - 4182, - 4183, - 4184, - 4185, - 4186, - 4187, - 4188, - 4189, - 4190, - 4191, - 4192, - 4193, - 4194, - 4195, - 4196, - 4197, - 4198, - 4199, - 4200, - 4201, - 4202, - 4203, - 4204, - 4205, - 4206, - 4207, - 4208, - 4209, - 4210, - 4211, - 4212, - 4213, - 4214, - 4215, - 4216, - 4217, - 4218, - 4219, - 4220, - 4221, - 4222, - 4223, - 4224, - 4225, - 4226, - 4227, - 4228, - 4229, - 4230, - 4231, - 4232, - 4233, - 4234, - 4235, - 4236, - 4237, - 4238, - 4239, - 4240, - 4241, - 4242, - 4243, - 4244, - 4245, - 4246, - 4247, - 4248, - 4249, - 4250, - 4251, - 4252, - 4253, - 4254, - 4255, - 4256, - 4257, - 4258, - 4259, - 4260, - 4261, - 4262, - 4263, - 4264, - 4265, - 4266, - 4267, - 4268, - 4269, - 4270, - 4271, - 4272, - 4273, - 4274, - 4275, - 4276, - 4277, - 4278, - 4279, - 4280, - 4281, - 4282, - 4283, - 4284, - 4285, - 4286, - 4287, - 4288, - 4289, - 4290, - 4291, - 4292, - 4293, - 4294, - 4295, - 4296, - 4297, - 4298, - 4299, - 4300, - 4301, - 4302, - 4303, - 4304, - 4305, - 4306, - 4307, - 4308, - 4309, - 4310, - 4311, - 4312, - 4313, - 4314, - 4315, - 4316, - 4317, - 4318, - 4319, - 4320, - 4321, - 4322, - 4323, - 4324, - 4325, - 4326, - 4327, - 4328, - 4329, - 4330, - 4331, - 4332, - 4333, - 4334, - 4335, - 4336, - 4337, - 4338, - 4339, - 4340, - 4341, - 4342, - 4343, - 4344, - 4345, - 4346, - 4347, - 4348, - 4349, - 4350, - 4351, - 4352, - 4353, - 4354, - 4355, - 4356, - 4357, - 4358, - 4359, - 4360, - 4361, - 4362, - 4363, - 4364, - 4365, - 4366, - 4367, - 4368, - 4369, - 4370, - 4371, - 4372, - 4373, - 4374, - 4375, - 4376, - 4377, - 4378, - 4379, - 4380, - 4381, - 4382, - 4383, - 4384, - 4385, - 4386, - 4387, - 4388, - 4389, - 4390, - 4391, - 4392, - 4393, - 4394, - 4395, - 4396, - 4397, - 4398, - 4399, - 4400, - 4401, - 4402, - 4403, - 4404, - 4405, - 4406, - 4407, - 4408, - 4409, - 4410, - 4411, - 4412, - 4413, - 4414, - 4415, - 4416, - 4417, - 4418, - 4419, - 4420, - 4421, - 4422, - 4423, - 4424, - 4425, - 4426, - 4427, - 4428, - 4429, - 4430, - 4431, - 4432, - 4433, - 4434, - 4435, - 4436, - 4437, - 4438, - 4439, - 4440, - 4441, - 4442, - 4443, - 4444, - 4445, - 4446, - 4447, - 4448, - 4449, - 4450, - 4451, - 4452, - 4453, - 4454, - 4455, - 4456, - 4457, - 4458, - 4459, - 4460, - 4461, - 4462, - 4463, - 4464, - 4465, - 4466, - 4467, - 4468, - 4469, - 4470, - 4471, - 4472, - 4473, - 4474, - 4475, - 4476, - 4477, - 4478, - 4479, - 4480, - 4481, - 4482, - 4483, - 4484, - 4485, - 4486, - 4487, - 4488, - 4489, - 4490, - 4491, - 4492, - 4493, - 4494, - 4495, - 4496, - 4497, - 4498, - 4499, - 4500, - 4501, - 4502, - 4503, - 4504, - 4505, - 4506, - 4507, - 4508, - 4509, - 4510, - 4511, - 4512, - 4513, - 4514, - 4515, - 4516, - 4517, - 4518, - 4519, - 4520, - 4521, - 4522, - 4523, - 4524, - 4525, - 4526, - 4527, - 4528, - 4529, - 4530, - 4531, - 4532, - 4533, - 4534, - 4535, - 4536, - 4537, - 4538, - 4539, - 4540, - 4541, - 4542, - 4543, - 4544, - 4545, - 4546, - 4547, - 4548, - 4549, - 4550, - 4551, - 4552, - 4553, - 4554, - 4555, - 4556, - 4557, - 4558, - 4559, - 4560, - 4561, - 4562, - 4563, - 4564, - 4565, - 4566, - 4567, - 4568, - 4569, - 4570, - 4571, - 4572, - 4573, - 4574, - 4575, - 4576, - 4577, - 4578, - 4579, - 4580, - 4581, - 4582, - 4583, - 4584, - 4585, - 4586, - 4587, - 4588, - 4589, - 4590, - 4591, - 4592, - 4593, - 4594, - 4595, - 4596, - 4597, - 4598, - 4599, - 4600, - 4601, - 4602, - 4603, - 4604, - 4605, - 4606, - 4607, - 4608, - 4609, - 4610, - 4611, - 4612, - 4613, - 4614, - 4615, - 4616, - 4617, - 4618, - 4619, - 4620, - 4621, - 4622, - 4623, - 4624, - 4625, - 4626, - 4627, - 4628, - 4629, - 4630, - 4631, - 4632, - 4633, - 4634, - 4635, - 4636, - 4637, - 4638, - 4639, - 4640, - 4641, - 4642, - 4643, - 4644, - 4645, - 4646, - 4647, - 4648, - 4649, - 4650, - 4651, - 4652, - 4653, - 4654, - 4655, - 4656, - 4657, - 4658, - 4659, - 4660, - 4661, - 4662, - 4663, - 4664, - 4665, - 4666, - 4667, - 4668, - 4669, - 4670, - 4671, - 4672, - 4673, - 4674, - 4675, - 4676, - 4677, - 4678, - 4679, - 4680, - 4681, - 4682, - 4683, - 4684, - 4685, - 4686, - 4687, - 4688, - 4689, - 4690, - 4691, - 4692, - 4693, - 4694, - 4695, - 4696, - 4697, - 4698, - 4699, - 4700, - 4701, - 4702, - 4703, - 4704, - 4705, - 4706, - 4707, - 4708, - 4709, - 4710, - 4711, - 4712, - 4713, - 4714, - 4715, - 4716, - 4717, - 4718, - 4719, - 4720, - 4721, - 4722, - 4723, - 4724, - 4725, - 4726, - 4727, - 4728, - 4729, - 4730, - 4731, - 4732, - 4733, - 4734, - 4735, - 4736, - 4737, - 4738, - 4739, - 4740, - 4741, - 4742, - 4743, - 4744, - 4745, - 4746, - 4747, - 4748, - 4749, - 4750, - 4751, - 4752, - 4753, - 4754, - 4755, - 4756, - 4757, - 4758, - 4759, - 4760, - 4761, - 4762, - 4763, - 4764, - 4765, - 4766, - 4767, - 4768, - 4769, - 4770, - 4771, - 4772, - 4773, - 4774, - 4775, - 4776, - 4777, - 4778, - 4779, - 4780, - 4781, - 4782, - 4783, - 4784, - 4785, - 4786, - 4787, - 4788, - 4789, - 4790, - 4791, - 4792, - 4793, - 4794, - 4795, - 4796, - 4797, - 4798, - 4799, - 4800, - 4801, - 4802, - 4803, - 4804, - 4805, - 4806, - 4807, - 4808, - 4809, - 4810, - 4811, - 4812, - 4813, - 4814, - 4815, - 4816, - 4817, - 4818, - 4819, - 4820, - 4821, - 4822, - 4823, - 4824, - 4825, - 4826, - 4827, - 4828, - 4829, - 4830, - 4831, - 4832, - 4833, - 4834, - 4835, - 4836, - 4837, - 4838, - 4839, - 4840, - 4841, - 4842, - 4843, - 4844, - 4845, - 4846, - 4847, - 4848, - 4849, - 4850, - 4851, - 4852, - 4853, - 4854, - 4855, - 4856, - 4857, - 4858, - 4859, - 4860, - 4861, - 4862, - 4863, - 4864, - 4865, - 4866, - 4867, - 4868, - 4869, - 4870, - 4871, - 4872, - 4873, - 4874, - 4875, - 4876, - 4877, - 4878, - 4879, - 4880, - 4881, - 4882, - 4883, - 4884, - 4885, - 4886, - 4887, - 4888, - 4889, - 4890, - 4891, - 4892, - 4893, - 4894, - 4895, - 4896, - 4897, - 4898, - 4899, - 4900, - 4901, - 4902, - 4903, - 4904, - 4905, - 4906, - 4907, - 4908, - 4909, - 4910, - 4911, - 4912, - 4913, - 4914, - 4915, - 4916, - 4917, - 4918, - 4919, - 4920, - 4921, - 4922, - 4923, - 4924, - 4925, - 4926, - 4927, - 4928, - 4929, - 4930, - 4931, - 4932, - 4933, - 4934, - 4935, - 4936, - 4937, - 4938, - 4939, - 4940, - 4941, - 4942, - 4943, - 4944, - 4945, - 4946, - 4947, - 4948, - 4949, - 4950, - 4951, - 4952, - 4953, - 4954, - 4955, - 4956, - 4957, - 4958, - 4959, - 4960, - 4961, - 4962, - 4963, - 4964, - 4965, - 4966, - 4967, - 4968, - 4969, - 4970, - 4971, - 4972, - 4973, - 4974, - 4975, - 4976, - 4977, - 4978, - 4979, - 4980, - 4981, - 4982, - 4983, - 4984, - 4985, - 4986, - 4987, - 4988, - 4989, - 4990, - 4991, - 4992, - 4993, - 4994, - 4995, - 4996, - 4997, - 4998, - 4999, - 5000, - 5001, - 5002, - 5003, - 5004, - 5005, - 5006, - 5007, - 5008, - 5009, - 5010, - 5011, - 5012, - 5013, - 5014, - 5015, - 5016, - 5017, - 5018, - 5019, - 5020, - 5021, - 5022, - 5023, - 5024, - 5025, - 5026, - 5027, - 5028, - 5029, - 5030, - 5031, - 5032, - 5033, - 5034, - 5035, - 5036, - 5037, - 5038, - 5039, - 5040, - 5041, - 5042, - 5043, - 5044, - 5045, - 5046, - 5047, - 5048, - 5049, - 5050, - 5051, - 5052, - 5053, - 5054, - 5055, - 5056, - 5057, - 5058, - 5059, - 5060, - 5061, - 5062, - 5063, - 5064, - 5065, - 5066, - 5067, - 5068, - 5069, - 5070, - 5071, - 5072, - 5073, - 5074, - 5075, - 5076, - 5077, - 5078, - 5079, - 5080, - 5081, - 5082, - 5083, - 5084, - 5085, - 5086, - 5087, - 5088, - 5089, - 5090, - 5091, - 5092, - 5093, - 5094, - 5095, - 5096, - 5097, - 5098, - 5099, - 5100, - 5101, - 5102, - 5103, - 5104, - 5105, - 5106, - 5107, - 5108, - 5109, - 5110, - 5111, - 5112, - 5113, - 5114, - 5115, - 5116, - 5117, - 5118, - 5119, - 5120, - 5121, - 5122, - 5123, - 5124, - 5125, - 5126, - 5127, - 5128, - 5129, - 5130, - 5131, - 5132, - 5133, - 5134, - 5135, - 5136, - 5137, - 5138, - 5139, - 5140, - 5141, - 5142, - 5143, - 5144, - 5145, - 5146, - 5147, - 5148, - 5149, - 5150, - 5151, - 5152, - 5153, - 5154, - 5155, - 5156, - 5157, - 5158, - 5159, - 5160, - 5161, - 5162, - 5163, - 5164, - 5165, - 5166, - 5167, - 5168, - 5169, - 5170, - 5171, - 5172, - 5173, - 5174, - 5175, - 5176, - 5177, - 5178, - 5179, - 5180, - 5181, - 5182, - 5183, - 5184, - 5185, - 5186, - 5187, - 5188, - 5189, - 5190, - 5191, - 5192, - 5193, - 5194, - 5195, - 5196, - 5197, - 5198, - 5199, - 5200, - 5201, - 5202, - 5203, - 5204, - 5205, - 5206, - 5207, - 5208, - 5209, - 5210, - 5211, - 5212, - 5213, - 5214, - 5215, - 5216, - 5217, - 5218, - 5219, - 5220, - 5221, - 5222, - 5223, - 5224, - 5225, - 5226, - 5227, - 5228, - 5229, - 5230, - 5231, - 5232, - 5233, - 5234, - 5235, - 5236, - 5237, - 5238, - 5239, - 5240, - 5241, - 5242, - 5243, - 5244, - 5245, - 5246, - 5247, - 5248, - 5249, - 5250, - 5251, - 5252, - 5253, - 5254, - 5255, - 5256, - 5257, - 5258, - 5259, - 5260, - 5261, - 5262, - 5263, - 5264, - 5265, - 5266, - 5267, - 5268, - 5269, - 5270, - 5271, - 5272, - 5273, - 5274, - 5275, - 5276, - 5277, - 5278, - 5279, - 5280, - 5281, - 5282, - 5283, - 5284, - 5285, - 5286, - 5287, - 5288, - 5289, - 5290, - 5291, - 5292, - 5293, - 5294, - 5295, - 5296, - 5297, - 5298, - 5299, - 5300, - 5301, - 5302, - 5303, - 5304, - 5305, - 5306, - 5307, - 5308, - 5309, - 5310, - 5311, - 5312, - 5313, - 5314, - 5315, - 5316, - 5317, - 5318, - 5319, - 5320, - 5321, - 5322, - 5323, - 5324, - 5325, - 5326, - 5327, - 5328, - 5329, - 5330, - 5331, - 5332, - 5333, - 5334, - 5335, - 5336, - 5337, - 5338, - 5339, - 5340, - 5341, - 5342, - 5343, - 5344, - 5345, - 5346, - 5347, - 5348, - 5349, - 5350, - 5351, - 5352, - 5353, - 5354, - 5355, - 5356, - 5357, - 5358, - 5359, - 5360, - 5361, - 5362, - 5363, - 5364, - 5365, - 5366, - 5367, - 5368, - 5369, - 5370, - 5371, - 5372, - 5373, - 5374, - 5375, -}; - -#endif //SHAPE_DATA_H diff --git a/engine/inc/bullet/OpenGLWindow/SimpleCamera.h b/engine/inc/bullet/OpenGLWindow/SimpleCamera.h deleted file mode 100644 index c50ff67c..00000000 --- a/engine/inc/bullet/OpenGLWindow/SimpleCamera.h +++ /dev/null @@ -1,60 +0,0 @@ -#ifndef SIMPLE_CAMERA_H -#define SIMPLE_CAMERA_H - -#include "../CommonInterfaces/CommonCameraInterface.h" - -struct SimpleCamera : public CommonCameraInterface -{ - struct SimpleCameraInternalData* m_data; - - SimpleCamera(); - virtual ~SimpleCamera(); - - void update(); - virtual void getCameraProjectionMatrix(float m[16]) const; - virtual void getCameraViewMatrix(float m[16]) const; - - virtual void setVRCamera(const float viewMat[16], const float projectionMatrix[16]); - virtual bool getVRCamera(float viewMat[16], float projectionMatrix[16]); - - virtual void setVRCameraOffsetTransform(const float offset[16]); - virtual void disableVRCamera(); - - virtual bool isVRCamera() const; - - virtual void getCameraTargetPosition(float pos[3]) const; - virtual void getCameraPosition(float pos[3]) const; - - virtual void getCameraTargetPosition(double pos[3]) const; - virtual void getCameraPosition(double pos[3]) const; - - virtual void setCameraTargetPosition(float x, float y, float z); - virtual void setCameraDistance(float dist); - virtual float getCameraDistance() const; - - virtual void setCameraUpVector(float x, float y, float z); - void getCameraUpVector(float up[3]) const; - - void getCameraForwardVector(float fwd[3]) const; - - ///the setCameraUpAxis will call the 'setCameraUpVector' and 'setCameraForwardVector' - virtual void setCameraUpAxis(int axis); - virtual int getCameraUpAxis() const; - - virtual void setCameraYaw(float yaw); - virtual float getCameraYaw() const; - - virtual void setCameraPitch(float pitch); - virtual float getCameraPitch() const; - - virtual void setAspectRatio(float ratio); - virtual float getAspectRatio() const; - - virtual float getCameraFrustumFar() const; - virtual float getCameraFrustumNear() const; - - virtual void setCameraFrustumFar(float far); - virtual void setCameraFrustumNear(float near); -}; - -#endif //SIMPLE_CAMERA_H diff --git a/engine/inc/bullet/OpenGLWindow/SimpleOpenGL2App.h b/engine/inc/bullet/OpenGLWindow/SimpleOpenGL2App.h deleted file mode 100644 index 467ed169..00000000 --- a/engine/inc/bullet/OpenGLWindow/SimpleOpenGL2App.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef SIMPLE_OPENGL2_APP_H -#define SIMPLE_OPENGL2_APP_H - -#include "../CommonInterfaces/CommonGraphicsAppInterface.h" - -class SimpleOpenGL2App : public CommonGraphicsApp -{ -protected: - struct SimpleOpenGL2AppInternalData* m_data; - -public: - SimpleOpenGL2App(const char* title, int width, int height); - virtual ~SimpleOpenGL2App(); - - virtual void drawGrid(DrawGridData data = DrawGridData()); - virtual void setUpAxis(int axis); - virtual int getUpAxis() const; - - virtual void swapBuffer(); - virtual void drawText(const char* txt, int posX, int posY, float size, float colorRGBA[4]); - - virtual void drawTexturedRect(float x0, float y0, float x1, float y1, float color[4], float u0, float v0, float u1, float v1, int useRGBA){}; - virtual void setBackgroundColor(float red, float green, float blue); - virtual int registerCubeShape(float halfExtentsX, float halfExtentsY, float halfExtentsZ, int textureIndex = -1, float textureScaling = 1); - - virtual int registerGraphicsUnitSphereShape(EnumSphereLevelOfDetail lod, int textureId = -1); - virtual void drawText3D(const char* txt, float posX, float posZY, float posZ, float size); - virtual void drawText3D(const char* txt, float position[3], float orientation[4], float color[4], float size, int optionFlag); - - virtual void registerGrid(int xres, int yres, float color0[4], float color1[4]); -}; -#endif //SIMPLE_OPENGL2_APP_H \ No newline at end of file diff --git a/engine/inc/bullet/OpenGLWindow/SimpleOpenGL2Renderer.h b/engine/inc/bullet/OpenGLWindow/SimpleOpenGL2Renderer.h deleted file mode 100644 index 19cc8cc1..00000000 --- a/engine/inc/bullet/OpenGLWindow/SimpleOpenGL2Renderer.h +++ /dev/null @@ -1,93 +0,0 @@ - -#ifndef SIMPLE_OPENGL2_RENDERER_H -#define SIMPLE_OPENGL2_RENDERER_H - -#include "../CommonInterfaces/CommonRenderInterface.h" -#include "SimpleCamera.h" - -class SimpleOpenGL2Renderer : public CommonRenderInterface -{ - struct SimpleOpenGL2RendererInternalData* m_data; - - void drawSceneInternal(int pass, int cameraUpAxis); - void drawOpenGL(int instanceIndex); - -public: - SimpleOpenGL2Renderer(int width, int height); - virtual ~SimpleOpenGL2Renderer(); - - virtual void init(); - - virtual void updateCamera(int upAxis); - - virtual const CommonCameraInterface* getActiveCamera() const; - virtual CommonCameraInterface* getActiveCamera(); - virtual void setActiveCamera(CommonCameraInterface* cam); - - virtual void setLightPosition(const float lightPos[3]); - virtual void setLightPosition(const double lightPos[3]); - virtual void setShadowMapResolution(int shadowMapResolution) {} - virtual void setShadowMapIntensity(double shadowMapIntensity) {} - virtual void setShadowMapWorldSize(float worldSize) {} - virtual void resize(int width, int height); - - virtual void removeAllInstances(); - virtual void removeGraphicsInstance(int instanceUid); - - virtual bool readSingleInstanceTransformToCPU(float* position, float* orientation, int srcIndex); - virtual void writeSingleInstanceColorToCPU(const float* color, int srcIndex); - virtual void writeSingleInstanceColorToCPU(const double* color, int srcIndex); - virtual void writeSingleInstanceScaleToCPU(const float* scale, int srcIndex); - virtual void writeSingleInstanceScaleToCPU(const double* scale, int srcIndex); - virtual void writeSingleInstanceSpecularColorToCPU(const double* specular, int srcIndex) {} - virtual void writeSingleInstanceSpecularColorToCPU(const float* specular, int srcIndex) {} - virtual void writeSingleInstanceFlagsToCPU(int flags, int srcIndex) {} - virtual void getCameraViewMatrix(float viewMat[16]) const; - virtual void getCameraProjectionMatrix(float projMat[16]) const; - virtual void drawTexturedTriangleMesh(float worldPosition[3], float worldOrientation[4], const float* vertices, int numvertices, const unsigned int* indices, int numIndices, float color[4], int textureIndex = -1, int vertexLayout = 0) - { - } - - virtual void renderScene(); - - virtual int getScreenWidth(); - virtual int getScreenHeight(); - virtual int registerTexture(const unsigned char* texels, int width, int height, bool flipTexelsY); - virtual void updateTexture(int textureIndex, const unsigned char* texels, bool flipTexelsY); - virtual void activateTexture(int textureIndex); - virtual void removeTexture(int textureIndex); - - virtual int registerGraphicsInstance(int shapeIndex, const double* position, const double* quaternion, const double* color, const double* scaling); - - virtual int registerGraphicsInstance(int shapeIndex, const float* position, const float* quaternion, const float* color, const float* scaling); - - virtual void drawLines(const float* positions, const float color[4], int numPoints, int pointStrideInBytes, const unsigned int* indices, int numIndices, float pointDrawSize); - - virtual void drawLine(const float from[4], const float to[4], const float color[4], float lineWidth); - - virtual int registerShape(const float* vertices, int numvertices, const int* indices, int numIndices, int primitiveType = B3_GL_TRIANGLES, int textureIndex = -1); - - virtual void writeSingleInstanceTransformToCPU(const float* position, const float* orientation, int srcIndex); - - virtual void writeSingleInstanceTransformToCPU(const double* position, const double* orientation, int srcIndex); - - virtual int getTotalNumInstances() const; - - virtual void writeTransforms(); - - virtual void drawLine(const double from[4], const double to[4], const double color[4], double lineWidth); - - virtual void drawPoint(const float* position, const float color[4], float pointDrawSize); - - virtual void drawPoint(const double* position, const double color[4], double pointDrawSize); - - virtual void updateShape(int shapeIndex, const float* vertices, int numVertices); - - virtual void clearZBuffer(); - - virtual struct GLInstanceRendererInternalData* getInternalData() - { - return 0; - } -}; -#endif //SIMPLE_OPENGL2_RENDERER_H diff --git a/engine/inc/bullet/OpenGLWindow/SimpleOpenGL3App.h b/engine/inc/bullet/OpenGLWindow/SimpleOpenGL3App.h deleted file mode 100644 index c90f4738..00000000 --- a/engine/inc/bullet/OpenGLWindow/SimpleOpenGL3App.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef SIMPLE_OPENGL3_APP_H -#define SIMPLE_OPENGL3_APP_H - -#include "../OpenGLWindow/GLInstancingRenderer.h" -#include "../OpenGLWindow/GLPrimitiveRenderer.h" -#include "../CommonInterfaces/CommonWindowInterface.h" - -#include "../CommonInterfaces/CommonGraphicsAppInterface.h" - -struct SimpleOpenGL3App : public CommonGraphicsApp -{ - struct SimpleInternalData* m_data; - - class GLPrimitiveRenderer* m_primRenderer; - class GLInstancingRenderer* m_instancingRenderer; - virtual void setBackgroundColor(float red, float green, float blue); - virtual void setMp4Fps(int fps); - - SimpleOpenGL3App(const char* title, int width, int height, bool allowRetina = true, int windowType = 0, int renderDevice = -1, int maxNumObjectCapacity = 128 * 1024, int maxShapeCapacityInBytes = 128 * 1024 * 1024); - - virtual ~SimpleOpenGL3App(); - - virtual int registerCubeShape(float halfExtentsX = 1.f, float halfExtentsY = 1.f, float halfExtentsZ = 1.f, int textureIndex = -1, float textureScaling = 1); - virtual int registerGraphicsUnitSphereShape(EnumSphereLevelOfDetail lod, int textureId = -1); - virtual void registerGrid(int xres, int yres, float color0[4], float color1[4]); - void dumpNextFrameToPng(const char* pngFilename); - void dumpFramesToVideo(const char* mp4Filename); - virtual void getScreenPixels(unsigned char* rgbaBuffer, int bufferSizeInBytes, float* depthBuffer, int depthBufferSizeInBytes); - virtual void setViewport(int width, int height); - - void drawGrid(DrawGridData data = DrawGridData()); - virtual void setUpAxis(int axis); - virtual int getUpAxis() const; - - virtual void swapBuffer(); - virtual void drawText(const char* txt, int posX, int posY, float size, float colorRGBA[4]); - virtual void drawText3D(const char* txt, float posX, float posZY, float posZ, float size); - virtual void drawText3D(const char* txt, float position[3], float orientation[4], float color[4], float size, int optionFlag); - - virtual void drawTexturedRect(float x0, float y0, float x1, float y1, float color[4], float u0, float v0, float u1, float v1, int useRGBA); - struct sth_stash* getFontStash(); -}; - -#endif //SIMPLE_OPENGL3_APP_H diff --git a/engine/inc/bullet/OpenGLWindow/TwFonts.h b/engine/inc/bullet/OpenGLWindow/TwFonts.h deleted file mode 100644 index 6980ae4b..00000000 --- a/engine/inc/bullet/OpenGLWindow/TwFonts.h +++ /dev/null @@ -1,62 +0,0 @@ -// --------------------------------------------------------------------------- -// -// @file TwFonts.h -// @brief Bitmaps fonts -// @author Philippe Decaudin - http://www.antisphere.com -// @license This file is part of the AntTweakBar library. -// For conditions of distribution and use, see License.txt -// -// note: Private header -// -// --------------------------------------------------------------------------- - -#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_DefaultNormalFontAA; -extern CTexFont *g_DefaultLargeFont; -extern CTexFont *g_DefaultFixed1Font; - -void TwGenerateDefaultFonts(); -void TwDeleteDefaultFonts(); - -#endif // !defined ANT_TW_FONTS_INCLUDED diff --git a/engine/inc/bullet/OpenGLWindow/Win32InternalWindowData.h b/engine/inc/bullet/OpenGLWindow/Win32InternalWindowData.h deleted file mode 100644 index 542ab74c..00000000 --- a/engine/inc/bullet/OpenGLWindow/Win32InternalWindowData.h +++ /dev/null @@ -1,65 +0,0 @@ - -#ifndef WIN32_INTERNAL_WINDOW_DATA_H -#define WIN32_INTERNAL_WINDOW_DATA_H - -#include - -struct InternalData2 -{ - HWND m_hWnd; - ; - int m_fullWindowWidth; //includes borders etc - int m_fullWindowHeight; - - int m_openglViewportWidth; //just the 3d viewport/client area - int m_openglViewportHeight; - - HDC m_hDC; - HGLRC m_hRC; - bool m_OpenGLInitialized; - int m_oldScreenWidth; - int m_oldHeight; - int m_oldBitsPerPel; - bool m_quit; - int m_mouseLButton; - int m_mouseRButton; - int m_mouseMButton; - int m_mouseXpos; - int m_mouseYpos; - - int m_internalKeyModifierFlags; - - b3WheelCallback m_wheelCallback; - b3MouseMoveCallback m_mouseMoveCallback; - b3MouseButtonCallback m_mouseButtonCallback; - b3ResizeCallback m_resizeCallback; - b3KeyboardCallback m_keyboardCallback; - - InternalData2() - { - m_hWnd = 0; - m_mouseLButton = 0; - m_mouseRButton = 0; - m_mouseMButton = 0; - m_internalKeyModifierFlags = 0; - m_fullWindowWidth = 0; - m_fullWindowHeight = 0; - m_openglViewportHeight = 0; - m_openglViewportWidth = 0; - m_hDC = 0; - m_hRC = 0; - m_OpenGLInitialized = false; - m_oldScreenWidth = 0; - m_oldHeight = 0; - m_oldBitsPerPel = 0; - m_quit = false; - - m_keyboardCallback = 0; - m_mouseMoveCallback = 0; - m_mouseButtonCallback = 0; - m_resizeCallback = 0; - m_wheelCallback = 0; - } -}; - -#endif //WIN32_INTERNAL_WINDOW_DATA_H \ No newline at end of file diff --git a/engine/inc/bullet/OpenGLWindow/Win32OpenGLWindow.h b/engine/inc/bullet/OpenGLWindow/Win32OpenGLWindow.h deleted file mode 100644 index 7864df83..00000000 --- a/engine/inc/bullet/OpenGLWindow/Win32OpenGLWindow.h +++ /dev/null @@ -1,56 +0,0 @@ -/* -Copyright (c) 2012 Advanced Micro Devices, Inc. - -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 Erwin Coumans - -#ifndef _WIN32_OPENGL_RENDER_MANAGER_H -#define _WIN32_OPENGL_RENDER_MANAGER_H - -#include "Win32Window.h" - -#define b3gDefaultOpenGLWindow Win32OpenGLWindow - -class Win32OpenGLWindow : public Win32Window -{ - bool m_OpenGLInitialized; - -protected: - void enableOpenGL(); - - void disableOpenGL(); - -public: - Win32OpenGLWindow(); - - virtual ~Win32OpenGLWindow(); - - virtual void createWindow(const b3gWindowConstructionInfo& ci); - - virtual void closeWindow(); - - virtual void startRendering(); - - virtual void renderAllObjects(); - - virtual void endRendering(); - - virtual float getRetinaScale() const { return 1.f; } - virtual void setAllowRetina(bool /*allowRetina*/){}; - - virtual int getWidth() const; - virtual int getHeight() const; - - virtual int fileOpenDialog(char* fileName, int maxFileNameLength); -}; - -#endif //_WIN32_OPENGL_RENDER_MANAGER_H diff --git a/engine/inc/bullet/OpenGLWindow/Win32Window.h b/engine/inc/bullet/OpenGLWindow/Win32Window.h deleted file mode 100644 index dcf81980..00000000 --- a/engine/inc/bullet/OpenGLWindow/Win32Window.h +++ /dev/null @@ -1,78 +0,0 @@ -/* -Copyright (c) 2012 Advanced Micro Devices, Inc. - -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 Erwin Coumans - -#ifndef _WIN32_WINDOW_H -#define _WIN32_WINDOW_H - -struct InternalData2; - -#include "../CommonInterfaces/CommonWindowInterface.h" - -class Win32Window : public CommonWindowInterface -{ -protected: - struct InternalData2* m_data; - - void pumpMessage(); - -public: - Win32Window(); - - virtual ~Win32Window(); - - virtual void createWindow(const b3gWindowConstructionInfo& ci); - - virtual void switchFullScreen(bool fullscreen, int width = 0, int height = 0, int colorBitsPerPixel = 0); - - virtual void closeWindow(); - - virtual void runMainLoop(); - - virtual void startRendering(); - - virtual void renderAllObjects(); - - virtual void endRendering(); - - virtual float getTimeInSeconds(); - - virtual void setDebugMessage(int x, int y, const char* message); - - virtual bool requestedExit() const; - - virtual void setRequestExit(); - - virtual void getMouseCoordinates(int& x, int& y); - - virtual void setMouseMoveCallback(b3MouseMoveCallback mouseCallback); - virtual void setMouseButtonCallback(b3MouseButtonCallback mouseCallback); - virtual void setResizeCallback(b3ResizeCallback resizeCallback); - virtual void setWheelCallback(b3WheelCallback wheelCallback); - virtual void setKeyboardCallback(b3KeyboardCallback keyboardCallback); - - virtual b3MouseMoveCallback getMouseMoveCallback(); - virtual b3MouseButtonCallback getMouseButtonCallback(); - virtual b3ResizeCallback getResizeCallback(); - virtual b3WheelCallback getWheelCallback(); - virtual b3KeyboardCallback getKeyboardCallback(); - - virtual void setRenderCallback(b3RenderCallback renderCallback); - - virtual void setWindowTitle(const char* title); - - virtual bool isModifierKeyPressed(int key); -}; - -#endif //_WIN32_WINDOW_H \ No newline at end of file diff --git a/engine/inc/bullet/OpenGLWindow/X11OpenGLWindow.h b/engine/inc/bullet/OpenGLWindow/X11OpenGLWindow.h deleted file mode 100644 index 8170acba..00000000 --- a/engine/inc/bullet/OpenGLWindow/X11OpenGLWindow.h +++ /dev/null @@ -1,72 +0,0 @@ -#ifndef X11_OPENGL_WINDOW_H -#define X11_OPENGL_WINDOW_H - -#define b3gDefaultOpenGLWindow X11OpenGLWindow - -#include "../CommonInterfaces/CommonWindowInterface.h" - -class X11OpenGLWindow : public CommonWindowInterface -{ - struct InternalData2* m_data; - bool m_OpenGLInitialized; - bool m_requestedExit; - -protected: - void enableOpenGL(); - - void disableOpenGL(); - - void pumpMessage(); - - int getAsciiCodeFromVirtualKeycode(int orgCode); - -public: - X11OpenGLWindow(); - - virtual ~X11OpenGLWindow(); - - virtual void createWindow(const b3gWindowConstructionInfo& ci); - - virtual void closeWindow(); - - virtual void startRendering(); - - virtual void renderAllObjects(); - - virtual void endRendering(); - - virtual float getRetinaScale() const { return 1.f; } - virtual void setAllowRetina(bool /*allowRetina*/){}; - - virtual void runMainLoop(); - virtual float getTimeInSeconds(); - - virtual bool requestedExit() const; - virtual void setRequestExit(); - - virtual bool isModifierKeyPressed(int key); - - virtual void setMouseMoveCallback(b3MouseMoveCallback mouseCallback); - virtual void setMouseButtonCallback(b3MouseButtonCallback mouseCallback); - virtual void setResizeCallback(b3ResizeCallback resizeCallback); - virtual void setWheelCallback(b3WheelCallback wheelCallback); - virtual void setKeyboardCallback(b3KeyboardCallback keyboardCallback); - - virtual b3MouseMoveCallback getMouseMoveCallback(); - virtual b3MouseButtonCallback getMouseButtonCallback(); - virtual b3ResizeCallback getResizeCallback(); - virtual b3WheelCallback getWheelCallback(); - virtual b3KeyboardCallback getKeyboardCallback(); - - virtual void setRenderCallback(b3RenderCallback renderCallback); - - virtual void setWindowTitle(const char* title); - - virtual int getWidth() const; - - virtual int getHeight() const; - - int fileOpenDialog(char* filename, int maxNameLength); -}; - -#endif diff --git a/engine/inc/bullet/OpenGLWindow/fontstash.h b/engine/inc/bullet/OpenGLWindow/fontstash.h deleted file mode 100644 index a7817110..00000000 --- a/engine/inc/bullet/OpenGLWindow/fontstash.h +++ /dev/null @@ -1,154 +0,0 @@ -// -// Copyright (c) 2011 Andreas Krinke andreas.krinke@gmx.de -// Copyright (c) 2009 Mikko Mononen memon@inside.org -// -// 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 FONTSTASH_H -#define FONTSTASH_H - -#define MAX_ROWS 128 -#define VERT_COUNT (16 * 128) -#define INDEX_COUNT (VERT_COUNT * 2) - -struct vec2 -{ - vec2(float x, float y) - { - p[0] = x; - p[1] = y; - } - float p[2]; -}; - -struct vec4 -{ - vec4(float x, float y, float z, float w) - { - p[0] = x; - p[1] = y; - p[2] = z; - p[3] = w; - } - - float p[4]; -}; - -typedef struct -{ - vec4 position; - vec4 colour; - vec2 uv; -} Vertex; - -struct sth_quad -{ - float x0, y0, s0, t0; - float x1, y1, s1, t1; -}; - -struct sth_row -{ - short x, y, h; -}; - -struct sth_glyph -{ - unsigned int codepoint; - short size; - struct sth_texture* texture; - int x0_, y0, x1, y1; - float xadv, xoff, yoff; - int next; -}; - -struct sth_texture -{ - union { - void* m_userData; - int m_userId; - }; - - unsigned char* m_texels; - - // TODO: replace rows with pointer - struct sth_row rows[MAX_ROWS]; - int nrows; - int nverts; - - Vertex newverts[VERT_COUNT]; - struct sth_texture* next; -}; - -struct RenderCallbacks -{ - virtual ~RenderCallbacks() {} - virtual void setColorRGBA(float color[4]) = 0; - virtual void setWorldPosition(float pos[3]) = 0; - virtual void setWorldOrientation(float orn[4]) = 0; - virtual void updateTexture(sth_texture* texture, sth_glyph* glyph, int textureWidth, int textureHeight) = 0; - virtual void render(sth_texture* texture) = 0; -}; - -struct sth_stash* sth_create(int cachew, int cacheh, RenderCallbacks* callbacks); - -int sth_add_font(struct sth_stash* stash, const char* path); -int sth_add_font_from_memory(struct sth_stash* stash, unsigned char* buffer); - -int sth_add_bitmap_font(struct sth_stash* stash, int ascent, int descent, int line_gap); -/*void sth_add_glyph(struct sth_stash* stash, int idx, unsigned int uid, const char* s, - short size, short base, int x, int y, int w, int h, - float xoffset, float yoffset, float xadvance); - */ - -void sth_begin_draw(struct sth_stash* stash); -void sth_end_draw(struct sth_stash* stash); - -void sth_draw_texture(struct sth_stash* stash, - int idx, float size, - float x, float y, - int screenwidth, int screenheight, - const char* s, float* dx, float colorRGBA[4]); - -void sth_flush_draw(struct sth_stash* stash); - -void sth_draw_text3D(struct sth_stash* stash, - int idx, float fontSize, - float x, float y, float z, - const char* s, float* dx, float textScale, float colorRGBA[4], int bla); - -void sth_draw_text(struct sth_stash* stash, - int idx, float size, - float x, float y, const char* string, float* dx, int screenwidth, int screenheight, int measureOnly, float retinaScale, float colorRGBA[4]); - -inline void sth_draw_text(struct sth_stash* stash, - int idx, float size, - float x, float y, const char* string, float* dx, int screenwidth, int screenheight, int measureOnly = false, float retinaScale = 1.) -{ - float colorRGBA[4] = {1, 1, 1, 1}; - sth_draw_text(stash, idx, size, x, y, string, dx, screenwidth, screenheight, measureOnly, retinaScale, colorRGBA); -} - -void sth_dim_text(struct sth_stash* stash, int idx, float size, const char* string, - float* minx, float* miny, float* maxx, float* maxy); - -void sth_vmetrics(struct sth_stash* stash, - int idx, float size, - float* ascender, float* descender, float* lineh); - -void sth_delete(struct sth_stash* stash); - -#endif // FONTSTASH_H diff --git a/engine/inc/bullet/OpenGLWindow/opengl_fontstashcallbacks.h b/engine/inc/bullet/OpenGLWindow/opengl_fontstashcallbacks.h deleted file mode 100644 index f09387b4..00000000 --- a/engine/inc/bullet/OpenGLWindow/opengl_fontstashcallbacks.h +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef _OPENGL_FONTSTASH_CALLBACKS_H -#define _OPENGL_FONTSTASH_CALLBACKS_H - -#include "fontstash.h" -struct PrimInternalData; -class GLPrimitiveRenderer; - -struct InternalOpenGL2RenderCallbacks : public RenderCallbacks -{ - virtual PrimInternalData* getData() = 0; - - virtual ~InternalOpenGL2RenderCallbacks(); - - virtual void updateTexture(sth_texture* texture, sth_glyph* glyph, int textureWidth, int textureHeight); - virtual void render(sth_texture* texture); - - void display2(); -}; - -void dumpTextureToPng(int screenWidth, int screenHeight, const char* fileName); - -struct SimpleOpenGL2RenderCallbacks : public InternalOpenGL2RenderCallbacks -{ - PrimInternalData* m_data; - virtual PrimInternalData* getData() - { - return m_data; - } - SimpleOpenGL2RenderCallbacks(PrimInternalData* data) - : m_data(data) - { - } - virtual ~SimpleOpenGL2RenderCallbacks() - { - } -}; - -struct OpenGL2RenderCallbacks : public InternalOpenGL2RenderCallbacks -{ - GLPrimitiveRenderer* m_primRender2; - virtual PrimInternalData* getData(); - - virtual void setWorldPosition(float pos[3]) {} - virtual void setWorldOrientation(float orn[4]) {} - virtual void setColorRGBA(float color[4]) {} - - OpenGL2RenderCallbacks(GLPrimitiveRenderer* primRender); - virtual ~OpenGL2RenderCallbacks(); -}; - -#endif //_OPENGL_FONTSTASH_CALLBACKS_H diff --git a/engine/inc/bullet/Planar2D/Planar2D.h b/engine/inc/bullet/Planar2D/Planar2D.h deleted file mode 100644 index 0cbf950f..00000000 --- a/engine/inc/bullet/Planar2D/Planar2D.h +++ /dev/null @@ -1,20 +0,0 @@ -/* -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 PLANAR2D_H -#define PLANAR2D_H - -class CommonExampleInterface* Planar2DCreateFunc(struct CommonExampleOptions& options); - -#endif //BOX2D_DEMO_H diff --git a/engine/inc/bullet/Raycast/RaytestDemo.h b/engine/inc/bullet/Raycast/RaytestDemo.h deleted file mode 100644 index fcd76ba8..00000000 --- a/engine/inc/bullet/Raycast/RaytestDemo.h +++ /dev/null @@ -1,20 +0,0 @@ -/* -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_RAYTEST_DEMO_H -#define BT_RAYTEST_DEMO_H - -class CommonExampleInterface* RaytestCreateFunc(struct CommonExampleOptions& options); - -#endif //BT_RAYTEST_DEMO_H diff --git a/engine/inc/bullet/RenderingExamples/CoordinateSystemDemo.h b/engine/inc/bullet/RenderingExamples/CoordinateSystemDemo.h deleted file mode 100644 index 12b44139..00000000 --- a/engine/inc/bullet/RenderingExamples/CoordinateSystemDemo.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef COORDINATE_SYSTEM_DEMO_H -#define COORDINATE_SYSTEM_DEMO_H - -class CommonExampleInterface* CoordinateSystemCreateFunc(struct CommonExampleOptions& options); - -#endif //COORDINATE_SYSTEM_DEMO_H diff --git a/engine/inc/bullet/RenderingExamples/DynamicTexturedCubeDemo.h b/engine/inc/bullet/RenderingExamples/DynamicTexturedCubeDemo.h deleted file mode 100644 index 0665e273..00000000 --- a/engine/inc/bullet/RenderingExamples/DynamicTexturedCubeDemo.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef DYNAMIC_TEXTURED_CUBE_DEMO_H -#define DYNAMIC_TEXTURED_CUBE_DEMO_H - -class CommonExampleInterface* DynamicTexturedCubeDemoCreateFunc(struct CommonExampleOptions& options); - -#endif //DYNAMIC_TEXTURED_CUBE_DEMO_H diff --git a/engine/inc/bullet/RenderingExamples/RaytracerSetup.h b/engine/inc/bullet/RenderingExamples/RaytracerSetup.h deleted file mode 100644 index d586a96c..00000000 --- a/engine/inc/bullet/RenderingExamples/RaytracerSetup.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef RAYTRACER_SETUP_H -#define RAYTRACER_SETUP_H - -class CommonExampleInterface* RayTracerCreateFunc(struct CommonExampleOptions& options); - -#endif //RAYTRACER_SETUP_H diff --git a/engine/inc/bullet/RenderingExamples/RenderInstancingDemo.h b/engine/inc/bullet/RenderingExamples/RenderInstancingDemo.h deleted file mode 100644 index 75cc7046..00000000 --- a/engine/inc/bullet/RenderingExamples/RenderInstancingDemo.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef RENDER_INSTANCING_DEMO_H -#define RENDER_INSTANCING_DEMO_H - -class CommonExampleInterface* RenderInstancingCreateFunc(struct CommonExampleOptions& options); - -#endif //RENDER_INSTANCING_DEMO_H diff --git a/engine/inc/bullet/RenderingExamples/TimeSeriesCanvas.h b/engine/inc/bullet/RenderingExamples/TimeSeriesCanvas.h deleted file mode 100644 index 86e6e5dd..00000000 --- a/engine/inc/bullet/RenderingExamples/TimeSeriesCanvas.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef TIME_SERIES_CANVAS_H -#define TIME_SERIES_CANVAS_H - -class TimeSeriesCanvas -{ -protected: - struct TimeSeriesInternalData* m_internalData; - void shift1PixelToLeft(); - -public: - TimeSeriesCanvas(struct Common2dCanvasInterface* canvasInterface, int width, int height, const char* windowTitle); - virtual ~TimeSeriesCanvas(); - - void setupTimeSeries(float yScale, int ticksPerSecond, int startTime, bool clearCanvas = true); - void addDataSource(const char* dataSourceLabel, unsigned char red, unsigned char green, unsigned char blue); - void insertDataAtCurrentTime(float value, int dataSourceIndex, bool connectToPrevious); - float getCurrentTime() const; - void grapicalPrintf(const char* str, void* fontData, int rasterposx, int rasterposy, unsigned char red, unsigned char green, unsigned char blue, unsigned char alpha); - - virtual void nextTick(); -}; - -#endif //TIME_SERIES_CANVAS_H \ No newline at end of file diff --git a/engine/inc/bullet/RenderingExamples/TimeSeriesExample.h b/engine/inc/bullet/RenderingExamples/TimeSeriesExample.h deleted file mode 100644 index d38f9996..00000000 --- a/engine/inc/bullet/RenderingExamples/TimeSeriesExample.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef TIME_SERIES_EXAMPLE_H -#define TIME_SERIES_EXAMPLE_H - -class CommonExampleInterface* TimeSeriesCreateFunc(struct CommonExampleOptions& options); - -#endif //TIME_SERIES_EXAMPLE_H diff --git a/engine/inc/bullet/RenderingExamples/TimeSeriesFontData.h b/engine/inc/bullet/RenderingExamples/TimeSeriesFontData.h deleted file mode 100644 index 9c8a9d5d..00000000 --- a/engine/inc/bullet/RenderingExamples/TimeSeriesFontData.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef TIME_SERIES_FONT_DATA_H -#define TIME_SERIES_FONT_DATA_H - -extern unsigned char sTimeSeriesFontData[]; - -#endif //TIME_SERIES_FONT_DATA_H diff --git a/engine/inc/bullet/RenderingExamples/TinyRendererSetup.h b/engine/inc/bullet/RenderingExamples/TinyRendererSetup.h deleted file mode 100644 index 19ebbd56..00000000 --- a/engine/inc/bullet/RenderingExamples/TinyRendererSetup.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef TINYRENDERER_SETUP_H -#define TINYRENDERER_SETUP_H - -class CommonExampleInterface* TinyRendererCreateFunc(struct CommonExampleOptions& options); - -#endif //TINYRENDERER_SETUP_H diff --git a/engine/inc/bullet/RenderingExamples/TinyVRGui.h b/engine/inc/bullet/RenderingExamples/TinyVRGui.h deleted file mode 100644 index f03deff7..00000000 --- a/engine/inc/bullet/RenderingExamples/TinyVRGui.h +++ /dev/null @@ -1,22 +0,0 @@ - -#ifndef TINY_VR_GUI_H -#define TINY_VR_GUI_H - -#include "Bullet3Common/b3Transform.h" - -class TinyVRGui -{ - struct TinyVRGuiInternalData* m_data; - -public: - TinyVRGui(struct ComboBoxParams& params, struct CommonRenderInterface* renderer); - virtual ~TinyVRGui(); - - bool init(); - void tick(b3Scalar deltaTime, const b3Transform& guiWorldTransform); - - void clearTextArea(); - void grapicalPrintf(const char* str, int rasterposx, int rasterposy, unsigned char red, unsigned char green, unsigned char blue, unsigned char alpha); -}; - -#endif //TINY_VR_GUI_H diff --git a/engine/inc/bullet/RigidBody/KinematicRigidBodyExample.h b/engine/inc/bullet/RigidBody/KinematicRigidBodyExample.h deleted file mode 100644 index a996d207..00000000 --- a/engine/inc/bullet/RigidBody/KinematicRigidBodyExample.h +++ /dev/null @@ -1,21 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2015 Google Inc. http://bulletphysics.org - -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 KINEMATIC_RIGID_BODY_EXAMPLE_H -#define KINEMATIC_RIGID_BODY_EXAMPLE_H - -class CommonExampleInterface* KinematicRigidBodyExampleCreateFunc(struct CommonExampleOptions& options); - -#endif //KINEMATIC_RIGID_BODY_EXAMPLE_H diff --git a/engine/inc/bullet/RigidBody/RigidBodySoftContact.h b/engine/inc/bullet/RigidBody/RigidBodySoftContact.h deleted file mode 100644 index 967d64d2..00000000 --- a/engine/inc/bullet/RigidBody/RigidBodySoftContact.h +++ /dev/null @@ -1,21 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2015 Google Inc. http://bulletphysics.org - -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 RIGID_BODY_SOFT_CONTACT_H -#define RIGID_BODY_SOFT_CONTACT_H - -class CommonExampleInterface* RigidBodySoftContactCreateFunc(struct CommonExampleOptions& options); - -#endif //RIGID_BODY_SOFT_CONTACT_H diff --git a/engine/inc/bullet/RobotSimulator/MinitaurSetup.h b/engine/inc/bullet/RobotSimulator/MinitaurSetup.h deleted file mode 100644 index 9b6c6c9b..00000000 --- a/engine/inc/bullet/RobotSimulator/MinitaurSetup.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef MINITAUR_SIMULATION_SETUP_H -#define MINITAUR_SIMULATION_SETUP_H - -#include "LinearMath/btVector3.h" -#include "LinearMath/btQuaternion.h" -class MinitaurSetup -{ - struct MinitaurSetupInternalData* m_data; - void resetPose(class b3RobotSimulatorClientAPI_NoGUI* sim); - -public: - MinitaurSetup(); - virtual ~MinitaurSetup(); - - int setupMinitaur(class b3RobotSimulatorClientAPI_NoGUI* sim, const class btVector3& startPos = btVector3(0, 0, 0), const class btQuaternion& startOrn = btQuaternion(0, 0, 0, 1)); - - void setDesiredMotorAngle(class b3RobotSimulatorClientAPI_NoGUI* sim, const char* motorName, double desiredAngle, double maxTorque = 3, double kp = 0.1, double kd = 0.9); -}; -#endif //MINITAUR_SIMULATION_SETUP_H diff --git a/engine/inc/bullet/RobotSimulator/MinitaurSimulatorExample.h b/engine/inc/bullet/RobotSimulator/MinitaurSimulatorExample.h deleted file mode 100644 index bfa940c7..00000000 --- a/engine/inc/bullet/RobotSimulator/MinitaurSimulatorExample.h +++ /dev/null @@ -1,22 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2019 Google Inc. http://bulletphysics.org - -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 MINITAUR_SIMULATOR_EXAMPLE_H -#define MINITAUR_SIMULATOR_EXAMPLE_H - - -class CommonExampleInterface* MinitaurSimulatorExampleCreateFunc(struct CommonExampleOptions& options); - -#endif //MINITAUR_SIMULATOR_EXAMPLE_H diff --git a/engine/inc/bullet/RobotSimulator/b3RobotSimulatorClientAPI.h b/engine/inc/bullet/RobotSimulator/b3RobotSimulatorClientAPI.h deleted file mode 100644 index 656b1423..00000000 --- a/engine/inc/bullet/RobotSimulator/b3RobotSimulatorClientAPI.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef B3_ROBOT_SIMULATOR_CLIENT_API_GUI_H -#define B3_ROBOT_SIMULATOR_CLIENT_API_GUI_H - -#include "../SharedMemory/b3RobotSimulatorClientAPI_NoGUI.h" - -///The b3RobotSimulatorClientAPI_GUI is pretty much the C++ version of pybullet -///as documented in the pybullet Quickstart Guide -///https://docs.google.com/document/d/10sXEhzFRSnvFcl3XxNGhnD4N2SedqwdAvK3dsihxVUA -class b3RobotSimulatorClientAPI : public b3RobotSimulatorClientAPI_NoGUI -{ -public: - b3RobotSimulatorClientAPI(); - - virtual ~b3RobotSimulatorClientAPI(); - - virtual bool connect(int mode, const std::string& hostName = "localhost", int portOrKey = -1); - - virtual void renderScene(); - - virtual void debugDraw(int debugDrawMode); - - virtual bool mouseMoveCallback(float x, float y); - - virtual bool mouseButtonCallback(int button, int state, float x, float y); -}; - -#endif //B3_ROBOT_SIMULATOR_CLIENT_API_H diff --git a/engine/inc/bullet/RoboticsLearning/GripperGraspExample.h b/engine/inc/bullet/RoboticsLearning/GripperGraspExample.h deleted file mode 100644 index 110068b8..00000000 --- a/engine/inc/bullet/RoboticsLearning/GripperGraspExample.h +++ /dev/null @@ -1,31 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2016 Google Inc. http://bulletphysics.org - -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 GRIPPER_GRASP_EXAMPLE_H -#define GRIPPER_GRASP_EXAMPLE_H - -enum GripperGraspExampleOptions -{ - eGRIPPER_GRASP = 1, - eTWO_POINT_GRASP = 2, - eONE_MOTOR_GRASP = 4, - eGRASP_SOFT_BODY = 8, - eSOFTBODY_MULTIBODY_COUPLING = 16, - eGRASP_DEFORMABLE_CLOTH = 32, -}; - -class CommonExampleInterface* GripperGraspExampleCreateFunc(struct CommonExampleOptions& options); - -#endif //GRIPPER_GRASP_EXAMPLE_H diff --git a/engine/inc/bullet/RoboticsLearning/KukaGraspExample.h b/engine/inc/bullet/RoboticsLearning/KukaGraspExample.h deleted file mode 100644 index b5175c8f..00000000 --- a/engine/inc/bullet/RoboticsLearning/KukaGraspExample.h +++ /dev/null @@ -1,26 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2016 Google Inc. http://bulletphysics.org - -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 KUKA_GRASP_EXAMPLE_H -#define KUKA_GRASP_EXAMPLE_H - -enum KukaGraspExampleOptions -{ - eKUKA_GRASP_DLS_IK = 1, -}; - -class CommonExampleInterface* KukaGraspExampleCreateFunc(struct CommonExampleOptions& options); - -#endif //KUKA_GRASP_EXAMPLE_H diff --git a/engine/inc/bullet/RoboticsLearning/R2D2GraspExample.h b/engine/inc/bullet/RoboticsLearning/R2D2GraspExample.h deleted file mode 100644 index 5e8c674a..00000000 --- a/engine/inc/bullet/RoboticsLearning/R2D2GraspExample.h +++ /dev/null @@ -1,28 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2016 Google Inc. http://bulletphysics.org - -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 R2D2_GRASP_EXAMPLE_H -#define R2D2_GRASP_EXAMPLE_H - -enum RobotLearningExampleOptions -{ - eROBOTIC_LEARN_GRASP = 1, - eROBOTIC_LEARN_COMPLIANT_CONTACT = 2, - eROBOTIC_LEARN_ROLLING_FRICTION = 4, -}; - -class CommonExampleInterface* R2D2GraspExampleCreateFunc(struct CommonExampleOptions& options); - -#endif //R2D2_GRASP_EXAMPLE_H diff --git a/engine/inc/bullet/RollingFrictionDemo/RollingFrictionDemo.h b/engine/inc/bullet/RollingFrictionDemo/RollingFrictionDemo.h deleted file mode 100644 index 2362cc59..00000000 --- a/engine/inc/bullet/RollingFrictionDemo/RollingFrictionDemo.h +++ /dev/null @@ -1,20 +0,0 @@ -/* -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 _ROLLING_FRICTION_DEMO_H -#define _ROLLING_FRICTION_DEMO_H - -class CommonExampleInterface* RollingFrictionCreateFunc(struct CommonExampleOptions& options); - -#endif //_ROLLING_FRICTION_DEMO_H diff --git a/engine/inc/bullet/SharedMemory/BodyJointInfoUtility.h b/engine/inc/bullet/SharedMemory/BodyJointInfoUtility.h deleted file mode 100644 index 0be4814b..00000000 --- a/engine/inc/bullet/SharedMemory/BodyJointInfoUtility.h +++ /dev/null @@ -1,121 +0,0 @@ -#ifndef BODY_JOINT_INFO_UTILITY_H -#define BODY_JOINT_INFO_UTILITY_H - -#include "Bullet3Common/b3Logging.h" - -namespace Bullet -{ -class btMultiBodyDoubleData; -class btMultiBodyFloatData; -}; // namespace Bullet - -inline char* strDup(const char* const str) -{ -#ifdef _WIN32 - return _strdup(str); -#else - return strdup(str); -#endif -} - -template -void addJointInfoFromMultiBodyData(const T* mb, U* bodyJoints, bool verboseOutput) -{ - int numDofs = 0; - if (mb->m_baseMass>0) - { - numDofs = 6; - } - - if (mb->m_baseName) - { - if (verboseOutput) - { - b3Printf("mb->m_baseName = %s\n", mb->m_baseName); - } - } - int qOffset = 7; - int uOffset = 6; - - for (int link = 0; link < mb->m_numLinks; link++) - { - { - b3JointInfo info; - info.m_jointName[0] = 0; - info.m_linkName[0] = 0; - info.m_flags = 0; - info.m_jointIndex = link; - info.m_qIndex = - (0 < mb->m_links[link].m_posVarCount) ? qOffset : -1; - info.m_uIndex = - (0 < mb->m_links[link].m_dofCount) ? uOffset : -1; - - if (mb->m_links[link].m_linkName) - { - if (verboseOutput) - { - b3Printf("mb->m_links[%d].m_linkName = %s\n", link, - mb->m_links[link].m_linkName); - } - strcpy(info.m_linkName, mb->m_links[link].m_linkName); - } - if (mb->m_links[link].m_jointName) - { - if (verboseOutput) - { - b3Printf("mb->m_links[%d].m_jointName = %s\n", link, - mb->m_links[link].m_jointName); - } - strcpy(info.m_jointName, mb->m_links[link].m_jointName); - //info.m_jointName = strDup(mb->m_links[link].m_jointName); - } - - info.m_jointType = mb->m_links[link].m_jointType; - info.m_jointDamping = mb->m_links[link].m_jointDamping; - info.m_jointFriction = mb->m_links[link].m_jointFriction; - info.m_jointLowerLimit = mb->m_links[link].m_jointLowerLimit; - info.m_jointUpperLimit = mb->m_links[link].m_jointUpperLimit; - info.m_jointMaxForce = mb->m_links[link].m_jointMaxForce; - info.m_jointMaxVelocity = mb->m_links[link].m_jointMaxVelocity; - - info.m_parentFrame[0] = mb->m_links[link].m_parentComToThisPivotOffset.m_floats[0]; - info.m_parentFrame[1] = mb->m_links[link].m_parentComToThisPivotOffset.m_floats[1]; - info.m_parentFrame[2] = mb->m_links[link].m_parentComToThisPivotOffset.m_floats[2]; - info.m_parentFrame[3] = mb->m_links[link].m_zeroRotParentToThis.m_floats[0]; - info.m_parentFrame[4] = mb->m_links[link].m_zeroRotParentToThis.m_floats[1]; - info.m_parentFrame[5] = mb->m_links[link].m_zeroRotParentToThis.m_floats[2]; - info.m_parentFrame[6] = mb->m_links[link].m_zeroRotParentToThis.m_floats[3]; - - info.m_jointAxis[0] = 0; - info.m_jointAxis[1] = 0; - info.m_jointAxis[2] = 0; - info.m_parentIndex = mb->m_links[link].m_parentIndex; - - if (info.m_jointType == eRevoluteType) - { - info.m_jointAxis[0] = mb->m_links[link].m_jointAxisTop[0].m_floats[0]; - info.m_jointAxis[1] = mb->m_links[link].m_jointAxisTop[0].m_floats[1]; - info.m_jointAxis[2] = mb->m_links[link].m_jointAxisTop[0].m_floats[2]; - } - if (info.m_jointType == ePrismaticType) - { - info.m_jointAxis[0] = mb->m_links[link].m_jointAxisBottom[0].m_floats[0]; - info.m_jointAxis[1] = mb->m_links[link].m_jointAxisBottom[0].m_floats[1]; - info.m_jointAxis[2] = mb->m_links[link].m_jointAxisBottom[0].m_floats[2]; - } - - if ((mb->m_links[link].m_jointType == eRevoluteType) || - (mb->m_links[link].m_jointType == ePrismaticType)) - { - info.m_flags |= JOINT_HAS_MOTORIZED_POWER; - } - bodyJoints->m_jointInfo.push_back(info); - } - qOffset += mb->m_links[link].m_posVarCount; - uOffset += mb->m_links[link].m_dofCount; - numDofs += mb->m_links[link].m_dofCount; - } - bodyJoints->m_numDofs = numDofs; -} - -#endif //BODY_JOINT_INFO_UTILITY_H diff --git a/engine/inc/bullet/SharedMemory/GraphicsClientExample.h b/engine/inc/bullet/SharedMemory/GraphicsClientExample.h deleted file mode 100644 index 403fa31d..00000000 --- a/engine/inc/bullet/SharedMemory/GraphicsClientExample.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef GRAPHICS_CLIENT_EXAMPLE_H -#define GRAPHICS_CLIENT_EXAMPLE_H - - -class CommonExampleInterface* GraphicsClientCreateFunc(struct CommonExampleOptions& options); - -#endif //GRAPHICS_CLIENT_EXAMPLE_H diff --git a/engine/inc/bullet/SharedMemory/GraphicsServerExample.h b/engine/inc/bullet/SharedMemory/GraphicsServerExample.h deleted file mode 100644 index ac459675..00000000 --- a/engine/inc/bullet/SharedMemory/GraphicsServerExample.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef GRAPHICS_SERVER_EXAMPLE_H -#define GRAPHICS_SERVER_EXAMPLE_H - -class CommonExampleInterface* GraphicsServerCreateFuncBullet(struct CommonExampleOptions& options); - -#endif //GRAPHICS_SERVER_EXAMPLE_H diff --git a/engine/inc/bullet/SharedMemory/GraphicsSharedMemoryBlock.h b/engine/inc/bullet/SharedMemory/GraphicsSharedMemoryBlock.h deleted file mode 100644 index 10891964..00000000 --- a/engine/inc/bullet/SharedMemory/GraphicsSharedMemoryBlock.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef GRAPHICS_SHARED_MEMORY_BLOCK_H -#define GRAPHICS_SHARED_MEMORY_BLOCK_H - -#define GRAPHICS_SHARED_MEMORY_MAX_COMMANDS 1 - -#include "GraphicsSharedMemoryCommands.h" - -struct GraphicsSharedMemoryBlock -{ - int m_magicId; - struct GraphicsSharedMemoryCommand m_clientCommands[GRAPHICS_SHARED_MEMORY_MAX_COMMANDS]; - struct GraphicsSharedMemoryStatus m_serverCommands[GRAPHICS_SHARED_MEMORY_MAX_COMMANDS]; - - int m_numClientCommands; - int m_numProcessedClientCommands; - - int m_numServerCommands; - int m_numProcessedServerCommands; - - char m_bulletStreamData[GRAPHICS_SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE]; -}; - -//http://stackoverflow.com/questions/24736304/unable-to-use-inline-in-declaration-get-error-c2054 -#ifdef _WIN32 -__inline -#else -inline -#endif - void - InitSharedMemoryBlock(struct GraphicsSharedMemoryBlock* sharedMemoryBlock) -{ - sharedMemoryBlock->m_numClientCommands = 0; - sharedMemoryBlock->m_numServerCommands = 0; - sharedMemoryBlock->m_numProcessedClientCommands = 0; - sharedMemoryBlock->m_numProcessedServerCommands = 0; - sharedMemoryBlock->m_magicId = GRAPHICS_SHARED_MEMORY_MAGIC_NUMBER; -} - -#define GRAPHICS_SHARED_MEMORY_SIZE sizeof(GraphicsSharedMemoryBlock) - -#endif //GRAPHICS_SHARED_MEMORY_BLOCK_H diff --git a/engine/inc/bullet/SharedMemory/GraphicsSharedMemoryCommands.h b/engine/inc/bullet/SharedMemory/GraphicsSharedMemoryCommands.h deleted file mode 100644 index 2fbaf459..00000000 --- a/engine/inc/bullet/SharedMemory/GraphicsSharedMemoryCommands.h +++ /dev/null @@ -1,192 +0,0 @@ -#ifndef GRAPHICS_SHARED_MEMORY_COMMANDS_H -#define GRAPHICS_SHARED_MEMORY_COMMANDS_H - -//this is a very experimental draft of commands. We will iterate on this API (commands, arguments etc) - -#include "GraphicsSharedMemoryPublic.h" - -#ifdef __GNUC__ -#include -typedef int32_t smInt32a_t; -typedef int64_t smInt64a_t; -typedef uint32_t smUint32a_t; -typedef uint64_t smUint64a_t; -#elif defined(_MSC_VER) -typedef __int32 smInt32a_t; -typedef __int64 smInt64a_t; -typedef unsigned __int32 smUint32a_t; -typedef unsigned __int64 smUint64a_t; -#else -typedef int smInt32a_t; -typedef long long int smInt64a_t; -typedef unsigned int smUint32a_t; -typedef unsigned long long int smUint64a_t; -#endif - -#ifdef __APPLE__ -#define GRAPHICS_SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE (512 * 1024) -#else - #define GRAPHICS_SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE (4 * 1024 * 1024) -#endif - -struct GraphicsCommand0 -{ - int bla; -}; - -struct GraphicsUpAxisCommand -{ - int m_enableUpAxisY; -}; - -struct GraphicsStatus0 -{ - int bla; -}; - -struct GraphicsVisualizerFlagCommand -{ - int m_visualizerFlag; - int m_enable; -}; - -struct GraphicsUploadDataCommand -{ - int m_numBytes; - int m_dataOffset; - int m_dataSlot; -}; - -struct GraphicRegisterTextureCommand -{ - int m_width; - int m_height; -}; - -struct GraphicsRegisterTextureStatus -{ - int m_textureId; -}; - -struct GraphicsRegisterGraphicsShapeCommand -{ - int m_numVertices; - int m_numIndices; - int m_primitiveType; - int m_textureId; -}; - -struct GraphicsRegisterGraphicsShapeStatus -{ - int m_shapeId; -}; - -struct GraphicsRegisterGraphicsInstanceCommand -{ - - int m_shapeIndex; - float m_position[4]; - float m_quaternion[4]; - float m_color[4]; - float m_scaling[4]; -}; - -struct GraphicsRegisterGraphicsInstanceStatus -{ - int m_graphicsInstanceId; -}; - -struct GraphicsSyncTransformsCommand -{ - int m_numPositions; -}; - -struct GraphicsRemoveInstanceCommand -{ - int m_graphicsUid; -}; - -struct GraphicsChangeRGBAColorCommand -{ - int m_graphicsUid; - double m_rgbaColor[4]; -}; - -struct GraphicsChangeScalingCommand -{ - int m_graphicsUid; - double m_scaling[3]; -}; - - - -struct GraphicsGetCameraInfoStatus -{ - int width; - int height; - float viewMatrix[16]; - float projectionMatrix[16]; - float camUp[3]; - float camForward[3]; - float hor[3]; - float vert[3]; - float yaw; - float pitch; - float camDist; - float camTarget[3]; -}; - - -struct GraphicsSharedMemoryCommand -{ - int m_type; - smUint64a_t m_timeStamp; - int m_sequenceNumber; - - //m_updateFlags is a bit fields to tell which parameters need updating - //for example m_updateFlags = SIM_PARAM_UPDATE_DELTA_TIME | SIM_PARAM_UPDATE_NUM_SOLVER_ITERATIONS; - int m_updateFlags; - - union { - struct GraphicsCommand0 m_graphicsCommand0; - struct GraphicsUpAxisCommand m_upAxisYCommand; - struct GraphicsVisualizerFlagCommand m_visualizerFlagCommand; - struct GraphicsUploadDataCommand m_uploadDataCommand; - struct GraphicRegisterTextureCommand m_registerTextureCommand; - struct GraphicsRegisterGraphicsShapeCommand m_registerGraphicsShapeCommand; - struct GraphicsRegisterGraphicsInstanceCommand m_registerGraphicsInstanceCommand; - struct GraphicsSyncTransformsCommand m_syncTransformsCommand; - struct GraphicsRemoveInstanceCommand m_removeGraphicsInstanceCommand; - struct GraphicsChangeRGBAColorCommand m_changeRGBAColorCommand; - struct GraphicsChangeScalingCommand m_changeScalingCommand; - }; -}; - -struct GraphicsSharedMemoryStatus -{ - int m_type; - - smUint64a_t m_timeStamp; - int m_sequenceNumber; - - //m_streamBytes is only for internal purposes - int m_numDataStreamBytes; - char* m_dataStream; - - //m_updateFlags is a bit fields to tell which parameters were updated, - //m_updateFlags is ignored for most status messages - int m_updateFlags; - - union { - - struct GraphicsStatus0 m_graphicsStatus0; - struct GraphicsRegisterTextureStatus m_registerTextureStatus; - struct GraphicsRegisterGraphicsShapeStatus m_registerGraphicsShapeStatus; - struct GraphicsRegisterGraphicsInstanceStatus m_registerGraphicsInstanceStatus; - struct GraphicsGetCameraInfoStatus m_getCameraInfoStatus; - }; -}; - -typedef struct GraphicsSharedMemoryStatus GraphicsSharedMemoryStatus_t; - -#endif //GRAPHICS_SHARED_MEMORY_COMMANDS_H diff --git a/engine/inc/bullet/SharedMemory/GraphicsSharedMemoryPublic.h b/engine/inc/bullet/SharedMemory/GraphicsSharedMemoryPublic.h deleted file mode 100644 index 4a80736b..00000000 --- a/engine/inc/bullet/SharedMemory/GraphicsSharedMemoryPublic.h +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef GRAPHICS_SHARED_MEMORY_PUBLIC_H -#define GRAPHICS_SHARED_MEMORY_PUBLIC_H - -#define GRAPHICS_SHARED_MEMORY_KEY 11347 -///increase the SHARED_MEMORY_MAGIC_NUMBER whenever incompatible changes are made in the structures -///my convention is year/month/day/rev -//Please don't replace an existing magic number: -//instead, only ADD a new one at the top, comment-out previous one - -#define GRAPHICS_SHARED_MEMORY_MAGIC_NUMBER 201904030 -enum EnumGraphicsSharedMemoryClientCommand -{ - GFX_CMD_INVALID = 0, - GFX_CMD_0, - GFX_CMD_SET_VISUALIZER_FLAG, - GFX_CMD_UPLOAD_DATA, - GFX_CMD_REGISTER_TEXTURE, - GFX_CMD_REGISTER_GRAPHICS_SHAPE, - GFX_CMD_REGISTER_GRAPHICS_INSTANCE, - GFX_CMD_SYNCHRONIZE_TRANSFORMS, - GFX_CMD_REMOVE_ALL_GRAPHICS_INSTANCES, - GFX_CMD_REMOVE_SINGLE_GRAPHICS_INSTANCE, - GFX_CMD_CHANGE_RGBA_COLOR, - GFX_CMD_GET_CAMERA_INFO, - GFX_CMD_CHANGE_SCALING, - //don't go beyond this command! - GFX_CMD_MAX_CLIENT_COMMANDS, -}; - -enum EnumGraphicsSharedMemoryServerStatus -{ - GFX_CMD_SHARED_MEMORY_NOT_INITIALIZED = 0, - //GFX_CMD_CLIENT_COMMAND_COMPLETED is a generic 'completed' status that doesn't need special handling on the client - GFX_CMD_CLIENT_COMMAND_COMPLETED, - GFX_CMD_CLIENT_COMMAND_FAILED, - GFX_CMD_REGISTER_TEXTURE_COMPLETED, - GFX_CMD_REGISTER_TEXTURE_FAILED, - GFX_CMD_REGISTER_GRAPHICS_SHAPE_COMPLETED, - GFX_CMD_REGISTER_GRAPHICS_SHAPE_FAILED, - GFX_CMD_REGISTER_GRAPHICS_INSTANCE_COMPLETED, - GFX_CMD_REGISTER_GRAPHICS_INSTANCE_FAILED, - GFX_CMD_GET_CAMERA_INFO_COMPLETED, - GFX_CMD_GET_CAMERA_INFO_FAILED, - //don't go beyond 'CMD_MAX_SERVER_COMMANDS! - GFX_CMD_MAX_SERVER_COMMANDS -}; - - - - - -#endif //GRAPHICS_SHARED_MEMORY_PUBLIC_H diff --git a/engine/inc/bullet/SharedMemory/IKTrajectoryHelper.h b/engine/inc/bullet/SharedMemory/IKTrajectoryHelper.h deleted file mode 100644 index cdbe7a23..00000000 --- a/engine/inc/bullet/SharedMemory/IKTrajectoryHelper.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef IK_TRAJECTORY_HELPER_H -#define IK_TRAJECTORY_HELPER_H - -enum IK2_Method -{ - IK2_JACOB_TRANS = 0, - IK2_PURE_PSEUDO, - IK2_DLS, - IK2_SDLS, - IK2_DLS_SVD, - IK2_VEL_DLS, - IK2_VEL_DLS_WITH_ORIENTATION, - IK2_VEL_DLS_WITH_NULLSPACE, - IK2_VEL_DLS_WITH_ORIENTATION_NULLSPACE, - IK2_VEL_SDLS, - IK2_VEL_SDLS_WITH_ORIENTATION, -}; - -class IKTrajectoryHelper -{ - struct IKTrajectoryHelperInternalData* m_data; - -public: - IKTrajectoryHelper(); - virtual ~IKTrajectoryHelper(); - - bool computeIK(const double endEffectorTargetPosition[3], - const double endEffectorTargetOrientation[4], - const double endEffectorWorldPosition[3], - const double endEffectorWorldOrientation[4], - const double* q_old, int numQ, int endEffectorIndex, - double* q_new, int ikMethod, const double* linear_jacobian, const double* angular_jacobian, int jacobian_size, const double dampIk[6]); - - bool computeIK2( - const double* endEffectorTargetPositions, - const double* endEffectorCurrentPositions, - int numEndEffectors, - const double* q_current, int numQ, - double* q_new, int ikMethod, const double* linear_jacobians, const double dampIk[6]); - - bool computeNullspaceVel(int numQ, const double* q_current, const double* lower_limit, const double* upper_limit, const double* joint_range, const double* rest_pose); - bool setDampingCoeff(int numQ, const double* coeff); -}; -#endif //IK_TRAJECTORY_HELPER_H diff --git a/engine/inc/bullet/SharedMemory/InProcessMemory.h b/engine/inc/bullet/SharedMemory/InProcessMemory.h deleted file mode 100644 index d9b19c6a..00000000 --- a/engine/inc/bullet/SharedMemory/InProcessMemory.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef IN_PROCESS_MEMORY_H -#define IN_PROCESS_MEMORY_H - -#include "SharedMemoryInterface.h" - -class InProcessMemory : public SharedMemoryInterface -{ - struct InProcessMemoryInternalData* m_data; - -public: - InProcessMemory(); - virtual ~InProcessMemory(); - - virtual void* allocateSharedMemory(int key, int size, bool allowCreation); - virtual void releaseSharedMemory(int key, int size); -}; - -#endif diff --git a/engine/inc/bullet/SharedMemory/PhysicsClient.h b/engine/inc/bullet/SharedMemory/PhysicsClient.h deleted file mode 100644 index 33c139ef..00000000 --- a/engine/inc/bullet/SharedMemory/PhysicsClient.h +++ /dev/null @@ -1,94 +0,0 @@ -#ifndef BT_PHYSICS_CLIENT_API_H -#define BT_PHYSICS_CLIENT_API_H - -//#include "SharedMemoryCommands.h" -#include "LinearMath/btVector3.h" - -class PhysicsClient -{ -public: - virtual ~PhysicsClient(); - - // return true if connection succesfull, can also check 'isConnected' - virtual bool connect() = 0; - - virtual void disconnectSharedMemory() = 0; - - virtual bool isConnected() const = 0; - - // return non-null if there is a status, nullptr otherwise - virtual const struct SharedMemoryStatus* processServerStatus() = 0; - - virtual struct SharedMemoryCommand* getAvailableSharedMemoryCommand() = 0; - - virtual bool canSubmitCommand() const = 0; - - virtual bool submitClientCommand(const struct SharedMemoryCommand& command) = 0; - - virtual int getNumBodies() const = 0; - - virtual int getBodyUniqueId(int serialIndex) const = 0; - - virtual bool getBodyInfo(int bodyUniqueId, struct b3BodyInfo& info) const = 0; - - virtual int getNumJoints(int bodyUniqueId) const = 0; - - virtual int getNumDofs(int bodyUniqueId) const = 0; - - virtual bool getJointInfo(int bodyUniqueId, int jointIndex, struct b3JointInfo& info) const = 0; - - virtual int getNumUserConstraints() const = 0; - - virtual int getUserConstraintInfo(int constraintUniqueId, struct b3UserConstraint& info) const = 0; - - virtual int getUserConstraintId(int serialIndex) const = 0; - - virtual void setSharedMemoryKey(int key) = 0; - - virtual void uploadBulletFileToSharedMemory(const char* data, int len) = 0; - - virtual void uploadRaysToSharedMemory(struct SharedMemoryCommand& command, const double* rayFromWorldArray, const double* rayToWorldArray, int numRays) = 0; - - virtual int getNumDebugLines() const = 0; - - virtual const float* getDebugLinesFrom() const = 0; - virtual const float* getDebugLinesTo() const = 0; - virtual const float* getDebugLinesColor() const = 0; - - virtual void getCachedCameraImage(struct b3CameraImageData* cameraData) = 0; - - virtual void getCachedContactPointInformation(struct b3ContactInformation* contactPointData) = 0; - - virtual void getCachedOverlappingObjects(struct b3AABBOverlapData* overlappingObjects) = 0; - - virtual void getCachedVisualShapeInformation(struct b3VisualShapeInformation* visualShapesInfo) = 0; - - virtual void getCachedCollisionShapeInformation(struct b3CollisionShapeInformation* collisionShapesInfo) = 0; - - virtual void getCachedMeshData(struct b3MeshData* meshData) = 0; - - virtual void getCachedVREvents(struct b3VREventsData* vrEventsData) = 0; - - virtual void getCachedKeyboardEvents(struct b3KeyboardEventsData* keyboardEventsData) = 0; - - virtual void getCachedMouseEvents(struct b3MouseEventsData* mouseEventsData) = 0; - - virtual void getCachedRaycastHits(struct b3RaycastInformation* raycastHits) = 0; - - virtual void getCachedMassMatrix(int dofCountCheck, double* massMatrix) = 0; - - virtual bool getCachedReturnData(struct b3UserDataValue* returnData) = 0; - - virtual void setTimeOut(double timeOutInSeconds) = 0; - virtual double getTimeOut() const = 0; - - virtual bool getCachedUserData(int userDataId, struct b3UserDataValue& valueOut) const = 0; - virtual int getCachedUserDataId(int bodyUniqueId, int linkIndex, int visualShapeIndex, const char* key) const = 0; - virtual int getNumUserData(int bodyUniqueId) const = 0; - virtual void getUserDataInfo(int bodyUniqueId, int userDataIndex, const char** keyOut, int* userDataIdOut, int* linkIndexOut, int* visualShapeIndexOut) const = 0; - - virtual void pushProfileTiming(const char* timingName) = 0; - virtual void popProfileTiming() = 0; -}; - -#endif // BT_PHYSICS_CLIENT_API_H diff --git a/engine/inc/bullet/SharedMemory/PhysicsClientC_API.h b/engine/inc/bullet/SharedMemory/PhysicsClientC_API.h deleted file mode 100644 index 318263b2..00000000 --- a/engine/inc/bullet/SharedMemory/PhysicsClientC_API.h +++ /dev/null @@ -1,740 +0,0 @@ -#ifndef PHYSICS_CLIENT_C_API_H -#define PHYSICS_CLIENT_C_API_H - -//#include "SharedMemoryBlock.h" -#include "SharedMemoryPublic.h" - -#define B3_DECLARE_HANDLE(name) \ - typedef struct name##__ \ - { \ - int unused; \ - } * name - -B3_DECLARE_HANDLE(b3PhysicsClientHandle); -B3_DECLARE_HANDLE(b3SharedMemoryCommandHandle); -B3_DECLARE_HANDLE(b3SharedMemoryStatusHandle); - -#ifdef _WIN32 -#define B3_SHARED_API __declspec(dllexport) -#elif defined(__GNUC__) -#define B3_SHARED_API __attribute__((visibility("default"))) -#else -#define B3_SHARED_API -#endif - -///There are several connection methods, see following header files: -#include "PhysicsClientSharedMemory_C_API.h" -#include "PhysicsClientSharedMemory2_C_API.h" -#include "PhysicsDirectC_API.h" - -#ifdef BT_ENABLE_ENET -#include "PhysicsClientUDP_C_API.h" -#endif - -#ifdef BT_ENABLE_CLSOCKET -#include "PhysicsClientTCP_C_API.h" -#endif - -#ifdef __cplusplus -extern "C" -{ -#endif - - ///b3DisconnectSharedMemory will disconnect the client from the server and cleanup memory. - B3_SHARED_API void b3DisconnectSharedMemory(b3PhysicsClientHandle physClient); - - ///There can only be 1 outstanding command. Check if a command can be send. - B3_SHARED_API int b3CanSubmitCommand(b3PhysicsClientHandle physClient); - - ///blocking submit command and wait for status - B3_SHARED_API b3SharedMemoryStatusHandle b3SubmitClientCommandAndWaitStatus(b3PhysicsClientHandle physClient, b3SharedMemoryCommandHandle commandHandle); - - ///In general it is better to use b3SubmitClientCommandAndWaitStatus. b3SubmitClientCommand is a non-blocking submit - ///command, which requires checking for the status manually, using b3ProcessServerStatus. Also, before sending the - ///next command, make sure to check if you can send a command using 'b3CanSubmitCommand'. - B3_SHARED_API int b3SubmitClientCommand(b3PhysicsClientHandle physClient, b3SharedMemoryCommandHandle commandHandle); - - ///non-blocking check status - B3_SHARED_API b3SharedMemoryStatusHandle b3ProcessServerStatus(b3PhysicsClientHandle physClient); - - /// Get the physics server return status type. See EnumSharedMemoryServerStatus in SharedMemoryPublic.h for error codes. - B3_SHARED_API int b3GetStatusType(b3SharedMemoryStatusHandle statusHandle); - - ///Plugin system, load and unload a plugin, execute a command - B3_SHARED_API b3SharedMemoryCommandHandle b3CreateCustomCommand(b3PhysicsClientHandle physClient); - B3_SHARED_API void b3CustomCommandLoadPlugin(b3SharedMemoryCommandHandle commandHandle, const char* pluginPath); - B3_SHARED_API void b3CustomCommandLoadPluginSetPostFix(b3SharedMemoryCommandHandle commandHandle, const char* postFix); - B3_SHARED_API int b3GetStatusPluginUniqueId(b3SharedMemoryStatusHandle statusHandle); - B3_SHARED_API int b3GetStatusPluginCommandResult(b3SharedMemoryStatusHandle statusHandle); - B3_SHARED_API int b3GetStatusPluginCommandReturnData(b3PhysicsClientHandle physClient, struct b3UserDataValue* valueOut); - - B3_SHARED_API void b3CustomCommandUnloadPlugin(b3SharedMemoryCommandHandle commandHandle, int pluginUniqueId); - B3_SHARED_API void b3CustomCommandExecutePluginCommand(b3SharedMemoryCommandHandle commandHandle, int pluginUniqueId, const char* textArguments); - B3_SHARED_API void b3CustomCommandExecuteAddIntArgument(b3SharedMemoryCommandHandle commandHandle, int intVal); - B3_SHARED_API void b3CustomCommandExecuteAddFloatArgument(b3SharedMemoryCommandHandle commandHandle, float floatVal); - - B3_SHARED_API int b3GetStatusBodyIndices(b3SharedMemoryStatusHandle statusHandle, int* bodyIndicesOut, int bodyIndicesCapacity); - - B3_SHARED_API int b3GetStatusBodyIndex(b3SharedMemoryStatusHandle statusHandle); - - B3_SHARED_API int b3GetStatusActualState(b3SharedMemoryStatusHandle statusHandle, - int* bodyUniqueId, - int* numDegreeOfFreedomQ, - int* numDegreeOfFreedomU, - const double* rootLocalInertialFrame[], - const double* actualStateQ[], - const double* actualStateQdot[], - const double* jointReactionForces[]); - - B3_SHARED_API int b3GetStatusActualState2(b3SharedMemoryStatusHandle statusHandle, - int* bodyUniqueId, - int* numLinks, - int* numDegreeOfFreedomQ, - int* numDegreeOfFreedomU, - const double* rootLocalInertialFrame[], - const double* actualStateQ[], - const double* actualStateQdot[], - const double* jointReactionForces[], - const double* linkLocalInertialFrames[], - const double* jointMotorForces[], - const double* linkStates[], - const double* linkWorldVelocities[]); - - B3_SHARED_API b3SharedMemoryCommandHandle b3RequestCollisionInfoCommandInit(b3PhysicsClientHandle physClient, int bodyUniqueId); - B3_SHARED_API int b3GetStatusAABB(b3SharedMemoryStatusHandle statusHandle, int linkIndex, double aabbMin[/*3*/], double aabbMax[/*3*/]); - - ///If you re-connected to an existing server, or server changed otherwise, sync the body info and user constraints etc. - B3_SHARED_API b3SharedMemoryCommandHandle b3InitSyncBodyInfoCommand(b3PhysicsClientHandle physClient); - - B3_SHARED_API b3SharedMemoryCommandHandle b3InitRemoveBodyCommand(b3PhysicsClientHandle physClient, int bodyUniqueId); - - ///return the total number of bodies in the simulation - B3_SHARED_API int b3GetNumBodies(b3PhysicsClientHandle physClient); - - /// return the body unique id, given the index in range [0 , b3GetNumBodies() ) - B3_SHARED_API int b3GetBodyUniqueId(b3PhysicsClientHandle physClient, int serialIndex); - - ///given a body unique id, return the body information. See b3BodyInfo in SharedMemoryPublic.h - B3_SHARED_API int b3GetBodyInfo(b3PhysicsClientHandle physClient, int bodyUniqueId, struct b3BodyInfo* info); - - ///give a unique body index (after loading the body) return the number of joints. - B3_SHARED_API int b3GetNumJoints(b3PhysicsClientHandle physClient, int bodyUniqueId); - ///give a unique body index (after loading the body) return the number of degrees of freedom (DoF). - B3_SHARED_API int b3GetNumDofs(b3PhysicsClientHandle physClient, int bodyUniqueId); - - ///compute the number of degrees of freedom for this body. - ///Return -1 for unsupported spherical joint, -2 for unsupported planar joint. - B3_SHARED_API int b3ComputeDofCount(b3PhysicsClientHandle physClient, int bodyUniqueId); - - ///given a body and joint index, return the joint information. See b3JointInfo in SharedMemoryPublic.h - B3_SHARED_API int b3GetJointInfo(b3PhysicsClientHandle physClient, int bodyUniqueId, int jointIndex, struct b3JointInfo* info); - - ///user data handling - B3_SHARED_API b3SharedMemoryCommandHandle b3InitSyncUserDataCommand(b3PhysicsClientHandle physClient); - B3_SHARED_API void b3AddBodyToSyncUserDataRequest(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueId); - B3_SHARED_API b3SharedMemoryCommandHandle b3InitAddUserDataCommand(b3PhysicsClientHandle physClient, int bodyUniqueId, int linkIndex, int visualShapeIndex, const char* key, enum UserDataValueType valueType, int valueLength, const void* valueData); - B3_SHARED_API b3SharedMemoryCommandHandle b3InitRemoveUserDataCommand(b3PhysicsClientHandle physClient, int userDataId); - - B3_SHARED_API int b3GetUserData(b3PhysicsClientHandle physClient, int userDataId, struct b3UserDataValue* valueOut); - B3_SHARED_API int b3GetUserDataId(b3PhysicsClientHandle physClient, int bodyUniqueId, int linkIndex, int visualShapeIndex, const char* key); - B3_SHARED_API int b3GetUserDataIdFromStatus(b3SharedMemoryStatusHandle statusHandle); - B3_SHARED_API int b3GetNumUserData(b3PhysicsClientHandle physClient, int bodyUniqueId); - B3_SHARED_API void b3GetUserDataInfo(b3PhysicsClientHandle physClient, int bodyUniqueId, int userDataIndex, const char** keyOut, int* userDataIdOut, int* linkIndexOut, int* visualShapeIndexOut); - - B3_SHARED_API b3SharedMemoryCommandHandle b3GetDynamicsInfoCommandInit(b3PhysicsClientHandle physClient, int bodyUniqueId, int linkIndex); - B3_SHARED_API b3SharedMemoryCommandHandle b3GetDynamicsInfoCommandInit2(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueId, int linkIndex); - - ///given a body unique id and link index, return the dynamics information. See b3DynamicsInfo in SharedMemoryPublic.h - B3_SHARED_API int b3GetDynamicsInfo(b3SharedMemoryStatusHandle statusHandle, struct b3DynamicsInfo* info); - - B3_SHARED_API b3SharedMemoryCommandHandle b3InitChangeDynamicsInfo(b3PhysicsClientHandle physClient); - B3_SHARED_API b3SharedMemoryCommandHandle b3InitChangeDynamicsInfo2(b3SharedMemoryCommandHandle commandHandle); - - B3_SHARED_API int b3ChangeDynamicsInfoSetMass(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueId, int linkIndex, double mass); - B3_SHARED_API int b3ChangeDynamicsInfoSetLocalInertiaDiagonal(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueId, int linkIndex, const double localInertiaDiagonal[]); - B3_SHARED_API int b3ChangeDynamicsInfoSetAnisotropicFriction(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueId, int linkIndex, const double anisotropicFriction[]); - B3_SHARED_API int b3ChangeDynamicsInfoSetJointLimit(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueId, int linkIndex, double jointLowerLimit, double jointUpperLimit); - B3_SHARED_API int b3ChangeDynamicsInfoSetJointLimitForce(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueId, int linkIndex, double jointLimitForce); - B3_SHARED_API int b3ChangeDynamicsInfoSetDynamicType(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueId, int linkIndex, int dynamicType); - - - B3_SHARED_API int b3ChangeDynamicsInfoSetLateralFriction(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueId, int linkIndex, double lateralFriction); - B3_SHARED_API int b3ChangeDynamicsInfoSetSpinningFriction(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueId, int linkIndex, double friction); - B3_SHARED_API int b3ChangeDynamicsInfoSetRollingFriction(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueId, int linkIndex, double friction); - B3_SHARED_API int b3ChangeDynamicsInfoSetRestitution(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueId, int linkIndex, double restitution); - B3_SHARED_API int b3ChangeDynamicsInfoSetLinearDamping(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueId, double linearDamping); - B3_SHARED_API int b3ChangeDynamicsInfoSetAngularDamping(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueId, double angularDamping); - B3_SHARED_API int b3ChangeDynamicsInfoSetJointDamping(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueId, int linkIndex, double jointDamping); - - B3_SHARED_API int b3ChangeDynamicsInfoSetContactStiffnessAndDamping(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueId, int linkIndex, double contactStiffness, double contactDamping); - B3_SHARED_API int b3ChangeDynamicsInfoSetFrictionAnchor(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueId, int linkIndex, int frictionAnchor); - B3_SHARED_API int b3ChangeDynamicsInfoSetCcdSweptSphereRadius(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueId, int linkIndex, double ccdSweptSphereRadius); - B3_SHARED_API int b3ChangeDynamicsInfoSetContactProcessingThreshold(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueId, int linkIndex, double contactProcessingThreshold); - B3_SHARED_API int b3ChangeDynamicsInfoSetActivationState(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueId, int activationState); - B3_SHARED_API int b3ChangeDynamicsInfoSetMaxJointVelocity(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueId, double maxJointVelocity); - B3_SHARED_API int b3ChangeDynamicsInfoSetCollisionMargin(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueId, double collisionMargin); - - - B3_SHARED_API b3SharedMemoryCommandHandle b3InitCreateUserConstraintCommand(b3PhysicsClientHandle physClient, int parentBodyUniqueId, int parentJointIndex, int childBodyUniqueId, int childJointIndex, struct b3JointInfo* info); - B3_SHARED_API b3SharedMemoryCommandHandle b3InitCreateUserConstraintCommand2(b3SharedMemoryCommandHandle commandHandle, int parentBodyUniqueId, int parentJointIndex, int childBodyUniqueId, int childJointIndex, struct b3JointInfo* info); - - ///return a unique id for the user constraint, after successful creation, or -1 for an invalid constraint id - B3_SHARED_API int b3GetStatusUserConstraintUniqueId(b3SharedMemoryStatusHandle statusHandle); - - ///change parameters of an existing user constraint - B3_SHARED_API b3SharedMemoryCommandHandle b3InitChangeUserConstraintCommand(b3PhysicsClientHandle physClient, int userConstraintUniqueId); - B3_SHARED_API int b3InitChangeUserConstraintSetPivotInB(b3SharedMemoryCommandHandle commandHandle, const double jointChildPivot[/*3*/]); - B3_SHARED_API int b3InitChangeUserConstraintSetFrameInB(b3SharedMemoryCommandHandle commandHandle, const double jointChildFrameOrn[/*4*/]); - B3_SHARED_API int b3InitChangeUserConstraintSetMaxForce(b3SharedMemoryCommandHandle commandHandle, double maxAppliedForce); - B3_SHARED_API int b3InitChangeUserConstraintSetGearRatio(b3SharedMemoryCommandHandle commandHandle, double gearRatio); - B3_SHARED_API int b3InitChangeUserConstraintSetGearAuxLink(b3SharedMemoryCommandHandle commandHandle, int gearAuxLink); - B3_SHARED_API int b3InitChangeUserConstraintSetRelativePositionTarget(b3SharedMemoryCommandHandle commandHandle, double relativePositionTarget); - B3_SHARED_API int b3InitChangeUserConstraintSetERP(b3SharedMemoryCommandHandle commandHandle, double erp); - - B3_SHARED_API b3SharedMemoryCommandHandle b3InitRemoveUserConstraintCommand(b3PhysicsClientHandle physClient, int userConstraintUniqueId); - - B3_SHARED_API int b3GetNumUserConstraints(b3PhysicsClientHandle physClient); - - B3_SHARED_API b3SharedMemoryCommandHandle b3InitGetUserConstraintStateCommand(b3PhysicsClientHandle physClient, int constraintUniqueId); - B3_SHARED_API int b3GetStatusUserConstraintState(b3SharedMemoryStatusHandle statusHandle, struct b3UserConstraintState* constraintState); - - B3_SHARED_API int b3GetUserConstraintInfo(b3PhysicsClientHandle physClient, int constraintUniqueId, struct b3UserConstraint* info); - /// return the user constraint id, given the index in range [0 , b3GetNumUserConstraints() ) - B3_SHARED_API int b3GetUserConstraintId(b3PhysicsClientHandle physClient, int serialIndex); - - ///Request physics debug lines for debug visualization. The flags in debugMode are the same as used in Bullet - ///See btIDebugDraw::DebugDrawModes in Bullet/src/LinearMath/btIDebugDraw.h - B3_SHARED_API b3SharedMemoryCommandHandle b3InitRequestDebugLinesCommand(b3PhysicsClientHandle physClient, int debugMode); - - ///Get the pointers to the physics debug line information, after b3InitRequestDebugLinesCommand returns - ///status CMD_DEBUG_LINES_COMPLETED - B3_SHARED_API void b3GetDebugLines(b3PhysicsClientHandle physClient, struct b3DebugLines* lines); - - ///configure the 3D OpenGL debug visualizer (enable/disable GUI widgets, shadows, position camera etc) - B3_SHARED_API b3SharedMemoryCommandHandle b3InitConfigureOpenGLVisualizer(b3PhysicsClientHandle physClient); - B3_SHARED_API b3SharedMemoryCommandHandle b3InitConfigureOpenGLVisualizer2(b3SharedMemoryCommandHandle commandHandle); - B3_SHARED_API void b3ConfigureOpenGLVisualizerSetVisualizationFlags(b3SharedMemoryCommandHandle commandHandle, int flag, int enabled); - B3_SHARED_API void b3ConfigureOpenGLVisualizerSetLightPosition(b3SharedMemoryCommandHandle commandHandle, const float lightPosition[3]); - B3_SHARED_API void b3ConfigureOpenGLVisualizerSetShadowMapResolution(b3SharedMemoryCommandHandle commandHandle, int shadowMapResolution); - B3_SHARED_API void b3ConfigureOpenGLVisualizerSetShadowMapIntensity(b3SharedMemoryCommandHandle commandHandle, double shadowMapIntensity); - - B3_SHARED_API void b3ConfigureOpenGLVisualizerSetShadowMapWorldSize(b3SharedMemoryCommandHandle commandHandle, int shadowMapWorldSize); - B3_SHARED_API void b3ConfigureOpenGLVisualizerSetRemoteSyncTransformInterval(b3SharedMemoryCommandHandle commandHandle, double remoteSyncTransformInterval); - - B3_SHARED_API void b3ConfigureOpenGLVisualizerSetViewMatrix(b3SharedMemoryCommandHandle commandHandle, float cameraDistance, float cameraPitch, float cameraYaw, const float cameraTargetPosition[/*3*/]); - - B3_SHARED_API b3SharedMemoryCommandHandle b3InitRequestOpenGLVisualizerCameraCommand(b3PhysicsClientHandle physClient); - B3_SHARED_API int b3GetStatusOpenGLVisualizerCamera(b3SharedMemoryStatusHandle statusHandle, struct b3OpenGLVisualizerCameraInfo* camera); - - /// Add/remove user-specific debug lines and debug text messages - B3_SHARED_API b3SharedMemoryCommandHandle b3InitUserDebugDrawAddLine3D(b3PhysicsClientHandle physClient, const double fromXYZ[/*3*/], const double toXYZ[/*3*/], const double colorRGB[/*3*/], double lineWidth, double lifeTime); - - B3_SHARED_API b3SharedMemoryCommandHandle b3InitUserDebugDrawAddText3D(b3PhysicsClientHandle physClient, const char* txt, const double positionXYZ[/*3*/], const double colorRGB[/*3*/], double textSize, double lifeTime); - B3_SHARED_API void b3UserDebugTextSetOptionFlags(b3SharedMemoryCommandHandle commandHandle, int optionFlags); - B3_SHARED_API void b3UserDebugTextSetOrientation(b3SharedMemoryCommandHandle commandHandle, const double orientation[/*4*/]); - B3_SHARED_API void b3UserDebugItemSetReplaceItemUniqueId(b3SharedMemoryCommandHandle commandHandle, int replaceItem); - - B3_SHARED_API void b3UserDebugItemSetParentObject(b3SharedMemoryCommandHandle commandHandle, int objectUniqueId, int linkIndex); - - B3_SHARED_API b3SharedMemoryCommandHandle b3InitUserDebugAddParameter(b3PhysicsClientHandle physClient, const char* txt, double rangeMin, double rangeMax, double startValue); - B3_SHARED_API b3SharedMemoryCommandHandle b3InitUserDebugReadParameter(b3PhysicsClientHandle physClient, int debugItemUniqueId); - B3_SHARED_API int b3GetStatusDebugParameterValue(b3SharedMemoryStatusHandle statusHandle, double* paramValue); - - B3_SHARED_API b3SharedMemoryCommandHandle b3InitUserDebugDrawRemove(b3PhysicsClientHandle physClient, int debugItemUniqueId); - B3_SHARED_API b3SharedMemoryCommandHandle b3InitUserDebugDrawRemoveAll(b3PhysicsClientHandle physClient); - B3_SHARED_API b3SharedMemoryCommandHandle b3InitUserRemoveAllParameters(b3PhysicsClientHandle physClient); - - B3_SHARED_API b3SharedMemoryCommandHandle b3InitDebugDrawingCommand(b3PhysicsClientHandle physClient); - B3_SHARED_API void b3SetDebugObjectColor(b3SharedMemoryCommandHandle commandHandle, int objectUniqueId, int linkIndex, const double objectColorRGB[/*3*/]); - B3_SHARED_API void b3RemoveDebugObjectColor(b3SharedMemoryCommandHandle commandHandle, int objectUniqueId, int linkIndex); - - ///All debug items unique Ids are positive: a negative unique Id means failure. - B3_SHARED_API int b3GetDebugItemUniqueId(b3SharedMemoryStatusHandle statusHandle); - - ///request an image from a simulated camera, using a software renderer. - B3_SHARED_API b3SharedMemoryCommandHandle b3InitRequestCameraImage(b3PhysicsClientHandle physClient); - B3_SHARED_API b3SharedMemoryCommandHandle b3InitRequestCameraImage2(b3SharedMemoryCommandHandle commandHandle); - B3_SHARED_API void b3RequestCameraImageSetCameraMatrices(b3SharedMemoryCommandHandle commandHandle, float viewMatrix[/*16*/], float projectionMatrix[/*16*/]); - B3_SHARED_API void b3RequestCameraImageSetPixelResolution(b3SharedMemoryCommandHandle commandHandle, int width, int height); - B3_SHARED_API void b3RequestCameraImageSetLightDirection(b3SharedMemoryCommandHandle commandHandle, const float lightDirection[/*3*/]); - B3_SHARED_API void b3RequestCameraImageSetLightColor(b3SharedMemoryCommandHandle commandHandle, const float lightColor[/*3*/]); - B3_SHARED_API void b3RequestCameraImageSetLightDistance(b3SharedMemoryCommandHandle commandHandle, float lightDistance); - B3_SHARED_API void b3RequestCameraImageSetLightAmbientCoeff(b3SharedMemoryCommandHandle commandHandle, float lightAmbientCoeff); - B3_SHARED_API void b3RequestCameraImageSetLightDiffuseCoeff(b3SharedMemoryCommandHandle commandHandle, float lightDiffuseCoeff); - B3_SHARED_API void b3RequestCameraImageSetLightSpecularCoeff(b3SharedMemoryCommandHandle commandHandle, float lightSpecularCoeff); - B3_SHARED_API void b3RequestCameraImageSetShadow(b3SharedMemoryCommandHandle commandHandle, int hasShadow); - B3_SHARED_API void b3RequestCameraImageSelectRenderer(b3SharedMemoryCommandHandle commandHandle, int renderer); - B3_SHARED_API void b3RequestCameraImageSetFlags(b3SharedMemoryCommandHandle commandHandle, int flags); - - B3_SHARED_API void b3GetCameraImageData(b3PhysicsClientHandle physClient, struct b3CameraImageData* imageData); - - ///set projective texture camera matrices. - B3_SHARED_API void b3RequestCameraImageSetProjectiveTextureMatrices(b3SharedMemoryCommandHandle commandHandle, float viewMatrix[/*16*/], float projectionMatrix[/*16*/]); - - ///compute a view matrix, helper function for b3RequestCameraImageSetCameraMatrices - B3_SHARED_API void b3ComputeViewMatrixFromPositions(const float cameraPosition[/*3*/], const float cameraTargetPosition[/*3*/], const float cameraUp[/*3*/], float viewMatrix[/*16*/]); - B3_SHARED_API void b3ComputeViewMatrixFromYawPitchRoll(const float cameraTargetPosition[/*3*/], float distance, float yaw, float pitch, float roll, int upAxis, float viewMatrix[/*16*/]); - B3_SHARED_API void b3ComputePositionFromViewMatrix(const float viewMatrix[/*16*/], float cameraPosition[/*3*/], float cameraTargetPosition[/*3*/], float cameraUp[/*3*/]); - - ///compute a projection matrix, helper function for b3RequestCameraImageSetCameraMatrices - B3_SHARED_API void b3ComputeProjectionMatrix(float left, float right, float bottom, float top, float nearVal, float farVal, float projectionMatrix[/*16*/]); - B3_SHARED_API void b3ComputeProjectionMatrixFOV(float fov, float aspect, float nearVal, float farVal, float projectionMatrix[/*16*/]); - - /* obsolete, please use b3ComputeViewProjectionMatrices */ - B3_SHARED_API void b3RequestCameraImageSetViewMatrix(b3SharedMemoryCommandHandle commandHandle, const float cameraPosition[/*3*/], const float cameraTargetPosition[/*3*/], const float cameraUp[/*3*/]); - /* obsolete, please use b3ComputeViewProjectionMatrices */ - B3_SHARED_API void b3RequestCameraImageSetViewMatrix2(b3SharedMemoryCommandHandle commandHandle, const float cameraTargetPosition[/*3*/], float distance, float yaw, float pitch, float roll, int upAxis); - /* obsolete, please use b3ComputeViewProjectionMatrices */ - B3_SHARED_API void b3RequestCameraImageSetProjectionMatrix(b3SharedMemoryCommandHandle commandHandle, float left, float right, float bottom, float top, float nearVal, float farVal); - /* obsolete, please use b3ComputeViewProjectionMatrices */ - B3_SHARED_API void b3RequestCameraImageSetFOVProjectionMatrix(b3SharedMemoryCommandHandle commandHandle, float fov, float aspect, float nearVal, float farVal); - - ///request an contact point information - B3_SHARED_API b3SharedMemoryCommandHandle b3InitRequestContactPointInformation(b3PhysicsClientHandle physClient); - B3_SHARED_API void b3SetContactFilterBodyA(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueIdA); - B3_SHARED_API void b3SetContactFilterBodyB(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueIdB); - B3_SHARED_API void b3SetContactFilterLinkA(b3SharedMemoryCommandHandle commandHandle, int linkIndexA); - B3_SHARED_API void b3SetContactFilterLinkB(b3SharedMemoryCommandHandle commandHandle, int linkIndexB); - B3_SHARED_API void b3GetContactPointInformation(b3PhysicsClientHandle physClient, struct b3ContactInformation* contactPointData); - - ///compute the closest points between two bodies - B3_SHARED_API b3SharedMemoryCommandHandle b3InitClosestDistanceQuery(b3PhysicsClientHandle physClient); - B3_SHARED_API void b3SetClosestDistanceFilterBodyA(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueIdA); - B3_SHARED_API void b3SetClosestDistanceFilterLinkA(b3SharedMemoryCommandHandle commandHandle, int linkIndexA); - B3_SHARED_API void b3SetClosestDistanceFilterBodyB(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueIdB); - B3_SHARED_API void b3SetClosestDistanceFilterLinkB(b3SharedMemoryCommandHandle commandHandle, int linkIndexB); - B3_SHARED_API void b3SetClosestDistanceThreshold(b3SharedMemoryCommandHandle commandHandle, double distance); - - B3_SHARED_API void b3SetClosestDistanceFilterCollisionShapeA(b3SharedMemoryCommandHandle commandHandle, int collisionShapeA); - B3_SHARED_API void b3SetClosestDistanceFilterCollisionShapeB(b3SharedMemoryCommandHandle commandHandle, int collisionShapeB); - B3_SHARED_API void b3SetClosestDistanceFilterCollisionShapePositionA(b3SharedMemoryCommandHandle commandHandle, const double collisionShapePositionA[/*3*/]); - B3_SHARED_API void b3SetClosestDistanceFilterCollisionShapePositionB(b3SharedMemoryCommandHandle commandHandle, const double collisionShapePositionB[/*3*/]); - B3_SHARED_API void b3SetClosestDistanceFilterCollisionShapeOrientationA(b3SharedMemoryCommandHandle commandHandle, const double collisionShapeOrientationA[/*4*/]); - B3_SHARED_API void b3SetClosestDistanceFilterCollisionShapeOrientationB(b3SharedMemoryCommandHandle commandHandle, const double collisionShapeOrientationB[/*4*/]); - - B3_SHARED_API void b3GetClosestPointInformation(b3PhysicsClientHandle physClient, struct b3ContactInformation* contactPointInfo); - - ///get all the bodies that touch a given axis aligned bounding box specified in world space (min and max coordinates) - B3_SHARED_API b3SharedMemoryCommandHandle b3InitAABBOverlapQuery(b3PhysicsClientHandle physClient, const double aabbMin[/*3*/], const double aabbMax[/*3*/]); - B3_SHARED_API void b3GetAABBOverlapResults(b3PhysicsClientHandle physClient, struct b3AABBOverlapData* data); - - //request visual shape information - B3_SHARED_API b3SharedMemoryCommandHandle b3InitRequestVisualShapeInformation(b3PhysicsClientHandle physClient, int bodyUniqueIdA); - B3_SHARED_API void b3GetVisualShapeInformation(b3PhysicsClientHandle physClient, struct b3VisualShapeInformation* visualShapeInfo); - - B3_SHARED_API b3SharedMemoryCommandHandle b3InitRequestCollisionShapeInformation(b3PhysicsClientHandle physClient, int bodyUniqueId, int linkIndex); - B3_SHARED_API void b3GetCollisionShapeInformation(b3PhysicsClientHandle physClient, struct b3CollisionShapeInformation* collisionShapeInfo); - - B3_SHARED_API b3SharedMemoryCommandHandle b3InitLoadTexture(b3PhysicsClientHandle physClient, const char* filename); - B3_SHARED_API int b3GetStatusTextureUniqueId(b3SharedMemoryStatusHandle statusHandle); - - B3_SHARED_API b3SharedMemoryCommandHandle b3CreateChangeTextureCommandInit(b3PhysicsClientHandle physClient, int textureUniqueId, int width, int height, const char* rgbPixels); - - B3_SHARED_API b3SharedMemoryCommandHandle b3InitUpdateVisualShape(b3PhysicsClientHandle physClient, int bodyUniqueId, int jointIndex, int shapeIndex, int textureUniqueId); - B3_SHARED_API b3SharedMemoryCommandHandle b3InitUpdateVisualShape2(b3PhysicsClientHandle physClient, int bodyUniqueId, int jointIndex, int shapeIndex); - B3_SHARED_API void b3UpdateVisualShapeTexture(b3SharedMemoryCommandHandle commandHandle, int textureUniqueId); - B3_SHARED_API void b3UpdateVisualShapeRGBAColor(b3SharedMemoryCommandHandle commandHandle, const double rgbaColor[/*4*/]); - B3_SHARED_API void b3UpdateVisualShapeFlags(b3SharedMemoryCommandHandle commandHandle, int flags); - - B3_SHARED_API void b3UpdateVisualShapeSpecularColor(b3SharedMemoryCommandHandle commandHandle, const double specularColor[/*3*/]); - - B3_SHARED_API b3SharedMemoryCommandHandle b3InitPhysicsParamCommand(b3PhysicsClientHandle physClient); - B3_SHARED_API b3SharedMemoryCommandHandle b3InitPhysicsParamCommand2(b3SharedMemoryCommandHandle commandHandle); - B3_SHARED_API int b3PhysicsParamSetGravity(b3SharedMemoryCommandHandle commandHandle, double gravx, double gravy, double gravz); - B3_SHARED_API int b3PhysicsParamSetTimeStep(b3SharedMemoryCommandHandle commandHandle, double timeStep); - B3_SHARED_API int b3PhysicsParamSetDefaultContactERP(b3SharedMemoryCommandHandle commandHandle, double defaultContactERP); - B3_SHARED_API int b3PhysicsParamSetDefaultNonContactERP(b3SharedMemoryCommandHandle commandHandle, double defaultNonContactERP); - B3_SHARED_API int b3PhysicsParamSetDefaultFrictionERP(b3SharedMemoryCommandHandle commandHandle, double frictionERP); - B3_SHARED_API int b3PhysicsParamSetDefaultGlobalCFM(b3SharedMemoryCommandHandle commandHandle, double defaultGlobalCFM); - B3_SHARED_API int b3PhysicsParamSetDefaultFrictionCFM(b3SharedMemoryCommandHandle commandHandle, double frictionCFM); - B3_SHARED_API int b3PhysicsParamSetNumSubSteps(b3SharedMemoryCommandHandle commandHandle, int numSubSteps); - B3_SHARED_API int b3PhysicsParamSetRealTimeSimulation(b3SharedMemoryCommandHandle commandHandle, int enableRealTimeSimulation); - B3_SHARED_API int b3PhysicsParamSetNumSolverIterations(b3SharedMemoryCommandHandle commandHandle, int numSolverIterations); - B3_SHARED_API int b3PhysicsParamSetNumNonContactInnerIterations(b3SharedMemoryCommandHandle commandHandle, int numMotorIterations); - B3_SHARED_API int b3PhysicsParamSetWarmStartingFactor(b3SharedMemoryCommandHandle commandHandle, double warmStartingFactor); - B3_SHARED_API int b3PhysicsParamSetArticulatedWarmStartingFactor(b3SharedMemoryCommandHandle commandHandle, double warmStartingFactor); - B3_SHARED_API int b3PhysicsParamSetCollisionFilterMode(b3SharedMemoryCommandHandle commandHandle, int filterMode); - B3_SHARED_API int b3PhysicsParamSetUseSplitImpulse(b3SharedMemoryCommandHandle commandHandle, int useSplitImpulse); - B3_SHARED_API int b3PhysicsParamSetSplitImpulsePenetrationThreshold(b3SharedMemoryCommandHandle commandHandle, double splitImpulsePenetrationThreshold); - B3_SHARED_API int b3PhysicsParamSetContactBreakingThreshold(b3SharedMemoryCommandHandle commandHandle, double contactBreakingThreshold); - B3_SHARED_API int b3PhysicsParamSetMaxNumCommandsPer1ms(b3SharedMemoryCommandHandle commandHandle, int maxNumCmdPer1ms); - B3_SHARED_API int b3PhysicsParamSetEnableFileCaching(b3SharedMemoryCommandHandle commandHandle, int enableFileCaching); - B3_SHARED_API int b3PhysicsParamSetRestitutionVelocityThreshold(b3SharedMemoryCommandHandle commandHandle, double restitutionVelocityThreshold); - B3_SHARED_API int b3PhysicsParamSetEnableConeFriction(b3SharedMemoryCommandHandle commandHandle, int enableConeFriction); - B3_SHARED_API int b3PhysicsParameterSetDeterministicOverlappingPairs(b3SharedMemoryCommandHandle commandHandle, int deterministicOverlappingPairs); - B3_SHARED_API int b3PhysicsParameterSetAllowedCcdPenetration(b3SharedMemoryCommandHandle commandHandle, double allowedCcdPenetration); - B3_SHARED_API int b3PhysicsParameterSetJointFeedbackMode(b3SharedMemoryCommandHandle commandHandle, int jointFeedbackMode); - B3_SHARED_API int b3PhysicsParamSetSolverResidualThreshold(b3SharedMemoryCommandHandle commandHandle, double solverResidualThreshold); - B3_SHARED_API int b3PhysicsParamSetContactSlop(b3SharedMemoryCommandHandle commandHandle, double contactSlop); - B3_SHARED_API int b3PhysicsParameterSetEnableSAT(b3SharedMemoryCommandHandle commandHandle, int enableSAT); - B3_SHARED_API int b3PhysicsParameterSetConstraintSolverType(b3SharedMemoryCommandHandle commandHandle, int constraintSolverType); - B3_SHARED_API int b3PhysicsParameterSetMinimumSolverIslandSize(b3SharedMemoryCommandHandle commandHandle, int minimumSolverIslandSize); - B3_SHARED_API int b3PhysicsParamSetSolverAnalytics(b3SharedMemoryCommandHandle commandHandle, int reportSolverAnalytics); - B3_SHARED_API int b3PhysicsParameterSetSparseSdfVoxelSize(b3SharedMemoryCommandHandle commandHandle, double sparseSdfVoxelSize); - - B3_SHARED_API b3SharedMemoryCommandHandle b3InitRequestPhysicsParamCommand(b3PhysicsClientHandle physClient); - B3_SHARED_API int b3GetStatusPhysicsSimulationParameters(b3SharedMemoryStatusHandle statusHandle, struct b3PhysicsSimulationParameters* params); - - //b3PhysicsParamSetInternalSimFlags is for internal/temporary/easter-egg/experimental demo purposes - //Use at own risk: magic things may or my not happen when calling this API - B3_SHARED_API int b3PhysicsParamSetInternalSimFlags(b3SharedMemoryCommandHandle commandHandle, int flags); - - B3_SHARED_API b3SharedMemoryCommandHandle b3InitStepSimulationCommand(b3PhysicsClientHandle physClient); - B3_SHARED_API b3SharedMemoryCommandHandle b3InitStepSimulationCommand2(b3SharedMemoryCommandHandle commandHandle); - - B3_SHARED_API int b3GetStatusForwardDynamicsAnalyticsData(b3SharedMemoryStatusHandle statusHandle, struct b3ForwardDynamicsAnalyticsArgs* analyticsData); - - - B3_SHARED_API b3SharedMemoryCommandHandle b3InitResetSimulationCommand(b3PhysicsClientHandle physClient); - B3_SHARED_API b3SharedMemoryCommandHandle b3InitResetSimulationCommand2(b3SharedMemoryCommandHandle commandHandle); - B3_SHARED_API int b3InitResetSimulationSetFlags(b3SharedMemoryCommandHandle commandHandle, int flags); - ///Load a robot from a URDF file. Status type will CMD_URDF_LOADING_COMPLETED. - ///Access the robot from the unique body index, through b3GetStatusBodyIndex(statusHandle); - B3_SHARED_API b3SharedMemoryCommandHandle b3LoadUrdfCommandInit(b3PhysicsClientHandle physClient, const char* urdfFileName); - B3_SHARED_API b3SharedMemoryCommandHandle b3LoadUrdfCommandInit2(b3SharedMemoryCommandHandle commandHandle, const char* urdfFileName); - B3_SHARED_API int b3LoadUrdfCommandSetStartPosition(b3SharedMemoryCommandHandle commandHandle, double startPosX, double startPosY, double startPosZ); - B3_SHARED_API int b3LoadUrdfCommandSetStartOrientation(b3SharedMemoryCommandHandle commandHandle, double startOrnX, double startOrnY, double startOrnZ, double startOrnW); - B3_SHARED_API int b3LoadUrdfCommandSetUseMultiBody(b3SharedMemoryCommandHandle commandHandle, int useMultiBody); - B3_SHARED_API int b3LoadUrdfCommandSetUseFixedBase(b3SharedMemoryCommandHandle commandHandle, int useFixedBase); - B3_SHARED_API int b3LoadUrdfCommandSetFlags(b3SharedMemoryCommandHandle commandHandle, int flags); - B3_SHARED_API int b3LoadUrdfCommandSetGlobalScaling(b3SharedMemoryCommandHandle commandHandle, double globalScaling); - - B3_SHARED_API b3SharedMemoryCommandHandle b3SaveStateCommandInit(b3PhysicsClientHandle physClient); - B3_SHARED_API b3SharedMemoryCommandHandle b3InitRemoveStateCommand(b3PhysicsClientHandle physClient, int stateId); - B3_SHARED_API int b3GetStatusGetStateId(b3SharedMemoryStatusHandle statusHandle); - - B3_SHARED_API b3SharedMemoryCommandHandle b3LoadStateCommandInit(b3PhysicsClientHandle physClient); - B3_SHARED_API int b3LoadStateSetStateId(b3SharedMemoryCommandHandle commandHandle, int stateId); - B3_SHARED_API int b3LoadStateSetFileName(b3SharedMemoryCommandHandle commandHandle, const char* fileName); - - B3_SHARED_API b3SharedMemoryCommandHandle b3LoadBulletCommandInit(b3PhysicsClientHandle physClient, const char* fileName); - - B3_SHARED_API b3SharedMemoryCommandHandle b3SaveBulletCommandInit(b3PhysicsClientHandle physClient, const char* fileName); - B3_SHARED_API b3SharedMemoryCommandHandle b3LoadMJCFCommandInit(b3PhysicsClientHandle physClient, const char* fileName); - B3_SHARED_API b3SharedMemoryCommandHandle b3LoadMJCFCommandInit2(b3SharedMemoryCommandHandle commandHandle, const char* fileName); - B3_SHARED_API void b3LoadMJCFCommandSetFlags(b3SharedMemoryCommandHandle commandHandle, int flags); - - ///compute the forces to achieve an acceleration, given a state q and qdot using inverse dynamics - B3_SHARED_API b3SharedMemoryCommandHandle b3CalculateInverseDynamicsCommandInit(b3PhysicsClientHandle physClient, int bodyUniqueId, - const double* jointPositionsQ, const double* jointVelocitiesQdot, const double* jointAccelerations); - B3_SHARED_API b3SharedMemoryCommandHandle b3CalculateInverseDynamicsCommandInit2(b3PhysicsClientHandle physClient, int bodyUniqueId, - const double* jointPositionsQ, int dofCountQ, const double* jointVelocitiesQdot, const double* jointAccelerations, int dofCountQdot); - B3_SHARED_API void b3CalculateInverseDynamicsSetFlags(b3SharedMemoryCommandHandle commandHandle, int flags); - - B3_SHARED_API int b3GetStatusInverseDynamicsJointForces(b3SharedMemoryStatusHandle statusHandle, - int* bodyUniqueId, - int* dofCount, - double* jointForces); - - B3_SHARED_API b3SharedMemoryCommandHandle b3CalculateJacobianCommandInit(b3PhysicsClientHandle physClient, int bodyUniqueId, int linkIndex, const double* localPosition, const double* jointPositionsQ, const double* jointVelocitiesQdot, const double* jointAccelerations); - B3_SHARED_API int b3GetStatusJacobian(b3SharedMemoryStatusHandle statusHandle, - int* dofCount, - double* linearJacobian, - double* angularJacobian); - - B3_SHARED_API b3SharedMemoryCommandHandle b3CalculateMassMatrixCommandInit(b3PhysicsClientHandle physClient, int bodyUniqueId, const double* jointPositionsQ, int dofCountQ); - B3_SHARED_API void b3CalculateMassMatrixSetFlags(b3SharedMemoryCommandHandle commandHandle, int flags); - ///the mass matrix is stored in column-major layout of size dofCount*dofCount - B3_SHARED_API int b3GetStatusMassMatrix(b3PhysicsClientHandle physClient, b3SharedMemoryStatusHandle statusHandle, int* dofCount, double* massMatrix); - - ///compute the joint positions to move the end effector to a desired target using inverse kinematics - B3_SHARED_API b3SharedMemoryCommandHandle b3CalculateInverseKinematicsCommandInit(b3PhysicsClientHandle physClient, int bodyUniqueId); - B3_SHARED_API void b3CalculateInverseKinematicsAddTargetPurePosition(b3SharedMemoryCommandHandle commandHandle, int endEffectorLinkIndex, const double targetPosition[/*3*/]); - B3_SHARED_API void b3CalculateInverseKinematicsAddTargetsPurePosition(b3SharedMemoryCommandHandle commandHandle, int numEndEffectorLinkIndices, const int* endEffectorIndices, const double* targetPositions); - B3_SHARED_API void b3CalculateInverseKinematicsAddTargetPositionWithOrientation(b3SharedMemoryCommandHandle commandHandle, int endEffectorLinkIndex, const double targetPosition[/*3*/], const double targetOrientation[/*4*/]); - B3_SHARED_API void b3CalculateInverseKinematicsPosWithNullSpaceVel(b3SharedMemoryCommandHandle commandHandle, int numDof, int endEffectorLinkIndex, const double targetPosition[/*3*/], const double* lowerLimit, const double* upperLimit, const double* jointRange, const double* restPose); - B3_SHARED_API void b3CalculateInverseKinematicsPosOrnWithNullSpaceVel(b3SharedMemoryCommandHandle commandHandle, int numDof, int endEffectorLinkIndex, const double targetPosition[/*3*/], const double targetOrientation[/*4*/], const double* lowerLimit, const double* upperLimit, const double* jointRange, const double* restPose); - B3_SHARED_API void b3CalculateInverseKinematicsSetJointDamping(b3SharedMemoryCommandHandle commandHandle, int numDof, const double* jointDampingCoeff); - B3_SHARED_API void b3CalculateInverseKinematicsSelectSolver(b3SharedMemoryCommandHandle commandHandle, int solver); - B3_SHARED_API int b3GetStatusInverseKinematicsJointPositions(b3SharedMemoryStatusHandle statusHandle, - int* bodyUniqueId, - int* dofCount, - double* jointPositions); - - B3_SHARED_API void b3CalculateInverseKinematicsSetCurrentPositions(b3SharedMemoryCommandHandle commandHandle, int numDof, const double* currentJointPositions); - B3_SHARED_API void b3CalculateInverseKinematicsSetMaxNumIterations(b3SharedMemoryCommandHandle commandHandle, int maxNumIterations); - B3_SHARED_API void b3CalculateInverseKinematicsSetResidualThreshold(b3SharedMemoryCommandHandle commandHandle, double residualThreshold); - - B3_SHARED_API b3SharedMemoryCommandHandle b3CollisionFilterCommandInit(b3PhysicsClientHandle physClient); - B3_SHARED_API void b3SetCollisionFilterPair(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueIdA, - int bodyUniqueIdB, int linkIndexA, int linkIndexB, int enableCollision); - B3_SHARED_API void b3SetCollisionFilterGroupMask(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueIdA, - int linkIndexA, int collisionFilterGroup, int collisionFilterMask); - - B3_SHARED_API b3SharedMemoryCommandHandle b3LoadSdfCommandInit(b3PhysicsClientHandle physClient, const char* sdfFileName); - B3_SHARED_API b3SharedMemoryCommandHandle b3LoadSdfCommandInit2(b3SharedMemoryCommandHandle commandHandle, const char* sdfFileName); - - B3_SHARED_API int b3LoadSdfCommandSetUseMultiBody(b3SharedMemoryCommandHandle commandHandle, int useMultiBody); - B3_SHARED_API int b3LoadSdfCommandSetUseGlobalScaling(b3SharedMemoryCommandHandle commandHandle, double globalScaling); - - B3_SHARED_API b3SharedMemoryCommandHandle b3SaveWorldCommandInit(b3PhysicsClientHandle physClient, const char* sdfFileName); - - ///The b3JointControlCommandInit method is obsolete, use b3JointControlCommandInit2 instead - B3_SHARED_API b3SharedMemoryCommandHandle b3JointControlCommandInit(b3PhysicsClientHandle physClient, int controlMode); - - ///Set joint motor control variables such as desired position/angle, desired velocity, - ///applied joint forces, dependent on the control mode (CONTROL_MODE_VELOCITY or CONTROL_MODE_TORQUE) - B3_SHARED_API b3SharedMemoryCommandHandle b3JointControlCommandInit2(b3PhysicsClientHandle physClient, int bodyUniqueId, int controlMode); - B3_SHARED_API b3SharedMemoryCommandHandle b3JointControlCommandInit2Internal(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueId, int controlMode); - - ///Only use when controlMode is CONTROL_MODE_POSITION_VELOCITY_PD - B3_SHARED_API int b3JointControlSetDesiredPosition(b3SharedMemoryCommandHandle commandHandle, int qIndex, double value); - B3_SHARED_API int b3JointControlSetDesiredPositionMultiDof(b3SharedMemoryCommandHandle commandHandle, int qIndex, const double* position, int dofCount); - - B3_SHARED_API int b3JointControlSetKp(b3SharedMemoryCommandHandle commandHandle, int dofIndex, double value); - B3_SHARED_API int b3JointControlSetKd(b3SharedMemoryCommandHandle commandHandle, int dofIndex, double value); - B3_SHARED_API int b3JointControlSetMaximumVelocity(b3SharedMemoryCommandHandle commandHandle, int dofIndex, double maximumVelocity); - - ///Only use when controlMode is CONTROL_MODE_VELOCITY - B3_SHARED_API int b3JointControlSetDesiredVelocity(b3SharedMemoryCommandHandle commandHandle, int dofIndex, double value); /* find a better name for dof/q/u indices, point to b3JointInfo */ - B3_SHARED_API int b3JointControlSetDesiredVelocityMultiDof(b3SharedMemoryCommandHandle commandHandle, int dofIndex, const double* velocity, int dofCount); - B3_SHARED_API int b3JointControlSetDesiredVelocityMultiDof2(b3SharedMemoryCommandHandle commandHandle, int dofIndex, const double* velocity, int dofCount); - - B3_SHARED_API int b3JointControlSetMaximumForce(b3SharedMemoryCommandHandle commandHandle, int dofIndex, double value); - B3_SHARED_API int b3JointControlSetDesiredForceTorqueMultiDof(b3SharedMemoryCommandHandle commandHandle, int dofIndex, double* forces, int dofCount); - - ///Only use if when controlMode is CONTROL_MODE_TORQUE, - B3_SHARED_API int b3JointControlSetDesiredForceTorque(b3SharedMemoryCommandHandle commandHandle, int dofIndex, double value); - - ///the creation of collision shapes and rigid bodies etc is likely going to change, - ///but good to have a b3CreateBoxShapeCommandInit for now - - B3_SHARED_API b3SharedMemoryCommandHandle b3CreateCollisionShapeCommandInit(b3PhysicsClientHandle physClient); - B3_SHARED_API int b3CreateCollisionShapeAddSphere(b3SharedMemoryCommandHandle commandHandle, double radius); - B3_SHARED_API int b3CreateCollisionShapeAddBox(b3SharedMemoryCommandHandle commandHandle, const double halfExtents[/*3*/]); - B3_SHARED_API int b3CreateCollisionShapeAddCapsule(b3SharedMemoryCommandHandle commandHandle, double radius, double height); - B3_SHARED_API int b3CreateCollisionShapeAddCylinder(b3SharedMemoryCommandHandle commandHandle, double radius, double height); - B3_SHARED_API int b3CreateCollisionShapeAddHeightfield(b3SharedMemoryCommandHandle commandHandle, const char* fileName, const double meshScale[/*3*/], double textureScaling); - B3_SHARED_API int b3CreateCollisionShapeAddHeightfield2(b3PhysicsClientHandle physClient, b3SharedMemoryCommandHandle commandHandle, const double meshScale[/*3*/], double textureScaling, float* heightfieldData, int numHeightfieldRows, int numHeightfieldColumns, int replaceHeightfieldIndex); - - B3_SHARED_API int b3CreateCollisionShapeAddPlane(b3SharedMemoryCommandHandle commandHandle, const double planeNormal[/*3*/], double planeConstant); - B3_SHARED_API int b3CreateCollisionShapeAddMesh(b3SharedMemoryCommandHandle commandHandle, const char* fileName, const double meshScale[/*3*/]); - B3_SHARED_API int b3CreateCollisionShapeAddConvexMesh(b3PhysicsClientHandle physClient, b3SharedMemoryCommandHandle commandHandle, const double meshScale[/*3*/], const double* vertices, int numVertices); - B3_SHARED_API int b3CreateCollisionShapeAddConcaveMesh(b3PhysicsClientHandle physClient, b3SharedMemoryCommandHandle commandHandle, const double meshScale[/*3*/], const double* vertices, int numVertices, const int* indices, int numIndices); - B3_SHARED_API void b3CreateCollisionSetFlag(b3SharedMemoryCommandHandle commandHandle, int shapeIndex, int flags); - B3_SHARED_API void b3CreateCollisionShapeSetChildTransform(b3SharedMemoryCommandHandle commandHandle, int shapeIndex, const double childPosition[/*3*/], const double childOrientation[/*4*/]); - B3_SHARED_API int b3GetStatusCollisionShapeUniqueId(b3SharedMemoryStatusHandle statusHandle); - - B3_SHARED_API b3SharedMemoryCommandHandle b3InitRemoveCollisionShapeCommand(b3PhysicsClientHandle physClient, int collisionShapeId); - - B3_SHARED_API b3SharedMemoryCommandHandle b3GetMeshDataCommandInit(b3PhysicsClientHandle physClient, int bodyUniqueId, int linkIndex); - B3_SHARED_API void b3GetMeshDataSetCollisionShapeIndex(b3SharedMemoryCommandHandle commandHandle, int shapeIndex); - B3_SHARED_API void b3GetMeshDataSetFlags(b3SharedMemoryCommandHandle commandHandle, int flags); - - B3_SHARED_API void b3GetMeshData(b3PhysicsClientHandle physClient, struct b3MeshData* meshData); - - - B3_SHARED_API b3SharedMemoryCommandHandle b3CreateVisualShapeCommandInit(b3PhysicsClientHandle physClient); - B3_SHARED_API int b3CreateVisualShapeAddSphere(b3SharedMemoryCommandHandle commandHandle, double radius); - B3_SHARED_API int b3CreateVisualShapeAddBox(b3SharedMemoryCommandHandle commandHandle, const double halfExtents[/*3*/]); - B3_SHARED_API int b3CreateVisualShapeAddCapsule(b3SharedMemoryCommandHandle commandHandle, double radius, double height); - B3_SHARED_API int b3CreateVisualShapeAddCylinder(b3SharedMemoryCommandHandle commandHandle, double radius, double height); - B3_SHARED_API int b3CreateVisualShapeAddPlane(b3SharedMemoryCommandHandle commandHandle, const double planeNormal[/*3*/], double planeConstant); - B3_SHARED_API int b3CreateVisualShapeAddMesh(b3SharedMemoryCommandHandle commandHandle, const char* fileName, const double meshScale[/*3*/]); - B3_SHARED_API int b3CreateVisualShapeAddMesh2(b3PhysicsClientHandle physClient, b3SharedMemoryCommandHandle commandHandle, const double meshScale[/*3*/], const double* vertices, int numVertices, const int* indices, int numIndices, const double* normals, int numNormals, const double* uvs, int numUVs); - - - B3_SHARED_API void b3CreateVisualSetFlag(b3SharedMemoryCommandHandle commandHandle, int shapeIndex, int flags); - B3_SHARED_API void b3CreateVisualShapeSetChildTransform(b3SharedMemoryCommandHandle commandHandle, int shapeIndex, const double childPosition[/*3*/], const double childOrientation[/*4*/]); - B3_SHARED_API void b3CreateVisualShapeSetSpecularColor(b3SharedMemoryCommandHandle commandHandle, int shapeIndex, const double specularColor[/*3*/]); - B3_SHARED_API void b3CreateVisualShapeSetRGBAColor(b3SharedMemoryCommandHandle commandHandle, int shapeIndex, const double rgbaColor[/*4*/]); - - B3_SHARED_API int b3GetStatusVisualShapeUniqueId(b3SharedMemoryStatusHandle statusHandle); - - B3_SHARED_API b3SharedMemoryCommandHandle b3CreateMultiBodyCommandInit(b3PhysicsClientHandle physClient); - B3_SHARED_API int b3CreateMultiBodyBase(b3SharedMemoryCommandHandle commandHandle, double mass, int collisionShapeUnique, int visualShapeUniqueId, const double basePosition[/*3*/], const double baseOrientation[/*4*/], const double baseInertialFramePosition[/*3*/], const double baseInertialFrameOrientation[/*4*/]); - - B3_SHARED_API int b3CreateMultiBodyLink(b3SharedMemoryCommandHandle commandHandle, double linkMass, double linkCollisionShapeIndex, - double linkVisualShapeIndex, - const double linkPosition[/*3*/], - const double linkOrientation[/*4*/], - const double linkInertialFramePosition[/*3*/], - const double linkInertialFrameOrientation[/*4*/], - int linkParentIndex, - int linkJointType, - const double linkJointAxis[/*3*/]); - - //batch creation is an performance feature to create a large number of multi bodies in one command - B3_SHARED_API int b3CreateMultiBodySetBatchPositions(b3PhysicsClientHandle physClient, b3SharedMemoryCommandHandle commandHandle, double* batchPositions, int numBatchObjects); - - //useMaximalCoordinates are disabled by default, enabling them is experimental and not fully supported yet - B3_SHARED_API void b3CreateMultiBodyUseMaximalCoordinates(b3SharedMemoryCommandHandle commandHandle); - B3_SHARED_API void b3CreateMultiBodySetFlags(b3SharedMemoryCommandHandle commandHandle, int flags); - - //int b3CreateMultiBodyAddLink(b3SharedMemoryCommandHandle commandHandle, int jointType, int parentLinkIndex, double linkMass, int linkCollisionShapeUnique, int linkVisualShapeUniqueId); - - ///create a box of size (1,1,1) at world origin (0,0,0) at orientation quat (0,0,0,1) - ///after that, you can optionally adjust the initial position, orientation and size - B3_SHARED_API b3SharedMemoryCommandHandle b3CreateBoxShapeCommandInit(b3PhysicsClientHandle physClient); - B3_SHARED_API int b3CreateBoxCommandSetStartPosition(b3SharedMemoryCommandHandle commandHandle, double startPosX, double startPosY, double startPosZ); - B3_SHARED_API int b3CreateBoxCommandSetStartOrientation(b3SharedMemoryCommandHandle commandHandle, double startOrnX, double startOrnY, double startOrnZ, double startOrnW); - B3_SHARED_API int b3CreateBoxCommandSetHalfExtents(b3SharedMemoryCommandHandle commandHandle, double halfExtentsX, double halfExtentsY, double halfExtentsZ); - B3_SHARED_API int b3CreateBoxCommandSetMass(b3SharedMemoryCommandHandle commandHandle, double mass); - B3_SHARED_API int b3CreateBoxCommandSetCollisionShapeType(b3SharedMemoryCommandHandle commandHandle, int collisionShapeType); - B3_SHARED_API int b3CreateBoxCommandSetColorRGBA(b3SharedMemoryCommandHandle commandHandle, double red, double green, double blue, double alpha); - - ///b3CreatePoseCommandInit will initialize (teleport) the pose of a body/robot. You can individually set the base position, - ///base orientation and joint angles. This will set all velocities of base and joints to zero. - ///This is not a robot control command using actuators/joint motors, but manual repositioning the robot. - B3_SHARED_API b3SharedMemoryCommandHandle b3CreatePoseCommandInit(b3PhysicsClientHandle physClient, int bodyUniqueId); - B3_SHARED_API b3SharedMemoryCommandHandle b3CreatePoseCommandInit2(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueId); - - B3_SHARED_API int b3CreatePoseCommandSetBasePosition(b3SharedMemoryCommandHandle commandHandle, double startPosX, double startPosY, double startPosZ); - B3_SHARED_API int b3CreatePoseCommandSetBaseOrientation(b3SharedMemoryCommandHandle commandHandle, double startOrnX, double startOrnY, double startOrnZ, double startOrnW); - B3_SHARED_API int b3CreatePoseCommandSetBaseLinearVelocity(b3SharedMemoryCommandHandle commandHandle, const double linVel[/*3*/]); - B3_SHARED_API int b3CreatePoseCommandSetBaseAngularVelocity(b3SharedMemoryCommandHandle commandHandle, const double angVel[/*3*/]); - B3_SHARED_API int b3CreatePoseCommandSetBaseScaling(b3SharedMemoryCommandHandle commandHandle, double scaling[/* 3*/]); - - - B3_SHARED_API int b3CreatePoseCommandSetJointPositions(b3SharedMemoryCommandHandle commandHandle, int numJointPositions, const double* jointPositions); - B3_SHARED_API int b3CreatePoseCommandSetJointPosition(b3PhysicsClientHandle physClient, b3SharedMemoryCommandHandle commandHandle, int jointIndex, double jointPosition); - B3_SHARED_API int b3CreatePoseCommandSetJointPositionMultiDof(b3PhysicsClientHandle physClient, b3SharedMemoryCommandHandle commandHandle, int jointIndex, const double* jointPosition, int posSize); - - B3_SHARED_API int b3CreatePoseCommandSetQ(b3SharedMemoryCommandHandle commandHandle, int numJointPositions, const double* q, const int* hasQ); - B3_SHARED_API int b3CreatePoseCommandSetQdots(b3SharedMemoryCommandHandle commandHandle, int numJointVelocities, const double* qDots, const int* hasQdots); - - B3_SHARED_API int b3CreatePoseCommandSetJointVelocities(b3PhysicsClientHandle physClient, b3SharedMemoryCommandHandle commandHandle, int numJointVelocities, const double* jointVelocities); - B3_SHARED_API int b3CreatePoseCommandSetJointVelocity(b3PhysicsClientHandle physClient, b3SharedMemoryCommandHandle commandHandle, int jointIndex, double jointVelocity); - B3_SHARED_API int b3CreatePoseCommandSetJointVelocityMultiDof(b3PhysicsClientHandle physClient, b3SharedMemoryCommandHandle commandHandle, int jointIndex, const double* jointVelocity, int velSize); - - ///We are currently not reading the sensor information from the URDF file, and programmatically assign sensors. - ///This is rather inconsistent, to mix programmatical creation with loading from file. - B3_SHARED_API b3SharedMemoryCommandHandle b3CreateSensorCommandInit(b3PhysicsClientHandle physClient, int bodyUniqueId); - B3_SHARED_API int b3CreateSensorEnable6DofJointForceTorqueSensor(b3SharedMemoryCommandHandle commandHandle, int jointIndex, int enable); - ///b3CreateSensorEnableIMUForLink is not implemented yet. - ///For now, if the IMU is located in the root link, use the root world transform to mimic an IMU. - B3_SHARED_API int b3CreateSensorEnableIMUForLink(b3SharedMemoryCommandHandle commandHandle, int linkIndex, int enable); - - B3_SHARED_API b3SharedMemoryCommandHandle b3RequestActualStateCommandInit(b3PhysicsClientHandle physClient, int bodyUniqueId); - B3_SHARED_API b3SharedMemoryCommandHandle b3RequestActualStateCommandInit2(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueId); - - B3_SHARED_API int b3RequestActualStateCommandComputeLinkVelocity(b3SharedMemoryCommandHandle commandHandle, int computeLinkVelocity); - B3_SHARED_API int b3RequestActualStateCommandComputeForwardKinematics(b3SharedMemoryCommandHandle commandHandle, int computeForwardKinematics); - - B3_SHARED_API int b3GetJointState(b3PhysicsClientHandle physClient, b3SharedMemoryStatusHandle statusHandle, int jointIndex, struct b3JointSensorState* state); - B3_SHARED_API int b3GetJointStateMultiDof(b3PhysicsClientHandle physClient, b3SharedMemoryStatusHandle statusHandle, int jointIndex, struct b3JointSensorState2* state); - B3_SHARED_API int b3GetLinkState(b3PhysicsClientHandle physClient, b3SharedMemoryStatusHandle statusHandle, int linkIndex, struct b3LinkState* state); - - B3_SHARED_API b3SharedMemoryCommandHandle b3PickBody(b3PhysicsClientHandle physClient, double rayFromWorldX, - double rayFromWorldY, double rayFromWorldZ, - double rayToWorldX, double rayToWorldY, double rayToWorldZ); - B3_SHARED_API b3SharedMemoryCommandHandle b3MovePickedBody(b3PhysicsClientHandle physClient, double rayFromWorldX, - double rayFromWorldY, double rayFromWorldZ, - double rayToWorldX, double rayToWorldY, - double rayToWorldZ); - B3_SHARED_API b3SharedMemoryCommandHandle b3RemovePickingConstraint(b3PhysicsClientHandle physClient); - - B3_SHARED_API b3SharedMemoryCommandHandle b3CreateRaycastCommandInit(b3PhysicsClientHandle physClient, double rayFromWorldX, - double rayFromWorldY, double rayFromWorldZ, - double rayToWorldX, double rayToWorldY, double rayToWorldZ); - - B3_SHARED_API b3SharedMemoryCommandHandle b3CreateRaycastBatchCommandInit(b3PhysicsClientHandle physClient); - // Sets the number of threads to use to compute the ray intersections for the batch. Specify 0 to let Bullet decide, 1 (default) for single core execution, 2 or more to select the number of threads to use. - B3_SHARED_API void b3RaycastBatchSetNumThreads(b3SharedMemoryCommandHandle commandHandle, int numThreads); - //max num rays for b3RaycastBatchAddRay is MAX_RAY_INTERSECTION_BATCH_SIZE - B3_SHARED_API void b3RaycastBatchAddRay(b3SharedMemoryCommandHandle commandHandle, const double rayFromWorld[/*3*/], const double rayToWorld[/*3*/]); - //max num rays for b3RaycastBatchAddRays is MAX_RAY_INTERSECTION_BATCH_SIZE_STREAMING - B3_SHARED_API void b3RaycastBatchAddRays(b3PhysicsClientHandle physClient, b3SharedMemoryCommandHandle commandHandle, const double* rayFromWorld, const double* rayToWorld, int numRays); - B3_SHARED_API void b3RaycastBatchSetParentObject(b3SharedMemoryCommandHandle commandHandle, int parentObjectUniqueId, int parentLinkIndex); - B3_SHARED_API void b3RaycastBatchSetReportHitNumber(b3SharedMemoryCommandHandle commandHandle, int reportHitNumber); - B3_SHARED_API void b3RaycastBatchSetCollisionFilterMask(b3SharedMemoryCommandHandle commandHandle, int collisionFilterMask); - B3_SHARED_API void b3RaycastBatchSetFractionEpsilon(b3SharedMemoryCommandHandle commandHandle, double fractionEpsilon); - - B3_SHARED_API void b3GetRaycastInformation(b3PhysicsClientHandle physClient, struct b3RaycastInformation* raycastInfo); - - /// Apply external force at the body (or link) center of mass, in world space/Cartesian coordinates. - B3_SHARED_API b3SharedMemoryCommandHandle b3ApplyExternalForceCommandInit(b3PhysicsClientHandle physClient); - B3_SHARED_API void b3ApplyExternalForce(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueId, int linkId, const double force[/*3*/], const double position[/*3*/], int flag); - B3_SHARED_API void b3ApplyExternalTorque(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueId, int linkId, const double torque[/*3*/], int flag); - - ///experiments of robots interacting with non-rigid objects (such as btSoftBody) - B3_SHARED_API b3SharedMemoryCommandHandle b3LoadSoftBodyCommandInit(b3PhysicsClientHandle physClient, const char* fileName); - B3_SHARED_API int b3LoadSoftBodySetScale(b3SharedMemoryCommandHandle commandHandle, double scale); - B3_SHARED_API int b3LoadSoftBodySetMass(b3SharedMemoryCommandHandle commandHandle, double mass); - B3_SHARED_API int b3LoadSoftBodySetCollisionMargin(b3SharedMemoryCommandHandle commandHandle, double collisionMargin); - B3_SHARED_API int b3LoadSoftBodySetStartPosition(b3SharedMemoryCommandHandle commandHandle, double startPosX, double startPosY, double startPosZ); - B3_SHARED_API int b3LoadSoftBodySetStartOrientation(b3SharedMemoryCommandHandle commandHandle, double startOrnX, double startOrnY, double startOrnZ, double startOrnW); - B3_SHARED_API int b3LoadSoftBodyUpdateSimMesh(b3SharedMemoryCommandHandle commandHandle, const char* filename); - B3_SHARED_API int b3LoadSoftBodyAddCorotatedForce(b3SharedMemoryCommandHandle commandHandle, double corotatedMu, double corotatedLambda); - B3_SHARED_API int b3LoadSoftBodyAddCorotatedForce(b3SharedMemoryCommandHandle commandHandle, double corotatedMu, double corotatedLambda); - B3_SHARED_API int b3LoadSoftBodyAddNeoHookeanForce(b3SharedMemoryCommandHandle commandHandle, double NeoHookeanMu, double NeoHookeanLambda, double NeoHookeanDamping); - B3_SHARED_API int b3LoadSoftBodyAddMassSpringForce(b3SharedMemoryCommandHandle commandHandle, double springElasticStiffness , double springDampingStiffness); - B3_SHARED_API int b3LoadSoftBodyAddGravityForce(b3SharedMemoryCommandHandle commandHandle, double gravityX, double gravityY, double gravityZ); - B3_SHARED_API int b3LoadSoftBodySetCollisionHardness(b3SharedMemoryCommandHandle commandHandle, double collisionHardness); - B3_SHARED_API int b3LoadSoftBodySetSelfCollision(b3SharedMemoryCommandHandle commandHandle, int useSelfCollision); - B3_SHARED_API int b3LoadSoftBodySetRepulsionStiffness(b3SharedMemoryCommandHandle commandHandle, double stiffness); - B3_SHARED_API int b3LoadSoftBodyUseFaceContact(b3SharedMemoryCommandHandle commandHandle, int useFaceContact); - B3_SHARED_API int b3LoadSoftBodySetFrictionCoefficient(b3SharedMemoryCommandHandle commandHandle, double frictionCoefficient); - B3_SHARED_API int b3LoadSoftBodyUseBendingSprings(b3SharedMemoryCommandHandle commandHandle, int useBendingSprings, double bendingStiffness); - B3_SHARED_API int b3LoadSoftBodyUseAllDirectionDampingSprings(b3SharedMemoryCommandHandle commandHandle, int useAllDirectionDamping); - - B3_SHARED_API b3SharedMemoryCommandHandle b3InitCreateSoftBodyAnchorConstraintCommand(b3PhysicsClientHandle physClient, int softBodyUniqueId, int nodeIndex, int bodyUniqueId, int linkIndex, const double bodyFramePosition[3]); - - B3_SHARED_API b3SharedMemoryCommandHandle b3RequestVREventsCommandInit(b3PhysicsClientHandle physClient); - B3_SHARED_API void b3VREventsSetDeviceTypeFilter(b3SharedMemoryCommandHandle commandHandle, int deviceTypeFilter); - - B3_SHARED_API void b3GetVREventsData(b3PhysicsClientHandle physClient, struct b3VREventsData* vrEventsData); - - B3_SHARED_API b3SharedMemoryCommandHandle b3SetVRCameraStateCommandInit(b3PhysicsClientHandle physClient); - B3_SHARED_API int b3SetVRCameraRootPosition(b3SharedMemoryCommandHandle commandHandle, const double rootPos[/*3*/]); - B3_SHARED_API int b3SetVRCameraRootOrientation(b3SharedMemoryCommandHandle commandHandle, const double rootOrn[/*4*/]); - B3_SHARED_API int b3SetVRCameraTrackingObject(b3SharedMemoryCommandHandle commandHandle, int objectUniqueId); - B3_SHARED_API int b3SetVRCameraTrackingObjectFlag(b3SharedMemoryCommandHandle commandHandle, int flag); - - B3_SHARED_API b3SharedMemoryCommandHandle b3RequestKeyboardEventsCommandInit(b3PhysicsClientHandle physClient); - B3_SHARED_API b3SharedMemoryCommandHandle b3RequestKeyboardEventsCommandInit2(b3SharedMemoryCommandHandle commandHandle); - B3_SHARED_API void b3GetKeyboardEventsData(b3PhysicsClientHandle physClient, struct b3KeyboardEventsData* keyboardEventsData); - - B3_SHARED_API b3SharedMemoryCommandHandle b3RequestMouseEventsCommandInit(b3PhysicsClientHandle physClient); - B3_SHARED_API void b3GetMouseEventsData(b3PhysicsClientHandle physClient, struct b3MouseEventsData* mouseEventsData); - - B3_SHARED_API b3SharedMemoryCommandHandle b3StateLoggingCommandInit(b3PhysicsClientHandle physClient); - B3_SHARED_API int b3StateLoggingStart(b3SharedMemoryCommandHandle commandHandle, int loggingType, const char* fileName); - B3_SHARED_API int b3StateLoggingAddLoggingObjectUniqueId(b3SharedMemoryCommandHandle commandHandle, int objectUniqueId); - B3_SHARED_API int b3StateLoggingSetMaxLogDof(b3SharedMemoryCommandHandle commandHandle, int maxLogDof); - B3_SHARED_API int b3StateLoggingSetLinkIndexA(b3SharedMemoryCommandHandle commandHandle, int linkIndexA); - B3_SHARED_API int b3StateLoggingSetLinkIndexB(b3SharedMemoryCommandHandle commandHandle, int linkIndexB); - B3_SHARED_API int b3StateLoggingSetBodyAUniqueId(b3SharedMemoryCommandHandle commandHandle, int bodyAUniqueId); - B3_SHARED_API int b3StateLoggingSetBodyBUniqueId(b3SharedMemoryCommandHandle commandHandle, int bodyBUniqueId); - B3_SHARED_API int b3StateLoggingSetDeviceTypeFilter(b3SharedMemoryCommandHandle commandHandle, int deviceTypeFilter); - B3_SHARED_API int b3StateLoggingSetLogFlags(b3SharedMemoryCommandHandle commandHandle, int logFlags); - - B3_SHARED_API int b3GetStatusLoggingUniqueId(b3SharedMemoryStatusHandle statusHandle); - B3_SHARED_API int b3StateLoggingStop(b3SharedMemoryCommandHandle commandHandle, int loggingUid); - - B3_SHARED_API b3SharedMemoryCommandHandle b3ProfileTimingCommandInit(b3PhysicsClientHandle physClient, const char* name); - B3_SHARED_API void b3SetProfileTimingDuractionInMicroSeconds(b3SharedMemoryCommandHandle commandHandle, int duration); - B3_SHARED_API void b3SetProfileTimingType(b3SharedMemoryCommandHandle commandHandle, int type); - - B3_SHARED_API void b3PushProfileTiming(b3PhysicsClientHandle physClient, const char* timingName); - B3_SHARED_API void b3PopProfileTiming(b3PhysicsClientHandle physClient); - - B3_SHARED_API void b3SetTimeOut(b3PhysicsClientHandle physClient, double timeOutInSeconds); - B3_SHARED_API double b3GetTimeOut(b3PhysicsClientHandle physClient); - - B3_SHARED_API b3SharedMemoryCommandHandle b3SetAdditionalSearchPath(b3PhysicsClientHandle physClient, const char* path); - - B3_SHARED_API void b3MultiplyTransforms(const double posA[/*3*/], const double ornA[/*4*/], const double posB[/*3*/], const double ornB[/*4*/], double outPos[/*3*/], double outOrn[/*4*/]); - B3_SHARED_API void b3InvertTransform(const double pos[/*3*/], const double orn[/*4*/], double outPos[/*3*/], double outOrn[/*4*/]); - B3_SHARED_API void b3QuaternionSlerp(const double startQuat[/*4*/], const double endQuat[/*4*/], double interpolationFraction, double outOrn[/*4*/]); - B3_SHARED_API void b3GetQuaternionFromAxisAngle(const double axis[/*3*/], double angle, double outQuat[/*4*/]); - B3_SHARED_API void b3GetAxisAngleFromQuaternion(const double quat[/*4*/], double axis[/*3*/], double* angle); - B3_SHARED_API void b3GetQuaternionDifference(const double startQuat[/*4*/], const double endQuat[/*4*/], double outOrn[/*4*/]); - B3_SHARED_API void b3GetAxisDifferenceQuaternion(const double startQuat[/*4*/], const double endQuat[/*4*/], double axisOut[/*3*/]); - B3_SHARED_API void b3CalculateVelocityQuaternion(const double startQuat[/*4*/], const double endQuat[/*4*/], double deltaTime, double angVelOut[/*3*/]); - B3_SHARED_API void b3RotateVector(const double quat[/*4*/], const double vec[/*3*/], double vecOut[/*3*/]); - -#ifdef BT_ENABLE_VHACD - B3_SHARED_API void b3VHACD(const char* fileNameInput, const char* fileNameOutput, const char* fileNameLogging, - double concavity, double alpha, double beta, double gamma, double minVolumePerCH, int resolution, - int maxNumVerticesPerCH, int depth, int planeDownsampling, int convexhullDownsampling, - int pca, int mode, int convexhullApproximation); - - -#endif - -#ifdef __cplusplus -} -#endif - -#endif //PHYSICS_CLIENT_C_API_H diff --git a/engine/inc/bullet/SharedMemory/PhysicsClientExample.h b/engine/inc/bullet/SharedMemory/PhysicsClientExample.h deleted file mode 100644 index f1c3dc45..00000000 --- a/engine/inc/bullet/SharedMemory/PhysicsClientExample.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef PHYSICS_CLIENT_EXAMPLE_H -#define PHYSICS_CLIENT_EXAMPLE_H - -enum ClientExampleOptions -{ - eCLIENTEXAMPLE_LOOPBACK = 1, - eCLIENTEXAMPLE_DIRECT = 2, - eCLIENTEXAMPLE_SERVER = 3, -}; - -class CommonExampleInterface* PhysicsClientCreateFunc(struct CommonExampleOptions& options); - -#endif //PHYSICS_CLIENT_EXAMPLE_H diff --git a/engine/inc/bullet/SharedMemory/PhysicsClientGRPC.h b/engine/inc/bullet/SharedMemory/PhysicsClientGRPC.h deleted file mode 100644 index dc78d635..00000000 --- a/engine/inc/bullet/SharedMemory/PhysicsClientGRPC.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef PHYSICS_CLIENT_GRPC_H -#define PHYSICS_CLIENT_GRPC_H - -#include "PhysicsDirect.h" -#include "PhysicsCommandProcessorInterface.h" - -class GRPCNetworkedPhysicsProcessor : public PhysicsCommandProcessorInterface -{ - struct GRPCNetworkedInternalData* m_data; - -public: - GRPCNetworkedPhysicsProcessor(const char* hostName, int port); - - virtual ~GRPCNetworkedPhysicsProcessor(); - - virtual bool connect(); - - virtual void disconnect(); - - virtual bool isConnected() const; - - virtual bool processCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - - virtual bool receiveStatus(struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - - virtual void renderScene(int renderFlags); - - virtual void physicsDebugDraw(int debugDrawFlags); - - virtual void setGuiHelper(struct GUIHelperInterface* guiHelper); - - virtual void setTimeOut(double timeOutInSeconds); - - virtual void reportNotifications() {} -}; - -#endif //PHYSICS_CLIENT_GRPC_H diff --git a/engine/inc/bullet/SharedMemory/PhysicsClientGRPC_C_API.h b/engine/inc/bullet/SharedMemory/PhysicsClientGRPC_C_API.h deleted file mode 100644 index a61984b4..00000000 --- a/engine/inc/bullet/SharedMemory/PhysicsClientGRPC_C_API.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef PHYSICS_CLIENT_GRPC_C_API_H -#define PHYSICS_CLIENT_GRPC_C_API_H - -#include "PhysicsClientC_API.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - - ///send physics commands using GRPC connection - B3_SHARED_API b3PhysicsClientHandle b3ConnectPhysicsGRPC(const char* hostName, int port); - -#ifdef __cplusplus -} -#endif - -#endif //PHYSICS_CLIENT_GRPC_C_API_H diff --git a/engine/inc/bullet/SharedMemory/PhysicsClientSharedMemory.h b/engine/inc/bullet/SharedMemory/PhysicsClientSharedMemory.h deleted file mode 100644 index f1a67c52..00000000 --- a/engine/inc/bullet/SharedMemory/PhysicsClientSharedMemory.h +++ /dev/null @@ -1,107 +0,0 @@ -#ifndef BT_PHYSICS_CLIENT_SHARED_MEMORY_API_H -#define BT_PHYSICS_CLIENT_SHARED_MEMORY_API_H - -#include "PhysicsClient.h" - -//#include "SharedMemoryCommands.h" -#include "LinearMath/btVector3.h" - -class PhysicsClientSharedMemory : public PhysicsClient -{ - - -protected: - struct PhysicsClientSharedMemoryInternalData* m_data; - virtual void setSharedMemoryInterface(class SharedMemoryInterface* sharedMem); - void processBodyJointInfo(int bodyUniqueId, const struct SharedMemoryStatus& serverCmd); - void resetData(); - void removeCachedBody(int bodyUniqueId); - void clearCachedBodies(); - virtual void renderSceneInternal(){}; - -public: - PhysicsClientSharedMemory(); - virtual ~PhysicsClientSharedMemory(); - - // return true if connection succesfull, can also check 'isConnected' - virtual bool connect(); - - virtual void disconnectSharedMemory(); - - virtual bool isConnected() const; - - // return non-null if there is a status, nullptr otherwise - virtual const struct SharedMemoryStatus* processServerStatus(); - - virtual struct SharedMemoryCommand* getAvailableSharedMemoryCommand(); - - virtual bool canSubmitCommand() const; - - virtual bool submitClientCommand(const struct SharedMemoryCommand& command); - - virtual int getNumBodies() const; - - virtual int getBodyUniqueId(int serialIndex) const; - - virtual bool getBodyInfo(int bodyUniqueId, struct b3BodyInfo& info) const; - - virtual int getNumJoints(int bodyUniqueId) const; - - virtual int getNumDofs(int bodyUniqueId) const; - - virtual bool getJointInfo(int bodyUniqueId, int jointIndex, struct b3JointInfo& info) const; - - virtual int getNumUserConstraints() const; - - virtual int getUserConstraintInfo(int constraintUniqueId, struct b3UserConstraint& info) const; - - virtual int getUserConstraintId(int serialIndex) const; - - virtual void setSharedMemoryKey(int key); - - virtual void uploadBulletFileToSharedMemory(const char* data, int len); - - virtual void uploadRaysToSharedMemory(struct SharedMemoryCommand& command, const double* rayFromWorldArray, const double* rayToWorldArray, int numRays); - - virtual int getNumDebugLines() const; - - virtual const float* getDebugLinesFrom() const; - virtual const float* getDebugLinesTo() const; - virtual const float* getDebugLinesColor() const; - virtual void getCachedCameraImage(struct b3CameraImageData* cameraData); - - virtual void getCachedContactPointInformation(struct b3ContactInformation* contactPointData); - - virtual void getCachedOverlappingObjects(struct b3AABBOverlapData* overlappingObjects); - - virtual void getCachedVisualShapeInformation(struct b3VisualShapeInformation* visualShapesInfo); - - virtual void getCachedCollisionShapeInformation(struct b3CollisionShapeInformation* collisionShapesInfo); - - virtual void getCachedMeshData(struct b3MeshData* meshData); - - virtual void getCachedVREvents(struct b3VREventsData* vrEventsData); - - virtual void getCachedKeyboardEvents(struct b3KeyboardEventsData* keyboardEventsData); - - virtual void getCachedMouseEvents(struct b3MouseEventsData* mouseEventsData); - - virtual void getCachedRaycastHits(struct b3RaycastInformation* raycastHits); - - virtual void getCachedMassMatrix(int dofCountCheck, double* massMatrix); - - virtual bool getCachedReturnData(b3UserDataValue* returnData); - - virtual void setTimeOut(double timeOutInSeconds); - virtual double getTimeOut() const; - - virtual bool getCachedUserData(int userDataId, struct b3UserDataValue& valueOut) const; - virtual int getCachedUserDataId(int bodyUniqueId, int linkIndex, int visualShapeIndex, const char* key) const; - virtual int getNumUserData(int bodyUniqueId) const; - virtual void getUserDataInfo(int bodyUniqueId, int userDataIndex, const char** keyOut, int* userDataIdOut, int* linkIndexOut, int* visualShapeIndexOut) const; - - virtual void pushProfileTiming(const char* timingName); - virtual void popProfileTiming(); -}; - -#endif // BT_PHYSICS_CLIENT_API_H diff --git a/engine/inc/bullet/SharedMemory/PhysicsClientSharedMemory2.h b/engine/inc/bullet/SharedMemory/PhysicsClientSharedMemory2.h deleted file mode 100644 index 473ee0ec..00000000 --- a/engine/inc/bullet/SharedMemory/PhysicsClientSharedMemory2.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef PHYSICS_CLIENT_SHARED_MEMORY3_H -#define PHYSICS_CLIENT_SHARED_MEMORY3_H - -#include "PhysicsDirect.h" - -class PhysicsClientSharedMemory2 : public PhysicsDirect -{ - class SharedMemoryCommandProcessor* m_proc; - -public: - PhysicsClientSharedMemory2(SharedMemoryCommandProcessor* proc); - virtual ~PhysicsClientSharedMemory2(); - - void setSharedMemoryInterface(class SharedMemoryInterface* sharedMem); -}; - -#endif //PHYSICS_CLIENT_SHARED_MEMORY3_H \ No newline at end of file diff --git a/engine/inc/bullet/SharedMemory/PhysicsClientSharedMemory2_C_API.h b/engine/inc/bullet/SharedMemory/PhysicsClientSharedMemory2_C_API.h deleted file mode 100644 index 0f711b4b..00000000 --- a/engine/inc/bullet/SharedMemory/PhysicsClientSharedMemory2_C_API.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef PHYSICS_CLIENT_SHARED_MEMORY2_H -#define PHYSICS_CLIENT_SHARED_MEMORY2_H - -#include "PhysicsClientC_API.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - - b3PhysicsClientHandle b3ConnectSharedMemory2(int key); - -#ifdef __cplusplus -} -#endif - -#endif //PHYSICS_CLIENT_SHARED_MEMORY2_H diff --git a/engine/inc/bullet/SharedMemory/PhysicsClientSharedMemory_C_API.h b/engine/inc/bullet/SharedMemory/PhysicsClientSharedMemory_C_API.h deleted file mode 100644 index 31f217cb..00000000 --- a/engine/inc/bullet/SharedMemory/PhysicsClientSharedMemory_C_API.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef PHYSICS_CLIENT_SHARED_MEMORY_H -#define PHYSICS_CLIENT_SHARED_MEMORY_H - -#include "PhysicsClientC_API.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - - B3_SHARED_API b3PhysicsClientHandle b3ConnectSharedMemory(int key); - -#ifdef __cplusplus -} -#endif - -#endif //PHYSICS_CLIENT_SHARED_MEMORY_H diff --git a/engine/inc/bullet/SharedMemory/PhysicsClientTCP.h b/engine/inc/bullet/SharedMemory/PhysicsClientTCP.h deleted file mode 100644 index ec24b656..00000000 --- a/engine/inc/bullet/SharedMemory/PhysicsClientTCP.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef PHYSICS_CLIENT_TCP_H -#define PHYSICS_CLIENT_TCP_H - -#include "PhysicsDirect.h" -#include "PhysicsCommandProcessorInterface.h" - -class TcpNetworkedPhysicsProcessor : public PhysicsCommandProcessorInterface -{ - struct TcpNetworkedInternalData* m_data; - -public: - TcpNetworkedPhysicsProcessor(const char* hostName, int port); - - virtual ~TcpNetworkedPhysicsProcessor(); - - virtual bool connect(); - - virtual void disconnect(); - - virtual bool isConnected() const; - - virtual bool processCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - - virtual bool receiveStatus(struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - - virtual void renderScene(int renderFlags); - - virtual void physicsDebugDraw(int debugDrawFlags); - - virtual void setGuiHelper(struct GUIHelperInterface* guiHelper); - - virtual void setTimeOut(double timeOutInSeconds); - - virtual void reportNotifications() {} -}; - -#endif //PHYSICS_CLIENT_TCP_H diff --git a/engine/inc/bullet/SharedMemory/PhysicsClientTCP_C_API.h b/engine/inc/bullet/SharedMemory/PhysicsClientTCP_C_API.h deleted file mode 100644 index 541349fe..00000000 --- a/engine/inc/bullet/SharedMemory/PhysicsClientTCP_C_API.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef PHYSICS_CLIENT_TCP_C_API_H -#define PHYSICS_CLIENT_TCP_C_API_H - -#include "PhysicsClientC_API.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - - ///send physics commands using TCP networking - B3_SHARED_API b3PhysicsClientHandle b3ConnectPhysicsTCP(const char* hostName, int port); - -#ifdef __cplusplus -} -#endif - -#endif //PHYSICS_CLIENT_TCP_C_API_H diff --git a/engine/inc/bullet/SharedMemory/PhysicsClientUDP.h b/engine/inc/bullet/SharedMemory/PhysicsClientUDP.h deleted file mode 100644 index 0aaa7791..00000000 --- a/engine/inc/bullet/SharedMemory/PhysicsClientUDP.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef PHYSICS_CLIENT_UDP_H -#define PHYSICS_CLIENT_UDP_H - -#include "PhysicsDirect.h" -#include "PhysicsCommandProcessorInterface.h" - -class UdpNetworkedPhysicsProcessor : public PhysicsCommandProcessorInterface -{ - struct UdpNetworkedInternalData* m_data; - -public: - UdpNetworkedPhysicsProcessor(const char* hostName, int port); - - virtual ~UdpNetworkedPhysicsProcessor(); - - virtual bool connect(); - - virtual void disconnect(); - - virtual bool isConnected() const; - - virtual bool processCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - - virtual bool receiveStatus(struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - - virtual void renderScene(int renderFlags); - - virtual void physicsDebugDraw(int debugDrawFlags); - - virtual void setGuiHelper(struct GUIHelperInterface* guiHelper); - - virtual void setTimeOut(double timeOutInSeconds); - - virtual void reportNotifications() {} -}; - -#endif //PHYSICS_CLIENT_UDP_H diff --git a/engine/inc/bullet/SharedMemory/PhysicsClientUDP_C_API.h b/engine/inc/bullet/SharedMemory/PhysicsClientUDP_C_API.h deleted file mode 100644 index 3381e84a..00000000 --- a/engine/inc/bullet/SharedMemory/PhysicsClientUDP_C_API.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef PHYSICS_CLIENT_UDP_C_API_H -#define PHYSICS_CLIENT_UDP_C_API_H - -#include "PhysicsClientC_API.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - - ///send physics commands using UDP networking - B3_SHARED_API b3PhysicsClientHandle b3ConnectPhysicsUDP(const char* hostName, int port); - -#ifdef __cplusplus -} -#endif - -#endif //PHYSICS_CLIENT_UDP_C_API_H diff --git a/engine/inc/bullet/SharedMemory/PhysicsCommandProcessorInterface.h b/engine/inc/bullet/SharedMemory/PhysicsCommandProcessorInterface.h deleted file mode 100644 index 11a2280c..00000000 --- a/engine/inc/bullet/SharedMemory/PhysicsCommandProcessorInterface.h +++ /dev/null @@ -1,62 +0,0 @@ -#ifndef PHYSICS_COMMAND_PROCESSOR_INTERFACE_H -#define PHYSICS_COMMAND_PROCESSOR_INTERFACE_H - -enum PhysicsCommandRenderFlags -{ - COV_DISABLE_SYNC_RENDERING = 1 -}; - -class PhysicsCommandProcessorInterface -{ -public: - virtual ~PhysicsCommandProcessorInterface() {} - - virtual bool connect() = 0; - - virtual void disconnect() = 0; - - virtual bool isConnected() const = 0; - - virtual bool processCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes) = 0; - - virtual bool receiveStatus(struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes) = 0; - - virtual void renderScene(int renderFlags) = 0; - virtual void physicsDebugDraw(int debugDrawFlags) = 0; - virtual void setGuiHelper(struct GUIHelperInterface* guiHelper) = 0; - virtual void setTimeOut(double timeOutInSeconds) = 0; - - virtual void reportNotifications() = 0; -}; - -class btVector3; -class btQuaternion; - -class CommandProcessorInterface : public PhysicsCommandProcessorInterface -{ -public: - virtual ~CommandProcessorInterface() {} - - virtual void syncPhysicsToGraphics() = 0; - virtual void stepSimulationRealTime(double dtInSec, const struct b3VRControllerEvent* vrControllerEvents, int numVRControllerEvents, const struct b3KeyboardEvent* keyEvents, int numKeyEvents, const struct b3MouseEvent* mouseEvents, int numMouseEvents) = 0; - virtual void enableRealTimeSimulation(bool enableRealTimeSim) = 0; - virtual bool isRealTimeSimulationEnabled() const = 0; - - virtual void enableCommandLogging(bool enable, const char* fileName) = 0; - virtual void replayFromLogFile(const char* fileName) = 0; - virtual void replayLogCommand(char* bufferServerToClient, int bufferSizeInBytes) = 0; - - virtual bool pickBody(const btVector3& rayFromWorld, const btVector3& rayToWorld) = 0; - virtual bool movePickedBody(const btVector3& rayFromWorld, const btVector3& rayToWorld) = 0; - virtual void removePickingConstraint() = 0; - - virtual const btVector3& getVRTeleportPosition() const = 0; - virtual void setVRTeleportPosition(const btVector3& vrReleportPos) = 0; - - virtual const btQuaternion& getVRTeleportOrientation() const = 0; - virtual void setVRTeleportOrientation(const btQuaternion& vrReleportOrn) = 0; - - virtual void processClientCommands() = 0; -}; - -#endif //PHYSICS_COMMAND_PROCESSOR_INTERFACE_H diff --git a/engine/inc/bullet/SharedMemory/PhysicsDirect.h b/engine/inc/bullet/SharedMemory/PhysicsDirect.h deleted file mode 100644 index 2e09a95d..00000000 --- a/engine/inc/bullet/SharedMemory/PhysicsDirect.h +++ /dev/null @@ -1,136 +0,0 @@ -#ifndef PHYSICS_DIRECT_H -#define PHYSICS_DIRECT_H - -//#include "SharedMemoryCommands.h" - -#include "PhysicsClient.h" -#include "LinearMath/btVector3.h" - -///PhysicsDirect executes the commands directly, without transporting them or having a separate server executing commands -class PhysicsDirect : public PhysicsClient -{ -protected: - struct PhysicsDirectInternalData* m_data; - - bool processDebugLines(const struct SharedMemoryCommand& orgCommand); - - bool processCamera(const struct SharedMemoryCommand& orgCommand); - - bool processContactPointData(const struct SharedMemoryCommand& orgCommand); - - bool processOverlappingObjects(const struct SharedMemoryCommand& orgCommand); - - bool processVisualShapeData(const struct SharedMemoryCommand& orgCommand); - - bool processMeshData(const struct SharedMemoryCommand& orgCommand); - - void processBodyJointInfo(int bodyUniqueId, const struct SharedMemoryStatus& serverCmd); - - void processAddUserData(const struct SharedMemoryStatus& serverCmd); - - bool processCustomCommand(const struct SharedMemoryCommand& orgCommand); - - void postProcessStatus(const struct SharedMemoryStatus& serverCmd); - - void resetData(); - - void removeCachedBody(int bodyUniqueId); - - void clearCachedBodies(); - -public: - PhysicsDirect(class PhysicsCommandProcessorInterface* physSdk, bool passSdkOwnership); - - virtual ~PhysicsDirect(); - - // return true if connection succesfull, can also check 'isConnected' - //it is OK to pass a null pointer for the gui helper - virtual bool connect(); - - ////todo: rename to 'disconnect' - virtual void disconnectSharedMemory(); - - virtual bool isConnected() const; - - // return non-null if there is a status, nullptr otherwise - virtual const SharedMemoryStatus* processServerStatus(); - - virtual SharedMemoryCommand* getAvailableSharedMemoryCommand(); - - virtual bool canSubmitCommand() const; - - virtual bool submitClientCommand(const struct SharedMemoryCommand& command); - - virtual int getNumBodies() const; - - virtual int getBodyUniqueId(int serialIndex) const; - - virtual bool getBodyInfo(int bodyUniqueId, struct b3BodyInfo& info) const; - - virtual int getNumJoints(int bodyUniqueId) const; - - virtual int getNumDofs(int bodyUniqueId) const; - - virtual bool getJointInfo(int bodyIndex, int jointIndex, struct b3JointInfo& info) const; - - virtual int getNumUserConstraints() const; - - virtual int getUserConstraintInfo(int constraintUniqueId, struct b3UserConstraint& info) const; - - virtual int getUserConstraintId(int serialIndex) const; - - ///todo: move this out of the - virtual void setSharedMemoryKey(int key); - - void uploadBulletFileToSharedMemory(const char* data, int len); - - virtual void uploadRaysToSharedMemory(struct SharedMemoryCommand& command, const double* rayFromWorldArray, const double* rayToWorldArray, int numRays); - - virtual int getNumDebugLines() const; - - virtual const float* getDebugLinesFrom() const; - virtual const float* getDebugLinesTo() const; - virtual const float* getDebugLinesColor() const; - - virtual void getCachedCameraImage(b3CameraImageData* cameraData); - - virtual void getCachedContactPointInformation(struct b3ContactInformation* contactPointData); - - virtual void getCachedOverlappingObjects(struct b3AABBOverlapData* overlappingObjects); - - virtual void getCachedVisualShapeInformation(struct b3VisualShapeInformation* visualShapesInfo); - - virtual void getCachedCollisionShapeInformation(struct b3CollisionShapeInformation* collisionShapesInfo); - - virtual void getCachedMeshData(struct b3MeshData* meshData); - - virtual void getCachedVREvents(struct b3VREventsData* vrEventsData); - - virtual void getCachedKeyboardEvents(struct b3KeyboardEventsData* keyboardEventsData); - - virtual void getCachedMouseEvents(struct b3MouseEventsData* mouseEventsData); - - virtual void getCachedRaycastHits(struct b3RaycastInformation* raycastHits); - - virtual void getCachedMassMatrix(int dofCountCheck, double* massMatrix); - - virtual bool getCachedReturnData(b3UserDataValue* returnData); - - //the following APIs are for internal use for visualization: - virtual bool connect(struct GUIHelperInterface* guiHelper); - virtual void renderScene(); - virtual void debugDraw(int debugDrawMode); - - virtual void setTimeOut(double timeOutInSeconds); - virtual double getTimeOut() const; - - virtual bool getCachedUserData(int userDataId, struct b3UserDataValue& valueOut) const; - virtual int getCachedUserDataId(int bodyUniqueId, int linkIndex, int visualShapeIndex, const char* key) const; - virtual int getNumUserData(int bodyUniqueId) const; - virtual void getUserDataInfo(int bodyUniqueId, int userDataIndex, const char** keyOut, int* userDataIdOut, int* linkIndexOut, int* visualShapeIndexOut) const; - - virtual void pushProfileTiming(const char* timingName); - virtual void popProfileTiming(); -}; - -#endif //PHYSICS_DIRECT_H diff --git a/engine/inc/bullet/SharedMemory/PhysicsDirectC_API.h b/engine/inc/bullet/SharedMemory/PhysicsDirectC_API.h deleted file mode 100644 index cde48820..00000000 --- a/engine/inc/bullet/SharedMemory/PhysicsDirectC_API.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef PHYSICS_DIRECT_C_API_H -#define PHYSICS_DIRECT_C_API_H - -#include "PhysicsClientC_API.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - - ///think more about naming. Directly execute commands without transport (no shared memory, UDP, socket, grpc etc) - B3_SHARED_API b3PhysicsClientHandle b3ConnectPhysicsDirect(); - -#ifdef __cplusplus -} -#endif - -#endif //PHYSICS_DIRECT_C_API_H diff --git a/engine/inc/bullet/SharedMemory/PhysicsLoopBack.h b/engine/inc/bullet/SharedMemory/PhysicsLoopBack.h deleted file mode 100644 index 4626aac8..00000000 --- a/engine/inc/bullet/SharedMemory/PhysicsLoopBack.h +++ /dev/null @@ -1,105 +0,0 @@ -#ifndef PHYSICS_LOOP_BACK_H -#define PHYSICS_LOOP_BACK_H - -//#include "SharedMemoryCommands.h" - -#include "PhysicsClient.h" -#include "LinearMath/btVector3.h" - -///todo: the PhysicsClient API was designed with shared memory in mind, -///now it become more general we need to move out the shared memory specifics away -///for example naming [disconnectSharedMemory -> disconnect] [ move setSharedMemoryKey to shared memory specific subclass ] - -class PhysicsLoopBack : public PhysicsClient -{ - struct PhysicsLoopBackInternalData* m_data; - -public: - PhysicsLoopBack(); - - virtual ~PhysicsLoopBack(); - - // return true if connection succesfull, can also check 'isConnected' - virtual bool connect(); - - ////todo: rename to 'disconnect' - virtual void disconnectSharedMemory(); - - virtual bool isConnected() const; - - // return non-null if there is a status, nullptr otherwise - virtual const SharedMemoryStatus* processServerStatus(); - - virtual SharedMemoryCommand* getAvailableSharedMemoryCommand(); - - virtual bool canSubmitCommand() const; - - virtual bool submitClientCommand(const struct SharedMemoryCommand& command); - - virtual int getNumBodies() const; - - virtual int getBodyUniqueId(int serialIndex) const; - - virtual bool getBodyInfo(int bodyUniqueId, struct b3BodyInfo& info) const; - - virtual int getNumJoints(int bodyUniqueId) const; - - virtual int getNumDofs(int bodyUniqueId) const; - - virtual bool getJointInfo(int bodyIndex, int jointIndex, struct b3JointInfo& info) const; - - virtual int getNumUserConstraints() const; - - virtual int getUserConstraintInfo(int constraintUniqueId, struct b3UserConstraint& info) const; - - virtual int getUserConstraintId(int serialIndex) const; - - ///todo: move this out of the - virtual void setSharedMemoryKey(int key); - - void uploadBulletFileToSharedMemory(const char* data, int len); - - virtual void uploadRaysToSharedMemory(struct SharedMemoryCommand& command, const double* rayFromWorldArray, const double* rayToWorldArray, int numRays); - - virtual int getNumDebugLines() const; - - virtual const float* getDebugLinesFrom() const; - virtual const float* getDebugLinesTo() const; - virtual const float* getDebugLinesColor() const; - virtual void getCachedCameraImage(struct b3CameraImageData* cameraData); - - virtual void getCachedContactPointInformation(struct b3ContactInformation* contactPointData); - - virtual void getCachedOverlappingObjects(struct b3AABBOverlapData* overlappingObjects); - - virtual void getCachedVisualShapeInformation(struct b3VisualShapeInformation* visualShapesInfo); - - virtual void getCachedCollisionShapeInformation(struct b3CollisionShapeInformation* collisionShapesInfo); - - virtual void getCachedMeshData(struct b3MeshData* meshData); - - virtual void getCachedVREvents(struct b3VREventsData* vrEventsData); - - virtual void getCachedKeyboardEvents(struct b3KeyboardEventsData* keyboardEventsData); - - virtual void getCachedMouseEvents(struct b3MouseEventsData* mouseEventsData); - - virtual void getCachedRaycastHits(struct b3RaycastInformation* raycastHits); - - virtual void getCachedMassMatrix(int dofCountCheck, double* massMatrix); - - virtual bool getCachedReturnData(struct b3UserDataValue* returnData); - - virtual void setTimeOut(double timeOutInSeconds); - virtual double getTimeOut() const; - - virtual bool getCachedUserData(int userDataId, struct b3UserDataValue& valueOut) const; - virtual int getCachedUserDataId(int bodyUniqueId, int linkIndex, int visualShapeIndex, const char* key) const; - virtual int getNumUserData(int bodyUniqueId) const; - virtual void getUserDataInfo(int bodyUniqueId, int userDataIndex, const char** keyOut, int* userDataIdOut, int* linkIndexOut, int* visualShapeIndexOut) const; - - virtual void pushProfileTiming(const char* timingName); - virtual void popProfileTiming(); -}; - -#endif //PHYSICS_LOOP_BACK_H diff --git a/engine/inc/bullet/SharedMemory/PhysicsLoopBackC_API.h b/engine/inc/bullet/SharedMemory/PhysicsLoopBackC_API.h deleted file mode 100644 index feb41faf..00000000 --- a/engine/inc/bullet/SharedMemory/PhysicsLoopBackC_API.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef PHYSICS_LOOPBACK_C_API_H -#define PHYSICS_LOOPBACK_C_API_H - -#include "PhysicsClientC_API.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - - ///think more about naming. The b3ConnectPhysicsLoopback - b3PhysicsClientHandle b3ConnectPhysicsLoopback(int key); - -#ifdef __cplusplus -} -#endif - -#endif //PHYSICS_LOOPBACK_C_API_H diff --git a/engine/inc/bullet/SharedMemory/PhysicsServer.h b/engine/inc/bullet/SharedMemory/PhysicsServer.h deleted file mode 100644 index 2a940abd..00000000 --- a/engine/inc/bullet/SharedMemory/PhysicsServer.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef PHYSICS_SERVER_H -#define PHYSICS_SERVER_H - -#include "LinearMath/btVector3.h" - -class PhysicsServer -{ -public: - virtual ~PhysicsServer(); - - virtual void setSharedMemoryKey(int key) = 0; - - virtual bool connectSharedMemory(struct GUIHelperInterface* guiHelper) = 0; - - virtual void disconnectSharedMemory(bool deInitializeSharedMemory) = 0; - - virtual void processClientCommands() = 0; - - // virtual bool supportsJointMotor(class btMultiBody* body, int linkIndex)=0; - - //@todo(erwincoumans) Should we have shared memory commands for picking objects? - ///The pickBody method will try to pick the first body along a ray, return true if succeeds, false otherwise - virtual bool pickBody(const btVector3& rayFromWorld, const btVector3& rayToWorld) { return false; } - virtual bool movePickedBody(const btVector3& rayFromWorld, const btVector3& rayToWorld) { return false; } - virtual void removePickingConstraint() {} - - //for physicsDebugDraw and renderScene are mainly for debugging purposes - //and for physics visualization. The idea is that physicsDebugDraw can also send wireframe - //to a physics client, over shared memory - virtual void physicsDebugDraw(int debugDrawFlags) {} - virtual void renderScene(int renderFlags) {} - - virtual void enableCommandLogging(bool enable, const char* fileName) {} - virtual void replayFromLogFile(const char* fileName) {} -}; - -#endif //PHYSICS_SERVER_H diff --git a/engine/inc/bullet/SharedMemory/PhysicsServerCommandProcessor.h b/engine/inc/bullet/SharedMemory/PhysicsServerCommandProcessor.h deleted file mode 100644 index cbc4cbab..00000000 --- a/engine/inc/bullet/SharedMemory/PhysicsServerCommandProcessor.h +++ /dev/null @@ -1,190 +0,0 @@ -#ifndef PHYSICS_SERVER_COMMAND_PROCESSOR_H -#define PHYSICS_SERVER_COMMAND_PROCESSOR_H - -#include "LinearMath/btHashMap.h" -#include "LinearMath/btVector3.h" - -#include "PhysicsCommandProcessorInterface.h" -#include "../Importers/ImportURDFDemo/UrdfParser.h" - -struct SharedMemLines -{ - btVector3 m_from; - btVector3 m_to; - btVector3 m_color; -}; - -///todo: naming. Perhaps PhysicsSdkCommandprocessor? -class PhysicsServerCommandProcessor : public CommandProcessorInterface -{ - struct PhysicsServerCommandProcessorInternalData* m_data; - - void resetSimulation(int flags = 0); - void createThreadPool(); - - class btDeformableMultiBodyDynamicsWorld* getDeformableWorld(); - class btSoftMultiBodyDynamicsWorld* getSoftWorld(); - -protected: - bool processStateLoggingCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processRequestCameraImageCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processSaveWorldCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processCreateCollisionShapeCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processCreateVisualShapeCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processRequestMeshDataCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processCustomCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processUserDebugDrawCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processSetVRCameraStateCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processRequestVREventsCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processRequestMouseEventsCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processRequestKeyboardEventsCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processRequestRaycastIntersectionsCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processRequestDebugLinesCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processSyncBodyInfoCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processSendDesiredStateCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processRequestActualStateCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processRequestContactpointInformationCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processRequestBodyInfoCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processLoadSDFCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processCreateMultiBodyCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processCreateMultiBodyCommandSingle(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - - bool processLoadURDFCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processLoadSoftBodyCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processCreateSensorCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processProfileTimingCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processRequestCollisionInfoCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processForwardDynamicsCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processRequestInternalDataCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processChangeDynamicsInfoCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processSetAdditionalSearchPathCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processGetDynamicsInfoCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processRequestPhysicsSimulationParametersCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processSendPhysicsParametersCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processInitPoseCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processResetSimulationCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processCreateRigidBodyCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processPickBodyCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processMovePickedBodyCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processRemovePickingConstraintCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processRequestAabbOverlapCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processRequestOpenGLVisualizeCameraCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processConfigureOpenGLVisualizerCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processInverseDynamicsCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processCalculateJacobianCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processCalculateMassMatrixCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processApplyExternalForceCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processRemoveBodyCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processCreateUserConstraintCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processCalculateInverseKinematicsCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processCalculateInverseKinematicsCommand2(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processRequestVisualShapeInfoCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processRequestCollisionShapeInfoCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processUpdateVisualShapeCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processChangeTextureCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processLoadTextureCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processLoadBulletCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processSaveBulletCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processLoadMJCFCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processRestoreStateCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processSaveStateCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processRemoveStateCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processSyncUserDataCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processRequestUserDataCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processAddUserDataCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processRemoveUserDataCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processCollisionFilterCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - - int extractCollisionShapes(const class btCollisionShape* colShape, const class btTransform& transform, struct b3CollisionShapeData* collisionShapeBuffer, int maxCollisionShapes); - - bool loadSdf(const char* fileName, char* bufferServerToClient, int bufferSizeInBytes, bool useMultiBody, int flags, btScalar globalScaling); - - bool loadUrdf(const char* fileName, const class btVector3& pos, const class btQuaternion& orn, - bool useMultiBody, bool useFixedBase, int* bodyUniqueIdPtr, char* bufferServerToClient, int bufferSizeInBytes, int flags, btScalar globalScaling); - - bool loadMjcf(const char* fileName, char* bufferServerToClient, int bufferSizeInBytes, bool useMultiBody, int flags); - - bool processImportedObjects(const char* fileName, char* bufferServerToClient, int bufferSizeInBytes, bool useMultiBody, int flags, class URDFImporterInterface& u2b); - bool processDeformable(const UrdfDeformable& deformable, const btVector3& pos, const btQuaternion& orn, int* bodyUniqueId, char* bufferServerToClient, int bufferSizeInBytes, btScalar scale, bool useSelfCollision); - - bool supportsJointMotor(class btMultiBody* body, int linkIndex); - - int createBodyInfoStream(int bodyUniqueId, char* bufferServerToClient, int bufferSizeInBytes); - void deleteCachedInverseDynamicsBodies(); - void deleteCachedInverseKinematicsBodies(); - void deleteStateLoggers(); - -public: - PhysicsServerCommandProcessor(); - virtual ~PhysicsServerCommandProcessor(); - - void createJointMotors(class btMultiBody* body); - - virtual void createEmptyDynamicsWorld(int flags = 0); - virtual void deleteDynamicsWorld(); - - virtual bool connect() - { - return true; - }; - - virtual void disconnect() {} - - virtual bool isConnected() const - { - return true; - } - - virtual bool processCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - - virtual bool receiveStatus(struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes) - { - return false; - }; - - virtual void renderScene(int renderFlags); - virtual void physicsDebugDraw(int debugDrawFlags); - virtual void setGuiHelper(struct GUIHelperInterface* guiHelper); - virtual void syncPhysicsToGraphics(); - virtual void syncPhysicsToGraphics2(); - - //@todo(erwincoumans) Should we have shared memory commands for picking objects? - ///The pickBody method will try to pick the first body along a ray, return true if succeeds, false otherwise - virtual bool pickBody(const btVector3& rayFromWorld, const btVector3& rayToWorld); - virtual bool movePickedBody(const btVector3& rayFromWorld, const btVector3& rayToWorld); - virtual void removePickingConstraint(); - - //logging /playback the shared memory commands - virtual void enableCommandLogging(bool enable, const char* fileName); - virtual void replayFromLogFile(const char* fileName); - virtual void replayLogCommand(char* bufferServerToClient, int bufferSizeInBytes); - - //logging of object states (position etc) - virtual void reportNotifications(); - virtual void processClientCommands(); - void tickPlugins(btScalar timeStep, bool isPreTick); - void logObjectStates(btScalar timeStep); - void processCollisionForces(btScalar timeStep); - - virtual void stepSimulationRealTime(double dtInSec, const struct b3VRControllerEvent* vrControllerEvents, int numVRControllerEvents, const struct b3KeyboardEvent* keyEvents, int numKeyEvents, const struct b3MouseEvent* mouseEvents, int numMouseEvents); - - virtual void enableRealTimeSimulation(bool enableRealTimeSim); - virtual bool isRealTimeSimulationEnabled() const; - - void applyJointDamping(int bodyUniqueId); - - virtual void setTimeOut(double timeOutInSeconds); - - virtual const btVector3& getVRTeleportPosition() const; - virtual void setVRTeleportPosition(const btVector3& vrTeleportPos); - - virtual const btQuaternion& getVRTeleportOrientation() const; - virtual void setVRTeleportOrientation(const btQuaternion& vrTeleportOrn); - -private: - void addBodyChangedNotifications(); - int addUserData(int bodyUniqueId, int linkIndex, int visualShapeIndex, const char* key, const char* valueBytes, int valueLength, int valueType); - void addUserData(const btHashMap& user_data_entries, int bodyUniqueId, int linkIndex = -1, int visualShapeIndex = -1); -}; - -#endif //PHYSICS_SERVER_COMMAND_PROCESSOR_H diff --git a/engine/inc/bullet/SharedMemory/PhysicsServerExample.h b/engine/inc/bullet/SharedMemory/PhysicsServerExample.h deleted file mode 100644 index 63f40146..00000000 --- a/engine/inc/bullet/SharedMemory/PhysicsServerExample.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef PHYSICS_SERVER_EXAMPLE_H -#define PHYSICS_SERVER_EXAMPLE_H - -enum PhysicsServerOptions -{ - PHYSICS_SERVER_ENABLE_COMMAND_LOGGING = 1, - PHYSICS_SERVER_REPLAY_FROM_COMMAND_LOG = 2, - PHYSICS_SERVER_USE_RTC_CLOCK = 4, -}; - -///Don't use PhysicsServerCreateFuncInternal directly -///Use PhysicsServerCreateFuncBullet2 instead, or initialize options.m_commandProcessor -class CommonExampleInterface* PhysicsServerCreateFuncInternal(struct CommonExampleOptions& options); - -#endif //PHYSICS_SERVER_EXAMPLE_H diff --git a/engine/inc/bullet/SharedMemory/PhysicsServerExampleBullet2.h b/engine/inc/bullet/SharedMemory/PhysicsServerExampleBullet2.h deleted file mode 100644 index 750b61b2..00000000 --- a/engine/inc/bullet/SharedMemory/PhysicsServerExampleBullet2.h +++ /dev/null @@ -1,7 +0,0 @@ - -#ifndef PHYSICS_SERVER_EXAMPLE_BULLET_2_H -#define PHYSICS_SERVER_EXAMPLE_BULLET_2_H - -class CommonExampleInterface* PhysicsServerCreateFuncBullet2(struct CommonExampleOptions& options); - -#endif //PHYSICS_SERVER_EXAMPLE_BULLET_2_H diff --git a/engine/inc/bullet/SharedMemory/PhysicsServerSharedMemory.h b/engine/inc/bullet/SharedMemory/PhysicsServerSharedMemory.h deleted file mode 100644 index 26b660cf..00000000 --- a/engine/inc/bullet/SharedMemory/PhysicsServerSharedMemory.h +++ /dev/null @@ -1,58 +0,0 @@ -#ifndef PHYSICS_SERVER_SHARED_MEMORY_H -#define PHYSICS_SERVER_SHARED_MEMORY_H - -#include "PhysicsServer.h" -#include "LinearMath/btQuaternion.h" - -class PhysicsServerSharedMemory : public PhysicsServer -{ - struct PhysicsServerSharedMemoryInternalData* m_data; - -protected: - void releaseSharedMemory(); - -public: - PhysicsServerSharedMemory(struct CommandProcessorCreationInterface* commandProcessorCreator, class SharedMemoryInterface* sharedMem, int bla); - virtual ~PhysicsServerSharedMemory(); - - virtual void setSharedMemoryKey(int key); - - //todo: implement option to allocated shared memory from client - virtual bool connectSharedMemory(struct GUIHelperInterface* guiHelper); - - virtual void disconnectSharedMemory(bool deInitializeSharedMemory); - - virtual void processClientCommands(); - - virtual void stepSimulationRealTime(double dtInSec, const struct b3VRControllerEvent* vrEvents, int numVREvents, const struct b3KeyboardEvent* keyEvents, int numKeyEvents, const struct b3MouseEvent* mouseEvents, int numMouseEvents); - - virtual void enableRealTimeSimulation(bool enableRealTimeSim); - virtual bool isRealTimeSimulationEnabled() const; - - virtual void reportNotifications(); - - //bool supportsJointMotor(class btMultiBody* body, int linkIndex); - - ///The pickBody method will try to pick the first body along a ray, return true if succeeds, false otherwise - virtual bool pickBody(const btVector3& rayFromWorld, const btVector3& rayToWorld); - virtual bool movePickedBody(const btVector3& rayFromWorld, const btVector3& rayToWorld); - virtual void removePickingConstraint(); - - virtual const btVector3& getVRTeleportPosition() const; - virtual void setVRTeleportPosition(const btVector3& vrTeleportPos); - - virtual const btQuaternion& getVRTeleportOrientation() const; - virtual void setVRTeleportOrientation(const btQuaternion& vrTeleportOrn); - - //for physicsDebugDraw and renderScene are mainly for debugging purposes - //and for physics visualization. The idea is that physicsDebugDraw can also send wireframe - //to a physics client, over shared memory - void physicsDebugDraw(int debugDrawFlags); - void renderScene(int renderFlags); - void syncPhysicsToGraphics(); - - void enableCommandLogging(bool enable, const char* fileName); - void replayFromLogFile(const char* fileName); -}; - -#endif //PHYSICS_SERVER_EXAMPLESHARED_MEMORY_H diff --git a/engine/inc/bullet/SharedMemory/PosixSharedMemory.h b/engine/inc/bullet/SharedMemory/PosixSharedMemory.h deleted file mode 100644 index be915741..00000000 --- a/engine/inc/bullet/SharedMemory/PosixSharedMemory.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef POSIX_SHARED_MEMORY_H -#define POSIX_SHARED_MEMORY_H - -#include "SharedMemoryInterface.h" - -class PosixSharedMemory : public SharedMemoryInterface -{ - struct PosixSharedMemoryInteralData* m_internalData; - -public: - PosixSharedMemory(); - virtual ~PosixSharedMemory(); - - virtual void* allocateSharedMemory(int key, int size, bool allowCreation); - virtual void releaseSharedMemory(int key, int size); -}; - -#endif // diff --git a/engine/inc/bullet/SharedMemory/RemoteGUIHelper.h b/engine/inc/bullet/SharedMemory/RemoteGUIHelper.h deleted file mode 100644 index 3d74b03f..00000000 --- a/engine/inc/bullet/SharedMemory/RemoteGUIHelper.h +++ /dev/null @@ -1,78 +0,0 @@ -#ifndef REMOTE_HELPER_H -#define REMOTE_HELPER_H - -#include "../CommonInterfaces/CommonGUIHelperInterface.h" - -///a RemoteGUIHelper will connect to an existing graphics server through shared memory -struct RemoteGUIHelper : public GUIHelperInterface -{ - struct RemoteGUIHelperInternalData* m_data; - - RemoteGUIHelper(); - - virtual ~RemoteGUIHelper(); - - bool isConnected() const; - - virtual void setVisualizerFlag(int flag, int enable); - - virtual void createRigidBodyGraphicsObject(btRigidBody* body, const btVector3& color); - - virtual void createCollisionObjectGraphicsObject(btCollisionObject* body, const btVector3& color); - - virtual void createCollisionShapeGraphicsObject(btCollisionShape* collisionShape); - - virtual bool getCameraInfo(int* width, int* height, float viewMatrix[16], float projectionMatrix[16], float camUp[3], float camForward[3], float hor[3], float vert[3], float* yaw, float* pitch, float* camDist, float camTarget[3]) const; - - virtual void syncPhysicsToGraphics(const btDiscreteDynamicsWorld* rbWorld); - virtual void syncPhysicsToGraphics2(const class btDiscreteDynamicsWorld* rbWorld); - virtual void syncPhysicsToGraphics2(const GUISyncPosition* positions, int numPositions); - - virtual void render(const btDiscreteDynamicsWorld* rbWorld); - - virtual void createPhysicsDebugDrawer(btDiscreteDynamicsWorld* rbWorld); - - virtual int registerTexture(const unsigned char* texels, int width, int height); - virtual int registerGraphicsShape(const float* vertices, int numvertices, const int* indices, int numIndices, int primitiveType, int textureId); - virtual int registerGraphicsInstance(int shapeIndex, const float* position, const float* quaternion, const float* color, const float* scaling); - virtual void removeAllGraphicsInstances(); - virtual void removeGraphicsInstance(int graphicsUid); - virtual void changeRGBAColor(int instanceUid, const double rgbaColor[4]); - virtual void changeScaling(int instanceUid, const double scaling[3]); - - virtual Common2dCanvasInterface* get2dCanvasInterface(); - - virtual CommonParameterInterface* getParameterInterface(); - - virtual CommonRenderInterface* getRenderInterface(); - - virtual CommonGraphicsApp* getAppInterface(); - - virtual void setUpAxis(int axis); - - virtual void resetCamera(float camDist, float yaw, float pitch, float camPosX, float camPosY, float camPosZ); - - virtual void copyCameraImageData(const float viewMatrix[16], const float projectionMatrix[16], - unsigned char* pixelsRGBA, int rgbaBufferSizeInPixels, - float* depthBuffer, int depthBufferSizeInPixels, - int* segmentationMaskBuffer, int segmentationMaskBufferSizeInPixels, - int startPixelIndex, int width, int height, int* numPixelsCopied); - - virtual void setProjectiveTextureMatrices(const float viewMatrix[16], const float projectionMatrix[16]); - - virtual void setProjectiveTexture(bool useProjectiveTexture); - - virtual void autogenerateGraphicsObjects(btDiscreteDynamicsWorld* rbWorld); - - virtual void drawText3D(const char* txt, float posX, float posZY, float posZ, float size); - - virtual void drawText3D(const char* txt, float position[3], float orientation[4], float color[4], float size, int optionFlag); - - virtual int addUserDebugLine(const double debugLineFromXYZ[3], const double debugLineToXYZ[3], const double debugLineColorRGB[3], double lineWidth, double lifeTime, int trackingVisualShapeIndex, int replaceItemUid); - virtual void removeUserDebugItem(int debugItemUniqueId); - virtual void removeAllUserDebugItems(); - - int uploadData(const unsigned char* data, int sizeInBytes, int slot); -}; - -#endif //REMOTE_HELPER_H diff --git a/engine/inc/bullet/SharedMemory/RemoteGUIHelperTCP.h b/engine/inc/bullet/SharedMemory/RemoteGUIHelperTCP.h deleted file mode 100644 index 606eab58..00000000 --- a/engine/inc/bullet/SharedMemory/RemoteGUIHelperTCP.h +++ /dev/null @@ -1,75 +0,0 @@ -#ifndef REMOTE_HELPER_TCP_H -#define REMOTE_HELPER_TCP_H - -#include "../CommonInterfaces/CommonGUIHelperInterface.h" - -///a RemoteGUIHelper will connect to an existing graphics server over TCP -struct RemoteGUIHelperTCP : public GUIHelperInterface -{ - struct RemoteGUIHelperTCPInternalData* m_data; - - RemoteGUIHelperTCP(const char* hostName, int port); - - virtual ~RemoteGUIHelperTCP(); - - virtual void setVisualizerFlag(int flag, int enable); - - virtual void createRigidBodyGraphicsObject(btRigidBody* body, const btVector3& color); - - virtual void createCollisionObjectGraphicsObject(btCollisionObject* body, const btVector3& color); - - virtual void createCollisionShapeGraphicsObject(btCollisionShape* collisionShape); - - virtual bool getCameraInfo(int* width, int* height, float viewMatrix[16], float projectionMatrix[16], float camUp[3], float camForward[3], float hor[3], float vert[3], float* yaw, float* pitch, float* camDist, float camTarget[3]) const; - - virtual void syncPhysicsToGraphics(const btDiscreteDynamicsWorld* rbWorld); - virtual void syncPhysicsToGraphics2(const class btDiscreteDynamicsWorld* rbWorld); - virtual void syncPhysicsToGraphics2(const GUISyncPosition* positions, int numPositions); - - virtual void render(const btDiscreteDynamicsWorld* rbWorld); - - virtual void createPhysicsDebugDrawer(btDiscreteDynamicsWorld* rbWorld); - - virtual int registerTexture(const unsigned char* texels, int width, int height); - virtual int registerGraphicsShape(const float* vertices, int numvertices, const int* indices, int numIndices, int primitiveType, int textureId); - virtual int registerGraphicsInstance(int shapeIndex, const float* position, const float* quaternion, const float* color, const float* scaling); - virtual void removeAllGraphicsInstances(); - virtual void removeGraphicsInstance(int graphicsUid); - virtual void changeRGBAColor(int instanceUid, const double rgbaColor[4]); - - virtual Common2dCanvasInterface* get2dCanvasInterface(); - - virtual CommonParameterInterface* getParameterInterface(); - - virtual CommonRenderInterface* getRenderInterface(); - - virtual CommonGraphicsApp* getAppInterface(); - - virtual void setUpAxis(int axis); - - virtual void resetCamera(float camDist, float yaw, float pitch, float camPosX, float camPosY, float camPosZ); - - virtual void copyCameraImageData(const float viewMatrix[16], const float projectionMatrix[16], - unsigned char* pixelsRGBA, int rgbaBufferSizeInPixels, - float* depthBuffer, int depthBufferSizeInPixels, - int* segmentationMaskBuffer, int segmentationMaskBufferSizeInPixels, - int startPixelIndex, int width, int height, int* numPixelsCopied); - - virtual void setProjectiveTextureMatrices(const float viewMatrix[16], const float projectionMatrix[16]); - - virtual void setProjectiveTexture(bool useProjectiveTexture); - - virtual void autogenerateGraphicsObjects(btDiscreteDynamicsWorld* rbWorld); - - virtual void drawText3D(const char* txt, float posX, float posZY, float posZ, float size); - - virtual void drawText3D(const char* txt, float position[3], float orientation[4], float color[4], float size, int optionFlag); - - virtual int addUserDebugLine(const double debugLineFromXYZ[3], const double debugLineToXYZ[3], const double debugLineColorRGB[3], double lineWidth, double lifeTime, int trackingVisualShapeIndex, int replaceItemUid); - virtual void removeUserDebugItem(int debugItemUniqueId); - virtual void removeAllUserDebugItems(); - - int uploadData(const unsigned char* data, int sizeInBytes, int slot); -}; - -#endif //REMOTE_HELPER_TCP_H diff --git a/engine/inc/bullet/SharedMemory/RobotControlExample.h b/engine/inc/bullet/SharedMemory/RobotControlExample.h deleted file mode 100644 index 82bc81a7..00000000 --- a/engine/inc/bullet/SharedMemory/RobotControlExample.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef ROBOT_CONTROL_EXAMPLE_H -#define ROBOT_CONTROL_EXAMPLE_H - -enum EnumRobotControls -{ - ROBOT_VELOCITY_CONTROL = 0, - ROBOT_PD_CONTROL, - ROBOT_PING_PONG_JOINT_FEEDBACK, -}; - -class CommonExampleInterface* RobotControlExampleCreateFunc(struct CommonExampleOptions& options); - -#endif //ROBOT_CONTROL_EXAMPLE_H diff --git a/engine/inc/bullet/SharedMemory/SharedMemoryBlock.h b/engine/inc/bullet/SharedMemory/SharedMemoryBlock.h deleted file mode 100644 index 54d89698..00000000 --- a/engine/inc/bullet/SharedMemory/SharedMemoryBlock.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef SHARED_MEMORY_BLOCK_H -#define SHARED_MEMORY_BLOCK_H - -#define SHARED_MEMORY_MAX_COMMANDS 1 - -#include "SharedMemoryCommands.h" - -struct SharedMemoryBlock -{ - int m_magicId; - struct SharedMemoryCommand m_clientCommands[SHARED_MEMORY_MAX_COMMANDS]; - struct SharedMemoryStatus m_serverCommands[SHARED_MEMORY_MAX_COMMANDS]; - - int m_numClientCommands; - int m_numProcessedClientCommands; - - int m_numServerCommands; - int m_numProcessedServerCommands; - - - //m_bulletStreamDataServerToClient is used to send (debug) data from server to client, for - //example to provide all details of a multibody including joint/link names, after loading a URDF file. - char m_bulletStreamDataServerToClientRefactor[SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE]; -}; - -//http://stackoverflow.com/questions/24736304/unable-to-use-inline-in-declaration-get-error-c2054 -#ifdef _WIN32 -__inline -#else -inline -#endif - void - InitSharedMemoryBlock(struct SharedMemoryBlock* sharedMemoryBlock) -{ - sharedMemoryBlock->m_numClientCommands = 0; - sharedMemoryBlock->m_numServerCommands = 0; - sharedMemoryBlock->m_numProcessedClientCommands = 0; - sharedMemoryBlock->m_numProcessedServerCommands = 0; - sharedMemoryBlock->m_magicId = SHARED_MEMORY_MAGIC_NUMBER; -} - -#define SHARED_MEMORY_SIZE sizeof(SharedMemoryBlock) - -#endif //SHARED_MEMORY_BLOCK_H diff --git a/engine/inc/bullet/SharedMemory/SharedMemoryCommandProcessor.h b/engine/inc/bullet/SharedMemory/SharedMemoryCommandProcessor.h deleted file mode 100644 index 80fff4ef..00000000 --- a/engine/inc/bullet/SharedMemory/SharedMemoryCommandProcessor.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef SHARED_MEMORY_COMMAND_PROCESSOR_H -#define SHARED_MEMORY_COMMAND_PROCESSOR_H - -#include "PhysicsCommandProcessorInterface.h" - -class SharedMemoryCommandProcessor : public PhysicsCommandProcessorInterface -{ - struct SharedMemoryCommandProcessorInternalData* m_data; - -public: - SharedMemoryCommandProcessor(); - - virtual ~SharedMemoryCommandProcessor(); - - virtual bool connect(); - - virtual void disconnect(); - - virtual bool isConnected() const; - - virtual bool processCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - - virtual bool receiveStatus(struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - - virtual void renderScene(int renderFlags); - virtual void physicsDebugDraw(int debugDrawFlags); - virtual void setGuiHelper(struct GUIHelperInterface* guiHelper); - - void setSharedMemoryInterface(class SharedMemoryInterface* sharedMem); - void setSharedMemoryKey(int key); - virtual void setTimeOut(double timeOutInSeconds); - - virtual void reportNotifications() {} -}; - -#endif //SHARED_MEMORY_COMMAND_PROCESSOR_H diff --git a/engine/inc/bullet/SharedMemory/SharedMemoryCommands.h b/engine/inc/bullet/SharedMemory/SharedMemoryCommands.h deleted file mode 100644 index a019a58c..00000000 --- a/engine/inc/bullet/SharedMemory/SharedMemoryCommands.h +++ /dev/null @@ -1,1283 +0,0 @@ -#ifndef SHARED_MEMORY_COMMANDS_H -#define SHARED_MEMORY_COMMANDS_H - -//this is a very experimental draft of commands. We will iterate on this API (commands, arguments etc) - -#include "SharedMemoryPublic.h" - -#ifdef __GNUC__ -#include -typedef int32_t smInt32_t; -typedef int64_t smInt64_t; -typedef uint32_t smUint32_t; -typedef uint64_t smUint64_t; -#elif defined(_MSC_VER) -typedef __int32 smInt32_t; -typedef __int64 smInt64_t; -typedef unsigned __int32 smUint32_t; -typedef unsigned __int64 smUint64_t; -#else -typedef int smInt32_t; -typedef long long int smInt64_t; -typedef unsigned int smUint32_t; -typedef unsigned long long int smUint64_t; -#endif - -#ifdef __APPLE__ -#define SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE (1024 * 1024) -#else -#define SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE (8 * 1024 * 1024) -#endif - -#define SHARED_MEMORY_SERVER_TEST_C -#define MAX_DEGREE_OF_FREEDOM 128 -#define MAX_NUM_SENSORS 256 -#define MAX_URDF_FILENAME_LENGTH 1024 -#define MAX_SDF_FILENAME_LENGTH 1024 -#define MAX_FILENAME_LENGTH MAX_URDF_FILENAME_LENGTH -#define MAX_NUM_LINKS MAX_DEGREE_OF_FREEDOM - - -struct TmpFloat3 -{ - float m_x; - float m_y; - float m_z; -}; - -#ifdef _WIN32 -__inline -#else -inline -#endif - TmpFloat3 - CreateTmpFloat3(float x, float y, float z) -{ - TmpFloat3 tmp; - tmp.m_x = x; - tmp.m_y = y; - tmp.m_z = z; - return tmp; -} - -enum EnumSdfArgsUpdateFlags -{ - SDF_ARGS_FILE_NAME = 1, -}; - -struct SdfArgs -{ - char m_sdfFileName[MAX_URDF_FILENAME_LENGTH]; - int m_useMultiBody; - double m_globalScaling; -}; - -struct FileArgs -{ - char m_fileName[MAX_URDF_FILENAME_LENGTH]; - int m_stateId; -}; - -enum EnumLoadStateArgsUpdateFlags -{ - CMD_LOAD_STATE_HAS_STATEID = 1, - CMD_LOAD_STATE_HAS_FILENAME = 2, -}; - -enum EnumUrdfArgsUpdateFlags -{ - URDF_ARGS_FILE_NAME = 1, - URDF_ARGS_INITIAL_POSITION = 2, - URDF_ARGS_INITIAL_ORIENTATION = 4, - URDF_ARGS_USE_MULTIBODY = 8, - URDF_ARGS_USE_FIXED_BASE = 16, - URDF_ARGS_HAS_CUSTOM_URDF_FLAGS = 32, - URDF_ARGS_USE_GLOBAL_SCALING = 64, -}; - -struct UrdfArgs -{ - char m_urdfFileName[MAX_URDF_FILENAME_LENGTH]; - double m_initialPosition[3]; - double m_initialOrientation[4]; - int m_useMultiBody; - int m_useFixedBase; - int m_urdfFlags; - double m_globalScaling; -}; - -struct MjcfArgs -{ - char m_mjcfFileName[MAX_URDF_FILENAME_LENGTH]; - int m_useMultiBody; - int m_flags; -}; - -struct b3SearchPathfArgs -{ - char m_path[MAX_FILENAME_LENGTH]; -}; - -enum CustomCommandEnum -{ - CMD_CUSTOM_COMMAND_LOAD_PLUGIN = 1, - CMD_CUSTOM_COMMAND_UNLOAD_PLUGIN = 2, - CMD_CUSTOM_COMMAND_EXECUTE_PLUGIN_COMMAND = 4, - CMD_CUSTOM_COMMAND_LOAD_PLUGIN_POSTFIX = 8, -}; - -struct b3CustomCommand -{ - int m_pluginUniqueId; - b3PluginArguments m_arguments; - char m_pluginPath[MAX_FILENAME_LENGTH]; - char m_postFix[MAX_FILENAME_LENGTH]; - int m_startingReturnBytes; -}; - -struct b3CustomCommandResultArgs -{ - int m_pluginUniqueId; - int m_executeCommandResult; - int m_returnDataType; - int m_returnDataSizeInBytes; - int m_returnDataStart; -}; - -struct BulletDataStreamArgs -{ - char m_bulletFileName[MAX_FILENAME_LENGTH]; - int m_bodyUniqueId; - char m_bodyName[MAX_FILENAME_LENGTH]; -}; - -enum EnumChangeDynamicsInfoFlags -{ - CHANGE_DYNAMICS_INFO_SET_MASS = 1, - CHANGE_DYNAMICS_INFO_SET_COM = 2, - CHANGE_DYNAMICS_INFO_SET_LATERAL_FRICTION = 4, - CHANGE_DYNAMICS_INFO_SET_SPINNING_FRICTION = 8, - CHANGE_DYNAMICS_INFO_SET_ROLLING_FRICTION = 16, - CHANGE_DYNAMICS_INFO_SET_RESTITUTION = 32, - CHANGE_DYNAMICS_INFO_SET_LINEAR_DAMPING = 64, - CHANGE_DYNAMICS_INFO_SET_ANGULAR_DAMPING = 128, - CHANGE_DYNAMICS_INFO_SET_CONTACT_STIFFNESS_AND_DAMPING = 256, - CHANGE_DYNAMICS_INFO_SET_FRICTION_ANCHOR = 512, - CHANGE_DYNAMICS_INFO_SET_LOCAL_INERTIA_DIAGONAL = 1024, - CHANGE_DYNAMICS_INFO_SET_CCD_SWEPT_SPHERE_RADIUS = 2048, - CHANGE_DYNAMICS_INFO_SET_CONTACT_PROCESSING_THRESHOLD = 4096, - CHANGE_DYNAMICS_INFO_SET_ACTIVATION_STATE = 8192, - CHANGE_DYNAMICS_INFO_SET_JOINT_DAMPING = 16384, - CHANGE_DYNAMICS_INFO_SET_ANISOTROPIC_FRICTION = 32768, - CHANGE_DYNAMICS_INFO_SET_MAX_JOINT_VELOCITY = 1<<16, - CHANGE_DYNAMICS_INFO_SET_COLLISION_MARGIN = 1 << 17, - CHANGE_DYNAMICS_INFO_SET_JOINT_LIMITS = 1 << 18, - CHANGE_DYNAMICS_INFO_SET_JOINT_LIMIT_MAX_FORCE = 1 << 19, - CHANGE_DYNAMICS_INFO_SET_DYNAMIC_TYPE = 1 << 20, -}; - -struct ChangeDynamicsInfoArgs -{ - int m_bodyUniqueId; - int m_linkIndex; - double m_mass; - double m_COM[3]; - double m_lateralFriction; - double m_spinningFriction; - double m_rollingFriction; - double m_restitution; - double m_linearDamping; - double m_angularDamping; - double m_contactStiffness; - double m_contactDamping; - double m_localInertiaDiagonal[3]; - int m_frictionAnchor; - double m_ccdSweptSphereRadius; - double m_contactProcessingThreshold; - int m_activationState; - double m_jointDamping; - double m_anisotropicFriction[3]; - double m_maxJointVelocity; - double m_collisionMargin; - - double m_jointLowerLimit; - double m_jointUpperLimit; - double m_jointLimitForce; - - int m_dynamicType; -}; - -struct GetDynamicsInfoArgs -{ - int m_bodyUniqueId; - int m_linkIndex; -}; - -struct SetJointFeedbackArgs -{ - int m_bodyUniqueId; - int m_linkId; - int m_isEnabled; -}; - -enum EnumInitPoseFlags -{ - INIT_POSE_HAS_INITIAL_POSITION = 1, - INIT_POSE_HAS_INITIAL_ORIENTATION = 2, - INIT_POSE_HAS_JOINT_STATE = 4, - INIT_POSE_HAS_BASE_LINEAR_VELOCITY = 8, - INIT_POSE_HAS_BASE_ANGULAR_VELOCITY = 16, - INIT_POSE_HAS_JOINT_VELOCITY = 32, - INIT_POSE_HAS_SCALING=64, -}; - -///InitPoseArgs is mainly to initialize (teleport) the robot in a particular position -///No motors or controls are needed to initialize the pose. It is similar to -///moving a robot to a starting place, while it is switched off. It is only called -///at the start of a robot control session. All velocities and control forces are cleared to zero. -struct InitPoseArgs -{ - int m_bodyUniqueId; - int m_hasInitialStateQ[MAX_DEGREE_OF_FREEDOM]; - double m_initialStateQ[MAX_DEGREE_OF_FREEDOM]; - int m_hasInitialStateQdot[MAX_DEGREE_OF_FREEDOM]; - double m_initialStateQdot[MAX_DEGREE_OF_FREEDOM]; - double m_scaling[3]; -}; - -struct RequestDebugLinesArgs -{ - int m_debugMode; - int m_startingLineIndex; -}; - -struct RequestPixelDataArgs -{ - float m_viewMatrix[16]; - float m_projectionMatrix[16]; - int m_startPixelIndex; - int m_pixelWidth; - int m_pixelHeight; - float m_lightDirection[3]; - float m_lightColor[3]; - float m_lightDistance; - float m_lightAmbientCoeff; - float m_lightDiffuseCoeff; - float m_lightSpecularCoeff; - int m_hasShadow; - int m_flags; - float m_projectiveTextureViewMatrix[16]; - float m_projectiveTextureProjectionMatrix[16]; -}; - -enum EnumRequestPixelDataUpdateFlags -{ - REQUEST_PIXEL_ARGS_HAS_CAMERA_MATRICES = 1, - REQUEST_PIXEL_ARGS_SET_PIXEL_WIDTH_HEIGHT = 2, - REQUEST_PIXEL_ARGS_SET_LIGHT_DIRECTION = 4, - REQUEST_PIXEL_ARGS_SET_LIGHT_COLOR = 8, - REQUEST_PIXEL_ARGS_SET_LIGHT_DISTANCE = 16, - REQUEST_PIXEL_ARGS_SET_SHADOW = 32, - REQUEST_PIXEL_ARGS_SET_AMBIENT_COEFF = 64, - REQUEST_PIXEL_ARGS_SET_DIFFUSE_COEFF = 128, - REQUEST_PIXEL_ARGS_SET_SPECULAR_COEFF = 256, - REQUEST_PIXEL_ARGS_HAS_FLAGS = 512, - REQUEST_PIXEL_ARGS_HAS_PROJECTIVE_TEXTURE_MATRICES = 1024, - - //don't exceed (1<<15), because this enum is shared with EnumRenderer in SharedMemoryPublic.h - -}; - -enum EnumRequestContactDataUpdateFlags -{ - CMD_REQUEST_CONTACT_POINT_HAS_QUERY_MODE = 1, - CMD_REQUEST_CONTACT_POINT_HAS_CLOSEST_DISTANCE_THRESHOLD = 2, - CMD_REQUEST_CONTACT_POINT_HAS_LINK_INDEX_A_FILTER = 4, - CMD_REQUEST_CONTACT_POINT_HAS_LINK_INDEX_B_FILTER = 8, - - CMD_REQUEST_CONTACT_POINT_HAS_COLLISION_SHAPE_A = 16, - CMD_REQUEST_CONTACT_POINT_HAS_COLLISION_SHAPE_B = 32, - CMD_REQUEST_CONTACT_POINT_HAS_COLLISION_SHAPE_POSITION_A = 64, - CMD_REQUEST_CONTACT_POINT_HAS_COLLISION_SHAPE_POSITION_B = 128, - CMD_REQUEST_CONTACT_POINT_HAS_COLLISION_SHAPE_ORIENTATION_A = 256, - CMD_REQUEST_CONTACT_POINT_HAS_COLLISION_SHAPE_ORIENTATION_B = 512, - -}; - -struct RequestRaycastIntersections -{ - // The number of threads that Bullet may use to perform the ray casts. - // 0: Let Bullet decide - // 1: Use a single thread (i.e. no multi-threading) - // 2 or more: Number of threads to use. - int m_numThreads; - int m_numCommandRays; - //m_numCommandRays command rays are stored in m_fromToRays - b3RayData m_fromToRays[MAX_RAY_INTERSECTION_BATCH_SIZE]; - - int m_numStreamingRays; - //optional m_parentObjectUniqueId (-1 for unused) - int m_parentObjectUniqueId; - int m_parentLinkIndex; - int m_reportHitNumber; - int m_collisionFilterMask; - double m_fractionEpsilon; - //streaming ray data stored in shared memory streaming part. (size m_numStreamingRays ) -}; - -struct SendRaycastHits -{ - int m_numRaycastHits; - // Actual ray result data stored in shared memory streaming part. -}; - -struct RequestContactDataArgs -{ - int m_startingContactPointIndex; - int m_objectAIndexFilter; - int m_objectBIndexFilter; - int m_linkIndexAIndexFilter; - int m_linkIndexBIndexFilter; - double m_closestDistanceThreshold; - - int m_collisionShapeA; - int m_collisionShapeB; - double m_collisionShapePositionA[3]; - double m_collisionShapePositionB[3]; - double m_collisionShapeOrientationA[4]; - double m_collisionShapeOrientationB[4]; - - int m_mode; -}; - -struct RequestOverlappingObjectsArgs -{ - int m_startingOverlappingObjectIndex; - double m_aabbQueryMin[3]; - double m_aabbQueryMax[3]; -}; - -struct RequestVisualShapeDataArgs -{ - int m_bodyUniqueId; - int m_startingVisualShapeIndex; -}; - -struct RequestCollisionShapeDataArgs -{ - int m_bodyUniqueId; - int m_linkIndex; -}; - -enum EnumUpdateVisualShapeData -{ - CMD_UPDATE_VISUAL_SHAPE_TEXTURE = 1, - CMD_UPDATE_VISUAL_SHAPE_RGBA_COLOR = 2, - CMD_UPDATE_VISUAL_SHAPE_SPECULAR_COLOR = 4, - CMD_UPDATE_VISUAL_SHAPE_FLAGS = 8, -}; - - - -struct UpdateVisualShapeDataArgs -{ - int m_bodyUniqueId; - int m_jointIndex; - int m_shapeIndex; - int m_textureUniqueId; - double m_rgbaColor[4]; - double m_specularColor[3]; - int m_flags; -}; - -struct LoadTextureArgs -{ - char m_textureFileName[MAX_FILENAME_LENGTH]; -}; - -struct b3LoadTextureResultArgs -{ - int m_textureUniqueId; -}; - -struct SendVisualShapeDataArgs -{ - int m_bodyUniqueId; - int m_startingVisualShapeIndex; - int m_numVisualShapesCopied; - int m_numRemainingVisualShapes; -}; - -struct SendCollisionShapeDataArgs -{ - int m_bodyUniqueId; - int m_linkIndex; - int m_numCollisionShapes; -}; - -struct SendDebugLinesArgs -{ - int m_startingLineIndex; - int m_numDebugLines; - int m_numRemainingDebugLines; -}; - -struct SendPixelDataArgs -{ - int m_imageWidth; - int m_imageHeight; - - int m_startingPixelIndex; - int m_numPixelsCopied; - int m_numRemainingPixels; -}; - -struct PickBodyArgs -{ - double m_rayFromWorld[3]; - double m_rayToWorld[3]; -}; - -///Controlling a robot involves sending the desired state to its joint motor controllers. -///The control mode determines the state variables used for motor control. -struct SendDesiredStateArgs -{ - int m_bodyUniqueId; - int m_controlMode; - - //PD parameters in case m_controlMode == CONTROL_MODE_POSITION_VELOCITY_PD - double m_Kp[MAX_DEGREE_OF_FREEDOM]; //indexed by degree of freedom, 6 for base, and then the dofs for each link - double m_Kd[MAX_DEGREE_OF_FREEDOM]; //indexed by degree of freedom, 6 for base, and then the dofs for each link - double m_rhsClamp[MAX_DEGREE_OF_FREEDOM]; - - int m_hasDesiredStateFlags[MAX_DEGREE_OF_FREEDOM]; - - //desired state is only written by the client, read-only access by server is expected - - //m_desiredStateQ is indexed by position variables, - //starting with 3 base position variables, 4 base orientation variables (quaternion), then link position variables - double m_desiredStateQ[MAX_DEGREE_OF_FREEDOM]; - - //m_desiredStateQdot is index by velocity degrees of freedom, 3 linear and 3 angular variables for the base and then link velocity variables - double m_desiredStateQdot[MAX_DEGREE_OF_FREEDOM]; - - //m_desiredStateForceTorque is either the actual applied force/torque (in CONTROL_MODE_TORQUE) or - //or the maximum applied force/torque for the PD/motor/constraint to reach the desired velocity in CONTROL_MODE_VELOCITY and CONTROL_MODE_POSITION_VELOCITY_PD mode - //indexed by degree of freedom, 6 dof base, and then dofs for each link - double m_desiredStateForceTorque[MAX_DEGREE_OF_FREEDOM]; -}; - -enum EnumSimDesiredStateUpdateFlags -{ - SIM_DESIRED_STATE_HAS_Q = 1, - SIM_DESIRED_STATE_HAS_QDOT = 2, - SIM_DESIRED_STATE_HAS_KD = 4, - SIM_DESIRED_STATE_HAS_KP = 8, - SIM_DESIRED_STATE_HAS_MAX_FORCE = 16, - SIM_DESIRED_STATE_HAS_RHS_CLAMP = 32, -}; - -enum EnumSimParamUpdateFlags -{ - SIM_PARAM_UPDATE_DELTA_TIME = 1, - SIM_PARAM_UPDATE_GRAVITY = 1<<1, - SIM_PARAM_UPDATE_NUM_SOLVER_ITERATIONS = 1<<2, - SIM_PARAM_UPDATE_NUM_SIMULATION_SUB_STEPS = 1<<3, - SIM_PARAM_UPDATE_REAL_TIME_SIMULATION = 1<<4, - SIM_PARAM_UPDATE_DEFAULT_CONTACT_ERP = 1<<5, - SIM_PARAM_UPDATE_INTERNAL_SIMULATION_FLAGS = 1<<6, - SIM_PARAM_UPDATE_USE_SPLIT_IMPULSE = 1<<7, - SIM_PARAM_UPDATE_SPLIT_IMPULSE_PENETRATION_THRESHOLD = 1<<8, - SIM_PARAM_UPDATE_COLLISION_FILTER_MODE = 1 << 9, - SIM_PARAM_UPDATE_CONTACT_BREAKING_THRESHOLD = 1 << 10, - SIM_PARAM_ENABLE_CONE_FRICTION = 1 << 11, - SIM_PARAM_ENABLE_FILE_CACHING = 1 << 12, - SIM_PARAM_UPDATE_RESTITUTION_VELOCITY_THRESHOLD = 1 << 13, - SIM_PARAM_UPDATE_DEFAULT_NON_CONTACT_ERP = 1 << 14, - SIM_PARAM_UPDATE_DEFAULT_FRICTION_ERP = 1 << 15, - SIM_PARAM_UPDATE_DETERMINISTIC_OVERLAPPING_PAIRS = 1 << 16, - SIM_PARAM_UPDATE_CCD_ALLOWED_PENETRATION = 1 << 17, - SIM_PARAM_UPDATE_JOINT_FEEDBACK_MODE = 1 << 18, - SIM_PARAM_UPDATE_DEFAULT_GLOBAL_CFM = 1 << 19, - SIM_PARAM_UPDATE_DEFAULT_FRICTION_CFM = 1 << 20, - SIM_PARAM_UPDATE_SOLVER_RESIDULAL_THRESHOLD = 1 << 21, - SIM_PARAM_UPDATE_CONTACT_SLOP = 1 << 22, - SIM_PARAM_ENABLE_SAT = 1 << 23, - SIM_PARAM_CONSTRAINT_SOLVER_TYPE = 1 << 24, - SIM_PARAM_CONSTRAINT_MIN_SOLVER_ISLAND_SIZE = 1 << 25, - SIM_PARAM_REPORT_CONSTRAINT_SOLVER_ANALYTICS = 1 << 26, - SIM_PARAM_UPDATE_WARM_STARTING_FACTOR = 1 << 27, - SIM_PARAM_UPDATE_ARTICULATED_WARM_STARTING_FACTOR = 1 << 28, - SIM_PARAM_UPDATE_SPARSE_SDF = 1 << 29, - SIM_PARAM_UPDATE_NUM_NONCONTACT_INNER_ITERATIONS = 1 << 30, -}; - -enum EnumLoadSoftBodyUpdateFlags -{ - LOAD_SOFT_BODY_FILE_NAME = 1, - LOAD_SOFT_BODY_UPDATE_SCALE = 1<<1, - LOAD_SOFT_BODY_UPDATE_MASS = 1<<2, - LOAD_SOFT_BODY_UPDATE_COLLISION_MARGIN = 1<<3, - LOAD_SOFT_BODY_INITIAL_POSITION = 1<<4, - LOAD_SOFT_BODY_INITIAL_ORIENTATION = 1<<5, - LOAD_SOFT_BODY_ADD_COROTATED_FORCE = 1<<6, - LOAD_SOFT_BODY_ADD_MASS_SPRING_FORCE = 1<<7, - LOAD_SOFT_BODY_ADD_GRAVITY_FORCE = 1<<8, - LOAD_SOFT_BODY_SET_COLLISION_HARDNESS = 1<<9, - LOAD_SOFT_BODY_SET_FRICTION_COEFFICIENT = 1<<10, - LOAD_SOFT_BODY_ADD_BENDING_SPRINGS = 1<<11, - LOAD_SOFT_BODY_ADD_NEOHOOKEAN_FORCE = 1<<12, - LOAD_SOFT_BODY_USE_SELF_COLLISION = 1<<13, - LOAD_SOFT_BODY_USE_FACE_CONTACT = 1<<14, - LOAD_SOFT_BODY_SIM_MESH = 1<<15, - LOAD_SOFT_BODY_SET_REPULSION_STIFFNESS = 1<<16, - LOAD_SOFT_BODY_SET_DAMPING_SPRING_MODE = 1<<17, - LOAD_SOFT_BODY_SET_GRAVITY_FACTOR = 1<<18, -}; - -enum EnumSimParamInternalSimFlags -{ - SIM_PARAM_INTERNAL_CREATE_ROBOT_ASSETS = 1, -}; - -///Controlling a robot involves sending the desired state to its joint motor controllers. -///The control mode determines the state variables used for motor control. - -struct LoadSoftBodyArgs -{ - char m_fileName[MAX_FILENAME_LENGTH]; - double m_scale; - double m_mass; - double m_collisionMargin; - double m_initialPosition[3]; - double m_initialOrientation[4]; - double m_springElasticStiffness; - double m_springDampingStiffness; - int m_dampAllDirections; - double m_springBendingStiffness; - double m_corotatedMu; - double m_corotatedLambda; - int m_useBendingSprings; - double m_collisionHardness; - int m_useSelfCollision; - double m_frictionCoeff; - double m_NeoHookeanMu; - double m_NeoHookeanLambda; - double m_NeoHookeanDamping; - int m_useFaceContact; - char m_simFileName[MAX_FILENAME_LENGTH]; - double m_repulsionStiffness; - double m_gravFactor; -}; - -struct b3LoadSoftBodyResultArgs -{ - int m_objectUniqueId; -}; - -struct RequestActualStateArgs -{ - int m_bodyUniqueId; -}; - -struct SendActualStateArgs -{ - int m_bodyUniqueId; - int m_numLinks; - int m_numDegreeOfFreedomQ; - int m_numDegreeOfFreedomU; - - double m_rootLocalInertialFrame[7]; - struct SendActualStateSharedMemoryStorage* m_stateDetails; - -}; - -struct SendActualStateSharedMemoryStorage -{ - //actual state is only written by the server, read-only access by client is expected - double m_actualStateQ[MAX_DEGREE_OF_FREEDOM]; - double m_actualStateQdot[MAX_DEGREE_OF_FREEDOM]; - - //measured 6DOF force/torque sensors: force[x,y,z] and torque[x,y,z] - double m_jointReactionForces[6 * MAX_DEGREE_OF_FREEDOM]; - - double m_jointMotorForce[MAX_DEGREE_OF_FREEDOM]; - double m_jointMotorForceMultiDof[MAX_DEGREE_OF_FREEDOM]; - - double m_linkState[7 * MAX_NUM_LINKS]; - double m_linkWorldVelocities[6 * MAX_NUM_LINKS]; //linear velocity and angular velocity in world space (x/y/z each). - double m_linkLocalInertialFrames[7 * MAX_NUM_LINKS]; -}; - -struct b3SendCollisionInfoArgs -{ - int m_numLinks; - double m_rootWorldAABBMin[3]; - double m_rootWorldAABBMax[3]; - - double m_linkWorldAABBsMin[3 * MAX_NUM_LINKS]; - double m_linkWorldAABBsMax[3 * MAX_NUM_LINKS]; -}; - -struct b3RequestCollisionInfoArgs -{ - int m_bodyUniqueId; -}; - -enum EnumSensorTypes -{ - SENSOR_FORCE_TORQUE = 1, - SENSOR_IMU = 2, -}; - -struct CreateSensorArgs -{ - int m_bodyUniqueId; - int m_numJointSensorChanges; - int m_sensorType[MAX_DEGREE_OF_FREEDOM]; - - ///todo: clean up the duplication, make sure no-one else is using those members directly (use C-API header instead) - int m_jointIndex[MAX_DEGREE_OF_FREEDOM]; - int m_enableJointForceSensor[MAX_DEGREE_OF_FREEDOM]; - - int m_linkIndex[MAX_DEGREE_OF_FREEDOM]; - int m_enableSensor[MAX_DEGREE_OF_FREEDOM]; -}; - -typedef struct SharedMemoryCommand SharedMemoryCommand_t; - -enum EnumBoxShapeFlags -{ - BOX_SHAPE_HAS_INITIAL_POSITION = 1, - BOX_SHAPE_HAS_INITIAL_ORIENTATION = 2, - BOX_SHAPE_HAS_HALF_EXTENTS = 4, - BOX_SHAPE_HAS_MASS = 8, - BOX_SHAPE_HAS_COLLISION_SHAPE_TYPE = 16, - BOX_SHAPE_HAS_COLOR = 32, -}; -///This command will be replaced to allow arbitrary collision shape types -struct CreateBoxShapeArgs -{ - double m_halfExtentsX; - double m_halfExtentsY; - double m_halfExtentsZ; - - double m_mass; - int m_collisionShapeType; //see SharedMemoryPublic.h - - double m_initialPosition[3]; - double m_initialOrientation[4]; - double m_colorRGBA[4]; -}; - -struct b3ObjectArgs -{ - int m_numBodies; - int m_bodyUniqueIds[MAX_SDF_BODIES]; - int m_numUserConstraints; - int m_userConstraintUniqueIds[MAX_SDF_BODIES]; - int m_numUserCollisionShapes; - int m_userCollisionShapes[MAX_SDF_BODIES]; -}; - -struct b3Profile -{ - char m_name[MAX_FILENAME_LENGTH]; - int m_durationInMicroSeconds; - int m_type; -}; - -struct SdfLoadedArgs -{ - int m_numBodies; - int m_bodyUniqueIds[MAX_SDF_BODIES]; - int m_numUserConstraints; - int m_userConstraintUniqueIds[MAX_SDF_BODIES]; - - ///@todo(erwincoumans) load cameras, lights etc - //int m_numCameras; - //int m_numLights; -}; - -struct SdfRequestInfoArgs -{ - int m_bodyUniqueId; -}; - -///flags for b3ApplyExternalTorque and b3ApplyExternalForce -enum EnumExternalForcePrivateFlags -{ - // EF_LINK_FRAME=1, - // EF_WORLD_FRAME=2, - EF_TORQUE = 4, - EF_FORCE = 8, -}; - -struct ExternalForceArgs -{ - int m_numForcesAndTorques; - int m_bodyUniqueIds[MAX_SDF_BODIES]; - int m_linkIds[MAX_SDF_BODIES]; - double m_forcesAndTorques[3 * MAX_SDF_BODIES]; - double m_positions[3 * MAX_SDF_BODIES]; - int m_forceFlags[MAX_SDF_BODIES]; -}; - -enum EnumSdfRequestInfoFlags -{ - SDF_REQUEST_INFO_BODY = 1, - //SDF_REQUEST_INFO_CAMERA=2, -}; - -struct CalculateInverseDynamicsArgs -{ - int m_bodyUniqueId; - int m_dofCountQ; - int m_dofCountQdot; - double m_jointPositionsQ[MAX_DEGREE_OF_FREEDOM]; - double m_jointVelocitiesQdot[MAX_DEGREE_OF_FREEDOM]; - double m_jointAccelerations[MAX_DEGREE_OF_FREEDOM]; - int m_flags; -}; - -struct CalculateInverseDynamicsResultArgs -{ - int m_bodyUniqueId; - int m_dofCount; - double m_jointForces[MAX_DEGREE_OF_FREEDOM]; -}; - -struct CalculateJacobianArgs -{ - int m_bodyUniqueId; - int m_linkIndex; - double m_localPosition[3]; - double m_jointPositionsQ[MAX_DEGREE_OF_FREEDOM]; - double m_jointVelocitiesQdot[MAX_DEGREE_OF_FREEDOM]; - double m_jointAccelerations[MAX_DEGREE_OF_FREEDOM]; -}; - -struct CalculateJacobianResultArgs -{ - int m_dofCount; - double m_linearJacobian[3 * MAX_DEGREE_OF_FREEDOM]; - double m_angularJacobian[3 * MAX_DEGREE_OF_FREEDOM]; -}; - -struct CalculateMassMatrixArgs -{ - int m_bodyUniqueId; - double m_jointPositionsQ[MAX_DEGREE_OF_FREEDOM]; - int m_dofCountQ; - int m_flags; -}; - -struct CalculateMassMatrixResultArgs -{ - int m_dofCount; -}; - -enum b3EnumCollisionFilterFlags -{ - B3_COLLISION_FILTER_PAIR = 1, - B3_COLLISION_FILTER_GROUP_MASK = 2, -}; - -struct b3CollisionFilterArgs -{ - int m_bodyUniqueIdA; - int m_bodyUniqueIdB; - int m_linkIndexA; - int m_linkIndexB; - int m_enableCollision; - int m_collisionFilterGroup; - int m_collisionFilterMask; -}; - -struct CalculateInverseKinematicsArgs -{ - int m_bodyUniqueId; - // double m_jointPositionsQ[MAX_DEGREE_OF_FREEDOM]; - double m_targetPositions[MAX_DEGREE_OF_FREEDOM*3]; - int m_numEndEffectorLinkIndices; - double m_targetOrientation[MAX_DEGREE_OF_FREEDOM*4]; //orientation represented as quaternion, x,y,z,w - int m_endEffectorLinkIndices[MAX_DEGREE_OF_FREEDOM]; - double m_lowerLimit[MAX_DEGREE_OF_FREEDOM]; - double m_upperLimit[MAX_DEGREE_OF_FREEDOM]; - double m_jointRange[MAX_DEGREE_OF_FREEDOM]; - double m_restPose[MAX_DEGREE_OF_FREEDOM]; - double m_jointDamping[MAX_DEGREE_OF_FREEDOM]; - double m_currentPositions[MAX_DEGREE_OF_FREEDOM]; - int m_maxNumIterations; - double m_residualThreshold; -}; - -struct CalculateInverseKinematicsResultArgs -{ - int m_bodyUniqueId; - int m_dofCount; - double m_jointPositions[MAX_DEGREE_OF_FREEDOM]; -}; - - -enum EnumBodyChangeFlags -{ - BODY_DELETE_FLAG = 1, -}; - -enum EnumUserDebugDrawFlags -{ - USER_DEBUG_HAS_LINE = 1, - USER_DEBUG_HAS_TEXT = 2, - USER_DEBUG_REMOVE_ONE_ITEM = 4, - USER_DEBUG_REMOVE_ALL = 8, - USER_DEBUG_SET_CUSTOM_OBJECT_COLOR = 16, - USER_DEBUG_REMOVE_CUSTOM_OBJECT_COLOR = 32, - USER_DEBUG_ADD_PARAMETER = 64, - USER_DEBUG_READ_PARAMETER = 128, - USER_DEBUG_HAS_OPTION_FLAGS = 256, - USER_DEBUG_HAS_TEXT_ORIENTATION = 512, - USER_DEBUG_HAS_PARENT_OBJECT = 1024, - USER_DEBUG_HAS_REPLACE_ITEM_UNIQUE_ID = 2048, - USER_DEBUG_REMOVE_ALL_PARAMETERS = 4096, -}; - -struct UserDebugDrawArgs -{ - double m_debugLineFromXYZ[3]; - double m_debugLineToXYZ[3]; - double m_debugLineColorRGB[3]; - double m_lineWidth; - - double m_lifeTime; - int m_itemUniqueId; - - char m_text[MAX_FILENAME_LENGTH]; - double m_textPositionXYZ[3]; - double m_textOrientation[4]; - int m_parentObjectUniqueId; - int m_parentLinkIndex; - double m_textColorRGB[3]; - double m_textSize; - int m_optionFlags; - int m_replaceItemUniqueId; - - double m_rangeMin; - double m_rangeMax; - double m_startValue; - - double m_objectDebugColorRGB[3]; - int m_objectUniqueId; - int m_linkIndex; -}; - -struct UserDebugDrawResultArgs -{ - int m_debugItemUniqueId; - double m_parameterValue; -}; - -struct SendVREvents -{ - int m_numVRControllerEvents; - b3VRControllerEvent m_controllerEvents[MAX_VR_CONTROLLERS]; -}; - -struct SendKeyboardEvents -{ - int m_numKeyboardEvents; - b3KeyboardEvent m_keyboardEvents[MAX_KEYBOARD_EVENTS]; -}; - -struct SendMouseEvents -{ - int m_numMouseEvents; - b3MouseEvent m_mouseEvents[MAX_MOUSE_EVENTS]; -}; - -enum eVRCameraEnums -{ - VR_CAMERA_ROOT_POSITION = 1, - VR_CAMERA_ROOT_ORIENTATION = 2, - VR_CAMERA_ROOT_TRACKING_OBJECT = 4, - VR_CAMERA_FLAG = 8, -}; - -enum eStateLoggingEnums -{ - STATE_LOGGING_START_LOG = 1, - STATE_LOGGING_STOP_LOG = 2, - STATE_LOGGING_FILTER_OBJECT_UNIQUE_ID = 4, - STATE_LOGGING_MAX_LOG_DOF = 8, - STATE_LOGGING_FILTER_LINK_INDEX_A = 16, - STATE_LOGGING_FILTER_LINK_INDEX_B = 32, - STATE_LOGGING_FILTER_BODY_UNIQUE_ID_A = 64, - STATE_LOGGING_FILTER_BODY_UNIQUE_ID_B = 128, - STATE_LOGGING_FILTER_DEVICE_TYPE = 256, - STATE_LOGGING_LOG_FLAGS = 512 -}; - -struct VRCameraState -{ - double m_rootPosition[3]; - double m_rootOrientation[4]; - int m_trackingObjectUniqueId; - int m_trackingObjectFlag; -}; - -struct StateLoggingRequest -{ - char m_fileName[MAX_FILENAME_LENGTH]; - int m_logType; //Minitaur, generic robot, VR states, contact points - int m_numBodyUniqueIds; ////only if STATE_LOGGING_FILTER_OBJECT_UNIQUE_ID flag is set - int m_bodyUniqueIds[MAX_SDF_BODIES]; - int m_loggingUniqueId; - int m_maxLogDof; - int m_linkIndexA; // only if STATE_LOGGING_FILTER_LINK_INDEX_A flag is set - int m_linkIndexB; // only if STATE_LOGGING_FILTER_LINK_INDEX_B flag is set - int m_bodyUniqueIdA; // only if STATE_LOGGING_FILTER_BODY_UNIQUE_ID_A flag is set - int m_bodyUniqueIdB; // only if STATE_LOGGING_FILTER_BODY_UNIQUE_ID_B flag is set - int m_deviceFilterType; //user to select (filter) which VR devices to log - int m_logFlags; -}; - -struct StateLoggingResultArgs -{ - int m_loggingUniqueId; -}; - -enum InternalOpenGLVisualizerUpdateFlags -{ - COV_SET_CAMERA_VIEW_MATRIX = 1, - COV_SET_FLAGS = 2, - COV_SET_LIGHT_POSITION = 4, - COV_SET_SHADOWMAP_RESOLUTION = 8, - COV_SET_SHADOWMAP_WORLD_SIZE = 16, - COV_SET_REMOTE_SYNC_TRANSFORM_INTERVAL = 32, - COV_SET_SHADOWMAP_INTENSITY = 64, -}; - -struct ConfigureOpenGLVisualizerRequest -{ - double m_cameraDistance; - double m_cameraPitch; - double m_cameraYaw; - double m_cameraTargetPosition[3]; - double m_lightPosition[3]; - int m_shadowMapResolution; - int m_shadowMapWorldSize; - double m_remoteSyncTransformInterval; - int m_setFlag; - int m_setEnabled; - double m_shadowMapIntensity; -}; - -enum -{ - URDF_GEOM_HAS_RADIUS = 1, -}; - -struct b3CreateUserShapeData -{ - int m_type; //see UrdfGeomTypes - - int m_hasChildTransform; - double m_childPosition[3]; - double m_childOrientation[4]; - - double m_sphereRadius; - double m_boxHalfExtents[3]; - double m_capsuleRadius; - double m_capsuleHeight; - int m_hasFromTo; - double m_capsuleFrom[3]; - double m_capsuleTo[3]; - double m_planeNormal[3]; - double m_planeConstant; - - int m_meshFileType; - char m_meshFileName[VISUAL_SHAPE_MAX_PATH_LEN]; - double m_meshScale[3]; - int m_collisionFlags; - int m_visualFlags; - int m_numVertices; - int m_numIndices; - int m_numUVs; - int m_numNormals; - double m_heightfieldTextureScaling; - int m_numHeightfieldRows; - int m_numHeightfieldColumns; - double m_rgbaColor[4]; - double m_specularColor[3]; - int m_replaceHeightfieldIndex; -}; - -#define MAX_COMPOUND_COLLISION_SHAPES 16 - -struct b3CreateUserShapeArgs -{ - int m_numUserShapes; - b3CreateUserShapeData m_shapes[MAX_COMPOUND_COLLISION_SHAPES]; -}; - - - -struct b3CreateUserShapeResultArgs -{ - int m_userShapeUniqueId; -}; - -#define MAX_CREATE_MULTI_BODY_LINKS MAX_DEGREE_OF_FREEDOM -enum eCreateMultiBodyEnum -{ - MULTI_BODY_HAS_BASE = 1, - MULT_BODY_USE_MAXIMAL_COORDINATES = 2, - MULT_BODY_HAS_FLAGS = 4, -}; -struct b3CreateMultiBodyArgs -{ - char m_bodyName[1024]; - int m_baseLinkIndex; - - double m_linkPositions[3 * MAX_CREATE_MULTI_BODY_LINKS]; - double m_linkOrientations[4 * MAX_CREATE_MULTI_BODY_LINKS]; - - int m_numLinks; - double m_linkMasses[MAX_CREATE_MULTI_BODY_LINKS]; - double m_linkInertias[MAX_CREATE_MULTI_BODY_LINKS * 3]; - - double m_linkInertialFramePositions[MAX_CREATE_MULTI_BODY_LINKS * 3]; - double m_linkInertialFrameOrientations[MAX_CREATE_MULTI_BODY_LINKS * 4]; - - int m_linkCollisionShapeUniqueIds[MAX_CREATE_MULTI_BODY_LINKS]; - int m_linkVisualShapeUniqueIds[MAX_CREATE_MULTI_BODY_LINKS]; - int m_linkParentIndices[MAX_CREATE_MULTI_BODY_LINKS]; - int m_linkJointTypes[MAX_CREATE_MULTI_BODY_LINKS]; - double m_linkJointAxis[3 * MAX_CREATE_MULTI_BODY_LINKS]; - int m_flags; - int m_numBatchObjects; - -}; - -struct b3CreateMultiBodyResultArgs -{ - int m_bodyUniqueId; -}; - -struct b3ChangeTextureArgs -{ - int m_textureUniqueId; - int m_width; - int m_height; -}; - -struct b3StateSerializationArguments -{ - char m_fileName[MAX_URDF_FILENAME_LENGTH]; - int m_stateId; -}; - -struct SyncUserDataRequestArgs -{ - // The number of bodies for which we'd like to sync the user data of. When 0, all bodies are synced. - int m_numRequestedBodies; - // The body IDs for which we'd like to sync the user data of. - int m_requestedBodyIds[MAX_REQUESTED_BODIES_LENGTH]; -}; - -struct SyncUserDataArgs -{ - // User data identifiers stored in m_bulletStreamDataServerToClientRefactor - // as as array of integers. - int m_numUserDataIdentifiers; - // Whether the client should clear its user data cache. - bool m_clearCachedUserDataEntries; -}; - -struct UserDataRequestArgs -{ - int m_userDataId; -}; - -struct UserDataResponseArgs -{ - int m_userDataId; - int m_bodyUniqueId; - int m_linkIndex; - int m_visualShapeIndex; - int m_valueType; - int m_valueLength; - char m_key[MAX_USER_DATA_KEY_LENGTH]; - // Value data stored in m_bulletStreamDataServerToClientRefactor. -}; - -struct AddUserDataRequestArgs -{ - int m_bodyUniqueId; - int m_linkIndex; - int m_visualShapeIndex; - int m_valueType; - int m_valueLength; - char m_key[MAX_USER_DATA_KEY_LENGTH]; - // Value data stored in m_bulletStreamDataServerToClientRefactor. -}; - -struct b3RequestMeshDataArgs -{ - int m_bodyUniqueId; - int m_linkIndex; - int m_startingVertex; - int m_collisionShapeIndex; - int m_flags; -}; - -struct b3SendMeshDataArgs -{ - int m_numVerticesCopied; - int m_startingVertex; - int m_numVerticesRemaining; -}; - -struct SharedMemoryCommand -{ - int m_type; - smUint64_t m_timeStamp; - int m_sequenceNumber; - - //m_updateFlags is a bit fields to tell which parameters need updating - //for example m_updateFlags = SIM_PARAM_UPDATE_DELTA_TIME | SIM_PARAM_UPDATE_NUM_SOLVER_ITERATIONS; - int m_updateFlags; - - union { - struct UrdfArgs m_urdfArguments; - struct SdfArgs m_sdfArguments; - struct MjcfArgs m_mjcfArguments; - struct FileArgs m_fileArguments; - struct SdfRequestInfoArgs m_sdfRequestInfoArgs; - struct ChangeDynamicsInfoArgs m_changeDynamicsInfoArgs; - struct GetDynamicsInfoArgs m_getDynamicsInfoArgs; - struct InitPoseArgs m_initPoseArgs; - struct b3PhysicsSimulationParameters m_physSimParamArgs; - struct BulletDataStreamArgs m_dataStreamArguments; - struct SendDesiredStateArgs m_sendDesiredStateCommandArgument; - struct RequestActualStateArgs m_requestActualStateInformationCommandArgument; - struct CreateSensorArgs m_createSensorArguments; - struct CreateBoxShapeArgs m_createBoxShapeArguments; - struct RequestDebugLinesArgs m_requestDebugLinesArguments; - struct RequestPixelDataArgs m_requestPixelDataArguments; - struct PickBodyArgs m_pickBodyArguments; - struct ExternalForceArgs m_externalForceArguments; - struct CalculateInverseDynamicsArgs m_calculateInverseDynamicsArguments; - struct CalculateJacobianArgs m_calculateJacobianArguments; - struct CalculateMassMatrixArgs m_calculateMassMatrixArguments; - struct b3UserConstraint m_userConstraintArguments; - struct RequestContactDataArgs m_requestContactPointArguments; - struct RequestOverlappingObjectsArgs m_requestOverlappingObjectsArgs; - struct RequestVisualShapeDataArgs m_requestVisualShapeDataArguments; - struct UpdateVisualShapeDataArgs m_updateVisualShapeDataArguments; - struct LoadTextureArgs m_loadTextureArguments; - struct CalculateInverseKinematicsArgs m_calculateInverseKinematicsArguments; - struct UserDebugDrawArgs m_userDebugDrawArgs; - struct RequestRaycastIntersections m_requestRaycastIntersections; - struct LoadSoftBodyArgs m_loadSoftBodyArguments; - struct VRCameraState m_vrCameraStateArguments; - struct StateLoggingRequest m_stateLoggingArguments; - struct ConfigureOpenGLVisualizerRequest m_configureOpenGLVisualizerArguments; - struct b3ObjectArgs m_removeObjectArgs; - struct b3Profile m_profile; - struct b3CreateUserShapeArgs m_createUserShapeArgs; - struct b3CreateMultiBodyArgs m_createMultiBodyArgs; - struct b3RequestCollisionInfoArgs m_requestCollisionInfoArgs; - struct b3ChangeTextureArgs m_changeTextureArgs; - struct b3SearchPathfArgs m_searchPathArgs; - struct b3CustomCommand m_customCommandArgs; - struct b3StateSerializationArguments m_loadStateArguments; - struct RequestCollisionShapeDataArgs m_requestCollisionShapeDataArguments; - struct SyncUserDataRequestArgs m_syncUserDataRequestArgs; - struct UserDataRequestArgs m_userDataRequestArgs; - struct AddUserDataRequestArgs m_addUserDataRequestArgs; - struct UserDataRequestArgs m_removeUserDataRequestArgs; - struct b3CollisionFilterArgs m_collisionFilterArgs; - struct b3RequestMeshDataArgs m_requestMeshDataArgs; - }; -}; - -struct RigidBodyCreateArgs -{ - int m_bodyUniqueId; -}; - -struct SendContactDataArgs -{ - int m_startingContactPointIndex; - int m_numContactPointsCopied; - int m_numRemainingContactPoints; -}; - -struct SendOverlappingObjectsArgs -{ - int m_startingOverlappingObjectIndex; - int m_numOverlappingObjectsCopied; - int m_numRemainingOverlappingObjects; -}; - -struct SharedMemoryStatus -{ - int m_type; - - smUint64_t m_timeStamp; - int m_sequenceNumber; - - //m_streamBytes is only for internal purposes - int m_numDataStreamBytes; - char* m_dataStream; - - //m_updateFlags is a bit fields to tell which parameters were updated, - //m_updateFlags is ignored for most status messages - int m_updateFlags; - - union { - struct BulletDataStreamArgs m_dataStreamArguments; - struct SdfLoadedArgs m_sdfLoadedArgs; - struct SendActualStateArgs m_sendActualStateArgs; - struct SendDebugLinesArgs m_sendDebugLinesArgs; - struct SendPixelDataArgs m_sendPixelDataArguments; - struct RigidBodyCreateArgs m_rigidBodyCreateArgs; - struct CalculateInverseDynamicsResultArgs m_inverseDynamicsResultArgs; - struct CalculateJacobianResultArgs m_jacobianResultArgs; - struct CalculateMassMatrixResultArgs m_massMatrixResultArgs; - struct SendContactDataArgs m_sendContactPointArgs; - struct SendOverlappingObjectsArgs m_sendOverlappingObjectsArgs; - struct CalculateInverseKinematicsResultArgs m_inverseKinematicsResultArgs; - struct SendVisualShapeDataArgs m_sendVisualShapeArgs; - struct UserDebugDrawResultArgs m_userDebugDrawArgs; - struct b3UserConstraint m_userConstraintResultArgs; - struct b3UserConstraintState m_userConstraintStateResultArgs; - struct SendVREvents m_sendVREvents; - struct SendKeyboardEvents m_sendKeyboardEvents; - struct SendRaycastHits m_raycastHits; - struct StateLoggingResultArgs m_stateLoggingResultArgs; - struct b3OpenGLVisualizerCameraInfo m_visualizerCameraResultArgs; - struct b3ObjectArgs m_removeObjectArgs; - struct b3DynamicsInfo m_dynamicsInfo; - struct b3CreateUserShapeResultArgs m_createUserShapeResultArgs; - struct b3CreateMultiBodyResultArgs m_createMultiBodyResultArgs; - struct b3SendCollisionInfoArgs m_sendCollisionInfoArgs; - struct SendMouseEvents m_sendMouseEvents; - struct b3LoadTextureResultArgs m_loadTextureResultArguments; - struct b3CustomCommandResultArgs m_customCommandResultArgs; - struct b3PhysicsSimulationParameters m_simulationParameterResultArgs; - struct b3StateSerializationArguments m_saveStateResultArgs; - struct b3LoadSoftBodyResultArgs m_loadSoftBodyResultArguments; - struct SendCollisionShapeDataArgs m_sendCollisionShapeArgs; - struct SyncUserDataArgs m_syncUserDataArgs; - struct UserDataResponseArgs m_userDataResponseArgs; - struct UserDataRequestArgs m_removeUserDataResponseArgs; - struct b3ForwardDynamicsAnalyticsArgs m_forwardDynamicsAnalyticsArgs; - struct b3SendMeshDataArgs m_sendMeshDataArgs; - }; -}; - -typedef struct SharedMemoryStatus SharedMemoryStatus_t; - -#endif //SHARED_MEMORY_COMMANDS_H diff --git a/engine/inc/bullet/SharedMemory/SharedMemoryCommon.h b/engine/inc/bullet/SharedMemory/SharedMemoryCommon.h deleted file mode 100644 index d31f0fe9..00000000 --- a/engine/inc/bullet/SharedMemory/SharedMemoryCommon.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef SHARED_MEMORY_COMMON_H -#define SHARED_MEMORY_COMMON_H - -#include "../CommonInterfaces/CommonMultiBodyBase.h" - -class SharedMemoryCommon : public CommonExampleInterface -{ -protected: - struct GUIHelperInterface* m_guiHelper; - -public: - SharedMemoryCommon(GUIHelperInterface* helper) - : m_guiHelper(helper) - { - } - - virtual void setSharedMemoryKey(int key) = 0; - virtual bool wantsTermination() = 0; - virtual bool isConnected() = 0; -}; -#endif // diff --git a/engine/inc/bullet/SharedMemory/SharedMemoryInProcessPhysicsC_API.h b/engine/inc/bullet/SharedMemory/SharedMemoryInProcessPhysicsC_API.h deleted file mode 100644 index 7b7472b4..00000000 --- a/engine/inc/bullet/SharedMemory/SharedMemoryInProcessPhysicsC_API.h +++ /dev/null @@ -1,43 +0,0 @@ - -#ifndef IN_PROCESS_PHYSICS_C_API_H -#define IN_PROCESS_PHYSICS_C_API_H - -#include "PhysicsClientC_API.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - - ///think more about naming. The b3ConnectPhysicsLoopback - B3_SHARED_API b3PhysicsClientHandle b3CreateInProcessPhysicsServerAndConnect(int argc, char* argv[]); - B3_SHARED_API b3PhysicsClientHandle b3CreateInProcessPhysicsServerAndConnectMainThread(int argc, char* argv[]); - - B3_SHARED_API b3PhysicsClientHandle b3CreateInProcessPhysicsServerAndConnectSharedMemory(int argc, char* argv[]); - B3_SHARED_API b3PhysicsClientHandle b3CreateInProcessPhysicsServerAndConnectMainThreadSharedMemory(int argc, char* argv[]); - - B3_SHARED_API b3PhysicsClientHandle b3CreateInProcessGraphicsServerAndConnectSharedMemory(int port); - B3_SHARED_API b3PhysicsClientHandle b3CreateInProcessGraphicsServerAndConnectMainThreadSharedMemory(int port); - - - B3_SHARED_API b3PhysicsClientHandle b3CreateInProcessPhysicsServerFromExistingExampleBrowserAndConnect(void* guiHelperPtr); - //create a shared memory physics server, with a DummyGUIHelper (no graphics) - B3_SHARED_API b3PhysicsClientHandle b3CreateInProcessPhysicsServerFromExistingExampleBrowserAndConnect2(void* guiHelperPtr); - //create a shared memory physics server, with a DummyGUIHelper (no graphics) and allow to set shared memory key - B3_SHARED_API b3PhysicsClientHandle b3CreateInProcessPhysicsServerFromExistingExampleBrowserAndConnect3(void* guiHelperPtr, int sharedMemoryKey); - //create a shared memory physics server, with a RemoteGUIHelper (connect to remote graphics server) and allow to set shared memory key - B3_SHARED_API b3PhysicsClientHandle b3CreateInProcessPhysicsServerFromExistingExampleBrowserAndConnect4(void* guiHelperPtr, int sharedMemoryKey); -#ifdef BT_ENABLE_CLSOCKET - B3_SHARED_API b3PhysicsClientHandle b3CreateInProcessPhysicsServerFromExistingExampleBrowserAndConnectTCP(const char* hostName, int port); -#endif - ///ignore the following APIs, they are for internal use for example browser - void b3InProcessRenderSceneInternal(b3PhysicsClientHandle clientHandle); - void b3InProcessDebugDrawInternal(b3PhysicsClientHandle clientHandle, int debugDrawMode); - int b3InProcessMouseMoveCallback(b3PhysicsClientHandle clientHandle, float x, float y); - int b3InProcessMouseButtonCallback(b3PhysicsClientHandle clientHandle, int button, int state, float x, float y); - -#ifdef __cplusplus -} -#endif - -#endif //IN_PROCESS_PHYSICS_C_API_H diff --git a/engine/inc/bullet/SharedMemory/SharedMemoryInterface.h b/engine/inc/bullet/SharedMemory/SharedMemoryInterface.h deleted file mode 100644 index af3f3297..00000000 --- a/engine/inc/bullet/SharedMemory/SharedMemoryInterface.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef SHARED_MEMORY_INTERFACE_H -#define SHARED_MEMORY_INTERFACE_H - -class SharedMemoryInterface -{ -public: - virtual ~SharedMemoryInterface() - { - } - - virtual void* allocateSharedMemory(int key, int size, bool allowCreation) = 0; - virtual void releaseSharedMemory(int key, int size) = 0; -}; - -#endif diff --git a/engine/inc/bullet/SharedMemory/SharedMemoryPublic.h b/engine/inc/bullet/SharedMemory/SharedMemoryPublic.h deleted file mode 100644 index 775f9f70..00000000 --- a/engine/inc/bullet/SharedMemory/SharedMemoryPublic.h +++ /dev/null @@ -1,1115 +0,0 @@ -#ifndef SHARED_MEMORY_PUBLIC_H -#define SHARED_MEMORY_PUBLIC_H - -#define SHARED_MEMORY_KEY 12347 -///increase the SHARED_MEMORY_MAGIC_NUMBER whenever incompatible changes are made in the structures -///my convention is year/month/day/rev -//Please don't replace an existing magic number: -//instead, only ADD a new one at the top, comment-out previous one - - - -#define SHARED_MEMORY_MAGIC_NUMBER 202010061 -//#define SHARED_MEMORY_MAGIC_NUMBER 202007060 -//#define SHARED_MEMORY_MAGIC_NUMBER 202005070 -//#define SHARED_MEMORY_MAGIC_NUMBER 202002030 -//#define SHARED_MEMORY_MAGIC_NUMBER 202001230 -//#define SHARED_MEMORY_MAGIC_NUMBER 201911280 -//#define SHARED_MEMORY_MAGIC_NUMBER 201911180 -//#define SHARED_MEMORY_MAGIC_NUMBER 201909030 -//#define SHARED_MEMORY_MAGIC_NUMBER 201908110 -//#define SHARED_MEMORY_MAGIC_NUMBER 201908050 -//#define SHARED_MEMORY_MAGIC_NUMBER 2019060190 -//#define SHARED_MEMORY_MAGIC_NUMBER 201904030 -//#define SHARED_MEMORY_MAGIC_NUMBER 201902120 -//#define SHARED_MEMORY_MAGIC_NUMBER 201811260 -//#define SHARED_MEMORY_MAGIC_NUMBER 201810250 -//#define SHARED_MEMORY_MAGIC_NUMBER 201809030 -//#define SHARED_MEMORY_MAGIC_NUMBER 201809010 -//#define SHARED_MEMORY_MAGIC_NUMBER 201807040 -//#define SHARED_MEMORY_MAGIC_NUMBER 201806150 -//#define SHARED_MEMORY_MAGIC_NUMBER 201806020 -//#define SHARED_MEMORY_MAGIC_NUMBER 201801170 -//#define SHARED_MEMORY_MAGIC_NUMBER 201801080 -//#define SHARED_MEMORY_MAGIC_NUMBER 201801010 -//#define SHARED_MEMORY_MAGIC_NUMBER 201710180 -//#define SHARED_MEMORY_MAGIC_NUMBER 201710050 -//#define SHARED_MEMORY_MAGIC_NUMBER 201708270 -//#define SHARED_MEMORY_MAGIC_NUMBER 201707140 -//#define SHARED_MEMORY_MAGIC_NUMBER 201706015 -//#define SHARED_MEMORY_MAGIC_NUMBER 201706001 -//#define SHARED_MEMORY_MAGIC_NUMBER 201703024 - -enum EnumSharedMemoryClientCommand -{ - CMD_INVALID = 0, - CMD_LOAD_SDF, - CMD_LOAD_URDF, - CMD_LOAD_BULLET, - CMD_SAVE_BULLET, - CMD_LOAD_MJCF, - CMD_LOAD_SOFT_BODY, - CMD_SEND_BULLET_DATA_STREAM, - CMD_CREATE_BOX_COLLISION_SHAPE, - CMD_CREATE_RIGID_BODY, - CMD_DELETE_RIGID_BODY, - CMD_CREATE_SENSOR, ///enable or disable joint feedback for force/torque sensors - CMD_INIT_POSE, - CMD_SEND_PHYSICS_SIMULATION_PARAMETERS, - CMD_SEND_DESIRED_STATE, //todo: reconsider naming, for example SET_JOINT_CONTROL_VARIABLE? - CMD_REQUEST_ACTUAL_STATE, - CMD_REQUEST_DEBUG_LINES, - CMD_REQUEST_BODY_INFO, - CMD_REQUEST_INTERNAL_DATA, - CMD_STEP_FORWARD_SIMULATION, - CMD_RESET_SIMULATION, - CMD_PICK_BODY, - CMD_MOVE_PICKED_BODY, - CMD_REMOVE_PICKING_CONSTRAINT_BODY, - CMD_REQUEST_CAMERA_IMAGE_DATA, - CMD_APPLY_EXTERNAL_FORCE, - CMD_CALCULATE_INVERSE_DYNAMICS, - CMD_CALCULATE_INVERSE_KINEMATICS, - CMD_CALCULATE_JACOBIAN, - CMD_CALCULATE_MASS_MATRIX, - CMD_USER_CONSTRAINT, - CMD_REQUEST_CONTACT_POINT_INFORMATION, - CMD_REQUEST_RAY_CAST_INTERSECTIONS, - - CMD_REQUEST_AABB_OVERLAP, - - CMD_SAVE_WORLD, - CMD_REQUEST_VISUAL_SHAPE_INFO, - CMD_UPDATE_VISUAL_SHAPE, - CMD_LOAD_TEXTURE, - CMD_SET_SHADOW, - CMD_USER_DEBUG_DRAW, - CMD_REQUEST_VR_EVENTS_DATA, - CMD_SET_VR_CAMERA_STATE, - CMD_SYNC_BODY_INFO, - CMD_STATE_LOGGING, - CMD_CONFIGURE_OPENGL_VISUALIZER, - CMD_REQUEST_KEYBOARD_EVENTS_DATA, - CMD_REQUEST_OPENGL_VISUALIZER_CAMERA, - CMD_REMOVE_BODY, - CMD_CHANGE_DYNAMICS_INFO, - CMD_GET_DYNAMICS_INFO, - CMD_PROFILE_TIMING, - CMD_CREATE_COLLISION_SHAPE, - CMD_CREATE_VISUAL_SHAPE, - CMD_CREATE_MULTI_BODY, - CMD_REQUEST_COLLISION_INFO, - CMD_REQUEST_MOUSE_EVENTS_DATA, - CMD_CHANGE_TEXTURE, - CMD_SET_ADDITIONAL_SEARCH_PATH, - CMD_CUSTOM_COMMAND, - CMD_REQUEST_PHYSICS_SIMULATION_PARAMETERS, - CMD_SAVE_STATE, - CMD_RESTORE_STATE, - CMD_REMOVE_STATE, - CMD_REQUEST_COLLISION_SHAPE_INFO, - - CMD_SYNC_USER_DATA, - CMD_REQUEST_USER_DATA, - CMD_ADD_USER_DATA, - CMD_REMOVE_USER_DATA, - CMD_COLLISION_FILTER, - CMD_REQUEST_MESH_DATA, - - //don't go beyond this command! - CMD_MAX_CLIENT_COMMANDS, -}; - -enum EnumSharedMemoryServerStatus -{ - CMD_SHARED_MEMORY_NOT_INITIALIZED = 0, - CMD_WAITING_FOR_CLIENT_COMMAND, - //CMD_CLIENT_COMMAND_COMPLETED is a generic 'completed' status that doesn't need special handling on the client - CMD_CLIENT_COMMAND_COMPLETED, - //the server will skip unknown command and report a status 'CMD_UNKNOWN_COMMAND_FLUSHED' - CMD_UNKNOWN_COMMAND_FLUSHED, - CMD_SDF_LOADING_COMPLETED, - CMD_SDF_LOADING_FAILED, - CMD_URDF_LOADING_COMPLETED, - CMD_URDF_LOADING_FAILED, - CMD_BULLET_LOADING_COMPLETED, - CMD_BULLET_LOADING_FAILED, - CMD_BULLET_SAVING_COMPLETED, - CMD_BULLET_SAVING_FAILED, - CMD_MJCF_LOADING_COMPLETED, - CMD_MJCF_LOADING_FAILED, - CMD_REQUEST_INTERNAL_DATA_COMPLETED, - CMD_REQUEST_INTERNAL_DATA_FAILED, - CMD_BULLET_DATA_STREAM_RECEIVED_COMPLETED, - CMD_BULLET_DATA_STREAM_RECEIVED_FAILED, - CMD_BOX_COLLISION_SHAPE_CREATION_COMPLETED, - CMD_RIGID_BODY_CREATION_COMPLETED, - CMD_SET_JOINT_FEEDBACK_COMPLETED, - CMD_ACTUAL_STATE_UPDATE_COMPLETED, - CMD_ACTUAL_STATE_UPDATE_FAILED, - CMD_DEBUG_LINES_COMPLETED, - CMD_DEBUG_LINES_OVERFLOW_FAILED, - CMD_DESIRED_STATE_RECEIVED_COMPLETED, - CMD_STEP_FORWARD_SIMULATION_COMPLETED, - CMD_RESET_SIMULATION_COMPLETED, - CMD_CAMERA_IMAGE_COMPLETED, - CMD_CAMERA_IMAGE_FAILED, - CMD_BODY_INFO_COMPLETED, - CMD_BODY_INFO_FAILED, - CMD_INVALID_STATUS, - CMD_CALCULATED_INVERSE_DYNAMICS_COMPLETED, - CMD_CALCULATED_INVERSE_DYNAMICS_FAILED, - CMD_CALCULATED_JACOBIAN_COMPLETED, - CMD_CALCULATED_JACOBIAN_FAILED, - CMD_CALCULATED_MASS_MATRIX_COMPLETED, - CMD_CALCULATED_MASS_MATRIX_FAILED, - CMD_CONTACT_POINT_INFORMATION_COMPLETED, - CMD_CONTACT_POINT_INFORMATION_FAILED, - CMD_REQUEST_AABB_OVERLAP_COMPLETED, - CMD_REQUEST_AABB_OVERLAP_FAILED, - CMD_CALCULATE_INVERSE_KINEMATICS_COMPLETED, - CMD_CALCULATE_INVERSE_KINEMATICS_FAILED, - CMD_SAVE_WORLD_COMPLETED, - CMD_SAVE_WORLD_FAILED, - CMD_VISUAL_SHAPE_INFO_COMPLETED, - CMD_VISUAL_SHAPE_INFO_FAILED, - CMD_VISUAL_SHAPE_UPDATE_COMPLETED, - CMD_VISUAL_SHAPE_UPDATE_FAILED, - CMD_LOAD_TEXTURE_COMPLETED, - CMD_LOAD_TEXTURE_FAILED, - CMD_USER_DEBUG_DRAW_COMPLETED, - CMD_USER_DEBUG_DRAW_PARAMETER_COMPLETED, - CMD_USER_DEBUG_DRAW_FAILED, - CMD_USER_CONSTRAINT_COMPLETED, - CMD_USER_CONSTRAINT_INFO_COMPLETED, - CMD_USER_CONSTRAINT_REQUEST_STATE_COMPLETED, - CMD_REMOVE_USER_CONSTRAINT_COMPLETED, - CMD_CHANGE_USER_CONSTRAINT_COMPLETED, - CMD_REMOVE_USER_CONSTRAINT_FAILED, - CMD_CHANGE_USER_CONSTRAINT_FAILED, - CMD_USER_CONSTRAINT_FAILED, - CMD_REQUEST_VR_EVENTS_DATA_COMPLETED, - CMD_REQUEST_RAY_CAST_INTERSECTIONS_COMPLETED, - CMD_SYNC_BODY_INFO_COMPLETED, - CMD_SYNC_BODY_INFO_FAILED, - CMD_STATE_LOGGING_COMPLETED, - CMD_STATE_LOGGING_START_COMPLETED, - CMD_STATE_LOGGING_FAILED, - CMD_REQUEST_KEYBOARD_EVENTS_DATA_COMPLETED, - CMD_REQUEST_KEYBOARD_EVENTS_DATA_FAILED, - CMD_REQUEST_OPENGL_VISUALIZER_CAMERA_FAILED, - CMD_REQUEST_OPENGL_VISUALIZER_CAMERA_COMPLETED, - CMD_REMOVE_BODY_COMPLETED, - CMD_REMOVE_BODY_FAILED, - CMD_GET_DYNAMICS_INFO_COMPLETED, - CMD_GET_DYNAMICS_INFO_FAILED, - CMD_CREATE_COLLISION_SHAPE_FAILED, - CMD_CREATE_COLLISION_SHAPE_COMPLETED, - CMD_CREATE_VISUAL_SHAPE_FAILED, - CMD_CREATE_VISUAL_SHAPE_COMPLETED, - CMD_CREATE_MULTI_BODY_FAILED, - CMD_CREATE_MULTI_BODY_COMPLETED, - CMD_REQUEST_COLLISION_INFO_COMPLETED, - CMD_REQUEST_COLLISION_INFO_FAILED, - CMD_REQUEST_MOUSE_EVENTS_DATA_COMPLETED, - CMD_CHANGE_TEXTURE_COMMAND_FAILED, - CMD_CUSTOM_COMMAND_COMPLETED, - CMD_CUSTOM_COMMAND_FAILED, - CMD_REQUEST_PHYSICS_SIMULATION_PARAMETERS_COMPLETED, - CMD_SAVE_STATE_FAILED, - CMD_SAVE_STATE_COMPLETED, - CMD_RESTORE_STATE_FAILED, - CMD_RESTORE_STATE_COMPLETED, - CMD_COLLISION_SHAPE_INFO_COMPLETED, - CMD_COLLISION_SHAPE_INFO_FAILED, - CMD_LOAD_SOFT_BODY_FAILED, - CMD_LOAD_SOFT_BODY_COMPLETED, - - CMD_SYNC_USER_DATA_COMPLETED, - CMD_SYNC_USER_DATA_FAILED, - CMD_REQUEST_USER_DATA_COMPLETED, - CMD_REQUEST_USER_DATA_FAILED, - CMD_ADD_USER_DATA_COMPLETED, - CMD_ADD_USER_DATA_FAILED, - CMD_REMOVE_USER_DATA_COMPLETED, - CMD_REMOVE_USER_DATA_FAILED, - CMD_REMOVE_STATE_COMPLETED, - CMD_REMOVE_STATE_FAILED, - - CMD_REQUEST_MESH_DATA_COMPLETED, - CMD_REQUEST_MESH_DATA_FAILED, - - //don't go beyond 'CMD_MAX_SERVER_COMMANDS! - CMD_MAX_SERVER_COMMANDS -}; - -enum JointInfoFlags -{ - JOINT_HAS_MOTORIZED_POWER = 1, -}; - -enum -{ - COLLISION_SHAPE_TYPE_BOX = 1, - COLLISION_SHAPE_TYPE_CYLINDER_X, - COLLISION_SHAPE_TYPE_CYLINDER_Y, - COLLISION_SHAPE_TYPE_CYLINDER_Z, - COLLISION_SHAPE_TYPE_CAPSULE_X, - COLLISION_SHAPE_TYPE_CAPSULE_Y, - COLLISION_SHAPE_TYPE_CAPSULE_Z, - COLLISION_SHAPE_TYPE_SPHERE -}; - -// copied from btMultiBodyLink.h -enum JointType -{ - eRevoluteType = 0, - ePrismaticType = 1, - eSphericalType = 2, - ePlanarType = 3, - eFixedType = 4, - ePoint2PointType = 5, - eGearType = 6 -}; - -enum b3JointInfoFlags -{ - eJointChangeMaxForce = 1, - eJointChangeChildFramePosition = 2, - eJointChangeChildFrameOrientation = 4, -}; - -struct b3JointInfo -{ - char m_linkName[1024]; - char m_jointName[1024]; - int m_jointType; - int m_qIndex; - int m_uIndex; - int m_jointIndex; - int m_flags; - double m_jointDamping; - double m_jointFriction; - double m_jointLowerLimit; - double m_jointUpperLimit; - double m_jointMaxForce; - double m_jointMaxVelocity; - double m_parentFrame[7]; // position and orientation (quaternion) - double m_childFrame[7]; // ^^^ - double m_jointAxis[3]; // joint axis in parent local frame - int m_parentIndex; - int m_qSize; - int m_uSize; -}; - -enum UserDataValueType -{ - // Data represents generic byte array. - USER_DATA_VALUE_TYPE_BYTES = 0, - // Data represents C-string - USER_DATA_VALUE_TYPE_STRING = 1, -}; - -struct b3UserDataValue -{ - int m_type; - int m_length; - const char* m_data1; -}; - -enum EnumUserConstraintFlags -{ - USER_CONSTRAINT_ADD_CONSTRAINT = 1, - USER_CONSTRAINT_REMOVE_CONSTRAINT = 2, - USER_CONSTRAINT_CHANGE_CONSTRAINT = 4, - USER_CONSTRAINT_CHANGE_PIVOT_IN_B = 8, - USER_CONSTRAINT_CHANGE_FRAME_ORN_IN_B = 16, - USER_CONSTRAINT_CHANGE_MAX_FORCE = 32, - USER_CONSTRAINT_REQUEST_INFO = 64, - USER_CONSTRAINT_CHANGE_GEAR_RATIO = 128, - USER_CONSTRAINT_CHANGE_GEAR_AUX_LINK = 256, - USER_CONSTRAINT_CHANGE_RELATIVE_POSITION_TARGET = 512, - USER_CONSTRAINT_CHANGE_ERP = 1024, - USER_CONSTRAINT_REQUEST_STATE = 2048, - USER_CONSTRAINT_ADD_SOFT_BODY_ANCHOR = 4096, -}; - -struct b3UserConstraint -{ - int m_parentBodyIndex; - int m_parentJointIndex; - int m_childBodyIndex; - int m_childJointIndex; - double m_parentFrame[7]; - double m_childFrame[7]; - double m_jointAxis[3]; - int m_jointType; - double m_maxAppliedForce; - int m_userConstraintUniqueId; - double m_gearRatio; - int m_gearAuxLink; - double m_relativePositionTarget; - double m_erp; -}; - -struct b3BodyInfo -{ - char m_baseName[1024]; - char m_bodyName[1024]; // for btRigidBody, it does not have a base, but can still have a body name from urdf -}; - -enum DynamicsActivationState -{ - eActivationStateEnableSleeping = 1, - eActivationStateDisableSleeping = 2, - eActivationStateWakeUp = 4, - eActivationStateSleep = 8, - eActivationStateEnableWakeup = 16, - eActivationStateDisableWakeup = 32, -}; - -enum b3BodyType -{ - BT_RIGID_BODY = 1, - BT_MULTI_BODY = 2, - BT_SOFT_BODY = 3, -}; - -struct b3DynamicsInfo -{ - double m_mass; - double m_localInertialDiagonal[3]; - double m_localInertialFrame[7]; - double m_lateralFrictionCoeff; - - double m_rollingFrictionCoeff; - double m_spinningFrictionCoeff; - double m_restitution; - double m_contactStiffness; - double m_contactDamping; - int m_activationState; - int m_bodyType; - double m_angularDamping; - double m_linearDamping; - double m_ccdSweptSphereRadius; - double m_contactProcessingThreshold; - int m_frictionAnchor; - double m_collisionMargin; - int m_dynamicType; -}; - -// copied from btMultiBodyLink.h -enum SensorType -{ - eSensorForceTorqueType = 1, -}; - -struct b3JointSensorState -{ - double m_jointPosition; - double m_jointVelocity; - double m_jointForceTorque[6]; /* note to roboticists: this is NOT the motor torque/force, but the spatial reaction force vector at joint */ - double m_jointMotorTorque; -}; - -struct b3JointSensorState2 -{ - double m_jointPosition[4]; - double m_jointVelocity[3]; - double m_jointReactionForceTorque[6]; /* note to roboticists: this is NOT the motor torque/force, but the spatial reaction force vector at joint */ - double m_jointMotorTorqueMultiDof[3]; - int m_qDofSize; - int m_uDofSize; -}; - -struct b3DebugLines -{ - int m_numDebugLines; - const float* m_linesFrom; //float x,y,z times 'm_numDebugLines'. - const float* m_linesTo; //float x,y,z times 'm_numDebugLines'. - const float* m_linesColor; //float red,green,blue times 'm_numDebugLines'. -}; - -struct b3OverlappingObject -{ - int m_objectUniqueId; - int m_linkIndex; -}; - -struct b3AABBOverlapData -{ - int m_numOverlappingObjects; - struct b3OverlappingObject* m_overlappingObjects; -}; - -struct b3CameraImageData -{ - int m_pixelWidth; - int m_pixelHeight; - const unsigned char* m_rgbColorData; //3*m_pixelWidth*m_pixelHeight bytes - const float* m_depthValues; //m_pixelWidth*m_pixelHeight floats - const int* m_segmentationMaskValues; //m_pixelWidth*m_pixelHeight ints -}; - -struct b3MeshVertex -{ - double x, y, z, w; -}; - - -enum eMeshDataFlags -{ - B3_MESH_DATA_SIMULATION_MESH=1, - B3_MESH_DATA_SIMULATION_INDICES, - B3_MESH_DATA_GRAPHICS_INDICES, -}; - -enum eMeshDataEnum -{ - B3_MESH_DATA_COLLISIONSHAPEINDEX=1, - B3_MESH_DATA_FLAGS=2, -}; - -struct b3MeshData -{ - int m_numVertices; - struct b3MeshVertex* m_vertices; -}; - -struct b3OpenGLVisualizerCameraInfo -{ - int m_width; - int m_height; - float m_viewMatrix[16]; - float m_projectionMatrix[16]; - - float m_camUp[3]; - float m_camForward[3]; - - float m_horizontal[3]; - float m_vertical[3]; - - float m_yaw; - float m_pitch; - float m_dist; - float m_target[3]; -}; - -struct b3UserConstraintState -{ - double m_appliedConstraintForces[6]; - int m_numDofs; -}; - -enum b3VREventType -{ - VR_CONTROLLER_MOVE_EVENT = 1, - VR_CONTROLLER_BUTTON_EVENT = 2, - VR_HMD_MOVE_EVENT = 4, - VR_GENERIC_TRACKER_MOVE_EVENT = 8, -}; - -#define MAX_VR_ANALOG_AXIS 5 -#define MAX_VR_BUTTONS 64 -#define MAX_VR_CONTROLLERS 8 - -#define MAX_KEYBOARD_EVENTS 256 -#define MAX_MOUSE_EVENTS 256 - -#define MAX_SDF_BODIES 512 -#define MAX_USER_DATA_KEY_LENGTH 256 -#define MAX_REQUESTED_BODIES_LENGTH 256 - -enum b3VRButtonInfo -{ - eButtonIsDown = 1, - eButtonTriggered = 2, - eButtonReleased = 4, -}; - -enum eVRDeviceTypeEnums -{ - VR_DEVICE_CONTROLLER = 1, - VR_DEVICE_HMD = 2, - VR_DEVICE_GENERIC_TRACKER = 4, -}; - -enum EVRCameraFlags -{ - VR_CAMERA_TRACK_OBJECT_ORIENTATION = 1, -}; - -struct b3VRControllerEvent -{ - int m_controllerId; //valid for VR_CONTROLLER_MOVE_EVENT and VR_CONTROLLER_BUTTON_EVENT - int m_deviceType; - int m_numMoveEvents; - int m_numButtonEvents; - - float m_pos[4]; //valid for VR_CONTROLLER_MOVE_EVENT and VR_CONTROLLER_BUTTON_EVENT - float m_orn[4]; //valid for VR_CONTROLLER_MOVE_EVENT and VR_CONTROLLER_BUTTON_EVENT - - float m_analogAxis; //valid if VR_CONTROLLER_MOVE_EVENT - float m_auxAnalogAxis[MAX_VR_ANALOG_AXIS * 2]; //store x,y per axis, only valid if VR_CONTROLLER_MOVE_EVENT - int m_buttons[MAX_VR_BUTTONS]; //valid if VR_CONTROLLER_BUTTON_EVENT, see b3VRButtonInfo -}; - -struct b3VREventsData -{ - int m_numControllerEvents; - struct b3VRControllerEvent* m_controllerEvents; -}; - -struct b3KeyboardEvent -{ - int m_keyCode; //ascii - int m_keyState; // see b3VRButtonInfo -}; - -struct b3KeyboardEventsData -{ - int m_numKeyboardEvents; - struct b3KeyboardEvent* m_keyboardEvents; -}; - -enum eMouseEventTypeEnums -{ - MOUSE_MOVE_EVENT = 1, - MOUSE_BUTTON_EVENT = 2, -}; - -struct b3MouseEvent -{ - int m_eventType; - float m_mousePosX; - float m_mousePosY; - int m_buttonIndex; - int m_buttonState; -}; - -struct b3MouseEventsData -{ - int m_numMouseEvents; - struct b3MouseEvent* m_mouseEvents; -}; - -enum b3NotificationType -{ - SIMULATION_RESET = 0, - BODY_ADDED = 1, - BODY_REMOVED = 2, - USER_DATA_ADDED = 3, - USER_DATA_REMOVED = 4, - LINK_DYNAMICS_CHANGED = 5, - VISUAL_SHAPE_CHANGED = 6, - TRANSFORM_CHANGED = 7, - SIMULATION_STEPPED = 8, - SOFTBODY_CHANGED = 9, -}; - -enum b3ResetSimulationFlags -{ - RESET_USE_DEFORMABLE_WORLD=1, - RESET_USE_DISCRETE_DYNAMICS_WORLD=2, - RESET_USE_SIMPLE_BROADPHASE=4, -}; - -struct b3BodyNotificationArgs -{ - int m_bodyUniqueId; -}; - -struct b3UserDataNotificationArgs -{ - int m_bodyUniqueId; - int m_linkIndex; - int m_visualShapeIndex; - int m_userDataId; - char m_key[MAX_USER_DATA_KEY_LENGTH]; -}; - -struct b3LinkNotificationArgs -{ - int m_bodyUniqueId; - int m_linkIndex; -}; - -struct b3VisualShapeNotificationArgs -{ - int m_bodyUniqueId; - int m_linkIndex; - int m_visualShapeIndex; -}; - -struct b3TransformChangeNotificationArgs -{ - int m_bodyUniqueId; - int m_linkIndex; - double m_worldPosition[3]; - double m_worldRotation[4]; - double m_localScaling[3]; -}; - -struct b3SoftBodyChangeNotificationArgs -{ - int m_bodyUniqueId; - int m_linkIndex; -}; - -struct b3Notification -{ - int m_notificationType; - union { - struct b3BodyNotificationArgs m_bodyArgs; - struct b3UserDataNotificationArgs m_userDataArgs; - struct b3LinkNotificationArgs m_linkArgs; - struct b3VisualShapeNotificationArgs m_visualShapeArgs; - struct b3TransformChangeNotificationArgs m_transformChangeArgs; - struct b3SoftBodyChangeNotificationArgs m_softBodyChangeArgs; - }; -}; - -struct b3ContactPointData -{ - //todo: expose some contact flags, such as telling which fields below are valid - int m_contactFlags; - int m_bodyUniqueIdA; - int m_bodyUniqueIdB; - int m_linkIndexA; - int m_linkIndexB; - double m_positionOnAInWS[3]; //contact point location on object A, in world space coordinates - double m_positionOnBInWS[3]; //contact point location on object A, in world space coordinates - double m_contactNormalOnBInWS[3]; //the separating contact normal, pointing from object B towards object A - double m_contactDistance; //negative number is penetration, positive is distance. - - double m_normalForce; - - double m_linearFrictionForce1; - double m_linearFrictionForce2; - double m_linearFrictionDirection1[3]; - double m_linearFrictionDirection2[3]; -}; - -enum -{ - CONTACT_QUERY_MODE_REPORT_EXISTING_CONTACT_POINTS = 0, - CONTACT_QUERY_MODE_COMPUTE_CLOSEST_POINTS = 1, -}; - -enum b3StateLoggingType -{ - STATE_LOGGING_MINITAUR = 0, - STATE_LOGGING_GENERIC_ROBOT = 1, - STATE_LOGGING_VR_CONTROLLERS = 2, - STATE_LOGGING_VIDEO_MP4 = 3, - STATE_LOGGING_COMMANDS = 4, - STATE_LOGGING_CONTACT_POINTS = 5, - STATE_LOGGING_PROFILE_TIMINGS = 6, - STATE_LOGGING_ALL_COMMANDS = 7, - STATE_REPLAY_ALL_COMMANDS = 8, - STATE_LOGGING_CUSTOM_TIMER = 9, -}; - -struct b3ContactInformation -{ - int m_numContactPoints; - struct b3ContactPointData* m_contactPointData; -}; - -struct b3RayData -{ - double m_rayFromPosition[3]; - double m_rayToPosition[3]; -}; - -struct b3RayHitInfo -{ - double m_hitFraction; - int m_hitObjectUniqueId; - int m_hitObjectLinkIndex; - double m_hitPositionWorld[3]; - double m_hitNormalWorld[3]; -}; - -struct b3RaycastInformation -{ - int m_numRayHits; - struct b3RayHitInfo* m_rayHits; -}; - -typedef union { - struct b3RayData a; - struct b3RayHitInfo b; -} RAY_DATA_UNION; - -#define MAX_RAY_INTERSECTION_BATCH_SIZE 256 - -#ifdef __APPLE__ -#define MAX_RAY_INTERSECTION_BATCH_SIZE_STREAMING (4 * 1024) -#else -#define MAX_RAY_INTERSECTION_BATCH_SIZE_STREAMING (16 * 1024) -#endif - -#define MAX_RAY_HITS MAX_RAY_INTERSECTION_BATCH_SIZE -#define VISUAL_SHAPE_MAX_PATH_LEN 1024 - -enum b3VisualShapeDataFlags -{ - eVISUAL_SHAPE_DATA_TEXTURE_UNIQUE_IDS = 1, -}; - -struct b3VisualShapeData -{ - int m_objectUniqueId; - int m_linkIndex; - int m_visualGeometryType; //box primitive, sphere primitive, triangle mesh - double m_dimensions[3]; //meaning depends on m_visualGeometryType - char m_meshAssetFileName[VISUAL_SHAPE_MAX_PATH_LEN]; - double m_localVisualFrame[7]; //pos[3], orn[4] - //todo: add more data if necessary (material color etc, although material can be in asset file .obj file) - double m_rgbaColor[4]; - int m_tinyRendererTextureId; - int m_textureUniqueId; - int m_openglTextureId; -}; - -struct b3VisualShapeInformation -{ - int m_numVisualShapes; - struct b3VisualShapeData* m_visualShapeData; -}; - -struct b3CollisionShapeData -{ - int m_objectUniqueId; - int m_linkIndex; - int m_collisionGeometryType; //GEOM_BOX, GEOM_SPHERE etc - double m_dimensions[3]; //meaning depends on m_visualGeometryType GEOM_BOX: extents, GEOM_SPHERE: radius, GEOM_CAPSULE+GEOM_CYLINDER:length, radius, GEOM_MESH: mesh scale - double m_localCollisionFrame[7]; //pos[3], orn[4] - char m_meshAssetFileName[VISUAL_SHAPE_MAX_PATH_LEN]; -}; - -struct b3CollisionShapeInformation -{ - int m_numCollisionShapes; - struct b3CollisionShapeData* m_collisionShapeData; -}; - -enum eLinkStateFlags -{ - ACTUAL_STATE_COMPUTE_LINKVELOCITY = 1, - ACTUAL_STATE_COMPUTE_FORWARD_KINEMATICS = 2, -}; - -///b3LinkState provides extra information such as the Cartesian world coordinates -///center of mass (COM) of the link, relative to the world reference frame. -///Orientation is a quaternion x,y,z,w -///Note: to compute the URDF link frame (which equals the joint frame at joint position 0) -///use URDF link frame = link COM frame * inertiaFrame.inverse() -struct b3LinkState -{ - //m_worldPosition and m_worldOrientation of the Center Of Mass (COM) - double m_worldPosition[3]; - double m_worldOrientation[4]; - - double m_localInertialPosition[3]; - double m_localInertialOrientation[4]; - - ///world position and orientation of the (URDF) link frame - double m_worldLinkFramePosition[3]; - double m_worldLinkFrameOrientation[4]; - - double m_worldLinearVelocity[3]; //only valid when ACTUAL_STATE_COMPUTE_LINKVELOCITY is set (b3RequestActualStateCommandComputeLinkVelocity) - double m_worldAngularVelocity[3]; //only valid when ACTUAL_STATE_COMPUTE_LINKVELOCITY is set (b3RequestActualStateCommandComputeLinkVelocity) - - double m_worldAABBMin[3]; //world space bounding minium and maximum box corners. - double m_worldAABBMax[3]; -}; - -//todo: discuss and decide about control mode and combinations -enum -{ - // POSITION_CONTROL=0, - CONTROL_MODE_VELOCITY = 0, - CONTROL_MODE_TORQUE, - CONTROL_MODE_POSITION_VELOCITY_PD, - CONTROL_MODE_PD, // The standard PD control implemented as soft constraint. - CONTROL_MODE_STABLE_PD, -}; - -///flags for b3ApplyExternalTorque and b3ApplyExternalForce -enum EnumExternalForceFlags -{ - EF_LINK_FRAME = 1, - EF_WORLD_FRAME = 2, -}; - -///flags to pick the renderer for synthetic camera -enum EnumRenderer -{ - ER_TINY_RENDERER = (1 << 16), - ER_BULLET_HARDWARE_OPENGL = (1 << 17), - //ER_FIRE_RAYS=(1<<18), -}; - -enum EnumRendererAuxFlags -{ - ER_SEGMENTATION_MASK_OBJECT_AND_LINKINDEX = 1, - ER_USE_PROJECTIVE_TEXTURE = 2, - ER_NO_SEGMENTATION_MASK = 4, -}; - -///flags to pick the IK solver and other options -enum EnumCalculateInverseKinematicsFlags -{ - IK_DLS = 0, - IK_SDLS = 1, //TODO: can add other IK solvers - IK_HAS_TARGET_POSITION = 16, - IK_HAS_TARGET_ORIENTATION = 32, - IK_HAS_NULL_SPACE_VELOCITY = 64, - IK_HAS_JOINT_DAMPING = 128, - IK_HAS_CURRENT_JOINT_POSITIONS = 256, - IK_HAS_MAX_ITERATIONS = 512, - IK_HAS_RESIDUAL_THRESHOLD = 1024, -}; - -enum b3ConfigureDebugVisualizerEnum -{ - COV_ENABLE_GUI = 1, - COV_ENABLE_SHADOWS, - COV_ENABLE_WIREFRAME, - COV_ENABLE_VR_TELEPORTING, - COV_ENABLE_VR_PICKING, - COV_ENABLE_VR_RENDER_CONTROLLERS, - COV_ENABLE_RENDERING, - COV_ENABLE_SYNC_RENDERING_INTERNAL, - COV_ENABLE_KEYBOARD_SHORTCUTS, - COV_ENABLE_MOUSE_PICKING, - COV_ENABLE_Y_AXIS_UP, - COV_ENABLE_TINY_RENDERER, - COV_ENABLE_RGB_BUFFER_PREVIEW, - COV_ENABLE_DEPTH_BUFFER_PREVIEW, - COV_ENABLE_SEGMENTATION_MARK_PREVIEW, - COV_ENABLE_PLANAR_REFLECTION, - COV_ENABLE_SINGLE_STEP_RENDERING, -}; - -enum b3AddUserDebugItemEnum -{ - DEB_DEBUG_TEXT_ALWAYS_FACE_CAMERA = 1, - DEB_DEBUG_TEXT_USE_TRUE_TYPE_FONTS = 2, - DEB_DEBUG_TEXT_HAS_TRACKING_OBJECT = 4, -}; - -enum eCONNECT_METHOD -{ - eCONNECT_GUI = 1, - eCONNECT_DIRECT = 2, - eCONNECT_SHARED_MEMORY = 3, - eCONNECT_UDP = 4, - eCONNECT_TCP = 5, - eCONNECT_EXISTING_EXAMPLE_BROWSER = 6, - eCONNECT_GUI_SERVER = 7, - eCONNECT_GUI_MAIN_THREAD = 8, - eCONNECT_SHARED_MEMORY_SERVER = 9, - eCONNECT_DART = 10, - eCONNECT_MUJOCO = 11, - eCONNECT_GRPC = 12, - eCONNECT_PHYSX=13, - eCONNECT_SHARED_MEMORY_GUI=14, - eCONNECT_GRAPHICS_SERVER = 15, - eCONNECT_GRAPHICS_SERVER_TCP = 16, - eCONNECT_GRAPHICS_SERVER_MAIN_THREAD=17 -}; - -enum eURDF_Flags -{ - URDF_USE_INERTIA_FROM_FILE = 2, //sync with URDFJointTypes.h 'ConvertURDFFlags' - URDF_USE_SELF_COLLISION = 8, //see CUF_USE_SELF_COLLISION - URDF_USE_SELF_COLLISION_EXCLUDE_PARENT = 16, - URDF_USE_SELF_COLLISION_EXCLUDE_ALL_PARENTS = 32, - URDF_RESERVED = 64, - URDF_USE_IMPLICIT_CYLINDER = 128, - URDF_GLOBAL_VELOCITIES_MB = 256, - MJCF_COLORS_FROM_FILE = 512, - URDF_ENABLE_CACHED_GRAPHICS_SHAPES = 1024, - URDF_ENABLE_SLEEPING = 2048, - URDF_INITIALIZE_SAT_FEATURES = 4096, - URDF_USE_SELF_COLLISION_INCLUDE_PARENT = 8192, - URDF_PARSE_SENSORS = 16384, - URDF_USE_MATERIAL_COLORS_FROM_MTL = 32768, - URDF_USE_MATERIAL_TRANSPARANCY_FROM_MTL = 65536, - URDF_MAINTAIN_LINK_ORDER = 131072, - URDF_ENABLE_WAKEUP = 1 << 18, - URDF_MERGE_FIXED_LINKS = 1 << 19, - URDF_IGNORE_VISUAL_SHAPES = 1 << 20, - URDF_IGNORE_COLLISION_SHAPES = 1 << 21, - URDF_PRINT_URDF_INFO = 1 << 22, - URDF_GOOGLEY_UNDEFINED_COLORS = 1 << 23, -}; - -enum eUrdfGeomTypes //sync with UrdfParser UrdfGeomTypes -{ - GEOM_SPHERE = 2, - GEOM_BOX, - GEOM_CYLINDER, - GEOM_MESH, - GEOM_PLANE, - GEOM_CAPSULE, //non-standard URDF? - GEOM_SDF, //signed-distance-field, non-standard URDF - GEOM_HEIGHTFIELD, - GEOM_UNKNOWN, -}; - -enum eUrdfCollisionFlags -{ - GEOM_FORCE_CONCAVE_TRIMESH = 1, - GEOM_CONCAVE_INTERNAL_EDGE = 2, - GEOM_INITIALIZE_SAT_FEATURES = URDF_INITIALIZE_SAT_FEATURES, -}; - -enum eUrdfVisualFlags -{ - GEOM_VISUAL_HAS_RGBA_COLOR = 1, - GEOM_VISUAL_HAS_SPECULAR_COLOR = 2, -}; - -enum eStateLoggingFlags -{ - STATE_LOG_JOINT_MOTOR_TORQUES = 1, - STATE_LOG_JOINT_USER_TORQUES = 2, - STATE_LOG_JOINT_TORQUES = STATE_LOG_JOINT_MOTOR_TORQUES + STATE_LOG_JOINT_USER_TORQUES, -}; - -enum eJointFeedbackModes -{ - JOINT_FEEDBACK_IN_WORLD_SPACE = 1, - JOINT_FEEDBACK_IN_JOINT_FRAME = 2, -}; - -#define B3_MAX_PLUGIN_ARG_SIZE 128 -#define B3_MAX_PLUGIN_ARG_TEXT_LEN 1024 - -struct b3PluginArguments -{ - char m_text[B3_MAX_PLUGIN_ARG_TEXT_LEN]; - int m_numInts; - int m_ints[B3_MAX_PLUGIN_ARG_SIZE]; - int m_numFloats; - double m_floats[B3_MAX_PLUGIN_ARG_SIZE]; -}; - -enum eInternalSimFlags -{ - eVRTinyGUI = 1<<1, - eDeformableAlternativeIndexing = 1<<2, -}; - -struct b3PhysicsSimulationParameters -{ - double m_deltaTime; - double m_simulationTimestamp; // user logging timestamp of simulation. - double m_gravityAcceleration[3]; - int m_numSimulationSubSteps; - int m_numSolverIterations; - double m_warmStartingFactor; - double m_articulatedWarmStartingFactor; - int m_useRealTimeSimulation; - int m_useSplitImpulse; - double m_splitImpulsePenetrationThreshold; - double m_contactBreakingThreshold; - int m_internalSimFlags; - double m_defaultContactERP; - int m_collisionFilterMode; - int m_enableFileCaching; - double m_restitutionVelocityThreshold; - double m_defaultNonContactERP; - double m_frictionERP; - double m_defaultGlobalCFM; - double m_frictionCFM; - int m_enableConeFriction; - int m_deterministicOverlappingPairs; - double m_allowedCcdPenetration; - int m_jointFeedbackMode; - double m_solverResidualThreshold; - double m_contactSlop; - int m_enableSAT; - int m_constraintSolverType; - int m_minimumSolverIslandSize; - int m_reportSolverAnalytics; - double m_sparseSdfVoxelSize; - int m_numNonContactInnerIterations; -}; - - -enum eConstraintSolverTypes -{ - eConstraintSolverLCP_SI = 1, - eConstraintSolverLCP_PGS, - eConstraintSolverLCP_DANTZIG, - eConstraintSolverLCP_LEMKE, - eConstraintSolverLCP_NNCG, - eConstraintSolverLCP_BLOCK_PGS, -}; - -struct b3ForwardDynamicsAnalyticsIslandData -{ - int m_islandId; - int m_numBodies; - int m_numContactManifolds; - int m_numIterationsUsed; - double m_remainingLeastSquaresResidual; -}; - -#define MAX_ISLANDS_ANALYTICS 64 - -struct b3ForwardDynamicsAnalyticsArgs -{ - int m_numSteps; - int m_numIslands; - int m_numSolverCalls; - struct b3ForwardDynamicsAnalyticsIslandData m_islandData[MAX_ISLANDS_ANALYTICS]; -}; - -enum eDynamicTypes -{ - eDynamic= 0, - eStatic= 1, - eKinematic= 2 -}; - -enum eFileIOActions -{ - eAddFileIOAction = 1024,//avoid collision with eFileIOTypes - eRemoveFileIOAction, -}; - - -enum eFileIOTypes -{ - ePosixFileIO = 1, - eZipFileIO, - eCNSFileIO, - eInMemoryFileIO, -}; - -enum eEnumUpdateVisualShapeFlags -{ - eVISUAL_SHAPE_DOUBLE_SIDED = 4,//see B3_INSTANCE_DOUBLE_SIDED -}; - -//limits for vertices/indices in PyBullet::createCollisionShape -//Make sure the data fits in SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE -//(numVertices*sizeof(double)*3 + numIndices*sizeof(int)) < SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE - - -#ifdef __APPLE__ -#define B3_MAX_NUM_VERTICES 8192 -#define B3_MAX_NUM_INDICES 32768 -#else -#define B3_MAX_NUM_VERTICES 131072 -#define B3_MAX_NUM_INDICES 524288 -#endif - - -#endif //SHARED_MEMORY_PUBLIC_H diff --git a/engine/inc/bullet/SharedMemory/SharedMemoryUserData.h b/engine/inc/bullet/SharedMemory/SharedMemoryUserData.h deleted file mode 100644 index d605f2f8..00000000 --- a/engine/inc/bullet/SharedMemory/SharedMemoryUserData.h +++ /dev/null @@ -1,96 +0,0 @@ -#ifndef SHARED_MEMORY_USER_DATA_H -#define SHARED_MEMORY_USER_DATA_H - -#include -#include "LinearMath/btAlignedObjectArray.h" -#include "LinearMath/btHashMap.h" -#include "SharedMemoryPublic.h" - -struct SharedMemoryUserData -{ - std::string m_key; - int m_type; - - int m_bodyUniqueId; - int m_linkIndex; - int m_visualShapeIndex; - - btAlignedObjectArray m_bytes; - - SharedMemoryUserData() - : m_type(-1), m_bodyUniqueId(-1), m_linkIndex(-1), m_visualShapeIndex(-1) - { - } - - SharedMemoryUserData(const char* key, int bodyUniqueId, int linkIndex, int visualShapeIndex) - : m_key(key), m_type(-1), m_bodyUniqueId(bodyUniqueId), m_linkIndex(linkIndex), m_visualShapeIndex(visualShapeIndex) - { - } - - void replaceValue(const char* bytes, int len, int type) - { - m_type = type; - m_bytes.resize(len); - for (int i = 0; i < len; i++) - { - m_bytes[i] = bytes[i]; - } - } - - virtual ~SharedMemoryUserData() - { - } - - void clear() - { - m_bytes.clear(); - m_type = -1; - } -}; - -struct SharedMemoryUserDataHashKey -{ - unsigned int m_hash; - - btHashString m_key; - btHashInt m_bodyUniqueId; - btHashInt m_linkIndex; - btHashInt m_visualShapeIndex; - - SIMD_FORCE_INLINE unsigned int getHash() const - { - return m_hash; - } - - SharedMemoryUserDataHashKey() : m_hash(0) {} - - SharedMemoryUserDataHashKey(const struct SharedMemoryUserData* userData) - : m_key(userData->m_key.c_str()), - m_bodyUniqueId(userData->m_bodyUniqueId), - m_linkIndex(userData->m_linkIndex), - m_visualShapeIndex(userData->m_visualShapeIndex) - { - calculateHash(); - } - - SharedMemoryUserDataHashKey(const char* key, int bodyUniqueId, int linkIndex, int visualShapeIndex) - : m_key(key), m_bodyUniqueId(bodyUniqueId), m_linkIndex(linkIndex), m_visualShapeIndex(visualShapeIndex) - { - calculateHash(); - } - - void calculateHash() - { - m_hash = m_key.getHash() ^ m_bodyUniqueId.getHash() ^ m_linkIndex.getHash() ^ m_visualShapeIndex.getHash(); - } - - bool equals(const SharedMemoryUserDataHashKey& other) const - { - return m_bodyUniqueId.equals(other.m_bodyUniqueId) && - m_linkIndex.equals(other.m_linkIndex) && - m_visualShapeIndex.equals(other.m_visualShapeIndex) && - m_key.equals(other.m_key); - } -}; - -#endif //SHARED_MEMORY_USER_DATA_H diff --git a/engine/inc/bullet/SharedMemory/Win32SharedMemory.h b/engine/inc/bullet/SharedMemory/Win32SharedMemory.h deleted file mode 100644 index dfa37c7d..00000000 --- a/engine/inc/bullet/SharedMemory/Win32SharedMemory.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef WIN32_SHARED_MEMORY_H -#define WIN32_SHARED_MEMORY_H - -#include "SharedMemoryInterface.h" - -class Win32SharedMemory : public SharedMemoryInterface -{ - struct Win32SharedMemoryInteralData* m_internalData; - -public: - Win32SharedMemory(); - virtual ~Win32SharedMemory(); - - virtual void* allocateSharedMemory(int key, int size, bool allowCreation); - virtual void releaseSharedMemory(int key, int size); -}; - -class Win32SharedMemoryServer : public Win32SharedMemory -{ -public: - Win32SharedMemoryServer(); - virtual ~Win32SharedMemoryServer(); -}; - -class Win32SharedMemoryClient : public Win32SharedMemory -{ -public: - Win32SharedMemoryClient(); - virtual ~Win32SharedMemoryClient(); -}; - -#endif //WIN32_SHARED_MEMORY_H diff --git a/engine/inc/bullet/SharedMemory/b3PluginManager.h b/engine/inc/bullet/SharedMemory/b3PluginManager.h deleted file mode 100644 index 240c3e2f..00000000 --- a/engine/inc/bullet/SharedMemory/b3PluginManager.h +++ /dev/null @@ -1,77 +0,0 @@ -#ifndef B3_PLUGIN_MANAGER_H -#define B3_PLUGIN_MANAGER_H - -#include "plugins/b3PluginAPI.h" - -enum b3PluginManagerTickMode -{ - B3_PRE_TICK_MODE = 1, - B3_POST_TICK_MODE, - B3_PROCESS_CLIENT_COMMANDS_TICK, -}; - -struct b3PluginFunctions -{ - //required - PFN_INIT m_initFunc; - PFN_EXIT m_exitFunc; - PFN_EXECUTE m_executeCommandFunc; - - //optional - PFN_TICK m_preTickFunc; - PFN_TICK m_postTickFunc; - PFN_GET_RENDER_INTERFACE m_getRendererFunc; - PFN_TICK m_processClientCommandsFunc; - PFN_TICK m_processNotificationsFunc; - PFN_GET_COLLISION_INTERFACE m_getCollisionFunc; - PFN_GET_FILEIO_INTERFACE m_fileIoFunc; - - b3PluginFunctions(PFN_INIT initFunc, PFN_EXIT exitFunc, PFN_EXECUTE executeCommandFunc) - :m_initFunc(initFunc), - m_exitFunc(exitFunc), - m_executeCommandFunc(executeCommandFunc), - m_preTickFunc(0), - m_postTickFunc(0), - m_getRendererFunc(0), - m_processClientCommandsFunc(0), - m_processNotificationsFunc(0), - m_getCollisionFunc(0), - m_fileIoFunc(0) - { - } -}; - -class b3PluginManager -{ - struct b3PluginManagerInternalData* m_data; - -public: - b3PluginManager(class PhysicsCommandProcessorInterface* physSdk); - virtual ~b3PluginManager(); - - int loadPlugin(const char* pluginPath, const char* postFixStr = ""); - void unloadPlugin(int pluginUniqueId); - int executePluginCommand(int pluginUniqueId, const struct b3PluginArguments* arguments); - void addEvents(const struct b3VRControllerEvent* vrControllerEvents, int numVRControllerEvents, const struct b3KeyboardEvent* keyEvents, int numKeyEvents, const struct b3MouseEvent* mouseEvents, int numMouseEvents); - void clearEvents(); - - void addNotification(const struct b3Notification& notification); - void reportNotifications(); - - void tickPlugins(double timeStep, b3PluginManagerTickMode tickMode); - - int registerStaticLinkedPlugin(const char* pluginPath, b3PluginFunctions& functions, bool initPlugin = true); - - void selectPluginRenderer(int pluginUniqueId); - struct UrdfRenderingInterface* getRenderInterface(); - - void selectFileIOPlugin(int pluginUniqueId); - struct CommonFileIOInterface* getFileIOInterface(); - - void selectCollisionPlugin(int pluginUniqueId); - struct b3PluginCollisionInterface* getCollisionInterface(); - - const struct b3UserDataValue* getReturnData(int pluginUniqueId); -}; - -#endif //B3_PLUGIN_MANAGER_H diff --git a/engine/inc/bullet/SharedMemory/b3RobotSimulatorClientAPI_InternalData.h b/engine/inc/bullet/SharedMemory/b3RobotSimulatorClientAPI_InternalData.h deleted file mode 100644 index 34994ddf..00000000 --- a/engine/inc/bullet/SharedMemory/b3RobotSimulatorClientAPI_InternalData.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef B3_ROBOT_SIMULATOR_CLIENT_API_INTERNAL_DATA_H -#define B3_ROBOT_SIMULATOR_CLIENT_API_INTERNAL_DATA_H - -#include "../SharedMemory/PhysicsClientC_API.h" - -struct b3RobotSimulatorClientAPI_InternalData -{ - b3PhysicsClientHandle m_physicsClientHandle; - struct GUIHelperInterface* m_guiHelper; - - b3RobotSimulatorClientAPI_InternalData() - : m_physicsClientHandle(0), - m_guiHelper(0) - { - } -}; - -#endif //B3_ROBOT_SIMULATOR_CLIENT_API_INTERNAL_DATA_H \ No newline at end of file diff --git a/engine/inc/bullet/SharedMemory/b3RobotSimulatorClientAPI_NoDirect.h b/engine/inc/bullet/SharedMemory/b3RobotSimulatorClientAPI_NoDirect.h deleted file mode 100644 index 5c8f9e2f..00000000 --- a/engine/inc/bullet/SharedMemory/b3RobotSimulatorClientAPI_NoDirect.h +++ /dev/null @@ -1,914 +0,0 @@ -#ifndef B3_ROBOT_SIMULATOR_CLIENT_API_NO_DIRECT_H -#define B3_ROBOT_SIMULATOR_CLIENT_API_NO_DIRECT_H - -///The b3RobotSimulatorClientAPI is pretty much the C++ version of pybullet -///as documented in the pybullet Quickstart Guide -///https://docs.google.com/document/d/10sXEhzFRSnvFcl3XxNGhnD4N2SedqwdAvK3dsihxVUA - -#include "SharedMemoryPublic.h" -#include "LinearMath/btVector3.h" -#include "LinearMath/btQuaternion.h" -#include "LinearMath/btTransform.h" -#include "LinearMath/btAlignedObjectArray.h" - -#include - -struct b3RobotSimulatorLoadUrdfFileArgs -{ - btVector3 m_startPosition; - btQuaternion m_startOrientation; - bool m_forceOverrideFixedBase; - bool m_useMultiBody; - int m_flags; - - b3RobotSimulatorLoadUrdfFileArgs(const btVector3 &startPos, const btQuaternion &startOrn) - : m_startPosition(startPos), - m_startOrientation(startOrn), - m_forceOverrideFixedBase(false), - m_useMultiBody(true), - m_flags(0) - { - } - - b3RobotSimulatorLoadUrdfFileArgs() - : m_startPosition(btVector3(0, 0, 0)), - m_startOrientation(btQuaternion(0, 0, 0, 1)), - m_forceOverrideFixedBase(false), - m_useMultiBody(true), - m_flags(0) - { - } -}; - -struct b3RobotSimulatorLoadSdfFileArgs -{ - bool m_forceOverrideFixedBase; - bool m_useMultiBody; - - b3RobotSimulatorLoadSdfFileArgs() - : m_forceOverrideFixedBase(false), - m_useMultiBody(true) - { - } -}; - -struct b3RobotSimulatorLoadSoftBodyArgs -{ - btVector3 m_startPosition; - btQuaternion m_startOrientation; - double m_scale; - double m_mass; - double m_collisionMargin; - - b3RobotSimulatorLoadSoftBodyArgs(const btVector3 &startPos, const btQuaternion &startOrn, const double &scale, const double &mass, const double &collisionMargin) - : m_startPosition(startPos), - m_startOrientation(startOrn), - m_scale(scale), - m_mass(mass), - m_collisionMargin(collisionMargin) - { - } - - b3RobotSimulatorLoadSoftBodyArgs(const btVector3 &startPos, const btQuaternion &startOrn) - { - b3RobotSimulatorLoadSoftBodyArgs(startPos, startOrn, 1.0, 1.0, 0.02); - } - - b3RobotSimulatorLoadSoftBodyArgs() - { - b3RobotSimulatorLoadSoftBodyArgs(btVector3(0, 0, 0), btQuaternion(0, 0, 0, 1)); - } - - b3RobotSimulatorLoadSoftBodyArgs(double scale, double mass, double collisionMargin) - : m_startPosition(btVector3(0, 0, 0)), - m_startOrientation(btQuaternion(0, 0, 0, 1)), - m_scale(scale), - m_mass(mass), - m_collisionMargin(collisionMargin) - { - } -}; - - -struct b3RobotSimulatorLoadDeformableBodyArgs -{ - btVector3 m_startPosition; - btQuaternion m_startOrientation; - double m_scale; - double m_mass; - double m_collisionMargin; - double m_springElasticStiffness; - double m_springDampingStiffness; - double m_springBendingStiffness; - double m_NeoHookeanMu; - double m_NeoHookeanLambda; - double m_NeoHookeanDamping; - bool m_useSelfCollision; - bool m_useFaceContact; - bool m_useBendingSprings; - double m_frictionCoeff; - - b3RobotSimulatorLoadDeformableBodyArgs(const btVector3 &startPos, const btQuaternion &startOrn, const double &scale, const double &mass, const double &collisionMargin) - : m_startPosition(startPos), - m_startOrientation(startOrn), - m_scale(scale), - m_mass(mass), - m_collisionMargin(collisionMargin), - m_springElasticStiffness(-1), - m_springDampingStiffness(-1), - m_springBendingStiffness(-1), - m_NeoHookeanMu(-1), - m_NeoHookeanDamping(-1), - m_useSelfCollision(false), - m_useFaceContact(false), - m_useBendingSprings(false), - m_frictionCoeff(0) - { - } - - b3RobotSimulatorLoadDeformableBodyArgs(const btVector3 &startPos, const btQuaternion &startOrn) - { - b3RobotSimulatorLoadSoftBodyArgs(startPos, startOrn, 1.0, 1.0, 0.02); - } - - b3RobotSimulatorLoadDeformableBodyArgs() - { - b3RobotSimulatorLoadSoftBodyArgs(btVector3(0, 0, 0), btQuaternion(0, 0, 0, 1)); - } - - b3RobotSimulatorLoadDeformableBodyArgs(double scale, double mass, double collisionMargin) - : m_startPosition(btVector3(0, 0, 0)), - m_startOrientation(btQuaternion(0, 0, 0, 1)), - m_scale(scale), - m_mass(mass), - m_collisionMargin(collisionMargin) - { - } -}; - - -struct b3RobotSimulatorLoadFileResults -{ - btAlignedObjectArray m_uniqueObjectIds; - b3RobotSimulatorLoadFileResults() - { - } -}; - -struct b3RobotSimulatorChangeVisualShapeArgs -{ - int m_objectUniqueId; - int m_linkIndex; - int m_shapeIndex; - int m_textureUniqueId; - btVector4 m_rgbaColor; - bool m_hasRgbaColor; - btVector3 m_specularColor; - bool m_hasSpecularColor; - - b3RobotSimulatorChangeVisualShapeArgs() - : m_objectUniqueId(-1), - m_linkIndex(-1), - m_shapeIndex(-1), - m_textureUniqueId(-2), - m_rgbaColor(0, 0, 0, 1), - m_hasRgbaColor(false), - m_specularColor(1, 1, 1), - m_hasSpecularColor(false) - { - } -}; - -struct b3RobotSimulatorJointMotorArgs -{ - int m_controlMode; - - double m_targetPosition; - double m_kp; - - double m_targetVelocity; - double m_kd; - - double m_maxTorqueValue; - - b3RobotSimulatorJointMotorArgs(int controlMode) - : m_controlMode(controlMode), - m_targetPosition(0), - m_kp(0.1), - m_targetVelocity(0), - m_kd(0.9), - m_maxTorqueValue(1000) - { - } -}; - -enum b3RobotSimulatorInverseKinematicsFlags -{ - B3_HAS_IK_TARGET_ORIENTATION = 1, - B3_HAS_NULL_SPACE_VELOCITY = 2, - B3_HAS_JOINT_DAMPING = 4, - B3_HAS_CURRENT_POSITIONS = 8, -}; - -struct b3RobotSimulatorInverseKinematicArgs -{ - int m_bodyUniqueId; - double m_endEffectorTargetPosition[3]; - double m_endEffectorTargetOrientation[4]; - int m_endEffectorLinkIndex; - int m_flags; - int m_numDegreeOfFreedom; - btAlignedObjectArray m_lowerLimits; - btAlignedObjectArray m_upperLimits; - btAlignedObjectArray m_jointRanges; - btAlignedObjectArray m_restPoses; - btAlignedObjectArray m_jointDamping; - btAlignedObjectArray m_currentJointPositions; - - b3RobotSimulatorInverseKinematicArgs() - : m_bodyUniqueId(-1), - m_endEffectorLinkIndex(-1), - m_flags(0) - { - m_endEffectorTargetPosition[0] = 0; - m_endEffectorTargetPosition[1] = 0; - m_endEffectorTargetPosition[2] = 0; - - m_endEffectorTargetOrientation[0] = 0; - m_endEffectorTargetOrientation[1] = 0; - m_endEffectorTargetOrientation[2] = 0; - m_endEffectorTargetOrientation[3] = 1; - } -}; - -struct b3RobotSimulatorInverseKinematicsResults -{ - int m_bodyUniqueId; - btAlignedObjectArray m_calculatedJointPositions; -}; - -struct b3JointStates2 -{ - int m_bodyUniqueId; - int m_numDegreeOfFreedomQ; - int m_numDegreeOfFreedomU; - btTransform m_rootLocalInertialFrame; - btAlignedObjectArray m_actualStateQ; - btAlignedObjectArray m_actualStateQdot; - btAlignedObjectArray m_jointReactionForces; -}; - -struct b3RobotSimulatorJointMotorArrayArgs -{ - int m_controlMode; - int m_numControlledDofs; - - int *m_jointIndices; - - double *m_targetPositions; - double *m_kps; - - double *m_targetVelocities; - double *m_kds; - - double *m_forces; - - b3RobotSimulatorJointMotorArrayArgs(int controlMode, int numControlledDofs) - : m_controlMode(controlMode), - m_numControlledDofs(numControlledDofs), - m_jointIndices(NULL), - m_targetPositions(NULL), - m_kps(NULL), - m_targetVelocities(NULL), - m_kds(NULL), - m_forces(NULL) - { - } -}; - -struct b3RobotSimulatorGetCameraImageArgs -{ - int m_width; - int m_height; - float *m_viewMatrix; - float *m_projectionMatrix; - float *m_lightDirection; - float *m_lightColor; - float m_lightDistance; - int m_hasShadow; - float m_lightAmbientCoeff; - float m_lightDiffuseCoeff; - float m_lightSpecularCoeff; - int m_renderer; - - b3RobotSimulatorGetCameraImageArgs(int width, int height) - : m_width(width), - m_height(height), - m_viewMatrix(NULL), - m_projectionMatrix(NULL), - m_lightDirection(NULL), - m_lightColor(NULL), - m_lightDistance(-1), - m_hasShadow(-1), - m_lightAmbientCoeff(-1), - m_lightDiffuseCoeff(-1), - m_lightSpecularCoeff(-1), - m_renderer(-1) - { - } -}; - -struct b3RobotSimulatorSetPhysicsEngineParameters : b3PhysicsSimulationParameters -{ - b3RobotSimulatorSetPhysicsEngineParameters() - { - m_deltaTime = -1; - m_gravityAcceleration[0] = 0; - m_gravityAcceleration[1] = 0; - m_gravityAcceleration[2] = 0; - - m_numSimulationSubSteps = -1; - m_numSolverIterations = -1; - m_useRealTimeSimulation = -1; - m_useSplitImpulse = -1; - m_splitImpulsePenetrationThreshold = -1; - m_contactBreakingThreshold = -1; - m_internalSimFlags = -1; - m_defaultContactERP = -1; - m_collisionFilterMode = -1; - m_enableFileCaching = -1; - m_restitutionVelocityThreshold = -1; - m_defaultNonContactERP = -1; - m_frictionERP = -1; - m_defaultGlobalCFM = -1; - m_frictionCFM = -1; - m_enableConeFriction = -1; - m_deterministicOverlappingPairs = -1; - m_allowedCcdPenetration = -1; - m_jointFeedbackMode = -1; - m_solverResidualThreshold = -1; - m_contactSlop = -1; - - m_collisionFilterMode = -1; - m_contactBreakingThreshold = -1; - - m_enableFileCaching = -1; - m_restitutionVelocityThreshold = -1; - - m_frictionERP = -1; - m_solverResidualThreshold = -1; - m_constraintSolverType = -1; - m_minimumSolverIslandSize = -1; - } -}; - -struct b3RobotSimulatorChangeDynamicsArgs -{ - double m_mass; - double m_lateralFriction; - double m_spinningFriction; - double m_rollingFriction; - double m_restitution; - double m_linearDamping; - double m_angularDamping; - double m_contactStiffness; - double m_contactDamping; - int m_frictionAnchor; - int m_activationState; - - b3RobotSimulatorChangeDynamicsArgs() - : m_mass(-1), - m_lateralFriction(-1), - m_spinningFriction(-1), - m_rollingFriction(-1), - m_restitution(-1), - m_linearDamping(-1), - m_angularDamping(-1), - m_contactStiffness(-1), - m_contactDamping(-1), - m_frictionAnchor(-1), - m_activationState(-1) - { - } -}; - -struct b3RobotSimulatorAddUserDebugLineArgs -{ - double m_colorRGB[3]; - double m_lineWidth; - double m_lifeTime; - int m_parentObjectUniqueId; - int m_parentLinkIndex; - - b3RobotSimulatorAddUserDebugLineArgs() - : m_lineWidth(1), - m_lifeTime(0), - m_parentObjectUniqueId(-1), - m_parentLinkIndex(-1) - { - m_colorRGB[0] = 1; - m_colorRGB[1] = 1; - m_colorRGB[2] = 1; - } -}; - -enum b3AddUserDebugTextFlags -{ - DEBUG_TEXT_HAS_ORIENTATION = 1 -}; - -struct b3RobotSimulatorAddUserDebugTextArgs -{ - double m_colorRGB[3]; - double m_size; - double m_lifeTime; - double m_textOrientation[4]; - int m_parentObjectUniqueId; - int m_parentLinkIndex; - int m_flags; - - b3RobotSimulatorAddUserDebugTextArgs() - : m_size(1), - m_lifeTime(0), - m_parentObjectUniqueId(-1), - m_parentLinkIndex(-1), - m_flags(0) - { - m_colorRGB[0] = 1; - m_colorRGB[1] = 1; - m_colorRGB[2] = 1; - - m_textOrientation[0] = 0; - m_textOrientation[1] = 0; - m_textOrientation[2] = 0; - m_textOrientation[3] = 1; - } -}; - -struct b3RobotSimulatorGetContactPointsArgs -{ - int m_bodyUniqueIdA; - int m_bodyUniqueIdB; - int m_linkIndexA; - int m_linkIndexB; - - b3RobotSimulatorGetContactPointsArgs() - : m_bodyUniqueIdA(-1), - m_bodyUniqueIdB(-1), - m_linkIndexA(-2), - m_linkIndexB(-2) - { - } -}; - -struct b3RobotSimulatorCreateCollisionShapeArgs -{ - int m_shapeType; - double m_radius; - btVector3 m_halfExtents; - double m_height; - char *m_fileName; - btVector3 m_meshScale; - btVector3 m_planeNormal; - int m_flags; - - double m_heightfieldTextureScaling; - btAlignedObjectArray m_heightfieldData; - int m_numHeightfieldRows; - int m_numHeightfieldColumns; - int m_replaceHeightfieldIndex; - - b3RobotSimulatorCreateCollisionShapeArgs() - : m_shapeType(-1), - m_radius(0.5), - m_height(1), - m_fileName(NULL), - m_flags(0), - m_heightfieldTextureScaling(1), - m_numHeightfieldRows(0), - m_numHeightfieldColumns(0), - m_replaceHeightfieldIndex(-1) - { - m_halfExtents.m_floats[0] = 1; - m_halfExtents.m_floats[1] = 1; - m_halfExtents.m_floats[2] = 1; - - m_meshScale.m_floats[0] = 1; - m_meshScale.m_floats[1] = 1; - m_meshScale.m_floats[2] = 1; - - m_planeNormal.m_floats[0] = 0; - m_planeNormal.m_floats[1] = 0; - m_planeNormal.m_floats[2] = 1; - } -}; - - -struct b3RobotSimulatorCreateVisualShapeArgs -{ - int m_shapeType; - double m_radius; - btVector3 m_halfExtents; - double m_height; - char* m_fileName; - btVector3 m_meshScale; - btVector3 m_planeNormal; - int m_flags; - b3RobotSimulatorCreateVisualShapeArgs() - : m_shapeType(-1), - m_radius(0.5), - m_height(1), - m_fileName(NULL), - m_flags(0) - { - m_halfExtents.m_floats[0] = 1; - m_halfExtents.m_floats[1] = 1; - m_halfExtents.m_floats[2] = 1; - - m_meshScale.m_floats[0] = 1; - m_meshScale.m_floats[1] = 1; - m_meshScale.m_floats[2] = 1; - - m_planeNormal.m_floats[0] = 0; - m_planeNormal.m_floats[1] = 0; - m_planeNormal.m_floats[2] = 1; - } -}; - -struct b3RobotSimulatorCreateMultiBodyArgs -{ - double m_baseMass; - int m_baseCollisionShapeIndex; - int m_baseVisualShapeIndex; - btVector3 m_basePosition; - btQuaternion m_baseOrientation; - btVector3 m_baseInertialFramePosition; - btQuaternion m_baseInertialFrameOrientation; - - int m_numLinks; - double *m_linkMasses; - int *m_linkCollisionShapeIndices; - int *m_linkVisualShapeIndices; - btVector3 *m_linkPositions; - btQuaternion *m_linkOrientations; - btVector3 *m_linkInertialFramePositions; - btQuaternion *m_linkInertialFrameOrientations; - int *m_linkParentIndices; - int *m_linkJointTypes; - btVector3 *m_linkJointAxes; - btAlignedObjectArray m_batchPositions; - int m_useMaximalCoordinates; - - b3RobotSimulatorCreateMultiBodyArgs() - : m_baseMass(0), m_baseCollisionShapeIndex(-1), m_baseVisualShapeIndex(-1), m_numLinks(0), m_linkMasses(NULL), m_linkCollisionShapeIndices(NULL), m_linkVisualShapeIndices(NULL), m_linkPositions(NULL), m_linkOrientations(NULL), m_linkInertialFramePositions(NULL), m_linkInertialFrameOrientations(NULL), m_linkParentIndices(NULL), m_linkJointTypes(NULL), m_linkJointAxes(NULL), m_useMaximalCoordinates(0) - { - m_basePosition.setValue(0, 0, 0); - m_baseOrientation.setValue(0, 0, 0, 1); - m_baseInertialFramePosition.setValue(0, 0, 0); - m_baseInertialFrameOrientation.setValue(0, 0, 0, 1); - } -}; - - -struct b3RobotUserConstraint : public b3UserConstraint -{ - int m_userUpdateFlags;//see EnumUserConstraintFlags - - void setErp(double erp) - { - m_erp = erp; - m_userUpdateFlags |= USER_CONSTRAINT_CHANGE_ERP; - } - - void setMaxAppliedForce(double maxForce) - { - m_maxAppliedForce = maxForce; - m_userUpdateFlags |= USER_CONSTRAINT_CHANGE_MAX_FORCE; - } - - void setGearRatio(double gearRatio) - { - m_gearRatio = gearRatio; - m_userUpdateFlags |= USER_CONSTRAINT_CHANGE_GEAR_RATIO; - } - - void setGearAuxLink(int link) - { - m_gearAuxLink = link; - m_userUpdateFlags |= USER_CONSTRAINT_CHANGE_GEAR_AUX_LINK; - } - - void setRelativePositionTarget(double target) - { - m_relativePositionTarget = target; - m_userUpdateFlags |= USER_CONSTRAINT_CHANGE_RELATIVE_POSITION_TARGET; - } - - void setChildPivot(double pivot[3]) - { - m_childFrame[0] = pivot[0]; - m_childFrame[1] = pivot[1]; - m_childFrame[2] = pivot[2]; - m_userUpdateFlags |= USER_CONSTRAINT_CHANGE_PIVOT_IN_B; - } - - void setChildFrameOrientation(double orn[4]) - { - m_childFrame[3] = orn[0]; - m_childFrame[4] = orn[1]; - m_childFrame[5] = orn[2]; - m_childFrame[6] = orn[3]; - m_userUpdateFlags |= USER_CONSTRAINT_CHANGE_FRAME_ORN_IN_B; - } - - b3RobotUserConstraint() - :m_userUpdateFlags(0) - { - m_parentBodyIndex = -1; - m_parentJointIndex = -1; - m_childBodyIndex = -1; - m_childJointIndex = -1; - //position - m_parentFrame[0] = 0; - m_parentFrame[1] = 0; - m_parentFrame[2] = 0; - //orientation quaternion [x,y,z,w] - m_parentFrame[3] = 0; - m_parentFrame[4] = 0; - m_parentFrame[5] = 0; - m_parentFrame[6] = 1; - - //position - m_childFrame[0] = 0; - m_childFrame[1] = 0; - m_childFrame[2] = 0; - //orientation quaternion [x,y,z,w] - m_childFrame[3] = 0; - m_childFrame[4] = 0; - m_childFrame[5] = 0; - m_childFrame[6] = 1; - - m_jointAxis[0] = 0; - m_jointAxis[1] = 0; - m_jointAxis[2] = 1; - - m_jointType = eFixedType; - - m_maxAppliedForce = 500; - m_userConstraintUniqueId = -1; - m_gearRatio = -1; - m_gearAuxLink = -1; - m_relativePositionTarget = 0; - m_erp = 0; - } -}; - -struct b3RobotJointInfo : public b3JointInfo -{ - b3RobotJointInfo() - { - m_linkName[0] = 0; - m_jointName[0] = 0; - m_jointType = eFixedType; - m_qIndex = -1; - m_uIndex = -1; - m_jointIndex = -1; - m_flags = 0; - m_jointDamping = 0; - m_jointFriction = 0; - m_jointLowerLimit = 1; - m_jointUpperLimit = -1; - m_jointMaxForce = 500; - m_jointMaxVelocity = 100; - m_parentIndex = -1; - - //position - m_parentFrame[0] = 0; - m_parentFrame[1] = 0; - m_parentFrame[2] = 0; - //orientation quaternion [x,y,z,w] - m_parentFrame[3] = 0; - m_parentFrame[4] = 0; - m_parentFrame[5] = 0; - m_parentFrame[6] = 1; - - //position - m_childFrame[0] = 0; - m_childFrame[1] = 0; - m_childFrame[2] = 0; - //orientation quaternion [x,y,z,w] - m_childFrame[3] = 0; - m_childFrame[4] = 0; - m_childFrame[5] = 0; - m_childFrame[6] = 1; - - m_jointAxis[0] = 0; - m_jointAxis[1] = 0; - m_jointAxis[2] = 1; - } -}; - -class b3RobotSimulatorClientAPI_NoDirect -{ -protected: - struct b3RobotSimulatorClientAPI_InternalData *m_data; - -public: - b3RobotSimulatorClientAPI_NoDirect(); - virtual ~b3RobotSimulatorClientAPI_NoDirect(); - - //No 'connect', use setInternalData to bypass the connect method, pass an existing client - virtual void setInternalData(struct b3RobotSimulatorClientAPI_InternalData *data); - - void disconnect(); - - bool isConnected() const; - - void setTimeOut(double timeOutInSec); - - void syncBodies(); - - void resetSimulation(); - - void resetSimulation(int flag); - - btQuaternion getQuaternionFromEuler(const btVector3 &rollPitchYaw); - btVector3 getEulerFromQuaternion(const btQuaternion &quat); - - int loadURDF(const std::string &fileName, const struct b3RobotSimulatorLoadUrdfFileArgs &args = b3RobotSimulatorLoadUrdfFileArgs()); - bool loadSDF(const std::string &fileName, b3RobotSimulatorLoadFileResults &results, const struct b3RobotSimulatorLoadSdfFileArgs &args = b3RobotSimulatorLoadSdfFileArgs()); - bool loadMJCF(const std::string &fileName, b3RobotSimulatorLoadFileResults &results); - bool loadBullet(const std::string &fileName, b3RobotSimulatorLoadFileResults &results); - bool saveBullet(const std::string &fileName); - - int loadTexture(const std::string &fileName); - - bool changeVisualShape(const struct b3RobotSimulatorChangeVisualShapeArgs &args); - - bool savePythonWorld(const std::string &fileName); - - bool getBodyInfo(int bodyUniqueId, struct b3BodyInfo *bodyInfo); - - bool getBasePositionAndOrientation(int bodyUniqueId, btVector3 &basePosition, btQuaternion &baseOrientation) const; - bool resetBasePositionAndOrientation(int bodyUniqueId, const btVector3 &basePosition, const btQuaternion &baseOrientation); - - bool getBaseVelocity(int bodyUniqueId, btVector3 &baseLinearVelocity, btVector3 &baseAngularVelocity) const; - bool resetBaseVelocity(int bodyUniqueId, const btVector3 &linearVelocity, const btVector3 &angularVelocity) const; - - int getNumJoints(int bodyUniqueId) const; - - bool getJointInfo(int bodyUniqueId, int jointIndex, b3JointInfo *jointInfo); - - int createConstraint(int parentBodyIndex, int parentJointIndex, int childBodyIndex, int childJointIndex, b3JointInfo *jointInfo); - - int changeConstraint(int constraintId, b3RobotUserConstraint*jointInfo); - - void removeConstraint(int constraintId); - - bool getConstraintInfo(int constraintUniqueId, struct b3UserConstraint &constraintInfo); - - bool getJointState(int bodyUniqueId, int jointIndex, struct b3JointSensorState *state); - - bool getJointStates(int bodyUniqueId, b3JointStates2 &state); - - bool resetJointState(int bodyUniqueId, int jointIndex, double targetValue); - - void setJointMotorControl(int bodyUniqueId, int jointIndex, const struct b3RobotSimulatorJointMotorArgs &args); - - bool setJointMotorControlArray(int bodyUniqueId, int controlMode, int numControlledDofs, - int *jointIndices, double *targetVelocities, double *targetPositions, - double *forces, double *kps, double *kds); - - void stepSimulation(); - - bool canSubmitCommand() const; - - void setRealTimeSimulation(bool enableRealTimeSimulation); - - void setInternalSimFlags(int flags); - - void setGravity(const btVector3 &gravityAcceleration); - - void setTimeStep(double timeStepInSeconds); - void setNumSimulationSubSteps(int numSubSteps); - void setNumSolverIterations(int numIterations); - void setContactBreakingThreshold(double threshold); - - int computeDofCount(int bodyUniqueId) const; - - bool calculateInverseKinematics(const struct b3RobotSimulatorInverseKinematicArgs &args, struct b3RobotSimulatorInverseKinematicsResults &results); - - int calculateMassMatrix(int bodyUniqueId, const double* jointPositions, int numJointPositions, double* massMatrix, int flags); - - bool getBodyJacobian(int bodyUniqueId, int linkIndex, const double *localPosition, const double *jointPositions, const double *jointVelocities, const double *jointAccelerations, double *linearJacobian, double *angularJacobian); - - void configureDebugVisualizer(enum b3ConfigureDebugVisualizerEnum flag, int enable); - void resetDebugVisualizerCamera(double cameraDistance, double cameraPitch, double cameraYaw, const btVector3 &targetPos); - - int startStateLogging(b3StateLoggingType loggingType, const std::string &fileName, const btAlignedObjectArray &objectUniqueIds = btAlignedObjectArray(), int maxLogDof = -1); - void stopStateLogging(int stateLoggerUniqueId); - - void getVREvents(b3VREventsData *vrEventsData, int deviceTypeFilter); - void getKeyboardEvents(b3KeyboardEventsData *keyboardEventsData); - - void submitProfileTiming(const std::string &profileName); - - // JFC: added these 24 methods - - void getMouseEvents(b3MouseEventsData *mouseEventsData); - - bool getLinkState(int bodyUniqueId, int linkIndex, int computeLinkVelocity, int computeForwardKinematics, b3LinkState *linkState); - - bool getCameraImage(int width, int height, struct b3RobotSimulatorGetCameraImageArgs args, b3CameraImageData &imageData); - - bool calculateInverseDynamics(int bodyUniqueId, double *jointPositions, double *jointVelocities, double *jointAccelerations, double *jointForcesOutput); - - int getNumBodies() const; - - int getBodyUniqueId(int bodyId) const; - - bool removeBody(int bodyUniqueId); - - bool getDynamicsInfo(int bodyUniqueId, int linkIndex, b3DynamicsInfo *dynamicsInfo); - - bool changeDynamics(int bodyUniqueId, int linkIndex, struct b3RobotSimulatorChangeDynamicsArgs &args); - - int addUserDebugParameter(const char *paramName, double rangeMin, double rangeMax, double startValue); - - double readUserDebugParameter(int itemUniqueId); - - bool removeUserDebugItem(int itemUniqueId); - - int addUserDebugText(const char *text, double *textPosition, struct b3RobotSimulatorAddUserDebugTextArgs &args); - - int addUserDebugText(const char *text, btVector3 &textPosition, struct b3RobotSimulatorAddUserDebugTextArgs &args); - - int addUserDebugLine(double *fromXYZ, double *toXYZ, struct b3RobotSimulatorAddUserDebugLineArgs &args); - - int addUserDebugLine(btVector3 &fromXYZ, btVector3 &toXYZ, struct b3RobotSimulatorAddUserDebugLineArgs &args); - - bool setJointMotorControlArray(int bodyUniqueId, struct b3RobotSimulatorJointMotorArrayArgs &args); - - bool setPhysicsEngineParameter(const struct b3RobotSimulatorSetPhysicsEngineParameters &args); - - bool getPhysicsEngineParameters(struct b3RobotSimulatorSetPhysicsEngineParameters &args); - - bool applyExternalForce(int objectUniqueId, int linkIndex, double *force, double *position, int flags); - - bool applyExternalForce(int objectUniqueId, int linkIndex, btVector3 &force, btVector3 &position, int flags); - - bool applyExternalTorque(int objectUniqueId, int linkIndex, double *torque, int flags); - - bool applyExternalTorque(int objectUniqueId, int linkIndex, btVector3 &torque, int flags); - - bool enableJointForceTorqueSensor(int bodyUniqueId, int jointIndex, bool enable); - - bool getDebugVisualizerCamera(struct b3OpenGLVisualizerCameraInfo *cameraInfo); - - bool getContactPoints(struct b3RobotSimulatorGetContactPointsArgs &args, struct b3ContactInformation *contactInfo); - - bool getClosestPoints(struct b3RobotSimulatorGetContactPointsArgs &args, double distance, struct b3ContactInformation *contactInfo); - - bool getOverlappingObjects(double *aabbMin, double *aabbMax, struct b3AABBOverlapData *overlapData); - - bool getOverlappingObjects(btVector3 &aabbMin, btVector3 &aabbMax, struct b3AABBOverlapData *overlapData); - - bool getAABB(int bodyUniqueId, int linkIndex, double *aabbMin, double *aabbMax); - - bool getAABB(int bodyUniqueId, int linkIndex, btVector3 &aabbMin, btVector3 &aabbMax); - - int createVisualShape(int shapeType, struct b3RobotSimulatorCreateVisualShapeArgs& args); - - int createCollisionShape(int shapeType, struct b3RobotSimulatorCreateCollisionShapeArgs &args); - - int createMultiBody(struct b3RobotSimulatorCreateMultiBodyArgs &args); - - int getNumConstraints() const; - - int getConstraintUniqueId(int serialIndex); - - void loadSoftBody(const std::string &fileName, const struct b3RobotSimulatorLoadSoftBodyArgs &args); - - void loadDeformableBody(const std::string &fileName, const struct b3RobotSimulatorLoadDeformableBodyArgs &args); - - virtual void setGuiHelper(struct GUIHelperInterface *guiHelper); - virtual struct GUIHelperInterface *getGuiHelper(); - - bool getCollisionShapeData(int bodyUniqueId, int linkIndex, b3CollisionShapeInformation &collisionShapeInfo); - - bool getVisualShapeData(int bodyUniqueId, struct b3VisualShapeInformation &visualShapeInfo); - - int saveStateToMemory(); - void restoreStateFromMemory(int stateId); - void removeState(int stateUniqueId); - - int getAPIVersion() const - { - return SHARED_MEMORY_MAGIC_NUMBER; - } - void setAdditionalSearchPath(const std::string &path); - - void setCollisionFilterGroupMask(int bodyUniqueIdA, int linkIndexA, int collisionFilterGroup, int collisionFilterMask); -}; - -#endif //B3_ROBOT_SIMULATOR_CLIENT_API_NO_DIRECT_H diff --git a/engine/inc/bullet/SharedMemory/b3RobotSimulatorClientAPI_NoGUI.h b/engine/inc/bullet/SharedMemory/b3RobotSimulatorClientAPI_NoGUI.h deleted file mode 100644 index b0a4a8de..00000000 --- a/engine/inc/bullet/SharedMemory/b3RobotSimulatorClientAPI_NoGUI.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef B3_ROBOT_SIMULATOR_CLIENT_API_H -#define B3_ROBOT_SIMULATOR_CLIENT_API_H - -#include "b3RobotSimulatorClientAPI_NoDirect.h" - -///The b3RobotSimulatorClientAPI is pretty much the C++ version of pybullet -///as documented in the pybullet Quickstart Guide -///https://docs.google.com/document/d/10sXEhzFRSnvFcl3XxNGhnD4N2SedqwdAvK3dsihxVUA -class b3RobotSimulatorClientAPI_NoGUI : public b3RobotSimulatorClientAPI_NoDirect -{ -public: - b3RobotSimulatorClientAPI_NoGUI(); - virtual ~b3RobotSimulatorClientAPI_NoGUI(); - - bool connect(int mode, const std::string& hostName = "localhost", int portOrKey = -1); -}; - -#endif //B3_ROBOT_SIMULATOR_CLIENT_API_H diff --git a/engine/inc/bullet/SharedMemory/dart/DARTPhysicsC_API.h b/engine/inc/bullet/SharedMemory/dart/DARTPhysicsC_API.h deleted file mode 100644 index 48aeb70d..00000000 --- a/engine/inc/bullet/SharedMemory/dart/DARTPhysicsC_API.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef DART_PHYSICS_C_API_H -#define DART_PHYSICS_C_API_H - -#ifdef BT_ENABLE_DART - -#include "../PhysicsClientC_API.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - - //think more about naming. The b3ConnectPhysicsLoopback - B3_SHARED_API b3PhysicsClientHandle b3ConnectPhysicsDART(); - -#ifdef __cplusplus -} -#endif - -#endif //BT_ENABLE_DART -#endif //DART_PHYSICS_C_API_H diff --git a/engine/inc/bullet/SharedMemory/dart/DARTPhysicsClient.h b/engine/inc/bullet/SharedMemory/dart/DARTPhysicsClient.h deleted file mode 100644 index 45700914..00000000 --- a/engine/inc/bullet/SharedMemory/dart/DARTPhysicsClient.h +++ /dev/null @@ -1,121 +0,0 @@ -#ifndef DART_PHYSICS_CLIENT_H -#define DART_PHYSICS_CLIENT_H - -#include "../PhysicsClient.h" - -///PhysicsDirect executes the commands directly, without transporting them or having a separate server executing commands -class DARTPhysicsClient : public PhysicsClient -{ -protected: - struct DARTPhysicsDirectInternalData* m_data; - - bool processDebugLines(const struct SharedMemoryCommand& orgCommand); - - bool processCamera(const struct SharedMemoryCommand& orgCommand); - - bool processContactPointData(const struct SharedMemoryCommand& orgCommand); - - bool processOverlappingObjects(const struct SharedMemoryCommand& orgCommand); - - bool processVisualShapeData(const struct SharedMemoryCommand& orgCommand); - - void processBodyJointInfo(int bodyUniqueId, const struct SharedMemoryStatus& serverCmd); - - void processAddUserData(const struct SharedMemoryStatus& serverCmd); - - void postProcessStatus(const struct SharedMemoryStatus& serverCmd); - - void resetData(); - - void removeCachedBody(int bodyUniqueId); - -public: - DARTPhysicsClient(class PhysicsCommandProcessorInterface* physSdk, bool passSdkOwnership); - - virtual ~DARTPhysicsClient(); - - // return true if connection succesfull, can also check 'isConnected' - //it is OK to pass a null pointer for the gui helper - virtual bool connect(); - - ////todo: rename to 'disconnect' - virtual void disconnectSharedMemory(); - - virtual bool isConnected() const; - - // return non-null if there is a status, nullptr otherwise - virtual const SharedMemoryStatus* processServerStatus(); - - virtual SharedMemoryCommand* getAvailableSharedMemoryCommand(); - - virtual bool canSubmitCommand() const; - - virtual bool submitClientCommand(const struct SharedMemoryCommand& command); - - virtual int getNumBodies() const; - - virtual int getBodyUniqueId(int serialIndex) const; - - virtual bool getBodyInfo(int bodyUniqueId, struct b3BodyInfo& info) const; - - virtual int getNumJoints(int bodyIndex) const; - - virtual bool getJointInfo(int bodyIndex, int jointIndex, struct b3JointInfo& info) const; - - virtual int getNumUserConstraints() const; - - virtual int getUserConstraintInfo(int constraintUniqueId, struct b3UserConstraint& info) const; - - virtual int getUserConstraintId(int serialIndex) const; - - ///todo: move this out of the - virtual void setSharedMemoryKey(int key); - - void uploadBulletFileToSharedMemory(const char* data, int len); - - virtual void uploadRaysToSharedMemory(struct SharedMemoryCommand& command, const double* rayFromWorldArray, const double* rayToWorldArray, int numRays); - - virtual int getNumDebugLines() const; - - virtual const float* getDebugLinesFrom() const; - virtual const float* getDebugLinesTo() const; - virtual const float* getDebugLinesColor() const; - - virtual void getCachedCameraImage(b3CameraImageData* cameraData); - - virtual void getCachedContactPointInformation(struct b3ContactInformation* contactPointData); - - virtual void getCachedOverlappingObjects(struct b3AABBOverlapData* overlappingObjects); - - virtual void getCachedVisualShapeInformation(struct b3VisualShapeInformation* visualShapesInfo); - - virtual void getCachedCollisionShapeInformation(struct b3CollisionShapeInformation* collisionShapesInfo); - - virtual void getCachedVREvents(struct b3VREventsData* vrEventsData); - - virtual void getCachedKeyboardEvents(struct b3KeyboardEventsData* keyboardEventsData); - - virtual void getCachedMouseEvents(struct b3MouseEventsData* mouseEventsData); - - virtual void getCachedRaycastHits(struct b3RaycastInformation* raycastHits); - - virtual void getCachedMassMatrix(int dofCountCheck, double* massMatrix); - - //the following APIs are for internal use for visualization: - virtual bool connect(struct GUIHelperInterface* guiHelper); - virtual void renderScene(); - virtual void debugDraw(int debugDrawMode); - - virtual void setTimeOut(double timeOutInSeconds); - virtual double getTimeOut() const; - - virtual bool getCachedUserData(int bodyUniqueId, int linkIndex, int userDataId, struct b3UserDataValue& valueOut) const; - virtual int getCachedUserDataId(int bodyUniqueId, int linkIndex, const char* key) const; - virtual int getNumUserData(int bodyUniqueId, int linkIndex) const; - virtual void getUserDataInfo(int bodyUniqueId, int linkIndex, int userDataIndex, const char** keyOut, int* userDataIdOut) const; - - virtual void pushProfileTiming(const char* timingName); - virtual void popProfileTiming(); -}; - -#endif //DART_PHYSICS__H diff --git a/engine/inc/bullet/SharedMemory/dart/DARTPhysicsServerCommandProcessor.h b/engine/inc/bullet/SharedMemory/dart/DARTPhysicsServerCommandProcessor.h deleted file mode 100644 index af028598..00000000 --- a/engine/inc/bullet/SharedMemory/dart/DARTPhysicsServerCommandProcessor.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef DART_PHYSICS_SERVER_COMMAND_PROCESSOR_H -#define DART_PHYSICS_SERVER_COMMAND_PROCESSOR_H - -#include "../PhysicsCommandProcessorInterface.h" - -class DARTPhysicsServerCommandProcessor : public PhysicsCommandProcessorInterface -{ -public: - DARTPhysicsServerCommandProcessor(); - - virtual ~DARTPhysicsServerCommandProcessor(); - - virtual bool connect(); - - virtual void disconnect(); - - virtual bool isConnected() const; - - virtual bool processCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - - virtual bool receiveStatus(struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - - virtual void renderScene(int renderFlags) {} - virtual void physicsDebugDraw(int debugDrawFlags) {} - virtual void setGuiHelper(struct GUIHelperInterface* guiHelper) {} - virtual void setTimeOut(double timeOutInSeconds) {} -}; - -#endif //DART_PHYSICS_COMMAND_PROCESSOR_H diff --git a/engine/inc/bullet/SharedMemory/grpc/ConvertGRPCBullet.h b/engine/inc/bullet/SharedMemory/grpc/ConvertGRPCBullet.h deleted file mode 100644 index 4279eeeb..00000000 --- a/engine/inc/bullet/SharedMemory/grpc/ConvertGRPCBullet.h +++ /dev/null @@ -1,21 +0,0 @@ - -#ifndef BT_CONVERT_GRPC_BULLET_H -#define BT_CONVERT_GRPC_BULLET_H - -#include "../PhysicsClientC_API.h" - -namespace pybullet_grpc -{ -class PyBulletCommand; -class PyBulletStatus; -}; // namespace pybullet_grpc - -struct SharedMemoryCommand* convertGRPCToBulletCommand(const pybullet_grpc::PyBulletCommand& grpcCommand, struct SharedMemoryCommand& cmd); - -pybullet_grpc::PyBulletCommand* convertBulletToGRPCCommand(const struct SharedMemoryCommand& clientCmd, pybullet_grpc::PyBulletCommand& grpcCommand); - -bool convertGRPCToStatus(const pybullet_grpc::PyBulletStatus& grpcReply, struct SharedMemoryStatus& serverStatus, char* bufferServerToClient, int bufferSizeInBytes); - -bool convertStatusToGRPC(const struct SharedMemoryStatus& serverStatus, char* bufferServerToClient, int bufferSizeInBytes, pybullet_grpc::PyBulletStatus& grpcReply); - -#endif //BT_CONVERT_GRPC_BULLET_H \ No newline at end of file diff --git a/engine/inc/bullet/SharedMemory/mujoco/MuJoCoPhysicsC_API.h b/engine/inc/bullet/SharedMemory/mujoco/MuJoCoPhysicsC_API.h deleted file mode 100644 index adb5df24..00000000 --- a/engine/inc/bullet/SharedMemory/mujoco/MuJoCoPhysicsC_API.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef MUJOCO_PHYSICS_C_API_H -#define MUJOCO_PHYSICS_C_API_H - -#ifdef BT_ENABLE_MUJOCO - -#include "../PhysicsClientC_API.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - - //think more about naming. The b3ConnectPhysicsLoopback - B3_SHARED_API b3PhysicsClientHandle b3ConnectPhysicsMuJoCo(); - -#ifdef __cplusplus -} -#endif - -#endif //BT_ENABLE_MUJOCO -#endif //MUJOCO_PHYSICS_C_API_H diff --git a/engine/inc/bullet/SharedMemory/mujoco/MuJoCoPhysicsClient.h b/engine/inc/bullet/SharedMemory/mujoco/MuJoCoPhysicsClient.h deleted file mode 100644 index bbbe3181..00000000 --- a/engine/inc/bullet/SharedMemory/mujoco/MuJoCoPhysicsClient.h +++ /dev/null @@ -1,121 +0,0 @@ -#ifndef MUJOCO_PHYSICS_CLIENT_H -#define MUJOCO_PHYSICS_CLIENT_H - -#include "../PhysicsClient.h" - -///PhysicsDirect executes the commands directly, without transporting them or having a separate server executing commands -class MuJoCoPhysicsClient : public PhysicsClient -{ -protected: - struct MuJoCoPhysicsDirectInternalData* m_data; - - bool processDebugLines(const struct SharedMemoryCommand& orgCommand); - - bool processCamera(const struct SharedMemoryCommand& orgCommand); - - bool processContactPointData(const struct SharedMemoryCommand& orgCommand); - - bool processOverlappingObjects(const struct SharedMemoryCommand& orgCommand); - - bool processVisualShapeData(const struct SharedMemoryCommand& orgCommand); - - void processBodyJointInfo(int bodyUniqueId, const struct SharedMemoryStatus& serverCmd); - - void processAddUserData(const struct SharedMemoryStatus& serverCmd); - - void postProcessStatus(const struct SharedMemoryStatus& serverCmd); - - void resetData(); - - void removeCachedBody(int bodyUniqueId); - -public: - MuJoCoPhysicsClient(class PhysicsCommandProcessorInterface* physSdk, bool passSdkOwnership); - - virtual ~MuJoCoPhysicsClient(); - - // return true if connection succesfull, can also check 'isConnected' - //it is OK to pass a null pointer for the gui helper - virtual bool connect(); - - ////todo: rename to 'disconnect' - virtual void disconnectSharedMemory(); - - virtual bool isConnected() const; - - // return non-null if there is a status, nullptr otherwise - virtual const SharedMemoryStatus* processServerStatus(); - - virtual SharedMemoryCommand* getAvailableSharedMemoryCommand(); - - virtual bool canSubmitCommand() const; - - virtual bool submitClientCommand(const struct SharedMemoryCommand& command); - - virtual int getNumBodies() const; - - virtual int getBodyUniqueId(int serialIndex) const; - - virtual bool getBodyInfo(int bodyUniqueId, struct b3BodyInfo& info) const; - - virtual int getNumJoints(int bodyIndex) const; - - virtual bool getJointInfo(int bodyIndex, int jointIndex, struct b3JointInfo& info) const; - - virtual int getNumUserConstraints() const; - - virtual int getUserConstraintInfo(int constraintUniqueId, struct b3UserConstraint& info) const; - - virtual int getUserConstraintId(int serialIndex) const; - - ///todo: move this out of the - virtual void setSharedMemoryKey(int key); - - void uploadBulletFileToSharedMemory(const char* data, int len); - - virtual void uploadRaysToSharedMemory(struct SharedMemoryCommand& command, const double* rayFromWorldArray, const double* rayToWorldArray, int numRays); - - virtual int getNumDebugLines() const; - - virtual const float* getDebugLinesFrom() const; - virtual const float* getDebugLinesTo() const; - virtual const float* getDebugLinesColor() const; - - virtual void getCachedCameraImage(b3CameraImageData* cameraData); - - virtual void getCachedContactPointInformation(struct b3ContactInformation* contactPointData); - - virtual void getCachedOverlappingObjects(struct b3AABBOverlapData* overlappingObjects); - - virtual void getCachedVisualShapeInformation(struct b3VisualShapeInformation* visualShapesInfo); - - virtual void getCachedCollisionShapeInformation(struct b3CollisionShapeInformation* collisionShapesInfo); - - virtual void getCachedVREvents(struct b3VREventsData* vrEventsData); - - virtual void getCachedKeyboardEvents(struct b3KeyboardEventsData* keyboardEventsData); - - virtual void getCachedMouseEvents(struct b3MouseEventsData* mouseEventsData); - - virtual void getCachedRaycastHits(struct b3RaycastInformation* raycastHits); - - virtual void getCachedMassMatrix(int dofCountCheck, double* massMatrix); - - //the following APIs are for internal use for visualization: - virtual bool connect(struct GUIHelperInterface* guiHelper); - virtual void renderScene(); - virtual void debugDraw(int debugDrawMode); - - virtual void setTimeOut(double timeOutInSeconds); - virtual double getTimeOut() const; - - virtual bool getCachedUserData(int bodyUniqueId, int linkIndex, int userDataId, struct b3UserDataValue& valueOut) const; - virtual int getCachedUserDataId(int bodyUniqueId, int linkIndex, const char* key) const; - virtual int getNumUserData(int bodyUniqueId, int linkIndex) const; - virtual void getUserDataInfo(int bodyUniqueId, int linkIndex, int userDataIndex, const char** keyOut, int* userDataIdOut) const; - - virtual void pushProfileTiming(const char* timingName); - virtual void popProfileTiming(); -}; - -#endif //MUJOCO_PHYSICS_CLIENT_H diff --git a/engine/inc/bullet/SharedMemory/mujoco/MuJoCoPhysicsServerCommandProcessor.h b/engine/inc/bullet/SharedMemory/mujoco/MuJoCoPhysicsServerCommandProcessor.h deleted file mode 100644 index 8e0e2bfc..00000000 --- a/engine/inc/bullet/SharedMemory/mujoco/MuJoCoPhysicsServerCommandProcessor.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef MUJOCO_PHYSICS_SERVER_COMMAND_PROCESSOR_H -#define MUJOCO_PHYSICS_SERVER_COMMAND_PROCESSOR_H - -#include "../PhysicsCommandProcessorInterface.h" - -class MuJoCoPhysicsServerCommandProcessor : public PhysicsCommandProcessorInterface -{ - struct MuJoCoPhysicsServerCommandProcessorInternalData* m_data; - - bool processSyncBodyInfoCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processRequestInternalDataCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processSyncUserDataCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processLoadMJCFCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processRequestBodyInfoCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processForwardDynamicsCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processSendPhysicsParametersCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processRequestActualStateCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processResetSimulationCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - - void resetSimulation(); - -public: - MuJoCoPhysicsServerCommandProcessor(); - - virtual ~MuJoCoPhysicsServerCommandProcessor(); - - virtual bool connect(); - - virtual void disconnect(); - - virtual bool isConnected() const; - - virtual bool processCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - - virtual bool receiveStatus(struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - - virtual void renderScene(int renderFlags) {} - virtual void physicsDebugDraw(int debugDrawFlags) {} - virtual void setGuiHelper(struct GUIHelperInterface* guiHelper) {} - virtual void setTimeOut(double timeOutInSeconds) {} -}; - -#endif //MUJOCO_PHYSICS_COMMAND_PROCESSOR_H diff --git a/engine/inc/bullet/SharedMemory/physx/PhysXC_API.h b/engine/inc/bullet/SharedMemory/physx/PhysXC_API.h deleted file mode 100644 index 42d117fb..00000000 --- a/engine/inc/bullet/SharedMemory/physx/PhysXC_API.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef PHYSX_C_API_H -#define PHYSX_C_API_H - -#ifdef BT_ENABLE_PHYSX - -#include "../PhysicsClientC_API.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - - B3_SHARED_API b3PhysicsClientHandle b3ConnectPhysX(int argc, char* argv[]); - -#ifdef __cplusplus -} -#endif - -#endif //BT_ENABLE_PHYSX -#endif //PHYSX_C_API_H diff --git a/engine/inc/bullet/SharedMemory/physx/PhysXServerCommandProcessor.h b/engine/inc/bullet/SharedMemory/physx/PhysXServerCommandProcessor.h deleted file mode 100644 index 7566268e..00000000 --- a/engine/inc/bullet/SharedMemory/physx/PhysXServerCommandProcessor.h +++ /dev/null @@ -1,57 +0,0 @@ -#ifndef PHYSX_SERVER_COMMAND_PROCESSOR_H -#define PHYSX_SERVER_COMMAND_PROCESSOR_H - -#include "../PhysicsCommandProcessorInterface.h" - -class PhysXServerCommandProcessor : public PhysicsCommandProcessorInterface -{ - struct PhysXServerCommandProcessorInternalData* m_data; - - bool processSyncBodyInfoCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processRequestInternalDataCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processSyncUserDataCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processLoadURDFCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processRequestBodyInfoCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processForwardDynamicsCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processSendPhysicsParametersCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processRequestActualStateCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processResetSimulationCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processInitPoseCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processSendDesiredStateCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processChangeDynamicsInfoCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processRequestPhysicsSimulationParametersCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processRequestContactpointInformationCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processCreateCollisionShapeCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processSetAdditionalSearchPathCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processUserDebugDrawCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - bool processRequestCameraImageCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - - bool processCustomCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - - void resetSimulation(); - bool processStateLoggingCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - -public: - PhysXServerCommandProcessor(int argc, char* argv[]); - - virtual ~PhysXServerCommandProcessor(); - - virtual bool connect(); - - virtual void disconnect(); - - virtual bool isConnected() const; - - virtual bool processCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - - virtual bool receiveStatus(struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes); - - virtual void renderScene(int renderFlags) {} - virtual void physicsDebugDraw(int debugDrawFlags) {} - virtual void setGuiHelper(struct GUIHelperInterface* guiHelper) {} - virtual void setTimeOut(double timeOutInSeconds) {} - - virtual void reportNotifications() {} -}; - -#endif //PHYSX_SERVER_COMMAND_PROCESSOR_H diff --git a/engine/inc/bullet/SharedMemory/physx/PhysXUrdfImporter.h b/engine/inc/bullet/SharedMemory/physx/PhysXUrdfImporter.h deleted file mode 100644 index 2caef42c..00000000 --- a/engine/inc/bullet/SharedMemory/physx/PhysXUrdfImporter.h +++ /dev/null @@ -1,116 +0,0 @@ -#ifndef PHYSX_URDF_IMPORTER_H -#define PHYSX_URDF_IMPORTER_H - -#include "../../Importers/ImportURDFDemo/URDFImporterInterface.h" -#include "../../Importers/ImportURDFDemo/UrdfRenderingInterface.h" - -struct PhysXURDFTexture -{ - int m_width; - int m_height; - unsigned char* textureData1; - bool m_isCached; -}; - - - - - -///PhysXURDFImporter can deal with URDF and SDF files -class PhysXURDFImporter : public URDFImporterInterface -{ - struct PhysXURDFInternalData* m_data; - -public: - PhysXURDFImporter(struct CommonFileIOInterface* fileIO=0,double globalScaling=1, int flags=0); - - virtual ~PhysXURDFImporter(); - - virtual bool loadURDF(const char* fileName, bool forceFixedBase = false); - - //warning: some quick test to load SDF: we 'activate' a model, so we can re-use URDF code path - virtual bool loadSDF(const char* fileName, bool forceFixedBase = false); - virtual int getNumModels() const; - virtual void activateModel(int modelIndex); - virtual void setBodyUniqueId(int bodyId); - virtual int getBodyUniqueId() const; - const char* getPathPrefix(); - - void printTree(); //for debugging - - virtual int getRootLinkIndex() const; - - virtual void getLinkChildIndices(int linkIndex, btAlignedObjectArray& childLinkIndices) const; - - virtual std::string getBodyName() const; - - virtual std::string getLinkName(int linkIndex) const; - - virtual bool getLinkColor(int linkIndex, btVector4& colorRGBA) const; - - virtual bool getLinkColor2(int linkIndex, UrdfMaterialColor& matCol) const; - - virtual void setLinkColor2(int linkIndex, struct UrdfMaterialColor& matCol) const; - - virtual bool getLinkContactInfo(int urdflinkIndex, URDFLinkContactInfo& contactInfo) const; - - virtual bool getLinkAudioSource(int linkIndex, SDFAudioSource& audioSource) const; - - virtual std::string getJointName(int linkIndex) const; - - virtual void getMassAndInertia(int linkIndex, btScalar& mass, btVector3& localInertiaDiagonal, btTransform& inertialFrame) const; - virtual void getMassAndInertia2(int urdfLinkIndex, btScalar& mass, btVector3& localInertiaDiagonal, btTransform& inertialFrame, int flags) const; - - virtual bool getJointInfo(int urdfLinkIndex, btTransform& parent2joint, btTransform& linkTransformInWorld, btVector3& jointAxisInJointSpace, int& jointType, btScalar& jointLowerLimit, btScalar& jointUpperLimit, btScalar& jointDamping, btScalar& jointFriction) const; - virtual bool getJointInfo2(int urdfLinkIndex, btTransform& parent2joint, btTransform& linkTransformInWorld, btVector3& jointAxisInJointSpace, int& jointType, btScalar& jointLowerLimit, btScalar& jointUpperLimit, btScalar& jointDamping, btScalar& jointFriction, btScalar& jointMaxForce, btScalar& jointMaxVelocity) const; - - virtual bool getRootTransformInWorld(btTransform& rootTransformInWorld) const; - virtual void setRootTransformInWorld(const btTransform& rootTransformInWorld); - - - - virtual int convertLinkVisualShapes3( - int linkIndex, const char* pathPrefix, const btTransform& localInertiaFrame, - const struct UrdfLink* linkPtr, const UrdfModel* model, - int collisionObjectUniqueId, int bodyUniqueId, struct CommonFileIOInterface* fileIO) const; - - virtual void convertLinkVisualShapes2(int linkIndex, int urdfIndex, const char* pathPrefix, const btTransform& inertialFrame, class btCollisionObject* colObj, int bodyUniqueId) const; - - class btCollisionShape* convertURDFToCollisionShape(const struct UrdfCollision* collision, const char* urdfPathPrefix) const - { - return 0; - } - - virtual int getUrdfFromCollisionShape(const btCollisionShape* collisionShape, UrdfCollision& collision) const; - - ///todo(erwincoumans) refactor this convertLinkCollisionShapes/memory allocation - - virtual class btCompoundShape* convertLinkCollisionShapes(int linkIndex, const char* pathPrefix, const btTransform& localInertiaFrame) const - { - return 0; - } - - virtual const struct UrdfLink* getUrdfLink(int urdfLinkIndex) const; - - virtual const struct UrdfModel* getUrdfModel() const; - - virtual int getCollisionGroupAndMask(int linkIndex, int& colGroup, int& colMask) const; - - virtual int getNumAllocatedCollisionShapes() const; - virtual class btCollisionShape* getAllocatedCollisionShape(int index); - - virtual int getNumAllocatedMeshInterfaces() const; - virtual class btStridingMeshInterface* getAllocatedMeshInterface(int index); - - virtual int getNumAllocatedTextures() const; - virtual int getAllocatedTexture(int index) const; - - virtual void setEnableTinyRenderer(bool enable); - //void convertURDFToVisualShapeInternal(const struct UrdfVisual* visual, const char* urdfPathPrefix, const class btTransform& visualTransform, btAlignedObjectArray& verticesOut, btAlignedObjectArray& indicesOut, btAlignedObjectArray& texturesOut, struct b3ImportMeshData& meshData) const; - - - int getNumPhysXLinks() const; - -}; - -#endif //PHYSX_URDF_IMPORTER_H diff --git a/engine/inc/bullet/SharedMemory/physx/PhysXUserData.h b/engine/inc/bullet/SharedMemory/physx/PhysXUserData.h deleted file mode 100644 index b4149ee0..00000000 --- a/engine/inc/bullet/SharedMemory/physx/PhysXUserData.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef PHYSX_USER_DATA_H -#define PHYSX_USER_DATA_H - -struct MyPhysXUserData -{ - int m_graphicsUniqueId; - int m_bodyUniqueId; - int m_linkIndex; -}; -#endif //PHYSX_USER_DATA_H \ No newline at end of file diff --git a/engine/inc/bullet/SharedMemory/physx/URDF2PhysX.h b/engine/inc/bullet/SharedMemory/physx/URDF2PhysX.h deleted file mode 100644 index 8cae67c4..00000000 --- a/engine/inc/bullet/SharedMemory/physx/URDF2PhysX.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef URDF2PHYSX_H -#define URDF2PHYSX_H - -#include "Bullet3Common/b3AlignedObjectArray.h" -#include "../../Importers/ImportURDFDemo/URDFJointTypes.h" - -namespace physx -{ - class PxBase; - class PxFoundation; - class PxPhysics; - class PxDefaultCpuDispatcher; - class PxScene; - class PxCooking; - class PxArticulationReducedCoordinate; -}; - -struct UrdfVisualShapeCache2 -{ - b3AlignedObjectArray m_cachedUrdfLinkColors; - b3AlignedObjectArray m_cachedUrdfLinkVisualShapeIndices; -}; - -physx::PxBase* URDF2PhysX(physx::PxFoundation* foundation, physx::PxPhysics* physics, physx::PxCooking* cooking, physx::PxScene* scene, class PhysXURDFImporter& u2p, int flags, const char* pathPrefix, const class btTransform& rootTransformInWorldSpace,struct CommonFileIOInterface* fileIO, bool createActiculation); - -#endif //URDF2PHYSX_H \ No newline at end of file diff --git a/engine/inc/bullet/SharedMemory/plugins/b3PluginAPI.h b/engine/inc/bullet/SharedMemory/plugins/b3PluginAPI.h deleted file mode 100644 index ef983abd..00000000 --- a/engine/inc/bullet/SharedMemory/plugins/b3PluginAPI.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef B3_PLUGIN_API_H -#define B3_PLUGIN_API_H - -#ifdef _WIN32 -#define B3_SHARED_API __declspec(dllexport) -#elif defined(__GNUC__) -#define B3_SHARED_API __attribute__((visibility("default"))) -#else -#define B3_SHARED_API -#endif - -#if defined(_WIN32) -#define B3_API_ENTRY -#define B3_API_CALL __cdecl -#define B3_CALLBACK __cdecl -#else -#define B3_API_ENTRY -#define B3_API_CALL -#define B3_CALLBACK -#endif - -#ifdef __cplusplus -extern "C" -{ -#endif - /* Plugin API */ - typedef B3_API_ENTRY int(B3_API_CALL* PFN_INIT)(struct b3PluginContext* context); - typedef B3_API_ENTRY void(B3_API_CALL* PFN_EXIT)(struct b3PluginContext* context); - typedef B3_API_ENTRY int(B3_API_CALL* PFN_EXECUTE)(struct b3PluginContext* context, const struct b3PluginArguments* arguments); - typedef B3_API_ENTRY int(B3_API_CALL* PFN_TICK)(struct b3PluginContext* context); - - typedef B3_API_ENTRY struct UrdfRenderingInterface*(B3_API_CALL* PFN_GET_RENDER_INTERFACE)(struct b3PluginContext* context); - typedef B3_API_ENTRY struct b3PluginCollisionInterface*(B3_API_CALL* PFN_GET_COLLISION_INTERFACE)(struct b3PluginContext* context); - typedef B3_API_ENTRY struct CommonFileIOInterface*(B3_API_CALL* PFN_GET_FILEIO_INTERFACE)(struct b3PluginContext* context); -#ifdef __cplusplus -} -#endif - -#endif //B3_PLUGIN_API_H diff --git a/engine/inc/bullet/SharedMemory/plugins/b3PluginCollisionInterface.h b/engine/inc/bullet/SharedMemory/plugins/b3PluginCollisionInterface.h deleted file mode 100644 index e0e39439..00000000 --- a/engine/inc/bullet/SharedMemory/plugins/b3PluginCollisionInterface.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef B3_PLUGIN_COLLISION_INTERFACE_H -#define B3_PLUGIN_COLLISION_INTERFACE_H - -enum b3PluginCollisionFilterModes -{ - B3_FILTER_GROUPAMASKB_AND_GROUPBMASKA = 0, - B3_FILTER_GROUPAMASKB_OR_GROUPBMASKA -}; - -struct b3PluginCollisionInterface -{ - virtual void setBroadphaseCollisionFilter( - int objectUniqueIdA, int objectUniqueIdB, - int linkIndexA, int linkIndexB, - bool enableCollision) = 0; - - virtual void removeBroadphaseCollisionFilter( - int objectUniqueIdA, int objectUniqueIdB, - int linkIndexA, int linkIndexB) = 0; - - virtual int getNumRules() const = 0; - - virtual void resetAll() = 0; - - virtual int needsBroadphaseCollision(int objectUniqueIdA, int linkIndexA, - int collisionFilterGroupA, int collisionFilterMaskA, - int objectUniqueIdB, int linkIndexB, - int collisionFilterGroupB, int collisionFilterMaskB, - int filterMode) = 0; -}; - -#endif //B3_PLUGIN_COLLISION_INTERFACE_H \ No newline at end of file diff --git a/engine/inc/bullet/SharedMemory/plugins/b3PluginContext.h b/engine/inc/bullet/SharedMemory/plugins/b3PluginContext.h deleted file mode 100644 index 045c9c2a..00000000 --- a/engine/inc/bullet/SharedMemory/plugins/b3PluginContext.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef B3_PLUGIN_CONTEXT_H -#define B3_PLUGIN_CONTEXT_H - -#include "../PhysicsClientC_API.h" - -struct b3PluginContext -{ - b3PhysicsClientHandle m_physClient; - - //plugin can modify the m_userPointer to store persistent object pointer (class or struct instance etc) - void* m_userPointer; - - //plugin can provide additional return data for executePluginCommand. - //Lifetime of this m_returnData pointer is minimum of - //next call to the next executePluginCommand or plugin termination. - b3UserDataValue* m_returnData; - - const struct b3VRControllerEvent* m_vrControllerEvents; - int m_numVRControllerEvents; - const struct b3KeyboardEvent* m_keyEvents; - int m_numKeyEvents; - const struct b3MouseEvent* m_mouseEvents; - int m_numMouseEvents; - const struct b3Notification* m_notifications; - int m_numNotifications; - - //only used for grpc/processClientCommands - class PhysicsCommandProcessorInterface* m_rpcCommandProcessorInterface; -}; - -#endif //B3_PLUGIN_CONTEXT_H \ No newline at end of file diff --git a/engine/inc/bullet/SharedMemory/plugins/b3PluginFileIOInterface.h b/engine/inc/bullet/SharedMemory/plugins/b3PluginFileIOInterface.h deleted file mode 100644 index 57c00cff..00000000 --- a/engine/inc/bullet/SharedMemory/plugins/b3PluginFileIOInterface.h +++ /dev/null @@ -1 +0,0 @@ -#error \ No newline at end of file diff --git a/engine/inc/bullet/SharedMemory/plugins/collisionFilterPlugin/collisionFilterPlugin.h b/engine/inc/bullet/SharedMemory/plugins/collisionFilterPlugin/collisionFilterPlugin.h deleted file mode 100644 index 27e39223..00000000 --- a/engine/inc/bullet/SharedMemory/plugins/collisionFilterPlugin/collisionFilterPlugin.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef COLLISION_FILTER_PLUGIN_H -#define COLLISION_FILTER_PLUGIN_H - -#include "../b3PluginAPI.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - - //the following 3 APIs are required - B3_SHARED_API int initPlugin_collisionFilterPlugin(struct b3PluginContext* context); - B3_SHARED_API void exitPlugin_collisionFilterPlugin(struct b3PluginContext* context); - B3_SHARED_API int executePluginCommand_collisionFilterPlugin(struct b3PluginContext* context, const struct b3PluginArguments* arguments); - - //all the APIs below are optional - B3_SHARED_API struct b3PluginCollisionInterface* getCollisionInterface_collisionFilterPlugin(struct b3PluginContext* context); - -#ifdef __cplusplus -}; -#endif - -#endif //#define COLLISION_FILTER_PLUGIN_H diff --git a/engine/inc/bullet/SharedMemory/plugins/eglPlugin/eglRendererPlugin.h b/engine/inc/bullet/SharedMemory/plugins/eglPlugin/eglRendererPlugin.h deleted file mode 100644 index dd6eea82..00000000 --- a/engine/inc/bullet/SharedMemory/plugins/eglPlugin/eglRendererPlugin.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef EGL_RENDERER_PLUGIN_H -#define EGL_RENDERER_PLUGIN_H - -#include "../b3PluginAPI.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - - //initPlugin, exitPlugin and executePluginCommand are required, otherwise plugin won't load - B3_SHARED_API int initPlugin_eglRendererPlugin(struct b3PluginContext* context); - B3_SHARED_API void exitPlugin_eglRendererPlugin(struct b3PluginContext* context); - B3_SHARED_API int executePluginCommand_eglRendererPlugin(struct b3PluginContext* context, const struct b3PluginArguments* arguments); - - //all the APIs below are optional - B3_SHARED_API struct UrdfRenderingInterface* getRenderInterface_eglRendererPlugin(struct b3PluginContext* context); - -#ifdef __cplusplus -}; -#endif - -#endif //#define EGL_RENDERER_PLUGIN_H diff --git a/engine/inc/bullet/SharedMemory/plugins/eglPlugin/eglRendererVisualShapeConverter.h b/engine/inc/bullet/SharedMemory/plugins/eglPlugin/eglRendererVisualShapeConverter.h deleted file mode 100644 index 3247bb48..00000000 --- a/engine/inc/bullet/SharedMemory/plugins/eglPlugin/eglRendererVisualShapeConverter.h +++ /dev/null @@ -1,75 +0,0 @@ -#ifndef EGL_RENDERER_VISUAL_SHAPE_CONVERTER_H -#define EGL_RENDERER_VISUAL_SHAPE_CONVERTER_H - -#include "../../../Importers/ImportURDFDemo/UrdfRenderingInterface.h" - -struct EGLRendererVisualShapeConverter : public UrdfRenderingInterface -{ - struct EGLRendererVisualShapeConverterInternalData* m_data; - - EGLRendererVisualShapeConverter(); - - virtual ~EGLRendererVisualShapeConverter(); - - virtual int convertVisualShapes(int linkIndex, const char* pathPrefix, const btTransform& localInertiaFrame, const UrdfLink* linkPtr, const UrdfModel* model, int orgGraphicsUniqueId, int bodyUniqueId, struct CommonFileIOInterface* fileIO); - - virtual int getNumVisualShapes(int bodyUniqueId); - - virtual int getVisualShapesData(int bodyUniqueId, int shapeIndex, struct b3VisualShapeData* shapeData); - - virtual int registerShapeAndInstance(const b3VisualShapeData& visualShape, const float* vertices, int numvertices, const int* indices, int numIndices, int primitiveType, int textureId, int orgGraphicsUniqueId, int bodyUniqueId, int linkIndex); - - virtual void updateShape(int shapeUniqueId, const btVector3* vertices, int numVertices, const btVector3* normals, int numNormals); - - virtual void changeRGBAColor(int bodyUniqueId, int linkIndex, int shapeIndex, const double rgbaColor[4]); - - virtual void changeInstanceFlags(int bodyUniqueId, int linkIndex, int shapeIndex, int flags); - - virtual void changeShapeTexture(int objectUniqueId, int linkIndex, int shapeIndex, int textureUniqueId); - - virtual void removeVisualShape(int shapeUid); - - virtual void setUpAxis(int axis); - - virtual void resetCamera(float camDist, float yaw, float pitch, float camPosX, float camPosY, float camPosZ); - - virtual void clearBuffers(struct TGAColor& clearColor); - - virtual void resetAll(); - - virtual void getWidthAndHeight(int& width, int& height); - virtual void setWidthAndHeight(int width, int height); - virtual void setLightDirection(float x, float y, float z); - virtual void setLightColor(float x, float y, float z); - virtual void setLightDistance(float dist); - virtual void setLightAmbientCoeff(float ambientCoeff); - virtual void setLightDiffuseCoeff(float diffuseCoeff); - virtual void setLightSpecularCoeff(float specularCoeff); - virtual void setShadow(bool hasShadow); - virtual void setFlags(int flags); - - virtual void copyCameraImageData(unsigned char* pixelsRGBA, int rgbaBufferSizeInPixels, float* depthBuffer, int depthBufferSizeInPixels, int* segmentationMaskBuffer, int segmentationMaskSizeInPixels, int startPixelIndex, int* widthPtr, int* heightPtr, int* numPixelsCopied); - void copyCameraImageDataGL(unsigned char* pixelsRGBA, int rgbaBufferSizeInPixels, float* depthBuffer, int depthBufferSizeInPixels, int* segmentationMaskBuffer, int segmentationMaskSizeInPixels, int startPixelIndex, int* widthPtr, int* heightPtr, int* numPixelsCopied); - - virtual void render(); - virtual void render(const float viewMat[16], const float projMat[16]); - - virtual int loadTextureFile(const char* filename, struct CommonFileIOInterface* fileIO); - virtual int registerTexture(unsigned char* texels, int width, int height); - virtual int registerTextureInternal(unsigned char* texels, int width, int height); - - - virtual void setProjectiveTextureMatrices(const float viewMatrix[16], const float projectionMatrix[16]); - virtual void setProjectiveTexture(bool useProjectiveTexture); - - virtual void syncTransform(int shapeUid, const class btTransform& worldTransform, const class btVector3& localScaling); - - virtual void mouseMoveCallback(float x, float y); - virtual void mouseButtonCallback(int button, int state, float x, float y); - - virtual bool getCameraInfo(int* width, int* height, float viewMatrix[16], float projectionMatrix[16], float camUp[3], float camForward[3], float hor[3], float vert[3], float* yaw, float* pitch, float* camDist, float cameraTarget[3]) const; - - -}; - -#endif //EGL_RENDERER_VISUAL_SHAPE_CONVERTER_H diff --git a/engine/inc/bullet/SharedMemory/plugins/fileIOPlugin/fileIOPlugin.h b/engine/inc/bullet/SharedMemory/plugins/fileIOPlugin/fileIOPlugin.h deleted file mode 100644 index 6a850390..00000000 --- a/engine/inc/bullet/SharedMemory/plugins/fileIOPlugin/fileIOPlugin.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef FILE_IO_PLUGIN_H -#define FILE_IO_PLUGIN_H - -#include "../b3PluginAPI.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - - //initPlugin, exitPlugin and executePluginCommand are required, otherwise plugin won't load - B3_SHARED_API int initPlugin_fileIOPlugin(struct b3PluginContext* context); - B3_SHARED_API void exitPlugin_fileIOPlugin(struct b3PluginContext* context); - B3_SHARED_API int executePluginCommand_fileIOPlugin(struct b3PluginContext* context, const struct b3PluginArguments* arguments); - - //all the APIs below are optional - B3_SHARED_API struct CommonFileIOInterface* getFileIOFunc_fileIOPlugin(struct b3PluginContext* context); - - -#ifdef __cplusplus -}; -#endif - -#endif //#define FILE_IO_PLUGIN_H diff --git a/engine/inc/bullet/SharedMemory/plugins/fileIOPlugin/zipFileIO.h b/engine/inc/bullet/SharedMemory/plugins/fileIOPlugin/zipFileIO.h deleted file mode 100644 index ab1a5ace..00000000 --- a/engine/inc/bullet/SharedMemory/plugins/fileIOPlugin/zipFileIO.h +++ /dev/null @@ -1,305 +0,0 @@ - -#include "minizip/unzip.h" - -#define B3_ZIP_FILEIO_MAX_FILES 1024 - -struct ZipFileIO : public CommonFileIOInterface -{ - std::string m_zipfileName; - - unzFile m_fileHandles[B3_ZIP_FILEIO_MAX_FILES ]; - int m_numFileHandles; - unzFile m_zipfile; - voidpf m_stream; - unz_global_info m_global_info; - bool m_memoryFile; - b3AlignedObjectArray m_buffer; - - ZipFileIO(int fileIOType, const char* zipfileName, CommonFileIOInterface* wrapperFileIO) - :CommonFileIOInterface(fileIOType,0), - m_zipfileName(zipfileName), - m_numFileHandles(0), - m_stream(0), - m_memoryFile(false) - { - m_pathPrefix = m_zipfileName.c_str(); - for (int i=0;ifileOpen(m_zipfileName.c_str(), "rb"); - if (fileIO >= 0) - { - int stream_size = wrapperFileIO->getFileSize(fileIO); - m_buffer.resize(stream_size); - int read_bytes = wrapperFileIO->fileRead(fileIO, &m_buffer[0], stream_size); - b3Assert(read_bytes == stream_size); - if (read_bytes != stream_size) - { - printf("Error: mismatch reading file %s, expected %d bytes, read %d\n", m_zipfileName.c_str(), stream_size, read_bytes); - } - zlib_filefunc_def api; // callbacks for in-mem file - - m_stream = mem_simple_create_file(&api, &m_buffer[0], stream_size); - - m_zipfile = unzAttach(m_stream, &api); - m_memoryFile = true; - wrapperFileIO->fileClose(fileIO); - } - } - } - - - - static bool FileIOPluginFindFile(void* userPtr, const char* orgFileName, char* relativeFileName, int maxRelativeFileNameMaxLen) - { - ZipFileIO* fileIo = (ZipFileIO*) userPtr; - return fileIo->findFile(orgFileName, relativeFileName, maxRelativeFileNameMaxLen); - } - - void closeZipFile() - { - if (m_zipfile) - { - if (m_memoryFile) - { - unzDetach(&m_zipfile); - } - else - { - unzClose(m_zipfile); - } - } - m_zipfile = 0; - } - - virtual ~ZipFileIO() - { - for (int i=0;i=0) - { - - if (m_zipfile == NULL) - { - printf("%s: not found\n", m_zipfileName.c_str()); - slot = -1; - } else - { - - int result = 0; - result = unzGetGlobalInfo(m_zipfile, &m_global_info ); - if (result != UNZ_OK) - { - printf("could not read file global info from %s\n", m_zipfileName.c_str()); - slot = -1; - } - } - if (slot >=0) - { - int result = unzLocateFile(m_zipfile, fileName, 0); - if (result == UNZ_OK) - { - unz_file_info info; - result = unzGetCurrentFileInfo(m_zipfile, &info, NULL, 0, NULL, 0, NULL, 0); - if (result != UNZ_OK) - { - printf("unzGetCurrentFileInfo() != UNZ_OK (%d)\n", result); - slot=-1; - } - else - { - result = unzOpenCurrentFile(m_zipfile); - if (result == UNZ_OK) - { - printf("zipFile::fileOpen %s in mode %s in fileHandle %d\n", fileName, mode, slot); - m_fileHandles[slot] = m_zipfile; - } else - { - slot=-1; - } - } - } else - { - slot=-1; - - } - } - } - return slot; - } - virtual int fileRead(int fileHandle, char* destBuffer, int numBytes) - { - int result = -1; - if (fileHandle>=0 && fileHandle < B3_ZIP_FILEIO_MAX_FILES ) - { - unzFile f = m_fileHandles[fileHandle]; - if (f) - { - result = unzReadCurrentFile(f, destBuffer,numBytes); - //::fread(destBuffer, 1, numBytes, f); - } - } - return result; - - } - virtual int fileWrite(int fileHandle,const char* sourceBuffer, int numBytes) - { -#if 0 - if (fileHandle>=0 && fileHandle < B3_ZIP_FILEIO_MAX_FILES ) - { - FILE* f = m_fileHandles[fileHandle]; - if (f) - { - return ::fwrite(sourceBuffer, 1, numBytes,m_fileHandles[fileHandle]); - } - } -#endif - return -1; - } - virtual void fileClose(int fileHandle) - { - if (fileHandle>=0 && fileHandle < B3_ZIP_FILEIO_MAX_FILES ) - { - unzFile f = m_fileHandles[fileHandle]; - if (f) - { - printf("zipFile::fileClose slot %d\n", fileHandle); - m_fileHandles[fileHandle]=0; - } - } - } - - virtual bool findResourcePath(const char* fileName, char* relativeFileName, int relativeFileNameSizeInBytes) - { - return b3ResourcePath::findResourcePath(fileName, relativeFileName, relativeFileNameSizeInBytes, ZipFileIO::FileIOPluginFindFile, this); - } - - - virtual bool findFile(const char* orgFileName, char* relativeFileName, int maxRelativeFileNameMaxLen) - { - int fileHandle = -1; - fileHandle = fileOpen(orgFileName, "rb"); - if (fileHandle>=0) - { - //printf("original file found: [%s]\n", orgFileName); - sprintf(relativeFileName, "%s", orgFileName); - fileClose(fileHandle); - return true; - } - - //printf("Trying various directories, relative to current working directory\n"); - const char* prefix[] = {"./", "./data/", "../data/", "../../data/", "../../../data/", "../../../../data/"}; - int numPrefixes = sizeof(prefix) / sizeof(const char*); - - int f = 0; - bool fileFound = false; - - for (int i = 0; !f && i < numPrefixes; i++) - { -#ifdef _MSC_VER - sprintf_s(relativeFileName, maxRelativeFileNameMaxLen, "%s%s", prefix[i], orgFileName); -#else - sprintf(relativeFileName, "%s%s", prefix[i], orgFileName); -#endif - f = fileOpen(relativeFileName, "rb"); - if (f>=0) - { - fileFound = true; - break; - } - } - if (f>=0) - { - fileClose(f); - } - - return fileFound; - } - virtual char* readLine(int fileHandle, char* destBuffer, int numBytes) - { - int numRead = 0; - - if (fileHandle>=0 && fileHandle < B3_ZIP_FILEIO_MAX_FILES ) - { - unzFile f = m_fileHandles[fileHandle]; - if (f) - { - //return ::fgets(destBuffer, numBytes, m_fileHandles[fileHandle]); - char c = 0; - do - { - fileRead(fileHandle,&c,1); - if (c && c!='\n') - { - if (c!=13) - { - destBuffer[numRead++]=c; - } else - { - destBuffer[numRead++]=0; - } - } - } while (c != 0 && c != '\n' && numRead<(numBytes-1)); - } - } - if (numRead0) - { - destBuffer[numRead]=0; - return &destBuffer[0]; - } - return 0; - } - virtual int getFileSize(int fileHandle) - { - int size=0; - - if (fileHandle>=0 && fileHandle < B3_ZIP_FILEIO_MAX_FILES ) - { - unzFile f = m_fileHandles[fileHandle]; - if (f) - { - unz_file_info info; - int result = unzGetCurrentFileInfo(f, &info, NULL, 0, NULL, 0, NULL, 0); - if (result == UNZ_OK) - { - size = info.uncompressed_size; - } - } - } - return size; - } - - virtual void enableFileCaching(bool enable) - { - (void)enable; - } - -}; diff --git a/engine/inc/bullet/SharedMemory/plugins/grpcPlugin/grpcPlugin.h b/engine/inc/bullet/SharedMemory/plugins/grpcPlugin/grpcPlugin.h deleted file mode 100644 index 1e1e2367..00000000 --- a/engine/inc/bullet/SharedMemory/plugins/grpcPlugin/grpcPlugin.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef GRPC_PLUGIN_H -#define GRPC_PLUGIN_H - -#include "../b3PluginAPI.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - - //the following 3 APIs are required - B3_SHARED_API int initPlugin_grpcPlugin(struct b3PluginContext* context); - B3_SHARED_API void exitPlugin_grpcPlugin(struct b3PluginContext* context); - B3_SHARED_API int executePluginCommand_grpcPlugin(struct b3PluginContext* context, const struct b3PluginArguments* arguments); - - //all the APIs below are optional - B3_SHARED_API int preTickPluginCallback_grpcPlugin(struct b3PluginContext* context); - B3_SHARED_API int postTickPluginCallback_grpcPlugin(struct b3PluginContext* context); - - B3_SHARED_API int processClientCommands_grpcPlugin(struct b3PluginContext* context); - -#ifdef __cplusplus -}; -#endif - -#endif //#define GRPC_PLUGIN_H diff --git a/engine/inc/bullet/SharedMemory/plugins/pdControlPlugin/pdControlPlugin.h b/engine/inc/bullet/SharedMemory/plugins/pdControlPlugin/pdControlPlugin.h deleted file mode 100644 index 1fc86912..00000000 --- a/engine/inc/bullet/SharedMemory/plugins/pdControlPlugin/pdControlPlugin.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef PID_CONTROL_PLUGIN_H -#define PID_CONTROL_PLUGIN_H - -#include "../b3PluginAPI.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - - //the following 3 APIs are required - B3_SHARED_API int initPlugin_pdControlPlugin(struct b3PluginContext* context); - B3_SHARED_API void exitPlugin_pdControlPlugin(struct b3PluginContext* context); - B3_SHARED_API int executePluginCommand_pdControlPlugin(struct b3PluginContext* context, const struct b3PluginArguments* arguments); - - /// - enum PDControlCommandEnum - { - eSetPDControl = 1, - eRemovePDControl = 2, - }; - - //all the APIs below are optional - B3_SHARED_API int preTickPluginCallback_pdControlPlugin(struct b3PluginContext* context); - -#ifdef __cplusplus -}; -#endif - -#endif //#define PID_CONTROL_PLUGIN_H diff --git a/engine/inc/bullet/SharedMemory/plugins/stablePDPlugin/BulletConversion.h b/engine/inc/bullet/SharedMemory/plugins/stablePDPlugin/BulletConversion.h deleted file mode 100644 index 0ae62c9e..00000000 --- a/engine/inc/bullet/SharedMemory/plugins/stablePDPlugin/BulletConversion.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef BULLET_CONVERSION_H -#define BULLET_CONVERSION_H - -class btMultiBody; -#include "MathUtil.h" -void btExtractJointBodyFromBullet(const btMultiBody* bulletMB, Eigen::MatrixXd& bodyDefs, Eigen::MatrixXd& jointMat); - - -#endif //BULLET_CONVERSION_H \ No newline at end of file diff --git a/engine/inc/bullet/SharedMemory/plugins/stablePDPlugin/KinTree.h b/engine/inc/bullet/SharedMemory/plugins/stablePDPlugin/KinTree.h deleted file mode 100644 index a1c459f4..00000000 --- a/engine/inc/bullet/SharedMemory/plugins/stablePDPlugin/KinTree.h +++ /dev/null @@ -1,270 +0,0 @@ -#pragma once - -#include -#include -#include "Shape.h" -#ifdef USE_JSON -#include "json/json.h" -#endif -#include "MathUtil.h" - -class cKinTree -{ -public: - // description of the joint tree representing an articulated figure - enum eJointType - { - eJointTypeRevolute, - eJointTypePlanar, - eJointTypePrismatic, - eJointTypeFixed, - eJointTypeSpherical, - eJointTypeNone, - eJointTypeMax - }; - - enum eJointDesc - { - eJointDescType, - eJointDescParent, - eJointDescAttachX, - eJointDescAttachY, - eJointDescAttachZ, - eJointDescAttachThetaX, // euler angles order rot(Z) * rot(Y) * rot(X) - eJointDescAttachThetaY, - eJointDescAttachThetaZ, - eJointDescLimLow0, - eJointDescLimLow1, - eJointDescLimLow2, - eJointDescLimHigh0, - eJointDescLimHigh1, - eJointDescLimHigh2, - eJointDescTorqueLim, - eJointDescForceLim, - eJointDescIsEndEffector, - eJointDescDiffWeight, - eJointDescParamOffset, - eJointDescMax - }; - typedef Eigen::Matrix tJointDesc; - - enum eBodyParam - { - eBodyParamShape, - eBodyParamMass, - eBodyParamColGroup, // 0 collides with nothing and 1 collides with everything - eBodyParamEnableFallContact, - eBodyParamAttachX, - eBodyParamAttachY, - eBodyParamAttachZ, - eBodyParamAttachThetaX, // Euler angles order XYZ - eBodyParamAttachThetaY, - eBodyParamAttachThetaZ, - eBodyParam0, - eBodyParam1, - eBodyParam2, - eBodyColorR, - eBodyColorG, - eBodyColorB, - eBodyColorA, - eBodyParamMax - }; - typedef Eigen::Matrix tBodyDef; - - enum eDrawShape - { - eDrawShapeShape, - eDrawShapeParentJoint, - eDrawShapeAttachX, - eDrawShapeAttachY, - eDrawShapeAttachZ, - eDrawShapeAttachThetaX, // Euler angles order XYZ - eDrawShapeAttachThetaY, - eDrawShapeAttachThetaZ, - eDrawShapeParam0, - eDrawShapeParam1, - eDrawShapeParam2, - eDrawShapeColorR, - eDrawShapeColorG, - eDrawShapeColorB, - eDrawShapeColorA, - eDrawShapeMeshID, - eDrawShapeParamMax - }; - typedef Eigen::Matrix tDrawShapeDef; - - static const int gInvalidJointID; - static const int gPosDim; - static const int gRotDim; - static const int gRootDim; - - static bool HasValidRoot(const Eigen::MatrixXd& joint_mat); - static tVector GetRootPos(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& state); - static void SetRootPos(const Eigen::MatrixXd& joint_mat, const tVector& pos, Eigen::VectorXd& out_state); - static tQuaternion GetRootRot(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& state); - static void SetRootRot(const Eigen::MatrixXd& joint_mat, const tQuaternion& rot, Eigen::VectorXd& out_state); - static tVector GetRootVel(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& vel); - static void SetRootVel(const Eigen::MatrixXd& joint_mat, const tVector& vel, Eigen::VectorXd& out_vel); - static tVector GetRootAngVel(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& vel); - static void SetRootAngVel(const Eigen::MatrixXd& joint_mat, const tVector& ang_vel, Eigen::VectorXd& out_vel); - - static tVector CalcJointWorldPos(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& state, int joint_id); - static tVector LocalToWorldPos(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& state, int parent_id, const tVector& attach_pt); - static tQuaternion CalcJointWorldRot(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& state, int joint_id); - static void CalcJointWorldTheta(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& state, int joint_id, tVector& out_axis, double& out_theta); - - static tVector CalcJointWorldVel(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& state, const Eigen::VectorXd& vel, int joint_id); - static tVector CalcWorldVel(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& state, const Eigen::VectorXd& vel, int parent_id, const tVector& attach_pt); - static tVector CalcJointWorldAngularVel(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& state, const Eigen::VectorXd& vel, int joint_id); - static tVector CalcWorldAngularVel(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& state, const Eigen::VectorXd& vel, int parent_id, const tVector& attach_pt); - - static int GetNumDof(const Eigen::MatrixXd& joint_mat); - static void ApplyStep(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& step, Eigen::VectorXd& out_pose); - - static Eigen::VectorXi FindJointChain(const Eigen::MatrixXd& joint_mat, int joint_beg, int joint_end); - static bool IsAncestor(const Eigen::MatrixXd& joint_mat, int child_joint, int ancestor_joint, int& out_len); - static double CalcChainLength(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXi& chain); - - static void CalcAABB(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& state, tVector& out_min, tVector& out_max); - - static int GetParamOffset(const Eigen::MatrixXd& joint_mat, int joint_id); - static int GetParamSize(const Eigen::MatrixXd& joint_mat, int joint_id); - static int GetJointParamSize(eJointType joint_type); - static void GetJointParams(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& state, int j, Eigen::VectorXd& out_params); - static void SetJointParams(const Eigen::MatrixXd& joint_mat, int j, const Eigen::VectorXd& params, Eigen::VectorXd& out_state); - static eJointType GetJointType(const Eigen::MatrixXd& joint_mat, int joint_id); - static int GetParent(const Eigen::MatrixXd& joint_mat, int joint_id); - static bool HasParent(const Eigen::MatrixXd& joint_mat, int joint_id); - static bool IsRoot(const Eigen::MatrixXd& joint_mat, int joint_id); - static bool IsJointActuated(const Eigen::MatrixXd& joint_mat, int joint_id); - static double GetTorqueLimit(const Eigen::MatrixXd& joint_mat, int joint_id); - static double GetForceLimit(const Eigen::MatrixXd& joint_mat, int joint_id); - static bool IsEndEffector(const Eigen::MatrixXd& joint_mat, int joint_id); - - static tVector GetJointLimLow(const Eigen::MatrixXd& joint_mat, int joint_id); - static tVector GetJointLimHigh(const Eigen::MatrixXd& joint_mat, int joint_id); - static double GetJointDiffWeight(const Eigen::MatrixXd& joint_mat, int joint_id); - - static double CalcLinkLength(const Eigen::MatrixXd& joint_mat, int joint_id); - static tVector GetAttachPt(const Eigen::MatrixXd& joint_mat, int joint_id); - static tVector GetAttachTheta(const Eigen::MatrixXd& joint_mat, int joint_id); - - // calculates the longest chain in the subtree of each joint - static void CalcMaxSubChainLengths(const Eigen::MatrixXd& joint_mat, Eigen::VectorXd& out_lengths); - static void CalcSubTreeMasses(const Eigen::MatrixXd& joint_mat, const Eigen::MatrixXd& body_defs, Eigen::VectorXd& out_masses); - - static tMatrix BuildAttachTrans(const Eigen::MatrixXd& joint_mat, int joint_id); - static tMatrix ChildParentTrans(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& state, int joint_id); - static tMatrix ParentChildTrans(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& state, int joint_id); - static tMatrix JointWorldTrans(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& state, int joint_id); - static tMatrix WorldJointTrans(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& state, int joint_id); - -#ifdef USE_JSON - static bool Load(const Json::Value& root, Eigen::MatrixXd& out_joint_mat); - static bool ParseBodyDef(const Json::Value& root, tBodyDef& out_def); - static bool ParseDrawShapeDef(const Json::Value& root, tDrawShapeDef& out_def); - static std::string BuildJointMatJson(const Eigen::MatrixXd& joint_mat); - static std::string BuildJointJson(int id, const tJointDesc& joint_desc); - static bool ParseJoint(const Json::Value& root, tJointDesc& out_joint_desc); -#endif - - static int GetNumJoints(const Eigen::MatrixXd& joint_mat); - static int GetRoot(const Eigen::MatrixXd& joint_mat); - static void FindChildren(const Eigen::MatrixXd& joint_mat, int joint_id, Eigen::VectorXi& out_children); - - static bool LoadBodyDefs(const std::string& char_file, Eigen::MatrixXd& out_body_defs); - - static bool LoadDrawShapeDefs(const std::string& char_file, Eigen::MatrixXd& out_draw_defs); - - static cShape::eShape GetBodyShape(const Eigen::MatrixXd& body_defs, int part_id); - static tVector GetBodyAttachPt(const Eigen::MatrixXd& body_defs, int part_id); - static tVector GetBodyAttachTheta(const Eigen::MatrixXd& body_defs, int part_id); - static void GetBodyRotation(const Eigen::MatrixXd& body_defs, int part_id, tVector& out_axis, double& out_theta); - static double GetBodyMass(const Eigen::MatrixXd& body_defs, int part_id); - static int GetBodyColGroup(const Eigen::MatrixXd& body_defs, int part_id); - static bool GetBodyEnableFallContact(const Eigen::MatrixXd& body_defs, int part_id); - static void SetBodyEnableFallContact(int part_id, bool enable, Eigen::MatrixXd& out_body_defs); - static tVector GetBodySize(const Eigen::MatrixXd& body_defs, int part_id); - static tVector GetBodyColor(const Eigen::MatrixXd& body_defs, int part_id); - static double CalcTotalMass(const Eigen::MatrixXd& body_defs); - static bool IsValidBody(const Eigen::MatrixXd& body_defs, int part_id); - static tVector GetBodyLocalCoM(const Eigen::MatrixXd& body_defs, int part_id); - - static int GetDrawShapeParentJoint(const tDrawShapeDef& shape); - static tVector GetDrawShapeAttachPt(const tDrawShapeDef& shape); - static tVector GetDrawShapeAttachTheta(const tDrawShapeDef& shape); - static void GetDrawShapeRotation(const tDrawShapeDef& shape, tVector& out_axis, double& out_theta); - static tVector GetDrawShapeColor(const tDrawShapeDef& shape); - static int GetDrawShapeMeshID(const tDrawShapeDef& shape); - - static tVector CalcBodyPartPos(const Eigen::MatrixXd& joint_mat, const Eigen::MatrixXd& body_defs, const Eigen::VectorXd& state, int part_id); - static tVector CalcBodyPartVel(const Eigen::MatrixXd& joint_mat, const Eigen::MatrixXd& body_defs, const Eigen::VectorXd& state, const Eigen::VectorXd& vel, int part_id); - static void CalcBodyPartRotation(const Eigen::MatrixXd& joint_mat, const Eigen::MatrixXd& body_defs, const Eigen::VectorXd& state, int part_id, tVector& out_axis, double& out_theta); - static tMatrix BodyWorldTrans(const Eigen::MatrixXd& joint_mat, const Eigen::MatrixXd& body_defs, const Eigen::VectorXd& state, int part_id); - static tMatrix BodyJointTrans(const Eigen::MatrixXd& body_defs, int part_id); - - static tJointDesc BuildJointDesc(eJointType joint_type, int parent_id, const tVector& attach_pt); - static tJointDesc BuildJointDesc(); - static tBodyDef BuildBodyDef(); - static tDrawShapeDef BuildDrawShapeDef(); - - static void BuildDefaultPose(const Eigen::MatrixXd& joint_mat, Eigen::VectorXd& out_pose); - static void BuildDefaultVel(const Eigen::MatrixXd& joint_mat, Eigen::VectorXd& out_vel); - - static void CalcPoseDiff(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& pose0, const Eigen::VectorXd& pose1, Eigen::VectorXd& out_diff); - static tVector CalcRootPosDiff(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& pose0, const Eigen::VectorXd& pose1); - static tQuaternion CalcRootRotDiff(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& pose0, const Eigen::VectorXd& pose1); - static double CalcPoseErr(const Eigen::MatrixXd& joint_mat, int joint_id, const Eigen::VectorXd& pose0, const Eigen::VectorXd& pose1); - static double CalcRootPosErr(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& pose0, const Eigen::VectorXd& pose1); - static double CalcRootRotErr(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& pose0, const Eigen::VectorXd& pose1); - - static void CalcVelDiff(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& vel0, const Eigen::VectorXd& vel1, Eigen::VectorXd& out_diff); - static tVector CalcRootVelDiff(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& pose0, const Eigen::VectorXd& pose1); - static tVector CalcRootAngVelDiff(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& pose0, const Eigen::VectorXd& pose1); - static double CalcVelErr(const Eigen::MatrixXd& joint_mat, int joint_id, const Eigen::VectorXd& vel0, const Eigen::VectorXd& vel1); - static double CalcRootVelErr(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& vel0, const Eigen::VectorXd& vel1); - static double CalcRootAngVelErr(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& vel0, const Eigen::VectorXd& vel1); - - static void CalcVel(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& pose0, const Eigen::VectorXd& pose1, double dt, Eigen::VectorXd& out_vel); - - static void PostProcessPose(const Eigen::MatrixXd& joint_mat, Eigen::VectorXd& out_pose); - static void LerpPoses(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& pose0, const Eigen::VectorXd& pose1, double lerp, Eigen::VectorXd& out_pose); - static void VelToPoseDiff(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& pose, const Eigen::VectorXd& vel, Eigen::VectorXd& out_pose_diff); - - static double CalcHeading(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& pose); - static tQuaternion CalcHeadingRot(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& pose); - static tMatrix BuildHeadingTrans(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& pose); - static tMatrix BuildOriginTrans(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& pose); - static void NormalizePoseHeading(const Eigen::MatrixXd& joint_mat, Eigen::VectorXd& out_pose); - static void NormalizePoseHeading(const Eigen::MatrixXd& joint_mat, Eigen::VectorXd& out_pose, Eigen::VectorXd& out_vel); - - - -protected: - static bool ParseJointType(const std::string& type_str, eJointType& out_joint_type); - static void PostProcessJointMat(Eigen::MatrixXd& out_joint_mat); - - static tMatrix ChildParentTransRoot(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& state, int joint_id); - static tMatrix ChildParentTransRevolute(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& state, int joint_id); - static tMatrix ChildParentTransPlanar(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& state, int joint_id); - static tMatrix ChildParentTransFixed(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& state, int joint_id); - static tMatrix ChildParentTransPrismatic(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& state, int joint_id); - static tMatrix ChildParentTransSpherical(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& state, int joint_id); - - static void BuildDefaultPoseRoot(const Eigen::MatrixXd& joint_mat, Eigen::VectorXd& out_pose); - static void BuildDefaultPoseRevolute(Eigen::VectorXd& out_pose); - static void BuildDefaultPosePrismatic(Eigen::VectorXd& out_pose); - static void BuildDefaultPosePlanar(Eigen::VectorXd& out_pose); - static void BuildDefaultPoseFixed(Eigen::VectorXd& out_pose); - static void BuildDefaultPoseSpherical(Eigen::VectorXd& out_pose); - - static void BuildDefaultVelRoot(const Eigen::MatrixXd& joint_mat, Eigen::VectorXd& out_pose); - static void BuildDefaultVelRevolute(Eigen::VectorXd& out_pose); - static void BuildDefaultVelPrismatic(Eigen::VectorXd& out_pose); - static void BuildDefaultVelPlanar(Eigen::VectorXd& out_pose); - static void BuildDefaultVelFixed(Eigen::VectorXd& out_pose); - static void BuildDefaultVelSpherical(Eigen::VectorXd& out_pose); - - static void CalcJointPoseDiff(const Eigen::MatrixXd& joint_mat, int joint_id, const Eigen::VectorXd& pose0, const Eigen::VectorXd& pose1, Eigen::VectorXd& out_diff); - static void CalcJointVelDiff(const Eigen::MatrixXd& joint_mat, int joint_id, const Eigen::VectorXd& vel0, const Eigen::VectorXd& vel1, Eigen::VectorXd& out_diff); -}; diff --git a/engine/inc/bullet/SharedMemory/plugins/stablePDPlugin/MathUtil.h b/engine/inc/bullet/SharedMemory/plugins/stablePDPlugin/MathUtil.h deleted file mode 100644 index 4c443235..00000000 --- a/engine/inc/bullet/SharedMemory/plugins/stablePDPlugin/MathUtil.h +++ /dev/null @@ -1,131 +0,0 @@ -#pragma once - - -#include "Eigen/Dense" -#include "Eigen/StdVector" -#include "Eigen/Geometry" - -#define _USE_MATH_DEFINES -#include "math.h" - -const int gInvalidIdx = -1; - -// for convenience define standard vector for rendering -typedef Eigen::Vector4d tVector; -typedef Eigen::Vector4d tVector3; -typedef Eigen::Matrix4d tMatrix; -typedef Eigen::Matrix3d tMatrix3; -typedef Eigen::Quaterniond tQuaternion; - - -const double gRadiansToDegrees = 57.2957795; -const double gDegreesToRadians = 1.0 / gRadiansToDegrees; -const tVector gGravity = tVector(0, -9.8, 0, 0); -const double gInchesToMeters = 0.0254; -const double gFeetToMeters = 0.3048; - -class cMathUtil -{ -public: - enum eAxis - { - eAxisX, - eAxisY, - eAxisZ, - eAxisMax - }; - - static int Clamp(int val, int min, int max); - static void Clamp(const Eigen::VectorXd& min, const Eigen::VectorXd& max, Eigen::VectorXd& out_vec); - static double Clamp(double val, double min, double max); - static double Saturate(double val); - static double Lerp(double t, double val0, double val1); - - static double NormalizeAngle(double theta); - - static double SmoothStep(double t); - - // matrices - static tMatrix TranslateMat(const tVector& trans); - static tMatrix ScaleMat(double scale); - static tMatrix ScaleMat(const tVector& scale); - static tMatrix RotateMat(const tVector& euler); // euler angles order rot(Z) * rot(Y) * rot(X) - static tMatrix RotateMat(const tVector& axis, double theta); - static tMatrix RotateMat(const tQuaternion& q); - static tMatrix CrossMat(const tVector& a); - // inverts a transformation consisting only of rotations and translations - static tMatrix InvRigidMat(const tMatrix& mat); - static tVector GetRigidTrans(const tMatrix& mat); - static tVector InvEuler(const tVector& euler); - static void RotMatToAxisAngle(const tMatrix& mat, tVector& out_axis, double& out_theta); - static tVector RotMatToEuler(const tMatrix& mat); - static tQuaternion RotMatToQuaternion(const tMatrix& mat); - static void EulerToAxisAngle(const tVector& euler, tVector& out_axis, double& out_theta); - - static tMatrix DirToRotMat(const tVector& dir, const tVector& up); - - static void DeltaRot(const tVector& axis0, double theta0, const tVector& axis1, double theta1, - tVector& out_axis, double& out_theta); - static tMatrix DeltaRot(const tMatrix& R0, const tMatrix& R1); - - static tQuaternion EulerToQuaternion(const tVector& euler); - - static tQuaternion AxisAngleToQuaternion(const tVector& axis, double theta); - static void QuaternionToAxisAngle(const tQuaternion& q, tVector& out_axis, double& out_theta); - static tMatrix BuildQuaternionDiffMat(const tQuaternion& q); - static tVector CalcQuaternionVel(const tQuaternion& q0, const tQuaternion& q1, double dt); - static tVector CalcQuaternionVelRel(const tQuaternion& q0, const tQuaternion& q1, double dt); - static tQuaternion VecToQuat(const tVector& v); - static tVector QuatToVec(const tQuaternion& q); - static tQuaternion QuatDiff(const tQuaternion& q0, const tQuaternion& q1); - static double QuatDiffTheta(const tQuaternion& q0, const tQuaternion& q1); - static double QuatTheta(const tQuaternion& dq); - static tQuaternion VecDiffQuat(const tVector& v0, const tVector& v1); - static tVector QuatRotVec(const tQuaternion& q, const tVector& dir); - static tQuaternion MirrorQuaternion(const tQuaternion& q, eAxis axis); - - static double Sign(double val); - static int Sign(int val); - - static double AddAverage(double avg0, int count0, double avg1, int count1); - static tVector AddAverage(const tVector& avg0, int count0, const tVector& avg1, int count1); - static void AddAverage(const Eigen::VectorXd& avg0, int count0, const Eigen::VectorXd& avg1, int count1, Eigen::VectorXd& out_result); - static void CalcSoftmax(const Eigen::VectorXd& vals, double temp, Eigen::VectorXd& out_prob); - static double EvalGaussian(const Eigen::VectorXd& mean, const Eigen::VectorXd& covar, const Eigen::VectorXd& sample); - static double EvalGaussian(double mean, double covar, double sample); - static double CalcGaussianPartition(const Eigen::VectorXd& covar); - static double EvalGaussianLogp(double mean, double covar, double sample); - static double EvalGaussianLogp(const Eigen::VectorXd& mean, const Eigen::VectorXd& covar, const Eigen::VectorXd& sample); - static double Sigmoid(double x); - static double Sigmoid(double x, double gamma, double bias); - - static tVector CalcBarycentric(const tVector& p, const tVector& a, const tVector& b, const tVector& c); - - static bool ContainsAABB(const tVector& pt, const tVector& aabb_min, const tVector& aabb_max); - static bool ContainsAABB(const tVector& aabb_min0, const tVector& aabb_max0, const tVector& aabb_min1, const tVector& aabb_max1); - static bool ContainsAABBXZ(const tVector& pt, const tVector& aabb_min, const tVector& aabb_max); - static bool ContainsAABBXZ(const tVector& aabb_min0, const tVector& aabb_max0, const tVector& aabb_min1, const tVector& aabb_max1); - static void CalcAABBIntersection(const tVector& aabb_min0, const tVector& aabb_max0, const tVector& aabb_min1, const tVector& aabb_max1, - tVector& out_min, tVector& out_max); - static void CalcAABBUnion(const tVector& aabb_min0, const tVector& aabb_max0, const tVector& aabb_min1, const tVector& aabb_max1, - tVector& out_min, tVector& out_max); - static bool IntersectAABB(const tVector& aabb_min0, const tVector& aabb_max0, const tVector& aabb_min1, const tVector& aabb_max1); - static bool IntersectAABBXZ(const tVector& aabb_min0, const tVector& aabb_max0, const tVector& aabb_min1, const tVector& aabb_max1); - - // check if curr_val and curr_val - delta belong to different intervals - static bool CheckNextInterval(double delta, double curr_val, double int_size); - - - static void QuatSwingTwistDecomposition(const tQuaternion& q, const tVector& dir, tQuaternion& out_swing, tQuaternion& out_twist); - static tQuaternion ProjectQuat(const tQuaternion& q, const tVector& dir); - - static void ButterworthFilter(double dt, double cutoff, Eigen::VectorXd& out_x); - -private: - - template - static T SignAux(T val) - { - return (T(0) < val) - (val < T(0)); - } -}; diff --git a/engine/inc/bullet/SharedMemory/plugins/stablePDPlugin/RBDModel.h b/engine/inc/bullet/SharedMemory/plugins/stablePDPlugin/RBDModel.h deleted file mode 100644 index 93b48457..00000000 --- a/engine/inc/bullet/SharedMemory/plugins/stablePDPlugin/RBDModel.h +++ /dev/null @@ -1,71 +0,0 @@ -#pragma once - -#include "SpAlg.h" -#include "MathUtil.h" - -// this class is mostly to help with efficiency by precomputing some useful -// quantities for RBD calculations -class cRBDModel -{ -public: - EIGEN_MAKE_ALIGNED_OPERATOR_NEW - cRBDModel(); - virtual ~cRBDModel(); - - virtual void Init(const Eigen::MatrixXd& joint_mat, const Eigen::MatrixXd& body_defs, const tVector& gravity); - virtual void Update(const Eigen::VectorXd& pose, const Eigen::VectorXd& vel); - - virtual int GetNumDof() const; - virtual int GetNumJoints() const; - - virtual const tVector& GetGravity() const; - virtual void SetGravity(const tVector& gravity); - - virtual const Eigen::MatrixXd& GetJointMat() const; - virtual const Eigen::MatrixXd& GetBodyDefs() const; - virtual const Eigen::VectorXd& GetPose() const; - virtual const Eigen::VectorXd& GetVel() const; - virtual int GetParent(int j) const; - - virtual const Eigen::MatrixXd& GetMassMat() const; - virtual const Eigen::VectorXd& GetBiasForce() const; - virtual Eigen::MatrixXd& GetInertiaBuffer(); - - virtual tMatrix GetChildParentMat(int j) const; - virtual tMatrix GetParentChildMat(int j) const; - virtual cSpAlg::tSpTrans GetSpChildParentTrans(int j) const; - virtual cSpAlg::tSpTrans GetSpParentChildTrans(int j) const; - - virtual tMatrix GetWorldJointMat(int j) const; - virtual tMatrix GetJointWorldMat(int j) const; - virtual cSpAlg::tSpTrans GetSpWorldJointTrans(int j) const; - virtual cSpAlg::tSpTrans GetSpJointWorldTrans(int j) const; - - virtual const Eigen::Block GetJointSubspace(int j) const; - virtual tVector CalcJointWorldPos(int j) const; - -protected: - tVector mGravity; - Eigen::MatrixXd mJointMat; - Eigen::MatrixXd mBodyDefs; - Eigen::VectorXd mPose; - Eigen::VectorXd mVel; - - Eigen::MatrixXd mJointSubspaceArr; - Eigen::MatrixXd mChildParentMatArr; - Eigen::MatrixXd mSpWorldJointTransArr; - Eigen::MatrixXd mMassMat; - Eigen::VectorXd mBiasForce; - Eigen::MatrixXd mInertiaBuffer; - - virtual void SetPose(const Eigen::VectorXd& pose); - virtual void SetVel(const Eigen::VectorXd& vel); - - virtual void InitJointSubspaceArr(); - - virtual void UpdateJointSubspaceArr(); - virtual void UpdateChildParentMatArr(); - virtual void UpdateSpWorldTrans(); - virtual void UpdateMassMat(); - virtual void UpdateBiasForce(); -}; diff --git a/engine/inc/bullet/SharedMemory/plugins/stablePDPlugin/RBDUtil.h b/engine/inc/bullet/SharedMemory/plugins/stablePDPlugin/RBDUtil.h deleted file mode 100644 index aae03ebd..00000000 --- a/engine/inc/bullet/SharedMemory/plugins/stablePDPlugin/RBDUtil.h +++ /dev/null @@ -1,85 +0,0 @@ -#pragma once - -#include -#include - -#include "RBDModel.h" -#include "KinTree.h" - -class cRBDUtil -{ -public: - static void SolveInvDyna(const cRBDModel& model, const Eigen::VectorXd& acc, Eigen::VectorXd& out_tau); - - static void SolveForDyna(const cRBDModel& model, const Eigen::VectorXd& tau, Eigen::VectorXd& out_acc); - static void SolveForDyna(const cRBDModel& model, const Eigen::VectorXd& tau, const Eigen::VectorXd& total_force, Eigen::VectorXd& out_acc); - - static void BuildMassMat(const cRBDModel& model, Eigen::MatrixXd& out_mass_mat); - static void BuildMassMat(const cRBDModel& model, Eigen::MatrixXd& inertia_buffer, Eigen::MatrixXd& out_mass_mat); - static void BuildBiasForce(const cRBDModel& model, Eigen::VectorXd& out_bias_force); - - static void CalcGravityForce(const cRBDModel& model, Eigen::VectorXd& out_g_force); - - static void BuildEndEffectorJacobian(const cRBDModel& model, int joint_id, Eigen::MatrixXd& out_J); - static void BuildEndEffectorJacobian(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& pose, int joint_id, Eigen::MatrixXd& out_J); - static Eigen::MatrixXd MultJacobianEndEff(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& vel, const Eigen::MatrixXd& J, int joint_id); - - static void BuildJacobian(const cRBDModel& model, Eigen::MatrixXd& out_J); - static Eigen::MatrixXd ExtractEndEffJacobian(const Eigen::MatrixXd& joint_mat, const Eigen::MatrixXd& J, int joint_id); - - static void BuildCOMJacobian(const cRBDModel& model, Eigen::MatrixXd& out_J); - static void BuildCOMJacobian(const cRBDModel& model, const Eigen::MatrixXd& J, Eigen::MatrixXd& out_J); - static void BuildJacobianDot(const cRBDModel& model, Eigen::MatrixXd& out_J_dot); - - static cSpAlg::tSpVec BuildCOMVelProdAcc(const cRBDModel& model); - static cSpAlg::tSpVec BuildCOMVelProdAccAux(const cRBDModel& model, const Eigen::MatrixXd& Jd); - static cSpAlg::tSpVec CalcVelProdAcc(const cRBDModel& model, const Eigen::MatrixXd& Jd, int joint_id); - - static cSpAlg::tSpVec CalcJointWorldVel(const cRBDModel& model, int joint_id); - static cSpAlg::tSpVec CalcJointWorldVel(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& state, const Eigen::VectorXd& vel, int joint_id); - static cSpAlg::tSpVec CalcWorldVel(const cRBDModel& model, int joint_id); - static cSpAlg::tSpVec CalcWorldVel(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& state, const Eigen::VectorXd& vel, int joint_id); - - - static tVector CalcCoMPos(const cRBDModel& model); - static tVector CalcCoMVel(const cRBDModel& model); - static tVector CalcCoMVel(const Eigen::MatrixXd& joint_mat, const Eigen::MatrixXd& body_defs, const Eigen::VectorXd& pose, const Eigen::VectorXd& vel); - static void CalcCoM(const cRBDModel& model, tVector& out_com, tVector& out_vel); - static void CalcCoM(const Eigen::MatrixXd& joint_mat, const Eigen::MatrixXd& body_defs, const Eigen::VectorXd& pose, const Eigen::VectorXd& vel, - tVector& out_com, tVector& out_vel); - - static cSpAlg::tSpTrans BuildParentChildTransform(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& pose, int j); - static cSpAlg::tSpTrans BuildChildParentTransform(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& pose, int j); - - // extract a cSpAlg::tSpTrans from a matrix presentating a stack of transforms - static void CalcWorldJointTransforms(const cRBDModel& model, Eigen::MatrixXd& out_trans_arr); - static bool IsConstJointSubspace(const Eigen::MatrixXd& joint_mat, int j); - static Eigen::MatrixXd BuildJointSubspace(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& pose, int j); - - static cSpAlg::tSpMat BuildMomentInertia(const Eigen::MatrixXd& body_defs, int part_id); - -protected: - - static Eigen::MatrixXd BuildJointSubspaceRoot(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& pose); - static Eigen::MatrixXd BuildJointSubspaceRevolute(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& pose, int j); - static Eigen::MatrixXd BuildJointSubspacePrismatic(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& pose, int j); - static Eigen::MatrixXd BuildJointSubspacePlanar(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& pose, int j); - static Eigen::MatrixXd BuildJointSubspaceFixed(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& pose, int j); - static Eigen::MatrixXd BuildJointSubspaceSpherical(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& pose, int j); - - static cSpAlg::tSpVec BuildCj(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& q, const Eigen::VectorXd& q_dot, int j); - static cSpAlg::tSpVec BuildCjRoot(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& q, const Eigen::VectorXd& q_dot, int j); - static cSpAlg::tSpVec BuildCjRevolute(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& q_dot, int j); - static cSpAlg::tSpVec BuildCjPrismatic(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& q_dot, int j); - static cSpAlg::tSpVec BuildCjPlanar(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& q_dot, int j); - static cSpAlg::tSpVec BuildCjFixed(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& q_dot, int j); - static cSpAlg::tSpVec BuildCjSpherical(const Eigen::MatrixXd& joint_mat, const Eigen::VectorXd& q_dot, int j); - - static cSpAlg::tSpMat BuildMomentInertiaBox(const Eigen::MatrixXd& body_defs, int part_id); - static cSpAlg::tSpMat BuildMomentInertiaCapsule(const Eigen::MatrixXd& body_defs, int part_id); - static cSpAlg::tSpMat BuildMomentInertiaSphere(const Eigen::MatrixXd& body_defs, int part_id); - static cSpAlg::tSpMat BuildMomentInertiaCylinder(const Eigen::MatrixXd& body_defs, int part_id); - - // builds the spatial inertial matrix in the coordinate frame of the parent joint - static cSpAlg::tSpMat BuildInertiaSpatialMat(const Eigen::MatrixXd& body_defs, int part_id); -}; \ No newline at end of file diff --git a/engine/inc/bullet/SharedMemory/plugins/stablePDPlugin/Shape.h b/engine/inc/bullet/SharedMemory/plugins/stablePDPlugin/Shape.h deleted file mode 100644 index e58fdf06..00000000 --- a/engine/inc/bullet/SharedMemory/plugins/stablePDPlugin/Shape.h +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once - -#include - -class cShape -{ -public: - enum eShape - { - eShapeNull, - eShapeBox, - eShapeCapsule, - eShapeSphere, - eShapeCylinder, - eShapePlane, - eShapeMax, - }; - - static bool ParseShape(const std::string& str, cShape::eShape& out_shape); -}; \ No newline at end of file diff --git a/engine/inc/bullet/SharedMemory/plugins/stablePDPlugin/SpAlg.h b/engine/inc/bullet/SharedMemory/plugins/stablePDPlugin/SpAlg.h deleted file mode 100644 index 71051c1a..00000000 --- a/engine/inc/bullet/SharedMemory/plugins/stablePDPlugin/SpAlg.h +++ /dev/null @@ -1,70 +0,0 @@ -#pragma once - -#include "MathUtil.h" - -#define gSpVecSize 6 -#define gSVTransRows 3 -#define gSVTransCols 4 - - -// spatial algebra util -class cSpAlg -{ -public: - - - typedef Eigen::Matrix tSpTrans; - typedef Eigen::Matrix tSpVec; - typedef Eigen::Matrix tSpMat; - - static tSpVec ConvertCoordM(const tSpVec& m0, const tVector& origin0, const tVector& origin1); - // rows of R shoold be the basis for the coordinate frame centered ar origin - static tSpVec ConvertCoordM(const tSpVec& m0, const tVector& origin0, const tMatrix& R0, const tVector& origin1, const tMatrix& R1); - // R is a rotation from coord frame 0 to coord frame 1 - static tSpVec ConvertCoordM(const tSpVec& m0, const tVector& origin0, const tVector& origin1, const tMatrix& R); - - static tSpVec ConvertCoordF(const tSpVec& m0, const tVector& origin0, const tVector& origin1); - static tSpVec ConvertCoordF(const tSpVec& m0, const tVector& origin0, const tMatrix& R0, const tVector& origin1, const tMatrix& R1); - static tSpVec ConvertCoordF(const tSpVec& m0, const tVector& origin0, const tVector& origin1, const tMatrix& R); - - static tSpVec CrossM(const tSpVec& sv, const tSpVec& m); - static Eigen::MatrixXd CrossMs(const tSpVec& sv, const Eigen::MatrixXd& ms); - static tSpVec CrossF(const tSpVec& sv, const tSpVec& f); - static Eigen::MatrixXd CrossFs(const tSpVec& sv, const Eigen::MatrixXd& fs); - - // Spatial Vector methods - static tSpVec BuildSV(const tVector& v); - static tSpVec BuildSV(const tVector& o, const tVector& v); - static tVector GetOmega(const tSpVec& sv); - static void SetOmega(const tVector& o, tSpVec& out_sv); - static tVector GetV(const tSpVec& sv); - static void SetV(const tVector& v, tSpVec& out_sv); - - // tSpTrans methods - static tSpTrans BuildTrans(); - static tSpTrans BuildTrans(const tMatrix& E, const tVector& r); - static tSpTrans BuildTrans(const tVector& r); - - static tSpTrans MatToTrans(const tMatrix& mat); - static tMatrix TransToMat(const tSpTrans& X); - static tSpMat BuildSpatialMatM(const tSpTrans& X); - static tSpMat BuildSpatialMatF(const tSpTrans& X); - static tSpTrans InvTrans(const tSpTrans& X); - static tMatrix GetRot(const tSpTrans& X); - static void SetRot(const tMatrix& E, tSpTrans& out_X); - static tVector GetRad(const tSpTrans& X); - static void SetRad(const tVector& r, tSpTrans& out_X); - - static tSpVec ApplyTransM(const tSpTrans& X, const tSpVec& sv); - static tSpVec ApplyTransF(const tSpTrans& X, const tSpVec& sv); - static Eigen::MatrixXd ApplyTransM(const tSpTrans& X, const Eigen::MatrixXd& sm); - static Eigen::MatrixXd ApplyTransF(const tSpTrans& X, const Eigen::MatrixXd& sm); - static tSpVec ApplyInvTransM(const tSpTrans& X, const tSpVec& sv); - static tSpVec ApplyInvTransF(const tSpTrans& X, const tSpVec& sv); - static Eigen::MatrixXd ApplyInvTransM(const tSpTrans& X, const Eigen::MatrixXd& sm); - static Eigen::MatrixXd ApplyInvTransF(const tSpTrans& X, const Eigen::MatrixXd& sm); - static tSpTrans CompTrans(const tSpTrans& X0, const tSpTrans& X1); - - // extract a tSpTrans from a matrix presentating a stack of transforms - static tSpTrans GetTrans(const Eigen::MatrixXd& trans_arr, int j); -}; diff --git a/engine/inc/bullet/SharedMemory/plugins/testPlugin/testplugin.h b/engine/inc/bullet/SharedMemory/plugins/testPlugin/testplugin.h deleted file mode 100644 index 830e6fb5..00000000 --- a/engine/inc/bullet/SharedMemory/plugins/testPlugin/testplugin.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef TEST_PLUGIN_H -#define TEST_PLUGIN_H - -#include "../b3PluginAPI.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - - //initPlugin, exitPlugin and executePluginCommand are required, otherwise plugin won't load - B3_SHARED_API int initPlugin_testPlugin(struct b3PluginContext* context); - B3_SHARED_API void exitPlugin_testPlugin(struct b3PluginContext* context); - B3_SHARED_API int executePluginCommand_testPlugin(struct b3PluginContext* context, const struct b3PluginArguments* arguments); - - //all the APIs below are optional - B3_SHARED_API int preTickPluginCallback_testPlugin(struct b3PluginContext* context); - B3_SHARED_API int postTickPluginCallback_testPlugin(struct b3PluginContext* context); - -#ifdef __cplusplus -}; -#endif - -#endif //#define TEST_PLUGIN_H diff --git a/engine/inc/bullet/SharedMemory/plugins/tinyRendererPlugin/TinyRendererVisualShapeConverter.h b/engine/inc/bullet/SharedMemory/plugins/tinyRendererPlugin/TinyRendererVisualShapeConverter.h deleted file mode 100644 index e0c342de..00000000 --- a/engine/inc/bullet/SharedMemory/plugins/tinyRendererPlugin/TinyRendererVisualShapeConverter.h +++ /dev/null @@ -1,63 +0,0 @@ -#ifndef TINY_RENDERER_VISUAL_SHAPE_CONVERTER_H -#define TINY_RENDERER_VISUAL_SHAPE_CONVERTER_H - -#include "../../../Importers/ImportURDFDemo/UrdfRenderingInterface.h" - -struct TinyRendererVisualShapeConverter : public UrdfRenderingInterface -{ - struct TinyRendererVisualShapeConverterInternalData* m_data; - - TinyRendererVisualShapeConverter(); - - virtual ~TinyRendererVisualShapeConverter(); - - virtual int convertVisualShapes(int linkIndex, const char* pathPrefix, const btTransform& localInertiaFrame, const UrdfLink* linkPtr, const UrdfModel* model, int orgGraphicsUniqueId, int bodyUniqueId, struct CommonFileIOInterface* fileIO); - - //returns a shapeUniqueId - virtual int registerShapeAndInstance(const b3VisualShapeData& visualShape, const float* vertices, int numvertices, const int* indices, int numIndices, int primitiveType, int textureId, int orgGraphicsUniqueId, int bodyUniqueId, int linkIndex); - - virtual void updateShape(int shapeUniqueId, const btVector3* vertices, int numVertices, const btVector3* normals, int numNormals); - - virtual void removeVisualShape(int shapeUniqueId); - - virtual int getNumVisualShapes(int bodyUniqueId); - - virtual int getVisualShapesData(int bodyUniqueId, int shapeIndex, struct b3VisualShapeData* shapeData); - - virtual void changeRGBAColor(int bodyUniqueId, int linkIndex, int shapeIndex, const double rgbaColor[4]); - - virtual void changeInstanceFlags(int bodyUniqueId, int linkIndex, int shapeIndex, int flags); - - virtual void changeShapeTexture(int bodyUniqueId, int linkIndex, int shapeIndex, int textureUniqueId); - - virtual void setUpAxis(int axis); - - virtual void resetCamera(float camDist, float yaw, float pitch, float camPosX, float camPosY, float camPosZ); - - virtual void clearBuffers(struct TGAColor& clearColor); - - virtual void resetAll(); - - virtual void getWidthAndHeight(int& width, int& height); - virtual void setWidthAndHeight(int width, int height); - virtual void setLightDirection(float x, float y, float z); - virtual void setLightColor(float x, float y, float z); - virtual void setLightDistance(float dist); - virtual void setLightAmbientCoeff(float ambientCoeff); - virtual void setLightDiffuseCoeff(float diffuseCoeff); - virtual void setLightSpecularCoeff(float specularCoeff); - virtual void setShadow(bool hasShadow); - virtual void setFlags(int flags); - - virtual void copyCameraImageData(unsigned char* pixelsRGBA, int rgbaBufferSizeInPixels, float* depthBuffer, int depthBufferSizeInPixels, int* segmentationMaskBuffer, int segmentationMaskSizeInPixels, int startPixelIndex, int* widthPtr, int* heightPtr, int* numPixelsCopied); - - virtual void render(); - virtual void render(const float viewMat[16], const float projMat[16]); - - virtual int loadTextureFile(const char* filename, struct CommonFileIOInterface* fileIO); - virtual int registerTexture(unsigned char* texels, int width, int height); - - virtual void syncTransform(int shapeUniqueId, const class btTransform& worldTransform, const class btVector3& localScaling); -}; - -#endif //TINY_RENDERER_VISUAL_SHAPE_CONVERTER_H diff --git a/engine/inc/bullet/SharedMemory/plugins/tinyRendererPlugin/tinyRendererPlugin.h b/engine/inc/bullet/SharedMemory/plugins/tinyRendererPlugin/tinyRendererPlugin.h deleted file mode 100644 index a7a4a0b0..00000000 --- a/engine/inc/bullet/SharedMemory/plugins/tinyRendererPlugin/tinyRendererPlugin.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef TINY_RENDERER_PLUGIN_H -#define TINY_RENDERER_PLUGIN_H - -#include "../b3PluginAPI.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - - //initPlugin, exitPlugin and executePluginCommand are required, otherwise plugin won't load - B3_SHARED_API int initPlugin_tinyRendererPlugin(struct b3PluginContext* context); - B3_SHARED_API void exitPlugin_tinyRendererPlugin(struct b3PluginContext* context); - B3_SHARED_API int executePluginCommand_tinyRendererPlugin(struct b3PluginContext* context, const struct b3PluginArguments* arguments); - - //all the APIs below are optional - B3_SHARED_API struct UrdfRenderingInterface* getRenderInterface_tinyRendererPlugin(struct b3PluginContext* context); - -#ifdef __cplusplus -}; -#endif - -#endif //#define TEST_PLUGIN_H diff --git a/engine/inc/bullet/SharedMemory/plugins/vrSyncPlugin/vrSyncPlugin.h b/engine/inc/bullet/SharedMemory/plugins/vrSyncPlugin/vrSyncPlugin.h deleted file mode 100644 index 7dcc4b54..00000000 --- a/engine/inc/bullet/SharedMemory/plugins/vrSyncPlugin/vrSyncPlugin.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef TEST_PLUGIN_H -#define TEST_PLUGIN_H - -#include "../b3PluginAPI.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - - //initPlugin, exitPlugin and executePluginCommand are required, otherwise plugin won't load - B3_SHARED_API int initPlugin_vrSyncPlugin(struct b3PluginContext* context); - B3_SHARED_API void exitPlugin_vrSyncPlugin(struct b3PluginContext* context); - B3_SHARED_API int executePluginCommand_vrSyncPlugin(struct b3PluginContext* context, const struct b3PluginArguments* arguments); - - //optional APIs - B3_SHARED_API int preTickPluginCallback_vrSyncPlugin(struct b3PluginContext* context); - -#ifdef __cplusplus -}; -#endif - -#endif //#define TEST_PLUGIN_H diff --git a/engine/inc/bullet/SoftDemo/BunnyMesh.h b/engine/inc/bullet/SoftDemo/BunnyMesh.h deleted file mode 100644 index 1a69f874..00000000 --- a/engine/inc/bullet/SoftDemo/BunnyMesh.h +++ /dev/null @@ -1,1372 +0,0 @@ -#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/engine/inc/bullet/SoftDemo/SoftDemo.h b/engine/inc/bullet/SoftDemo/SoftDemo.h deleted file mode 100644 index 16de2051..00000000 --- a/engine/inc/bullet/SoftDemo/SoftDemo.h +++ /dev/null @@ -1,24 +0,0 @@ - -/* -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 - -#ifndef SOFT_DEMO_H -#define SOFT_DEMO_H - -class CommonExampleInterface* SoftDemoCreateFunc(struct CommonExampleOptions& options); - -#endif //CCD_PHYSICS_DEMO_H diff --git a/engine/inc/bullet/SoftDemo/TorusMesh.h b/engine/inc/bullet/SoftDemo/TorusMesh.h deleted file mode 100644 index 20f358fb..00000000 --- a/engine/inc/bullet/SoftDemo/TorusMesh.h +++ /dev/null @@ -1,916 +0,0 @@ -#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/engine/inc/bullet/ThirdPartyLibs/BussIK/Jacobian.h b/engine/inc/bullet/ThirdPartyLibs/BussIK/Jacobian.h deleted file mode 100644 index 915e56aa..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/BussIK/Jacobian.h +++ /dev/null @@ -1,146 +0,0 @@ - -/* -* -* Inverse Kinematics software, with several solvers including -* Selectively Damped Least Squares Method -* Damped Least Squares Method -* Pure Pseudoinverse Method -* Jacobian Transpose Method -* -* -* Author: Samuel R. Buss, sbuss@ucsd.edu. -* Web page: http://www.math.ucsd.edu/~sbuss/ResearchWeb/ikmethods/index.html -* -* -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 "Node.h" -#include "Tree.h" -#include "MathMisc.h" -#include "LinearR3.h" -#include "VectorRn.h" -#include "MatrixRmn.h" - -#ifndef _CLASS_JACOBIAN -#define _CLASS_JACOBIAN - -#ifdef _DYNAMIC -const double BASEMAXDIST = 0.02; -#else -const double MAXDIST = 0.08; // optimal value for double Y shape : 0.08 -#endif -const double DELTA = 0.4; -const long double LAMBDA = 2.0; // only for DLS. optimal : 0.24 -const double NEARZERO = 0.0000000001; - -enum UpdateMode -{ - JACOB_Undefined = 0, - JACOB_JacobianTranspose = 1, - JACOB_PseudoInverse = 2, - JACOB_DLS = 3, - JACOB_SDLS = 4 -}; - -class Jacobian -{ -public: - Jacobian(Tree*); - Jacobian(bool useAngularJacobian, int nDof, int numEndEffectors); - - void ComputeJacobian(VectorR3* targets); - const MatrixRmn& ActiveJacobian() const { return *Jactive; } - void SetJendActive() { Jactive = &Jend; } // The default setting is Jend. - void SetJtargetActive() { Jactive = &Jtarget; } - void SetJendTrans(MatrixRmn& J); - void SetDeltaS(VectorRn& S); - - void CalcDeltaThetas(MatrixRmn& AugMat); // Use this only if the Current Mode has been set. - void ZeroDeltaThetas(); - void CalcDeltaThetasTranspose(); - void CalcDeltaThetasPseudoinverse(); - void CalcDeltaThetasDLS(MatrixRmn& AugMat); - void CalcDeltaThetasDLS2(const VectorRn& dVec, MatrixRmn& AugMat); - void CalcDeltaThetasDLSwithSVD(); - void CalcDeltaThetasSDLS(); - void CalcDeltaThetasDLSwithNullspace(const VectorRn& desiredV, MatrixRmn& AugMat); - - void UpdateThetas(); - void UpdateThetaDot(); - double UpdateErrorArray(VectorR3* targets); // Returns sum of errors - const VectorRn& GetErrorArray() const { return errorArray; } - void UpdatedSClampValue(VectorR3* targets); - - void SetCurrentMode(UpdateMode mode) { CurrentUpdateMode = mode; } - UpdateMode GetCurrentMode() const { return CurrentUpdateMode; } - void SetDampingDLS(double lambda) - { - DampingLambda = lambda; - DampingLambdaSq = Square(lambda); - } - - void Reset(); - - static void CompareErrors(const Jacobian& j1, const Jacobian& j2, double* weightedDist1, double* weightedDist2); - static void CountErrors(const Jacobian& j1, const Jacobian& j2, int* numBetter1, int* numBetter2, int* numTies); - - int GetNumRows() { return nRow; } - int GetNumCols() { return nCol; } - -public: - Tree* m_tree; // tree associated with this Jacobian matrix - int m_nEffector; // Number of end effectors - int nJoint; // Number of joints - int nRow; // Total number of rows the real J (= 3*number of end effectors for now) - int nCol; // Total number of columns in the real J (= number of joints for now) - - MatrixRmn Jend; // Jacobian matrix based on end effector positions - MatrixRmn Jtarget; // Jacobian matrix based on target positions - MatrixRmn Jnorms; // Norms of 3-vectors in active Jacobian (SDLS only) - - MatrixRmn U; // J = U * Diag(w) * V^T (Singular Value Decomposition) - VectorRn w; - MatrixRmn V; - - UpdateMode CurrentUpdateMode; - - VectorRn dS; // delta s - VectorRn dT1; // delta t -- these are delta S values clamped to smaller magnitude - VectorRn dSclamp; // Value to clamp magnitude of dT at. - VectorRn dTheta; // delta theta - VectorRn dPreTheta; // delta theta for single eigenvalue (SDLS only) - - VectorRn errorArray; // Distance of end effectors from target after updating - - // Parameters for pseudoinverses - static const double PseudoInverseThresholdFactor; // Threshold for treating eigenvalue as zero (fraction of largest eigenvalue) - - // Parameters for damped least squares - static const double DefaultDampingLambda; - double DampingLambda; - double DampingLambdaSq; - //double DampingLambdaSDLS; - - // Cap on max. value of changes in angles in single update step - static const double MaxAngleJtranspose; - static const double MaxAnglePseudoinverse; - static const double MaxAngleDLS; - static const double MaxAngleSDLS; - MatrixRmn* Jactive; - - void CalcdTClampedFromdS(); - static const double BaseMaxTargetDist; -}; - -#endif diff --git a/engine/inc/bullet/ThirdPartyLibs/BussIK/LinearR2.h b/engine/inc/bullet/ThirdPartyLibs/BussIK/LinearR2.h deleted file mode 100644 index b99f998c..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/BussIK/LinearR2.h +++ /dev/null @@ -1,1025 +0,0 @@ -/* -* -* Mathematics Subpackage (VrMath) -* -* -* Author: Samuel R. Buss, sbuss@ucsd.edu. -* Web page: http://math.ucsd.edu/~sbuss/MathCG -* -* -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. -* -* -*/ - -// -// Linear Algebra Classes over R2 -// -// -// A. Vector and Position classes -// -// A.1. VectorR2: a column vector of length 2 -// -// A.2. VectorHgR2 - homogenous vector for R2 (a 3-Vector) -// -// B. Matrix Classes -// -// B.1 LinearMapR2 - arbitrary linear map; 2x2 real matrix -// -// B.2 RotationMapR2 - orthonormal 2x2 matrix -// - -#ifndef LINEAR_R2_H -#define LINEAR_R2_H - -#include -#include -#include -#include "MathMisc.h" -using namespace std; - -class VectorR2; // R2 Vector -class VectorHgR2; -class Matrix2x2; -class LinearMapR2; // 2x2 real matrix -class AffineMapR3; // Affine Map (3x4 Matrix) -class RotationMapR2; // 2x2 rotation map - -// ************************************** -// VectorR2 class * -// * * * * * * * * * * * * * * * * * * ** - -class VectorR2 -{ -public: - double x, y; // The x & y coordinates. - -public: - VectorR2() : x(0.0), y(0.0) {} - VectorR2(double xVal, double yVal) - : x(xVal), y(yVal) {} - VectorR2(const VectorHgR2& uH); - - VectorR2& SetZero() - { - x = 0.0; - y = 0.0; - return *this; - } - VectorR2& Set(double xx, double yy) - { - x = xx; - y = yy; - return *this; - } - VectorR2& Load(const double* v); - VectorR2& Load(const float* v); - void Dump(double* v) const; - void Dump(float* v) const; - - static const VectorR2 Zero; - static const VectorR2 UnitX; - static const VectorR2 UnitY; - static const VectorR2 NegUnitX; - static const VectorR2 NegUnitY; - - VectorR2& operator+=(const VectorR2& v) - { - x += v.x; - y += v.y; - return (*this); - } - VectorR2& operator-=(const VectorR2& v) - { - x -= v.x; - y -= v.y; - return (*this); - } - VectorR2& operator*=(double m) - { - x *= m; - y *= m; - return (*this); - } - VectorR2& operator/=(double m) - { - double mInv = 1.0 / m; - x *= mInv; - y *= mInv; - return (*this); - } - VectorR2 operator-() const { return (VectorR2(-x, -y)); } - VectorR2& ArrayProd(const VectorR2&); // Component-wise product - - VectorR2& AddScaled(const VectorR2& u, double s); - - double Norm() const { return (sqrt(x * x + y * y)); } - double L1Norm() const { return (Max(fabs(x), fabs(y))); } - double Dist(const VectorR2& u) const; // Distance from u - double DistSq(const VectorR2& u) const; // Distance from u - double NormSq() const { return (x * x + y * y); } - double MaxAbs() const; - VectorR2& Normalize() - { - *this /= Norm(); - return *this; - } // No error checking - VectorR2& MakeUnit(); // Normalize() with error checking - VectorR2& ReNormalize(); - bool IsUnit(double tolerance = 1.0e-15) const - { - double norm = Norm(); - return (1.0 + tolerance >= norm && norm >= 1.0 - tolerance); - } - bool IsZero() const { return (x == 0.0 && y == 0.0); } - bool NearZero(double tolerance) const { return (MaxAbs() <= tolerance); } - // tolerance should be non-negative - - VectorR2& Rotate(double theta); // rotate through angle theta - VectorR2& Rotate(double costheta, double sintheta); -}; - -inline VectorR2 operator+(const VectorR2& u, const VectorR2& v); -inline VectorR2 operator-(const VectorR2& u, const VectorR2& v); -inline VectorR2 operator*(const VectorR2& u, double m); -inline VectorR2 operator*(double m, const VectorR2& u); -inline VectorR2 operator/(const VectorR2& u, double m); -inline int operator==(const VectorR2& u, const VectorR2& v); - -inline double operator^(const VectorR2& u, const VectorR2& v); // Dot Product -inline VectorR2 ArrayProd(const VectorR2& u, const VectorR2& v); - -inline double Mag(const VectorR2& u) { return u.Norm(); } -inline double Dist(const VectorR2& u, const VectorR2& v) { return u.Dist(v); } -inline double DistSq(const VectorR2& u, const VectorR2& v) { return u.DistSq(v); } -inline double NormalizeError(const VectorR2&); - -// **************************************** -// VectorHgR2 class * -// * * * * * * * * * * * * * * * * * * * ** - -class VectorHgR2 -{ -public: - double x, y, w; // The x & y & w coordinates. - -public: - VectorHgR2() : x(0.0), y(0.0), w(1.0) {} - VectorHgR2(double xVal, double yVal) - : x(xVal), y(yVal), w(1.0) {} - VectorHgR2(double xVal, double yVal, double wVal) - : x(xVal), y(yVal), w(wVal) {} - VectorHgR2(const VectorR2& u) : x(u.x), y(u.y), w(1.0) {} -}; - -// ******************************************************************** -// Matrix2x2 - base class for 2x2 matrices * -// * * * * * * * * * * * * * * * * * * * * * ************************** - -class Matrix2x2 -{ -public: - double m11, m12, m21, m22; - - // Implements a 2x2 matrix: m_i_j - row-i and column-j entry - - static const Matrix2x2 Identity; - -public: - inline Matrix2x2(); - inline Matrix2x2(const VectorR2&, const VectorR2&); // Sets by columns! - inline Matrix2x2(double, double, double, double); // Sets by columns - - inline void SetIdentity(); // Set to the identity map - inline void SetZero(); // Set to the zero map - inline void Set(const VectorR2&, const VectorR2&); - inline void Set(double, double, double, double); - inline void SetByRows(const VectorR2&, const VectorR2&); - inline void SetByRows(double, double, double, double); - inline void SetColumn1(double, double); - inline void SetColumn2(double, double); - inline void SetColumn1(const VectorR2&); - inline void SetColumn2(const VectorR2&); - inline VectorR2 Column1() const; - inline VectorR2 Column2() const; - - inline void SetRow1(double, double); - inline void SetRow2(double, double); - inline void SetRow1(const VectorR2&); - inline void SetRow2(const VectorR2&); - inline VectorR2 Row1() const; - inline VectorR2 Row2() const; - - inline void SetDiagonal(double, double); - inline void SetDiagonal(const VectorR2&); - inline double Diagonal(int); - - inline void MakeTranspose(); // Transposes it. - inline void operator*=(const Matrix2x2& B); // Matrix product - inline Matrix2x2& ReNormalize(); - - inline void Transform(VectorR2*) const; - inline void Transform(const VectorR2& src, VectorR2* dest) const; -}; - -inline double NormalizeError(const Matrix2x2&); -inline VectorR2 operator*(const Matrix2x2&, const VectorR2&); - -ostream& operator<<(ostream& os, const Matrix2x2& A); - -// ***************************************** -// LinearMapR2 class * -// * * * * * * * * * * * * * * * * * * * * * - -class LinearMapR2 : public Matrix2x2 -{ -public: - LinearMapR2(); - LinearMapR2(const VectorR2&, const VectorR2&); // Sets by columns! - LinearMapR2(double, double, double, double); // Sets by columns - LinearMapR2(const Matrix2x2&); - - inline void Negate(); - inline LinearMapR2& operator+=(const Matrix2x2&); - inline LinearMapR2& operator-=(const Matrix2x2&); - inline LinearMapR2& operator*=(double); - inline LinearMapR2& operator/=(double); - inline LinearMapR2& operator*=(const Matrix2x2&); // Matrix product - - inline LinearMapR2 Transpose() const; - inline double Determinant() const; // Returns the determinant - LinearMapR2 Inverse() const; // Returns inverse - LinearMapR2& Invert(); // Converts into inverse. - VectorR2 Solve(const VectorR2&) const; // Returns solution - LinearMapR2 PseudoInverse() const; // Returns pseudo-inverse TO DO - VectorR2 PseudoSolve(const VectorR2&); // Finds least squares solution TO DO -}; - -inline LinearMapR2 operator+(const LinearMapR2&, const LinearMapR2&); -inline LinearMapR2 operator-(const Matrix2x2&); -inline LinearMapR2 operator-(const LinearMapR2&, const LinearMapR2&); -inline LinearMapR2 operator*(const LinearMapR2&, double); -inline LinearMapR2 operator*(double, const LinearMapR2&); -inline LinearMapR2 operator/(const LinearMapR2&, double); -inline LinearMapR2 operator*(const Matrix2x2&, const LinearMapR2&); -inline LinearMapR2 operator*(const LinearMapR2&, const Matrix2x2&); -inline LinearMapR2 operator*(const LinearMapR2&, const LinearMapR2&); -// Matrix product (composition) - -// ******************************************* -// RotationMapR2class * -// * * * * * * * * * * * * * * * * * * * * * * - -class RotationMapR2 : public Matrix2x2 -{ -public: - RotationMapR2(); - RotationMapR2(const VectorR2&, const VectorR2&); // Sets by columns! - RotationMapR2(double, double, double, double); // Sets by columns! - - RotationMapR2& SetZero(); // IT IS AN ERROR TO USE THIS FUNCTION! - - inline RotationMapR2& operator*=(const RotationMapR2&); // Matrix product - - inline RotationMapR2 Transpose() const; - inline RotationMapR2 Inverse() const { return Transpose(); }; // Returns the transpose - inline RotationMapR2& Invert() - { - MakeTranspose(); - return *this; - }; // Transposes it. - inline VectorR2 Invert(const VectorR2&) const; // Returns solution -}; - -inline RotationMapR2 operator*(const RotationMapR2&, const RotationMapR2&); -// Matrix product (composition) - -// *************************************************************** -// * 2-space vector and matrix utilities (prototypes) * -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - -// Returns the angle between vectors u and v. -// Use AngleUnit if both vectors are unit vectors -inline double Angle(const VectorR2& u, const VectorR2& v); -inline double AngleUnit(const VectorR2& u, const VectorR2& v); - -// Returns a righthanded orthonormal basis to complement vector u -// The vector u must be unit. -inline VectorR2 GetOrtho(const VectorR2& u); - -// Projections - -inline VectorR2 ProjectToUnit(const VectorR2& u, const VectorR2& v); -// Project u onto v -inline VectorR2 ProjectPerpUnit(const VectorR2& u, const VectorR2& v); -// Project perp to v -// v must be a unit vector. - -// Projection maps (LinearMapR2's) - -inline LinearMapR2 VectorProjectMap(const VectorR2& u); - -inline LinearMapR2 PerpProjectMap(const VectorR2& u); -// u - must be unit vector. - -// Rotation Maps - -inline RotationMapR2 RotateToMap(const VectorR2& fromVec, const VectorR2& toVec); -// fromVec and toVec should be unit vectors - -// *************************************************************** -// * Stream Output Routines (Prototypes) * -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - -ostream& operator<<(ostream& os, const VectorR2& u); - -// ***************************************************** -// * VectorR2 class - inlined functions * -// * * * * * * * * * * * * * * * * * * * * * * * * * * * - -inline VectorR2& VectorR2::Load(const double* v) -{ - x = *v; - y = *(v + 1); - return *this; -} - -inline VectorR2& VectorR2::Load(const float* v) -{ - x = *v; - y = *(v + 1); - return *this; -} - -inline void VectorR2::Dump(double* v) const -{ - *v = x; - *(v + 1) = y; -} - -inline void VectorR2::Dump(float* v) const -{ - *v = (float)x; - *(v + 1) = (float)y; -} - -inline VectorR2& VectorR2::ArrayProd(const VectorR2& v) // Component-wise Product -{ - x *= v.x; - y *= v.y; - return (*this); -} - -inline VectorR2& VectorR2::MakeUnit() // Convert to unit vector (or leave zero). -{ - double nSq = NormSq(); - if (nSq != 0.0) - { - *this /= sqrt(nSq); - } - return *this; -} - -inline VectorR2& VectorR2::ReNormalize() // Convert near unit back to unit -{ - double nSq = NormSq(); - double mFact = 1.0 - 0.5 * (nSq - 1.0); // Multiplicative factor - *this *= mFact; - return *this; -} - -// Rotate through angle theta -inline VectorR2& VectorR2::Rotate(double theta) -{ - double costheta = cos(theta); - double sintheta = sin(theta); - double tempx = x * costheta - y * sintheta; - y = y * costheta + x * sintheta; - x = tempx; - return *this; -} - -inline VectorR2& VectorR2::Rotate(double costheta, double sintheta) -{ - double tempx = x * costheta + y * sintheta; - y = y * costheta - x * sintheta; - x = tempx; - return *this; -} - -inline double VectorR2::MaxAbs() const -{ - double m; - m = (x >= 0.0) ? x : -x; - if (y > m) - m = y; - else if (-y > m) - m = -y; - return m; -} - -inline VectorR2 operator+(const VectorR2& u, const VectorR2& v) -{ - return VectorR2(u.x + v.x, u.y + v.y); -} -inline VectorR2 operator-(const VectorR2& u, const VectorR2& v) -{ - return VectorR2(u.x - v.x, u.y - v.y); -} -inline VectorR2 operator*(const VectorR2& u, double m) -{ - return VectorR2(u.x * m, u.y * m); -} -inline VectorR2 operator*(double m, const VectorR2& u) -{ - return VectorR2(u.x * m, u.y * m); -} -inline VectorR2 operator/(const VectorR2& u, double m) -{ - double mInv = 1.0 / m; - return VectorR2(u.x * mInv, u.y * mInv); -} - -inline int operator==(const VectorR2& u, const VectorR2& v) -{ - return (u.x == v.x && u.y == v.y); -} - -inline double operator^(const VectorR2& u, const VectorR2& v) // Dot Product -{ - return (u.x * v.x + u.y * v.y); -} - -inline VectorR2 ArrayProd(const VectorR2& u, const VectorR2& v) -{ - return (VectorR2(u.x * v.x, u.y * v.y)); -} - -inline VectorR2& VectorR2::AddScaled(const VectorR2& u, double s) -{ - x += s * u.x; - y += s * u.y; - return (*this); -} - -inline VectorR2::VectorR2(const VectorHgR2& uH) - : x(uH.x), y(uH.y) -{ - *this /= uH.w; -} - -inline double NormalizeError(const VectorR2& u) -{ - double discrepancy; - discrepancy = u.x * u.x + u.y * u.y - 1.0; - if (discrepancy < 0.0) - { - discrepancy = -discrepancy; - } - return discrepancy; -} - -inline double VectorR2::Dist(const VectorR2& u) const // Distance from u -{ - return sqrt(DistSq(u)); -} - -inline double VectorR2::DistSq(const VectorR2& u) const // Distance from u -{ - return ((x - u.x) * (x - u.x) + (y - u.y) * (y - u.y)); -} - -// ********************************************************* -// * Matrix2x2 class - inlined functions * -// * * * * * * * * * * * * * * * * * * * * * * * * * * ***** - -inline Matrix2x2::Matrix2x2() {} - -inline Matrix2x2::Matrix2x2(const VectorR2& u, const VectorR2& v) -{ - m11 = u.x; // Column 1 - m21 = u.y; - m12 = v.x; // Column 2 - m22 = v.y; -} - -inline Matrix2x2::Matrix2x2(double a11, double a21, double a12, double a22) -// Values specified in column order!!! -{ - m11 = a11; // Row 1 - m12 = a12; - m21 = a21; // Row 2 - m22 = a22; -} - -inline void Matrix2x2::SetIdentity() -{ - m11 = m22 = 1.0; - m12 = m21 = 0.0; -} - -inline void Matrix2x2::Set(const VectorR2& u, const VectorR2& v) -{ - m11 = u.x; // Column 1 - m21 = u.y; - m12 = v.x; // Column 2 - m22 = v.y; -} - -inline void Matrix2x2::Set(double a11, double a21, double a12, double a22) -// Values specified in column order!!! -{ - m11 = a11; // Row 1 - m12 = a12; - m21 = a21; // Row 2 - m22 = a22; -} - -inline void Matrix2x2::SetZero() -{ - m11 = m12 = m21 = m22 = 0.0; -} - -inline void Matrix2x2::SetByRows(const VectorR2& u, const VectorR2& v) -{ - m11 = u.x; // Row 1 - m12 = u.y; - m21 = v.x; // Row 2 - m22 = v.y; -} - -inline void Matrix2x2::SetByRows(double a11, double a12, double a21, double a22) -// Values specified in row order!!! -{ - m11 = a11; // Row 1 - m12 = a12; - m21 = a21; // Row 2 - m22 = a22; -} - -inline void Matrix2x2::SetColumn1(double x, double y) -{ - m11 = x; - m21 = y; -} - -inline void Matrix2x2::SetColumn2(double x, double y) -{ - m12 = x; - m22 = y; -} - -inline void Matrix2x2::SetColumn1(const VectorR2& u) -{ - m11 = u.x; - m21 = u.y; -} - -inline void Matrix2x2::SetColumn2(const VectorR2& u) -{ - m12 = u.x; - m22 = u.y; -} - -VectorR2 Matrix2x2::Column1() const -{ - return (VectorR2(m11, m21)); -} - -VectorR2 Matrix2x2::Column2() const -{ - return (VectorR2(m12, m22)); -} - -inline void Matrix2x2::SetRow1(double x, double y) -{ - m11 = x; - m12 = y; -} - -inline void Matrix2x2::SetRow2(double x, double y) -{ - m21 = x; - m22 = y; -} - -inline void Matrix2x2::SetRow1(const VectorR2& u) -{ - m11 = u.x; - m12 = u.y; -} - -inline void Matrix2x2::SetRow2(const VectorR2& u) -{ - m21 = u.x; - m22 = u.y; -} - -VectorR2 Matrix2x2::Row1() const -{ - return (VectorR2(m11, m12)); -} - -VectorR2 Matrix2x2::Row2() const -{ - return (VectorR2(m21, m22)); -} - -inline void Matrix2x2::SetDiagonal(double x, double y) -{ - m11 = x; - m22 = y; -} - -inline void Matrix2x2::SetDiagonal(const VectorR2& u) -{ - SetDiagonal(u.x, u.y); -} - -inline double Matrix2x2::Diagonal(int i) -{ - switch (i) - { - case 0: - return m11; - case 1: - return m22; - default: - assert(0); - return 0.0; - } -} -inline void Matrix2x2::MakeTranspose() // Transposes it. -{ - double temp; - temp = m12; - m12 = m21; - m21 = temp; -} - -inline void Matrix2x2::operator*=(const Matrix2x2& B) // Matrix product -{ - double t1; // temporary value - - t1 = m11 * B.m11 + m12 * B.m21; - m12 = m11 * B.m12 + m12 * B.m22; - m11 = t1; - - t1 = m21 * B.m11 + m22 * B.m21; - m22 = m21 * B.m12 + m22 * B.m22; - m21 = t1; -} - -inline Matrix2x2& Matrix2x2::ReNormalize() // Re-normalizes nearly orthonormal matrix -{ - double alpha = m11 * m11 + m21 * m21; // First column's norm squared - double beta = m12 * m12 + m22 * m22; // Second column's norm squared - alpha = 1.0 - 0.5 * (alpha - 1.0); // Get mult. factor - beta = 1.0 - 0.5 * (beta - 1.0); - m11 *= alpha; // Renormalize first column - m21 *= alpha; - m12 *= beta; // Renormalize second column - m22 *= beta; - alpha = m11 * m12 + m21 * m22; // Columns' inner product - alpha *= 0.5; // times 1/2 - double temp; - temp = m11 - alpha * m12; // Subtract alpha times other column - m12 -= alpha * m11; - m11 = temp; - temp = m21 - alpha * m22; - m22 -= alpha * m21; - m11 = temp; - return *this; -} - -// Gives a measure of how far the matrix is from being normalized. -// Mostly intended for diagnostic purposes. -inline double NormalizeError(const Matrix2x2& A) -{ - double discrepancy; - double newdisc; - discrepancy = A.m11 * A.m11 + A.m21 * A.m21 - 1.0; // First column - inner product - 1 - if (discrepancy < 0.0) - { - discrepancy = -discrepancy; - } - newdisc = A.m12 * A.m12 + A.m22 * A.m22 - 1.0; // Second column inner product - 1 - if (newdisc < 0.0) - { - newdisc = -newdisc; - } - if (newdisc > discrepancy) - { - discrepancy = newdisc; - } - newdisc = A.m11 * A.m12 + A.m21 * A.m22; // Inner product of two columns - if (newdisc < 0.0) - { - newdisc = -newdisc; - } - if (newdisc > discrepancy) - { - discrepancy = newdisc; - } - return discrepancy; -} - -inline VectorR2 operator*(const Matrix2x2& A, const VectorR2& u) -{ - return (VectorR2(A.m11 * u.x + A.m12 * u.y, - A.m21 * u.x + A.m22 * u.y)); -} - -inline void Matrix2x2::Transform(VectorR2* u) const -{ - double newX; - newX = m11 * u->x + m12 * u->y; - u->y = m21 * u->x + m22 * u->y; - u->x = newX; -} - -inline void Matrix2x2::Transform(const VectorR2& src, VectorR2* dest) const -{ - dest->x = m11 * src.x + m12 * src.y; - dest->y = m21 * src.x + m22 * src.y; -} - -// ****************************************************** -// * LinearMapR2 class - inlined functions * -// * * * * * * * * * * * * * * * * * * * * * * * * * * ** - -inline LinearMapR2::LinearMapR2() -{ - SetZero(); - return; -} - -inline LinearMapR2::LinearMapR2(const VectorR2& u, const VectorR2& v) - : Matrix2x2(u, v) -{ -} - -inline LinearMapR2::LinearMapR2(double a11, double a21, double a12, double a22) - // Values specified in column order!!! - : Matrix2x2(a11, a21, a12, a22) -{ -} - -inline LinearMapR2::LinearMapR2(const Matrix2x2& A) - : Matrix2x2(A) -{ -} - -inline void LinearMapR2::Negate() -{ - m11 = -m11; - m12 = -m12; - m21 = -m21; - m22 = -m22; -} - -inline LinearMapR2& LinearMapR2::operator+=(const Matrix2x2& B) -{ - m11 += B.m11; - m12 += B.m12; - m21 += B.m21; - m22 += B.m22; - return (*this); -} - -inline LinearMapR2& LinearMapR2::operator-=(const Matrix2x2& B) -{ - m11 -= B.m11; - m12 -= B.m12; - m21 -= B.m21; - m22 -= B.m22; - return (*this); -} - -inline LinearMapR2 operator+(const LinearMapR2& A, const LinearMapR2& B) -{ - return (LinearMapR2(A.m11 + B.m11, A.m21 + B.m21, - A.m12 + B.m12, A.m22 + B.m22)); -} - -inline LinearMapR2 operator-(const Matrix2x2& A) -{ - return (LinearMapR2(-A.m11, -A.m21, -A.m12, -A.m22)); -} - -inline LinearMapR2 operator-(const LinearMapR2& A, const LinearMapR2& B) -{ - return (LinearMapR2(A.m11 - B.m11, A.m21 - B.m21, - A.m12 - B.m12, A.m22 - B.m22)); -} - -inline LinearMapR2& LinearMapR2::operator*=(double b) -{ - m11 *= b; - m12 *= b; - m21 *= b; - m22 *= b; - return (*this); -} - -inline LinearMapR2 operator*(const LinearMapR2& A, double b) -{ - return (LinearMapR2(A.m11 * b, A.m21 * b, - A.m12 * b, A.m22 * b)); -} - -inline LinearMapR2 operator*(double b, const LinearMapR2& A) -{ - return (LinearMapR2(A.m11 * b, A.m21 * b, - A.m12 * b, A.m22 * b)); -} - -inline LinearMapR2 operator/(const LinearMapR2& A, double b) -{ - double bInv = 1.0 / b; - return (A * bInv); -} - -inline LinearMapR2& LinearMapR2::operator/=(double b) -{ - double bInv = 1.0 / b; - return (*this *= bInv); -} - -inline LinearMapR2 LinearMapR2::Transpose() const // Returns the transpose -{ - return (LinearMapR2(m11, m12, m21, m22)); -} - -inline LinearMapR2& LinearMapR2::operator*=(const Matrix2x2& B) // Matrix product -{ - (*this).Matrix2x2::operator*=(B); - - return (*this); -} - -inline LinearMapR2 operator*(const LinearMapR2& A, const Matrix2x2& B) -{ - LinearMapR2 AA(A); - AA.Matrix2x2::operator*=(B); - return AA; -} - -inline LinearMapR2 operator*(const Matrix2x2& A, const LinearMapR2& B) -{ - LinearMapR2 AA(A); - AA.Matrix2x2::operator*=(B); - return AA; -} - -inline LinearMapR2 operator*(const LinearMapR2& A, const LinearMapR2& B) -{ - LinearMapR2 AA(A); - AA.Matrix2x2::operator*=(B); - return AA; -} - -inline double LinearMapR2::Determinant() const // Returns the determinant -{ - return (m11 * m22 - m12 * m21); -} - -// ****************************************************** -// * RotationMapR2 class - inlined functions * -// * * * * * * * * * * * * * * * * * * * * * * * * * * ** - -inline RotationMapR2::RotationMapR2() -{ - SetIdentity(); - return; -} - -inline RotationMapR2::RotationMapR2(const VectorR2& u, const VectorR2& v) - : Matrix2x2(u, v) -{ -} - -inline RotationMapR2::RotationMapR2( - double a11, double a21, double a12, double a22) - // Values specified in column order!!! - : Matrix2x2(a11, a21, a12, a22) -{ -} - -inline RotationMapR2 RotationMapR2::Transpose() const // Returns the transpose -{ - return (RotationMapR2(m11, m12, - m21, m22)); -} - -inline VectorR2 RotationMapR2::Invert(const VectorR2& u) const // Returns solution -{ - return (VectorR2(m11 * u.x + m21 * u.y, // Multiply with Transpose - m12 * u.x + m22 * u.y)); -} - -inline RotationMapR2& RotationMapR2::operator*=(const RotationMapR2& B) // Matrix product -{ - (*this).Matrix2x2::operator*=(B); - - return (*this); -} - -inline RotationMapR2 operator*(const RotationMapR2& A, const RotationMapR2& B) -{ - RotationMapR2 AA(A); - AA.Matrix2x2::operator*=(B); - return AA; -} - -// *************************************************************** -// * 2-space vector and matrix utilities (inlined functions) * -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - -// Returns a righthanded orthonormal basis to complement vector u -// The vector u must be unit. -inline VectorR2 GetOrtho(const VectorR2& u) -{ - return VectorR2(-u.y, u.x); -} - -// Returns the projection of u onto unit v -inline VectorR2 ProjectToUnit(const VectorR2& u, const VectorR2& v) -{ - return (u ^ v) * v; -} - -// Returns the projection of u onto the plane perpindicular to the unit vector v -inline VectorR2 ProjectPerpUnit(const VectorR2& u, const VectorR2& v) -{ - return (u - ((u ^ v) * v)); -} - -// Returns the projection of u onto the plane perpindicular to the unit vector v -// This one is more stable when u and v are nearly equal. -inline VectorR2 ProjectPerpUnitDiff(const VectorR2& u, const VectorR2& v) -{ - VectorR2 ans = u; - ans -= v; - ans -= ((ans ^ v) * v); - return ans; // ans = (u-v) - ((u-v)^v)*v -} - -// Returns the solid angle between vectors u and v. -inline double Angle(const VectorR2& u, const VectorR2& v) -{ - double nSqU = u.NormSq(); - double nSqV = v.NormSq(); - if (nSqU == 0.0 && nSqV == 0.0) - { - return (0.0); - } - else - { - return (AngleUnit(u / sqrt(nSqU), v / sqrt(nSqV))); - } -} - -inline double AngleUnit(const VectorR2& u, const VectorR2& v) -{ - return (atan2((ProjectPerpUnit(v, u)).Norm(), u ^ v)); -} - -// Projection maps (LinearMapR2's) - -// VectorProjectMap returns map projecting onto a given vector u. -// u should be a unit vector (otherwise the returned map is -// scaled according to the magnitude of u. -inline LinearMapR2 VectorProjectMap(const VectorR2& u) -{ - double xy = u.x * u.y; - return (LinearMapR2(u.x * u.x, xy, xy, u.y * u.y)); -} - -// PlaneProjectMap returns map projecting onto a given plane. -// The plane is the plane orthognal to u. -// u must be a unit vector (otherwise the returned map is -// garbage). -inline LinearMapR2 PerpProjectMap(const VectorR2& u) -{ - double nxy = -u.x * u.y; - return (LinearMapR2(1.0 - u.x * u.x, nxy, nxy, 1.0 - u.y * u.y)); -} - -// fromVec and toVec should be unit vectors -inline RotationMapR2 RotateToMap(const VectorR2& fromVec, const VectorR2& toVec) -{ - double costheta = fromVec.x * toVec.x + fromVec.y * toVec.y; - double sintheta = fromVec.x * toVec.y - fromVec.y * toVec.x; - return (RotationMapR2(costheta, sintheta, -sintheta, costheta)); -} - -#endif // LINEAR_R2_H diff --git a/engine/inc/bullet/ThirdPartyLibs/BussIK/LinearR3.h b/engine/inc/bullet/ThirdPartyLibs/BussIK/LinearR3.h deleted file mode 100644 index a989be77..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/BussIK/LinearR3.h +++ /dev/null @@ -1,2127 +0,0 @@ -/* -* -* Mathematics Subpackage (VrMath) -* -* -* Author: Samuel R. Buss, sbuss@ucsd.edu. -* Web page: http://math.ucsd.edu/~sbuss/MathCG -* -* -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. -* -* -*/ - -// -// Linear Algebra Classes over R3 -// -// -// A. Vector and Position classes -// -// A.1. VectorR3: a real column vector of length 3. -// -// A.2. VectorHgR3: a column vector of length 4 which is -// the homogenous representation of a vector in 3-space -// -// B. Matrix Classes -// -// B.1 LinearMapR3 - arbitrary linear map; 3x3 real matrix -// -// B.2 AffineMapR3 - arbitrary affine map; a 3x4 real matrix -// -// B.3 RotationMapR3 - orthonormal 3x3 matrix -// -// B.4 RigidMapR3 - RotationMapR3 plus displacement -// - -#ifndef LINEAR_R3_H -#define LINEAR_R3_H - -#include -#include -#include -#include "MathMisc.h" -using namespace std; - -class VectorR3; // Space Vector (length 3) -class VectorHgR3; // Homogenous Space Vector -class VectorR4; // Space Vector (length 4) - -class LinearMapR3; // Linear Map (3x3 Matrix) -class AffineMapR3; // Affine Map (3x4 Matrix) -class RotationMapR3; // Rotation (3x3 orthonormal matrix) -class RigidMapR3; // 3x4 matrix, first 3 columns orthonormal - -// Most for internal use: -class Matrix3x3; -class Matrix3x4; - -class Quaternion; - -// ************************************** -// VectorR3 class * -// * * * * * * * * * * * * * * * * * * ** - -class VectorR3 -{ -public: - double x, y, z; // The x & y & z coordinates. - - static const VectorR3 Zero; - static const VectorR3 UnitX; - static const VectorR3 UnitY; - static const VectorR3 UnitZ; - static const VectorR3 NegUnitX; - static const VectorR3 NegUnitY; - static const VectorR3 NegUnitZ; - -public: - VectorR3() : x(0.0), y(0.0), z(0.0) {} - VectorR3(double xVal, double yVal, double zVal) - : x(xVal), y(yVal), z(zVal) {} - VectorR3(const VectorHgR3& uH); - - VectorR3& Set(const Quaternion&); // Convert quat to rotation vector - VectorR3& Set(double xx, double yy, double zz) - { - x = xx; - y = yy; - z = zz; - return *this; - } - VectorR3& SetFromHg(const VectorR4&); // Convert homogeneous VectorR4 to VectorR3 - VectorR3& SetZero() - { - x = 0.0; - y = 0.0; - z = 0.0; - return *this; - } - VectorR3& Load(const double* v); - VectorR3& Load(const float* v); - void Dump(double* v) const; - void Dump(float* v) const; - - inline double operator[](int i); - - VectorR3& operator=(const VectorR3& v) - { - x = v.x; - y = v.y; - z = v.z; - return (*this); - } - VectorR3& operator+=(const VectorR3& v) - { - x += v.x; - y += v.y; - z += v.z; - return (*this); - } - VectorR3& operator-=(const VectorR3& v) - { - x -= v.x; - y -= v.y; - z -= v.z; - return (*this); - } - VectorR3& operator*=(double m) - { - x *= m; - y *= m; - z *= m; - return (*this); - } - VectorR3& operator/=(double m) - { - double mInv = 1.0 / m; - x *= mInv; - y *= mInv; - z *= mInv; - return (*this); - } - VectorR3 operator-() const { return (VectorR3(-x, -y, -z)); } - VectorR3& operator*=(const VectorR3& v); // Cross Product - VectorR3& ArrayProd(const VectorR3&); // Component-wise product - - VectorR3& AddScaled(const VectorR3& u, double s); - - bool IsZero() const { return (x == 0.0 && y == 0.0 && z == 0.0); } - double Norm() const { return ((double)sqrt(x * x + y * y + z * z)); } - double NormSq() const { return (x * x + y * y + z * z); } - double MaxAbs() const; - double Dist(const VectorR3& u) const; // Distance from u - double DistSq(const VectorR3& u) const; // Distance from u squared - VectorR3& Negate() - { - x = -x; - y = -y; - z = -z; - return *this; - } - VectorR3& Normalize() - { - *this /= Norm(); - return *this; - } // No error checking - inline VectorR3& MakeUnit(); // Normalize() with error checking - inline VectorR3& ReNormalize(); - bool IsUnit() const - { - double norm = Norm(); - return (1.000001 >= norm && norm >= 0.999999); - } - bool IsUnit(double tolerance) const - { - double norm = Norm(); - return (1.0 + tolerance >= norm && norm >= 1.0 - tolerance); - } - bool NearZero(double tolerance) const { return (MaxAbs() <= tolerance); } - // tolerance should be non-negative - - double YaxisDistSq() const { return (x * x + z * z); } - double YaxisDist() const { return sqrt(x * x + z * z); } - - VectorR3& Rotate(double theta, const VectorR3& u); // rotate around u. - VectorR3& RotateUnitInDirection(const VectorR3& dir); // rotate in direction dir - VectorR3& Rotate(const Quaternion&); // Rotate according to quaternion - - friend ostream& operator<<(ostream& os, const VectorR3& u); -}; - -inline VectorR3 operator+(const VectorR3& u, const VectorR3& v); -inline VectorR3 operator-(const VectorR3& u, const VectorR3& v); -inline VectorR3 operator*(const VectorR3& u, double m); -inline VectorR3 operator*(double m, const VectorR3& u); -inline VectorR3 operator/(const VectorR3& u, double m); -inline int operator==(const VectorR3& u, const VectorR3& v); - -inline double operator^(const VectorR3& u, const VectorR3& v); // Dot Product -inline VectorR3 operator*(const VectorR3& u, const VectorR3& v); // Cross Product -inline VectorR3 ArrayProd(const VectorR3& u, const VectorR3& v); - -inline double Mag(const VectorR3& u) { return u.Norm(); } -inline double Dist(const VectorR3& u, const VectorR3& v) { return u.Dist(v); } -inline double DistSq(const VectorR3& u, const VectorR3& v) { return u.DistSq(v); } -inline double NormalizeError(const VectorR3& u); - -extern const VectorR3 UnitVecIR3; -extern const VectorR3 UnitVecJR3; -extern const VectorR3 UnitVecKR3; - -inline VectorR3 ToVectorR3(const Quaternion& q) -{ - return VectorR3().Set(q); -} - -// **************************************** -// VectorHgR3 class * -// * * * * * * * * * * * * * * * * * * * ** - -class VectorHgR3 -{ -public: - double x, y, z, w; // The x & y & z & w coordinates. - -public: - VectorHgR3() : x(0.0), y(0.0), z(0.0), w(1.0) {} - VectorHgR3(double xVal, double yVal, double zVal) - : x(xVal), y(yVal), z(zVal), w(1.0) {} - VectorHgR3(double xVal, double yVal, double zVal, double wVal) - : x(xVal), y(yVal), z(zVal), w(wVal) {} - VectorHgR3(const VectorR3& u) : x(u.x), y(u.y), z(u.z), w(1.0) {} -}; - -// -// Advanced vector and position functions (prototypes) -// - -VectorR3 Interpolate(const VectorR3& start, const VectorR3& end, double a); - -// ***************************************** -// Matrix3x3 class * -// * * * * * * * * * * * * * * * * * * * * * - -class Matrix3x3 -{ -public: - double m11, m12, m13, m21, m22, m23, m31, m32, m33; - - // Implements a 3x3 matrix: m_i_j - row-i and column-j entry - - static const Matrix3x3 Identity; - -public: - inline Matrix3x3(); - inline Matrix3x3(const VectorR3&, const VectorR3&, const VectorR3&); // Sets by columns! - inline Matrix3x3(double, double, double, double, double, double, - double, double, double); // Sets by columns - - inline void SetIdentity(); // Set to the identity map - inline void Set(const Matrix3x3&); // Set to the matrix. - inline void Set3x3(const Matrix3x4&); // Set to the 3x3 part of the matrix. - inline void Set(const VectorR3&, const VectorR3&, const VectorR3&); - inline void Set(double, double, double, - double, double, double, - double, double, double); - inline void SetByRows(double, double, double, double, double, double, - double, double, double); - inline void SetByRows(const VectorR3&, const VectorR3&, const VectorR3&); - - inline void SetColumn1(double, double, double); - inline void SetColumn2(double, double, double); - inline void SetColumn3(double, double, double); - inline void SetColumn1(const VectorR3&); - inline void SetColumn2(const VectorR3&); - inline void SetColumn3(const VectorR3&); - inline VectorR3 Column1() const; - inline VectorR3 Column2() const; - inline VectorR3 Column3() const; - - inline void SetRow1(double, double, double); - inline void SetRow2(double, double, double); - inline void SetRow3(double, double, double); - inline void SetRow1(const VectorR3&); - inline void SetRow2(const VectorR3&); - inline void SetRow3(const VectorR3&); - inline VectorR3 Row1() const; - inline VectorR3 Row2() const; - inline VectorR3 Row3() const; - - inline void SetDiagonal(double, double, double); - inline void SetDiagonal(const VectorR3&); - inline double Diagonal(int); - - inline void MakeTranspose(); // Transposes it. - Matrix3x3& ReNormalize(); - VectorR3 Solve(const VectorR3&) const; // Returns solution - - inline void Transform(VectorR3*) const; - inline void Transform(const VectorR3& src, VectorR3* dest) const; - -protected: - void OperatorTimesEquals(const Matrix3x3&); // Internal use only - void SetZero(); // Set to the zero map -}; - -inline VectorR3 operator*(const Matrix3x3&, const VectorR3&); - -ostream& operator<<(ostream& os, const Matrix3x3& A); - -// ***************************************** -// Matrix3x4 class * -// * * * * * * * * * * * * * * * * * * * * * - -class Matrix3x4 -{ -public: - double m11, m12, m13, m21, m22, m23, m31, m32, m33; - double m14; - double m24; - double m34; - - static const Matrix3x4 Identity; - -public: - // Constructors set by columns! - Matrix3x4() {} - Matrix3x4(const VectorR3&, const VectorR3&, const VectorR3&, const VectorR3&); - Matrix3x4(double, double, double, double, double, double, - double, double, double, double, double, double); // Sets by columns - Matrix3x4(const Matrix3x3&, const VectorR3&); - - void SetIdentity(); // Set to the identity map - void Set(const Matrix3x4&); // Set to the matrix. - void Set3x3(const Matrix3x3&); // Set linear part to the matrix. - void Set(const Matrix3x3&, const VectorR3&); // Set to the matrix plus 4th column - void Set(const VectorR3&, const VectorR3&, const VectorR3&, const VectorR3&); - void Set(double, double, double, - double, double, double, - double, double, double, - double, double, double); // Sets by columns - void Set3x3(double, double, double, - double, double, double, - double, double, double); // Sets by columns - void SetByRows(double, double, double, double, double, double, - double, double, double, double, double, double); - - void SetColumn1(double, double, double); - void SetColumn2(double, double, double); - void SetColumn3(double, double, double); - void SetColumn4(double, double, double); - void SetColumn1(const VectorR3&); - void SetColumn2(const VectorR3&); - void SetColumn3(const VectorR3&); - void SetColumn4(const VectorR3&); - VectorR3 Column1() const; - VectorR3 Column2() const; - VectorR3 Column3() const; - VectorR3 Column4() const; - void SetRow1(double x, double y, double z, double w); - void SetRow2(double x, double y, double z, double w); - void SetRow3(double x, double y, double z, double w); - void SetRow4(double x, double y, double z, double w); - - Matrix3x4& ApplyTranslationLeft(const VectorR3& u); - Matrix3x4& ApplyTranslationRight(const VectorR3& u); - Matrix3x4& ApplyYRotationLeft(double theta); - Matrix3x4& ApplyYRotationLeft(double costheta, double sintheta); - - Matrix3x4& ReNormalize(); - VectorR3 Solve(const VectorR3&) const; // Returns solution - - inline void Transform(VectorR3*) const; - inline void Transform3x3(VectorR3*) const; - inline void Transform(const VectorR3& src, VectorR3* dest) const; - inline void Transform3x3(const VectorR3& src, VectorR3* dest) const; - inline void Transform3x3Transpose(VectorR3* dest) const; - inline void Transform3x3Transpose(const VectorR3& src, VectorR3* dest) const; - -protected: - void SetZero(); // Set to the zero map - void OperatorTimesEquals(const Matrix3x3&); // Internal use only - void OperatorTimesEquals(const Matrix3x4&); // Internal use only -}; - -inline VectorR3 operator*(const Matrix3x4&, const VectorR3&); - -ostream& operator<<(ostream& os, const Matrix3x4& A); - -// ***************************************** -// LinearMapR3 class * -// * * * * * * * * * * * * * * * * * * * * * - -class LinearMapR3 : public Matrix3x3 -{ -public: - LinearMapR3(); - LinearMapR3(const VectorR3&, const VectorR3&, const VectorR3&); - LinearMapR3(double, double, double, double, double, double, - double, double, double); // Sets by columns - LinearMapR3(const Matrix3x3&); - - void SetZero(); // Set to the zero map - inline void Negate(); - - inline LinearMapR3& operator+=(const Matrix3x3&); - inline LinearMapR3& operator-=(const Matrix3x3&); - inline LinearMapR3& operator*=(double); - inline LinearMapR3& operator/=(double); - LinearMapR3& operator*=(const Matrix3x3&); // Matrix product - - inline LinearMapR3 Transpose() const; // Returns the transpose - double Determinant() const; // Returns the determinant - LinearMapR3 Inverse() const; // Returns inverse - LinearMapR3& Invert(); // Converts into inverse. - VectorR3 Solve(const VectorR3&) const; // Returns solution - LinearMapR3 PseudoInverse() const; // Returns pseudo-inverse TO DO - VectorR3 PseudoSolve(const VectorR3&); // Finds least squares solution TO DO -}; - -inline LinearMapR3 operator+(const LinearMapR3&, const Matrix3x3&); -inline LinearMapR3 operator+(const Matrix3x3&, const LinearMapR3&); -inline LinearMapR3 operator-(const LinearMapR3&); -inline LinearMapR3 operator-(const LinearMapR3&, const Matrix3x3&); -inline LinearMapR3 operator-(const Matrix3x3&, const LinearMapR3&); -inline LinearMapR3 operator*(const LinearMapR3&, double); -inline LinearMapR3 operator*(double, const LinearMapR3&); -inline LinearMapR3 operator/(const LinearMapR3&, double); -LinearMapR3 operator*(const LinearMapR3&, const LinearMapR3&); -// Matrix product (composition) - -// ***************************************************** -// * AffineMapR3 class * -// * * * * * * * * * * * * * * * * * * * * * * * * * * * - -class AffineMapR3 : public Matrix3x4 -{ -public: - AffineMapR3(); - AffineMapR3(double, double, double, double, double, double, - double, double, double, double, double, double); // Sets by columns - AffineMapR3(const VectorR3&, const VectorR3&, const VectorR3&, const VectorR3&); - AffineMapR3(const LinearMapR3&, const VectorR3&); - - void SetIdentity(); // Set to the identity map - void SetZero(); // Set to the zero map - - AffineMapR3& operator+=(const Matrix3x4&); - AffineMapR3& operator-=(const Matrix3x4&); - AffineMapR3& operator*=(double); - AffineMapR3& operator/=(double); - AffineMapR3& operator*=(const Matrix3x3&); // Composition - AffineMapR3& operator*=(const Matrix3x4&); // Composition - - AffineMapR3& ApplyTranslationLeft(const VectorR3& u) - { - Matrix3x4::ApplyTranslationLeft(u); - return *this; - } - AffineMapR3& ApplyTranslationRight(const VectorR3& u) - { - Matrix3x4::ApplyTranslationRight(u); - return *this; - } - AffineMapR3& ApplyYRotationLeft(double theta) - { - Matrix3x4::ApplyYRotationLeft(theta); - return *this; - } - AffineMapR3& ApplyYRotationLeft(double costheta, double sintheta) - { - Matrix3x4::ApplyYRotationLeft(costheta, sintheta); - return *this; - } - - AffineMapR3 Inverse() const; // Returns inverse - AffineMapR3& Invert(); // Converts into inverse. - VectorR3 Solve(const VectorR3&) const; // Returns solution - AffineMapR3 PseudoInverse() const; // Returns pseudo-inverse // TO DO - VectorR3 PseudoSolve(const VectorR3&); // Least squares solution // TO DO -}; - -inline AffineMapR3 operator+(const AffineMapR3&, const Matrix3x4&); -inline AffineMapR3 operator+(const Matrix3x4&, const AffineMapR3&); -inline AffineMapR3 operator+(const AffineMapR3&, const Matrix3x3&); -inline AffineMapR3 operator+(const Matrix3x3&, const AffineMapR3&); -inline AffineMapR3 operator-(const AffineMapR3&, const Matrix3x4&); -inline AffineMapR3 operator-(const Matrix3x4&, const AffineMapR3&); -inline AffineMapR3 operator-(const AffineMapR3&, const Matrix3x3&); -inline AffineMapR3 operator-(const Matrix3x3&, const AffineMapR3&); -inline AffineMapR3 operator*(const AffineMapR3&, double); -inline AffineMapR3 operator*(double, const AffineMapR3&); -inline AffineMapR3 operator/(const AffineMapR3&, double); - -// Composition operators -AffineMapR3 operator*(const AffineMapR3&, const AffineMapR3&); -AffineMapR3 operator*(const LinearMapR3&, const AffineMapR3&); -AffineMapR3 operator*(const AffineMapR3&, const LinearMapR3&); - -// ******************************************* -// RotationMapR3 class * -// * * * * * * * * * * * * * * * * * * * * * * - -class RotationMapR3 : public Matrix3x3 -{ -public: - RotationMapR3(); - RotationMapR3(const VectorR3&, const VectorR3&, const VectorR3&); - RotationMapR3(double, double, double, double, double, double, - double, double, double); - - RotationMapR3& Set(const Quaternion&); - RotationMapR3& Set(const VectorR3&, double theta); // Set rotation axis and angle - RotationMapR3& Set(const VectorR3&, double sintheta, double costheta); - - RotationMapR3& operator*=(const RotationMapR3&); // Matrix product - - RotationMapR3 Transpose() const { return Inverse(); }; // Returns the transpose - RotationMapR3 Inverse() const; // Returns inverse - RotationMapR3& Invert(); // Converts into inverse. - VectorR3 Solve(const VectorR3&) const; // Returns solution // Was named Invert - - bool ToAxisAndAngle(VectorR3* u, double* theta) const; // returns unit vector u and angle -}; - -RotationMapR3 operator*(const RotationMapR3&, const RotationMapR3&); -// Matrix product (composition) - -inline RotationMapR3 ToRotationMapR3(const Quaternion& q) -{ - return (RotationMapR3().Set(q)); -} - -ostream& operator<<(ostream& os, const RotationMapR3& A); - -// *************************************************************** -// * RigidMapR3 class - prototypes. * * -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - -class RigidMapR3 : public Matrix3x4 -{ -public: - RigidMapR3(); - RigidMapR3(const VectorR3&, const VectorR3&, const VectorR3&, const VectorR3&); - RigidMapR3(double, double, double, double, double, double, - double, double, double, double, double, double); - RigidMapR3(const Matrix3x3&, const VectorR3&); - - RigidMapR3& Set(const Matrix3x3&, const VectorR3&); // Set to RotationMap & Vector - RigidMapR3& SetTranslationPart(const VectorR3&); // Set the translation part - RigidMapR3& SetTranslationPart(double, double, double); // Set the translation part - RigidMapR3& SetRotationPart(const Matrix3x3&); // Set the rotation part - RigidMapR3& SetRotationPart(const Quaternion&); - RigidMapR3& SetRotationPart(const VectorR3&, double theta); // Set rotation axis and angle - RigidMapR3& SetRotationPart(const VectorR3&, double sintheta, double costheta); - - RigidMapR3& ApplyTranslationLeft(const VectorR3& u) - { - Matrix3x4::ApplyTranslationLeft(u); - return *this; - } - RigidMapR3& ApplyTranslationRight(const VectorR3& u) - { - Matrix3x4::ApplyTranslationRight(u); - return *this; - } - RigidMapR3& ApplyYRotationLeft(double theta) - { - Matrix3x4::ApplyYRotationLeft(theta); - return *this; - } - RigidMapR3& ApplyYRotationLeft(double costheta, double sintheta) - { - Matrix3x4::ApplyYRotationLeft(costheta, sintheta); - return *this; - } - - RigidMapR3& operator*=(const RotationMapR3&); // Composition - RigidMapR3& operator*=(const RigidMapR3&); // Composition - - RigidMapR3 Inverse() const; // Returns inverse - RigidMapR3& Invert(); // Converts into inverse. - - bool CalcGlideRotation(VectorR3* u, VectorR3* v, - double* glideDist, double* rotation) const; - - void Transform3x3Inverse(VectorR3* dest) const - { - Matrix3x4::Transform3x3Transpose(dest); - } - void Transform3x3Inverse(const VectorR3& src, VectorR3* dest) const - { - Matrix3x4::Transform3x3Transpose(src, dest); - } -}; - -// *************************************************************** -// * 3-space vector and matrix utilities (prototypes) * -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - -// Returns the solid angle between vectors v and w. -inline double SolidAngle(const VectorR3& v, const VectorR3& w); - -// Returns a righthanded orthonormal basis to complement unit vector x -void GetOrtho(const VectorR3& x, VectorR3& y, VectorR3& z); -// Returns a vector v orthonormal to unit vector x -void GetOrtho(const VectorR3& x, VectorR3& y); - -// Projections - -// The next three functions are templated below. -//inline VectorR3 ProjectToUnit ( const VectorR3& u, const VectorR3& v); // Project u onto v -//inline VectorR3 ProjectPerpUnit ( const VectorR3& u, const VectorR3 & v); // Project perp to v -//inline VectorR3 ProjectPerpUnitDiff ( const VectorR3& u, const VectorR3& v) -// v must be a unit vector. - -// Projection maps (LinearMapR3s) - -inline LinearMapR3 VectorProjectMap(const VectorR3& u); -inline LinearMapR3 PlaneProjectMap(const VectorR3& w); -inline LinearMapR3 PlaneProjectMap(const VectorR3& u, const VectorR3& v); -// u,v,w - must be unit vector. u and v must be orthonormal and -// specify the plane they are parallel to. w specifies the plane -// it is orthogonal to. - -// VrRotate is similar to glRotate. Returns a matrix (RotationMapR3) -// that will perform the rotation. u should be a unit vector. -RotationMapR3 VrRotate(double theta, const VectorR3& u); -RotationMapR3 VrRotate(double costheta, double sintheta, const VectorR3& u); -RotationMapR3 VrRotateAlign(const VectorR3& fromVec, const VectorR3& toVec); -RotationMapR3 RotateToMap(const VectorR3& fromVec, const VectorR3& toVec); -// fromVec and toVec should be unit vectors for RotateToMap - -// *************************************************************** -// * Stream Output Routines (Prototypes) * -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - -ostream& operator<<(ostream& os, const VectorR3& u); - -// ***************************************************** -// * VectorR3 class - inlined functions * -// * * * * * * * * * * * * * * * * * * * * * * * * * * * - -inline VectorR3& VectorR3::Load(const double* v) -{ - x = *v; - y = *(v + 1); - z = *(v + 2); - return *this; -} - -inline VectorR3& VectorR3::Load(const float* v) -{ - x = *v; - y = *(v + 1); - z = *(v + 2); - return *this; -} - -inline void VectorR3::Dump(double* v) const -{ - *v = x; - *(v + 1) = y; - *(v + 2) = z; -} - -inline void VectorR3::Dump(float* v) const -{ - *v = (float)x; - *(v + 1) = (float)y; - *(v + 2) = (float)z; -} - -inline double VectorR3::operator[](int i) -{ - switch (i) - { - case 0: - return x; - case 1: - return y; - case 2: - return z; - default: - assert(0); - return 0.0; - } -} - -inline VectorR3& VectorR3::MakeUnit() // Convert to unit vector (or leave zero). -{ - double nSq = NormSq(); - if (nSq != 0.0) - { - *this /= sqrt(nSq); - } - return *this; -} - -inline VectorR3 operator+(const VectorR3& u, const VectorR3& v) -{ - return VectorR3(u.x + v.x, u.y + v.y, u.z + v.z); -} -inline VectorR3 operator-(const VectorR3& u, const VectorR3& v) -{ - return VectorR3(u.x - v.x, u.y - v.y, u.z - v.z); -} -inline VectorR3 operator*(const VectorR3& u, double m) -{ - return VectorR3(u.x * m, u.y * m, u.z * m); -} -inline VectorR3 operator*(double m, const VectorR3& u) -{ - return VectorR3(u.x * m, u.y * m, u.z * m); -} -inline VectorR3 operator/(const VectorR3& u, double m) -{ - double mInv = 1.0 / m; - return VectorR3(u.x * mInv, u.y * mInv, u.z * mInv); -} - -inline int operator==(const VectorR3& u, const VectorR3& v) -{ - return (u.x == v.x && u.y == v.y && u.z == v.z); -} - -inline double operator^(const VectorR3& u, const VectorR3& v) // Dot Product -{ - return (u.x * v.x + u.y * v.y + u.z * v.z); -} - -inline VectorR3 operator*(const VectorR3& u, const VectorR3& v) // Cross Product -{ - return (VectorR3(u.y * v.z - u.z * v.y, - u.z * v.x - u.x * v.z, - u.x * v.y - u.y * v.x)); -} - -inline VectorR3 ArrayProd(const VectorR3& u, const VectorR3& v) -{ - return (VectorR3(u.x * v.x, u.y * v.y, u.z * v.z)); -} - -inline VectorR3& VectorR3::operator*=(const VectorR3& v) // Cross Product -{ - double tx = x, ty = y; - x = y * v.z - z * v.y; - y = z * v.x - tx * v.z; - z = tx * v.y - ty * v.x; - return (*this); -} - -inline VectorR3& VectorR3::ArrayProd(const VectorR3& v) // Component-wise Product -{ - x *= v.x; - y *= v.y; - z *= v.z; - return (*this); -} - -inline VectorR3& VectorR3::AddScaled(const VectorR3& u, double s) -{ - x += s * u.x; - y += s * u.y; - z += s * u.z; - return (*this); -} - -inline VectorR3::VectorR3(const VectorHgR3& uH) - : x(uH.x), y(uH.y), z(uH.z) -{ - *this /= uH.w; -} - -inline VectorR3& VectorR3::ReNormalize() // Convert near unit back to unit -{ - double nSq = NormSq(); - double mFact = 1.0 - 0.5 * (nSq - 1.0); // Multiplicative factor - *this *= mFact; - return *this; -} - -inline double NormalizeError(const VectorR3& u) -{ - double discrepancy; - discrepancy = u.x * u.x + u.y * u.y + u.z * u.z - 1.0; - if (discrepancy < 0.0) - { - discrepancy = -discrepancy; - } - return discrepancy; -} - -inline double VectorR3::Dist(const VectorR3& u) const // Distance from u -{ - return sqrt(DistSq(u)); -} - -inline double VectorR3::DistSq(const VectorR3& u) const // Distance from u -{ - return ((x - u.x) * (x - u.x) + (y - u.y) * (y - u.y) + (z - u.z) * (z - u.z)); -} - -// -// Interpolation routines (not just Spherical Interpolation) -// - -// Interpolate(start,end,frac) - linear interpolation -// - allows overshooting the end points -inline VectorR3 Interpolate(const VectorR3& start, const VectorR3& end, double a) -{ - VectorR3 ret; - Lerp(start, end, a, ret); - return ret; -} - -// ****************************************************** -// * Matrix3x3 class - inlined functions * -// * * * * * * * * * * * * * * * * * * * * * * * * * * ** - -inline Matrix3x3::Matrix3x3() {} - -inline Matrix3x3::Matrix3x3(const VectorR3& u, const VectorR3& v, - const VectorR3& s) -{ - m11 = u.x; // Column 1 - m21 = u.y; - m31 = u.z; - m12 = v.x; // Column 2 - m22 = v.y; - m32 = v.z; - m13 = s.x; // Column 3 - m23 = s.y; - m33 = s.z; -} - -inline Matrix3x3::Matrix3x3(double a11, double a21, double a31, - double a12, double a22, double a32, - double a13, double a23, double a33) -// Values specified in column order!!! -{ - m11 = a11; // Row 1 - m12 = a12; - m13 = a13; - m21 = a21; // Row 2 - m22 = a22; - m23 = a23; - m31 = a31; // Row 3 - m32 = a32; - m33 = a33; -} - -inline void Matrix3x3::SetIdentity() -{ - m11 = m22 = m33 = 1.0; - m12 = m13 = m21 = m23 = m31 = m32 = 0.0; -} - -inline void Matrix3x3::SetZero() -{ - m11 = m12 = m13 = m21 = m22 = m23 = m31 = m32 = m33 = 0.0; -} - -inline void Matrix3x3::Set(const Matrix3x3& A) // Set to the matrix. -{ - m11 = A.m11; - m21 = A.m21; - m31 = A.m31; - m12 = A.m12; - m22 = A.m22; - m32 = A.m32; - m13 = A.m13; - m23 = A.m23; - m33 = A.m33; -} - -inline void Matrix3x3::Set3x3(const Matrix3x4& A) // Set to the 3x3 part of the matrix. -{ - m11 = A.m11; - m21 = A.m21; - m31 = A.m31; - m12 = A.m12; - m22 = A.m22; - m32 = A.m32; - m13 = A.m13; - m23 = A.m23; - m33 = A.m33; -} - -inline void Matrix3x3::Set(const VectorR3& u, const VectorR3& v, - const VectorR3& w) -{ - m11 = u.x; // Column 1 - m21 = u.y; - m31 = u.z; - m12 = v.x; // Column 2 - m22 = v.y; - m32 = v.z; - m13 = w.x; // Column 3 - m23 = w.y; - m33 = w.z; -} - -inline void Matrix3x3::Set(double a11, double a21, double a31, - double a12, double a22, double a32, - double a13, double a23, double a33) -// Values specified in column order!!! -{ - m11 = a11; // Row 1 - m12 = a12; - m13 = a13; - m21 = a21; // Row 2 - m22 = a22; - m23 = a23; - m31 = a31; // Row 3 - m32 = a32; - m33 = a33; -} - -inline void Matrix3x3::SetByRows(double a11, double a12, double a13, - double a21, double a22, double a23, - double a31, double a32, double a33) -// Values specified in row order!!! -{ - m11 = a11; // Row 1 - m12 = a12; - m13 = a13; - m21 = a21; // Row 2 - m22 = a22; - m23 = a23; - m31 = a31; // Row 3 - m32 = a32; - m33 = a33; -} - -inline void Matrix3x3::SetByRows(const VectorR3& u, const VectorR3& v, - const VectorR3& s) -{ - m11 = u.x; // Row 1 - m12 = u.y; - m13 = u.z; - m21 = v.x; // Row 2 - m22 = v.y; - m23 = v.z; - m31 = s.x; // Row 3 - m32 = s.y; - m33 = s.z; -} - -inline void Matrix3x3::SetColumn1(double x, double y, double z) -{ - m11 = x; - m21 = y; - m31 = z; -} - -inline void Matrix3x3::SetColumn2(double x, double y, double z) -{ - m12 = x; - m22 = y; - m32 = z; -} - -inline void Matrix3x3::SetColumn3(double x, double y, double z) -{ - m13 = x; - m23 = y; - m33 = z; -} - -inline void Matrix3x3::SetColumn1(const VectorR3& u) -{ - m11 = u.x; - m21 = u.y; - m31 = u.z; -} - -inline void Matrix3x3::SetColumn2(const VectorR3& u) -{ - m12 = u.x; - m22 = u.y; - m32 = u.z; -} - -inline void Matrix3x3::SetColumn3(const VectorR3& u) -{ - m13 = u.x; - m23 = u.y; - m33 = u.z; -} - -inline void Matrix3x3::SetRow1(double x, double y, double z) -{ - m11 = x; - m12 = y; - m13 = z; -} - -inline void Matrix3x3::SetRow2(double x, double y, double z) -{ - m21 = x; - m22 = y; - m23 = z; -} - -inline void Matrix3x3::SetRow3(double x, double y, double z) -{ - m31 = x; - m32 = y; - m33 = z; -} - -inline VectorR3 Matrix3x3::Column1() const -{ - return (VectorR3(m11, m21, m31)); -} - -inline VectorR3 Matrix3x3::Column2() const -{ - return (VectorR3(m12, m22, m32)); -} - -inline VectorR3 Matrix3x3::Column3() const -{ - return (VectorR3(m13, m23, m33)); -} - -inline VectorR3 Matrix3x3::Row1() const -{ - return (VectorR3(m11, m12, m13)); -} - -inline VectorR3 Matrix3x3::Row2() const -{ - return (VectorR3(m21, m22, m23)); -} - -inline VectorR3 Matrix3x3::Row3() const -{ - return (VectorR3(m31, m32, m33)); -} - -inline void Matrix3x3::SetDiagonal(double x, double y, double z) -{ - m11 = x; - m22 = y; - m33 = z; -} - -inline void Matrix3x3::SetDiagonal(const VectorR3& u) -{ - SetDiagonal(u.x, u.y, u.z); -} - -inline double Matrix3x3::Diagonal(int i) -{ - switch (i) - { - case 0: - return m11; - case 1: - return m22; - case 2: - return m33; - default: - assert(0); - return 0.0; - } -} - -inline void Matrix3x3::MakeTranspose() // Transposes it. -{ - double temp; - temp = m12; - m12 = m21; - m21 = temp; - temp = m13; - m13 = m31; - m31 = temp; - temp = m23; - m23 = m32; - m32 = temp; -} - -inline VectorR3 operator*(const Matrix3x3& A, const VectorR3& u) -{ - return (VectorR3(A.m11 * u.x + A.m12 * u.y + A.m13 * u.z, - A.m21 * u.x + A.m22 * u.y + A.m23 * u.z, - A.m31 * u.x + A.m32 * u.y + A.m33 * u.z)); -} - -inline void Matrix3x3::Transform(VectorR3* u) const -{ - double newX, newY; - newX = m11 * u->x + m12 * u->y + m13 * u->z; - newY = m21 * u->x + m22 * u->y + m23 * u->z; - u->z = m31 * u->x + m32 * u->y + m33 * u->z; - u->x = newX; - u->y = newY; -} - -inline void Matrix3x3::Transform(const VectorR3& src, VectorR3* dest) const -{ - dest->x = m11 * src.x + m12 * src.y + m13 * src.z; - dest->y = m21 * src.x + m22 * src.y + m23 * src.z; - dest->z = m31 * src.x + m32 * src.y + m33 * src.z; -} - -// ****************************************************** -// * Matrix3x4 class - inlined functions * -// * * * * * * * * * * * * * * * * * * * * * * * * * * ** - -inline Matrix3x4::Matrix3x4(const VectorR3& u, const VectorR3& v, - const VectorR3& s, const VectorR3& t) -{ - m11 = u.x; // Column 1 - m21 = u.y; - m31 = u.z; - m12 = v.x; // Column 2 - m22 = v.y; - m32 = v.z; - m13 = s.x; // Column 3 - m23 = s.y; - m33 = s.z; - m14 = t.x; - m24 = t.y; - m34 = t.z; -} - -inline Matrix3x4::Matrix3x4(double a11, double a21, double a31, - double a12, double a22, double a32, - double a13, double a23, double a33, - double a14, double a24, double a34) -{ // Values in COLUMN order! - m11 = a11; // Row 1 - m12 = a12; - m13 = a13; - m14 = a14; - m21 = a21; // Row 2 - m22 = a22; - m23 = a23; - m24 = a24; - m31 = a31; // Row 3 - m32 = a32; - m33 = a33; - m34 = a34; -} - -inline Matrix3x4::Matrix3x4(const Matrix3x3& A, const VectorR3& u) -{ - Set(A, u); -} - -inline void Matrix3x4::SetIdentity() // Set to the identity map -{ - m11 = m22 = m33 = 1.0; - m12 = m13 = m21 = m23 = m31 = m32 = 0.0; - m14 = m24 = m34 = 0.0; -} - -inline void Matrix3x4::SetZero() // Set to the zero map -{ - m11 = m22 = m33 = 0.0; - m12 = m13 = m21 = m23 = m31 = m32 = 0.0; - m14 = m24 = m34 = 0.0; -} - -inline void Matrix3x4::Set(const Matrix3x4& A) // Set to the matrix. -{ - m11 = A.m11; - m21 = A.m21; - m31 = A.m31; - m12 = A.m12; - m22 = A.m22; - m32 = A.m32; - m13 = A.m13; - m23 = A.m23; - m33 = A.m33; - m14 = A.m14; - m24 = A.m24; - m34 = A.m34; -} - -inline void Matrix3x4::Set(const Matrix3x3& A, const VectorR3& t) // Set to the matrix plus 4th column -{ - m11 = A.m11; - m21 = A.m21; - m31 = A.m31; - m12 = A.m12; - m22 = A.m22; - m32 = A.m32; - m13 = A.m13; - m23 = A.m23; - m33 = A.m33; - m14 = t.x; // Column 4 - m24 = t.y; - m34 = t.z; -} - -// Set linear part to the matrix -inline void Matrix3x4::Set3x3(const Matrix3x3& A) -{ - m11 = A.m11; - m21 = A.m21; - m31 = A.m31; - m12 = A.m12; - m22 = A.m22; - m32 = A.m32; - m13 = A.m13; - m23 = A.m23; - m33 = A.m33; -} - -inline void Matrix3x4::Set(const VectorR3& u, const VectorR3& v, - const VectorR3& w, const VectorR3& t) -{ - m11 = u.x; // Column 1 - m21 = u.y; - m31 = u.z; - m12 = v.x; // Column 2 - m22 = v.y; - m32 = v.z; - m13 = w.x; // Column 3 - m23 = w.y; - m33 = w.z; - m14 = t.x; // Column 4 - m24 = t.y; - m34 = t.z; -} - -inline void Matrix3x4::Set(double a11, double a21, double a31, - double a12, double a22, double a32, - double a13, double a23, double a33, - double a14, double a24, double a34) -// Values specified in column order!!! -{ - m11 = a11; // Row 1 - m12 = a12; - m13 = a13; - m14 = a14; - m21 = a21; // Row 2 - m22 = a22; - m23 = a23; - m24 = a24; - m31 = a31; // Row 3 - m32 = a32; - m33 = a33; - m34 = a34; -} - -inline void Matrix3x4::Set3x3(double a11, double a21, double a31, - double a12, double a22, double a32, - double a13, double a23, double a33) -// Values specified in column order!!! -{ - m11 = a11; // Row 1 - m12 = a12; - m13 = a13; - m21 = a21; // Row 2 - m22 = a22; - m23 = a23; - m31 = a31; // Row 3 - m32 = a32; - m33 = a33; -} - -inline void Matrix3x4::SetByRows(double a11, double a12, double a13, double a14, - double a21, double a22, double a23, double a24, - double a31, double a32, double a33, double a34) -// Values specified in row order!!! -{ - m11 = a11; // Row 1 - m12 = a12; - m13 = a13; - m14 = a14; - m21 = a21; // Row 2 - m22 = a22; - m23 = a23; - m24 = a24; - m31 = a31; // Row 3 - m32 = a32; - m33 = a33; - m34 = a34; -} - -inline void Matrix3x4::SetColumn1(double x, double y, double z) -{ - m11 = x; - m21 = y; - m31 = z; -} - -inline void Matrix3x4::SetColumn2(double x, double y, double z) -{ - m12 = x; - m22 = y; - m32 = z; -} - -inline void Matrix3x4::SetColumn3(double x, double y, double z) -{ - m13 = x; - m23 = y; - m33 = z; -} - -inline void Matrix3x4::SetColumn4(double x, double y, double z) -{ - m14 = x; - m24 = y; - m34 = z; -} - -inline void Matrix3x4::SetColumn1(const VectorR3& u) -{ - m11 = u.x; - m21 = u.y; - m31 = u.z; -} - -inline void Matrix3x4::SetColumn2(const VectorR3& u) -{ - m12 = u.x; - m22 = u.y; - m32 = u.z; -} - -inline void Matrix3x4::SetColumn3(const VectorR3& u) -{ - m13 = u.x; - m23 = u.y; - m33 = u.z; -} - -inline void Matrix3x4::SetColumn4(const VectorR3& u) -{ - m14 = u.x; - m24 = u.y; - m34 = u.z; -} - -inline VectorR3 Matrix3x4::Column1() const -{ - return (VectorR3(m11, m21, m31)); -} - -inline VectorR3 Matrix3x4::Column2() const -{ - return (VectorR3(m12, m22, m32)); -} - -inline VectorR3 Matrix3x4::Column3() const -{ - return (VectorR3(m13, m23, m33)); -} - -inline VectorR3 Matrix3x4::Column4() const -{ - return (VectorR3(m14, m24, m34)); -} - -inline void Matrix3x4::SetRow1(double x, double y, double z, double w) -{ - m11 = x; - m12 = y; - m13 = z; - m14 = w; -} - -inline void Matrix3x4::SetRow2(double x, double y, double z, double w) -{ - m21 = x; - m22 = y; - m23 = z; - m24 = w; -} - -inline void Matrix3x4::SetRow3(double x, double y, double z, double w) -{ - m31 = x; - m32 = y; - m33 = z; - m34 = w; -} - -// Left multiply with a translation (so the translation is applied afterwards). -inline Matrix3x4& Matrix3x4::ApplyTranslationLeft(const VectorR3& u) -{ - m14 += u.x; - m24 += u.y; - m34 += u.z; - return *this; -} - -// Right multiply with a translation (so the translation is applied first). -inline Matrix3x4& Matrix3x4::ApplyTranslationRight(const VectorR3& u) -{ - double new14 = m14 + m11 * u.x + m12 * u.y + m13 * u.z; - double new24 = m24 + m21 * u.x + m22 * u.y + m23 * u.z; - m34 = m34 + m31 * u.x + m32 * u.y + m33 * u.z; - m14 = new14; - m24 = new24; - return *this; -} - -// Left-multiply with a rotation around the y-axis. -inline Matrix3x4& Matrix3x4::ApplyYRotationLeft(double theta) -{ - double costheta = cos(theta); - double sintheta = sin(theta); - return ApplyYRotationLeft(costheta, sintheta); -} - -inline Matrix3x4& Matrix3x4::ApplyYRotationLeft(double costheta, double sintheta) -{ - double tmp; - tmp = costheta * m11 + sintheta * m31; - m31 = costheta * m31 - sintheta * m11; - m11 = tmp; - - tmp = costheta * m12 + sintheta * m32; - m32 = costheta * m32 - sintheta * m12; - m12 = tmp; - - tmp = costheta * m13 + sintheta * m33; - m33 = costheta * m33 - sintheta * m13; - m13 = tmp; - - tmp = costheta * m14 + sintheta * m34; - m34 = costheta * m34 - sintheta * m14; - m14 = tmp; - - return *this; -} - -inline VectorR3 Matrix3x4::Solve(const VectorR3& u) const // Returns solution -{ - Matrix3x3 A; - A.Set3x3(*this); - return (A.Solve(VectorR3(m14 - u.x, m24 - u.y, m34 - u.z))); -} - -inline void Matrix3x4::Transform(VectorR3* u) const -{ - double newX, newY; - newX = m11 * u->x + m12 * u->y + m13 * u->z + m14; - newY = m21 * u->x + m22 * u->y + m23 * u->z + m24; - u->z = m31 * u->x + m32 * u->y + m33 * u->z + m34; - u->x = newX; - u->y = newY; -} - -inline void Matrix3x4::Transform3x3(VectorR3* u) const -{ - double newX, newY; - newX = m11 * u->x + m12 * u->y + m13 * u->z; - newY = m21 * u->x + m22 * u->y + m23 * u->z; - u->z = m31 * u->x + m32 * u->y + m33 * u->z; - u->x = newX; - u->y = newY; -} - -inline void Matrix3x4::Transform(const VectorR3& src, VectorR3* dest) const -{ - dest->x = m11 * src.x + m12 * src.y + m13 * src.z + m14; - dest->y = m21 * src.x + m22 * src.y + m23 * src.z + m24; - dest->z = m31 * src.x + m32 * src.y + m33 * src.z + m34; -} - -inline void Matrix3x4::Transform3x3(const VectorR3& src, VectorR3* dest) const -{ - dest->x = m11 * src.x + m12 * src.y + m13 * src.z; - dest->y = m21 * src.x + m22 * src.y + m23 * src.z; - dest->z = m31 * src.x + m32 * src.y + m33 * src.z; -} - -inline void Matrix3x4::Transform3x3Transpose(VectorR3* u) const -{ - double newX, newY; - newX = m11 * u->x + m21 * u->y + m31 * u->z; - newY = m12 * u->x + m22 * u->y + m32 * u->z; - u->z = m13 * u->x + m23 * u->y + m33 * u->z; - u->x = newX; - u->y = newY; -} - -inline void Matrix3x4::Transform3x3Transpose(const VectorR3& src, VectorR3* dest) const -{ - dest->x = m11 * src.x + m21 * src.y + m31 * src.z; - dest->y = m12 * src.x + m22 * src.y + m32 * src.z; - dest->z = m13 * src.x + m23 * src.y + m33 * src.z; -} - -inline VectorR3 operator*(const Matrix3x4& A, const VectorR3& u) -{ - return (VectorR3(A.m11 * u.x + A.m12 * u.y + A.m13 * u.z + A.m14, - A.m21 * u.x + A.m22 * u.y + A.m23 * u.z + A.m24, - A.m31 * u.x + A.m32 * u.y + A.m33 * u.z + A.m34)); -} - -// ****************************************************** -// * LinearMapR3 class - inlined functions * -// * * * * * * * * * * * * * * * * * * * * * * * * * * ** - -inline LinearMapR3::LinearMapR3() -{ - SetZero(); - return; -} - -inline LinearMapR3::LinearMapR3(const VectorR3& u, const VectorR3& v, - const VectorR3& s) - : Matrix3x3(u, v, s) -{ -} - -inline LinearMapR3::LinearMapR3( - double a11, double a21, double a31, - double a12, double a22, double a32, - double a13, double a23, double a33) - // Values specified in column order!!! - : Matrix3x3(a11, a21, a31, a12, a22, a32, a13, a23, a33) -{ -} - -inline LinearMapR3::LinearMapR3(const Matrix3x3& A) - : Matrix3x3(A) -{ -} - -inline void LinearMapR3::SetZero() -{ - Matrix3x3::SetZero(); -} - -inline void LinearMapR3::Negate() -{ - m11 = -m11; // Row 1 - m12 = -m12; - m13 = -m13; - m21 = -m21; // Row 2 - m22 = -m22; - m23 = -m23; - m31 = -m31; // Row 3 - m32 = -m32; - m33 = -m33; -} - -inline LinearMapR3& LinearMapR3::operator+=(const Matrix3x3& B) -{ - m11 += B.m11; - m12 += B.m12; - m13 += B.m13; - m21 += B.m21; - m22 += B.m22; - m23 += B.m23; - m31 += B.m31; - m32 += B.m32; - m33 += B.m33; - return (*this); -} - -inline LinearMapR3& LinearMapR3::operator-=(const Matrix3x3& B) -{ - m11 -= B.m11; - m12 -= B.m12; - m13 -= B.m13; - m21 -= B.m21; - m22 -= B.m22; - m23 -= B.m23; - m31 -= B.m31; - m32 -= B.m32; - m33 -= B.m33; - return (*this); -} - -inline LinearMapR3 operator+(const LinearMapR3& A, const Matrix3x3& B) -{ - return (LinearMapR3(A.m11 + B.m11, A.m21 + B.m21, A.m31 + B.m31, - A.m12 + B.m12, A.m22 + B.m22, A.m32 + B.m32, - A.m13 + B.m13, A.m23 + B.m23, A.m33 + B.m33)); -} - -inline LinearMapR3 operator+(const Matrix3x3& A, const LinearMapR3& B) -{ - return (LinearMapR3(A.m11 + B.m11, A.m21 + B.m21, A.m31 + B.m31, - A.m12 + B.m12, A.m22 + B.m22, A.m32 + B.m32, - A.m13 + B.m13, A.m23 + B.m23, A.m33 + B.m33)); -} - -inline LinearMapR3 operator-(const LinearMapR3& A) -{ - return (LinearMapR3(-A.m11, -A.m21, -A.m31, - -A.m12, -A.m22, -A.m32, - -A.m13, -A.m23, -A.m33)); -} - -inline LinearMapR3 operator-(const Matrix3x3& A, const LinearMapR3& B) -{ - return (LinearMapR3(A.m11 - B.m11, A.m21 - B.m21, A.m31 - B.m31, - A.m12 - B.m12, A.m22 - B.m22, A.m32 - B.m32, - A.m13 - B.m13, A.m23 - B.m23, A.m33 - B.m33)); -} - -inline LinearMapR3 operator-(const LinearMapR3& A, const Matrix3x3& B) -{ - return (LinearMapR3(A.m11 - B.m11, A.m21 - B.m21, A.m31 - B.m31, - A.m12 - B.m12, A.m22 - B.m22, A.m32 - B.m32, - A.m13 - B.m13, A.m23 - B.m23, A.m33 - B.m33)); -} - -inline LinearMapR3& LinearMapR3::operator*=(double b) -{ - m11 *= b; - m12 *= b; - m13 *= b; - m21 *= b; - m22 *= b; - m23 *= b; - m31 *= b; - m32 *= b; - m33 *= b; - return (*this); -} - -inline LinearMapR3 operator*(const LinearMapR3& A, double b) -{ - return (LinearMapR3(A.m11 * b, A.m21 * b, A.m31 * b, - A.m12 * b, A.m22 * b, A.m32 * b, - A.m13 * b, A.m23 * b, A.m33 * b)); -} - -inline LinearMapR3 operator*(double b, const LinearMapR3& A) -{ - return (LinearMapR3(A.m11 * b, A.m21 * b, A.m31 * b, - A.m12 * b, A.m22 * b, A.m32 * b, - A.m13 * b, A.m23 * b, A.m33 * b)); -} - -inline LinearMapR3 operator/(const LinearMapR3& A, double b) -{ - double bInv = 1.0 / b; - return (LinearMapR3(A.m11 * bInv, A.m21 * bInv, A.m31 * bInv, - A.m12 * bInv, A.m22 * bInv, A.m32 * bInv, - A.m13 * bInv, A.m23 * bInv, A.m33 * bInv)); -} - -inline LinearMapR3& LinearMapR3::operator/=(double b) -{ - double bInv = 1.0 / b; - return (*this *= bInv); -} - -inline LinearMapR3& LinearMapR3::operator*=(const Matrix3x3& B) // Matrix product -{ - OperatorTimesEquals(B); - return (*this); -} - -inline VectorR3 LinearMapR3::Solve(const VectorR3& u) const // Returns solution -{ - return (Matrix3x3::Solve(u)); -} - -inline LinearMapR3 LinearMapR3::Transpose() const // Returns the transpose -{ - return (LinearMapR3(m11, m12, m13, m21, m22, m23, m31, m32, m33)); -} - -// ****************************************************** -// * AffineMapR3 class - inlined functions * -// * * * * * * * * * * * * * * * * * * * * * * * * * * ** - -inline AffineMapR3::AffineMapR3(double a11, double a21, double a31, - double a12, double a22, double a32, - double a13, double a23, double a33, - double a14, double a24, double a34) -{ // Values in COLUMN order! - m11 = a11; // Row 1 - m12 = a12; - m13 = a13; - m14 = a14; - m21 = a21; // Row 2 - m22 = a22; - m23 = a23; - m24 = a24; - m31 = a31; // Row 3 - m32 = a32; - m33 = a33; - m34 = a34; -} - -inline AffineMapR3::AffineMapR3(const VectorR3& u, const VectorR3& v, - const VectorR3& w, const VectorR3& t) -{ - m11 = u.x; // Column 1 - m21 = u.y; - m31 = u.z; - m12 = v.x; // Column 2 - m22 = v.y; - m32 = v.z; - m13 = w.x; // Column 3 - m23 = w.y; - m33 = w.z; - m14 = t.x; // Column 4 - m24 = t.y; - m34 = t.z; -} - -inline AffineMapR3::AffineMapR3(const LinearMapR3& A, const VectorR3& t) -{ - m11 = A.m11; - m12 = A.m12; - m13 = A.m13; - m14 = t.x; - m21 = A.m21; - m22 = A.m22; - m23 = A.m23; - m24 = t.y; - m31 = A.m31; - m32 = A.m32; - m33 = A.m33; - m34 = t.z; -} - -inline void AffineMapR3::SetIdentity() -{ - Matrix3x4::SetIdentity(); -} - -inline void AffineMapR3::SetZero() -{ - Matrix3x4::SetZero(); -} - -inline VectorR3 AffineMapR3::Solve(const VectorR3& u) const // Returns solution -{ - return (Matrix3x4::Solve(u)); -} - -inline AffineMapR3& AffineMapR3::operator+=(const Matrix3x4& B) -{ - m11 += B.m11; - m21 += B.m21; - m31 += B.m31; - m12 += B.m12; - m22 += B.m22; - m32 += B.m32; - m13 += B.m13; - m23 += B.m23; - m33 += B.m33; - m14 += B.m14; - m24 += B.m24; - m34 += B.m34; - return (*this); -} - -inline AffineMapR3& AffineMapR3::operator-=(const Matrix3x4& B) -{ - m11 -= B.m11; - m21 -= B.m21; - m31 -= B.m31; - m12 -= B.m12; - m22 -= B.m22; - m32 -= B.m32; - m13 -= B.m13; - m23 -= B.m23; - m33 -= B.m33; - m14 -= B.m14; - m24 -= B.m24; - m34 -= B.m34; - return (*this); -} - -inline AffineMapR3 operator+(const AffineMapR3& A, const AffineMapR3& B) -{ - return (AffineMapR3(A.m11 + B.m11, A.m21 + B.m21, A.m31 + B.m31, - A.m12 + B.m12, A.m22 + B.m22, A.m32 + B.m32, - A.m13 + B.m13, A.m23 + B.m23, A.m33 + B.m33, - A.m14 + B.m14, A.m23 + B.m24, A.m34 + B.m34)); -} - -inline AffineMapR3 operator+(const AffineMapR3& A, const Matrix3x3& B) -{ - return (AffineMapR3(A.m11 + B.m11, A.m21 + B.m21, A.m31 + B.m31, - A.m12 + B.m12, A.m22 + B.m22, A.m32 + B.m32, - A.m13 + B.m13, A.m23 + B.m23, A.m33 + B.m33, - A.m14, A.m23, A.m34)); -} - -inline AffineMapR3 operator+(const Matrix3x3& B, const AffineMapR3& A) -{ - return (AffineMapR3(A.m11 + B.m11, A.m21 + B.m21, A.m31 + B.m31, - A.m12 + B.m12, A.m22 + B.m22, A.m32 + B.m32, - A.m13 + B.m13, A.m23 + B.m23, A.m33 + B.m33, - A.m14, A.m23, A.m34)); -} - -inline AffineMapR3 operator-(const AffineMapR3& A, const AffineMapR3& B) -{ - return (AffineMapR3(A.m11 - B.m11, A.m21 - B.m21, A.m31 - B.m31, - A.m12 - B.m12, A.m22 - B.m22, A.m32 - B.m32, - A.m13 - B.m13, A.m23 - B.m23, A.m33 - B.m33, - A.m14 - B.m14, A.m23 - B.m24, A.m34 - B.m34)); -} - -inline AffineMapR3 operator-(const AffineMapR3& A, const LinearMapR3& B) -{ - return (AffineMapR3(A.m11 - B.m11, A.m21 - B.m21, A.m31 - B.m31, - A.m12 - B.m12, A.m22 - B.m22, A.m32 - B.m32, - A.m13 - B.m13, A.m23 - B.m23, A.m33 - B.m33, - A.m14, A.m23, A.m34)); -} - -inline AffineMapR3 operator-(const LinearMapR3& B, const AffineMapR3& A) -{ - return (AffineMapR3(A.m11 - B.m11, A.m21 - B.m21, A.m31 - B.m31, - A.m12 - B.m12, A.m22 - B.m22, A.m32 - B.m32, - A.m13 - B.m13, A.m23 - B.m23, A.m33 - B.m33, - A.m14, A.m23, A.m34)); -} - -inline AffineMapR3& AffineMapR3::operator*=(double b) -{ - m11 *= b; - m12 *= b; - m13 *= b; - m21 *= b; - m22 *= b; - m23 *= b; - m31 *= b; - m32 *= b; - m33 *= b; - m14 *= b; - m24 *= b; - m34 *= b; - return (*this); -} - -inline AffineMapR3 operator*(const AffineMapR3& A, double b) -{ - return (AffineMapR3(A.m11 * b, A.m21 * b, A.m31 * b, - A.m12 * b, A.m22 * b, A.m32 * b, - A.m13 * b, A.m23 * b, A.m33 * b, - A.m14 * b, A.m24 * b, A.m34 * b)); -} - -inline AffineMapR3 operator*(double b, const AffineMapR3& A) -{ - return (AffineMapR3(A.m11 * b, A.m21 * b, A.m31 * b, - A.m12 * b, A.m22 * b, A.m32 * b, - A.m13 * b, A.m23 * b, A.m33 * b, - A.m14 * b, A.m24 * b, A.m34 * b)); -} - -inline AffineMapR3& AffineMapR3::operator/=(double b) -{ - double bInv = 1.0 / b; - *this *= bInv; - return (*this); -} - -inline AffineMapR3 operator/(const AffineMapR3& A, double b) -{ - double bInv = 1.0 / b; - return (AffineMapR3(A.m11 * bInv, A.m21 * bInv, A.m31 * bInv, - A.m12 * bInv, A.m22 * bInv, A.m32 * bInv, - A.m13 * bInv, A.m23 * bInv, A.m33 * bInv, - A.m14 * bInv, A.m24 * bInv, A.m34 * bInv)); -} - -inline AffineMapR3& AffineMapR3::operator*=(const Matrix3x3& B) // Composition -{ - OperatorTimesEquals(B); - return (*this); -} - -inline AffineMapR3& AffineMapR3::operator*=(const Matrix3x4& B) // Composition -{ - OperatorTimesEquals(B); - return (*this); -} - -// ************************************************************** -// RotationMapR3 class (inlined functions) * -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** - -inline RotationMapR3::RotationMapR3() -{ - SetIdentity(); - return; -} - -inline RotationMapR3::RotationMapR3(const VectorR3& u, const VectorR3& v, - const VectorR3& s) - : Matrix3x3(u, v, s) -{ -} - -inline RotationMapR3::RotationMapR3( - double a11, double a21, double a31, - double a12, double a22, double a32, - double a13, double a23, double a33) - // Values specified in column order!!! - : Matrix3x3(a11, a21, a31, a12, a22, a32, a13, a23, a33) -{ -} - -inline RotationMapR3 RotationMapR3::Inverse() const // Returns inverse -{ - return (RotationMapR3(m11, m12, m13, // In column order! - m21, m22, m23, - m31, m32, m33)); -} - -inline RotationMapR3& RotationMapR3::Invert() // Converts into inverse. -{ - double temp; - temp = m12; - m12 = m21; - m21 = temp; - temp = m13; - m13 = m31; - m31 = temp; - temp = m23; - m23 = m32; - m32 = temp; - return (*this); -} - -inline VectorR3 RotationMapR3::Solve(const VectorR3& u) const // Returns solution -{ - return (VectorR3(m11 * u.x + m21 * u.y + m31 * u.z, - m12 * u.x + m22 * u.y + m32 * u.z, - m13 * u.x + m23 * u.y + m33 * u.z)); -} - -inline RotationMapR3& RotationMapR3::operator*=(const RotationMapR3& B) // Matrix product -{ - OperatorTimesEquals(B); - return (*this); -} - -// ************************************************************** -// RigidMapR3 class (inlined functions) * -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** - -inline RigidMapR3::RigidMapR3() -{ - SetIdentity(); - return; -} - -inline RigidMapR3::RigidMapR3(const VectorR3& u, const VectorR3& v, - const VectorR3& s, const VectorR3& t) - : Matrix3x4(u, v, s, t) -{ -} - -inline RigidMapR3::RigidMapR3( - double a11, double a21, double a31, - double a12, double a22, double a32, - double a13, double a23, double a33, - double a14, double a24, double a34) - // Values specified in column order!!! - : Matrix3x4(a11, a21, a31, a12, a22, a32, a13, a23, a33, a14, a24, a34) -{ -} - -inline RigidMapR3::RigidMapR3(const Matrix3x3& A, const VectorR3& u) // Set to RotationMap & Vector - : Matrix3x4(A, u) -{ -} - -inline RigidMapR3& RigidMapR3::Set(const Matrix3x3& A, const VectorR3& u) // Set to RotationMap & Vector -{ - Matrix3x4::Set(A, u); - return *this; -} - -inline RigidMapR3& RigidMapR3::SetTranslationPart(const VectorR3& u) // Set the translation part -{ - SetColumn4(u); - return *this; -} - -inline RigidMapR3& RigidMapR3::SetTranslationPart(double x, double y, double z) // Set the translation part -{ - SetColumn4(x, y, z); - return *this; -} - -inline RigidMapR3& RigidMapR3::SetRotationPart(const Matrix3x3& A) // Set the rotation part -{ - Matrix3x4::Set3x3(A); - return *this; -} - -inline RigidMapR3& RigidMapR3::operator*=(const RotationMapR3& B) // Composition -{ - OperatorTimesEquals(B); - return (*this); -} - -inline RigidMapR3& RigidMapR3::operator*=(const RigidMapR3& B) // Composition -{ - OperatorTimesEquals(B); - return (*this); -} - -inline RigidMapR3 RigidMapR3::Inverse() const // Returns inverse -{ - double new14 = -(m11 * m14 + m21 * m24 + m31 * m34); - double new24 = -(m12 * m14 + m22 * m24 + m32 * m34); - double new34 = -(m13 * m14 + m23 * m24 + m33 * m34); - return (RigidMapR3(m11, m12, m13, // In column order! - m21, m22, m23, - m31, m32, m33, - new14, new24, new34)); -} - -inline RigidMapR3& RigidMapR3::Invert() // Converts into inverse. -{ - double new14 = -(m11 * m14 + m21 * m24 + m31 * m34); - double new24 = -(m12 * m14 + m22 * m24 + m32 * m34); - m34 = -(m13 * m14 + m23 * m24 + m33 * m34); - m14 = new14; - m24 = new24; - - double temp; - temp = m12; - m12 = m21; - m21 = temp; - temp = m13; - m13 = m31; - m31 = temp; - temp = m23; - m23 = m32; - m32 = temp; - return (*this); -} - -// *************************************************************** -// * 3-space vector and matrix utilities (inlined functions) * -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - -// Returns the projection of u onto unit v -inline VectorR3 ProjectToUnit(const VectorR3& u, const VectorR3& v) -{ - return (u ^ v) * v; -} - -// Returns the projection of u onto the plane perpindicular to the unit vector v -inline VectorR3 ProjectPerpUnit(const VectorR3& u, const VectorR3& v) -{ - return (u - ((u ^ v) * v)); -} - -// Returns the projection of u onto the plane perpindicular to the unit vector v -// This one is more stable when u and v are nearly equal. -inline VectorR3 ProjectPerpUnitDiff(const VectorR3& u, const VectorR3& v) -{ - VectorR3 ans = u; - ans -= v; - ans -= ((ans ^ v) * v); - return ans; // ans = (u-v) - ((u-v)^v)*v -} - -// VectorProjectMap returns map projecting onto a given vector u. -// u should be a unit vector (otherwise the returned map is -// scaled according to the magnitude of u. -inline LinearMapR3 VectorProjectMap(const VectorR3& u) -{ - double a = u.x * u.y; - double b = u.x * u.z; - double c = u.y * u.z; - return (LinearMapR3(u.x * u.x, a, b, - a, u.y * u.y, c, - b, c, u.z * u.z)); -} - -// PlaneProjectMap returns map projecting onto a given plane. -// The plane is the plane orthognal to w. -// w must be a unit vector (otherwise the returned map is -// garbage). -inline LinearMapR3 PlaneProjectMap(const VectorR3& w) -{ - double a = -w.x * w.y; - double b = -w.x * w.z; - double c = -w.y * w.z; - return (LinearMapR3(1.0 - w.x * w.x, a, b, - a, 1.0 - w.y * w.y, c, - b, c, 1.0 - w.z * w.z)); -} - -// PlaneProjectMap returns map projecting onto a given plane. -// The plane is the plane containing the two orthonormal vectors u,v. -// If u, v are orthonormal, this is a projection with scaling. -// If they are not orthonormal, the results are more difficult -// to interpret. -inline LinearMapR3 PlaneProjectMap(const VectorR3& u, const VectorR3& v) -{ - double a = u.x * u.y + v.x * v.y; - double b = u.x * u.z + v.x * v.z; - double c = u.y * u.z + v.y * v.z; - return (LinearMapR3(u.x * u.x + v.x * v.x, a, b, - a, u.y * u.y + u.y * u.y, c, - b, c, u.z * u.z + v.z * v.z)); -} - -// Returns the solid angle between unit vectors v and w. -inline double SolidAngle(const VectorR3& v, const VectorR3& w) -{ - return atan2((v * w).Norm(), v ^ w); -} - -#endif - -// ******************* End of header material ******************** diff --git a/engine/inc/bullet/ThirdPartyLibs/BussIK/LinearR4.h b/engine/inc/bullet/ThirdPartyLibs/BussIK/LinearR4.h deleted file mode 100644 index 4c033a9e..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/BussIK/LinearR4.h +++ /dev/null @@ -1,1171 +0,0 @@ -/* -* -* Mathematics Subpackage (VrMath) -* -* -* Author: Samuel R. Buss, sbuss@ucsd.edu. -* Web page: http://math.ucsd.edu/~sbuss/MathCG -* -* -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. -* -* -*/ - -// -// Linear Algebra Classes over R4 -// -// -// A. Vector and Position classes -// -// A.1. VectorR4: a column vector of length 4 -// -// B. Matrix Classes -// -// B.1 LinearMapR4 - arbitrary linear map; 4x4 real matrix -// -// B.2 RotationMapR4 - orthonormal 4x4 matrix -// - -#ifndef LINEAR_R4_H -#define LINEAR_R4_H - -#include -#include -#include -#include "LinearR3.h" -using namespace std; - -class VectorR4; // R4 Vector -class LinearMapR4; // 4x4 real matrix -class RotationMapR4; // 4x4 rotation map - -// ************************************** -// VectorR4 class * -// * * * * * * * * * * * * * * * * * * ** - -class VectorR4 -{ -public: - double x, y, z, w; // The x & y & z & w coordinates. - - static const VectorR4 Zero; - static const VectorR4 UnitX; - static const VectorR4 UnitY; - static const VectorR4 UnitZ; - static const VectorR4 UnitW; - static const VectorR4 NegUnitX; - static const VectorR4 NegUnitY; - static const VectorR4 NegUnitZ; - static const VectorR4 NegUnitW; - -public: - VectorR4() : x(0.0), y(0.0), z(0.0), w(0.0) {} - VectorR4(double xVal, double yVal, double zVal, double wVal) - : x(xVal), y(yVal), z(zVal), w(wVal) {} - VectorR4(const Quaternion& q); // Definition with Quaternion routines - - VectorR4& SetZero() - { - x = 0.0; - y = 0.0; - z = 0.0; - w = 0.0; - return *this; - } - VectorR4& Set(double xx, double yy, double zz, double ww) - { - x = xx; - y = yy; - z = zz; - w = ww; - return *this; - } - VectorR4& Set(const Quaternion&); // Defined with Quaternion - VectorR4& Set(const VectorHgR3& h) - { - x = h.x; - y = h.y; - z = h.z; - w = h.w; - return *this; - } - VectorR4& Load(const double* v); - VectorR4& Load(const float* v); - void Dump(double* v) const; - void Dump(float* v) const; - - VectorR4& operator+=(const VectorR4& v) - { - x += v.x; - y += v.y; - z += v.z; - w += v.w; - return (*this); - } - VectorR4& operator-=(const VectorR4& v) - { - x -= v.x; - y -= v.y; - z -= v.z; - w -= v.w; - return (*this); - } - VectorR4& operator*=(double m) - { - x *= m; - y *= m; - z *= m; - w *= m; - return (*this); - } - VectorR4& operator/=(double m) - { - double mInv = 1.0 / m; - x *= mInv; - y *= mInv; - z *= mInv; - w *= mInv; - return (*this); - } - VectorR4 operator-() const { return (VectorR4(-x, -y, -z, -w)); } - VectorR4& ArrayProd(const VectorR4&); // Component-wise product - VectorR4& ArrayProd3(const VectorR3&); // Component-wise product - - VectorR4& AddScaled(const VectorR4& u, double s); - - double Norm() const { return ((double)sqrt(x * x + y * y + z * z + w * w)); } - double NormSq() const { return (x * x + y * y + z * z + w * w); } - double Dist(const VectorR4& u) const; // Distance from u - double DistSq(const VectorR4& u) const; // Distance from u - double MaxAbs() const; - VectorR4& Normalize() - { - *this /= Norm(); - return *this; - } // No error checking - inline VectorR4& MakeUnit(); // Normalize() with error checking - inline VectorR4& ReNormalize(); - bool IsUnit() const - { - double norm = Norm(); - return (1.000001 >= norm && norm >= 0.999999); - } - bool IsUnit(double tolerance) const - { - double norm = Norm(); - return (1.0 + tolerance >= norm && norm >= 1.0 - tolerance); - } - bool IsZero() const { return (x == 0.0 && y == 0.0 && z == 0.0 && w == 0.0); } - bool NearZero(double tolerance) const { return (MaxAbs() <= tolerance); } - // tolerance should be non-negative - - VectorR4& RotateUnitInDirection(const VectorR4& dir); // rotate in direction dir -}; - -inline VectorR4 operator+(const VectorR4& u, const VectorR4& v); -inline VectorR4 operator-(const VectorR4& u, const VectorR4& v); -inline VectorR4 operator*(const VectorR4& u, double m); -inline VectorR4 operator*(double m, const VectorR4& u); -inline VectorR4 operator/(const VectorR4& u, double m); -inline int operator==(const VectorR4& u, const VectorR4& v); - -inline double operator^(const VectorR4& u, const VectorR4& v); // Dot Product -inline VectorR4 ArrayProd(const VectorR4& u, const VectorR4& v); - -inline double Mag(const VectorR4& u) { return u.Norm(); } -inline double Dist(const VectorR4& u, const VectorR4& v) { return u.Dist(v); } -inline double DistSq(const VectorR4& u, const VectorR4& v) { return u.DistSq(v); } -inline double NormalizeError(const VectorR4& u); - -// ******************************************************************** -// Matrix4x4 - base class for 4x4 matrices * -// * * * * * * * * * * * * * * * * * * * * * ************************** - -class Matrix4x4 -{ -public: - double m11, m12, m13, m14, m21, m22, m23, m24, - m31, m32, m33, m34, m41, m42, m43, m44; - - // Implements a 4x4 matrix: m_i_j - row-i and column-j entry - - static const Matrix4x4 Identity; - -public: - Matrix4x4(); - Matrix4x4(const VectorR4&, const VectorR4&, - const VectorR4&, const VectorR4&); // Sets by columns! - Matrix4x4(double, double, double, double, - double, double, double, double, - double, double, double, double, - double, double, double, double); // Sets by columns - - inline void SetIdentity(); // Set to the identity map - inline void SetZero(); // Set to the zero map - inline void Set(const Matrix4x4&); // Set to the matrix. - inline void Set(const VectorR4&, const VectorR4&, - const VectorR4&, const VectorR4&); - inline void Set(double, double, double, double, - double, double, double, double, - double, double, double, double, - double, double, double, double); - inline void SetByRows(const VectorR4&, const VectorR4&, - const VectorR4&, const VectorR4&); - inline void SetByRows(double, double, double, double, - double, double, double, double, - double, double, double, double, - double, double, double, double); - inline void SetColumn1(double, double, double, double); - inline void SetColumn2(double, double, double, double); - inline void SetColumn3(double, double, double, double); - inline void SetColumn4(double, double, double, double); - inline void SetColumn1(const VectorR4&); - inline void SetColumn2(const VectorR4&); - inline void SetColumn3(const VectorR4&); - inline void SetColumn4(const VectorR4&); - inline VectorR4 Column1() const; - inline VectorR4 Column2() const; - inline VectorR4 Column3() const; - inline VectorR4 Column4() const; - - inline void SetDiagonal(double, double, double, double); - inline void SetDiagonal(const VectorR4&); - inline double Diagonal(int); - - inline void MakeTranspose(); // Transposes it. - void operator*=(const Matrix4x4& B); // Matrix product - - Matrix4x4& ReNormalize(); -}; - -inline VectorR4 operator*(const Matrix4x4&, const VectorR4&); - -ostream& operator<<(ostream& os, const Matrix4x4& A); - -// ***************************************** -// LinearMapR4 class * -// * * * * * * * * * * * * * * * * * * * * * - -class LinearMapR4 : public Matrix4x4 -{ -public: - LinearMapR4(); - LinearMapR4(const VectorR4&, const VectorR4&, - const VectorR4&, const VectorR4&); // Sets by columns! - LinearMapR4(double, double, double, double, - double, double, double, double, - double, double, double, double, - double, double, double, double); // Sets by columns - LinearMapR4(const Matrix4x4&); - - inline LinearMapR4& operator+=(const LinearMapR4&); - inline LinearMapR4& operator-=(const LinearMapR4&); - inline LinearMapR4& operator*=(double); - inline LinearMapR4& operator/=(double); - inline LinearMapR4& operator*=(const Matrix4x4&); // Matrix product - - inline LinearMapR4 Transpose() const; - double Determinant() const; // Returns the determinant - LinearMapR4 Inverse() const; // Returns inverse - LinearMapR4& Invert(); // Converts into inverse. - VectorR4 Solve(const VectorR4&) const; // Returns solution - LinearMapR4 PseudoInverse() const; // Returns pseudo-inverse TO DO - VectorR4 PseudoSolve(const VectorR4&); // Finds least squares solution TO DO -}; - -inline LinearMapR4 operator+(const LinearMapR4&, const LinearMapR4&); -inline LinearMapR4 operator-(const LinearMapR4&); -inline LinearMapR4 operator-(const LinearMapR4&, const LinearMapR4&); -inline LinearMapR4 operator*(const LinearMapR4&, double); -inline LinearMapR4 operator*(double, const LinearMapR4&); -inline LinearMapR4 operator/(const LinearMapR4&, double); -inline LinearMapR4 operator*(const Matrix4x4&, const LinearMapR4&); -inline LinearMapR4 operator*(const LinearMapR4&, const Matrix4x4&); -// Matrix product (composition) - -// ******************************************* -// RotationMapR4 class * -// * * * * * * * * * * * * * * * * * * * * * * - -class RotationMapR4 : public Matrix4x4 -{ -public: - RotationMapR4(); - RotationMapR4(const VectorR4&, const VectorR4&, - const VectorR4&, const VectorR4&); // Sets by columns! - RotationMapR4(double, double, double, double, - double, double, double, double, - double, double, double, double, - double, double, double, double); // Sets by columns! - - RotationMapR4& SetZero(); // IT IS AN ERROR TO USE THIS FUNCTION! - - inline RotationMapR4& operator*=(const RotationMapR4&); // Matrix product - - inline RotationMapR4 Transpose() const; - inline RotationMapR4 Inverse() const { return Transpose(); }; // Returns the transpose - inline RotationMapR4& Invert() - { - MakeTranspose(); - return *this; - }; // Transposes it. - inline VectorR4 Invert(const VectorR4&) const; // Returns solution -}; - -inline RotationMapR4 operator*(const RotationMapR4&, const RotationMapR4&); -// Matrix product (composition) - -// *************************************************************** -// * 4-space vector and matrix utilities (prototypes) * -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - -// Returns the angle between vectors u and v. -// Use SolidAngleUnit if both vectors are unit vectors -inline double SolidAngle(const VectorR4& u, const VectorR4& v); -inline double SolidAngleUnit(const VectorR4 u, const VectorR4 v); - -// Returns a righthanded orthonormal basis to complement vectors u,v,w. -// The vectors u,v,w must be unit and orthonormal. -void GetOrtho(const VectorR4& u, RotationMapR4& rotmap); -void GetOrtho(const VectorR4& u, const VectorR4& v, RotationMapR4& rotmap); -void GetOrtho(const VectorR4& u, const VectorR4& v, const VectorR4& w, - RotationMapR4& rotmap); -void GetOrtho(int j, RotationMapR4& rotmap); // Mainly for internal use - -// Projections - -inline VectorR4 ProjectToUnit(const VectorR4& u, const VectorR4& v); -// Project u onto v -inline VectorR4 ProjectPerpUnit(const VectorR4& u, const VectorR4& v); -// Project perp to v -inline VectorR4 ProjectPerpUnitDiff(const VectorR4& u, const VectorR4& v); -// v must be a unit vector. - -// Returns the projection of u onto unit v -inline VectorR4 ProjectToUnit(const VectorR4& u, const VectorR4& v) -{ - return (u ^ v) * v; -} - -// Returns the projection of u onto the plane perpindicular to the unit vector v -inline VectorR4 ProjectPerpUnit(const VectorR4& u, const VectorR4& v) -{ - return (u - ((u ^ v) * v)); -} - -// Returns the projection of u onto the plane perpindicular to the unit vector v -// This one is more stable when u and v are nearly equal. -inline VectorR4 ProjectPerpUnitDiff(const VectorR4& u, const VectorR4& v) -{ - VectorR4 ans = u; - ans -= v; - ans -= ((ans ^ v) * v); - return ans; // ans = (u-v) - ((u-v)^v)*v -} - -// Projection maps (LinearMapR4's) - -// VectorProjectMap returns map projecting onto a given vector u. -// u should be a unit vector (otherwise the returned map is -// scaled according to the magnitude of u. -inline void VectorProjectMap(const VectorR4& u, LinearMapR4& M) -{ - double a = u.x * u.y; - double b = u.x * u.z; - double c = u.x * u.w; - double d = u.y * u.z; - double e = u.y * u.w; - double f = u.z * u.w; - M.Set(u.x * u.x, a, b, c, - a, u.y * u.y, d, e, - b, d, u.z * u.z, f, - c, e, f, u.w * u.w); -} - -inline LinearMapR4 VectorProjectMap(const VectorR4& u) -{ - LinearMapR4 result; - VectorProjectMap(u, result); - return result; -} - -inline LinearMapR4 PerpProjectMap(const VectorR4& u); -// u - must be unit vector. - -LinearMapR4 TimesTranspose(const VectorR4& u, const VectorR4& v); // u * v^T. -inline void TimesTranspose(const VectorR4& u, const VectorR4& v, LinearMapR4& M); - -// Rotation Maps - -RotationMapR4 RotateToMap(const VectorR4& fromVec, const VectorR4& toVec); -// fromVec and toVec should be unit vectors - -// *************************************************************** -// * Stream Output Routines (Prototypes) * -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - -ostream& operator<<(ostream& os, const VectorR4& u); - -// ***************************************************** -// * VectorR4 class - inlined functions * -// * * * * * * * * * * * * * * * * * * * * * * * * * * * - -inline VectorR4& VectorR4::Load(const double* v) -{ - x = *v; - y = *(v + 1); - z = *(v + 2); - w = *(v + 3); - return *this; -} - -inline VectorR4& VectorR4::Load(const float* v) -{ - x = *v; - y = *(v + 1); - z = *(v + 2); - w = *(v + 3); - return *this; -} - -inline void VectorR4::Dump(double* v) const -{ - *v = x; - *(v + 1) = y; - *(v + 2) = z; - *(v + 3) = w; -} - -inline void VectorR4::Dump(float* v) const -{ - *v = (float)x; - *(v + 1) = (float)y; - *(v + 2) = (float)z; - *(v + 3) = (float)w; -} - -inline VectorR4& VectorR4::MakeUnit() // Convert to unit vector (or leave zero). -{ - double nSq = NormSq(); - if (nSq != 0.0) - { - *this /= sqrt(nSq); - } - return *this; -} - -inline VectorR4 operator+(const VectorR4& u, const VectorR4& v) -{ - return VectorR4(u.x + v.x, u.y + v.y, u.z + v.z, u.w + v.w); -} -inline VectorR4 operator-(const VectorR4& u, const VectorR4& v) -{ - return VectorR4(u.x - v.x, u.y - v.y, u.z - v.z, u.w - v.w); -} -inline VectorR4 operator*(const VectorR4& u, double m) -{ - return VectorR4(u.x * m, u.y * m, u.z * m, u.w * m); -} -inline VectorR4 operator*(double m, const VectorR4& u) -{ - return VectorR4(u.x * m, u.y * m, u.z * m, u.w * m); -} -inline VectorR4 operator/(const VectorR4& u, double m) -{ - double mInv = 1.0 / m; - return VectorR4(u.x * mInv, u.y * mInv, u.z * mInv, u.w * mInv); -} - -inline int operator==(const VectorR4& u, const VectorR4& v) -{ - return (u.x == v.x && u.y == v.y && u.z == v.z && u.w == v.w); -} - -inline double operator^(const VectorR4& u, const VectorR4& v) // Dot Product -{ - return (u.x * v.x + u.y * v.y + u.z * v.z + u.w * v.w); -} - -inline VectorR4 ArrayProd(const VectorR4& u, const VectorR4& v) -{ - return (VectorR4(u.x * v.x, u.y * v.y, u.z * v.z, u.w * v.w)); -} - -inline VectorR4& VectorR4::ArrayProd(const VectorR4& v) // Component-wise Product -{ - x *= v.x; - y *= v.y; - z *= v.z; - w *= v.w; - return (*this); -} - -inline VectorR4& VectorR4::ArrayProd3(const VectorR3& v) // Component-wise Product -{ - x *= v.x; - y *= v.y; - z *= v.z; - return (*this); -} - -inline VectorR4& VectorR4::AddScaled(const VectorR4& u, double s) -{ - x += s * u.x; - y += s * u.y; - z += s * u.z; - w += s * u.w; - return (*this); -} - -inline VectorR4& VectorR4::ReNormalize() // Convert near unit back to unit -{ - double nSq = NormSq(); - double mFact = 1.0 - 0.5 * (nSq - 1.0); // Multiplicative factor - *this *= mFact; - return *this; -} - -inline double NormalizeError(const VectorR4& u) -{ - double discrepancy; - discrepancy = u.x * u.x + u.y * u.y + u.z * u.z + u.w * u.w - 1.0; - if (discrepancy < 0.0) - { - discrepancy = -discrepancy; - } - return discrepancy; -} - -inline VectorR3& VectorR3::SetFromHg(const VectorR4& v) -{ - double wInv = 1.0 / v.w; - x = v.x * wInv; - y = v.y * wInv; - z = v.z * wInv; - return *this; -} - -inline double VectorR4::Dist(const VectorR4& u) const // Distance from u -{ - return sqrt(DistSq(u)); -} - -inline double VectorR4::DistSq(const VectorR4& u) const // Distance from u -{ - return ((x - u.x) * (x - u.x) + (y - u.y) * (y - u.y) + (z - u.z) * (z - u.z) + (w - u.w) * (w - u.w)); -} - -// ********************************************************* -// * Matrix4x4 class - inlined functions * -// * * * * * * * * * * * * * * * * * * * * * * * * * * ***** - -inline Matrix4x4::Matrix4x4() {} - -inline Matrix4x4::Matrix4x4(const VectorR4& u, const VectorR4& v, - const VectorR4& s, const VectorR4& t) -{ - m11 = u.x; // Column 1 - m21 = u.y; - m31 = u.z; - m41 = u.w; - m12 = v.x; // Column 2 - m22 = v.y; - m32 = v.z; - m42 = v.w; - m13 = s.x; // Column 3 - m23 = s.y; - m33 = s.z; - m43 = s.w; - m14 = t.x; // Column 4 - m24 = t.y; - m34 = t.z; - m44 = t.w; -} - -inline Matrix4x4::Matrix4x4(double a11, double a21, double a31, double a41, - double a12, double a22, double a32, double a42, - double a13, double a23, double a33, double a43, - double a14, double a24, double a34, double a44) -// Values specified in column order!!! -{ - m11 = a11; // Row 1 - m12 = a12; - m13 = a13; - m14 = a14; - m21 = a21; // Row 2 - m22 = a22; - m23 = a23; - m24 = a24; - m31 = a31; // Row 3 - m32 = a32; - m33 = a33; - m34 = a34; - m41 = a41; // Row 4 - m42 = a42; - m43 = a43; - m44 = a44; -} - -/* -inline Matrix4x4::Matrix4x4 ( const Matrix4x4& A) - : m11(A.m11), m12(A.m12), m13(A.m13), m14(A.m14), - m21(A.m21), m22(A.m22), m23(A.m23), m24(A.m24), - m31(A.m31), m32(A.m32), m33(A.m33), m34(A.m34), - m41(A.m41), m42(A.m42), m43(A.m43), m44(A.m44) {} */ - -inline void Matrix4x4::SetIdentity() -{ - m12 = m13 = m14 = - m21 = m23 = m24 = - m31 = m32 = m34 = - m41 = m42 = m43 = 0.0; - m11 = m22 = m33 = m44 = 1.0; -} - -inline void Matrix4x4::Set(const VectorR4& u, const VectorR4& v, - const VectorR4& s, const VectorR4& t) -{ - m11 = u.x; // Column 1 - m21 = u.y; - m31 = u.z; - m41 = u.w; - m12 = v.x; // Column 2 - m22 = v.y; - m32 = v.z; - m42 = v.w; - m13 = s.x; // Column 3 - m23 = s.y; - m33 = s.z; - m43 = s.w; - m14 = t.x; // Column 4 - m24 = t.y; - m34 = t.z; - m44 = t.w; -} - -inline void Matrix4x4::Set(double a11, double a21, double a31, double a41, - double a12, double a22, double a32, double a42, - double a13, double a23, double a33, double a43, - double a14, double a24, double a34, double a44) -// Values specified in column order!!! -{ - m11 = a11; // Row 1 - m12 = a12; - m13 = a13; - m14 = a14; - m21 = a21; // Row 2 - m22 = a22; - m23 = a23; - m24 = a24; - m31 = a31; // Row 3 - m32 = a32; - m33 = a33; - m34 = a34; - m41 = a41; // Row 4 - m42 = a42; - m43 = a43; - m44 = a44; -} - -inline void Matrix4x4::Set(const Matrix4x4& M) // Set to the matrix. -{ - m11 = M.m11; - m12 = M.m12; - m13 = M.m13; - m14 = M.m14; - m21 = M.m21; - m22 = M.m22; - m23 = M.m23; - m24 = M.m24; - m31 = M.m31; - m32 = M.m32; - m33 = M.m33; - m34 = M.m34; - m41 = M.m41; - m42 = M.m42; - m43 = M.m43; - m44 = M.m44; -} - -inline void Matrix4x4::SetZero() -{ - m11 = m12 = m13 = m14 = m21 = m22 = m23 = m24 = m31 = m32 = m33 = m34 = m41 = m42 = m43 = m44 = 0.0; -} - -inline void Matrix4x4::SetByRows(const VectorR4& u, const VectorR4& v, - const VectorR4& s, const VectorR4& t) -{ - m11 = u.x; // Row 1 - m12 = u.y; - m13 = u.z; - m14 = u.w; - m21 = v.x; // Row 2 - m22 = v.y; - m23 = v.z; - m24 = v.w; - m31 = s.x; // Row 3 - m32 = s.y; - m33 = s.z; - m34 = s.w; - m41 = t.x; // Row 4 - m42 = t.y; - m43 = t.z; - m44 = t.w; -} - -inline void Matrix4x4::SetByRows(double a11, double a12, double a13, double a14, - double a21, double a22, double a23, double a24, - double a31, double a32, double a33, double a34, - double a41, double a42, double a43, double a44) -// Values specified in row order!!! -{ - m11 = a11; // Row 1 - m12 = a12; - m13 = a13; - m14 = a14; - m21 = a21; // Row 2 - m22 = a22; - m23 = a23; - m24 = a24; - m31 = a31; // Row 3 - m32 = a32; - m33 = a33; - m34 = a34; - m41 = a41; // Row 4 - m42 = a42; - m43 = a43; - m44 = a44; -} - -inline void Matrix4x4::SetColumn1(double x, double y, double z, double w) -{ - m11 = x; - m21 = y; - m31 = z; - m41 = w; -} - -inline void Matrix4x4::SetColumn2(double x, double y, double z, double w) -{ - m12 = x; - m22 = y; - m32 = z; - m42 = w; -} - -inline void Matrix4x4::SetColumn3(double x, double y, double z, double w) -{ - m13 = x; - m23 = y; - m33 = z; - m43 = w; -} - -inline void Matrix4x4::SetColumn4(double x, double y, double z, double w) -{ - m14 = x; - m24 = y; - m34 = z; - m44 = w; -} - -inline void Matrix4x4::SetColumn1(const VectorR4& u) -{ - m11 = u.x; - m21 = u.y; - m31 = u.z; - m41 = u.w; -} - -inline void Matrix4x4::SetColumn2(const VectorR4& u) -{ - m12 = u.x; - m22 = u.y; - m32 = u.z; - m42 = u.w; -} - -inline void Matrix4x4::SetColumn3(const VectorR4& u) -{ - m13 = u.x; - m23 = u.y; - m33 = u.z; - m43 = u.w; -} - -inline void Matrix4x4::SetColumn4(const VectorR4& u) -{ - m14 = u.x; - m24 = u.y; - m34 = u.z; - m44 = u.w; -} - -VectorR4 Matrix4x4::Column1() const -{ - return (VectorR4(m11, m21, m31, m41)); -} - -VectorR4 Matrix4x4::Column2() const -{ - return (VectorR4(m12, m22, m32, m42)); -} - -VectorR4 Matrix4x4::Column3() const -{ - return (VectorR4(m13, m23, m33, m43)); -} - -VectorR4 Matrix4x4::Column4() const -{ - return (VectorR4(m14, m24, m34, m44)); -} - -inline void Matrix4x4::SetDiagonal(double x, double y, - double z, double w) -{ - m11 = x; - m22 = y; - m33 = z; - m44 = w; -} - -inline void Matrix4x4::SetDiagonal(const VectorR4& u) -{ - SetDiagonal(u.x, u.y, u.z, u.w); -} - -inline double Matrix4x4::Diagonal(int i) -{ - switch (i) - { - case 0: - return m11; - case 1: - return m22; - case 2: - return m33; - case 3: - return m44; - default: - assert(0); - return 0.0; - } -} - -inline void Matrix4x4::MakeTranspose() // Transposes it. -{ - double temp; - temp = m12; - m12 = m21; - m21 = temp; - temp = m13; - m13 = m31; - m31 = temp; - temp = m14; - m14 = m41; - m41 = temp; - temp = m23; - m23 = m32; - m32 = temp; - temp = m24; - m24 = m42; - m42 = temp; - temp = m34; - m34 = m43; - m43 = temp; -} - -inline VectorR4 operator*(const Matrix4x4& A, const VectorR4& u) -{ - VectorR4 ret; - ret.x = A.m11 * u.x + A.m12 * u.y + A.m13 * u.z + A.m14 * u.w; - ret.y = A.m21 * u.x + A.m22 * u.y + A.m23 * u.z + A.m24 * u.w; - ret.z = A.m31 * u.x + A.m32 * u.y + A.m33 * u.z + A.m34 * u.w; - ret.w = A.m41 * u.x + A.m42 * u.y + A.m43 * u.z + A.m44 * u.w; - return ret; -} - -// ****************************************************** -// * LinearMapR4 class - inlined functions * -// * * * * * * * * * * * * * * * * * * * * * * * * * * ** - -inline LinearMapR4::LinearMapR4() -{ - SetZero(); - return; -} - -inline LinearMapR4::LinearMapR4(const VectorR4& u, const VectorR4& v, - const VectorR4& s, const VectorR4& t) - : Matrix4x4(u, v, s, t) -{ -} - -inline LinearMapR4::LinearMapR4( - double a11, double a21, double a31, double a41, - double a12, double a22, double a32, double a42, - double a13, double a23, double a33, double a43, - double a14, double a24, double a34, double a44) - // Values specified in column order!!! - : Matrix4x4(a11, a21, a31, a41, a12, a22, a32, a42, - a13, a23, a33, a43, a14, a24, a34, a44) -{ -} - -inline LinearMapR4::LinearMapR4(const Matrix4x4& A) - : Matrix4x4(A) -{ -} - -inline LinearMapR4& LinearMapR4::operator+=(const LinearMapR4& B) -{ - m11 += B.m11; - m12 += B.m12; - m13 += B.m13; - m14 += B.m14; - m21 += B.m21; - m22 += B.m22; - m23 += B.m23; - m24 += B.m24; - m31 += B.m31; - m32 += B.m32; - m33 += B.m33; - m34 += B.m34; - m41 += B.m41; - m42 += B.m42; - m43 += B.m43; - m44 += B.m44; - return (*this); -} - -inline LinearMapR4& LinearMapR4::operator-=(const LinearMapR4& B) -{ - m11 -= B.m11; - m12 -= B.m12; - m13 -= B.m13; - m14 -= B.m14; - m21 -= B.m21; - m22 -= B.m22; - m23 -= B.m23; - m24 -= B.m24; - m31 -= B.m31; - m32 -= B.m32; - m33 -= B.m33; - m34 -= B.m34; - m41 -= B.m41; - m42 -= B.m42; - m43 -= B.m43; - m44 -= B.m44; - return (*this); -} - -inline LinearMapR4 operator+(const LinearMapR4& A, const LinearMapR4& B) -{ - return (LinearMapR4(A.m11 + B.m11, A.m21 + B.m21, A.m31 + B.m31, A.m41 + B.m41, - A.m12 + B.m12, A.m22 + B.m22, A.m32 + B.m32, A.m42 + B.m42, - A.m13 + B.m13, A.m23 + B.m23, A.m33 + B.m33, A.m43 + B.m43, - A.m14 + B.m14, A.m24 + B.m24, A.m34 + B.m34, A.m44 + B.m44)); -} - -inline LinearMapR4 operator-(const LinearMapR4& A) -{ - return (LinearMapR4(-A.m11, -A.m21, -A.m31, -A.m41, - -A.m12, -A.m22, -A.m32, -A.m42, - -A.m13, -A.m23, -A.m33, -A.m43, - -A.m14, -A.m24, -A.m34, -A.m44)); -} - -inline LinearMapR4 operator-(const LinearMapR4& A, const LinearMapR4& B) -{ - return (LinearMapR4(A.m11 - B.m11, A.m21 - B.m21, A.m31 - B.m31, A.m41 - B.m41, - A.m12 - B.m12, A.m22 - B.m22, A.m32 - B.m32, A.m42 - B.m42, - A.m13 - B.m13, A.m23 - B.m23, A.m33 - B.m33, A.m43 - B.m43, - A.m14 - B.m14, A.m24 - B.m24, A.m34 - B.m34, A.m44 - B.m44)); -} - -inline LinearMapR4& LinearMapR4::operator*=(double b) -{ - m11 *= b; - m12 *= b; - m13 *= b; - m14 *= b; - m21 *= b; - m22 *= b; - m23 *= b; - m24 *= b; - m31 *= b; - m32 *= b; - m33 *= b; - m34 *= b; - m41 *= b; - m42 *= b; - m43 *= b; - m44 *= b; - return (*this); -} - -inline LinearMapR4 operator*(const LinearMapR4& A, double b) -{ - return (LinearMapR4(A.m11 * b, A.m21 * b, A.m31 * b, A.m41 * b, - A.m12 * b, A.m22 * b, A.m32 * b, A.m42 * b, - A.m13 * b, A.m23 * b, A.m33 * b, A.m43 * b, - A.m14 * b, A.m24 * b, A.m34 * b, A.m44 * b)); -} - -inline LinearMapR4 operator*(double b, const LinearMapR4& A) -{ - return (LinearMapR4(A.m11 * b, A.m21 * b, A.m31 * b, A.m41 * b, - A.m12 * b, A.m22 * b, A.m32 * b, A.m42 * b, - A.m13 * b, A.m23 * b, A.m33 * b, A.m43 * b, - A.m14 * b, A.m24 * b, A.m34 * b, A.m44 * b)); -} - -inline LinearMapR4 operator/(const LinearMapR4& A, double b) -{ - double bInv = 1.0 / b; - return (A * bInv); -} - -inline LinearMapR4& LinearMapR4::operator/=(double b) -{ - double bInv = 1.0 / b; - return (*this *= bInv); -} - -inline VectorR4 operator*(const LinearMapR4& A, const VectorR4& u) -{ - return (VectorR4(A.m11 * u.x + A.m12 * u.y + A.m13 * u.z + A.m14 * u.w, - A.m21 * u.x + A.m22 * u.y + A.m23 * u.z + A.m24 * u.w, - A.m31 * u.x + A.m32 * u.y + A.m33 * u.z + A.m34 * u.w, - A.m41 * u.x + A.m42 * u.y + A.m43 * u.z + A.m44 * u.w)); -} - -inline LinearMapR4 LinearMapR4::Transpose() const // Returns the transpose -{ - return (LinearMapR4(m11, m12, m13, m14, - m21, m22, m23, m24, - m31, m32, m33, m34, - m41, m42, m43, m44)); -} - -inline LinearMapR4& LinearMapR4::operator*=(const Matrix4x4& B) // Matrix product -{ - (*this).Matrix4x4::operator*=(B); - - return (*this); -} - -inline LinearMapR4 operator*(const LinearMapR4& A, const Matrix4x4& B) -{ - LinearMapR4 AA(A); - AA.Matrix4x4::operator*=(B); - return AA; -} - -inline LinearMapR4 operator*(const Matrix4x4& A, const LinearMapR4& B) -{ - LinearMapR4 AA(A); - AA.Matrix4x4::operator*=(B); - return AA; -} - -// ****************************************************** -// * RotationMapR4 class - inlined functions * -// * * * * * * * * * * * * * * * * * * * * * * * * * * ** - -inline RotationMapR4::RotationMapR4() -{ - SetIdentity(); - return; -} - -inline RotationMapR4::RotationMapR4(const VectorR4& u, const VectorR4& v, - const VectorR4& s, const VectorR4& t) - : Matrix4x4(u, v, s, t) -{ -} - -inline RotationMapR4::RotationMapR4( - double a11, double a21, double a31, double a41, - double a12, double a22, double a32, double a42, - double a13, double a23, double a33, double a43, - double a14, double a24, double a34, double a44) - // Values specified in column order!!! - : Matrix4x4(a11, a21, a31, a41, a12, a22, a32, a42, - a13, a23, a33, a43, a14, a24, a34, a44) -{ -} - -inline RotationMapR4 RotationMapR4::Transpose() const // Returns the transpose -{ - return (RotationMapR4(m11, m12, m13, m14, - m21, m22, m23, m24, - m31, m32, m33, m34, - m41, m42, m43, m44)); -} - -inline VectorR4 RotationMapR4::Invert(const VectorR4& u) const // Returns solution -{ - return (VectorR4(m11 * u.x + m21 * u.y + m31 * u.z + m41 * u.w, - m12 * u.x + m22 * u.y + m32 * u.z + m42 * u.w, - m13 * u.x + m23 * u.y + m33 * u.z + m43 * u.w, - m14 * u.x + m24 * u.y + m34 * u.z + m44 * u.w)); -} - -inline RotationMapR4& RotationMapR4::operator*=(const RotationMapR4& B) // Matrix product -{ - (*this).Matrix4x4::operator*=(B); - - return (*this); -} - -inline RotationMapR4 operator*(const RotationMapR4& A, const RotationMapR4& B) -{ - RotationMapR4 AA(A); - AA.Matrix4x4::operator*=(B); - return AA; -} - -// *************************************************************** -// * 4-space vector and matrix utilities (inlined functions) * -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - -inline void TimesTranspose(const VectorR4& u, const VectorR4& v, LinearMapR4& M) -{ - M.Set(v.x * u.x, v.x * u.y, v.x * u.z, v.x * u.w, // Set by columns! - v.y * u.x, v.y * u.y, v.y * u.z, v.y * u.w, - v.z * u.x, v.z * u.y, v.z * u.z, v.z * u.w, - v.w * u.x, v.w * u.y, v.w * u.z, v.w * u.w); -} - -// Returns the solid angle between vectors u and v (not necessarily unit vectors) -inline double SolidAngle(const VectorR4& u, const VectorR4& v) -{ - double nSqU = u.NormSq(); - double nSqV = v.NormSq(); - if (nSqU == 0.0 && nSqV == 0.0) - { - return (0.0); - } - else - { - return (SolidAngleUnit(u / sqrt(nSqU), v / sqrt(nSqV))); - } -} - -inline double SolidAngleUnit(const VectorR4 u, const VectorR4 v) -{ - return (atan2(ProjectPerpUnit(v, u).Norm(), u ^ v)); -} - -#endif // LINEAR_R4_H diff --git a/engine/inc/bullet/ThirdPartyLibs/BussIK/MathMisc.h b/engine/inc/bullet/ThirdPartyLibs/BussIK/MathMisc.h deleted file mode 100644 index c5d15715..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/BussIK/MathMisc.h +++ /dev/null @@ -1,447 +0,0 @@ -/* -* -* Mathematics Subpackage (VrMath) -* -* -* Author: Samuel R. Buss, sbuss@ucsd.edu. -* Web page: http://math.ucsd.edu/~sbuss/MathCG -* -* -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 MATH_MISC_H -#define MATH_MISC_H - -#include - -// -// Commonly used constants -// - -const double PI = 3.1415926535897932384626433832795028841972; -const double PI2 = 2.0 * PI; -const double PI4 = 4.0 * PI; -const double PISq = PI * PI; -const double PIhalves = 0.5 * PI; -const double PIthirds = PI / 3.0; -const double PItwothirds = PI2 / 3.0; -const double PIfourths = 0.25 * PI; -const double PIsixths = PI / 6.0; -const double PIsixthsSq = PIsixths * PIsixths; -const double PItwelfths = PI / 12.0; -const double PItwelfthsSq = PItwelfths * PItwelfths; -const double PIinv = 1.0 / PI; -const double PI2inv = 0.5 / PI; -const double PIhalfinv = 2.0 / PI; - -const double RadiansToDegrees = 180.0 / PI; -const double DegreesToRadians = PI / 180; - -const double OneThird = 1.0 / 3.0; -const double TwoThirds = 2.0 / 3.0; -const double OneSixth = 1.0 / 6.0; -const double OneEighth = 1.0 / 8.0; -const double OneTwelfth = 1.0 / 12.0; - -const double Root2 = sqrt(2.0); -const double Root3 = sqrt(3.0); -const double Root2Inv = 1.0 / Root2; // sqrt(2)/2 -const double HalfRoot3 = sqrtf(3) / 2.0; - -const double LnTwo = log(2.0); -const double LnTwoInv = 1.0 / log(2.0); - -// Special purpose constants -const double OnePlusEpsilon15 = 1.0 + 1.0e-15; -const double OneMinusEpsilon15 = 1.0 - 1.0e-15; - -inline double ZeroValue(const double& x) -{ - return 0.0; -} - -// -// Comparisons -// - -template -inline T Min(T x, T y) -{ - return (x < y ? x : y); -} - -template -inline T Max(T x, T y) -{ - return (y < x ? x : y); -} - -template -inline T ClampRange(T x, T min, T max) -{ - if (x < min) - { - return min; - } - if (x > max) - { - return max; - } - return x; -} - -template -inline bool ClampRange(T* x, T min, T max) -{ - if ((*x) < min) - { - (*x) = min; - return false; - } - else if ((*x) > max) - { - (*x) = max; - return false; - } - else - { - return true; - } -} - -template -inline bool ClampMin(T* x, T min) -{ - if ((*x) < min) - { - (*x) = min; - return false; - } - return true; -} - -template -inline bool ClampMax(T* x, T max) -{ - if ((*x) > max) - { - (*x) = max; - return false; - } - return true; -} - -template -inline T& UpdateMin(const T& x, T& y) -{ - if (x < y) - { - y = x; - } - return y; -} - -template -inline T& UpdateMax(const T& x, T& y) -{ - if (x > y) - { - y = x; - } - return y; -} - -template -inline bool SameSignNonzero(T x, T y) -{ - if (x < 0) - { - return (y < 0); - } - else if (0 < x) - { - return (0 < y); - } - else - { - return false; - } -} - -inline double Mag(double x) -{ - return fabs(x); -} - -inline double Dist(double x, double y) -{ - return fabs(x - y); -} - -template -inline bool NearEqual(T a, T b, double tolerance) -{ - a -= b; - return (Mag(a) <= tolerance); -} - -inline bool EqualZeroFuzzy(double x) -{ - return (fabs(x) <= 1.0e-14); -} - -inline bool NearZero(double x, double tolerance) -{ - return (fabs(x) <= tolerance); -} - -inline bool LessOrEqualFuzzy(double x, double y) -{ - if (x <= y) - { - return true; - } - - if (y > 0.0) - { - if (x > 0.0) - { - return (x * OneMinusEpsilon15 < y * OnePlusEpsilon15); - } - else - { - return (y < 1.0e-15); // x==0 in this case - } - } - else if (y < 0.0) - { - if (x < 0.0) - { - return (x * OnePlusEpsilon15 < y * OneMinusEpsilon15); - } - else - { - return (y > -1.0e-15); // x==0 in this case - } - } - else - { - return (-1.0e-15 < x && x < 1.0e-15); - } -} - -inline bool GreaterOrEqualFuzzy(double x, double y) -{ - return LessOrEqualFuzzy(y, x); -} - -inline bool UpdateMaxAbs(double* maxabs, double updateval) -{ - if (updateval > *maxabs) - { - *maxabs = updateval; - return true; - } - else if (-updateval > *maxabs) - { - *maxabs = -updateval; - return true; - } - else - { - return false; - } -} - -// ********************************************************** -// Combinations and averages. * -// ********************************************************** - -template -void averageOf(const T& a, const T& b, T& c) -{ - c = a; - c += b; - c *= 0.5; -} - -template -void Lerp(const T& a, const T& b, double alpha, T& c) -{ - double beta = 1.0 - alpha; - if (beta > alpha) - { - c = b; - c *= alpha / beta; - c += a; - c *= beta; - } - else - { - c = a; - c *= beta / alpha; - c += b; - c *= alpha; - } -} - -template -T Lerp(const T& a, const T& b, double alpha) -{ - T ret; - Lerp(a, b, alpha, ret); - return ret; -} - -// ********************************************************** -// Trigonometry * -// ********************************************************** - -// TimesCot(x) returns x*cot(x) -inline double TimesCot(double x) -{ - if (-1.0e-5 < x && x < 1.0e-5) - { - return 1.0 + x * OneThird; - } - else - { - return (x * cos(x) / sin(x)); - } -} - -// SineOver(x) returns sin(x)/x. -inline double SineOver(double x) -{ - if (-1.0e-5 < x && x < 1.0e-5) - { - return 1.0 - x * x * OneSixth; - } - else - { - return sin(x) / x; - } -} -// OverSine(x) returns x/sin(x). -inline double OverSine(double x) -{ - if (-1.0e-5 < x && x < 1.0e-5) - { - return 1.0 + x * x * OneSixth; - } - else - { - return x / sin(x); - } -} - -inline double SafeAsin(double x) -{ - if (x <= -1.0) - { - return -PIhalves; - } - else if (x >= 1.0) - { - return PIhalves; - } - else - { - return asin(x); - } -} - -inline double SafeAcos(double x) -{ - if (x <= -1.0) - { - return PI; - } - else if (x >= 1.0) - { - return 0.0; - } - else - { - return acos(x); - } -} - -// ********************************************************************** -// Roots and powers * -// ********************************************************************** - -// Square(x) returns x*x, of course! - -template -inline T Square(T x) -{ - return (x * x); -} - -// Cube(x) returns x*x*x, of course! - -template -inline T Cube(T x) -{ - return (x * x * x); -} - -// SafeSqrt(x) = returns sqrt(max(x, 0.0)); - -inline double SafeSqrt(double x) -{ - if (x <= 0.0) - { - return 0.0; - } - else - { - return sqrt(x); - } -} - -// SignedSqrt(a, s) returns (sign(s)*sqrt(a)). -inline double SignedSqrt(double a, double sgn) -{ - if (sgn == 0.0) - { - return 0.0; - } - else - { - return (sgn > 0.0 ? sqrt(a) : -sqrt(a)); - } -} - -// Template version of Sign function - -template -inline int Sign(T x) -{ - if (x < 0) - { - return -1; - } - else if (x == 0) - { - return 0; - } - else - { - return 1; - } -} - -#endif // #ifndef MATH_MISC_H diff --git a/engine/inc/bullet/ThirdPartyLibs/BussIK/MatrixRmn.h b/engine/inc/bullet/ThirdPartyLibs/BussIK/MatrixRmn.h deleted file mode 100644 index 343e79b9..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/BussIK/MatrixRmn.h +++ /dev/null @@ -1,417 +0,0 @@ -/* -* -* Mathematics Subpackage (VrMath) -* -* -* Author: Samuel R. Buss, sbuss@ucsd.edu. -* Web page: http://math.ucsd.edu/~sbuss/MathCG -* -* -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. -* -* -*/ - -// -// MatrixRmn: Matrix over reals (Variable dimensional vector) -// -// Not very sophisticated yet. Needs more functionality -// To do: better handling of resizing. -// - -#ifndef MATRIX_RMN_H -#define MATRIX_RMN_H - -#include -#include -#include "LinearR3.h" -#include "VectorRn.h" - -class MatrixRmn -{ -public: - MatrixRmn(); // Null constructor - MatrixRmn(long numRows, long numCols); // Constructor with length - ~MatrixRmn(); // Destructor - - void SetSize(long numRows, long numCols); - long GetNumRows() const { return NumRows; } - long GetNumColumns() const { return NumCols; } - void SetZero(); - - // Return entry in row i and column j. - double Get(long i, long j) const; - void GetTriple(long i, long j, VectorR3* retValue) const; - - // Use GetPtr to get pointer into the array (efficient) - // Is friendly in that anyone can change the array contents (be careful!) - // The entries are in column order!!! - // Use this with care. You may call GetRowStride and GetColStride to navigate - // within the matrix. I do not expect these values to ever change. - const double* GetPtr() const; - double* GetPtr(); - const double* GetPtr(long i, long j) const; - double* GetPtr(long i, long j); - const double* GetColumnPtr(long j) const; - double* GetColumnPtr(long j); - const double* GetRowPtr(long i) const; - double* GetRowPtr(long i); - long GetRowStride() const { return NumRows; } // Step size (stride) along a row - long GetColStride() const { return 1; } // Step size (stide) along a column - - void Set(long i, long j, double val); - void SetTriple(long i, long c, const VectorR3& u); - - void SetIdentity(); - void SetDiagonalEntries(double d); - void SetDiagonalEntries(const VectorRn& d); - void SetSuperDiagonalEntries(double d); - void SetSuperDiagonalEntries(const VectorRn& d); - void SetSubDiagonalEntries(double d); - void SetSubDiagonalEntries(const VectorRn& d); - void SetColumn(long i, const VectorRn& d); - void SetRow(long i, const VectorRn& d); - void SetSequence(const VectorRn& d, long startRow, long startCol, long deltaRow, long deltaCol); - - // Loads matrix in as a sub-matrix. (i,j) is the base point. Defaults to (0,0). - // The "Tranpose" versions load the transpose of A. - void LoadAsSubmatrix(const MatrixRmn& A); - void LoadAsSubmatrix(long i, long j, const MatrixRmn& A); - void LoadAsSubmatrixTranspose(const MatrixRmn& A); - void LoadAsSubmatrixTranspose(long i, long j, const MatrixRmn& A); - - // Norms - double FrobeniusNormSq() const; - double FrobeniusNorm() const; - - // Operations on VectorRn's - void Multiply(const VectorRn& v, VectorRn& result) const; // result = (this)*(v) - void MultiplyTranspose(const VectorRn& v, VectorRn& result) const; // Equivalent to mult by row vector on left - double DotProductColumn(const VectorRn& v, long colNum) const; // Returns dot product of v with i-th column - - // Operations on MatrixRmn's - MatrixRmn& operator*=(double); - MatrixRmn& operator/=(double d) - { - assert(d != 0.0); - *this *= (1.0 / d); - return *this; - } - MatrixRmn& AddScaled(const MatrixRmn& B, double factor); - MatrixRmn& operator+=(const MatrixRmn& B); - MatrixRmn& operator-=(const MatrixRmn& B); - static MatrixRmn& Multiply(const MatrixRmn& A, const MatrixRmn& B, MatrixRmn& dst); // Sets dst = A*B. - static MatrixRmn& MultiplyTranspose(const MatrixRmn& A, const MatrixRmn& B, MatrixRmn& dst); // Sets dst = A*(B-tranpose). - static MatrixRmn& TransposeMultiply(const MatrixRmn& A, const MatrixRmn& B, MatrixRmn& dst); // Sets dst = (A-transpose)*B. - - // Miscellaneous operation - MatrixRmn& AddToDiagonal(double d); // Adds d to each diagonal - MatrixRmn& AddToDiagonal(const VectorRn& dVec); - - // Solving systems of linear equations - void Solve(const VectorRn& b, VectorRn* x, MatrixRmn& AugMat) const; // Solves the equation (*this)*x = b; Uses row operations. Assumes *this is invertible. - - // Row Echelon Form and Reduced Row Echelon Form routines - // Row echelon form here allows non-negative entries (instead of 1's) in the positions of lead variables. - void ConvertToRefNoFree(); // Converts the matrix in place to row echelon form -- assumption is no free variables will be found - void ConvertToRef(int numVars); // Converts the matrix in place to row echelon form -- numVars is number of columns to work with. - void ConvertToRef(int numVars, double eps); // Same, but eps is the measure of closeness to zero - - // Givens transformation - static void CalcGivensValues(double a, double b, double* c, double* s); - void PostApplyGivens(double c, double s, long idx); // Applies Givens transform to columns idx and idx+1. - void PostApplyGivens(double c, double s, long idx1, long idx2); // Applies Givens transform to columns idx1 and idx2. - - // Singular value decomposition - void ComputeSVD(MatrixRmn& U, VectorRn& w, MatrixRmn& V) const; - // Good for debugging SVD computations (I recommend this be used for any new application to check for bugs/instability). - bool DebugCheckSVD(const MatrixRmn& U, const VectorRn& w, const MatrixRmn& V) const; - // Compute inverse of a matrix, the result is written in R - void ComputeInverse(MatrixRmn& R) const; - // Debug matrix inverse computation - bool DebugCheckInverse(const MatrixRmn& MInv) const; - - // Some useful routines for experts who understand the inner workings of these classes. - inline static double DotArray(long length, const double* ptrA, long strideA, const double* ptrB, long strideB); - inline static void CopyArrayScale(long length, const double* from, long fromStride, double* to, long toStride, double scale); - inline static void AddArrayScale(long length, const double* from, long fromStride, double* to, long toStride, double scale); - -private: - long NumRows; // Number of rows - long NumCols; // Number of columns - double* x; // Array of vector entries - stored in column order - long AllocSize; // Allocated size of the x array - - - // Internal helper routines for SVD calculations - static void CalcBidiagonal(MatrixRmn& U, MatrixRmn& V, VectorRn& w, VectorRn& superDiag); - void ConvertBidiagToDiagonal(MatrixRmn& U, MatrixRmn& V, VectorRn& w, VectorRn& superDiag) const; - static void SvdHouseholder(double* basePt, - long colLength, long numCols, long colStride, long rowStride, - double* retFirstEntry); - void ExpandHouseholders(long numXforms, int numZerosSkipped, const double* basePt, long colStride, long rowStride); - static bool UpdateBidiagIndices(long* firstDiagIdx, long* lastBidiagIdx, VectorRn& w, VectorRn& superDiag, double eps); - static void ApplyGivensCBTD(double cosine, double sine, double* a, double* b, double* c, double* d); - static void ApplyGivensCBTD(double cosine, double sine, double* a, double* b, double* c, - double d, double* e, double* f); - static void ClearRowWithDiagonalZero(long firstBidiagIdx, long lastBidiagIdx, - MatrixRmn& U, double* wPtr, double* sdPtr, double eps); - static void ClearColumnWithDiagonalZero(long endIdx, MatrixRmn& V, double* wPtr, double* sdPtr, double eps); - bool DebugCalcBidiagCheck(const MatrixRmn& U, const VectorRn& w, const VectorRn& superDiag, const MatrixRmn& V) const; -}; - -inline MatrixRmn::MatrixRmn() -{ - NumRows = 0; - NumCols = 0; - x = 0; - AllocSize = 0; -} - -inline MatrixRmn::MatrixRmn(long numRows, long numCols) -{ - NumRows = 0; - NumCols = 0; - x = 0; - AllocSize = 0; - SetSize(numRows, numCols); -} - -inline MatrixRmn::~MatrixRmn() -{ - delete[] x; -} - -// Resize. -// If the array space is decreased, the information about the allocated length is lost. -inline void MatrixRmn::SetSize(long numRows, long numCols) -{ - assert(numRows > 0 && numCols > 0); - long newLength = numRows * numCols; - if (newLength > AllocSize) - { - delete[] x; - AllocSize = Max(newLength, AllocSize << 1); - x = new double[AllocSize]; - } - NumRows = numRows; - NumCols = numCols; -} - -// Zero out the entire vector -inline void MatrixRmn::SetZero() -{ - double* target = x; - for (long i = NumRows * NumCols; i > 0; i--) - { - *(target++) = 0.0; - } -} - -// Return entry in row i and column j. -inline double MatrixRmn::Get(long i, long j) const -{ - assert(i < NumRows && j < NumCols); - return *(x + j * NumRows + i); -} - -// Return a VectorR3 out of a column. Starts at row 3*i, in column j. -inline void MatrixRmn::GetTriple(long i, long j, VectorR3* retValue) const -{ - long ii = 3 * i; - assert(0 <= i && ii + 2 < NumRows && 0 <= j && j < NumCols); - retValue->Load(x + j * NumRows + ii); -} - -// Get a pointer to the (0,0) entry. -// The entries are in column order. -// This version gives read-only pointer -inline const double* MatrixRmn::GetPtr() const -{ - return x; -} - -// Get a pointer to the (0,0) entry. -// The entries are in column order. -inline double* MatrixRmn::GetPtr() -{ - return x; -} - -// Get a pointer to the (i,j) entry. -// The entries are in column order. -// This version gives read-only pointer -inline const double* MatrixRmn::GetPtr(long i, long j) const -{ - assert(0 <= i && i < NumRows && 0 <= j && j < NumCols); - return (x + j * NumRows + i); -} - -// Get a pointer to the (i,j) entry. -// The entries are in column order. -// This version gives pointer to writable data -inline double* MatrixRmn::GetPtr(long i, long j) -{ - assert(i < NumRows && j < NumCols); - return (x + j * NumRows + i); -} - -// Get a pointer to the j-th column. -// The entries are in column order. -// This version gives read-only pointer -inline const double* MatrixRmn::GetColumnPtr(long j) const -{ - assert(0 <= j && j < NumCols); - return (x + j * NumRows); -} - -// Get a pointer to the j-th column. -// This version gives pointer to writable data -inline double* MatrixRmn::GetColumnPtr(long j) -{ - assert(0 <= j && j < NumCols); - return (x + j * NumRows); -} - -/// Get a pointer to the i-th row -// The entries are in column order. -// This version gives read-only pointer -inline const double* MatrixRmn::GetRowPtr(long i) const -{ - assert(0 <= i && i < NumRows); - return (x + i); -} - -// Get a pointer to the i-th row -// This version gives pointer to writable data -inline double* MatrixRmn::GetRowPtr(long i) -{ - assert(0 <= i && i < NumRows); - return (x + i); -} - -// Set the (i,j) entry of the matrix -inline void MatrixRmn::Set(long i, long j, double val) -{ - assert(i < NumRows && j < NumCols); - *(x + j * NumRows + i) = val; -} - -// Set the i-th triple in the j-th column to u's three values -inline void MatrixRmn::SetTriple(long i, long j, const VectorR3& u) -{ - long ii = 3 * i; - assert(0 <= i && ii + 2 < NumRows && 0 <= j && j < NumCols); - u.Dump(x + j * NumRows + ii); -} - -// Set to be equal to the identity matrix -inline void MatrixRmn::SetIdentity() -{ - assert(NumRows == NumCols); - SetZero(); - SetDiagonalEntries(1.0); -} - -inline MatrixRmn& MatrixRmn::operator*=(double mult) -{ - double* aPtr = x; - for (long i = NumRows * NumCols; i > 0; i--) - { - (*(aPtr++)) *= mult; - } - return (*this); -} - -inline MatrixRmn& MatrixRmn::AddScaled(const MatrixRmn& B, double factor) -{ - assert(NumRows == B.NumRows && NumCols == B.NumCols); - double* aPtr = x; - double* bPtr = B.x; - for (long i = NumRows * NumCols; i > 0; i--) - { - (*(aPtr++)) += (*(bPtr++)) * factor; - } - return (*this); -} - -inline MatrixRmn& MatrixRmn::operator+=(const MatrixRmn& B) -{ - assert(NumRows == B.NumRows && NumCols == B.NumCols); - double* aPtr = x; - double* bPtr = B.x; - for (long i = NumRows * NumCols; i > 0; i--) - { - (*(aPtr++)) += *(bPtr++); - } - return (*this); -} - -inline MatrixRmn& MatrixRmn::operator-=(const MatrixRmn& B) -{ - assert(NumRows == B.NumRows && NumCols == B.NumCols); - double* aPtr = x; - double* bPtr = B.x; - for (long i = NumRows * NumCols; i > 0; i--) - { - (*(aPtr++)) -= *(bPtr++); - } - return (*this); -} - -inline double MatrixRmn::FrobeniusNormSq() const -{ - double* aPtr = x; - double result = 0.0; - for (long i = NumRows * NumCols; i > 0; i--) - { - result += Square(*(aPtr++)); - } - return result; -} - -// Helper routine to calculate dot product -inline double MatrixRmn::DotArray(long length, const double* ptrA, long strideA, const double* ptrB, long strideB) -{ - double result = 0.0; - for (; length > 0; length--) - { - result += (*ptrA) * (*ptrB); - ptrA += strideA; - ptrB += strideB; - } - return result; -} - -// Helper routine: copies and scales an array (src and dest may be equal, or overlap) -inline void MatrixRmn::CopyArrayScale(long length, const double* from, long fromStride, double* to, long toStride, double scale) -{ - for (; length > 0; length--) - { - *to = (*from) * scale; - from += fromStride; - to += toStride; - } -} - -// Helper routine: adds a scaled array -// fromArray = toArray*scale. -inline void MatrixRmn::AddArrayScale(long length, const double* from, long fromStride, double* to, long toStride, double scale) -{ - for (; length > 0; length--) - { - *to += (*from) * scale; - from += fromStride; - to += toStride; - } -} - -#endif //MATRIX_RMN_H diff --git a/engine/inc/bullet/ThirdPartyLibs/BussIK/Node.h b/engine/inc/bullet/ThirdPartyLibs/BussIK/Node.h deleted file mode 100644 index ad1d61ad..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/BussIK/Node.h +++ /dev/null @@ -1,109 +0,0 @@ -/* -* -* Mathematics Subpackage (VrMath) -* -* -* Author: Samuel R. Buss, sbuss@ucsd.edu. -* Web page: http://math.ucsd.edu/~sbuss/MathCG -* -* -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 _CLASS_NODE -#define _CLASS_NODE - -#include "LinearR3.h" - -enum Purpose -{ - JOINT, - EFFECTOR -}; - -class VectorR3; - -class Node -{ - friend class Tree; - -public: - Node(const VectorR3&, const VectorR3&, double, Purpose, double minTheta = -PI, double maxTheta = PI, double restAngle = 0.); - - void PrintNode(); - void InitNode(); - - const VectorR3& GetAttach() const { return attach; } - - double GetTheta() const { return theta; } - double AddToTheta(double& delta) - { - //double orgTheta = theta; - theta += delta; -#if 0 - if (theta < minTheta) - theta = minTheta; - if (theta > maxTheta) - theta = maxTheta; - double actualDelta = theta - orgTheta; - delta = actualDelta; -#endif - return theta; - } - - double UpdateTheta(double& delta) - { - theta = delta; - return theta; - } - - const VectorR3& GetS() const { return s; } - const VectorR3& GetW() const { return w; } - - double GetMinTheta() const { return minTheta; } - double GetMaxTheta() const { return maxTheta; } - double GetRestAngle() const { return restAngle; }; - void SetTheta(double newTheta) { theta = newTheta; } - void ComputeS(void); - void ComputeW(void); - - bool IsEffector() const { return purpose == EFFECTOR; } - bool IsJoint() const { return purpose == JOINT; } - int GetEffectorNum() const { return seqNumEffector; } - int GetJointNum() const { return seqNumJoint; } - - bool IsFrozen() const { return freezed; } - void Freeze() { freezed = true; } - void UnFreeze() { freezed = false; } - - //private: - bool freezed; // Is this node frozen? - int seqNumJoint; // sequence number if this node is a joint - int seqNumEffector; // sequence number if this node is an effector - double size; // size - Purpose purpose; // joint / effector / both - VectorR3 attach; // attachment point - VectorR3 r; // relative position vector - VectorR3 v; // rotation axis - double theta; // joint angle (radian) - double minTheta; // lower limit of joint angle - double maxTheta; // upper limit of joint angle - double restAngle; // rest position angle - VectorR3 s; // GLobal Position - VectorR3 w; // Global rotation axis - Node* left; // left child - Node* right; // right sibling - Node* realparent; // pointer to real parent -}; - -#endif \ No newline at end of file diff --git a/engine/inc/bullet/ThirdPartyLibs/BussIK/Spherical.h b/engine/inc/bullet/ThirdPartyLibs/BussIK/Spherical.h deleted file mode 100644 index 31f87a94..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/BussIK/Spherical.h +++ /dev/null @@ -1,293 +0,0 @@ -/* -* -* Mathematics Subpackage (VrMath) -* -* -* Author: Samuel R. Buss, sbuss@ucsd.edu. -* Web page: http://math.ucsd.edu/~sbuss/MathCG -* -* -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. -* -* -*/ - -// -// Spherical Operations Classes -// -// -// B. SphericalInterpolator -// -// OrientationR3 -// -// A. Quaternion -// -// B. RotationMapR3 // Elsewhere -// -// C. EulerAnglesR3 // TO DO -// -// -// Functions for spherical operations -// A. Many routines for rotation and averaging on a sphere -// - -#ifndef SPHERICAL_H -#define SPHERICAL_H - -#include "LinearR3.h" -#include "LinearR4.h" -#include "MathMisc.h" - -class SphericalInterpolator; // Spherical linear interpolation of vectors -class SphericalBSpInterpolator; // Spherical Bspline interpolation of vector -class Quaternion; // Quaternion (x,y,z,w) values. -class EulerAnglesR3; // Euler Angles - -// ***************************************************** -// SphericalInterpolator class * -// - Does linear interpolation (slerp-ing) * -// * * * * * * * * * * * * * * * * * * * * * * * * * * * - -class SphericalInterpolator -{ -private: - VectorR3 startDir, endDir; // Unit vectors (starting and ending) - double startLen, endLen; // Magnitudes of the vectors - double rotRate; // Angle between start and end vectors - -public: - SphericalInterpolator(const VectorR3& u, const VectorR3& v); - - VectorR3 InterValue(double frac) const; -}; - -// *************************************************************** -// * Quaternion class - prototypes * -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - -class Quaternion -{ -public: - double x, y, z, w; - -public: - Quaternion() : x(0.0), y(0.0), z(0.0), w(1.0){}; - Quaternion(double, double, double, double); - - inline Quaternion& Set(double xx, double yy, double zz, double ww); - inline Quaternion& Set(const VectorR4&); - Quaternion& Set(const EulerAnglesR3&); - Quaternion& Set(const RotationMapR3&); - Quaternion& SetRotate(const VectorR3&); - - Quaternion& SetIdentity(); // Set to the identity map - Quaternion Inverse() const; // Return the Inverse - Quaternion& Invert(); // Invert this quaternion - - double Angle(); // Angle of rotation - double Norm(); // Norm of x,y,z component - - Quaternion& operator*=(const Quaternion&); -}; - -Quaternion operator*(const Quaternion&, const Quaternion&); - -inline Quaternion ToQuat(const VectorR4& v) -{ - return Quaternion(v.x, v.y, v.z, v.w); -} - -inline double Quaternion::Norm() -{ - return sqrt(x * x + y * y + z * z); -} - -inline double Quaternion::Angle() -{ - double halfAngle = asin(Norm()); - return halfAngle + halfAngle; -} - -// **************************************************************** -// Solid Geometry Routines * -// **************************************************************** - -// Compute the angle formed by two geodesics on the unit sphere. -// Three unit vectors u,v,w specify the geodesics u-v and v-w which -// meet at vertex uv. The angle from v-w to v-u is returned. This -// is always in the range [0, 2PI). -double SphereAngle(const VectorR3& u, const VectorR3& v, const VectorR3& w); - -// Compute the area of a triangle on the unit sphere. Three unit vectors -// specify the corners of the triangle in COUNTERCLOCKWISE order. -inline double SphericalTriangleArea( - const VectorR3& u, const VectorR3& v, const VectorR3& w) -{ - double AngleA = SphereAngle(u, v, w); - double AngleB = SphereAngle(v, w, u); - double AngleC = SphereAngle(w, u, v); - return (AngleA + AngleB + AngleC - PI); -} - -// **************************************************************** -// Spherical Mean routines * -// **************************************************************** - -// Weighted sum of vectors -VectorR3 WeightedSum(long Num, const VectorR3 vv[], const double weights[]); -VectorR4 WeightedSum(long Num, const VectorR4 vv[], const double weights[]); - -// Weighted average of vectors on the sphere. -// Sum of weights should equal one (but no checking is done) -VectorR3 ComputeMeanSphere(long Num, const VectorR3 vv[], const double weights[], - double tolerance = 1.0e-15, double bkuptolerance = 1.0e-13); -VectorR3 ComputeMeanSphere(long Num, const VectorR3 vv[], const double weights[], - const VectorR3& InitialVec, - double tolerance = 1.0e-15, double bkuptolerance = 1.0e-13); -VectorR4 ComputeMeanSphere(long Num, const VectorR4 vv[], const double weights[], - double tolerance = 1.0e-15, double bkuptolerance = 1.0e-13); -Quaternion ComputeMeanQuat(long Num, const Quaternion qq[], const double weights[], - double tolerance = 1.0e-15, double bkuptolerance = 1.0e-13); - -// Next functions mostly for internal use. -// It takes an initial estimate InitialVec (and a flag for -// indicating quaternions). -VectorR4 ComputeMeanSphere(long Num, const VectorR4 vv[], const double weights[], - const VectorR4& InitialVec, int QuatFlag = 0, - double tolerance = 1.0e-15, double bkuptolerance = 1.0e-13); -const int SPHERICAL_NOTQUAT = 0; -const int SPHERICAL_QUAT = 1; - -// Slow version, mostly for testing -VectorR3 ComputeMeanSphereSlow(long Num, const VectorR3 vv[], const double weights[], - double tolerance = 1.0e-16, double bkuptolerance = 5.0e-16); -VectorR4 ComputeMeanSphereSlow(long Num, const VectorR4 vv[], const double weights[], - double tolerance = 1.0e-16, double bkuptolerance = 5.0e-16); -VectorR3 ComputeMeanSphereOld(long Num, const VectorR3 vv[], const double weights[], - double tolerance = 1.0e-15, double bkuptolerance = 1.0e-13); -VectorR4 ComputeMeanSphereOld(long Num, const VectorR4 vv[], const double weights[], - const VectorR4& InitialVec, int QuatFlag, - double tolerance = 1.0e-15, double bkuptolerance = 1.0e-13); - -// Solves a system of spherical-mean equalities, where the system is -// given as a tridiagonal matrix. -void SolveTriDiagSphere(int numPoints, - const double* tridiagvalues, const VectorR3* c, - VectorR3* p, - double accuracy = 1.0e-15, double bkupaccuracy = 1.0e-13); -void SolveTriDiagSphere(int numPoints, - const double* tridiagvalues, const VectorR4* c, - VectorR4* p, - double accuracy = 1.0e-15, double bkupaccuracy = 1.0e-13); - -// The "Slow" version uses a simpler but slower iteration with a linear rate of -// convergence. The base version uses a Newton iteration with a quadratic -// rate of convergence. -void SolveTriDiagSphereSlow(int numPoints, - const double* tridiagvalues, const VectorR3* c, - VectorR3* p, - double accuracy = 1.0e-15, double bkupaccuracy = 5.0e-15); -void SolveTriDiagSphereSlow(int numPoints, - const double* tridiagvalues, const VectorR4* c, - VectorR4* p, - double accuracy = 1.0e-15, double bkupaccuracy = 5.0e-15); - -// The "Unstable" version probably shouldn't be used except for very short sequences -// of knots. Mostly it's used for testing purposes now. -void SolveTriDiagSphereUnstable(int numPoints, - const double* tridiagvalues, const VectorR3* c, - VectorR3* p, - double accuracy = 1.0e-15, double bkupaccuracy = 1.0e-13); -void SolveTriDiagSphereHelperUnstable(int numPoints, - const double* tridiagvalues, const VectorR3* c, - const VectorR3& p0value, - VectorR3* p, - double accuracy = 1.0e-15, double bkupaccuracy = 1.0e-13); - -// *************************************************************** -// * Quaternion class - inlined member functions * -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - -inline VectorR4::VectorR4(const Quaternion& q) - : x(q.x), y(q.y), z(q.z), w(q.w) -{ -} - -inline VectorR4& VectorR4::Set(const Quaternion& q) -{ - x = q.x; - y = q.y; - z = q.z; - w = q.w; - return *this; -} - -inline Quaternion::Quaternion(double xx, double yy, double zz, double ww) - : x(xx), y(yy), z(zz), w(ww) -{ -} - -inline Quaternion& Quaternion::Set(double xx, double yy, double zz, double ww) -{ - x = xx; - y = yy; - z = zz; - w = ww; - return *this; -} - -inline Quaternion& Quaternion::Set(const VectorR4& u) -{ - x = u.x; - y = u.y; - z = u.z; - w = u.w; - return *this; -} - -inline Quaternion& Quaternion::SetIdentity() -{ - x = y = z = 0.0; - w = 1.0; - return *this; -} - -inline Quaternion operator*(const Quaternion& q1, const Quaternion& q2) -{ - Quaternion q(q1); - q *= q2; - return q; -} - -inline Quaternion& Quaternion::operator*=(const Quaternion& q) -{ - double wnew = w * q.w - (x * q.x + y * q.y + z * q.z); - double xnew = w * q.x + q.w * x + (y * q.z - z * q.y); - double ynew = w * q.y + q.w * y + (z * q.x - x * q.z); - z = w * q.z + q.w * z + (x * q.y - y * q.x); - w = wnew; - x = xnew; - y = ynew; - return *this; -} - -inline Quaternion Quaternion::Inverse() const // Return the Inverse -{ - return (Quaternion(x, y, z, -w)); -} - -inline Quaternion& Quaternion::Invert() // Invert this quaternion -{ - w = -w; - return *this; -} - -#endif // SPHERICAL_H diff --git a/engine/inc/bullet/ThirdPartyLibs/BussIK/Tree.h b/engine/inc/bullet/ThirdPartyLibs/BussIK/Tree.h deleted file mode 100644 index 737f5706..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/BussIK/Tree.h +++ /dev/null @@ -1,96 +0,0 @@ -/* -* -* Inverse Kinematics software, with several solvers including -* Selectively Damped Least Squares Method -* Damped Least Squares Method -* Pure Pseudoinverse Method -* Jacobian Transpose Method -* -* -* Author: Samuel R. Buss, sbuss@ucsd.edu. -* Web page: http://www.math.ucsd.edu/~sbuss/ResearchWeb/ikmethods/index.html -* -* -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 "LinearR3.h" -#include "Node.h" - -#ifndef _CLASS_TREE -#define _CLASS_TREE - -class Tree -{ -public: - Tree(); - - int GetNumNode() const { return nNode; } - int GetNumEffector() const { return nEffector; } - int GetNumJoint() const { return nJoint; } - void InsertRoot(Node*); - void InsertLeftChild(Node* parent, Node* child); - void InsertRightSibling(Node* parent, Node* child); - - // Accessors based on node numbers - Node* GetJoint(int); - Node* GetEffector(int); - const VectorR3& GetEffectorPosition(int); - - // Accessors for tree traversal - Node* GetRoot() const { return root; } - Node* GetSuccessor(const Node*) const; - Node* GetParent(const Node* node) const { return node->realparent; } - - void Compute(); - - void Print(); - void Init(); - void UnFreeze(); - -private: - Node* root; - int nNode; // nNode = nEffector + nJoint - int nEffector; - int nJoint; - void SetSeqNum(Node*); - Node* SearchJoint(Node*, int); - Node* SearchEffector(Node*, int); - void ComputeTree(Node*); - - void PrintTree(Node*); - void InitTree(Node*); - void UnFreezeTree(Node*); -}; - -inline Node* Tree::GetSuccessor(const Node* node) const -{ - if (node->left) - { - return node->left; - } - while (true) - { - if (node->right) - { - return (node->right); - } - node = node->realparent; - if (!node) - { - return 0; // Back to root, finished traversal - } - } -} - -#endif \ No newline at end of file diff --git a/engine/inc/bullet/ThirdPartyLibs/BussIK/VectorRn.h b/engine/inc/bullet/ThirdPartyLibs/BussIK/VectorRn.h deleted file mode 100644 index a7a5ba04..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/BussIK/VectorRn.h +++ /dev/null @@ -1,275 +0,0 @@ -/* -* -* Mathematics Subpackage (VrMath) -* -* -* Author: Samuel R. Buss, sbuss@ucsd.edu. -* Web page: http://math.ucsd.edu/~sbuss/MathCG -* -* -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. -* -* -*/ - -// -// VectorRn: Vector over Rn (Variable length vector) -// -// Not very sophisticated yet. Needs more functionality -// To do: better handling of resizing. -// - -#ifndef VECTOR_RN_H -#define VECTOR_RN_H - -#include -#include -#include "LinearR3.h" - -class VectorRn -{ - friend class MatrixRmn; - -public: - VectorRn(); // Null constructor - VectorRn(long length); // Constructor with length - ~VectorRn(); // Destructor - - void SetLength(long newLength); - long GetLength() const { return length; } - - void SetZero(); - void Fill(double d); - void Load(const double* d); - void LoadScaled(const double* d, double scaleFactor); - void Set(const VectorRn& src); - - // Two access methods identical in functionality - // Subscripts are ZERO-BASED!! - const double& operator[](long i) const - { - assert(0 <= i && i < length); - return *(x + i); - } - double& operator[](long i) - { - assert(0 <= i && i < length); - return *(x + i); - } - double Get(long i) const - { - assert(0 <= i && i < length); - return *(x + i); - } - - // Use GetPtr to get pointer into the array (efficient) - // Is friendly in that anyone can change the array contents (be careful!) - const double* GetPtr(long i) const - { - assert(0 <= i && i < length); - return (x + i); - } - double* GetPtr(long i) - { - assert(0 <= i && i < length); - return (x + i); - } - const double* GetPtr() const { return x; } - double* GetPtr() { return x; } - - void Set(long i, double val) { assert(0 <= i && i < length), *(x + i) = val; } - void SetTriple(long i, const VectorR3& u); - - VectorRn& operator+=(const VectorRn& src); - VectorRn& operator-=(const VectorRn& src); - void AddScaled(const VectorRn& src, double scaleFactor); - - VectorRn& operator*=(double f); - double NormSq() const; - double Norm() const { return sqrt(NormSq()); } - - double MaxAbs() const; - -private: - long length; // Logical or actual length - long AllocLength; // Allocated length - double* x; // Array of vector entries - - static VectorRn WorkVector; // Serves as a temporary vector - static VectorRn& GetWorkVector() { return WorkVector; } - static VectorRn& GetWorkVector(long len) - { - WorkVector.SetLength(len); - return WorkVector; - } -}; - -inline VectorRn::VectorRn() -{ - length = 0; - AllocLength = 0; - x = 0; -} - -inline VectorRn::VectorRn(long initLength) -{ - length = 0; - AllocLength = 0; - x = 0; - SetLength(initLength); -} - -inline VectorRn::~VectorRn() -{ - delete[] x; -} - -// Resize. -// If the array is shortened, the information about the allocated length is lost. -inline void VectorRn::SetLength(long newLength) -{ - assert(newLength > 0); - if (newLength > AllocLength) - { - delete[] x; - AllocLength = Max(newLength, AllocLength << 1); - x = new double[AllocLength]; - } - length = newLength; -} - -// Zero out the entire vector -inline void VectorRn::SetZero() -{ - double* target = x; - for (long i = length; i > 0; i--) - { - *(target++) = 0.0; - } -} - -// Set the value of the i-th triple of entries in the vector -inline void VectorRn::SetTriple(long i, const VectorR3& u) -{ - long j = 3 * i; - assert(0 <= j && j + 2 < length); - u.Dump(x + j); -} - -inline void VectorRn::Fill(double d) -{ - double* to = x; - for (long i = length; i > 0; i--) - { - *(to++) = d; - } -} - -inline void VectorRn::Load(const double* d) -{ - double* to = x; - for (long i = length; i > 0; i--) - { - *(to++) = *(d++); - } -} - -inline void VectorRn::LoadScaled(const double* d, double scaleFactor) -{ - double* to = x; - for (long i = length; i > 0; i--) - { - *(to++) = (*(d++)) * scaleFactor; - } -} - -inline void VectorRn::Set(const VectorRn& src) -{ - assert(src.length == this->length); - double* to = x; - double* from = src.x; - for (long i = length; i > 0; i--) - { - *(to++) = *(from++); - } -} - -inline VectorRn& VectorRn::operator+=(const VectorRn& src) -{ - assert(src.length == this->length); - double* to = x; - double* from = src.x; - for (long i = length; i > 0; i--) - { - *(to++) += *(from++); - } - return *this; -} - -inline VectorRn& VectorRn::operator-=(const VectorRn& src) -{ - assert(src.length == this->length); - double* to = x; - double* from = src.x; - for (long i = length; i > 0; i--) - { - *(to++) -= *(from++); - } - return *this; -} - -inline void VectorRn::AddScaled(const VectorRn& src, double scaleFactor) -{ - assert(src.length == this->length); - double* to = x; - double* from = src.x; - for (long i = length; i > 0; i--) - { - *(to++) += (*(from++)) * scaleFactor; - } -} - -inline VectorRn& VectorRn::operator*=(double f) -{ - double* target = x; - for (long i = length; i > 0; i--) - { - *(target++) *= f; - } - return *this; -} - -inline double VectorRn::NormSq() const -{ - double* target = x; - double res = 0.0; - for (long i = length; i > 0; i--) - { - res += (*target) * (*target); - target++; - } - return res; -} - -inline double Dot(const VectorRn& u, const VectorRn& v) -{ - assert(u.GetLength() == v.GetLength()); - double res = 0.0; - const double* p = u.GetPtr(); - const double* q = v.GetPtr(); - for (long i = u.GetLength(); i > 0; i--) - { - res += (*(p++)) * (*(q++)); - } - return res; -} - -#endif //VECTOR_RN_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Cholesky/LDLT.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Cholesky/LDLT.h deleted file mode 100644 index 968427b3..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Cholesky/LDLT.h +++ /dev/null @@ -1,668 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2011 Gael Guennebaud -// Copyright (C) 2009 Keir Mierle -// Copyright (C) 2009 Benoit Jacob -// Copyright (C) 2011 Timothy E. Holy -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_LDLT_H -#define EIGEN_LDLT_H - -namespace Eigen { - -namespace internal { - template struct LDLT_Traits; - - // PositiveSemiDef means positive semi-definite and non-zero; same for NegativeSemiDef - enum SignMatrix { PositiveSemiDef, NegativeSemiDef, ZeroSign, Indefinite }; -} - -/** \ingroup Cholesky_Module - * - * \class LDLT - * - * \brief Robust Cholesky decomposition of a matrix with pivoting - * - * \tparam _MatrixType the type of the matrix of which to compute the LDL^T Cholesky decomposition - * \tparam _UpLo the triangular part that will be used for the decompositon: Lower (default) or Upper. - * The other triangular part won't be read. - * - * Perform a robust Cholesky decomposition of a positive semidefinite or negative semidefinite - * matrix \f$ A \f$ such that \f$ A = P^TLDL^*P \f$, where P is a permutation matrix, L - * is lower triangular with a unit diagonal and D is a diagonal matrix. - * - * The decomposition uses pivoting to ensure stability, so that L will have - * zeros in the bottom right rank(A) - n submatrix. Avoiding the square root - * on D also stabilizes the computation. - * - * Remember that Cholesky decompositions are not rank-revealing. Also, do not use a Cholesky - * decomposition to determine whether a system of equations has a solution. - * - * This class supports the \link InplaceDecomposition inplace decomposition \endlink mechanism. - * - * \sa MatrixBase::ldlt(), SelfAdjointView::ldlt(), class LLT - */ -template class LDLT -{ - public: - typedef _MatrixType MatrixType; - enum { - RowsAtCompileTime = MatrixType::RowsAtCompileTime, - ColsAtCompileTime = MatrixType::ColsAtCompileTime, - MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime, - MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime, - UpLo = _UpLo - }; - typedef typename MatrixType::Scalar Scalar; - typedef typename NumTraits::Real RealScalar; - typedef Eigen::Index Index; ///< \deprecated since Eigen 3.3 - typedef typename MatrixType::StorageIndex StorageIndex; - typedef Matrix TmpMatrixType; - - typedef Transpositions TranspositionType; - typedef PermutationMatrix PermutationType; - - typedef internal::LDLT_Traits Traits; - - /** \brief Default Constructor. - * - * The default constructor is useful in cases in which the user intends to - * perform decompositions via LDLT::compute(const MatrixType&). - */ - LDLT() - : m_matrix(), - m_transpositions(), - m_sign(internal::ZeroSign), - m_isInitialized(false) - {} - - /** \brief Default Constructor with memory preallocation - * - * Like the default constructor but with preallocation of the internal data - * according to the specified problem \a size. - * \sa LDLT() - */ - explicit LDLT(Index size) - : m_matrix(size, size), - m_transpositions(size), - m_temporary(size), - m_sign(internal::ZeroSign), - m_isInitialized(false) - {} - - /** \brief Constructor with decomposition - * - * This calculates the decomposition for the input \a matrix. - * - * \sa LDLT(Index size) - */ - template - explicit LDLT(const EigenBase& matrix) - : m_matrix(matrix.rows(), matrix.cols()), - m_transpositions(matrix.rows()), - m_temporary(matrix.rows()), - m_sign(internal::ZeroSign), - m_isInitialized(false) - { - compute(matrix.derived()); - } - - /** \brief Constructs a LDLT factorization from a given matrix - * - * This overloaded constructor is provided for \link InplaceDecomposition inplace decomposition \endlink when \c MatrixType is a Eigen::Ref. - * - * \sa LDLT(const EigenBase&) - */ - template - explicit LDLT(EigenBase& matrix) - : m_matrix(matrix.derived()), - m_transpositions(matrix.rows()), - m_temporary(matrix.rows()), - m_sign(internal::ZeroSign), - m_isInitialized(false) - { - compute(matrix.derived()); - } - - /** Clear any existing decomposition - * \sa rankUpdate(w,sigma) - */ - void setZero() - { - m_isInitialized = false; - } - - /** \returns a view of the upper triangular matrix U */ - inline typename Traits::MatrixU matrixU() const - { - eigen_assert(m_isInitialized && "LDLT is not initialized."); - return Traits::getU(m_matrix); - } - - /** \returns a view of the lower triangular matrix L */ - inline typename Traits::MatrixL matrixL() const - { - eigen_assert(m_isInitialized && "LDLT is not initialized."); - return Traits::getL(m_matrix); - } - - /** \returns the permutation matrix P as a transposition sequence. - */ - inline const TranspositionType& transpositionsP() const - { - eigen_assert(m_isInitialized && "LDLT is not initialized."); - return m_transpositions; - } - - /** \returns the coefficients of the diagonal matrix D */ - inline Diagonal vectorD() const - { - eigen_assert(m_isInitialized && "LDLT is not initialized."); - return m_matrix.diagonal(); - } - - /** \returns true if the matrix is positive (semidefinite) */ - inline bool isPositive() const - { - eigen_assert(m_isInitialized && "LDLT is not initialized."); - return m_sign == internal::PositiveSemiDef || m_sign == internal::ZeroSign; - } - - /** \returns true if the matrix is negative (semidefinite) */ - inline bool isNegative(void) const - { - eigen_assert(m_isInitialized && "LDLT is not initialized."); - return m_sign == internal::NegativeSemiDef || m_sign == internal::ZeroSign; - } - - /** \returns a solution x of \f$ A x = b \f$ using the current decomposition of A. - * - * This function also supports in-place solves using the syntax x = decompositionObject.solve(x) . - * - * \note_about_checking_solutions - * - * More precisely, this method solves \f$ A x = b \f$ using the decomposition \f$ A = P^T L D L^* P \f$ - * by solving the systems \f$ P^T y_1 = b \f$, \f$ L y_2 = y_1 \f$, \f$ D y_3 = y_2 \f$, - * \f$ L^* y_4 = y_3 \f$ and \f$ P x = y_4 \f$ in succession. If the matrix \f$ A \f$ is singular, then - * \f$ D \f$ will also be singular (all the other matrices are invertible). In that case, the - * least-square solution of \f$ D y_3 = y_2 \f$ is computed. This does not mean that this function - * computes the least-square solution of \f$ A x = b \f$ is \f$ A \f$ is singular. - * - * \sa MatrixBase::ldlt(), SelfAdjointView::ldlt() - */ - template - inline const Solve - solve(const MatrixBase& b) const - { - eigen_assert(m_isInitialized && "LDLT is not initialized."); - eigen_assert(m_matrix.rows()==b.rows() - && "LDLT::solve(): invalid number of rows of the right hand side matrix b"); - return Solve(*this, b.derived()); - } - - template - bool solveInPlace(MatrixBase &bAndX) const; - - template - LDLT& compute(const EigenBase& matrix); - - /** \returns an estimate of the reciprocal condition number of the matrix of - * which \c *this is the LDLT decomposition. - */ - RealScalar rcond() const - { - eigen_assert(m_isInitialized && "LDLT is not initialized."); - return internal::rcond_estimate_helper(m_l1_norm, *this); - } - - template - LDLT& rankUpdate(const MatrixBase& w, const RealScalar& alpha=1); - - /** \returns the internal LDLT decomposition matrix - * - * TODO: document the storage layout - */ - inline const MatrixType& matrixLDLT() const - { - eigen_assert(m_isInitialized && "LDLT is not initialized."); - return m_matrix; - } - - MatrixType reconstructedMatrix() const; - - /** \returns the adjoint of \c *this, that is, a const reference to the decomposition itself as the underlying matrix is self-adjoint. - * - * This method is provided for compatibility with other matrix decompositions, thus enabling generic code such as: - * \code x = decomposition.adjoint().solve(b) \endcode - */ - const LDLT& adjoint() const { return *this; }; - - inline Index rows() const { return m_matrix.rows(); } - inline Index cols() const { return m_matrix.cols(); } - - /** \brief Reports whether previous computation was successful. - * - * \returns \c Success if computation was succesful, - * \c NumericalIssue if the factorization failed because of a zero pivot. - */ - ComputationInfo info() const - { - eigen_assert(m_isInitialized && "LDLT is not initialized."); - return m_info; - } - - #ifndef EIGEN_PARSED_BY_DOXYGEN - template - void _solve_impl(const RhsType &rhs, DstType &dst) const; - #endif - - protected: - - static void check_template_parameters() - { - EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar); - } - - /** \internal - * Used to compute and store the Cholesky decomposition A = L D L^* = U^* D U. - * The strict upper part is used during the decomposition, the strict lower - * part correspond to the coefficients of L (its diagonal is equal to 1 and - * is not stored), and the diagonal entries correspond to D. - */ - MatrixType m_matrix; - RealScalar m_l1_norm; - TranspositionType m_transpositions; - TmpMatrixType m_temporary; - internal::SignMatrix m_sign; - bool m_isInitialized; - ComputationInfo m_info; -}; - -namespace internal { - -template struct ldlt_inplace; - -template<> struct ldlt_inplace -{ - template - static bool unblocked(MatrixType& mat, TranspositionType& transpositions, Workspace& temp, SignMatrix& sign) - { - using std::abs; - typedef typename MatrixType::Scalar Scalar; - typedef typename MatrixType::RealScalar RealScalar; - typedef typename TranspositionType::StorageIndex IndexType; - eigen_assert(mat.rows()==mat.cols()); - const Index size = mat.rows(); - bool found_zero_pivot = false; - bool ret = true; - - if (size <= 1) - { - transpositions.setIdentity(); - if (numext::real(mat.coeff(0,0)) > static_cast(0) ) sign = PositiveSemiDef; - else if (numext::real(mat.coeff(0,0)) < static_cast(0)) sign = NegativeSemiDef; - else sign = ZeroSign; - return true; - } - - for (Index k = 0; k < size; ++k) - { - // Find largest diagonal element - Index index_of_biggest_in_corner; - mat.diagonal().tail(size-k).cwiseAbs().maxCoeff(&index_of_biggest_in_corner); - index_of_biggest_in_corner += k; - - transpositions.coeffRef(k) = IndexType(index_of_biggest_in_corner); - if(k != index_of_biggest_in_corner) - { - // apply the transposition while taking care to consider only - // the lower triangular part - Index s = size-index_of_biggest_in_corner-1; // trailing size after the biggest element - mat.row(k).head(k).swap(mat.row(index_of_biggest_in_corner).head(k)); - mat.col(k).tail(s).swap(mat.col(index_of_biggest_in_corner).tail(s)); - std::swap(mat.coeffRef(k,k),mat.coeffRef(index_of_biggest_in_corner,index_of_biggest_in_corner)); - for(Index i=k+1;i::IsComplex) - mat.coeffRef(index_of_biggest_in_corner,k) = numext::conj(mat.coeff(index_of_biggest_in_corner,k)); - } - - // partition the matrix: - // A00 | - | - - // lu = A10 | A11 | - - // A20 | A21 | A22 - Index rs = size - k - 1; - Block A21(mat,k+1,k,rs,1); - Block A10(mat,k,0,1,k); - Block A20(mat,k+1,0,rs,k); - - if(k>0) - { - temp.head(k) = mat.diagonal().real().head(k).asDiagonal() * A10.adjoint(); - mat.coeffRef(k,k) -= (A10 * temp.head(k)).value(); - if(rs>0) - A21.noalias() -= A20 * temp.head(k); - } - - // In some previous versions of Eigen (e.g., 3.2.1), the scaling was omitted if the pivot - // was smaller than the cutoff value. However, since LDLT is not rank-revealing - // we should only make sure that we do not introduce INF or NaN values. - // Remark that LAPACK also uses 0 as the cutoff value. - RealScalar realAkk = numext::real(mat.coeffRef(k,k)); - bool pivot_is_valid = (abs(realAkk) > RealScalar(0)); - - if(k==0 && !pivot_is_valid) - { - // The entire diagonal is zero, there is nothing more to do - // except filling the transpositions, and checking whether the matrix is zero. - sign = ZeroSign; - for(Index j = 0; j0) && pivot_is_valid) - A21 /= realAkk; - - if(found_zero_pivot && pivot_is_valid) ret = false; // factorization failed - else if(!pivot_is_valid) found_zero_pivot = true; - - if (sign == PositiveSemiDef) { - if (realAkk < static_cast(0)) sign = Indefinite; - } else if (sign == NegativeSemiDef) { - if (realAkk > static_cast(0)) sign = Indefinite; - } else if (sign == ZeroSign) { - if (realAkk > static_cast(0)) sign = PositiveSemiDef; - else if (realAkk < static_cast(0)) sign = NegativeSemiDef; - } - } - - return ret; - } - - // Reference for the algorithm: Davis and Hager, "Multiple Rank - // Modifications of a Sparse Cholesky Factorization" (Algorithm 1) - // Trivial rearrangements of their computations (Timothy E. Holy) - // allow their algorithm to work for rank-1 updates even if the - // original matrix is not of full rank. - // Here only rank-1 updates are implemented, to reduce the - // requirement for intermediate storage and improve accuracy - template - static bool updateInPlace(MatrixType& mat, MatrixBase& w, const typename MatrixType::RealScalar& sigma=1) - { - using numext::isfinite; - typedef typename MatrixType::Scalar Scalar; - typedef typename MatrixType::RealScalar RealScalar; - - const Index size = mat.rows(); - eigen_assert(mat.cols() == size && w.size()==size); - - RealScalar alpha = 1; - - // Apply the update - for (Index j = 0; j < size; j++) - { - // Check for termination due to an original decomposition of low-rank - if (!(isfinite)(alpha)) - break; - - // Update the diagonal terms - RealScalar dj = numext::real(mat.coeff(j,j)); - Scalar wj = w.coeff(j); - RealScalar swj2 = sigma*numext::abs2(wj); - RealScalar gamma = dj*alpha + swj2; - - mat.coeffRef(j,j) += swj2/alpha; - alpha += swj2/dj; - - - // Update the terms of L - Index rs = size-j-1; - w.tail(rs) -= wj * mat.col(j).tail(rs); - if(gamma != 0) - mat.col(j).tail(rs) += (sigma*numext::conj(wj)/gamma)*w.tail(rs); - } - return true; - } - - template - static bool update(MatrixType& mat, const TranspositionType& transpositions, Workspace& tmp, const WType& w, const typename MatrixType::RealScalar& sigma=1) - { - // Apply the permutation to the input w - tmp = transpositions * w; - - return ldlt_inplace::updateInPlace(mat,tmp,sigma); - } -}; - -template<> struct ldlt_inplace -{ - template - static EIGEN_STRONG_INLINE bool unblocked(MatrixType& mat, TranspositionType& transpositions, Workspace& temp, SignMatrix& sign) - { - Transpose matt(mat); - return ldlt_inplace::unblocked(matt, transpositions, temp, sign); - } - - template - static EIGEN_STRONG_INLINE bool update(MatrixType& mat, TranspositionType& transpositions, Workspace& tmp, WType& w, const typename MatrixType::RealScalar& sigma=1) - { - Transpose matt(mat); - return ldlt_inplace::update(matt, transpositions, tmp, w.conjugate(), sigma); - } -}; - -template struct LDLT_Traits -{ - typedef const TriangularView MatrixL; - typedef const TriangularView MatrixU; - static inline MatrixL getL(const MatrixType& m) { return MatrixL(m); } - static inline MatrixU getU(const MatrixType& m) { return MatrixU(m.adjoint()); } -}; - -template struct LDLT_Traits -{ - typedef const TriangularView MatrixL; - typedef const TriangularView MatrixU; - static inline MatrixL getL(const MatrixType& m) { return MatrixL(m.adjoint()); } - static inline MatrixU getU(const MatrixType& m) { return MatrixU(m); } -}; - -} // end namespace internal - -/** Compute / recompute the LDLT decomposition A = L D L^* = U^* D U of \a matrix - */ -template -template -LDLT& LDLT::compute(const EigenBase& a) -{ - check_template_parameters(); - - eigen_assert(a.rows()==a.cols()); - const Index size = a.rows(); - - m_matrix = a.derived(); - - // Compute matrix L1 norm = max abs column sum. - m_l1_norm = RealScalar(0); - // TODO move this code to SelfAdjointView - for (Index col = 0; col < size; ++col) { - RealScalar abs_col_sum; - if (_UpLo == Lower) - abs_col_sum = m_matrix.col(col).tail(size - col).template lpNorm<1>() + m_matrix.row(col).head(col).template lpNorm<1>(); - else - abs_col_sum = m_matrix.col(col).head(col).template lpNorm<1>() + m_matrix.row(col).tail(size - col).template lpNorm<1>(); - if (abs_col_sum > m_l1_norm) - m_l1_norm = abs_col_sum; - } - - m_transpositions.resize(size); - m_isInitialized = false; - m_temporary.resize(size); - m_sign = internal::ZeroSign; - - m_info = internal::ldlt_inplace::unblocked(m_matrix, m_transpositions, m_temporary, m_sign) ? Success : NumericalIssue; - - m_isInitialized = true; - return *this; -} - -/** Update the LDLT decomposition: given A = L D L^T, efficiently compute the decomposition of A + sigma w w^T. - * \param w a vector to be incorporated into the decomposition. - * \param sigma a scalar, +1 for updates and -1 for "downdates," which correspond to removing previously-added column vectors. Optional; default value is +1. - * \sa setZero() - */ -template -template -LDLT& LDLT::rankUpdate(const MatrixBase& w, const typename LDLT::RealScalar& sigma) -{ - typedef typename TranspositionType::StorageIndex IndexType; - const Index size = w.rows(); - if (m_isInitialized) - { - eigen_assert(m_matrix.rows()==size); - } - else - { - m_matrix.resize(size,size); - m_matrix.setZero(); - m_transpositions.resize(size); - for (Index i = 0; i < size; i++) - m_transpositions.coeffRef(i) = IndexType(i); - m_temporary.resize(size); - m_sign = sigma>=0 ? internal::PositiveSemiDef : internal::NegativeSemiDef; - m_isInitialized = true; - } - - internal::ldlt_inplace::update(m_matrix, m_transpositions, m_temporary, w, sigma); - - return *this; -} - -#ifndef EIGEN_PARSED_BY_DOXYGEN -template -template -void LDLT<_MatrixType,_UpLo>::_solve_impl(const RhsType &rhs, DstType &dst) const -{ - eigen_assert(rhs.rows() == rows()); - // dst = P b - dst = m_transpositions * rhs; - - // dst = L^-1 (P b) - matrixL().solveInPlace(dst); - - // dst = D^-1 (L^-1 P b) - // more precisely, use pseudo-inverse of D (see bug 241) - using std::abs; - const typename Diagonal::RealReturnType vecD(vectorD()); - // In some previous versions, tolerance was set to the max of 1/highest and the maximal diagonal entry * epsilon - // as motivated by LAPACK's xGELSS: - // RealScalar tolerance = numext::maxi(vecD.array().abs().maxCoeff() * NumTraits::epsilon(),RealScalar(1) / NumTraits::highest()); - // However, LDLT is not rank revealing, and so adjusting the tolerance wrt to the highest - // diagonal element is not well justified and leads to numerical issues in some cases. - // Moreover, Lapack's xSYTRS routines use 0 for the tolerance. - RealScalar tolerance = RealScalar(1) / NumTraits::highest(); - - for (Index i = 0; i < vecD.size(); ++i) - { - if(abs(vecD(i)) > tolerance) - dst.row(i) /= vecD(i); - else - dst.row(i).setZero(); - } - - // dst = L^-T (D^-1 L^-1 P b) - matrixU().solveInPlace(dst); - - // dst = P^-1 (L^-T D^-1 L^-1 P b) = A^-1 b - dst = m_transpositions.transpose() * dst; -} -#endif - -/** \internal use x = ldlt_object.solve(x); - * - * This is the \em in-place version of solve(). - * - * \param bAndX represents both the right-hand side matrix b and result x. - * - * \returns true always! If you need to check for existence of solutions, use another decomposition like LU, QR, or SVD. - * - * This version avoids a copy when the right hand side matrix b is not - * needed anymore. - * - * \sa LDLT::solve(), MatrixBase::ldlt() - */ -template -template -bool LDLT::solveInPlace(MatrixBase &bAndX) const -{ - eigen_assert(m_isInitialized && "LDLT is not initialized."); - eigen_assert(m_matrix.rows() == bAndX.rows()); - - bAndX = this->solve(bAndX); - - return true; -} - -/** \returns the matrix represented by the decomposition, - * i.e., it returns the product: P^T L D L^* P. - * This function is provided for debug purpose. */ -template -MatrixType LDLT::reconstructedMatrix() const -{ - eigen_assert(m_isInitialized && "LDLT is not initialized."); - const Index size = m_matrix.rows(); - MatrixType res(size,size); - - // P - res.setIdentity(); - res = transpositionsP() * res; - // L^* P - res = matrixU() * res; - // D(L^*P) - res = vectorD().real().asDiagonal() * res; - // L(DL^*P) - res = matrixL() * res; - // P^T (LDL^*P) - res = transpositionsP().transpose() * res; - - return res; -} - -/** \cholesky_module - * \returns the Cholesky decomposition with full pivoting without square root of \c *this - * \sa MatrixBase::ldlt() - */ -template -inline const LDLT::PlainObject, UpLo> -SelfAdjointView::ldlt() const -{ - return LDLT(m_matrix); -} - -/** \cholesky_module - * \returns the Cholesky decomposition with full pivoting without square root of \c *this - * \sa SelfAdjointView::ldlt() - */ -template -inline const LDLT::PlainObject> -MatrixBase::ldlt() const -{ - return LDLT(derived()); -} - -} // end namespace Eigen - -#endif // EIGEN_LDLT_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Cholesky/LLT.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Cholesky/LLT.h deleted file mode 100644 index 814174d4..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Cholesky/LLT.h +++ /dev/null @@ -1,541 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_LLT_H -#define EIGEN_LLT_H - -namespace Eigen { - -namespace internal{ -template struct LLT_Traits; -} - -/** \ingroup Cholesky_Module - * - * \class LLT - * - * \brief Standard Cholesky decomposition (LL^T) of a matrix and associated features - * - * \tparam _MatrixType the type of the matrix of which we are computing the LL^T Cholesky decomposition - * \tparam _UpLo the triangular part that will be used for the decompositon: Lower (default) or Upper. - * The other triangular part won't be read. - * - * This class performs a LL^T Cholesky decomposition of a symmetric, positive definite - * matrix A such that A = LL^* = U^*U, where L is lower triangular. - * - * While the Cholesky decomposition is particularly useful to solve selfadjoint problems like D^*D x = b, - * for that purpose, we recommend the Cholesky decomposition without square root which is more stable - * and even faster. Nevertheless, this standard Cholesky decomposition remains useful in many other - * situations like generalised eigen problems with hermitian matrices. - * - * Remember that Cholesky decompositions are not rank-revealing. This LLT decomposition is only stable on positive definite matrices, - * use LDLT instead for the semidefinite case. Also, do not use a Cholesky decomposition to determine whether a system of equations - * has a solution. - * - * Example: \include LLT_example.cpp - * Output: \verbinclude LLT_example.out - * - * \b Performance: for best performance, it is recommended to use a column-major storage format - * with the Lower triangular part (the default), or, equivalently, a row-major storage format - * with the Upper triangular part. Otherwise, you might get a 20% slowdown for the full factorization - * step, and rank-updates can be up to 3 times slower. - * - * This class supports the \link InplaceDecomposition inplace decomposition \endlink mechanism. - * - * Note that during the decomposition, only the lower (or upper, as defined by _UpLo) triangular part of A is considered. - * Therefore, the strict lower part does not have to store correct values. - * - * \sa MatrixBase::llt(), SelfAdjointView::llt(), class LDLT - */ -template class LLT -{ - public: - typedef _MatrixType MatrixType; - enum { - RowsAtCompileTime = MatrixType::RowsAtCompileTime, - ColsAtCompileTime = MatrixType::ColsAtCompileTime, - MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime - }; - typedef typename MatrixType::Scalar Scalar; - typedef typename NumTraits::Real RealScalar; - typedef Eigen::Index Index; ///< \deprecated since Eigen 3.3 - typedef typename MatrixType::StorageIndex StorageIndex; - - enum { - PacketSize = internal::packet_traits::size, - AlignmentMask = int(PacketSize)-1, - UpLo = _UpLo - }; - - typedef internal::LLT_Traits Traits; - - /** - * \brief Default Constructor. - * - * The default constructor is useful in cases in which the user intends to - * perform decompositions via LLT::compute(const MatrixType&). - */ - LLT() : m_matrix(), m_isInitialized(false) {} - - /** \brief Default Constructor with memory preallocation - * - * Like the default constructor but with preallocation of the internal data - * according to the specified problem \a size. - * \sa LLT() - */ - explicit LLT(Index size) : m_matrix(size, size), - m_isInitialized(false) {} - - template - explicit LLT(const EigenBase& matrix) - : m_matrix(matrix.rows(), matrix.cols()), - m_isInitialized(false) - { - compute(matrix.derived()); - } - - /** \brief Constructs a LDLT factorization from a given matrix - * - * This overloaded constructor is provided for \link InplaceDecomposition inplace decomposition \endlink when - * \c MatrixType is a Eigen::Ref. - * - * \sa LLT(const EigenBase&) - */ - template - explicit LLT(EigenBase& matrix) - : m_matrix(matrix.derived()), - m_isInitialized(false) - { - compute(matrix.derived()); - } - - /** \returns a view of the upper triangular matrix U */ - inline typename Traits::MatrixU matrixU() const - { - eigen_assert(m_isInitialized && "LLT is not initialized."); - return Traits::getU(m_matrix); - } - - /** \returns a view of the lower triangular matrix L */ - inline typename Traits::MatrixL matrixL() const - { - eigen_assert(m_isInitialized && "LLT is not initialized."); - return Traits::getL(m_matrix); - } - - /** \returns the solution x of \f$ A x = b \f$ using the current decomposition of A. - * - * Since this LLT class assumes anyway that the matrix A is invertible, the solution - * theoretically exists and is unique regardless of b. - * - * Example: \include LLT_solve.cpp - * Output: \verbinclude LLT_solve.out - * - * \sa solveInPlace(), MatrixBase::llt(), SelfAdjointView::llt() - */ - template - inline const Solve - solve(const MatrixBase& b) const - { - eigen_assert(m_isInitialized && "LLT is not initialized."); - eigen_assert(m_matrix.rows()==b.rows() - && "LLT::solve(): invalid number of rows of the right hand side matrix b"); - return Solve(*this, b.derived()); - } - - template - void solveInPlace(const MatrixBase &bAndX) const; - - template - LLT& compute(const EigenBase& matrix); - - /** \returns an estimate of the reciprocal condition number of the matrix of - * which \c *this is the Cholesky decomposition. - */ - RealScalar rcond() const - { - eigen_assert(m_isInitialized && "LLT is not initialized."); - eigen_assert(m_info == Success && "LLT failed because matrix appears to be negative"); - return internal::rcond_estimate_helper(m_l1_norm, *this); - } - - /** \returns the LLT decomposition matrix - * - * TODO: document the storage layout - */ - inline const MatrixType& matrixLLT() const - { - eigen_assert(m_isInitialized && "LLT is not initialized."); - return m_matrix; - } - - MatrixType reconstructedMatrix() const; - - - /** \brief Reports whether previous computation was successful. - * - * \returns \c Success if computation was succesful, - * \c NumericalIssue if the matrix.appears not to be positive definite. - */ - ComputationInfo info() const - { - eigen_assert(m_isInitialized && "LLT is not initialized."); - return m_info; - } - - /** \returns the adjoint of \c *this, that is, a const reference to the decomposition itself as the underlying matrix is self-adjoint. - * - * This method is provided for compatibility with other matrix decompositions, thus enabling generic code such as: - * \code x = decomposition.adjoint().solve(b) \endcode - */ - const LLT& adjoint() const { return *this; }; - - inline Index rows() const { return m_matrix.rows(); } - inline Index cols() const { return m_matrix.cols(); } - - template - LLT rankUpdate(const VectorType& vec, const RealScalar& sigma = 1); - - #ifndef EIGEN_PARSED_BY_DOXYGEN - template - void _solve_impl(const RhsType &rhs, DstType &dst) const; - #endif - - protected: - - static void check_template_parameters() - { - EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar); - } - - /** \internal - * Used to compute and store L - * The strict upper part is not used and even not initialized. - */ - MatrixType m_matrix; - RealScalar m_l1_norm; - bool m_isInitialized; - ComputationInfo m_info; -}; - -namespace internal { - -template struct llt_inplace; - -template -static Index llt_rank_update_lower(MatrixType& mat, const VectorType& vec, const typename MatrixType::RealScalar& sigma) -{ - using std::sqrt; - typedef typename MatrixType::Scalar Scalar; - typedef typename MatrixType::RealScalar RealScalar; - typedef typename MatrixType::ColXpr ColXpr; - typedef typename internal::remove_all::type ColXprCleaned; - typedef typename ColXprCleaned::SegmentReturnType ColXprSegment; - typedef Matrix TempVectorType; - typedef typename TempVectorType::SegmentReturnType TempVecSegment; - - Index n = mat.cols(); - eigen_assert(mat.rows()==n && vec.size()==n); - - TempVectorType temp; - - if(sigma>0) - { - // This version is based on Givens rotations. - // It is faster than the other one below, but only works for updates, - // i.e., for sigma > 0 - temp = sqrt(sigma) * vec; - - for(Index i=0; i g; - g.makeGivens(mat(i,i), -temp(i), &mat(i,i)); - - Index rs = n-i-1; - if(rs>0) - { - ColXprSegment x(mat.col(i).tail(rs)); - TempVecSegment y(temp.tail(rs)); - apply_rotation_in_the_plane(x, y, g); - } - } - } - else - { - temp = vec; - RealScalar beta = 1; - for(Index j=0; j struct llt_inplace -{ - typedef typename NumTraits::Real RealScalar; - template - static Index unblocked(MatrixType& mat) - { - using std::sqrt; - - eigen_assert(mat.rows()==mat.cols()); - const Index size = mat.rows(); - for(Index k = 0; k < size; ++k) - { - Index rs = size-k-1; // remaining size - - Block A21(mat,k+1,k,rs,1); - Block A10(mat,k,0,1,k); - Block A20(mat,k+1,0,rs,k); - - RealScalar x = numext::real(mat.coeff(k,k)); - if (k>0) x -= A10.squaredNorm(); - if (x<=RealScalar(0)) - return k; - mat.coeffRef(k,k) = x = sqrt(x); - if (k>0 && rs>0) A21.noalias() -= A20 * A10.adjoint(); - if (rs>0) A21 /= x; - } - return -1; - } - - template - static Index blocked(MatrixType& m) - { - eigen_assert(m.rows()==m.cols()); - Index size = m.rows(); - if(size<32) - return unblocked(m); - - Index blockSize = size/8; - blockSize = (blockSize/16)*16; - blockSize = (std::min)((std::max)(blockSize,Index(8)), Index(128)); - - for (Index k=0; k A11(m,k, k, bs,bs); - Block A21(m,k+bs,k, rs,bs); - Block A22(m,k+bs,k+bs,rs,rs); - - Index ret; - if((ret=unblocked(A11))>=0) return k+ret; - if(rs>0) A11.adjoint().template triangularView().template solveInPlace(A21); - if(rs>0) A22.template selfadjointView().rankUpdate(A21,typename NumTraits::Literal(-1)); // bottleneck - } - return -1; - } - - template - static Index rankUpdate(MatrixType& mat, const VectorType& vec, const RealScalar& sigma) - { - return Eigen::internal::llt_rank_update_lower(mat, vec, sigma); - } -}; - -template struct llt_inplace -{ - typedef typename NumTraits::Real RealScalar; - - template - static EIGEN_STRONG_INLINE Index unblocked(MatrixType& mat) - { - Transpose matt(mat); - return llt_inplace::unblocked(matt); - } - template - static EIGEN_STRONG_INLINE Index blocked(MatrixType& mat) - { - Transpose matt(mat); - return llt_inplace::blocked(matt); - } - template - static Index rankUpdate(MatrixType& mat, const VectorType& vec, const RealScalar& sigma) - { - Transpose matt(mat); - return llt_inplace::rankUpdate(matt, vec.conjugate(), sigma); - } -}; - -template struct LLT_Traits -{ - typedef const TriangularView MatrixL; - typedef const TriangularView MatrixU; - static inline MatrixL getL(const MatrixType& m) { return MatrixL(m); } - static inline MatrixU getU(const MatrixType& m) { return MatrixU(m.adjoint()); } - static bool inplace_decomposition(MatrixType& m) - { return llt_inplace::blocked(m)==-1; } -}; - -template struct LLT_Traits -{ - typedef const TriangularView MatrixL; - typedef const TriangularView MatrixU; - static inline MatrixL getL(const MatrixType& m) { return MatrixL(m.adjoint()); } - static inline MatrixU getU(const MatrixType& m) { return MatrixU(m); } - static bool inplace_decomposition(MatrixType& m) - { return llt_inplace::blocked(m)==-1; } -}; - -} // end namespace internal - -/** Computes / recomputes the Cholesky decomposition A = LL^* = U^*U of \a matrix - * - * \returns a reference to *this - * - * Example: \include TutorialLinAlgComputeTwice.cpp - * Output: \verbinclude TutorialLinAlgComputeTwice.out - */ -template -template -LLT& LLT::compute(const EigenBase& a) -{ - check_template_parameters(); - - eigen_assert(a.rows()==a.cols()); - const Index size = a.rows(); - m_matrix.resize(size, size); - if (!internal::is_same_dense(m_matrix, a.derived())) - m_matrix = a.derived(); - - // Compute matrix L1 norm = max abs column sum. - m_l1_norm = RealScalar(0); - // TODO move this code to SelfAdjointView - for (Index col = 0; col < size; ++col) { - RealScalar abs_col_sum; - if (_UpLo == Lower) - abs_col_sum = m_matrix.col(col).tail(size - col).template lpNorm<1>() + m_matrix.row(col).head(col).template lpNorm<1>(); - else - abs_col_sum = m_matrix.col(col).head(col).template lpNorm<1>() + m_matrix.row(col).tail(size - col).template lpNorm<1>(); - if (abs_col_sum > m_l1_norm) - m_l1_norm = abs_col_sum; - } - - m_isInitialized = true; - bool ok = Traits::inplace_decomposition(m_matrix); - m_info = ok ? Success : NumericalIssue; - - return *this; -} - -/** Performs a rank one update (or dowdate) of the current decomposition. - * If A = LL^* before the rank one update, - * then after it we have LL^* = A + sigma * v v^* where \a v must be a vector - * of same dimension. - */ -template -template -LLT<_MatrixType,_UpLo> LLT<_MatrixType,_UpLo>::rankUpdate(const VectorType& v, const RealScalar& sigma) -{ - EIGEN_STATIC_ASSERT_VECTOR_ONLY(VectorType); - eigen_assert(v.size()==m_matrix.cols()); - eigen_assert(m_isInitialized); - if(internal::llt_inplace::rankUpdate(m_matrix,v,sigma)>=0) - m_info = NumericalIssue; - else - m_info = Success; - - return *this; -} - -#ifndef EIGEN_PARSED_BY_DOXYGEN -template -template -void LLT<_MatrixType,_UpLo>::_solve_impl(const RhsType &rhs, DstType &dst) const -{ - dst = rhs; - solveInPlace(dst); -} -#endif - -/** \internal use x = llt_object.solve(x); - * - * This is the \em in-place version of solve(). - * - * \param bAndX represents both the right-hand side matrix b and result x. - * - * This version avoids a copy when the right hand side matrix b is not needed anymore. - * - * \warning The parameter is only marked 'const' to make the C++ compiler accept a temporary expression here. - * This function will const_cast it, so constness isn't honored here. - * - * \sa LLT::solve(), MatrixBase::llt() - */ -template -template -void LLT::solveInPlace(const MatrixBase &bAndX) const -{ - eigen_assert(m_isInitialized && "LLT is not initialized."); - eigen_assert(m_matrix.rows()==bAndX.rows()); - matrixL().solveInPlace(bAndX); - matrixU().solveInPlace(bAndX); -} - -/** \returns the matrix represented by the decomposition, - * i.e., it returns the product: L L^*. - * This function is provided for debug purpose. */ -template -MatrixType LLT::reconstructedMatrix() const -{ - eigen_assert(m_isInitialized && "LLT is not initialized."); - return matrixL() * matrixL().adjoint().toDenseMatrix(); -} - -/** \cholesky_module - * \returns the LLT decomposition of \c *this - * \sa SelfAdjointView::llt() - */ -template -inline const LLT::PlainObject> -MatrixBase::llt() const -{ - return LLT(derived()); -} - -/** \cholesky_module - * \returns the LLT decomposition of \c *this - * \sa SelfAdjointView::llt() - */ -template -inline const LLT::PlainObject, UpLo> -SelfAdjointView::llt() const -{ - return LLT(m_matrix); -} - -} // end namespace Eigen - -#endif // EIGEN_LLT_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Cholesky/LLT_LAPACKE.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Cholesky/LLT_LAPACKE.h deleted file mode 100644 index bc6489e6..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Cholesky/LLT_LAPACKE.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - Copyright (c) 2011, Intel Corporation. All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of Intel Corporation nor the names of its contributors may - be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - ******************************************************************************** - * Content : Eigen bindings to LAPACKe - * LLt decomposition based on LAPACKE_?potrf function. - ******************************************************************************** -*/ - -#ifndef EIGEN_LLT_LAPACKE_H -#define EIGEN_LLT_LAPACKE_H - -namespace Eigen { - -namespace internal { - -template struct lapacke_llt; - -#define EIGEN_LAPACKE_LLT(EIGTYPE, BLASTYPE, LAPACKE_PREFIX) \ -template<> struct lapacke_llt \ -{ \ - template \ - static inline Index potrf(MatrixType& m, char uplo) \ - { \ - lapack_int matrix_order; \ - lapack_int size, lda, info, StorageOrder; \ - EIGTYPE* a; \ - eigen_assert(m.rows()==m.cols()); \ - /* Set up parameters for ?potrf */ \ - size = convert_index(m.rows()); \ - StorageOrder = MatrixType::Flags&RowMajorBit?RowMajor:ColMajor; \ - matrix_order = StorageOrder==RowMajor ? LAPACK_ROW_MAJOR : LAPACK_COL_MAJOR; \ - a = &(m.coeffRef(0,0)); \ - lda = convert_index(m.outerStride()); \ -\ - info = LAPACKE_##LAPACKE_PREFIX##potrf( matrix_order, uplo, size, (BLASTYPE*)a, lda ); \ - info = (info==0) ? -1 : info>0 ? info-1 : size; \ - return info; \ - } \ -}; \ -template<> struct llt_inplace \ -{ \ - template \ - static Index blocked(MatrixType& m) \ - { \ - return lapacke_llt::potrf(m, 'L'); \ - } \ - template \ - static Index rankUpdate(MatrixType& mat, const VectorType& vec, const typename MatrixType::RealScalar& sigma) \ - { return Eigen::internal::llt_rank_update_lower(mat, vec, sigma); } \ -}; \ -template<> struct llt_inplace \ -{ \ - template \ - static Index blocked(MatrixType& m) \ - { \ - return lapacke_llt::potrf(m, 'U'); \ - } \ - template \ - static Index rankUpdate(MatrixType& mat, const VectorType& vec, const typename MatrixType::RealScalar& sigma) \ - { \ - Transpose matt(mat); \ - return llt_inplace::rankUpdate(matt, vec.conjugate(), sigma); \ - } \ -}; - -EIGEN_LAPACKE_LLT(double, double, d) -EIGEN_LAPACKE_LLT(float, float, s) -EIGEN_LAPACKE_LLT(dcomplex, lapack_complex_double, z) -EIGEN_LAPACKE_LLT(scomplex, lapack_complex_float, c) - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_LLT_LAPACKE_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/CholmodSupport/CholmodSupport.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/CholmodSupport/CholmodSupport.h deleted file mode 100644 index dc199ece..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/CholmodSupport/CholmodSupport.h +++ /dev/null @@ -1,682 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2010 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CHOLMODSUPPORT_H -#define EIGEN_CHOLMODSUPPORT_H - -namespace Eigen { - -namespace internal { - -template struct cholmod_configure_matrix; - -template<> struct cholmod_configure_matrix { - template - static void run(CholmodType& mat) { - mat.xtype = CHOLMOD_REAL; - mat.dtype = CHOLMOD_DOUBLE; - } -}; - -template<> struct cholmod_configure_matrix > { - template - static void run(CholmodType& mat) { - mat.xtype = CHOLMOD_COMPLEX; - mat.dtype = CHOLMOD_DOUBLE; - } -}; - -// Other scalar types are not yet supported by Cholmod -// template<> struct cholmod_configure_matrix { -// template -// static void run(CholmodType& mat) { -// mat.xtype = CHOLMOD_REAL; -// mat.dtype = CHOLMOD_SINGLE; -// } -// }; -// -// template<> struct cholmod_configure_matrix > { -// template -// static void run(CholmodType& mat) { -// mat.xtype = CHOLMOD_COMPLEX; -// mat.dtype = CHOLMOD_SINGLE; -// } -// }; - -} // namespace internal - -/** Wraps the Eigen sparse matrix \a mat into a Cholmod sparse matrix object. - * Note that the data are shared. - */ -template -cholmod_sparse viewAsCholmod(Ref > mat) -{ - cholmod_sparse res; - res.nzmax = mat.nonZeros(); - res.nrow = mat.rows(); - res.ncol = mat.cols(); - res.p = mat.outerIndexPtr(); - res.i = mat.innerIndexPtr(); - res.x = mat.valuePtr(); - res.z = 0; - res.sorted = 1; - if(mat.isCompressed()) - { - res.packed = 1; - res.nz = 0; - } - else - { - res.packed = 0; - res.nz = mat.innerNonZeroPtr(); - } - - res.dtype = 0; - res.stype = -1; - - if (internal::is_same<_StorageIndex,int>::value) - { - res.itype = CHOLMOD_INT; - } - else if (internal::is_same<_StorageIndex,long>::value) - { - res.itype = CHOLMOD_LONG; - } - else - { - eigen_assert(false && "Index type not supported yet"); - } - - // setup res.xtype - internal::cholmod_configure_matrix<_Scalar>::run(res); - - res.stype = 0; - - return res; -} - -template -const cholmod_sparse viewAsCholmod(const SparseMatrix<_Scalar,_Options,_Index>& mat) -{ - cholmod_sparse res = viewAsCholmod(Ref >(mat.const_cast_derived())); - return res; -} - -template -const cholmod_sparse viewAsCholmod(const SparseVector<_Scalar,_Options,_Index>& mat) -{ - cholmod_sparse res = viewAsCholmod(Ref >(mat.const_cast_derived())); - return res; -} - -/** Returns a view of the Eigen sparse matrix \a mat as Cholmod sparse matrix. - * The data are not copied but shared. */ -template -cholmod_sparse viewAsCholmod(const SparseSelfAdjointView, UpLo>& mat) -{ - cholmod_sparse res = viewAsCholmod(Ref >(mat.matrix().const_cast_derived())); - - if(UpLo==Upper) res.stype = 1; - if(UpLo==Lower) res.stype = -1; - // swap stype for rowmajor matrices (only works for real matrices) - EIGEN_STATIC_ASSERT((_Options & RowMajorBit) == 0 || NumTraits<_Scalar>::IsComplex == 0, THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES); - if(_Options & RowMajorBit) res.stype *=-1; - - return res; -} - -/** Returns a view of the Eigen \b dense matrix \a mat as Cholmod dense matrix. - * The data are not copied but shared. */ -template -cholmod_dense viewAsCholmod(MatrixBase& mat) -{ - EIGEN_STATIC_ASSERT((internal::traits::Flags&RowMajorBit)==0,THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES); - typedef typename Derived::Scalar Scalar; - - cholmod_dense res; - res.nrow = mat.rows(); - res.ncol = mat.cols(); - res.nzmax = res.nrow * res.ncol; - res.d = Derived::IsVectorAtCompileTime ? mat.derived().size() : mat.derived().outerStride(); - res.x = (void*)(mat.derived().data()); - res.z = 0; - - internal::cholmod_configure_matrix::run(res); - - return res; -} - -/** Returns a view of the Cholmod sparse matrix \a cm as an Eigen sparse matrix. - * The data are not copied but shared. */ -template -MappedSparseMatrix viewAsEigen(cholmod_sparse& cm) -{ - return MappedSparseMatrix - (cm.nrow, cm.ncol, static_cast(cm.p)[cm.ncol], - static_cast(cm.p), static_cast(cm.i),static_cast(cm.x) ); -} - -namespace internal { - -// template specializations for int and long that call the correct cholmod method - -#define EIGEN_CHOLMOD_SPECIALIZE0(ret, name) \ - template inline ret cm_ ## name (cholmod_common &Common) { return cholmod_ ## name (&Common); } \ - template<> inline ret cm_ ## name (cholmod_common &Common) { return cholmod_l_ ## name (&Common); } - -#define EIGEN_CHOLMOD_SPECIALIZE1(ret, name, t1, a1) \ - template inline ret cm_ ## name (t1& a1, cholmod_common &Common) { return cholmod_ ## name (&a1, &Common); } \ - template<> inline ret cm_ ## name (t1& a1, cholmod_common &Common) { return cholmod_l_ ## name (&a1, &Common); } - -EIGEN_CHOLMOD_SPECIALIZE0(int, start) -EIGEN_CHOLMOD_SPECIALIZE0(int, finish) - -EIGEN_CHOLMOD_SPECIALIZE1(int, free_factor, cholmod_factor*, L) -EIGEN_CHOLMOD_SPECIALIZE1(int, free_dense, cholmod_dense*, X) -EIGEN_CHOLMOD_SPECIALIZE1(int, free_sparse, cholmod_sparse*, A) - -EIGEN_CHOLMOD_SPECIALIZE1(cholmod_factor*, analyze, cholmod_sparse, A) - -template inline cholmod_dense* cm_solve (int sys, cholmod_factor& L, cholmod_dense& B, cholmod_common &Common) { return cholmod_solve (sys, &L, &B, &Common); } -template<> inline cholmod_dense* cm_solve (int sys, cholmod_factor& L, cholmod_dense& B, cholmod_common &Common) { return cholmod_l_solve (sys, &L, &B, &Common); } - -template inline cholmod_sparse* cm_spsolve (int sys, cholmod_factor& L, cholmod_sparse& B, cholmod_common &Common) { return cholmod_spsolve (sys, &L, &B, &Common); } -template<> inline cholmod_sparse* cm_spsolve (int sys, cholmod_factor& L, cholmod_sparse& B, cholmod_common &Common) { return cholmod_l_spsolve (sys, &L, &B, &Common); } - -template -inline int cm_factorize_p (cholmod_sparse* A, double beta[2], _StorageIndex* fset, std::size_t fsize, cholmod_factor* L, cholmod_common &Common) { return cholmod_factorize_p (A, beta, fset, fsize, L, &Common); } -template<> -inline int cm_factorize_p (cholmod_sparse* A, double beta[2], long* fset, std::size_t fsize, cholmod_factor* L, cholmod_common &Common) { return cholmod_l_factorize_p (A, beta, fset, fsize, L, &Common); } - -#undef EIGEN_CHOLMOD_SPECIALIZE0 -#undef EIGEN_CHOLMOD_SPECIALIZE1 - -} // namespace internal - - -enum CholmodMode { - CholmodAuto, CholmodSimplicialLLt, CholmodSupernodalLLt, CholmodLDLt -}; - - -/** \ingroup CholmodSupport_Module - * \class CholmodBase - * \brief The base class for the direct Cholesky factorization of Cholmod - * \sa class CholmodSupernodalLLT, class CholmodSimplicialLDLT, class CholmodSimplicialLLT - */ -template -class CholmodBase : public SparseSolverBase -{ - protected: - typedef SparseSolverBase Base; - using Base::derived; - using Base::m_isInitialized; - public: - typedef _MatrixType MatrixType; - enum { UpLo = _UpLo }; - typedef typename MatrixType::Scalar Scalar; - typedef typename MatrixType::RealScalar RealScalar; - typedef MatrixType CholMatrixType; - typedef typename MatrixType::StorageIndex StorageIndex; - enum { - ColsAtCompileTime = MatrixType::ColsAtCompileTime, - MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime - }; - - public: - - CholmodBase() - : m_cholmodFactor(0), m_info(Success), m_factorizationIsOk(false), m_analysisIsOk(false) - { - EIGEN_STATIC_ASSERT((internal::is_same::value), CHOLMOD_SUPPORTS_DOUBLE_PRECISION_ONLY); - m_shiftOffset[0] = m_shiftOffset[1] = 0.0; - internal::cm_start(m_cholmod); - } - - explicit CholmodBase(const MatrixType& matrix) - : m_cholmodFactor(0), m_info(Success), m_factorizationIsOk(false), m_analysisIsOk(false) - { - EIGEN_STATIC_ASSERT((internal::is_same::value), CHOLMOD_SUPPORTS_DOUBLE_PRECISION_ONLY); - m_shiftOffset[0] = m_shiftOffset[1] = 0.0; - internal::cm_start(m_cholmod); - compute(matrix); - } - - ~CholmodBase() - { - if(m_cholmodFactor) - internal::cm_free_factor(m_cholmodFactor, m_cholmod); - internal::cm_finish(m_cholmod); - } - - inline StorageIndex cols() const { return internal::convert_index(m_cholmodFactor->n); } - inline StorageIndex rows() const { return internal::convert_index(m_cholmodFactor->n); } - - /** \brief Reports whether previous computation was successful. - * - * \returns \c Success if computation was successful, - * \c NumericalIssue if the matrix.appears to be negative. - */ - ComputationInfo info() const - { - eigen_assert(m_isInitialized && "Decomposition is not initialized."); - return m_info; - } - - /** Computes the sparse Cholesky decomposition of \a matrix */ - Derived& compute(const MatrixType& matrix) - { - analyzePattern(matrix); - factorize(matrix); - return derived(); - } - - /** Performs a symbolic decomposition on the sparsity pattern of \a matrix. - * - * This function is particularly useful when solving for several problems having the same structure. - * - * \sa factorize() - */ - void analyzePattern(const MatrixType& matrix) - { - if(m_cholmodFactor) - { - internal::cm_free_factor(m_cholmodFactor, m_cholmod); - m_cholmodFactor = 0; - } - cholmod_sparse A = viewAsCholmod(matrix.template selfadjointView()); - m_cholmodFactor = internal::cm_analyze(A, m_cholmod); - - this->m_isInitialized = true; - this->m_info = Success; - m_analysisIsOk = true; - m_factorizationIsOk = false; - } - - /** Performs a numeric decomposition of \a matrix - * - * The given matrix must have the same sparsity pattern as the matrix on which the symbolic decomposition has been performed. - * - * \sa analyzePattern() - */ - void factorize(const MatrixType& matrix) - { - eigen_assert(m_analysisIsOk && "You must first call analyzePattern()"); - cholmod_sparse A = viewAsCholmod(matrix.template selfadjointView()); - internal::cm_factorize_p(&A, m_shiftOffset, 0, 0, m_cholmodFactor, m_cholmod); - - // If the factorization failed, minor is the column at which it did. On success minor == n. - this->m_info = (m_cholmodFactor->minor == m_cholmodFactor->n ? Success : NumericalIssue); - m_factorizationIsOk = true; - } - - /** Returns a reference to the Cholmod's configuration structure to get a full control over the performed operations. - * See the Cholmod user guide for details. */ - cholmod_common& cholmod() { return m_cholmod; } - - #ifndef EIGEN_PARSED_BY_DOXYGEN - /** \internal */ - template - void _solve_impl(const MatrixBase &b, MatrixBase &dest) const - { - eigen_assert(m_factorizationIsOk && "The decomposition is not in a valid state for solving, you must first call either compute() or symbolic()/numeric()"); - const Index size = m_cholmodFactor->n; - EIGEN_UNUSED_VARIABLE(size); - eigen_assert(size==b.rows()); - - // Cholmod needs column-major storage without inner-stride, which corresponds to the default behavior of Ref. - Ref > b_ref(b.derived()); - - cholmod_dense b_cd = viewAsCholmod(b_ref); - cholmod_dense* x_cd = internal::cm_solve(CHOLMOD_A, *m_cholmodFactor, b_cd, m_cholmod); - if(!x_cd) - { - this->m_info = NumericalIssue; - return; - } - // TODO optimize this copy by swapping when possible (be careful with alignment, etc.) - // NOTE Actually, the copy can be avoided by calling cholmod_solve2 instead of cholmod_solve - dest = Matrix::Map(reinterpret_cast(x_cd->x),b.rows(),b.cols()); - internal::cm_free_dense(x_cd, m_cholmod); - } - - /** \internal */ - template - void _solve_impl(const SparseMatrixBase &b, SparseMatrixBase &dest) const - { - eigen_assert(m_factorizationIsOk && "The decomposition is not in a valid state for solving, you must first call either compute() or symbolic()/numeric()"); - const Index size = m_cholmodFactor->n; - EIGEN_UNUSED_VARIABLE(size); - eigen_assert(size==b.rows()); - - // note: cs stands for Cholmod Sparse - Ref > b_ref(b.const_cast_derived()); - cholmod_sparse b_cs = viewAsCholmod(b_ref); - cholmod_sparse* x_cs = internal::cm_spsolve(CHOLMOD_A, *m_cholmodFactor, b_cs, m_cholmod); - if(!x_cs) - { - this->m_info = NumericalIssue; - return; - } - // TODO optimize this copy by swapping when possible (be careful with alignment, etc.) - // NOTE cholmod_spsolve in fact just calls the dense solver for blocks of 4 columns at a time (similar to Eigen's sparse solver) - dest.derived() = viewAsEigen(*x_cs); - internal::cm_free_sparse(x_cs, m_cholmod); - } - #endif // EIGEN_PARSED_BY_DOXYGEN - - - /** Sets the shift parameter that will be used to adjust the diagonal coefficients during the numerical factorization. - * - * During the numerical factorization, an offset term is added to the diagonal coefficients:\n - * \c d_ii = \a offset + \c d_ii - * - * The default is \a offset=0. - * - * \returns a reference to \c *this. - */ - Derived& setShift(const RealScalar& offset) - { - m_shiftOffset[0] = double(offset); - return derived(); - } - - /** \returns the determinant of the underlying matrix from the current factorization */ - Scalar determinant() const - { - using std::exp; - return exp(logDeterminant()); - } - - /** \returns the log determinant of the underlying matrix from the current factorization */ - Scalar logDeterminant() const - { - using std::log; - using numext::real; - eigen_assert(m_factorizationIsOk && "The decomposition is not in a valid state for solving, you must first call either compute() or symbolic()/numeric()"); - - RealScalar logDet = 0; - Scalar *x = static_cast(m_cholmodFactor->x); - if (m_cholmodFactor->is_super) - { - // Supernodal factorization stored as a packed list of dense column-major blocs, - // as described by the following structure: - - // super[k] == index of the first column of the j-th super node - StorageIndex *super = static_cast(m_cholmodFactor->super); - // pi[k] == offset to the description of row indices - StorageIndex *pi = static_cast(m_cholmodFactor->pi); - // px[k] == offset to the respective dense block - StorageIndex *px = static_cast(m_cholmodFactor->px); - - Index nb_super_nodes = m_cholmodFactor->nsuper; - for (Index k=0; k < nb_super_nodes; ++k) - { - StorageIndex ncols = super[k + 1] - super[k]; - StorageIndex nrows = pi[k + 1] - pi[k]; - - Map, 0, InnerStride<> > sk(x + px[k], ncols, InnerStride<>(nrows+1)); - logDet += sk.real().log().sum(); - } - } - else - { - // Simplicial factorization stored as standard CSC matrix. - StorageIndex *p = static_cast(m_cholmodFactor->p); - Index size = m_cholmodFactor->n; - for (Index k=0; kis_ll) - logDet *= 2.0; - return logDet; - }; - - template - void dumpMemory(Stream& /*s*/) - {} - - protected: - mutable cholmod_common m_cholmod; - cholmod_factor* m_cholmodFactor; - double m_shiftOffset[2]; - mutable ComputationInfo m_info; - int m_factorizationIsOk; - int m_analysisIsOk; -}; - -/** \ingroup CholmodSupport_Module - * \class CholmodSimplicialLLT - * \brief A simplicial direct Cholesky (LLT) factorization and solver based on Cholmod - * - * This class allows to solve for A.X = B sparse linear problems via a simplicial LL^T Cholesky factorization - * using the Cholmod library. - * This simplicial variant is equivalent to Eigen's built-in SimplicialLLT class. Therefore, it has little practical interest. - * The sparse matrix A must be selfadjoint and positive definite. The vectors or matrices - * X and B can be either dense or sparse. - * - * \tparam _MatrixType the type of the sparse matrix A, it must be a SparseMatrix<> - * \tparam _UpLo the triangular part that will be used for the computations. It can be Lower - * or Upper. Default is Lower. - * - * \implsparsesolverconcept - * - * This class supports all kind of SparseMatrix<>: row or column major; upper, lower, or both; compressed or non compressed. - * - * \warning Only double precision real and complex scalar types are supported by Cholmod. - * - * \sa \ref TutorialSparseSolverConcept, class CholmodSupernodalLLT, class SimplicialLLT - */ -template -class CholmodSimplicialLLT : public CholmodBase<_MatrixType, _UpLo, CholmodSimplicialLLT<_MatrixType, _UpLo> > -{ - typedef CholmodBase<_MatrixType, _UpLo, CholmodSimplicialLLT> Base; - using Base::m_cholmod; - - public: - - typedef _MatrixType MatrixType; - - CholmodSimplicialLLT() : Base() { init(); } - - CholmodSimplicialLLT(const MatrixType& matrix) : Base() - { - init(); - this->compute(matrix); - } - - ~CholmodSimplicialLLT() {} - protected: - void init() - { - m_cholmod.final_asis = 0; - m_cholmod.supernodal = CHOLMOD_SIMPLICIAL; - m_cholmod.final_ll = 1; - } -}; - - -/** \ingroup CholmodSupport_Module - * \class CholmodSimplicialLDLT - * \brief A simplicial direct Cholesky (LDLT) factorization and solver based on Cholmod - * - * This class allows to solve for A.X = B sparse linear problems via a simplicial LDL^T Cholesky factorization - * using the Cholmod library. - * This simplicial variant is equivalent to Eigen's built-in SimplicialLDLT class. Therefore, it has little practical interest. - * The sparse matrix A must be selfadjoint and positive definite. The vectors or matrices - * X and B can be either dense or sparse. - * - * \tparam _MatrixType the type of the sparse matrix A, it must be a SparseMatrix<> - * \tparam _UpLo the triangular part that will be used for the computations. It can be Lower - * or Upper. Default is Lower. - * - * \implsparsesolverconcept - * - * This class supports all kind of SparseMatrix<>: row or column major; upper, lower, or both; compressed or non compressed. - * - * \warning Only double precision real and complex scalar types are supported by Cholmod. - * - * \sa \ref TutorialSparseSolverConcept, class CholmodSupernodalLLT, class SimplicialLDLT - */ -template -class CholmodSimplicialLDLT : public CholmodBase<_MatrixType, _UpLo, CholmodSimplicialLDLT<_MatrixType, _UpLo> > -{ - typedef CholmodBase<_MatrixType, _UpLo, CholmodSimplicialLDLT> Base; - using Base::m_cholmod; - - public: - - typedef _MatrixType MatrixType; - - CholmodSimplicialLDLT() : Base() { init(); } - - CholmodSimplicialLDLT(const MatrixType& matrix) : Base() - { - init(); - this->compute(matrix); - } - - ~CholmodSimplicialLDLT() {} - protected: - void init() - { - m_cholmod.final_asis = 1; - m_cholmod.supernodal = CHOLMOD_SIMPLICIAL; - } -}; - -/** \ingroup CholmodSupport_Module - * \class CholmodSupernodalLLT - * \brief A supernodal Cholesky (LLT) factorization and solver based on Cholmod - * - * This class allows to solve for A.X = B sparse linear problems via a supernodal LL^T Cholesky factorization - * using the Cholmod library. - * This supernodal variant performs best on dense enough problems, e.g., 3D FEM, or very high order 2D FEM. - * The sparse matrix A must be selfadjoint and positive definite. The vectors or matrices - * X and B can be either dense or sparse. - * - * \tparam _MatrixType the type of the sparse matrix A, it must be a SparseMatrix<> - * \tparam _UpLo the triangular part that will be used for the computations. It can be Lower - * or Upper. Default is Lower. - * - * \implsparsesolverconcept - * - * This class supports all kind of SparseMatrix<>: row or column major; upper, lower, or both; compressed or non compressed. - * - * \warning Only double precision real and complex scalar types are supported by Cholmod. - * - * \sa \ref TutorialSparseSolverConcept - */ -template -class CholmodSupernodalLLT : public CholmodBase<_MatrixType, _UpLo, CholmodSupernodalLLT<_MatrixType, _UpLo> > -{ - typedef CholmodBase<_MatrixType, _UpLo, CholmodSupernodalLLT> Base; - using Base::m_cholmod; - - public: - - typedef _MatrixType MatrixType; - - CholmodSupernodalLLT() : Base() { init(); } - - CholmodSupernodalLLT(const MatrixType& matrix) : Base() - { - init(); - this->compute(matrix); - } - - ~CholmodSupernodalLLT() {} - protected: - void init() - { - m_cholmod.final_asis = 1; - m_cholmod.supernodal = CHOLMOD_SUPERNODAL; - } -}; - -/** \ingroup CholmodSupport_Module - * \class CholmodDecomposition - * \brief A general Cholesky factorization and solver based on Cholmod - * - * This class allows to solve for A.X = B sparse linear problems via a LL^T or LDL^T Cholesky factorization - * using the Cholmod library. The sparse matrix A must be selfadjoint and positive definite. The vectors or matrices - * X and B can be either dense or sparse. - * - * This variant permits to change the underlying Cholesky method at runtime. - * On the other hand, it does not provide access to the result of the factorization. - * The default is to let Cholmod automatically choose between a simplicial and supernodal factorization. - * - * \tparam _MatrixType the type of the sparse matrix A, it must be a SparseMatrix<> - * \tparam _UpLo the triangular part that will be used for the computations. It can be Lower - * or Upper. Default is Lower. - * - * \implsparsesolverconcept - * - * This class supports all kind of SparseMatrix<>: row or column major; upper, lower, or both; compressed or non compressed. - * - * \warning Only double precision real and complex scalar types are supported by Cholmod. - * - * \sa \ref TutorialSparseSolverConcept - */ -template -class CholmodDecomposition : public CholmodBase<_MatrixType, _UpLo, CholmodDecomposition<_MatrixType, _UpLo> > -{ - typedef CholmodBase<_MatrixType, _UpLo, CholmodDecomposition> Base; - using Base::m_cholmod; - - public: - - typedef _MatrixType MatrixType; - - CholmodDecomposition() : Base() { init(); } - - CholmodDecomposition(const MatrixType& matrix) : Base() - { - init(); - this->compute(matrix); - } - - ~CholmodDecomposition() {} - - void setMode(CholmodMode mode) - { - switch(mode) - { - case CholmodAuto: - m_cholmod.final_asis = 1; - m_cholmod.supernodal = CHOLMOD_AUTO; - break; - case CholmodSimplicialLLt: - m_cholmod.final_asis = 0; - m_cholmod.supernodal = CHOLMOD_SIMPLICIAL; - m_cholmod.final_ll = 1; - break; - case CholmodSupernodalLLt: - m_cholmod.final_asis = 1; - m_cholmod.supernodal = CHOLMOD_SUPERNODAL; - break; - case CholmodLDLt: - m_cholmod.final_asis = 1; - m_cholmod.supernodal = CHOLMOD_SIMPLICIAL; - break; - default: - break; - } - } - protected: - void init() - { - m_cholmod.final_asis = 1; - m_cholmod.supernodal = CHOLMOD_AUTO; - } -}; - -} // end namespace Eigen - -#endif // EIGEN_CHOLMODSUPPORT_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/ArithmeticSequence.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/ArithmeticSequence.h deleted file mode 100644 index ada1571f..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/ArithmeticSequence.h +++ /dev/null @@ -1,350 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2017 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_ARITHMETIC_SEQUENCE_H -#define EIGEN_ARITHMETIC_SEQUENCE_H - -namespace Eigen { - -namespace internal { - -#if (!EIGEN_HAS_CXX11) || !((!EIGEN_COMP_GNUC) || EIGEN_COMP_GNUC>=48) -template struct aseq_negate {}; - -template<> struct aseq_negate { - typedef Index type; -}; - -template struct aseq_negate > { - typedef FixedInt<-N> type; -}; - -// Compilation error in the following case: -template<> struct aseq_negate > {}; - -template::value, - bool SizeIsSymbolic =Symbolic::is_symbolic::value> -struct aseq_reverse_first_type { - typedef Index type; -}; - -template -struct aseq_reverse_first_type { - typedef Symbolic::AddExpr > >, - Symbolic::ValueExpr > - > type; -}; - -template -struct aseq_reverse_first_type_aux { - typedef Index type; -}; - -template -struct aseq_reverse_first_type_aux::type> { - typedef FixedInt<(SizeType::value-1)*IncrType::value> type; -}; - -template -struct aseq_reverse_first_type { - typedef typename aseq_reverse_first_type_aux::type Aux; - typedef Symbolic::AddExpr > type; -}; - -template -struct aseq_reverse_first_type { - typedef Symbolic::AddExpr > >, - Symbolic::ValueExpr >, - Symbolic::ValueExpr<> > type; -}; -#endif - -// Helper to cleanup the type of the increment: -template struct cleanup_seq_incr { - typedef typename cleanup_index_type::type type; -}; - -} - -//-------------------------------------------------------------------------------- -// seq(first,last,incr) and seqN(first,size,incr) -//-------------------------------------------------------------------------------- - -template > -class ArithmeticSequence; - -template -ArithmeticSequence::type, - typename internal::cleanup_index_type::type, - typename internal::cleanup_seq_incr::type > -seqN(FirstType first, SizeType size, IncrType incr); - -/** \class ArithmeticSequence - * \ingroup Core_Module - * - * This class represents an arithmetic progression \f$ a_0, a_1, a_2, ..., a_{n-1}\f$ defined by - * its \em first value \f$ a_0 \f$, its \em size (aka length) \em n, and the \em increment (aka stride) - * that is equal to \f$ a_{i+1}-a_{i}\f$ for any \em i. - * - * It is internally used as the return type of the Eigen::seq and Eigen::seqN functions, and as the input arguments - * of DenseBase::operator()(const RowIndices&, const ColIndices&), and most of the time this is the - * only way it is used. - * - * \tparam FirstType type of the first element, usually an Index, - * but internally it can be a symbolic expression - * \tparam SizeType type representing the size of the sequence, usually an Index - * or a compile time integral constant. Internally, it can also be a symbolic expression - * \tparam IncrType type of the increment, can be a runtime Index, or a compile time integral constant (default is compile-time 1) - * - * \sa Eigen::seq, Eigen::seqN, DenseBase::operator()(const RowIndices&, const ColIndices&), class IndexedView - */ -template -class ArithmeticSequence -{ -public: - ArithmeticSequence(FirstType first, SizeType size) : m_first(first), m_size(size) {} - ArithmeticSequence(FirstType first, SizeType size, IncrType incr) : m_first(first), m_size(size), m_incr(incr) {} - - enum { - SizeAtCompileTime = internal::get_fixed_value::value, - IncrAtCompileTime = internal::get_fixed_value::value - }; - - /** \returns the size, i.e., number of elements, of the sequence */ - Index size() const { return m_size; } - - /** \returns the first element \f$ a_0 \f$ in the sequence */ - Index first() const { return m_first; } - - /** \returns the value \f$ a_i \f$ at index \a i in the sequence. */ - Index operator[](Index i) const { return m_first + i * m_incr; } - - const FirstType& firstObject() const { return m_first; } - const SizeType& sizeObject() const { return m_size; } - const IncrType& incrObject() const { return m_incr; } - -protected: - FirstType m_first; - SizeType m_size; - IncrType m_incr; - -public: - -#if EIGEN_HAS_CXX11 && ((!EIGEN_COMP_GNUC) || EIGEN_COMP_GNUC>=48) - auto reverse() const -> decltype(Eigen::seqN(m_first+(m_size+fix<-1>())*m_incr,m_size,-m_incr)) { - return seqN(m_first+(m_size+fix<-1>())*m_incr,m_size,-m_incr); - } -#else -protected: - typedef typename internal::aseq_negate::type ReverseIncrType; - typedef typename internal::aseq_reverse_first_type::type ReverseFirstType; -public: - ArithmeticSequence - reverse() const { - return seqN(m_first+(m_size+fix<-1>())*m_incr,m_size,-m_incr); - } -#endif -}; - -/** \returns an ArithmeticSequence starting at \a first, of length \a size, and increment \a incr - * - * \sa seqN(FirstType,SizeType), seq(FirstType,LastType,IncrType) */ -template -ArithmeticSequence::type,typename internal::cleanup_index_type::type,typename internal::cleanup_seq_incr::type > -seqN(FirstType first, SizeType size, IncrType incr) { - return ArithmeticSequence::type,typename internal::cleanup_index_type::type,typename internal::cleanup_seq_incr::type>(first,size,incr); -} - -/** \returns an ArithmeticSequence starting at \a first, of length \a size, and unit increment - * - * \sa seqN(FirstType,SizeType,IncrType), seq(FirstType,LastType) */ -template -ArithmeticSequence::type,typename internal::cleanup_index_type::type > -seqN(FirstType first, SizeType size) { - return ArithmeticSequence::type,typename internal::cleanup_index_type::type>(first,size); -} - -#ifdef EIGEN_PARSED_BY_DOXYGEN - -/** \returns an ArithmeticSequence starting at \a f, up (or down) to \a l, and with positive (or negative) increment \a incr - * - * It is essentially an alias to: - * \code - * seqN(f, (l-f+incr)/incr, incr); - * \endcode - * - * \sa seqN(FirstType,SizeType,IncrType), seq(FirstType,LastType) - */ -template -auto seq(FirstType f, LastType l, IncrType incr); - -/** \returns an ArithmeticSequence starting at \a f, up (or down) to \a l, and unit increment - * - * It is essentially an alias to: - * \code - * seqN(f,l-f+1); - * \endcode - * - * \sa seqN(FirstType,SizeType), seq(FirstType,LastType,IncrType) - */ -template -auto seq(FirstType f, LastType l); - -#else // EIGEN_PARSED_BY_DOXYGEN - -#if EIGEN_HAS_CXX11 -template -auto seq(FirstType f, LastType l) -> decltype(seqN(typename internal::cleanup_index_type::type(f), - ( typename internal::cleanup_index_type::type(l) - - typename internal::cleanup_index_type::type(f)+fix<1>()))) -{ - return seqN(typename internal::cleanup_index_type::type(f), - (typename internal::cleanup_index_type::type(l) - -typename internal::cleanup_index_type::type(f)+fix<1>())); -} - -template -auto seq(FirstType f, LastType l, IncrType incr) - -> decltype(seqN(typename internal::cleanup_index_type::type(f), - ( typename internal::cleanup_index_type::type(l) - - typename internal::cleanup_index_type::type(f)+typename internal::cleanup_seq_incr::type(incr) - ) / typename internal::cleanup_seq_incr::type(incr), - typename internal::cleanup_seq_incr::type(incr))) -{ - typedef typename internal::cleanup_seq_incr::type CleanedIncrType; - return seqN(typename internal::cleanup_index_type::type(f), - ( typename internal::cleanup_index_type::type(l) - -typename internal::cleanup_index_type::type(f)+CleanedIncrType(incr)) / CleanedIncrType(incr), - CleanedIncrType(incr)); -} -#else - -template -typename internal::enable_if::value || Symbolic::is_symbolic::value), - ArithmeticSequence::type,Index> >::type -seq(FirstType f, LastType l) -{ - return seqN(typename internal::cleanup_index_type::type(f), - Index((typename internal::cleanup_index_type::type(l)-typename internal::cleanup_index_type::type(f)+fix<1>()))); -} - -template -typename internal::enable_if::value, - ArithmeticSequence,Symbolic::ValueExpr<> >, - Symbolic::ValueExpr > > > >::type -seq(const Symbolic::BaseExpr &f, LastType l) -{ - return seqN(f.derived(),(typename internal::cleanup_index_type::type(l)-f.derived()+fix<1>())); -} - -template -typename internal::enable_if::value, - ArithmeticSequence::type, - Symbolic::AddExpr >, - Symbolic::ValueExpr > > > >::type -seq(FirstType f, const Symbolic::BaseExpr &l) -{ - return seqN(typename internal::cleanup_index_type::type(f),(l.derived()-typename internal::cleanup_index_type::type(f)+fix<1>())); -} - -template -ArithmeticSequence >,Symbolic::ValueExpr > > > -seq(const Symbolic::BaseExpr &f, const Symbolic::BaseExpr &l) -{ - return seqN(f.derived(),(l.derived()-f.derived()+fix<1>())); -} - - -template -typename internal::enable_if::value || Symbolic::is_symbolic::value), - ArithmeticSequence::type,Index,typename internal::cleanup_seq_incr::type> >::type -seq(FirstType f, LastType l, IncrType incr) -{ - typedef typename internal::cleanup_seq_incr::type CleanedIncrType; - return seqN(typename internal::cleanup_index_type::type(f), - Index((typename internal::cleanup_index_type::type(l)-typename internal::cleanup_index_type::type(f)+CleanedIncrType(incr))/CleanedIncrType(incr)), incr); -} - -template -typename internal::enable_if::value, - ArithmeticSequence, - Symbolic::ValueExpr<> >, - Symbolic::ValueExpr::type> >, - Symbolic::ValueExpr::type> >, - typename internal::cleanup_seq_incr::type> >::type -seq(const Symbolic::BaseExpr &f, LastType l, IncrType incr) -{ - typedef typename internal::cleanup_seq_incr::type CleanedIncrType; - return seqN(f.derived(),(typename internal::cleanup_index_type::type(l)-f.derived()+CleanedIncrType(incr))/CleanedIncrType(incr), incr); -} - -template -typename internal::enable_if::value, - ArithmeticSequence::type, - Symbolic::QuotientExpr >, - Symbolic::ValueExpr::type> >, - Symbolic::ValueExpr::type> >, - typename internal::cleanup_seq_incr::type> >::type -seq(FirstType f, const Symbolic::BaseExpr &l, IncrType incr) -{ - typedef typename internal::cleanup_seq_incr::type CleanedIncrType; - return seqN(typename internal::cleanup_index_type::type(f), - (l.derived()-typename internal::cleanup_index_type::type(f)+CleanedIncrType(incr))/CleanedIncrType(incr), incr); -} - -template -ArithmeticSequence >, - Symbolic::ValueExpr::type> >, - Symbolic::ValueExpr::type> >, - typename internal::cleanup_seq_incr::type> -seq(const Symbolic::BaseExpr &f, const Symbolic::BaseExpr &l, IncrType incr) -{ - typedef typename internal::cleanup_seq_incr::type CleanedIncrType; - return seqN(f.derived(),(l.derived()-f.derived()+CleanedIncrType(incr))/CleanedIncrType(incr), incr); -} -#endif - -#endif // EIGEN_PARSED_BY_DOXYGEN - -namespace internal { - -// Convert a symbolic span into a usable one (i.e., remove last/end "keywords") -template -struct make_size_type { - typedef typename internal::conditional::value, Index, T>::type type; -}; - -template -struct IndexedViewCompatibleType, XprSize> { - typedef ArithmeticSequence::type,IncrType> type; -}; - -template -ArithmeticSequence::type,IncrType> -makeIndexedViewCompatible(const ArithmeticSequence& ids, Index size,SpecializedType) { - return ArithmeticSequence::type,IncrType>( - eval_expr_given_size(ids.firstObject(),size),eval_expr_given_size(ids.sizeObject(),size),ids.incrObject()); -} - -template -struct get_compile_time_incr > { - enum { value = get_fixed_value::value }; -}; - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_ARITHMETIC_SEQUENCE_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Array.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Array.h deleted file mode 100644 index e10020d4..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Array.h +++ /dev/null @@ -1,331 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_ARRAY_H -#define EIGEN_ARRAY_H - -namespace Eigen { - -namespace internal { -template -struct traits > : traits > -{ - typedef ArrayXpr XprKind; - typedef ArrayBase > XprBase; -}; -} - -/** \class Array - * \ingroup Core_Module - * - * \brief General-purpose arrays with easy API for coefficient-wise operations - * - * The %Array class is very similar to the Matrix class. It provides - * general-purpose one- and two-dimensional arrays. The difference between the - * %Array and the %Matrix class is primarily in the API: the API for the - * %Array class provides easy access to coefficient-wise operations, while the - * API for the %Matrix class provides easy access to linear-algebra - * operations. - * - * See documentation of class Matrix for detailed information on the template parameters - * storage layout. - * - * This class can be extended with the help of the plugin mechanism described on the page - * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_ARRAY_PLUGIN. - * - * \sa \blank \ref TutorialArrayClass, \ref TopicClassHierarchy - */ -template -class Array - : public PlainObjectBase > -{ - public: - - typedef PlainObjectBase Base; - EIGEN_DENSE_PUBLIC_INTERFACE(Array) - - enum { Options = _Options }; - typedef typename Base::PlainObject PlainObject; - - protected: - template - friend struct internal::conservative_resize_like_impl; - - using Base::m_storage; - - public: - - using Base::base; - using Base::coeff; - using Base::coeffRef; - - /** - * The usage of - * using Base::operator=; - * fails on MSVC. Since the code below is working with GCC and MSVC, we skipped - * the usage of 'using'. This should be done only for operator=. - */ - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Array& operator=(const EigenBase &other) - { - return Base::operator=(other); - } - - /** Set all the entries to \a value. - * \sa DenseBase::setConstant(), DenseBase::fill() - */ - /* This overload is needed because the usage of - * using Base::operator=; - * fails on MSVC. Since the code below is working with GCC and MSVC, we skipped - * the usage of 'using'. This should be done only for operator=. - */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Array& operator=(const Scalar &value) - { - Base::setConstant(value); - return *this; - } - - /** Copies the value of the expression \a other into \c *this with automatic resizing. - * - * *this might be resized to match the dimensions of \a other. If *this was a null matrix (not already initialized), - * it will be initialized. - * - * Note that copying a row-vector into a vector (and conversely) is allowed. - * The resizing, if any, is then done in the appropriate way so that row-vectors - * remain row-vectors and vectors remain vectors. - */ - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Array& operator=(const DenseBase& other) - { - return Base::_set(other); - } - - /** This is a special case of the templated operator=. Its purpose is to - * prevent a default operator= from hiding the templated operator=. - */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Array& operator=(const Array& other) - { - return Base::_set(other); - } - - /** Default constructor. - * - * For fixed-size matrices, does nothing. - * - * For dynamic-size matrices, creates an empty matrix of size 0. Does not allocate any array. Such a matrix - * is called a null matrix. This constructor is the unique way to create null matrices: resizing - * a matrix to 0 is not supported. - * - * \sa resize(Index,Index) - */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Array() : Base() - { - Base::_check_template_params(); - EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED - } - -#ifndef EIGEN_PARSED_BY_DOXYGEN - // FIXME is it still needed ?? - /** \internal */ - EIGEN_DEVICE_FUNC - Array(internal::constructor_without_unaligned_array_assert) - : Base(internal::constructor_without_unaligned_array_assert()) - { - Base::_check_template_params(); - EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED - } -#endif - -#if EIGEN_HAS_RVALUE_REFERENCES - EIGEN_DEVICE_FUNC - Array(Array&& other) EIGEN_NOEXCEPT_IF(std::is_nothrow_move_constructible::value) - : Base(std::move(other)) - { - Base::_check_template_params(); - if (RowsAtCompileTime!=Dynamic && ColsAtCompileTime!=Dynamic) - Base::_set_noalias(other); - } - EIGEN_DEVICE_FUNC - Array& operator=(Array&& other) EIGEN_NOEXCEPT_IF(std::is_nothrow_move_assignable::value) - { - other.swap(*this); - return *this; - } -#endif - - #ifndef EIGEN_PARSED_BY_DOXYGEN - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE explicit Array(const T& x) - { - Base::_check_template_params(); - Base::template _init1(x); - } - - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Array(const T0& val0, const T1& val1) - { - Base::_check_template_params(); - this->template _init2(val0, val1); - } - #else - /** \brief Constructs a fixed-sized array initialized with coefficients starting at \a data */ - EIGEN_DEVICE_FUNC explicit Array(const Scalar *data); - /** Constructs a vector or row-vector with given dimension. \only_for_vectors - * - * Note that this is only useful for dynamic-size vectors. For fixed-size vectors, - * it is redundant to pass the dimension here, so it makes more sense to use the default - * constructor Array() instead. - */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE explicit Array(Index dim); - /** constructs an initialized 1x1 Array with the given coefficient */ - Array(const Scalar& value); - /** constructs an uninitialized array with \a rows rows and \a cols columns. - * - * This is useful for dynamic-size arrays. For fixed-size arrays, - * it is redundant to pass these parameters, so one should use the default constructor - * Array() instead. */ - Array(Index rows, Index cols); - /** constructs an initialized 2D vector with given coefficients */ - Array(const Scalar& val0, const Scalar& val1); - #endif - - /** constructs an initialized 3D vector with given coefficients */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Array(const Scalar& val0, const Scalar& val1, const Scalar& val2) - { - Base::_check_template_params(); - EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Array, 3) - m_storage.data()[0] = val0; - m_storage.data()[1] = val1; - m_storage.data()[2] = val2; - } - /** constructs an initialized 4D vector with given coefficients */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Array(const Scalar& val0, const Scalar& val1, const Scalar& val2, const Scalar& val3) - { - Base::_check_template_params(); - EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Array, 4) - m_storage.data()[0] = val0; - m_storage.data()[1] = val1; - m_storage.data()[2] = val2; - m_storage.data()[3] = val3; - } - - /** Copy constructor */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Array(const Array& other) - : Base(other) - { } - - private: - struct PrivateType {}; - public: - - /** \sa MatrixBase::operator=(const EigenBase&) */ - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Array(const EigenBase &other, - typename internal::enable_if::value, - PrivateType>::type = PrivateType()) - : Base(other.derived()) - { } - - EIGEN_DEVICE_FUNC inline Index innerStride() const { return 1; } - EIGEN_DEVICE_FUNC inline Index outerStride() const { return this->innerSize(); } - - #ifdef EIGEN_ARRAY_PLUGIN - #include EIGEN_ARRAY_PLUGIN - #endif - - private: - - template - friend struct internal::matrix_swap_impl; -}; - -/** \defgroup arraytypedefs Global array typedefs - * \ingroup Core_Module - * - * Eigen defines several typedef shortcuts for most common 1D and 2D array types. - * - * The general patterns are the following: - * - * \c ArrayRowsColsType where \c Rows and \c Cols can be \c 2,\c 3,\c 4 for fixed size square matrices or \c X for dynamic size, - * and where \c Type can be \c i for integer, \c f for float, \c d for double, \c cf for complex float, \c cd - * for complex double. - * - * For example, \c Array33d is a fixed-size 3x3 array type of doubles, and \c ArrayXXf is a dynamic-size matrix of floats. - * - * There are also \c ArraySizeType which are self-explanatory. For example, \c Array4cf is - * a fixed-size 1D array of 4 complex floats. - * - * \sa class Array - */ - -#define EIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, Size, SizeSuffix) \ -/** \ingroup arraytypedefs */ \ -typedef Array Array##SizeSuffix##SizeSuffix##TypeSuffix; \ -/** \ingroup arraytypedefs */ \ -typedef Array Array##SizeSuffix##TypeSuffix; - -#define EIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, Size) \ -/** \ingroup arraytypedefs */ \ -typedef Array Array##Size##X##TypeSuffix; \ -/** \ingroup arraytypedefs */ \ -typedef Array Array##X##Size##TypeSuffix; - -#define EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(Type, TypeSuffix) \ -EIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, 2, 2) \ -EIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, 3, 3) \ -EIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, 4, 4) \ -EIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, Dynamic, X) \ -EIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, 2) \ -EIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, 3) \ -EIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, 4) - -EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(int, i) -EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(float, f) -EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(double, d) -EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(std::complex, cf) -EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(std::complex, cd) - -#undef EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES -#undef EIGEN_MAKE_ARRAY_TYPEDEFS - -#undef EIGEN_MAKE_ARRAY_TYPEDEFS_LARGE - -#define EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, SizeSuffix) \ -using Eigen::Matrix##SizeSuffix##TypeSuffix; \ -using Eigen::Vector##SizeSuffix##TypeSuffix; \ -using Eigen::RowVector##SizeSuffix##TypeSuffix; - -#define EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(TypeSuffix) \ -EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, 2) \ -EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, 3) \ -EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, 4) \ -EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, X) \ - -#define EIGEN_USING_ARRAY_TYPEDEFS \ -EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(i) \ -EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(f) \ -EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(d) \ -EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(cf) \ -EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(cd) - -} // end namespace Eigen - -#endif // EIGEN_ARRAY_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/ArrayBase.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/ArrayBase.h deleted file mode 100644 index 9da960f0..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/ArrayBase.h +++ /dev/null @@ -1,226 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_ARRAYBASE_H -#define EIGEN_ARRAYBASE_H - -namespace Eigen { - -template class MatrixWrapper; - -/** \class ArrayBase - * \ingroup Core_Module - * - * \brief Base class for all 1D and 2D array, and related expressions - * - * An array is similar to a dense vector or matrix. While matrices are mathematical - * objects with well defined linear algebra operators, an array is just a collection - * of scalar values arranged in a one or two dimensionnal fashion. As the main consequence, - * all operations applied to an array are performed coefficient wise. Furthermore, - * arrays support scalar math functions of the c++ standard library (e.g., std::sin(x)), and convenient - * constructors allowing to easily write generic code working for both scalar values - * and arrays. - * - * This class is the base that is inherited by all array expression types. - * - * \tparam Derived is the derived type, e.g., an array or an expression type. - * - * This class can be extended with the help of the plugin mechanism described on the page - * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_ARRAYBASE_PLUGIN. - * - * \sa class MatrixBase, \ref TopicClassHierarchy - */ -template class ArrayBase - : public DenseBase -{ - public: -#ifndef EIGEN_PARSED_BY_DOXYGEN - /** The base class for a given storage type. */ - typedef ArrayBase StorageBaseType; - - typedef ArrayBase Eigen_BaseClassForSpecializationOfGlobalMathFuncImpl; - - typedef typename internal::traits::StorageKind StorageKind; - typedef typename internal::traits::Scalar Scalar; - typedef typename internal::packet_traits::type PacketScalar; - typedef typename NumTraits::Real RealScalar; - - typedef DenseBase Base; - using Base::RowsAtCompileTime; - using Base::ColsAtCompileTime; - using Base::SizeAtCompileTime; - using Base::MaxRowsAtCompileTime; - using Base::MaxColsAtCompileTime; - using Base::MaxSizeAtCompileTime; - using Base::IsVectorAtCompileTime; - using Base::Flags; - - using Base::derived; - using Base::const_cast_derived; - using Base::rows; - using Base::cols; - using Base::size; - using Base::coeff; - using Base::coeffRef; - using Base::lazyAssign; - using Base::operator-; - using Base::operator=; - using Base::operator+=; - using Base::operator-=; - using Base::operator*=; - using Base::operator/=; - - typedef typename Base::CoeffReturnType CoeffReturnType; - -#endif // not EIGEN_PARSED_BY_DOXYGEN - -#ifndef EIGEN_PARSED_BY_DOXYGEN - typedef typename Base::PlainObject PlainObject; - - /** \internal Represents a matrix with all coefficients equal to one another*/ - typedef CwiseNullaryOp,PlainObject> ConstantReturnType; -#endif // not EIGEN_PARSED_BY_DOXYGEN - -#define EIGEN_CURRENT_STORAGE_BASE_CLASS Eigen::ArrayBase -#define EIGEN_DOC_UNARY_ADDONS(X,Y) -# include "../plugins/MatrixCwiseUnaryOps.h" -# include "../plugins/ArrayCwiseUnaryOps.h" -# include "../plugins/CommonCwiseBinaryOps.h" -# include "../plugins/MatrixCwiseBinaryOps.h" -# include "../plugins/ArrayCwiseBinaryOps.h" -# ifdef EIGEN_ARRAYBASE_PLUGIN -# include EIGEN_ARRAYBASE_PLUGIN -# endif -#undef EIGEN_CURRENT_STORAGE_BASE_CLASS -#undef EIGEN_DOC_UNARY_ADDONS - - /** Special case of the template operator=, in order to prevent the compiler - * from generating a default operator= (issue hit with g++ 4.1) - */ - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Derived& operator=(const ArrayBase& other) - { - internal::call_assignment(derived(), other.derived()); - return derived(); - } - - /** Set all the entries to \a value. - * \sa DenseBase::setConstant(), DenseBase::fill() */ - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Derived& operator=(const Scalar &value) - { Base::setConstant(value); return derived(); } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Derived& operator+=(const Scalar& scalar); - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Derived& operator-=(const Scalar& scalar); - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Derived& operator+=(const ArrayBase& other); - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Derived& operator-=(const ArrayBase& other); - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Derived& operator*=(const ArrayBase& other); - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Derived& operator/=(const ArrayBase& other); - - public: - EIGEN_DEVICE_FUNC - ArrayBase& array() { return *this; } - EIGEN_DEVICE_FUNC - const ArrayBase& array() const { return *this; } - - /** \returns an \link Eigen::MatrixBase Matrix \endlink expression of this array - * \sa MatrixBase::array() */ - EIGEN_DEVICE_FUNC - MatrixWrapper matrix() { return MatrixWrapper(derived()); } - EIGEN_DEVICE_FUNC - const MatrixWrapper matrix() const { return MatrixWrapper(derived()); } - -// template -// inline void evalTo(Dest& dst) const { dst = matrix(); } - - protected: - EIGEN_DEVICE_FUNC - ArrayBase() : Base() {} - - private: - explicit ArrayBase(Index); - ArrayBase(Index,Index); - template explicit ArrayBase(const ArrayBase&); - protected: - // mixing arrays and matrices is not legal - template Derived& operator+=(const MatrixBase& ) - {EIGEN_STATIC_ASSERT(std::ptrdiff_t(sizeof(typename OtherDerived::Scalar))==-1,YOU_CANNOT_MIX_ARRAYS_AND_MATRICES); return *this;} - // mixing arrays and matrices is not legal - template Derived& operator-=(const MatrixBase& ) - {EIGEN_STATIC_ASSERT(std::ptrdiff_t(sizeof(typename OtherDerived::Scalar))==-1,YOU_CANNOT_MIX_ARRAYS_AND_MATRICES); return *this;} -}; - -/** replaces \c *this by \c *this - \a other. - * - * \returns a reference to \c *this - */ -template -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived & -ArrayBase::operator-=(const ArrayBase &other) -{ - call_assignment(derived(), other.derived(), internal::sub_assign_op()); - return derived(); -} - -/** replaces \c *this by \c *this + \a other. - * - * \returns a reference to \c *this - */ -template -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived & -ArrayBase::operator+=(const ArrayBase& other) -{ - call_assignment(derived(), other.derived(), internal::add_assign_op()); - return derived(); -} - -/** replaces \c *this by \c *this * \a other coefficient wise. - * - * \returns a reference to \c *this - */ -template -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived & -ArrayBase::operator*=(const ArrayBase& other) -{ - call_assignment(derived(), other.derived(), internal::mul_assign_op()); - return derived(); -} - -/** replaces \c *this by \c *this / \a other coefficient wise. - * - * \returns a reference to \c *this - */ -template -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived & -ArrayBase::operator/=(const ArrayBase& other) -{ - call_assignment(derived(), other.derived(), internal::div_assign_op()); - return derived(); -} - -} // end namespace Eigen - -#endif // EIGEN_ARRAYBASE_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/ArrayWrapper.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/ArrayWrapper.h deleted file mode 100644 index 688aadd6..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/ArrayWrapper.h +++ /dev/null @@ -1,209 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009-2010 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_ARRAYWRAPPER_H -#define EIGEN_ARRAYWRAPPER_H - -namespace Eigen { - -/** \class ArrayWrapper - * \ingroup Core_Module - * - * \brief Expression of a mathematical vector or matrix as an array object - * - * This class is the return type of MatrixBase::array(), and most of the time - * this is the only way it is use. - * - * \sa MatrixBase::array(), class MatrixWrapper - */ - -namespace internal { -template -struct traits > - : public traits::type > -{ - typedef ArrayXpr XprKind; - // Let's remove NestByRefBit - enum { - Flags0 = traits::type >::Flags, - LvalueBitFlag = is_lvalue::value ? LvalueBit : 0, - Flags = (Flags0 & ~(NestByRefBit | LvalueBit)) | LvalueBitFlag - }; -}; -} - -template -class ArrayWrapper : public ArrayBase > -{ - public: - typedef ArrayBase Base; - EIGEN_DENSE_PUBLIC_INTERFACE(ArrayWrapper) - EIGEN_INHERIT_ASSIGNMENT_OPERATORS(ArrayWrapper) - typedef typename internal::remove_all::type NestedExpression; - - typedef typename internal::conditional< - internal::is_lvalue::value, - Scalar, - const Scalar - >::type ScalarWithConstIfNotLvalue; - - typedef typename internal::ref_selector::non_const_type NestedExpressionType; - - using Base::coeffRef; - - EIGEN_DEVICE_FUNC - explicit EIGEN_STRONG_INLINE ArrayWrapper(ExpressionType& matrix) : m_expression(matrix) {} - - EIGEN_DEVICE_FUNC - inline Index rows() const { return m_expression.rows(); } - EIGEN_DEVICE_FUNC - inline Index cols() const { return m_expression.cols(); } - EIGEN_DEVICE_FUNC - inline Index outerStride() const { return m_expression.outerStride(); } - EIGEN_DEVICE_FUNC - inline Index innerStride() const { return m_expression.innerStride(); } - - EIGEN_DEVICE_FUNC - inline ScalarWithConstIfNotLvalue* data() { return m_expression.data(); } - EIGEN_DEVICE_FUNC - inline const Scalar* data() const { return m_expression.data(); } - - EIGEN_DEVICE_FUNC - inline const Scalar& coeffRef(Index rowId, Index colId) const - { - return m_expression.coeffRef(rowId, colId); - } - - EIGEN_DEVICE_FUNC - inline const Scalar& coeffRef(Index index) const - { - return m_expression.coeffRef(index); - } - - template - EIGEN_DEVICE_FUNC - inline void evalTo(Dest& dst) const { dst = m_expression; } - - const typename internal::remove_all::type& - EIGEN_DEVICE_FUNC - nestedExpression() const - { - return m_expression; - } - - /** Forwards the resizing request to the nested expression - * \sa DenseBase::resize(Index) */ - EIGEN_DEVICE_FUNC - void resize(Index newSize) { m_expression.resize(newSize); } - /** Forwards the resizing request to the nested expression - * \sa DenseBase::resize(Index,Index)*/ - EIGEN_DEVICE_FUNC - void resize(Index rows, Index cols) { m_expression.resize(rows,cols); } - - protected: - NestedExpressionType m_expression; -}; - -/** \class MatrixWrapper - * \ingroup Core_Module - * - * \brief Expression of an array as a mathematical vector or matrix - * - * This class is the return type of ArrayBase::matrix(), and most of the time - * this is the only way it is use. - * - * \sa MatrixBase::matrix(), class ArrayWrapper - */ - -namespace internal { -template -struct traits > - : public traits::type > -{ - typedef MatrixXpr XprKind; - // Let's remove NestByRefBit - enum { - Flags0 = traits::type >::Flags, - LvalueBitFlag = is_lvalue::value ? LvalueBit : 0, - Flags = (Flags0 & ~(NestByRefBit | LvalueBit)) | LvalueBitFlag - }; -}; -} - -template -class MatrixWrapper : public MatrixBase > -{ - public: - typedef MatrixBase > Base; - EIGEN_DENSE_PUBLIC_INTERFACE(MatrixWrapper) - EIGEN_INHERIT_ASSIGNMENT_OPERATORS(MatrixWrapper) - typedef typename internal::remove_all::type NestedExpression; - - typedef typename internal::conditional< - internal::is_lvalue::value, - Scalar, - const Scalar - >::type ScalarWithConstIfNotLvalue; - - typedef typename internal::ref_selector::non_const_type NestedExpressionType; - - using Base::coeffRef; - - EIGEN_DEVICE_FUNC - explicit inline MatrixWrapper(ExpressionType& matrix) : m_expression(matrix) {} - - EIGEN_DEVICE_FUNC - inline Index rows() const { return m_expression.rows(); } - EIGEN_DEVICE_FUNC - inline Index cols() const { return m_expression.cols(); } - EIGEN_DEVICE_FUNC - inline Index outerStride() const { return m_expression.outerStride(); } - EIGEN_DEVICE_FUNC - inline Index innerStride() const { return m_expression.innerStride(); } - - EIGEN_DEVICE_FUNC - inline ScalarWithConstIfNotLvalue* data() { return m_expression.data(); } - EIGEN_DEVICE_FUNC - inline const Scalar* data() const { return m_expression.data(); } - - EIGEN_DEVICE_FUNC - inline const Scalar& coeffRef(Index rowId, Index colId) const - { - return m_expression.derived().coeffRef(rowId, colId); - } - - EIGEN_DEVICE_FUNC - inline const Scalar& coeffRef(Index index) const - { - return m_expression.coeffRef(index); - } - - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& - nestedExpression() const - { - return m_expression; - } - - /** Forwards the resizing request to the nested expression - * \sa DenseBase::resize(Index) */ - EIGEN_DEVICE_FUNC - void resize(Index newSize) { m_expression.resize(newSize); } - /** Forwards the resizing request to the nested expression - * \sa DenseBase::resize(Index,Index)*/ - EIGEN_DEVICE_FUNC - void resize(Index rows, Index cols) { m_expression.resize(rows,cols); } - - protected: - NestedExpressionType m_expression; -}; - -} // end namespace Eigen - -#endif // EIGEN_ARRAYWRAPPER_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Assign.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Assign.h deleted file mode 100644 index 655412ef..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Assign.h +++ /dev/null @@ -1,90 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2007 Michael Olbrich -// Copyright (C) 2006-2010 Benoit Jacob -// Copyright (C) 2008 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_ASSIGN_H -#define EIGEN_ASSIGN_H - -namespace Eigen { - -template -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase - ::lazyAssign(const DenseBase& other) -{ - enum{ - SameType = internal::is_same::value - }; - - EIGEN_STATIC_ASSERT_LVALUE(Derived) - EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Derived,OtherDerived) - EIGEN_STATIC_ASSERT(SameType,YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY) - - eigen_assert(rows() == other.rows() && cols() == other.cols()); - internal::call_assignment_no_alias(derived(),other.derived()); - - return derived(); -} - -template -template -EIGEN_DEVICE_FUNC -EIGEN_STRONG_INLINE Derived& DenseBase::operator=(const DenseBase& other) -{ - internal::call_assignment(derived(), other.derived()); - return derived(); -} - -template -EIGEN_DEVICE_FUNC -EIGEN_STRONG_INLINE Derived& DenseBase::operator=(const DenseBase& other) -{ - internal::call_assignment(derived(), other.derived()); - return derived(); -} - -template -EIGEN_DEVICE_FUNC -EIGEN_STRONG_INLINE Derived& MatrixBase::operator=(const MatrixBase& other) -{ - internal::call_assignment(derived(), other.derived()); - return derived(); -} - -template -template -EIGEN_DEVICE_FUNC -EIGEN_STRONG_INLINE Derived& MatrixBase::operator=(const DenseBase& other) -{ - internal::call_assignment(derived(), other.derived()); - return derived(); -} - -template -template -EIGEN_DEVICE_FUNC -EIGEN_STRONG_INLINE Derived& MatrixBase::operator=(const EigenBase& other) -{ - internal::call_assignment(derived(), other.derived()); - return derived(); -} - -template -template -EIGEN_DEVICE_FUNC -EIGEN_STRONG_INLINE Derived& MatrixBase::operator=(const ReturnByValue& other) -{ - other.derived().evalTo(derived()); - return derived(); -} - -} // end namespace Eigen - -#endif // EIGEN_ASSIGN_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/AssignEvaluator.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/AssignEvaluator.h deleted file mode 100644 index dbe435d8..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/AssignEvaluator.h +++ /dev/null @@ -1,935 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2011 Benoit Jacob -// Copyright (C) 2011-2014 Gael Guennebaud -// Copyright (C) 2011-2012 Jitse Niesen -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_ASSIGN_EVALUATOR_H -#define EIGEN_ASSIGN_EVALUATOR_H - -namespace Eigen { - -// This implementation is based on Assign.h - -namespace internal { - -/*************************************************************************** -* Part 1 : the logic deciding a strategy for traversal and unrolling * -***************************************************************************/ - -// copy_using_evaluator_traits is based on assign_traits - -template -struct copy_using_evaluator_traits -{ - typedef typename DstEvaluator::XprType Dst; - typedef typename Dst::Scalar DstScalar; - - enum { - DstFlags = DstEvaluator::Flags, - SrcFlags = SrcEvaluator::Flags - }; - -public: - enum { - DstAlignment = DstEvaluator::Alignment, - SrcAlignment = SrcEvaluator::Alignment, - DstHasDirectAccess = (DstFlags & DirectAccessBit) == DirectAccessBit, - JointAlignment = EIGEN_PLAIN_ENUM_MIN(DstAlignment,SrcAlignment) - }; - -private: - enum { - InnerSize = int(Dst::IsVectorAtCompileTime) ? int(Dst::SizeAtCompileTime) - : int(DstFlags)&RowMajorBit ? int(Dst::ColsAtCompileTime) - : int(Dst::RowsAtCompileTime), - InnerMaxSize = int(Dst::IsVectorAtCompileTime) ? int(Dst::MaxSizeAtCompileTime) - : int(DstFlags)&RowMajorBit ? int(Dst::MaxColsAtCompileTime) - : int(Dst::MaxRowsAtCompileTime), - OuterStride = int(outer_stride_at_compile_time::ret), - MaxSizeAtCompileTime = Dst::SizeAtCompileTime - }; - - // TODO distinguish between linear traversal and inner-traversals - typedef typename find_best_packet::type LinearPacketType; - typedef typename find_best_packet::type InnerPacketType; - - enum { - LinearPacketSize = unpacket_traits::size, - InnerPacketSize = unpacket_traits::size - }; - -public: - enum { - LinearRequiredAlignment = unpacket_traits::alignment, - InnerRequiredAlignment = unpacket_traits::alignment - }; - -private: - enum { - DstIsRowMajor = DstFlags&RowMajorBit, - SrcIsRowMajor = SrcFlags&RowMajorBit, - StorageOrdersAgree = (int(DstIsRowMajor) == int(SrcIsRowMajor)), - MightVectorize = bool(StorageOrdersAgree) - && (int(DstFlags) & int(SrcFlags) & ActualPacketAccessBit) - && bool(functor_traits::PacketAccess), - MayInnerVectorize = MightVectorize - && int(InnerSize)!=Dynamic && int(InnerSize)%int(InnerPacketSize)==0 - && int(OuterStride)!=Dynamic && int(OuterStride)%int(InnerPacketSize)==0 - && (EIGEN_UNALIGNED_VECTORIZE || int(JointAlignment)>=int(InnerRequiredAlignment)), - MayLinearize = bool(StorageOrdersAgree) && (int(DstFlags) & int(SrcFlags) & LinearAccessBit), - MayLinearVectorize = bool(MightVectorize) && bool(MayLinearize) && bool(DstHasDirectAccess) - && (EIGEN_UNALIGNED_VECTORIZE || (int(DstAlignment)>=int(LinearRequiredAlignment)) || MaxSizeAtCompileTime == Dynamic), - /* If the destination isn't aligned, we have to do runtime checks and we don't unroll, - so it's only good for large enough sizes. */ - MaySliceVectorize = bool(MightVectorize) && bool(DstHasDirectAccess) - && (int(InnerMaxSize)==Dynamic || int(InnerMaxSize)>=(EIGEN_UNALIGNED_VECTORIZE?InnerPacketSize:(3*InnerPacketSize))) - /* slice vectorization can be slow, so we only want it if the slices are big, which is - indicated by InnerMaxSize rather than InnerSize, think of the case of a dynamic block - in a fixed-size matrix - However, with EIGEN_UNALIGNED_VECTORIZE and unrolling, slice vectorization is still worth it */ - }; - -public: - enum { - Traversal = int(MayLinearVectorize) && (LinearPacketSize>InnerPacketSize) ? int(LinearVectorizedTraversal) - : int(MayInnerVectorize) ? int(InnerVectorizedTraversal) - : int(MayLinearVectorize) ? int(LinearVectorizedTraversal) - : int(MaySliceVectorize) ? int(SliceVectorizedTraversal) - : int(MayLinearize) ? int(LinearTraversal) - : int(DefaultTraversal), - Vectorized = int(Traversal) == InnerVectorizedTraversal - || int(Traversal) == LinearVectorizedTraversal - || int(Traversal) == SliceVectorizedTraversal - }; - - typedef typename conditional::type PacketType; - -private: - enum { - ActualPacketSize = int(Traversal)==LinearVectorizedTraversal ? LinearPacketSize - : Vectorized ? InnerPacketSize - : 1, - UnrollingLimit = EIGEN_UNROLLING_LIMIT * ActualPacketSize, - MayUnrollCompletely = int(Dst::SizeAtCompileTime) != Dynamic - && int(Dst::SizeAtCompileTime) * (int(DstEvaluator::CoeffReadCost)+int(SrcEvaluator::CoeffReadCost)) <= int(UnrollingLimit), - MayUnrollInner = int(InnerSize) != Dynamic - && int(InnerSize) * (int(DstEvaluator::CoeffReadCost)+int(SrcEvaluator::CoeffReadCost)) <= int(UnrollingLimit) - }; - -public: - enum { - Unrolling = (int(Traversal) == int(InnerVectorizedTraversal) || int(Traversal) == int(DefaultTraversal)) - ? ( - int(MayUnrollCompletely) ? int(CompleteUnrolling) - : int(MayUnrollInner) ? int(InnerUnrolling) - : int(NoUnrolling) - ) - : int(Traversal) == int(LinearVectorizedTraversal) - ? ( bool(MayUnrollCompletely) && ( EIGEN_UNALIGNED_VECTORIZE || (int(DstAlignment)>=int(LinearRequiredAlignment))) - ? int(CompleteUnrolling) - : int(NoUnrolling) ) - : int(Traversal) == int(LinearTraversal) - ? ( bool(MayUnrollCompletely) ? int(CompleteUnrolling) - : int(NoUnrolling) ) -#if EIGEN_UNALIGNED_VECTORIZE - : int(Traversal) == int(SliceVectorizedTraversal) - ? ( bool(MayUnrollInner) ? int(InnerUnrolling) - : int(NoUnrolling) ) -#endif - : int(NoUnrolling) - }; - -#ifdef EIGEN_DEBUG_ASSIGN - static void debug() - { - std::cerr << "DstXpr: " << typeid(typename DstEvaluator::XprType).name() << std::endl; - std::cerr << "SrcXpr: " << typeid(typename SrcEvaluator::XprType).name() << std::endl; - std::cerr.setf(std::ios::hex, std::ios::basefield); - std::cerr << "DstFlags" << " = " << DstFlags << " (" << demangle_flags(DstFlags) << " )" << std::endl; - std::cerr << "SrcFlags" << " = " << SrcFlags << " (" << demangle_flags(SrcFlags) << " )" << std::endl; - std::cerr.unsetf(std::ios::hex); - EIGEN_DEBUG_VAR(DstAlignment) - EIGEN_DEBUG_VAR(SrcAlignment) - EIGEN_DEBUG_VAR(LinearRequiredAlignment) - EIGEN_DEBUG_VAR(InnerRequiredAlignment) - EIGEN_DEBUG_VAR(JointAlignment) - EIGEN_DEBUG_VAR(InnerSize) - EIGEN_DEBUG_VAR(InnerMaxSize) - EIGEN_DEBUG_VAR(LinearPacketSize) - EIGEN_DEBUG_VAR(InnerPacketSize) - EIGEN_DEBUG_VAR(ActualPacketSize) - EIGEN_DEBUG_VAR(StorageOrdersAgree) - EIGEN_DEBUG_VAR(MightVectorize) - EIGEN_DEBUG_VAR(MayLinearize) - EIGEN_DEBUG_VAR(MayInnerVectorize) - EIGEN_DEBUG_VAR(MayLinearVectorize) - EIGEN_DEBUG_VAR(MaySliceVectorize) - std::cerr << "Traversal" << " = " << Traversal << " (" << demangle_traversal(Traversal) << ")" << std::endl; - EIGEN_DEBUG_VAR(SrcEvaluator::CoeffReadCost) - EIGEN_DEBUG_VAR(UnrollingLimit) - EIGEN_DEBUG_VAR(MayUnrollCompletely) - EIGEN_DEBUG_VAR(MayUnrollInner) - std::cerr << "Unrolling" << " = " << Unrolling << " (" << demangle_unrolling(Unrolling) << ")" << std::endl; - std::cerr << std::endl; - } -#endif -}; - -/*************************************************************************** -* Part 2 : meta-unrollers -***************************************************************************/ - -/************************ -*** Default traversal *** -************************/ - -template -struct copy_using_evaluator_DefaultTraversal_CompleteUnrolling -{ - // FIXME: this is not very clean, perhaps this information should be provided by the kernel? - typedef typename Kernel::DstEvaluatorType DstEvaluatorType; - typedef typename DstEvaluatorType::XprType DstXprType; - - enum { - outer = Index / DstXprType::InnerSizeAtCompileTime, - inner = Index % DstXprType::InnerSizeAtCompileTime - }; - - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel) - { - kernel.assignCoeffByOuterInner(outer, inner); - copy_using_evaluator_DefaultTraversal_CompleteUnrolling::run(kernel); - } -}; - -template -struct copy_using_evaluator_DefaultTraversal_CompleteUnrolling -{ - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel&) { } -}; - -template -struct copy_using_evaluator_DefaultTraversal_InnerUnrolling -{ - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel, Index outer) - { - kernel.assignCoeffByOuterInner(outer, Index_); - copy_using_evaluator_DefaultTraversal_InnerUnrolling::run(kernel, outer); - } -}; - -template -struct copy_using_evaluator_DefaultTraversal_InnerUnrolling -{ - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel&, Index) { } -}; - -/*********************** -*** Linear traversal *** -***********************/ - -template -struct copy_using_evaluator_LinearTraversal_CompleteUnrolling -{ - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel& kernel) - { - kernel.assignCoeff(Index); - copy_using_evaluator_LinearTraversal_CompleteUnrolling::run(kernel); - } -}; - -template -struct copy_using_evaluator_LinearTraversal_CompleteUnrolling -{ - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel&) { } -}; - -/************************** -*** Inner vectorization *** -**************************/ - -template -struct copy_using_evaluator_innervec_CompleteUnrolling -{ - // FIXME: this is not very clean, perhaps this information should be provided by the kernel? - typedef typename Kernel::DstEvaluatorType DstEvaluatorType; - typedef typename DstEvaluatorType::XprType DstXprType; - typedef typename Kernel::PacketType PacketType; - - enum { - outer = Index / DstXprType::InnerSizeAtCompileTime, - inner = Index % DstXprType::InnerSizeAtCompileTime, - SrcAlignment = Kernel::AssignmentTraits::SrcAlignment, - DstAlignment = Kernel::AssignmentTraits::DstAlignment - }; - - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel) - { - kernel.template assignPacketByOuterInner(outer, inner); - enum { NextIndex = Index + unpacket_traits::size }; - copy_using_evaluator_innervec_CompleteUnrolling::run(kernel); - } -}; - -template -struct copy_using_evaluator_innervec_CompleteUnrolling -{ - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel&) { } -}; - -template -struct copy_using_evaluator_innervec_InnerUnrolling -{ - typedef typename Kernel::PacketType PacketType; - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel, Index outer) - { - kernel.template assignPacketByOuterInner(outer, Index_); - enum { NextIndex = Index_ + unpacket_traits::size }; - copy_using_evaluator_innervec_InnerUnrolling::run(kernel, outer); - } -}; - -template -struct copy_using_evaluator_innervec_InnerUnrolling -{ - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &, Index) { } -}; - -/*************************************************************************** -* Part 3 : implementation of all cases -***************************************************************************/ - -// dense_assignment_loop is based on assign_impl - -template -struct dense_assignment_loop; - -/************************ -*** Default traversal *** -************************/ - -template -struct dense_assignment_loop -{ - EIGEN_DEVICE_FUNC static void EIGEN_STRONG_INLINE run(Kernel &kernel) - { - for(Index outer = 0; outer < kernel.outerSize(); ++outer) { - for(Index inner = 0; inner < kernel.innerSize(); ++inner) { - kernel.assignCoeffByOuterInner(outer, inner); - } - } - } -}; - -template -struct dense_assignment_loop -{ - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel) - { - typedef typename Kernel::DstEvaluatorType::XprType DstXprType; - copy_using_evaluator_DefaultTraversal_CompleteUnrolling::run(kernel); - } -}; - -template -struct dense_assignment_loop -{ - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel) - { - typedef typename Kernel::DstEvaluatorType::XprType DstXprType; - - const Index outerSize = kernel.outerSize(); - for(Index outer = 0; outer < outerSize; ++outer) - copy_using_evaluator_DefaultTraversal_InnerUnrolling::run(kernel, outer); - } -}; - -/*************************** -*** Linear vectorization *** -***************************/ - - -// The goal of unaligned_dense_assignment_loop is simply to factorize the handling -// of the non vectorizable beginning and ending parts - -template -struct unaligned_dense_assignment_loop -{ - // if IsAligned = true, then do nothing - template - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel&, Index, Index) {} -}; - -template <> -struct unaligned_dense_assignment_loop -{ - // MSVC must not inline this functions. If it does, it fails to optimize the - // packet access path. - // FIXME check which version exhibits this issue -#if EIGEN_COMP_MSVC - template - static EIGEN_DONT_INLINE void run(Kernel &kernel, - Index start, - Index end) -#else - template - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel, - Index start, - Index end) -#endif - { - for (Index index = start; index < end; ++index) - kernel.assignCoeff(index); - } -}; - -template -struct dense_assignment_loop -{ - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel) - { - const Index size = kernel.size(); - typedef typename Kernel::Scalar Scalar; - typedef typename Kernel::PacketType PacketType; - enum { - requestedAlignment = Kernel::AssignmentTraits::LinearRequiredAlignment, - packetSize = unpacket_traits::size, - dstIsAligned = int(Kernel::AssignmentTraits::DstAlignment)>=int(requestedAlignment), - dstAlignment = packet_traits::AlignedOnScalar ? int(requestedAlignment) - : int(Kernel::AssignmentTraits::DstAlignment), - srcAlignment = Kernel::AssignmentTraits::JointAlignment - }; - const Index alignedStart = dstIsAligned ? 0 : internal::first_aligned(kernel.dstDataPtr(), size); - const Index alignedEnd = alignedStart + ((size-alignedStart)/packetSize)*packetSize; - - unaligned_dense_assignment_loop::run(kernel, 0, alignedStart); - - for(Index index = alignedStart; index < alignedEnd; index += packetSize) - kernel.template assignPacket(index); - - unaligned_dense_assignment_loop<>::run(kernel, alignedEnd, size); - } -}; - -template -struct dense_assignment_loop -{ - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel) - { - typedef typename Kernel::DstEvaluatorType::XprType DstXprType; - typedef typename Kernel::PacketType PacketType; - - enum { size = DstXprType::SizeAtCompileTime, - packetSize =unpacket_traits::size, - alignedSize = (size/packetSize)*packetSize }; - - copy_using_evaluator_innervec_CompleteUnrolling::run(kernel); - copy_using_evaluator_DefaultTraversal_CompleteUnrolling::run(kernel); - } -}; - -/************************** -*** Inner vectorization *** -**************************/ - -template -struct dense_assignment_loop -{ - typedef typename Kernel::PacketType PacketType; - enum { - SrcAlignment = Kernel::AssignmentTraits::SrcAlignment, - DstAlignment = Kernel::AssignmentTraits::DstAlignment - }; - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel) - { - const Index innerSize = kernel.innerSize(); - const Index outerSize = kernel.outerSize(); - const Index packetSize = unpacket_traits::size; - for(Index outer = 0; outer < outerSize; ++outer) - for(Index inner = 0; inner < innerSize; inner+=packetSize) - kernel.template assignPacketByOuterInner(outer, inner); - } -}; - -template -struct dense_assignment_loop -{ - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel) - { - typedef typename Kernel::DstEvaluatorType::XprType DstXprType; - copy_using_evaluator_innervec_CompleteUnrolling::run(kernel); - } -}; - -template -struct dense_assignment_loop -{ - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel) - { - typedef typename Kernel::DstEvaluatorType::XprType DstXprType; - typedef typename Kernel::AssignmentTraits Traits; - const Index outerSize = kernel.outerSize(); - for(Index outer = 0; outer < outerSize; ++outer) - copy_using_evaluator_innervec_InnerUnrolling::run(kernel, outer); - } -}; - -/*********************** -*** Linear traversal *** -***********************/ - -template -struct dense_assignment_loop -{ - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel) - { - const Index size = kernel.size(); - for(Index i = 0; i < size; ++i) - kernel.assignCoeff(i); - } -}; - -template -struct dense_assignment_loop -{ - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel) - { - typedef typename Kernel::DstEvaluatorType::XprType DstXprType; - copy_using_evaluator_LinearTraversal_CompleteUnrolling::run(kernel); - } -}; - -/************************** -*** Slice vectorization *** -***************************/ - -template -struct dense_assignment_loop -{ - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel) - { - typedef typename Kernel::Scalar Scalar; - typedef typename Kernel::PacketType PacketType; - enum { - packetSize = unpacket_traits::size, - requestedAlignment = int(Kernel::AssignmentTraits::InnerRequiredAlignment), - alignable = packet_traits::AlignedOnScalar || int(Kernel::AssignmentTraits::DstAlignment)>=sizeof(Scalar), - dstIsAligned = int(Kernel::AssignmentTraits::DstAlignment)>=int(requestedAlignment), - dstAlignment = alignable ? int(requestedAlignment) - : int(Kernel::AssignmentTraits::DstAlignment) - }; - const Scalar *dst_ptr = kernel.dstDataPtr(); - if((!bool(dstIsAligned)) && (UIntPtr(dst_ptr) % sizeof(Scalar))>0) - { - // the pointer is not aligend-on scalar, so alignment is not possible - return dense_assignment_loop::run(kernel); - } - const Index packetAlignedMask = packetSize - 1; - const Index innerSize = kernel.innerSize(); - const Index outerSize = kernel.outerSize(); - const Index alignedStep = alignable ? (packetSize - kernel.outerStride() % packetSize) & packetAlignedMask : 0; - Index alignedStart = ((!alignable) || bool(dstIsAligned)) ? 0 : internal::first_aligned(dst_ptr, innerSize); - - for(Index outer = 0; outer < outerSize; ++outer) - { - const Index alignedEnd = alignedStart + ((innerSize-alignedStart) & ~packetAlignedMask); - // do the non-vectorizable part of the assignment - for(Index inner = 0; inner(outer, inner); - - // do the non-vectorizable part of the assignment - for(Index inner = alignedEnd; inner -struct dense_assignment_loop -{ - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel) - { - typedef typename Kernel::DstEvaluatorType::XprType DstXprType; - typedef typename Kernel::PacketType PacketType; - - enum { size = DstXprType::InnerSizeAtCompileTime, - packetSize =unpacket_traits::size, - vectorizableSize = (size/packetSize)*packetSize }; - - for(Index outer = 0; outer < kernel.outerSize(); ++outer) - { - copy_using_evaluator_innervec_InnerUnrolling::run(kernel, outer); - copy_using_evaluator_DefaultTraversal_InnerUnrolling::run(kernel, outer); - } - } -}; -#endif - - -/*************************************************************************** -* Part 4 : Generic dense assignment kernel -***************************************************************************/ - -// This class generalize the assignment of a coefficient (or packet) from one dense evaluator -// to another dense writable evaluator. -// It is parametrized by the two evaluators, and the actual assignment functor. -// This abstraction level permits to keep the evaluation loops as simple and as generic as possible. -// One can customize the assignment using this generic dense_assignment_kernel with different -// functors, or by completely overloading it, by-passing a functor. -template -class generic_dense_assignment_kernel -{ -protected: - typedef typename DstEvaluatorTypeT::XprType DstXprType; - typedef typename SrcEvaluatorTypeT::XprType SrcXprType; -public: - - typedef DstEvaluatorTypeT DstEvaluatorType; - typedef SrcEvaluatorTypeT SrcEvaluatorType; - typedef typename DstEvaluatorType::Scalar Scalar; - typedef copy_using_evaluator_traits AssignmentTraits; - typedef typename AssignmentTraits::PacketType PacketType; - - - EIGEN_DEVICE_FUNC generic_dense_assignment_kernel(DstEvaluatorType &dst, const SrcEvaluatorType &src, const Functor &func, DstXprType& dstExpr) - : m_dst(dst), m_src(src), m_functor(func), m_dstExpr(dstExpr) - { - #ifdef EIGEN_DEBUG_ASSIGN - AssignmentTraits::debug(); - #endif - } - - EIGEN_DEVICE_FUNC Index size() const { return m_dstExpr.size(); } - EIGEN_DEVICE_FUNC Index innerSize() const { return m_dstExpr.innerSize(); } - EIGEN_DEVICE_FUNC Index outerSize() const { return m_dstExpr.outerSize(); } - EIGEN_DEVICE_FUNC Index rows() const { return m_dstExpr.rows(); } - EIGEN_DEVICE_FUNC Index cols() const { return m_dstExpr.cols(); } - EIGEN_DEVICE_FUNC Index outerStride() const { return m_dstExpr.outerStride(); } - - EIGEN_DEVICE_FUNC DstEvaluatorType& dstEvaluator() { return m_dst; } - EIGEN_DEVICE_FUNC const SrcEvaluatorType& srcEvaluator() const { return m_src; } - - /// Assign src(row,col) to dst(row,col) through the assignment functor. - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(Index row, Index col) - { - m_functor.assignCoeff(m_dst.coeffRef(row,col), m_src.coeff(row,col)); - } - - /// \sa assignCoeff(Index,Index) - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(Index index) - { - m_functor.assignCoeff(m_dst.coeffRef(index), m_src.coeff(index)); - } - - /// \sa assignCoeff(Index,Index) - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeffByOuterInner(Index outer, Index inner) - { - Index row = rowIndexByOuterInner(outer, inner); - Index col = colIndexByOuterInner(outer, inner); - assignCoeff(row, col); - } - - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignPacket(Index row, Index col) - { - m_functor.template assignPacket(&m_dst.coeffRef(row,col), m_src.template packet(row,col)); - } - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignPacket(Index index) - { - m_functor.template assignPacket(&m_dst.coeffRef(index), m_src.template packet(index)); - } - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignPacketByOuterInner(Index outer, Index inner) - { - Index row = rowIndexByOuterInner(outer, inner); - Index col = colIndexByOuterInner(outer, inner); - assignPacket(row, col); - } - - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Index rowIndexByOuterInner(Index outer, Index inner) - { - typedef typename DstEvaluatorType::ExpressionTraits Traits; - return int(Traits::RowsAtCompileTime) == 1 ? 0 - : int(Traits::ColsAtCompileTime) == 1 ? inner - : int(DstEvaluatorType::Flags)&RowMajorBit ? outer - : inner; - } - - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Index colIndexByOuterInner(Index outer, Index inner) - { - typedef typename DstEvaluatorType::ExpressionTraits Traits; - return int(Traits::ColsAtCompileTime) == 1 ? 0 - : int(Traits::RowsAtCompileTime) == 1 ? inner - : int(DstEvaluatorType::Flags)&RowMajorBit ? inner - : outer; - } - - EIGEN_DEVICE_FUNC const Scalar* dstDataPtr() const - { - return m_dstExpr.data(); - } - -protected: - DstEvaluatorType& m_dst; - const SrcEvaluatorType& m_src; - const Functor &m_functor; - // TODO find a way to avoid the needs of the original expression - DstXprType& m_dstExpr; -}; - -/*************************************************************************** -* Part 5 : Entry point for dense rectangular assignment -***************************************************************************/ - -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE -void resize_if_allowed(DstXprType &dst, const SrcXprType& src, const Functor &/*func*/) -{ - EIGEN_ONLY_USED_FOR_DEBUG(dst); - EIGEN_ONLY_USED_FOR_DEBUG(src); - eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols()); -} - -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE -void resize_if_allowed(DstXprType &dst, const SrcXprType& src, const internal::assign_op &/*func*/) -{ - Index dstRows = src.rows(); - Index dstCols = src.cols(); - if(((dst.rows()!=dstRows) || (dst.cols()!=dstCols))) - dst.resize(dstRows, dstCols); - eigen_assert(dst.rows() == dstRows && dst.cols() == dstCols); -} - -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void call_dense_assignment_loop(DstXprType& dst, const SrcXprType& src, const Functor &func) -{ - typedef evaluator DstEvaluatorType; - typedef evaluator SrcEvaluatorType; - - SrcEvaluatorType srcEvaluator(src); - - // NOTE To properly handle A = (A*A.transpose())/s with A rectangular, - // we need to resize the destination after the source evaluator has been created. - resize_if_allowed(dst, src, func); - - DstEvaluatorType dstEvaluator(dst); - - typedef generic_dense_assignment_kernel Kernel; - Kernel kernel(dstEvaluator, srcEvaluator, func, dst.const_cast_derived()); - - dense_assignment_loop::run(kernel); -} - -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void call_dense_assignment_loop(DstXprType& dst, const SrcXprType& src) -{ - call_dense_assignment_loop(dst, src, internal::assign_op()); -} - -/*************************************************************************** -* Part 6 : Generic assignment -***************************************************************************/ - -// Based on the respective shapes of the destination and source, -// the class AssignmentKind determine the kind of assignment mechanism. -// AssignmentKind must define a Kind typedef. -template struct AssignmentKind; - -// Assignement kind defined in this file: -struct Dense2Dense {}; -struct EigenBase2EigenBase {}; - -template struct AssignmentKind { typedef EigenBase2EigenBase Kind; }; -template<> struct AssignmentKind { typedef Dense2Dense Kind; }; - -// This is the main assignment class -template< typename DstXprType, typename SrcXprType, typename Functor, - typename Kind = typename AssignmentKind< typename evaluator_traits::Shape , typename evaluator_traits::Shape >::Kind, - typename EnableIf = void> -struct Assignment; - - -// The only purpose of this call_assignment() function is to deal with noalias() / "assume-aliasing" and automatic transposition. -// Indeed, I (Gael) think that this concept of "assume-aliasing" was a mistake, and it makes thing quite complicated. -// So this intermediate function removes everything related to "assume-aliasing" such that Assignment -// does not has to bother about these annoying details. - -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE -void call_assignment(Dst& dst, const Src& src) -{ - call_assignment(dst, src, internal::assign_op()); -} -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE -void call_assignment(const Dst& dst, const Src& src) -{ - call_assignment(dst, src, internal::assign_op()); -} - -// Deal with "assume-aliasing" -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE -void call_assignment(Dst& dst, const Src& src, const Func& func, typename enable_if< evaluator_assume_aliasing::value, void*>::type = 0) -{ - typename plain_matrix_type::type tmp(src); - call_assignment_no_alias(dst, tmp, func); -} - -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE -void call_assignment(Dst& dst, const Src& src, const Func& func, typename enable_if::value, void*>::type = 0) -{ - call_assignment_no_alias(dst, src, func); -} - -// by-pass "assume-aliasing" -// When there is no aliasing, we require that 'dst' has been properly resized -template class StorageBase, typename Src, typename Func> -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE -void call_assignment(NoAlias& dst, const Src& src, const Func& func) -{ - call_assignment_no_alias(dst.expression(), src, func); -} - - -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE -void call_assignment_no_alias(Dst& dst, const Src& src, const Func& func) -{ - enum { - NeedToTranspose = ( (int(Dst::RowsAtCompileTime) == 1 && int(Src::ColsAtCompileTime) == 1) - || (int(Dst::ColsAtCompileTime) == 1 && int(Src::RowsAtCompileTime) == 1) - ) && int(Dst::SizeAtCompileTime) != 1 - }; - - typedef typename internal::conditional, Dst>::type ActualDstTypeCleaned; - typedef typename internal::conditional, Dst&>::type ActualDstType; - ActualDstType actualDst(dst); - - // TODO check whether this is the right place to perform these checks: - EIGEN_STATIC_ASSERT_LVALUE(Dst) - EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(ActualDstTypeCleaned,Src) - EIGEN_CHECK_BINARY_COMPATIBILIY(Func,typename ActualDstTypeCleaned::Scalar,typename Src::Scalar); - - Assignment::run(actualDst, src, func); -} -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE -void call_assignment_no_alias(Dst& dst, const Src& src) -{ - call_assignment_no_alias(dst, src, internal::assign_op()); -} - -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE -void call_assignment_no_alias_no_transpose(Dst& dst, const Src& src, const Func& func) -{ - // TODO check whether this is the right place to perform these checks: - EIGEN_STATIC_ASSERT_LVALUE(Dst) - EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Dst,Src) - EIGEN_CHECK_BINARY_COMPATIBILIY(Func,typename Dst::Scalar,typename Src::Scalar); - - Assignment::run(dst, src, func); -} -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE -void call_assignment_no_alias_no_transpose(Dst& dst, const Src& src) -{ - call_assignment_no_alias_no_transpose(dst, src, internal::assign_op()); -} - -// forward declaration -template void check_for_aliasing(const Dst &dst, const Src &src); - -// Generic Dense to Dense assignment -// Note that the last template argument "Weak" is needed to make it possible to perform -// both partial specialization+SFINAE without ambiguous specialization -template< typename DstXprType, typename SrcXprType, typename Functor, typename Weak> -struct Assignment -{ - EIGEN_DEVICE_FUNC - static EIGEN_STRONG_INLINE void run(DstXprType &dst, const SrcXprType &src, const Functor &func) - { -#ifndef EIGEN_NO_DEBUG - internal::check_for_aliasing(dst, src); -#endif - - call_dense_assignment_loop(dst, src, func); - } -}; - -// Generic assignment through evalTo. -// TODO: not sure we have to keep that one, but it helps porting current code to new evaluator mechanism. -// Note that the last template argument "Weak" is needed to make it possible to perform -// both partial specialization+SFINAE without ambiguous specialization -template< typename DstXprType, typename SrcXprType, typename Functor, typename Weak> -struct Assignment -{ - EIGEN_DEVICE_FUNC - static EIGEN_STRONG_INLINE void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op &/*func*/) - { - Index dstRows = src.rows(); - Index dstCols = src.cols(); - if((dst.rows()!=dstRows) || (dst.cols()!=dstCols)) - dst.resize(dstRows, dstCols); - - eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols()); - src.evalTo(dst); - } - - // NOTE The following two functions are templated to avoid their instanciation if not needed - // This is needed because some expressions supports evalTo only and/or have 'void' as scalar type. - template - EIGEN_DEVICE_FUNC - static EIGEN_STRONG_INLINE void run(DstXprType &dst, const SrcXprType &src, const internal::add_assign_op &/*func*/) - { - Index dstRows = src.rows(); - Index dstCols = src.cols(); - if((dst.rows()!=dstRows) || (dst.cols()!=dstCols)) - dst.resize(dstRows, dstCols); - - eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols()); - src.addTo(dst); - } - - template - EIGEN_DEVICE_FUNC - static EIGEN_STRONG_INLINE void run(DstXprType &dst, const SrcXprType &src, const internal::sub_assign_op &/*func*/) - { - Index dstRows = src.rows(); - Index dstCols = src.cols(); - if((dst.rows()!=dstRows) || (dst.cols()!=dstCols)) - dst.resize(dstRows, dstCols); - - eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols()); - src.subTo(dst); - } -}; - -} // namespace internal - -} // end namespace Eigen - -#endif // EIGEN_ASSIGN_EVALUATOR_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Assign_MKL.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Assign_MKL.h deleted file mode 100644 index 6c2ab926..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Assign_MKL.h +++ /dev/null @@ -1,176 +0,0 @@ -/* - Copyright (c) 2011, Intel Corporation. All rights reserved. - Copyright (C) 2015 Gael Guennebaud - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of Intel Corporation nor the names of its contributors may - be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - ******************************************************************************** - * Content : Eigen bindings to Intel(R) MKL - * MKL VML support for coefficient-wise unary Eigen expressions like a=b.sin() - ******************************************************************************** -*/ - -#ifndef EIGEN_ASSIGN_VML_H -#define EIGEN_ASSIGN_VML_H - -namespace Eigen { - -namespace internal { - -template -class vml_assign_traits -{ - private: - enum { - DstHasDirectAccess = Dst::Flags & DirectAccessBit, - SrcHasDirectAccess = Src::Flags & DirectAccessBit, - StorageOrdersAgree = (int(Dst::IsRowMajor) == int(Src::IsRowMajor)), - InnerSize = int(Dst::IsVectorAtCompileTime) ? int(Dst::SizeAtCompileTime) - : int(Dst::Flags)&RowMajorBit ? int(Dst::ColsAtCompileTime) - : int(Dst::RowsAtCompileTime), - InnerMaxSize = int(Dst::IsVectorAtCompileTime) ? int(Dst::MaxSizeAtCompileTime) - : int(Dst::Flags)&RowMajorBit ? int(Dst::MaxColsAtCompileTime) - : int(Dst::MaxRowsAtCompileTime), - MaxSizeAtCompileTime = Dst::SizeAtCompileTime, - - MightEnableVml = StorageOrdersAgree && DstHasDirectAccess && SrcHasDirectAccess && Src::InnerStrideAtCompileTime==1 && Dst::InnerStrideAtCompileTime==1, - MightLinearize = MightEnableVml && (int(Dst::Flags) & int(Src::Flags) & LinearAccessBit), - VmlSize = MightLinearize ? MaxSizeAtCompileTime : InnerMaxSize, - LargeEnough = VmlSize==Dynamic || VmlSize>=EIGEN_MKL_VML_THRESHOLD - }; - public: - enum { - EnableVml = MightEnableVml && LargeEnough, - Traversal = MightLinearize ? LinearTraversal : DefaultTraversal - }; -}; - -#define EIGEN_PP_EXPAND(ARG) ARG -#if !defined (EIGEN_FAST_MATH) || (EIGEN_FAST_MATH != 1) -#define EIGEN_VMLMODE_EXPAND_LA , VML_HA -#else -#define EIGEN_VMLMODE_EXPAND_LA , VML_LA -#endif - -#define EIGEN_VMLMODE_EXPAND__ - -#define EIGEN_VMLMODE_PREFIX_LA vm -#define EIGEN_VMLMODE_PREFIX__ v -#define EIGEN_VMLMODE_PREFIX(VMLMODE) EIGEN_CAT(EIGEN_VMLMODE_PREFIX_,VMLMODE) - -#define EIGEN_MKL_VML_DECLARE_UNARY_CALL(EIGENOP, VMLOP, EIGENTYPE, VMLTYPE, VMLMODE) \ - template< typename DstXprType, typename SrcXprNested> \ - struct Assignment, SrcXprNested>, assign_op, \ - Dense2Dense, typename enable_if::EnableVml>::type> { \ - typedef CwiseUnaryOp, SrcXprNested> SrcXprType; \ - static void run(DstXprType &dst, const SrcXprType &src, const assign_op &/*func*/) { \ - eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols()); \ - if(vml_assign_traits::Traversal==LinearTraversal) { \ - VMLOP(dst.size(), (const VMLTYPE*)src.nestedExpression().data(), \ - (VMLTYPE*)dst.data() EIGEN_PP_EXPAND(EIGEN_VMLMODE_EXPAND_##VMLMODE) ); \ - } else { \ - const Index outerSize = dst.outerSize(); \ - for(Index outer = 0; outer < outerSize; ++outer) { \ - const EIGENTYPE *src_ptr = src.IsRowMajor ? &(src.nestedExpression().coeffRef(outer,0)) : \ - &(src.nestedExpression().coeffRef(0, outer)); \ - EIGENTYPE *dst_ptr = dst.IsRowMajor ? &(dst.coeffRef(outer,0)) : &(dst.coeffRef(0, outer)); \ - VMLOP( dst.innerSize(), (const VMLTYPE*)src_ptr, \ - (VMLTYPE*)dst_ptr EIGEN_PP_EXPAND(EIGEN_VMLMODE_EXPAND_##VMLMODE)); \ - } \ - } \ - } \ - }; \ - - -#define EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(EIGENOP, VMLOP, VMLMODE) \ - EIGEN_MKL_VML_DECLARE_UNARY_CALL(EIGENOP, EIGEN_CAT(EIGEN_VMLMODE_PREFIX(VMLMODE),s##VMLOP), float, float, VMLMODE) \ - EIGEN_MKL_VML_DECLARE_UNARY_CALL(EIGENOP, EIGEN_CAT(EIGEN_VMLMODE_PREFIX(VMLMODE),d##VMLOP), double, double, VMLMODE) - -#define EIGEN_MKL_VML_DECLARE_UNARY_CALLS_CPLX(EIGENOP, VMLOP, VMLMODE) \ - EIGEN_MKL_VML_DECLARE_UNARY_CALL(EIGENOP, EIGEN_CAT(EIGEN_VMLMODE_PREFIX(VMLMODE),c##VMLOP), scomplex, MKL_Complex8, VMLMODE) \ - EIGEN_MKL_VML_DECLARE_UNARY_CALL(EIGENOP, EIGEN_CAT(EIGEN_VMLMODE_PREFIX(VMLMODE),z##VMLOP), dcomplex, MKL_Complex16, VMLMODE) - -#define EIGEN_MKL_VML_DECLARE_UNARY_CALLS(EIGENOP, VMLOP, VMLMODE) \ - EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(EIGENOP, VMLOP, VMLMODE) \ - EIGEN_MKL_VML_DECLARE_UNARY_CALLS_CPLX(EIGENOP, VMLOP, VMLMODE) - - -EIGEN_MKL_VML_DECLARE_UNARY_CALLS(sin, Sin, LA) -EIGEN_MKL_VML_DECLARE_UNARY_CALLS(asin, Asin, LA) -EIGEN_MKL_VML_DECLARE_UNARY_CALLS(sinh, Sinh, LA) -EIGEN_MKL_VML_DECLARE_UNARY_CALLS(cos, Cos, LA) -EIGEN_MKL_VML_DECLARE_UNARY_CALLS(acos, Acos, LA) -EIGEN_MKL_VML_DECLARE_UNARY_CALLS(cosh, Cosh, LA) -EIGEN_MKL_VML_DECLARE_UNARY_CALLS(tan, Tan, LA) -EIGEN_MKL_VML_DECLARE_UNARY_CALLS(atan, Atan, LA) -EIGEN_MKL_VML_DECLARE_UNARY_CALLS(tanh, Tanh, LA) -// EIGEN_MKL_VML_DECLARE_UNARY_CALLS(abs, Abs, _) -EIGEN_MKL_VML_DECLARE_UNARY_CALLS(exp, Exp, LA) -EIGEN_MKL_VML_DECLARE_UNARY_CALLS(log, Ln, LA) -EIGEN_MKL_VML_DECLARE_UNARY_CALLS(log10, Log10, LA) -EIGEN_MKL_VML_DECLARE_UNARY_CALLS(sqrt, Sqrt, _) - -EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(square, Sqr, _) -EIGEN_MKL_VML_DECLARE_UNARY_CALLS_CPLX(arg, Arg, _) -EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(round, Round, _) -EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(floor, Floor, _) -EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(ceil, Ceil, _) - -#define EIGEN_MKL_VML_DECLARE_POW_CALL(EIGENOP, VMLOP, EIGENTYPE, VMLTYPE, VMLMODE) \ - template< typename DstXprType, typename SrcXprNested, typename Plain> \ - struct Assignment, SrcXprNested, \ - const CwiseNullaryOp,Plain> >, assign_op, \ - Dense2Dense, typename enable_if::EnableVml>::type> { \ - typedef CwiseBinaryOp, SrcXprNested, \ - const CwiseNullaryOp,Plain> > SrcXprType; \ - static void run(DstXprType &dst, const SrcXprType &src, const assign_op &/*func*/) { \ - eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols()); \ - VMLTYPE exponent = reinterpret_cast(src.rhs().functor().m_other); \ - if(vml_assign_traits::Traversal==LinearTraversal) \ - { \ - VMLOP( dst.size(), (const VMLTYPE*)src.lhs().data(), exponent, \ - (VMLTYPE*)dst.data() EIGEN_PP_EXPAND(EIGEN_VMLMODE_EXPAND_##VMLMODE) ); \ - } else { \ - const Index outerSize = dst.outerSize(); \ - for(Index outer = 0; outer < outerSize; ++outer) { \ - const EIGENTYPE *src_ptr = src.IsRowMajor ? &(src.lhs().coeffRef(outer,0)) : \ - &(src.lhs().coeffRef(0, outer)); \ - EIGENTYPE *dst_ptr = dst.IsRowMajor ? &(dst.coeffRef(outer,0)) : &(dst.coeffRef(0, outer)); \ - VMLOP( dst.innerSize(), (const VMLTYPE*)src_ptr, exponent, \ - (VMLTYPE*)dst_ptr EIGEN_PP_EXPAND(EIGEN_VMLMODE_EXPAND_##VMLMODE)); \ - } \ - } \ - } \ - }; - -EIGEN_MKL_VML_DECLARE_POW_CALL(pow, vmsPowx, float, float, LA) -EIGEN_MKL_VML_DECLARE_POW_CALL(pow, vmdPowx, double, double, LA) -EIGEN_MKL_VML_DECLARE_POW_CALL(pow, vmcPowx, scomplex, MKL_Complex8, LA) -EIGEN_MKL_VML_DECLARE_POW_CALL(pow, vmzPowx, dcomplex, MKL_Complex16, LA) - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_ASSIGN_VML_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/BandMatrix.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/BandMatrix.h deleted file mode 100644 index 4978c914..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/BandMatrix.h +++ /dev/null @@ -1,353 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_BANDMATRIX_H -#define EIGEN_BANDMATRIX_H - -namespace Eigen { - -namespace internal { - -template -class BandMatrixBase : public EigenBase -{ - public: - - enum { - Flags = internal::traits::Flags, - CoeffReadCost = internal::traits::CoeffReadCost, - RowsAtCompileTime = internal::traits::RowsAtCompileTime, - ColsAtCompileTime = internal::traits::ColsAtCompileTime, - MaxRowsAtCompileTime = internal::traits::MaxRowsAtCompileTime, - MaxColsAtCompileTime = internal::traits::MaxColsAtCompileTime, - Supers = internal::traits::Supers, - Subs = internal::traits::Subs, - Options = internal::traits::Options - }; - typedef typename internal::traits::Scalar Scalar; - typedef Matrix DenseMatrixType; - typedef typename DenseMatrixType::StorageIndex StorageIndex; - typedef typename internal::traits::CoefficientsType CoefficientsType; - typedef EigenBase Base; - - protected: - enum { - DataRowsAtCompileTime = ((Supers!=Dynamic) && (Subs!=Dynamic)) - ? 1 + Supers + Subs - : Dynamic, - SizeAtCompileTime = EIGEN_SIZE_MIN_PREFER_DYNAMIC(RowsAtCompileTime,ColsAtCompileTime) - }; - - public: - - using Base::derived; - using Base::rows; - using Base::cols; - - /** \returns the number of super diagonals */ - inline Index supers() const { return derived().supers(); } - - /** \returns the number of sub diagonals */ - inline Index subs() const { return derived().subs(); } - - /** \returns an expression of the underlying coefficient matrix */ - inline const CoefficientsType& coeffs() const { return derived().coeffs(); } - - /** \returns an expression of the underlying coefficient matrix */ - inline CoefficientsType& coeffs() { return derived().coeffs(); } - - /** \returns a vector expression of the \a i -th column, - * only the meaningful part is returned. - * \warning the internal storage must be column major. */ - inline Block col(Index i) - { - EIGEN_STATIC_ASSERT((Options&RowMajor)==0,THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES); - Index start = 0; - Index len = coeffs().rows(); - if (i<=supers()) - { - start = supers()-i; - len = (std::min)(rows(),std::max(0,coeffs().rows() - (supers()-i))); - } - else if (i>=rows()-subs()) - len = std::max(0,coeffs().rows() - (i + 1 - rows() + subs())); - return Block(coeffs(), start, i, len, 1); - } - - /** \returns a vector expression of the main diagonal */ - inline Block diagonal() - { return Block(coeffs(),supers(),0,1,(std::min)(rows(),cols())); } - - /** \returns a vector expression of the main diagonal (const version) */ - inline const Block diagonal() const - { return Block(coeffs(),supers(),0,1,(std::min)(rows(),cols())); } - - template struct DiagonalIntReturnType { - enum { - ReturnOpposite = (Options&SelfAdjoint) && (((Index)>0 && Supers==0) || ((Index)<0 && Subs==0)), - Conjugate = ReturnOpposite && NumTraits::IsComplex, - ActualIndex = ReturnOpposite ? -Index : Index, - DiagonalSize = (RowsAtCompileTime==Dynamic || ColsAtCompileTime==Dynamic) - ? Dynamic - : (ActualIndex<0 - ? EIGEN_SIZE_MIN_PREFER_DYNAMIC(ColsAtCompileTime, RowsAtCompileTime + ActualIndex) - : EIGEN_SIZE_MIN_PREFER_DYNAMIC(RowsAtCompileTime, ColsAtCompileTime - ActualIndex)) - }; - typedef Block BuildType; - typedef typename internal::conditional,BuildType >, - BuildType>::type Type; - }; - - /** \returns a vector expression of the \a N -th sub or super diagonal */ - template inline typename DiagonalIntReturnType::Type diagonal() - { - return typename DiagonalIntReturnType::BuildType(coeffs(), supers()-N, (std::max)(0,N), 1, diagonalLength(N)); - } - - /** \returns a vector expression of the \a N -th sub or super diagonal */ - template inline const typename DiagonalIntReturnType::Type diagonal() const - { - return typename DiagonalIntReturnType::BuildType(coeffs(), supers()-N, (std::max)(0,N), 1, diagonalLength(N)); - } - - /** \returns a vector expression of the \a i -th sub or super diagonal */ - inline Block diagonal(Index i) - { - eigen_assert((i<0 && -i<=subs()) || (i>=0 && i<=supers())); - return Block(coeffs(), supers()-i, std::max(0,i), 1, diagonalLength(i)); - } - - /** \returns a vector expression of the \a i -th sub or super diagonal */ - inline const Block diagonal(Index i) const - { - eigen_assert((i<0 && -i<=subs()) || (i>=0 && i<=supers())); - return Block(coeffs(), supers()-i, std::max(0,i), 1, diagonalLength(i)); - } - - template inline void evalTo(Dest& dst) const - { - dst.resize(rows(),cols()); - dst.setZero(); - dst.diagonal() = diagonal(); - for (Index i=1; i<=supers();++i) - dst.diagonal(i) = diagonal(i); - for (Index i=1; i<=subs();++i) - dst.diagonal(-i) = diagonal(-i); - } - - DenseMatrixType toDenseMatrix() const - { - DenseMatrixType res(rows(),cols()); - evalTo(res); - return res; - } - - protected: - - inline Index diagonalLength(Index i) const - { return i<0 ? (std::min)(cols(),rows()+i) : (std::min)(rows(),cols()-i); } -}; - -/** - * \class BandMatrix - * \ingroup Core_Module - * - * \brief Represents a rectangular matrix with a banded storage - * - * \tparam _Scalar Numeric type, i.e. float, double, int - * \tparam _Rows Number of rows, or \b Dynamic - * \tparam _Cols Number of columns, or \b Dynamic - * \tparam _Supers Number of super diagonal - * \tparam _Subs Number of sub diagonal - * \tparam _Options A combination of either \b #RowMajor or \b #ColMajor, and of \b #SelfAdjoint - * The former controls \ref TopicStorageOrders "storage order", and defaults to - * column-major. The latter controls whether the matrix represents a selfadjoint - * matrix in which case either Supers of Subs have to be null. - * - * \sa class TridiagonalMatrix - */ - -template -struct traits > -{ - typedef _Scalar Scalar; - typedef Dense StorageKind; - typedef Eigen::Index StorageIndex; - enum { - CoeffReadCost = NumTraits::ReadCost, - RowsAtCompileTime = _Rows, - ColsAtCompileTime = _Cols, - MaxRowsAtCompileTime = _Rows, - MaxColsAtCompileTime = _Cols, - Flags = LvalueBit, - Supers = _Supers, - Subs = _Subs, - Options = _Options, - DataRowsAtCompileTime = ((Supers!=Dynamic) && (Subs!=Dynamic)) ? 1 + Supers + Subs : Dynamic - }; - typedef Matrix CoefficientsType; -}; - -template -class BandMatrix : public BandMatrixBase > -{ - public: - - typedef typename internal::traits::Scalar Scalar; - typedef typename internal::traits::StorageIndex StorageIndex; - typedef typename internal::traits::CoefficientsType CoefficientsType; - - explicit inline BandMatrix(Index rows=Rows, Index cols=Cols, Index supers=Supers, Index subs=Subs) - : m_coeffs(1+supers+subs,cols), - m_rows(rows), m_supers(supers), m_subs(subs) - { - } - - /** \returns the number of columns */ - inline Index rows() const { return m_rows.value(); } - - /** \returns the number of rows */ - inline Index cols() const { return m_coeffs.cols(); } - - /** \returns the number of super diagonals */ - inline Index supers() const { return m_supers.value(); } - - /** \returns the number of sub diagonals */ - inline Index subs() const { return m_subs.value(); } - - inline const CoefficientsType& coeffs() const { return m_coeffs; } - inline CoefficientsType& coeffs() { return m_coeffs; } - - protected: - - CoefficientsType m_coeffs; - internal::variable_if_dynamic m_rows; - internal::variable_if_dynamic m_supers; - internal::variable_if_dynamic m_subs; -}; - -template -class BandMatrixWrapper; - -template -struct traits > -{ - typedef typename _CoefficientsType::Scalar Scalar; - typedef typename _CoefficientsType::StorageKind StorageKind; - typedef typename _CoefficientsType::StorageIndex StorageIndex; - enum { - CoeffReadCost = internal::traits<_CoefficientsType>::CoeffReadCost, - RowsAtCompileTime = _Rows, - ColsAtCompileTime = _Cols, - MaxRowsAtCompileTime = _Rows, - MaxColsAtCompileTime = _Cols, - Flags = LvalueBit, - Supers = _Supers, - Subs = _Subs, - Options = _Options, - DataRowsAtCompileTime = ((Supers!=Dynamic) && (Subs!=Dynamic)) ? 1 + Supers + Subs : Dynamic - }; - typedef _CoefficientsType CoefficientsType; -}; - -template -class BandMatrixWrapper : public BandMatrixBase > -{ - public: - - typedef typename internal::traits::Scalar Scalar; - typedef typename internal::traits::CoefficientsType CoefficientsType; - typedef typename internal::traits::StorageIndex StorageIndex; - - explicit inline BandMatrixWrapper(const CoefficientsType& coeffs, Index rows=_Rows, Index cols=_Cols, Index supers=_Supers, Index subs=_Subs) - : m_coeffs(coeffs), - m_rows(rows), m_supers(supers), m_subs(subs) - { - EIGEN_UNUSED_VARIABLE(cols); - //internal::assert(coeffs.cols()==cols() && (supers()+subs()+1)==coeffs.rows()); - } - - /** \returns the number of columns */ - inline Index rows() const { return m_rows.value(); } - - /** \returns the number of rows */ - inline Index cols() const { return m_coeffs.cols(); } - - /** \returns the number of super diagonals */ - inline Index supers() const { return m_supers.value(); } - - /** \returns the number of sub diagonals */ - inline Index subs() const { return m_subs.value(); } - - inline const CoefficientsType& coeffs() const { return m_coeffs; } - - protected: - - const CoefficientsType& m_coeffs; - internal::variable_if_dynamic m_rows; - internal::variable_if_dynamic m_supers; - internal::variable_if_dynamic m_subs; -}; - -/** - * \class TridiagonalMatrix - * \ingroup Core_Module - * - * \brief Represents a tridiagonal matrix with a compact banded storage - * - * \tparam Scalar Numeric type, i.e. float, double, int - * \tparam Size Number of rows and cols, or \b Dynamic - * \tparam Options Can be 0 or \b SelfAdjoint - * - * \sa class BandMatrix - */ -template -class TridiagonalMatrix : public BandMatrix -{ - typedef BandMatrix Base; - typedef typename Base::StorageIndex StorageIndex; - public: - explicit TridiagonalMatrix(Index size = Size) : Base(size,size,Options&SelfAdjoint?0:1,1) {} - - inline typename Base::template DiagonalIntReturnType<1>::Type super() - { return Base::template diagonal<1>(); } - inline const typename Base::template DiagonalIntReturnType<1>::Type super() const - { return Base::template diagonal<1>(); } - inline typename Base::template DiagonalIntReturnType<-1>::Type sub() - { return Base::template diagonal<-1>(); } - inline const typename Base::template DiagonalIntReturnType<-1>::Type sub() const - { return Base::template diagonal<-1>(); } - protected: -}; - - -struct BandShape {}; - -template -struct evaluator_traits > - : public evaluator_traits_base > -{ - typedef BandShape Shape; -}; - -template -struct evaluator_traits > - : public evaluator_traits_base > -{ - typedef BandShape Shape; -}; - -template<> struct AssignmentKind { typedef EigenBase2EigenBase Kind; }; - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_BANDMATRIX_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Block.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Block.h deleted file mode 100644 index 11de45c2..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Block.h +++ /dev/null @@ -1,452 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// Copyright (C) 2006-2010 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_BLOCK_H -#define EIGEN_BLOCK_H - -namespace Eigen { - -namespace internal { -template -struct traits > : traits -{ - typedef typename traits::Scalar Scalar; - typedef typename traits::StorageKind StorageKind; - typedef typename traits::XprKind XprKind; - typedef typename ref_selector::type XprTypeNested; - typedef typename remove_reference::type _XprTypeNested; - enum{ - MatrixRows = traits::RowsAtCompileTime, - MatrixCols = traits::ColsAtCompileTime, - RowsAtCompileTime = MatrixRows == 0 ? 0 : BlockRows, - ColsAtCompileTime = MatrixCols == 0 ? 0 : BlockCols, - MaxRowsAtCompileTime = BlockRows==0 ? 0 - : RowsAtCompileTime != Dynamic ? int(RowsAtCompileTime) - : int(traits::MaxRowsAtCompileTime), - MaxColsAtCompileTime = BlockCols==0 ? 0 - : ColsAtCompileTime != Dynamic ? int(ColsAtCompileTime) - : int(traits::MaxColsAtCompileTime), - - XprTypeIsRowMajor = (int(traits::Flags)&RowMajorBit) != 0, - IsRowMajor = (MaxRowsAtCompileTime==1&&MaxColsAtCompileTime!=1) ? 1 - : (MaxColsAtCompileTime==1&&MaxRowsAtCompileTime!=1) ? 0 - : XprTypeIsRowMajor, - HasSameStorageOrderAsXprType = (IsRowMajor == XprTypeIsRowMajor), - InnerSize = IsRowMajor ? int(ColsAtCompileTime) : int(RowsAtCompileTime), - InnerStrideAtCompileTime = HasSameStorageOrderAsXprType - ? int(inner_stride_at_compile_time::ret) - : int(outer_stride_at_compile_time::ret), - OuterStrideAtCompileTime = HasSameStorageOrderAsXprType - ? int(outer_stride_at_compile_time::ret) - : int(inner_stride_at_compile_time::ret), - - // FIXME, this traits is rather specialized for dense object and it needs to be cleaned further - FlagsLvalueBit = is_lvalue::value ? LvalueBit : 0, - FlagsRowMajorBit = IsRowMajor ? RowMajorBit : 0, - Flags = (traits::Flags & (DirectAccessBit | (InnerPanel?CompressedAccessBit:0))) | FlagsLvalueBit | FlagsRowMajorBit, - // FIXME DirectAccessBit should not be handled by expressions - // - // Alignment is needed by MapBase's assertions - // We can sefely set it to false here. Internal alignment errors will be detected by an eigen_internal_assert in the respective evaluator - Alignment = 0 - }; -}; - -template::ret> class BlockImpl_dense; - -} // end namespace internal - -template class BlockImpl; - -/** \class Block - * \ingroup Core_Module - * - * \brief Expression of a fixed-size or dynamic-size block - * - * \tparam XprType the type of the expression in which we are taking a block - * \tparam BlockRows the number of rows of the block we are taking at compile time (optional) - * \tparam BlockCols the number of columns of the block we are taking at compile time (optional) - * \tparam InnerPanel is true, if the block maps to a set of rows of a row major matrix or - * to set of columns of a column major matrix (optional). The parameter allows to determine - * at compile time whether aligned access is possible on the block expression. - * - * This class represents an expression of either a fixed-size or dynamic-size block. It is the return - * type of DenseBase::block(Index,Index,Index,Index) and DenseBase::block(Index,Index) and - * most of the time this is the only way it is used. - * - * However, if you want to directly maniputate block expressions, - * for instance if you want to write a function returning such an expression, you - * will need to use this class. - * - * Here is an example illustrating the dynamic case: - * \include class_Block.cpp - * Output: \verbinclude class_Block.out - * - * \note Even though this expression has dynamic size, in the case where \a XprType - * has fixed size, this expression inherits a fixed maximal size which means that evaluating - * it does not cause a dynamic memory allocation. - * - * Here is an example illustrating the fixed-size case: - * \include class_FixedBlock.cpp - * Output: \verbinclude class_FixedBlock.out - * - * \sa DenseBase::block(Index,Index,Index,Index), DenseBase::block(Index,Index), class VectorBlock - */ -template class Block - : public BlockImpl::StorageKind> -{ - typedef BlockImpl::StorageKind> Impl; - public: - //typedef typename Impl::Base Base; - typedef Impl Base; - EIGEN_GENERIC_PUBLIC_INTERFACE(Block) - EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Block) - - typedef typename internal::remove_all::type NestedExpression; - - /** Column or Row constructor - */ - EIGEN_DEVICE_FUNC - inline Block(XprType& xpr, Index i) : Impl(xpr,i) - { - eigen_assert( (i>=0) && ( - ((BlockRows==1) && (BlockCols==XprType::ColsAtCompileTime) && i= 0 && BlockRows >= 0 && startRow + BlockRows <= xpr.rows() - && startCol >= 0 && BlockCols >= 0 && startCol + BlockCols <= xpr.cols()); - } - - /** Dynamic-size constructor - */ - EIGEN_DEVICE_FUNC - inline Block(XprType& xpr, - Index startRow, Index startCol, - Index blockRows, Index blockCols) - : Impl(xpr, startRow, startCol, blockRows, blockCols) - { - eigen_assert((RowsAtCompileTime==Dynamic || RowsAtCompileTime==blockRows) - && (ColsAtCompileTime==Dynamic || ColsAtCompileTime==blockCols)); - eigen_assert(startRow >= 0 && blockRows >= 0 && startRow <= xpr.rows() - blockRows - && startCol >= 0 && blockCols >= 0 && startCol <= xpr.cols() - blockCols); - } -}; - -// The generic default implementation for dense block simplu forward to the internal::BlockImpl_dense -// that must be specialized for direct and non-direct access... -template -class BlockImpl - : public internal::BlockImpl_dense -{ - typedef internal::BlockImpl_dense Impl; - typedef typename XprType::StorageIndex StorageIndex; - public: - typedef Impl Base; - EIGEN_INHERIT_ASSIGNMENT_OPERATORS(BlockImpl) - EIGEN_DEVICE_FUNC inline BlockImpl(XprType& xpr, Index i) : Impl(xpr,i) {} - EIGEN_DEVICE_FUNC inline BlockImpl(XprType& xpr, Index startRow, Index startCol) : Impl(xpr, startRow, startCol) {} - EIGEN_DEVICE_FUNC - inline BlockImpl(XprType& xpr, Index startRow, Index startCol, Index blockRows, Index blockCols) - : Impl(xpr, startRow, startCol, blockRows, blockCols) {} -}; - -namespace internal { - -/** \internal Internal implementation of dense Blocks in the general case. */ -template class BlockImpl_dense - : public internal::dense_xpr_base >::type -{ - typedef Block BlockType; - typedef typename internal::ref_selector::non_const_type XprTypeNested; - public: - - typedef typename internal::dense_xpr_base::type Base; - EIGEN_DENSE_PUBLIC_INTERFACE(BlockType) - EIGEN_INHERIT_ASSIGNMENT_OPERATORS(BlockImpl_dense) - - // class InnerIterator; // FIXME apparently never used - - /** Column or Row constructor - */ - EIGEN_DEVICE_FUNC - inline BlockImpl_dense(XprType& xpr, Index i) - : m_xpr(xpr), - // It is a row if and only if BlockRows==1 and BlockCols==XprType::ColsAtCompileTime, - // and it is a column if and only if BlockRows==XprType::RowsAtCompileTime and BlockCols==1, - // all other cases are invalid. - // The case a 1x1 matrix seems ambiguous, but the result is the same anyway. - m_startRow( (BlockRows==1) && (BlockCols==XprType::ColsAtCompileTime) ? i : 0), - m_startCol( (BlockRows==XprType::RowsAtCompileTime) && (BlockCols==1) ? i : 0), - m_blockRows(BlockRows==1 ? 1 : xpr.rows()), - m_blockCols(BlockCols==1 ? 1 : xpr.cols()) - {} - - /** Fixed-size constructor - */ - EIGEN_DEVICE_FUNC - inline BlockImpl_dense(XprType& xpr, Index startRow, Index startCol) - : m_xpr(xpr), m_startRow(startRow), m_startCol(startCol), - m_blockRows(BlockRows), m_blockCols(BlockCols) - {} - - /** Dynamic-size constructor - */ - EIGEN_DEVICE_FUNC - inline BlockImpl_dense(XprType& xpr, - Index startRow, Index startCol, - Index blockRows, Index blockCols) - : m_xpr(xpr), m_startRow(startRow), m_startCol(startCol), - m_blockRows(blockRows), m_blockCols(blockCols) - {} - - EIGEN_DEVICE_FUNC inline Index rows() const { return m_blockRows.value(); } - EIGEN_DEVICE_FUNC inline Index cols() const { return m_blockCols.value(); } - - EIGEN_DEVICE_FUNC - inline Scalar& coeffRef(Index rowId, Index colId) - { - EIGEN_STATIC_ASSERT_LVALUE(XprType) - return m_xpr.coeffRef(rowId + m_startRow.value(), colId + m_startCol.value()); - } - - EIGEN_DEVICE_FUNC - inline const Scalar& coeffRef(Index rowId, Index colId) const - { - return m_xpr.derived().coeffRef(rowId + m_startRow.value(), colId + m_startCol.value()); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const CoeffReturnType coeff(Index rowId, Index colId) const - { - return m_xpr.coeff(rowId + m_startRow.value(), colId + m_startCol.value()); - } - - EIGEN_DEVICE_FUNC - inline Scalar& coeffRef(Index index) - { - EIGEN_STATIC_ASSERT_LVALUE(XprType) - return m_xpr.coeffRef(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index), - m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0)); - } - - EIGEN_DEVICE_FUNC - inline const Scalar& coeffRef(Index index) const - { - return m_xpr.coeffRef(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index), - m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0)); - } - - EIGEN_DEVICE_FUNC - inline const CoeffReturnType coeff(Index index) const - { - return m_xpr.coeff(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index), - m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0)); - } - - template - inline PacketScalar packet(Index rowId, Index colId) const - { - return m_xpr.template packet(rowId + m_startRow.value(), colId + m_startCol.value()); - } - - template - inline void writePacket(Index rowId, Index colId, const PacketScalar& val) - { - m_xpr.template writePacket(rowId + m_startRow.value(), colId + m_startCol.value(), val); - } - - template - inline PacketScalar packet(Index index) const - { - return m_xpr.template packet - (m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index), - m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0)); - } - - template - inline void writePacket(Index index, const PacketScalar& val) - { - m_xpr.template writePacket - (m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index), - m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0), val); - } - - #ifdef EIGEN_PARSED_BY_DOXYGEN - /** \sa MapBase::data() */ - EIGEN_DEVICE_FUNC inline const Scalar* data() const; - EIGEN_DEVICE_FUNC inline Index innerStride() const; - EIGEN_DEVICE_FUNC inline Index outerStride() const; - #endif - - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& nestedExpression() const - { - return m_xpr; - } - - EIGEN_DEVICE_FUNC - XprType& nestedExpression() { return m_xpr; } - - EIGEN_DEVICE_FUNC - StorageIndex startRow() const - { - return m_startRow.value(); - } - - EIGEN_DEVICE_FUNC - StorageIndex startCol() const - { - return m_startCol.value(); - } - - protected: - - XprTypeNested m_xpr; - const internal::variable_if_dynamic m_startRow; - const internal::variable_if_dynamic m_startCol; - const internal::variable_if_dynamic m_blockRows; - const internal::variable_if_dynamic m_blockCols; -}; - -/** \internal Internal implementation of dense Blocks in the direct access case.*/ -template -class BlockImpl_dense - : public MapBase > -{ - typedef Block BlockType; - typedef typename internal::ref_selector::non_const_type XprTypeNested; - enum { - XprTypeIsRowMajor = (int(traits::Flags)&RowMajorBit) != 0 - }; - public: - - typedef MapBase Base; - EIGEN_DENSE_PUBLIC_INTERFACE(BlockType) - EIGEN_INHERIT_ASSIGNMENT_OPERATORS(BlockImpl_dense) - - /** Column or Row constructor - */ - EIGEN_DEVICE_FUNC - inline BlockImpl_dense(XprType& xpr, Index i) - : Base(xpr.data() + i * ( ((BlockRows==1) && (BlockCols==XprType::ColsAtCompileTime) && (!XprTypeIsRowMajor)) - || ((BlockRows==XprType::RowsAtCompileTime) && (BlockCols==1) && ( XprTypeIsRowMajor)) ? xpr.innerStride() : xpr.outerStride()), - BlockRows==1 ? 1 : xpr.rows(), - BlockCols==1 ? 1 : xpr.cols()), - m_xpr(xpr), - m_startRow( (BlockRows==1) && (BlockCols==XprType::ColsAtCompileTime) ? i : 0), - m_startCol( (BlockRows==XprType::RowsAtCompileTime) && (BlockCols==1) ? i : 0) - { - init(); - } - - /** Fixed-size constructor - */ - EIGEN_DEVICE_FUNC - inline BlockImpl_dense(XprType& xpr, Index startRow, Index startCol) - : Base(xpr.data()+xpr.innerStride()*(XprTypeIsRowMajor?startCol:startRow) + xpr.outerStride()*(XprTypeIsRowMajor?startRow:startCol)), - m_xpr(xpr), m_startRow(startRow), m_startCol(startCol) - { - init(); - } - - /** Dynamic-size constructor - */ - EIGEN_DEVICE_FUNC - inline BlockImpl_dense(XprType& xpr, - Index startRow, Index startCol, - Index blockRows, Index blockCols) - : Base(xpr.data()+xpr.innerStride()*(XprTypeIsRowMajor?startCol:startRow) + xpr.outerStride()*(XprTypeIsRowMajor?startRow:startCol), blockRows, blockCols), - m_xpr(xpr), m_startRow(startRow), m_startCol(startCol) - { - init(); - } - - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& nestedExpression() const - { - return m_xpr; - } - - EIGEN_DEVICE_FUNC - XprType& nestedExpression() { return m_xpr; } - - /** \sa MapBase::innerStride() */ - EIGEN_DEVICE_FUNC - inline Index innerStride() const - { - return internal::traits::HasSameStorageOrderAsXprType - ? m_xpr.innerStride() - : m_xpr.outerStride(); - } - - /** \sa MapBase::outerStride() */ - EIGEN_DEVICE_FUNC - inline Index outerStride() const - { - return m_outerStride; - } - - EIGEN_DEVICE_FUNC - StorageIndex startRow() const - { - return m_startRow.value(); - } - - EIGEN_DEVICE_FUNC - StorageIndex startCol() const - { - return m_startCol.value(); - } - - #ifndef __SUNPRO_CC - // FIXME sunstudio is not friendly with the above friend... - // META-FIXME there is no 'friend' keyword around here. Is this obsolete? - protected: - #endif - - #ifndef EIGEN_PARSED_BY_DOXYGEN - /** \internal used by allowAligned() */ - EIGEN_DEVICE_FUNC - inline BlockImpl_dense(XprType& xpr, const Scalar* data, Index blockRows, Index blockCols) - : Base(data, blockRows, blockCols), m_xpr(xpr) - { - init(); - } - #endif - - protected: - EIGEN_DEVICE_FUNC - void init() - { - m_outerStride = internal::traits::HasSameStorageOrderAsXprType - ? m_xpr.outerStride() - : m_xpr.innerStride(); - } - - XprTypeNested m_xpr; - const internal::variable_if_dynamic m_startRow; - const internal::variable_if_dynamic m_startCol; - Index m_outerStride; -}; - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_BLOCK_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/BooleanRedux.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/BooleanRedux.h deleted file mode 100644 index ccf51906..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/BooleanRedux.h +++ /dev/null @@ -1,162 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_ALLANDANY_H -#define EIGEN_ALLANDANY_H - -namespace Eigen { - -namespace internal { - -template -struct all_unroller -{ - enum { - col = (UnrollCount-1) / Rows, - row = (UnrollCount-1) % Rows - }; - - static inline bool run(const Derived &mat) - { - return all_unroller::run(mat) && mat.coeff(row, col); - } -}; - -template -struct all_unroller -{ - static inline bool run(const Derived &/*mat*/) { return true; } -}; - -template -struct all_unroller -{ - static inline bool run(const Derived &) { return false; } -}; - -template -struct any_unroller -{ - enum { - col = (UnrollCount-1) / Rows, - row = (UnrollCount-1) % Rows - }; - - static inline bool run(const Derived &mat) - { - return any_unroller::run(mat) || mat.coeff(row, col); - } -}; - -template -struct any_unroller -{ - static inline bool run(const Derived & /*mat*/) { return false; } -}; - -template -struct any_unroller -{ - static inline bool run(const Derived &) { return false; } -}; - -} // end namespace internal - -/** \returns true if all coefficients are true - * - * Example: \include MatrixBase_all.cpp - * Output: \verbinclude MatrixBase_all.out - * - * \sa any(), Cwise::operator<() - */ -template -EIGEN_DEVICE_FUNC inline bool DenseBase::all() const -{ - typedef internal::evaluator Evaluator; - enum { - unroll = SizeAtCompileTime != Dynamic - && SizeAtCompileTime * (Evaluator::CoeffReadCost + NumTraits::AddCost) <= EIGEN_UNROLLING_LIMIT - }; - Evaluator evaluator(derived()); - if(unroll) - return internal::all_unroller::RowsAtCompileTime>::run(evaluator); - else - { - for(Index j = 0; j < cols(); ++j) - for(Index i = 0; i < rows(); ++i) - if (!evaluator.coeff(i, j)) return false; - return true; - } -} - -/** \returns true if at least one coefficient is true - * - * \sa all() - */ -template -EIGEN_DEVICE_FUNC inline bool DenseBase::any() const -{ - typedef internal::evaluator Evaluator; - enum { - unroll = SizeAtCompileTime != Dynamic - && SizeAtCompileTime * (Evaluator::CoeffReadCost + NumTraits::AddCost) <= EIGEN_UNROLLING_LIMIT - }; - Evaluator evaluator(derived()); - if(unroll) - return internal::any_unroller::RowsAtCompileTime>::run(evaluator); - else - { - for(Index j = 0; j < cols(); ++j) - for(Index i = 0; i < rows(); ++i) - if (evaluator.coeff(i, j)) return true; - return false; - } -} - -/** \returns the number of coefficients which evaluate to true - * - * \sa all(), any() - */ -template -EIGEN_DEVICE_FUNC inline Eigen::Index DenseBase::count() const -{ - return derived().template cast().template cast().sum(); -} - -/** \returns true is \c *this contains at least one Not A Number (NaN). - * - * \sa allFinite() - */ -template -inline bool DenseBase::hasNaN() const -{ -#if EIGEN_COMP_MSVC || (defined __FAST_MATH__) - return derived().array().isNaN().any(); -#else - return !((derived().array()==derived().array()).all()); -#endif -} - -/** \returns true if \c *this contains only finite numbers, i.e., no NaN and no +/-INF values. - * - * \sa hasNaN() - */ -template -inline bool DenseBase::allFinite() const -{ -#if EIGEN_COMP_MSVC || (defined __FAST_MATH__) - return derived().array().isFinite().all(); -#else - return !((derived()-derived()).hasNaN()); -#endif -} - -} // end namespace Eigen - -#endif // EIGEN_ALLANDANY_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/CommaInitializer.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/CommaInitializer.h deleted file mode 100644 index 35fdbb81..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/CommaInitializer.h +++ /dev/null @@ -1,160 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// Copyright (C) 2006-2008 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_COMMAINITIALIZER_H -#define EIGEN_COMMAINITIALIZER_H - -namespace Eigen { - -/** \class CommaInitializer - * \ingroup Core_Module - * - * \brief Helper class used by the comma initializer operator - * - * This class is internally used to implement the comma initializer feature. It is - * the return type of MatrixBase::operator<<, and most of the time this is the only - * way it is used. - * - * \sa \blank \ref MatrixBaseCommaInitRef "MatrixBase::operator<<", CommaInitializer::finished() - */ -template -struct CommaInitializer -{ - typedef typename XprType::Scalar Scalar; - - EIGEN_DEVICE_FUNC - inline CommaInitializer(XprType& xpr, const Scalar& s) - : m_xpr(xpr), m_row(0), m_col(1), m_currentBlockRows(1) - { - m_xpr.coeffRef(0,0) = s; - } - - template - EIGEN_DEVICE_FUNC - inline CommaInitializer(XprType& xpr, const DenseBase& other) - : m_xpr(xpr), m_row(0), m_col(other.cols()), m_currentBlockRows(other.rows()) - { - m_xpr.block(0, 0, other.rows(), other.cols()) = other; - } - - /* Copy/Move constructor which transfers ownership. This is crucial in - * absence of return value optimization to avoid assertions during destruction. */ - // FIXME in C++11 mode this could be replaced by a proper RValue constructor - EIGEN_DEVICE_FUNC - inline CommaInitializer(const CommaInitializer& o) - : m_xpr(o.m_xpr), m_row(o.m_row), m_col(o.m_col), m_currentBlockRows(o.m_currentBlockRows) { - // Mark original object as finished. In absence of R-value references we need to const_cast: - const_cast(o).m_row = m_xpr.rows(); - const_cast(o).m_col = m_xpr.cols(); - const_cast(o).m_currentBlockRows = 0; - } - - /* inserts a scalar value in the target matrix */ - EIGEN_DEVICE_FUNC - CommaInitializer& operator,(const Scalar& s) - { - if (m_col==m_xpr.cols()) - { - m_row+=m_currentBlockRows; - m_col = 0; - m_currentBlockRows = 1; - eigen_assert(m_row - EIGEN_DEVICE_FUNC - CommaInitializer& operator,(const DenseBase& other) - { - if (m_col==m_xpr.cols() && (other.cols()!=0 || other.rows()!=m_currentBlockRows)) - { - m_row+=m_currentBlockRows; - m_col = 0; - m_currentBlockRows = other.rows(); - eigen_assert(m_row+m_currentBlockRows<=m_xpr.rows() - && "Too many rows passed to comma initializer (operator<<)"); - } - eigen_assert((m_col + other.cols() <= m_xpr.cols()) - && "Too many coefficients passed to comma initializer (operator<<)"); - eigen_assert(m_currentBlockRows==other.rows()); - m_xpr.template block - (m_row, m_col, other.rows(), other.cols()) = other; - m_col += other.cols(); - return *this; - } - - EIGEN_DEVICE_FUNC - inline ~CommaInitializer() -#if defined VERIFY_RAISES_ASSERT && (!defined EIGEN_NO_ASSERTION_CHECKING) && defined EIGEN_EXCEPTIONS - EIGEN_EXCEPTION_SPEC(Eigen::eigen_assert_exception) -#endif - { - finished(); - } - - /** \returns the built matrix once all its coefficients have been set. - * Calling finished is 100% optional. Its purpose is to write expressions - * like this: - * \code - * quaternion.fromRotationMatrix((Matrix3f() << axis0, axis1, axis2).finished()); - * \endcode - */ - EIGEN_DEVICE_FUNC - inline XprType& finished() { - eigen_assert(((m_row+m_currentBlockRows) == m_xpr.rows() || m_xpr.cols() == 0) - && m_col == m_xpr.cols() - && "Too few coefficients passed to comma initializer (operator<<)"); - return m_xpr; - } - - XprType& m_xpr; // target expression - Index m_row; // current row id - Index m_col; // current col id - Index m_currentBlockRows; // current block height -}; - -/** \anchor MatrixBaseCommaInitRef - * Convenient operator to set the coefficients of a matrix. - * - * The coefficients must be provided in a row major order and exactly match - * the size of the matrix. Otherwise an assertion is raised. - * - * Example: \include MatrixBase_set.cpp - * Output: \verbinclude MatrixBase_set.out - * - * \note According the c++ standard, the argument expressions of this comma initializer are evaluated in arbitrary order. - * - * \sa CommaInitializer::finished(), class CommaInitializer - */ -template -EIGEN_DEVICE_FUNC inline CommaInitializer DenseBase::operator<< (const Scalar& s) -{ - return CommaInitializer(*static_cast(this), s); -} - -/** \sa operator<<(const Scalar&) */ -template -template -EIGEN_DEVICE_FUNC inline CommaInitializer -DenseBase::operator<<(const DenseBase& other) -{ - return CommaInitializer(*static_cast(this), other); -} - -} // end namespace Eigen - -#endif // EIGEN_COMMAINITIALIZER_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/ConditionEstimator.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/ConditionEstimator.h deleted file mode 100644 index aa7efdc7..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/ConditionEstimator.h +++ /dev/null @@ -1,175 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2016 Rasmus Munk Larsen (rmlarsen@google.com) -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CONDITIONESTIMATOR_H -#define EIGEN_CONDITIONESTIMATOR_H - -namespace Eigen { - -namespace internal { - -template -struct rcond_compute_sign { - static inline Vector run(const Vector& v) { - const RealVector v_abs = v.cwiseAbs(); - return (v_abs.array() == static_cast(0)) - .select(Vector::Ones(v.size()), v.cwiseQuotient(v_abs)); - } -}; - -// Partial specialization to avoid elementwise division for real vectors. -template -struct rcond_compute_sign { - static inline Vector run(const Vector& v) { - return (v.array() < static_cast(0)) - .select(-Vector::Ones(v.size()), Vector::Ones(v.size())); - } -}; - -/** - * \returns an estimate of ||inv(matrix)||_1 given a decomposition of - * \a matrix that implements .solve() and .adjoint().solve() methods. - * - * This function implements Algorithms 4.1 and 5.1 from - * http://www.maths.manchester.ac.uk/~higham/narep/narep135.pdf - * which also forms the basis for the condition number estimators in - * LAPACK. Since at most 10 calls to the solve method of dec are - * performed, the total cost is O(dims^2), as opposed to O(dims^3) - * needed to compute the inverse matrix explicitly. - * - * The most common usage is in estimating the condition number - * ||matrix||_1 * ||inv(matrix)||_1. The first term ||matrix||_1 can be - * computed directly in O(n^2) operations. - * - * Supports the following decompositions: FullPivLU, PartialPivLU, LDLT, and - * LLT. - * - * \sa FullPivLU, PartialPivLU, LDLT, LLT. - */ -template -typename Decomposition::RealScalar rcond_invmatrix_L1_norm_estimate(const Decomposition& dec) -{ - typedef typename Decomposition::MatrixType MatrixType; - typedef typename Decomposition::Scalar Scalar; - typedef typename Decomposition::RealScalar RealScalar; - typedef typename internal::plain_col_type::type Vector; - typedef typename internal::plain_col_type::type RealVector; - const bool is_complex = (NumTraits::IsComplex != 0); - - eigen_assert(dec.rows() == dec.cols()); - const Index n = dec.rows(); - if (n == 0) - return 0; - - // Disable Index to float conversion warning -#ifdef __INTEL_COMPILER - #pragma warning push - #pragma warning ( disable : 2259 ) -#endif - Vector v = dec.solve(Vector::Ones(n) / Scalar(n)); -#ifdef __INTEL_COMPILER - #pragma warning pop -#endif - - // lower_bound is a lower bound on - // ||inv(matrix)||_1 = sup_v ||inv(matrix) v||_1 / ||v||_1 - // and is the objective maximized by the ("super-") gradient ascent - // algorithm below. - RealScalar lower_bound = v.template lpNorm<1>(); - if (n == 1) - return lower_bound; - - // Gradient ascent algorithm follows: We know that the optimum is achieved at - // one of the simplices v = e_i, so in each iteration we follow a - // super-gradient to move towards the optimal one. - RealScalar old_lower_bound = lower_bound; - Vector sign_vector(n); - Vector old_sign_vector; - Index v_max_abs_index = -1; - Index old_v_max_abs_index = v_max_abs_index; - for (int k = 0; k < 4; ++k) - { - sign_vector = internal::rcond_compute_sign::run(v); - if (k > 0 && !is_complex && sign_vector == old_sign_vector) { - // Break if the solution stagnated. - break; - } - // v_max_abs_index = argmax |real( inv(matrix)^T * sign_vector )| - v = dec.adjoint().solve(sign_vector); - v.real().cwiseAbs().maxCoeff(&v_max_abs_index); - if (v_max_abs_index == old_v_max_abs_index) { - // Break if the solution stagnated. - break; - } - // Move to the new simplex e_j, where j = v_max_abs_index. - v = dec.solve(Vector::Unit(n, v_max_abs_index)); // v = inv(matrix) * e_j. - lower_bound = v.template lpNorm<1>(); - if (lower_bound <= old_lower_bound) { - // Break if the gradient step did not increase the lower_bound. - break; - } - if (!is_complex) { - old_sign_vector = sign_vector; - } - old_v_max_abs_index = v_max_abs_index; - old_lower_bound = lower_bound; - } - // The following calculates an independent estimate of ||matrix||_1 by - // multiplying matrix by a vector with entries of slowly increasing - // magnitude and alternating sign: - // v_i = (-1)^{i} (1 + (i / (dim-1))), i = 0,...,dim-1. - // This improvement to Hager's algorithm above is due to Higham. It was - // added to make the algorithm more robust in certain corner cases where - // large elements in the matrix might otherwise escape detection due to - // exact cancellation (especially when op and op_adjoint correspond to a - // sequence of backsubstitutions and permutations), which could cause - // Hager's algorithm to vastly underestimate ||matrix||_1. - Scalar alternating_sign(RealScalar(1)); - for (Index i = 0; i < n; ++i) { - // The static_cast is needed when Scalar is a complex and RealScalar implements expression templates - v[i] = alternating_sign * static_cast(RealScalar(1) + (RealScalar(i) / (RealScalar(n - 1)))); - alternating_sign = -alternating_sign; - } - v = dec.solve(v); - const RealScalar alternate_lower_bound = (2 * v.template lpNorm<1>()) / (3 * RealScalar(n)); - return numext::maxi(lower_bound, alternate_lower_bound); -} - -/** \brief Reciprocal condition number estimator. - * - * Computing a decomposition of a dense matrix takes O(n^3) operations, while - * this method estimates the condition number quickly and reliably in O(n^2) - * operations. - * - * \returns an estimate of the reciprocal condition number - * (1 / (||matrix||_1 * ||inv(matrix)||_1)) of matrix, given ||matrix||_1 and - * its decomposition. Supports the following decompositions: FullPivLU, - * PartialPivLU, LDLT, and LLT. - * - * \sa FullPivLU, PartialPivLU, LDLT, LLT. - */ -template -typename Decomposition::RealScalar -rcond_estimate_helper(typename Decomposition::RealScalar matrix_norm, const Decomposition& dec) -{ - typedef typename Decomposition::RealScalar RealScalar; - eigen_assert(dec.rows() == dec.cols()); - if (dec.rows() == 0) return RealScalar(1); - if (matrix_norm == RealScalar(0)) return RealScalar(0); - if (dec.rows() == 1) return RealScalar(1); - const RealScalar inverse_matrix_norm = rcond_invmatrix_L1_norm_estimate(dec); - return (inverse_matrix_norm == RealScalar(0) ? RealScalar(0) - : (RealScalar(1) / inverse_matrix_norm) / matrix_norm); -} - -} // namespace internal - -} // namespace Eigen - -#endif diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/CoreEvaluators.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/CoreEvaluators.h deleted file mode 100644 index 15b361b3..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/CoreEvaluators.h +++ /dev/null @@ -1,1728 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2011 Benoit Jacob -// Copyright (C) 2011-2014 Gael Guennebaud -// Copyright (C) 2011-2012 Jitse Niesen -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - - -#ifndef EIGEN_COREEVALUATORS_H -#define EIGEN_COREEVALUATORS_H - -namespace Eigen { - -namespace internal { - -// This class returns the evaluator kind from the expression storage kind. -// Default assumes index based accessors -template -struct storage_kind_to_evaluator_kind { - typedef IndexBased Kind; -}; - -// This class returns the evaluator shape from the expression storage kind. -// It can be Dense, Sparse, Triangular, Diagonal, SelfAdjoint, Band, etc. -template struct storage_kind_to_shape; - -template<> struct storage_kind_to_shape { typedef DenseShape Shape; }; -template<> struct storage_kind_to_shape { typedef SolverShape Shape; }; -template<> struct storage_kind_to_shape { typedef PermutationShape Shape; }; -template<> struct storage_kind_to_shape { typedef TranspositionsShape Shape; }; - -// Evaluators have to be specialized with respect to various criteria such as: -// - storage/structure/shape -// - scalar type -// - etc. -// Therefore, we need specialization of evaluator providing additional template arguments for each kind of evaluators. -// We currently distinguish the following kind of evaluators: -// - unary_evaluator for expressions taking only one arguments (CwiseUnaryOp, CwiseUnaryView, Transpose, MatrixWrapper, ArrayWrapper, Reverse, Replicate) -// - binary_evaluator for expression taking two arguments (CwiseBinaryOp) -// - ternary_evaluator for expression taking three arguments (CwiseTernaryOp) -// - product_evaluator for linear algebra products (Product); special case of binary_evaluator because it requires additional tags for dispatching. -// - mapbase_evaluator for Map, Block, Ref -// - block_evaluator for Block (special dispatching to a mapbase_evaluator or unary_evaluator) - -template< typename T, - typename Arg1Kind = typename evaluator_traits::Kind, - typename Arg2Kind = typename evaluator_traits::Kind, - typename Arg3Kind = typename evaluator_traits::Kind, - typename Arg1Scalar = typename traits::Scalar, - typename Arg2Scalar = typename traits::Scalar, - typename Arg3Scalar = typename traits::Scalar> struct ternary_evaluator; - -template< typename T, - typename LhsKind = typename evaluator_traits::Kind, - typename RhsKind = typename evaluator_traits::Kind, - typename LhsScalar = typename traits::Scalar, - typename RhsScalar = typename traits::Scalar> struct binary_evaluator; - -template< typename T, - typename Kind = typename evaluator_traits::Kind, - typename Scalar = typename T::Scalar> struct unary_evaluator; - -// evaluator_traits contains traits for evaluator - -template -struct evaluator_traits_base -{ - // by default, get evaluator kind and shape from storage - typedef typename storage_kind_to_evaluator_kind::StorageKind>::Kind Kind; - typedef typename storage_kind_to_shape::StorageKind>::Shape Shape; -}; - -// Default evaluator traits -template -struct evaluator_traits : public evaluator_traits_base -{ -}; - -template::Shape > -struct evaluator_assume_aliasing { - static const bool value = false; -}; - -// By default, we assume a unary expression: -template -struct evaluator : public unary_evaluator -{ - typedef unary_evaluator Base; - EIGEN_DEVICE_FUNC explicit evaluator(const T& xpr) : Base(xpr) {} -}; - - -// TODO: Think about const-correctness -template -struct evaluator - : evaluator -{ - EIGEN_DEVICE_FUNC - explicit evaluator(const T& xpr) : evaluator(xpr) {} -}; - -// ---------- base class for all evaluators ---------- - -template -struct evaluator_base -{ - // TODO that's not very nice to have to propagate all these traits. They are currently only needed to handle outer,inner indices. - typedef traits ExpressionTraits; - - enum { - Alignment = 0 - }; - // noncopyable: - // Don't make this class inherit noncopyable as this kills EBO (Empty Base Optimization) - // and make complex evaluator much larger than then should do. - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE evaluator_base() {} - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ~evaluator_base() {} -private: - EIGEN_DEVICE_FUNC evaluator_base(const evaluator_base&); - EIGEN_DEVICE_FUNC const evaluator_base& operator=(const evaluator_base&); -}; - -// -------------------- Matrix and Array -------------------- -// -// evaluator is a common base class for the -// Matrix and Array evaluators. -// Here we directly specialize evaluator. This is not really a unary expression, and it is, by definition, dense, -// so no need for more sophisticated dispatching. - -// this helper permits to completely eliminate m_outerStride if it is known at compiletime. -template class plainobjectbase_evaluator_data { -public: - EIGEN_DEVICE_FUNC plainobjectbase_evaluator_data(const Scalar* ptr, Index outerStride) : data(ptr) - { - EIGEN_ONLY_USED_FOR_DEBUG(outerStride); - eigen_internal_assert(outerStride==OuterStride); - } - EIGEN_DEVICE_FUNC Index outerStride() const { return OuterStride; } - const Scalar *data; -}; - -template class plainobjectbase_evaluator_data { -public: - EIGEN_DEVICE_FUNC plainobjectbase_evaluator_data(const Scalar* ptr, Index outerStride) : data(ptr), m_outerStride(outerStride) {} - EIGEN_DEVICE_FUNC Index outerStride() const { return m_outerStride; } - const Scalar *data; -protected: - Index m_outerStride; -}; - -template -struct evaluator > - : evaluator_base -{ - typedef PlainObjectBase PlainObjectType; - typedef typename PlainObjectType::Scalar Scalar; - typedef typename PlainObjectType::CoeffReturnType CoeffReturnType; - - enum { - IsRowMajor = PlainObjectType::IsRowMajor, - IsVectorAtCompileTime = PlainObjectType::IsVectorAtCompileTime, - RowsAtCompileTime = PlainObjectType::RowsAtCompileTime, - ColsAtCompileTime = PlainObjectType::ColsAtCompileTime, - - CoeffReadCost = NumTraits::ReadCost, - Flags = traits::EvaluatorFlags, - Alignment = traits::Alignment - }; - enum { - // We do not need to know the outer stride for vectors - OuterStrideAtCompileTime = IsVectorAtCompileTime ? 0 - : int(IsRowMajor) ? ColsAtCompileTime - : RowsAtCompileTime - }; - - EIGEN_DEVICE_FUNC evaluator() - : m_d(0,OuterStrideAtCompileTime) - { - EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost); - } - - EIGEN_DEVICE_FUNC explicit evaluator(const PlainObjectType& m) - : m_d(m.data(),IsVectorAtCompileTime ? 0 : m.outerStride()) - { - EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index row, Index col) const - { - if (IsRowMajor) - return m_d.data[row * m_d.outerStride() + col]; - else - return m_d.data[row + col * m_d.outerStride()]; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index index) const - { - return m_d.data[index]; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Scalar& coeffRef(Index row, Index col) - { - if (IsRowMajor) - return const_cast(m_d.data)[row * m_d.outerStride() + col]; - else - return const_cast(m_d.data)[row + col * m_d.outerStride()]; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Scalar& coeffRef(Index index) - { - return const_cast(m_d.data)[index]; - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index row, Index col) const - { - if (IsRowMajor) - return ploadt(m_d.data + row * m_d.outerStride() + col); - else - return ploadt(m_d.data + row + col * m_d.outerStride()); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index index) const - { - return ploadt(m_d.data + index); - } - - template - EIGEN_STRONG_INLINE - void writePacket(Index row, Index col, const PacketType& x) - { - if (IsRowMajor) - return pstoret - (const_cast(m_d.data) + row * m_d.outerStride() + col, x); - else - return pstoret - (const_cast(m_d.data) + row + col * m_d.outerStride(), x); - } - - template - EIGEN_STRONG_INLINE - void writePacket(Index index, const PacketType& x) - { - return pstoret(const_cast(m_d.data) + index, x); - } - -protected: - - plainobjectbase_evaluator_data m_d; -}; - -template -struct evaluator > - : evaluator > > -{ - typedef Matrix XprType; - - EIGEN_DEVICE_FUNC evaluator() {} - - EIGEN_DEVICE_FUNC explicit evaluator(const XprType& m) - : evaluator >(m) - { } -}; - -template -struct evaluator > - : evaluator > > -{ - typedef Array XprType; - - EIGEN_DEVICE_FUNC evaluator() {} - - EIGEN_DEVICE_FUNC explicit evaluator(const XprType& m) - : evaluator >(m) - { } -}; - -// -------------------- Transpose -------------------- - -template -struct unary_evaluator, IndexBased> - : evaluator_base > -{ - typedef Transpose XprType; - - enum { - CoeffReadCost = evaluator::CoeffReadCost, - Flags = evaluator::Flags ^ RowMajorBit, - Alignment = evaluator::Alignment - }; - - EIGEN_DEVICE_FUNC explicit unary_evaluator(const XprType& t) : m_argImpl(t.nestedExpression()) {} - - typedef typename XprType::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index row, Index col) const - { - return m_argImpl.coeff(col, row); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index index) const - { - return m_argImpl.coeff(index); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Scalar& coeffRef(Index row, Index col) - { - return m_argImpl.coeffRef(col, row); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - typename XprType::Scalar& coeffRef(Index index) - { - return m_argImpl.coeffRef(index); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index row, Index col) const - { - return m_argImpl.template packet(col, row); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index index) const - { - return m_argImpl.template packet(index); - } - - template - EIGEN_STRONG_INLINE - void writePacket(Index row, Index col, const PacketType& x) - { - m_argImpl.template writePacket(col, row, x); - } - - template - EIGEN_STRONG_INLINE - void writePacket(Index index, const PacketType& x) - { - m_argImpl.template writePacket(index, x); - } - -protected: - evaluator m_argImpl; -}; - -// -------------------- CwiseNullaryOp -------------------- -// Like Matrix and Array, this is not really a unary expression, so we directly specialize evaluator. -// Likewise, there is not need to more sophisticated dispatching here. - -template::value, - bool has_unary = has_unary_operator::value, - bool has_binary = has_binary_operator::value> -struct nullary_wrapper -{ - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const NullaryOp& op, IndexType i, IndexType j) const { return op(i,j); } - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const NullaryOp& op, IndexType i) const { return op(i); } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T packetOp(const NullaryOp& op, IndexType i, IndexType j) const { return op.template packetOp(i,j); } - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T packetOp(const NullaryOp& op, IndexType i) const { return op.template packetOp(i); } -}; - -template -struct nullary_wrapper -{ - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const NullaryOp& op, IndexType=0, IndexType=0) const { return op(); } - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T packetOp(const NullaryOp& op, IndexType=0, IndexType=0) const { return op.template packetOp(); } -}; - -template -struct nullary_wrapper -{ - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const NullaryOp& op, IndexType i, IndexType j=0) const { return op(i,j); } - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T packetOp(const NullaryOp& op, IndexType i, IndexType j=0) const { return op.template packetOp(i,j); } -}; - -// We need the following specialization for vector-only functors assigned to a runtime vector, -// for instance, using linspace and assigning a RowVectorXd to a MatrixXd or even a row of a MatrixXd. -// In this case, i==0 and j is used for the actual iteration. -template -struct nullary_wrapper -{ - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const NullaryOp& op, IndexType i, IndexType j) const { - eigen_assert(i==0 || j==0); - return op(i+j); - } - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T packetOp(const NullaryOp& op, IndexType i, IndexType j) const { - eigen_assert(i==0 || j==0); - return op.template packetOp(i+j); - } - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const NullaryOp& op, IndexType i) const { return op(i); } - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T packetOp(const NullaryOp& op, IndexType i) const { return op.template packetOp(i); } -}; - -template -struct nullary_wrapper {}; - -#if 0 && EIGEN_COMP_MSVC>0 -// Disable this ugly workaround. This is now handled in traits::match, -// but this piece of code might still become handly if some other weird compilation -// erros pop up again. - -// MSVC exhibits a weird compilation error when -// compiling: -// Eigen::MatrixXf A = MatrixXf::Random(3,3); -// Ref R = 2.f*A; -// and that has_*ary_operator> have not been instantiated yet. -// The "problem" is that evaluator<2.f*A> is instantiated by traits::match<2.f*A> -// and at that time has_*ary_operator returns true regardless of T. -// Then nullary_wrapper is badly instantiated as nullary_wrapper<.,.,true,true,true>. -// The trick is thus to defer the proper instantiation of nullary_wrapper when coeff(), -// and packet() are really instantiated as implemented below: - -// This is a simple wrapper around Index to enforce the re-instantiation of -// has_*ary_operator when needed. -template struct nullary_wrapper_workaround_msvc { - nullary_wrapper_workaround_msvc(const T&); - operator T()const; -}; - -template -struct nullary_wrapper -{ - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const NullaryOp& op, IndexType i, IndexType j) const { - return nullary_wrapper >::value, - has_unary_operator >::value, - has_binary_operator >::value>().operator()(op,i,j); - } - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const NullaryOp& op, IndexType i) const { - return nullary_wrapper >::value, - has_unary_operator >::value, - has_binary_operator >::value>().operator()(op,i); - } - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T packetOp(const NullaryOp& op, IndexType i, IndexType j) const { - return nullary_wrapper >::value, - has_unary_operator >::value, - has_binary_operator >::value>().template packetOp(op,i,j); - } - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T packetOp(const NullaryOp& op, IndexType i) const { - return nullary_wrapper >::value, - has_unary_operator >::value, - has_binary_operator >::value>().template packetOp(op,i); - } -}; -#endif // MSVC workaround - -template -struct evaluator > - : evaluator_base > -{ - typedef CwiseNullaryOp XprType; - typedef typename internal::remove_all::type PlainObjectTypeCleaned; - - enum { - CoeffReadCost = internal::functor_traits::Cost, - - Flags = (evaluator::Flags - & ( HereditaryBits - | (functor_has_linear_access::ret ? LinearAccessBit : 0) - | (functor_traits::PacketAccess ? PacketAccessBit : 0))) - | (functor_traits::IsRepeatable ? 0 : EvalBeforeNestingBit), - Alignment = AlignedMax - }; - - EIGEN_DEVICE_FUNC explicit evaluator(const XprType& n) - : m_functor(n.functor()), m_wrapper() - { - EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost); - } - - typedef typename XprType::CoeffReturnType CoeffReturnType; - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(IndexType row, IndexType col) const - { - return m_wrapper(m_functor, row, col); - } - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(IndexType index) const - { - return m_wrapper(m_functor,index); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(IndexType row, IndexType col) const - { - return m_wrapper.template packetOp(m_functor, row, col); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(IndexType index) const - { - return m_wrapper.template packetOp(m_functor, index); - } - -protected: - const NullaryOp m_functor; - const internal::nullary_wrapper m_wrapper; -}; - -// -------------------- CwiseUnaryOp -------------------- - -template -struct unary_evaluator, IndexBased > - : evaluator_base > -{ - typedef CwiseUnaryOp XprType; - - enum { - CoeffReadCost = evaluator::CoeffReadCost + functor_traits::Cost, - - Flags = evaluator::Flags - & (HereditaryBits | LinearAccessBit | (functor_traits::PacketAccess ? PacketAccessBit : 0)), - Alignment = evaluator::Alignment - }; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - explicit unary_evaluator(const XprType& op) : m_d(op) - { - EIGEN_INTERNAL_CHECK_COST_VALUE(functor_traits::Cost); - EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost); - } - - typedef typename XprType::CoeffReturnType CoeffReturnType; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index row, Index col) const - { - return m_d.func()(m_d.argImpl.coeff(row, col)); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index index) const - { - return m_d.func()(m_d.argImpl.coeff(index)); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index row, Index col) const - { - return m_d.func().packetOp(m_d.argImpl.template packet(row, col)); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index index) const - { - return m_d.func().packetOp(m_d.argImpl.template packet(index)); - } - -protected: - - // this helper permits to completely eliminate the functor if it is empty - class Data : private UnaryOp - { - public: - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Data(const XprType& xpr) : UnaryOp(xpr.functor()), argImpl(xpr.nestedExpression()) {} - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const UnaryOp& func() const { return static_cast(*this); } - evaluator argImpl; - }; - - Data m_d; -}; - -// -------------------- CwiseTernaryOp -------------------- - -// this is a ternary expression -template -struct evaluator > - : public ternary_evaluator > -{ - typedef CwiseTernaryOp XprType; - typedef ternary_evaluator > Base; - - EIGEN_DEVICE_FUNC explicit evaluator(const XprType& xpr) : Base(xpr) {} -}; - -template -struct ternary_evaluator, IndexBased, IndexBased> - : evaluator_base > -{ - typedef CwiseTernaryOp XprType; - - enum { - CoeffReadCost = evaluator::CoeffReadCost + evaluator::CoeffReadCost + evaluator::CoeffReadCost + functor_traits::Cost, - - Arg1Flags = evaluator::Flags, - Arg2Flags = evaluator::Flags, - Arg3Flags = evaluator::Flags, - SameType = is_same::value && is_same::value, - StorageOrdersAgree = (int(Arg1Flags)&RowMajorBit)==(int(Arg2Flags)&RowMajorBit) && (int(Arg1Flags)&RowMajorBit)==(int(Arg3Flags)&RowMajorBit), - Flags0 = (int(Arg1Flags) | int(Arg2Flags) | int(Arg3Flags)) & ( - HereditaryBits - | (int(Arg1Flags) & int(Arg2Flags) & int(Arg3Flags) & - ( (StorageOrdersAgree ? LinearAccessBit : 0) - | (functor_traits::PacketAccess && StorageOrdersAgree && SameType ? PacketAccessBit : 0) - ) - ) - ), - Flags = (Flags0 & ~RowMajorBit) | (Arg1Flags & RowMajorBit), - Alignment = EIGEN_PLAIN_ENUM_MIN( - EIGEN_PLAIN_ENUM_MIN(evaluator::Alignment, evaluator::Alignment), - evaluator::Alignment) - }; - - EIGEN_DEVICE_FUNC explicit ternary_evaluator(const XprType& xpr) : m_d(xpr) - { - EIGEN_INTERNAL_CHECK_COST_VALUE(functor_traits::Cost); - EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost); - } - - typedef typename XprType::CoeffReturnType CoeffReturnType; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index row, Index col) const - { - return m_d.func()(m_d.arg1Impl.coeff(row, col), m_d.arg2Impl.coeff(row, col), m_d.arg3Impl.coeff(row, col)); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index index) const - { - return m_d.func()(m_d.arg1Impl.coeff(index), m_d.arg2Impl.coeff(index), m_d.arg3Impl.coeff(index)); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index row, Index col) const - { - return m_d.func().packetOp(m_d.arg1Impl.template packet(row, col), - m_d.arg2Impl.template packet(row, col), - m_d.arg3Impl.template packet(row, col)); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index index) const - { - return m_d.func().packetOp(m_d.arg1Impl.template packet(index), - m_d.arg2Impl.template packet(index), - m_d.arg3Impl.template packet(index)); - } - -protected: - // this helper permits to completely eliminate the functor if it is empty - struct Data : private TernaryOp - { - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Data(const XprType& xpr) : TernaryOp(xpr.functor()), arg1Impl(xpr.arg1()), arg2Impl(xpr.arg2()), arg3Impl(xpr.arg3()) {} - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TernaryOp& func() const { return static_cast(*this); } - evaluator arg1Impl; - evaluator arg2Impl; - evaluator arg3Impl; - }; - - Data m_d; -}; - -// -------------------- CwiseBinaryOp -------------------- - -// this is a binary expression -template -struct evaluator > - : public binary_evaluator > -{ - typedef CwiseBinaryOp XprType; - typedef binary_evaluator > Base; - - EIGEN_DEVICE_FUNC explicit evaluator(const XprType& xpr) : Base(xpr) {} -}; - -template -struct binary_evaluator, IndexBased, IndexBased> - : evaluator_base > -{ - typedef CwiseBinaryOp XprType; - - enum { - CoeffReadCost = evaluator::CoeffReadCost + evaluator::CoeffReadCost + functor_traits::Cost, - - LhsFlags = evaluator::Flags, - RhsFlags = evaluator::Flags, - SameType = is_same::value, - StorageOrdersAgree = (int(LhsFlags)&RowMajorBit)==(int(RhsFlags)&RowMajorBit), - Flags0 = (int(LhsFlags) | int(RhsFlags)) & ( - HereditaryBits - | (int(LhsFlags) & int(RhsFlags) & - ( (StorageOrdersAgree ? LinearAccessBit : 0) - | (functor_traits::PacketAccess && StorageOrdersAgree && SameType ? PacketAccessBit : 0) - ) - ) - ), - Flags = (Flags0 & ~RowMajorBit) | (LhsFlags & RowMajorBit), - Alignment = EIGEN_PLAIN_ENUM_MIN(evaluator::Alignment,evaluator::Alignment) - }; - - EIGEN_DEVICE_FUNC explicit binary_evaluator(const XprType& xpr) : m_d(xpr) - { - EIGEN_INTERNAL_CHECK_COST_VALUE(functor_traits::Cost); - EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost); - } - - typedef typename XprType::CoeffReturnType CoeffReturnType; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index row, Index col) const - { - return m_d.func()(m_d.lhsImpl.coeff(row, col), m_d.rhsImpl.coeff(row, col)); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index index) const - { - return m_d.func()(m_d.lhsImpl.coeff(index), m_d.rhsImpl.coeff(index)); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index row, Index col) const - { - return m_d.func().packetOp(m_d.lhsImpl.template packet(row, col), - m_d.rhsImpl.template packet(row, col)); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index index) const - { - return m_d.func().packetOp(m_d.lhsImpl.template packet(index), - m_d.rhsImpl.template packet(index)); - } - -protected: - - // this helper permits to completely eliminate the functor if it is empty - struct Data : private BinaryOp - { - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Data(const XprType& xpr) : BinaryOp(xpr.functor()), lhsImpl(xpr.lhs()), rhsImpl(xpr.rhs()) {} - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const BinaryOp& func() const { return static_cast(*this); } - evaluator lhsImpl; - evaluator rhsImpl; - }; - - Data m_d; -}; - -// -------------------- CwiseUnaryView -------------------- - -template -struct unary_evaluator, IndexBased> - : evaluator_base > -{ - typedef CwiseUnaryView XprType; - - enum { - CoeffReadCost = evaluator::CoeffReadCost + functor_traits::Cost, - - Flags = (evaluator::Flags & (HereditaryBits | LinearAccessBit | DirectAccessBit)), - - Alignment = 0 // FIXME it is not very clear why alignment is necessarily lost... - }; - - EIGEN_DEVICE_FUNC explicit unary_evaluator(const XprType& op) : m_d(op) - { - EIGEN_INTERNAL_CHECK_COST_VALUE(functor_traits::Cost); - EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost); - } - - typedef typename XprType::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index row, Index col) const - { - return m_d.func()(m_d.argImpl.coeff(row, col)); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index index) const - { - return m_d.func()(m_d.argImpl.coeff(index)); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Scalar& coeffRef(Index row, Index col) - { - return m_d.func()(m_d.argImpl.coeffRef(row, col)); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Scalar& coeffRef(Index index) - { - return m_d.func()(m_d.argImpl.coeffRef(index)); - } - -protected: - - // this helper permits to completely eliminate the functor if it is empty - struct Data : private UnaryOp - { - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Data(const XprType& xpr) : UnaryOp(xpr.functor()), argImpl(xpr.nestedExpression()) {} - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const UnaryOp& func() const { return static_cast(*this); } - evaluator argImpl; - }; - - Data m_d; -}; - -// -------------------- Map -------------------- - -// FIXME perhaps the PlainObjectType could be provided by Derived::PlainObject ? -// but that might complicate template specialization -template -struct mapbase_evaluator; - -template -struct mapbase_evaluator : evaluator_base -{ - typedef Derived XprType; - typedef typename XprType::PointerType PointerType; - typedef typename XprType::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - - enum { - IsRowMajor = XprType::RowsAtCompileTime, - ColsAtCompileTime = XprType::ColsAtCompileTime, - CoeffReadCost = NumTraits::ReadCost - }; - - EIGEN_DEVICE_FUNC explicit mapbase_evaluator(const XprType& map) - : m_data(const_cast(map.data())), - m_innerStride(map.innerStride()), - m_outerStride(map.outerStride()) - { - EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(evaluator::Flags&PacketAccessBit, internal::inner_stride_at_compile_time::ret==1), - PACKET_ACCESS_REQUIRES_TO_HAVE_INNER_STRIDE_FIXED_TO_1); - EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index row, Index col) const - { - return m_data[col * colStride() + row * rowStride()]; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index index) const - { - return m_data[index * m_innerStride.value()]; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Scalar& coeffRef(Index row, Index col) - { - return m_data[col * colStride() + row * rowStride()]; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Scalar& coeffRef(Index index) - { - return m_data[index * m_innerStride.value()]; - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index row, Index col) const - { - PointerType ptr = m_data + row * rowStride() + col * colStride(); - return internal::ploadt(ptr); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index index) const - { - return internal::ploadt(m_data + index * m_innerStride.value()); - } - - template - EIGEN_STRONG_INLINE - void writePacket(Index row, Index col, const PacketType& x) - { - PointerType ptr = m_data + row * rowStride() + col * colStride(); - return internal::pstoret(ptr, x); - } - - template - EIGEN_STRONG_INLINE - void writePacket(Index index, const PacketType& x) - { - internal::pstoret(m_data + index * m_innerStride.value(), x); - } -protected: - EIGEN_DEVICE_FUNC - inline Index rowStride() const { return XprType::IsRowMajor ? m_outerStride.value() : m_innerStride.value(); } - EIGEN_DEVICE_FUNC - inline Index colStride() const { return XprType::IsRowMajor ? m_innerStride.value() : m_outerStride.value(); } - - PointerType m_data; - const internal::variable_if_dynamic m_innerStride; - const internal::variable_if_dynamic m_outerStride; -}; - -template -struct evaluator > - : public mapbase_evaluator, PlainObjectType> -{ - typedef Map XprType; - typedef typename XprType::Scalar Scalar; - // TODO: should check for smaller packet types once we can handle multi-sized packet types - typedef typename packet_traits::type PacketScalar; - - enum { - InnerStrideAtCompileTime = StrideType::InnerStrideAtCompileTime == 0 - ? int(PlainObjectType::InnerStrideAtCompileTime) - : int(StrideType::InnerStrideAtCompileTime), - OuterStrideAtCompileTime = StrideType::OuterStrideAtCompileTime == 0 - ? int(PlainObjectType::OuterStrideAtCompileTime) - : int(StrideType::OuterStrideAtCompileTime), - HasNoInnerStride = InnerStrideAtCompileTime == 1, - HasNoOuterStride = StrideType::OuterStrideAtCompileTime == 0, - HasNoStride = HasNoInnerStride && HasNoOuterStride, - IsDynamicSize = PlainObjectType::SizeAtCompileTime==Dynamic, - - PacketAccessMask = bool(HasNoInnerStride) ? ~int(0) : ~int(PacketAccessBit), - LinearAccessMask = bool(HasNoStride) || bool(PlainObjectType::IsVectorAtCompileTime) ? ~int(0) : ~int(LinearAccessBit), - Flags = int( evaluator::Flags) & (LinearAccessMask&PacketAccessMask), - - Alignment = int(MapOptions)&int(AlignedMask) - }; - - EIGEN_DEVICE_FUNC explicit evaluator(const XprType& map) - : mapbase_evaluator(map) - { } -}; - -// -------------------- Ref -------------------- - -template -struct evaluator > - : public mapbase_evaluator, PlainObjectType> -{ - typedef Ref XprType; - - enum { - Flags = evaluator >::Flags, - Alignment = evaluator >::Alignment - }; - - EIGEN_DEVICE_FUNC explicit evaluator(const XprType& ref) - : mapbase_evaluator(ref) - { } -}; - -// -------------------- Block -------------------- - -template::ret> struct block_evaluator; - -template -struct evaluator > - : block_evaluator -{ - typedef Block XprType; - typedef typename XprType::Scalar Scalar; - // TODO: should check for smaller packet types once we can handle multi-sized packet types - typedef typename packet_traits::type PacketScalar; - - enum { - CoeffReadCost = evaluator::CoeffReadCost, - - RowsAtCompileTime = traits::RowsAtCompileTime, - ColsAtCompileTime = traits::ColsAtCompileTime, - MaxRowsAtCompileTime = traits::MaxRowsAtCompileTime, - MaxColsAtCompileTime = traits::MaxColsAtCompileTime, - - ArgTypeIsRowMajor = (int(evaluator::Flags)&RowMajorBit) != 0, - IsRowMajor = (MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1) ? 1 - : (MaxColsAtCompileTime==1 && MaxRowsAtCompileTime!=1) ? 0 - : ArgTypeIsRowMajor, - HasSameStorageOrderAsArgType = (IsRowMajor == ArgTypeIsRowMajor), - InnerSize = IsRowMajor ? int(ColsAtCompileTime) : int(RowsAtCompileTime), - InnerStrideAtCompileTime = HasSameStorageOrderAsArgType - ? int(inner_stride_at_compile_time::ret) - : int(outer_stride_at_compile_time::ret), - OuterStrideAtCompileTime = HasSameStorageOrderAsArgType - ? int(outer_stride_at_compile_time::ret) - : int(inner_stride_at_compile_time::ret), - MaskPacketAccessBit = (InnerStrideAtCompileTime == 1) ? PacketAccessBit : 0, - - FlagsLinearAccessBit = (RowsAtCompileTime == 1 || ColsAtCompileTime == 1 || (InnerPanel && (evaluator::Flags&LinearAccessBit))) ? LinearAccessBit : 0, - FlagsRowMajorBit = XprType::Flags&RowMajorBit, - Flags0 = evaluator::Flags & ( (HereditaryBits & ~RowMajorBit) | - DirectAccessBit | - MaskPacketAccessBit), - Flags = Flags0 | FlagsLinearAccessBit | FlagsRowMajorBit, - - PacketAlignment = unpacket_traits::alignment, - Alignment0 = (InnerPanel && (OuterStrideAtCompileTime!=Dynamic) && (((OuterStrideAtCompileTime * int(sizeof(Scalar))) % int(PacketAlignment)) == 0)) ? int(PacketAlignment) : 0, - Alignment = EIGEN_PLAIN_ENUM_MIN(evaluator::Alignment, Alignment0) - }; - typedef block_evaluator block_evaluator_type; - EIGEN_DEVICE_FUNC explicit evaluator(const XprType& block) : block_evaluator_type(block) - { - EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost); - } -}; - -// no direct-access => dispatch to a unary evaluator -template -struct block_evaluator - : unary_evaluator > -{ - typedef Block XprType; - - EIGEN_DEVICE_FUNC explicit block_evaluator(const XprType& block) - : unary_evaluator(block) - {} -}; - -template -struct unary_evaluator, IndexBased> - : evaluator_base > -{ - typedef Block XprType; - - EIGEN_DEVICE_FUNC explicit unary_evaluator(const XprType& block) - : m_argImpl(block.nestedExpression()), - m_startRow(block.startRow()), - m_startCol(block.startCol()) - { } - - typedef typename XprType::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - - enum { - RowsAtCompileTime = XprType::RowsAtCompileTime - }; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index row, Index col) const - { - return m_argImpl.coeff(m_startRow.value() + row, m_startCol.value() + col); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index index) const - { - return coeff(RowsAtCompileTime == 1 ? 0 : index, RowsAtCompileTime == 1 ? index : 0); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Scalar& coeffRef(Index row, Index col) - { - return m_argImpl.coeffRef(m_startRow.value() + row, m_startCol.value() + col); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Scalar& coeffRef(Index index) - { - return coeffRef(RowsAtCompileTime == 1 ? 0 : index, RowsAtCompileTime == 1 ? index : 0); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index row, Index col) const - { - return m_argImpl.template packet(m_startRow.value() + row, m_startCol.value() + col); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index index) const - { - return packet(RowsAtCompileTime == 1 ? 0 : index, - RowsAtCompileTime == 1 ? index : 0); - } - - template - EIGEN_STRONG_INLINE - void writePacket(Index row, Index col, const PacketType& x) - { - return m_argImpl.template writePacket(m_startRow.value() + row, m_startCol.value() + col, x); - } - - template - EIGEN_STRONG_INLINE - void writePacket(Index index, const PacketType& x) - { - return writePacket(RowsAtCompileTime == 1 ? 0 : index, - RowsAtCompileTime == 1 ? index : 0, - x); - } - -protected: - evaluator m_argImpl; - const variable_if_dynamic m_startRow; - const variable_if_dynamic m_startCol; -}; - -// TODO: This evaluator does not actually use the child evaluator; -// all action is via the data() as returned by the Block expression. - -template -struct block_evaluator - : mapbase_evaluator, - typename Block::PlainObject> -{ - typedef Block XprType; - typedef typename XprType::Scalar Scalar; - - EIGEN_DEVICE_FUNC explicit block_evaluator(const XprType& block) - : mapbase_evaluator(block) - { - // TODO: for the 3.3 release, this should be turned to an internal assertion, but let's keep it as is for the beta lifetime - eigen_assert(((internal::UIntPtr(block.data()) % EIGEN_PLAIN_ENUM_MAX(1,evaluator::Alignment)) == 0) && "data is not aligned"); - } -}; - - -// -------------------- Select -------------------- -// NOTE shall we introduce a ternary_evaluator? - -// TODO enable vectorization for Select -template -struct evaluator > - : evaluator_base > -{ - typedef Select XprType; - enum { - CoeffReadCost = evaluator::CoeffReadCost - + EIGEN_PLAIN_ENUM_MAX(evaluator::CoeffReadCost, - evaluator::CoeffReadCost), - - Flags = (unsigned int)evaluator::Flags & evaluator::Flags & HereditaryBits, - - Alignment = EIGEN_PLAIN_ENUM_MIN(evaluator::Alignment, evaluator::Alignment) - }; - - EIGEN_DEVICE_FUNC explicit evaluator(const XprType& select) - : m_conditionImpl(select.conditionMatrix()), - m_thenImpl(select.thenMatrix()), - m_elseImpl(select.elseMatrix()) - { - EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost); - } - - typedef typename XprType::CoeffReturnType CoeffReturnType; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index row, Index col) const - { - if (m_conditionImpl.coeff(row, col)) - return m_thenImpl.coeff(row, col); - else - return m_elseImpl.coeff(row, col); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index index) const - { - if (m_conditionImpl.coeff(index)) - return m_thenImpl.coeff(index); - else - return m_elseImpl.coeff(index); - } - -protected: - evaluator m_conditionImpl; - evaluator m_thenImpl; - evaluator m_elseImpl; -}; - - -// -------------------- Replicate -------------------- - -template -struct unary_evaluator > - : evaluator_base > -{ - typedef Replicate XprType; - typedef typename XprType::CoeffReturnType CoeffReturnType; - enum { - Factor = (RowFactor==Dynamic || ColFactor==Dynamic) ? Dynamic : RowFactor*ColFactor - }; - typedef typename internal::nested_eval::type ArgTypeNested; - typedef typename internal::remove_all::type ArgTypeNestedCleaned; - - enum { - CoeffReadCost = evaluator::CoeffReadCost, - LinearAccessMask = XprType::IsVectorAtCompileTime ? LinearAccessBit : 0, - Flags = (evaluator::Flags & (HereditaryBits|LinearAccessMask) & ~RowMajorBit) | (traits::Flags & RowMajorBit), - - Alignment = evaluator::Alignment - }; - - EIGEN_DEVICE_FUNC explicit unary_evaluator(const XprType& replicate) - : m_arg(replicate.nestedExpression()), - m_argImpl(m_arg), - m_rows(replicate.nestedExpression().rows()), - m_cols(replicate.nestedExpression().cols()) - {} - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index row, Index col) const - { - // try to avoid using modulo; this is a pure optimization strategy - const Index actual_row = internal::traits::RowsAtCompileTime==1 ? 0 - : RowFactor==1 ? row - : row % m_rows.value(); - const Index actual_col = internal::traits::ColsAtCompileTime==1 ? 0 - : ColFactor==1 ? col - : col % m_cols.value(); - - return m_argImpl.coeff(actual_row, actual_col); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index index) const - { - // try to avoid using modulo; this is a pure optimization strategy - const Index actual_index = internal::traits::RowsAtCompileTime==1 - ? (ColFactor==1 ? index : index%m_cols.value()) - : (RowFactor==1 ? index : index%m_rows.value()); - - return m_argImpl.coeff(actual_index); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index row, Index col) const - { - const Index actual_row = internal::traits::RowsAtCompileTime==1 ? 0 - : RowFactor==1 ? row - : row % m_rows.value(); - const Index actual_col = internal::traits::ColsAtCompileTime==1 ? 0 - : ColFactor==1 ? col - : col % m_cols.value(); - - return m_argImpl.template packet(actual_row, actual_col); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index index) const - { - const Index actual_index = internal::traits::RowsAtCompileTime==1 - ? (ColFactor==1 ? index : index%m_cols.value()) - : (RowFactor==1 ? index : index%m_rows.value()); - - return m_argImpl.template packet(actual_index); - } - -protected: - const ArgTypeNested m_arg; - evaluator m_argImpl; - const variable_if_dynamic m_rows; - const variable_if_dynamic m_cols; -}; - - -// -------------------- PartialReduxExpr -------------------- - -template< typename ArgType, typename MemberOp, int Direction> -struct evaluator > - : evaluator_base > -{ - typedef PartialReduxExpr XprType; - typedef typename internal::nested_eval::type ArgTypeNested; - typedef typename internal::remove_all::type ArgTypeNestedCleaned; - typedef typename ArgType::Scalar InputScalar; - typedef typename XprType::Scalar Scalar; - enum { - TraversalSize = Direction==int(Vertical) ? int(ArgType::RowsAtCompileTime) : int(ArgType::ColsAtCompileTime) - }; - typedef typename MemberOp::template Cost CostOpType; - enum { - CoeffReadCost = TraversalSize==Dynamic ? HugeCost - : TraversalSize * evaluator::CoeffReadCost + int(CostOpType::value), - - Flags = (traits::Flags&RowMajorBit) | (evaluator::Flags&(HereditaryBits&(~RowMajorBit))) | LinearAccessBit, - - Alignment = 0 // FIXME this will need to be improved once PartialReduxExpr is vectorized - }; - - EIGEN_DEVICE_FUNC explicit evaluator(const XprType xpr) - : m_arg(xpr.nestedExpression()), m_functor(xpr.functor()) - { - EIGEN_INTERNAL_CHECK_COST_VALUE(TraversalSize==Dynamic ? HugeCost : int(CostOpType::value)); - EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost); - } - - typedef typename XprType::CoeffReturnType CoeffReturnType; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const Scalar coeff(Index i, Index j) const - { - if (Direction==Vertical) - return m_functor(m_arg.col(j)); - else - return m_functor(m_arg.row(i)); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const Scalar coeff(Index index) const - { - if (Direction==Vertical) - return m_functor(m_arg.col(index)); - else - return m_functor(m_arg.row(index)); - } - -protected: - typename internal::add_const_on_value_type::type m_arg; - const MemberOp m_functor; -}; - - -// -------------------- MatrixWrapper and ArrayWrapper -------------------- -// -// evaluator_wrapper_base is a common base class for the -// MatrixWrapper and ArrayWrapper evaluators. - -template -struct evaluator_wrapper_base - : evaluator_base -{ - typedef typename remove_all::type ArgType; - enum { - CoeffReadCost = evaluator::CoeffReadCost, - Flags = evaluator::Flags, - Alignment = evaluator::Alignment - }; - - EIGEN_DEVICE_FUNC explicit evaluator_wrapper_base(const ArgType& arg) : m_argImpl(arg) {} - - typedef typename ArgType::Scalar Scalar; - typedef typename ArgType::CoeffReturnType CoeffReturnType; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index row, Index col) const - { - return m_argImpl.coeff(row, col); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index index) const - { - return m_argImpl.coeff(index); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Scalar& coeffRef(Index row, Index col) - { - return m_argImpl.coeffRef(row, col); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Scalar& coeffRef(Index index) - { - return m_argImpl.coeffRef(index); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index row, Index col) const - { - return m_argImpl.template packet(row, col); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index index) const - { - return m_argImpl.template packet(index); - } - - template - EIGEN_STRONG_INLINE - void writePacket(Index row, Index col, const PacketType& x) - { - m_argImpl.template writePacket(row, col, x); - } - - template - EIGEN_STRONG_INLINE - void writePacket(Index index, const PacketType& x) - { - m_argImpl.template writePacket(index, x); - } - -protected: - evaluator m_argImpl; -}; - -template -struct unary_evaluator > - : evaluator_wrapper_base > -{ - typedef MatrixWrapper XprType; - - EIGEN_DEVICE_FUNC explicit unary_evaluator(const XprType& wrapper) - : evaluator_wrapper_base >(wrapper.nestedExpression()) - { } -}; - -template -struct unary_evaluator > - : evaluator_wrapper_base > -{ - typedef ArrayWrapper XprType; - - EIGEN_DEVICE_FUNC explicit unary_evaluator(const XprType& wrapper) - : evaluator_wrapper_base >(wrapper.nestedExpression()) - { } -}; - - -// -------------------- Reverse -------------------- - -// defined in Reverse.h: -template struct reverse_packet_cond; - -template -struct unary_evaluator > - : evaluator_base > -{ - typedef Reverse XprType; - typedef typename XprType::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - - enum { - IsRowMajor = XprType::IsRowMajor, - IsColMajor = !IsRowMajor, - ReverseRow = (Direction == Vertical) || (Direction == BothDirections), - ReverseCol = (Direction == Horizontal) || (Direction == BothDirections), - ReversePacket = (Direction == BothDirections) - || ((Direction == Vertical) && IsColMajor) - || ((Direction == Horizontal) && IsRowMajor), - - CoeffReadCost = evaluator::CoeffReadCost, - - // let's enable LinearAccess only with vectorization because of the product overhead - // FIXME enable DirectAccess with negative strides? - Flags0 = evaluator::Flags, - LinearAccess = ( (Direction==BothDirections) && (int(Flags0)&PacketAccessBit) ) - || ((ReverseRow && XprType::ColsAtCompileTime==1) || (ReverseCol && XprType::RowsAtCompileTime==1)) - ? LinearAccessBit : 0, - - Flags = int(Flags0) & (HereditaryBits | PacketAccessBit | LinearAccess), - - Alignment = 0 // FIXME in some rare cases, Alignment could be preserved, like a Vector4f. - }; - - EIGEN_DEVICE_FUNC explicit unary_evaluator(const XprType& reverse) - : m_argImpl(reverse.nestedExpression()), - m_rows(ReverseRow ? reverse.nestedExpression().rows() : 1), - m_cols(ReverseCol ? reverse.nestedExpression().cols() : 1) - { } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index row, Index col) const - { - return m_argImpl.coeff(ReverseRow ? m_rows.value() - row - 1 : row, - ReverseCol ? m_cols.value() - col - 1 : col); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index index) const - { - return m_argImpl.coeff(m_rows.value() * m_cols.value() - index - 1); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Scalar& coeffRef(Index row, Index col) - { - return m_argImpl.coeffRef(ReverseRow ? m_rows.value() - row - 1 : row, - ReverseCol ? m_cols.value() - col - 1 : col); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Scalar& coeffRef(Index index) - { - return m_argImpl.coeffRef(m_rows.value() * m_cols.value() - index - 1); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index row, Index col) const - { - enum { - PacketSize = unpacket_traits::size, - OffsetRow = ReverseRow && IsColMajor ? PacketSize : 1, - OffsetCol = ReverseCol && IsRowMajor ? PacketSize : 1 - }; - typedef internal::reverse_packet_cond reverse_packet; - return reverse_packet::run(m_argImpl.template packet( - ReverseRow ? m_rows.value() - row - OffsetRow : row, - ReverseCol ? m_cols.value() - col - OffsetCol : col)); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index index) const - { - enum { PacketSize = unpacket_traits::size }; - return preverse(m_argImpl.template packet(m_rows.value() * m_cols.value() - index - PacketSize)); - } - - template - EIGEN_STRONG_INLINE - void writePacket(Index row, Index col, const PacketType& x) - { - // FIXME we could factorize some code with packet(i,j) - enum { - PacketSize = unpacket_traits::size, - OffsetRow = ReverseRow && IsColMajor ? PacketSize : 1, - OffsetCol = ReverseCol && IsRowMajor ? PacketSize : 1 - }; - typedef internal::reverse_packet_cond reverse_packet; - m_argImpl.template writePacket( - ReverseRow ? m_rows.value() - row - OffsetRow : row, - ReverseCol ? m_cols.value() - col - OffsetCol : col, - reverse_packet::run(x)); - } - - template - EIGEN_STRONG_INLINE - void writePacket(Index index, const PacketType& x) - { - enum { PacketSize = unpacket_traits::size }; - m_argImpl.template writePacket - (m_rows.value() * m_cols.value() - index - PacketSize, preverse(x)); - } - -protected: - evaluator m_argImpl; - - // If we do not reverse rows, then we do not need to know the number of rows; same for columns - // Nonetheless, in this case it is important to set to 1 such that the coeff(index) method works fine for vectors. - const variable_if_dynamic m_rows; - const variable_if_dynamic m_cols; -}; - - -// -------------------- Diagonal -------------------- - -template -struct evaluator > - : evaluator_base > -{ - typedef Diagonal XprType; - - enum { - CoeffReadCost = evaluator::CoeffReadCost, - - Flags = (unsigned int)(evaluator::Flags & (HereditaryBits | DirectAccessBit) & ~RowMajorBit) | LinearAccessBit, - - Alignment = 0 - }; - - EIGEN_DEVICE_FUNC explicit evaluator(const XprType& diagonal) - : m_argImpl(diagonal.nestedExpression()), - m_index(diagonal.index()) - { } - - typedef typename XprType::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index row, Index) const - { - return m_argImpl.coeff(row + rowOffset(), row + colOffset()); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index index) const - { - return m_argImpl.coeff(index + rowOffset(), index + colOffset()); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Scalar& coeffRef(Index row, Index) - { - return m_argImpl.coeffRef(row + rowOffset(), row + colOffset()); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Scalar& coeffRef(Index index) - { - return m_argImpl.coeffRef(index + rowOffset(), index + colOffset()); - } - -protected: - evaluator m_argImpl; - const internal::variable_if_dynamicindex m_index; - -private: - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index rowOffset() const { return m_index.value() > 0 ? 0 : -m_index.value(); } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index colOffset() const { return m_index.value() > 0 ? m_index.value() : 0; } -}; - - -//---------------------------------------------------------------------- -// deprecated code -//---------------------------------------------------------------------- - -// -------------------- EvalToTemp -------------------- - -// expression class for evaluating nested expression to a temporary - -template class EvalToTemp; - -template -struct traits > - : public traits -{ }; - -template -class EvalToTemp - : public dense_xpr_base >::type -{ - public: - - typedef typename dense_xpr_base::type Base; - EIGEN_GENERIC_PUBLIC_INTERFACE(EvalToTemp) - - explicit EvalToTemp(const ArgType& arg) - : m_arg(arg) - { } - - const ArgType& arg() const - { - return m_arg; - } - - Index rows() const - { - return m_arg.rows(); - } - - Index cols() const - { - return m_arg.cols(); - } - - private: - const ArgType& m_arg; -}; - -template -struct evaluator > - : public evaluator -{ - typedef EvalToTemp XprType; - typedef typename ArgType::PlainObject PlainObject; - typedef evaluator Base; - - EIGEN_DEVICE_FUNC explicit evaluator(const XprType& xpr) - : m_result(xpr.arg()) - { - ::new (static_cast(this)) Base(m_result); - } - - // This constructor is used when nesting an EvalTo evaluator in another evaluator - EIGEN_DEVICE_FUNC evaluator(const ArgType& arg) - : m_result(arg) - { - ::new (static_cast(this)) Base(m_result); - } - -protected: - PlainObject m_result; -}; - -} // namespace internal - -} // end namespace Eigen - -#endif // EIGEN_COREEVALUATORS_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/CoreIterators.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/CoreIterators.h deleted file mode 100644 index b9671968..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/CoreIterators.h +++ /dev/null @@ -1,132 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2014 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_COREITERATORS_H -#define EIGEN_COREITERATORS_H - -namespace Eigen { - -/* This file contains the respective InnerIterator definition of the expressions defined in Eigen/Core - */ - -namespace internal { - -template -class inner_iterator_selector; - -} - -/** \class InnerIterator - * \brief An InnerIterator allows to loop over the element of any matrix expression. - * - * \warning To be used with care because an evaluator is constructed every time an InnerIterator iterator is constructed. - * - * TODO: add a usage example - */ -template -class InnerIterator -{ -protected: - typedef internal::inner_iterator_selector::Kind> IteratorType; - typedef internal::evaluator EvaluatorType; - typedef typename internal::traits::Scalar Scalar; -public: - /** Construct an iterator over the \a outerId -th row or column of \a xpr */ - InnerIterator(const XprType &xpr, const Index &outerId) - : m_eval(xpr), m_iter(m_eval, outerId, xpr.innerSize()) - {} - - /// \returns the value of the current coefficient. - EIGEN_STRONG_INLINE Scalar value() const { return m_iter.value(); } - /** Increment the iterator \c *this to the next non-zero coefficient. - * Explicit zeros are not skipped over. To skip explicit zeros, see class SparseView - */ - EIGEN_STRONG_INLINE InnerIterator& operator++() { m_iter.operator++(); return *this; } - EIGEN_STRONG_INLINE InnerIterator& operator+=(Index i) { m_iter.operator+=(i); return *this; } - EIGEN_STRONG_INLINE InnerIterator operator+(Index i) - { InnerIterator result(*this); result+=i; return result; } - - - /// \returns the column or row index of the current coefficient. - EIGEN_STRONG_INLINE Index index() const { return m_iter.index(); } - /// \returns the row index of the current coefficient. - EIGEN_STRONG_INLINE Index row() const { return m_iter.row(); } - /// \returns the column index of the current coefficient. - EIGEN_STRONG_INLINE Index col() const { return m_iter.col(); } - /// \returns \c true if the iterator \c *this still references a valid coefficient. - EIGEN_STRONG_INLINE operator bool() const { return m_iter; } - -protected: - EvaluatorType m_eval; - IteratorType m_iter; -private: - // If you get here, then you're not using the right InnerIterator type, e.g.: - // SparseMatrix A; - // SparseMatrix::InnerIterator it(A,0); - template InnerIterator(const EigenBase&,Index outer); -}; - -namespace internal { - -// Generic inner iterator implementation for dense objects -template -class inner_iterator_selector -{ -protected: - typedef evaluator EvaluatorType; - typedef typename traits::Scalar Scalar; - enum { IsRowMajor = (XprType::Flags&RowMajorBit)==RowMajorBit }; - -public: - EIGEN_STRONG_INLINE inner_iterator_selector(const EvaluatorType &eval, const Index &outerId, const Index &innerSize) - : m_eval(eval), m_inner(0), m_outer(outerId), m_end(innerSize) - {} - - EIGEN_STRONG_INLINE Scalar value() const - { - return (IsRowMajor) ? m_eval.coeff(m_outer, m_inner) - : m_eval.coeff(m_inner, m_outer); - } - - EIGEN_STRONG_INLINE inner_iterator_selector& operator++() { m_inner++; return *this; } - - EIGEN_STRONG_INLINE Index index() const { return m_inner; } - inline Index row() const { return IsRowMajor ? m_outer : index(); } - inline Index col() const { return IsRowMajor ? index() : m_outer; } - - EIGEN_STRONG_INLINE operator bool() const { return m_inner < m_end && m_inner>=0; } - -protected: - const EvaluatorType& m_eval; - Index m_inner; - const Index m_outer; - const Index m_end; -}; - -// For iterator-based evaluator, inner-iterator is already implemented as -// evaluator<>::InnerIterator -template -class inner_iterator_selector - : public evaluator::InnerIterator -{ -protected: - typedef typename evaluator::InnerIterator Base; - typedef evaluator EvaluatorType; - -public: - EIGEN_STRONG_INLINE inner_iterator_selector(const EvaluatorType &eval, const Index &outerId, const Index &/*innerSize*/) - : Base(eval, outerId) - {} -}; - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_COREITERATORS_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/CwiseBinaryOp.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/CwiseBinaryOp.h deleted file mode 100644 index bf2632d9..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/CwiseBinaryOp.h +++ /dev/null @@ -1,183 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2014 Gael Guennebaud -// Copyright (C) 2006-2008 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CWISE_BINARY_OP_H -#define EIGEN_CWISE_BINARY_OP_H - -namespace Eigen { - -namespace internal { -template -struct traits > -{ - // we must not inherit from traits since it has - // the potential to cause problems with MSVC - typedef typename remove_all::type Ancestor; - typedef typename traits::XprKind XprKind; - enum { - RowsAtCompileTime = traits::RowsAtCompileTime, - ColsAtCompileTime = traits::ColsAtCompileTime, - MaxRowsAtCompileTime = traits::MaxRowsAtCompileTime, - MaxColsAtCompileTime = traits::MaxColsAtCompileTime - }; - - // even though we require Lhs and Rhs to have the same scalar type (see CwiseBinaryOp constructor), - // we still want to handle the case when the result type is different. - typedef typename result_of< - BinaryOp( - const typename Lhs::Scalar&, - const typename Rhs::Scalar& - ) - >::type Scalar; - typedef typename cwise_promote_storage_type::StorageKind, - typename traits::StorageKind, - BinaryOp>::ret StorageKind; - typedef typename promote_index_type::StorageIndex, - typename traits::StorageIndex>::type StorageIndex; - typedef typename Lhs::Nested LhsNested; - typedef typename Rhs::Nested RhsNested; - typedef typename remove_reference::type _LhsNested; - typedef typename remove_reference::type _RhsNested; - enum { - Flags = cwise_promote_storage_order::StorageKind,typename traits::StorageKind,_LhsNested::Flags & RowMajorBit,_RhsNested::Flags & RowMajorBit>::value - }; -}; -} // end namespace internal - -template -class CwiseBinaryOpImpl; - -/** \class CwiseBinaryOp - * \ingroup Core_Module - * - * \brief Generic expression where a coefficient-wise binary operator is applied to two expressions - * - * \tparam BinaryOp template functor implementing the operator - * \tparam LhsType the type of the left-hand side - * \tparam RhsType the type of the right-hand side - * - * This class represents an expression where a coefficient-wise binary operator is applied to two expressions. - * It is the return type of binary operators, by which we mean only those binary operators where - * both the left-hand side and the right-hand side are Eigen expressions. - * For example, the return type of matrix1+matrix2 is a CwiseBinaryOp. - * - * Most of the time, this is the only way that it is used, so you typically don't have to name - * CwiseBinaryOp types explicitly. - * - * \sa MatrixBase::binaryExpr(const MatrixBase &,const CustomBinaryOp &) const, class CwiseUnaryOp, class CwiseNullaryOp - */ -template -class CwiseBinaryOp : - public CwiseBinaryOpImpl< - BinaryOp, LhsType, RhsType, - typename internal::cwise_promote_storage_type::StorageKind, - typename internal::traits::StorageKind, - BinaryOp>::ret>, - internal::no_assignment_operator -{ - public: - - typedef typename internal::remove_all::type Functor; - typedef typename internal::remove_all::type Lhs; - typedef typename internal::remove_all::type Rhs; - - typedef typename CwiseBinaryOpImpl< - BinaryOp, LhsType, RhsType, - typename internal::cwise_promote_storage_type::StorageKind, - typename internal::traits::StorageKind, - BinaryOp>::ret>::Base Base; - EIGEN_GENERIC_PUBLIC_INTERFACE(CwiseBinaryOp) - - typedef typename internal::ref_selector::type LhsNested; - typedef typename internal::ref_selector::type RhsNested; - typedef typename internal::remove_reference::type _LhsNested; - typedef typename internal::remove_reference::type _RhsNested; - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE CwiseBinaryOp(const Lhs& aLhs, const Rhs& aRhs, const BinaryOp& func = BinaryOp()) - : m_lhs(aLhs), m_rhs(aRhs), m_functor(func) - { - EIGEN_CHECK_BINARY_COMPATIBILIY(BinaryOp,typename Lhs::Scalar,typename Rhs::Scalar); - // require the sizes to match - EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Lhs, Rhs) - eigen_assert(aLhs.rows() == aRhs.rows() && aLhs.cols() == aRhs.cols()); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Index rows() const { - // return the fixed size type if available to enable compile time optimizations - if (internal::traits::type>::RowsAtCompileTime==Dynamic) - return m_rhs.rows(); - else - return m_lhs.rows(); - } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Index cols() const { - // return the fixed size type if available to enable compile time optimizations - if (internal::traits::type>::ColsAtCompileTime==Dynamic) - return m_rhs.cols(); - else - return m_lhs.cols(); - } - - /** \returns the left hand side nested expression */ - EIGEN_DEVICE_FUNC - const _LhsNested& lhs() const { return m_lhs; } - /** \returns the right hand side nested expression */ - EIGEN_DEVICE_FUNC - const _RhsNested& rhs() const { return m_rhs; } - /** \returns the functor representing the binary operation */ - EIGEN_DEVICE_FUNC - const BinaryOp& functor() const { return m_functor; } - - protected: - LhsNested m_lhs; - RhsNested m_rhs; - const BinaryOp m_functor; -}; - -// Generic API dispatcher -template -class CwiseBinaryOpImpl - : public internal::generic_xpr_base >::type -{ -public: - typedef typename internal::generic_xpr_base >::type Base; -}; - -/** replaces \c *this by \c *this - \a other. - * - * \returns a reference to \c *this - */ -template -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived & -MatrixBase::operator-=(const MatrixBase &other) -{ - call_assignment(derived(), other.derived(), internal::sub_assign_op()); - return derived(); -} - -/** replaces \c *this by \c *this + \a other. - * - * \returns a reference to \c *this - */ -template -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived & -MatrixBase::operator+=(const MatrixBase& other) -{ - call_assignment(derived(), other.derived(), internal::add_assign_op()); - return derived(); -} - -} // end namespace Eigen - -#endif // EIGEN_CWISE_BINARY_OP_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/CwiseNullaryOp.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/CwiseNullaryOp.h deleted file mode 100644 index b1923da0..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/CwiseNullaryOp.h +++ /dev/null @@ -1,902 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2010 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CWISE_NULLARY_OP_H -#define EIGEN_CWISE_NULLARY_OP_H - -namespace Eigen { - -namespace internal { -template -struct traits > : traits -{ - enum { - Flags = traits::Flags & RowMajorBit - }; -}; - -} // namespace internal - -/** \class CwiseNullaryOp - * \ingroup Core_Module - * - * \brief Generic expression of a matrix where all coefficients are defined by a functor - * - * \tparam NullaryOp template functor implementing the operator - * \tparam PlainObjectType the underlying plain matrix/array type - * - * This class represents an expression of a generic nullary operator. - * It is the return type of the Ones(), Zero(), Constant(), Identity() and Random() methods, - * and most of the time this is the only way it is used. - * - * However, if you want to write a function returning such an expression, you - * will need to use this class. - * - * The functor NullaryOp must expose one of the following method: - - - - -
    \c operator()() if the procedural generation does not depend on the coefficient entries (e.g., random numbers)
    \c operator()(Index i)if the procedural generation makes sense for vectors only and that it depends on the coefficient index \c i (e.g., linspace)
    \c operator()(Index i,Index j)if the procedural generation depends on the matrix coordinates \c i, \c j (e.g., to generate a checkerboard with 0 and 1)
    - * It is also possible to expose the last two operators if the generation makes sense for matrices but can be optimized for vectors. - * - * See DenseBase::NullaryExpr(Index,const CustomNullaryOp&) for an example binding - * C++11 random number generators. - * - * A nullary expression can also be used to implement custom sophisticated matrix manipulations - * that cannot be covered by the existing set of natively supported matrix manipulations. - * See this \ref TopicCustomizing_NullaryExpr "page" for some examples and additional explanations - * on the behavior of CwiseNullaryOp. - * - * \sa class CwiseUnaryOp, class CwiseBinaryOp, DenseBase::NullaryExpr - */ -template -class CwiseNullaryOp : public internal::dense_xpr_base< CwiseNullaryOp >::type, internal::no_assignment_operator -{ - public: - - typedef typename internal::dense_xpr_base::type Base; - EIGEN_DENSE_PUBLIC_INTERFACE(CwiseNullaryOp) - - EIGEN_DEVICE_FUNC - CwiseNullaryOp(Index rows, Index cols, const NullaryOp& func = NullaryOp()) - : m_rows(rows), m_cols(cols), m_functor(func) - { - eigen_assert(rows >= 0 - && (RowsAtCompileTime == Dynamic || RowsAtCompileTime == rows) - && cols >= 0 - && (ColsAtCompileTime == Dynamic || ColsAtCompileTime == cols)); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Index rows() const { return m_rows.value(); } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Index cols() const { return m_cols.value(); } - - /** \returns the functor representing the nullary operation */ - EIGEN_DEVICE_FUNC - const NullaryOp& functor() const { return m_functor; } - - protected: - const internal::variable_if_dynamic m_rows; - const internal::variable_if_dynamic m_cols; - const NullaryOp m_functor; -}; - - -/** \returns an expression of a matrix defined by a custom functor \a func - * - * The parameters \a rows and \a cols are the number of rows and of columns of - * the returned matrix. Must be compatible with this MatrixBase type. - * - * This variant is meant to be used for dynamic-size matrix types. For fixed-size types, - * it is redundant to pass \a rows and \a cols as arguments, so Zero() should be used - * instead. - * - * The template parameter \a CustomNullaryOp is the type of the functor. - * - * \sa class CwiseNullaryOp - */ -template -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseNullaryOp::PlainObject> -DenseBase::NullaryExpr(Index rows, Index cols, const CustomNullaryOp& func) -{ - return CwiseNullaryOp(rows, cols, func); -} - -/** \returns an expression of a matrix defined by a custom functor \a func - * - * The parameter \a size is the size of the returned vector. - * Must be compatible with this MatrixBase type. - * - * \only_for_vectors - * - * This variant is meant to be used for dynamic-size vector types. For fixed-size types, - * it is redundant to pass \a size as argument, so Zero() should be used - * instead. - * - * The template parameter \a CustomNullaryOp is the type of the functor. - * - * Here is an example with C++11 random generators: \include random_cpp11.cpp - * Output: \verbinclude random_cpp11.out - * - * \sa class CwiseNullaryOp - */ -template -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseNullaryOp::PlainObject> -DenseBase::NullaryExpr(Index size, const CustomNullaryOp& func) -{ - EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) - if(RowsAtCompileTime == 1) return CwiseNullaryOp(1, size, func); - else return CwiseNullaryOp(size, 1, func); -} - -/** \returns an expression of a matrix defined by a custom functor \a func - * - * This variant is only for fixed-size DenseBase types. For dynamic-size types, you - * need to use the variants taking size arguments. - * - * The template parameter \a CustomNullaryOp is the type of the functor. - * - * \sa class CwiseNullaryOp - */ -template -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseNullaryOp::PlainObject> -DenseBase::NullaryExpr(const CustomNullaryOp& func) -{ - return CwiseNullaryOp(RowsAtCompileTime, ColsAtCompileTime, func); -} - -/** \returns an expression of a constant matrix of value \a value - * - * The parameters \a rows and \a cols are the number of rows and of columns of - * the returned matrix. Must be compatible with this DenseBase type. - * - * This variant is meant to be used for dynamic-size matrix types. For fixed-size types, - * it is redundant to pass \a rows and \a cols as arguments, so Zero() should be used - * instead. - * - * The template parameter \a CustomNullaryOp is the type of the functor. - * - * \sa class CwiseNullaryOp - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase::ConstantReturnType -DenseBase::Constant(Index rows, Index cols, const Scalar& value) -{ - return DenseBase::NullaryExpr(rows, cols, internal::scalar_constant_op(value)); -} - -/** \returns an expression of a constant matrix of value \a value - * - * The parameter \a size is the size of the returned vector. - * Must be compatible with this DenseBase type. - * - * \only_for_vectors - * - * This variant is meant to be used for dynamic-size vector types. For fixed-size types, - * it is redundant to pass \a size as argument, so Zero() should be used - * instead. - * - * The template parameter \a CustomNullaryOp is the type of the functor. - * - * \sa class CwiseNullaryOp - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase::ConstantReturnType -DenseBase::Constant(Index size, const Scalar& value) -{ - return DenseBase::NullaryExpr(size, internal::scalar_constant_op(value)); -} - -/** \returns an expression of a constant matrix of value \a value - * - * This variant is only for fixed-size DenseBase types. For dynamic-size types, you - * need to use the variants taking size arguments. - * - * The template parameter \a CustomNullaryOp is the type of the functor. - * - * \sa class CwiseNullaryOp - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase::ConstantReturnType -DenseBase::Constant(const Scalar& value) -{ - EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived) - return DenseBase::NullaryExpr(RowsAtCompileTime, ColsAtCompileTime, internal::scalar_constant_op(value)); -} - -/** \deprecated because of accuracy loss. In Eigen 3.3, it is an alias for LinSpaced(Index,const Scalar&,const Scalar&) - * - * \sa LinSpaced(Index,Scalar,Scalar), setLinSpaced(Index,const Scalar&,const Scalar&) - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase::RandomAccessLinSpacedReturnType -DenseBase::LinSpaced(Sequential_t, Index size, const Scalar& low, const Scalar& high) -{ - EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) - return DenseBase::NullaryExpr(size, internal::linspaced_op(low,high,size)); -} - -/** \deprecated because of accuracy loss. In Eigen 3.3, it is an alias for LinSpaced(const Scalar&,const Scalar&) - * - * \sa LinSpaced(Scalar,Scalar) - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase::RandomAccessLinSpacedReturnType -DenseBase::LinSpaced(Sequential_t, const Scalar& low, const Scalar& high) -{ - EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) - EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived) - return DenseBase::NullaryExpr(Derived::SizeAtCompileTime, internal::linspaced_op(low,high,Derived::SizeAtCompileTime)); -} - -/** - * \brief Sets a linearly spaced vector. - * - * The function generates 'size' equally spaced values in the closed interval [low,high]. - * When size is set to 1, a vector of length 1 containing 'high' is returned. - * - * \only_for_vectors - * - * Example: \include DenseBase_LinSpaced.cpp - * Output: \verbinclude DenseBase_LinSpaced.out - * - * For integer scalar types, an even spacing is possible if and only if the length of the range, - * i.e., \c high-low is a scalar multiple of \c size-1, or if \c size is a scalar multiple of the - * number of values \c high-low+1 (meaning each value can be repeated the same number of time). - * If one of these two considions is not satisfied, then \c high is lowered to the largest value - * satisfying one of this constraint. - * Here are some examples: - * - * Example: \include DenseBase_LinSpacedInt.cpp - * Output: \verbinclude DenseBase_LinSpacedInt.out - * - * \sa setLinSpaced(Index,const Scalar&,const Scalar&), CwiseNullaryOp - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase::RandomAccessLinSpacedReturnType -DenseBase::LinSpaced(Index size, const Scalar& low, const Scalar& high) -{ - EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) - return DenseBase::NullaryExpr(size, internal::linspaced_op(low,high,size)); -} - -/** - * \copydoc DenseBase::LinSpaced(Index, const Scalar&, const Scalar&) - * Special version for fixed size types which does not require the size parameter. - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase::RandomAccessLinSpacedReturnType -DenseBase::LinSpaced(const Scalar& low, const Scalar& high) -{ - EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) - EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived) - return DenseBase::NullaryExpr(Derived::SizeAtCompileTime, internal::linspaced_op(low,high,Derived::SizeAtCompileTime)); -} - -/** \returns true if all coefficients in this matrix are approximately equal to \a val, to within precision \a prec */ -template -EIGEN_DEVICE_FUNC bool DenseBase::isApproxToConstant -(const Scalar& val, const RealScalar& prec) const -{ - typename internal::nested_eval::type self(derived()); - for(Index j = 0; j < cols(); ++j) - for(Index i = 0; i < rows(); ++i) - if(!internal::isApprox(self.coeff(i, j), val, prec)) - return false; - return true; -} - -/** This is just an alias for isApproxToConstant(). - * - * \returns true if all coefficients in this matrix are approximately equal to \a value, to within precision \a prec */ -template -EIGEN_DEVICE_FUNC bool DenseBase::isConstant -(const Scalar& val, const RealScalar& prec) const -{ - return isApproxToConstant(val, prec); -} - -/** Alias for setConstant(): sets all coefficients in this expression to \a val. - * - * \sa setConstant(), Constant(), class CwiseNullaryOp - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void DenseBase::fill(const Scalar& val) -{ - setConstant(val); -} - -/** Sets all coefficients in this expression to value \a val. - * - * \sa fill(), setConstant(Index,const Scalar&), setConstant(Index,Index,const Scalar&), setZero(), setOnes(), Constant(), class CwiseNullaryOp, setZero(), setOnes() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase::setConstant(const Scalar& val) -{ - return derived() = Constant(rows(), cols(), val); -} - -/** Resizes to the given \a size, and sets all coefficients in this expression to the given value \a val. - * - * \only_for_vectors - * - * Example: \include Matrix_setConstant_int.cpp - * Output: \verbinclude Matrix_setConstant_int.out - * - * \sa MatrixBase::setConstant(const Scalar&), setConstant(Index,Index,const Scalar&), class CwiseNullaryOp, MatrixBase::Constant(const Scalar&) - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& -PlainObjectBase::setConstant(Index size, const Scalar& val) -{ - resize(size); - return setConstant(val); -} - -/** Resizes to the given size, and sets all coefficients in this expression to the given value \a val. - * - * \param rows the new number of rows - * \param cols the new number of columns - * \param val the value to which all coefficients are set - * - * Example: \include Matrix_setConstant_int_int.cpp - * Output: \verbinclude Matrix_setConstant_int_int.out - * - * \sa MatrixBase::setConstant(const Scalar&), setConstant(Index,const Scalar&), class CwiseNullaryOp, MatrixBase::Constant(const Scalar&) - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& -PlainObjectBase::setConstant(Index rows, Index cols, const Scalar& val) -{ - resize(rows, cols); - return setConstant(val); -} - -/** - * \brief Sets a linearly spaced vector. - * - * The function generates 'size' equally spaced values in the closed interval [low,high]. - * When size is set to 1, a vector of length 1 containing 'high' is returned. - * - * \only_for_vectors - * - * Example: \include DenseBase_setLinSpaced.cpp - * Output: \verbinclude DenseBase_setLinSpaced.out - * - * For integer scalar types, do not miss the explanations on the definition - * of \link LinSpaced(Index,const Scalar&,const Scalar&) even spacing \endlink. - * - * \sa LinSpaced(Index,const Scalar&,const Scalar&), CwiseNullaryOp - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase::setLinSpaced(Index newSize, const Scalar& low, const Scalar& high) -{ - EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) - return derived() = Derived::NullaryExpr(newSize, internal::linspaced_op(low,high,newSize)); -} - -/** - * \brief Sets a linearly spaced vector. - * - * The function fills \c *this with equally spaced values in the closed interval [low,high]. - * When size is set to 1, a vector of length 1 containing 'high' is returned. - * - * \only_for_vectors - * - * For integer scalar types, do not miss the explanations on the definition - * of \link LinSpaced(Index,const Scalar&,const Scalar&) even spacing \endlink. - * - * \sa LinSpaced(Index,const Scalar&,const Scalar&), setLinSpaced(Index, const Scalar&, const Scalar&), CwiseNullaryOp - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase::setLinSpaced(const Scalar& low, const Scalar& high) -{ - EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) - return setLinSpaced(size(), low, high); -} - -// zero: - -/** \returns an expression of a zero matrix. - * - * The parameters \a rows and \a cols are the number of rows and of columns of - * the returned matrix. Must be compatible with this MatrixBase type. - * - * This variant is meant to be used for dynamic-size matrix types. For fixed-size types, - * it is redundant to pass \a rows and \a cols as arguments, so Zero() should be used - * instead. - * - * Example: \include MatrixBase_zero_int_int.cpp - * Output: \verbinclude MatrixBase_zero_int_int.out - * - * \sa Zero(), Zero(Index) - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase::ConstantReturnType -DenseBase::Zero(Index rows, Index cols) -{ - return Constant(rows, cols, Scalar(0)); -} - -/** \returns an expression of a zero vector. - * - * The parameter \a size is the size of the returned vector. - * Must be compatible with this MatrixBase type. - * - * \only_for_vectors - * - * This variant is meant to be used for dynamic-size vector types. For fixed-size types, - * it is redundant to pass \a size as argument, so Zero() should be used - * instead. - * - * Example: \include MatrixBase_zero_int.cpp - * Output: \verbinclude MatrixBase_zero_int.out - * - * \sa Zero(), Zero(Index,Index) - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase::ConstantReturnType -DenseBase::Zero(Index size) -{ - return Constant(size, Scalar(0)); -} - -/** \returns an expression of a fixed-size zero matrix or vector. - * - * This variant is only for fixed-size MatrixBase types. For dynamic-size types, you - * need to use the variants taking size arguments. - * - * Example: \include MatrixBase_zero.cpp - * Output: \verbinclude MatrixBase_zero.out - * - * \sa Zero(Index), Zero(Index,Index) - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase::ConstantReturnType -DenseBase::Zero() -{ - return Constant(Scalar(0)); -} - -/** \returns true if *this is approximately equal to the zero matrix, - * within the precision given by \a prec. - * - * Example: \include MatrixBase_isZero.cpp - * Output: \verbinclude MatrixBase_isZero.out - * - * \sa class CwiseNullaryOp, Zero() - */ -template -EIGEN_DEVICE_FUNC bool DenseBase::isZero(const RealScalar& prec) const -{ - typename internal::nested_eval::type self(derived()); - for(Index j = 0; j < cols(); ++j) - for(Index i = 0; i < rows(); ++i) - if(!internal::isMuchSmallerThan(self.coeff(i, j), static_cast(1), prec)) - return false; - return true; -} - -/** Sets all coefficients in this expression to zero. - * - * Example: \include MatrixBase_setZero.cpp - * Output: \verbinclude MatrixBase_setZero.out - * - * \sa class CwiseNullaryOp, Zero() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase::setZero() -{ - return setConstant(Scalar(0)); -} - -/** Resizes to the given \a size, and sets all coefficients in this expression to zero. - * - * \only_for_vectors - * - * Example: \include Matrix_setZero_int.cpp - * Output: \verbinclude Matrix_setZero_int.out - * - * \sa DenseBase::setZero(), setZero(Index,Index), class CwiseNullaryOp, DenseBase::Zero() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& -PlainObjectBase::setZero(Index newSize) -{ - resize(newSize); - return setConstant(Scalar(0)); -} - -/** Resizes to the given size, and sets all coefficients in this expression to zero. - * - * \param rows the new number of rows - * \param cols the new number of columns - * - * Example: \include Matrix_setZero_int_int.cpp - * Output: \verbinclude Matrix_setZero_int_int.out - * - * \sa DenseBase::setZero(), setZero(Index), class CwiseNullaryOp, DenseBase::Zero() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& -PlainObjectBase::setZero(Index rows, Index cols) -{ - resize(rows, cols); - return setConstant(Scalar(0)); -} - -// ones: - -/** \returns an expression of a matrix where all coefficients equal one. - * - * The parameters \a rows and \a cols are the number of rows and of columns of - * the returned matrix. Must be compatible with this MatrixBase type. - * - * This variant is meant to be used for dynamic-size matrix types. For fixed-size types, - * it is redundant to pass \a rows and \a cols as arguments, so Ones() should be used - * instead. - * - * Example: \include MatrixBase_ones_int_int.cpp - * Output: \verbinclude MatrixBase_ones_int_int.out - * - * \sa Ones(), Ones(Index), isOnes(), class Ones - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase::ConstantReturnType -DenseBase::Ones(Index rows, Index cols) -{ - return Constant(rows, cols, Scalar(1)); -} - -/** \returns an expression of a vector where all coefficients equal one. - * - * The parameter \a newSize is the size of the returned vector. - * Must be compatible with this MatrixBase type. - * - * \only_for_vectors - * - * This variant is meant to be used for dynamic-size vector types. For fixed-size types, - * it is redundant to pass \a size as argument, so Ones() should be used - * instead. - * - * Example: \include MatrixBase_ones_int.cpp - * Output: \verbinclude MatrixBase_ones_int.out - * - * \sa Ones(), Ones(Index,Index), isOnes(), class Ones - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase::ConstantReturnType -DenseBase::Ones(Index newSize) -{ - return Constant(newSize, Scalar(1)); -} - -/** \returns an expression of a fixed-size matrix or vector where all coefficients equal one. - * - * This variant is only for fixed-size MatrixBase types. For dynamic-size types, you - * need to use the variants taking size arguments. - * - * Example: \include MatrixBase_ones.cpp - * Output: \verbinclude MatrixBase_ones.out - * - * \sa Ones(Index), Ones(Index,Index), isOnes(), class Ones - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase::ConstantReturnType -DenseBase::Ones() -{ - return Constant(Scalar(1)); -} - -/** \returns true if *this is approximately equal to the matrix where all coefficients - * are equal to 1, within the precision given by \a prec. - * - * Example: \include MatrixBase_isOnes.cpp - * Output: \verbinclude MatrixBase_isOnes.out - * - * \sa class CwiseNullaryOp, Ones() - */ -template -EIGEN_DEVICE_FUNC bool DenseBase::isOnes -(const RealScalar& prec) const -{ - return isApproxToConstant(Scalar(1), prec); -} - -/** Sets all coefficients in this expression to one. - * - * Example: \include MatrixBase_setOnes.cpp - * Output: \verbinclude MatrixBase_setOnes.out - * - * \sa class CwiseNullaryOp, Ones() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase::setOnes() -{ - return setConstant(Scalar(1)); -} - -/** Resizes to the given \a newSize, and sets all coefficients in this expression to one. - * - * \only_for_vectors - * - * Example: \include Matrix_setOnes_int.cpp - * Output: \verbinclude Matrix_setOnes_int.out - * - * \sa MatrixBase::setOnes(), setOnes(Index,Index), class CwiseNullaryOp, MatrixBase::Ones() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& -PlainObjectBase::setOnes(Index newSize) -{ - resize(newSize); - return setConstant(Scalar(1)); -} - -/** Resizes to the given size, and sets all coefficients in this expression to one. - * - * \param rows the new number of rows - * \param cols the new number of columns - * - * Example: \include Matrix_setOnes_int_int.cpp - * Output: \verbinclude Matrix_setOnes_int_int.out - * - * \sa MatrixBase::setOnes(), setOnes(Index), class CwiseNullaryOp, MatrixBase::Ones() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& -PlainObjectBase::setOnes(Index rows, Index cols) -{ - resize(rows, cols); - return setConstant(Scalar(1)); -} - -// Identity: - -/** \returns an expression of the identity matrix (not necessarily square). - * - * The parameters \a rows and \a cols are the number of rows and of columns of - * the returned matrix. Must be compatible with this MatrixBase type. - * - * This variant is meant to be used for dynamic-size matrix types. For fixed-size types, - * it is redundant to pass \a rows and \a cols as arguments, so Identity() should be used - * instead. - * - * Example: \include MatrixBase_identity_int_int.cpp - * Output: \verbinclude MatrixBase_identity_int_int.out - * - * \sa Identity(), setIdentity(), isIdentity() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase::IdentityReturnType -MatrixBase::Identity(Index rows, Index cols) -{ - return DenseBase::NullaryExpr(rows, cols, internal::scalar_identity_op()); -} - -/** \returns an expression of the identity matrix (not necessarily square). - * - * This variant is only for fixed-size MatrixBase types. For dynamic-size types, you - * need to use the variant taking size arguments. - * - * Example: \include MatrixBase_identity.cpp - * Output: \verbinclude MatrixBase_identity.out - * - * \sa Identity(Index,Index), setIdentity(), isIdentity() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase::IdentityReturnType -MatrixBase::Identity() -{ - EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived) - return MatrixBase::NullaryExpr(RowsAtCompileTime, ColsAtCompileTime, internal::scalar_identity_op()); -} - -/** \returns true if *this is approximately equal to the identity matrix - * (not necessarily square), - * within the precision given by \a prec. - * - * Example: \include MatrixBase_isIdentity.cpp - * Output: \verbinclude MatrixBase_isIdentity.out - * - * \sa class CwiseNullaryOp, Identity(), Identity(Index,Index), setIdentity() - */ -template -bool MatrixBase::isIdentity -(const RealScalar& prec) const -{ - typename internal::nested_eval::type self(derived()); - for(Index j = 0; j < cols(); ++j) - { - for(Index i = 0; i < rows(); ++i) - { - if(i == j) - { - if(!internal::isApprox(self.coeff(i, j), static_cast(1), prec)) - return false; - } - else - { - if(!internal::isMuchSmallerThan(self.coeff(i, j), static_cast(1), prec)) - return false; - } - } - } - return true; -} - -namespace internal { - -template=16)> -struct setIdentity_impl -{ - EIGEN_DEVICE_FUNC - static EIGEN_STRONG_INLINE Derived& run(Derived& m) - { - return m = Derived::Identity(m.rows(), m.cols()); - } -}; - -template -struct setIdentity_impl -{ - EIGEN_DEVICE_FUNC - static EIGEN_STRONG_INLINE Derived& run(Derived& m) - { - m.setZero(); - const Index size = numext::mini(m.rows(), m.cols()); - for(Index i = 0; i < size; ++i) m.coeffRef(i,i) = typename Derived::Scalar(1); - return m; - } -}; - -} // end namespace internal - -/** Writes the identity expression (not necessarily square) into *this. - * - * Example: \include MatrixBase_setIdentity.cpp - * Output: \verbinclude MatrixBase_setIdentity.out - * - * \sa class CwiseNullaryOp, Identity(), Identity(Index,Index), isIdentity() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& MatrixBase::setIdentity() -{ - return internal::setIdentity_impl::run(derived()); -} - -/** \brief Resizes to the given size, and writes the identity expression (not necessarily square) into *this. - * - * \param rows the new number of rows - * \param cols the new number of columns - * - * Example: \include Matrix_setIdentity_int_int.cpp - * Output: \verbinclude Matrix_setIdentity_int_int.out - * - * \sa MatrixBase::setIdentity(), class CwiseNullaryOp, MatrixBase::Identity() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& MatrixBase::setIdentity(Index rows, Index cols) -{ - derived().resize(rows, cols); - return setIdentity(); -} - -/** \returns an expression of the i-th unit (basis) vector. - * - * \only_for_vectors - * - * \sa MatrixBase::Unit(Index), MatrixBase::UnitX(), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase::BasisReturnType MatrixBase::Unit(Index newSize, Index i) -{ - EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) - return BasisReturnType(SquareMatrixType::Identity(newSize,newSize), i); -} - -/** \returns an expression of the i-th unit (basis) vector. - * - * \only_for_vectors - * - * This variant is for fixed-size vector only. - * - * \sa MatrixBase::Unit(Index,Index), MatrixBase::UnitX(), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase::BasisReturnType MatrixBase::Unit(Index i) -{ - EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) - return BasisReturnType(SquareMatrixType::Identity(),i); -} - -/** \returns an expression of the X axis unit vector (1{,0}^*) - * - * \only_for_vectors - * - * \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase::BasisReturnType MatrixBase::UnitX() -{ return Derived::Unit(0); } - -/** \returns an expression of the Y axis unit vector (0,1{,0}^*) - * - * \only_for_vectors - * - * \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase::BasisReturnType MatrixBase::UnitY() -{ return Derived::Unit(1); } - -/** \returns an expression of the Z axis unit vector (0,0,1{,0}^*) - * - * \only_for_vectors - * - * \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase::BasisReturnType MatrixBase::UnitZ() -{ return Derived::Unit(2); } - -/** \returns an expression of the W axis unit vector (0,0,0,1) - * - * \only_for_vectors - * - * \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase::BasisReturnType MatrixBase::UnitW() -{ return Derived::Unit(3); } - -/** \brief Set the coefficients of \c *this to the i-th unit (basis) vector - * - * \param i index of the unique coefficient to be set to 1 - * - * \only_for_vectors - * - * \sa MatrixBase::setIdentity(), class CwiseNullaryOp, MatrixBase::Unit(Index,Index) - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& MatrixBase::setUnit(Index i) -{ - EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived); - eigen_assert(i -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& MatrixBase::setUnit(Index newSize, Index i) -{ - EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived); - eigen_assert(i -// Copyright (C) 2006-2008 Benoit Jacob -// Copyright (C) 2016 Eugene Brevdo -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CWISE_TERNARY_OP_H -#define EIGEN_CWISE_TERNARY_OP_H - -namespace Eigen { - -namespace internal { -template -struct traits > { - // we must not inherit from traits since it has - // the potential to cause problems with MSVC - typedef typename remove_all::type Ancestor; - typedef typename traits::XprKind XprKind; - enum { - RowsAtCompileTime = traits::RowsAtCompileTime, - ColsAtCompileTime = traits::ColsAtCompileTime, - MaxRowsAtCompileTime = traits::MaxRowsAtCompileTime, - MaxColsAtCompileTime = traits::MaxColsAtCompileTime - }; - - // even though we require Arg1, Arg2, and Arg3 to have the same scalar type - // (see CwiseTernaryOp constructor), - // we still want to handle the case when the result type is different. - typedef typename result_of::type Scalar; - - typedef typename internal::traits::StorageKind StorageKind; - typedef typename internal::traits::StorageIndex StorageIndex; - - typedef typename Arg1::Nested Arg1Nested; - typedef typename Arg2::Nested Arg2Nested; - typedef typename Arg3::Nested Arg3Nested; - typedef typename remove_reference::type _Arg1Nested; - typedef typename remove_reference::type _Arg2Nested; - typedef typename remove_reference::type _Arg3Nested; - enum { Flags = _Arg1Nested::Flags & RowMajorBit }; -}; -} // end namespace internal - -template -class CwiseTernaryOpImpl; - -/** \class CwiseTernaryOp - * \ingroup Core_Module - * - * \brief Generic expression where a coefficient-wise ternary operator is - * applied to two expressions - * - * \tparam TernaryOp template functor implementing the operator - * \tparam Arg1Type the type of the first argument - * \tparam Arg2Type the type of the second argument - * \tparam Arg3Type the type of the third argument - * - * This class represents an expression where a coefficient-wise ternary - * operator is applied to three expressions. - * It is the return type of ternary operators, by which we mean only those - * ternary operators where - * all three arguments are Eigen expressions. - * For example, the return type of betainc(matrix1, matrix2, matrix3) is a - * CwiseTernaryOp. - * - * Most of the time, this is the only way that it is used, so you typically - * don't have to name - * CwiseTernaryOp types explicitly. - * - * \sa MatrixBase::ternaryExpr(const MatrixBase &, const - * MatrixBase &, const CustomTernaryOp &) const, class CwiseBinaryOp, - * class CwiseUnaryOp, class CwiseNullaryOp - */ -template -class CwiseTernaryOp : public CwiseTernaryOpImpl< - TernaryOp, Arg1Type, Arg2Type, Arg3Type, - typename internal::traits::StorageKind>, - internal::no_assignment_operator -{ - public: - typedef typename internal::remove_all::type Arg1; - typedef typename internal::remove_all::type Arg2; - typedef typename internal::remove_all::type Arg3; - - typedef typename CwiseTernaryOpImpl< - TernaryOp, Arg1Type, Arg2Type, Arg3Type, - typename internal::traits::StorageKind>::Base Base; - EIGEN_GENERIC_PUBLIC_INTERFACE(CwiseTernaryOp) - - typedef typename internal::ref_selector::type Arg1Nested; - typedef typename internal::ref_selector::type Arg2Nested; - typedef typename internal::ref_selector::type Arg3Nested; - typedef typename internal::remove_reference::type _Arg1Nested; - typedef typename internal::remove_reference::type _Arg2Nested; - typedef typename internal::remove_reference::type _Arg3Nested; - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE CwiseTernaryOp(const Arg1& a1, const Arg2& a2, - const Arg3& a3, - const TernaryOp& func = TernaryOp()) - : m_arg1(a1), m_arg2(a2), m_arg3(a3), m_functor(func) { - // require the sizes to match - EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Arg1, Arg2) - EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Arg1, Arg3) - - // The index types should match - EIGEN_STATIC_ASSERT((internal::is_same< - typename internal::traits::StorageKind, - typename internal::traits::StorageKind>::value), - STORAGE_KIND_MUST_MATCH) - EIGEN_STATIC_ASSERT((internal::is_same< - typename internal::traits::StorageKind, - typename internal::traits::StorageKind>::value), - STORAGE_KIND_MUST_MATCH) - - eigen_assert(a1.rows() == a2.rows() && a1.cols() == a2.cols() && - a1.rows() == a3.rows() && a1.cols() == a3.cols()); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Index rows() const { - // return the fixed size type if available to enable compile time - // optimizations - if (internal::traits::type>:: - RowsAtCompileTime == Dynamic && - internal::traits::type>:: - RowsAtCompileTime == Dynamic) - return m_arg3.rows(); - else if (internal::traits::type>:: - RowsAtCompileTime == Dynamic && - internal::traits::type>:: - RowsAtCompileTime == Dynamic) - return m_arg2.rows(); - else - return m_arg1.rows(); - } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Index cols() const { - // return the fixed size type if available to enable compile time - // optimizations - if (internal::traits::type>:: - ColsAtCompileTime == Dynamic && - internal::traits::type>:: - ColsAtCompileTime == Dynamic) - return m_arg3.cols(); - else if (internal::traits::type>:: - ColsAtCompileTime == Dynamic && - internal::traits::type>:: - ColsAtCompileTime == Dynamic) - return m_arg2.cols(); - else - return m_arg1.cols(); - } - - /** \returns the first argument nested expression */ - EIGEN_DEVICE_FUNC - const _Arg1Nested& arg1() const { return m_arg1; } - /** \returns the first argument nested expression */ - EIGEN_DEVICE_FUNC - const _Arg2Nested& arg2() const { return m_arg2; } - /** \returns the third argument nested expression */ - EIGEN_DEVICE_FUNC - const _Arg3Nested& arg3() const { return m_arg3; } - /** \returns the functor representing the ternary operation */ - EIGEN_DEVICE_FUNC - const TernaryOp& functor() const { return m_functor; } - - protected: - Arg1Nested m_arg1; - Arg2Nested m_arg2; - Arg3Nested m_arg3; - const TernaryOp m_functor; -}; - -// Generic API dispatcher -template -class CwiseTernaryOpImpl - : public internal::generic_xpr_base< - CwiseTernaryOp >::type { - public: - typedef typename internal::generic_xpr_base< - CwiseTernaryOp >::type Base; -}; - -} // end namespace Eigen - -#endif // EIGEN_CWISE_TERNARY_OP_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/CwiseUnaryOp.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/CwiseUnaryOp.h deleted file mode 100644 index 1d2dd19f..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/CwiseUnaryOp.h +++ /dev/null @@ -1,103 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2014 Gael Guennebaud -// Copyright (C) 2006-2008 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CWISE_UNARY_OP_H -#define EIGEN_CWISE_UNARY_OP_H - -namespace Eigen { - -namespace internal { -template -struct traits > - : traits -{ - typedef typename result_of< - UnaryOp(const typename XprType::Scalar&) - >::type Scalar; - typedef typename XprType::Nested XprTypeNested; - typedef typename remove_reference::type _XprTypeNested; - enum { - Flags = _XprTypeNested::Flags & RowMajorBit - }; -}; -} - -template -class CwiseUnaryOpImpl; - -/** \class CwiseUnaryOp - * \ingroup Core_Module - * - * \brief Generic expression where a coefficient-wise unary operator is applied to an expression - * - * \tparam UnaryOp template functor implementing the operator - * \tparam XprType the type of the expression to which we are applying the unary operator - * - * This class represents an expression where a unary operator is applied to an expression. - * It is the return type of all operations taking exactly 1 input expression, regardless of the - * presence of other inputs such as scalars. For example, the operator* in the expression 3*matrix - * is considered unary, because only the right-hand side is an expression, and its - * return type is a specialization of CwiseUnaryOp. - * - * Most of the time, this is the only way that it is used, so you typically don't have to name - * CwiseUnaryOp types explicitly. - * - * \sa MatrixBase::unaryExpr(const CustomUnaryOp &) const, class CwiseBinaryOp, class CwiseNullaryOp - */ -template -class CwiseUnaryOp : public CwiseUnaryOpImpl::StorageKind>, internal::no_assignment_operator -{ - public: - - typedef typename CwiseUnaryOpImpl::StorageKind>::Base Base; - EIGEN_GENERIC_PUBLIC_INTERFACE(CwiseUnaryOp) - typedef typename internal::ref_selector::type XprTypeNested; - typedef typename internal::remove_all::type NestedExpression; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - explicit CwiseUnaryOp(const XprType& xpr, const UnaryOp& func = UnaryOp()) - : m_xpr(xpr), m_functor(func) {} - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Index rows() const { return m_xpr.rows(); } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Index cols() const { return m_xpr.cols(); } - - /** \returns the functor representing the unary operation */ - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const UnaryOp& functor() const { return m_functor; } - - /** \returns the nested expression */ - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const typename internal::remove_all::type& - nestedExpression() const { return m_xpr; } - - /** \returns the nested expression */ - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - typename internal::remove_all::type& - nestedExpression() { return m_xpr; } - - protected: - XprTypeNested m_xpr; - const UnaryOp m_functor; -}; - -// Generic API dispatcher -template -class CwiseUnaryOpImpl - : public internal::generic_xpr_base >::type -{ -public: - typedef typename internal::generic_xpr_base >::type Base; -}; - -} // end namespace Eigen - -#endif // EIGEN_CWISE_UNARY_OP_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/CwiseUnaryView.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/CwiseUnaryView.h deleted file mode 100644 index 27103305..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/CwiseUnaryView.h +++ /dev/null @@ -1,128 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009-2010 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CWISE_UNARY_VIEW_H -#define EIGEN_CWISE_UNARY_VIEW_H - -namespace Eigen { - -namespace internal { -template -struct traits > - : traits -{ - typedef typename result_of< - ViewOp(const typename traits::Scalar&) - >::type Scalar; - typedef typename MatrixType::Nested MatrixTypeNested; - typedef typename remove_all::type _MatrixTypeNested; - enum { - FlagsLvalueBit = is_lvalue::value ? LvalueBit : 0, - Flags = traits<_MatrixTypeNested>::Flags & (RowMajorBit | FlagsLvalueBit | DirectAccessBit), // FIXME DirectAccessBit should not be handled by expressions - MatrixTypeInnerStride = inner_stride_at_compile_time::ret, - // need to cast the sizeof's from size_t to int explicitly, otherwise: - // "error: no integral type can represent all of the enumerator values - InnerStrideAtCompileTime = MatrixTypeInnerStride == Dynamic - ? int(Dynamic) - : int(MatrixTypeInnerStride) * int(sizeof(typename traits::Scalar) / sizeof(Scalar)), - OuterStrideAtCompileTime = outer_stride_at_compile_time::ret == Dynamic - ? int(Dynamic) - : outer_stride_at_compile_time::ret * int(sizeof(typename traits::Scalar) / sizeof(Scalar)) - }; -}; -} - -template -class CwiseUnaryViewImpl; - -/** \class CwiseUnaryView - * \ingroup Core_Module - * - * \brief Generic lvalue expression of a coefficient-wise unary operator of a matrix or a vector - * - * \tparam ViewOp template functor implementing the view - * \tparam MatrixType the type of the matrix we are applying the unary operator - * - * This class represents a lvalue expression of a generic unary view operator of a matrix or a vector. - * It is the return type of real() and imag(), and most of the time this is the only way it is used. - * - * \sa MatrixBase::unaryViewExpr(const CustomUnaryOp &) const, class CwiseUnaryOp - */ -template -class CwiseUnaryView : public CwiseUnaryViewImpl::StorageKind> -{ - public: - - typedef typename CwiseUnaryViewImpl::StorageKind>::Base Base; - EIGEN_GENERIC_PUBLIC_INTERFACE(CwiseUnaryView) - typedef typename internal::ref_selector::non_const_type MatrixTypeNested; - typedef typename internal::remove_all::type NestedExpression; - - explicit inline CwiseUnaryView(MatrixType& mat, const ViewOp& func = ViewOp()) - : m_matrix(mat), m_functor(func) {} - - EIGEN_INHERIT_ASSIGNMENT_OPERATORS(CwiseUnaryView) - - EIGEN_STRONG_INLINE Index rows() const { return m_matrix.rows(); } - EIGEN_STRONG_INLINE Index cols() const { return m_matrix.cols(); } - - /** \returns the functor representing unary operation */ - const ViewOp& functor() const { return m_functor; } - - /** \returns the nested expression */ - const typename internal::remove_all::type& - nestedExpression() const { return m_matrix; } - - /** \returns the nested expression */ - typename internal::remove_reference::type& - nestedExpression() { return m_matrix.const_cast_derived(); } - - protected: - MatrixTypeNested m_matrix; - ViewOp m_functor; -}; - -// Generic API dispatcher -template -class CwiseUnaryViewImpl - : public internal::generic_xpr_base >::type -{ -public: - typedef typename internal::generic_xpr_base >::type Base; -}; - -template -class CwiseUnaryViewImpl - : public internal::dense_xpr_base< CwiseUnaryView >::type -{ - public: - - typedef CwiseUnaryView Derived; - typedef typename internal::dense_xpr_base< CwiseUnaryView >::type Base; - - EIGEN_DENSE_PUBLIC_INTERFACE(Derived) - EIGEN_INHERIT_ASSIGNMENT_OPERATORS(CwiseUnaryViewImpl) - - EIGEN_DEVICE_FUNC inline Scalar* data() { return &(this->coeffRef(0)); } - EIGEN_DEVICE_FUNC inline const Scalar* data() const { return &(this->coeff(0)); } - - EIGEN_DEVICE_FUNC inline Index innerStride() const - { - return derived().nestedExpression().innerStride() * sizeof(typename internal::traits::Scalar) / sizeof(Scalar); - } - - EIGEN_DEVICE_FUNC inline Index outerStride() const - { - return derived().nestedExpression().outerStride() * sizeof(typename internal::traits::Scalar) / sizeof(Scalar); - } -}; - -} // end namespace Eigen - -#endif // EIGEN_CWISE_UNARY_VIEW_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/DenseBase.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/DenseBase.h deleted file mode 100644 index fd933eed..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/DenseBase.h +++ /dev/null @@ -1,615 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2007-2010 Benoit Jacob -// Copyright (C) 2008-2010 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_DENSEBASE_H -#define EIGEN_DENSEBASE_H - -namespace Eigen { - -namespace internal { - -// The index type defined by EIGEN_DEFAULT_DENSE_INDEX_TYPE must be a signed type. -// This dummy function simply aims at checking that at compile time. -static inline void check_DenseIndex_is_signed() { - EIGEN_STATIC_ASSERT(NumTraits::IsSigned,THE_INDEX_TYPE_MUST_BE_A_SIGNED_TYPE); -} - -} // end namespace internal - -/** \class DenseBase - * \ingroup Core_Module - * - * \brief Base class for all dense matrices, vectors, and arrays - * - * This class is the base that is inherited by all dense objects (matrix, vector, arrays, - * and related expression types). The common Eigen API for dense objects is contained in this class. - * - * \tparam Derived is the derived type, e.g., a matrix type or an expression. - * - * This class can be extended with the help of the plugin mechanism described on the page - * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_DENSEBASE_PLUGIN. - * - * \sa \blank \ref TopicClassHierarchy - */ -template class DenseBase -#ifndef EIGEN_PARSED_BY_DOXYGEN - : public DenseCoeffsBase -#else - : public DenseCoeffsBase -#endif // not EIGEN_PARSED_BY_DOXYGEN -{ - public: - - /** Inner iterator type to iterate over the coefficients of a row or column. - * \sa class InnerIterator - */ - typedef Eigen::InnerIterator InnerIterator; - - typedef typename internal::traits::StorageKind StorageKind; - - /** - * \brief The type used to store indices - * \details This typedef is relevant for types that store multiple indices such as - * PermutationMatrix or Transpositions, otherwise it defaults to Eigen::Index - * \sa \blank \ref TopicPreprocessorDirectives, Eigen::Index, SparseMatrixBase. - */ - typedef typename internal::traits::StorageIndex StorageIndex; - - /** The numeric type of the expression' coefficients, e.g. float, double, int or std::complex, etc. */ - typedef typename internal::traits::Scalar Scalar; - - /** The numeric type of the expression' coefficients, e.g. float, double, int or std::complex, etc. - * - * It is an alias for the Scalar type */ - typedef Scalar value_type; - - typedef typename NumTraits::Real RealScalar; - typedef DenseCoeffsBase Base; - - using Base::derived; - using Base::const_cast_derived; - using Base::rows; - using Base::cols; - using Base::size; - using Base::rowIndexByOuterInner; - using Base::colIndexByOuterInner; - using Base::coeff; - using Base::coeffByOuterInner; - using Base::operator(); - using Base::operator[]; - using Base::x; - using Base::y; - using Base::z; - using Base::w; - using Base::stride; - using Base::innerStride; - using Base::outerStride; - using Base::rowStride; - using Base::colStride; - typedef typename Base::CoeffReturnType CoeffReturnType; - - enum { - - RowsAtCompileTime = internal::traits::RowsAtCompileTime, - /**< The number of rows at compile-time. This is just a copy of the value provided - * by the \a Derived type. If a value is not known at compile-time, - * it is set to the \a Dynamic constant. - * \sa MatrixBase::rows(), MatrixBase::cols(), ColsAtCompileTime, SizeAtCompileTime */ - - ColsAtCompileTime = internal::traits::ColsAtCompileTime, - /**< The number of columns at compile-time. This is just a copy of the value provided - * by the \a Derived type. If a value is not known at compile-time, - * it is set to the \a Dynamic constant. - * \sa MatrixBase::rows(), MatrixBase::cols(), RowsAtCompileTime, SizeAtCompileTime */ - - - SizeAtCompileTime = (internal::size_at_compile_time::RowsAtCompileTime, - internal::traits::ColsAtCompileTime>::ret), - /**< This is equal to the number of coefficients, i.e. the number of - * rows times the number of columns, or to \a Dynamic if this is not - * known at compile-time. \sa RowsAtCompileTime, ColsAtCompileTime */ - - MaxRowsAtCompileTime = internal::traits::MaxRowsAtCompileTime, - /**< This value is equal to the maximum possible number of rows that this expression - * might have. If this expression might have an arbitrarily high number of rows, - * this value is set to \a Dynamic. - * - * This value is useful to know when evaluating an expression, in order to determine - * whether it is possible to avoid doing a dynamic memory allocation. - * - * \sa RowsAtCompileTime, MaxColsAtCompileTime, MaxSizeAtCompileTime - */ - - MaxColsAtCompileTime = internal::traits::MaxColsAtCompileTime, - /**< This value is equal to the maximum possible number of columns that this expression - * might have. If this expression might have an arbitrarily high number of columns, - * this value is set to \a Dynamic. - * - * This value is useful to know when evaluating an expression, in order to determine - * whether it is possible to avoid doing a dynamic memory allocation. - * - * \sa ColsAtCompileTime, MaxRowsAtCompileTime, MaxSizeAtCompileTime - */ - - MaxSizeAtCompileTime = (internal::size_at_compile_time::MaxRowsAtCompileTime, - internal::traits::MaxColsAtCompileTime>::ret), - /**< This value is equal to the maximum possible number of coefficients that this expression - * might have. If this expression might have an arbitrarily high number of coefficients, - * this value is set to \a Dynamic. - * - * This value is useful to know when evaluating an expression, in order to determine - * whether it is possible to avoid doing a dynamic memory allocation. - * - * \sa SizeAtCompileTime, MaxRowsAtCompileTime, MaxColsAtCompileTime - */ - - IsVectorAtCompileTime = internal::traits::MaxRowsAtCompileTime == 1 - || internal::traits::MaxColsAtCompileTime == 1, - /**< This is set to true if either the number of rows or the number of - * columns is known at compile-time to be equal to 1. Indeed, in that case, - * we are dealing with a column-vector (if there is only one column) or with - * a row-vector (if there is only one row). */ - - Flags = internal::traits::Flags, - /**< This stores expression \ref flags flags which may or may not be inherited by new expressions - * constructed from this one. See the \ref flags "list of flags". - */ - - IsRowMajor = int(Flags) & RowMajorBit, /**< True if this expression has row-major storage order. */ - - InnerSizeAtCompileTime = int(IsVectorAtCompileTime) ? int(SizeAtCompileTime) - : int(IsRowMajor) ? int(ColsAtCompileTime) : int(RowsAtCompileTime), - - InnerStrideAtCompileTime = internal::inner_stride_at_compile_time::ret, - OuterStrideAtCompileTime = internal::outer_stride_at_compile_time::ret - }; - - typedef typename internal::find_best_packet::type PacketScalar; - - enum { IsPlainObjectBase = 0 }; - - /** The plain matrix type corresponding to this expression. - * \sa PlainObject */ - typedef Matrix::Scalar, - internal::traits::RowsAtCompileTime, - internal::traits::ColsAtCompileTime, - AutoAlign | (internal::traits::Flags&RowMajorBit ? RowMajor : ColMajor), - internal::traits::MaxRowsAtCompileTime, - internal::traits::MaxColsAtCompileTime - > PlainMatrix; - - /** The plain array type corresponding to this expression. - * \sa PlainObject */ - typedef Array::Scalar, - internal::traits::RowsAtCompileTime, - internal::traits::ColsAtCompileTime, - AutoAlign | (internal::traits::Flags&RowMajorBit ? RowMajor : ColMajor), - internal::traits::MaxRowsAtCompileTime, - internal::traits::MaxColsAtCompileTime - > PlainArray; - - /** \brief The plain matrix or array type corresponding to this expression. - * - * This is not necessarily exactly the return type of eval(). In the case of plain matrices, - * the return type of eval() is a const reference to a matrix, not a matrix! It is however guaranteed - * that the return type of eval() is either PlainObject or const PlainObject&. - */ - typedef typename internal::conditional::XprKind,MatrixXpr >::value, - PlainMatrix, PlainArray>::type PlainObject; - - /** \returns the number of nonzero coefficients which is in practice the number - * of stored coefficients. */ - EIGEN_DEVICE_FUNC - inline Index nonZeros() const { return size(); } - - /** \returns the outer size. - * - * \note For a vector, this returns just 1. For a matrix (non-vector), this is the major dimension - * with respect to the \ref TopicStorageOrders "storage order", i.e., the number of columns for a - * column-major matrix, and the number of rows for a row-major matrix. */ - EIGEN_DEVICE_FUNC - Index outerSize() const - { - return IsVectorAtCompileTime ? 1 - : int(IsRowMajor) ? this->rows() : this->cols(); - } - - /** \returns the inner size. - * - * \note For a vector, this is just the size. For a matrix (non-vector), this is the minor dimension - * with respect to the \ref TopicStorageOrders "storage order", i.e., the number of rows for a - * column-major matrix, and the number of columns for a row-major matrix. */ - EIGEN_DEVICE_FUNC - Index innerSize() const - { - return IsVectorAtCompileTime ? this->size() - : int(IsRowMajor) ? this->cols() : this->rows(); - } - - /** Only plain matrices/arrays, not expressions, may be resized; therefore the only useful resize methods are - * Matrix::resize() and Array::resize(). The present method only asserts that the new size equals the old size, and does - * nothing else. - */ - EIGEN_DEVICE_FUNC - void resize(Index newSize) - { - EIGEN_ONLY_USED_FOR_DEBUG(newSize); - eigen_assert(newSize == this->size() - && "DenseBase::resize() does not actually allow to resize."); - } - /** Only plain matrices/arrays, not expressions, may be resized; therefore the only useful resize methods are - * Matrix::resize() and Array::resize(). The present method only asserts that the new size equals the old size, and does - * nothing else. - */ - EIGEN_DEVICE_FUNC - void resize(Index rows, Index cols) - { - EIGEN_ONLY_USED_FOR_DEBUG(rows); - EIGEN_ONLY_USED_FOR_DEBUG(cols); - eigen_assert(rows == this->rows() && cols == this->cols() - && "DenseBase::resize() does not actually allow to resize."); - } - -#ifndef EIGEN_PARSED_BY_DOXYGEN - /** \internal Represents a matrix with all coefficients equal to one another*/ - typedef CwiseNullaryOp,PlainObject> ConstantReturnType; - /** \internal \deprecated Represents a vector with linearly spaced coefficients that allows sequential access only. */ - typedef CwiseNullaryOp,PlainObject> SequentialLinSpacedReturnType; - /** \internal Represents a vector with linearly spaced coefficients that allows random access. */ - typedef CwiseNullaryOp,PlainObject> RandomAccessLinSpacedReturnType; - /** \internal the return type of MatrixBase::eigenvalues() */ - typedef Matrix::Scalar>::Real, internal::traits::ColsAtCompileTime, 1> EigenvaluesReturnType; - -#endif // not EIGEN_PARSED_BY_DOXYGEN - - /** Copies \a other into *this. \returns a reference to *this. */ - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Derived& operator=(const DenseBase& other); - - /** Special case of the template operator=, in order to prevent the compiler - * from generating a default operator= (issue hit with g++ 4.1) - */ - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Derived& operator=(const DenseBase& other); - - template - EIGEN_DEVICE_FUNC - Derived& operator=(const EigenBase &other); - - template - EIGEN_DEVICE_FUNC - Derived& operator+=(const EigenBase &other); - - template - EIGEN_DEVICE_FUNC - Derived& operator-=(const EigenBase &other); - - template - EIGEN_DEVICE_FUNC - Derived& operator=(const ReturnByValue& func); - - /** \internal - * Copies \a other into *this without evaluating other. \returns a reference to *this. - * \deprecated */ - template - EIGEN_DEVICE_FUNC - Derived& lazyAssign(const DenseBase& other); - - EIGEN_DEVICE_FUNC - CommaInitializer operator<< (const Scalar& s); - - /** \deprecated it now returns \c *this */ - template - EIGEN_DEPRECATED - const Derived& flagged() const - { return derived(); } - - template - EIGEN_DEVICE_FUNC - CommaInitializer operator<< (const DenseBase& other); - - typedef Transpose TransposeReturnType; - EIGEN_DEVICE_FUNC - TransposeReturnType transpose(); - typedef typename internal::add_const >::type ConstTransposeReturnType; - EIGEN_DEVICE_FUNC - ConstTransposeReturnType transpose() const; - EIGEN_DEVICE_FUNC - void transposeInPlace(); - - EIGEN_DEVICE_FUNC static const ConstantReturnType - Constant(Index rows, Index cols, const Scalar& value); - EIGEN_DEVICE_FUNC static const ConstantReturnType - Constant(Index size, const Scalar& value); - EIGEN_DEVICE_FUNC static const ConstantReturnType - Constant(const Scalar& value); - - EIGEN_DEVICE_FUNC static const SequentialLinSpacedReturnType - LinSpaced(Sequential_t, Index size, const Scalar& low, const Scalar& high); - EIGEN_DEVICE_FUNC static const RandomAccessLinSpacedReturnType - LinSpaced(Index size, const Scalar& low, const Scalar& high); - EIGEN_DEVICE_FUNC static const SequentialLinSpacedReturnType - LinSpaced(Sequential_t, const Scalar& low, const Scalar& high); - EIGEN_DEVICE_FUNC static const RandomAccessLinSpacedReturnType - LinSpaced(const Scalar& low, const Scalar& high); - - template EIGEN_DEVICE_FUNC - static const CwiseNullaryOp - NullaryExpr(Index rows, Index cols, const CustomNullaryOp& func); - template EIGEN_DEVICE_FUNC - static const CwiseNullaryOp - NullaryExpr(Index size, const CustomNullaryOp& func); - template EIGEN_DEVICE_FUNC - static const CwiseNullaryOp - NullaryExpr(const CustomNullaryOp& func); - - EIGEN_DEVICE_FUNC static const ConstantReturnType Zero(Index rows, Index cols); - EIGEN_DEVICE_FUNC static const ConstantReturnType Zero(Index size); - EIGEN_DEVICE_FUNC static const ConstantReturnType Zero(); - EIGEN_DEVICE_FUNC static const ConstantReturnType Ones(Index rows, Index cols); - EIGEN_DEVICE_FUNC static const ConstantReturnType Ones(Index size); - EIGEN_DEVICE_FUNC static const ConstantReturnType Ones(); - - EIGEN_DEVICE_FUNC void fill(const Scalar& value); - EIGEN_DEVICE_FUNC Derived& setConstant(const Scalar& value); - EIGEN_DEVICE_FUNC Derived& setLinSpaced(Index size, const Scalar& low, const Scalar& high); - EIGEN_DEVICE_FUNC Derived& setLinSpaced(const Scalar& low, const Scalar& high); - EIGEN_DEVICE_FUNC Derived& setZero(); - EIGEN_DEVICE_FUNC Derived& setOnes(); - EIGEN_DEVICE_FUNC Derived& setRandom(); - - template EIGEN_DEVICE_FUNC - bool isApprox(const DenseBase& other, - const RealScalar& prec = NumTraits::dummy_precision()) const; - EIGEN_DEVICE_FUNC - bool isMuchSmallerThan(const RealScalar& other, - const RealScalar& prec = NumTraits::dummy_precision()) const; - template EIGEN_DEVICE_FUNC - bool isMuchSmallerThan(const DenseBase& other, - const RealScalar& prec = NumTraits::dummy_precision()) const; - - EIGEN_DEVICE_FUNC bool isApproxToConstant(const Scalar& value, const RealScalar& prec = NumTraits::dummy_precision()) const; - EIGEN_DEVICE_FUNC bool isConstant(const Scalar& value, const RealScalar& prec = NumTraits::dummy_precision()) const; - EIGEN_DEVICE_FUNC bool isZero(const RealScalar& prec = NumTraits::dummy_precision()) const; - EIGEN_DEVICE_FUNC bool isOnes(const RealScalar& prec = NumTraits::dummy_precision()) const; - - inline bool hasNaN() const; - inline bool allFinite() const; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Derived& operator*=(const Scalar& other); - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Derived& operator/=(const Scalar& other); - - typedef typename internal::add_const_on_value_type::type>::type EvalReturnType; - /** \returns the matrix or vector obtained by evaluating this expression. - * - * Notice that in the case of a plain matrix or vector (not an expression) this function just returns - * a const reference, in order to avoid a useless copy. - * - * \warning Be carefull with eval() and the auto C++ keyword, as detailed in this \link TopicPitfalls_auto_keyword page \endlink. - */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE EvalReturnType eval() const - { - // Even though MSVC does not honor strong inlining when the return type - // is a dynamic matrix, we desperately need strong inlining for fixed - // size types on MSVC. - return typename internal::eval::type(derived()); - } - - /** swaps *this with the expression \a other. - * - */ - template - EIGEN_DEVICE_FUNC - void swap(const DenseBase& other) - { - EIGEN_STATIC_ASSERT(!OtherDerived::IsPlainObjectBase,THIS_EXPRESSION_IS_NOT_A_LVALUE__IT_IS_READ_ONLY); - eigen_assert(rows()==other.rows() && cols()==other.cols()); - call_assignment(derived(), other.const_cast_derived(), internal::swap_assign_op()); - } - - /** swaps *this with the matrix or array \a other. - * - */ - template - EIGEN_DEVICE_FUNC - void swap(PlainObjectBase& other) - { - eigen_assert(rows()==other.rows() && cols()==other.cols()); - call_assignment(derived(), other.derived(), internal::swap_assign_op()); - } - - EIGEN_DEVICE_FUNC inline const NestByValue nestByValue() const; - EIGEN_DEVICE_FUNC inline const ForceAlignedAccess forceAlignedAccess() const; - EIGEN_DEVICE_FUNC inline ForceAlignedAccess forceAlignedAccess(); - template EIGEN_DEVICE_FUNC - inline const typename internal::conditional,Derived&>::type forceAlignedAccessIf() const; - template EIGEN_DEVICE_FUNC - inline typename internal::conditional,Derived&>::type forceAlignedAccessIf(); - - EIGEN_DEVICE_FUNC Scalar sum() const; - EIGEN_DEVICE_FUNC Scalar mean() const; - EIGEN_DEVICE_FUNC Scalar trace() const; - - EIGEN_DEVICE_FUNC Scalar prod() const; - - EIGEN_DEVICE_FUNC typename internal::traits::Scalar minCoeff() const; - EIGEN_DEVICE_FUNC typename internal::traits::Scalar maxCoeff() const; - - template EIGEN_DEVICE_FUNC - typename internal::traits::Scalar minCoeff(IndexType* row, IndexType* col) const; - template EIGEN_DEVICE_FUNC - typename internal::traits::Scalar maxCoeff(IndexType* row, IndexType* col) const; - template EIGEN_DEVICE_FUNC - typename internal::traits::Scalar minCoeff(IndexType* index) const; - template EIGEN_DEVICE_FUNC - typename internal::traits::Scalar maxCoeff(IndexType* index) const; - - template - EIGEN_DEVICE_FUNC - Scalar redux(const BinaryOp& func) const; - - template - EIGEN_DEVICE_FUNC - void visit(Visitor& func) const; - - /** \returns a WithFormat proxy object allowing to print a matrix the with given - * format \a fmt. - * - * See class IOFormat for some examples. - * - * \sa class IOFormat, class WithFormat - */ - inline const WithFormat format(const IOFormat& fmt) const - { - return WithFormat(derived(), fmt); - } - - /** \returns the unique coefficient of a 1x1 expression */ - EIGEN_DEVICE_FUNC - CoeffReturnType value() const - { - EIGEN_STATIC_ASSERT_SIZE_1x1(Derived) - eigen_assert(this->rows() == 1 && this->cols() == 1); - return derived().coeff(0,0); - } - - EIGEN_DEVICE_FUNC bool all() const; - EIGEN_DEVICE_FUNC bool any() const; - EIGEN_DEVICE_FUNC Index count() const; - - typedef VectorwiseOp RowwiseReturnType; - typedef const VectorwiseOp ConstRowwiseReturnType; - typedef VectorwiseOp ColwiseReturnType; - typedef const VectorwiseOp ConstColwiseReturnType; - - /** \returns a VectorwiseOp wrapper of *this providing additional partial reduction operations - * - * Example: \include MatrixBase_rowwise.cpp - * Output: \verbinclude MatrixBase_rowwise.out - * - * \sa colwise(), class VectorwiseOp, \ref TutorialReductionsVisitorsBroadcasting - */ - //Code moved here due to a CUDA compiler bug - EIGEN_DEVICE_FUNC inline ConstRowwiseReturnType rowwise() const { - return ConstRowwiseReturnType(derived()); - } - EIGEN_DEVICE_FUNC RowwiseReturnType rowwise(); - - /** \returns a VectorwiseOp wrapper of *this providing additional partial reduction operations - * - * Example: \include MatrixBase_colwise.cpp - * Output: \verbinclude MatrixBase_colwise.out - * - * \sa rowwise(), class VectorwiseOp, \ref TutorialReductionsVisitorsBroadcasting - */ - EIGEN_DEVICE_FUNC inline ConstColwiseReturnType colwise() const { - return ConstColwiseReturnType(derived()); - } - EIGEN_DEVICE_FUNC ColwiseReturnType colwise(); - - typedef CwiseNullaryOp,PlainObject> RandomReturnType; - static const RandomReturnType Random(Index rows, Index cols); - static const RandomReturnType Random(Index size); - static const RandomReturnType Random(); - - template - const Select - select(const DenseBase& thenMatrix, - const DenseBase& elseMatrix) const; - - template - inline const Select - select(const DenseBase& thenMatrix, const typename ThenDerived::Scalar& elseScalar) const; - - template - inline const Select - select(const typename ElseDerived::Scalar& thenScalar, const DenseBase& elseMatrix) const; - - template RealScalar lpNorm() const; - - template - EIGEN_DEVICE_FUNC - const Replicate replicate() const; - /** - * \return an expression of the replication of \c *this - * - * Example: \include MatrixBase_replicate_int_int.cpp - * Output: \verbinclude MatrixBase_replicate_int_int.out - * - * \sa VectorwiseOp::replicate(), DenseBase::replicate(), class Replicate - */ - //Code moved here due to a CUDA compiler bug - EIGEN_DEVICE_FUNC - const Replicate replicate(Index rowFactor, Index colFactor) const - { - return Replicate(derived(), rowFactor, colFactor); - } - - typedef Reverse ReverseReturnType; - typedef const Reverse ConstReverseReturnType; - EIGEN_DEVICE_FUNC ReverseReturnType reverse(); - /** This is the const version of reverse(). */ - //Code moved here due to a CUDA compiler bug - EIGEN_DEVICE_FUNC ConstReverseReturnType reverse() const - { - return ConstReverseReturnType(derived()); - } - EIGEN_DEVICE_FUNC void reverseInPlace(); - -#define EIGEN_CURRENT_STORAGE_BASE_CLASS Eigen::DenseBase -#define EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL -#define EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(COND) -#define EIGEN_DOC_UNARY_ADDONS(X,Y) -# include "../plugins/CommonCwiseUnaryOps.h" -# include "../plugins/BlockMethods.h" -# include "../plugins/IndexedViewMethods.h" -# ifdef EIGEN_DENSEBASE_PLUGIN -# include EIGEN_DENSEBASE_PLUGIN -# endif -#undef EIGEN_CURRENT_STORAGE_BASE_CLASS -#undef EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL -#undef EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF -#undef EIGEN_DOC_UNARY_ADDONS - - // disable the use of evalTo for dense objects with a nice compilation error - template - EIGEN_DEVICE_FUNC - inline void evalTo(Dest& ) const - { - EIGEN_STATIC_ASSERT((internal::is_same::value),THE_EVAL_EVALTO_FUNCTION_SHOULD_NEVER_BE_CALLED_FOR_DENSE_OBJECTS); - } - - protected: - /** Default constructor. Do nothing. */ - EIGEN_DEVICE_FUNC DenseBase() - { - /* Just checks for self-consistency of the flags. - * Only do it when debugging Eigen, as this borders on paranoiac and could slow compilation down - */ -#ifdef EIGEN_INTERNAL_DEBUGGING - EIGEN_STATIC_ASSERT((EIGEN_IMPLIES(MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1, int(IsRowMajor)) - && EIGEN_IMPLIES(MaxColsAtCompileTime==1 && MaxRowsAtCompileTime!=1, int(!IsRowMajor))), - INVALID_STORAGE_ORDER_FOR_THIS_VECTOR_EXPRESSION) -#endif - } - - private: - EIGEN_DEVICE_FUNC explicit DenseBase(int); - EIGEN_DEVICE_FUNC DenseBase(int,int); - template EIGEN_DEVICE_FUNC explicit DenseBase(const DenseBase&); -}; - -} // end namespace Eigen - -#endif // EIGEN_DENSEBASE_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/DenseCoeffsBase.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/DenseCoeffsBase.h deleted file mode 100644 index c4af48ab..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/DenseCoeffsBase.h +++ /dev/null @@ -1,681 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2010 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_DENSECOEFFSBASE_H -#define EIGEN_DENSECOEFFSBASE_H - -namespace Eigen { - -namespace internal { -template struct add_const_on_value_type_if_arithmetic -{ - typedef typename conditional::value, T, typename add_const_on_value_type::type>::type type; -}; -} - -/** \brief Base class providing read-only coefficient access to matrices and arrays. - * \ingroup Core_Module - * \tparam Derived Type of the derived class - * \tparam #ReadOnlyAccessors Constant indicating read-only access - * - * This class defines the \c operator() \c const function and friends, which can be used to read specific - * entries of a matrix or array. - * - * \sa DenseCoeffsBase, DenseCoeffsBase, - * \ref TopicClassHierarchy - */ -template -class DenseCoeffsBase : public EigenBase -{ - public: - typedef typename internal::traits::StorageKind StorageKind; - typedef typename internal::traits::Scalar Scalar; - typedef typename internal::packet_traits::type PacketScalar; - - // Explanation for this CoeffReturnType typedef. - // - This is the return type of the coeff() method. - // - The LvalueBit means exactly that we can offer a coeffRef() method, which means exactly that we can get references - // to coeffs, which means exactly that we can have coeff() return a const reference (as opposed to returning a value). - // - The is_artihmetic check is required since "const int", "const double", etc. will cause warnings on some systems - // while the declaration of "const T", where T is a non arithmetic type does not. Always returning "const Scalar&" is - // not possible, since the underlying expressions might not offer a valid address the reference could be referring to. - typedef typename internal::conditional::Flags&LvalueBit), - const Scalar&, - typename internal::conditional::value, Scalar, const Scalar>::type - >::type CoeffReturnType; - - typedef typename internal::add_const_on_value_type_if_arithmetic< - typename internal::packet_traits::type - >::type PacketReturnType; - - typedef EigenBase Base; - using Base::rows; - using Base::cols; - using Base::size; - using Base::derived; - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Index rowIndexByOuterInner(Index outer, Index inner) const - { - return int(Derived::RowsAtCompileTime) == 1 ? 0 - : int(Derived::ColsAtCompileTime) == 1 ? inner - : int(Derived::Flags)&RowMajorBit ? outer - : inner; - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Index colIndexByOuterInner(Index outer, Index inner) const - { - return int(Derived::ColsAtCompileTime) == 1 ? 0 - : int(Derived::RowsAtCompileTime) == 1 ? inner - : int(Derived::Flags)&RowMajorBit ? inner - : outer; - } - - /** Short version: don't use this function, use - * \link operator()(Index,Index) const \endlink instead. - * - * Long version: this function is similar to - * \link operator()(Index,Index) const \endlink, but without the assertion. - * Use this for limiting the performance cost of debugging code when doing - * repeated coefficient access. Only use this when it is guaranteed that the - * parameters \a row and \a col are in range. - * - * If EIGEN_INTERNAL_DEBUGGING is defined, an assertion will be made, making this - * function equivalent to \link operator()(Index,Index) const \endlink. - * - * \sa operator()(Index,Index) const, coeffRef(Index,Index), coeff(Index) const - */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE CoeffReturnType coeff(Index row, Index col) const - { - eigen_internal_assert(row >= 0 && row < rows() - && col >= 0 && col < cols()); - return internal::evaluator(derived()).coeff(row,col); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE CoeffReturnType coeffByOuterInner(Index outer, Index inner) const - { - return coeff(rowIndexByOuterInner(outer, inner), - colIndexByOuterInner(outer, inner)); - } - - /** \returns the coefficient at given the given row and column. - * - * \sa operator()(Index,Index), operator[](Index) - */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE CoeffReturnType operator()(Index row, Index col) const - { - eigen_assert(row >= 0 && row < rows() - && col >= 0 && col < cols()); - return coeff(row, col); - } - - /** Short version: don't use this function, use - * \link operator[](Index) const \endlink instead. - * - * Long version: this function is similar to - * \link operator[](Index) const \endlink, but without the assertion. - * Use this for limiting the performance cost of debugging code when doing - * repeated coefficient access. Only use this when it is guaranteed that the - * parameter \a index is in range. - * - * If EIGEN_INTERNAL_DEBUGGING is defined, an assertion will be made, making this - * function equivalent to \link operator[](Index) const \endlink. - * - * \sa operator[](Index) const, coeffRef(Index), coeff(Index,Index) const - */ - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE CoeffReturnType - coeff(Index index) const - { - EIGEN_STATIC_ASSERT(internal::evaluator::Flags & LinearAccessBit, - THIS_COEFFICIENT_ACCESSOR_TAKING_ONE_ACCESS_IS_ONLY_FOR_EXPRESSIONS_ALLOWING_LINEAR_ACCESS) - eigen_internal_assert(index >= 0 && index < size()); - return internal::evaluator(derived()).coeff(index); - } - - - /** \returns the coefficient at given index. - * - * This method is allowed only for vector expressions, and for matrix expressions having the LinearAccessBit. - * - * \sa operator[](Index), operator()(Index,Index) const, x() const, y() const, - * z() const, w() const - */ - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE CoeffReturnType - operator[](Index index) const - { - EIGEN_STATIC_ASSERT(Derived::IsVectorAtCompileTime, - THE_BRACKET_OPERATOR_IS_ONLY_FOR_VECTORS__USE_THE_PARENTHESIS_OPERATOR_INSTEAD) - eigen_assert(index >= 0 && index < size()); - return coeff(index); - } - - /** \returns the coefficient at given index. - * - * This is synonymous to operator[](Index) const. - * - * This method is allowed only for vector expressions, and for matrix expressions having the LinearAccessBit. - * - * \sa operator[](Index), operator()(Index,Index) const, x() const, y() const, - * z() const, w() const - */ - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE CoeffReturnType - operator()(Index index) const - { - eigen_assert(index >= 0 && index < size()); - return coeff(index); - } - - /** equivalent to operator[](0). */ - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE CoeffReturnType - x() const { return (*this)[0]; } - - /** equivalent to operator[](1). */ - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE CoeffReturnType - y() const - { - EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime==-1 || Derived::SizeAtCompileTime>=2, OUT_OF_RANGE_ACCESS); - return (*this)[1]; - } - - /** equivalent to operator[](2). */ - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE CoeffReturnType - z() const - { - EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime==-1 || Derived::SizeAtCompileTime>=3, OUT_OF_RANGE_ACCESS); - return (*this)[2]; - } - - /** equivalent to operator[](3). */ - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE CoeffReturnType - w() const - { - EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime==-1 || Derived::SizeAtCompileTime>=4, OUT_OF_RANGE_ACCESS); - return (*this)[3]; - } - - /** \internal - * \returns the packet of coefficients starting at the given row and column. It is your responsibility - * to ensure that a packet really starts there. This method is only available on expressions having the - * PacketAccessBit. - * - * The \a LoadMode parameter may have the value \a #Aligned or \a #Unaligned. Its effect is to select - * the appropriate vectorization instruction. Aligned access is faster, but is only possible for packets - * starting at an address which is a multiple of the packet size. - */ - - template - EIGEN_STRONG_INLINE PacketReturnType packet(Index row, Index col) const - { - typedef typename internal::packet_traits::type DefaultPacketType; - eigen_internal_assert(row >= 0 && row < rows() && col >= 0 && col < cols()); - return internal::evaluator(derived()).template packet(row,col); - } - - - /** \internal */ - template - EIGEN_STRONG_INLINE PacketReturnType packetByOuterInner(Index outer, Index inner) const - { - return packet(rowIndexByOuterInner(outer, inner), - colIndexByOuterInner(outer, inner)); - } - - /** \internal - * \returns the packet of coefficients starting at the given index. It is your responsibility - * to ensure that a packet really starts there. This method is only available on expressions having the - * PacketAccessBit and the LinearAccessBit. - * - * The \a LoadMode parameter may have the value \a #Aligned or \a #Unaligned. Its effect is to select - * the appropriate vectorization instruction. Aligned access is faster, but is only possible for packets - * starting at an address which is a multiple of the packet size. - */ - - template - EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const - { - EIGEN_STATIC_ASSERT(internal::evaluator::Flags & LinearAccessBit, - THIS_COEFFICIENT_ACCESSOR_TAKING_ONE_ACCESS_IS_ONLY_FOR_EXPRESSIONS_ALLOWING_LINEAR_ACCESS) - typedef typename internal::packet_traits::type DefaultPacketType; - eigen_internal_assert(index >= 0 && index < size()); - return internal::evaluator(derived()).template packet(index); - } - - protected: - // explanation: DenseBase is doing "using ..." on the methods from DenseCoeffsBase. - // But some methods are only available in the DirectAccess case. - // So we add dummy methods here with these names, so that "using... " doesn't fail. - // It's not private so that the child class DenseBase can access them, and it's not public - // either since it's an implementation detail, so has to be protected. - void coeffRef(); - void coeffRefByOuterInner(); - void writePacket(); - void writePacketByOuterInner(); - void copyCoeff(); - void copyCoeffByOuterInner(); - void copyPacket(); - void copyPacketByOuterInner(); - void stride(); - void innerStride(); - void outerStride(); - void rowStride(); - void colStride(); -}; - -/** \brief Base class providing read/write coefficient access to matrices and arrays. - * \ingroup Core_Module - * \tparam Derived Type of the derived class - * \tparam #WriteAccessors Constant indicating read/write access - * - * This class defines the non-const \c operator() function and friends, which can be used to write specific - * entries of a matrix or array. This class inherits DenseCoeffsBase which - * defines the const variant for reading specific entries. - * - * \sa DenseCoeffsBase, \ref TopicClassHierarchy - */ -template -class DenseCoeffsBase : public DenseCoeffsBase -{ - public: - - typedef DenseCoeffsBase Base; - - typedef typename internal::traits::StorageKind StorageKind; - typedef typename internal::traits::Scalar Scalar; - typedef typename internal::packet_traits::type PacketScalar; - typedef typename NumTraits::Real RealScalar; - - using Base::coeff; - using Base::rows; - using Base::cols; - using Base::size; - using Base::derived; - using Base::rowIndexByOuterInner; - using Base::colIndexByOuterInner; - using Base::operator[]; - using Base::operator(); - using Base::x; - using Base::y; - using Base::z; - using Base::w; - - /** Short version: don't use this function, use - * \link operator()(Index,Index) \endlink instead. - * - * Long version: this function is similar to - * \link operator()(Index,Index) \endlink, but without the assertion. - * Use this for limiting the performance cost of debugging code when doing - * repeated coefficient access. Only use this when it is guaranteed that the - * parameters \a row and \a col are in range. - * - * If EIGEN_INTERNAL_DEBUGGING is defined, an assertion will be made, making this - * function equivalent to \link operator()(Index,Index) \endlink. - * - * \sa operator()(Index,Index), coeff(Index, Index) const, coeffRef(Index) - */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& coeffRef(Index row, Index col) - { - eigen_internal_assert(row >= 0 && row < rows() - && col >= 0 && col < cols()); - return internal::evaluator(derived()).coeffRef(row,col); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& - coeffRefByOuterInner(Index outer, Index inner) - { - return coeffRef(rowIndexByOuterInner(outer, inner), - colIndexByOuterInner(outer, inner)); - } - - /** \returns a reference to the coefficient at given the given row and column. - * - * \sa operator[](Index) - */ - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& - operator()(Index row, Index col) - { - eigen_assert(row >= 0 && row < rows() - && col >= 0 && col < cols()); - return coeffRef(row, col); - } - - - /** Short version: don't use this function, use - * \link operator[](Index) \endlink instead. - * - * Long version: this function is similar to - * \link operator[](Index) \endlink, but without the assertion. - * Use this for limiting the performance cost of debugging code when doing - * repeated coefficient access. Only use this when it is guaranteed that the - * parameters \a row and \a col are in range. - * - * If EIGEN_INTERNAL_DEBUGGING is defined, an assertion will be made, making this - * function equivalent to \link operator[](Index) \endlink. - * - * \sa operator[](Index), coeff(Index) const, coeffRef(Index,Index) - */ - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& - coeffRef(Index index) - { - EIGEN_STATIC_ASSERT(internal::evaluator::Flags & LinearAccessBit, - THIS_COEFFICIENT_ACCESSOR_TAKING_ONE_ACCESS_IS_ONLY_FOR_EXPRESSIONS_ALLOWING_LINEAR_ACCESS) - eigen_internal_assert(index >= 0 && index < size()); - return internal::evaluator(derived()).coeffRef(index); - } - - /** \returns a reference to the coefficient at given index. - * - * This method is allowed only for vector expressions, and for matrix expressions having the LinearAccessBit. - * - * \sa operator[](Index) const, operator()(Index,Index), x(), y(), z(), w() - */ - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& - operator[](Index index) - { - EIGEN_STATIC_ASSERT(Derived::IsVectorAtCompileTime, - THE_BRACKET_OPERATOR_IS_ONLY_FOR_VECTORS__USE_THE_PARENTHESIS_OPERATOR_INSTEAD) - eigen_assert(index >= 0 && index < size()); - return coeffRef(index); - } - - /** \returns a reference to the coefficient at given index. - * - * This is synonymous to operator[](Index). - * - * This method is allowed only for vector expressions, and for matrix expressions having the LinearAccessBit. - * - * \sa operator[](Index) const, operator()(Index,Index), x(), y(), z(), w() - */ - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& - operator()(Index index) - { - eigen_assert(index >= 0 && index < size()); - return coeffRef(index); - } - - /** equivalent to operator[](0). */ - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& - x() { return (*this)[0]; } - - /** equivalent to operator[](1). */ - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& - y() - { - EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime==-1 || Derived::SizeAtCompileTime>=2, OUT_OF_RANGE_ACCESS); - return (*this)[1]; - } - - /** equivalent to operator[](2). */ - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& - z() - { - EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime==-1 || Derived::SizeAtCompileTime>=3, OUT_OF_RANGE_ACCESS); - return (*this)[2]; - } - - /** equivalent to operator[](3). */ - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& - w() - { - EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime==-1 || Derived::SizeAtCompileTime>=4, OUT_OF_RANGE_ACCESS); - return (*this)[3]; - } -}; - -/** \brief Base class providing direct read-only coefficient access to matrices and arrays. - * \ingroup Core_Module - * \tparam Derived Type of the derived class - * \tparam #DirectAccessors Constant indicating direct access - * - * This class defines functions to work with strides which can be used to access entries directly. This class - * inherits DenseCoeffsBase which defines functions to access entries read-only using - * \c operator() . - * - * \sa \blank \ref TopicClassHierarchy - */ -template -class DenseCoeffsBase : public DenseCoeffsBase -{ - public: - - typedef DenseCoeffsBase Base; - typedef typename internal::traits::Scalar Scalar; - typedef typename NumTraits::Real RealScalar; - - using Base::rows; - using Base::cols; - using Base::size; - using Base::derived; - - /** \returns the pointer increment between two consecutive elements within a slice in the inner direction. - * - * \sa outerStride(), rowStride(), colStride() - */ - EIGEN_DEVICE_FUNC - inline Index innerStride() const - { - return derived().innerStride(); - } - - /** \returns the pointer increment between two consecutive inner slices (for example, between two consecutive columns - * in a column-major matrix). - * - * \sa innerStride(), rowStride(), colStride() - */ - EIGEN_DEVICE_FUNC - inline Index outerStride() const - { - return derived().outerStride(); - } - - // FIXME shall we remove it ? - inline Index stride() const - { - return Derived::IsVectorAtCompileTime ? innerStride() : outerStride(); - } - - /** \returns the pointer increment between two consecutive rows. - * - * \sa innerStride(), outerStride(), colStride() - */ - EIGEN_DEVICE_FUNC - inline Index rowStride() const - { - return Derived::IsRowMajor ? outerStride() : innerStride(); - } - - /** \returns the pointer increment between two consecutive columns. - * - * \sa innerStride(), outerStride(), rowStride() - */ - EIGEN_DEVICE_FUNC - inline Index colStride() const - { - return Derived::IsRowMajor ? innerStride() : outerStride(); - } -}; - -/** \brief Base class providing direct read/write coefficient access to matrices and arrays. - * \ingroup Core_Module - * \tparam Derived Type of the derived class - * \tparam #DirectWriteAccessors Constant indicating direct access - * - * This class defines functions to work with strides which can be used to access entries directly. This class - * inherits DenseCoeffsBase which defines functions to access entries read/write using - * \c operator(). - * - * \sa \blank \ref TopicClassHierarchy - */ -template -class DenseCoeffsBase - : public DenseCoeffsBase -{ - public: - - typedef DenseCoeffsBase Base; - typedef typename internal::traits::Scalar Scalar; - typedef typename NumTraits::Real RealScalar; - - using Base::rows; - using Base::cols; - using Base::size; - using Base::derived; - - /** \returns the pointer increment between two consecutive elements within a slice in the inner direction. - * - * \sa outerStride(), rowStride(), colStride() - */ - EIGEN_DEVICE_FUNC - inline Index innerStride() const - { - return derived().innerStride(); - } - - /** \returns the pointer increment between two consecutive inner slices (for example, between two consecutive columns - * in a column-major matrix). - * - * \sa innerStride(), rowStride(), colStride() - */ - EIGEN_DEVICE_FUNC - inline Index outerStride() const - { - return derived().outerStride(); - } - - // FIXME shall we remove it ? - inline Index stride() const - { - return Derived::IsVectorAtCompileTime ? innerStride() : outerStride(); - } - - /** \returns the pointer increment between two consecutive rows. - * - * \sa innerStride(), outerStride(), colStride() - */ - EIGEN_DEVICE_FUNC - inline Index rowStride() const - { - return Derived::IsRowMajor ? outerStride() : innerStride(); - } - - /** \returns the pointer increment between two consecutive columns. - * - * \sa innerStride(), outerStride(), rowStride() - */ - EIGEN_DEVICE_FUNC - inline Index colStride() const - { - return Derived::IsRowMajor ? innerStride() : outerStride(); - } -}; - -namespace internal { - -template -struct first_aligned_impl -{ - static inline Index run(const Derived&) - { return 0; } -}; - -template -struct first_aligned_impl -{ - static inline Index run(const Derived& m) - { - return internal::first_aligned(m.data(), m.size()); - } -}; - -/** \internal \returns the index of the first element of the array stored by \a m that is properly aligned with respect to \a Alignment for vectorization. - * - * \tparam Alignment requested alignment in Bytes. - * - * There is also the variant first_aligned(const Scalar*, Integer) defined in Memory.h. See it for more - * documentation. - */ -template -static inline Index first_aligned(const DenseBase& m) -{ - enum { ReturnZero = (int(evaluator::Alignment) >= Alignment) || !(Derived::Flags & DirectAccessBit) }; - return first_aligned_impl::run(m.derived()); -} - -template -static inline Index first_default_aligned(const DenseBase& m) -{ - typedef typename Derived::Scalar Scalar; - typedef typename packet_traits::type DefaultPacketType; - return internal::first_aligned::alignment),Derived>(m); -} - -template::ret> -struct inner_stride_at_compile_time -{ - enum { ret = traits::InnerStrideAtCompileTime }; -}; - -template -struct inner_stride_at_compile_time -{ - enum { ret = 0 }; -}; - -template::ret> -struct outer_stride_at_compile_time -{ - enum { ret = traits::OuterStrideAtCompileTime }; -}; - -template -struct outer_stride_at_compile_time -{ - enum { ret = 0 }; -}; - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_DENSECOEFFSBASE_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/DenseStorage.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/DenseStorage.h deleted file mode 100644 index 7958feeb..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/DenseStorage.h +++ /dev/null @@ -1,570 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// Copyright (C) 2006-2009 Benoit Jacob -// Copyright (C) 2010-2013 Hauke Heibel -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_MATRIXSTORAGE_H -#define EIGEN_MATRIXSTORAGE_H - -#ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN - #define EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN(X) X; EIGEN_DENSE_STORAGE_CTOR_PLUGIN; -#else - #define EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN(X) -#endif - -namespace Eigen { - -namespace internal { - -struct constructor_without_unaligned_array_assert {}; - -template -EIGEN_DEVICE_FUNC -void check_static_allocation_size() -{ - // if EIGEN_STACK_ALLOCATION_LIMIT is defined to 0, then no limit - #if EIGEN_STACK_ALLOCATION_LIMIT - EIGEN_STATIC_ASSERT(Size * sizeof(T) <= EIGEN_STACK_ALLOCATION_LIMIT, OBJECT_ALLOCATED_ON_STACK_IS_TOO_BIG); - #endif -} - -/** \internal - * Static array. If the MatrixOrArrayOptions require auto-alignment, the array will be automatically aligned: - * to 16 bytes boundary if the total size is a multiple of 16 bytes. - */ -template ::value > -struct plain_array -{ - T array[Size]; - - EIGEN_DEVICE_FUNC - plain_array() - { - check_static_allocation_size(); - } - - EIGEN_DEVICE_FUNC - plain_array(constructor_without_unaligned_array_assert) - { - check_static_allocation_size(); - } -}; - -#if defined(EIGEN_DISABLE_UNALIGNED_ARRAY_ASSERT) - #define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask) -#elif EIGEN_GNUC_AT_LEAST(4,7) - // GCC 4.7 is too aggressive in its optimizations and remove the alignement test based on the fact the array is declared to be aligned. - // See this bug report: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53900 - // Hiding the origin of the array pointer behind a function argument seems to do the trick even if the function is inlined: - template - EIGEN_ALWAYS_INLINE PtrType eigen_unaligned_array_assert_workaround_gcc47(PtrType array) { return array; } - #define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask) \ - eigen_assert((internal::UIntPtr(eigen_unaligned_array_assert_workaround_gcc47(array)) & (sizemask)) == 0 \ - && "this assertion is explained here: " \ - "http://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html" \ - " **** READ THIS WEB PAGE !!! ****"); -#else - #define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask) \ - eigen_assert((internal::UIntPtr(array) & (sizemask)) == 0 \ - && "this assertion is explained here: " \ - "http://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html" \ - " **** READ THIS WEB PAGE !!! ****"); -#endif - -template -struct plain_array -{ - EIGEN_ALIGN_TO_BOUNDARY(8) T array[Size]; - - EIGEN_DEVICE_FUNC - plain_array() - { - EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(7); - check_static_allocation_size(); - } - - EIGEN_DEVICE_FUNC - plain_array(constructor_without_unaligned_array_assert) - { - check_static_allocation_size(); - } -}; - -template -struct plain_array -{ - EIGEN_ALIGN_TO_BOUNDARY(16) T array[Size]; - - EIGEN_DEVICE_FUNC - plain_array() - { - EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(15); - check_static_allocation_size(); - } - - EIGEN_DEVICE_FUNC - plain_array(constructor_without_unaligned_array_assert) - { - check_static_allocation_size(); - } -}; - -template -struct plain_array -{ - EIGEN_ALIGN_TO_BOUNDARY(32) T array[Size]; - - EIGEN_DEVICE_FUNC - plain_array() - { - EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(31); - check_static_allocation_size(); - } - - EIGEN_DEVICE_FUNC - plain_array(constructor_without_unaligned_array_assert) - { - check_static_allocation_size(); - } -}; - -template -struct plain_array -{ - EIGEN_ALIGN_TO_BOUNDARY(64) T array[Size]; - - EIGEN_DEVICE_FUNC - plain_array() - { - EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(63); - check_static_allocation_size(); - } - - EIGEN_DEVICE_FUNC - plain_array(constructor_without_unaligned_array_assert) - { - check_static_allocation_size(); - } -}; - -template -struct plain_array -{ - T array[1]; - EIGEN_DEVICE_FUNC plain_array() {} - EIGEN_DEVICE_FUNC plain_array(constructor_without_unaligned_array_assert) {} -}; - -} // end namespace internal - -/** \internal - * - * \class DenseStorage - * \ingroup Core_Module - * - * \brief Stores the data of a matrix - * - * This class stores the data of fixed-size, dynamic-size or mixed matrices - * in a way as compact as possible. - * - * \sa Matrix - */ -template class DenseStorage; - -// purely fixed-size matrix -template class DenseStorage -{ - internal::plain_array m_data; - public: - EIGEN_DEVICE_FUNC DenseStorage() { - EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN(Index size = Size) - } - EIGEN_DEVICE_FUNC - explicit DenseStorage(internal::constructor_without_unaligned_array_assert) - : m_data(internal::constructor_without_unaligned_array_assert()) {} - EIGEN_DEVICE_FUNC - DenseStorage(const DenseStorage& other) : m_data(other.m_data) { - EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN(Index size = Size) - } - EIGEN_DEVICE_FUNC - DenseStorage& operator=(const DenseStorage& other) - { - if (this != &other) m_data = other.m_data; - return *this; - } - EIGEN_DEVICE_FUNC DenseStorage(Index size, Index rows, Index cols) { - EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN({}) - eigen_internal_assert(size==rows*cols && rows==_Rows && cols==_Cols); - EIGEN_UNUSED_VARIABLE(size); - EIGEN_UNUSED_VARIABLE(rows); - EIGEN_UNUSED_VARIABLE(cols); - } - EIGEN_DEVICE_FUNC void swap(DenseStorage& other) { std::swap(m_data,other.m_data); } - EIGEN_DEVICE_FUNC static Index rows(void) {return _Rows;} - EIGEN_DEVICE_FUNC static Index cols(void) {return _Cols;} - EIGEN_DEVICE_FUNC void conservativeResize(Index,Index,Index) {} - EIGEN_DEVICE_FUNC void resize(Index,Index,Index) {} - EIGEN_DEVICE_FUNC const T *data() const { return m_data.array; } - EIGEN_DEVICE_FUNC T *data() { return m_data.array; } -}; - -// null matrix -template class DenseStorage -{ - public: - EIGEN_DEVICE_FUNC DenseStorage() {} - EIGEN_DEVICE_FUNC explicit DenseStorage(internal::constructor_without_unaligned_array_assert) {} - EIGEN_DEVICE_FUNC DenseStorage(const DenseStorage&) {} - EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage&) { return *this; } - EIGEN_DEVICE_FUNC DenseStorage(Index,Index,Index) {} - EIGEN_DEVICE_FUNC void swap(DenseStorage& ) {} - EIGEN_DEVICE_FUNC static Index rows(void) {return _Rows;} - EIGEN_DEVICE_FUNC static Index cols(void) {return _Cols;} - EIGEN_DEVICE_FUNC void conservativeResize(Index,Index,Index) {} - EIGEN_DEVICE_FUNC void resize(Index,Index,Index) {} - EIGEN_DEVICE_FUNC const T *data() const { return 0; } - EIGEN_DEVICE_FUNC T *data() { return 0; } -}; - -// more specializations for null matrices; these are necessary to resolve ambiguities -template class DenseStorage -: public DenseStorage { }; - -template class DenseStorage -: public DenseStorage { }; - -template class DenseStorage -: public DenseStorage { }; - -// dynamic-size matrix with fixed-size storage -template class DenseStorage -{ - internal::plain_array m_data; - Index m_rows; - Index m_cols; - public: - EIGEN_DEVICE_FUNC DenseStorage() : m_rows(0), m_cols(0) {} - EIGEN_DEVICE_FUNC explicit DenseStorage(internal::constructor_without_unaligned_array_assert) - : m_data(internal::constructor_without_unaligned_array_assert()), m_rows(0), m_cols(0) {} - EIGEN_DEVICE_FUNC DenseStorage(const DenseStorage& other) : m_data(other.m_data), m_rows(other.m_rows), m_cols(other.m_cols) {} - EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage& other) - { - if (this != &other) - { - m_data = other.m_data; - m_rows = other.m_rows; - m_cols = other.m_cols; - } - return *this; - } - EIGEN_DEVICE_FUNC DenseStorage(Index, Index rows, Index cols) : m_rows(rows), m_cols(cols) {} - EIGEN_DEVICE_FUNC void swap(DenseStorage& other) - { std::swap(m_data,other.m_data); std::swap(m_rows,other.m_rows); std::swap(m_cols,other.m_cols); } - EIGEN_DEVICE_FUNC Index rows() const {return m_rows;} - EIGEN_DEVICE_FUNC Index cols() const {return m_cols;} - EIGEN_DEVICE_FUNC void conservativeResize(Index, Index rows, Index cols) { m_rows = rows; m_cols = cols; } - EIGEN_DEVICE_FUNC void resize(Index, Index rows, Index cols) { m_rows = rows; m_cols = cols; } - EIGEN_DEVICE_FUNC const T *data() const { return m_data.array; } - EIGEN_DEVICE_FUNC T *data() { return m_data.array; } -}; - -// dynamic-size matrix with fixed-size storage and fixed width -template class DenseStorage -{ - internal::plain_array m_data; - Index m_rows; - public: - EIGEN_DEVICE_FUNC DenseStorage() : m_rows(0) {} - EIGEN_DEVICE_FUNC explicit DenseStorage(internal::constructor_without_unaligned_array_assert) - : m_data(internal::constructor_without_unaligned_array_assert()), m_rows(0) {} - EIGEN_DEVICE_FUNC DenseStorage(const DenseStorage& other) : m_data(other.m_data), m_rows(other.m_rows) {} - EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage& other) - { - if (this != &other) - { - m_data = other.m_data; - m_rows = other.m_rows; - } - return *this; - } - EIGEN_DEVICE_FUNC DenseStorage(Index, Index rows, Index) : m_rows(rows) {} - EIGEN_DEVICE_FUNC void swap(DenseStorage& other) { std::swap(m_data,other.m_data); std::swap(m_rows,other.m_rows); } - EIGEN_DEVICE_FUNC Index rows(void) const {return m_rows;} - EIGEN_DEVICE_FUNC Index cols(void) const {return _Cols;} - EIGEN_DEVICE_FUNC void conservativeResize(Index, Index rows, Index) { m_rows = rows; } - EIGEN_DEVICE_FUNC void resize(Index, Index rows, Index) { m_rows = rows; } - EIGEN_DEVICE_FUNC const T *data() const { return m_data.array; } - EIGEN_DEVICE_FUNC T *data() { return m_data.array; } -}; - -// dynamic-size matrix with fixed-size storage and fixed height -template class DenseStorage -{ - internal::plain_array m_data; - Index m_cols; - public: - EIGEN_DEVICE_FUNC DenseStorage() : m_cols(0) {} - EIGEN_DEVICE_FUNC explicit DenseStorage(internal::constructor_without_unaligned_array_assert) - : m_data(internal::constructor_without_unaligned_array_assert()), m_cols(0) {} - EIGEN_DEVICE_FUNC DenseStorage(const DenseStorage& other) : m_data(other.m_data), m_cols(other.m_cols) {} - EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage& other) - { - if (this != &other) - { - m_data = other.m_data; - m_cols = other.m_cols; - } - return *this; - } - EIGEN_DEVICE_FUNC DenseStorage(Index, Index, Index cols) : m_cols(cols) {} - EIGEN_DEVICE_FUNC void swap(DenseStorage& other) { std::swap(m_data,other.m_data); std::swap(m_cols,other.m_cols); } - EIGEN_DEVICE_FUNC Index rows(void) const {return _Rows;} - EIGEN_DEVICE_FUNC Index cols(void) const {return m_cols;} - void conservativeResize(Index, Index, Index cols) { m_cols = cols; } - void resize(Index, Index, Index cols) { m_cols = cols; } - EIGEN_DEVICE_FUNC const T *data() const { return m_data.array; } - EIGEN_DEVICE_FUNC T *data() { return m_data.array; } -}; - -// purely dynamic matrix. -template class DenseStorage -{ - T *m_data; - Index m_rows; - Index m_cols; - public: - EIGEN_DEVICE_FUNC DenseStorage() : m_data(0), m_rows(0), m_cols(0) {} - EIGEN_DEVICE_FUNC explicit DenseStorage(internal::constructor_without_unaligned_array_assert) - : m_data(0), m_rows(0), m_cols(0) {} - EIGEN_DEVICE_FUNC DenseStorage(Index size, Index rows, Index cols) - : m_data(internal::conditional_aligned_new_auto(size)), m_rows(rows), m_cols(cols) - { - EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN({}) - eigen_internal_assert(size==rows*cols && rows>=0 && cols >=0); - } - EIGEN_DEVICE_FUNC DenseStorage(const DenseStorage& other) - : m_data(internal::conditional_aligned_new_auto(other.m_rows*other.m_cols)) - , m_rows(other.m_rows) - , m_cols(other.m_cols) - { - EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN(Index size = m_rows*m_cols) - internal::smart_copy(other.m_data, other.m_data+other.m_rows*other.m_cols, m_data); - } - EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage& other) - { - if (this != &other) - { - DenseStorage tmp(other); - this->swap(tmp); - } - return *this; - } -#if EIGEN_HAS_RVALUE_REFERENCES - EIGEN_DEVICE_FUNC - DenseStorage(DenseStorage&& other) EIGEN_NOEXCEPT - : m_data(std::move(other.m_data)) - , m_rows(std::move(other.m_rows)) - , m_cols(std::move(other.m_cols)) - { - other.m_data = nullptr; - other.m_rows = 0; - other.m_cols = 0; - } - EIGEN_DEVICE_FUNC - DenseStorage& operator=(DenseStorage&& other) EIGEN_NOEXCEPT - { - using std::swap; - swap(m_data, other.m_data); - swap(m_rows, other.m_rows); - swap(m_cols, other.m_cols); - return *this; - } -#endif - EIGEN_DEVICE_FUNC ~DenseStorage() { internal::conditional_aligned_delete_auto(m_data, m_rows*m_cols); } - EIGEN_DEVICE_FUNC void swap(DenseStorage& other) - { std::swap(m_data,other.m_data); std::swap(m_rows,other.m_rows); std::swap(m_cols,other.m_cols); } - EIGEN_DEVICE_FUNC Index rows(void) const {return m_rows;} - EIGEN_DEVICE_FUNC Index cols(void) const {return m_cols;} - void conservativeResize(Index size, Index rows, Index cols) - { - m_data = internal::conditional_aligned_realloc_new_auto(m_data, size, m_rows*m_cols); - m_rows = rows; - m_cols = cols; - } - EIGEN_DEVICE_FUNC void resize(Index size, Index rows, Index cols) - { - if(size != m_rows*m_cols) - { - internal::conditional_aligned_delete_auto(m_data, m_rows*m_cols); - if (size) - m_data = internal::conditional_aligned_new_auto(size); - else - m_data = 0; - EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN({}) - } - m_rows = rows; - m_cols = cols; - } - EIGEN_DEVICE_FUNC const T *data() const { return m_data; } - EIGEN_DEVICE_FUNC T *data() { return m_data; } -}; - -// matrix with dynamic width and fixed height (so that matrix has dynamic size). -template class DenseStorage -{ - T *m_data; - Index m_cols; - public: - EIGEN_DEVICE_FUNC DenseStorage() : m_data(0), m_cols(0) {} - explicit DenseStorage(internal::constructor_without_unaligned_array_assert) : m_data(0), m_cols(0) {} - EIGEN_DEVICE_FUNC DenseStorage(Index size, Index rows, Index cols) : m_data(internal::conditional_aligned_new_auto(size)), m_cols(cols) - { - EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN({}) - eigen_internal_assert(size==rows*cols && rows==_Rows && cols >=0); - EIGEN_UNUSED_VARIABLE(rows); - } - EIGEN_DEVICE_FUNC DenseStorage(const DenseStorage& other) - : m_data(internal::conditional_aligned_new_auto(_Rows*other.m_cols)) - , m_cols(other.m_cols) - { - EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN(Index size = m_cols*_Rows) - internal::smart_copy(other.m_data, other.m_data+_Rows*m_cols, m_data); - } - EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage& other) - { - if (this != &other) - { - DenseStorage tmp(other); - this->swap(tmp); - } - return *this; - } -#if EIGEN_HAS_RVALUE_REFERENCES - EIGEN_DEVICE_FUNC - DenseStorage(DenseStorage&& other) EIGEN_NOEXCEPT - : m_data(std::move(other.m_data)) - , m_cols(std::move(other.m_cols)) - { - other.m_data = nullptr; - other.m_cols = 0; - } - EIGEN_DEVICE_FUNC - DenseStorage& operator=(DenseStorage&& other) EIGEN_NOEXCEPT - { - using std::swap; - swap(m_data, other.m_data); - swap(m_cols, other.m_cols); - return *this; - } -#endif - EIGEN_DEVICE_FUNC ~DenseStorage() { internal::conditional_aligned_delete_auto(m_data, _Rows*m_cols); } - EIGEN_DEVICE_FUNC void swap(DenseStorage& other) { std::swap(m_data,other.m_data); std::swap(m_cols,other.m_cols); } - EIGEN_DEVICE_FUNC static Index rows(void) {return _Rows;} - EIGEN_DEVICE_FUNC Index cols(void) const {return m_cols;} - EIGEN_DEVICE_FUNC void conservativeResize(Index size, Index, Index cols) - { - m_data = internal::conditional_aligned_realloc_new_auto(m_data, size, _Rows*m_cols); - m_cols = cols; - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void resize(Index size, Index, Index cols) - { - if(size != _Rows*m_cols) - { - internal::conditional_aligned_delete_auto(m_data, _Rows*m_cols); - if (size) - m_data = internal::conditional_aligned_new_auto(size); - else - m_data = 0; - EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN({}) - } - m_cols = cols; - } - EIGEN_DEVICE_FUNC const T *data() const { return m_data; } - EIGEN_DEVICE_FUNC T *data() { return m_data; } -}; - -// matrix with dynamic height and fixed width (so that matrix has dynamic size). -template class DenseStorage -{ - T *m_data; - Index m_rows; - public: - EIGEN_DEVICE_FUNC DenseStorage() : m_data(0), m_rows(0) {} - explicit DenseStorage(internal::constructor_without_unaligned_array_assert) : m_data(0), m_rows(0) {} - EIGEN_DEVICE_FUNC DenseStorage(Index size, Index rows, Index cols) : m_data(internal::conditional_aligned_new_auto(size)), m_rows(rows) - { - EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN({}) - eigen_internal_assert(size==rows*cols && rows>=0 && cols == _Cols); - EIGEN_UNUSED_VARIABLE(cols); - } - EIGEN_DEVICE_FUNC DenseStorage(const DenseStorage& other) - : m_data(internal::conditional_aligned_new_auto(other.m_rows*_Cols)) - , m_rows(other.m_rows) - { - EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN(Index size = m_rows*_Cols) - internal::smart_copy(other.m_data, other.m_data+other.m_rows*_Cols, m_data); - } - EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage& other) - { - if (this != &other) - { - DenseStorage tmp(other); - this->swap(tmp); - } - return *this; - } -#if EIGEN_HAS_RVALUE_REFERENCES - EIGEN_DEVICE_FUNC - DenseStorage(DenseStorage&& other) EIGEN_NOEXCEPT - : m_data(std::move(other.m_data)) - , m_rows(std::move(other.m_rows)) - { - other.m_data = nullptr; - other.m_rows = 0; - } - EIGEN_DEVICE_FUNC - DenseStorage& operator=(DenseStorage&& other) EIGEN_NOEXCEPT - { - using std::swap; - swap(m_data, other.m_data); - swap(m_rows, other.m_rows); - return *this; - } -#endif - EIGEN_DEVICE_FUNC ~DenseStorage() { internal::conditional_aligned_delete_auto(m_data, _Cols*m_rows); } - EIGEN_DEVICE_FUNC void swap(DenseStorage& other) { std::swap(m_data,other.m_data); std::swap(m_rows,other.m_rows); } - EIGEN_DEVICE_FUNC Index rows(void) const {return m_rows;} - EIGEN_DEVICE_FUNC static Index cols(void) {return _Cols;} - void conservativeResize(Index size, Index rows, Index) - { - m_data = internal::conditional_aligned_realloc_new_auto(m_data, size, m_rows*_Cols); - m_rows = rows; - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void resize(Index size, Index rows, Index) - { - if(size != m_rows*_Cols) - { - internal::conditional_aligned_delete_auto(m_data, _Cols*m_rows); - if (size) - m_data = internal::conditional_aligned_new_auto(size); - else - m_data = 0; - EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN({}) - } - m_rows = rows; - } - EIGEN_DEVICE_FUNC const T *data() const { return m_data; } - EIGEN_DEVICE_FUNC T *data() { return m_data; } -}; - -} // end namespace Eigen - -#endif // EIGEN_MATRIX_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Diagonal.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Diagonal.h deleted file mode 100644 index c62f5ff2..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Diagonal.h +++ /dev/null @@ -1,259 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2007-2009 Benoit Jacob -// Copyright (C) 2009-2010 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_DIAGONAL_H -#define EIGEN_DIAGONAL_H - -namespace Eigen { - -/** \class Diagonal - * \ingroup Core_Module - * - * \brief Expression of a diagonal/subdiagonal/superdiagonal in a matrix - * - * \param MatrixType the type of the object in which we are taking a sub/main/super diagonal - * \param DiagIndex the index of the sub/super diagonal. The default is 0 and it means the main diagonal. - * A positive value means a superdiagonal, a negative value means a subdiagonal. - * You can also use DynamicIndex so the index can be set at runtime. - * - * The matrix is not required to be square. - * - * This class represents an expression of the main diagonal, or any sub/super diagonal - * of a square matrix. It is the return type of MatrixBase::diagonal() and MatrixBase::diagonal(Index) and most of the - * time this is the only way it is used. - * - * \sa MatrixBase::diagonal(), MatrixBase::diagonal(Index) - */ - -namespace internal { -template -struct traits > - : traits -{ - typedef typename ref_selector::type MatrixTypeNested; - typedef typename remove_reference::type _MatrixTypeNested; - typedef typename MatrixType::StorageKind StorageKind; - enum { - RowsAtCompileTime = (int(DiagIndex) == DynamicIndex || int(MatrixType::SizeAtCompileTime) == Dynamic) ? Dynamic - : (EIGEN_PLAIN_ENUM_MIN(MatrixType::RowsAtCompileTime - EIGEN_PLAIN_ENUM_MAX(-DiagIndex, 0), - MatrixType::ColsAtCompileTime - EIGEN_PLAIN_ENUM_MAX( DiagIndex, 0))), - ColsAtCompileTime = 1, - MaxRowsAtCompileTime = int(MatrixType::MaxSizeAtCompileTime) == Dynamic ? Dynamic - : DiagIndex == DynamicIndex ? EIGEN_SIZE_MIN_PREFER_FIXED(MatrixType::MaxRowsAtCompileTime, - MatrixType::MaxColsAtCompileTime) - : (EIGEN_PLAIN_ENUM_MIN(MatrixType::MaxRowsAtCompileTime - EIGEN_PLAIN_ENUM_MAX(-DiagIndex, 0), - MatrixType::MaxColsAtCompileTime - EIGEN_PLAIN_ENUM_MAX( DiagIndex, 0))), - MaxColsAtCompileTime = 1, - MaskLvalueBit = is_lvalue::value ? LvalueBit : 0, - Flags = (unsigned int)_MatrixTypeNested::Flags & (RowMajorBit | MaskLvalueBit | DirectAccessBit) & ~RowMajorBit, // FIXME DirectAccessBit should not be handled by expressions - MatrixTypeOuterStride = outer_stride_at_compile_time::ret, - InnerStrideAtCompileTime = MatrixTypeOuterStride == Dynamic ? Dynamic : MatrixTypeOuterStride+1, - OuterStrideAtCompileTime = 0 - }; -}; -} - -template class Diagonal - : public internal::dense_xpr_base< Diagonal >::type -{ - public: - - enum { DiagIndex = _DiagIndex }; - typedef typename internal::dense_xpr_base::type Base; - EIGEN_DENSE_PUBLIC_INTERFACE(Diagonal) - - EIGEN_DEVICE_FUNC - explicit inline Diagonal(MatrixType& matrix, Index a_index = DiagIndex) : m_matrix(matrix), m_index(a_index) {} - - EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Diagonal) - - EIGEN_DEVICE_FUNC - inline Index rows() const - { - return m_index.value()<0 ? numext::mini(m_matrix.cols(),m_matrix.rows()+m_index.value()) - : numext::mini(m_matrix.rows(),m_matrix.cols()-m_index.value()); - } - - EIGEN_DEVICE_FUNC - inline Index cols() const { return 1; } - - EIGEN_DEVICE_FUNC - inline Index innerStride() const - { - return m_matrix.outerStride() + 1; - } - - EIGEN_DEVICE_FUNC - inline Index outerStride() const - { - return 0; - } - - typedef typename internal::conditional< - internal::is_lvalue::value, - Scalar, - const Scalar - >::type ScalarWithConstIfNotLvalue; - - EIGEN_DEVICE_FUNC - inline ScalarWithConstIfNotLvalue* data() { return &(m_matrix.coeffRef(rowOffset(), colOffset())); } - EIGEN_DEVICE_FUNC - inline const Scalar* data() const { return &(m_matrix.coeffRef(rowOffset(), colOffset())); } - - EIGEN_DEVICE_FUNC - inline Scalar& coeffRef(Index row, Index) - { - EIGEN_STATIC_ASSERT_LVALUE(MatrixType) - return m_matrix.coeffRef(row+rowOffset(), row+colOffset()); - } - - EIGEN_DEVICE_FUNC - inline const Scalar& coeffRef(Index row, Index) const - { - return m_matrix.coeffRef(row+rowOffset(), row+colOffset()); - } - - EIGEN_DEVICE_FUNC - inline CoeffReturnType coeff(Index row, Index) const - { - return m_matrix.coeff(row+rowOffset(), row+colOffset()); - } - - EIGEN_DEVICE_FUNC - inline Scalar& coeffRef(Index idx) - { - EIGEN_STATIC_ASSERT_LVALUE(MatrixType) - return m_matrix.coeffRef(idx+rowOffset(), idx+colOffset()); - } - - EIGEN_DEVICE_FUNC - inline const Scalar& coeffRef(Index idx) const - { - return m_matrix.coeffRef(idx+rowOffset(), idx+colOffset()); - } - - EIGEN_DEVICE_FUNC - inline CoeffReturnType coeff(Index idx) const - { - return m_matrix.coeff(idx+rowOffset(), idx+colOffset()); - } - - EIGEN_DEVICE_FUNC - inline const typename internal::remove_all::type& - nestedExpression() const - { - return m_matrix; - } - - EIGEN_DEVICE_FUNC - inline Index index() const - { - return m_index.value(); - } - - protected: - typename internal::ref_selector::non_const_type m_matrix; - const internal::variable_if_dynamicindex m_index; - - private: - // some compilers may fail to optimize std::max etc in case of compile-time constants... - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Index absDiagIndex() const { return m_index.value()>0 ? m_index.value() : -m_index.value(); } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Index rowOffset() const { return m_index.value()>0 ? 0 : -m_index.value(); } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Index colOffset() const { return m_index.value()>0 ? m_index.value() : 0; } - // trigger a compile-time error if someone try to call packet - template typename MatrixType::PacketReturnType packet(Index) const; - template typename MatrixType::PacketReturnType packet(Index,Index) const; -}; - -/** \returns an expression of the main diagonal of the matrix \c *this - * - * \c *this is not required to be square. - * - * Example: \include MatrixBase_diagonal.cpp - * Output: \verbinclude MatrixBase_diagonal.out - * - * \sa class Diagonal */ -template -EIGEN_DEVICE_FUNC inline typename MatrixBase::DiagonalReturnType -MatrixBase::diagonal() -{ - return DiagonalReturnType(derived()); -} - -/** This is the const version of diagonal(). */ -template -EIGEN_DEVICE_FUNC inline typename MatrixBase::ConstDiagonalReturnType -MatrixBase::diagonal() const -{ - return ConstDiagonalReturnType(derived()); -} - -/** \returns an expression of the \a DiagIndex-th sub or super diagonal of the matrix \c *this - * - * \c *this is not required to be square. - * - * The template parameter \a DiagIndex represent a super diagonal if \a DiagIndex > 0 - * and a sub diagonal otherwise. \a DiagIndex == 0 is equivalent to the main diagonal. - * - * Example: \include MatrixBase_diagonal_int.cpp - * Output: \verbinclude MatrixBase_diagonal_int.out - * - * \sa MatrixBase::diagonal(), class Diagonal */ -template -EIGEN_DEVICE_FUNC inline typename MatrixBase::DiagonalDynamicIndexReturnType -MatrixBase::diagonal(Index index) -{ - return DiagonalDynamicIndexReturnType(derived(), index); -} - -/** This is the const version of diagonal(Index). */ -template -EIGEN_DEVICE_FUNC inline typename MatrixBase::ConstDiagonalDynamicIndexReturnType -MatrixBase::diagonal(Index index) const -{ - return ConstDiagonalDynamicIndexReturnType(derived(), index); -} - -/** \returns an expression of the \a DiagIndex-th sub or super diagonal of the matrix \c *this - * - * \c *this is not required to be square. - * - * The template parameter \a DiagIndex represent a super diagonal if \a DiagIndex > 0 - * and a sub diagonal otherwise. \a DiagIndex == 0 is equivalent to the main diagonal. - * - * Example: \include MatrixBase_diagonal_template_int.cpp - * Output: \verbinclude MatrixBase_diagonal_template_int.out - * - * \sa MatrixBase::diagonal(), class Diagonal */ -template -template -EIGEN_DEVICE_FUNC -inline typename MatrixBase::template DiagonalIndexReturnType::Type -MatrixBase::diagonal() -{ - return typename DiagonalIndexReturnType::Type(derived()); -} - -/** This is the const version of diagonal(). */ -template -template -EIGEN_DEVICE_FUNC -inline typename MatrixBase::template ConstDiagonalIndexReturnType::Type -MatrixBase::diagonal() const -{ - return typename ConstDiagonalIndexReturnType::Type(derived()); -} - -} // end namespace Eigen - -#endif // EIGEN_DIAGONAL_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/DiagonalMatrix.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/DiagonalMatrix.h deleted file mode 100644 index 4e8297ee..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/DiagonalMatrix.h +++ /dev/null @@ -1,343 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009 Gael Guennebaud -// Copyright (C) 2007-2009 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_DIAGONALMATRIX_H -#define EIGEN_DIAGONALMATRIX_H - -namespace Eigen { - -#ifndef EIGEN_PARSED_BY_DOXYGEN -template -class DiagonalBase : public EigenBase -{ - public: - typedef typename internal::traits::DiagonalVectorType DiagonalVectorType; - typedef typename DiagonalVectorType::Scalar Scalar; - typedef typename DiagonalVectorType::RealScalar RealScalar; - typedef typename internal::traits::StorageKind StorageKind; - typedef typename internal::traits::StorageIndex StorageIndex; - - enum { - RowsAtCompileTime = DiagonalVectorType::SizeAtCompileTime, - ColsAtCompileTime = DiagonalVectorType::SizeAtCompileTime, - MaxRowsAtCompileTime = DiagonalVectorType::MaxSizeAtCompileTime, - MaxColsAtCompileTime = DiagonalVectorType::MaxSizeAtCompileTime, - IsVectorAtCompileTime = 0, - Flags = NoPreferredStorageOrderBit - }; - - typedef Matrix DenseMatrixType; - typedef DenseMatrixType DenseType; - typedef DiagonalMatrix PlainObject; - - EIGEN_DEVICE_FUNC - inline const Derived& derived() const { return *static_cast(this); } - EIGEN_DEVICE_FUNC - inline Derived& derived() { return *static_cast(this); } - - EIGEN_DEVICE_FUNC - DenseMatrixType toDenseMatrix() const { return derived(); } - - EIGEN_DEVICE_FUNC - inline const DiagonalVectorType& diagonal() const { return derived().diagonal(); } - EIGEN_DEVICE_FUNC - inline DiagonalVectorType& diagonal() { return derived().diagonal(); } - - EIGEN_DEVICE_FUNC - inline Index rows() const { return diagonal().size(); } - EIGEN_DEVICE_FUNC - inline Index cols() const { return diagonal().size(); } - - template - EIGEN_DEVICE_FUNC - const Product - operator*(const MatrixBase &matrix) const - { - return Product(derived(),matrix.derived()); - } - - typedef DiagonalWrapper, const DiagonalVectorType> > InverseReturnType; - EIGEN_DEVICE_FUNC - inline const InverseReturnType - inverse() const - { - return InverseReturnType(diagonal().cwiseInverse()); - } - - EIGEN_DEVICE_FUNC - inline const DiagonalWrapper - operator*(const Scalar& scalar) const - { - return DiagonalWrapper(diagonal() * scalar); - } - EIGEN_DEVICE_FUNC - friend inline const DiagonalWrapper - operator*(const Scalar& scalar, const DiagonalBase& other) - { - return DiagonalWrapper(scalar * other.diagonal()); - } -}; - -#endif - -/** \class DiagonalMatrix - * \ingroup Core_Module - * - * \brief Represents a diagonal matrix with its storage - * - * \param _Scalar the type of coefficients - * \param SizeAtCompileTime the dimension of the matrix, or Dynamic - * \param MaxSizeAtCompileTime the dimension of the matrix, or Dynamic. This parameter is optional and defaults - * to SizeAtCompileTime. Most of the time, you do not need to specify it. - * - * \sa class DiagonalWrapper - */ - -namespace internal { -template -struct traits > - : traits > -{ - typedef Matrix<_Scalar,SizeAtCompileTime,1,0,MaxSizeAtCompileTime,1> DiagonalVectorType; - typedef DiagonalShape StorageKind; - enum { - Flags = LvalueBit | NoPreferredStorageOrderBit - }; -}; -} -template -class DiagonalMatrix - : public DiagonalBase > -{ - public: - #ifndef EIGEN_PARSED_BY_DOXYGEN - typedef typename internal::traits::DiagonalVectorType DiagonalVectorType; - typedef const DiagonalMatrix& Nested; - typedef _Scalar Scalar; - typedef typename internal::traits::StorageKind StorageKind; - typedef typename internal::traits::StorageIndex StorageIndex; - #endif - - protected: - - DiagonalVectorType m_diagonal; - - public: - - /** const version of diagonal(). */ - EIGEN_DEVICE_FUNC - inline const DiagonalVectorType& diagonal() const { return m_diagonal; } - /** \returns a reference to the stored vector of diagonal coefficients. */ - EIGEN_DEVICE_FUNC - inline DiagonalVectorType& diagonal() { return m_diagonal; } - - /** Default constructor without initialization */ - EIGEN_DEVICE_FUNC - inline DiagonalMatrix() {} - - /** Constructs a diagonal matrix with given dimension */ - EIGEN_DEVICE_FUNC - explicit inline DiagonalMatrix(Index dim) : m_diagonal(dim) {} - - /** 2D constructor. */ - EIGEN_DEVICE_FUNC - inline DiagonalMatrix(const Scalar& x, const Scalar& y) : m_diagonal(x,y) {} - - /** 3D constructor. */ - EIGEN_DEVICE_FUNC - inline DiagonalMatrix(const Scalar& x, const Scalar& y, const Scalar& z) : m_diagonal(x,y,z) {} - - /** Copy constructor. */ - template - EIGEN_DEVICE_FUNC - inline DiagonalMatrix(const DiagonalBase& other) : m_diagonal(other.diagonal()) {} - - #ifndef EIGEN_PARSED_BY_DOXYGEN - /** copy constructor. prevent a default copy constructor from hiding the other templated constructor */ - inline DiagonalMatrix(const DiagonalMatrix& other) : m_diagonal(other.diagonal()) {} - #endif - - /** generic constructor from expression of the diagonal coefficients */ - template - EIGEN_DEVICE_FUNC - explicit inline DiagonalMatrix(const MatrixBase& other) : m_diagonal(other) - {} - - /** Copy operator. */ - template - EIGEN_DEVICE_FUNC - DiagonalMatrix& operator=(const DiagonalBase& other) - { - m_diagonal = other.diagonal(); - return *this; - } - - #ifndef EIGEN_PARSED_BY_DOXYGEN - /** This is a special case of the templated operator=. Its purpose is to - * prevent a default operator= from hiding the templated operator=. - */ - EIGEN_DEVICE_FUNC - DiagonalMatrix& operator=(const DiagonalMatrix& other) - { - m_diagonal = other.diagonal(); - return *this; - } - #endif - - /** Resizes to given size. */ - EIGEN_DEVICE_FUNC - inline void resize(Index size) { m_diagonal.resize(size); } - /** Sets all coefficients to zero. */ - EIGEN_DEVICE_FUNC - inline void setZero() { m_diagonal.setZero(); } - /** Resizes and sets all coefficients to zero. */ - EIGEN_DEVICE_FUNC - inline void setZero(Index size) { m_diagonal.setZero(size); } - /** Sets this matrix to be the identity matrix of the current size. */ - EIGEN_DEVICE_FUNC - inline void setIdentity() { m_diagonal.setOnes(); } - /** Sets this matrix to be the identity matrix of the given size. */ - EIGEN_DEVICE_FUNC - inline void setIdentity(Index size) { m_diagonal.setOnes(size); } -}; - -/** \class DiagonalWrapper - * \ingroup Core_Module - * - * \brief Expression of a diagonal matrix - * - * \param _DiagonalVectorType the type of the vector of diagonal coefficients - * - * This class is an expression of a diagonal matrix, but not storing its own vector of diagonal coefficients, - * instead wrapping an existing vector expression. It is the return type of MatrixBase::asDiagonal() - * and most of the time this is the only way that it is used. - * - * \sa class DiagonalMatrix, class DiagonalBase, MatrixBase::asDiagonal() - */ - -namespace internal { -template -struct traits > -{ - typedef _DiagonalVectorType DiagonalVectorType; - typedef typename DiagonalVectorType::Scalar Scalar; - typedef typename DiagonalVectorType::StorageIndex StorageIndex; - typedef DiagonalShape StorageKind; - typedef typename traits::XprKind XprKind; - enum { - RowsAtCompileTime = DiagonalVectorType::SizeAtCompileTime, - ColsAtCompileTime = DiagonalVectorType::SizeAtCompileTime, - MaxRowsAtCompileTime = DiagonalVectorType::MaxSizeAtCompileTime, - MaxColsAtCompileTime = DiagonalVectorType::MaxSizeAtCompileTime, - Flags = (traits::Flags & LvalueBit) | NoPreferredStorageOrderBit - }; -}; -} - -template -class DiagonalWrapper - : public DiagonalBase >, internal::no_assignment_operator -{ - public: - #ifndef EIGEN_PARSED_BY_DOXYGEN - typedef _DiagonalVectorType DiagonalVectorType; - typedef DiagonalWrapper Nested; - #endif - - /** Constructor from expression of diagonal coefficients to wrap. */ - EIGEN_DEVICE_FUNC - explicit inline DiagonalWrapper(DiagonalVectorType& a_diagonal) : m_diagonal(a_diagonal) {} - - /** \returns a const reference to the wrapped expression of diagonal coefficients. */ - EIGEN_DEVICE_FUNC - const DiagonalVectorType& diagonal() const { return m_diagonal; } - - protected: - typename DiagonalVectorType::Nested m_diagonal; -}; - -/** \returns a pseudo-expression of a diagonal matrix with *this as vector of diagonal coefficients - * - * \only_for_vectors - * - * Example: \include MatrixBase_asDiagonal.cpp - * Output: \verbinclude MatrixBase_asDiagonal.out - * - * \sa class DiagonalWrapper, class DiagonalMatrix, diagonal(), isDiagonal() - **/ -template -EIGEN_DEVICE_FUNC inline const DiagonalWrapper -MatrixBase::asDiagonal() const -{ - return DiagonalWrapper(derived()); -} - -/** \returns true if *this is approximately equal to a diagonal matrix, - * within the precision given by \a prec. - * - * Example: \include MatrixBase_isDiagonal.cpp - * Output: \verbinclude MatrixBase_isDiagonal.out - * - * \sa asDiagonal() - */ -template -bool MatrixBase::isDiagonal(const RealScalar& prec) const -{ - if(cols() != rows()) return false; - RealScalar maxAbsOnDiagonal = static_cast(-1); - for(Index j = 0; j < cols(); ++j) - { - RealScalar absOnDiagonal = numext::abs(coeff(j,j)); - if(absOnDiagonal > maxAbsOnDiagonal) maxAbsOnDiagonal = absOnDiagonal; - } - for(Index j = 0; j < cols(); ++j) - for(Index i = 0; i < j; ++i) - { - if(!internal::isMuchSmallerThan(coeff(i, j), maxAbsOnDiagonal, prec)) return false; - if(!internal::isMuchSmallerThan(coeff(j, i), maxAbsOnDiagonal, prec)) return false; - } - return true; -} - -namespace internal { - -template<> struct storage_kind_to_shape { typedef DiagonalShape Shape; }; - -struct Diagonal2Dense {}; - -template<> struct AssignmentKind { typedef Diagonal2Dense Kind; }; - -// Diagonal matrix to Dense assignment -template< typename DstXprType, typename SrcXprType, typename Functor> -struct Assignment -{ - static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op &/*func*/) - { - Index dstRows = src.rows(); - Index dstCols = src.cols(); - if((dst.rows()!=dstRows) || (dst.cols()!=dstCols)) - dst.resize(dstRows, dstCols); - - dst.setZero(); - dst.diagonal() = src.diagonal(); - } - - static void run(DstXprType &dst, const SrcXprType &src, const internal::add_assign_op &/*func*/) - { dst.diagonal() += src.diagonal(); } - - static void run(DstXprType &dst, const SrcXprType &src, const internal::sub_assign_op &/*func*/) - { dst.diagonal() -= src.diagonal(); } -}; - -} // namespace internal - -} // end namespace Eigen - -#endif // EIGEN_DIAGONALMATRIX_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/DiagonalProduct.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/DiagonalProduct.h deleted file mode 100644 index 7911d1cd..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/DiagonalProduct.h +++ /dev/null @@ -1,28 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// Copyright (C) 2007-2009 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_DIAGONALPRODUCT_H -#define EIGEN_DIAGONALPRODUCT_H - -namespace Eigen { - -/** \returns the diagonal matrix product of \c *this by the diagonal matrix \a diagonal. - */ -template -template -EIGEN_DEVICE_FUNC inline const Product -MatrixBase::operator*(const DiagonalBase &a_diagonal) const -{ - return Product(derived(),a_diagonal.derived()); -} - -} // end namespace Eigen - -#endif // EIGEN_DIAGONALPRODUCT_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Dot.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Dot.h deleted file mode 100644 index bb8e3fec..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Dot.h +++ /dev/null @@ -1,315 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2008, 2010 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_DOT_H -#define EIGEN_DOT_H - -namespace Eigen { - -namespace internal { - -// helper function for dot(). The problem is that if we put that in the body of dot(), then upon calling dot -// with mismatched types, the compiler emits errors about failing to instantiate cwiseProduct BEFORE -// looking at the static assertions. Thus this is a trick to get better compile errors. -template -struct dot_nocheck -{ - typedef scalar_conj_product_op::Scalar,typename traits::Scalar> conj_prod; - typedef typename conj_prod::result_type ResScalar; - EIGEN_DEVICE_FUNC - static inline ResScalar run(const MatrixBase& a, const MatrixBase& b) - { - return a.template binaryExpr(b).sum(); - } -}; - -template -struct dot_nocheck -{ - typedef scalar_conj_product_op::Scalar,typename traits::Scalar> conj_prod; - typedef typename conj_prod::result_type ResScalar; - EIGEN_DEVICE_FUNC - static inline ResScalar run(const MatrixBase& a, const MatrixBase& b) - { - return a.transpose().template binaryExpr(b).sum(); - } -}; - -} // end namespace internal - -/** \fn MatrixBase::dot - * \returns the dot product of *this with other. - * - * \only_for_vectors - * - * \note If the scalar type is complex numbers, then this function returns the hermitian - * (sesquilinear) dot product, conjugate-linear in the first variable and linear in the - * second variable. - * - * \sa squaredNorm(), norm() - */ -template -template -EIGEN_DEVICE_FUNC -typename ScalarBinaryOpTraits::Scalar,typename internal::traits::Scalar>::ReturnType -MatrixBase::dot(const MatrixBase& other) const -{ - EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) - EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived) - EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Derived,OtherDerived) -#if !(defined(EIGEN_NO_STATIC_ASSERT) && defined(EIGEN_NO_DEBUG)) - typedef internal::scalar_conj_product_op func; - EIGEN_CHECK_BINARY_COMPATIBILIY(func,Scalar,typename OtherDerived::Scalar); -#endif - - eigen_assert(size() == other.size()); - - return internal::dot_nocheck::run(*this, other); -} - -//---------- implementation of L2 norm and related functions ---------- - -/** \returns, for vectors, the squared \em l2 norm of \c *this, and for matrices the Frobenius norm. - * In both cases, it consists in the sum of the square of all the matrix entries. - * For vectors, this is also equals to the dot product of \c *this with itself. - * - * \sa dot(), norm(), lpNorm() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename NumTraits::Scalar>::Real MatrixBase::squaredNorm() const -{ - return numext::real((*this).cwiseAbs2().sum()); -} - -/** \returns, for vectors, the \em l2 norm of \c *this, and for matrices the Frobenius norm. - * In both cases, it consists in the square root of the sum of the square of all the matrix entries. - * For vectors, this is also equals to the square root of the dot product of \c *this with itself. - * - * \sa lpNorm(), dot(), squaredNorm() - */ -template -EIGEN_DEVICE_FUNC inline typename NumTraits::Scalar>::Real MatrixBase::norm() const -{ - return numext::sqrt(squaredNorm()); -} - -/** \returns an expression of the quotient of \c *this by its own norm. - * - * \warning If the input vector is too small (i.e., this->norm()==0), - * then this function returns a copy of the input. - * - * \only_for_vectors - * - * \sa norm(), normalize() - */ -template -EIGEN_DEVICE_FUNC inline const typename MatrixBase::PlainObject -MatrixBase::normalized() const -{ - typedef typename internal::nested_eval::type _Nested; - _Nested n(derived()); - RealScalar z = n.squaredNorm(); - // NOTE: after extensive benchmarking, this conditional does not impact performance, at least on recent x86 CPU - if(z>RealScalar(0)) - return n / numext::sqrt(z); - else - return n; -} - -/** Normalizes the vector, i.e. divides it by its own norm. - * - * \only_for_vectors - * - * \warning If the input vector is too small (i.e., this->norm()==0), then \c *this is left unchanged. - * - * \sa norm(), normalized() - */ -template -EIGEN_DEVICE_FUNC inline void MatrixBase::normalize() -{ - RealScalar z = squaredNorm(); - // NOTE: after extensive benchmarking, this conditional does not impact performance, at least on recent x86 CPU - if(z>RealScalar(0)) - derived() /= numext::sqrt(z); -} - -/** \returns an expression of the quotient of \c *this by its own norm while avoiding underflow and overflow. - * - * \only_for_vectors - * - * This method is analogue to the normalized() method, but it reduces the risk of - * underflow and overflow when computing the norm. - * - * \warning If the input vector is too small (i.e., this->norm()==0), - * then this function returns a copy of the input. - * - * \sa stableNorm(), stableNormalize(), normalized() - */ -template -EIGEN_DEVICE_FUNC inline const typename MatrixBase::PlainObject -MatrixBase::stableNormalized() const -{ - typedef typename internal::nested_eval::type _Nested; - _Nested n(derived()); - RealScalar w = n.cwiseAbs().maxCoeff(); - RealScalar z = (n/w).squaredNorm(); - if(z>RealScalar(0)) - return n / (numext::sqrt(z)*w); - else - return n; -} - -/** Normalizes the vector while avoid underflow and overflow - * - * \only_for_vectors - * - * This method is analogue to the normalize() method, but it reduces the risk of - * underflow and overflow when computing the norm. - * - * \warning If the input vector is too small (i.e., this->norm()==0), then \c *this is left unchanged. - * - * \sa stableNorm(), stableNormalized(), normalize() - */ -template -EIGEN_DEVICE_FUNC inline void MatrixBase::stableNormalize() -{ - RealScalar w = cwiseAbs().maxCoeff(); - RealScalar z = (derived()/w).squaredNorm(); - if(z>RealScalar(0)) - derived() /= numext::sqrt(z)*w; -} - -//---------- implementation of other norms ---------- - -namespace internal { - -template -struct lpNorm_selector -{ - typedef typename NumTraits::Scalar>::Real RealScalar; - EIGEN_DEVICE_FUNC - static inline RealScalar run(const MatrixBase& m) - { - EIGEN_USING_STD_MATH(pow) - return pow(m.cwiseAbs().array().pow(p).sum(), RealScalar(1)/p); - } -}; - -template -struct lpNorm_selector -{ - EIGEN_DEVICE_FUNC - static inline typename NumTraits::Scalar>::Real run(const MatrixBase& m) - { - return m.cwiseAbs().sum(); - } -}; - -template -struct lpNorm_selector -{ - EIGEN_DEVICE_FUNC - static inline typename NumTraits::Scalar>::Real run(const MatrixBase& m) - { - return m.norm(); - } -}; - -template -struct lpNorm_selector -{ - typedef typename NumTraits::Scalar>::Real RealScalar; - EIGEN_DEVICE_FUNC - static inline RealScalar run(const MatrixBase& m) - { - if(Derived::SizeAtCompileTime==0 || (Derived::SizeAtCompileTime==Dynamic && m.size()==0)) - return RealScalar(0); - return m.cwiseAbs().maxCoeff(); - } -}; - -} // end namespace internal - -/** \returns the \b coefficient-wise \f$ \ell^p \f$ norm of \c *this, that is, returns the p-th root of the sum of the p-th powers of the absolute values - * of the coefficients of \c *this. If \a p is the special value \a Eigen::Infinity, this function returns the \f$ \ell^\infty \f$ - * norm, that is the maximum of the absolute values of the coefficients of \c *this. - * - * In all cases, if \c *this is empty, then the value 0 is returned. - * - * \note For matrices, this function does not compute the
    operator-norm. That is, if \c *this is a matrix, then its coefficients are interpreted as a 1D vector. Nonetheless, you can easily compute the 1-norm and \f$\infty\f$-norm matrix operator norms using \link TutorialReductionsVisitorsBroadcastingReductionsNorm partial reductions \endlink. - * - * \sa norm() - */ -template -template -#ifndef EIGEN_PARSED_BY_DOXYGEN -EIGEN_DEVICE_FUNC inline typename NumTraits::Scalar>::Real -#else -EIGEN_DEVICE_FUNC MatrixBase::RealScalar -#endif -MatrixBase::lpNorm() const -{ - return internal::lpNorm_selector::run(*this); -} - -//---------- implementation of isOrthogonal / isUnitary ---------- - -/** \returns true if *this is approximately orthogonal to \a other, - * within the precision given by \a prec. - * - * Example: \include MatrixBase_isOrthogonal.cpp - * Output: \verbinclude MatrixBase_isOrthogonal.out - */ -template -template -bool MatrixBase::isOrthogonal -(const MatrixBase& other, const RealScalar& prec) const -{ - typename internal::nested_eval::type nested(derived()); - typename internal::nested_eval::type otherNested(other.derived()); - return numext::abs2(nested.dot(otherNested)) <= prec * prec * nested.squaredNorm() * otherNested.squaredNorm(); -} - -/** \returns true if *this is approximately an unitary matrix, - * within the precision given by \a prec. In the case where the \a Scalar - * type is real numbers, a unitary matrix is an orthogonal matrix, whence the name. - * - * \note This can be used to check whether a family of vectors forms an orthonormal basis. - * Indeed, \c m.isUnitary() returns true if and only if the columns (equivalently, the rows) of m form an - * orthonormal basis. - * - * Example: \include MatrixBase_isUnitary.cpp - * Output: \verbinclude MatrixBase_isUnitary.out - */ -template -bool MatrixBase::isUnitary(const RealScalar& prec) const -{ - typename internal::nested_eval::type self(derived()); - for(Index i = 0; i < cols(); ++i) - { - if(!internal::isApprox(self.col(i).squaredNorm(), static_cast(1), prec)) - return false; - for(Index j = 0; j < i; ++j) - if(!internal::isMuchSmallerThan(self.col(i).dot(self.col(j)), static_cast(1), prec)) - return false; - } - return true; -} - -} // end namespace Eigen - -#endif // EIGEN_DOT_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/EigenBase.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/EigenBase.h deleted file mode 100644 index b195506a..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/EigenBase.h +++ /dev/null @@ -1,159 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009 Benoit Jacob -// Copyright (C) 2009 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_EIGENBASE_H -#define EIGEN_EIGENBASE_H - -namespace Eigen { - -/** \class EigenBase - * \ingroup Core_Module - * - * Common base class for all classes T such that MatrixBase has an operator=(T) and a constructor MatrixBase(T). - * - * In other words, an EigenBase object is an object that can be copied into a MatrixBase. - * - * Besides MatrixBase-derived classes, this also includes special matrix classes such as diagonal matrices, etc. - * - * Notice that this class is trivial, it is only used to disambiguate overloaded functions. - * - * \sa \blank \ref TopicClassHierarchy - */ -template struct EigenBase -{ -// typedef typename internal::plain_matrix_type::type PlainObject; - - /** \brief The interface type of indices - * \details To change this, \c \#define the preprocessor symbol \c EIGEN_DEFAULT_DENSE_INDEX_TYPE. - * \deprecated Since Eigen 3.3, its usage is deprecated. Use Eigen::Index instead. - * \sa StorageIndex, \ref TopicPreprocessorDirectives. - */ - typedef Eigen::Index Index; - - // FIXME is it needed? - typedef typename internal::traits::StorageKind StorageKind; - - /** \returns a reference to the derived object */ - EIGEN_DEVICE_FUNC - Derived& derived() { return *static_cast(this); } - /** \returns a const reference to the derived object */ - EIGEN_DEVICE_FUNC - const Derived& derived() const { return *static_cast(this); } - - EIGEN_DEVICE_FUNC - inline Derived& const_cast_derived() const - { return *static_cast(const_cast(this)); } - EIGEN_DEVICE_FUNC - inline const Derived& const_derived() const - { return *static_cast(this); } - - /** \returns the number of rows. \sa cols(), RowsAtCompileTime */ - EIGEN_DEVICE_FUNC - inline Index rows() const { return derived().rows(); } - /** \returns the number of columns. \sa rows(), ColsAtCompileTime*/ - EIGEN_DEVICE_FUNC - inline Index cols() const { return derived().cols(); } - /** \returns the number of coefficients, which is rows()*cols(). - * \sa rows(), cols(), SizeAtCompileTime. */ - EIGEN_DEVICE_FUNC - inline Index size() const { return rows() * cols(); } - - /** \internal Don't use it, but do the equivalent: \code dst = *this; \endcode */ - template - EIGEN_DEVICE_FUNC - inline void evalTo(Dest& dst) const - { derived().evalTo(dst); } - - /** \internal Don't use it, but do the equivalent: \code dst += *this; \endcode */ - template - EIGEN_DEVICE_FUNC - inline void addTo(Dest& dst) const - { - // This is the default implementation, - // derived class can reimplement it in a more optimized way. - typename Dest::PlainObject res(rows(),cols()); - evalTo(res); - dst += res; - } - - /** \internal Don't use it, but do the equivalent: \code dst -= *this; \endcode */ - template - EIGEN_DEVICE_FUNC - inline void subTo(Dest& dst) const - { - // This is the default implementation, - // derived class can reimplement it in a more optimized way. - typename Dest::PlainObject res(rows(),cols()); - evalTo(res); - dst -= res; - } - - /** \internal Don't use it, but do the equivalent: \code dst.applyOnTheRight(*this); \endcode */ - template - EIGEN_DEVICE_FUNC inline void applyThisOnTheRight(Dest& dst) const - { - // This is the default implementation, - // derived class can reimplement it in a more optimized way. - dst = dst * this->derived(); - } - - /** \internal Don't use it, but do the equivalent: \code dst.applyOnTheLeft(*this); \endcode */ - template - EIGEN_DEVICE_FUNC inline void applyThisOnTheLeft(Dest& dst) const - { - // This is the default implementation, - // derived class can reimplement it in a more optimized way. - dst = this->derived() * dst; - } - -}; - -/*************************************************************************** -* Implementation of matrix base methods -***************************************************************************/ - -/** \brief Copies the generic expression \a other into *this. - * - * \details The expression must provide a (templated) evalTo(Derived& dst) const - * function which does the actual job. In practice, this allows any user to write - * its own special matrix without having to modify MatrixBase - * - * \returns a reference to *this. - */ -template -template -EIGEN_DEVICE_FUNC -Derived& DenseBase::operator=(const EigenBase &other) -{ - call_assignment(derived(), other.derived()); - return derived(); -} - -template -template -EIGEN_DEVICE_FUNC -Derived& DenseBase::operator+=(const EigenBase &other) -{ - call_assignment(derived(), other.derived(), internal::add_assign_op()); - return derived(); -} - -template -template -EIGEN_DEVICE_FUNC -Derived& DenseBase::operator-=(const EigenBase &other) -{ - call_assignment(derived(), other.derived(), internal::sub_assign_op()); - return derived(); -} - -} // end namespace Eigen - -#endif // EIGEN_EIGENBASE_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/ForceAlignedAccess.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/ForceAlignedAccess.h deleted file mode 100644 index 7b08b45e..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/ForceAlignedAccess.h +++ /dev/null @@ -1,146 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009-2010 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_FORCEALIGNEDACCESS_H -#define EIGEN_FORCEALIGNEDACCESS_H - -namespace Eigen { - -/** \class ForceAlignedAccess - * \ingroup Core_Module - * - * \brief Enforce aligned packet loads and stores regardless of what is requested - * - * \param ExpressionType the type of the object of which we are forcing aligned packet access - * - * This class is the return type of MatrixBase::forceAlignedAccess() - * and most of the time this is the only way it is used. - * - * \sa MatrixBase::forceAlignedAccess() - */ - -namespace internal { -template -struct traits > : public traits -{}; -} - -template class ForceAlignedAccess - : public internal::dense_xpr_base< ForceAlignedAccess >::type -{ - public: - - typedef typename internal::dense_xpr_base::type Base; - EIGEN_DENSE_PUBLIC_INTERFACE(ForceAlignedAccess) - - EIGEN_DEVICE_FUNC explicit inline ForceAlignedAccess(const ExpressionType& matrix) : m_expression(matrix) {} - - EIGEN_DEVICE_FUNC inline Index rows() const { return m_expression.rows(); } - EIGEN_DEVICE_FUNC inline Index cols() const { return m_expression.cols(); } - EIGEN_DEVICE_FUNC inline Index outerStride() const { return m_expression.outerStride(); } - EIGEN_DEVICE_FUNC inline Index innerStride() const { return m_expression.innerStride(); } - - EIGEN_DEVICE_FUNC inline const CoeffReturnType coeff(Index row, Index col) const - { - return m_expression.coeff(row, col); - } - - EIGEN_DEVICE_FUNC inline Scalar& coeffRef(Index row, Index col) - { - return m_expression.const_cast_derived().coeffRef(row, col); - } - - EIGEN_DEVICE_FUNC inline const CoeffReturnType coeff(Index index) const - { - return m_expression.coeff(index); - } - - EIGEN_DEVICE_FUNC inline Scalar& coeffRef(Index index) - { - return m_expression.const_cast_derived().coeffRef(index); - } - - template - inline const PacketScalar packet(Index row, Index col) const - { - return m_expression.template packet(row, col); - } - - template - inline void writePacket(Index row, Index col, const PacketScalar& x) - { - m_expression.const_cast_derived().template writePacket(row, col, x); - } - - template - inline const PacketScalar packet(Index index) const - { - return m_expression.template packet(index); - } - - template - inline void writePacket(Index index, const PacketScalar& x) - { - m_expression.const_cast_derived().template writePacket(index, x); - } - - EIGEN_DEVICE_FUNC operator const ExpressionType&() const { return m_expression; } - - protected: - const ExpressionType& m_expression; - - private: - ForceAlignedAccess& operator=(const ForceAlignedAccess&); -}; - -/** \returns an expression of *this with forced aligned access - * \sa forceAlignedAccessIf(),class ForceAlignedAccess - */ -template -inline const ForceAlignedAccess -MatrixBase::forceAlignedAccess() const -{ - return ForceAlignedAccess(derived()); -} - -/** \returns an expression of *this with forced aligned access - * \sa forceAlignedAccessIf(), class ForceAlignedAccess - */ -template -inline ForceAlignedAccess -MatrixBase::forceAlignedAccess() -{ - return ForceAlignedAccess(derived()); -} - -/** \returns an expression of *this with forced aligned access if \a Enable is true. - * \sa forceAlignedAccess(), class ForceAlignedAccess - */ -template -template -inline typename internal::add_const_on_value_type,Derived&>::type>::type -MatrixBase::forceAlignedAccessIf() const -{ - return derived(); // FIXME This should not work but apparently is never used -} - -/** \returns an expression of *this with forced aligned access if \a Enable is true. - * \sa forceAlignedAccess(), class ForceAlignedAccess - */ -template -template -inline typename internal::conditional,Derived&>::type -MatrixBase::forceAlignedAccessIf() -{ - return derived(); // FIXME This should not work but apparently is never used -} - -} // end namespace Eigen - -#endif // EIGEN_FORCEALIGNEDACCESS_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Fuzzy.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Fuzzy.h deleted file mode 100644 index 43aa49b2..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Fuzzy.h +++ /dev/null @@ -1,155 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2008 Benoit Jacob -// Copyright (C) 2008 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_FUZZY_H -#define EIGEN_FUZZY_H - -namespace Eigen { - -namespace internal -{ - -template::IsInteger> -struct isApprox_selector -{ - EIGEN_DEVICE_FUNC - static bool run(const Derived& x, const OtherDerived& y, const typename Derived::RealScalar& prec) - { - typename internal::nested_eval::type nested(x); - typename internal::nested_eval::type otherNested(y); - return (nested - otherNested).cwiseAbs2().sum() <= prec * prec * numext::mini(nested.cwiseAbs2().sum(), otherNested.cwiseAbs2().sum()); - } -}; - -template -struct isApprox_selector -{ - EIGEN_DEVICE_FUNC - static bool run(const Derived& x, const OtherDerived& y, const typename Derived::RealScalar&) - { - return x.matrix() == y.matrix(); - } -}; - -template::IsInteger> -struct isMuchSmallerThan_object_selector -{ - EIGEN_DEVICE_FUNC - static bool run(const Derived& x, const OtherDerived& y, const typename Derived::RealScalar& prec) - { - return x.cwiseAbs2().sum() <= numext::abs2(prec) * y.cwiseAbs2().sum(); - } -}; - -template -struct isMuchSmallerThan_object_selector -{ - EIGEN_DEVICE_FUNC - static bool run(const Derived& x, const OtherDerived&, const typename Derived::RealScalar&) - { - return x.matrix() == Derived::Zero(x.rows(), x.cols()).matrix(); - } -}; - -template::IsInteger> -struct isMuchSmallerThan_scalar_selector -{ - EIGEN_DEVICE_FUNC - static bool run(const Derived& x, const typename Derived::RealScalar& y, const typename Derived::RealScalar& prec) - { - return x.cwiseAbs2().sum() <= numext::abs2(prec * y); - } -}; - -template -struct isMuchSmallerThan_scalar_selector -{ - EIGEN_DEVICE_FUNC - static bool run(const Derived& x, const typename Derived::RealScalar&, const typename Derived::RealScalar&) - { - return x.matrix() == Derived::Zero(x.rows(), x.cols()).matrix(); - } -}; - -} // end namespace internal - - -/** \returns \c true if \c *this is approximately equal to \a other, within the precision - * determined by \a prec. - * - * \note The fuzzy compares are done multiplicatively. Two vectors \f$ v \f$ and \f$ w \f$ - * are considered to be approximately equal within precision \f$ p \f$ if - * \f[ \Vert v - w \Vert \leqslant p\,\min(\Vert v\Vert, \Vert w\Vert). \f] - * For matrices, the comparison is done using the Hilbert-Schmidt norm (aka Frobenius norm - * L2 norm). - * - * \note Because of the multiplicativeness of this comparison, one can't use this function - * to check whether \c *this is approximately equal to the zero matrix or vector. - * Indeed, \c isApprox(zero) returns false unless \c *this itself is exactly the zero matrix - * or vector. If you want to test whether \c *this is zero, use internal::isMuchSmallerThan(const - * RealScalar&, RealScalar) instead. - * - * \sa internal::isMuchSmallerThan(const RealScalar&, RealScalar) const - */ -template -template -EIGEN_DEVICE_FUNC bool DenseBase::isApprox( - const DenseBase& other, - const RealScalar& prec -) const -{ - return internal::isApprox_selector::run(derived(), other.derived(), prec); -} - -/** \returns \c true if the norm of \c *this is much smaller than \a other, - * within the precision determined by \a prec. - * - * \note The fuzzy compares are done multiplicatively. A vector \f$ v \f$ is - * considered to be much smaller than \f$ x \f$ within precision \f$ p \f$ if - * \f[ \Vert v \Vert \leqslant p\,\vert x\vert. \f] - * - * For matrices, the comparison is done using the Hilbert-Schmidt norm. For this reason, - * the value of the reference scalar \a other should come from the Hilbert-Schmidt norm - * of a reference matrix of same dimensions. - * - * \sa isApprox(), isMuchSmallerThan(const DenseBase&, RealScalar) const - */ -template -EIGEN_DEVICE_FUNC bool DenseBase::isMuchSmallerThan( - const typename NumTraits::Real& other, - const RealScalar& prec -) const -{ - return internal::isMuchSmallerThan_scalar_selector::run(derived(), other, prec); -} - -/** \returns \c true if the norm of \c *this is much smaller than the norm of \a other, - * within the precision determined by \a prec. - * - * \note The fuzzy compares are done multiplicatively. A vector \f$ v \f$ is - * considered to be much smaller than a vector \f$ w \f$ within precision \f$ p \f$ if - * \f[ \Vert v \Vert \leqslant p\,\Vert w\Vert. \f] - * For matrices, the comparison is done using the Hilbert-Schmidt norm. - * - * \sa isApprox(), isMuchSmallerThan(const RealScalar&, RealScalar) const - */ -template -template -EIGEN_DEVICE_FUNC bool DenseBase::isMuchSmallerThan( - const DenseBase& other, - const RealScalar& prec -) const -{ - return internal::isMuchSmallerThan_object_selector::run(derived(), other.derived(), prec); -} - -} // end namespace Eigen - -#endif // EIGEN_FUZZY_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/GeneralProduct.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/GeneralProduct.h deleted file mode 100644 index 694f7cbd..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/GeneralProduct.h +++ /dev/null @@ -1,466 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2008 Benoit Jacob -// Copyright (C) 2008-2011 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_GENERAL_PRODUCT_H -#define EIGEN_GENERAL_PRODUCT_H - -namespace Eigen { - -enum { - Large = 2, - Small = 3 -}; - -// Define the threshold value to fallback from the generic matrix-matrix product -// implementation (heavy) to the lightweight coeff-based product one. -// See generic_product_impl -// in products/GeneralMatrixMatrix.h for more details. -// TODO This threshold should also be used in the compile-time selector below. -#ifndef EIGEN_GEMM_TO_COEFFBASED_THRESHOLD -// This default value has been obtained on a Haswell architecture. -#define EIGEN_GEMM_TO_COEFFBASED_THRESHOLD 20 -#endif - -namespace internal { - -template struct product_type_selector; - -template struct product_size_category -{ - enum { - #ifndef EIGEN_CUDA_ARCH - is_large = MaxSize == Dynamic || - Size >= EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD || - (Size==Dynamic && MaxSize>=EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD), - #else - is_large = 0, - #endif - value = is_large ? Large - : Size == 1 ? 1 - : Small - }; -}; - -template struct product_type -{ - typedef typename remove_all::type _Lhs; - typedef typename remove_all::type _Rhs; - enum { - MaxRows = traits<_Lhs>::MaxRowsAtCompileTime, - Rows = traits<_Lhs>::RowsAtCompileTime, - MaxCols = traits<_Rhs>::MaxColsAtCompileTime, - Cols = traits<_Rhs>::ColsAtCompileTime, - MaxDepth = EIGEN_SIZE_MIN_PREFER_FIXED(traits<_Lhs>::MaxColsAtCompileTime, - traits<_Rhs>::MaxRowsAtCompileTime), - Depth = EIGEN_SIZE_MIN_PREFER_FIXED(traits<_Lhs>::ColsAtCompileTime, - traits<_Rhs>::RowsAtCompileTime) - }; - - // the splitting into different lines of code here, introducing the _select enums and the typedef below, - // is to work around an internal compiler error with gcc 4.1 and 4.2. -private: - enum { - rows_select = product_size_category::value, - cols_select = product_size_category::value, - depth_select = product_size_category::value - }; - typedef product_type_selector selector; - -public: - enum { - value = selector::ret, - ret = selector::ret - }; -#ifdef EIGEN_DEBUG_PRODUCT - static void debug() - { - EIGEN_DEBUG_VAR(Rows); - EIGEN_DEBUG_VAR(Cols); - EIGEN_DEBUG_VAR(Depth); - EIGEN_DEBUG_VAR(rows_select); - EIGEN_DEBUG_VAR(cols_select); - EIGEN_DEBUG_VAR(depth_select); - EIGEN_DEBUG_VAR(value); - } -#endif -}; - -/* The following allows to select the kind of product at compile time - * based on the three dimensions of the product. - * This is a compile time mapping from {1,Small,Large}^3 -> {product types} */ -// FIXME I'm not sure the current mapping is the ideal one. -template struct product_type_selector { enum { ret = OuterProduct }; }; -template struct product_type_selector { enum { ret = LazyCoeffBasedProductMode }; }; -template struct product_type_selector<1, N, 1> { enum { ret = LazyCoeffBasedProductMode }; }; -template struct product_type_selector<1, 1, Depth> { enum { ret = InnerProduct }; }; -template<> struct product_type_selector<1, 1, 1> { enum { ret = InnerProduct }; }; -template<> struct product_type_selector { enum { ret = CoeffBasedProductMode }; }; -template<> struct product_type_selector<1, Small,Small> { enum { ret = CoeffBasedProductMode }; }; -template<> struct product_type_selector { enum { ret = CoeffBasedProductMode }; }; -template<> struct product_type_selector { enum { ret = LazyCoeffBasedProductMode }; }; -template<> struct product_type_selector { enum { ret = LazyCoeffBasedProductMode }; }; -template<> struct product_type_selector { enum { ret = LazyCoeffBasedProductMode }; }; -template<> struct product_type_selector<1, Large,Small> { enum { ret = CoeffBasedProductMode }; }; -template<> struct product_type_selector<1, Large,Large> { enum { ret = GemvProduct }; }; -template<> struct product_type_selector<1, Small,Large> { enum { ret = CoeffBasedProductMode }; }; -template<> struct product_type_selector { enum { ret = CoeffBasedProductMode }; }; -template<> struct product_type_selector { enum { ret = GemvProduct }; }; -template<> struct product_type_selector { enum { ret = CoeffBasedProductMode }; }; -template<> struct product_type_selector { enum { ret = GemmProduct }; }; -template<> struct product_type_selector { enum { ret = GemmProduct }; }; -template<> struct product_type_selector { enum { ret = GemmProduct }; }; -template<> struct product_type_selector { enum { ret = GemmProduct }; }; -template<> struct product_type_selector { enum { ret = CoeffBasedProductMode }; }; -template<> struct product_type_selector { enum { ret = CoeffBasedProductMode }; }; -template<> struct product_type_selector { enum { ret = GemmProduct }; }; - -} // end namespace internal - -/*********************************************************************** -* Implementation of Inner Vector Vector Product -***********************************************************************/ - -// FIXME : maybe the "inner product" could return a Scalar -// instead of a 1x1 matrix ?? -// Pro: more natural for the user -// Cons: this could be a problem if in a meta unrolled algorithm a matrix-matrix -// product ends up to a row-vector times col-vector product... To tackle this use -// case, we could have a specialization for Block with: operator=(Scalar x); - -/*********************************************************************** -* Implementation of Outer Vector Vector Product -***********************************************************************/ - -/*********************************************************************** -* Implementation of General Matrix Vector Product -***********************************************************************/ - -/* According to the shape/flags of the matrix we have to distinghish 3 different cases: - * 1 - the matrix is col-major, BLAS compatible and M is large => call fast BLAS-like colmajor routine - * 2 - the matrix is row-major, BLAS compatible and N is large => call fast BLAS-like rowmajor routine - * 3 - all other cases are handled using a simple loop along the outer-storage direction. - * Therefore we need a lower level meta selector. - * Furthermore, if the matrix is the rhs, then the product has to be transposed. - */ -namespace internal { - -template -struct gemv_dense_selector; - -} // end namespace internal - -namespace internal { - -template struct gemv_static_vector_if; - -template -struct gemv_static_vector_if -{ - EIGEN_STRONG_INLINE Scalar* data() { eigen_internal_assert(false && "should never be called"); return 0; } -}; - -template -struct gemv_static_vector_if -{ - EIGEN_STRONG_INLINE Scalar* data() { return 0; } -}; - -template -struct gemv_static_vector_if -{ - enum { - ForceAlignment = internal::packet_traits::Vectorizable, - PacketSize = internal::packet_traits::size - }; - #if EIGEN_MAX_STATIC_ALIGN_BYTES!=0 - internal::plain_array m_data; - EIGEN_STRONG_INLINE Scalar* data() { return m_data.array; } - #else - // Some architectures cannot align on the stack, - // => let's manually enforce alignment by allocating more data and return the address of the first aligned element. - internal::plain_array m_data; - EIGEN_STRONG_INLINE Scalar* data() { - return ForceAlignment - ? reinterpret_cast((internal::UIntPtr(m_data.array) & ~(std::size_t(EIGEN_MAX_ALIGN_BYTES-1))) + EIGEN_MAX_ALIGN_BYTES) - : m_data.array; - } - #endif -}; - -// The vector is on the left => transposition -template -struct gemv_dense_selector -{ - template - static void run(const Lhs &lhs, const Rhs &rhs, Dest& dest, const typename Dest::Scalar& alpha) - { - Transpose destT(dest); - enum { OtherStorageOrder = StorageOrder == RowMajor ? ColMajor : RowMajor }; - gemv_dense_selector - ::run(rhs.transpose(), lhs.transpose(), destT, alpha); - } -}; - -template<> struct gemv_dense_selector -{ - template - static inline void run(const Lhs &lhs, const Rhs &rhs, Dest& dest, const typename Dest::Scalar& alpha) - { - typedef typename Lhs::Scalar LhsScalar; - typedef typename Rhs::Scalar RhsScalar; - typedef typename Dest::Scalar ResScalar; - typedef typename Dest::RealScalar RealScalar; - - typedef internal::blas_traits LhsBlasTraits; - typedef typename LhsBlasTraits::DirectLinearAccessType ActualLhsType; - typedef internal::blas_traits RhsBlasTraits; - typedef typename RhsBlasTraits::DirectLinearAccessType ActualRhsType; - - typedef Map, EIGEN_PLAIN_ENUM_MIN(AlignedMax,internal::packet_traits::size)> MappedDest; - - ActualLhsType actualLhs = LhsBlasTraits::extract(lhs); - ActualRhsType actualRhs = RhsBlasTraits::extract(rhs); - - ResScalar actualAlpha = alpha * LhsBlasTraits::extractScalarFactor(lhs) - * RhsBlasTraits::extractScalarFactor(rhs); - - // make sure Dest is a compile-time vector type (bug 1166) - typedef typename conditional::type ActualDest; - - enum { - // FIXME find a way to allow an inner stride on the result if packet_traits::size==1 - // on, the other hand it is good for the cache to pack the vector anyways... - EvalToDestAtCompileTime = (ActualDest::InnerStrideAtCompileTime==1), - ComplexByReal = (NumTraits::IsComplex) && (!NumTraits::IsComplex), - MightCannotUseDest = (!EvalToDestAtCompileTime) || ComplexByReal - }; - - typedef const_blas_data_mapper LhsMapper; - typedef const_blas_data_mapper RhsMapper; - RhsScalar compatibleAlpha = get_factor::run(actualAlpha); - - if(!MightCannotUseDest) - { - // shortcut if we are sure to be able to use dest directly, - // this ease the compiler to generate cleaner and more optimzized code for most common cases - general_matrix_vector_product - ::run( - actualLhs.rows(), actualLhs.cols(), - LhsMapper(actualLhs.data(), actualLhs.outerStride()), - RhsMapper(actualRhs.data(), actualRhs.innerStride()), - dest.data(), 1, - compatibleAlpha); - } - else - { - gemv_static_vector_if static_dest; - - const bool alphaIsCompatible = (!ComplexByReal) || (numext::imag(actualAlpha)==RealScalar(0)); - const bool evalToDest = EvalToDestAtCompileTime && alphaIsCompatible; - - ei_declare_aligned_stack_constructed_variable(ResScalar,actualDestPtr,dest.size(), - evalToDest ? dest.data() : static_dest.data()); - - if(!evalToDest) - { - #ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN - Index size = dest.size(); - EIGEN_DENSE_STORAGE_CTOR_PLUGIN - #endif - if(!alphaIsCompatible) - { - MappedDest(actualDestPtr, dest.size()).setZero(); - compatibleAlpha = RhsScalar(1); - } - else - MappedDest(actualDestPtr, dest.size()) = dest; - } - - general_matrix_vector_product - ::run( - actualLhs.rows(), actualLhs.cols(), - LhsMapper(actualLhs.data(), actualLhs.outerStride()), - RhsMapper(actualRhs.data(), actualRhs.innerStride()), - actualDestPtr, 1, - compatibleAlpha); - - if (!evalToDest) - { - if(!alphaIsCompatible) - dest.matrix() += actualAlpha * MappedDest(actualDestPtr, dest.size()); - else - dest = MappedDest(actualDestPtr, dest.size()); - } - } - } -}; - -template<> struct gemv_dense_selector -{ - template - static void run(const Lhs &lhs, const Rhs &rhs, Dest& dest, const typename Dest::Scalar& alpha) - { - typedef typename Lhs::Scalar LhsScalar; - typedef typename Rhs::Scalar RhsScalar; - typedef typename Dest::Scalar ResScalar; - - typedef internal::blas_traits LhsBlasTraits; - typedef typename LhsBlasTraits::DirectLinearAccessType ActualLhsType; - typedef internal::blas_traits RhsBlasTraits; - typedef typename RhsBlasTraits::DirectLinearAccessType ActualRhsType; - typedef typename internal::remove_all::type ActualRhsTypeCleaned; - - typename add_const::type actualLhs = LhsBlasTraits::extract(lhs); - typename add_const::type actualRhs = RhsBlasTraits::extract(rhs); - - ResScalar actualAlpha = alpha * LhsBlasTraits::extractScalarFactor(lhs) - * RhsBlasTraits::extractScalarFactor(rhs); - - enum { - // FIXME find a way to allow an inner stride on the result if packet_traits::size==1 - // on, the other hand it is good for the cache to pack the vector anyways... - DirectlyUseRhs = ActualRhsTypeCleaned::InnerStrideAtCompileTime==1 - }; - - gemv_static_vector_if static_rhs; - - ei_declare_aligned_stack_constructed_variable(RhsScalar,actualRhsPtr,actualRhs.size(), - DirectlyUseRhs ? const_cast(actualRhs.data()) : static_rhs.data()); - - if(!DirectlyUseRhs) - { - #ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN - Index size = actualRhs.size(); - EIGEN_DENSE_STORAGE_CTOR_PLUGIN - #endif - Map(actualRhsPtr, actualRhs.size()) = actualRhs; - } - - typedef const_blas_data_mapper LhsMapper; - typedef const_blas_data_mapper RhsMapper; - general_matrix_vector_product - ::run( - actualLhs.rows(), actualLhs.cols(), - LhsMapper(actualLhs.data(), actualLhs.outerStride()), - RhsMapper(actualRhsPtr, 1), - dest.data(), dest.col(0).innerStride(), //NOTE if dest is not a vector at compile-time, then dest.innerStride() might be wrong. (bug 1166) - actualAlpha); - } -}; - -template<> struct gemv_dense_selector -{ - template - static void run(const Lhs &lhs, const Rhs &rhs, Dest& dest, const typename Dest::Scalar& alpha) - { - EIGEN_STATIC_ASSERT((!nested_eval::Evaluate),EIGEN_INTERNAL_COMPILATION_ERROR_OR_YOU_MADE_A_PROGRAMMING_MISTAKE); - // TODO if rhs is large enough it might be beneficial to make sure that dest is sequentially stored in memory, otherwise use a temp - typename nested_eval::type actual_rhs(rhs); - const Index size = rhs.rows(); - for(Index k=0; k struct gemv_dense_selector -{ - template - static void run(const Lhs &lhs, const Rhs &rhs, Dest& dest, const typename Dest::Scalar& alpha) - { - EIGEN_STATIC_ASSERT((!nested_eval::Evaluate),EIGEN_INTERNAL_COMPILATION_ERROR_OR_YOU_MADE_A_PROGRAMMING_MISTAKE); - typename nested_eval::type actual_rhs(rhs); - const Index rows = dest.rows(); - for(Index i=0; i -template -EIGEN_DEVICE_FUNC -inline const Product -MatrixBase::operator*(const MatrixBase &other) const -{ - // A note regarding the function declaration: In MSVC, this function will sometimes - // not be inlined since DenseStorage is an unwindable object for dynamic - // matrices and product types are holding a member to store the result. - // Thus it does not help tagging this function with EIGEN_STRONG_INLINE. - enum { - ProductIsValid = Derived::ColsAtCompileTime==Dynamic - || OtherDerived::RowsAtCompileTime==Dynamic - || int(Derived::ColsAtCompileTime)==int(OtherDerived::RowsAtCompileTime), - AreVectors = Derived::IsVectorAtCompileTime && OtherDerived::IsVectorAtCompileTime, - SameSizes = EIGEN_PREDICATE_SAME_MATRIX_SIZE(Derived,OtherDerived) - }; - // note to the lost user: - // * for a dot product use: v1.dot(v2) - // * for a coeff-wise product use: v1.cwiseProduct(v2) - EIGEN_STATIC_ASSERT(ProductIsValid || !(AreVectors && SameSizes), - INVALID_VECTOR_VECTOR_PRODUCT__IF_YOU_WANTED_A_DOT_OR_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTIONS) - EIGEN_STATIC_ASSERT(ProductIsValid || !(SameSizes && !AreVectors), - INVALID_MATRIX_PRODUCT__IF_YOU_WANTED_A_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTION) - EIGEN_STATIC_ASSERT(ProductIsValid || SameSizes, INVALID_MATRIX_PRODUCT) -#ifdef EIGEN_DEBUG_PRODUCT - internal::product_type::debug(); -#endif - - return Product(derived(), other.derived()); -} - -/** \returns an expression of the matrix product of \c *this and \a other without implicit evaluation. - * - * The returned product will behave like any other expressions: the coefficients of the product will be - * computed once at a time as requested. This might be useful in some extremely rare cases when only - * a small and no coherent fraction of the result's coefficients have to be computed. - * - * \warning This version of the matrix product can be much much slower. So use it only if you know - * what you are doing and that you measured a true speed improvement. - * - * \sa operator*(const MatrixBase&) - */ -template -template -const Product -EIGEN_DEVICE_FUNC MatrixBase::lazyProduct(const MatrixBase &other) const -{ - enum { - ProductIsValid = Derived::ColsAtCompileTime==Dynamic - || OtherDerived::RowsAtCompileTime==Dynamic - || int(Derived::ColsAtCompileTime)==int(OtherDerived::RowsAtCompileTime), - AreVectors = Derived::IsVectorAtCompileTime && OtherDerived::IsVectorAtCompileTime, - SameSizes = EIGEN_PREDICATE_SAME_MATRIX_SIZE(Derived,OtherDerived) - }; - // note to the lost user: - // * for a dot product use: v1.dot(v2) - // * for a coeff-wise product use: v1.cwiseProduct(v2) - EIGEN_STATIC_ASSERT(ProductIsValid || !(AreVectors && SameSizes), - INVALID_VECTOR_VECTOR_PRODUCT__IF_YOU_WANTED_A_DOT_OR_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTIONS) - EIGEN_STATIC_ASSERT(ProductIsValid || !(SameSizes && !AreVectors), - INVALID_MATRIX_PRODUCT__IF_YOU_WANTED_A_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTION) - EIGEN_STATIC_ASSERT(ProductIsValid || SameSizes, INVALID_MATRIX_PRODUCT) - - return Product(derived(), other.derived()); -} - -} // end namespace Eigen - -#endif // EIGEN_PRODUCT_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/GenericPacketMath.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/GenericPacketMath.h deleted file mode 100644 index 30878eda..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/GenericPacketMath.h +++ /dev/null @@ -1,598 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// Copyright (C) 2006-2008 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_GENERIC_PACKET_MATH_H -#define EIGEN_GENERIC_PACKET_MATH_H - -namespace Eigen { - -namespace internal { - -/** \internal - * \file GenericPacketMath.h - * - * Default implementation for types not supported by the vectorization. - * In practice these functions are provided to make easier the writing - * of generic vectorized code. - */ - -#ifndef EIGEN_DEBUG_ALIGNED_LOAD -#define EIGEN_DEBUG_ALIGNED_LOAD -#endif - -#ifndef EIGEN_DEBUG_UNALIGNED_LOAD -#define EIGEN_DEBUG_UNALIGNED_LOAD -#endif - -#ifndef EIGEN_DEBUG_ALIGNED_STORE -#define EIGEN_DEBUG_ALIGNED_STORE -#endif - -#ifndef EIGEN_DEBUG_UNALIGNED_STORE -#define EIGEN_DEBUG_UNALIGNED_STORE -#endif - -struct default_packet_traits -{ - enum { - HasHalfPacket = 0, - - HasAdd = 1, - HasSub = 1, - HasMul = 1, - HasNegate = 1, - HasAbs = 1, - HasArg = 0, - HasAbs2 = 1, - HasMin = 1, - HasMax = 1, - HasConj = 1, - HasSetLinear = 1, - HasBlend = 0, - - HasDiv = 0, - HasSqrt = 0, - HasRsqrt = 0, - HasExp = 0, - HasExpm1 = 0, - HasLog = 0, - HasLog1p = 0, - HasLog10 = 0, - HasPow = 0, - - HasSin = 0, - HasCos = 0, - HasTan = 0, - HasASin = 0, - HasACos = 0, - HasATan = 0, - HasSinh = 0, - HasCosh = 0, - HasTanh = 0, - HasLGamma = 0, - HasDiGamma = 0, - HasZeta = 0, - HasPolygamma = 0, - HasErf = 0, - HasErfc = 0, - HasIGamma = 0, - HasIGammac = 0, - HasBetaInc = 0, - - HasRound = 0, - HasFloor = 0, - HasCeil = 0, - - HasSign = 0 - }; -}; - -template struct packet_traits : default_packet_traits -{ - typedef T type; - typedef T half; - enum { - Vectorizable = 0, - size = 1, - AlignedOnScalar = 0, - HasHalfPacket = 0 - }; - enum { - HasAdd = 0, - HasSub = 0, - HasMul = 0, - HasNegate = 0, - HasAbs = 0, - HasAbs2 = 0, - HasMin = 0, - HasMax = 0, - HasConj = 0, - HasSetLinear = 0 - }; -}; - -template struct packet_traits : packet_traits { }; - -template struct type_casting_traits { - enum { - VectorizedCast = 0, - SrcCoeffRatio = 1, - TgtCoeffRatio = 1 - }; -}; - - -/** \internal \returns static_cast(a) (coeff-wise) */ -template -EIGEN_DEVICE_FUNC inline TgtPacket -pcast(const SrcPacket& a) { - return static_cast(a); -} -template -EIGEN_DEVICE_FUNC inline TgtPacket -pcast(const SrcPacket& a, const SrcPacket& /*b*/) { - return static_cast(a); -} - -template -EIGEN_DEVICE_FUNC inline TgtPacket -pcast(const SrcPacket& a, const SrcPacket& /*b*/, const SrcPacket& /*c*/, const SrcPacket& /*d*/) { - return static_cast(a); -} - -/** \internal \returns a + b (coeff-wise) */ -template EIGEN_DEVICE_FUNC inline Packet -padd(const Packet& a, - const Packet& b) { return a+b; } - -/** \internal \returns a - b (coeff-wise) */ -template EIGEN_DEVICE_FUNC inline Packet -psub(const Packet& a, - const Packet& b) { return a-b; } - -/** \internal \returns -a (coeff-wise) */ -template EIGEN_DEVICE_FUNC inline Packet -pnegate(const Packet& a) { return -a; } - -/** \internal \returns conj(a) (coeff-wise) */ - -template EIGEN_DEVICE_FUNC inline Packet -pconj(const Packet& a) { return numext::conj(a); } - -/** \internal \returns a * b (coeff-wise) */ -template EIGEN_DEVICE_FUNC inline Packet -pmul(const Packet& a, - const Packet& b) { return a*b; } - -/** \internal \returns a / b (coeff-wise) */ -template EIGEN_DEVICE_FUNC inline Packet -pdiv(const Packet& a, - const Packet& b) { return a/b; } - -/** \internal \returns the min of \a a and \a b (coeff-wise) */ -template EIGEN_DEVICE_FUNC inline Packet -pmin(const Packet& a, - const Packet& b) { return numext::mini(a, b); } - -/** \internal \returns the max of \a a and \a b (coeff-wise) */ -template EIGEN_DEVICE_FUNC inline Packet -pmax(const Packet& a, - const Packet& b) { return numext::maxi(a, b); } - -/** \internal \returns the absolute value of \a a */ -template EIGEN_DEVICE_FUNC inline Packet -pabs(const Packet& a) { using std::abs; return abs(a); } - -/** \internal \returns the phase angle of \a a */ -template EIGEN_DEVICE_FUNC inline Packet -parg(const Packet& a) { using numext::arg; return arg(a); } - -/** \internal \returns the bitwise and of \a a and \a b */ -template EIGEN_DEVICE_FUNC inline Packet -pand(const Packet& a, const Packet& b) { return a & b; } - -/** \internal \returns the bitwise or of \a a and \a b */ -template EIGEN_DEVICE_FUNC inline Packet -por(const Packet& a, const Packet& b) { return a | b; } - -/** \internal \returns the bitwise xor of \a a and \a b */ -template EIGEN_DEVICE_FUNC inline Packet -pxor(const Packet& a, const Packet& b) { return a ^ b; } - -/** \internal \returns the bitwise andnot of \a a and \a b */ -template EIGEN_DEVICE_FUNC inline Packet -pandnot(const Packet& a, const Packet& b) { return a & (!b); } - -/** \internal \returns a packet version of \a *from, from must be 16 bytes aligned */ -template EIGEN_DEVICE_FUNC inline Packet -pload(const typename unpacket_traits::type* from) { return *from; } - -/** \internal \returns a packet version of \a *from, (un-aligned load) */ -template EIGEN_DEVICE_FUNC inline Packet -ploadu(const typename unpacket_traits::type* from) { return *from; } - -/** \internal \returns a packet with constant coefficients \a a, e.g.: (a,a,a,a) */ -template EIGEN_DEVICE_FUNC inline Packet -pset1(const typename unpacket_traits::type& a) { return a; } - -/** \internal \returns a packet with constant coefficients \a a[0], e.g.: (a[0],a[0],a[0],a[0]) */ -template EIGEN_DEVICE_FUNC inline Packet -pload1(const typename unpacket_traits::type *a) { return pset1(*a); } - -/** \internal \returns a packet with elements of \a *from duplicated. - * For instance, for a packet of 8 elements, 4 scalars will be read from \a *from and - * duplicated to form: {from[0],from[0],from[1],from[1],from[2],from[2],from[3],from[3]} - * Currently, this function is only used for scalar * complex products. - */ -template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet -ploaddup(const typename unpacket_traits::type* from) { return *from; } - -/** \internal \returns a packet with elements of \a *from quadrupled. - * For instance, for a packet of 8 elements, 2 scalars will be read from \a *from and - * replicated to form: {from[0],from[0],from[0],from[0],from[1],from[1],from[1],from[1]} - * Currently, this function is only used in matrix products. - * For packet-size smaller or equal to 4, this function is equivalent to pload1 - */ -template EIGEN_DEVICE_FUNC inline Packet -ploadquad(const typename unpacket_traits::type* from) -{ return pload1(from); } - -/** \internal equivalent to - * \code - * a0 = pload1(a+0); - * a1 = pload1(a+1); - * a2 = pload1(a+2); - * a3 = pload1(a+3); - * \endcode - * \sa pset1, pload1, ploaddup, pbroadcast2 - */ -template EIGEN_DEVICE_FUNC -inline void pbroadcast4(const typename unpacket_traits::type *a, - Packet& a0, Packet& a1, Packet& a2, Packet& a3) -{ - a0 = pload1(a+0); - a1 = pload1(a+1); - a2 = pload1(a+2); - a3 = pload1(a+3); -} - -/** \internal equivalent to - * \code - * a0 = pload1(a+0); - * a1 = pload1(a+1); - * \endcode - * \sa pset1, pload1, ploaddup, pbroadcast4 - */ -template EIGEN_DEVICE_FUNC -inline void pbroadcast2(const typename unpacket_traits::type *a, - Packet& a0, Packet& a1) -{ - a0 = pload1(a+0); - a1 = pload1(a+1); -} - -/** \internal \brief Returns a packet with coefficients (a,a+1,...,a+packet_size-1). */ -template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet -plset(const typename unpacket_traits::type& a) { return a; } - -/** \internal copy the packet \a from to \a *to, \a to must be 16 bytes aligned */ -template EIGEN_DEVICE_FUNC inline void pstore(Scalar* to, const Packet& from) -{ (*to) = from; } - -/** \internal copy the packet \a from to \a *to, (un-aligned store) */ -template EIGEN_DEVICE_FUNC inline void pstoreu(Scalar* to, const Packet& from) -{ (*to) = from; } - - template EIGEN_DEVICE_FUNC inline Packet pgather(const Scalar* from, Index /*stride*/) - { return ploadu(from); } - - template EIGEN_DEVICE_FUNC inline void pscatter(Scalar* to, const Packet& from, Index /*stride*/) - { pstore(to, from); } - -/** \internal tries to do cache prefetching of \a addr */ -template EIGEN_DEVICE_FUNC inline void prefetch(const Scalar* addr) -{ -#ifdef EIGEN_CUDA_ARCH -#if defined(__LP64__) - // 64-bit pointer operand constraint for inlined asm - asm(" prefetch.L1 [ %1 ];" : "=l"(addr) : "l"(addr)); -#else - // 32-bit pointer operand constraint for inlined asm - asm(" prefetch.L1 [ %1 ];" : "=r"(addr) : "r"(addr)); -#endif -#elif (!EIGEN_COMP_MSVC) && (EIGEN_COMP_GNUC || EIGEN_COMP_CLANG || EIGEN_COMP_ICC) - __builtin_prefetch(addr); -#endif -} - -/** \internal \returns the first element of a packet */ -template EIGEN_DEVICE_FUNC inline typename unpacket_traits::type pfirst(const Packet& a) -{ return a; } - -/** \internal \returns a packet where the element i contains the sum of the packet of \a vec[i] */ -template EIGEN_DEVICE_FUNC inline Packet -preduxp(const Packet* vecs) { return vecs[0]; } - -/** \internal \returns the sum of the elements of \a a*/ -template EIGEN_DEVICE_FUNC inline typename unpacket_traits::type predux(const Packet& a) -{ return a; } - -/** \internal \returns the sum of the elements of \a a by block of 4 elements. - * For a packet {a0, a1, a2, a3, a4, a5, a6, a7}, it returns a half packet {a0+a4, a1+a5, a2+a6, a3+a7} - * For packet-size smaller or equal to 4, this boils down to a noop. - */ -template EIGEN_DEVICE_FUNC inline -typename conditional<(unpacket_traits::size%8)==0,typename unpacket_traits::half,Packet>::type -predux_downto4(const Packet& a) -{ return a; } - -/** \internal \returns the product of the elements of \a a*/ -template EIGEN_DEVICE_FUNC inline typename unpacket_traits::type predux_mul(const Packet& a) -{ return a; } - -/** \internal \returns the min of the elements of \a a*/ -template EIGEN_DEVICE_FUNC inline typename unpacket_traits::type predux_min(const Packet& a) -{ return a; } - -/** \internal \returns the max of the elements of \a a*/ -template EIGEN_DEVICE_FUNC inline typename unpacket_traits::type predux_max(const Packet& a) -{ return a; } - -/** \internal \returns the reversed elements of \a a*/ -template EIGEN_DEVICE_FUNC inline Packet preverse(const Packet& a) -{ return a; } - -/** \internal \returns \a a with real and imaginary part flipped (for complex type only) */ -template EIGEN_DEVICE_FUNC inline Packet pcplxflip(const Packet& a) -{ - // FIXME: uncomment the following in case we drop the internal imag and real functions. -// using std::imag; -// using std::real; - return Packet(imag(a),real(a)); -} - -/************************** -* Special math functions -***************************/ - -/** \internal \returns the sine of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet psin(const Packet& a) { using std::sin; return sin(a); } - -/** \internal \returns the cosine of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet pcos(const Packet& a) { using std::cos; return cos(a); } - -/** \internal \returns the tan of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet ptan(const Packet& a) { using std::tan; return tan(a); } - -/** \internal \returns the arc sine of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet pasin(const Packet& a) { using std::asin; return asin(a); } - -/** \internal \returns the arc cosine of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet pacos(const Packet& a) { using std::acos; return acos(a); } - -/** \internal \returns the arc tangent of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet patan(const Packet& a) { using std::atan; return atan(a); } - -/** \internal \returns the hyperbolic sine of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet psinh(const Packet& a) { using std::sinh; return sinh(a); } - -/** \internal \returns the hyperbolic cosine of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet pcosh(const Packet& a) { using std::cosh; return cosh(a); } - -/** \internal \returns the hyperbolic tan of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet ptanh(const Packet& a) { using std::tanh; return tanh(a); } - -/** \internal \returns the exp of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet pexp(const Packet& a) { using std::exp; return exp(a); } - -/** \internal \returns the expm1 of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet pexpm1(const Packet& a) { return numext::expm1(a); } - -/** \internal \returns the log of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet plog(const Packet& a) { using std::log; return log(a); } - -/** \internal \returns the log1p of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet plog1p(const Packet& a) { return numext::log1p(a); } - -/** \internal \returns the log10 of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet plog10(const Packet& a) { using std::log10; return log10(a); } - -/** \internal \returns the square-root of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet psqrt(const Packet& a) { using std::sqrt; return sqrt(a); } - -/** \internal \returns the reciprocal square-root of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet prsqrt(const Packet& a) { - return pdiv(pset1(1), psqrt(a)); -} - -/** \internal \returns the rounded value of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet pround(const Packet& a) { using numext::round; return round(a); } - -/** \internal \returns the floor of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet pfloor(const Packet& a) { using numext::floor; return floor(a); } - -/** \internal \returns the ceil of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet pceil(const Packet& a) { using numext::ceil; return ceil(a); } - -/*************************************************************************** -* The following functions might not have to be overwritten for vectorized types -***************************************************************************/ - -/** \internal copy a packet with constant coeficient \a a (e.g., [a,a,a,a]) to \a *to. \a to must be 16 bytes aligned */ -// NOTE: this function must really be templated on the packet type (think about different packet types for the same scalar type) -template -inline void pstore1(typename unpacket_traits::type* to, const typename unpacket_traits::type& a) -{ - pstore(to, pset1(a)); -} - -/** \internal \returns a * b + c (coeff-wise) */ -template EIGEN_DEVICE_FUNC inline Packet -pmadd(const Packet& a, - const Packet& b, - const Packet& c) -{ return padd(pmul(a, b),c); } - -/** \internal \returns a packet version of \a *from. - * The pointer \a from must be aligned on a \a Alignment bytes boundary. */ -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet ploadt(const typename unpacket_traits::type* from) -{ - if(Alignment >= unpacket_traits::alignment) - return pload(from); - else - return ploadu(from); -} - -/** \internal copy the packet \a from to \a *to. - * The pointer \a from must be aligned on a \a Alignment bytes boundary. */ -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pstoret(Scalar* to, const Packet& from) -{ - if(Alignment >= unpacket_traits::alignment) - pstore(to, from); - else - pstoreu(to, from); -} - -/** \internal \returns a packet version of \a *from. - * Unlike ploadt, ploadt_ro takes advantage of the read-only memory path on the - * hardware if available to speedup the loading of data that won't be modified - * by the current computation. - */ -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet ploadt_ro(const typename unpacket_traits::type* from) -{ - return ploadt(from); -} - -/** \internal default implementation of palign() allowing partial specialization */ -template -struct palign_impl -{ - // by default data are aligned, so there is nothing to be done :) - static inline void run(PacketType&, const PacketType&) {} -}; - -/** \internal update \a first using the concatenation of the packet_size minus \a Offset last elements - * of \a first and \a Offset first elements of \a second. - * - * This function is currently only used to optimize matrix-vector products on unligned matrices. - * It takes 2 packets that represent a contiguous memory array, and returns a packet starting - * at the position \a Offset. For instance, for packets of 4 elements, we have: - * Input: - * - first = {f0,f1,f2,f3} - * - second = {s0,s1,s2,s3} - * Output: - * - if Offset==0 then {f0,f1,f2,f3} - * - if Offset==1 then {f1,f2,f3,s0} - * - if Offset==2 then {f2,f3,s0,s1} - * - if Offset==3 then {f3,s0,s1,s3} - */ -template -inline void palign(PacketType& first, const PacketType& second) -{ - palign_impl::run(first,second); -} - -/*************************************************************************** -* Fast complex products (GCC generates a function call which is very slow) -***************************************************************************/ - -// Eigen+CUDA does not support complexes. -#ifndef EIGEN_CUDACC - -template<> inline std::complex pmul(const std::complex& a, const std::complex& b) -{ return std::complex(real(a)*real(b) - imag(a)*imag(b), imag(a)*real(b) + real(a)*imag(b)); } - -template<> inline std::complex pmul(const std::complex& a, const std::complex& b) -{ return std::complex(real(a)*real(b) - imag(a)*imag(b), imag(a)*real(b) + real(a)*imag(b)); } - -#endif - - -/*************************************************************************** - * PacketBlock, that is a collection of N packets where the number of words - * in the packet is a multiple of N. -***************************************************************************/ -template ::size> struct PacketBlock { - Packet packet[N]; -}; - -template EIGEN_DEVICE_FUNC inline void -ptranspose(PacketBlock& /*kernel*/) { - // Nothing to do in the scalar case, i.e. a 1x1 matrix. -} - -/*************************************************************************** - * Selector, i.e. vector of N boolean values used to select (i.e. blend) - * words from 2 packets. -***************************************************************************/ -template struct Selector { - bool select[N]; -}; - -template EIGEN_DEVICE_FUNC inline Packet -pblend(const Selector::size>& ifPacket, const Packet& thenPacket, const Packet& elsePacket) { - return ifPacket.select[0] ? thenPacket : elsePacket; -} - -/** \internal \returns \a a with the first coefficient replaced by the scalar b */ -template EIGEN_DEVICE_FUNC inline Packet -pinsertfirst(const Packet& a, typename unpacket_traits::type b) -{ - // Default implementation based on pblend. - // It must be specialized for higher performance. - Selector::size> mask; - mask.select[0] = true; - // This for loop should be optimized away by the compiler. - for(Index i=1; i::size; ++i) - mask.select[i] = false; - return pblend(mask, pset1(b), a); -} - -/** \internal \returns \a a with the last coefficient replaced by the scalar b */ -template EIGEN_DEVICE_FUNC inline Packet -pinsertlast(const Packet& a, typename unpacket_traits::type b) -{ - // Default implementation based on pblend. - // It must be specialized for higher performance. - Selector::size> mask; - // This for loop should be optimized away by the compiler. - for(Index i=0; i::size-1; ++i) - mask.select[i] = false; - mask.select[unpacket_traits::size-1] = true; - return pblend(mask, pset1(b), a); -} - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_GENERIC_PACKET_MATH_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/GlobalFunctions.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/GlobalFunctions.h deleted file mode 100644 index 50406400..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/GlobalFunctions.h +++ /dev/null @@ -1,185 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2010-2016 Gael Guennebaud -// Copyright (C) 2010 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_GLOBAL_FUNCTIONS_H -#define EIGEN_GLOBAL_FUNCTIONS_H - -#ifdef EIGEN_PARSED_BY_DOXYGEN - -#define EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(NAME,FUNCTOR,DOC_OP,DOC_DETAILS) \ - /** \returns an expression of the coefficient-wise DOC_OP of \a x - - DOC_DETAILS - - \sa Math functions, class CwiseUnaryOp - */ \ - template \ - inline const Eigen::CwiseUnaryOp, const Derived> \ - NAME(const Eigen::ArrayBase& x); - -#else - -#define EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(NAME,FUNCTOR,DOC_OP,DOC_DETAILS) \ - template \ - inline const Eigen::CwiseUnaryOp, const Derived> \ - (NAME)(const Eigen::ArrayBase& x) { \ - return Eigen::CwiseUnaryOp, const Derived>(x.derived()); \ - } - -#endif // EIGEN_PARSED_BY_DOXYGEN - -#define EIGEN_ARRAY_DECLARE_GLOBAL_EIGEN_UNARY(NAME,FUNCTOR) \ - \ - template \ - struct NAME##_retval > \ - { \ - typedef const Eigen::CwiseUnaryOp, const Derived> type; \ - }; \ - template \ - struct NAME##_impl > \ - { \ - static inline typename NAME##_retval >::type run(const Eigen::ArrayBase& x) \ - { \ - return typename NAME##_retval >::type(x.derived()); \ - } \ - }; - -namespace Eigen -{ - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(real,scalar_real_op,real part,\sa ArrayBase::real) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(imag,scalar_imag_op,imaginary part,\sa ArrayBase::imag) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(conj,scalar_conjugate_op,complex conjugate,\sa ArrayBase::conjugate) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(inverse,scalar_inverse_op,inverse,\sa ArrayBase::inverse) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(sin,scalar_sin_op,sine,\sa ArrayBase::sin) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(cos,scalar_cos_op,cosine,\sa ArrayBase::cos) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(tan,scalar_tan_op,tangent,\sa ArrayBase::tan) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(atan,scalar_atan_op,arc-tangent,\sa ArrayBase::atan) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(asin,scalar_asin_op,arc-sine,\sa ArrayBase::asin) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(acos,scalar_acos_op,arc-consine,\sa ArrayBase::acos) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(sinh,scalar_sinh_op,hyperbolic sine,\sa ArrayBase::sinh) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(cosh,scalar_cosh_op,hyperbolic cosine,\sa ArrayBase::cosh) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(tanh,scalar_tanh_op,hyperbolic tangent,\sa ArrayBase::tanh) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(lgamma,scalar_lgamma_op,natural logarithm of the gamma function,\sa ArrayBase::lgamma) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(digamma,scalar_digamma_op,derivative of lgamma,\sa ArrayBase::digamma) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(erf,scalar_erf_op,error function,\sa ArrayBase::erf) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(erfc,scalar_erfc_op,complement error function,\sa ArrayBase::erfc) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(exp,scalar_exp_op,exponential,\sa ArrayBase::exp) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(expm1,scalar_expm1_op,exponential of a value minus 1,\sa ArrayBase::expm1) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(log,scalar_log_op,natural logarithm,\sa Eigen::log10 DOXCOMMA ArrayBase::log) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(log1p,scalar_log1p_op,natural logarithm of 1 plus the value,\sa ArrayBase::log1p) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(log10,scalar_log10_op,base 10 logarithm,\sa Eigen::log DOXCOMMA ArrayBase::log) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(abs,scalar_abs_op,absolute value,\sa ArrayBase::abs DOXCOMMA MatrixBase::cwiseAbs) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(abs2,scalar_abs2_op,squared absolute value,\sa ArrayBase::abs2 DOXCOMMA MatrixBase::cwiseAbs2) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(arg,scalar_arg_op,complex argument,\sa ArrayBase::arg) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(sqrt,scalar_sqrt_op,square root,\sa ArrayBase::sqrt DOXCOMMA MatrixBase::cwiseSqrt) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(rsqrt,scalar_rsqrt_op,reciprocal square root,\sa ArrayBase::rsqrt) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(square,scalar_square_op,square (power 2),\sa Eigen::abs2 DOXCOMMA Eigen::pow DOXCOMMA ArrayBase::square) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(cube,scalar_cube_op,cube (power 3),\sa Eigen::pow DOXCOMMA ArrayBase::cube) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(round,scalar_round_op,nearest integer,\sa Eigen::floor DOXCOMMA Eigen::ceil DOXCOMMA ArrayBase::round) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(floor,scalar_floor_op,nearest integer not greater than the giben value,\sa Eigen::ceil DOXCOMMA ArrayBase::floor) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(ceil,scalar_ceil_op,nearest integer not less than the giben value,\sa Eigen::floor DOXCOMMA ArrayBase::ceil) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(isnan,scalar_isnan_op,not-a-number test,\sa Eigen::isinf DOXCOMMA Eigen::isfinite DOXCOMMA ArrayBase::isnan) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(isinf,scalar_isinf_op,infinite value test,\sa Eigen::isnan DOXCOMMA Eigen::isfinite DOXCOMMA ArrayBase::isinf) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(isfinite,scalar_isfinite_op,finite value test,\sa Eigen::isinf DOXCOMMA Eigen::isnan DOXCOMMA ArrayBase::isfinite) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(sign,scalar_sign_op,sign (or 0),\sa ArrayBase::sign) - - /** \returns an expression of the coefficient-wise power of \a x to the given constant \a exponent. - * - * \tparam ScalarExponent is the scalar type of \a exponent. It must be compatible with the scalar type of the given expression (\c Derived::Scalar). - * - * \sa ArrayBase::pow() - * - * \relates ArrayBase - */ -#ifdef EIGEN_PARSED_BY_DOXYGEN - template - inline const CwiseBinaryOp,Derived,Constant > - pow(const Eigen::ArrayBase& x, const ScalarExponent& exponent); -#else - template - EIGEN_DEVICE_FUNC inline - EIGEN_MSVC10_WORKAROUND_BINARYOP_RETURN_TYPE( - const EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(Derived,typename internal::promote_scalar_arg::type,pow)) - pow(const Eigen::ArrayBase& x, const ScalarExponent& exponent) - { - typedef typename internal::promote_scalar_arg::type PromotedExponent; - return EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(Derived,PromotedExponent,pow)(x.derived(), - typename internal::plain_constant_type::type(x.derived().rows(), x.derived().cols(), internal::scalar_constant_op(exponent))); - } -#endif - - /** \returns an expression of the coefficient-wise power of \a x to the given array of \a exponents. - * - * This function computes the coefficient-wise power. - * - * Example: \include Cwise_array_power_array.cpp - * Output: \verbinclude Cwise_array_power_array.out - * - * \sa ArrayBase::pow() - * - * \relates ArrayBase - */ - template - inline const Eigen::CwiseBinaryOp, const Derived, const ExponentDerived> - pow(const Eigen::ArrayBase& x, const Eigen::ArrayBase& exponents) - { - return Eigen::CwiseBinaryOp, const Derived, const ExponentDerived>( - x.derived(), - exponents.derived() - ); - } - - /** \returns an expression of the coefficient-wise power of the scalar \a x to the given array of \a exponents. - * - * This function computes the coefficient-wise power between a scalar and an array of exponents. - * - * \tparam Scalar is the scalar type of \a x. It must be compatible with the scalar type of the given array expression (\c Derived::Scalar). - * - * Example: \include Cwise_scalar_power_array.cpp - * Output: \verbinclude Cwise_scalar_power_array.out - * - * \sa ArrayBase::pow() - * - * \relates ArrayBase - */ -#ifdef EIGEN_PARSED_BY_DOXYGEN - template - inline const CwiseBinaryOp,Constant,Derived> - pow(const Scalar& x,const Eigen::ArrayBase& x); -#else - template - EIGEN_DEVICE_FUNC inline - EIGEN_MSVC10_WORKAROUND_BINARYOP_RETURN_TYPE( - const EIGEN_SCALAR_BINARYOP_EXPR_RETURN_TYPE(typename internal::promote_scalar_arg::type,Derived,pow)) - pow(const Scalar& x, const Eigen::ArrayBase& exponents) { - typedef typename internal::promote_scalar_arg::type PromotedScalar; - return EIGEN_SCALAR_BINARYOP_EXPR_RETURN_TYPE(PromotedScalar,Derived,pow)( - typename internal::plain_constant_type::type(exponents.derived().rows(), exponents.derived().cols(), internal::scalar_constant_op(x)), exponents.derived()); - } -#endif - - - namespace internal - { - EIGEN_ARRAY_DECLARE_GLOBAL_EIGEN_UNARY(real,scalar_real_op) - EIGEN_ARRAY_DECLARE_GLOBAL_EIGEN_UNARY(imag,scalar_imag_op) - EIGEN_ARRAY_DECLARE_GLOBAL_EIGEN_UNARY(abs2,scalar_abs2_op) - } -} - -// TODO: cleanly disable those functions that are not supported on Array (numext::real_ref, internal::random, internal::isApprox...) - -#endif // EIGEN_GLOBAL_FUNCTIONS_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/IO.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/IO.h deleted file mode 100644 index da7fd6cc..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/IO.h +++ /dev/null @@ -1,225 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2008 Benoit Jacob -// Copyright (C) 2008 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_IO_H -#define EIGEN_IO_H - -namespace Eigen { - -enum { DontAlignCols = 1 }; -enum { StreamPrecision = -1, - FullPrecision = -2 }; - -namespace internal { -template -std::ostream & print_matrix(std::ostream & s, const Derived& _m, const IOFormat& fmt); -} - -/** \class IOFormat - * \ingroup Core_Module - * - * \brief Stores a set of parameters controlling the way matrices are printed - * - * List of available parameters: - * - \b precision number of digits for floating point values, or one of the special constants \c StreamPrecision and \c FullPrecision. - * The default is the special value \c StreamPrecision which means to use the - * stream's own precision setting, as set for instance using \c cout.precision(3). The other special value - * \c FullPrecision means that the number of digits will be computed to match the full precision of each floating-point - * type. - * - \b flags an OR-ed combination of flags, the default value is 0, the only currently available flag is \c DontAlignCols which - * allows to disable the alignment of columns, resulting in faster code. - * - \b coeffSeparator string printed between two coefficients of the same row - * - \b rowSeparator string printed between two rows - * - \b rowPrefix string printed at the beginning of each row - * - \b rowSuffix string printed at the end of each row - * - \b matPrefix string printed at the beginning of the matrix - * - \b matSuffix string printed at the end of the matrix - * - * Example: \include IOFormat.cpp - * Output: \verbinclude IOFormat.out - * - * \sa DenseBase::format(), class WithFormat - */ -struct IOFormat -{ - /** Default constructor, see class IOFormat for the meaning of the parameters */ - IOFormat(int _precision = StreamPrecision, int _flags = 0, - const std::string& _coeffSeparator = " ", - const std::string& _rowSeparator = "\n", const std::string& _rowPrefix="", const std::string& _rowSuffix="", - const std::string& _matPrefix="", const std::string& _matSuffix="") - : matPrefix(_matPrefix), matSuffix(_matSuffix), rowPrefix(_rowPrefix), rowSuffix(_rowSuffix), rowSeparator(_rowSeparator), - rowSpacer(""), coeffSeparator(_coeffSeparator), precision(_precision), flags(_flags) - { - // TODO check if rowPrefix, rowSuffix or rowSeparator contains a newline - // don't add rowSpacer if columns are not to be aligned - if((flags & DontAlignCols)) - return; - int i = int(matSuffix.length())-1; - while (i>=0 && matSuffix[i]!='\n') - { - rowSpacer += ' '; - i--; - } - } - std::string matPrefix, matSuffix; - std::string rowPrefix, rowSuffix, rowSeparator, rowSpacer; - std::string coeffSeparator; - int precision; - int flags; -}; - -/** \class WithFormat - * \ingroup Core_Module - * - * \brief Pseudo expression providing matrix output with given format - * - * \tparam ExpressionType the type of the object on which IO stream operations are performed - * - * This class represents an expression with stream operators controlled by a given IOFormat. - * It is the return type of DenseBase::format() - * and most of the time this is the only way it is used. - * - * See class IOFormat for some examples. - * - * \sa DenseBase::format(), class IOFormat - */ -template -class WithFormat -{ - public: - - WithFormat(const ExpressionType& matrix, const IOFormat& format) - : m_matrix(matrix), m_format(format) - {} - - friend std::ostream & operator << (std::ostream & s, const WithFormat& wf) - { - return internal::print_matrix(s, wf.m_matrix.eval(), wf.m_format); - } - - protected: - typename ExpressionType::Nested m_matrix; - IOFormat m_format; -}; - -namespace internal { - -// NOTE: This helper is kept for backward compatibility with previous code specializing -// this internal::significant_decimals_impl structure. In the future we should directly -// call digits10() which has been introduced in July 2016 in 3.3. -template -struct significant_decimals_impl -{ - static inline int run() - { - return NumTraits::digits10(); - } -}; - -/** \internal - * print the matrix \a _m to the output stream \a s using the output format \a fmt */ -template -std::ostream & print_matrix(std::ostream & s, const Derived& _m, const IOFormat& fmt) -{ - if(_m.size() == 0) - { - s << fmt.matPrefix << fmt.matSuffix; - return s; - } - - typename Derived::Nested m = _m; - typedef typename Derived::Scalar Scalar; - - Index width = 0; - - std::streamsize explicit_precision; - if(fmt.precision == StreamPrecision) - { - explicit_precision = 0; - } - else if(fmt.precision == FullPrecision) - { - if (NumTraits::IsInteger) - { - explicit_precision = 0; - } - else - { - explicit_precision = significant_decimals_impl::run(); - } - } - else - { - explicit_precision = fmt.precision; - } - - std::streamsize old_precision = 0; - if(explicit_precision) old_precision = s.precision(explicit_precision); - - bool align_cols = !(fmt.flags & DontAlignCols); - if(align_cols) - { - // compute the largest width - for(Index j = 0; j < m.cols(); ++j) - for(Index i = 0; i < m.rows(); ++i) - { - std::stringstream sstr; - sstr.copyfmt(s); - sstr << m.coeff(i,j); - width = std::max(width, Index(sstr.str().length())); - } - } - s << fmt.matPrefix; - for(Index i = 0; i < m.rows(); ++i) - { - if (i) - s << fmt.rowSpacer; - s << fmt.rowPrefix; - if(width) s.width(width); - s << m.coeff(i, 0); - for(Index j = 1; j < m.cols(); ++j) - { - s << fmt.coeffSeparator; - if (width) s.width(width); - s << m.coeff(i, j); - } - s << fmt.rowSuffix; - if( i < m.rows() - 1) - s << fmt.rowSeparator; - } - s << fmt.matSuffix; - if(explicit_precision) s.precision(old_precision); - return s; -} - -} // end namespace internal - -/** \relates DenseBase - * - * Outputs the matrix, to the given stream. - * - * If you wish to print the matrix with a format different than the default, use DenseBase::format(). - * - * It is also possible to change the default format by defining EIGEN_DEFAULT_IO_FORMAT before including Eigen headers. - * If not defined, this will automatically be defined to Eigen::IOFormat(), that is the Eigen::IOFormat with default parameters. - * - * \sa DenseBase::format() - */ -template -std::ostream & operator << -(std::ostream & s, - const DenseBase & m) -{ - return internal::print_matrix(s, m.eval(), EIGEN_DEFAULT_IO_FORMAT); -} - -} // end namespace Eigen - -#endif // EIGEN_IO_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/IndexedView.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/IndexedView.h deleted file mode 100644 index 8c57a277..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/IndexedView.h +++ /dev/null @@ -1,207 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2017 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_INDEXED_VIEW_H -#define EIGEN_INDEXED_VIEW_H - -namespace Eigen { - -namespace internal { - -template -struct traits > - : traits -{ - enum { - RowsAtCompileTime = int(array_size::value), - ColsAtCompileTime = int(array_size::value), - MaxRowsAtCompileTime = RowsAtCompileTime != Dynamic ? int(RowsAtCompileTime) : int(traits::MaxRowsAtCompileTime), - MaxColsAtCompileTime = ColsAtCompileTime != Dynamic ? int(ColsAtCompileTime) : int(traits::MaxColsAtCompileTime), - - XprTypeIsRowMajor = (int(traits::Flags)&RowMajorBit) != 0, - IsRowMajor = (MaxRowsAtCompileTime==1&&MaxColsAtCompileTime!=1) ? 1 - : (MaxColsAtCompileTime==1&&MaxRowsAtCompileTime!=1) ? 0 - : XprTypeIsRowMajor, - - RowIncr = int(get_compile_time_incr::value), - ColIncr = int(get_compile_time_incr::value), - InnerIncr = IsRowMajor ? ColIncr : RowIncr, - OuterIncr = IsRowMajor ? RowIncr : ColIncr, - - HasSameStorageOrderAsXprType = (IsRowMajor == XprTypeIsRowMajor), - XprInnerStride = HasSameStorageOrderAsXprType ? int(inner_stride_at_compile_time::ret) : int(outer_stride_at_compile_time::ret), - XprOuterstride = HasSameStorageOrderAsXprType ? int(outer_stride_at_compile_time::ret) : int(inner_stride_at_compile_time::ret), - - InnerSize = XprTypeIsRowMajor ? ColsAtCompileTime : RowsAtCompileTime, - IsBlockAlike = InnerIncr==1 && OuterIncr==1, - IsInnerPannel = HasSameStorageOrderAsXprType && is_same,typename conditional::type>::value, - - InnerStrideAtCompileTime = InnerIncr<0 || InnerIncr==DynamicIndex || XprInnerStride==Dynamic ? Dynamic : XprInnerStride * InnerIncr, - OuterStrideAtCompileTime = OuterIncr<0 || OuterIncr==DynamicIndex || XprOuterstride==Dynamic ? Dynamic : XprOuterstride * OuterIncr, - - ReturnAsScalar = is_same::value && is_same::value, - ReturnAsBlock = (!ReturnAsScalar) && IsBlockAlike, - ReturnAsIndexedView = (!ReturnAsScalar) && (!ReturnAsBlock), - - // FIXME we deal with compile-time strides if and only if we have DirectAccessBit flag, - // but this is too strict regarding negative strides... - DirectAccessMask = (int(InnerIncr)!=UndefinedIncr && int(OuterIncr)!=UndefinedIncr && InnerIncr>=0 && OuterIncr>=0) ? DirectAccessBit : 0, - FlagsRowMajorBit = IsRowMajor ? RowMajorBit : 0, - FlagsLvalueBit = is_lvalue::value ? LvalueBit : 0, - Flags = (traits::Flags & (HereditaryBits | DirectAccessMask)) | FlagsLvalueBit | FlagsRowMajorBit - }; - - typedef Block BlockType; -}; - -} - -template -class IndexedViewImpl; - - -/** \class IndexedView - * \ingroup Core_Module - * - * \brief Expression of a non-sequential sub-matrix defined by arbitrary sequences of row and column indices - * - * \tparam XprType the type of the expression in which we are taking the intersections of sub-rows and sub-columns - * \tparam RowIndices the type of the object defining the sequence of row indices - * \tparam ColIndices the type of the object defining the sequence of column indices - * - * This class represents an expression of a sub-matrix (or sub-vector) defined as the intersection - * of sub-sets of rows and columns, that are themself defined by generic sequences of row indices \f$ \{r_0,r_1,..r_{m-1}\} \f$ - * and column indices \f$ \{c_0,c_1,..c_{n-1} \}\f$. Let \f$ A \f$ be the nested matrix, then the resulting matrix \f$ B \f$ has \c m - * rows and \c n columns, and its entries are given by: \f$ B(i,j) = A(r_i,c_j) \f$. - * - * The \c RowIndices and \c ColIndices types must be compatible with the following API: - * \code - * operator[](Index) const; - * Index size() const; - * \endcode - * - * Typical supported types thus include: - * - std::vector - * - std::valarray - * - std::array - * - Plain C arrays: int[N] - * - Eigen::ArrayXi - * - decltype(ArrayXi::LinSpaced(...)) - * - Any view/expressions of the previous types - * - Eigen::ArithmeticSequence - * - Eigen::internal::AllRange (helper for Eigen::all) - * - Eigen::internal::SingleRange (helper for single index) - * - etc. - * - * In typical usages of %Eigen, this class should never be used directly. It is the return type of - * DenseBase::operator()(const RowIndices&, const ColIndices&). - * - * \sa class Block - */ -template -class IndexedView : public IndexedViewImpl::StorageKind> -{ -public: - typedef typename IndexedViewImpl::StorageKind>::Base Base; - EIGEN_GENERIC_PUBLIC_INTERFACE(IndexedView) - EIGEN_INHERIT_ASSIGNMENT_OPERATORS(IndexedView) - - typedef typename internal::ref_selector::non_const_type MatrixTypeNested; - typedef typename internal::remove_all::type NestedExpression; - - template - IndexedView(XprType& xpr, const T0& rowIndices, const T1& colIndices) - : m_xpr(xpr), m_rowIndices(rowIndices), m_colIndices(colIndices) - {} - - /** \returns number of rows */ - Index rows() const { return internal::size(m_rowIndices); } - - /** \returns number of columns */ - Index cols() const { return internal::size(m_colIndices); } - - /** \returns the nested expression */ - const typename internal::remove_all::type& - nestedExpression() const { return m_xpr; } - - /** \returns the nested expression */ - typename internal::remove_reference::type& - nestedExpression() { return m_xpr.const_cast_derived(); } - - /** \returns a const reference to the object storing/generating the row indices */ - const RowIndices& rowIndices() const { return m_rowIndices; } - - /** \returns a const reference to the object storing/generating the column indices */ - const ColIndices& colIndices() const { return m_colIndices; } - -protected: - MatrixTypeNested m_xpr; - RowIndices m_rowIndices; - ColIndices m_colIndices; -}; - - -// Generic API dispatcher -template -class IndexedViewImpl - : public internal::generic_xpr_base >::type -{ -public: - typedef typename internal::generic_xpr_base >::type Base; -}; - -namespace internal { - - -template -struct unary_evaluator, IndexBased> - : evaluator_base > -{ - typedef IndexedView XprType; - - enum { - CoeffReadCost = evaluator::CoeffReadCost /* TODO + cost of row/col index */, - - Flags = (evaluator::Flags & (HereditaryBits /*| LinearAccessBit | DirectAccessBit*/)), - - Alignment = 0 - }; - - EIGEN_DEVICE_FUNC explicit unary_evaluator(const XprType& xpr) : m_argImpl(xpr.nestedExpression()), m_xpr(xpr) - { - EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost); - } - - typedef typename XprType::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index row, Index col) const - { - return m_argImpl.coeff(m_xpr.rowIndices()[row], m_xpr.colIndices()[col]); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Scalar& coeffRef(Index row, Index col) - { - return m_argImpl.coeffRef(m_xpr.rowIndices()[row], m_xpr.colIndices()[col]); - } - -protected: - - evaluator m_argImpl; - const XprType& m_xpr; - -}; - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_INDEXED_VIEW_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Inverse.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Inverse.h deleted file mode 100644 index b76f0439..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Inverse.h +++ /dev/null @@ -1,118 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_INVERSE_H -#define EIGEN_INVERSE_H - -namespace Eigen { - -template class InverseImpl; - -namespace internal { - -template -struct traits > - : traits -{ - typedef typename XprType::PlainObject PlainObject; - typedef traits BaseTraits; - enum { - Flags = BaseTraits::Flags & RowMajorBit - }; -}; - -} // end namespace internal - -/** \class Inverse - * - * \brief Expression of the inverse of another expression - * - * \tparam XprType the type of the expression we are taking the inverse - * - * This class represents an abstract expression of A.inverse() - * and most of the time this is the only way it is used. - * - */ -template -class Inverse : public InverseImpl::StorageKind> -{ -public: - typedef typename XprType::StorageIndex StorageIndex; - typedef typename XprType::PlainObject PlainObject; - typedef typename XprType::Scalar Scalar; - typedef typename internal::ref_selector::type XprTypeNested; - typedef typename internal::remove_all::type XprTypeNestedCleaned; - typedef typename internal::ref_selector::type Nested; - typedef typename internal::remove_all::type NestedExpression; - - explicit EIGEN_DEVICE_FUNC Inverse(const XprType &xpr) - : m_xpr(xpr) - {} - - EIGEN_DEVICE_FUNC Index rows() const { return m_xpr.rows(); } - EIGEN_DEVICE_FUNC Index cols() const { return m_xpr.cols(); } - - EIGEN_DEVICE_FUNC const XprTypeNestedCleaned& nestedExpression() const { return m_xpr; } - -protected: - XprTypeNested m_xpr; -}; - -// Generic API dispatcher -template -class InverseImpl - : public internal::generic_xpr_base >::type -{ -public: - typedef typename internal::generic_xpr_base >::type Base; - typedef typename XprType::Scalar Scalar; -private: - - Scalar coeff(Index row, Index col) const; - Scalar coeff(Index i) const; -}; - -namespace internal { - -/** \internal - * \brief Default evaluator for Inverse expression. - * - * This default evaluator for Inverse expression simply evaluate the inverse into a temporary - * by a call to internal::call_assignment_no_alias. - * Therefore, inverse implementers only have to specialize Assignment, ...> for - * there own nested expression. - * - * \sa class Inverse - */ -template -struct unary_evaluator > - : public evaluator::PlainObject> -{ - typedef Inverse InverseType; - typedef typename InverseType::PlainObject PlainObject; - typedef evaluator Base; - - enum { Flags = Base::Flags | EvalBeforeNestingBit }; - - unary_evaluator(const InverseType& inv_xpr) - : m_result(inv_xpr.rows(), inv_xpr.cols()) - { - ::new (static_cast(this)) Base(m_result); - internal::call_assignment_no_alias(m_result, inv_xpr); - } - -protected: - PlainObject m_result; -}; - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_INVERSE_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Map.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Map.h deleted file mode 100644 index c437f1a9..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Map.h +++ /dev/null @@ -1,171 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2007-2010 Benoit Jacob -// Copyright (C) 2008 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_MAP_H -#define EIGEN_MAP_H - -namespace Eigen { - -namespace internal { -template -struct traits > - : public traits -{ - typedef traits TraitsBase; - enum { - PlainObjectTypeInnerSize = ((traits::Flags&RowMajorBit)==RowMajorBit) - ? PlainObjectType::ColsAtCompileTime - : PlainObjectType::RowsAtCompileTime, - - InnerStrideAtCompileTime = StrideType::InnerStrideAtCompileTime == 0 - ? int(PlainObjectType::InnerStrideAtCompileTime) - : int(StrideType::InnerStrideAtCompileTime), - OuterStrideAtCompileTime = StrideType::OuterStrideAtCompileTime == 0 - ? (InnerStrideAtCompileTime==Dynamic || PlainObjectTypeInnerSize==Dynamic - ? Dynamic - : int(InnerStrideAtCompileTime) * int(PlainObjectTypeInnerSize)) - : int(StrideType::OuterStrideAtCompileTime), - Alignment = int(MapOptions)&int(AlignedMask), - Flags0 = TraitsBase::Flags & (~NestByRefBit), - Flags = is_lvalue::value ? int(Flags0) : (int(Flags0) & ~LvalueBit) - }; -private: - enum { Options }; // Expressions don't have Options -}; -} - -/** \class Map - * \ingroup Core_Module - * - * \brief A matrix or vector expression mapping an existing array of data. - * - * \tparam PlainObjectType the equivalent matrix type of the mapped data - * \tparam MapOptions specifies the pointer alignment in bytes. It can be: \c #Aligned128, , \c #Aligned64, \c #Aligned32, \c #Aligned16, \c #Aligned8 or \c #Unaligned. - * The default is \c #Unaligned. - * \tparam StrideType optionally specifies strides. By default, Map assumes the memory layout - * of an ordinary, contiguous array. This can be overridden by specifying strides. - * The type passed here must be a specialization of the Stride template, see examples below. - * - * This class represents a matrix or vector expression mapping an existing array of data. - * It can be used to let Eigen interface without any overhead with non-Eigen data structures, - * such as plain C arrays or structures from other libraries. By default, it assumes that the - * data is laid out contiguously in memory. You can however override this by explicitly specifying - * inner and outer strides. - * - * Here's an example of simply mapping a contiguous array as a \ref TopicStorageOrders "column-major" matrix: - * \include Map_simple.cpp - * Output: \verbinclude Map_simple.out - * - * If you need to map non-contiguous arrays, you can do so by specifying strides: - * - * Here's an example of mapping an array as a vector, specifying an inner stride, that is, the pointer - * increment between two consecutive coefficients. Here, we're specifying the inner stride as a compile-time - * fixed value. - * \include Map_inner_stride.cpp - * Output: \verbinclude Map_inner_stride.out - * - * Here's an example of mapping an array while specifying an outer stride. Here, since we're mapping - * as a column-major matrix, 'outer stride' means the pointer increment between two consecutive columns. - * Here, we're specifying the outer stride as a runtime parameter. Note that here \c OuterStride<> is - * a short version of \c OuterStride because the default template parameter of OuterStride - * is \c Dynamic - * \include Map_outer_stride.cpp - * Output: \verbinclude Map_outer_stride.out - * - * For more details and for an example of specifying both an inner and an outer stride, see class Stride. - * - * \b Tip: to change the array of data mapped by a Map object, you can use the C++ - * placement new syntax: - * - * Example: \include Map_placement_new.cpp - * Output: \verbinclude Map_placement_new.out - * - * This class is the return type of PlainObjectBase::Map() but can also be used directly. - * - * \sa PlainObjectBase::Map(), \ref TopicStorageOrders - */ -template class Map - : public MapBase > -{ - public: - - typedef MapBase Base; - EIGEN_DENSE_PUBLIC_INTERFACE(Map) - - typedef typename Base::PointerType PointerType; - typedef PointerType PointerArgType; - EIGEN_DEVICE_FUNC - inline PointerType cast_to_pointer_type(PointerArgType ptr) { return ptr; } - - EIGEN_DEVICE_FUNC - inline Index innerStride() const - { - return StrideType::InnerStrideAtCompileTime != 0 ? m_stride.inner() : 1; - } - - EIGEN_DEVICE_FUNC - inline Index outerStride() const - { - return StrideType::OuterStrideAtCompileTime != 0 ? m_stride.outer() - : internal::traits::OuterStrideAtCompileTime != Dynamic ? Index(internal::traits::OuterStrideAtCompileTime) - : IsVectorAtCompileTime ? (this->size() * innerStride()) - : int(Flags)&RowMajorBit ? (this->cols() * innerStride()) - : (this->rows() * innerStride()); - } - - /** Constructor in the fixed-size case. - * - * \param dataPtr pointer to the array to map - * \param stride optional Stride object, passing the strides. - */ - EIGEN_DEVICE_FUNC - explicit inline Map(PointerArgType dataPtr, const StrideType& stride = StrideType()) - : Base(cast_to_pointer_type(dataPtr)), m_stride(stride) - { - PlainObjectType::Base::_check_template_params(); - } - - /** Constructor in the dynamic-size vector case. - * - * \param dataPtr pointer to the array to map - * \param size the size of the vector expression - * \param stride optional Stride object, passing the strides. - */ - EIGEN_DEVICE_FUNC - inline Map(PointerArgType dataPtr, Index size, const StrideType& stride = StrideType()) - : Base(cast_to_pointer_type(dataPtr), size), m_stride(stride) - { - PlainObjectType::Base::_check_template_params(); - } - - /** Constructor in the dynamic-size matrix case. - * - * \param dataPtr pointer to the array to map - * \param rows the number of rows of the matrix expression - * \param cols the number of columns of the matrix expression - * \param stride optional Stride object, passing the strides. - */ - EIGEN_DEVICE_FUNC - inline Map(PointerArgType dataPtr, Index rows, Index cols, const StrideType& stride = StrideType()) - : Base(cast_to_pointer_type(dataPtr), rows, cols), m_stride(stride) - { - PlainObjectType::Base::_check_template_params(); - } - - EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Map) - - protected: - StrideType m_stride; -}; - - -} // end namespace Eigen - -#endif // EIGEN_MAP_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/MapBase.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/MapBase.h deleted file mode 100644 index 020f939a..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/MapBase.h +++ /dev/null @@ -1,299 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2007-2010 Benoit Jacob -// Copyright (C) 2008 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_MAPBASE_H -#define EIGEN_MAPBASE_H - -#define EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived) \ - EIGEN_STATIC_ASSERT((int(internal::evaluator::Flags) & LinearAccessBit) || Derived::IsVectorAtCompileTime, \ - YOU_ARE_TRYING_TO_USE_AN_INDEX_BASED_ACCESSOR_ON_AN_EXPRESSION_THAT_DOES_NOT_SUPPORT_THAT) - -namespace Eigen { - -/** \ingroup Core_Module - * - * \brief Base class for dense Map and Block expression with direct access - * - * This base class provides the const low-level accessors (e.g. coeff, coeffRef) of dense - * Map and Block objects with direct access. - * Typical users do not have to directly deal with this class. - * - * This class can be extended by through the macro plugin \c EIGEN_MAPBASE_PLUGIN. - * See \link TopicCustomizing_Plugins customizing Eigen \endlink for details. - * - * The \c Derived class has to provide the following two methods describing the memory layout: - * \code Index innerStride() const; \endcode - * \code Index outerStride() const; \endcode - * - * \sa class Map, class Block - */ -template class MapBase - : public internal::dense_xpr_base::type -{ - public: - - typedef typename internal::dense_xpr_base::type Base; - enum { - RowsAtCompileTime = internal::traits::RowsAtCompileTime, - ColsAtCompileTime = internal::traits::ColsAtCompileTime, - SizeAtCompileTime = Base::SizeAtCompileTime - }; - - typedef typename internal::traits::StorageKind StorageKind; - typedef typename internal::traits::Scalar Scalar; - typedef typename internal::packet_traits::type PacketScalar; - typedef typename NumTraits::Real RealScalar; - typedef typename internal::conditional< - bool(internal::is_lvalue::value), - Scalar *, - const Scalar *>::type - PointerType; - - using Base::derived; -// using Base::RowsAtCompileTime; -// using Base::ColsAtCompileTime; -// using Base::SizeAtCompileTime; - using Base::MaxRowsAtCompileTime; - using Base::MaxColsAtCompileTime; - using Base::MaxSizeAtCompileTime; - using Base::IsVectorAtCompileTime; - using Base::Flags; - using Base::IsRowMajor; - - using Base::rows; - using Base::cols; - using Base::size; - using Base::coeff; - using Base::coeffRef; - using Base::lazyAssign; - using Base::eval; - - using Base::innerStride; - using Base::outerStride; - using Base::rowStride; - using Base::colStride; - - // bug 217 - compile error on ICC 11.1 - using Base::operator=; - - typedef typename Base::CoeffReturnType CoeffReturnType; - - /** \copydoc DenseBase::rows() */ - EIGEN_DEVICE_FUNC inline Index rows() const { return m_rows.value(); } - /** \copydoc DenseBase::cols() */ - EIGEN_DEVICE_FUNC inline Index cols() const { return m_cols.value(); } - - /** Returns a pointer to the first coefficient of the matrix or vector. - * - * \note When addressing this data, make sure to honor the strides returned by innerStride() and outerStride(). - * - * \sa innerStride(), outerStride() - */ - EIGEN_DEVICE_FUNC inline const Scalar* data() const { return m_data; } - - /** \copydoc PlainObjectBase::coeff(Index,Index) const */ - EIGEN_DEVICE_FUNC - inline const Scalar& coeff(Index rowId, Index colId) const - { - return m_data[colId * colStride() + rowId * rowStride()]; - } - - /** \copydoc PlainObjectBase::coeff(Index) const */ - EIGEN_DEVICE_FUNC - inline const Scalar& coeff(Index index) const - { - EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived) - return m_data[index * innerStride()]; - } - - /** \copydoc PlainObjectBase::coeffRef(Index,Index) const */ - EIGEN_DEVICE_FUNC - inline const Scalar& coeffRef(Index rowId, Index colId) const - { - return this->m_data[colId * colStride() + rowId * rowStride()]; - } - - /** \copydoc PlainObjectBase::coeffRef(Index) const */ - EIGEN_DEVICE_FUNC - inline const Scalar& coeffRef(Index index) const - { - EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived) - return this->m_data[index * innerStride()]; - } - - /** \internal */ - template - inline PacketScalar packet(Index rowId, Index colId) const - { - return internal::ploadt - (m_data + (colId * colStride() + rowId * rowStride())); - } - - /** \internal */ - template - inline PacketScalar packet(Index index) const - { - EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived) - return internal::ploadt(m_data + index * innerStride()); - } - - /** \internal Constructor for fixed size matrices or vectors */ - EIGEN_DEVICE_FUNC - explicit inline MapBase(PointerType dataPtr) : m_data(dataPtr), m_rows(RowsAtCompileTime), m_cols(ColsAtCompileTime) - { - EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived) - checkSanity(); - } - - /** \internal Constructor for dynamically sized vectors */ - EIGEN_DEVICE_FUNC - inline MapBase(PointerType dataPtr, Index vecSize) - : m_data(dataPtr), - m_rows(RowsAtCompileTime == Dynamic ? vecSize : Index(RowsAtCompileTime)), - m_cols(ColsAtCompileTime == Dynamic ? vecSize : Index(ColsAtCompileTime)) - { - EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) - eigen_assert(vecSize >= 0); - eigen_assert(dataPtr == 0 || SizeAtCompileTime == Dynamic || SizeAtCompileTime == vecSize); - checkSanity(); - } - - /** \internal Constructor for dynamically sized matrices */ - EIGEN_DEVICE_FUNC - inline MapBase(PointerType dataPtr, Index rows, Index cols) - : m_data(dataPtr), m_rows(rows), m_cols(cols) - { - eigen_assert( (dataPtr == 0) - || ( rows >= 0 && (RowsAtCompileTime == Dynamic || RowsAtCompileTime == rows) - && cols >= 0 && (ColsAtCompileTime == Dynamic || ColsAtCompileTime == cols))); - checkSanity(); - } - - #ifdef EIGEN_MAPBASE_PLUGIN - #include EIGEN_MAPBASE_PLUGIN - #endif - - protected: - - template - EIGEN_DEVICE_FUNC - void checkSanity(typename internal::enable_if<(internal::traits::Alignment>0),void*>::type = 0) const - { -#if EIGEN_MAX_ALIGN_BYTES>0 - eigen_assert(( ((internal::UIntPtr(m_data) % internal::traits::Alignment) == 0) - || (cols() * rows() * innerStride() * sizeof(Scalar)) < internal::traits::Alignment ) && "data is not aligned"); -#endif - } - - template - EIGEN_DEVICE_FUNC - void checkSanity(typename internal::enable_if::Alignment==0,void*>::type = 0) const - {} - - PointerType m_data; - const internal::variable_if_dynamic m_rows; - const internal::variable_if_dynamic m_cols; -}; - -/** \ingroup Core_Module - * - * \brief Base class for non-const dense Map and Block expression with direct access - * - * This base class provides the non-const low-level accessors (e.g. coeff and coeffRef) of - * dense Map and Block objects with direct access. - * It inherits MapBase which defines the const variant for reading specific entries. - * - * \sa class Map, class Block - */ -template class MapBase - : public MapBase -{ - typedef MapBase ReadOnlyMapBase; - public: - - typedef MapBase Base; - - typedef typename Base::Scalar Scalar; - typedef typename Base::PacketScalar PacketScalar; - typedef typename Base::StorageIndex StorageIndex; - typedef typename Base::PointerType PointerType; - - using Base::derived; - using Base::rows; - using Base::cols; - using Base::size; - using Base::coeff; - using Base::coeffRef; - - using Base::innerStride; - using Base::outerStride; - using Base::rowStride; - using Base::colStride; - - typedef typename internal::conditional< - internal::is_lvalue::value, - Scalar, - const Scalar - >::type ScalarWithConstIfNotLvalue; - - EIGEN_DEVICE_FUNC - inline const Scalar* data() const { return this->m_data; } - EIGEN_DEVICE_FUNC - inline ScalarWithConstIfNotLvalue* data() { return this->m_data; } // no const-cast here so non-const-correct code will give a compile error - - EIGEN_DEVICE_FUNC - inline ScalarWithConstIfNotLvalue& coeffRef(Index row, Index col) - { - return this->m_data[col * colStride() + row * rowStride()]; - } - - EIGEN_DEVICE_FUNC - inline ScalarWithConstIfNotLvalue& coeffRef(Index index) - { - EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived) - return this->m_data[index * innerStride()]; - } - - template - inline void writePacket(Index row, Index col, const PacketScalar& val) - { - internal::pstoret - (this->m_data + (col * colStride() + row * rowStride()), val); - } - - template - inline void writePacket(Index index, const PacketScalar& val) - { - EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived) - internal::pstoret - (this->m_data + index * innerStride(), val); - } - - EIGEN_DEVICE_FUNC explicit inline MapBase(PointerType dataPtr) : Base(dataPtr) {} - EIGEN_DEVICE_FUNC inline MapBase(PointerType dataPtr, Index vecSize) : Base(dataPtr, vecSize) {} - EIGEN_DEVICE_FUNC inline MapBase(PointerType dataPtr, Index rows, Index cols) : Base(dataPtr, rows, cols) {} - - EIGEN_DEVICE_FUNC - Derived& operator=(const MapBase& other) - { - ReadOnlyMapBase::Base::operator=(other); - return derived(); - } - - // In theory we could simply refer to Base:Base::operator=, but MSVC does not like Base::Base, - // see bugs 821 and 920. - using ReadOnlyMapBase::Base::operator=; -}; - -#undef EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS - -} // end namespace Eigen - -#endif // EIGEN_MAPBASE_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/MathFunctions.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/MathFunctions.h deleted file mode 100644 index 5ba5293a..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/MathFunctions.h +++ /dev/null @@ -1,1711 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2010 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_MATHFUNCTIONS_H -#define EIGEN_MATHFUNCTIONS_H - -// source: http://www.geom.uiuc.edu/~huberty/math5337/groupe/digits.html -// TODO this should better be moved to NumTraits -#define EIGEN_PI 3.141592653589793238462643383279502884197169399375105820974944592307816406L - -namespace Eigen { - -// On WINCE, std::abs is defined for int only, so let's defined our own overloads: -// This issue has been confirmed with MSVC 2008 only, but the issue might exist for more recent versions too. -#if EIGEN_OS_WINCE && EIGEN_COMP_MSVC && EIGEN_COMP_MSVC<=1500 -long abs(long x) { return (labs(x)); } -double abs(double x) { return (fabs(x)); } -float abs(float x) { return (fabsf(x)); } -long double abs(long double x) { return (fabsl(x)); } -#endif - -namespace internal { - -/** \internal \class global_math_functions_filtering_base - * - * What it does: - * Defines a typedef 'type' as follows: - * - if type T has a member typedef Eigen_BaseClassForSpecializationOfGlobalMathFuncImpl, then - * global_math_functions_filtering_base::type is a typedef for it. - * - otherwise, global_math_functions_filtering_base::type is a typedef for T. - * - * How it's used: - * To allow to defined the global math functions (like sin...) in certain cases, like the Array expressions. - * When you do sin(array1+array2), the object array1+array2 has a complicated expression type, all what you want to know - * is that it inherits ArrayBase. So we implement a partial specialization of sin_impl for ArrayBase. - * So we must make sure to use sin_impl > and not sin_impl, otherwise our partial specialization - * won't be used. How does sin know that? That's exactly what global_math_functions_filtering_base tells it. - * - * How it's implemented: - * SFINAE in the style of enable_if. Highly susceptible of breaking compilers. With GCC, it sure does work, but if you replace - * the typename dummy by an integer template parameter, it doesn't work anymore! - */ - -template -struct global_math_functions_filtering_base -{ - typedef T type; -}; - -template struct always_void { typedef void type; }; - -template -struct global_math_functions_filtering_base - ::type - > -{ - typedef typename T::Eigen_BaseClassForSpecializationOfGlobalMathFuncImpl type; -}; - -#define EIGEN_MATHFUNC_IMPL(func, scalar) Eigen::internal::func##_impl::type> -#define EIGEN_MATHFUNC_RETVAL(func, scalar) typename Eigen::internal::func##_retval::type>::type - -/**************************************************************************** -* Implementation of real * -****************************************************************************/ - -template::IsComplex> -struct real_default_impl -{ - typedef typename NumTraits::Real RealScalar; - EIGEN_DEVICE_FUNC - static inline RealScalar run(const Scalar& x) - { - return x; - } -}; - -template -struct real_default_impl -{ - typedef typename NumTraits::Real RealScalar; - EIGEN_DEVICE_FUNC - static inline RealScalar run(const Scalar& x) - { - using std::real; - return real(x); - } -}; - -template struct real_impl : real_default_impl {}; - -#ifdef EIGEN_CUDA_ARCH -template -struct real_impl > -{ - typedef T RealScalar; - EIGEN_DEVICE_FUNC - static inline T run(const std::complex& x) - { - return x.real(); - } -}; -#endif - -template -struct real_retval -{ - typedef typename NumTraits::Real type; -}; - -/**************************************************************************** -* Implementation of imag * -****************************************************************************/ - -template::IsComplex> -struct imag_default_impl -{ - typedef typename NumTraits::Real RealScalar; - EIGEN_DEVICE_FUNC - static inline RealScalar run(const Scalar&) - { - return RealScalar(0); - } -}; - -template -struct imag_default_impl -{ - typedef typename NumTraits::Real RealScalar; - EIGEN_DEVICE_FUNC - static inline RealScalar run(const Scalar& x) - { - using std::imag; - return imag(x); - } -}; - -template struct imag_impl : imag_default_impl {}; - -#ifdef EIGEN_CUDA_ARCH -template -struct imag_impl > -{ - typedef T RealScalar; - EIGEN_DEVICE_FUNC - static inline T run(const std::complex& x) - { - return x.imag(); - } -}; -#endif - -template -struct imag_retval -{ - typedef typename NumTraits::Real type; -}; - -/**************************************************************************** -* Implementation of real_ref * -****************************************************************************/ - -template -struct real_ref_impl -{ - typedef typename NumTraits::Real RealScalar; - EIGEN_DEVICE_FUNC - static inline RealScalar& run(Scalar& x) - { - return reinterpret_cast(&x)[0]; - } - EIGEN_DEVICE_FUNC - static inline const RealScalar& run(const Scalar& x) - { - return reinterpret_cast(&x)[0]; - } -}; - -template -struct real_ref_retval -{ - typedef typename NumTraits::Real & type; -}; - -/**************************************************************************** -* Implementation of imag_ref * -****************************************************************************/ - -template -struct imag_ref_default_impl -{ - typedef typename NumTraits::Real RealScalar; - EIGEN_DEVICE_FUNC - static inline RealScalar& run(Scalar& x) - { - return reinterpret_cast(&x)[1]; - } - EIGEN_DEVICE_FUNC - static inline const RealScalar& run(const Scalar& x) - { - return reinterpret_cast(&x)[1]; - } -}; - -template -struct imag_ref_default_impl -{ - EIGEN_DEVICE_FUNC - static inline Scalar run(Scalar&) - { - return Scalar(0); - } - EIGEN_DEVICE_FUNC - static inline const Scalar run(const Scalar&) - { - return Scalar(0); - } -}; - -template -struct imag_ref_impl : imag_ref_default_impl::IsComplex> {}; - -template -struct imag_ref_retval -{ - typedef typename NumTraits::Real & type; -}; - -/**************************************************************************** -* Implementation of conj * -****************************************************************************/ - -template::IsComplex> -struct conj_impl -{ - EIGEN_DEVICE_FUNC - static inline Scalar run(const Scalar& x) - { - return x; - } -}; - -template -struct conj_impl -{ - EIGEN_DEVICE_FUNC - static inline Scalar run(const Scalar& x) - { - using std::conj; - return conj(x); - } -}; - -template -struct conj_retval -{ - typedef Scalar type; -}; - -/**************************************************************************** -* Implementation of abs2 * -****************************************************************************/ - -template -struct abs2_impl_default -{ - typedef typename NumTraits::Real RealScalar; - EIGEN_DEVICE_FUNC - static inline RealScalar run(const Scalar& x) - { - return x*x; - } -}; - -template -struct abs2_impl_default // IsComplex -{ - typedef typename NumTraits::Real RealScalar; - EIGEN_DEVICE_FUNC - static inline RealScalar run(const Scalar& x) - { - return real(x)*real(x) + imag(x)*imag(x); - } -}; - -template -struct abs2_impl -{ - typedef typename NumTraits::Real RealScalar; - EIGEN_DEVICE_FUNC - static inline RealScalar run(const Scalar& x) - { - return abs2_impl_default::IsComplex>::run(x); - } -}; - -template -struct abs2_retval -{ - typedef typename NumTraits::Real type; -}; - -/**************************************************************************** -* Implementation of norm1 * -****************************************************************************/ - -template -struct norm1_default_impl -{ - typedef typename NumTraits::Real RealScalar; - EIGEN_DEVICE_FUNC - static inline RealScalar run(const Scalar& x) - { - EIGEN_USING_STD_MATH(abs); - return abs(real(x)) + abs(imag(x)); - } -}; - -template -struct norm1_default_impl -{ - EIGEN_DEVICE_FUNC - static inline Scalar run(const Scalar& x) - { - EIGEN_USING_STD_MATH(abs); - return abs(x); - } -}; - -template -struct norm1_impl : norm1_default_impl::IsComplex> {}; - -template -struct norm1_retval -{ - typedef typename NumTraits::Real type; -}; - -/**************************************************************************** -* Implementation of hypot * -****************************************************************************/ - -template -struct hypot_impl -{ - typedef typename NumTraits::Real RealScalar; - static inline RealScalar run(const Scalar& x, const Scalar& y) - { - EIGEN_USING_STD_MATH(abs); - EIGEN_USING_STD_MATH(sqrt); - RealScalar _x = abs(x); - RealScalar _y = abs(y); - Scalar p, qp; - if(_x>_y) - { - p = _x; - qp = _y / p; - } - else - { - p = _y; - qp = _x / p; - } - if(p==RealScalar(0)) return RealScalar(0); - return p * sqrt(RealScalar(1) + qp*qp); - } -}; - -template -struct hypot_retval -{ - typedef typename NumTraits::Real type; -}; - -/**************************************************************************** -* Implementation of cast * -****************************************************************************/ - -template -struct cast_impl -{ - EIGEN_DEVICE_FUNC - static inline NewType run(const OldType& x) - { - return static_cast(x); - } -}; - -// here, for once, we're plainly returning NewType: we don't want cast to do weird things. - -template -EIGEN_DEVICE_FUNC -inline NewType cast(const OldType& x) -{ - return cast_impl::run(x); -} - -/**************************************************************************** -* Implementation of round * -****************************************************************************/ - -#if EIGEN_HAS_CXX11_MATH - template - struct round_impl { - static inline Scalar run(const Scalar& x) - { - EIGEN_STATIC_ASSERT((!NumTraits::IsComplex), NUMERIC_TYPE_MUST_BE_REAL) - EIGEN_USING_STD_MATH(round); - return round(x); - } - }; -#else - template - struct round_impl - { - static inline Scalar run(const Scalar& x) - { - EIGEN_STATIC_ASSERT((!NumTraits::IsComplex), NUMERIC_TYPE_MUST_BE_REAL) - EIGEN_USING_STD_MATH(floor); - EIGEN_USING_STD_MATH(ceil); - return (x > Scalar(0)) ? floor(x + Scalar(0.5)) : ceil(x - Scalar(0.5)); - } - }; -#endif - -template -struct round_retval -{ - typedef Scalar type; -}; - -/**************************************************************************** -* Implementation of arg * -****************************************************************************/ - -#if EIGEN_HAS_CXX11_MATH - template - struct arg_impl { - static inline Scalar run(const Scalar& x) - { - EIGEN_USING_STD_MATH(arg); - return arg(x); - } - }; -#else - template::IsComplex> - struct arg_default_impl - { - typedef typename NumTraits::Real RealScalar; - EIGEN_DEVICE_FUNC - static inline RealScalar run(const Scalar& x) - { - return (x < Scalar(0)) ? Scalar(EIGEN_PI) : Scalar(0); } - }; - - template - struct arg_default_impl - { - typedef typename NumTraits::Real RealScalar; - EIGEN_DEVICE_FUNC - static inline RealScalar run(const Scalar& x) - { - EIGEN_USING_STD_MATH(arg); - return arg(x); - } - }; - - template struct arg_impl : arg_default_impl {}; -#endif - -template -struct arg_retval -{ - typedef typename NumTraits::Real type; -}; - -/**************************************************************************** -* Implementation of expm1 * -****************************************************************************/ - -// This implementation is based on GSL Math's expm1. -namespace std_fallback { - // fallback expm1 implementation in case there is no expm1(Scalar) function in namespace of Scalar, - // or that there is no suitable std::expm1 function available. Implementation - // attributed to Kahan. See: http://www.plunk.org/~hatch/rightway.php. - template - EIGEN_DEVICE_FUNC inline Scalar expm1(const Scalar& x) { - EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar) - typedef typename NumTraits::Real RealScalar; - - EIGEN_USING_STD_MATH(exp); - Scalar u = exp(x); - if (u == Scalar(1)) { - return x; - } - Scalar um1 = u - RealScalar(1); - if (um1 == Scalar(-1)) { - return RealScalar(-1); - } - - EIGEN_USING_STD_MATH(log); - return (u - RealScalar(1)) * x / log(u); - } -} - -template -struct expm1_impl { - EIGEN_DEVICE_FUNC static inline Scalar run(const Scalar& x) - { - EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar) - #if EIGEN_HAS_CXX11_MATH - using std::expm1; - #endif - using std_fallback::expm1; - return expm1(x); - } -}; - - -template -struct expm1_retval -{ - typedef Scalar type; -}; - -/**************************************************************************** -* Implementation of log1p * -****************************************************************************/ - -namespace std_fallback { - // fallback log1p implementation in case there is no log1p(Scalar) function in namespace of Scalar, - // or that there is no suitable std::log1p function available - template - EIGEN_DEVICE_FUNC inline Scalar log1p(const Scalar& x) { - EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar) - typedef typename NumTraits::Real RealScalar; - EIGEN_USING_STD_MATH(log); - Scalar x1p = RealScalar(1) + x; - return ( x1p == Scalar(1) ) ? x : x * ( log(x1p) / (x1p - RealScalar(1)) ); - } -} - -template -struct log1p_impl { - EIGEN_DEVICE_FUNC static inline Scalar run(const Scalar& x) - { - EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar) - #if EIGEN_HAS_CXX11_MATH - using std::log1p; - #endif - using std_fallback::log1p; - return log1p(x); - } -}; - - -template -struct log1p_retval -{ - typedef Scalar type; -}; - -/**************************************************************************** -* Implementation of pow * -****************************************************************************/ - -template::IsInteger&&NumTraits::IsInteger> -struct pow_impl -{ - //typedef Scalar retval; - typedef typename ScalarBinaryOpTraits >::ReturnType result_type; - static EIGEN_DEVICE_FUNC inline result_type run(const ScalarX& x, const ScalarY& y) - { - EIGEN_USING_STD_MATH(pow); - return pow(x, y); - } -}; - -template -struct pow_impl -{ - typedef ScalarX result_type; - static EIGEN_DEVICE_FUNC inline ScalarX run(ScalarX x, ScalarY y) - { - ScalarX res(1); - eigen_assert(!NumTraits::IsSigned || y >= 0); - if(y & 1) res *= x; - y >>= 1; - while(y) - { - x *= x; - if(y&1) res *= x; - y >>= 1; - } - return res; - } -}; - -/**************************************************************************** -* Implementation of random * -****************************************************************************/ - -template -struct random_default_impl {}; - -template -struct random_impl : random_default_impl::IsComplex, NumTraits::IsInteger> {}; - -template -struct random_retval -{ - typedef Scalar type; -}; - -template inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random(const Scalar& x, const Scalar& y); -template inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random(); - -template -struct random_default_impl -{ - static inline Scalar run(const Scalar& x, const Scalar& y) - { - return x + (y-x) * Scalar(std::rand()) / Scalar(RAND_MAX); - } - static inline Scalar run() - { - return run(Scalar(NumTraits::IsSigned ? -1 : 0), Scalar(1)); - } -}; - -enum { - meta_floor_log2_terminate, - meta_floor_log2_move_up, - meta_floor_log2_move_down, - meta_floor_log2_bogus -}; - -template struct meta_floor_log2_selector -{ - enum { middle = (lower + upper) / 2, - value = (upper <= lower + 1) ? int(meta_floor_log2_terminate) - : (n < (1 << middle)) ? int(meta_floor_log2_move_down) - : (n==0) ? int(meta_floor_log2_bogus) - : int(meta_floor_log2_move_up) - }; -}; - -template::value> -struct meta_floor_log2 {}; - -template -struct meta_floor_log2 -{ - enum { value = meta_floor_log2::middle>::value }; -}; - -template -struct meta_floor_log2 -{ - enum { value = meta_floor_log2::middle, upper>::value }; -}; - -template -struct meta_floor_log2 -{ - enum { value = (n >= ((unsigned int)(1) << (lower+1))) ? lower+1 : lower }; -}; - -template -struct meta_floor_log2 -{ - // no value, error at compile time -}; - -template -struct random_default_impl -{ - static inline Scalar run(const Scalar& x, const Scalar& y) - { - typedef typename conditional::IsSigned,std::ptrdiff_t,std::size_t>::type ScalarX; - if(y=x the result converted to an unsigned long is still correct. - std::size_t range = ScalarX(y)-ScalarX(x); - std::size_t offset = 0; - // rejection sampling - std::size_t divisor = 1; - std::size_t multiplier = 1; - if(range range); - return Scalar(ScalarX(x) + offset); - } - - static inline Scalar run() - { -#ifdef EIGEN_MAKING_DOCS - return run(Scalar(NumTraits::IsSigned ? -10 : 0), Scalar(10)); -#else - enum { rand_bits = meta_floor_log2<(unsigned int)(RAND_MAX)+1>::value, - scalar_bits = sizeof(Scalar) * CHAR_BIT, - shift = EIGEN_PLAIN_ENUM_MAX(0, int(rand_bits) - int(scalar_bits)), - offset = NumTraits::IsSigned ? (1 << (EIGEN_PLAIN_ENUM_MIN(rand_bits,scalar_bits)-1)) : 0 - }; - return Scalar((std::rand() >> shift) - offset); -#endif - } -}; - -template -struct random_default_impl -{ - static inline Scalar run(const Scalar& x, const Scalar& y) - { - return Scalar(random(real(x), real(y)), - random(imag(x), imag(y))); - } - static inline Scalar run() - { - typedef typename NumTraits::Real RealScalar; - return Scalar(random(), random()); - } -}; - -template -inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random(const Scalar& x, const Scalar& y) -{ - return EIGEN_MATHFUNC_IMPL(random, Scalar)::run(x, y); -} - -template -inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random() -{ - return EIGEN_MATHFUNC_IMPL(random, Scalar)::run(); -} - -// Implementatin of is* functions - -// std::is* do not work with fast-math and gcc, std::is* are available on MSVC 2013 and newer, as well as in clang. -#if (EIGEN_HAS_CXX11_MATH && !(EIGEN_COMP_GNUC_STRICT && __FINITE_MATH_ONLY__)) || (EIGEN_COMP_MSVC>=1800) || (EIGEN_COMP_CLANG) -#define EIGEN_USE_STD_FPCLASSIFY 1 -#else -#define EIGEN_USE_STD_FPCLASSIFY 0 -#endif - -template -EIGEN_DEVICE_FUNC -typename internal::enable_if::value,bool>::type -isnan_impl(const T&) { return false; } - -template -EIGEN_DEVICE_FUNC -typename internal::enable_if::value,bool>::type -isinf_impl(const T&) { return false; } - -template -EIGEN_DEVICE_FUNC -typename internal::enable_if::value,bool>::type -isfinite_impl(const T&) { return true; } - -template -EIGEN_DEVICE_FUNC -typename internal::enable_if<(!internal::is_integral::value)&&(!NumTraits::IsComplex),bool>::type -isfinite_impl(const T& x) -{ - #ifdef EIGEN_CUDA_ARCH - return (::isfinite)(x); - #elif EIGEN_USE_STD_FPCLASSIFY - using std::isfinite; - return isfinite EIGEN_NOT_A_MACRO (x); - #else - return x<=NumTraits::highest() && x>=NumTraits::lowest(); - #endif -} - -template -EIGEN_DEVICE_FUNC -typename internal::enable_if<(!internal::is_integral::value)&&(!NumTraits::IsComplex),bool>::type -isinf_impl(const T& x) -{ - #ifdef EIGEN_CUDA_ARCH - return (::isinf)(x); - #elif EIGEN_USE_STD_FPCLASSIFY - using std::isinf; - return isinf EIGEN_NOT_A_MACRO (x); - #else - return x>NumTraits::highest() || x::lowest(); - #endif -} - -template -EIGEN_DEVICE_FUNC -typename internal::enable_if<(!internal::is_integral::value)&&(!NumTraits::IsComplex),bool>::type -isnan_impl(const T& x) -{ - #ifdef EIGEN_CUDA_ARCH - return (::isnan)(x); - #elif EIGEN_USE_STD_FPCLASSIFY - using std::isnan; - return isnan EIGEN_NOT_A_MACRO (x); - #else - return x != x; - #endif -} - -#if (!EIGEN_USE_STD_FPCLASSIFY) - -#if EIGEN_COMP_MSVC - -template EIGEN_DEVICE_FUNC bool isinf_msvc_helper(T x) -{ - return _fpclass(x)==_FPCLASS_NINF || _fpclass(x)==_FPCLASS_PINF; -} - -//MSVC defines a _isnan builtin function, but for double only -EIGEN_DEVICE_FUNC inline bool isnan_impl(const long double& x) { return _isnan(x)!=0; } -EIGEN_DEVICE_FUNC inline bool isnan_impl(const double& x) { return _isnan(x)!=0; } -EIGEN_DEVICE_FUNC inline bool isnan_impl(const float& x) { return _isnan(x)!=0; } - -EIGEN_DEVICE_FUNC inline bool isinf_impl(const long double& x) { return isinf_msvc_helper(x); } -EIGEN_DEVICE_FUNC inline bool isinf_impl(const double& x) { return isinf_msvc_helper(x); } -EIGEN_DEVICE_FUNC inline bool isinf_impl(const float& x) { return isinf_msvc_helper(x); } - -#elif (defined __FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ && EIGEN_COMP_GNUC) - -#if EIGEN_GNUC_AT_LEAST(5,0) - #define EIGEN_TMP_NOOPT_ATTRIB EIGEN_DEVICE_FUNC inline __attribute__((optimize("no-finite-math-only"))) -#else - // NOTE the inline qualifier and noinline attribute are both needed: the former is to avoid linking issue (duplicate symbol), - // while the second prevent too aggressive optimizations in fast-math mode: - #define EIGEN_TMP_NOOPT_ATTRIB EIGEN_DEVICE_FUNC inline __attribute__((noinline,optimize("no-finite-math-only"))) -#endif - -template<> EIGEN_TMP_NOOPT_ATTRIB bool isnan_impl(const long double& x) { return __builtin_isnan(x); } -template<> EIGEN_TMP_NOOPT_ATTRIB bool isnan_impl(const double& x) { return __builtin_isnan(x); } -template<> EIGEN_TMP_NOOPT_ATTRIB bool isnan_impl(const float& x) { return __builtin_isnan(x); } -template<> EIGEN_TMP_NOOPT_ATTRIB bool isinf_impl(const double& x) { return __builtin_isinf(x); } -template<> EIGEN_TMP_NOOPT_ATTRIB bool isinf_impl(const float& x) { return __builtin_isinf(x); } -template<> EIGEN_TMP_NOOPT_ATTRIB bool isinf_impl(const long double& x) { return __builtin_isinf(x); } - -#undef EIGEN_TMP_NOOPT_ATTRIB - -#endif - -#endif - -// The following overload are defined at the end of this file -template EIGEN_DEVICE_FUNC bool isfinite_impl(const std::complex& x); -template EIGEN_DEVICE_FUNC bool isnan_impl(const std::complex& x); -template EIGEN_DEVICE_FUNC bool isinf_impl(const std::complex& x); - -template T generic_fast_tanh_float(const T& a_x); - -} // end namespace internal - -/**************************************************************************** -* Generic math functions * -****************************************************************************/ - -namespace numext { - -#if !defined(EIGEN_CUDA_ARCH) && !defined(__SYCL_DEVICE_ONLY__) -template -EIGEN_DEVICE_FUNC -EIGEN_ALWAYS_INLINE T mini(const T& x, const T& y) -{ - EIGEN_USING_STD_MATH(min); - return min EIGEN_NOT_A_MACRO (x,y); -} - -template -EIGEN_DEVICE_FUNC -EIGEN_ALWAYS_INLINE T maxi(const T& x, const T& y) -{ - EIGEN_USING_STD_MATH(max); - return max EIGEN_NOT_A_MACRO (x,y); -} - - -#elif defined(__SYCL_DEVICE_ONLY__) -template -EIGEN_ALWAYS_INLINE T mini(const T& x, const T& y) -{ - - return y < x ? y : x; -} - -template -EIGEN_ALWAYS_INLINE T maxi(const T& x, const T& y) -{ - - return x < y ? y : x; -} - -EIGEN_ALWAYS_INLINE int mini(const int& x, const int& y) -{ - return cl::sycl::min(x,y); -} - -EIGEN_ALWAYS_INLINE int maxi(const int& x, const int& y) -{ - return cl::sycl::max(x,y); -} - -EIGEN_ALWAYS_INLINE unsigned int mini(const unsigned int& x, const unsigned int& y) -{ - return cl::sycl::min(x,y); -} - -EIGEN_ALWAYS_INLINE unsigned int maxi(const unsigned int& x, const unsigned int& y) -{ - return cl::sycl::max(x,y); -} - -EIGEN_ALWAYS_INLINE long mini(const long & x, const long & y) -{ - return cl::sycl::min(x,y); -} - -EIGEN_ALWAYS_INLINE long maxi(const long & x, const long & y) -{ - return cl::sycl::max(x,y); -} - -EIGEN_ALWAYS_INLINE unsigned long mini(const unsigned long& x, const unsigned long& y) -{ - return cl::sycl::min(x,y); -} - -EIGEN_ALWAYS_INLINE unsigned long maxi(const unsigned long& x, const unsigned long& y) -{ - return cl::sycl::max(x,y); -} - - -EIGEN_ALWAYS_INLINE float mini(const float& x, const float& y) -{ - return cl::sycl::fmin(x,y); -} - -EIGEN_ALWAYS_INLINE float maxi(const float& x, const float& y) -{ - return cl::sycl::fmax(x,y); -} - -EIGEN_ALWAYS_INLINE double mini(const double& x, const double& y) -{ - return cl::sycl::fmin(x,y); -} - -EIGEN_ALWAYS_INLINE double maxi(const double& x, const double& y) -{ - return cl::sycl::fmax(x,y); -} - -#else -template -EIGEN_DEVICE_FUNC -EIGEN_ALWAYS_INLINE T mini(const T& x, const T& y) -{ - return y < x ? y : x; -} -template<> -EIGEN_DEVICE_FUNC -EIGEN_ALWAYS_INLINE float mini(const float& x, const float& y) -{ - return fminf(x, y); -} -template -EIGEN_DEVICE_FUNC -EIGEN_ALWAYS_INLINE T maxi(const T& x, const T& y) -{ - return x < y ? y : x; -} -template<> -EIGEN_DEVICE_FUNC -EIGEN_ALWAYS_INLINE float maxi(const float& x, const float& y) -{ - return fmaxf(x, y); -} -#endif - - -template -EIGEN_DEVICE_FUNC -inline EIGEN_MATHFUNC_RETVAL(real, Scalar) real(const Scalar& x) -{ - return EIGEN_MATHFUNC_IMPL(real, Scalar)::run(x); -} - -template -EIGEN_DEVICE_FUNC -inline typename internal::add_const_on_value_type< EIGEN_MATHFUNC_RETVAL(real_ref, Scalar) >::type real_ref(const Scalar& x) -{ - return internal::real_ref_impl::run(x); -} - -template -EIGEN_DEVICE_FUNC -inline EIGEN_MATHFUNC_RETVAL(real_ref, Scalar) real_ref(Scalar& x) -{ - return EIGEN_MATHFUNC_IMPL(real_ref, Scalar)::run(x); -} - -template -EIGEN_DEVICE_FUNC -inline EIGEN_MATHFUNC_RETVAL(imag, Scalar) imag(const Scalar& x) -{ - return EIGEN_MATHFUNC_IMPL(imag, Scalar)::run(x); -} - -template -EIGEN_DEVICE_FUNC -inline EIGEN_MATHFUNC_RETVAL(arg, Scalar) arg(const Scalar& x) -{ - return EIGEN_MATHFUNC_IMPL(arg, Scalar)::run(x); -} - -template -EIGEN_DEVICE_FUNC -inline typename internal::add_const_on_value_type< EIGEN_MATHFUNC_RETVAL(imag_ref, Scalar) >::type imag_ref(const Scalar& x) -{ - return internal::imag_ref_impl::run(x); -} - -template -EIGEN_DEVICE_FUNC -inline EIGEN_MATHFUNC_RETVAL(imag_ref, Scalar) imag_ref(Scalar& x) -{ - return EIGEN_MATHFUNC_IMPL(imag_ref, Scalar)::run(x); -} - -template -EIGEN_DEVICE_FUNC -inline EIGEN_MATHFUNC_RETVAL(conj, Scalar) conj(const Scalar& x) -{ - return EIGEN_MATHFUNC_IMPL(conj, Scalar)::run(x); -} - -template -EIGEN_DEVICE_FUNC -inline EIGEN_MATHFUNC_RETVAL(abs2, Scalar) abs2(const Scalar& x) -{ - return EIGEN_MATHFUNC_IMPL(abs2, Scalar)::run(x); -} - -EIGEN_DEVICE_FUNC -inline bool abs2(bool x) { return x; } - -template -EIGEN_DEVICE_FUNC -inline EIGEN_MATHFUNC_RETVAL(norm1, Scalar) norm1(const Scalar& x) -{ - return EIGEN_MATHFUNC_IMPL(norm1, Scalar)::run(x); -} - -template -EIGEN_DEVICE_FUNC -inline EIGEN_MATHFUNC_RETVAL(hypot, Scalar) hypot(const Scalar& x, const Scalar& y) -{ - return EIGEN_MATHFUNC_IMPL(hypot, Scalar)::run(x, y); -} - -template -EIGEN_DEVICE_FUNC -inline EIGEN_MATHFUNC_RETVAL(log1p, Scalar) log1p(const Scalar& x) -{ - return EIGEN_MATHFUNC_IMPL(log1p, Scalar)::run(x); -} - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float log1p(float x) { return cl::sycl::log1p(x); } -EIGEN_ALWAYS_INLINE double log1p(double x) { return cl::sycl::log1p(x); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -#ifdef EIGEN_CUDACC -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float log1p(const float &x) { return ::log1pf(x); } - -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -double log1p(const double &x) { return ::log1p(x); } -#endif - -template -EIGEN_DEVICE_FUNC -inline typename internal::pow_impl::result_type pow(const ScalarX& x, const ScalarY& y) -{ - return internal::pow_impl::run(x, y); -} - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float pow(float x, float y) { return cl::sycl::pow(x, y); } -EIGEN_ALWAYS_INLINE double pow(double x, double y) { return cl::sycl::pow(x, y); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -template EIGEN_DEVICE_FUNC bool (isnan) (const T &x) { return internal::isnan_impl(x); } -template EIGEN_DEVICE_FUNC bool (isinf) (const T &x) { return internal::isinf_impl(x); } -template EIGEN_DEVICE_FUNC bool (isfinite)(const T &x) { return internal::isfinite_impl(x); } - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float isnan(float x) { return cl::sycl::isnan(x); } -EIGEN_ALWAYS_INLINE double isnan(double x) { return cl::sycl::isnan(x); } -EIGEN_ALWAYS_INLINE float isinf(float x) { return cl::sycl::isinf(x); } -EIGEN_ALWAYS_INLINE double isinf(double x) { return cl::sycl::isinf(x); } -EIGEN_ALWAYS_INLINE float isfinite(float x) { return cl::sycl::isfinite(x); } -EIGEN_ALWAYS_INLINE double isfinite(double x) { return cl::sycl::isfinite(x); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -template -EIGEN_DEVICE_FUNC -inline EIGEN_MATHFUNC_RETVAL(round, Scalar) round(const Scalar& x) -{ - return EIGEN_MATHFUNC_IMPL(round, Scalar)::run(x); -} - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float round(float x) { return cl::sycl::round(x); } -EIGEN_ALWAYS_INLINE double round(double x) { return cl::sycl::round(x); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -template -EIGEN_DEVICE_FUNC -T (floor)(const T& x) -{ - EIGEN_USING_STD_MATH(floor); - return floor(x); -} - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float floor(float x) { return cl::sycl::floor(x); } -EIGEN_ALWAYS_INLINE double floor(double x) { return cl::sycl::floor(x); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -#ifdef EIGEN_CUDACC -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float floor(const float &x) { return ::floorf(x); } - -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -double floor(const double &x) { return ::floor(x); } -#endif - -template -EIGEN_DEVICE_FUNC -T (ceil)(const T& x) -{ - EIGEN_USING_STD_MATH(ceil); - return ceil(x); -} - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float ceil(float x) { return cl::sycl::ceil(x); } -EIGEN_ALWAYS_INLINE double ceil(double x) { return cl::sycl::ceil(x); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -#ifdef EIGEN_CUDACC -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float ceil(const float &x) { return ::ceilf(x); } - -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -double ceil(const double &x) { return ::ceil(x); } -#endif - - -/** Log base 2 for 32 bits positive integers. - * Conveniently returns 0 for x==0. */ -inline int log2(int x) -{ - eigen_assert(x>=0); - unsigned int v(x); - static const int table[32] = { 0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30, 8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31 }; - v |= v >> 1; - v |= v >> 2; - v |= v >> 4; - v |= v >> 8; - v |= v >> 16; - return table[(v * 0x07C4ACDDU) >> 27]; -} - -/** \returns the square root of \a x. - * - * It is essentially equivalent to \code using std::sqrt; return sqrt(x); \endcode, - * but slightly faster for float/double and some compilers (e.g., gcc), thanks to - * specializations when SSE is enabled. - * - * It's usage is justified in performance critical functions, like norm/normalize. - */ -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -T sqrt(const T &x) -{ - EIGEN_USING_STD_MATH(sqrt); - return sqrt(x); -} - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float sqrt(float x) { return cl::sycl::sqrt(x); } -EIGEN_ALWAYS_INLINE double sqrt(double x) { return cl::sycl::sqrt(x); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -T log(const T &x) { - EIGEN_USING_STD_MATH(log); - return log(x); -} - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float log(float x) { return cl::sycl::log(x); } -EIGEN_ALWAYS_INLINE double log(double x) { return cl::sycl::log(x); } -#endif // defined(__SYCL_DEVICE_ONLY__) - - -#ifdef EIGEN_CUDACC -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float log(const float &x) { return ::logf(x); } - -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -double log(const double &x) { return ::log(x); } -#endif - -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -typename internal::enable_if::IsSigned || NumTraits::IsComplex,typename NumTraits::Real>::type -abs(const T &x) { - EIGEN_USING_STD_MATH(abs); - return abs(x); -} - -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -typename internal::enable_if::IsSigned || NumTraits::IsComplex),typename NumTraits::Real>::type -abs(const T &x) { - return x; -} - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float abs(float x) { return cl::sycl::fabs(x); } -EIGEN_ALWAYS_INLINE double abs(double x) { return cl::sycl::fabs(x); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -#ifdef EIGEN_CUDACC -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float abs(const float &x) { return ::fabsf(x); } - -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -double abs(const double &x) { return ::fabs(x); } - -template <> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float abs(const std::complex& x) { - return ::hypotf(x.real(), x.imag()); -} - -template <> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -double abs(const std::complex& x) { - return ::hypot(x.real(), x.imag()); -} -#endif - -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -T exp(const T &x) { - EIGEN_USING_STD_MATH(exp); - return exp(x); -} - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float exp(float x) { return cl::sycl::exp(x); } -EIGEN_ALWAYS_INLINE double exp(double x) { return cl::sycl::exp(x); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -#ifdef EIGEN_CUDACC -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float exp(const float &x) { return ::expf(x); } - -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -double exp(const double &x) { return ::exp(x); } -#endif - -template -EIGEN_DEVICE_FUNC -inline EIGEN_MATHFUNC_RETVAL(expm1, Scalar) expm1(const Scalar& x) -{ - return EIGEN_MATHFUNC_IMPL(expm1, Scalar)::run(x); -} - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float expm1(float x) { return cl::sycl::expm1(x); } -EIGEN_ALWAYS_INLINE double expm1(double x) { return cl::sycl::expm1(x); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -#ifdef EIGEN_CUDACC -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float expm1(const float &x) { return ::expm1f(x); } - -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -double expm1(const double &x) { return ::expm1(x); } -#endif - -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -T cos(const T &x) { - EIGEN_USING_STD_MATH(cos); - return cos(x); -} - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float cos(float x) { return cl::sycl::cos(x); } -EIGEN_ALWAYS_INLINE double cos(double x) { return cl::sycl::cos(x); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -#ifdef EIGEN_CUDACC -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float cos(const float &x) { return ::cosf(x); } - -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -double cos(const double &x) { return ::cos(x); } -#endif - -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -T sin(const T &x) { - EIGEN_USING_STD_MATH(sin); - return sin(x); -} - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float sin(float x) { return cl::sycl::sin(x); } -EIGEN_ALWAYS_INLINE double sin(double x) { return cl::sycl::sin(x); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -#ifdef EIGEN_CUDACC -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float sin(const float &x) { return ::sinf(x); } - -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -double sin(const double &x) { return ::sin(x); } -#endif - -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -T tan(const T &x) { - EIGEN_USING_STD_MATH(tan); - return tan(x); -} - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float tan(float x) { return cl::sycl::tan(x); } -EIGEN_ALWAYS_INLINE double tan(double x) { return cl::sycl::tan(x); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -#ifdef EIGEN_CUDACC -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float tan(const float &x) { return ::tanf(x); } - -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -double tan(const double &x) { return ::tan(x); } -#endif - -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -T acos(const T &x) { - EIGEN_USING_STD_MATH(acos); - return acos(x); -} - -#if EIGEN_HAS_CXX11_MATH -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -T acosh(const T &x) { - EIGEN_USING_STD_MATH(acosh); - return acosh(x); -} -#endif - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float acos(float x) { return cl::sycl::acos(x); } -EIGEN_ALWAYS_INLINE double acos(double x) { return cl::sycl::acos(x); } -EIGEN_ALWAYS_INLINE float acosh(float x) { return cl::sycl::acosh(x); } -EIGEN_ALWAYS_INLINE double acosh(double x) { return cl::sycl::acosh(x); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -#ifdef EIGEN_CUDACC -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float acos(const float &x) { return ::acosf(x); } - -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -double acos(const double &x) { return ::acos(x); } -#endif - -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -T asin(const T &x) { - EIGEN_USING_STD_MATH(asin); - return asin(x); -} - -#if EIGEN_HAS_CXX11_MATH -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -T asinh(const T &x) { - EIGEN_USING_STD_MATH(asinh); - return asinh(x); -} -#endif - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float asin(float x) { return cl::sycl::asin(x); } -EIGEN_ALWAYS_INLINE double asin(double x) { return cl::sycl::asin(x); } -EIGEN_ALWAYS_INLINE float asinh(float x) { return cl::sycl::asinh(x); } -EIGEN_ALWAYS_INLINE double asinh(double x) { return cl::sycl::asinh(x); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -#ifdef EIGEN_CUDACC -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float asin(const float &x) { return ::asinf(x); } - -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -double asin(const double &x) { return ::asin(x); } -#endif - -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -T atan(const T &x) { - EIGEN_USING_STD_MATH(atan); - return atan(x); -} - -#if EIGEN_HAS_CXX11_MATH -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -T atanh(const T &x) { - EIGEN_USING_STD_MATH(atanh); - return atanh(x); -} -#endif - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float atan(float x) { return cl::sycl::atan(x); } -EIGEN_ALWAYS_INLINE double atan(double x) { return cl::sycl::atan(x); } -EIGEN_ALWAYS_INLINE float atanh(float x) { return cl::sycl::atanh(x); } -EIGEN_ALWAYS_INLINE double atanh(double x) { return cl::sycl::atanh(x); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -#ifdef EIGEN_CUDACC -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float atan(const float &x) { return ::atanf(x); } - -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -double atan(const double &x) { return ::atan(x); } -#endif - - -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -T cosh(const T &x) { - EIGEN_USING_STD_MATH(cosh); - return cosh(x); -} - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float cosh(float x) { return cl::sycl::cosh(x); } -EIGEN_ALWAYS_INLINE double cosh(double x) { return cl::sycl::cosh(x); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -#ifdef EIGEN_CUDACC -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float cosh(const float &x) { return ::coshf(x); } - -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -double cosh(const double &x) { return ::cosh(x); } -#endif - -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -T sinh(const T &x) { - EIGEN_USING_STD_MATH(sinh); - return sinh(x); -} - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float sinh(float x) { return cl::sycl::sinh(x); } -EIGEN_ALWAYS_INLINE double sinh(double x) { return cl::sycl::sinh(x); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -#ifdef EIGEN_CUDACC -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float sinh(const float &x) { return ::sinhf(x); } - -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -double sinh(const double &x) { return ::sinh(x); } -#endif - -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -T tanh(const T &x) { - EIGEN_USING_STD_MATH(tanh); - return tanh(x); -} - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float tanh(float x) { return cl::sycl::tanh(x); } -EIGEN_ALWAYS_INLINE double tanh(double x) { return cl::sycl::tanh(x); } -#elif (!defined(EIGEN_CUDACC)) && EIGEN_FAST_MATH -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float tanh(float x) { return internal::generic_fast_tanh_float(x); } -#endif - -#ifdef EIGEN_CUDACC -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float tanh(const float &x) { return ::tanhf(x); } - -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -double tanh(const double &x) { return ::tanh(x); } -#endif - -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -T fmod(const T& a, const T& b) { - EIGEN_USING_STD_MATH(fmod); - return fmod(a, b); -} - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float fmod(float x, float y) { return cl::sycl::fmod(x, y); } -EIGEN_ALWAYS_INLINE double fmod(double x, double y) { return cl::sycl::fmod(x, y); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -#ifdef EIGEN_CUDACC -template <> -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float fmod(const float& a, const float& b) { - return ::fmodf(a, b); -} - -template <> -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -double fmod(const double& a, const double& b) { - return ::fmod(a, b); -} -#endif - -} // end namespace numext - -namespace internal { - -template -EIGEN_DEVICE_FUNC bool isfinite_impl(const std::complex& x) -{ - return (numext::isfinite)(numext::real(x)) && (numext::isfinite)(numext::imag(x)); -} - -template -EIGEN_DEVICE_FUNC bool isnan_impl(const std::complex& x) -{ - return (numext::isnan)(numext::real(x)) || (numext::isnan)(numext::imag(x)); -} - -template -EIGEN_DEVICE_FUNC bool isinf_impl(const std::complex& x) -{ - return ((numext::isinf)(numext::real(x)) || (numext::isinf)(numext::imag(x))) && (!(numext::isnan)(x)); -} - -/**************************************************************************** -* Implementation of fuzzy comparisons * -****************************************************************************/ - -template -struct scalar_fuzzy_default_impl {}; - -template -struct scalar_fuzzy_default_impl -{ - typedef typename NumTraits::Real RealScalar; - template EIGEN_DEVICE_FUNC - static inline bool isMuchSmallerThan(const Scalar& x, const OtherScalar& y, const RealScalar& prec) - { - return numext::abs(x) <= numext::abs(y) * prec; - } - EIGEN_DEVICE_FUNC - static inline bool isApprox(const Scalar& x, const Scalar& y, const RealScalar& prec) - { - return numext::abs(x - y) <= numext::mini(numext::abs(x), numext::abs(y)) * prec; - } - EIGEN_DEVICE_FUNC - static inline bool isApproxOrLessThan(const Scalar& x, const Scalar& y, const RealScalar& prec) - { - return x <= y || isApprox(x, y, prec); - } -}; - -template -struct scalar_fuzzy_default_impl -{ - typedef typename NumTraits::Real RealScalar; - template EIGEN_DEVICE_FUNC - static inline bool isMuchSmallerThan(const Scalar& x, const Scalar&, const RealScalar&) - { - return x == Scalar(0); - } - EIGEN_DEVICE_FUNC - static inline bool isApprox(const Scalar& x, const Scalar& y, const RealScalar&) - { - return x == y; - } - EIGEN_DEVICE_FUNC - static inline bool isApproxOrLessThan(const Scalar& x, const Scalar& y, const RealScalar&) - { - return x <= y; - } -}; - -template -struct scalar_fuzzy_default_impl -{ - typedef typename NumTraits::Real RealScalar; - template EIGEN_DEVICE_FUNC - static inline bool isMuchSmallerThan(const Scalar& x, const OtherScalar& y, const RealScalar& prec) - { - return numext::abs2(x) <= numext::abs2(y) * prec * prec; - } - EIGEN_DEVICE_FUNC - static inline bool isApprox(const Scalar& x, const Scalar& y, const RealScalar& prec) - { - return numext::abs2(x - y) <= numext::mini(numext::abs2(x), numext::abs2(y)) * prec * prec; - } -}; - -template -struct scalar_fuzzy_impl : scalar_fuzzy_default_impl::IsComplex, NumTraits::IsInteger> {}; - -template EIGEN_DEVICE_FUNC -inline bool isMuchSmallerThan(const Scalar& x, const OtherScalar& y, - const typename NumTraits::Real &precision = NumTraits::dummy_precision()) -{ - return scalar_fuzzy_impl::template isMuchSmallerThan(x, y, precision); -} - -template EIGEN_DEVICE_FUNC -inline bool isApprox(const Scalar& x, const Scalar& y, - const typename NumTraits::Real &precision = NumTraits::dummy_precision()) -{ - return scalar_fuzzy_impl::isApprox(x, y, precision); -} - -template EIGEN_DEVICE_FUNC -inline bool isApproxOrLessThan(const Scalar& x, const Scalar& y, - const typename NumTraits::Real &precision = NumTraits::dummy_precision()) -{ - return scalar_fuzzy_impl::isApproxOrLessThan(x, y, precision); -} - -/****************************************** -*** The special case of the bool type *** -******************************************/ - -template<> struct random_impl -{ - static inline bool run() - { - return random(0,1)==0 ? false : true; - } -}; - -template<> struct scalar_fuzzy_impl -{ - typedef bool RealScalar; - - template EIGEN_DEVICE_FUNC - static inline bool isMuchSmallerThan(const bool& x, const bool&, const bool&) - { - return !x; - } - - EIGEN_DEVICE_FUNC - static inline bool isApprox(bool x, bool y, bool) - { - return x == y; - } - - EIGEN_DEVICE_FUNC - static inline bool isApproxOrLessThan(const bool& x, const bool& y, const bool&) - { - return (!x) || y; - } - -}; - - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_MATHFUNCTIONS_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/MathFunctionsImpl.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/MathFunctionsImpl.h deleted file mode 100644 index ae1386b4..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/MathFunctionsImpl.h +++ /dev/null @@ -1,73 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Pedro Gonnet (pedro.gonnet@gmail.com) -// Copyright (C) 2016 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_MATHFUNCTIONSIMPL_H -#define EIGEN_MATHFUNCTIONSIMPL_H - -namespace Eigen { - -namespace internal { - -/** \internal \returns the hyperbolic tan of \a a (coeff-wise) - Doesn't do anything fancy, just a 13/6-degree rational interpolant which - is accurate up to a couple of ulp in the range [-9, 9], outside of which - the tanh(x) = +/-1. - - This implementation works on both scalars and packets. -*/ -template -T generic_fast_tanh_float(const T& a_x) -{ - // Clamp the inputs to the range [-9, 9] since anything outside - // this range is +/-1.0f in single-precision. - const T plus_9 = pset1(9.f); - const T minus_9 = pset1(-9.f); - const T x = pmax(pmin(a_x, plus_9), minus_9); - // The monomial coefficients of the numerator polynomial (odd). - const T alpha_1 = pset1(4.89352455891786e-03f); - const T alpha_3 = pset1(6.37261928875436e-04f); - const T alpha_5 = pset1(1.48572235717979e-05f); - const T alpha_7 = pset1(5.12229709037114e-08f); - const T alpha_9 = pset1(-8.60467152213735e-11f); - const T alpha_11 = pset1(2.00018790482477e-13f); - const T alpha_13 = pset1(-2.76076847742355e-16f); - - // The monomial coefficients of the denominator polynomial (even). - const T beta_0 = pset1(4.89352518554385e-03f); - const T beta_2 = pset1(2.26843463243900e-03f); - const T beta_4 = pset1(1.18534705686654e-04f); - const T beta_6 = pset1(1.19825839466702e-06f); - - // Since the polynomials are odd/even, we need x^2. - const T x2 = pmul(x, x); - - // Evaluate the numerator polynomial p. - T p = pmadd(x2, alpha_13, alpha_11); - p = pmadd(x2, p, alpha_9); - p = pmadd(x2, p, alpha_7); - p = pmadd(x2, p, alpha_5); - p = pmadd(x2, p, alpha_3); - p = pmadd(x2, p, alpha_1); - p = pmul(x, p); - - // Evaluate the denominator polynomial p. - T q = pmadd(x2, beta_6, beta_4); - q = pmadd(x2, q, beta_2); - q = pmadd(x2, q, beta_0); - - // Divide the numerator by the denominator. - return pdiv(p, q); -} - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_MATHFUNCTIONSIMPL_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Matrix.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Matrix.h deleted file mode 100644 index 90c336d8..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Matrix.h +++ /dev/null @@ -1,461 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2010 Benoit Jacob -// Copyright (C) 2008-2009 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_MATRIX_H -#define EIGEN_MATRIX_H - -namespace Eigen { - -namespace internal { -template -struct traits > -{ -private: - enum { size = internal::size_at_compile_time<_Rows,_Cols>::ret }; - typedef typename find_best_packet<_Scalar,size>::type PacketScalar; - enum { - row_major_bit = _Options&RowMajor ? RowMajorBit : 0, - is_dynamic_size_storage = _MaxRows==Dynamic || _MaxCols==Dynamic, - max_size = is_dynamic_size_storage ? Dynamic : _MaxRows*_MaxCols, - default_alignment = compute_default_alignment<_Scalar,max_size>::value, - actual_alignment = ((_Options&DontAlign)==0) ? default_alignment : 0, - required_alignment = unpacket_traits::alignment, - packet_access_bit = (packet_traits<_Scalar>::Vectorizable && (EIGEN_UNALIGNED_VECTORIZE || (actual_alignment>=required_alignment))) ? PacketAccessBit : 0 - }; - -public: - typedef _Scalar Scalar; - typedef Dense StorageKind; - typedef Eigen::Index StorageIndex; - typedef MatrixXpr XprKind; - enum { - RowsAtCompileTime = _Rows, - ColsAtCompileTime = _Cols, - MaxRowsAtCompileTime = _MaxRows, - MaxColsAtCompileTime = _MaxCols, - Flags = compute_matrix_flags<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>::ret, - Options = _Options, - InnerStrideAtCompileTime = 1, - OuterStrideAtCompileTime = (Options&RowMajor) ? ColsAtCompileTime : RowsAtCompileTime, - - // FIXME, the following flag in only used to define NeedsToAlign in PlainObjectBase - EvaluatorFlags = LinearAccessBit | DirectAccessBit | packet_access_bit | row_major_bit, - Alignment = actual_alignment - }; -}; -} - -/** \class Matrix - * \ingroup Core_Module - * - * \brief The matrix class, also used for vectors and row-vectors - * - * The %Matrix class is the work-horse for all \em dense (\ref dense "note") matrices and vectors within Eigen. - * Vectors are matrices with one column, and row-vectors are matrices with one row. - * - * The %Matrix class encompasses \em both fixed-size and dynamic-size objects (\ref fixedsize "note"). - * - * The first three template parameters are required: - * \tparam _Scalar Numeric type, e.g. float, double, int or std::complex. - * User defined scalar types are supported as well (see \ref user_defined_scalars "here"). - * \tparam _Rows Number of rows, or \b Dynamic - * \tparam _Cols Number of columns, or \b Dynamic - * - * The remaining template parameters are optional -- in most cases you don't have to worry about them. - * \tparam _Options A combination of either \b #RowMajor or \b #ColMajor, and of either - * \b #AutoAlign or \b #DontAlign. - * The former controls \ref TopicStorageOrders "storage order", and defaults to column-major. The latter controls alignment, which is required - * for vectorization. It defaults to aligning matrices except for fixed sizes that aren't a multiple of the packet size. - * \tparam _MaxRows Maximum number of rows. Defaults to \a _Rows (\ref maxrows "note"). - * \tparam _MaxCols Maximum number of columns. Defaults to \a _Cols (\ref maxrows "note"). - * - * Eigen provides a number of typedefs covering the usual cases. Here are some examples: - * - * \li \c Matrix2d is a 2x2 square matrix of doubles (\c Matrix) - * \li \c Vector4f is a vector of 4 floats (\c Matrix) - * \li \c RowVector3i is a row-vector of 3 ints (\c Matrix) - * - * \li \c MatrixXf is a dynamic-size matrix of floats (\c Matrix) - * \li \c VectorXf is a dynamic-size vector of floats (\c Matrix) - * - * \li \c Matrix2Xf is a partially fixed-size (dynamic-size) matrix of floats (\c Matrix) - * \li \c MatrixX3d is a partially dynamic-size (fixed-size) matrix of double (\c Matrix) - * - * See \link matrixtypedefs this page \endlink for a complete list of predefined \em %Matrix and \em Vector typedefs. - * - * You can access elements of vectors and matrices using normal subscripting: - * - * \code - * Eigen::VectorXd v(10); - * v[0] = 0.1; - * v[1] = 0.2; - * v(0) = 0.3; - * v(1) = 0.4; - * - * Eigen::MatrixXi m(10, 10); - * m(0, 1) = 1; - * m(0, 2) = 2; - * m(0, 3) = 3; - * \endcode - * - * This class can be extended with the help of the plugin mechanism described on the page - * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_MATRIX_PLUGIN. - * - * Some notes: - * - *
    - *
    \anchor dense Dense versus sparse:
    - *
    This %Matrix class handles dense, not sparse matrices and vectors. For sparse matrices and vectors, see the Sparse module. - * - * Dense matrices and vectors are plain usual arrays of coefficients. All the coefficients are stored, in an ordinary contiguous array. - * This is unlike Sparse matrices and vectors where the coefficients are stored as a list of nonzero coefficients.
    - * - *
    \anchor fixedsize Fixed-size versus dynamic-size:
    - *
    Fixed-size means that the numbers of rows and columns are known are compile-time. In this case, Eigen allocates the array - * of coefficients as a fixed-size array, as a class member. This makes sense for very small matrices, typically up to 4x4, sometimes up - * to 16x16. Larger matrices should be declared as dynamic-size even if one happens to know their size at compile-time. - * - * Dynamic-size means that the numbers of rows or columns are not necessarily known at compile-time. In this case they are runtime - * variables, and the array of coefficients is allocated dynamically on the heap. - * - * Note that \em dense matrices, be they Fixed-size or Dynamic-size, do not expand dynamically in the sense of a std::map. - * If you want this behavior, see the Sparse module.
    - * - *
    \anchor maxrows _MaxRows and _MaxCols:
    - *
    In most cases, one just leaves these parameters to the default values. - * These parameters mean the maximum size of rows and columns that the matrix may have. They are useful in cases - * when the exact numbers of rows and columns are not known are compile-time, but it is known at compile-time that they cannot - * exceed a certain value. This happens when taking dynamic-size blocks inside fixed-size matrices: in this case _MaxRows and _MaxCols - * are the dimensions of the original matrix, while _Rows and _Cols are Dynamic.
    - *
    - * - * ABI and storage layout - * - * The table below summarizes the ABI of some possible Matrix instances which is fixed thorough the lifetime of Eigen 3. - * - * - * - * - * - * - *
    Matrix typeEquivalent C structure
    \code Matrix \endcode\code - * struct { - * T *data; // with (size_t(data)%EIGEN_MAX_ALIGN_BYTES)==0 - * Eigen::Index rows, cols; - * }; - * \endcode
    \code - * Matrix - * Matrix \endcode\code - * struct { - * T *data; // with (size_t(data)%EIGEN_MAX_ALIGN_BYTES)==0 - * Eigen::Index size; - * }; - * \endcode
    \code Matrix \endcode\code - * struct { - * T data[Rows*Cols]; // with (size_t(data)%A(Rows*Cols*sizeof(T)))==0 - * }; - * \endcode
    \code Matrix \endcode\code - * struct { - * T data[MaxRows*MaxCols]; // with (size_t(data)%A(MaxRows*MaxCols*sizeof(T)))==0 - * Eigen::Index rows, cols; - * }; - * \endcode
    - * Note that in this table Rows, Cols, MaxRows and MaxCols are all positive integers. A(S) is defined to the largest possible power-of-two - * smaller to EIGEN_MAX_STATIC_ALIGN_BYTES. - * - * \see MatrixBase for the majority of the API methods for matrices, \ref TopicClassHierarchy, - * \ref TopicStorageOrders - */ - -template -class Matrix - : public PlainObjectBase > -{ - public: - - /** \brief Base class typedef. - * \sa PlainObjectBase - */ - typedef PlainObjectBase Base; - - enum { Options = _Options }; - - EIGEN_DENSE_PUBLIC_INTERFACE(Matrix) - - typedef typename Base::PlainObject PlainObject; - - using Base::base; - using Base::coeffRef; - - /** - * \brief Assigns matrices to each other. - * - * \note This is a special case of the templated operator=. Its purpose is - * to prevent a default operator= from hiding the templated operator=. - * - * \callgraph - */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Matrix& operator=(const Matrix& other) - { - return Base::_set(other); - } - - /** \internal - * \brief Copies the value of the expression \a other into \c *this with automatic resizing. - * - * *this might be resized to match the dimensions of \a other. If *this was a null matrix (not already initialized), - * it will be initialized. - * - * Note that copying a row-vector into a vector (and conversely) is allowed. - * The resizing, if any, is then done in the appropriate way so that row-vectors - * remain row-vectors and vectors remain vectors. - */ - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Matrix& operator=(const DenseBase& other) - { - return Base::_set(other); - } - - /* Here, doxygen failed to copy the brief information when using \copydoc */ - - /** - * \brief Copies the generic expression \a other into *this. - * \copydetails DenseBase::operator=(const EigenBase &other) - */ - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Matrix& operator=(const EigenBase &other) - { - return Base::operator=(other); - } - - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Matrix& operator=(const ReturnByValue& func) - { - return Base::operator=(func); - } - - /** \brief Default constructor. - * - * For fixed-size matrices, does nothing. - * - * For dynamic-size matrices, creates an empty matrix of size 0. Does not allocate any array. Such a matrix - * is called a null matrix. This constructor is the unique way to create null matrices: resizing - * a matrix to 0 is not supported. - * - * \sa resize(Index,Index) - */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Matrix() : Base() - { - Base::_check_template_params(); - EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED - } - - // FIXME is it still needed - EIGEN_DEVICE_FUNC - explicit Matrix(internal::constructor_without_unaligned_array_assert) - : Base(internal::constructor_without_unaligned_array_assert()) - { Base::_check_template_params(); EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED } - -#if EIGEN_HAS_RVALUE_REFERENCES - EIGEN_DEVICE_FUNC - Matrix(Matrix&& other) EIGEN_NOEXCEPT_IF(std::is_nothrow_move_constructible::value) - : Base(std::move(other)) - { - Base::_check_template_params(); - if (RowsAtCompileTime!=Dynamic && ColsAtCompileTime!=Dynamic) - Base::_set_noalias(other); - } - EIGEN_DEVICE_FUNC - Matrix& operator=(Matrix&& other) EIGEN_NOEXCEPT_IF(std::is_nothrow_move_assignable::value) - { - other.swap(*this); - return *this; - } -#endif - - #ifndef EIGEN_PARSED_BY_DOXYGEN - - // This constructor is for both 1x1 matrices and dynamic vectors - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE explicit Matrix(const T& x) - { - Base::_check_template_params(); - Base::template _init1(x); - } - - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Matrix(const T0& x, const T1& y) - { - Base::_check_template_params(); - Base::template _init2(x, y); - } - #else - /** \brief Constructs a fixed-sized matrix initialized with coefficients starting at \a data */ - EIGEN_DEVICE_FUNC - explicit Matrix(const Scalar *data); - - /** \brief Constructs a vector or row-vector with given dimension. \only_for_vectors - * - * This is useful for dynamic-size vectors. For fixed-size vectors, - * it is redundant to pass these parameters, so one should use the default constructor - * Matrix() instead. - * - * \warning This constructor is disabled for fixed-size \c 1x1 matrices. For instance, - * calling Matrix(1) will call the initialization constructor: Matrix(const Scalar&). - * For fixed-size \c 1x1 matrices it is therefore recommended to use the default - * constructor Matrix() instead, especially when using one of the non standard - * \c EIGEN_INITIALIZE_MATRICES_BY_{ZERO,\c NAN} macros (see \ref TopicPreprocessorDirectives). - */ - EIGEN_STRONG_INLINE explicit Matrix(Index dim); - /** \brief Constructs an initialized 1x1 matrix with the given coefficient */ - Matrix(const Scalar& x); - /** \brief Constructs an uninitialized matrix with \a rows rows and \a cols columns. - * - * This is useful for dynamic-size matrices. For fixed-size matrices, - * it is redundant to pass these parameters, so one should use the default constructor - * Matrix() instead. - * - * \warning This constructor is disabled for fixed-size \c 1x2 and \c 2x1 vectors. For instance, - * calling Matrix2f(2,1) will call the initialization constructor: Matrix(const Scalar& x, const Scalar& y). - * For fixed-size \c 1x2 or \c 2x1 vectors it is therefore recommended to use the default - * constructor Matrix() instead, especially when using one of the non standard - * \c EIGEN_INITIALIZE_MATRICES_BY_{ZERO,\c NAN} macros (see \ref TopicPreprocessorDirectives). - */ - EIGEN_DEVICE_FUNC - Matrix(Index rows, Index cols); - - /** \brief Constructs an initialized 2D vector with given coefficients */ - Matrix(const Scalar& x, const Scalar& y); - #endif - - /** \brief Constructs an initialized 3D vector with given coefficients */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Matrix(const Scalar& x, const Scalar& y, const Scalar& z) - { - Base::_check_template_params(); - EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Matrix, 3) - m_storage.data()[0] = x; - m_storage.data()[1] = y; - m_storage.data()[2] = z; - } - /** \brief Constructs an initialized 4D vector with given coefficients */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Matrix(const Scalar& x, const Scalar& y, const Scalar& z, const Scalar& w) - { - Base::_check_template_params(); - EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Matrix, 4) - m_storage.data()[0] = x; - m_storage.data()[1] = y; - m_storage.data()[2] = z; - m_storage.data()[3] = w; - } - - - /** \brief Copy constructor */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Matrix(const Matrix& other) : Base(other) - { } - - /** \brief Copy constructor for generic expressions. - * \sa MatrixBase::operator=(const EigenBase&) - */ - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Matrix(const EigenBase &other) - : Base(other.derived()) - { } - - EIGEN_DEVICE_FUNC inline Index innerStride() const { return 1; } - EIGEN_DEVICE_FUNC inline Index outerStride() const { return this->innerSize(); } - - /////////// Geometry module /////////// - - template - EIGEN_DEVICE_FUNC - explicit Matrix(const RotationBase& r); - template - EIGEN_DEVICE_FUNC - Matrix& operator=(const RotationBase& r); - - // allow to extend Matrix outside Eigen - #ifdef EIGEN_MATRIX_PLUGIN - #include EIGEN_MATRIX_PLUGIN - #endif - - protected: - template - friend struct internal::conservative_resize_like_impl; - - using Base::m_storage; -}; - -/** \defgroup matrixtypedefs Global matrix typedefs - * - * \ingroup Core_Module - * - * Eigen defines several typedef shortcuts for most common matrix and vector types. - * - * The general patterns are the following: - * - * \c MatrixSizeType where \c Size can be \c 2,\c 3,\c 4 for fixed size square matrices or \c X for dynamic size, - * and where \c Type can be \c i for integer, \c f for float, \c d for double, \c cf for complex float, \c cd - * for complex double. - * - * For example, \c Matrix3d is a fixed-size 3x3 matrix type of doubles, and \c MatrixXf is a dynamic-size matrix of floats. - * - * There are also \c VectorSizeType and \c RowVectorSizeType which are self-explanatory. For example, \c Vector4cf is - * a fixed-size vector of 4 complex floats. - * - * \sa class Matrix - */ - -#define EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, Size, SizeSuffix) \ -/** \ingroup matrixtypedefs */ \ -typedef Matrix Matrix##SizeSuffix##TypeSuffix; \ -/** \ingroup matrixtypedefs */ \ -typedef Matrix Vector##SizeSuffix##TypeSuffix; \ -/** \ingroup matrixtypedefs */ \ -typedef Matrix RowVector##SizeSuffix##TypeSuffix; - -#define EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, Size) \ -/** \ingroup matrixtypedefs */ \ -typedef Matrix Matrix##Size##X##TypeSuffix; \ -/** \ingroup matrixtypedefs */ \ -typedef Matrix Matrix##X##Size##TypeSuffix; - -#define EIGEN_MAKE_TYPEDEFS_ALL_SIZES(Type, TypeSuffix) \ -EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 2, 2) \ -EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 3, 3) \ -EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 4, 4) \ -EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, Dynamic, X) \ -EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 2) \ -EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 3) \ -EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 4) - -EIGEN_MAKE_TYPEDEFS_ALL_SIZES(int, i) -EIGEN_MAKE_TYPEDEFS_ALL_SIZES(float, f) -EIGEN_MAKE_TYPEDEFS_ALL_SIZES(double, d) -EIGEN_MAKE_TYPEDEFS_ALL_SIZES(std::complex, cf) -EIGEN_MAKE_TYPEDEFS_ALL_SIZES(std::complex, cd) - -#undef EIGEN_MAKE_TYPEDEFS_ALL_SIZES -#undef EIGEN_MAKE_TYPEDEFS -#undef EIGEN_MAKE_FIXED_TYPEDEFS - -} // end namespace Eigen - -#endif // EIGEN_MATRIX_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/MatrixBase.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/MatrixBase.h deleted file mode 100644 index 11435903..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/MatrixBase.h +++ /dev/null @@ -1,525 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2009 Benoit Jacob -// Copyright (C) 2008 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_MATRIXBASE_H -#define EIGEN_MATRIXBASE_H - -namespace Eigen { - -/** \class MatrixBase - * \ingroup Core_Module - * - * \brief Base class for all dense matrices, vectors, and expressions - * - * This class is the base that is inherited by all matrix, vector, and related expression - * types. Most of the Eigen API is contained in this class, and its base classes. Other important - * classes for the Eigen API are Matrix, and VectorwiseOp. - * - * Note that some methods are defined in other modules such as the \ref LU_Module LU module - * for all functions related to matrix inversions. - * - * \tparam Derived is the derived type, e.g. a matrix type, or an expression, etc. - * - * When writing a function taking Eigen objects as argument, if you want your function - * to take as argument any matrix, vector, or expression, just let it take a - * MatrixBase argument. As an example, here is a function printFirstRow which, given - * a matrix, vector, or expression \a x, prints the first row of \a x. - * - * \code - template - void printFirstRow(const Eigen::MatrixBase& x) - { - cout << x.row(0) << endl; - } - * \endcode - * - * This class can be extended with the help of the plugin mechanism described on the page - * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_MATRIXBASE_PLUGIN. - * - * \sa \blank \ref TopicClassHierarchy - */ -template class MatrixBase - : public DenseBase -{ - public: -#ifndef EIGEN_PARSED_BY_DOXYGEN - typedef MatrixBase StorageBaseType; - typedef typename internal::traits::StorageKind StorageKind; - typedef typename internal::traits::StorageIndex StorageIndex; - typedef typename internal::traits::Scalar Scalar; - typedef typename internal::packet_traits::type PacketScalar; - typedef typename NumTraits::Real RealScalar; - - typedef DenseBase Base; - using Base::RowsAtCompileTime; - using Base::ColsAtCompileTime; - using Base::SizeAtCompileTime; - using Base::MaxRowsAtCompileTime; - using Base::MaxColsAtCompileTime; - using Base::MaxSizeAtCompileTime; - using Base::IsVectorAtCompileTime; - using Base::Flags; - - using Base::derived; - using Base::const_cast_derived; - using Base::rows; - using Base::cols; - using Base::size; - using Base::coeff; - using Base::coeffRef; - using Base::lazyAssign; - using Base::eval; - using Base::operator-; - using Base::operator+=; - using Base::operator-=; - using Base::operator*=; - using Base::operator/=; - - typedef typename Base::CoeffReturnType CoeffReturnType; - typedef typename Base::ConstTransposeReturnType ConstTransposeReturnType; - typedef typename Base::RowXpr RowXpr; - typedef typename Base::ColXpr ColXpr; -#endif // not EIGEN_PARSED_BY_DOXYGEN - - - -#ifndef EIGEN_PARSED_BY_DOXYGEN - /** type of the equivalent square matrix */ - typedef Matrix SquareMatrixType; -#endif // not EIGEN_PARSED_BY_DOXYGEN - - /** \returns the size of the main diagonal, which is min(rows(),cols()). - * \sa rows(), cols(), SizeAtCompileTime. */ - EIGEN_DEVICE_FUNC - inline Index diagonalSize() const { return (numext::mini)(rows(),cols()); } - - typedef typename Base::PlainObject PlainObject; - -#ifndef EIGEN_PARSED_BY_DOXYGEN - /** \internal Represents a matrix with all coefficients equal to one another*/ - typedef CwiseNullaryOp,PlainObject> ConstantReturnType; - /** \internal the return type of MatrixBase::adjoint() */ - typedef typename internal::conditional::IsComplex, - CwiseUnaryOp, ConstTransposeReturnType>, - ConstTransposeReturnType - >::type AdjointReturnType; - /** \internal Return type of eigenvalues() */ - typedef Matrix, internal::traits::ColsAtCompileTime, 1, ColMajor> EigenvaluesReturnType; - /** \internal the return type of identity */ - typedef CwiseNullaryOp,PlainObject> IdentityReturnType; - /** \internal the return type of unit vectors */ - typedef Block, SquareMatrixType>, - internal::traits::RowsAtCompileTime, - internal::traits::ColsAtCompileTime> BasisReturnType; -#endif // not EIGEN_PARSED_BY_DOXYGEN - -#define EIGEN_CURRENT_STORAGE_BASE_CLASS Eigen::MatrixBase -#define EIGEN_DOC_UNARY_ADDONS(X,Y) -# include "../plugins/CommonCwiseBinaryOps.h" -# include "../plugins/MatrixCwiseUnaryOps.h" -# include "../plugins/MatrixCwiseBinaryOps.h" -# ifdef EIGEN_MATRIXBASE_PLUGIN -# include EIGEN_MATRIXBASE_PLUGIN -# endif -#undef EIGEN_CURRENT_STORAGE_BASE_CLASS -#undef EIGEN_DOC_UNARY_ADDONS - - /** Special case of the template operator=, in order to prevent the compiler - * from generating a default operator= (issue hit with g++ 4.1) - */ - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Derived& operator=(const MatrixBase& other); - - // We cannot inherit here via Base::operator= since it is causing - // trouble with MSVC. - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Derived& operator=(const DenseBase& other); - - template - EIGEN_DEVICE_FUNC - Derived& operator=(const EigenBase& other); - - template - EIGEN_DEVICE_FUNC - Derived& operator=(const ReturnByValue& other); - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Derived& operator+=(const MatrixBase& other); - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Derived& operator-=(const MatrixBase& other); - - template - EIGEN_DEVICE_FUNC - const Product - operator*(const MatrixBase &other) const; - - template - EIGEN_DEVICE_FUNC - const Product - lazyProduct(const MatrixBase &other) const; - - template - Derived& operator*=(const EigenBase& other); - - template - void applyOnTheLeft(const EigenBase& other); - - template - void applyOnTheRight(const EigenBase& other); - - template - EIGEN_DEVICE_FUNC - const Product - operator*(const DiagonalBase &diagonal) const; - - template - EIGEN_DEVICE_FUNC - typename ScalarBinaryOpTraits::Scalar,typename internal::traits::Scalar>::ReturnType - dot(const MatrixBase& other) const; - - EIGEN_DEVICE_FUNC RealScalar squaredNorm() const; - EIGEN_DEVICE_FUNC RealScalar norm() const; - RealScalar stableNorm() const; - RealScalar blueNorm() const; - RealScalar hypotNorm() const; - EIGEN_DEVICE_FUNC const PlainObject normalized() const; - EIGEN_DEVICE_FUNC const PlainObject stableNormalized() const; - EIGEN_DEVICE_FUNC void normalize(); - EIGEN_DEVICE_FUNC void stableNormalize(); - - EIGEN_DEVICE_FUNC const AdjointReturnType adjoint() const; - EIGEN_DEVICE_FUNC void adjointInPlace(); - - typedef Diagonal DiagonalReturnType; - EIGEN_DEVICE_FUNC - DiagonalReturnType diagonal(); - - typedef typename internal::add_const >::type ConstDiagonalReturnType; - EIGEN_DEVICE_FUNC - ConstDiagonalReturnType diagonal() const; - - template struct DiagonalIndexReturnType { typedef Diagonal Type; }; - template struct ConstDiagonalIndexReturnType { typedef const Diagonal Type; }; - - template - EIGEN_DEVICE_FUNC - typename DiagonalIndexReturnType::Type diagonal(); - - template - EIGEN_DEVICE_FUNC - typename ConstDiagonalIndexReturnType::Type diagonal() const; - - typedef Diagonal DiagonalDynamicIndexReturnType; - typedef typename internal::add_const >::type ConstDiagonalDynamicIndexReturnType; - - EIGEN_DEVICE_FUNC - DiagonalDynamicIndexReturnType diagonal(Index index); - EIGEN_DEVICE_FUNC - ConstDiagonalDynamicIndexReturnType diagonal(Index index) const; - - template struct TriangularViewReturnType { typedef TriangularView Type; }; - template struct ConstTriangularViewReturnType { typedef const TriangularView Type; }; - - template - EIGEN_DEVICE_FUNC - typename TriangularViewReturnType::Type triangularView(); - template - EIGEN_DEVICE_FUNC - typename ConstTriangularViewReturnType::Type triangularView() const; - - template struct SelfAdjointViewReturnType { typedef SelfAdjointView Type; }; - template struct ConstSelfAdjointViewReturnType { typedef const SelfAdjointView Type; }; - - template - EIGEN_DEVICE_FUNC - typename SelfAdjointViewReturnType::Type selfadjointView(); - template - EIGEN_DEVICE_FUNC - typename ConstSelfAdjointViewReturnType::Type selfadjointView() const; - - const SparseView sparseView(const Scalar& m_reference = Scalar(0), - const typename NumTraits::Real& m_epsilon = NumTraits::dummy_precision()) const; - EIGEN_DEVICE_FUNC static const IdentityReturnType Identity(); - EIGEN_DEVICE_FUNC static const IdentityReturnType Identity(Index rows, Index cols); - EIGEN_DEVICE_FUNC static const BasisReturnType Unit(Index size, Index i); - EIGEN_DEVICE_FUNC static const BasisReturnType Unit(Index i); - EIGEN_DEVICE_FUNC static const BasisReturnType UnitX(); - EIGEN_DEVICE_FUNC static const BasisReturnType UnitY(); - EIGEN_DEVICE_FUNC static const BasisReturnType UnitZ(); - EIGEN_DEVICE_FUNC static const BasisReturnType UnitW(); - - EIGEN_DEVICE_FUNC - const DiagonalWrapper asDiagonal() const; - const PermutationWrapper asPermutation() const; - - EIGEN_DEVICE_FUNC - Derived& setIdentity(); - EIGEN_DEVICE_FUNC - Derived& setIdentity(Index rows, Index cols); - EIGEN_DEVICE_FUNC Derived& setUnit(Index i); - EIGEN_DEVICE_FUNC Derived& setUnit(Index newSize, Index i); - - bool isIdentity(const RealScalar& prec = NumTraits::dummy_precision()) const; - bool isDiagonal(const RealScalar& prec = NumTraits::dummy_precision()) const; - - bool isUpperTriangular(const RealScalar& prec = NumTraits::dummy_precision()) const; - bool isLowerTriangular(const RealScalar& prec = NumTraits::dummy_precision()) const; - - template - bool isOrthogonal(const MatrixBase& other, - const RealScalar& prec = NumTraits::dummy_precision()) const; - bool isUnitary(const RealScalar& prec = NumTraits::dummy_precision()) const; - - /** \returns true if each coefficients of \c *this and \a other are all exactly equal. - * \warning When using floating point scalar values you probably should rather use a - * fuzzy comparison such as isApprox() - * \sa isApprox(), operator!= */ - template - EIGEN_DEVICE_FUNC inline bool operator==(const MatrixBase& other) const - { return cwiseEqual(other).all(); } - - /** \returns true if at least one pair of coefficients of \c *this and \a other are not exactly equal to each other. - * \warning When using floating point scalar values you probably should rather use a - * fuzzy comparison such as isApprox() - * \sa isApprox(), operator== */ - template - EIGEN_DEVICE_FUNC inline bool operator!=(const MatrixBase& other) const - { return cwiseNotEqual(other).any(); } - - NoAlias EIGEN_DEVICE_FUNC noalias(); - - // TODO forceAlignedAccess is temporarily disabled - // Need to find a nicer workaround. - inline const Derived& forceAlignedAccess() const { return derived(); } - inline Derived& forceAlignedAccess() { return derived(); } - template inline const Derived& forceAlignedAccessIf() const { return derived(); } - template inline Derived& forceAlignedAccessIf() { return derived(); } - - EIGEN_DEVICE_FUNC Scalar trace() const; - - template EIGEN_DEVICE_FUNC RealScalar lpNorm() const; - - EIGEN_DEVICE_FUNC MatrixBase& matrix() { return *this; } - EIGEN_DEVICE_FUNC const MatrixBase& matrix() const { return *this; } - - /** \returns an \link Eigen::ArrayBase Array \endlink expression of this matrix - * \sa ArrayBase::matrix() */ - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ArrayWrapper array() { return ArrayWrapper(derived()); } - /** \returns a const \link Eigen::ArrayBase Array \endlink expression of this matrix - * \sa ArrayBase::matrix() */ - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const ArrayWrapper array() const { return ArrayWrapper(derived()); } - -/////////// LU module /////////// - - inline const FullPivLU fullPivLu() const; - inline const PartialPivLU partialPivLu() const; - - inline const PartialPivLU lu() const; - - inline const Inverse inverse() const; - - template - inline void computeInverseAndDetWithCheck( - ResultType& inverse, - typename ResultType::Scalar& determinant, - bool& invertible, - const RealScalar& absDeterminantThreshold = NumTraits::dummy_precision() - ) const; - template - inline void computeInverseWithCheck( - ResultType& inverse, - bool& invertible, - const RealScalar& absDeterminantThreshold = NumTraits::dummy_precision() - ) const; - Scalar determinant() const; - -/////////// Cholesky module /////////// - - inline const LLT llt() const; - inline const LDLT ldlt() const; - -/////////// QR module /////////// - - inline const HouseholderQR householderQr() const; - inline const ColPivHouseholderQR colPivHouseholderQr() const; - inline const FullPivHouseholderQR fullPivHouseholderQr() const; - inline const CompleteOrthogonalDecomposition completeOrthogonalDecomposition() const; - -/////////// Eigenvalues module /////////// - - inline EigenvaluesReturnType eigenvalues() const; - inline RealScalar operatorNorm() const; - -/////////// SVD module /////////// - - inline JacobiSVD jacobiSvd(unsigned int computationOptions = 0) const; - inline BDCSVD bdcSvd(unsigned int computationOptions = 0) const; - -/////////// Geometry module /////////// - - #ifndef EIGEN_PARSED_BY_DOXYGEN - /// \internal helper struct to form the return type of the cross product - template struct cross_product_return_type { - typedef typename ScalarBinaryOpTraits::Scalar,typename internal::traits::Scalar>::ReturnType Scalar; - typedef Matrix type; - }; - #endif // EIGEN_PARSED_BY_DOXYGEN - template - EIGEN_DEVICE_FUNC -#ifndef EIGEN_PARSED_BY_DOXYGEN - inline typename cross_product_return_type::type -#else - inline PlainObject -#endif - cross(const MatrixBase& other) const; - - template - EIGEN_DEVICE_FUNC - inline PlainObject cross3(const MatrixBase& other) const; - - EIGEN_DEVICE_FUNC - inline PlainObject unitOrthogonal(void) const; - - EIGEN_DEVICE_FUNC - inline Matrix eulerAngles(Index a0, Index a1, Index a2) const; - - // put this as separate enum value to work around possible GCC 4.3 bug (?) - enum { HomogeneousReturnTypeDirection = ColsAtCompileTime==1&&RowsAtCompileTime==1 ? ((internal::traits::Flags&RowMajorBit)==RowMajorBit ? Horizontal : Vertical) - : ColsAtCompileTime==1 ? Vertical : Horizontal }; - typedef Homogeneous HomogeneousReturnType; - EIGEN_DEVICE_FUNC - inline HomogeneousReturnType homogeneous() const; - - enum { - SizeMinusOne = SizeAtCompileTime==Dynamic ? Dynamic : SizeAtCompileTime-1 - }; - typedef Block::ColsAtCompileTime==1 ? SizeMinusOne : 1, - internal::traits::ColsAtCompileTime==1 ? 1 : SizeMinusOne> ConstStartMinusOne; - typedef EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(ConstStartMinusOne,Scalar,quotient) HNormalizedReturnType; - EIGEN_DEVICE_FUNC - inline const HNormalizedReturnType hnormalized() const; - -////////// Householder module /////////// - - void makeHouseholderInPlace(Scalar& tau, RealScalar& beta); - template - void makeHouseholder(EssentialPart& essential, - Scalar& tau, RealScalar& beta) const; - template - void applyHouseholderOnTheLeft(const EssentialPart& essential, - const Scalar& tau, - Scalar* workspace); - template - void applyHouseholderOnTheRight(const EssentialPart& essential, - const Scalar& tau, - Scalar* workspace); - -///////// Jacobi module ///////// - - template - EIGEN_DEVICE_FUNC - void applyOnTheLeft(Index p, Index q, const JacobiRotation& j); - template - EIGEN_DEVICE_FUNC - void applyOnTheRight(Index p, Index q, const JacobiRotation& j); - -///////// SparseCore module ///////// - - template - EIGEN_STRONG_INLINE const typename SparseMatrixBase::template CwiseProductDenseReturnType::Type - cwiseProduct(const SparseMatrixBase &other) const - { - return other.cwiseProduct(derived()); - } - -///////// MatrixFunctions module ///////// - - typedef typename internal::stem_function::type StemFunction; - const MatrixExponentialReturnValue exp() const; - const MatrixFunctionReturnValue matrixFunction(StemFunction f) const; - const MatrixFunctionReturnValue cosh() const; - const MatrixFunctionReturnValue sinh() const; - const MatrixFunctionReturnValue cos() const; - const MatrixFunctionReturnValue sin() const; - const MatrixSquareRootReturnValue sqrt() const; - const MatrixLogarithmReturnValue log() const; - const MatrixPowerReturnValue pow(const RealScalar& p) const; - const MatrixComplexPowerReturnValue pow(const std::complex& p) const; - - protected: - EIGEN_DEVICE_FUNC MatrixBase() : Base() {} - - private: - EIGEN_DEVICE_FUNC explicit MatrixBase(int); - EIGEN_DEVICE_FUNC MatrixBase(int,int); - template EIGEN_DEVICE_FUNC explicit MatrixBase(const MatrixBase&); - protected: - // mixing arrays and matrices is not legal - template Derived& operator+=(const ArrayBase& ) - {EIGEN_STATIC_ASSERT(std::ptrdiff_t(sizeof(typename OtherDerived::Scalar))==-1,YOU_CANNOT_MIX_ARRAYS_AND_MATRICES); return *this;} - // mixing arrays and matrices is not legal - template Derived& operator-=(const ArrayBase& ) - {EIGEN_STATIC_ASSERT(std::ptrdiff_t(sizeof(typename OtherDerived::Scalar))==-1,YOU_CANNOT_MIX_ARRAYS_AND_MATRICES); return *this;} -}; - - -/*************************************************************************** -* Implementation of matrix base methods -***************************************************************************/ - -/** replaces \c *this by \c *this * \a other. - * - * \returns a reference to \c *this - * - * Example: \include MatrixBase_applyOnTheRight.cpp - * Output: \verbinclude MatrixBase_applyOnTheRight.out - */ -template -template -inline Derived& -MatrixBase::operator*=(const EigenBase &other) -{ - other.derived().applyThisOnTheRight(derived()); - return derived(); -} - -/** replaces \c *this by \c *this * \a other. It is equivalent to MatrixBase::operator*=(). - * - * Example: \include MatrixBase_applyOnTheRight.cpp - * Output: \verbinclude MatrixBase_applyOnTheRight.out - */ -template -template -inline void MatrixBase::applyOnTheRight(const EigenBase &other) -{ - other.derived().applyThisOnTheRight(derived()); -} - -/** replaces \c *this by \a other * \c *this. - * - * Example: \include MatrixBase_applyOnTheLeft.cpp - * Output: \verbinclude MatrixBase_applyOnTheLeft.out - */ -template -template -inline void MatrixBase::applyOnTheLeft(const EigenBase &other) -{ - other.derived().applyThisOnTheLeft(derived()); -} - -} // end namespace Eigen - -#endif // EIGEN_MATRIXBASE_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/NestByValue.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/NestByValue.h deleted file mode 100644 index 01cf192e..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/NestByValue.h +++ /dev/null @@ -1,110 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// Copyright (C) 2006-2008 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_NESTBYVALUE_H -#define EIGEN_NESTBYVALUE_H - -namespace Eigen { - -namespace internal { -template -struct traits > : public traits -{}; -} - -/** \class NestByValue - * \ingroup Core_Module - * - * \brief Expression which must be nested by value - * - * \tparam ExpressionType the type of the object of which we are requiring nesting-by-value - * - * This class is the return type of MatrixBase::nestByValue() - * and most of the time this is the only way it is used. - * - * \sa MatrixBase::nestByValue() - */ -template class NestByValue - : public internal::dense_xpr_base< NestByValue >::type -{ - public: - - typedef typename internal::dense_xpr_base::type Base; - EIGEN_DENSE_PUBLIC_INTERFACE(NestByValue) - - EIGEN_DEVICE_FUNC explicit inline NestByValue(const ExpressionType& matrix) : m_expression(matrix) {} - - EIGEN_DEVICE_FUNC inline Index rows() const { return m_expression.rows(); } - EIGEN_DEVICE_FUNC inline Index cols() const { return m_expression.cols(); } - EIGEN_DEVICE_FUNC inline Index outerStride() const { return m_expression.outerStride(); } - EIGEN_DEVICE_FUNC inline Index innerStride() const { return m_expression.innerStride(); } - - EIGEN_DEVICE_FUNC inline const CoeffReturnType coeff(Index row, Index col) const - { - return m_expression.coeff(row, col); - } - - EIGEN_DEVICE_FUNC inline Scalar& coeffRef(Index row, Index col) - { - return m_expression.const_cast_derived().coeffRef(row, col); - } - - EIGEN_DEVICE_FUNC inline const CoeffReturnType coeff(Index index) const - { - return m_expression.coeff(index); - } - - EIGEN_DEVICE_FUNC inline Scalar& coeffRef(Index index) - { - return m_expression.const_cast_derived().coeffRef(index); - } - - template - EIGEN_DEVICE_FUNC inline const PacketScalar packet(Index row, Index col) const - { - return m_expression.template packet(row, col); - } - - template - EIGEN_DEVICE_FUNC inline void writePacket(Index row, Index col, const PacketScalar& x) - { - m_expression.const_cast_derived().template writePacket(row, col, x); - } - - template - EIGEN_DEVICE_FUNC inline const PacketScalar packet(Index index) const - { - return m_expression.template packet(index); - } - - template - EIGEN_DEVICE_FUNC inline void writePacket(Index index, const PacketScalar& x) - { - m_expression.const_cast_derived().template writePacket(index, x); - } - - EIGEN_DEVICE_FUNC operator const ExpressionType&() const { return m_expression; } - - protected: - const ExpressionType m_expression; -}; - -/** \returns an expression of the temporary version of *this. - */ -template -EIGEN_DEVICE_FUNC inline const NestByValue -DenseBase::nestByValue() const -{ - return NestByValue(derived()); -} - -} // end namespace Eigen - -#endif // EIGEN_NESTBYVALUE_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/NoAlias.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/NoAlias.h deleted file mode 100644 index e94c8ee9..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/NoAlias.h +++ /dev/null @@ -1,109 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_NOALIAS_H -#define EIGEN_NOALIAS_H - -namespace Eigen { - -/** \class NoAlias - * \ingroup Core_Module - * - * \brief Pseudo expression providing an operator = assuming no aliasing - * - * \tparam ExpressionType the type of the object on which to do the lazy assignment - * - * This class represents an expression with special assignment operators - * assuming no aliasing between the target expression and the source expression. - * More precisely it alloas to bypass the EvalBeforeAssignBit flag of the source expression. - * It is the return type of MatrixBase::noalias() - * and most of the time this is the only way it is used. - * - * \sa MatrixBase::noalias() - */ -template class StorageBase> -class NoAlias -{ - public: - typedef typename ExpressionType::Scalar Scalar; - - EIGEN_DEVICE_FUNC - explicit NoAlias(ExpressionType& expression) : m_expression(expression) {} - - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE ExpressionType& operator=(const StorageBase& other) - { - call_assignment_no_alias(m_expression, other.derived(), internal::assign_op()); - return m_expression; - } - - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE ExpressionType& operator+=(const StorageBase& other) - { - call_assignment_no_alias(m_expression, other.derived(), internal::add_assign_op()); - return m_expression; - } - - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE ExpressionType& operator-=(const StorageBase& other) - { - call_assignment_no_alias(m_expression, other.derived(), internal::sub_assign_op()); - return m_expression; - } - - EIGEN_DEVICE_FUNC - ExpressionType& expression() const - { - return m_expression; - } - - protected: - ExpressionType& m_expression; -}; - -/** \returns a pseudo expression of \c *this with an operator= assuming - * no aliasing between \c *this and the source expression. - * - * More precisely, noalias() allows to bypass the EvalBeforeAssignBit flag. - * Currently, even though several expressions may alias, only product - * expressions have this flag. Therefore, noalias() is only usefull when - * the source expression contains a matrix product. - * - * Here are some examples where noalias is usefull: - * \code - * D.noalias() = A * B; - * D.noalias() += A.transpose() * B; - * D.noalias() -= 2 * A * B.adjoint(); - * \endcode - * - * On the other hand the following example will lead to a \b wrong result: - * \code - * A.noalias() = A * B; - * \endcode - * because the result matrix A is also an operand of the matrix product. Therefore, - * there is no alternative than evaluating A * B in a temporary, that is the default - * behavior when you write: - * \code - * A = A * B; - * \endcode - * - * \sa class NoAlias - */ -template -NoAlias EIGEN_DEVICE_FUNC MatrixBase::noalias() -{ - return NoAlias(derived()); -} - -} // end namespace Eigen - -#endif // EIGEN_NOALIAS_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/NumTraits.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/NumTraits.h deleted file mode 100644 index 92a9ae1e..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/NumTraits.h +++ /dev/null @@ -1,248 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2010 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_NUMTRAITS_H -#define EIGEN_NUMTRAITS_H - -namespace Eigen { - -namespace internal { - -// default implementation of digits10(), based on numeric_limits if specialized, -// 0 for integer types, and log10(epsilon()) otherwise. -template< typename T, - bool use_numeric_limits = std::numeric_limits::is_specialized, - bool is_integer = NumTraits::IsInteger> -struct default_digits10_impl -{ - static int run() { return std::numeric_limits::digits10; } -}; - -template -struct default_digits10_impl // Floating point -{ - static int run() { - using std::log10; - using std::ceil; - typedef typename NumTraits::Real Real; - return int(ceil(-log10(NumTraits::epsilon()))); - } -}; - -template -struct default_digits10_impl // Integer -{ - static int run() { return 0; } -}; - -} // end namespace internal - -/** \class NumTraits - * \ingroup Core_Module - * - * \brief Holds information about the various numeric (i.e. scalar) types allowed by Eigen. - * - * \tparam T the numeric type at hand - * - * This class stores enums, typedefs and static methods giving information about a numeric type. - * - * The provided data consists of: - * \li A typedef \c Real, giving the "real part" type of \a T. If \a T is already real, - * then \c Real is just a typedef to \a T. If \a T is \c std::complex then \c Real - * is a typedef to \a U. - * \li A typedef \c NonInteger, giving the type that should be used for operations producing non-integral values, - * such as quotients, square roots, etc. If \a T is a floating-point type, then this typedef just gives - * \a T again. Note however that many Eigen functions such as internal::sqrt simply refuse to - * take integers. Outside of a few cases, Eigen doesn't do automatic type promotion. Thus, this typedef is - * only intended as a helper for code that needs to explicitly promote types. - * \li A typedef \c Literal giving the type to use for numeric literals such as "2" or "0.5". For instance, for \c std::complex, Literal is defined as \c U. - * Of course, this type must be fully compatible with \a T. In doubt, just use \a T here. - * \li A typedef \a Nested giving the type to use to nest a value inside of the expression tree. If you don't know what - * this means, just use \a T here. - * \li An enum value \a IsComplex. It is equal to 1 if \a T is a \c std::complex - * type, and to 0 otherwise. - * \li An enum value \a IsInteger. It is equal to \c 1 if \a T is an integer type such as \c int, - * and to \c 0 otherwise. - * \li Enum values ReadCost, AddCost and MulCost representing a rough estimate of the number of CPU cycles needed - * to by move / add / mul instructions respectively, assuming the data is already stored in CPU registers. - * Stay vague here. No need to do architecture-specific stuff. If you don't know what this means, just use \c Eigen::HugeCost. - * \li An enum value \a IsSigned. It is equal to \c 1 if \a T is a signed type and to 0 if \a T is unsigned. - * \li An enum value \a RequireInitialization. It is equal to \c 1 if the constructor of the numeric type \a T must - * be called, and to 0 if it is safe not to call it. Default is 0 if \a T is an arithmetic type, and 1 otherwise. - * \li An epsilon() function which, unlike std::numeric_limits::epsilon(), - * it returns a \a Real instead of a \a T. - * \li A dummy_precision() function returning a weak epsilon value. It is mainly used as a default - * value by the fuzzy comparison operators. - * \li highest() and lowest() functions returning the highest and lowest possible values respectively. - * \li digits10() function returning the number of decimal digits that can be represented without change. This is - * the analogue of std::numeric_limits::digits10 - * which is used as the default implementation if specialized. - */ - -template struct GenericNumTraits -{ - enum { - IsInteger = std::numeric_limits::is_integer, - IsSigned = std::numeric_limits::is_signed, - IsComplex = 0, - RequireInitialization = internal::is_arithmetic::value ? 0 : 1, - ReadCost = 1, - AddCost = 1, - MulCost = 1 - }; - - typedef T Real; - typedef typename internal::conditional< - IsInteger, - typename internal::conditional::type, - T - >::type NonInteger; - typedef T Nested; - typedef T Literal; - - EIGEN_DEVICE_FUNC - static inline Real epsilon() - { - return numext::numeric_limits::epsilon(); - } - - EIGEN_DEVICE_FUNC - static inline int digits10() - { - return internal::default_digits10_impl::run(); - } - - EIGEN_DEVICE_FUNC - static inline Real dummy_precision() - { - // make sure to override this for floating-point types - return Real(0); - } - - - EIGEN_DEVICE_FUNC - static inline T highest() { - return (numext::numeric_limits::max)(); - } - - EIGEN_DEVICE_FUNC - static inline T lowest() { - return IsInteger ? (numext::numeric_limits::min)() : (-(numext::numeric_limits::max)()); - } - - EIGEN_DEVICE_FUNC - static inline T infinity() { - return numext::numeric_limits::infinity(); - } - - EIGEN_DEVICE_FUNC - static inline T quiet_NaN() { - return numext::numeric_limits::quiet_NaN(); - } -}; - -template struct NumTraits : GenericNumTraits -{}; - -template<> struct NumTraits - : GenericNumTraits -{ - EIGEN_DEVICE_FUNC - static inline float dummy_precision() { return 1e-5f; } -}; - -template<> struct NumTraits : GenericNumTraits -{ - EIGEN_DEVICE_FUNC - static inline double dummy_precision() { return 1e-12; } -}; - -template<> struct NumTraits - : GenericNumTraits -{ - static inline long double dummy_precision() { return 1e-15l; } -}; - -template struct NumTraits > - : GenericNumTraits > -{ - typedef _Real Real; - typedef typename NumTraits<_Real>::Literal Literal; - enum { - IsComplex = 1, - RequireInitialization = NumTraits<_Real>::RequireInitialization, - ReadCost = 2 * NumTraits<_Real>::ReadCost, - AddCost = 2 * NumTraits::AddCost, - MulCost = 4 * NumTraits::MulCost + 2 * NumTraits::AddCost - }; - - EIGEN_DEVICE_FUNC - static inline Real epsilon() { return NumTraits::epsilon(); } - EIGEN_DEVICE_FUNC - static inline Real dummy_precision() { return NumTraits::dummy_precision(); } - EIGEN_DEVICE_FUNC - static inline int digits10() { return NumTraits::digits10(); } -}; - -template -struct NumTraits > -{ - typedef Array ArrayType; - typedef typename NumTraits::Real RealScalar; - typedef Array Real; - typedef typename NumTraits::NonInteger NonIntegerScalar; - typedef Array NonInteger; - typedef ArrayType & Nested; - typedef typename NumTraits::Literal Literal; - - enum { - IsComplex = NumTraits::IsComplex, - IsInteger = NumTraits::IsInteger, - IsSigned = NumTraits::IsSigned, - RequireInitialization = 1, - ReadCost = ArrayType::SizeAtCompileTime==Dynamic ? HugeCost : ArrayType::SizeAtCompileTime * NumTraits::ReadCost, - AddCost = ArrayType::SizeAtCompileTime==Dynamic ? HugeCost : ArrayType::SizeAtCompileTime * NumTraits::AddCost, - MulCost = ArrayType::SizeAtCompileTime==Dynamic ? HugeCost : ArrayType::SizeAtCompileTime * NumTraits::MulCost - }; - - EIGEN_DEVICE_FUNC - static inline RealScalar epsilon() { return NumTraits::epsilon(); } - EIGEN_DEVICE_FUNC - static inline RealScalar dummy_precision() { return NumTraits::dummy_precision(); } - - static inline int digits10() { return NumTraits::digits10(); } -}; - -template<> struct NumTraits - : GenericNumTraits -{ - enum { - RequireInitialization = 1, - ReadCost = HugeCost, - AddCost = HugeCost, - MulCost = HugeCost - }; - - static inline int digits10() { return 0; } - -private: - static inline std::string epsilon(); - static inline std::string dummy_precision(); - static inline std::string lowest(); - static inline std::string highest(); - static inline std::string infinity(); - static inline std::string quiet_NaN(); -}; - -// Empty specialization for void to allow template specialization based on NumTraits::Real with T==void and SFINAE. -template<> struct NumTraits {}; - -} // end namespace Eigen - -#endif // EIGEN_NUMTRAITS_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/PermutationMatrix.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/PermutationMatrix.h deleted file mode 100644 index b1fb455b..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/PermutationMatrix.h +++ /dev/null @@ -1,633 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009 Benoit Jacob -// Copyright (C) 2009-2015 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_PERMUTATIONMATRIX_H -#define EIGEN_PERMUTATIONMATRIX_H - -namespace Eigen { - -namespace internal { - -enum PermPermProduct_t {PermPermProduct}; - -} // end namespace internal - -/** \class PermutationBase - * \ingroup Core_Module - * - * \brief Base class for permutations - * - * \tparam Derived the derived class - * - * This class is the base class for all expressions representing a permutation matrix, - * internally stored as a vector of integers. - * The convention followed here is that if \f$ \sigma \f$ is a permutation, the corresponding permutation matrix - * \f$ P_\sigma \f$ is such that if \f$ (e_1,\ldots,e_p) \f$ is the canonical basis, we have: - * \f[ P_\sigma(e_i) = e_{\sigma(i)}. \f] - * This convention ensures that for any two permutations \f$ \sigma, \tau \f$, we have: - * \f[ P_{\sigma\circ\tau} = P_\sigma P_\tau. \f] - * - * Permutation matrices are square and invertible. - * - * Notice that in addition to the member functions and operators listed here, there also are non-member - * operator* to multiply any kind of permutation object with any kind of matrix expression (MatrixBase) - * on either side. - * - * \sa class PermutationMatrix, class PermutationWrapper - */ -template -class PermutationBase : public EigenBase -{ - typedef internal::traits Traits; - typedef EigenBase Base; - public: - - #ifndef EIGEN_PARSED_BY_DOXYGEN - typedef typename Traits::IndicesType IndicesType; - enum { - Flags = Traits::Flags, - RowsAtCompileTime = Traits::RowsAtCompileTime, - ColsAtCompileTime = Traits::ColsAtCompileTime, - MaxRowsAtCompileTime = Traits::MaxRowsAtCompileTime, - MaxColsAtCompileTime = Traits::MaxColsAtCompileTime - }; - typedef typename Traits::StorageIndex StorageIndex; - typedef Matrix - DenseMatrixType; - typedef PermutationMatrix - PlainPermutationType; - typedef PlainPermutationType PlainObject; - using Base::derived; - typedef Inverse InverseReturnType; - typedef void Scalar; - #endif - - /** Copies the other permutation into *this */ - template - Derived& operator=(const PermutationBase& other) - { - indices() = other.indices(); - return derived(); - } - - /** Assignment from the Transpositions \a tr */ - template - Derived& operator=(const TranspositionsBase& tr) - { - setIdentity(tr.size()); - for(Index k=size()-1; k>=0; --k) - applyTranspositionOnTheRight(k,tr.coeff(k)); - return derived(); - } - - #ifndef EIGEN_PARSED_BY_DOXYGEN - /** This is a special case of the templated operator=. Its purpose is to - * prevent a default operator= from hiding the templated operator=. - */ - Derived& operator=(const PermutationBase& other) - { - indices() = other.indices(); - return derived(); - } - #endif - - /** \returns the number of rows */ - inline Index rows() const { return Index(indices().size()); } - - /** \returns the number of columns */ - inline Index cols() const { return Index(indices().size()); } - - /** \returns the size of a side of the respective square matrix, i.e., the number of indices */ - inline Index size() const { return Index(indices().size()); } - - #ifndef EIGEN_PARSED_BY_DOXYGEN - template - void evalTo(MatrixBase& other) const - { - other.setZero(); - for (Index i=0; i=0 && j>=0 && i=0 && j>=0 && i - void assignTranspose(const PermutationBase& other) - { - for (Index i=0; i - void assignProduct(const Lhs& lhs, const Rhs& rhs) - { - eigen_assert(lhs.cols() == rhs.rows()); - for (Index i=0; i - inline PlainPermutationType operator*(const PermutationBase& other) const - { return PlainPermutationType(internal::PermPermProduct, derived(), other.derived()); } - - /** \returns the product of a permutation with another inverse permutation. - * - * \note \blank \note_try_to_help_rvo - */ - template - inline PlainPermutationType operator*(const InverseImpl& other) const - { return PlainPermutationType(internal::PermPermProduct, *this, other.eval()); } - - /** \returns the product of an inverse permutation with another permutation. - * - * \note \blank \note_try_to_help_rvo - */ - template friend - inline PlainPermutationType operator*(const InverseImpl& other, const PermutationBase& perm) - { return PlainPermutationType(internal::PermPermProduct, other.eval(), perm); } - - /** \returns the determinant of the permutation matrix, which is either 1 or -1 depending on the parity of the permutation. - * - * This function is O(\c n) procedure allocating a buffer of \c n booleans. - */ - Index determinant() const - { - Index res = 1; - Index n = size(); - Matrix mask(n); - mask.fill(false); - Index r = 0; - while(r < n) - { - // search for the next seed - while(r=n) - break; - // we got one, let's follow it until we are back to the seed - Index k0 = r++; - mask.coeffRef(k0) = true; - for(Index k=indices().coeff(k0); k!=k0; k=indices().coeff(k)) - { - mask.coeffRef(k) = true; - res = -res; - } - } - return res; - } - - protected: - -}; - -namespace internal { -template -struct traits > - : traits > -{ - typedef PermutationStorage StorageKind; - typedef Matrix<_StorageIndex, SizeAtCompileTime, 1, 0, MaxSizeAtCompileTime, 1> IndicesType; - typedef _StorageIndex StorageIndex; - typedef void Scalar; -}; -} - -/** \class PermutationMatrix - * \ingroup Core_Module - * - * \brief Permutation matrix - * - * \tparam SizeAtCompileTime the number of rows/cols, or Dynamic - * \tparam MaxSizeAtCompileTime the maximum number of rows/cols, or Dynamic. This optional parameter defaults to SizeAtCompileTime. Most of the time, you should not have to specify it. - * \tparam _StorageIndex the integer type of the indices - * - * This class represents a permutation matrix, internally stored as a vector of integers. - * - * \sa class PermutationBase, class PermutationWrapper, class DiagonalMatrix - */ -template -class PermutationMatrix : public PermutationBase > -{ - typedef PermutationBase Base; - typedef internal::traits Traits; - public: - - typedef const PermutationMatrix& Nested; - - #ifndef EIGEN_PARSED_BY_DOXYGEN - typedef typename Traits::IndicesType IndicesType; - typedef typename Traits::StorageIndex StorageIndex; - #endif - - inline PermutationMatrix() - {} - - /** Constructs an uninitialized permutation matrix of given size. - */ - explicit inline PermutationMatrix(Index size) : m_indices(size) - { - eigen_internal_assert(size <= NumTraits::highest()); - } - - /** Copy constructor. */ - template - inline PermutationMatrix(const PermutationBase& other) - : m_indices(other.indices()) {} - - #ifndef EIGEN_PARSED_BY_DOXYGEN - /** Standard copy constructor. Defined only to prevent a default copy constructor - * from hiding the other templated constructor */ - inline PermutationMatrix(const PermutationMatrix& other) : m_indices(other.indices()) {} - #endif - - /** Generic constructor from expression of the indices. The indices - * array has the meaning that the permutations sends each integer i to indices[i]. - * - * \warning It is your responsibility to check that the indices array that you passes actually - * describes a permutation, i.e., each value between 0 and n-1 occurs exactly once, where n is the - * array's size. - */ - template - explicit inline PermutationMatrix(const MatrixBase& indices) : m_indices(indices) - {} - - /** Convert the Transpositions \a tr to a permutation matrix */ - template - explicit PermutationMatrix(const TranspositionsBase& tr) - : m_indices(tr.size()) - { - *this = tr; - } - - /** Copies the other permutation into *this */ - template - PermutationMatrix& operator=(const PermutationBase& other) - { - m_indices = other.indices(); - return *this; - } - - /** Assignment from the Transpositions \a tr */ - template - PermutationMatrix& operator=(const TranspositionsBase& tr) - { - return Base::operator=(tr.derived()); - } - - #ifndef EIGEN_PARSED_BY_DOXYGEN - /** This is a special case of the templated operator=. Its purpose is to - * prevent a default operator= from hiding the templated operator=. - */ - PermutationMatrix& operator=(const PermutationMatrix& other) - { - m_indices = other.m_indices; - return *this; - } - #endif - - /** const version of indices(). */ - const IndicesType& indices() const { return m_indices; } - /** \returns a reference to the stored array representing the permutation. */ - IndicesType& indices() { return m_indices; } - - - /**** multiplication helpers to hopefully get RVO ****/ - -#ifndef EIGEN_PARSED_BY_DOXYGEN - template - PermutationMatrix(const InverseImpl& other) - : m_indices(other.derived().nestedExpression().size()) - { - eigen_internal_assert(m_indices.size() <= NumTraits::highest()); - StorageIndex end = StorageIndex(m_indices.size()); - for (StorageIndex i=0; i - PermutationMatrix(internal::PermPermProduct_t, const Lhs& lhs, const Rhs& rhs) - : m_indices(lhs.indices().size()) - { - Base::assignProduct(lhs,rhs); - } -#endif - - protected: - - IndicesType m_indices; -}; - - -namespace internal { -template -struct traits,_PacketAccess> > - : traits > -{ - typedef PermutationStorage StorageKind; - typedef Map, _PacketAccess> IndicesType; - typedef _StorageIndex StorageIndex; - typedef void Scalar; -}; -} - -template -class Map,_PacketAccess> - : public PermutationBase,_PacketAccess> > -{ - typedef PermutationBase Base; - typedef internal::traits Traits; - public: - - #ifndef EIGEN_PARSED_BY_DOXYGEN - typedef typename Traits::IndicesType IndicesType; - typedef typename IndicesType::Scalar StorageIndex; - #endif - - inline Map(const StorageIndex* indicesPtr) - : m_indices(indicesPtr) - {} - - inline Map(const StorageIndex* indicesPtr, Index size) - : m_indices(indicesPtr,size) - {} - - /** Copies the other permutation into *this */ - template - Map& operator=(const PermutationBase& other) - { return Base::operator=(other.derived()); } - - /** Assignment from the Transpositions \a tr */ - template - Map& operator=(const TranspositionsBase& tr) - { return Base::operator=(tr.derived()); } - - #ifndef EIGEN_PARSED_BY_DOXYGEN - /** This is a special case of the templated operator=. Its purpose is to - * prevent a default operator= from hiding the templated operator=. - */ - Map& operator=(const Map& other) - { - m_indices = other.m_indices; - return *this; - } - #endif - - /** const version of indices(). */ - const IndicesType& indices() const { return m_indices; } - /** \returns a reference to the stored array representing the permutation. */ - IndicesType& indices() { return m_indices; } - - protected: - - IndicesType m_indices; -}; - -template class TranspositionsWrapper; -namespace internal { -template -struct traits > -{ - typedef PermutationStorage StorageKind; - typedef void Scalar; - typedef typename _IndicesType::Scalar StorageIndex; - typedef _IndicesType IndicesType; - enum { - RowsAtCompileTime = _IndicesType::SizeAtCompileTime, - ColsAtCompileTime = _IndicesType::SizeAtCompileTime, - MaxRowsAtCompileTime = IndicesType::MaxSizeAtCompileTime, - MaxColsAtCompileTime = IndicesType::MaxSizeAtCompileTime, - Flags = 0 - }; -}; -} - -/** \class PermutationWrapper - * \ingroup Core_Module - * - * \brief Class to view a vector of integers as a permutation matrix - * - * \tparam _IndicesType the type of the vector of integer (can be any compatible expression) - * - * This class allows to view any vector expression of integers as a permutation matrix. - * - * \sa class PermutationBase, class PermutationMatrix - */ -template -class PermutationWrapper : public PermutationBase > -{ - typedef PermutationBase Base; - typedef internal::traits Traits; - public: - - #ifndef EIGEN_PARSED_BY_DOXYGEN - typedef typename Traits::IndicesType IndicesType; - #endif - - inline PermutationWrapper(const IndicesType& indices) - : m_indices(indices) - {} - - /** const version of indices(). */ - const typename internal::remove_all::type& - indices() const { return m_indices; } - - protected: - - typename IndicesType::Nested m_indices; -}; - - -/** \returns the matrix with the permutation applied to the columns. - */ -template -EIGEN_DEVICE_FUNC -const Product -operator*(const MatrixBase &matrix, - const PermutationBase& permutation) -{ - return Product - (matrix.derived(), permutation.derived()); -} - -/** \returns the matrix with the permutation applied to the rows. - */ -template -EIGEN_DEVICE_FUNC -const Product -operator*(const PermutationBase &permutation, - const MatrixBase& matrix) -{ - return Product - (permutation.derived(), matrix.derived()); -} - - -template -class InverseImpl - : public EigenBase > -{ - typedef typename PermutationType::PlainPermutationType PlainPermutationType; - typedef internal::traits PermTraits; - protected: - InverseImpl() {} - public: - typedef Inverse InverseType; - using EigenBase >::derived; - - #ifndef EIGEN_PARSED_BY_DOXYGEN - typedef typename PermutationType::DenseMatrixType DenseMatrixType; - enum { - RowsAtCompileTime = PermTraits::RowsAtCompileTime, - ColsAtCompileTime = PermTraits::ColsAtCompileTime, - MaxRowsAtCompileTime = PermTraits::MaxRowsAtCompileTime, - MaxColsAtCompileTime = PermTraits::MaxColsAtCompileTime - }; - #endif - - #ifndef EIGEN_PARSED_BY_DOXYGEN - template - void evalTo(MatrixBase& other) const - { - other.setZero(); - for (Index i=0; i friend - const Product - operator*(const MatrixBase& matrix, const InverseType& trPerm) - { - return Product(matrix.derived(), trPerm.derived()); - } - - /** \returns the matrix with the inverse permutation applied to the rows. - */ - template - const Product - operator*(const MatrixBase& matrix) const - { - return Product(derived(), matrix.derived()); - } -}; - -template -const PermutationWrapper MatrixBase::asPermutation() const -{ - return derived(); -} - -namespace internal { - -template<> struct AssignmentKind { typedef EigenBase2EigenBase Kind; }; - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_PERMUTATIONMATRIX_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/PlainObjectBase.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/PlainObjectBase.h deleted file mode 100644 index 1dc7e223..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/PlainObjectBase.h +++ /dev/null @@ -1,1035 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2009 Gael Guennebaud -// Copyright (C) 2006-2008 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_DENSESTORAGEBASE_H -#define EIGEN_DENSESTORAGEBASE_H - -#if defined(EIGEN_INITIALIZE_MATRICES_BY_ZERO) -# define EIGEN_INITIALIZE_COEFFS -# define EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED for(int i=0;i::quiet_NaN(); -#else -# undef EIGEN_INITIALIZE_COEFFS -# define EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED -#endif - -namespace Eigen { - -namespace internal { - -template struct check_rows_cols_for_overflow { - template - EIGEN_DEVICE_FUNC - static EIGEN_ALWAYS_INLINE void run(Index, Index) - { - } -}; - -template<> struct check_rows_cols_for_overflow { - template - EIGEN_DEVICE_FUNC - static EIGEN_ALWAYS_INLINE void run(Index rows, Index cols) - { - // http://hg.mozilla.org/mozilla-central/file/6c8a909977d3/xpcom/ds/CheckedInt.h#l242 - // we assume Index is signed - Index max_index = (std::size_t(1) << (8 * sizeof(Index) - 1)) - 1; // assume Index is signed - bool error = (rows == 0 || cols == 0) ? false - : (rows > max_index / cols); - if (error) - throw_std_bad_alloc(); - } -}; - -template -struct conservative_resize_like_impl; - -template struct matrix_swap_impl; - -} // end namespace internal - -#ifdef EIGEN_PARSED_BY_DOXYGEN -namespace doxygen { - -// This is a workaround to doxygen not being able to understand the inheritance logic -// when it is hidden by the dense_xpr_base helper struct. -// Moreover, doxygen fails to include members that are not documented in the declaration body of -// MatrixBase if we inherits MatrixBase >, -// this is why we simply inherits MatrixBase, though this does not make sense. - -/** This class is just a workaround for Doxygen and it does not not actually exist. */ -template struct dense_xpr_base_dispatcher; -/** This class is just a workaround for Doxygen and it does not not actually exist. */ -template -struct dense_xpr_base_dispatcher > - : public MatrixBase {}; -/** This class is just a workaround for Doxygen and it does not not actually exist. */ -template -struct dense_xpr_base_dispatcher > - : public ArrayBase {}; - -} // namespace doxygen - -/** \class PlainObjectBase - * \ingroup Core_Module - * \brief %Dense storage base class for matrices and arrays. - * - * This class can be extended with the help of the plugin mechanism described on the page - * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_PLAINOBJECTBASE_PLUGIN. - * - * \tparam Derived is the derived type, e.g., a Matrix or Array - * - * \sa \ref TopicClassHierarchy - */ -template -class PlainObjectBase : public doxygen::dense_xpr_base_dispatcher -#else -template -class PlainObjectBase : public internal::dense_xpr_base::type -#endif -{ - public: - enum { Options = internal::traits::Options }; - typedef typename internal::dense_xpr_base::type Base; - - typedef typename internal::traits::StorageKind StorageKind; - typedef typename internal::traits::Scalar Scalar; - - typedef typename internal::packet_traits::type PacketScalar; - typedef typename NumTraits::Real RealScalar; - typedef Derived DenseType; - - using Base::RowsAtCompileTime; - using Base::ColsAtCompileTime; - using Base::SizeAtCompileTime; - using Base::MaxRowsAtCompileTime; - using Base::MaxColsAtCompileTime; - using Base::MaxSizeAtCompileTime; - using Base::IsVectorAtCompileTime; - using Base::Flags; - - template friend class Eigen::Map; - friend class Eigen::Map; - typedef Eigen::Map MapType; - friend class Eigen::Map; - typedef const Eigen::Map ConstMapType; -#if EIGEN_MAX_ALIGN_BYTES>0 - // for EIGEN_MAX_ALIGN_BYTES==0, AlignedMax==Unaligned, and many compilers generate warnings for friend-ing a class twice. - friend class Eigen::Map; - friend class Eigen::Map; -#endif - typedef Eigen::Map AlignedMapType; - typedef const Eigen::Map ConstAlignedMapType; - template struct StridedMapType { typedef Eigen::Map type; }; - template struct StridedConstMapType { typedef Eigen::Map type; }; - template struct StridedAlignedMapType { typedef Eigen::Map type; }; - template struct StridedConstAlignedMapType { typedef Eigen::Map type; }; - - protected: - DenseStorage m_storage; - - public: - enum { NeedsToAlign = (SizeAtCompileTime != Dynamic) && (internal::traits::Alignment>0) }; - EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(NeedsToAlign) - - EIGEN_DEVICE_FUNC - Base& base() { return *static_cast(this); } - EIGEN_DEVICE_FUNC - const Base& base() const { return *static_cast(this); } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Index rows() const { return m_storage.rows(); } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Index cols() const { return m_storage.cols(); } - - /** This is an overloaded version of DenseCoeffsBase::coeff(Index,Index) const - * provided to by-pass the creation of an evaluator of the expression, thus saving compilation efforts. - * - * See DenseCoeffsBase::coeff(Index) const for details. */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const Scalar& coeff(Index rowId, Index colId) const - { - if(Flags & RowMajorBit) - return m_storage.data()[colId + rowId * m_storage.cols()]; - else // column-major - return m_storage.data()[rowId + colId * m_storage.rows()]; - } - - /** This is an overloaded version of DenseCoeffsBase::coeff(Index) const - * provided to by-pass the creation of an evaluator of the expression, thus saving compilation efforts. - * - * See DenseCoeffsBase::coeff(Index) const for details. */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const Scalar& coeff(Index index) const - { - return m_storage.data()[index]; - } - - /** This is an overloaded version of DenseCoeffsBase::coeffRef(Index,Index) const - * provided to by-pass the creation of an evaluator of the expression, thus saving compilation efforts. - * - * See DenseCoeffsBase::coeffRef(Index,Index) const for details. */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& coeffRef(Index rowId, Index colId) - { - if(Flags & RowMajorBit) - return m_storage.data()[colId + rowId * m_storage.cols()]; - else // column-major - return m_storage.data()[rowId + colId * m_storage.rows()]; - } - - /** This is an overloaded version of DenseCoeffsBase::coeffRef(Index) const - * provided to by-pass the creation of an evaluator of the expression, thus saving compilation efforts. - * - * See DenseCoeffsBase::coeffRef(Index) const for details. */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& coeffRef(Index index) - { - return m_storage.data()[index]; - } - - /** This is the const version of coeffRef(Index,Index) which is thus synonym of coeff(Index,Index). - * It is provided for convenience. */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const Scalar& coeffRef(Index rowId, Index colId) const - { - if(Flags & RowMajorBit) - return m_storage.data()[colId + rowId * m_storage.cols()]; - else // column-major - return m_storage.data()[rowId + colId * m_storage.rows()]; - } - - /** This is the const version of coeffRef(Index) which is thus synonym of coeff(Index). - * It is provided for convenience. */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const Scalar& coeffRef(Index index) const - { - return m_storage.data()[index]; - } - - /** \internal */ - template - EIGEN_STRONG_INLINE PacketScalar packet(Index rowId, Index colId) const - { - return internal::ploadt - (m_storage.data() + (Flags & RowMajorBit - ? colId + rowId * m_storage.cols() - : rowId + colId * m_storage.rows())); - } - - /** \internal */ - template - EIGEN_STRONG_INLINE PacketScalar packet(Index index) const - { - return internal::ploadt(m_storage.data() + index); - } - - /** \internal */ - template - EIGEN_STRONG_INLINE void writePacket(Index rowId, Index colId, const PacketScalar& val) - { - internal::pstoret - (m_storage.data() + (Flags & RowMajorBit - ? colId + rowId * m_storage.cols() - : rowId + colId * m_storage.rows()), val); - } - - /** \internal */ - template - EIGEN_STRONG_INLINE void writePacket(Index index, const PacketScalar& val) - { - internal::pstoret(m_storage.data() + index, val); - } - - /** \returns a const pointer to the data array of this matrix */ - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar *data() const - { return m_storage.data(); } - - /** \returns a pointer to the data array of this matrix */ - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar *data() - { return m_storage.data(); } - - /** Resizes \c *this to a \a rows x \a cols matrix. - * - * This method is intended for dynamic-size matrices, although it is legal to call it on any - * matrix as long as fixed dimensions are left unchanged. If you only want to change the number - * of rows and/or of columns, you can use resize(NoChange_t, Index), resize(Index, NoChange_t). - * - * If the current number of coefficients of \c *this exactly matches the - * product \a rows * \a cols, then no memory allocation is performed and - * the current values are left unchanged. In all other cases, including - * shrinking, the data is reallocated and all previous values are lost. - * - * Example: \include Matrix_resize_int_int.cpp - * Output: \verbinclude Matrix_resize_int_int.out - * - * \sa resize(Index) for vectors, resize(NoChange_t, Index), resize(Index, NoChange_t) - */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void resize(Index rows, Index cols) - { - eigen_assert( EIGEN_IMPLIES(RowsAtCompileTime!=Dynamic,rows==RowsAtCompileTime) - && EIGEN_IMPLIES(ColsAtCompileTime!=Dynamic,cols==ColsAtCompileTime) - && EIGEN_IMPLIES(RowsAtCompileTime==Dynamic && MaxRowsAtCompileTime!=Dynamic,rows<=MaxRowsAtCompileTime) - && EIGEN_IMPLIES(ColsAtCompileTime==Dynamic && MaxColsAtCompileTime!=Dynamic,cols<=MaxColsAtCompileTime) - && rows>=0 && cols>=0 && "Invalid sizes when resizing a matrix or array."); - internal::check_rows_cols_for_overflow::run(rows, cols); - #ifdef EIGEN_INITIALIZE_COEFFS - Index size = rows*cols; - bool size_changed = size != this->size(); - m_storage.resize(size, rows, cols); - if(size_changed) EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED - #else - m_storage.resize(rows*cols, rows, cols); - #endif - } - - /** Resizes \c *this to a vector of length \a size - * - * \only_for_vectors. This method does not work for - * partially dynamic matrices when the static dimension is anything other - * than 1. For example it will not work with Matrix. - * - * Example: \include Matrix_resize_int.cpp - * Output: \verbinclude Matrix_resize_int.out - * - * \sa resize(Index,Index), resize(NoChange_t, Index), resize(Index, NoChange_t) - */ - EIGEN_DEVICE_FUNC - inline void resize(Index size) - { - EIGEN_STATIC_ASSERT_VECTOR_ONLY(PlainObjectBase) - eigen_assert(((SizeAtCompileTime == Dynamic && (MaxSizeAtCompileTime==Dynamic || size<=MaxSizeAtCompileTime)) || SizeAtCompileTime == size) && size>=0); - #ifdef EIGEN_INITIALIZE_COEFFS - bool size_changed = size != this->size(); - #endif - if(RowsAtCompileTime == 1) - m_storage.resize(size, 1, size); - else - m_storage.resize(size, size, 1); - #ifdef EIGEN_INITIALIZE_COEFFS - if(size_changed) EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED - #endif - } - - /** Resizes the matrix, changing only the number of columns. For the parameter of type NoChange_t, just pass the special value \c NoChange - * as in the example below. - * - * Example: \include Matrix_resize_NoChange_int.cpp - * Output: \verbinclude Matrix_resize_NoChange_int.out - * - * \sa resize(Index,Index) - */ - EIGEN_DEVICE_FUNC - inline void resize(NoChange_t, Index cols) - { - resize(rows(), cols); - } - - /** Resizes the matrix, changing only the number of rows. For the parameter of type NoChange_t, just pass the special value \c NoChange - * as in the example below. - * - * Example: \include Matrix_resize_int_NoChange.cpp - * Output: \verbinclude Matrix_resize_int_NoChange.out - * - * \sa resize(Index,Index) - */ - EIGEN_DEVICE_FUNC - inline void resize(Index rows, NoChange_t) - { - resize(rows, cols()); - } - - /** Resizes \c *this to have the same dimensions as \a other. - * Takes care of doing all the checking that's needed. - * - * Note that copying a row-vector into a vector (and conversely) is allowed. - * The resizing, if any, is then done in the appropriate way so that row-vectors - * remain row-vectors and vectors remain vectors. - */ - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void resizeLike(const EigenBase& _other) - { - const OtherDerived& other = _other.derived(); - internal::check_rows_cols_for_overflow::run(other.rows(), other.cols()); - const Index othersize = other.rows()*other.cols(); - if(RowsAtCompileTime == 1) - { - eigen_assert(other.rows() == 1 || other.cols() == 1); - resize(1, othersize); - } - else if(ColsAtCompileTime == 1) - { - eigen_assert(other.rows() == 1 || other.cols() == 1); - resize(othersize, 1); - } - else resize(other.rows(), other.cols()); - } - - /** Resizes the matrix to \a rows x \a cols while leaving old values untouched. - * - * The method is intended for matrices of dynamic size. If you only want to change the number - * of rows and/or of columns, you can use conservativeResize(NoChange_t, Index) or - * conservativeResize(Index, NoChange_t). - * - * Matrices are resized relative to the top-left element. In case values need to be - * appended to the matrix they will be uninitialized. - */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void conservativeResize(Index rows, Index cols) - { - internal::conservative_resize_like_impl::run(*this, rows, cols); - } - - /** Resizes the matrix to \a rows x \a cols while leaving old values untouched. - * - * As opposed to conservativeResize(Index rows, Index cols), this version leaves - * the number of columns unchanged. - * - * In case the matrix is growing, new rows will be uninitialized. - */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void conservativeResize(Index rows, NoChange_t) - { - // Note: see the comment in conservativeResize(Index,Index) - conservativeResize(rows, cols()); - } - - /** Resizes the matrix to \a rows x \a cols while leaving old values untouched. - * - * As opposed to conservativeResize(Index rows, Index cols), this version leaves - * the number of rows unchanged. - * - * In case the matrix is growing, new columns will be uninitialized. - */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void conservativeResize(NoChange_t, Index cols) - { - // Note: see the comment in conservativeResize(Index,Index) - conservativeResize(rows(), cols); - } - - /** Resizes the vector to \a size while retaining old values. - * - * \only_for_vectors. This method does not work for - * partially dynamic matrices when the static dimension is anything other - * than 1. For example it will not work with Matrix. - * - * When values are appended, they will be uninitialized. - */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void conservativeResize(Index size) - { - internal::conservative_resize_like_impl::run(*this, size); - } - - /** Resizes the matrix to \a rows x \a cols of \c other, while leaving old values untouched. - * - * The method is intended for matrices of dynamic size. If you only want to change the number - * of rows and/or of columns, you can use conservativeResize(NoChange_t, Index) or - * conservativeResize(Index, NoChange_t). - * - * Matrices are resized relative to the top-left element. In case values need to be - * appended to the matrix they will copied from \c other. - */ - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void conservativeResizeLike(const DenseBase& other) - { - internal::conservative_resize_like_impl::run(*this, other); - } - - /** This is a special case of the templated operator=. Its purpose is to - * prevent a default operator= from hiding the templated operator=. - */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Derived& operator=(const PlainObjectBase& other) - { - return _set(other); - } - - /** \sa MatrixBase::lazyAssign() */ - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Derived& lazyAssign(const DenseBase& other) - { - _resize_to_match(other); - return Base::lazyAssign(other.derived()); - } - - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Derived& operator=(const ReturnByValue& func) - { - resize(func.rows(), func.cols()); - return Base::operator=(func); - } - - // Prevent user from trying to instantiate PlainObjectBase objects - // by making all its constructor protected. See bug 1074. - protected: - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE PlainObjectBase() : m_storage() - { -// _check_template_params(); -// EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED - } - -#ifndef EIGEN_PARSED_BY_DOXYGEN - // FIXME is it still needed ? - /** \internal */ - EIGEN_DEVICE_FUNC - explicit PlainObjectBase(internal::constructor_without_unaligned_array_assert) - : m_storage(internal::constructor_without_unaligned_array_assert()) - { -// _check_template_params(); EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED - } -#endif - -#if EIGEN_HAS_RVALUE_REFERENCES - EIGEN_DEVICE_FUNC - PlainObjectBase(PlainObjectBase&& other) EIGEN_NOEXCEPT - : m_storage( std::move(other.m_storage) ) - { - } - - EIGEN_DEVICE_FUNC - PlainObjectBase& operator=(PlainObjectBase&& other) EIGEN_NOEXCEPT - { - using std::swap; - swap(m_storage, other.m_storage); - return *this; - } -#endif - - /** Copy constructor */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE PlainObjectBase(const PlainObjectBase& other) - : Base(), m_storage(other.m_storage) { } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE PlainObjectBase(Index size, Index rows, Index cols) - : m_storage(size, rows, cols) - { -// _check_template_params(); -// EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED - } - - /** \sa PlainObjectBase::operator=(const EigenBase&) */ - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE PlainObjectBase(const DenseBase &other) - : m_storage() - { - _check_template_params(); - resizeLike(other); - _set_noalias(other); - } - - /** \sa PlainObjectBase::operator=(const EigenBase&) */ - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE PlainObjectBase(const EigenBase &other) - : m_storage() - { - _check_template_params(); - resizeLike(other); - *this = other.derived(); - } - /** \brief Copy constructor with in-place evaluation */ - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE PlainObjectBase(const ReturnByValue& other) - { - _check_template_params(); - // FIXME this does not automatically transpose vectors if necessary - resize(other.rows(), other.cols()); - other.evalTo(this->derived()); - } - - public: - - /** \brief Copies the generic expression \a other into *this. - * \copydetails DenseBase::operator=(const EigenBase &other) - */ - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Derived& operator=(const EigenBase &other) - { - _resize_to_match(other); - Base::operator=(other.derived()); - return this->derived(); - } - - /** \name Map - * These are convenience functions returning Map objects. The Map() static functions return unaligned Map objects, - * while the AlignedMap() functions return aligned Map objects and thus should be called only with 16-byte-aligned - * \a data pointers. - * - * Here is an example using strides: - * \include Matrix_Map_stride.cpp - * Output: \verbinclude Matrix_Map_stride.out - * - * \see class Map - */ - //@{ - static inline ConstMapType Map(const Scalar* data) - { return ConstMapType(data); } - static inline MapType Map(Scalar* data) - { return MapType(data); } - static inline ConstMapType Map(const Scalar* data, Index size) - { return ConstMapType(data, size); } - static inline MapType Map(Scalar* data, Index size) - { return MapType(data, size); } - static inline ConstMapType Map(const Scalar* data, Index rows, Index cols) - { return ConstMapType(data, rows, cols); } - static inline MapType Map(Scalar* data, Index rows, Index cols) - { return MapType(data, rows, cols); } - - static inline ConstAlignedMapType MapAligned(const Scalar* data) - { return ConstAlignedMapType(data); } - static inline AlignedMapType MapAligned(Scalar* data) - { return AlignedMapType(data); } - static inline ConstAlignedMapType MapAligned(const Scalar* data, Index size) - { return ConstAlignedMapType(data, size); } - static inline AlignedMapType MapAligned(Scalar* data, Index size) - { return AlignedMapType(data, size); } - static inline ConstAlignedMapType MapAligned(const Scalar* data, Index rows, Index cols) - { return ConstAlignedMapType(data, rows, cols); } - static inline AlignedMapType MapAligned(Scalar* data, Index rows, Index cols) - { return AlignedMapType(data, rows, cols); } - - template - static inline typename StridedConstMapType >::type Map(const Scalar* data, const Stride& stride) - { return typename StridedConstMapType >::type(data, stride); } - template - static inline typename StridedMapType >::type Map(Scalar* data, const Stride& stride) - { return typename StridedMapType >::type(data, stride); } - template - static inline typename StridedConstMapType >::type Map(const Scalar* data, Index size, const Stride& stride) - { return typename StridedConstMapType >::type(data, size, stride); } - template - static inline typename StridedMapType >::type Map(Scalar* data, Index size, const Stride& stride) - { return typename StridedMapType >::type(data, size, stride); } - template - static inline typename StridedConstMapType >::type Map(const Scalar* data, Index rows, Index cols, const Stride& stride) - { return typename StridedConstMapType >::type(data, rows, cols, stride); } - template - static inline typename StridedMapType >::type Map(Scalar* data, Index rows, Index cols, const Stride& stride) - { return typename StridedMapType >::type(data, rows, cols, stride); } - - template - static inline typename StridedConstAlignedMapType >::type MapAligned(const Scalar* data, const Stride& stride) - { return typename StridedConstAlignedMapType >::type(data, stride); } - template - static inline typename StridedAlignedMapType >::type MapAligned(Scalar* data, const Stride& stride) - { return typename StridedAlignedMapType >::type(data, stride); } - template - static inline typename StridedConstAlignedMapType >::type MapAligned(const Scalar* data, Index size, const Stride& stride) - { return typename StridedConstAlignedMapType >::type(data, size, stride); } - template - static inline typename StridedAlignedMapType >::type MapAligned(Scalar* data, Index size, const Stride& stride) - { return typename StridedAlignedMapType >::type(data, size, stride); } - template - static inline typename StridedConstAlignedMapType >::type MapAligned(const Scalar* data, Index rows, Index cols, const Stride& stride) - { return typename StridedConstAlignedMapType >::type(data, rows, cols, stride); } - template - static inline typename StridedAlignedMapType >::type MapAligned(Scalar* data, Index rows, Index cols, const Stride& stride) - { return typename StridedAlignedMapType >::type(data, rows, cols, stride); } - //@} - - using Base::setConstant; - EIGEN_DEVICE_FUNC Derived& setConstant(Index size, const Scalar& val); - EIGEN_DEVICE_FUNC Derived& setConstant(Index rows, Index cols, const Scalar& val); - - using Base::setZero; - EIGEN_DEVICE_FUNC Derived& setZero(Index size); - EIGEN_DEVICE_FUNC Derived& setZero(Index rows, Index cols); - - using Base::setOnes; - EIGEN_DEVICE_FUNC Derived& setOnes(Index size); - EIGEN_DEVICE_FUNC Derived& setOnes(Index rows, Index cols); - - using Base::setRandom; - Derived& setRandom(Index size); - Derived& setRandom(Index rows, Index cols); - - #ifdef EIGEN_PLAINOBJECTBASE_PLUGIN - #include EIGEN_PLAINOBJECTBASE_PLUGIN - #endif - - protected: - /** \internal Resizes *this in preparation for assigning \a other to it. - * Takes care of doing all the checking that's needed. - * - * Note that copying a row-vector into a vector (and conversely) is allowed. - * The resizing, if any, is then done in the appropriate way so that row-vectors - * remain row-vectors and vectors remain vectors. - */ - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void _resize_to_match(const EigenBase& other) - { - #ifdef EIGEN_NO_AUTOMATIC_RESIZING - eigen_assert((this->size()==0 || (IsVectorAtCompileTime ? (this->size() == other.size()) - : (rows() == other.rows() && cols() == other.cols()))) - && "Size mismatch. Automatic resizing is disabled because EIGEN_NO_AUTOMATIC_RESIZING is defined"); - EIGEN_ONLY_USED_FOR_DEBUG(other); - #else - resizeLike(other); - #endif - } - - /** - * \brief Copies the value of the expression \a other into \c *this with automatic resizing. - * - * *this might be resized to match the dimensions of \a other. If *this was a null matrix (not already initialized), - * it will be initialized. - * - * Note that copying a row-vector into a vector (and conversely) is allowed. - * The resizing, if any, is then done in the appropriate way so that row-vectors - * remain row-vectors and vectors remain vectors. - * - * \sa operator=(const MatrixBase&), _set_noalias() - * - * \internal - */ - // aliasing is dealt once in internall::call_assignment - // so at this stage we have to assume aliasing... and resising has to be done later. - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Derived& _set(const DenseBase& other) - { - internal::call_assignment(this->derived(), other.derived()); - return this->derived(); - } - - /** \internal Like _set() but additionally makes the assumption that no aliasing effect can happen (which - * is the case when creating a new matrix) so one can enforce lazy evaluation. - * - * \sa operator=(const MatrixBase&), _set() - */ - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Derived& _set_noalias(const DenseBase& other) - { - // I don't think we need this resize call since the lazyAssign will anyways resize - // and lazyAssign will be called by the assign selector. - //_resize_to_match(other); - // the 'false' below means to enforce lazy evaluation. We don't use lazyAssign() because - // it wouldn't allow to copy a row-vector into a column-vector. - internal::call_assignment_no_alias(this->derived(), other.derived(), internal::assign_op()); - return this->derived(); - } - - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void _init2(Index rows, Index cols, typename internal::enable_if::type* = 0) - { - EIGEN_STATIC_ASSERT(bool(NumTraits::IsInteger) && - bool(NumTraits::IsInteger), - FLOATING_POINT_ARGUMENT_PASSED__INTEGER_WAS_EXPECTED) - resize(rows,cols); - } - - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void _init2(const T0& val0, const T1& val1, typename internal::enable_if::type* = 0) - { - EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(PlainObjectBase, 2) - m_storage.data()[0] = Scalar(val0); - m_storage.data()[1] = Scalar(val1); - } - - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void _init2(const Index& val0, const Index& val1, - typename internal::enable_if< (!internal::is_same::value) - && (internal::is_same::value) - && (internal::is_same::value) - && Base::SizeAtCompileTime==2,T1>::type* = 0) - { - EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(PlainObjectBase, 2) - m_storage.data()[0] = Scalar(val0); - m_storage.data()[1] = Scalar(val1); - } - - // The argument is convertible to the Index type and we either have a non 1x1 Matrix, or a dynamic-sized Array, - // then the argument is meant to be the size of the object. - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void _init1(Index size, typename internal::enable_if< (Base::SizeAtCompileTime!=1 || !internal::is_convertible::value) - && ((!internal::is_same::XprKind,ArrayXpr>::value || Base::SizeAtCompileTime==Dynamic)),T>::type* = 0) - { - // NOTE MSVC 2008 complains if we directly put bool(NumTraits::IsInteger) as the EIGEN_STATIC_ASSERT argument. - const bool is_integer = NumTraits::IsInteger; - EIGEN_UNUSED_VARIABLE(is_integer); - EIGEN_STATIC_ASSERT(is_integer, - FLOATING_POINT_ARGUMENT_PASSED__INTEGER_WAS_EXPECTED) - resize(size); - } - - // We have a 1x1 matrix/array => the argument is interpreted as the value of the unique coefficient (case where scalar type can be implicitely converted) - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void _init1(const Scalar& val0, typename internal::enable_if::value,T>::type* = 0) - { - EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(PlainObjectBase, 1) - m_storage.data()[0] = val0; - } - - // We have a 1x1 matrix/array => the argument is interpreted as the value of the unique coefficient (case where scalar type match the index type) - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void _init1(const Index& val0, - typename internal::enable_if< (!internal::is_same::value) - && (internal::is_same::value) - && Base::SizeAtCompileTime==1 - && internal::is_convertible::value,T*>::type* = 0) - { - EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(PlainObjectBase, 1) - m_storage.data()[0] = Scalar(val0); - } - - // Initialize a fixed size matrix from a pointer to raw data - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void _init1(const Scalar* data){ - this->_set_noalias(ConstMapType(data)); - } - - // Initialize an arbitrary matrix from a dense expression - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void _init1(const DenseBase& other){ - this->_set_noalias(other); - } - - // Initialize an arbitrary matrix from an object convertible to the Derived type. - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void _init1(const Derived& other){ - this->_set_noalias(other); - } - - // Initialize an arbitrary matrix from a generic Eigen expression - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void _init1(const EigenBase& other){ - this->derived() = other; - } - - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void _init1(const ReturnByValue& other) - { - resize(other.rows(), other.cols()); - other.evalTo(this->derived()); - } - - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void _init1(const RotationBase& r) - { - this->derived() = r; - } - - // For fixed-size Array - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void _init1(const Scalar& val0, - typename internal::enable_if< Base::SizeAtCompileTime!=Dynamic - && Base::SizeAtCompileTime!=1 - && internal::is_convertible::value - && internal::is_same::XprKind,ArrayXpr>::value,T>::type* = 0) - { - Base::setConstant(val0); - } - - // For fixed-size Array - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void _init1(const Index& val0, - typename internal::enable_if< (!internal::is_same::value) - && (internal::is_same::value) - && Base::SizeAtCompileTime!=Dynamic - && Base::SizeAtCompileTime!=1 - && internal::is_convertible::value - && internal::is_same::XprKind,ArrayXpr>::value,T*>::type* = 0) - { - Base::setConstant(val0); - } - - template - friend struct internal::matrix_swap_impl; - - public: - -#ifndef EIGEN_PARSED_BY_DOXYGEN - /** \internal - * \brief Override DenseBase::swap() since for dynamic-sized matrices - * of same type it is enough to swap the data pointers. - */ - template - EIGEN_DEVICE_FUNC - void swap(DenseBase & other) - { - enum { SwapPointers = internal::is_same::value && Base::SizeAtCompileTime==Dynamic }; - internal::matrix_swap_impl::run(this->derived(), other.derived()); - } - - /** \internal - * \brief const version forwarded to DenseBase::swap - */ - template - EIGEN_DEVICE_FUNC - void swap(DenseBase const & other) - { Base::swap(other.derived()); } - - EIGEN_DEVICE_FUNC - static EIGEN_STRONG_INLINE void _check_template_params() - { - EIGEN_STATIC_ASSERT((EIGEN_IMPLIES(MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1, (Options&RowMajor)==RowMajor) - && EIGEN_IMPLIES(MaxColsAtCompileTime==1 && MaxRowsAtCompileTime!=1, (Options&RowMajor)==0) - && ((RowsAtCompileTime == Dynamic) || (RowsAtCompileTime >= 0)) - && ((ColsAtCompileTime == Dynamic) || (ColsAtCompileTime >= 0)) - && ((MaxRowsAtCompileTime == Dynamic) || (MaxRowsAtCompileTime >= 0)) - && ((MaxColsAtCompileTime == Dynamic) || (MaxColsAtCompileTime >= 0)) - && (MaxRowsAtCompileTime == RowsAtCompileTime || RowsAtCompileTime==Dynamic) - && (MaxColsAtCompileTime == ColsAtCompileTime || ColsAtCompileTime==Dynamic) - && (Options & (DontAlign|RowMajor)) == Options), - INVALID_MATRIX_TEMPLATE_PARAMETERS) - } - - enum { IsPlainObjectBase = 1 }; -#endif -}; - -namespace internal { - -template -struct conservative_resize_like_impl -{ - static void run(DenseBase& _this, Index rows, Index cols) - { - if (_this.rows() == rows && _this.cols() == cols) return; - EIGEN_STATIC_ASSERT_DYNAMIC_SIZE(Derived) - - if ( ( Derived::IsRowMajor && _this.cols() == cols) || // row-major and we change only the number of rows - (!Derived::IsRowMajor && _this.rows() == rows) ) // column-major and we change only the number of columns - { - internal::check_rows_cols_for_overflow::run(rows, cols); - _this.derived().m_storage.conservativeResize(rows*cols,rows,cols); - } - else - { - // The storage order does not allow us to use reallocation. - typename Derived::PlainObject tmp(rows,cols); - const Index common_rows = numext::mini(rows, _this.rows()); - const Index common_cols = numext::mini(cols, _this.cols()); - tmp.block(0,0,common_rows,common_cols) = _this.block(0,0,common_rows,common_cols); - _this.derived().swap(tmp); - } - } - - static void run(DenseBase& _this, const DenseBase& other) - { - if (_this.rows() == other.rows() && _this.cols() == other.cols()) return; - - // Note: Here is space for improvement. Basically, for conservativeResize(Index,Index), - // neither RowsAtCompileTime or ColsAtCompileTime must be Dynamic. If only one of the - // dimensions is dynamic, one could use either conservativeResize(Index rows, NoChange_t) or - // conservativeResize(NoChange_t, Index cols). For these methods new static asserts like - // EIGEN_STATIC_ASSERT_DYNAMIC_ROWS and EIGEN_STATIC_ASSERT_DYNAMIC_COLS would be good. - EIGEN_STATIC_ASSERT_DYNAMIC_SIZE(Derived) - EIGEN_STATIC_ASSERT_DYNAMIC_SIZE(OtherDerived) - - if ( ( Derived::IsRowMajor && _this.cols() == other.cols()) || // row-major and we change only the number of rows - (!Derived::IsRowMajor && _this.rows() == other.rows()) ) // column-major and we change only the number of columns - { - const Index new_rows = other.rows() - _this.rows(); - const Index new_cols = other.cols() - _this.cols(); - _this.derived().m_storage.conservativeResize(other.size(),other.rows(),other.cols()); - if (new_rows>0) - _this.bottomRightCorner(new_rows, other.cols()) = other.bottomRows(new_rows); - else if (new_cols>0) - _this.bottomRightCorner(other.rows(), new_cols) = other.rightCols(new_cols); - } - else - { - // The storage order does not allow us to use reallocation. - typename Derived::PlainObject tmp(other); - const Index common_rows = numext::mini(tmp.rows(), _this.rows()); - const Index common_cols = numext::mini(tmp.cols(), _this.cols()); - tmp.block(0,0,common_rows,common_cols) = _this.block(0,0,common_rows,common_cols); - _this.derived().swap(tmp); - } - } -}; - -// Here, the specialization for vectors inherits from the general matrix case -// to allow calling .conservativeResize(rows,cols) on vectors. -template -struct conservative_resize_like_impl - : conservative_resize_like_impl -{ - using conservative_resize_like_impl::run; - - static void run(DenseBase& _this, Index size) - { - const Index new_rows = Derived::RowsAtCompileTime==1 ? 1 : size; - const Index new_cols = Derived::RowsAtCompileTime==1 ? size : 1; - _this.derived().m_storage.conservativeResize(size,new_rows,new_cols); - } - - static void run(DenseBase& _this, const DenseBase& other) - { - if (_this.rows() == other.rows() && _this.cols() == other.cols()) return; - - const Index num_new_elements = other.size() - _this.size(); - - const Index new_rows = Derived::RowsAtCompileTime==1 ? 1 : other.rows(); - const Index new_cols = Derived::RowsAtCompileTime==1 ? other.cols() : 1; - _this.derived().m_storage.conservativeResize(other.size(),new_rows,new_cols); - - if (num_new_elements > 0) - _this.tail(num_new_elements) = other.tail(num_new_elements); - } -}; - -template -struct matrix_swap_impl -{ - EIGEN_DEVICE_FUNC - static inline void run(MatrixTypeA& a, MatrixTypeB& b) - { - a.base().swap(b); - } -}; - -template -struct matrix_swap_impl -{ - EIGEN_DEVICE_FUNC - static inline void run(MatrixTypeA& a, MatrixTypeB& b) - { - static_cast(a).m_storage.swap(static_cast(b).m_storage); - } -}; - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_DENSESTORAGEBASE_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Product.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Product.h deleted file mode 100644 index ae0c94b3..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Product.h +++ /dev/null @@ -1,186 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2011 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_PRODUCT_H -#define EIGEN_PRODUCT_H - -namespace Eigen { - -template class ProductImpl; - -namespace internal { - -template -struct traits > -{ - typedef typename remove_all::type LhsCleaned; - typedef typename remove_all::type RhsCleaned; - typedef traits LhsTraits; - typedef traits RhsTraits; - - typedef MatrixXpr XprKind; - - typedef typename ScalarBinaryOpTraits::Scalar, typename traits::Scalar>::ReturnType Scalar; - typedef typename product_promote_storage_type::ret>::ret StorageKind; - typedef typename promote_index_type::type StorageIndex; - - enum { - RowsAtCompileTime = LhsTraits::RowsAtCompileTime, - ColsAtCompileTime = RhsTraits::ColsAtCompileTime, - MaxRowsAtCompileTime = LhsTraits::MaxRowsAtCompileTime, - MaxColsAtCompileTime = RhsTraits::MaxColsAtCompileTime, - - // FIXME: only needed by GeneralMatrixMatrixTriangular - InnerSize = EIGEN_SIZE_MIN_PREFER_FIXED(LhsTraits::ColsAtCompileTime, RhsTraits::RowsAtCompileTime), - - // The storage order is somewhat arbitrary here. The correct one will be determined through the evaluator. - Flags = (MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1) ? RowMajorBit - : (MaxColsAtCompileTime==1 && MaxRowsAtCompileTime!=1) ? 0 - : ( ((LhsTraits::Flags&NoPreferredStorageOrderBit) && (RhsTraits::Flags&RowMajorBit)) - || ((RhsTraits::Flags&NoPreferredStorageOrderBit) && (LhsTraits::Flags&RowMajorBit)) ) ? RowMajorBit - : NoPreferredStorageOrderBit - }; -}; - -} // end namespace internal - -/** \class Product - * \ingroup Core_Module - * - * \brief Expression of the product of two arbitrary matrices or vectors - * - * \tparam _Lhs the type of the left-hand side expression - * \tparam _Rhs the type of the right-hand side expression - * - * This class represents an expression of the product of two arbitrary matrices. - * - * The other template parameters are: - * \tparam Option can be DefaultProduct, AliasFreeProduct, or LazyProduct - * - */ -template -class Product : public ProductImpl<_Lhs,_Rhs,Option, - typename internal::product_promote_storage_type::StorageKind, - typename internal::traits<_Rhs>::StorageKind, - internal::product_type<_Lhs,_Rhs>::ret>::ret> -{ - public: - - typedef _Lhs Lhs; - typedef _Rhs Rhs; - - typedef typename ProductImpl< - Lhs, Rhs, Option, - typename internal::product_promote_storage_type::StorageKind, - typename internal::traits::StorageKind, - internal::product_type::ret>::ret>::Base Base; - EIGEN_GENERIC_PUBLIC_INTERFACE(Product) - - typedef typename internal::ref_selector::type LhsNested; - typedef typename internal::ref_selector::type RhsNested; - typedef typename internal::remove_all::type LhsNestedCleaned; - typedef typename internal::remove_all::type RhsNestedCleaned; - - EIGEN_DEVICE_FUNC Product(const Lhs& lhs, const Rhs& rhs) : m_lhs(lhs), m_rhs(rhs) - { - eigen_assert(lhs.cols() == rhs.rows() - && "invalid matrix product" - && "if you wanted a coeff-wise or a dot product use the respective explicit functions"); - } - - EIGEN_DEVICE_FUNC inline Index rows() const { return m_lhs.rows(); } - EIGEN_DEVICE_FUNC inline Index cols() const { return m_rhs.cols(); } - - EIGEN_DEVICE_FUNC const LhsNestedCleaned& lhs() const { return m_lhs; } - EIGEN_DEVICE_FUNC const RhsNestedCleaned& rhs() const { return m_rhs; } - - protected: - - LhsNested m_lhs; - RhsNested m_rhs; -}; - -namespace internal { - -template::ret> -class dense_product_base - : public internal::dense_xpr_base >::type -{}; - -/** Convertion to scalar for inner-products */ -template -class dense_product_base - : public internal::dense_xpr_base >::type -{ - typedef Product ProductXpr; - typedef typename internal::dense_xpr_base::type Base; -public: - using Base::derived; - typedef typename Base::Scalar Scalar; - - operator const Scalar() const - { - return internal::evaluator(derived()).coeff(0,0); - } -}; - -} // namespace internal - -// Generic API dispatcher -template -class ProductImpl : public internal::generic_xpr_base, MatrixXpr, StorageKind>::type -{ - public: - typedef typename internal::generic_xpr_base, MatrixXpr, StorageKind>::type Base; -}; - -template -class ProductImpl - : public internal::dense_product_base -{ - typedef Product Derived; - - public: - - typedef typename internal::dense_product_base Base; - EIGEN_DENSE_PUBLIC_INTERFACE(Derived) - protected: - enum { - IsOneByOne = (RowsAtCompileTime == 1 || RowsAtCompileTime == Dynamic) && - (ColsAtCompileTime == 1 || ColsAtCompileTime == Dynamic), - EnableCoeff = IsOneByOne || Option==LazyProduct - }; - - public: - - EIGEN_DEVICE_FUNC Scalar coeff(Index row, Index col) const - { - EIGEN_STATIC_ASSERT(EnableCoeff, THIS_METHOD_IS_ONLY_FOR_INNER_OR_LAZY_PRODUCTS); - eigen_assert( (Option==LazyProduct) || (this->rows() == 1 && this->cols() == 1) ); - - return internal::evaluator(derived()).coeff(row,col); - } - - EIGEN_DEVICE_FUNC Scalar coeff(Index i) const - { - EIGEN_STATIC_ASSERT(EnableCoeff, THIS_METHOD_IS_ONLY_FOR_INNER_OR_LAZY_PRODUCTS); - eigen_assert( (Option==LazyProduct) || (this->rows() == 1 && this->cols() == 1) ); - - return internal::evaluator(derived()).coeff(i); - } - - -}; - -} // end namespace Eigen - -#endif // EIGEN_PRODUCT_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/ProductEvaluators.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/ProductEvaluators.h deleted file mode 100644 index 86966abd..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/ProductEvaluators.h +++ /dev/null @@ -1,1105 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2008 Benoit Jacob -// Copyright (C) 2008-2010 Gael Guennebaud -// Copyright (C) 2011 Jitse Niesen -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - - -#ifndef EIGEN_PRODUCTEVALUATORS_H -#define EIGEN_PRODUCTEVALUATORS_H - -namespace Eigen { - -namespace internal { - -/** \internal - * Evaluator of a product expression. - * Since products require special treatments to handle all possible cases, - * we simply deffer the evaluation logic to a product_evaluator class - * which offers more partial specialization possibilities. - * - * \sa class product_evaluator - */ -template -struct evaluator > - : public product_evaluator > -{ - typedef Product XprType; - typedef product_evaluator Base; - - EIGEN_DEVICE_FUNC explicit evaluator(const XprType& xpr) : Base(xpr) {} -}; - -// Catch "scalar * ( A * B )" and transform it to "(A*scalar) * B" -// TODO we should apply that rule only if that's really helpful -template -struct evaluator_assume_aliasing, - const CwiseNullaryOp, Plain1>, - const Product > > -{ - static const bool value = true; -}; -template -struct evaluator, - const CwiseNullaryOp, Plain1>, - const Product > > - : public evaluator > -{ - typedef CwiseBinaryOp, - const CwiseNullaryOp, Plain1>, - const Product > XprType; - typedef evaluator > Base; - - EIGEN_DEVICE_FUNC explicit evaluator(const XprType& xpr) - : Base(xpr.lhs().functor().m_other * xpr.rhs().lhs() * xpr.rhs().rhs()) - {} -}; - - -template -struct evaluator, DiagIndex> > - : public evaluator, DiagIndex> > -{ - typedef Diagonal, DiagIndex> XprType; - typedef evaluator, DiagIndex> > Base; - - EIGEN_DEVICE_FUNC explicit evaluator(const XprType& xpr) - : Base(Diagonal, DiagIndex>( - Product(xpr.nestedExpression().lhs(), xpr.nestedExpression().rhs()), - xpr.index() )) - {} -}; - - -// Helper class to perform a matrix product with the destination at hand. -// Depending on the sizes of the factors, there are different evaluation strategies -// as controlled by internal::product_type. -template< typename Lhs, typename Rhs, - typename LhsShape = typename evaluator_traits::Shape, - typename RhsShape = typename evaluator_traits::Shape, - int ProductType = internal::product_type::value> -struct generic_product_impl; - -template -struct evaluator_assume_aliasing > { - static const bool value = true; -}; - -// This is the default evaluator implementation for products: -// It creates a temporary and call generic_product_impl -template -struct product_evaluator, ProductTag, LhsShape, RhsShape> - : public evaluator::PlainObject> -{ - typedef Product XprType; - typedef typename XprType::PlainObject PlainObject; - typedef evaluator Base; - enum { - Flags = Base::Flags | EvalBeforeNestingBit - }; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - explicit product_evaluator(const XprType& xpr) - : m_result(xpr.rows(), xpr.cols()) - { - ::new (static_cast(this)) Base(m_result); - -// FIXME shall we handle nested_eval here?, -// if so, then we must take care at removing the call to nested_eval in the specializations (e.g., in permutation_matrix_product, transposition_matrix_product, etc.) -// typedef typename internal::nested_eval::type LhsNested; -// typedef typename internal::nested_eval::type RhsNested; -// typedef typename internal::remove_all::type LhsNestedCleaned; -// typedef typename internal::remove_all::type RhsNestedCleaned; -// -// const LhsNested lhs(xpr.lhs()); -// const RhsNested rhs(xpr.rhs()); -// -// generic_product_impl::evalTo(m_result, lhs, rhs); - - generic_product_impl::evalTo(m_result, xpr.lhs(), xpr.rhs()); - } - -protected: - PlainObject m_result; -}; - -// The following three shortcuts are enabled only if the scalar types match excatly. -// TODO: we could enable them for different scalar types when the product is not vectorized. - -// Dense = Product -template< typename DstXprType, typename Lhs, typename Rhs, int Options, typename Scalar> -struct Assignment, internal::assign_op, Dense2Dense, - typename enable_if<(Options==DefaultProduct || Options==AliasFreeProduct)>::type> -{ - typedef Product SrcXprType; - static EIGEN_STRONG_INLINE - void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op &) - { - Index dstRows = src.rows(); - Index dstCols = src.cols(); - if((dst.rows()!=dstRows) || (dst.cols()!=dstCols)) - dst.resize(dstRows, dstCols); - // FIXME shall we handle nested_eval here? - generic_product_impl::evalTo(dst, src.lhs(), src.rhs()); - } -}; - -// Dense += Product -template< typename DstXprType, typename Lhs, typename Rhs, int Options, typename Scalar> -struct Assignment, internal::add_assign_op, Dense2Dense, - typename enable_if<(Options==DefaultProduct || Options==AliasFreeProduct)>::type> -{ - typedef Product SrcXprType; - static EIGEN_STRONG_INLINE - void run(DstXprType &dst, const SrcXprType &src, const internal::add_assign_op &) - { - eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols()); - // FIXME shall we handle nested_eval here? - generic_product_impl::addTo(dst, src.lhs(), src.rhs()); - } -}; - -// Dense -= Product -template< typename DstXprType, typename Lhs, typename Rhs, int Options, typename Scalar> -struct Assignment, internal::sub_assign_op, Dense2Dense, - typename enable_if<(Options==DefaultProduct || Options==AliasFreeProduct)>::type> -{ - typedef Product SrcXprType; - static EIGEN_STRONG_INLINE - void run(DstXprType &dst, const SrcXprType &src, const internal::sub_assign_op &) - { - eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols()); - // FIXME shall we handle nested_eval here? - generic_product_impl::subTo(dst, src.lhs(), src.rhs()); - } -}; - - -// Dense ?= scalar * Product -// TODO we should apply that rule if that's really helpful -// for instance, this is not good for inner products -template< typename DstXprType, typename Lhs, typename Rhs, typename AssignFunc, typename Scalar, typename ScalarBis, typename Plain> -struct Assignment, const CwiseNullaryOp,Plain>, - const Product >, AssignFunc, Dense2Dense> -{ - typedef CwiseBinaryOp, - const CwiseNullaryOp,Plain>, - const Product > SrcXprType; - static EIGEN_STRONG_INLINE - void run(DstXprType &dst, const SrcXprType &src, const AssignFunc& func) - { - call_assignment_no_alias(dst, (src.lhs().functor().m_other * src.rhs().lhs())*src.rhs().rhs(), func); - } -}; - -//---------------------------------------- -// Catch "Dense ?= xpr + Product<>" expression to save one temporary -// FIXME we could probably enable these rules for any product, i.e., not only Dense and DefaultProduct - -template -struct evaluator_assume_aliasing::Scalar>, const OtherXpr, - const Product >, DenseShape > { - static const bool value = true; -}; - -template -struct evaluator_assume_aliasing::Scalar>, const OtherXpr, - const Product >, DenseShape > { - static const bool value = true; -}; - -template -struct assignment_from_xpr_op_product -{ - template - static EIGEN_STRONG_INLINE - void run(DstXprType &dst, const SrcXprType &src, const InitialFunc& /*func*/) - { - call_assignment_no_alias(dst, src.lhs(), Func1()); - call_assignment_no_alias(dst, src.rhs(), Func2()); - } -}; - -#define EIGEN_CATCH_ASSIGN_XPR_OP_PRODUCT(ASSIGN_OP,BINOP,ASSIGN_OP2) \ - template< typename DstXprType, typename OtherXpr, typename Lhs, typename Rhs, typename DstScalar, typename SrcScalar, typename OtherScalar,typename ProdScalar> \ - struct Assignment, const OtherXpr, \ - const Product >, internal::ASSIGN_OP, Dense2Dense> \ - : assignment_from_xpr_op_product, internal::ASSIGN_OP, internal::ASSIGN_OP2 > \ - {} - -EIGEN_CATCH_ASSIGN_XPR_OP_PRODUCT(assign_op, scalar_sum_op,add_assign_op); -EIGEN_CATCH_ASSIGN_XPR_OP_PRODUCT(add_assign_op,scalar_sum_op,add_assign_op); -EIGEN_CATCH_ASSIGN_XPR_OP_PRODUCT(sub_assign_op,scalar_sum_op,sub_assign_op); - -EIGEN_CATCH_ASSIGN_XPR_OP_PRODUCT(assign_op, scalar_difference_op,sub_assign_op); -EIGEN_CATCH_ASSIGN_XPR_OP_PRODUCT(add_assign_op,scalar_difference_op,sub_assign_op); -EIGEN_CATCH_ASSIGN_XPR_OP_PRODUCT(sub_assign_op,scalar_difference_op,add_assign_op); - -//---------------------------------------- - -template -struct generic_product_impl -{ - template - static inline void evalTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) - { - dst.coeffRef(0,0) = (lhs.transpose().cwiseProduct(rhs)).sum(); - } - - template - static inline void addTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) - { - dst.coeffRef(0,0) += (lhs.transpose().cwiseProduct(rhs)).sum(); - } - - template - static void subTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) - { dst.coeffRef(0,0) -= (lhs.transpose().cwiseProduct(rhs)).sum(); } -}; - - -/*********************************************************************** -* Implementation of outer dense * dense vector product -***********************************************************************/ - -// Column major result -template -void outer_product_selector_run(Dst& dst, const Lhs &lhs, const Rhs &rhs, const Func& func, const false_type&) -{ - evaluator rhsEval(rhs); - typename nested_eval::type actual_lhs(lhs); - // FIXME if cols is large enough, then it might be useful to make sure that lhs is sequentially stored - // FIXME not very good if rhs is real and lhs complex while alpha is real too - const Index cols = dst.cols(); - for (Index j=0; j -void outer_product_selector_run(Dst& dst, const Lhs &lhs, const Rhs &rhs, const Func& func, const true_type&) -{ - evaluator lhsEval(lhs); - typename nested_eval::type actual_rhs(rhs); - // FIXME if rows is large enough, then it might be useful to make sure that rhs is sequentially stored - // FIXME not very good if lhs is real and rhs complex while alpha is real too - const Index rows = dst.rows(); - for (Index i=0; i -struct generic_product_impl -{ - template struct is_row_major : internal::conditional<(int(T::Flags)&RowMajorBit), internal::true_type, internal::false_type>::type {}; - typedef typename Product::Scalar Scalar; - - // TODO it would be nice to be able to exploit our *_assign_op functors for that purpose - struct set { template void operator()(const Dst& dst, const Src& src) const { dst.const_cast_derived() = src; } }; - struct add { template void operator()(const Dst& dst, const Src& src) const { dst.const_cast_derived() += src; } }; - struct sub { template void operator()(const Dst& dst, const Src& src) const { dst.const_cast_derived() -= src; } }; - struct adds { - Scalar m_scale; - explicit adds(const Scalar& s) : m_scale(s) {} - template void operator()(const Dst& dst, const Src& src) const { - dst.const_cast_derived() += m_scale * src; - } - }; - - template - static inline void evalTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) - { - internal::outer_product_selector_run(dst, lhs, rhs, set(), is_row_major()); - } - - template - static inline void addTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) - { - internal::outer_product_selector_run(dst, lhs, rhs, add(), is_row_major()); - } - - template - static inline void subTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) - { - internal::outer_product_selector_run(dst, lhs, rhs, sub(), is_row_major()); - } - - template - static inline void scaleAndAddTo(Dst& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha) - { - internal::outer_product_selector_run(dst, lhs, rhs, adds(alpha), is_row_major()); - } - -}; - - -// This base class provides default implementations for evalTo, addTo, subTo, in terms of scaleAndAddTo -template -struct generic_product_impl_base -{ - typedef typename Product::Scalar Scalar; - - template - static EIGEN_STRONG_INLINE void evalTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) - { dst.setZero(); scaleAndAddTo(dst, lhs, rhs, Scalar(1)); } - - template - static EIGEN_STRONG_INLINE void addTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) - { scaleAndAddTo(dst,lhs, rhs, Scalar(1)); } - - template - static EIGEN_STRONG_INLINE void subTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) - { scaleAndAddTo(dst, lhs, rhs, Scalar(-1)); } - - template - static EIGEN_STRONG_INLINE void scaleAndAddTo(Dst& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha) - { Derived::scaleAndAddTo(dst,lhs,rhs,alpha); } - -}; - -template -struct generic_product_impl - : generic_product_impl_base > -{ - typedef typename nested_eval::type LhsNested; - typedef typename nested_eval::type RhsNested; - typedef typename Product::Scalar Scalar; - enum { Side = Lhs::IsVectorAtCompileTime ? OnTheLeft : OnTheRight }; - typedef typename internal::remove_all::type>::type MatrixType; - - template - static EIGEN_STRONG_INLINE void scaleAndAddTo(Dest& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha) - { - LhsNested actual_lhs(lhs); - RhsNested actual_rhs(rhs); - internal::gemv_dense_selector::HasUsableDirectAccess) - >::run(actual_lhs, actual_rhs, dst, alpha); - } -}; - -template -struct generic_product_impl -{ - typedef typename Product::Scalar Scalar; - - template - static EIGEN_STRONG_INLINE void evalTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) - { - // Same as: dst.noalias() = lhs.lazyProduct(rhs); - // but easier on the compiler side - call_assignment_no_alias(dst, lhs.lazyProduct(rhs), internal::assign_op()); - } - - template - static EIGEN_STRONG_INLINE void addTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) - { - // dst.noalias() += lhs.lazyProduct(rhs); - call_assignment_no_alias(dst, lhs.lazyProduct(rhs), internal::add_assign_op()); - } - - template - static EIGEN_STRONG_INLINE void subTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) - { - // dst.noalias() -= lhs.lazyProduct(rhs); - call_assignment_no_alias(dst, lhs.lazyProduct(rhs), internal::sub_assign_op()); - } - -// template -// static inline void scaleAndAddTo(Dst& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha) -// { dst.noalias() += alpha * lhs.lazyProduct(rhs); } -}; - -// This specialization enforces the use of a coefficient-based evaluation strategy -template -struct generic_product_impl - : generic_product_impl {}; - -// Case 2: Evaluate coeff by coeff -// -// This is mostly taken from CoeffBasedProduct.h -// The main difference is that we add an extra argument to the etor_product_*_impl::run() function -// for the inner dimension of the product, because evaluator object do not know their size. - -template -struct etor_product_coeff_impl; - -template -struct etor_product_packet_impl; - -template -struct product_evaluator, ProductTag, DenseShape, DenseShape> - : evaluator_base > -{ - typedef Product XprType; - typedef typename XprType::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - explicit product_evaluator(const XprType& xpr) - : m_lhs(xpr.lhs()), - m_rhs(xpr.rhs()), - m_lhsImpl(m_lhs), // FIXME the creation of the evaluator objects should result in a no-op, but check that! - m_rhsImpl(m_rhs), // Moreover, they are only useful for the packet path, so we could completely disable them when not needed, - // or perhaps declare them on the fly on the packet method... We have experiment to check what's best. - m_innerDim(xpr.lhs().cols()) - { - EIGEN_INTERNAL_CHECK_COST_VALUE(NumTraits::MulCost); - EIGEN_INTERNAL_CHECK_COST_VALUE(NumTraits::AddCost); - EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost); -#if 0 - std::cerr << "LhsOuterStrideBytes= " << LhsOuterStrideBytes << "\n"; - std::cerr << "RhsOuterStrideBytes= " << RhsOuterStrideBytes << "\n"; - std::cerr << "LhsAlignment= " << LhsAlignment << "\n"; - std::cerr << "RhsAlignment= " << RhsAlignment << "\n"; - std::cerr << "CanVectorizeLhs= " << CanVectorizeLhs << "\n"; - std::cerr << "CanVectorizeRhs= " << CanVectorizeRhs << "\n"; - std::cerr << "CanVectorizeInner= " << CanVectorizeInner << "\n"; - std::cerr << "EvalToRowMajor= " << EvalToRowMajor << "\n"; - std::cerr << "Alignment= " << Alignment << "\n"; - std::cerr << "Flags= " << Flags << "\n"; -#endif - } - - // Everything below here is taken from CoeffBasedProduct.h - - typedef typename internal::nested_eval::type LhsNested; - typedef typename internal::nested_eval::type RhsNested; - - typedef typename internal::remove_all::type LhsNestedCleaned; - typedef typename internal::remove_all::type RhsNestedCleaned; - - typedef evaluator LhsEtorType; - typedef evaluator RhsEtorType; - - enum { - RowsAtCompileTime = LhsNestedCleaned::RowsAtCompileTime, - ColsAtCompileTime = RhsNestedCleaned::ColsAtCompileTime, - InnerSize = EIGEN_SIZE_MIN_PREFER_FIXED(LhsNestedCleaned::ColsAtCompileTime, RhsNestedCleaned::RowsAtCompileTime), - MaxRowsAtCompileTime = LhsNestedCleaned::MaxRowsAtCompileTime, - MaxColsAtCompileTime = RhsNestedCleaned::MaxColsAtCompileTime - }; - - typedef typename find_best_packet::type LhsVecPacketType; - typedef typename find_best_packet::type RhsVecPacketType; - - enum { - - LhsCoeffReadCost = LhsEtorType::CoeffReadCost, - RhsCoeffReadCost = RhsEtorType::CoeffReadCost, - CoeffReadCost = InnerSize==0 ? NumTraits::ReadCost - : InnerSize == Dynamic ? HugeCost - : InnerSize * (NumTraits::MulCost + LhsCoeffReadCost + RhsCoeffReadCost) - + (InnerSize - 1) * NumTraits::AddCost, - - Unroll = CoeffReadCost <= EIGEN_UNROLLING_LIMIT, - - LhsFlags = LhsEtorType::Flags, - RhsFlags = RhsEtorType::Flags, - - LhsRowMajor = LhsFlags & RowMajorBit, - RhsRowMajor = RhsFlags & RowMajorBit, - - LhsVecPacketSize = unpacket_traits::size, - RhsVecPacketSize = unpacket_traits::size, - - // Here, we don't care about alignment larger than the usable packet size. - LhsAlignment = EIGEN_PLAIN_ENUM_MIN(LhsEtorType::Alignment,LhsVecPacketSize*int(sizeof(typename LhsNestedCleaned::Scalar))), - RhsAlignment = EIGEN_PLAIN_ENUM_MIN(RhsEtorType::Alignment,RhsVecPacketSize*int(sizeof(typename RhsNestedCleaned::Scalar))), - - SameType = is_same::value, - - CanVectorizeRhs = bool(RhsRowMajor) && (RhsFlags & PacketAccessBit) && (ColsAtCompileTime!=1), - CanVectorizeLhs = (!LhsRowMajor) && (LhsFlags & PacketAccessBit) && (RowsAtCompileTime!=1), - - EvalToRowMajor = (MaxRowsAtCompileTime==1&&MaxColsAtCompileTime!=1) ? 1 - : (MaxColsAtCompileTime==1&&MaxRowsAtCompileTime!=1) ? 0 - : (bool(RhsRowMajor) && !CanVectorizeLhs), - - Flags = ((unsigned int)(LhsFlags | RhsFlags) & HereditaryBits & ~RowMajorBit) - | (EvalToRowMajor ? RowMajorBit : 0) - // TODO enable vectorization for mixed types - | (SameType && (CanVectorizeLhs || CanVectorizeRhs) ? PacketAccessBit : 0) - | (XprType::IsVectorAtCompileTime ? LinearAccessBit : 0), - - LhsOuterStrideBytes = int(LhsNestedCleaned::OuterStrideAtCompileTime) * int(sizeof(typename LhsNestedCleaned::Scalar)), - RhsOuterStrideBytes = int(RhsNestedCleaned::OuterStrideAtCompileTime) * int(sizeof(typename RhsNestedCleaned::Scalar)), - - Alignment = bool(CanVectorizeLhs) ? (LhsOuterStrideBytes<=0 || (int(LhsOuterStrideBytes) % EIGEN_PLAIN_ENUM_MAX(1,LhsAlignment))!=0 ? 0 : LhsAlignment) - : bool(CanVectorizeRhs) ? (RhsOuterStrideBytes<=0 || (int(RhsOuterStrideBytes) % EIGEN_PLAIN_ENUM_MAX(1,RhsAlignment))!=0 ? 0 : RhsAlignment) - : 0, - - /* CanVectorizeInner deserves special explanation. It does not affect the product flags. It is not used outside - * of Product. If the Product itself is not a packet-access expression, there is still a chance that the inner - * loop of the product might be vectorized. This is the meaning of CanVectorizeInner. Since it doesn't affect - * the Flags, it is safe to make this value depend on ActualPacketAccessBit, that doesn't affect the ABI. - */ - CanVectorizeInner = SameType - && LhsRowMajor - && (!RhsRowMajor) - && (LhsFlags & RhsFlags & ActualPacketAccessBit) - && (InnerSize % packet_traits::size == 0) - }; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CoeffReturnType coeff(Index row, Index col) const - { - return (m_lhs.row(row).transpose().cwiseProduct( m_rhs.col(col) )).sum(); - } - - /* Allow index-based non-packet access. It is impossible though to allow index-based packed access, - * which is why we don't set the LinearAccessBit. - * TODO: this seems possible when the result is a vector - */ - EIGEN_DEVICE_FUNC const CoeffReturnType coeff(Index index) const - { - const Index row = (RowsAtCompileTime == 1 || MaxRowsAtCompileTime==1) ? 0 : index; - const Index col = (RowsAtCompileTime == 1 || MaxRowsAtCompileTime==1) ? index : 0; - return (m_lhs.row(row).transpose().cwiseProduct( m_rhs.col(col) )).sum(); - } - - template - const PacketType packet(Index row, Index col) const - { - PacketType res; - typedef etor_product_packet_impl PacketImpl; - PacketImpl::run(row, col, m_lhsImpl, m_rhsImpl, m_innerDim, res); - return res; - } - - template - const PacketType packet(Index index) const - { - const Index row = (RowsAtCompileTime == 1 || MaxRowsAtCompileTime==1) ? 0 : index; - const Index col = (RowsAtCompileTime == 1 || MaxRowsAtCompileTime==1) ? index : 0; - return packet(row,col); - } - -protected: - typename internal::add_const_on_value_type::type m_lhs; - typename internal::add_const_on_value_type::type m_rhs; - - LhsEtorType m_lhsImpl; - RhsEtorType m_rhsImpl; - - // TODO: Get rid of m_innerDim if known at compile time - Index m_innerDim; -}; - -template -struct product_evaluator, LazyCoeffBasedProductMode, DenseShape, DenseShape> - : product_evaluator, CoeffBasedProductMode, DenseShape, DenseShape> -{ - typedef Product XprType; - typedef Product BaseProduct; - typedef product_evaluator Base; - enum { - Flags = Base::Flags | EvalBeforeNestingBit - }; - EIGEN_DEVICE_FUNC explicit product_evaluator(const XprType& xpr) - : Base(BaseProduct(xpr.lhs(),xpr.rhs())) - {} -}; - -/**************************************** -*** Coeff based product, Packet path *** -****************************************/ - -template -struct etor_product_packet_impl -{ - static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Index innerDim, Packet &res) - { - etor_product_packet_impl::run(row, col, lhs, rhs, innerDim, res); - res = pmadd(pset1(lhs.coeff(row, Index(UnrollingIndex-1))), rhs.template packet(Index(UnrollingIndex-1), col), res); - } -}; - -template -struct etor_product_packet_impl -{ - static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Index innerDim, Packet &res) - { - etor_product_packet_impl::run(row, col, lhs, rhs, innerDim, res); - res = pmadd(lhs.template packet(row, Index(UnrollingIndex-1)), pset1(rhs.coeff(Index(UnrollingIndex-1), col)), res); - } -}; - -template -struct etor_product_packet_impl -{ - static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Index /*innerDim*/, Packet &res) - { - res = pmul(pset1(lhs.coeff(row, Index(0))),rhs.template packet(Index(0), col)); - } -}; - -template -struct etor_product_packet_impl -{ - static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Index /*innerDim*/, Packet &res) - { - res = pmul(lhs.template packet(row, Index(0)), pset1(rhs.coeff(Index(0), col))); - } -}; - -template -struct etor_product_packet_impl -{ - static EIGEN_STRONG_INLINE void run(Index /*row*/, Index /*col*/, const Lhs& /*lhs*/, const Rhs& /*rhs*/, Index /*innerDim*/, Packet &res) - { - res = pset1(typename unpacket_traits::type(0)); - } -}; - -template -struct etor_product_packet_impl -{ - static EIGEN_STRONG_INLINE void run(Index /*row*/, Index /*col*/, const Lhs& /*lhs*/, const Rhs& /*rhs*/, Index /*innerDim*/, Packet &res) - { - res = pset1(typename unpacket_traits::type(0)); - } -}; - -template -struct etor_product_packet_impl -{ - static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Index innerDim, Packet& res) - { - res = pset1(typename unpacket_traits::type(0)); - for(Index i = 0; i < innerDim; ++i) - res = pmadd(pset1(lhs.coeff(row, i)), rhs.template packet(i, col), res); - } -}; - -template -struct etor_product_packet_impl -{ - static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Index innerDim, Packet& res) - { - res = pset1(typename unpacket_traits::type(0)); - for(Index i = 0; i < innerDim; ++i) - res = pmadd(lhs.template packet(row, i), pset1(rhs.coeff(i, col)), res); - } -}; - - -/*************************************************************************** -* Triangular products -***************************************************************************/ -template -struct triangular_product_impl; - -template -struct generic_product_impl - : generic_product_impl_base > -{ - typedef typename Product::Scalar Scalar; - - template - static void scaleAndAddTo(Dest& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha) - { - triangular_product_impl - ::run(dst, lhs.nestedExpression(), rhs, alpha); - } -}; - -template -struct generic_product_impl -: generic_product_impl_base > -{ - typedef typename Product::Scalar Scalar; - - template - static void scaleAndAddTo(Dest& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha) - { - triangular_product_impl::run(dst, lhs, rhs.nestedExpression(), alpha); - } -}; - - -/*************************************************************************** -* SelfAdjoint products -***************************************************************************/ -template -struct selfadjoint_product_impl; - -template -struct generic_product_impl - : generic_product_impl_base > -{ - typedef typename Product::Scalar Scalar; - - template - static void scaleAndAddTo(Dest& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha) - { - selfadjoint_product_impl::run(dst, lhs.nestedExpression(), rhs, alpha); - } -}; - -template -struct generic_product_impl -: generic_product_impl_base > -{ - typedef typename Product::Scalar Scalar; - - template - static void scaleAndAddTo(Dest& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha) - { - selfadjoint_product_impl::run(dst, lhs, rhs.nestedExpression(), alpha); - } -}; - - -/*************************************************************************** -* Diagonal products -***************************************************************************/ - -template -struct diagonal_product_evaluator_base - : evaluator_base -{ - typedef typename ScalarBinaryOpTraits::ReturnType Scalar; -public: - enum { - CoeffReadCost = NumTraits::MulCost + evaluator::CoeffReadCost + evaluator::CoeffReadCost, - - MatrixFlags = evaluator::Flags, - DiagFlags = evaluator::Flags, - _StorageOrder = MatrixFlags & RowMajorBit ? RowMajor : ColMajor, - _ScalarAccessOnDiag = !((int(_StorageOrder) == ColMajor && int(ProductOrder) == OnTheLeft) - ||(int(_StorageOrder) == RowMajor && int(ProductOrder) == OnTheRight)), - _SameTypes = is_same::value, - // FIXME currently we need same types, but in the future the next rule should be the one - //_Vectorizable = bool(int(MatrixFlags)&PacketAccessBit) && ((!_PacketOnDiag) || (_SameTypes && bool(int(DiagFlags)&PacketAccessBit))), - _Vectorizable = bool(int(MatrixFlags)&PacketAccessBit) && _SameTypes && (_ScalarAccessOnDiag || (bool(int(DiagFlags)&PacketAccessBit))), - _LinearAccessMask = (MatrixType::RowsAtCompileTime==1 || MatrixType::ColsAtCompileTime==1) ? LinearAccessBit : 0, - Flags = ((HereditaryBits|_LinearAccessMask) & (unsigned int)(MatrixFlags)) | (_Vectorizable ? PacketAccessBit : 0), - Alignment = evaluator::Alignment - }; - - diagonal_product_evaluator_base(const MatrixType &mat, const DiagonalType &diag) - : m_diagImpl(diag), m_matImpl(mat) - { - EIGEN_INTERNAL_CHECK_COST_VALUE(NumTraits::MulCost); - EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar coeff(Index idx) const - { - return m_diagImpl.coeff(idx) * m_matImpl.coeff(idx); - } - -protected: - template - EIGEN_STRONG_INLINE PacketType packet_impl(Index row, Index col, Index id, internal::true_type) const - { - return internal::pmul(m_matImpl.template packet(row, col), - internal::pset1(m_diagImpl.coeff(id))); - } - - template - EIGEN_STRONG_INLINE PacketType packet_impl(Index row, Index col, Index id, internal::false_type) const - { - enum { - InnerSize = (MatrixType::Flags & RowMajorBit) ? MatrixType::ColsAtCompileTime : MatrixType::RowsAtCompileTime, - DiagonalPacketLoadMode = EIGEN_PLAIN_ENUM_MIN(LoadMode,((InnerSize%16) == 0) ? int(Aligned16) : int(evaluator::Alignment)) // FIXME hardcoded 16!! - }; - return internal::pmul(m_matImpl.template packet(row, col), - m_diagImpl.template packet(id)); - } - - evaluator m_diagImpl; - evaluator m_matImpl; -}; - -// diagonal * dense -template -struct product_evaluator, ProductTag, DiagonalShape, DenseShape> - : diagonal_product_evaluator_base, OnTheLeft> -{ - typedef diagonal_product_evaluator_base, OnTheLeft> Base; - using Base::m_diagImpl; - using Base::m_matImpl; - using Base::coeff; - typedef typename Base::Scalar Scalar; - - typedef Product XprType; - typedef typename XprType::PlainObject PlainObject; - - enum { - StorageOrder = int(Rhs::Flags) & RowMajorBit ? RowMajor : ColMajor - }; - - EIGEN_DEVICE_FUNC explicit product_evaluator(const XprType& xpr) - : Base(xpr.rhs(), xpr.lhs().diagonal()) - { - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar coeff(Index row, Index col) const - { - return m_diagImpl.coeff(row) * m_matImpl.coeff(row, col); - } - -#ifndef EIGEN_CUDACC - template - EIGEN_STRONG_INLINE PacketType packet(Index row, Index col) const - { - // FIXME: NVCC used to complain about the template keyword, but we have to check whether this is still the case. - // See also similar calls below. - return this->template packet_impl(row,col, row, - typename internal::conditional::type()); - } - - template - EIGEN_STRONG_INLINE PacketType packet(Index idx) const - { - return packet(int(StorageOrder)==ColMajor?idx:0,int(StorageOrder)==ColMajor?0:idx); - } -#endif -}; - -// dense * diagonal -template -struct product_evaluator, ProductTag, DenseShape, DiagonalShape> - : diagonal_product_evaluator_base, OnTheRight> -{ - typedef diagonal_product_evaluator_base, OnTheRight> Base; - using Base::m_diagImpl; - using Base::m_matImpl; - using Base::coeff; - typedef typename Base::Scalar Scalar; - - typedef Product XprType; - typedef typename XprType::PlainObject PlainObject; - - enum { StorageOrder = int(Lhs::Flags) & RowMajorBit ? RowMajor : ColMajor }; - - EIGEN_DEVICE_FUNC explicit product_evaluator(const XprType& xpr) - : Base(xpr.lhs(), xpr.rhs().diagonal()) - { - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar coeff(Index row, Index col) const - { - return m_matImpl.coeff(row, col) * m_diagImpl.coeff(col); - } - -#ifndef EIGEN_CUDACC - template - EIGEN_STRONG_INLINE PacketType packet(Index row, Index col) const - { - return this->template packet_impl(row,col, col, - typename internal::conditional::type()); - } - - template - EIGEN_STRONG_INLINE PacketType packet(Index idx) const - { - return packet(int(StorageOrder)==ColMajor?idx:0,int(StorageOrder)==ColMajor?0:idx); - } -#endif -}; - -/*************************************************************************** -* Products with permutation matrices -***************************************************************************/ - -/** \internal - * \class permutation_matrix_product - * Internal helper class implementing the product between a permutation matrix and a matrix. - * This class is specialized for DenseShape below and for SparseShape in SparseCore/SparsePermutation.h - */ -template -struct permutation_matrix_product; - -template -struct permutation_matrix_product -{ - typedef typename nested_eval::type MatrixType; - typedef typename remove_all::type MatrixTypeCleaned; - - template - static inline void run(Dest& dst, const PermutationType& perm, const ExpressionType& xpr) - { - MatrixType mat(xpr); - const Index n = Side==OnTheLeft ? mat.rows() : mat.cols(); - // FIXME we need an is_same for expression that is not sensitive to constness. For instance - // is_same_xpr, Block >::value should be true. - //if(is_same::value && extract_data(dst) == extract_data(mat)) - if(is_same_dense(dst, mat)) - { - // apply the permutation inplace - Matrix mask(perm.size()); - mask.fill(false); - Index r = 0; - while(r < perm.size()) - { - // search for the next seed - while(r=perm.size()) - break; - // we got one, let's follow it until we are back to the seed - Index k0 = r++; - Index kPrev = k0; - mask.coeffRef(k0) = true; - for(Index k=perm.indices().coeff(k0); k!=k0; k=perm.indices().coeff(k)) - { - Block(dst, k) - .swap(Block - (dst,((Side==OnTheLeft) ^ Transposed) ? k0 : kPrev)); - - mask.coeffRef(k) = true; - kPrev = k; - } - } - } - else - { - for(Index i = 0; i < n; ++i) - { - Block - (dst, ((Side==OnTheLeft) ^ Transposed) ? perm.indices().coeff(i) : i) - - = - - Block - (mat, ((Side==OnTheRight) ^ Transposed) ? perm.indices().coeff(i) : i); - } - } - } -}; - -template -struct generic_product_impl -{ - template - static void evalTo(Dest& dst, const Lhs& lhs, const Rhs& rhs) - { - permutation_matrix_product::run(dst, lhs, rhs); - } -}; - -template -struct generic_product_impl -{ - template - static void evalTo(Dest& dst, const Lhs& lhs, const Rhs& rhs) - { - permutation_matrix_product::run(dst, rhs, lhs); - } -}; - -template -struct generic_product_impl, Rhs, PermutationShape, MatrixShape, ProductTag> -{ - template - static void evalTo(Dest& dst, const Inverse& lhs, const Rhs& rhs) - { - permutation_matrix_product::run(dst, lhs.nestedExpression(), rhs); - } -}; - -template -struct generic_product_impl, MatrixShape, PermutationShape, ProductTag> -{ - template - static void evalTo(Dest& dst, const Lhs& lhs, const Inverse& rhs) - { - permutation_matrix_product::run(dst, rhs.nestedExpression(), lhs); - } -}; - - -/*************************************************************************** -* Products with transpositions matrices -***************************************************************************/ - -// FIXME could we unify Transpositions and Permutation into a single "shape"?? - -/** \internal - * \class transposition_matrix_product - * Internal helper class implementing the product between a permutation matrix and a matrix. - */ -template -struct transposition_matrix_product -{ - typedef typename nested_eval::type MatrixType; - typedef typename remove_all::type MatrixTypeCleaned; - - template - static inline void run(Dest& dst, const TranspositionType& tr, const ExpressionType& xpr) - { - MatrixType mat(xpr); - typedef typename TranspositionType::StorageIndex StorageIndex; - const Index size = tr.size(); - StorageIndex j = 0; - - if(!is_same_dense(dst,mat)) - dst = mat; - - for(Index k=(Transposed?size-1:0) ; Transposed?k>=0:k -struct generic_product_impl -{ - template - static void evalTo(Dest& dst, const Lhs& lhs, const Rhs& rhs) - { - transposition_matrix_product::run(dst, lhs, rhs); - } -}; - -template -struct generic_product_impl -{ - template - static void evalTo(Dest& dst, const Lhs& lhs, const Rhs& rhs) - { - transposition_matrix_product::run(dst, rhs, lhs); - } -}; - - -template -struct generic_product_impl, Rhs, TranspositionsShape, MatrixShape, ProductTag> -{ - template - static void evalTo(Dest& dst, const Transpose& lhs, const Rhs& rhs) - { - transposition_matrix_product::run(dst, lhs.nestedExpression(), rhs); - } -}; - -template -struct generic_product_impl, MatrixShape, TranspositionsShape, ProductTag> -{ - template - static void evalTo(Dest& dst, const Lhs& lhs, const Transpose& rhs) - { - transposition_matrix_product::run(dst, rhs.nestedExpression(), lhs); - } -}; - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_PRODUCT_EVALUATORS_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Random.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Random.h deleted file mode 100644 index 486e9ed5..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Random.h +++ /dev/null @@ -1,182 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_RANDOM_H -#define EIGEN_RANDOM_H - -namespace Eigen { - -namespace internal { - -template struct scalar_random_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_random_op) - inline const Scalar operator() () const { return random(); } -}; - -template -struct functor_traits > -{ enum { Cost = 5 * NumTraits::MulCost, PacketAccess = false, IsRepeatable = false }; }; - -} // end namespace internal - -/** \returns a random matrix expression - * - * Numbers are uniformly spread through their whole definition range for integer types, - * and in the [-1:1] range for floating point scalar types. - * - * The parameters \a rows and \a cols are the number of rows and of columns of - * the returned matrix. Must be compatible with this MatrixBase type. - * - * \not_reentrant - * - * This variant is meant to be used for dynamic-size matrix types. For fixed-size types, - * it is redundant to pass \a rows and \a cols as arguments, so Random() should be used - * instead. - * - * - * Example: \include MatrixBase_random_int_int.cpp - * Output: \verbinclude MatrixBase_random_int_int.out - * - * This expression has the "evaluate before nesting" flag so that it will be evaluated into - * a temporary matrix whenever it is nested in a larger expression. This prevents unexpected - * behavior with expressions involving random matrices. - * - * See DenseBase::NullaryExpr(Index, const CustomNullaryOp&) for an example using C++11 random generators. - * - * \sa DenseBase::setRandom(), DenseBase::Random(Index), DenseBase::Random() - */ -template -inline const typename DenseBase::RandomReturnType -DenseBase::Random(Index rows, Index cols) -{ - return NullaryExpr(rows, cols, internal::scalar_random_op()); -} - -/** \returns a random vector expression - * - * Numbers are uniformly spread through their whole definition range for integer types, - * and in the [-1:1] range for floating point scalar types. - * - * The parameter \a size is the size of the returned vector. - * Must be compatible with this MatrixBase type. - * - * \only_for_vectors - * \not_reentrant - * - * This variant is meant to be used for dynamic-size vector types. For fixed-size types, - * it is redundant to pass \a size as argument, so Random() should be used - * instead. - * - * Example: \include MatrixBase_random_int.cpp - * Output: \verbinclude MatrixBase_random_int.out - * - * This expression has the "evaluate before nesting" flag so that it will be evaluated into - * a temporary vector whenever it is nested in a larger expression. This prevents unexpected - * behavior with expressions involving random matrices. - * - * \sa DenseBase::setRandom(), DenseBase::Random(Index,Index), DenseBase::Random() - */ -template -inline const typename DenseBase::RandomReturnType -DenseBase::Random(Index size) -{ - return NullaryExpr(size, internal::scalar_random_op()); -} - -/** \returns a fixed-size random matrix or vector expression - * - * Numbers are uniformly spread through their whole definition range for integer types, - * and in the [-1:1] range for floating point scalar types. - * - * This variant is only for fixed-size MatrixBase types. For dynamic-size types, you - * need to use the variants taking size arguments. - * - * Example: \include MatrixBase_random.cpp - * Output: \verbinclude MatrixBase_random.out - * - * This expression has the "evaluate before nesting" flag so that it will be evaluated into - * a temporary matrix whenever it is nested in a larger expression. This prevents unexpected - * behavior with expressions involving random matrices. - * - * \not_reentrant - * - * \sa DenseBase::setRandom(), DenseBase::Random(Index,Index), DenseBase::Random(Index) - */ -template -inline const typename DenseBase::RandomReturnType -DenseBase::Random() -{ - return NullaryExpr(RowsAtCompileTime, ColsAtCompileTime, internal::scalar_random_op()); -} - -/** Sets all coefficients in this expression to random values. - * - * Numbers are uniformly spread through their whole definition range for integer types, - * and in the [-1:1] range for floating point scalar types. - * - * \not_reentrant - * - * Example: \include MatrixBase_setRandom.cpp - * Output: \verbinclude MatrixBase_setRandom.out - * - * \sa class CwiseNullaryOp, setRandom(Index), setRandom(Index,Index) - */ -template -EIGEN_DEVICE_FUNC inline Derived& DenseBase::setRandom() -{ - return *this = Random(rows(), cols()); -} - -/** Resizes to the given \a newSize, and sets all coefficients in this expression to random values. - * - * Numbers are uniformly spread through their whole definition range for integer types, - * and in the [-1:1] range for floating point scalar types. - * - * \only_for_vectors - * \not_reentrant - * - * Example: \include Matrix_setRandom_int.cpp - * Output: \verbinclude Matrix_setRandom_int.out - * - * \sa DenseBase::setRandom(), setRandom(Index,Index), class CwiseNullaryOp, DenseBase::Random() - */ -template -EIGEN_STRONG_INLINE Derived& -PlainObjectBase::setRandom(Index newSize) -{ - resize(newSize); - return setRandom(); -} - -/** Resizes to the given size, and sets all coefficients in this expression to random values. - * - * Numbers are uniformly spread through their whole definition range for integer types, - * and in the [-1:1] range for floating point scalar types. - * - * \not_reentrant - * - * \param rows the new number of rows - * \param cols the new number of columns - * - * Example: \include Matrix_setRandom_int_int.cpp - * Output: \verbinclude Matrix_setRandom_int_int.out - * - * \sa DenseBase::setRandom(), setRandom(Index), class CwiseNullaryOp, DenseBase::Random() - */ -template -EIGEN_STRONG_INLINE Derived& -PlainObjectBase::setRandom(Index rows, Index cols) -{ - resize(rows, cols); - return setRandom(); -} - -} // end namespace Eigen - -#endif // EIGEN_RANDOM_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Redux.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Redux.h deleted file mode 100644 index 2b5b73bf..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Redux.h +++ /dev/null @@ -1,505 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// Copyright (C) 2006-2008 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_REDUX_H -#define EIGEN_REDUX_H - -namespace Eigen { - -namespace internal { - -// TODO -// * implement other kind of vectorization -// * factorize code - -/*************************************************************************** -* Part 1 : the logic deciding a strategy for vectorization and unrolling -***************************************************************************/ - -template -struct redux_traits -{ -public: - typedef typename find_best_packet::type PacketType; - enum { - PacketSize = unpacket_traits::size, - InnerMaxSize = int(Derived::IsRowMajor) - ? Derived::MaxColsAtCompileTime - : Derived::MaxRowsAtCompileTime - }; - - enum { - MightVectorize = (int(Derived::Flags)&ActualPacketAccessBit) - && (functor_traits::PacketAccess), - MayLinearVectorize = bool(MightVectorize) && (int(Derived::Flags)&LinearAccessBit), - MaySliceVectorize = bool(MightVectorize) && int(InnerMaxSize)>=3*PacketSize - }; - -public: - enum { - Traversal = int(MayLinearVectorize) ? int(LinearVectorizedTraversal) - : int(MaySliceVectorize) ? int(SliceVectorizedTraversal) - : int(DefaultTraversal) - }; - -public: - enum { - Cost = Derived::SizeAtCompileTime == Dynamic ? HugeCost - : Derived::SizeAtCompileTime * Derived::CoeffReadCost + (Derived::SizeAtCompileTime-1) * functor_traits::Cost, - UnrollingLimit = EIGEN_UNROLLING_LIMIT * (int(Traversal) == int(DefaultTraversal) ? 1 : int(PacketSize)) - }; - -public: - enum { - Unrolling = Cost <= UnrollingLimit ? CompleteUnrolling : NoUnrolling - }; - -#ifdef EIGEN_DEBUG_ASSIGN - static void debug() - { - std::cerr << "Xpr: " << typeid(typename Derived::XprType).name() << std::endl; - std::cerr.setf(std::ios::hex, std::ios::basefield); - EIGEN_DEBUG_VAR(Derived::Flags) - std::cerr.unsetf(std::ios::hex); - EIGEN_DEBUG_VAR(InnerMaxSize) - EIGEN_DEBUG_VAR(PacketSize) - EIGEN_DEBUG_VAR(MightVectorize) - EIGEN_DEBUG_VAR(MayLinearVectorize) - EIGEN_DEBUG_VAR(MaySliceVectorize) - EIGEN_DEBUG_VAR(Traversal) - EIGEN_DEBUG_VAR(UnrollingLimit) - EIGEN_DEBUG_VAR(Unrolling) - std::cerr << std::endl; - } -#endif -}; - -/*************************************************************************** -* Part 2 : unrollers -***************************************************************************/ - -/*** no vectorization ***/ - -template -struct redux_novec_unroller -{ - enum { - HalfLength = Length/2 - }; - - typedef typename Derived::Scalar Scalar; - - EIGEN_DEVICE_FUNC - static EIGEN_STRONG_INLINE Scalar run(const Derived &mat, const Func& func) - { - return func(redux_novec_unroller::run(mat,func), - redux_novec_unroller::run(mat,func)); - } -}; - -template -struct redux_novec_unroller -{ - enum { - outer = Start / Derived::InnerSizeAtCompileTime, - inner = Start % Derived::InnerSizeAtCompileTime - }; - - typedef typename Derived::Scalar Scalar; - - EIGEN_DEVICE_FUNC - static EIGEN_STRONG_INLINE Scalar run(const Derived &mat, const Func&) - { - return mat.coeffByOuterInner(outer, inner); - } -}; - -// This is actually dead code and will never be called. It is required -// to prevent false warnings regarding failed inlining though -// for 0 length run() will never be called at all. -template -struct redux_novec_unroller -{ - typedef typename Derived::Scalar Scalar; - EIGEN_DEVICE_FUNC - static EIGEN_STRONG_INLINE Scalar run(const Derived&, const Func&) { return Scalar(); } -}; - -/*** vectorization ***/ - -template -struct redux_vec_unroller -{ - enum { - PacketSize = redux_traits::PacketSize, - HalfLength = Length/2 - }; - - typedef typename Derived::Scalar Scalar; - typedef typename redux_traits::PacketType PacketScalar; - - static EIGEN_STRONG_INLINE PacketScalar run(const Derived &mat, const Func& func) - { - return func.packetOp( - redux_vec_unroller::run(mat,func), - redux_vec_unroller::run(mat,func) ); - } -}; - -template -struct redux_vec_unroller -{ - enum { - index = Start * redux_traits::PacketSize, - outer = index / int(Derived::InnerSizeAtCompileTime), - inner = index % int(Derived::InnerSizeAtCompileTime), - alignment = Derived::Alignment - }; - - typedef typename Derived::Scalar Scalar; - typedef typename redux_traits::PacketType PacketScalar; - - static EIGEN_STRONG_INLINE PacketScalar run(const Derived &mat, const Func&) - { - return mat.template packetByOuterInner(outer, inner); - } -}; - -/*************************************************************************** -* Part 3 : implementation of all cases -***************************************************************************/ - -template::Traversal, - int Unrolling = redux_traits::Unrolling -> -struct redux_impl; - -template -struct redux_impl -{ - typedef typename Derived::Scalar Scalar; - EIGEN_DEVICE_FUNC - static EIGEN_STRONG_INLINE Scalar run(const Derived &mat, const Func& func) - { - eigen_assert(mat.rows()>0 && mat.cols()>0 && "you are using an empty matrix"); - Scalar res; - res = mat.coeffByOuterInner(0, 0); - for(Index i = 1; i < mat.innerSize(); ++i) - res = func(res, mat.coeffByOuterInner(0, i)); - for(Index i = 1; i < mat.outerSize(); ++i) - for(Index j = 0; j < mat.innerSize(); ++j) - res = func(res, mat.coeffByOuterInner(i, j)); - return res; - } -}; - -template -struct redux_impl - : public redux_novec_unroller -{}; - -template -struct redux_impl -{ - typedef typename Derived::Scalar Scalar; - typedef typename redux_traits::PacketType PacketScalar; - - static Scalar run(const Derived &mat, const Func& func) - { - const Index size = mat.size(); - - const Index packetSize = redux_traits::PacketSize; - const int packetAlignment = unpacket_traits::alignment; - enum { - alignment0 = (bool(Derived::Flags & DirectAccessBit) && bool(packet_traits::AlignedOnScalar)) ? int(packetAlignment) : int(Unaligned), - alignment = EIGEN_PLAIN_ENUM_MAX(alignment0, Derived::Alignment) - }; - const Index alignedStart = internal::first_default_aligned(mat.nestedExpression()); - const Index alignedSize2 = ((size-alignedStart)/(2*packetSize))*(2*packetSize); - const Index alignedSize = ((size-alignedStart)/(packetSize))*(packetSize); - const Index alignedEnd2 = alignedStart + alignedSize2; - const Index alignedEnd = alignedStart + alignedSize; - Scalar res; - if(alignedSize) - { - PacketScalar packet_res0 = mat.template packet(alignedStart); - if(alignedSize>packetSize) // we have at least two packets to partly unroll the loop - { - PacketScalar packet_res1 = mat.template packet(alignedStart+packetSize); - for(Index index = alignedStart + 2*packetSize; index < alignedEnd2; index += 2*packetSize) - { - packet_res0 = func.packetOp(packet_res0, mat.template packet(index)); - packet_res1 = func.packetOp(packet_res1, mat.template packet(index+packetSize)); - } - - packet_res0 = func.packetOp(packet_res0,packet_res1); - if(alignedEnd>alignedEnd2) - packet_res0 = func.packetOp(packet_res0, mat.template packet(alignedEnd2)); - } - res = func.predux(packet_res0); - - for(Index index = 0; index < alignedStart; ++index) - res = func(res,mat.coeff(index)); - - for(Index index = alignedEnd; index < size; ++index) - res = func(res,mat.coeff(index)); - } - else // too small to vectorize anything. - // since this is dynamic-size hence inefficient anyway for such small sizes, don't try to optimize. - { - res = mat.coeff(0); - for(Index index = 1; index < size; ++index) - res = func(res,mat.coeff(index)); - } - - return res; - } -}; - -// NOTE: for SliceVectorizedTraversal we simply bypass unrolling -template -struct redux_impl -{ - typedef typename Derived::Scalar Scalar; - typedef typename redux_traits::PacketType PacketType; - - EIGEN_DEVICE_FUNC static Scalar run(const Derived &mat, const Func& func) - { - eigen_assert(mat.rows()>0 && mat.cols()>0 && "you are using an empty matrix"); - const Index innerSize = mat.innerSize(); - const Index outerSize = mat.outerSize(); - enum { - packetSize = redux_traits::PacketSize - }; - const Index packetedInnerSize = ((innerSize)/packetSize)*packetSize; - Scalar res; - if(packetedInnerSize) - { - PacketType packet_res = mat.template packet(0,0); - for(Index j=0; j(j,i)); - - res = func.predux(packet_res); - for(Index j=0; j::run(mat, func); - } - - return res; - } -}; - -template -struct redux_impl -{ - typedef typename Derived::Scalar Scalar; - - typedef typename redux_traits::PacketType PacketScalar; - enum { - PacketSize = redux_traits::PacketSize, - Size = Derived::SizeAtCompileTime, - VectorizedSize = (Size / PacketSize) * PacketSize - }; - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Derived &mat, const Func& func) - { - eigen_assert(mat.rows()>0 && mat.cols()>0 && "you are using an empty matrix"); - if (VectorizedSize > 0) { - Scalar res = func.predux(redux_vec_unroller::run(mat,func)); - if (VectorizedSize != Size) - res = func(res,redux_novec_unroller::run(mat,func)); - return res; - } - else { - return redux_novec_unroller::run(mat,func); - } - } -}; - -// evaluator adaptor -template -class redux_evaluator -{ -public: - typedef _XprType XprType; - EIGEN_DEVICE_FUNC explicit redux_evaluator(const XprType &xpr) : m_evaluator(xpr), m_xpr(xpr) {} - - typedef typename XprType::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename XprType::PacketScalar PacketScalar; - typedef typename XprType::PacketReturnType PacketReturnType; - - enum { - MaxRowsAtCompileTime = XprType::MaxRowsAtCompileTime, - MaxColsAtCompileTime = XprType::MaxColsAtCompileTime, - // TODO we should not remove DirectAccessBit and rather find an elegant way to query the alignment offset at runtime from the evaluator - Flags = evaluator::Flags & ~DirectAccessBit, - IsRowMajor = XprType::IsRowMajor, - SizeAtCompileTime = XprType::SizeAtCompileTime, - InnerSizeAtCompileTime = XprType::InnerSizeAtCompileTime, - CoeffReadCost = evaluator::CoeffReadCost, - Alignment = evaluator::Alignment - }; - - EIGEN_DEVICE_FUNC Index rows() const { return m_xpr.rows(); } - EIGEN_DEVICE_FUNC Index cols() const { return m_xpr.cols(); } - EIGEN_DEVICE_FUNC Index size() const { return m_xpr.size(); } - EIGEN_DEVICE_FUNC Index innerSize() const { return m_xpr.innerSize(); } - EIGEN_DEVICE_FUNC Index outerSize() const { return m_xpr.outerSize(); } - - EIGEN_DEVICE_FUNC - CoeffReturnType coeff(Index row, Index col) const - { return m_evaluator.coeff(row, col); } - - EIGEN_DEVICE_FUNC - CoeffReturnType coeff(Index index) const - { return m_evaluator.coeff(index); } - - template - PacketType packet(Index row, Index col) const - { return m_evaluator.template packet(row, col); } - - template - PacketType packet(Index index) const - { return m_evaluator.template packet(index); } - - EIGEN_DEVICE_FUNC - CoeffReturnType coeffByOuterInner(Index outer, Index inner) const - { return m_evaluator.coeff(IsRowMajor ? outer : inner, IsRowMajor ? inner : outer); } - - template - PacketType packetByOuterInner(Index outer, Index inner) const - { return m_evaluator.template packet(IsRowMajor ? outer : inner, IsRowMajor ? inner : outer); } - - const XprType & nestedExpression() const { return m_xpr; } - -protected: - internal::evaluator m_evaluator; - const XprType &m_xpr; -}; - -} // end namespace internal - -/*************************************************************************** -* Part 4 : public API -***************************************************************************/ - - -/** \returns the result of a full redux operation on the whole matrix or vector using \a func - * - * The template parameter \a BinaryOp is the type of the functor \a func which must be - * an associative operator. Both current C++98 and C++11 functor styles are handled. - * - * \sa DenseBase::sum(), DenseBase::minCoeff(), DenseBase::maxCoeff(), MatrixBase::colwise(), MatrixBase::rowwise() - */ -template -template -EIGEN_DEVICE_FUNC typename internal::traits::Scalar -DenseBase::redux(const Func& func) const -{ - eigen_assert(this->rows()>0 && this->cols()>0 && "you are using an empty matrix"); - - typedef typename internal::redux_evaluator ThisEvaluator; - ThisEvaluator thisEval(derived()); - - return internal::redux_impl::run(thisEval, func); -} - -/** \returns the minimum of all coefficients of \c *this. - * \warning the result is undefined if \c *this contains NaN. - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits::Scalar -DenseBase::minCoeff() const -{ - return derived().redux(Eigen::internal::scalar_min_op()); -} - -/** \returns the maximum of all coefficients of \c *this. - * \warning the result is undefined if \c *this contains NaN. - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits::Scalar -DenseBase::maxCoeff() const -{ - return derived().redux(Eigen::internal::scalar_max_op()); -} - -/** \returns the sum of all coefficients of \c *this - * - * If \c *this is empty, then the value 0 is returned. - * - * \sa trace(), prod(), mean() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits::Scalar -DenseBase::sum() const -{ - if(SizeAtCompileTime==0 || (SizeAtCompileTime==Dynamic && size()==0)) - return Scalar(0); - return derived().redux(Eigen::internal::scalar_sum_op()); -} - -/** \returns the mean of all coefficients of *this -* -* \sa trace(), prod(), sum() -*/ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits::Scalar -DenseBase::mean() const -{ -#ifdef __INTEL_COMPILER - #pragma warning push - #pragma warning ( disable : 2259 ) -#endif - return Scalar(derived().redux(Eigen::internal::scalar_sum_op())) / Scalar(this->size()); -#ifdef __INTEL_COMPILER - #pragma warning pop -#endif -} - -/** \returns the product of all coefficients of *this - * - * Example: \include MatrixBase_prod.cpp - * Output: \verbinclude MatrixBase_prod.out - * - * \sa sum(), mean(), trace() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits::Scalar -DenseBase::prod() const -{ - if(SizeAtCompileTime==0 || (SizeAtCompileTime==Dynamic && size()==0)) - return Scalar(1); - return derived().redux(Eigen::internal::scalar_product_op()); -} - -/** \returns the trace of \c *this, i.e. the sum of the coefficients on the main diagonal. - * - * \c *this can be any matrix, not necessarily square. - * - * \sa diagonal(), sum() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits::Scalar -MatrixBase::trace() const -{ - return derived().diagonal().sum(); -} - -} // end namespace Eigen - -#endif // EIGEN_REDUX_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Ref.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Ref.h deleted file mode 100644 index abb1e512..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Ref.h +++ /dev/null @@ -1,283 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2012 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_REF_H -#define EIGEN_REF_H - -namespace Eigen { - -namespace internal { - -template -struct traits > - : public traits > -{ - typedef _PlainObjectType PlainObjectType; - typedef _StrideType StrideType; - enum { - Options = _Options, - Flags = traits >::Flags | NestByRefBit, - Alignment = traits >::Alignment - }; - - template struct match { - enum { - HasDirectAccess = internal::has_direct_access::ret, - StorageOrderMatch = PlainObjectType::IsVectorAtCompileTime || Derived::IsVectorAtCompileTime || ((PlainObjectType::Flags&RowMajorBit)==(Derived::Flags&RowMajorBit)), - InnerStrideMatch = int(StrideType::InnerStrideAtCompileTime)==int(Dynamic) - || int(StrideType::InnerStrideAtCompileTime)==int(Derived::InnerStrideAtCompileTime) - || (int(StrideType::InnerStrideAtCompileTime)==0 && int(Derived::InnerStrideAtCompileTime)==1), - OuterStrideMatch = Derived::IsVectorAtCompileTime - || int(StrideType::OuterStrideAtCompileTime)==int(Dynamic) || int(StrideType::OuterStrideAtCompileTime)==int(Derived::OuterStrideAtCompileTime), - // NOTE, this indirection of evaluator::Alignment is needed - // to workaround a very strange bug in MSVC related to the instantiation - // of has_*ary_operator in evaluator. - // This line is surprisingly very sensitive. For instance, simply adding parenthesis - // as "DerivedAlignment = (int(evaluator::Alignment))," will make MSVC fail... - DerivedAlignment = int(evaluator::Alignment), - AlignmentMatch = (int(traits::Alignment)==int(Unaligned)) || (DerivedAlignment >= int(Alignment)), // FIXME the first condition is not very clear, it should be replaced by the required alignment - ScalarTypeMatch = internal::is_same::value, - MatchAtCompileTime = HasDirectAccess && StorageOrderMatch && InnerStrideMatch && OuterStrideMatch && AlignmentMatch && ScalarTypeMatch - }; - typedef typename internal::conditional::type type; - }; - -}; - -template -struct traits > : public traits {}; - -} - -template class RefBase - : public MapBase -{ - typedef typename internal::traits::PlainObjectType PlainObjectType; - typedef typename internal::traits::StrideType StrideType; - -public: - - typedef MapBase Base; - EIGEN_DENSE_PUBLIC_INTERFACE(RefBase) - - EIGEN_DEVICE_FUNC inline Index innerStride() const - { - return StrideType::InnerStrideAtCompileTime != 0 ? m_stride.inner() : 1; - } - - EIGEN_DEVICE_FUNC inline Index outerStride() const - { - return StrideType::OuterStrideAtCompileTime != 0 ? m_stride.outer() - : IsVectorAtCompileTime ? this->size() - : int(Flags)&RowMajorBit ? this->cols() - : this->rows(); - } - - EIGEN_DEVICE_FUNC RefBase() - : Base(0,RowsAtCompileTime==Dynamic?0:RowsAtCompileTime,ColsAtCompileTime==Dynamic?0:ColsAtCompileTime), - // Stride<> does not allow default ctor for Dynamic strides, so let' initialize it with dummy values: - m_stride(StrideType::OuterStrideAtCompileTime==Dynamic?0:StrideType::OuterStrideAtCompileTime, - StrideType::InnerStrideAtCompileTime==Dynamic?0:StrideType::InnerStrideAtCompileTime) - {} - - EIGEN_INHERIT_ASSIGNMENT_OPERATORS(RefBase) - -protected: - - typedef Stride StrideBase; - - template - EIGEN_DEVICE_FUNC void construct(Expression& expr) - { - if(PlainObjectType::RowsAtCompileTime==1) - { - eigen_assert(expr.rows()==1 || expr.cols()==1); - ::new (static_cast(this)) Base(expr.data(), 1, expr.size()); - } - else if(PlainObjectType::ColsAtCompileTime==1) - { - eigen_assert(expr.rows()==1 || expr.cols()==1); - ::new (static_cast(this)) Base(expr.data(), expr.size(), 1); - } - else - ::new (static_cast(this)) Base(expr.data(), expr.rows(), expr.cols()); - - if(Expression::IsVectorAtCompileTime && (!PlainObjectType::IsVectorAtCompileTime) && ((Expression::Flags&RowMajorBit)!=(PlainObjectType::Flags&RowMajorBit))) - ::new (&m_stride) StrideBase(expr.innerStride(), StrideType::InnerStrideAtCompileTime==0?0:1); - else - ::new (&m_stride) StrideBase(StrideType::OuterStrideAtCompileTime==0?0:expr.outerStride(), - StrideType::InnerStrideAtCompileTime==0?0:expr.innerStride()); - } - - StrideBase m_stride; -}; - -/** \class Ref - * \ingroup Core_Module - * - * \brief A matrix or vector expression mapping an existing expression - * - * \tparam PlainObjectType the equivalent matrix type of the mapped data - * \tparam Options specifies the pointer alignment in bytes. It can be: \c #Aligned128, , \c #Aligned64, \c #Aligned32, \c #Aligned16, \c #Aligned8 or \c #Unaligned. - * The default is \c #Unaligned. - * \tparam StrideType optionally specifies strides. By default, Ref implies a contiguous storage along the inner dimension (inner stride==1), - * but accepts a variable outer stride (leading dimension). - * This can be overridden by specifying strides. - * The type passed here must be a specialization of the Stride template, see examples below. - * - * This class provides a way to write non-template functions taking Eigen objects as parameters while limiting the number of copies. - * A Ref<> object can represent either a const expression or a l-value: - * \code - * // in-out argument: - * void foo1(Ref x); - * - * // read-only const argument: - * void foo2(const Ref& x); - * \endcode - * - * In the in-out case, the input argument must satisfy the constraints of the actual Ref<> type, otherwise a compilation issue will be triggered. - * By default, a Ref can reference any dense vector expression of float having a contiguous memory layout. - * Likewise, a Ref can reference any column-major dense matrix expression of float whose column's elements are contiguously stored with - * the possibility to have a constant space in-between each column, i.e. the inner stride must be equal to 1, but the outer stride (or leading dimension) - * can be greater than the number of rows. - * - * In the const case, if the input expression does not match the above requirement, then it is evaluated into a temporary before being passed to the function. - * Here are some examples: - * \code - * MatrixXf A; - * VectorXf a; - * foo1(a.head()); // OK - * foo1(A.col()); // OK - * foo1(A.row()); // Compilation error because here innerstride!=1 - * foo2(A.row()); // Compilation error because A.row() is a 1xN object while foo2 is expecting a Nx1 object - * foo2(A.row().transpose()); // The row is copied into a contiguous temporary - * foo2(2*a); // The expression is evaluated into a temporary - * foo2(A.col().segment(2,4)); // No temporary - * \endcode - * - * The range of inputs that can be referenced without temporary can be enlarged using the last two template parameters. - * Here is an example accepting an innerstride!=1: - * \code - * // in-out argument: - * void foo3(Ref > x); - * foo3(A.row()); // OK - * \endcode - * The downside here is that the function foo3 might be significantly slower than foo1 because it won't be able to exploit vectorization, and will involve more - * expensive address computations even if the input is contiguously stored in memory. To overcome this issue, one might propose to overload internally calling a - * template function, e.g.: - * \code - * // in the .h: - * void foo(const Ref& A); - * void foo(const Ref >& A); - * - * // in the .cpp: - * template void foo_impl(const TypeOfA& A) { - * ... // crazy code goes here - * } - * void foo(const Ref& A) { foo_impl(A); } - * void foo(const Ref >& A) { foo_impl(A); } - * \endcode - * - * See also the following stackoverflow questions for further references: - * - Correct usage of the Eigen::Ref<> class - * - * \sa PlainObjectBase::Map(), \ref TopicStorageOrders - */ -template class Ref - : public RefBase > -{ - private: - typedef internal::traits Traits; - template - EIGEN_DEVICE_FUNC inline Ref(const PlainObjectBase& expr, - typename internal::enable_if::MatchAtCompileTime),Derived>::type* = 0); - public: - - typedef RefBase Base; - EIGEN_DENSE_PUBLIC_INTERFACE(Ref) - - - #ifndef EIGEN_PARSED_BY_DOXYGEN - template - EIGEN_DEVICE_FUNC inline Ref(PlainObjectBase& expr, - typename internal::enable_if::MatchAtCompileTime),Derived>::type* = 0) - { - EIGEN_STATIC_ASSERT(bool(Traits::template match::MatchAtCompileTime), STORAGE_LAYOUT_DOES_NOT_MATCH); - Base::construct(expr.derived()); - } - template - EIGEN_DEVICE_FUNC inline Ref(const DenseBase& expr, - typename internal::enable_if::MatchAtCompileTime),Derived>::type* = 0) - #else - /** Implicit constructor from any dense expression */ - template - inline Ref(DenseBase& expr) - #endif - { - EIGEN_STATIC_ASSERT(bool(internal::is_lvalue::value), THIS_EXPRESSION_IS_NOT_A_LVALUE__IT_IS_READ_ONLY); - EIGEN_STATIC_ASSERT(bool(Traits::template match::MatchAtCompileTime), STORAGE_LAYOUT_DOES_NOT_MATCH); - EIGEN_STATIC_ASSERT(!Derived::IsPlainObjectBase,THIS_EXPRESSION_IS_NOT_A_LVALUE__IT_IS_READ_ONLY); - Base::construct(expr.const_cast_derived()); - } - - EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Ref) - -}; - -// this is the const ref version -template class Ref - : public RefBase > -{ - typedef internal::traits Traits; - public: - - typedef RefBase Base; - EIGEN_DENSE_PUBLIC_INTERFACE(Ref) - - template - EIGEN_DEVICE_FUNC inline Ref(const DenseBase& expr, - typename internal::enable_if::ScalarTypeMatch),Derived>::type* = 0) - { -// std::cout << match_helper::HasDirectAccess << "," << match_helper::OuterStrideMatch << "," << match_helper::InnerStrideMatch << "\n"; -// std::cout << int(StrideType::OuterStrideAtCompileTime) << " - " << int(Derived::OuterStrideAtCompileTime) << "\n"; -// std::cout << int(StrideType::InnerStrideAtCompileTime) << " - " << int(Derived::InnerStrideAtCompileTime) << "\n"; - construct(expr.derived(), typename Traits::template match::type()); - } - - EIGEN_DEVICE_FUNC inline Ref(const Ref& other) : Base(other) { - // copy constructor shall not copy the m_object, to avoid unnecessary malloc and copy - } - - template - EIGEN_DEVICE_FUNC inline Ref(const RefBase& other) { - construct(other.derived(), typename Traits::template match::type()); - } - - protected: - - template - EIGEN_DEVICE_FUNC void construct(const Expression& expr,internal::true_type) - { - Base::construct(expr); - } - - template - EIGEN_DEVICE_FUNC void construct(const Expression& expr, internal::false_type) - { - internal::call_assignment_no_alias(m_object,expr,internal::assign_op()); - Base::construct(m_object); - } - - protected: - TPlainObjectType m_object; -}; - -} // end namespace Eigen - -#endif // EIGEN_REF_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Replicate.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Replicate.h deleted file mode 100644 index 0b2d6d74..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Replicate.h +++ /dev/null @@ -1,142 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009-2010 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_REPLICATE_H -#define EIGEN_REPLICATE_H - -namespace Eigen { - -namespace internal { -template -struct traits > - : traits -{ - typedef typename MatrixType::Scalar Scalar; - typedef typename traits::StorageKind StorageKind; - typedef typename traits::XprKind XprKind; - typedef typename ref_selector::type MatrixTypeNested; - typedef typename remove_reference::type _MatrixTypeNested; - enum { - RowsAtCompileTime = RowFactor==Dynamic || int(MatrixType::RowsAtCompileTime)==Dynamic - ? Dynamic - : RowFactor * MatrixType::RowsAtCompileTime, - ColsAtCompileTime = ColFactor==Dynamic || int(MatrixType::ColsAtCompileTime)==Dynamic - ? Dynamic - : ColFactor * MatrixType::ColsAtCompileTime, - //FIXME we don't propagate the max sizes !!! - MaxRowsAtCompileTime = RowsAtCompileTime, - MaxColsAtCompileTime = ColsAtCompileTime, - IsRowMajor = MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1 ? 1 - : MaxColsAtCompileTime==1 && MaxRowsAtCompileTime!=1 ? 0 - : (MatrixType::Flags & RowMajorBit) ? 1 : 0, - - // FIXME enable DirectAccess with negative strides? - Flags = IsRowMajor ? RowMajorBit : 0 - }; -}; -} - -/** - * \class Replicate - * \ingroup Core_Module - * - * \brief Expression of the multiple replication of a matrix or vector - * - * \tparam MatrixType the type of the object we are replicating - * \tparam RowFactor number of repetitions at compile time along the vertical direction, can be Dynamic. - * \tparam ColFactor number of repetitions at compile time along the horizontal direction, can be Dynamic. - * - * This class represents an expression of the multiple replication of a matrix or vector. - * It is the return type of DenseBase::replicate() and most of the time - * this is the only way it is used. - * - * \sa DenseBase::replicate() - */ -template class Replicate - : public internal::dense_xpr_base< Replicate >::type -{ - typedef typename internal::traits::MatrixTypeNested MatrixTypeNested; - typedef typename internal::traits::_MatrixTypeNested _MatrixTypeNested; - public: - - typedef typename internal::dense_xpr_base::type Base; - EIGEN_DENSE_PUBLIC_INTERFACE(Replicate) - typedef typename internal::remove_all::type NestedExpression; - - template - EIGEN_DEVICE_FUNC - inline explicit Replicate(const OriginalMatrixType& matrix) - : m_matrix(matrix), m_rowFactor(RowFactor), m_colFactor(ColFactor) - { - EIGEN_STATIC_ASSERT((internal::is_same::type,OriginalMatrixType>::value), - THE_MATRIX_OR_EXPRESSION_THAT_YOU_PASSED_DOES_NOT_HAVE_THE_EXPECTED_TYPE) - eigen_assert(RowFactor!=Dynamic && ColFactor!=Dynamic); - } - - template - EIGEN_DEVICE_FUNC - inline Replicate(const OriginalMatrixType& matrix, Index rowFactor, Index colFactor) - : m_matrix(matrix), m_rowFactor(rowFactor), m_colFactor(colFactor) - { - EIGEN_STATIC_ASSERT((internal::is_same::type,OriginalMatrixType>::value), - THE_MATRIX_OR_EXPRESSION_THAT_YOU_PASSED_DOES_NOT_HAVE_THE_EXPECTED_TYPE) - } - - EIGEN_DEVICE_FUNC - inline Index rows() const { return m_matrix.rows() * m_rowFactor.value(); } - EIGEN_DEVICE_FUNC - inline Index cols() const { return m_matrix.cols() * m_colFactor.value(); } - - EIGEN_DEVICE_FUNC - const _MatrixTypeNested& nestedExpression() const - { - return m_matrix; - } - - protected: - MatrixTypeNested m_matrix; - const internal::variable_if_dynamic m_rowFactor; - const internal::variable_if_dynamic m_colFactor; -}; - -/** - * \return an expression of the replication of \c *this - * - * Example: \include MatrixBase_replicate.cpp - * Output: \verbinclude MatrixBase_replicate.out - * - * \sa VectorwiseOp::replicate(), DenseBase::replicate(Index,Index), class Replicate - */ -template -template -EIGEN_DEVICE_FUNC const Replicate -DenseBase::replicate() const -{ - return Replicate(derived()); -} - -/** - * \return an expression of the replication of each column (or row) of \c *this - * - * Example: \include DirectionWise_replicate_int.cpp - * Output: \verbinclude DirectionWise_replicate_int.out - * - * \sa VectorwiseOp::replicate(), DenseBase::replicate(), class Replicate - */ -template -EIGEN_DEVICE_FUNC const typename VectorwiseOp::ReplicateReturnType -VectorwiseOp::replicate(Index factor) const -{ - return typename VectorwiseOp::ReplicateReturnType - (_expression(),Direction==Vertical?factor:1,Direction==Horizontal?factor:1); -} - -} // end namespace Eigen - -#endif // EIGEN_REPLICATE_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/ReturnByValue.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/ReturnByValue.h deleted file mode 100644 index 11dc86d0..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/ReturnByValue.h +++ /dev/null @@ -1,117 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009-2010 Gael Guennebaud -// Copyright (C) 2009-2010 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_RETURNBYVALUE_H -#define EIGEN_RETURNBYVALUE_H - -namespace Eigen { - -namespace internal { - -template -struct traits > - : public traits::ReturnType> -{ - enum { - // We're disabling the DirectAccess because e.g. the constructor of - // the Block-with-DirectAccess expression requires to have a coeffRef method. - // Also, we don't want to have to implement the stride stuff. - Flags = (traits::ReturnType>::Flags - | EvalBeforeNestingBit) & ~DirectAccessBit - }; -}; - -/* The ReturnByValue object doesn't even have a coeff() method. - * So the only way that nesting it in an expression can work, is by evaluating it into a plain matrix. - * So internal::nested always gives the plain return matrix type. - * - * FIXME: I don't understand why we need this specialization: isn't this taken care of by the EvalBeforeNestingBit ?? - * Answer: EvalBeforeNestingBit should be deprecated since we have the evaluators - */ -template -struct nested_eval, n, PlainObject> -{ - typedef typename traits::ReturnType type; -}; - -} // end namespace internal - -/** \class ReturnByValue - * \ingroup Core_Module - * - */ -template class ReturnByValue - : public internal::dense_xpr_base< ReturnByValue >::type, internal::no_assignment_operator -{ - public: - typedef typename internal::traits::ReturnType ReturnType; - - typedef typename internal::dense_xpr_base::type Base; - EIGEN_DENSE_PUBLIC_INTERFACE(ReturnByValue) - - template - EIGEN_DEVICE_FUNC - inline void evalTo(Dest& dst) const - { static_cast(this)->evalTo(dst); } - EIGEN_DEVICE_FUNC inline Index rows() const { return static_cast(this)->rows(); } - EIGEN_DEVICE_FUNC inline Index cols() const { return static_cast(this)->cols(); } - -#ifndef EIGEN_PARSED_BY_DOXYGEN -#define Unusable YOU_ARE_TRYING_TO_ACCESS_A_SINGLE_COEFFICIENT_IN_A_SPECIAL_EXPRESSION_WHERE_THAT_IS_NOT_ALLOWED_BECAUSE_THAT_WOULD_BE_INEFFICIENT - class Unusable{ - Unusable(const Unusable&) {} - Unusable& operator=(const Unusable&) {return *this;} - }; - const Unusable& coeff(Index) const { return *reinterpret_cast(this); } - const Unusable& coeff(Index,Index) const { return *reinterpret_cast(this); } - Unusable& coeffRef(Index) { return *reinterpret_cast(this); } - Unusable& coeffRef(Index,Index) { return *reinterpret_cast(this); } -#undef Unusable -#endif -}; - -template -template -EIGEN_DEVICE_FUNC Derived& DenseBase::operator=(const ReturnByValue& other) -{ - other.evalTo(derived()); - return derived(); -} - -namespace internal { - -// Expression is evaluated in a temporary; default implementation of Assignment is bypassed so that -// when a ReturnByValue expression is assigned, the evaluator is not constructed. -// TODO: Finalize port to new regime; ReturnByValue should not exist in the expression world - -template -struct evaluator > - : public evaluator::ReturnType> -{ - typedef ReturnByValue XprType; - typedef typename internal::traits::ReturnType PlainObject; - typedef evaluator Base; - - EIGEN_DEVICE_FUNC explicit evaluator(const XprType& xpr) - : m_result(xpr.rows(), xpr.cols()) - { - ::new (static_cast(this)) Base(m_result); - xpr.evalTo(m_result); - } - -protected: - PlainObject m_result; -}; - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_RETURNBYVALUE_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Reverse.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Reverse.h deleted file mode 100644 index 8b6b3ab0..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Reverse.h +++ /dev/null @@ -1,211 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2008 Benoit Jacob -// Copyright (C) 2009 Ricard Marxer -// Copyright (C) 2009-2010 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_REVERSE_H -#define EIGEN_REVERSE_H - -namespace Eigen { - -namespace internal { - -template -struct traits > - : traits -{ - typedef typename MatrixType::Scalar Scalar; - typedef typename traits::StorageKind StorageKind; - typedef typename traits::XprKind XprKind; - typedef typename ref_selector::type MatrixTypeNested; - typedef typename remove_reference::type _MatrixTypeNested; - enum { - RowsAtCompileTime = MatrixType::RowsAtCompileTime, - ColsAtCompileTime = MatrixType::ColsAtCompileTime, - MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime, - MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime, - Flags = _MatrixTypeNested::Flags & (RowMajorBit | LvalueBit) - }; -}; - -template struct reverse_packet_cond -{ - static inline PacketType run(const PacketType& x) { return preverse(x); } -}; - -template struct reverse_packet_cond -{ - static inline PacketType run(const PacketType& x) { return x; } -}; - -} // end namespace internal - -/** \class Reverse - * \ingroup Core_Module - * - * \brief Expression of the reverse of a vector or matrix - * - * \tparam MatrixType the type of the object of which we are taking the reverse - * \tparam Direction defines the direction of the reverse operation, can be Vertical, Horizontal, or BothDirections - * - * This class represents an expression of the reverse of a vector. - * It is the return type of MatrixBase::reverse() and VectorwiseOp::reverse() - * and most of the time this is the only way it is used. - * - * \sa MatrixBase::reverse(), VectorwiseOp::reverse() - */ -template class Reverse - : public internal::dense_xpr_base< Reverse >::type -{ - public: - - typedef typename internal::dense_xpr_base::type Base; - EIGEN_DENSE_PUBLIC_INTERFACE(Reverse) - typedef typename internal::remove_all::type NestedExpression; - using Base::IsRowMajor; - - protected: - enum { - PacketSize = internal::packet_traits::size, - IsColMajor = !IsRowMajor, - ReverseRow = (Direction == Vertical) || (Direction == BothDirections), - ReverseCol = (Direction == Horizontal) || (Direction == BothDirections), - OffsetRow = ReverseRow && IsColMajor ? PacketSize : 1, - OffsetCol = ReverseCol && IsRowMajor ? PacketSize : 1, - ReversePacket = (Direction == BothDirections) - || ((Direction == Vertical) && IsColMajor) - || ((Direction == Horizontal) && IsRowMajor) - }; - typedef internal::reverse_packet_cond reverse_packet; - public: - - EIGEN_DEVICE_FUNC explicit inline Reverse(const MatrixType& matrix) : m_matrix(matrix) { } - - EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Reverse) - - EIGEN_DEVICE_FUNC inline Index rows() const { return m_matrix.rows(); } - EIGEN_DEVICE_FUNC inline Index cols() const { return m_matrix.cols(); } - - EIGEN_DEVICE_FUNC inline Index innerStride() const - { - return -m_matrix.innerStride(); - } - - EIGEN_DEVICE_FUNC const typename internal::remove_all::type& - nestedExpression() const - { - return m_matrix; - } - - protected: - typename MatrixType::Nested m_matrix; -}; - -/** \returns an expression of the reverse of *this. - * - * Example: \include MatrixBase_reverse.cpp - * Output: \verbinclude MatrixBase_reverse.out - * - */ -template -EIGEN_DEVICE_FUNC inline typename DenseBase::ReverseReturnType -DenseBase::reverse() -{ - return ReverseReturnType(derived()); -} - - -//reverse const overload moved DenseBase.h due to a CUDA compiler bug - -/** This is the "in place" version of reverse: it reverses \c *this. - * - * In most cases it is probably better to simply use the reversed expression - * of a matrix. However, when reversing the matrix data itself is really needed, - * then this "in-place" version is probably the right choice because it provides - * the following additional benefits: - * - less error prone: doing the same operation with .reverse() requires special care: - * \code m = m.reverse().eval(); \endcode - * - this API enables reverse operations without the need for a temporary - * - it allows future optimizations (cache friendliness, etc.) - * - * \sa VectorwiseOp::reverseInPlace(), reverse() */ -template -EIGEN_DEVICE_FUNC inline void DenseBase::reverseInPlace() -{ - if(cols()>rows()) - { - Index half = cols()/2; - leftCols(half).swap(rightCols(half).reverse()); - if((cols()%2)==1) - { - Index half2 = rows()/2; - col(half).head(half2).swap(col(half).tail(half2).reverse()); - } - } - else - { - Index half = rows()/2; - topRows(half).swap(bottomRows(half).reverse()); - if((rows()%2)==1) - { - Index half2 = cols()/2; - row(half).head(half2).swap(row(half).tail(half2).reverse()); - } - } -} - -namespace internal { - -template -struct vectorwise_reverse_inplace_impl; - -template<> -struct vectorwise_reverse_inplace_impl -{ - template - static void run(ExpressionType &xpr) - { - Index half = xpr.rows()/2; - xpr.topRows(half).swap(xpr.bottomRows(half).colwise().reverse()); - } -}; - -template<> -struct vectorwise_reverse_inplace_impl -{ - template - static void run(ExpressionType &xpr) - { - Index half = xpr.cols()/2; - xpr.leftCols(half).swap(xpr.rightCols(half).rowwise().reverse()); - } -}; - -} // end namespace internal - -/** This is the "in place" version of VectorwiseOp::reverse: it reverses each column or row of \c *this. - * - * In most cases it is probably better to simply use the reversed expression - * of a matrix. However, when reversing the matrix data itself is really needed, - * then this "in-place" version is probably the right choice because it provides - * the following additional benefits: - * - less error prone: doing the same operation with .reverse() requires special care: - * \code m = m.reverse().eval(); \endcode - * - this API enables reverse operations without the need for a temporary - * - * \sa DenseBase::reverseInPlace(), reverse() */ -template -EIGEN_DEVICE_FUNC void VectorwiseOp::reverseInPlace() -{ - internal::vectorwise_reverse_inplace_impl::run(_expression().const_cast_derived()); -} - -} // end namespace Eigen - -#endif // EIGEN_REVERSE_H diff --git a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Select.h b/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Select.h deleted file mode 100644 index 79eec1b5..00000000 --- a/engine/inc/bullet/ThirdPartyLibs/Eigen/src/Core/Select.h +++ /dev/null @@ -1,162 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2010 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_SELECT_H -#define EIGEN_SELECT_H - -namespace Eigen { - -/** \class Select - * \ingroup Core_Module - * - * \brief Expression of a coefficient wise version of the C++ ternary operator ?: - * - * \param ConditionMatrixType the type of the \em condition expression which must be a boolean matrix - * \param ThenMatrixType the type of the \em then expression - * \param ElseMatrixType the type of the \em else expression - * - * This class represents an expression of a coefficient wise version of the C++ ternary operator ?:. - * It is the return type of DenseBase::select() and most of the time this is the only way it is used. - * - * \sa DenseBase::select(const DenseBase&, const DenseBase&) const - */ - -namespace internal { -template -struct traits > - : traits -{ - typedef typename traits::Scalar Scalar; - typedef Dense StorageKind; - typedef typename traits::XprKind XprKind; - typedef typename ConditionMatrixType::Nested ConditionMatrixNested; - typedef typename ThenMatrixType::Nested ThenMatrixNested; - typedef typename ElseMatrixType::Nested ElseMatrixNested; - enum { - RowsAtCompileTime = ConditionMatrixType::RowsAtCompileTime, - ColsAtCompileTime = ConditionMatrixType::ColsAtCompileTime, - MaxRowsAtCompileTime = ConditionMatrixType::MaxRowsAtCompileTime, - MaxColsAtCompileTime = ConditionMatrixType::MaxColsAtCompileTime, - Flags = (unsigned int)ThenMatrixType::Flags & ElseMatrixType::Flags & RowMajorBit - }; -}; -} - -template -class Select : public internal::dense_xpr_base< Select >::type, - internal::no_assignment_operator -{ - public: - - typedef typename internal::dense_xpr_base